aboutsummaryrefslogtreecommitdiff
path: root/stand/liblua/lutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'stand/liblua/lutils.c')
-rw-r--r--stand/liblua/lutils.c289
1 files changed, 89 insertions, 200 deletions
diff --git a/stand/liblua/lutils.c b/stand/liblua/lutils.c
index 9243edd07e8f..874dc8bf7d5d 100644
--- a/stand/liblua/lutils.c
+++ b/stand/liblua/lutils.c
@@ -25,9 +25,6 @@
*
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include "lua.h"
@@ -35,8 +32,6 @@ __FBSDID("$FreeBSD$");
#include "lstd.h"
#include "lutils.h"
#include "bootstrap.h"
-#include <gfx_fb.h>
-#include <pnglite.h>
/*
* Like loader.perform, except args are passed already parsed
@@ -64,6 +59,41 @@ lua_command(lua_State *L)
}
static int
+lua_has_command(lua_State *L)
+{
+ const char *cmd;
+
+ cmd = luaL_checkstring(L, 1);
+ if (interp_has_builtin_cmd(cmd)) {
+ lua_pushboolean(L, 1);
+ return 1;
+ }
+
+ lua_pushnil(L);
+ lua_pushstring(L, "Builtin command not found");
+ return 2;
+}
+
+static int
+lua_has_feature(lua_State *L)
+{
+ const char *feature;
+ char *msg;
+
+ feature = luaL_checkstring(L, 1);
+
+ if (feature_name_is_enabled(feature)) {
+ lua_pushboolean(L, 1);
+ return 1;
+ }
+
+ lua_pushnil(L);
+ lua_pushstring(L, "Feature not enabled");
+ return 2;
+}
+
+
+static int
lua_perform(lua_State *L)
{
int argc;
@@ -80,6 +110,13 @@ lua_perform(lua_State *L)
}
static int
+lua_exit(lua_State *L)
+{
+ exit(luaL_checkinteger(L, 1));
+ return 0;
+}
+
+static int
lua_command_error(lua_State *L)
{
@@ -348,210 +385,22 @@ lua_writefile(lua_State *L)
return 1;
}
-/*
- * put image using terminal coordinates.
- */
-static int
-lua_term_putimage(lua_State *L)
-{
- const char *name;
- png_t png;
- uint32_t x1, y1, x2, y2, f;
- int nargs, ret = 0, error;
-
- nargs = lua_gettop(L);
- if (nargs != 6) {
- lua_pushboolean(L, 0);
- return 1;
- }
-
- name = luaL_checkstring(L, 1);
- x1 = luaL_checknumber(L, 2);
- y1 = luaL_checknumber(L, 3);
- x2 = luaL_checknumber(L, 4);
- y2 = luaL_checknumber(L, 5);
- f = luaL_checknumber(L, 6);
-
- x1 = gfx_state.tg_origin.tp_col + x1 * gfx_state.tg_font.vf_width;
- y1 = gfx_state.tg_origin.tp_row + y1 * gfx_state.tg_font.vf_height;
- if (x2 != 0) {
- x2 = gfx_state.tg_origin.tp_col +
- x2 * gfx_state.tg_font.vf_width;
- }
- if (y2 != 0) {
- y2 = gfx_state.tg_origin.tp_row +
- y2 * gfx_state.tg_font.vf_height;
- }
-
- if ((error = png_open(&png, name)) != PNG_NO_ERROR) {
- if (f & FL_PUTIMAGE_DEBUG)
- printf("%s\n", png_error_string(error));
- } else {
- if (gfx_fb_putimage(&png, x1, y1, x2, y2, f) == 0)
- ret = 1;
- (void) png_close(&png);
- }
- lua_pushboolean(L, ret);
- return 1;
-}
-
-static int
-lua_fb_putimage(lua_State *L)
-{
- const char *name;
- png_t png;
- uint32_t x1, y1, x2, y2, f;
- int nargs, ret = 0, error;
-
- nargs = lua_gettop(L);
- if (nargs != 6) {
- lua_pushboolean(L, 0);
- return 1;
- }
-
- name = luaL_checkstring(L, 1);
- x1 = luaL_checknumber(L, 2);
- y1 = luaL_checknumber(L, 3);
- x2 = luaL_checknumber(L, 4);
- y2 = luaL_checknumber(L, 5);
- f = luaL_checknumber(L, 6);
-
- if ((error = png_open(&png, name)) != PNG_NO_ERROR) {
- if (f & FL_PUTIMAGE_DEBUG)
- printf("%s\n", png_error_string(error));
- } else {
- if (gfx_fb_putimage(&png, x1, y1, x2, y2, f) == 0)
- ret = 1;
- (void) png_close(&png);
- }
- lua_pushboolean(L, ret);
- return 1;
-}
-
-static int
-lua_fb_setpixel(lua_State *L)
-{
- uint32_t x, y;
- int nargs;
-
- nargs = lua_gettop(L);
- if (nargs != 2) {
- lua_pushnil(L);
- return 1;
- }
-
- x = luaL_checknumber(L, 1);
- y = luaL_checknumber(L, 2);
- gfx_fb_setpixel(x, y);
- return 0;
-}
-
-static int
-lua_fb_line(lua_State *L)
-{
- uint32_t x0, y0, x1, y1, wd;
- int nargs;
-
- nargs = lua_gettop(L);
- if (nargs != 5) {
- lua_pushnil(L);
- return 1;
- }
-
- x0 = luaL_checknumber(L, 1);
- y0 = luaL_checknumber(L, 2);
- x1 = luaL_checknumber(L, 3);
- y1 = luaL_checknumber(L, 4);
- wd = luaL_checknumber(L, 5);
- gfx_fb_line(x0, y0, x1, y1, wd);
- return 0;
-}
-
-static int
-lua_fb_bezier(lua_State *L)
-{
- uint32_t x0, y0, x1, y1, x2, y2, width;
- int nargs;
-
- nargs = lua_gettop(L);
- if (nargs != 7) {
- lua_pushnil(L);
- return 1;
- }
-
- x0 = luaL_checknumber(L, 1);
- y0 = luaL_checknumber(L, 2);
- x1 = luaL_checknumber(L, 3);
- y1 = luaL_checknumber(L, 4);
- x2 = luaL_checknumber(L, 5);
- y2 = luaL_checknumber(L, 6);
- width = luaL_checknumber(L, 7);
- gfx_fb_bezier(x0, y0, x1, y1, x2, y2, width);
- return 0;
-}
-
-static int
-lua_fb_drawrect(lua_State *L)
-{
- uint32_t x0, y0, x1, y1, fill;
- int nargs;
-
- nargs = lua_gettop(L);
- if (nargs != 5) {
- lua_pushnil(L);
- return 1;
- }
-
- x0 = luaL_checknumber(L, 1);
- y0 = luaL_checknumber(L, 2);
- x1 = luaL_checknumber(L, 3);
- y1 = luaL_checknumber(L, 4);
- fill = luaL_checknumber(L, 5);
- gfx_fb_drawrect(x0, y0, x1, y1, fill);
- return 0;
-}
-
-static int
-lua_term_drawrect(lua_State *L)
-{
- uint32_t x0, y0, x1, y1;
- int nargs;
-
- nargs = lua_gettop(L);
- if (nargs != 4) {
- lua_pushnil(L);
- return 1;
- }
-
- x0 = luaL_checknumber(L, 1);
- y0 = luaL_checknumber(L, 2);
- x1 = luaL_checknumber(L, 3);
- y1 = luaL_checknumber(L, 4);
- gfx_term_drawrect(x0, y0, x1, y1);
- return 0;
-}
-
#define REG_SIMPLE(n) { #n, lua_ ## n }
static const struct luaL_Reg loaderlib[] = {
- REG_SIMPLE(delay),
- REG_SIMPLE(command_error),
REG_SIMPLE(command),
+ REG_SIMPLE(command_error),
+ REG_SIMPLE(delay),
+ REG_SIMPLE(exit),
+ REG_SIMPLE(getenv),
+ REG_SIMPLE(has_command),
+ REG_SIMPLE(has_feature),
REG_SIMPLE(interpret),
REG_SIMPLE(parse),
- REG_SIMPLE(getenv),
REG_SIMPLE(perform),
- /* Also registered as the global 'printc' */
- REG_SIMPLE(printc),
+ REG_SIMPLE(printc), /* Also registered as the global 'printc' */
REG_SIMPLE(setenv),
REG_SIMPLE(time),
REG_SIMPLE(unsetenv),
- REG_SIMPLE(fb_bezier),
- REG_SIMPLE(fb_drawrect),
- REG_SIMPLE(fb_line),
- REG_SIMPLE(fb_putimage),
- REG_SIMPLE(fb_setpixel),
- REG_SIMPLE(term_drawrect),
- REG_SIMPLE(term_putimage),
{ NULL, NULL },
};
@@ -567,6 +416,33 @@ static const struct luaL_Reg iolib[] = {
};
#undef REG_SIMPLE
+static void
+lua_add_feature(void *cookie, const char *name, const char *desc, bool enabled)
+{
+ lua_State *L = cookie;
+
+ /*
+ * The feature table consists solely of features that are enabled, and
+ * their associated descriptions for debugging purposes.
+ */
+ lua_pushstring(L, desc);
+ lua_setfield(L, -2, name);
+}
+
+static void
+lua_add_features(lua_State *L)
+{
+
+ lua_newtable(L);
+ feature_iter(&lua_add_feature, L);
+
+ /*
+ * We should still have just the table on the stack after we're done
+ * iterating.
+ */
+ lua_setfield(L, -2, "features");
+}
+
int
luaopen_loader(lua_State *L)
{
@@ -578,6 +454,19 @@ luaopen_loader(lua_State *L)
lua_setfield(L, -2, "machine_arch");
lua_pushstring(L, LUA_PATH);
lua_setfield(L, -2, "lua_path");
+ lua_pushinteger(L, bootprog_rev);
+ lua_setfield(L, -2, "version");
+ lua_pushinteger(L, CMD_OK);
+ lua_setfield(L, -2, "CMD_OK");
+ lua_pushinteger(L, CMD_WARN);
+ lua_setfield(L, -2, "CMD_WARN");
+ lua_pushinteger(L, CMD_ERROR);
+ lua_setfield(L, -2, "CMD_ERROR");
+ lua_pushinteger(L, CMD_CRIT);
+ lua_setfield(L, -2, "CMD_CRIT");
+ lua_pushinteger(L, CMD_FATAL);
+ lua_setfield(L, -2, "CMD_FATAL");
+ lua_add_features(L);
/* Set global printc to loader.printc */
lua_register(L, "printc", lua_printc);
return 1;