socsvn commit: r269601 - in soc2014/pedrosouza/lua_loader/head/sys/boot: common lua

pedrosouza at FreeBSD.org pedrosouza at FreeBSD.org
Mon Jun 16 02:06:39 UTC 2014


Author: pedrosouza
Date: Mon Jun 16 02:06:36 2014
New Revision: 269601
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269601

Log:
  Added lutils.c which contains lua helper functions

Added:
  soc2014/pedrosouza/lua_loader/head/sys/boot/lua/lutils.c
  soc2014/pedrosouza/lua_loader/head/sys/boot/lua/lutils.h
Modified:
  soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp.h
  soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c
  soc2014/pedrosouza/lua_loader/head/sys/boot/lua/Makefile

Modified: soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp.h
==============================================================================
--- soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp.h	Sun Jun 15 21:55:22 2014	(r269600)
+++ soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp.h	Mon Jun 16 02:06:36 2014	(r269601)
@@ -23,6 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
+ * $FreeBSD$
  */
 
 typedef void	interp_init_t(void *ctx);

Modified: soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c
==============================================================================
--- soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c	Sun Jun 15 21:55:22 2014	(r269600)
+++ soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c	Mon Jun 16 02:06:36 2014	(r269601)
@@ -40,6 +40,8 @@
 #include "../../lua/src/lua.h"
 #include "../../lua/src/ldebug.h"
 
+#include "../lua/lutils.h"
+
 struct interp_lua_softc {
 	lua_State	*luap;
 };
@@ -52,76 +54,6 @@
 } while (0)
 
 
-int
-lua_print(lua_State *L)
-{
-	int i;
-	int n = lua_gettop(L);
-	for (i = 1; i <= n; ++i)
-		printf("%s", lua_tostring(L, i));
-	return 0;
-}
-
-int
-lua_perform(lua_State *L)
-{
-	int argc, ret;
-	char **argv;
-	int res = -1;
-	int n = lua_gettop(L);
-
-	if (n >= 1)
-	{
-		parse(&argc, &argv, lua_tostring(L, 1));
-		res = perform(argc, argv);
-	}
-	lua_pushnumber(L, res);
-
-	return 1;
-}
-
-void *
-lua_realloc(void *ud, void *ptr, size_t osize, size_t nsize)
-{
-	(void)ud; (void)osize;  /* not used */
-	if (nsize == 0) {
-		free(ptr);
-		return NULL;
-	}
-	else
-		return realloc(ptr, nsize);
-}
-
-typedef struct data_chunk
-{
-	void * data;
-	size_t size;
-} data_chunk;
-
-const char *
-read_chunk(lua_State *L, void * chunk, size_t *sz)
-{
-	data_chunk * ds = (data_chunk *)chunk;
-	if (ds->size == 0) return NULL;
-	*sz = ds->size;
-	ds->size = 0;
-	return (const char*)ds->data;
-}
-
-
-int
-do_string(lua_State *L, const char * str, size_t size)
-{
-	int res;
-	data_chunk ds;
-	ds.data = (void*)str;
-	ds.size = size;
-	res = lua_load(L, read_chunk, &ds, "do_string", 0);
-	res = lua_pcall(L, 0, LUA_MULTRET, 0);
-	return res;
-}
-
-
 void
 interp_lua_init(void *ctx)
 {
@@ -133,13 +65,12 @@
 	char buf[16];
 
 	softc = ctx;
-	luap = lua_newstate(lua_realloc, NULL);
+	luap = lua_create();
 	if (luap == NULL) {
 		LDBG("problem with initializing Lua interpreter\n");
 	}
 	softc->luap = luap;
-	lua_register(luap, "print", lua_print);
-	lua_register(luap, "perform", lua_perform);
+	register_utils(luap);
 
 }
 

Modified: soc2014/pedrosouza/lua_loader/head/sys/boot/lua/Makefile
==============================================================================
--- soc2014/pedrosouza/lua_loader/head/sys/boot/lua/Makefile	Sun Jun 15 21:55:22 2014	(r269600)
+++ soc2014/pedrosouza/lua_loader/head/sys/boot/lua/Makefile	Mon Jun 16 02:06:36 2014	(r269601)
@@ -2,9 +2,11 @@
 
 LUA_PATH=	../../lua
 
+SRCS+=	lutils.c
+
 .PATH:	${LUA_PATH}/src
 
-SRCS=	lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lstd.c
+SRCS+=	lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lstd.c
 
 CFLAGS+=	-I.
 CFLAGS+=	-DBOOT_LUA -ffreestanding -nostdlib -fno-stack-protector

Added: soc2014/pedrosouza/lua_loader/head/sys/boot/lua/lutils.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2014/pedrosouza/lua_loader/head/sys/boot/lua/lutils.c	Mon Jun 16 02:06:36 2014	(r269601)
@@ -0,0 +1,221 @@
+/*-
+ * Copyright (c) 2014 Pedro Souza <pedrosouza at freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "../../lua/src/lua.h"
+#include "../common/interp.h"
+
+
+int
+lua_print(lua_State *L)
+{
+	int i;
+	int n = lua_gettop(L);
+	for (i = 1; i <= n; ++i)
+		printf("%s", lua_tostring(L, i));
+	return 0;
+}
+
+int
+lua_perform(lua_State *L)
+{
+	int argc, ret;
+	char **argv;
+	int res = -1;
+	int n = lua_gettop(L);
+
+	if (n >= 1)
+	{
+		parse(&argc, &argv, lua_tostring(L, 1));
+		res = perform(argc, argv);
+	}
+	lua_pushnumber(L, res);
+
+	return 1;
+}
+
+int
+lua_getchar(lua_State *L)
+{
+	lua_pushnumber(L, getchar());
+	return 1;
+}
+
+int
+lua_gets(lua_State *L)
+{
+	char buf[129];
+	ngets(buf, 128);
+	lua_pushstring(L, buf);
+	return 1;
+}
+
+int
+lua_strchar(lua_State *L)
+{
+	const char * str;
+	int i, j;
+	int n = lua_gettop(L);
+	if (n != 2) return 0;
+	str = lua_tostring(L, 1);
+	if (str == NULL) return 0;
+	i = strlen(str);
+	j = (int)lua_tonumber(L, 2);
+	if ( j >= 0 && j < i)
+	{
+		lua_pushnumber(L, str[j]);
+		return 1;
+	}
+	return 0;
+}
+
+int
+lua_charstr(lua_State *L)
+{
+	int n = lua_gettop(L);
+	char buf[129];
+	if (n < 1) return 0;
+	n = n > 128 ? 128 : n;
+
+	buf[n] = 0;
+	while (n-- > 0)
+	{
+		buf[n] = ((int)lua_tonumber(L, n)) & 0xFF;
+	}
+	lua_pushstring(L, buf);
+	return 1;
+}
+
+int
+lua_delay(lua_State * L)
+{
+	int n = lua_gettop(L);
+	if (n == 1)
+	{
+		delay((int)lua_tonumber(L, 1));
+	}
+	return 0;
+}
+
+void *
+lua_realloc(void *ud, void *ptr, size_t osize, size_t nsize)
+{
+	(void)ud; (void)osize;  /* not used */
+	if (nsize == 0) 
+	{
+		free(ptr);
+		return NULL;
+	}
+	else
+		return realloc(ptr, nsize);
+}
+
+typedef struct data_chunk
+{
+	void * data;
+	size_t size;
+} data_chunk;
+
+const char *
+read_chunk(lua_State *L, void * chunk, size_t *sz)
+{
+	data_chunk * ds = (data_chunk *)chunk;
+	if (ds->size == 0) return NULL;
+	*sz = ds->size;
+	ds->size = 0;
+	return (const char*)ds->data;
+}
+
+
+int
+do_string(lua_State *L, const char * str, size_t size)
+{
+	int res;
+	data_chunk ds;
+	ds.data = (void*)str;
+	ds.size = size;
+	res = lua_load(L, read_chunk, &ds, "do_string_", 0);
+	res = lua_pcall(L, 0, LUA_MULTRET, 0);
+	return res;
+}
+
+
+
+void 
+lregister(lua_State * L, const char * tableName, const char * funcName, int (*funcPointer)(lua_State *))
+{
+	lua_getglobal(L, tableName);
+	if (!lua_istable(L, -1))
+	{
+		lua_pop(L, 1);
+		lua_newtable(L);
+		lua_setglobal(L, tableName);
+		lua_getglobal(L, tableName);
+	}
+
+	lua_pushcfunction(L, funcPointer);
+	lua_setfield(L, -2, funcName);
+	lua_pop(L, 1);
+}
+
+
+typedef struct utils_func 
+{
+	int (*func)(lua_State *);
+	const char * table;
+	const char * name;
+} utils_func;
+
+utils_func reg_funcs[] = { {lua_print, NULL, "print"},
+			{lua_perform, "loader", "perform"},
+			{lua_delay, "loader", "delay"},
+			{lua_strchar, "string", "byte"},
+			{lua_charstr, "string", "char"},
+			{lua_getchar, "io", "getchar"},
+			{lua_gets, "io", "gets"},
+			{NULL, NULL, NULL},
+			};
+
+void
+register_utils(lua_State * L)
+{
+	utils_func * f = reg_funcs;
+	while (f->func != NULL && f->name != NULL)
+	{
+		if (f->table != NULL)
+		{
+			lregister(L, f->table, f->name, f->func);
+		}
+		else
+		{
+			lua_register(L, f->name, f->func);
+		}
+		++f;
+	}
+}
\ No newline at end of file

Added: soc2014/pedrosouza/lua_loader/head/sys/boot/lua/lutils.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2014/pedrosouza/lua_loader/head/sys/boot/lua/lutils.h	Mon Jun 16 02:06:36 2014	(r269601)
@@ -0,0 +1,44 @@
+/*-
+ * Copyright (c) 2014 Pedro Souza <pedrosouza at freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include "../../lua/src/lua.h"
+
+#define lua_create() lua_newstate(lua_realloc, NULL)
+
+int lua_print(lua_State *L);
+
+int lua_perform(lua_State *L);
+
+void * lua_realloc(void *ud, void *ptr, size_t osize, size_t nsize);
+
+int do_string(lua_State *L, const char * str, size_t size);
+
+void lregister(const char * tname, const char * fname, int (*fptr)(lua_State *));
+
+void register_utils(lua_State * L);
+


More information about the svn-soc-all mailing list