summaryrefslogtreecommitdiff
path: root/Build/source
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source')
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/lstrlibextjit.c395
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/luajitstuff.w679
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;
-}
-