diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c | 329 |
1 files changed, 175 insertions, 154 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c b/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c index dee8057bb7b..3abe333ec60 100644 --- a/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c +++ b/Build/source/texk/web2c/luatexdir/lua/lcallbacklib.c @@ -51,7 +51,6 @@ static const char *const callbacknames[] = { "start_page_number", "stop_page_number", "start_run", "stop_run", "define_font", - "token_filter", "pre_output_filter", "buildpage_filter", "hpack_filter", "vpack_filter", @@ -70,6 +69,7 @@ static const char *const callbacknames[] = { "show_error_message","show_lua_error_hook", "show_warning_message", "hpack_quality", "vpack_quality", + "process_rule", NULL }; @@ -83,18 +83,17 @@ int debug_callback_defined(int i) void get_lua_boolean(const char *table, const char *name, boolean * target) { - int stacktop; - int t; - stacktop = lua_gettop(Luas); + int stacktop = lua_gettop(Luas); luaL_checkstack(Luas, 2, "out of stack space"); lua_getglobal(Luas, table); if (lua_istable(Luas, -1)) { + int t; lua_getfield(Luas, -1, name); t = lua_type(Luas, -1); if (t == LUA_TBOOLEAN) { *target = (boolean) (lua_toboolean(Luas, -1)); } else if (t == LUA_TNUMBER) { - *target = (boolean) (lua_tonumber(Luas, -1) == 0 ? 0 : 1); + *target = (boolean) (lua_tointeger(Luas, -1) == 0 ? 0 : 1); } } lua_settop(Luas, stacktop); @@ -103,18 +102,17 @@ void get_lua_boolean(const char *table, const char *name, boolean * target) void get_saved_lua_boolean(int r, const char *name, boolean * target) { - int stacktop; - int t; - stacktop = lua_gettop(Luas); + int stacktop = lua_gettop(Luas); luaL_checkstack(Luas, 2, "out of stack space"); lua_rawgeti(Luas, LUA_REGISTRYINDEX, r); if (lua_istable(Luas, -1)) { + int t; lua_getfield(Luas, -1, name); t = lua_type(Luas, -1); if (t == LUA_TBOOLEAN) { *target = (boolean) lua_toboolean(Luas, -1); } else if (t == LUA_TNUMBER) { - *target = (boolean) (lua_tonumber(Luas, -1) == 0 ? 0 : 1); + *target = (boolean) (lua_tointeger(Luas, -1) == 0 ? 0 : 1); } } lua_settop(Luas, stacktop); @@ -123,14 +121,13 @@ void get_saved_lua_boolean(int r, const char *name, boolean * target) void get_lua_number(const char *table, const char *name, int *target) { - int stacktop; - stacktop = lua_gettop(Luas); + int stacktop = lua_gettop(Luas); luaL_checkstack(Luas, 2, "out of stack space"); lua_getglobal(Luas, table); if (lua_istable(Luas, -1)) { lua_getfield(Luas, -1, name); if (lua_type(Luas, -1) == LUA_TNUMBER) { - *target = (int)lua_tonumber(Luas, -1); + *target = (int) lua_tointeger(Luas, -1); } } lua_settop(Luas, stacktop); @@ -139,14 +136,13 @@ void get_lua_number(const char *table, const char *name, int *target) void get_saved_lua_number(int r, const char *name, int *target) { - int stacktop; - stacktop = lua_gettop(Luas); + int stacktop = lua_gettop(Luas); luaL_checkstack(Luas, 2, "out of stack space"); lua_rawgeti(Luas, LUA_REGISTRYINDEX, r); if (lua_istable(Luas, -1)) { lua_getfield(Luas, -1, name); if (lua_type(Luas, -1) == LUA_TNUMBER) { - *target=(int)lua_tonumber(Luas, -1); + *target = (int) lua_tointeger(Luas, -1); } } lua_settop(Luas, stacktop); @@ -155,8 +151,7 @@ void get_saved_lua_number(int r, const char *name, int *target) void get_lua_string(const char *table, const char *name, char **target) { - int stacktop; - stacktop = lua_gettop(Luas); + int stacktop = lua_gettop(Luas); luaL_checkstack(Luas, 2, "out of stack space"); lua_getglobal(Luas, table); if (lua_type(Luas, -1) == LUA_TTABLE) { @@ -171,8 +166,7 @@ void get_lua_string(const char *table, const char *name, char **target) void get_saved_lua_string(int r, const char *name, char **target) { - int stacktop; - stacktop = lua_gettop(Luas); + int stacktop = lua_gettop(Luas); luaL_checkstack(Luas, 2, "out of stack space"); lua_rawgeti(Luas, LUA_REGISTRYINDEX, r); if (lua_type(Luas, -1) == LUA_TTABLE) { @@ -190,6 +184,7 @@ void get_saved_lua_string(int r, const char *name, char **target) #define CALLBACK_LINE 'l' #define CALLBACK_STRNUMBER 's' #define CALLBACK_STRING 'S' +#define CALLBACK_RESULT 'R' /* a string but nil is also ok */ #define CALLBACK_CHARNUM 'c' #define CALLBACK_LSTRING 'L' #define CALLBACK_NODE 'N' @@ -279,49 +274,48 @@ int do_run_callback(int special, const char *values, va_list vl) lua_pushvalue(L, -2); } ss = strchr(values, '>'); - assert(ss); luaL_checkstack(L, (int) (ss - values + 1), "out of stack space"); ss = NULL; for (narg = 0; *values; narg++) { switch (*values++) { - case CALLBACK_CHARNUM: /* an ascii char! */ - cs = (char) va_arg(vl, int); - lua_pushlstring(L, &cs, 1); - break; - case CALLBACK_STRING: /* C string */ - s = va_arg(vl, char *); - lua_pushstring(L, s); - break; - case CALLBACK_LSTRING: /* 'lstring' */ - lstr = va_arg(vl, lstring *); - lua_pushlstring(L, (const char *)lstr->s, lstr->l); - break; - case CALLBACK_INTEGER: /* int */ - lua_pushnumber(L, va_arg(vl, int)); - break; - case CALLBACK_STRNUMBER: /* TeX string */ - s = makeclstring(va_arg(vl, int), &len); - lua_pushlstring(L, s, len); - break; - case CALLBACK_BOOLEAN: /* boolean */ - lua_pushboolean(L, va_arg(vl, int)); - break; - case CALLBACK_LINE: /* a buffer section, with implied start */ - lua_pushlstring(L, (char *) (buffer + first), (size_t) va_arg(vl, int)); - break; - case CALLBACK_NODE: - lua_nodelib_push_fast(L,va_arg(vl, int)); - break; - case CALLBACK_DIR: - lua_push_dir_par(L,va_arg(vl, int)); - break; - case '-': - narg--; - break; - case '>': - goto ENDARGS; - default: - ; + case CALLBACK_CHARNUM: /* an ascii char! */ + cs = (char) va_arg(vl, int); + lua_pushlstring(L, &cs, 1); + break; + case CALLBACK_STRING: /* C string */ + s = va_arg(vl, char *); + lua_pushstring(L, s); + break; + case CALLBACK_LSTRING: /* 'lstring' */ + lstr = va_arg(vl, lstring *); + lua_pushlstring(L, (const char *)lstr->s, lstr->l); + break; + case CALLBACK_INTEGER: /* int */ + lua_pushinteger(L, va_arg(vl, int)); + break; + case CALLBACK_STRNUMBER: /* TeX string */ + s = makeclstring(va_arg(vl, int), &len); + lua_pushlstring(L, s, len); + break; + case CALLBACK_BOOLEAN: /* boolean */ + lua_pushboolean(L, va_arg(vl, int)); + break; + case CALLBACK_LINE: /* a buffer section, with implied start */ + lua_pushlstring(L, (char *) (buffer + first), (size_t) va_arg(vl, int)); + break; + case CALLBACK_NODE: + lua_nodelib_push_fast(L,va_arg(vl, int)); + break; + case CALLBACK_DIR: + lua_push_dir_par(L,va_arg(vl, int)); + break; + case '-': + narg--; + break; + case '>': + goto ENDARGS; + default: + ; } } ENDARGS: @@ -343,7 +337,7 @@ int do_run_callback(int special, const char *values, va_list vl) * TeX initialization is complete */ if (!log_opened_global) { - fprintf(stderr, "This went wrong: %s\n", lua_tostring(L, -1)); + fprintf(stderr, "error in callback: %s\n", lua_tostring(L, -1)); error(); } else { lua_gc(L, LUA_GCCOLLECT, 0); @@ -359,102 +353,130 @@ int do_run_callback(int special, const char *values, va_list vl) while (*values) { int b, t; halfword p; + t = lua_type(L, nres); switch (*values++) { - case CALLBACK_BOOLEAN: - if (lua_type(L, nres) != LUA_TBOOLEAN) { - fprintf(stderr, "Expected a boolean, not: %s\n", lua_typename(L, lua_type(L, nres))); - goto EXIT; - } - b = lua_toboolean(L, nres); - *va_arg(vl, boolean *) = (boolean) b; - break; - case CALLBACK_INTEGER: - if (lua_type(L, nres) != LUA_TNUMBER) { - fprintf(stderr, "Expected a number, not: %s\n", lua_typename(L, lua_type(L, nres))); - goto EXIT; - } - b = (int) lua_tonumber(L, nres); - *va_arg(vl, int *) = b; - break; - case CALLBACK_LINE: /* TeX line ... happens frequently when we have a plug-in */ - t = lua_type(L, nres); - if (t == LUA_TNIL) { - bufloc = 0; - goto EXIT; - } else if (t == LUA_TSTRING) { - s = lua_tolstring(L, nres, &len); - if (s == NULL) { /* |len| can be zero */ - bufloc = 0; - } else if (len == 0) { + case CALLBACK_BOOLEAN: + if (t == LUA_TNIL) { + b = 0; + } else if (t != LUA_TBOOLEAN) { + fprintf(stderr, "callback should return a boolean, not: %s\n", lua_typename(L, t)); + goto EXIT; + } else { + b = lua_toboolean(L, nres); + } + *va_arg(vl, boolean *) = (boolean) b; + break; + case CALLBACK_INTEGER: + if (t != LUA_TNUMBER) { + fprintf(stderr, "callback should return a number, not: %s\n", lua_typename(L, t)); + goto EXIT; + } + b = lua_tointeger(L, nres); + *va_arg(vl, int *) = b; + break; + case CALLBACK_LINE: /* TeX line ... happens frequently when we have a plug-in */ + if (t == LUA_TNIL) { bufloc = 0; + goto EXIT; + } else if (t == LUA_TSTRING) { + s = lua_tolstring(L, nres, &len); + if (s == NULL) { /* |len| can be zero */ + bufloc = 0; + } else if (len == 0) { + bufloc = 0; + } else { + bufloc = va_arg(vl, int *); + ret = *bufloc; + check_buffer_overflow(ret + (int) len); + strncpy((char *) (buffer + ret), s, len); + *bufloc += (int) len; + /* while (len--) { buffer[(*bufloc)++] = *s++; } */ + while ((*bufloc) - 1 > ret && buffer[(*bufloc) - 1] == ' ') + (*bufloc)--; + } } else { - bufloc = va_arg(vl, int *); - ret = *bufloc; - check_buffer_overflow(ret + (int) len); - strncpy((char *) (buffer + ret), s, len); - *bufloc += (int) len; - /* while (len--) { buffer[(*bufloc)++] = *s++; } */ - while ((*bufloc) - 1 > ret && buffer[(*bufloc) - 1] == ' ') - (*bufloc)--; + fprintf(stderr, "callback should return a string, not: %s\n", lua_typename(L, t)); + goto EXIT; } - } else { - fprintf(stderr, "Expected a string for (l), not: %s\n", lua_typename(L, lua_type(L, nres))); - goto EXIT; - } - break; - case CALLBACK_STRNUMBER: /* TeX string */ - if (lua_type(L, nres) != LUA_TSTRING) { - fprintf(stderr, "Expected a string for (s), not: %s\n", lua_typename(L, lua_type(L, nres))); - goto EXIT; - } - s = lua_tolstring(L, nres, &len); - if (s == NULL) /* |len| can be zero */ - *va_arg(vl, int *) = 0; - else { - *va_arg(vl, int *) = maketexlstring(s, len); - } - break; - case CALLBACK_STRING: /* C string aka buffer */ - if (lua_type(L, nres) != LUA_TSTRING) { - fprintf(stderr, "Expected a string for (S), not: %s\n", lua_typename(L, lua_type(L, nres))); - goto EXIT; - } - s = lua_tolstring(L, nres, &len); - if (s == NULL) /* |len| can be zero */ - *va_arg(vl, int *) = 0; - else { - ss = xmalloc((unsigned) (len + 1)); - (void) memcpy(ss, s, (len + 1)); - *va_arg(vl, char **) = ss; - } - break; - case CALLBACK_LSTRING: /* lstring */ - if (lua_type(L, nres) != LUA_TSTRING) { - fprintf(stderr, "Expected a string for (S), not: %s\n", lua_typename(L, lua_type(L, nres))); + break; + case CALLBACK_STRNUMBER: /* TeX string */ + if (t != LUA_TSTRING) { + fprintf(stderr, "callback should return a string, not: %s\n", lua_typename(L, t)); + goto EXIT; + } + s = lua_tolstring(L, nres, &len); + if (s == NULL) /* |len| can be zero */ + *va_arg(vl, int *) = 0; + else { + *va_arg(vl, int *) = maketexlstring(s, len); + } + break; + case CALLBACK_STRING: /* C string aka buffer */ + if (t != LUA_TSTRING) { + fprintf(stderr, "callback should return a string, not: %s\n", lua_typename(L, t)); + goto EXIT; + } + s = lua_tolstring(L, nres, &len); + if (s == NULL) /* |len| can be zero */ + *va_arg(vl, int *) = 0; + else { + ss = xmalloc((unsigned) (len + 1)); + (void) memcpy(ss, s, (len + 1)); + *va_arg(vl, char **) = ss; + } + break; + case CALLBACK_RESULT: /* C string aka buffer */ + if (t == LUA_TNIL) { + *va_arg(vl, int *) = 0; + } else if (t == LUA_TBOOLEAN) { + b = lua_toboolean(L, nres); + if (b == 0) { + *va_arg(vl, int *) = 0; + } else { + fprintf(stderr, "callback should return a string, false or nil, not: %s\n", lua_typename(L, t)); + goto EXIT; + } + } else if (t != LUA_TSTRING) { + fprintf(stderr, "callback should return a string, false or nil, not: %s\n", lua_typename(L, t)); + goto EXIT; + } else { + s = lua_tolstring(L, nres, &len); + if (s == NULL) /* |len| can be zero */ + *va_arg(vl, int *) = 0; + else { + ss = xmalloc((unsigned) (len + 1)); + (void) memcpy(ss, s, (len + 1)); + *va_arg(vl, char **) = ss; + } + } + break; + case CALLBACK_LSTRING: /* lstring */ + if (t != LUA_TSTRING) { + fprintf(stderr, "callback should return a string, not: %s\n", lua_typename(L, t)); + goto EXIT; + } + s = lua_tolstring(L, nres, &len); + if (s == NULL) /* |len| can be zero */ + *va_arg(vl, int *) = 0; + else { + lstring *ret = xmalloc(sizeof(lstring)); + ret->s = xmalloc((unsigned) (len + 1)); + (void) memcpy(ret->s, s, (len + 1)); + ret->l = len; + *va_arg(vl, lstring **) = ret; + } + break; + case CALLBACK_NODE: + if (t == LUA_TNIL) { + p = null; + } else { + p = *check_isnode(L,nres); + } + *va_arg(vl, int *) = p; + break; + default: + fprintf(stdout, "callback returned an invalid value type"); goto EXIT; - } - s = lua_tolstring(L, nres, &len); - if (s == NULL) /* |len| can be zero */ - *va_arg(vl, int *) = 0; - else { - lstring *ret = xmalloc(sizeof(lstring)); - ret->s = xmalloc((unsigned) (len + 1)); - (void) memcpy(ret->s, s, (len + 1)); - ret->l = len; - *va_arg(vl, lstring **) = ret; - } - break; - case CALLBACK_NODE: - if (lua_type(L,nres) == LUA_TNIL) { - p = null; - } else { - p = *check_isnode(L,nres); - } - *va_arg(vl, int *) = p; - break; - default: - fprintf(stdout, "invalid return value type"); - goto EXIT; } nres++; } @@ -472,14 +494,13 @@ static int callback_register(lua_State * L) { int cb; const char *s; - int t1, t2; - t1 = lua_type(L,1); + int t1 = lua_type(L,1); + int t2 = lua_type(L,2); if (t1 != LUA_TSTRING) { lua_pushnil(L); lua_pushstring(L, "Invalid arguments to callback.register, first argument must be string."); return 2; } - t2 = lua_type(L,2); if ((t2 != LUA_TFUNCTION) && (t2 != LUA_TNIL) && ((t2 != LUA_TBOOLEAN) && (lua_toboolean(L, 2) == 0))) { lua_pushnil(L); lua_pushstring(L, "Invalid arguments to callback.register."); @@ -507,7 +528,7 @@ static int callback_register(lua_State * L) lua_pushvalue(L, 2); /* the function or nil */ lua_rawseti(L, -2, cb); lua_rawseti(L, LUA_REGISTRYINDEX, callback_callbacks_id); - lua_pushnumber(L, cb); + lua_pushinteger(L, cb); return 1; } |