2 * Copyright (c) 2004 Scott Ullrich <GeekGod@GeekGod.com>
3 * Portions Copyright (c) 2004 Chris Pressey <cpressey@catseye.mine.nu>
5 * Copyright (c) 2004 The DragonFly Project.
8 * This code is derived from software contributed to The DragonFly Project
9 * by Scott Ullrich and Chris Pressey (see above for e-mail addresses).
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in
20 * the documentation and/or other materials provided with the
23 * 3. Neither the name of The DragonFly Project nor the names of its
24 * contributors may be used to endorse or promote products derived
25 * from this software without specific, prior written permission.
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
30 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
31 * COPYRIGHT HOLDERS, CONTRIBUTORS OR VOICES IN THE AUTHOR'S HEAD
32 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY
33 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
34 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
35 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
36 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
37 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
38 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
40 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
41 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
43 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * common.c - common functions for dfuibe_lua
51 * $Id: common.c,v 1.56 2005/04/04 13:56:37 den Exp $
55 #include <sys/types.h>
64 #include "lua50/lua.h"
65 #include "lua50/lauxlib.h"
66 #include "lua50/lualib.h"
70 /*----------------------------- utilities ---------------------------*/
73 * Given the names of two global variables, the first a regular
74 * 'Class' table, and the second a metatable which will be attached
75 * to all object 'instances':
76 * - add an __index property to the metatable that redirects
77 * all accesses on the instance to the class table;
78 * - add a __metatable propery to the metatable, to hide it.
81 lua_set_instance_handler(lua_State
*L
,
82 const char *table_name
, const char *metatable_name
)
84 int metatable_idx
, methods_idx
;
86 lua_pushstring(L
, table_name
); /* name of our 'class' table */
87 lua_gettable(L
, LUA_GLOBALSINDEX
); /* get it from globals */
88 methods_idx
= lua_gettop(L
); /* Find its position on the stack */
90 lua_pushstring(L
, metatable_name
); /* name of our metatable */
91 lua_gettable(L
, LUA_GLOBALSINDEX
); /* get it from globals */
92 metatable_idx
= lua_gettop(L
); /* Find its position on the stack */
95 * Add __index event to metatable (metatable.__index = methods).
96 * This lets the Lua script refer to the methods by indexing
97 * the instance variable like so: x:y(z).
99 lua_pushliteral(L
, "__index");
100 lua_pushvalue(L
, methods_idx
);
101 lua_settable(L
, metatable_idx
);
103 lua_pushliteral(L
, "__metatable"); /* hide metatable */
104 lua_pushvalue(L
, methods_idx
);
105 lua_settable(L
, metatable_idx
); /* metatable.__metatable = methods */
111 * Retrieve a string from a Lua table.
114 lua_access_table_string(lua_State
*L
, int table_idx
, const char *key
)
118 lua_pushlstring(L
, key
, strlen(key
));
119 lua_gettable(L
, table_idx
);
120 if (lua_isstring(L
, lua_gettop(L
))) {
121 s
= luaL_checkstring(L
, lua_gettop(L
));
131 * This function is adapted from liolib.c: push a FILE * onto the
132 * Lua stack as a file object that Lua's file module understands.
135 lua_pushfileptr(lua_State
*L
, FILE *f
)
139 pf
= (FILE **)lua_newuserdata(L
, sizeof(FILE *));
141 luaL_getmetatable(L
, "FILE*");
142 lua_setmetatable(L
, -2);
146 lua_show_debug(lua_State
*L
)
150 lua_getstack(L
, 0, &X
);
151 lua_getinfo(L
, "nluS", &X
);
152 fprintf(stderr
, "--+-- BEGIN Lua Debug Info --+--\n");
153 fprintf(stderr
, "source: %s\n", X
.short_src
);
154 fprintf(stderr
, "linedefined: %d\n", X
.linedefined
);
155 fprintf(stderr
, "what: %s\n", X
.what
);
156 fprintf(stderr
, "name: %s\n", X
.name
);
157 fprintf(stderr
, "namewhat: %s\n", X
.namewhat
);
158 fprintf(stderr
, "nups: %d\n", X
.nups
);
159 fprintf(stderr
, "--+-- END Lua Debug Info --+--\n");
162 /*------------------------ module entry point ----------------------*/
165 luaopen_ldfui(lua_State
*L
)
170 * Push a new table, which will contain all of our sub-packages,
171 * and right before it, push the name that we will give it.
173 lua_pushstring(L
, "DFUI");
177 * Find out where the table is, so we can refer to it easily.
179 container_idx
= lua_gettop(L
);
182 * Initialize each sub-package and push it on the stack, then
183 * assign it to a slot in our master table.
186 lua_pushliteral(L
, "Connection");
187 lua_dfui_register(L
);
188 lua_settable(L
, container_idx
);
190 lua_pushliteral(L
, "Progress");
191 lua_dfui_progress_register(L
);
192 lua_settable(L
, container_idx
);
195 * Now that all that is done, put our master table into the
196 * globals table, using the name we gave it at the beginning.
198 lua_settable(L
, LUA_GLOBALSINDEX
);
201 * Get our master table out of the globals and push it onto
202 * the stack, so we can return it to whatever script require()d us.
204 lua_pushstring(L
, "DFUI");
205 lua_gettable(L
, LUA_GLOBALSINDEX
);