diff options
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/mfluac.c')
-rw-r--r-- | Build/source/texk/web2c/mfluadir/mfluac.c | 1600 |
1 files changed, 0 insertions, 1600 deletions
diff --git a/Build/source/texk/web2c/mfluadir/mfluac.c b/Build/source/texk/web2c/mfluadir/mfluac.c deleted file mode 100644 index 82d8a04927f..00000000000 --- a/Build/source/texk/web2c/mfluadir/mfluac.c +++ /dev/null @@ -1,1600 +0,0 @@ -#include <string.h> - -#define EXTERN extern - - -#if defined(JIT) -#include "mfluajitd.h" -#else -#include "mfluad.h" -#endif - -#include <lua.h> -#include <lualib.h> -#include <lauxlib.h> -#include <kpathsea/kpathsea.h> -#if defined(JIT) -#include <luajit.h> -#endif - - -#if defined(NO_OTFCC) -/* */ -#else -extern int otfcc_build(int argc, char *argv[]); -extern int otfcc_dump(int argc, char *argv[]); -#endif - -/* See shell_cmd_is_allowed below */ -int shellenabledp = 1; -int restrictedshell = 0; - -/**************************************************************/ -/* */ -/* MFbuiltin private functions */ -/* */ -/**************************************************************/ -static lua_State *Luas[1]; - -/* static */ -/* void stackdump_g(lua_State* L) */ -/* { */ -/* int i; */ -/* int top = lua_gettop(L); */ - -/* printf("total in stack %d\n",top); */ - -/* for (i = 1; i <= top; i++) */ -/* { /\* repeat for each level *\/ */ -/* int t = lua_type(L, i); */ -/* printf("[%d][%d] ",i,i-top-1); */ -/* switch (t) { */ -/* case LUA_TSTRING: /\* strings *\/ */ -/* printf("string: '%s'\n", lua_tostring(L, i)); */ -/* break; */ -/* case LUA_TBOOLEAN: /\* booleans *\/ */ -/* printf("boolean %s\n",lua_toboolean(L, i) ? "true" : "false"); */ -/* break; */ -/* case LUA_TNUMBER: /\* numbers *\/ */ -/* printf("number: %g\n", lua_tonumber(L, i)); */ -/* break; */ -/* default: /\* other values *\/ */ -/* printf("%s\n", lua_typename(L, t)); */ -/* break; */ -/* } */ -/* printf(" "); /\* put a separator *\/ */ -/* } */ -/* printf("\n"); /\* end the listing *\/ */ -/* } */ - - -static -void priv_lua_reporterrors(lua_State *L, int status) -{ - if ( status!=0 ) { - fprintf(stderr,"\n! %s\n",lua_tostring(L, -1)); - lua_pop(L, 1); /* remove error message */ - } -} - - -/* static */ -/* void priv_lua_writemessage(lua_State *L, char *startmsg, char *bodymsg, char *endmsg, int status) */ -/* { */ -/* (void) L; */ -/* if ( status!=0 ) { */ -/* fprintf(stdout,"%s%s%s\n",startmsg,bodymsg,endmsg); */ -/* } */ -/* } */ - - -#define link_field(p) mem[p].hhfield.rh /* {the |link| field of a memory word} */ -static int priv_mfweb_link(lua_State *L) -{ - halfword p,q; - p = (halfword) lua_tonumber(L,1); - q = link_field(p); - lua_pushnumber(L,q); - return 1; -} - -#define info_field(p) mem[p].hhfield.lhfield /* {the |info| field of a memory word} */ -static int priv_mfweb_info(lua_State *L) -{ - halfword p,q; - p = (halfword) lua_tonumber(L,1); - q = info_field(p); - lua_pushnumber(L,q); - return 1; -} - - -#define x_coord(p) mem[p+1].cint /* {the |x| coordinate of this knot} */ -static int priv_mfweb_x_coord(lua_State *L) -{ - halfword p; - int q; - p = (halfword) lua_tonumber(L,1); - q = x_coord(p); - lua_pushnumber(L,q); - return 1; -} - -#define y_coord(p) mem[p+2].cint /* {the |y| coordinate of this knot} */ -static int priv_mfweb_y_coord(lua_State *L) -{ - halfword p,q; - p = (halfword) lua_tonumber(L,1); - q = y_coord(p); - lua_pushnumber(L,q); - return 1; -} - - -#define left_type(p) mem[p].hhfield.b0 /* {characterizes the path entering this knot} */ -static int priv_mfweb_left_type(lua_State *L) -{ - halfword p,q; - p = (halfword) lua_tonumber(L,1); - q = left_type(p); - lua_pushnumber(L,q); - return 1; -} - -#define right_type(p) mem[p].hhfield.b1 /* {characterizes the path leaving this knot} */ -static int priv_mfweb_right_type(lua_State *L) -{ - halfword p,q; - p = (halfword) lua_tonumber(L,1); - q = right_type(p); - lua_pushnumber(L,q); - return 1; -} - - -#define left_x(p) mem[p+3].cint /* {the |x| coordinate of previous control point} */ -static int priv_mfweb_left_x(lua_State *L) -{ - halfword p; - integer q ; - p = (halfword) lua_tonumber(L,1); - q = left_x(p); - lua_pushnumber(L,q); - return 1; -} - - -#define left_y(p) mem[p+4].cint /* {the |y| coordinate of previous control point} */ -static int priv_mfweb_left_y(lua_State *L) -{ - halfword p; - integer q ; - p = (halfword) lua_tonumber(L,1); - q = left_y(p); - lua_pushnumber(L,q); - return 1; -} - - -#define right_x(p) mem[p+5].cint /* {the |x| coordinate of next control point} */ -static int priv_mfweb_right_x(lua_State *L) -{ - halfword p; - integer q ; - p = (halfword) lua_tonumber(L,1); - q = right_x(p); - lua_pushnumber(L,q); - return 1; -} - -#define right_y(p) mem[p+6].cint /* {the |y| coordinate of next control point} */ -static int priv_mfweb_right_y(lua_State *L) -{ - halfword p; - integer q; - p = (halfword) lua_tonumber(L,1); - q = right_y(p); - lua_pushnumber(L,q); - return 1; -} - -/* @ Conversely, the |n_sin_cos| routine takes an |angle| and produces the sine */ -/* and cosine of that angle. The results of this routine are */ -/* stored in global integer variables |n_sin| and |n_cos|. */ - -/* @<Glob...@>= */ -/* @!n_sin,@!n_cos:fraction; {results computed by |n_sin_cos|} */ - -/* @ Given an integer |z| that is $2^{20}$ times an angle $\theta$ in degrees, */ -/* the purpose of |n_sin_cos(z)| is to set */ -/* |x=@t$r\cos\theta$@>| and |y=@t$r\sin\theta$@>| (approximately), */ -/* for some rather large number~|r|. The maximum of |x| and |y| */ -/* will be between $2^{28}$ and $2^{30}$, so that there will be hardly */ -/* any loss of accuracy. Then |x| and~|y| are divided by~|r|. */ -static int priv_mfweb_n_sin_cos(lua_State *L) -{ - nsincos(lua_tonumber(L,1)); - return 0; -} - - -/* @ When a lot of work is being done on a particular edge structure, we plant */ -/* a pointer to its main header in the global variable |cur_edges|. */ -/* This saves us from having to pass this pointer as a parameter over and */ -/* over again between subroutines. */ - -/* Similarly, |cur_wt| is a global weight that is being used by several */ -/* procedures at once. */ - -/* @<Glob...@>= */ -/* @!cur_edges:pointer; {the edge structure of current interest} */ -/* @!cur_wt:integer; {the edge weight of current interest} */ -static int priv_mfweb_LUAGLOBALGET_cur_edges(lua_State *L) -{ - halfword p = curedges; - lua_pushnumber(L,p); - return 1; -} - - -/* @<Glob...@>= */ -/* @!cur_type:small_number; {the type of the expression just found} */ -/* @!cur_exp:integer; {the value of the expression just found} */ -static int priv_mfweb_LUAGLOBALGET_cur_exp(lua_State *L) -{ - halfword p = curexp; - lua_pushnumber(L,p); - return 1; -} - - - - - - -/* @d mem_top==30000 {largest index in the |mem| array dumped by \.{INIMF}; */ -/* must be substantially larger than |mem_min| */ -/* and not greater than |mem_max|} */ -static int priv_mfweb_LUAGLOBALGET_mem_top(lua_State *L) -{ - integer p = memtop; - lua_pushnumber(L,p); - return 1; -} - - - -/* And there are two global variables that affect the rounding */ -/* decisions, as we'll see later; they are called |cur_pen| and |cur_path_type|. */ -/* The latter will be |double_path_code| if |make_spec| is being */ -/* applied to a double path.*/ -/* @!cur_pen:pointer; {an implicit input of |make_spec|, used in autorounding} */ -static int priv_mfweb_LUAGLOBALGET_cur_pen(lua_State *L) -{ - halfword p = curpen; - lua_pushnumber(L,p); - return 1; -} - - -/* @ The current octant code appears in a global variable. If, for example, */ -/* we have |octant=third_octant|, it means that a curve traveling in a north to */ -/* north-westerly direction has been rotated for the purposes of internal */ -/* calculations so that the |move| data travels in an east to north-easterly */ -/* direction. We want to unrotate as we update the edge structure. */ -/* */ -/* @<Glob...@>= */ -/* @!octant:first_octant..sixth_octant; {the current octant of interest} */ -static int priv_mfweb_LUAGLOBALGET_octant(lua_State *L) -{ - char p = octant; - lua_pushnumber(L,p); - return 1; -} - - -/* @ The |make_spec| routine has an interesting side effect, namely to set */ -/* the global variable |turning_number| to the number of times the tangent */ -/* vector of the given cyclic path winds around the origin. */ -/* */ -/* @<Glob...@>= */ -/* @!turning_number:integer; {another output of |make_spec|} */ -static int priv_mfweb_LUAGLOBALGET_turning_number(lua_State *L) -{ - integer p = turningnumber; - lua_pushnumber(L,p); - return 1; -} - - - -/* @ \MF\ also has a bunch of internal parameters that a user might want to */ -/* fuss with. Every such parameter has an identifying code number, defined here. */ -/* Warning: these parameters must be the same of the original MF !! */ -#define tracing_titles 1 /*show titles online when they appear} */ -#define tracing_equations 2 /*show each variable when it becomes known} */ -#define tracing_capsules 3 /*show capsules too} */ -#define tracing_choices 4 /*show the control points chosen for paths} */ -#define tracing_specs 5 /*show subdivision of paths into octants before digitizing} */ -#define tracing_pens 6 /*show details of pens that are made} */ -#define tracing_commands 7 /*show commands and operations before they are performed} */ -#define tracing_restores 8 /*show when a variable or internal is restored} */ -#define tracing_macros 9 /*show macros before they are expanded} */ -#define tracing_edges 10 /*show digitized edges as they are computed} */ -#define tracing_output 11 /*show digitized edges as they are output} */ -#define tracing_stats 12 /*show memory usage at end of job} */ -#define tracing_online 13 /*show long diagnostics on terminal and in the log file} */ -#define year 14 /*the current year (e.g., 1984)} */ -#define month 15 /*the current month (e.g., 3 $\equiv$ March)} */ -#define day 16 /*the current day of the month} */ -#define time 17 /*the number of minutes past midnight when this job started} */ -#define char_code 18 /*the number of the next character to be output} */ -#define char_ext 19 /*the extension code of the next character to be output} */ -#define char_wd 20 /*the width of the next character to be output} */ -#define char_ht 21 /*the height of the next character to be output} */ -#define char_dp 22 /*the depth of the next character to be output} */ -#define char_ic 23 /*the italic correction of the next character to be output} */ -#define char_dx 24 /*the device's $x$ movement for the next character, in pixels} */ -#define char_dy 25 /*the device's $y$ movement for the next character, in pixels} */ -#define design_size 26 /*the unit of measure used for |char_wd..char_ic|, in points} */ -#define hppp 27 /*the number of horizontal pixels per point} */ -#define vppp 28 /*the number of vertical pixels per point} */ -#define x_offset 29 /*horizontal displacement of shipped-out characters} */ -#define y_offset 30 /*vertical displacement of shipped-out characters} */ -#define pausing 31 /*positive to display lines on the terminal before they are read} */ -#define showstopping 32 /*positive to stop after each \&{show} command} */ -#define fontmaking 33 /*positive if font metric output is to be produced} */ -#define proofing 34 /*positive for proof mode, negative to suppress output} */ -#define smoothing 35 /*positive if moves are to be ``smoothed''} */ -#define autorounding 36 /*controls path modification to ``good'' points} */ -#define granularity 37 /*autorounding uses this pixel size} */ -#define fillin 38 /*extra darkness of diagonal lines} */ -#define turning_check 39 /*controls reorientation of clockwise paths} */ -#define warning_check 40 /*controls error message when variable value is large} */ -#define boundary_char 41 /*the right boundary character for ligatures} */ -/* @d max_given_internal=41 */ - -static int priv_mfweb_LUAGLOBALGET_char_code(lua_State *L) -{ - integer p = roundunscaled ( internal [char_code]) % 256 ; - lua_pushnumber(L,p); - return 1; -} -static int priv_mfweb_LUAGLOBALGET_char_ext(lua_State *L) -{ - integer p = roundunscaled ( internal [char_ext]) ; - lua_pushnumber(L,p); - return 1; -} - - -static int priv_mfweb_LUAGLOBALGET_char_wd(lua_State *L) -{ - integer p = internal [char_wd] ; - lua_pushnumber(L,p); - return 1; -} -static int priv_mfweb_LUAGLOBALGET_char_ht(lua_State *L) -{ - integer p = internal [char_ht] ; - lua_pushnumber(L,p); - return 1; -} -static int priv_mfweb_LUAGLOBALGET_char_dp(lua_State *L) -{ - integer p = internal [char_dp] ; - lua_pushnumber(L,p); - return 1; -} -static int priv_mfweb_LUAGLOBALGET_char_ic(lua_State *L) -{ - integer p = internal [char_ic] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_char_dx(lua_State *L) -{ - integer p = internal [char_dx] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_char_dy(lua_State *L) -{ - integer p = internal [char_dy] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_designsize(lua_State *L) -{ - integer p = internal [design_size] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_hppp(lua_State *L) -{ - integer p = internal [hppp] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_vppp(lua_State *L) -{ - integer p = internal [vppp] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_x_offset(lua_State *L) -{ - integer p = internal [x_offset] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_y_offset(lua_State *L) -{ - integer p = internal [y_offset] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_granularity(lua_State *L) -{ - integer p = internal [granularity] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_fillin(lua_State *L) -{ - integer p = internal [fillin] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_turning_check(lua_State *L) -{ - integer p = internal [turning_check] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mfweb_LUAGLOBALGET_boundary_char(lua_State *L) -{ - integer p = internal [boundary_char] ; - lua_pushnumber(L,p); - return 1; -} - -static int priv_mflua_version(lua_State *L) -{ - lua_pushstring(L,MFLUA_VERSION); - return 1; -} - -static int priv_mflua_banner(lua_State *L) -{ - lua_pushstring(L,BANNER); - return 1; -} - - -/**************************************************************/ -/* */ -/* otfcc private functions */ -/* */ -/**************************************************************/ - -#ifdef MFLuaJIT -static void lua_len (lua_State *L, int i) { - switch (lua_type(L, i)) { - case LUA_TSTRING: - lua_pushnumber(L, (lua_Number)lua_objlen(L, i)); - break; - case LUA_TTABLE: - if (!luaL_callmeta(L, i, "__len")) - lua_pushnumber(L, (lua_Number)lua_objlen(L, i)); - break; - case LUA_TUSERDATA: - if (luaL_callmeta(L, i, "__len")) - break; - /* FALLTHROUGH */ - default: - luaL_error(L, "attempt to get length of a %s value", - lua_typename(L, lua_type(L, i))); - } -} - -static int lua_absindex (lua_State *L, int i) { - if (i < 0 && i > LUA_REGISTRYINDEX) - i += lua_gettop(L) + 1; - return i; -} -static int lua_geti (lua_State *L, int index, lua_Integer i) { - index = lua_absindex(L, index); - lua_pushinteger(L, i); - lua_gettable(L, index); - return lua_type(L, -1); -} -#endif - -static int priv_mflua_otf_dump(lua_State *L) { - if (!lua_istable(L, -1)) { - fprintf(stderr, "! dump: expected a table\n"); - lua_pop(L,1); - return 0; - } else { - /* table is in the stack at index '-1' */ - size_t l=0; - int j; - char **av; - - lua_len (L, -1); - l = (size_t)(lua_tonumber(L,-1)); - lua_pop(L,1); - if (l==0 ) - return 0; - av = malloc((l+1) * sizeof(char*)); - if (av==NULL) { - fprintf(stderr, "! dump: unable to allocate av\n"); - return 0; - } - av[0] = malloc((strlen("/dump")+1)*sizeof(char)); - if (av[0]==NULL) { - fprintf(stderr, "! dump: unable to allocate av[0]\n"); - return 0; - } - strcpy(av[0], "/dump"); - /* fill the av array */ - for(j=1;j<=l;j++){ - const char *k; - lua_geti(L,-1,j); - k = lua_tostring(L, -1); - av[j] = malloc((strlen(k)+1)*sizeof(char)); - if (av[j]==NULL) { - fprintf(stderr, "! dump: unable to allocate av[%d]\n",j); - return 0; - } - strcpy(av[j], k); - lua_pop(L,1); - } -#if defined(NO_OTFCC) -/* */ -#else - otfcc_dump(l+1,av); -#endif - /* release the av */ - free(av[0]); - for(j=1;j<=l;j++) - free(av[j]); - free(av); - return 0; - } -} - - -static int priv_mflua_otf_build(lua_State *L) { - if (!lua_istable(L, -1)) { - fprintf(stderr, "! build: expected a table\n"); - lua_pop(L,1); - return 0; - } else { - /* table is in the stack at index '-1' */ - size_t l=0; - int j; - char **av; - - lua_len (L, -1); - l = (size_t)(lua_tonumber(L,-1)) ; - lua_pop(L,1); - if (l==0 ) - return 0; - av = malloc((l+1) * sizeof(char*)); - if (av==NULL) { - fprintf(stderr, "! build: unable to allocate av\n"); - return 0; - } - av[0] = malloc((strlen("/build")+1)*sizeof(char)); - if (av[0]==NULL) { - fprintf(stderr, "! build: unable to allocate av[0]\n"); - return 0; - } - strcpy(av[0], "/build"); - /* fill the av array */ - for(j=1;j<=l;j++){ - const char *k; - lua_geti(L,-1,j); - k = lua_tostring(L, -1); - av[j] = malloc((strlen(k)+1)*sizeof(char)); - if (av[j]==NULL) { - fprintf(stderr, "! build: unable to allocate av[%d]\n",j); - return 0; - } - strcpy(av[j], k); - lua_pop(L,1); - } -#if defined(NO_OTFCC) -/* */ -#else - otfcc_build(l+1,av); -#endif - /* release the av */ - free(av[0]); - for(j=1;j<=l;j++) - free(av[j]); - free(av); - return 0; - } -} - - - -/**************************************************************/ -/* */ -/* mflua layer */ -/* */ -/**************************************************************/ -static const struct luaL_Reg MFbuiltin_l[] = { - {"link", priv_mfweb_link}, - {"info", priv_mfweb_info}, - {"x_coord", priv_mfweb_x_coord}, - {"y_coord", priv_mfweb_y_coord}, - {"left_type", priv_mfweb_left_type}, - {"right_type", priv_mfweb_right_type}, - {"left_x", priv_mfweb_left_x}, - {"left_y", priv_mfweb_left_y}, - {"right_x", priv_mfweb_right_x}, - {"right_y", priv_mfweb_right_y}, - {"n_sin_cos", priv_mfweb_n_sin_cos}, - {"cur_edges", priv_mfweb_LUAGLOBALGET_cur_edges}, - {"cur_exp", priv_mfweb_LUAGLOBALGET_cur_exp}, - {"mem_top", priv_mfweb_LUAGLOBALGET_mem_top}, - {"cur_pen", priv_mfweb_LUAGLOBALGET_cur_pen}, - {"octant", priv_mfweb_LUAGLOBALGET_octant}, - {"char_code", priv_mfweb_LUAGLOBALGET_char_code}, - {"char_ext", priv_mfweb_LUAGLOBALGET_char_ext}, - {"char_wd", priv_mfweb_LUAGLOBALGET_char_wd}, - {"char_ht", priv_mfweb_LUAGLOBALGET_char_ht}, - {"char_dp", priv_mfweb_LUAGLOBALGET_char_dp}, - {"char_ic", priv_mfweb_LUAGLOBALGET_char_ic}, - {"char_dx", priv_mfweb_LUAGLOBALGET_char_dx}, - {"char_dy", priv_mfweb_LUAGLOBALGET_char_dy}, - {"designsize", priv_mfweb_LUAGLOBALGET_designsize}, - {"hppp", priv_mfweb_LUAGLOBALGET_hppp}, - {"vppp", priv_mfweb_LUAGLOBALGET_vppp}, - {"x_offset", priv_mfweb_LUAGLOBALGET_x_offset}, - {"y_offset", priv_mfweb_LUAGLOBALGET_y_offset}, - {"granularity", priv_mfweb_LUAGLOBALGET_granularity}, - {"fillin", priv_mfweb_LUAGLOBALGET_fillin}, - {"turning_check", priv_mfweb_LUAGLOBALGET_turning_check}, - {"boundary_char", priv_mfweb_LUAGLOBALGET_boundary_char}, - {"turning_number", priv_mfweb_LUAGLOBALGET_turning_number}, - {"mflua_version",priv_mflua_version}, - {"mflua_banner",priv_mflua_banner}, - {NULL, NULL} /* sentinel */ -}; - -static struct luaL_Reg mflua_otfcc[] = { - { "build", priv_mflua_otf_build }, - { "dump", priv_mflua_otf_dump }, - { NULL, NULL} -}; - - -#define lua_swap(L) lua_insert(L, -2) - -#define GETGLOBALTABLEMFLUA(a) lua_getglobal(L, "mflua");\ - if (!lua_istable(L, -1)) { \ - lua_pushstring(L,#a); \ - lua_pushstring(L,":global table mflua not found"); \ - lua_concat (L, 2); \ - priv_lua_reporterrors(L, 1); \ - } \ - - - -int mfluabeginprogram(void) -{ - lua_State *L ; - char* luafile ; - int res ; - - L = luaL_newstate(); - luaL_openlibs(L); - Luas[0] = L; - /* register lua functions */ - luaopen_kpse(L); - /* to be sure of having a clear stack */ - lua_settop(L,0); - - - lua_getglobal(L, "mflua"); - if (!lua_istable(L, -1)) { - lua_pop(L,1); - lua_newtable(L); - lua_setglobal(L,"mflua"); - /* check it */ - lua_getglobal(L,"mflua"); - if (!lua_istable(L, -1)) { - printf("mflua table NOT registered!\n"); - } else { - lua_pushstring(L,"MFbuiltin"); -#ifdef MFLuaJIT - /* 5.1 */ - luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE|LUAJIT_MODE_OFF); - lua_newtable(L); - luaL_register (L,NULL,MFbuiltin_l); -#else - luaL_newlib(L,MFbuiltin_l); -#endif - lua_settable(L, -3); - /* set the otfcc table */ - lua_pushstring(L,"otf"); -#ifdef MFLuaJIT - /* 5.1 */ - lua_newtable(L); - luaL_register (L,NULL,mflua_otfcc); -#else - luaL_newlib(L,mflua_otfcc); -#endif - lua_settable(L, -3); - - } - lua_pop(L,1); - } - - - luafile = kpse_find_file("mflua.lua", kpse_lua_format, 0); - if (luafile==NULL) { - res = 1; - lua_pushstring(L,"mflua.lua not found."); - priv_lua_reporterrors(L, res); - goto EXIT; - } - res = luaL_loadfile(L, luafile); - free(luafile); - if ( res==LUA_OK ) { - if((res=lua_pcall(L,0,0,0))){ - priv_lua_reporterrors(L, res); - goto EXIT; - } - } else { - priv_lua_reporterrors(L, res); - goto EXIT; - } - /* Still a chance that mflua is around */ - GETGLOBALTABLEMFLUA(mfluabeginprogram); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"begin_program"); - if((res=lua_pcall(L,0,0,0))) - priv_lua_reporterrors(L, res); - } - EXIT: - lua_settop(L,0); - return 0; -} - -/* /\* TODO*\/ */ -/* int mfluaendprogram(void) */ -/* { */ -/* lua_State *L; */ -/* char* luafile; */ -/* int res; */ - -/* L = Luas[0]; */ -/* GETGLOBALTABLEMFLUA(mfluaendprogram); */ -/* luafile = kpse_find_file("end_program.lua", kpse_lua_format, 0); */ -/* if (luafile==NULL) { */ -/* res = 1; */ -/* lua_pushstring(L,"end_program.lua not found"); */ -/* priv_lua_reporterrors(L, res); */ -/* lua_settop(L,0); */ -/* return 0; */ -/* } */ -/* priv_lua_writemessage(L,"(",luafile,")",1); */ -/* res = luaL_loadfile(L, luafile); */ -/* free(luafile); */ -/* if ( res==0 ) { */ -/* res = lua_pcall(L, 0, 0, 0); */ -/* } */ -/* /\* stackdump_g(L); *\/ */ -/* priv_lua_reporterrors(L, res); */ -/* lua_settop(L,0); */ -/* return 0; */ -/* } */ - -int mfluaendprogram(void) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaendprogram); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"end_program"); - /* do the call (0 arguments, 0 result) */ - if((res=lua_pcall(L, 0, 0, 0))){ - lua_pushstring(L,"error in end_program:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPREstartofMF(void) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREstartofMF); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"PRE_start_of_MF"); - /* do the call (0 arguments, 0 result) */ - if((res=lua_pcall(L, 0, 0, 0))){ - lua_pushstring(L,"error in PRE_start_of_MF:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPREmaincontrol(void) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREmaincontrol); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_main_control"); - /* do the call (0 arguments, 0 result) */ - if((res=lua_pcall(L, 0, 0, 0))){ - lua_pushstring(L,"error in PRE_main_control:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - -int mfluaPOSTmaincontrol(void) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTmaincontrol); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_main_control"); - /* do the call (0 arguments, 0 result) */ - if((res=lua_pcall(L, 0, 0, 0))){ - lua_pushstring(L,"error in POST_main_control:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; - -} - - -int mfluainitialize(void) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluainitialize); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "mflua_initialize"); - /* do the call (0 arguments, 0 result) */ - if((res=lua_pcall(L, 0, 0, 0))){ - lua_pushstring(L,"error in mflua_initialize:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPOSTfinalcleanup(void) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTfinalcleanup); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_final_cleanup"); - /* do the call (0 arguments, 0 result) */ - if((res=lua_pcall(L, 0, 0, 0))){ - lua_pushstring(L,"error in POST_final_cleanup:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -/* Not a good way: */ -/* 1) these definitions are taken from mfcoerc.h which is generated at run-time */ -/* 2) too much coupling with webc2c translation of mf.web*/ -/* */ -/* #define printdiagnostic(s, t, nuline) zprintdiagnostic((strnumber) (s), (strnumber) (t), (boolean) (nuline)) */ -/* #define print(s) zprint((integer) (s)) */ -/* #define printarg(q, n, b) zprintarg((halfword) (q), (integer) (n), (halfword) (b) */ -/* int mfluaprintpath P3C(halfword, h , strnumber, s , boolean, nuline) */ -/* { */ -/* fprintf(stderr,"\n! %d \n",s); */ -/* printdiagnostic ( 517 , s , nuline ) ; */ -/* println () ; */ -/* print ( 518 ) ; */ -/* println () ; */ -/* fprintf(stderr,"\n! %s\n","*end***************"); */ - -/* lua_State *L = Luas[0]; */ -/* char* file = kpse_find_file("print_path.lua", kpse_lua_format, 0); */ -/* int res = luaL_loadfile(L, file); */ -/* if (file) free (file); */ -/* if ( res==0 ) { */ -/* res = lua_pcall(L, 0, 0, 0); */ -/* } */ -/* // */ -/* //stackdump_g(L); */ - -/* // */ -/* priv_lua_reporterrors(L, res); */ -/* return 0; */ - -/* } */ - -int mfluaprintpath(halfword h, strnumber s, boolean nuline) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaprintpath); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "printpath"); - lua_pushnumber(L, h); /* push 1st argument */ - lua_pushnumber(L, s); /* push 2nd argument */ - lua_pushnumber(L, nuline); /* push 3nd argument */ - /* do the call (3 arguments, 0 result) */ - if((res=lua_pcall(L, 3, 0, 0))){ - lua_pushstring(L,"error in printpath:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaprintedges(strnumber s, boolean nuline, integer xoff, integer yoff) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaprintedges); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "printedges"); - lua_pushnumber(L, s); /* push 1st argument */ - lua_pushnumber(L, nuline); /* push 2nd argument */ - lua_pushnumber(L, xoff); /* push 3nd argument */ - lua_pushnumber(L, yoff); /* push 4nd argument */ - /* do the call (4 arguments, 0 result) */ - if((res=lua_pcall(L, 4, 0, 0))){ - lua_pushstring(L,"error in printedges:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -/* */ -/* Sensor before and after offset_prep */ -/* */ -int mfluaPREoffsetprep(halfword c, halfword h) -{ - - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREoffsetprep); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_offset_prep"); - lua_pushnumber(L, c); /* push 1st argument */ - lua_pushnumber(L, h); /* push 2nd argument */ - /* do the call (2 arguments, 0 result) */ - if((res=lua_pcall(L, 2, 0, 0))){ - lua_pushstring(L,"error in PRE_offset_prep:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPOSToffsetprep(halfword c, halfword h) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSToffsetprep); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_offset_prep"); - lua_pushnumber(L, c); /* push 1st argument */ - lua_pushnumber(L, h); /* push 2nd argument */ - /* do the call (2 arguments, 0 result) */ - if((res=lua_pcall(L, 2, 0, 0))){ - lua_pushstring(L,"error in POST_offset_prep:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPREmakespecrhs(halfword rhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREmakespecrhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_make_spec_rhs"); - lua_pushnumber(L, rhs); /* push 1st argument */ - /* do the call (1 arguments, 0result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in PRE_make_spec_rhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPOSTmakespecrhs(halfword rhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTmakespecrhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_make_spec_rhs"); - lua_pushnumber(L, rhs); /* push 1st argument */ - /* do the call (1 arguments, 0result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in POST_make_spec_rhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPREmakespeclhs(halfword lhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREmakespeclhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_make_spec_lhs"); - lua_pushnumber(L, lhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in PRE_make_spec_lhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - -int mfluaPOSTmakespeclhs(halfword lhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTmakespeclhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_make_spec_lhs"); - lua_pushnumber(L, lhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in POST_make_spec_lhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPREfillenveloperhs(halfword rhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREfillenveloperhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_fill_envelope_rhs"); - lua_pushnumber(L, rhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in PRE_fill_envelope_rhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPOSTfillenveloperhs(halfword rhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTfillenveloperhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_fill_envelope_rhs"); - lua_pushnumber(L, rhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in POST_fill_envelope_rhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPREfillenvelopelhs(halfword lhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREfillenvelopelhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_fill_envelope_lhs"); - lua_pushnumber(L, lhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in PRE_fill_envelope_lhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPOSTfillenvelopelhs(halfword lhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTfillenvelopelhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_fill_envelope_lhs"); - lua_pushnumber(L, lhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in POST_fill_envelope_lhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPREfillspecrhs(halfword rhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREfillspecrhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_fill_spec_rhs"); - lua_pushnumber(L, rhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in PRE_fill_spec_rhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - -int mfluaPOSTfillspecrhs(halfword rhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTfillspecrhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_fill_spec_rhs"); - lua_pushnumber(L, rhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in POST_fill_spec_rhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - -int mfluaPREfillspeclhs(halfword lhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREfillspeclhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_fill_spec_lhs"); - L = Luas[0]; - lua_pushnumber(L, lhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in PRE_fill_spec_lhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPOSTfillspeclhs(halfword lhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTfillspeclhs); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_fill_spec_lhs"); - L = Luas[0]; - lua_pushnumber(L, lhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in POST_fill_spec_lhs:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPREmovetoedges(halfword lhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREmovetoedges); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "PRE_move_to_edges"); - lua_pushnumber(L, lhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in PRE_move_to_edges:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPOSTmovetoedges(halfword lhs) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTmovetoedges); - if (lua_istable(L, -1)) { - lua_getfield(L,-1, "POST_move_to_edges"); - lua_pushnumber(L, lhs); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in POST_move_to_edges:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPREmakechoices(halfword p) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREmakechoices); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"PRE_make_choices"); /* function to be called */ - lua_pushnumber(L, p); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in PRE_make_choices:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPOSTmakechoices(halfword p) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTmakechoices); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"POST_make_choices"); /* function to be called */ - lua_pushnumber(L, p); /* push 1st argument */ - /* do the call (1 arguments, 0 result) */ - if((res=lua_pcall(L, 1, 0, 0))){ - lua_pushstring(L,"error in POST_make_choices:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaprintretrogradeline(integer x0, integer y0, integer cur_x, integer cur_y) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaprintretrogradeline); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"print_retrograde_line"); - lua_pushnumber(L, x0); /* push 1st argument */ - lua_pushnumber(L, y0); /* push 2nd argument */ - lua_pushnumber(L, cur_x); /* push 3th argument */ - lua_pushnumber(L, cur_y); /* push 4th argument */ - /* do the call (4 arguments, 0 result) */ - if((res=lua_pcall(L, 4, 0, 0))){ - lua_pushstring(L,"error in print_retrograde_line:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaPREmakeellipse(integer major_axis, integer minor_axis, integer theta_angle , integer tx_val, integer ty_val,integer q) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPREmakeellipse); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"PRE_make_ellipse"); - lua_pushnumber(L, major_axis); /* push 1st argument */ - lua_pushnumber(L, minor_axis); /* push 2nd argument */ - lua_pushnumber(L, theta_angle); /* push 3th argument */ - lua_pushnumber(L, tx_val); /* push 4th argument */ - lua_pushnumber(L, ty_val); /* push 5th argument */ - lua_pushnumber(L, q); /* push 6th argument */ - /* do the call (6 arguments, 0 result) */ - if((res=lua_pcall(L, 6, 1, 0))){ - lua_pushstring(L,"error in PRE_make_ellipse:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -int mfluaPOSTmakeellipse(integer major_axis, integer minor_axis, integer mfl_theta , integer mfl_tx, integer mfl_ty,integer q) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaPOSTmakeellipse); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"POST_make_ellipse"); - lua_pushnumber(L, major_axis); /* push 1st argument */ - lua_pushnumber(L, minor_axis); /* push 2nd argument */ - lua_pushnumber(L, mfl_theta); /* push 3th argument */ - lua_pushnumber(L, mfl_tx); /* push 4th argument */ - lua_pushnumber(L, mfl_ty); /* push 5th argument */ - lua_pushnumber(L, q); /* push 6th argument */ - /* do the call (6 arguments, 0 result) */ - if((res=lua_pcall(L, 6, 1, 0))){ - lua_pushstring(L,"error in POST_make_ellipse:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaprinttransitionlinefrom(integer x, integer y) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaprinttransitionlinefrom); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"print_transition_line_from"); - lua_pushnumber(L, x); /* push 1st argument */ - lua_pushnumber(L, y); /* push 2nd argument */ - /* do the call (2 arguments, 0 result) */ - if((res=lua_pcall(L, 2, 0, 0))){ - lua_pushstring(L,"error in print_transition_line_from:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - -int mfluaprinttransitionlineto(integer x, integer y) -{ - lua_State *L; - int res; - - L = Luas[0]; - GETGLOBALTABLEMFLUA(mfluaprinttransitionlineto); - if (lua_istable(L, -1)) { - lua_getfield(L,-1,"print_transition_line_to"); - lua_pushnumber(L, x); /* push 1st argument */ - lua_pushnumber(L, y); /* push 2nd argument */ - /* do the call (2 arguments, 0 result) */ - if((res=lua_pcall(L, 2, 0, 0))){ - lua_pushstring(L,"error in print_transition_line_to:"); - lua_swap(L);lua_concat (L, 2); - priv_lua_reporterrors(L, res); - } - } - lua_settop(L,0); - return 0; -} - - - -#define priv_append_char(c) do { \ - strpool[poolptr]=c; \ - poolptr++; \ -} while(0) - -#define priv_str_room(l) do { \ - if ((poolptr + l) > maxpoolptr) { \ - if ((poolptr + l) > poolsize) { \ - fprintf(stderr,"\n! (Lua) MFLua capacity exceeded, sorry [pool size=%ld]\nIf you really absolutely need more capacity,\nyou can ask a wizard to enlarge me.\n",poolsize-initpoolptr); \ - exit(1); \ - } \ - maxpoolptr = poolptr + l; \ - } \ -} while (0) - -int mfluarunscript(halfword j, halfword first_val, halfword limit) -{ - int i ; - lua_State *L ; - unsigned char last_char; - int error; - const char *str; - size_t len; - L = Luas[0]; - last_char = strpool[j+limit-first_val] ; - /* end of a C string */ - strpool[j+limit-first_val] = '\0'; - str = (const char *)(strpool+j) ; - /* do the call (0 arguments, 1 result) */ - error = (luaL_loadstring(L, str) || lua_pcall(L, 0, 1, 0)) ; - strpool[j+limit-first_val] = last_char; - if(error) { - priv_lua_reporterrors(L,error); - } else { - /* retrieve result */ - str = lua_tolstring(L, -1,&len); - priv_str_room(len); - for(i=0;i<len;i++){ - priv_append_char( (unsigned char)(*(str+i))) ; - } - lua_pop(L, 1); /* pop returned value */ - } - return 0; -} - -/* TODO: check if shell_cmd_is_allowed makes sense */ -int shell_cmd_is_allowed(const char *cmd, char **safecmd, char **cmdname){return 1;} |