diff options
Diffstat (limited to 'Build/source')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/lstrlibextjit.c | 395 | ||||
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/luajitstuff.w | 679 |
2 files changed, 0 insertions, 1074 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/lstrlibextjit.c b/Build/source/texk/web2c/luatexdir/lua/lstrlibextjit.c deleted file mode 100644 index 511bd821df9..00000000000 --- a/Build/source/texk/web2c/luatexdir/lua/lstrlibextjit.c +++ /dev/null @@ -1,395 +0,0 @@ -/* lstrlibext.c for luajitex - - Copyright 2013 Luigi Scarso - - Code from lstrlibext.c for LuaTeX - Original version copyright 2012 Taco Hoekwater <taco@luatex.org> - - This file is part of LuajitTeX. - - LuajitTeX is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at your - option) any later version. - - LuajitTeX is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - License for more details. - - You should have received a copy of the GNU General Public License along - with LuaTeX; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "ptexlib.h" -#include <stdio.h> - -#define LUA_CORE - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - - - - -/*#include "lua51/lj_obj.h"*/ -/*#include "lua51/lj_gc.h"*/ -/*#include "lua51/lj_err.h"*/ -/*#include "lua51/lj_str.h"*/ -/*#include "lua51/lj_tab.h"*/ -/*#include "lua51/lj_meta.h"*/ -/*#include "lua51/lj_state.h"*/ -/*#include "lua51/lj_ff.h" */ -/*#include "lua51/lj_bcdump.h"*/ -/*#include "lua51/lj_char.h"*/ -/*#include "lua51/lj_lib.h"*/ - - - -static int bytepairs_aux (lua_State *L) { - size_t ls; - unsigned char i; - const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); - int ind = lua_tointeger(L, lua_upvalueindex(2)); - if (ind<(int)ls) { - if (ind+1<(int)ls) { - lua_pushinteger(L, (ind+2)); /* iterator */ - } else { - lua_pushinteger(L, (ind+1)); /* iterator */ - } - lua_replace(L, lua_upvalueindex(2)); - i = (unsigned char)*(s+ind); - lua_pushinteger(L, i); /* byte one */ - if (ind+1<(int)ls) { - i = (unsigned char)*(s+ind+1); - lua_pushinteger(L, i); /* byte two */ - } else { - lua_pushnil(L); /* odd string length */ - } - return 2; - } - return 0; /* string ended */ -} - - -static int str_bytepairs (lua_State *L) { - luaL_checkstring(L, 1); - lua_settop(L, 1); - lua_pushinteger(L, 0); - lua_pushcclosure(L, bytepairs_aux, 2); - return 1; -} - - -static int bytes_aux (lua_State *L) { - size_t ls; - unsigned char i; - const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); - int ind = lua_tointeger(L, lua_upvalueindex(2)); - if (ind<(int)ls) { - lua_pushinteger(L, (ind+1)); /* iterator */ - lua_replace(L, lua_upvalueindex(2)); - i = (unsigned char)*(s+ind); - lua_pushinteger(L, i); /* byte */ - return 1; - } - return 0; /* string ended */ -} - - -static int str_bytes (lua_State *L) { - luaL_checkstring(L, 1); - lua_settop(L, 1); - lua_pushinteger(L, 0); - lua_pushcclosure(L, bytes_aux, 2); - return 1; -} - - -static int utf_failed(lua_State *L, int new_ind) { - static char fffd [3] = {0xEF,0xBF,0xBD}; - lua_pushinteger(L, new_ind); /* iterator */ - lua_replace(L, lua_upvalueindex(2)); - lua_pushlstring(L, fffd, 3); - return 1; -} - - -static int utfcharacters_aux (lua_State *L) { - static const unsigned char mask[4] = {0x80,0xE0,0xF0,0xF8}; - static const unsigned char mequ[4] = {0x00,0xC0,0xE0,0xF0}; - size_t ls; - unsigned char c; - int j; - const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); - int ind = lua_tointeger(L, lua_upvalueindex(2)); - if (ind>=(int)ls) return 0; /* end of string */ - c = (unsigned) s[ind]; - for (j=0;j<4;j++) { - if ((c&mask[j])==mequ[j]) { - int k; - if (ind+1+j>(int)ls) return utf_failed(L,ls); /* will not fit */ - for (k=1; k<=j; k++) { - c = (unsigned) s[ind+k]; - if ((c&0xC0)!=0x80) return utf_failed(L,ind+k); /* bad follow */ - } - lua_pushinteger(L, ind+1+j); /* iterator */ - lua_replace(L, lua_upvalueindex(2)); - lua_pushlstring(L, s+ind, 1+j); - return 1; - } - } - return utf_failed(L,ind+1); /* we found a follow byte! */ -} - - -static int str_utfcharacters (lua_State *L) { - luaL_checkstring(L, 1); - lua_settop(L, 1); - lua_pushinteger(L, 0); - lua_pushcclosure(L, utfcharacters_aux, 2); - return 1; -} - - - -static int utfvalues_aux (lua_State *L) { - size_t ls; - unsigned char i = 0; - unsigned char j = 0; - unsigned char k = 0; - unsigned char l = 0; - unsigned int v = 0xFFFD; - int numbytes = 1; - const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); - int ind = lua_tointeger(L, lua_upvalueindex(2)); - - if (ind<(int)ls) { - i = *(s+ind); - if (i<0x80) { - v = i; - } else if (i>=0xF0) { - if ((ind+3)<(int)ls && ((unsigned)*(s+ind+1))>=0x80 - && ((unsigned)*(s+ind+2))>=0x80 && ((unsigned)*(s+ind+3))>=0x80) { - numbytes = 4; - j = ((unsigned)*(s+ind+1))-128; - k = ((unsigned)*(s+ind+2))-128; - l = ((unsigned)*(s+ind+3))-128; - v = (((((i-0xF0)*64) + j)*64) + k)*64 + l; - } - } else if (i>=0xE0) { - if ((ind+2)<(int)ls && ((unsigned)*(s+ind+1))>=0x80 && ((unsigned)*(s+ind+2))>=0x80) { - numbytes = 3; - j = ((unsigned)*(s+ind+1))-128; - k = ((unsigned)*(s+ind+2))-128; - v = (((i-0xE0)*64) + j)*64 + k; - } - - } else if (i>=0xC0) { - if ((ind+1)<(int)ls && ((unsigned)*(s+ind+1))>=0x80) { - numbytes = 2; - j = ((unsigned)*(s+ind+1))-128; - v = ((i-0xC0)*64) + j; - } - } - lua_pushinteger(L, (ind+numbytes)); /* iterator */ - lua_replace(L, lua_upvalueindex(2)); - lua_pushinteger(L, v); - return 1; - } - return 0; /* string ended */ -} - - -static int str_utfvalues (lua_State *L) { - luaL_checkstring(L, 1); - lua_settop(L, 1); - lua_pushinteger(L, 0); - lua_pushcclosure(L, utfvalues_aux, 2); - return 1; -} - - -static int characterpairs_aux (lua_State *L) { - size_t ls; - char b[2]; - const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); - int ind = lua_tointeger(L, lua_upvalueindex(2)); - if (ind<(int)ls) { - if (ind+1<(int)ls) { - lua_pushinteger(L, (ind+2)); /* iterator */ - } else { - lua_pushinteger(L, (ind+1)); /* iterator */ - } - lua_replace(L, lua_upvalueindex(2)); - b[0] = *(s+ind); b[1] = 0; - lua_pushlstring(L, b, 1); - if (ind+1<(int)ls) { - b[0] = *(s+ind+1); - lua_pushlstring(L, b, 1); - } else { - lua_pushlstring(L, b+1, 0); - } - return 2; - } - return 0; /* string ended */ -} - - -static int str_characterpairs (lua_State *L) { - luaL_checkstring(L, 1); - lua_settop(L, 1); - lua_pushinteger(L, 0); - lua_pushcclosure(L, characterpairs_aux, 2); - return 1; -} - - -static int characters_aux (lua_State *L) { - size_t ls; - char b[2]; - const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); - int ind = lua_tointeger(L, lua_upvalueindex(2)); - if (ind<(int)ls) { - lua_pushinteger(L, (ind+1)); /* iterator */ - lua_replace(L, lua_upvalueindex(2)); - b[0] = *(s+ind); b[1] = 0; - lua_pushlstring(L, b, 1); - return 1; - } - return 0; /* string ended */ -} - - -static int str_characters (lua_State *L) { - luaL_checkstring(L, 1); - lua_settop(L, 1); - lua_pushinteger(L, 0); - lua_pushcclosure(L, characters_aux, 2); - return 1; -} - -static int str_split (lua_State *L) { - size_t l; - size_t i; - int n; - char *q, *p, *orig; - int mult = 0; - const char *s = luaL_checklstring(L, 1, &l); - const char *joiner = luaL_optstring(L, 2, " +"); - lua_newtable(L); - if (l == 0) { - lua_pushvalue(L,1); - lua_rawseti(L,-2,1); - return 1; - } - orig = p = malloc(l+1); - if (p==NULL) { - fprintf(stderr, "fatal: memory exhausted (malloc of %u bytes).\n",(int)(l+1)); - exit(EXIT_FAILURE); - } - strcpy(p,s); - n = 1; - q = p; - - if (*joiner == 0) { - for (i=0;i<l;i++) { - lua_pushlstring(L,q,1); q++; - lua_rawseti(L,-2,n); n++; - } - free(orig); - return 1; - } - if (*(joiner+1) == '+') { - mult = 1; - while(*p==*joiner) { - p++; - l--; - } - q = p; - } - for (i=0;i<l;i++) { - if (*(p+i)==*joiner) { - *(p+i) = 0; - lua_pushlstring(L,q,((p+i)-q)); - lua_rawseti(L,-2,n); n++; - if (mult) { - while(*(p+i+1)==*joiner) { - i++; - } - } - q = p+i+1; - } - } - if (mult && q==(p+l)) { - free(orig); - return 1; - } - if(q<=(p+l)) { - lua_pushlstring(L,q,strlen(q)); - lua_rawseti(L,-2,n); - } - free(orig); - return 1; -} - - -static const luaL_Reg strlibext[] = { - {"utfvalues", str_utfvalues}, - {"utfcharacters", str_utfcharacters}, - {"characters", str_characters}, - {"characterpairs", str_characterpairs}, - {"bytes", str_bytes}, - {"bytepairs", str_bytepairs}, - {"explode", str_split}, - /* {"dump", str_dump} already in luajit */ - {NULL, NULL} -}; - - - - -/* ------------------------------------------------------------------------ */ - -/* lj_libdef.h is generated by buildvm, it's not available on source */ -/* #include "lua51/lj_libdef.h" */ - -/* LUALIB_API int luaopen_string(lua_State *L) */ -/* { */ -/* GCtab *mt; */ -/* global_State *g; */ -/* LJ_LIB_REG(L, LUA_STRLIBNAME, string); */ -/* luaL_register(L, LUA_STRLIBNAME, strlib); */ -/* //LJ_LIB_REG(L, LUA_STRLIBNAME, strlib); */ -/* #if defined(LUA_COMPAT_GFIND) && !LJ_52 */ -/* lua_getfield(L, -1, "gmatch"); */ -/* lua_setfield(L, -2, "gfind"); */ -/* #endif */ -/* mt = lj_tab_new(L, 0, 1); */ -/* /\* NOBARRIER: basemt is a GC root. *\/ */ -/* g = G(L); */ -/* setgcref(basemt_it(g, LJ_TSTR), obj2gco(mt)); */ -/* settabV(L, lj_tab_setstr(L, mt, mmname_str(g, MM_index)), tabV(L->top-1)); */ -/* mt->nomm = (uint8_t)(~(1u<<MM_index)); */ -/* return 1; */ -/* } */ - -/* void open_strlibext(lua_State *L) */ -/* { */ -/* int v; */ -/* v = luaopen_string(L); */ -/* } */ - - -void open_strlibext(lua_State * L) -{ - const luaL_Reg *lib; - lua_getglobal(L, "string"); - for (lib=strlibext;lib->name;lib++) { - lua_pushcfunction(L, lib->func); - lua_setfield(L, -2, lib->name); - } - lua_pop(L,1); -} - diff --git a/Build/source/texk/web2c/luatexdir/lua/luajitstuff.w b/Build/source/texk/web2c/luatexdir/lua/luajitstuff.w deleted file mode 100644 index f219d5bd654..00000000000 --- a/Build/source/texk/web2c/luatexdir/lua/luajitstuff.w +++ /dev/null @@ -1,679 +0,0 @@ -% luastuff.w -% -% Copyright 2006-2013 Taco Hoekwater <taco@@luatex.org> -% -% This file is part of LuaTeX. -% -% LuaTeX is free software; you can redistribute it and/or modify it under -% the terms of the GNU General Public License as published by the Free -% Software Foundation; either version 2 of the License, or (at your -% option) any later version. -% -% LuaTeX is distributed in the hope that it will be useful, but WITHOUT -% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -% FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -% License for more details. -% -% You should have received a copy of the GNU General Public License along -% with LuaTeX; if not, see <http://www.gnu.org/licenses/>. - -@ @c -#include "ptexlib.h" -#include "lua/luatex-api.h" -#include "lua/lauxlib_bridge.h" - - -@ @c -lua_State *Luas = NULL; - -int luastate_bytes = 0; -int lua_active = 0; - -@ @c -void make_table(lua_State * L, const char *tab, const char *mttab, const char *getfunc, - const char *setfunc) -{ - /* make the table *//* |[{<tex>}]| */ - lua_pushstring(L, tab); /* |[{<tex>},"dimen"]| */ - lua_newtable(L); /* |[{<tex>},"dimen",{}]| */ - lua_settable(L, -3); /* |[{<tex>}]| */ - /* fetch it back */ - lua_pushstring(L, tab); /* |[{<tex>},"dimen"]| */ - lua_gettable(L, -2); /* |[{<tex>},{<dimen>}]| */ - /* make the meta entries */ - luaL_newmetatable(L, mttab); /* |[{<tex>},{<dimen>},{<dimen_m>}]| */ - lua_pushstring(L, "__index"); /* |[{<tex>},{<dimen>},{<dimen_m>},"__index"]| */ - lua_pushstring(L, getfunc); /* |[{<tex>},{<dimen>},{<dimen_m>},"__index","getdimen"]| */ - lua_gettable(L, -5); /* |[{<tex>},{<dimen>},{<dimen_m>},"__index",<tex.getdimen>]| */ - lua_settable(L, -3); /* |[{<tex>},{<dimen>},{<dimen_m>}]| */ - lua_pushstring(L, "__newindex"); /* |[{<tex>},{<dimen>},{<dimen_m>},"__newindex"]| */ - lua_pushstring(L, setfunc); /* |[{<tex>},{<dimen>},{<dimen_m>},"__newindex","setdimen"]| */ - lua_gettable(L, -5); /* |[{<tex>},{<dimen>},{<dimen_m>},"__newindex",<tex.setdimen>]| */ - lua_settable(L, -3); /* |[{<tex>},{<dimen>},{<dimen_m>}]| */ - lua_setmetatable(L, -2); /* |[{<tex>},{<dimen>}]| : assign the metatable */ - lua_pop(L, 1); /* |[{<tex>}]| : clean the stack */ -} - -@ @c -static const char *getS(lua_State * L, void *ud, size_t * size) -{ - LoadS *ls = (LoadS *) ud; - (void) L; - if (ls->size == 0) - return NULL; - *size = ls->size; - ls->size = 0; - return ls->s; -} - -@ @c -#if 0 /* currently unused */ -static void *my_luaalloc(void *ud, void *ptr, size_t osize, size_t nsize) -{ - void *ret = NULL; - (void) ud; /* for -Wunused */ - if (nsize == 0) - free(ptr); - else - ret = realloc(ptr, nsize); - luastate_bytes += (int) (nsize - osize); - return ret; -} -#endif - -@ @c -static int my_luapanic(lua_State * L) -{ - (void) L; /* to avoid warnings */ - fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n", - lua_tostring(L, -1)); - return 0; -} - -@ @c -void luafunctioncall(int slot) -{ - int i ; - int stacktop = lua_gettop(Luas); - lua_active++; - lua_rawgeti(Luas, LUA_REGISTRYINDEX, lua_key_index(lua_functions)); - lua_gettable(Luas, LUA_REGISTRYINDEX); - lua_rawgeti(Luas, -1,slot); - if (lua_isfunction(Luas,-1)) { - int base = lua_gettop(Luas); /* function index */ - lua_pushinteger(Luas, slot); - lua_pushcfunction(Luas, lua_traceback); /* push traceback function */ - lua_insert(Luas, base); /* put it under chunk */ - i = lua_pcall(Luas, 1, 0, base); - lua_remove(Luas, base); /* remove traceback function */ - if (i != 0) { - lua_gc(Luas, LUA_GCCOLLECT, 0); - Luas = luatex_error(Luas, (i == LUA_ERRRUN ? 0 : 1)); - } - } - lua_settop(Luas,stacktop); - lua_active--; -} - -@ @c -static const luaL_Reg lualibs[] = { - {"", luaopen_base}, - {"package", luaopen_package}, - /*{"coroutine", luaopen_coroutine},*/ - {"table", luaopen_table}, - {"io", open_iolibext}, - {"os", luaopen_os}, - {"string", luaopen_string}, - {"math", luaopen_math}, - {"debug", luaopen_debug}, - {"unicode", luaopen_unicode}, - {"zip", luaopen_zip}, - {"bit32", luaopen_bit32}, - {"md5", luaopen_md5}, - {"lfs", luaopen_lfs}, - {"profiler", luaopen_profiler}, - {"jit", luaopen_jit}, - {"ffi", luaopen_ffi}, - {"bit", luaopen_bit }, - {NULL, NULL} -}; - -static const luaL_Reg lualibs_nofenv[] = { - {"lpeg", luaopen_lpeg}, - {NULL, NULL} -}; - -@ @c -static void do_openlibs(lua_State * L) -{ - const luaL_Reg *lib = lualibs; - for (; lib->func; lib++) { - lua_pushcfunction(L, lib->func); - lua_pushstring(L, lib->name); - lua_call(L, 1, 0); - } - lib = lualibs_nofenv; - for (; lib->func; lib++) { - lua_pushcfunction(L, lib->func); - lua_newtable(L); - lua_setfenv(L,-2); - lua_pushstring(L, lib->name); - lua_call(L, 1, 0); - } -} - - -@ @c -static int luatex_loadfile (lua_State *L) { - int status = 0; - const char *fname = luaL_optstring(L, 1, NULL); - const char *mode = luaL_optstring(L, 2, NULL); - /*int env = !lua_isnone(L, 3);*/ /* 'env' parameter? */ - if (!lua_only && !fname && interaction == batch_mode) { - lua_pushnil(L); - lua_pushstring(L, "reading from stdin is disabled in batch mode"); - return 2; /* return nil plus error message */ - } - status = luaL_loadfilex(L, fname, mode); - if (status == LUA_OK) { - recorder_record_input(fname); - /* if (env) { *//* 'env' parameter? */ - /* lua_pushvalue(L, 3); */ - /* lua_setupvalue(L, -2, 1); *//* set it as 1st upvalue of loaded chunk */ - /*} */ - } - return RESERVED_load_aux_JIT(L, status,3); -} - -@ @c -static int luatex_dofile (lua_State *L) { - const char *fname = luaL_optstring(L, 1, NULL); - int n = lua_gettop(L); - if (!lua_only && !fname) { - if (interaction == batch_mode) { - lua_pushnil(L); - lua_pushstring(L, "reading from stdin is disabled in batch mode"); - return 2; /* return nil plus error message */ - } else { - tprint_nl("lua> "); - } - } - if (luaL_loadfile(L, fname) != 0) lua_error(L); - recorder_record_input(fname); - lua_call(L, 0, LUA_MULTRET); - return lua_gettop(L) - n; -} - -@ @c -void luainterpreter(void) -{ - lua_State *L; - - if (jithash_hashname==NULL){ - /* default lua51 */ - luajittex_choose_hash_function = 0; - jithash_hashname = (char *) xmalloc(strlen("lua51")+1); - jithash_hashname = strcpy ( jithash_hashname, "lua51"); - } else { - if (strcmp((const char*)jithash_hashname,"lua51")==0){ - luajittex_choose_hash_function = 0; - }else if (strcmp((const char*)jithash_hashname,"luajit20")==0){ - luajittex_choose_hash_function = 1; - } else { - /* default lua51 */ - luajittex_choose_hash_function = 0; - jithash_hashname = strcpy ( jithash_hashname, "lua51"); - } - } - - L = luaL_newstate() ; - /*L = lua_newstate(my_luaalloc, NULL);*/ - if (L == NULL) { - fprintf(stderr, "Can't create the Lua state.\n"); - return; - } - lua_atpanic(L, &my_luapanic); - - do_openlibs(L); /* does all the 'simple' libraries */ - - if (luajiton){ - luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE|LUAJIT_MODE_ON); - } - else { - luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE|LUAJIT_MODE_OFF); - } - - lua_pushcfunction(L,luatex_dofile); - lua_setglobal(L, "dofile"); - lua_pushcfunction(L,luatex_loadfile); - lua_setglobal(L, "loadfile"); - - luatex_md5_lua_open(L); - - open_oslibext(L, safer_option); -/* - open_iolibext(L); -*/ - open_strlibext(L); - open_lfslibext(L); - - /* luasockets */ - /* socket and mime are a bit tricky to open because - they use a load-time dependency that has to be - worked around for luatex, where the C module is - loaded way before the lua module. - */ - if (!nosocket_option) { - lua_getglobal(L, "package"); - lua_getfield(L, -1, "loaded"); - if (!lua_istable(L, -1)) { - lua_newtable(L); - lua_setfield(L, -2, "loaded"); - lua_getfield(L, -1, "loaded"); - } - luaopen_socket_core(L); - lua_setfield(L, -2, "socket.core"); - lua_pushnil(L); - lua_setfield(L, -2, "socket"); /* package.loaded.socket = nil */ - - luaopen_mime_core(L); - lua_setfield(L, -2, "mime.core"); - lua_pushnil(L); - lua_setfield(L, -2, "mime"); /* package.loaded.mime = nil */ - lua_pop(L, 2); /* pop the tables */ - - luatex_socketlua_open(L); /* preload the pure lua modules */ - } - /* zlib. slightly odd calling convention */ - luaopen_zlib(L); - lua_setglobal(L, "zlib"); - luaopen_gzip(L); - - /* our own libraries */ - luaopen_ff(L); - luaopen_tex(L); - luaopen_token(L); - luaopen_node(L); - luaopen_texio(L); - luaopen_kpse(L); - luaopen_callback(L); - luaopen_lua(L, startup_filename); - luaopen_stats(L); - luaopen_font(L); - luaopen_lang(L); - luaopen_mplib(L); - luaopen_vf(L); - - /* |luaopen_pdf(L);| */ - /* environment table at |LUA_ENVIRONINDEX| needs to load this way: */ - lua_pushcfunction(L, luaopen_pdf); - lua_pushstring(L, "pdf"); - lua_call(L, 1, 0); - - if (!lua_only) { - /* |luaopen_img(L);| */ - lua_pushcfunction(L, luaopen_img); - lua_pushstring(L, "img"); - lua_call(L, 1, 0); - } - - /* |luaopen_epdf(L);| */ - lua_pushcfunction(L, luaopen_epdf); - lua_pushstring(L, "epdf"); - lua_call(L, 1, 0); - - /* |luaopen_pdfscanner(L);| */ - lua_pushcfunction(L, luaopen_pdfscanner); - lua_pushstring(L, "pdfscanner"); - lua_call(L, 1, 0); - - lua_createtable(L, 0, 0); - lua_setglobal(L, "texconfig"); - - if (safer_option) { - /* disable some stuff if --safer */ - (void) hide_lua_value(L, "os", "execute"); - (void) hide_lua_value(L, "os", "rename"); - (void) hide_lua_value(L, "os", "remove"); - (void) hide_lua_value(L, "io", "popen"); - /* make io.open only read files */ - luaL_checkstack(L, 2, "out of stack space"); - lua_getglobal(L, "io"); - lua_getfield(L, -1, "open_ro"); - lua_setfield(L, -2, "open"); - (void) hide_lua_value(L, "io", "tmpfile"); - (void) hide_lua_value(L, "io", "output"); - (void) hide_lua_value(L, "lfs", "chdir"); - (void) hide_lua_value(L, "lfs", "lock"); - (void) hide_lua_value(L, "lfs", "touch"); - (void) hide_lua_value(L, "lfs", "rmdir"); - (void) hide_lua_value(L, "lfs", "mkdir"); - } - /* fprintf(stdout, "\nLuajitTeX default hash function type:%s\n", */ - /* jithash_hashname); */ - Luas = L; -} - -@ @c -int hide_lua_table(lua_State * L, const char *name) -{ - int r = 0; - lua_getglobal(L, name); - if (lua_istable(L, -1)) { - r = luaL_ref(L, LUA_REGISTRYINDEX); - lua_pushnil(L); - lua_setglobal(L, name); - } - return r; -} - -@ @c -void unhide_lua_table(lua_State * L, const char *name, int r) -{ - lua_rawgeti(L, LUA_REGISTRYINDEX, r); - lua_setglobal(L, name); - luaL_unref(L, LUA_REGISTRYINDEX, r); -} - -@ @c -int hide_lua_value(lua_State * L, const char *name, const char *item) -{ - int r = 0; - lua_getglobal(L, name); - if (lua_istable(L, -1)) { - lua_getfield(L, -1, item); - r = luaL_ref(L, LUA_REGISTRYINDEX); - lua_pushnil(L); - lua_setfield(L, -2, item); - } - return r; -} - -@ @c -void unhide_lua_value(lua_State * L, const char *name, const char *item, int r) -{ - lua_getglobal(L, name); - if (lua_istable(L, -1)) { - lua_rawgeti(L, LUA_REGISTRYINDEX, r); - lua_setfield(L, -2, item); - luaL_unref(L, LUA_REGISTRYINDEX, r); - } -} - -@ @c -int lua_traceback(lua_State * L) -{ - lua_getglobal(L, "debug"); - if (!lua_istable(L, -1)) { - lua_pop(L, 1); - return 1; - } - lua_getfield(L, -1, "traceback"); - if (!lua_isfunction(L, -1)) { - lua_pop(L, 2); - return 1; - } - lua_pushvalue(L, 1); /* pass error message */ - lua_pushinteger(L, 2); /* skip this function and traceback */ - lua_call(L, 2, 1); /* call debug.traceback */ - return 1; -} - -@ @c -static void luacall(int p, int nameptr, boolean is_string) /* hh-ls: optimized lua_id resolving */ -{ - LoadS ls; - int i; - size_t ll = 0; - char *lua_id; - char *s = NULL; - - if (Luas == NULL) { - luainterpreter(); - } - lua_active++; - if (is_string) { - const char *ss = NULL; - lua_rawgeti(Luas, LUA_REGISTRYINDEX, p); - if (lua_isfunction(Luas,-1)) { - int base = lua_gettop(Luas); /* function index */ - lua_checkstack(Luas, 1); - lua_pushcfunction(Luas, lua_traceback); /* push traceback function */ - lua_insert(Luas, base); /* put it under chunk */ - i = lua_pcall(Luas, 0, 0, base); - lua_remove(Luas, base); /* remove traceback function */ - if (i != 0) { - lua_gc(Luas, LUA_GCCOLLECT, 0); - Luas = luatex_error(Luas, (i == LUA_ERRRUN ? 0 : 1)); - } - lua_active--; - return ; - } - ss = lua_tolstring(Luas, -1, &ll); - s = xmalloc(ll+1); - memcpy(s,ss,ll+1); - lua_pop(Luas,1); - } else { - int l = 0; - s = tokenlist_to_cstring(p, 1, &l); - ll = (size_t)l; - } - ls.s = s; - ls.size = ll; - if (ls.size > 0) { - if (nameptr > 0) { - int l = 0; /* not used */ - lua_id = tokenlist_to_cstring(nameptr, 1, &l); - i = lua_load(Luas, getS, &ls, lua_id); - xfree(lua_id); - } else if (nameptr < 0) { - lua_id = get_lua_name((nameptr + 65536)); - if (lua_id != NULL) { - i = lua_load(Luas, getS, &ls, lua_id); - } else { - i = lua_load(Luas, getS, &ls, "=[\\latelua]"); - } - } else { - i = lua_load(Luas, getS, &ls, "=[\\latelua]"); - } - if (i != 0) { - Luas = luatex_error(Luas, (i == LUA_ERRSYNTAX ? 0 : 1)); - } else { - int base = lua_gettop(Luas); /* function index */ - lua_checkstack(Luas, 1); - lua_pushcfunction(Luas, lua_traceback); /* push traceback function */ - lua_insert(Luas, base); /* put it under chunk */ - i = lua_pcall(Luas, 0, 0, base); - lua_remove(Luas, base); /* remove traceback function */ - if (i != 0) { - lua_gc(Luas, LUA_GCCOLLECT, 0); - Luas = luatex_error(Luas, (i == LUA_ERRRUN ? 0 : 1)); - } - } - xfree(ls.s); - } - lua_active--; -} - -@ @c -void late_lua(PDF pdf, halfword p) -{ - (void) pdf; - if (late_lua_type(p)==normal) { - expand_macros_in_tokenlist(p); /* sets |def_ref| */ - luacall(def_ref, late_lua_name(p), false); - flush_list(def_ref); - } else { - luacall(late_lua_data(p), late_lua_name(p), true); - } -} - -@ @c -void luatokencall(int p, int nameptr) /* hh-ls: optimized lua_id resolving */ -{ - LoadS ls; - int i, l; - char *s = NULL; - char *lua_id; - assert(Luas); - l = 0; - lua_active++; - s = tokenlist_to_cstring(p, 1, &l); - ls.s = s; - ls.size = (size_t) l; - if (ls.size > 0) { - if (nameptr > 0) { - lua_id = tokenlist_to_cstring(nameptr, 1, &l); - i = lua_load(Luas, getS, &ls, lua_id); - xfree(lua_id); - } else if (nameptr < 0) { - lua_id = get_lua_name((nameptr + 65536)); - if (lua_id != NULL) { - i = lua_load(Luas, getS, &ls, lua_id); - } else { - i = lua_load(Luas, getS, &ls, "=[\\directlua]"); - } - } else { - i = lua_load(Luas, getS, &ls, "=[\\directlua]"); - } - xfree(s); - if (i != 0) { - Luas = luatex_error(Luas, (i == LUA_ERRSYNTAX ? 0 : 1)); - } else { - int base = lua_gettop(Luas); /* function index */ - lua_checkstack(Luas, 1); - lua_pushcfunction(Luas, lua_traceback); /* push traceback function */ - lua_insert(Luas, base); /* put it under chunk */ - i = lua_pcall(Luas, 0, 0, base); - lua_remove(Luas, base); /* remove traceback function */ - if (i != 0) { - lua_gc(Luas, LUA_GCCOLLECT, 0); - Luas = luatex_error(Luas, (i == LUA_ERRRUN ? 0 : 1)); - } - } - } - lua_active--; -} - -@ @c -lua_State *luatex_error(lua_State * L, int is_fatal) -{ - - const_lstring luaerr; - char *err = NULL; - if (lua_type(L, -1) == LUA_TSTRING) { - luaerr.s = lua_tolstring(L, -1, &luaerr.l); - /* free last one ? */ - err = (char *) xmalloc((unsigned) (luaerr.l + 1)); - snprintf(err, (luaerr.l + 1), "%s", luaerr.s); - last_lua_error = err; /* hm, what if we have several .. not freed */ - } - if (is_fatal > 0) { - /* Normally a memory error from lua. - The pool may overflow during the |maketexlstring()|, but we - are crashing anyway so we may as well abort on the pool size */ - normal_error("lua",err); - /* never reached */ - lua_close(L); - return (lua_State *) NULL; - } else { - normal_warning("lua",err); - return L; - } -} - -@ @c -void preset_environment(lua_State * L, const parm_struct * p, const char *s) -{ - int i; - assert(L != NULL); - /* double call with same s gives assert(0) */ - lua_pushstring(L, s); /* s */ - lua_gettable(L, LUA_REGISTRYINDEX); /* t */ - assert(lua_isnil(L, -1)); - lua_pop(L, 1); /* - */ - lua_pushstring(L, s); /* s */ - lua_newtable(L); /* t s */ - for (i = 1, ++p; p->name != NULL; i++, p++) { - assert(i == p->idx); - lua_pushstring(L, p->name); /* k t s */ - lua_pushinteger(L, p->idx); /* v k t s */ - lua_settable(L, -3); /* t s */ - } - lua_settable(L, LUA_REGISTRYINDEX); /* - */ -} - -@ @c -/* - int luaL_typerror (void *LL, int narg, const char *tname) - { - lua_State *L = (lua_State *)LL; - const char *msg = lua_pushfstring(L, "%s expected, got %s", - tname, luaL_typename(L, narg)); - return luaL_argerror(L, narg, msg); - } -*/ - -/* - Compatibility layer for luatex lua5.2 -*/ - -@ @c -LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) { - void *p = lua_touserdata(L, ud); - if (p != NULL) { /* value is a userdata? */ - if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ - luaL_getmetatable(L, tname); /* get correct metatable */ - if (!lua_rawequal(L, -1, -2)) /* not the same? */ - p = NULL; /* value is a userdata with wrong metatable */ - lua_pop(L, 2); /* remove both metatables */ - return p; - } - } - return NULL; /* value is not a userdata with a metatable */ -} - -@ @c - -/* It's not ok. See lua-users.org/wiki/CompatibilityWithLuaFive for another solution */ - -LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { - /*luaL_checkversion(L);*/ - luaL_checkstack(L, nup, "too many upvalues"); - for (; l->name != NULL; l++) { /* fill the table with given functions */ - int i; - for (i = 0; i < nup; i++) /* copy upvalues to the top */ - lua_pushvalue(L, -nup); - lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ - lua_setfield(L, -(nup + 2), l->name); - } - lua_pop(L, nup); /* remove upvalues */ -} - -@ @c -LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) { - lua_State *L = B->L; - if (sz > LUAL_BUFFERSIZE ) - luaL_error(L, "buffer too large"); - return luaL_prepbuffer(B) ; -} - -@ @c -LUA_API int lua_compare (lua_State *L, int o1, int o2, int op) { - /*StkId o1, o2;*/ - int i = 0; - lua_lock(L); /* may call tag method */ - /* o1 = index2addr(L, index1); */ - /* o2 = index2addr(L, index2); */ - /*if (isvalid(o1) && isvalid(o2)) {*/ - switch (op) { - case LUA_OPEQ: i = lua_equal(L, o1, o2); break; - case LUA_OPLT: i = lua_lessthan(L, o1, o2); break; - case LUA_OPLE: i = (lua_lessthan(L, o1, o2) || lua_equal(L, o1, o2)) ; break; - default: luaL_error(L, "invalid option"); - } - /*}*/ - lua_unlock(L); - return i; -} - |