Created
January 20, 2011 08:23
-
-
Save catwell/787574 to your computer and use it in GitHub Desktop.
From Sean Conner @ Lua ML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Creates a table, fills it with a few values, the current working directory, the current PID and the load average (an array); the load average has a metatable controlling how it's printed. | |
[spc]lucy:/tmp>gcc -g -shared -fPIC -o silly.so silly.c | |
[spc]lucy:/tmp>lua | |
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio | |
require "silly" | |
x = silly.info() | |
print(x.cwd,x.pid,x.loadave) | |
/tmp 22647 (0.06 0.04 0.01) | |
os.exit() | |
[spc]lucy:/tmp> | |
-spc (Code follows ... ) | |
/**************************************************************************** | |
* | |
* A silly example of extending lua via the shared object method. | |
* Here's how this is done under Linux: | |
* | |
* gcc -g -fPIC -shared -o silly.so silly.c | |
* | |
* You will then have a shared object you can load into the lua interpreter. | |
* | |
*****************************************************************************/ | |
#define _BSD_SOURCE | |
#include <stddef.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <lua.h> | |
#include <lauxlib.h> | |
#include <lualib.h> | |
#include <unistd.h> | |
/******************************************************************/ | |
static int silly_loadave__toprint(lua_State *L) | |
{ | |
char buffer[BUFSIZ]; | |
lua_Number load[3]; | |
int i; | |
if (lua_type(L,1) != LUA_TTABLE) | |
return luaL_error(L,"Expecting table, but got %s",luaL_typename(L,1)); | |
for (i = 0 ; i < 3 ; i++) | |
{ | |
lua_pushinteger(L,i + 1); | |
lua_gettable(L,1); | |
load[i] = luaL_checknumber(L,-1); | |
} | |
sprintf(buffer,"(%.2f %.2f %.2f)",load[0],load[1],load[2]); | |
lua_pushstring(L,buffer); | |
return 1; | |
} | |
/*******************************************************************/ | |
static int silly_loadave__newindex(lua_State *L) | |
{ | |
return luaL_error(L,"Attempting to upate a read-only table"); | |
} | |
/******************************************************************/ | |
static int info(lua_State *L) | |
{ | |
lua_newtable(L); | |
lua_pushliteral(L,"pid"); | |
lua_pushnumber(L,getpid()); | |
lua_settable(L,-3); | |
char buffer[FILENAME_MAX]; | |
getcwd(buffer,FILENAME_MAX); | |
lua_pushliteral(L,"cwd"); | |
lua_pushlstring(L,buffer,strlen(buffer)); | |
lua_settable(L,-3); | |
double load[3]; | |
if (getloadavg(load,3) != -1) | |
{ | |
/*---------------------------------------------- | |
; equiv of | |
; loadave = {} | |
; loadave[1] = x; | |
; loadave[2] = y; | |
; loadave[3] = z; | |
;----------------------------------------------*/ | |
lua_pushliteral(L,"loadave"); | |
lua_createtable(L,3,0); | |
lua_pushnumber(L,1); | |
lua_pushnumber(L,load[0]); | |
lua_settable(L,-3); | |
lua_pushnumber(L,2); | |
lua_pushnumber(L,load[1]); | |
lua_settable(L,-3); | |
lua_pushnumber(L,3); | |
lua_pushnumber(L,load[2]); | |
lua_settable(L,-3); | |
/*--------------------------------------------- | |
; mt = {} | |
; mt.__tostring = silly_loadave__toprint | |
; mt.__newindex = silly_loadave__newindex | |
; setmetable(loadave,mt); | |
;---------------------------------------------*/ | |
lua_createtable(L,0,2); | |
lua_pushliteral(L,"__tostring"); | |
lua_pushcfunction(L,silly_loadave__toprint); | |
lua_settable(L,-3); | |
lua_pushliteral(L,"__newindex"); | |
lua_pushcfunction(L,silly_loadave__newindex); | |
lua_settable(L,-3); | |
lua_setmetatable(L,-2); | |
lua_settable(L,-3); | |
} | |
return 1; | |
} | |
/************************************************************************/ | |
static const struct luaL_reg reg_silly[] = | |
{ | |
{ "info" , info }, | |
{ NULL , NULL } | |
}; | |
int luaopen_silly(lua_State *L) | |
{ | |
luaL_register(L,"silly", reg_silly); | |
return 1; | |
} | |
/************************************************************************/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment