More C-Functions (luci.cutil.instanceof, luci.cutil.pcdata)
authorSteven Barth <steven@midlink.org>
Thu, 20 Nov 2008 19:22:05 +0000 (19:22 +0000)
committerSteven Barth <steven@midlink.org>
Thu, 20 Nov 2008 19:22:05 +0000 (19:22 +0000)
.cproject
libs/core/Makefile
libs/core/luasrc/util.lua
libs/core/src/luci_cutil.c

index f56f28e..e1a4774 100644 (file)
--- a/.cproject
+++ b/.cproject
 <builder id="org.eclipse.cdt.build.core.settings.default.builder.823611263" keepEnvironmentInBuildfile="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
 <tool id="org.eclipse.cdt.build.core.settings.holder.libs.1685234798" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
 <tool id="org.eclipse.cdt.build.core.settings.holder.570824141" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
 <builder id="org.eclipse.cdt.build.core.settings.default.builder.823611263" keepEnvironmentInBuildfile="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
 <tool id="org.eclipse.cdt.build.core.settings.holder.libs.1685234798" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
 <tool id="org.eclipse.cdt.build.core.settings.holder.570824141" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
-<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.491129717" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
+<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.491129717" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
 <listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
 <listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
+<listOptionValue builtIn="false" value="/usr/include"/>
 </option>
 <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.858094059" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
 </tool>
 <tool id="org.eclipse.cdt.build.core.settings.holder.344617955" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
 </option>
 <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.858094059" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
 </tool>
 <tool id="org.eclipse.cdt.build.core.settings.holder.344617955" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
-<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.564526987" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
+<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.564526987" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
 <listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
 <listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
+<listOptionValue builtIn="false" value="/usr/include"/>
 </option>
 <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1426860237" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
 </tool>
 <tool id="org.eclipse.cdt.build.core.settings.holder.869454750" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
 </option>
 <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1426860237" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
 </tool>
 <tool id="org.eclipse.cdt.build.core.settings.holder.869454750" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
-<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.838425449" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
+<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.838425449" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
 <listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
 <listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
+<listOptionValue builtIn="false" value="/usr/include"/>
 </option>
 <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1755775295" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
 </tool>
 </option>
 <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1755775295" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
 </tool>
index 7c9b3d7..8a30256 100644 (file)
@@ -9,4 +9,4 @@ compile: src/luci_cutil.o
        $(LINK) $(SHLIB_FLAGS) -o dist$(LUCI_LIBRARYDIR)/cutil.so src/luci_cutil.o
 
 clean: luaclean
        $(LINK) $(SHLIB_FLAGS) -o dist$(LUCI_LIBRARYDIR)/cutil.so src/luci_cutil.o
 
 clean: luaclean
-       rm src/*.o
\ No newline at end of file
+       rm -f src/*.o
index ffab60c..e493811 100644 (file)
@@ -105,6 +105,7 @@ class = cutil.class
 -- @return                     Boolean indicating whether the object is an instance
 -- @see                                class
 -- @see                                clone
 -- @return                     Boolean indicating whether the object is an instance
 -- @see                                class
 -- @see                                clone
+--[[
 function instanceof(object, class)
        local meta = getmetatable(object)
        while meta and meta.__index do
 function instanceof(object, class)
        local meta = getmetatable(object)
        while meta and meta.__index do
@@ -115,6 +116,8 @@ function instanceof(object, class)
        end
        return false
 end
        end
        return false
 end
+]]--
+instanceof = cutil.instanceof
 
 
 --
 
 
 --
@@ -201,6 +204,7 @@ end
 --- Create valid XML PCDATA from given string.
 -- @param value        String value containing the data to escape
 -- @return             String value containing the escaped data
 --- Create valid XML PCDATA from given string.
 -- @param value        String value containing the data to escape
 -- @return             String value containing the escaped data
+--[[
 function pcdata(value)
        return value and tostring(value):gsub("[&\"'<>]", {
                ["&"] = "&#38;",
 function pcdata(value)
        return value and tostring(value):gsub("[&\"'<>]", {
                ["&"] = "&#38;",
@@ -210,6 +214,8 @@ function pcdata(value)
                [">"] = "&#62;"
        })
 end
                [">"] = "&#62;"
        })
 end
+]]--
+pcdata = cutil.pcdata
 
 --- Strip HTML tags from given string.
 -- @param value        String containing the HTML text
 
 --- Strip HTML tags from given string.
 -- @param value        String containing the HTML text
index 9f56c43..31bec04 100644 (file)
@@ -33,14 +33,12 @@ static int luci__string_mod(lua_State *L) {
        lua_settop(L, 2);
 
        /* Get format and push it to the bottom of the stack */
        lua_settop(L, 2);
 
        /* Get format and push it to the bottom of the stack */
-       lua_pushliteral(L, "");
-       lua_getfield(L, -1, "format");
+       lua_getfield(L, 1, "format");
        lua_insert(L, 1);
        lua_insert(L, 1);
-       lua_pop(L, 1);
 
        /* If second argument is a table, unpack it */
        if (lua_istable(L, 3)) {
 
        /* If second argument is a table, unpack it */
        if (lua_istable(L, 3)) {
-               n = luaL_getn(L, 3);
+               n = lua_objlen(L, 3);
                if (n > 0) {
                        luaL_checkstack(L, n, "too many results to unpack");
                        for (i=1; i<=n; i++) {
                if (n > 0) {
                        luaL_checkstack(L, n, "too many results to unpack");
                        for (i=1; i<=n; i++) {
@@ -91,13 +89,11 @@ static int luci__instantiate(lua_State *L) {
 
 /* luci.cutil.class(baseclass) */
 static int luci_class(lua_State *L) {
 
 /* luci.cutil.class(baseclass) */
 static int luci_class(lua_State *L) {
-       int n = lua_gettop(L);
-
        /* Create class */
        lua_newtable(L);
 
        /* Create metatable and register parent class if any */
        /* Create class */
        lua_newtable(L);
 
        /* Create metatable and register parent class if any */
-       if (n && lua_istable(L, 1)) {
+       if (lua_gettop(L) > 1 && lua_istable(L, 1)) {
                lua_createtable(L, 0, 2);
                lua_pushvalue(L, 1);
                lua_setfield(L, -2, "__index");
                lua_createtable(L, 0, 2);
                lua_pushvalue(L, 1);
                lua_setfield(L, -2, "__index");
@@ -113,10 +109,106 @@ static int luci_class(lua_State *L) {
        return 1;
 }
 
        return 1;
 }
 
+/* luci.cutil.instanceof(object, class) */
+static int luci_instanceof(lua_State *L) {
+       int stat = 0;
+
+       luaL_checkany(L, 1);
+       luaL_checkany(L, 2);
+
+       if (lua_getmetatable(L, 1)) {
+               /* get parent class */
+               lua_getfield(L, -1, "__index");
+               while (lua_istable(L, -1)) {
+                       /* parent class == class */
+                       if (lua_equal(L, -1, 2)) {
+                               stat = 1;
+                               break;
+                       }
+
+                       /* remove last metatable */
+                       lua_remove(L, -2);
+
+                       /* get metatable of parent class */
+                       if (lua_getmetatable(L, -1)) {
+                               /* remove last parent class */
+                               lua_remove(L, -2);
+
+                               /* get next parent class */
+                               lua_getfield(L, -1, "__index");
+                       } else {
+                               break;
+                       }
+               }
+       }
+
+       lua_pushboolean(L, stat);
+       return 1;
+}
+
+
+/* luci.cutil.pcdata(obj) */
+static int luci_pcdata(lua_State *L) {
+       if (lua_isnone(L, 1)) {
+               lua_pushnil(L);
+               return 1;
+       }
+
+       /* Discard anything else */
+       lua_settop(L, 1);
+
+       /* tostring(obj) */
+       lua_pushvalue(L, lua_upvalueindex(1));
+       lua_insert(L, 1);
+       lua_call(L, 1, 1);
+
+       /* pattern */
+       lua_pushvalue(L, lua_upvalueindex(2));
+
+       /* repl */
+       lua_pushvalue(L, lua_upvalueindex(3));
+
+       /* get gsub function */
+       lua_getfield(L, -3, "gsub");
+       lua_insert(L, 1);
+
+       /* tostring(obj):gsub(pattern, repl) */
+       lua_call(L, 3, 1);
+       return 1;
+}
+
+
+/* Registration helper for luci.cutil.pcdata */
+static void luci__register_pcdata(lua_State *L) {
+       /* tostring */
+       lua_getfield(L, LUA_GLOBALSINDEX, "tostring");
+
+       /* pattern */
+       lua_pushliteral(L, "[&\"'<>]");
+
+       /* repl */
+       lua_createtable(L, 0, 5);
+
+       lua_pushliteral(L, "&#38;");
+       lua_setfield(L, -2, "&");
+       lua_pushliteral(L, "&#34;");
+       lua_setfield(L, -2, "\"");
+       lua_pushliteral(L, "&#39;");
+       lua_setfield(L, -2, "'");
+       lua_pushliteral(L, "&#60;");
+       lua_setfield(L, -2, "<");
+       lua_pushliteral(L, "&#62;");
+       lua_setfield(L, -2, ">");
+
+       /* register function */
+       lua_pushcclosure(L, luci_pcdata, 3);
+       lua_setfield(L, -2, "pcdata");
+}
 
 /* Registry */
 static const luaL_Reg registry[] = {
                {"class",               luci_class},
 
 /* Registry */
 static const luaL_Reg registry[] = {
                {"class",               luci_class},
+               {"instanceof",  luci_instanceof},
                { NULL,                 NULL },
 };
 
                { NULL,                 NULL },
 };
 
@@ -130,6 +222,9 @@ LUALIB_API int luaopen_luci_cutil(lua_State *L) {
        lua_pushliteral(L, LUCI_MODCOPY);
        lua_setfield(L, -2, "_COPYRIGHT");
 
        lua_pushliteral(L, LUCI_MODCOPY);
        lua_setfield(L, -2, "_COPYRIGHT");
 
+       /* Additional registrations */
+       luci__register_pcdata(L);
+
 
        /* Register pythonic printf string operator */
        lua_pushliteral(L, "");
 
        /* Register pythonic printf string operator */
        lua_pushliteral(L, "");