Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Mar 2015 06:03:35 +0000 (UTC)
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r280485 - projects/lua-bootloader/sys/boot/liblua
Message-ID:  <201503250603.t2P63ZIo057199@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rpaulo
Date: Wed Mar 25 06:03:34 2015
New Revision: 280485
URL: https://svnweb.freebsd.org/changeset/base/280485

Log:
  Import Pedro Souza's customized lua code that integrates with the boot
  loader.

Added:
  projects/lua-bootloader/sys/boot/liblua/
  projects/lua-bootloader/sys/boot/liblua/Makefile   (contents, props changed)
  projects/lua-bootloader/sys/boot/liblua/lstd.c   (contents, props changed)
  projects/lua-bootloader/sys/boot/liblua/lstd.h   (contents, props changed)
  projects/lua-bootloader/sys/boot/liblua/lutils.c   (contents, props changed)
  projects/lua-bootloader/sys/boot/liblua/lutils.h   (contents, props changed)

Added: projects/lua-bootloader/sys/boot/liblua/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/lua-bootloader/sys/boot/liblua/Makefile	Wed Mar 25 06:03:34 2015	(r280485)
@@ -0,0 +1,20 @@
+# $FreeBSD$
+
+LUA_PATH=	${.CURDIR}/../../contrib/lua
+.PATH:		${LUA_PATH}/src
+
+LIB=		lua
+INTERNALLIB=
+
+# Core Lua.
+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
+
+# Our utilities.
+SRCS+=	lstd.c lutils.c
+
+CFLAGS+= -I${.CURDIR} -DBOOT_LUA -ffreestanding -nostdlib -fno-stack-protector
+CFLAGS+= -I${LUA_PATH}
+
+.include <bsd.lib.mk>

Added: projects/lua-bootloader/sys/boot/liblua/lstd.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/lua-bootloader/sys/boot/liblua/lstd.c	Wed Mar 25 06:03:34 2015	(r280485)
@@ -0,0 +1,429 @@
+/*-
+ * Copyright (c) 2014 Pedro Souza <pedrosouza@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 "lstd.h"
+
+#ifdef BOOT_LUA
+
+int
+abs(int v)
+{
+	return v < 0 ? -v : v;
+}
+
+double
+floor(double v)
+{
+	long long int a = (long long int)v;
+
+	return ((double)a);
+}
+
+char *
+strpbrk (const char *str1, const char *str2)
+{
+	while (*str1)
+	{
+		const char *tmp = str2;
+		while (*tmp)
+			if (*str1 == *tmp++)
+				return (str1);
+		++str1;
+	}
+
+	return (0);
+}
+
+double
+ldexp (double x, int exp)
+{
+	if (exp >= 0)
+		return x * ((long long)1 << exp);
+	else
+		return x / ((long long)1 << (-exp));
+}
+
+
+double
+pow(double a, double b)
+{
+	printf("pow not implemented!\n");
+	return 1.;
+}
+
+double
+strtod(const char *string, char **endPtr)
+{
+	int sign = 0;
+	int exp_sign = 0;
+	int has_num = 0;
+	int has_frac = 0;
+	int has_exp = 0;
+	unsigned long long num = 0;
+	unsigned long long exp = 0;
+
+	double frac = 0;
+	double fm = 0.1;
+	double exp_m = 1;
+	double ret = 0;
+
+	const char *ptr = string;
+
+	while (isspace(*ptr)) ++ptr;
+
+	if (*ptr == '-')
+	{
+		sign = 1;
+		++ptr;
+	} else if (*ptr == '+')
+		++ptr;
+
+	while (isdigit(*ptr))
+	{
+		num *= 10;
+		num += *ptr - '0';
+		++ptr;
+		++has_num;
+	}
+
+	if (*ptr == '.')
+	{
+		++ptr;
+		while (isdigit(*ptr))
+		{
+			frac += (double)(*ptr - '0') * fm;
+			fm *= 0.1;
+			++ptr;
+			++has_frac;
+		}
+	}
+
+	if (has_frac == 0 && has_num == 0)
+	{
+		if (endPtr)
+			*endPtr = (char*)string;
+		return 0.;
+	}
+
+	ret = (double)num;
+	ret += frac;
+
+	if (*ptr == 'e' || *ptr == 'E')
+	{
+		if (endPtr)
+			*endPtr = (char*)ptr;
+		++ptr;
+		if (*ptr == '-')
+		{
+			exp_sign = 1;
+			++ptr;
+		} else if (*ptr == '+')
+			++ptr;
+
+		while (isdigit(*ptr))
+		{
+			exp *= 10;
+			exp += *ptr - '0';
+			++ptr;
+			++has_exp;
+		}
+		if (has_exp == 0)
+			return ret;
+	}
+
+	if (endPtr)
+		*endPtr = (char*)ptr;
+
+	if (has_exp)
+	{
+		while (exp--)
+			exp_m *= 10;
+		if (exp_sign)
+			exp_m = 1./exp_m;
+
+	}
+	if (sign)
+		ret = -ret;
+
+	return ret * exp_m;
+}
+
+int
+dtostr(double v, char *str)
+{
+	int	exp = 0;
+	int	i;
+	long long n;
+	double	e = 1;
+	char	*ptr;
+	char	tmp[20];
+	char	*buf = str;
+
+	if (v == 0)
+	{
+		str[0] = '0';
+		str[1] = 0;
+		return 1;
+	}
+
+	if (v < 0)
+	{
+		*buf++ = '-';
+		v = -v;
+	}
+
+	if (v <= e)
+	{
+		while (v < e)
+		{
+			--exp;
+			e *= 0.1;
+		}
+	} else {
+		while (v > e)
+		{
+			++exp;
+			e *= 10;
+		}
+		--exp;
+		e /= 10;
+	}
+	if (exp > 9 || exp < -9)
+	{
+		v /= e;
+	} else {
+		exp = 0;
+	}
+
+	n = (long long)v;
+	v -= n;
+	ptr = &tmp[19];
+	*ptr = 0;
+
+	do
+	{
+		i = n % 10;
+		n /= 10;
+		*(--ptr) = i + '0';
+	} while (n > 0);
+
+	while (*ptr != 0) *buf++ = *ptr++;
+
+	if (v != 0)
+	{
+		ptr = buf;
+		*buf++ = '.';
+
+		for (i = 0; i < 17; ++i)
+		{
+			v *= 10;
+			n = (long long)v;
+			*buf++ = '0' + n;
+			ptr = n > 0 ? buf : ptr;
+			v -= n;
+		}
+		buf = ptr;
+	}
+
+	if (exp != 0)
+	{
+		*buf++ = 'e';
+		if (exp < 0)
+		{
+			*buf++ = '-';
+			exp = -exp;
+		}
+		ptr = &tmp[19];
+		*ptr = 0;
+		while (exp > 0)
+		{
+			i = exp % 10;
+			exp /= 10;
+			*(--ptr) = '0' + i;
+		}
+		while (*ptr != 0) *buf++ = *ptr++;
+	}
+	*buf = 0;
+	return buf - str;
+}
+
+FILE *
+fopen(const char *filename, const char *mode)
+{
+	struct stat	st;
+	int		fd, r;
+	FILE		*f;
+
+	if (mode == NULL || mode[0] != 'r') return NULL;
+
+	fd = open(filename, O_RDONLY);
+	if (fd < 0)
+	{
+		return NULL;
+	}
+
+	f = malloc(sizeof(FILE));
+	if (f == NULL)
+	{
+		close(fd);
+		return NULL;
+	}
+
+	r = fstat(fd, &st);
+	if (r == 0)
+	{
+		f->fd = fd;
+		f->offset = 0;
+		f->size = st.st_size;
+	} else {
+		free(f);
+		close(fd);
+		f = NULL;
+	}
+	return f;
+}
+
+
+FILE *
+freopen(const char *filename, const char *mode, FILE *stream)
+{
+	fclose(stream);
+	return fopen(filename, mode);
+}
+
+size_t
+fread(void *ptr, size_t size, size_t count, FILE *stream)
+{
+	size_t r;
+	if (stream == NULL) return 0;
+	r = (size_t)read(stream->fd, ptr, size * count);
+	stream->offset += r;
+	return r;
+}
+
+int
+fclose(FILE *stream)
+{
+	if (stream == NULL) return EOF;
+	close(stream->fd);
+	free(stream);
+	return 0;
+}
+
+int
+ferror(FILE *stream)
+{
+	return (stream == NULL) || (stream->fd < 0);
+}
+
+int
+feof(FILE *stream)
+{
+	if (stream == NULL) return 1;
+	return stream->offset >= stream->size;
+}
+
+int
+getc(FILE *stream)
+{
+	char	ch;
+	size_t	r;
+
+	if (stream == NULL) return EOF;
+	r = read(stream->fd, &ch, 1);
+	if (r == 1) return ch;
+	return EOF;
+}
+
+char *
+strstr(const char *str1, const char *str2)
+{
+	const char	*s1 = str1;
+	const char	*s2 = str2;
+	int		eq = 0;
+
+	while (*s1)
+	{
+		while (*s2 && *s1)
+		{
+			if (*s2 != *s1)
+				break;
+			s1++; s2++;
+		}
+		if (*s2 == NULL)
+			return (char*)str1;
+		if (*s1 == NULL)
+			return NULL;
+		s1 = ++str1;
+		s2 = str2;
+	}
+	return NULL;
+}
+
+void
+luai_writestring(const char *s, int i)
+{
+	while (i-- > 0)
+		putchar(*s++);
+}
+
+int
+iscntrl(int c)
+{
+	return (c >= 0x00 && c <= 0x1F) || c == 0x7F;
+}
+
+int
+isgraph(int c)
+{
+	return (c >= 0x21 && c <= 0x7E);
+}
+
+int
+ispunct(int c)
+{
+	return (c >= 0x21 && c <= 0x2F) || (c >= 0x3A && c <= 0x40) ||
+	    (c >= 0x5B && c <= 0x60) || (c >= 0x7B && c <= 0x7E);
+}
+
+void *
+memchr(const void *ptr, int value, size_t num)
+{
+	const unsigned char * str = (const unsigned char*)ptr;
+	const unsigned char * end = (const unsigned char*)ptr + num;
+	while (str < end)
+	{
+		if (*str == (unsigned char)value) return str;
+		++str;
+	}
+	return NULL;
+}
+
+#endif /* BOOT_LUA */

Added: projects/lua-bootloader/sys/boot/liblua/lstd.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/lua-bootloader/sys/boot/liblua/lstd.h	Wed Mar 25 06:03:34 2015	(r280485)
@@ -0,0 +1,105 @@
+/*-
+ * Copyright (c) 2014 Pedro Souza <pedrosouza@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$
+ */
+
+#ifndef LSTD_H
+#define LSTD_H
+
+#ifdef BOOT_LUA
+
+#include <stand.h>
+#include <sys/types.h>
+#include <sys/stddef.h>
+#include <sys/stdint.h>
+#include <limits.h>
+#include <string.h>
+#include <machine/stdarg.h>
+
+
+typedef __ptrdiff_t ptrdiff_t;
+
+typedef struct FILE
+{
+	int fd;
+	size_t offset;
+	size_t size;
+} FILE;
+
+FILE * fopen(const char *filename, const char *mode);
+
+FILE * freopen( const char *filename, const char *mode, FILE *stream);
+
+size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
+
+int fclose(FILE *stream);
+
+int ferror(FILE *stream);
+
+int feof(FILE *stream);
+
+int getc(FILE * stream);
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+#define stdin ((FILE*)NULL)
+
+#ifndef BUFSIZ
+#define BUFSIZ 512
+#endif
+
+#define getlocaledecpoint() ('.')
+
+#define strcoll strcmp
+
+int abs(int v);
+
+double floor(double v);
+
+char * strpbrk (const char *str1, const char *str2);
+
+double ldexp (double x, int exp);
+
+double pow(double a, double b);
+
+double strtod(const char *string, char **endPtr);
+
+int dtostr(double v, char *str);
+
+char * strstr(const char *str1, const char *str2);
+
+int iscntrl(int c);
+
+int isgraph(int c);
+
+int ispunct(int c);
+
+void * memchr(const void *ptr, int value, size_t num);
+
+#endif
+#endif //LSTD_H

Added: projects/lua-bootloader/sys/boot/liblua/lutils.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/lua-bootloader/sys/boot/liblua/lutils.c	Wed Mar 25 06:03:34 2015	(r280485)
@@ -0,0 +1,361 @@
+/*-
+ * Copyright (c) 2014 Pedro Souza <pedrosouza@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 <src/lua.h>
+#include <lstd.h>
+
+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_ischar(lua_State *L)
+{
+	lua_pushboolean(L, ischar());
+	return 1;
+}
+
+int
+lua_gets(lua_State *L)
+{
+	char	buf[129];
+	ngets(buf, 128);
+	lua_pushstring(L, buf);
+	return 1;
+}
+
+int
+lua_time(lua_State *L)
+{
+	lua_pushnumber(L, time(NULL));
+	return 1;
+}
+
+int
+lua_delay(lua_State *L)
+{
+	int	n = lua_gettop(L);
+
+	if (n == 1)
+	{
+		delay((int)lua_tonumber(L, 1));
+	}
+	return 0;
+}
+
+int
+lua_getenv(lua_State *L)
+{
+	char	*ev;
+	int	n = lua_gettop(L);
+
+	if (n == 1)
+	{
+		ev = getenv(lua_tostring(L, 1));
+		if (ev != NULL)
+			lua_pushstring(L, ev);
+		else
+			lua_pushnil(L);
+	} else
+		lua_pushnil(L);
+	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
+ldo_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;
+}
+
+int
+ldo_file(lua_State *L, const char *filename)
+{
+	struct stat		st;
+	int			fd, r;
+	char			*buf;
+	const char		*errstr;
+
+	fd = open(filename, O_RDONLY);
+	if (fd < 0) {
+		printf("Failed to open file %s\n", filename);
+		return 1;
+	}
+
+	r = fstat(fd, &st);
+
+	if (r != 0) {
+		printf("Failed to retrieve file stat!\n");
+		close(fd);
+		return 1;
+	}
+
+	buf = malloc(st.st_size);
+	if (buf == NULL) {
+		printf("Failed to alloc buf!\n");
+		close(fd);
+		return 1;
+	}
+
+	r = read(fd, buf, st.st_size);
+	if (r != st.st_size) {
+		printf("Failed to read file (%d/%d)!\n", r, (unsigned int)st.st_size);
+		free(buf);
+		close(fd);
+		return 1;
+	}
+
+	if (ldo_string(L, buf, st.st_size) != 0) {
+		errstr = lua_tostring(L, -1);
+		errstr = errstr == NULL ? "unknown" : errstr;
+		printf("Failed to run %s file with error: %s.\n", filename, errstr);
+		lua_pop(L, 1);
+	}
+
+	free(buf);
+	close(fd);
+
+	return 0;
+}
+
+int
+lua_include(lua_State *L)
+{
+	const char	*str;
+
+	if (lua_gettop(L) != 1)
+	{
+		lua_pushboolean(L, 0);
+		return 1;
+	}
+	str = lua_tostring(L, 1);
+	lua_pushboolean(L, (ldo_file(L, str) == 0));
+	return 1;
+}
+
+int
+lua_openfile(lua_State *L)
+{
+	const char	*str;
+	int		fd;
+	int		r;
+	struct stat	st;
+
+	if (lua_gettop(L) != 1)
+	{
+		lua_pushnil(L);
+		return 1;
+	}
+	str = lua_tostring(L, 1);
+
+	FILE * f = fopen(str, "r");
+	if (f != NULL)
+	{
+		FILE ** ptr = (FILE**)lua_newuserdata(L, sizeof(FILE**));
+		*ptr = f;
+	} else
+		lua_pushnil(L);
+	return 1;
+}
+
+int
+lua_closefile(lua_State *L)
+{
+	FILE ** f;
+	if (lua_gettop(L) != 1)
+	{
+		lua_pushboolean(L, 0);
+		return 1;
+	}
+
+	f = (FILE**)lua_touserdata(L, 1);
+	if (f != NULL && *f != NULL)
+	{
+		lua_pushboolean(L, fclose(*f) == 0 ? 1 : 0);
+		*f = NULL;
+	} else
+		lua_pushboolean(L, 0);
+
+	return 1;
+}
+
+int
+lua_readfile(lua_State *L)
+{
+	FILE	**f;
+	size_t	size, r;
+	char * buf;
+
+	if (lua_gettop(L) < 1 || lua_gettop(L) > 2)
+	{
+		lua_pushnil(L);
+		lua_pushnumber(L, 0);
+		return 2;
+	}
+
+	f = (FILE**)lua_touserdata(L, 1);
+
+	if (f == NULL || *f == NULL)
+	{
+		lua_pushnil(L);
+		lua_pushnumber(L, 0);
+		return 2;
+	}
+
+	if (lua_gettop(L) == 2)
+	{
+		size = (size_t)lua_tonumber(L, 2);
+	} else
+		size = (*f)->size;
+
+
+	buf = (char*)malloc(size);
+	r = fread(buf, 1, size, *f);
+	lua_pushlstring(L, buf, r);
+	free(buf);
+	lua_pushnumber(L, r);
+
+	return 2;
+}
+
+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_perform, "loader", "perform"},
+			{lua_delay, "loader", "delay"},
+			{lua_time, "loader", "time"},
+			{lua_include, "loader", "include"},
+			{lua_getenv, "loader", "getenv"},
+			{lua_getchar, "io", "getchar"},
+			{lua_ischar, "io", "ischar"},
+			{lua_gets, "io", "gets"},
+			{lua_openfile, "io", "open"},
+			{lua_closefile, "io", "close"},
+			{lua_readfile, "io", "read"},
+			{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;
+	}
+}

Added: projects/lua-bootloader/sys/boot/liblua/lutils.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/lua-bootloader/sys/boot/liblua/lutils.h	Wed Mar 25 06:03:34 2015	(r280485)
@@ -0,0 +1,45 @@
+/*-
+ * Copyright (c) 2014 Pedro Souza <pedrosouza@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 <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 ldo_string(lua_State *L, const char *str, size_t size);
+
+int ldo_file(lua_State *L, const char *filename);
+
+void lregister(const char *tname, const char *fname, int (*fptr)(lua_State *));
+
+void register_utils(lua_State *L);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503250603.t2P63ZIo057199>