inline static int lua_tokenlib_get_active(lua_State * L) { lua_token *n = check_istoken(L, 1); halfword t = token_info(n->token); unsigned char *s; if (t >= cs_token_flag && ((s = get_cs_text(t - cs_token_flag)) != (unsigned char *) NULL)) { if (is_active_string(s)) lua_pushboolean(L,1); else lua_pushboolean(L,0); free(s); } else { lua_pushboolean(L,0); } return 1; }
int tokenlist_from_lua(lua_State * L) { const char *s; int tok, t; size_t i, j; halfword p, q, r; r = get_avail(); token_info(r) = 0; token_link(r) = null; p = r; t = lua_type(L, -1); if (t == LUA_TTABLE) { j = lua_rawlen(L, -1); if (j > 0) { for (i = 1; i <= j; i++) { lua_rawgeti(L, -1, (int) i); tok = token_from_lua(L); if (tok >= 0) { store_new_token(tok); } lua_pop(L, 1); }; } return r; } else if (t == LUA_TSTRING) { s = lua_tolstring(L, -1, &j); for (i = 0; i < j; i++) { if (s[i] == 32) { tok = token_val(10, s[i]); } else { int j1 = (int) str2uni((const unsigned char *) (s + i)); i = i + (size_t) (utf8_size(j1) - 1); tok = token_val(12, j1); } store_new_token(tok); } return r; } else { free_avail(r); return null; } }
inline static int lua_tokenlib_get_index(lua_State * L) { int cmd, chr; lua_token *n = check_istoken(L, 1); halfword t = token_info(n->token); if (t >= cs_token_flag) { cmd = eq_type(t - cs_token_flag); chr = equiv(t - cs_token_flag); } else { cmd = token_cmd(t); chr = token_chr(t); } switch (cmd) { case assign_int_cmd: chr -= count_base; break; case assign_attr_cmd: chr -= attribute_base; break; case assign_dimen_cmd: chr -= scaled_base; break; case assign_glue_cmd: chr -= skip_base; break; case assign_mu_glue_cmd: chr -= mu_skip_base; break; case assign_toks_cmd: chr -= toks_base; break; default: break; } if (chr >= 0 && chr <= 65535) { lua_pushinteger(L, chr); } else { lua_pushnil(L); } return 1; }
token_table add_command_token(token_table const & s, char const * token, char const * val) { return insert(s, token, token_info(token, val)); }
inline static int run_put_next(lua_State * L) { int n = lua_gettop(L); int m = 0; int i = 0; halfword h = null; halfword t = null; halfword x = null; lua_token *p ; if (n == 0) { /* we accept a single nil argument */ return 0; } lua_get_metatablelua(luatex_token); m = lua_gettop(L); if (lua_type(L,1) == LUA_TTABLE) { if (n>1) { normal_error("token lib","only one table permitted in put_next"); } else { for (i = 1;; i++) { lua_rawgeti(L, 1, i); /* table mt token */ if (lua_type(L,-1) == LUA_TNIL) { break; } else { p = lua_touserdata(L, -1); if (p == NULL) { normal_error("token lib","lua <token> expected in put_next (1)"); } else if (!lua_getmetatable(L, -1)) { /* table mt token mt */ normal_error("token lib","lua <token> expected in put_next (2)"); } else if (!lua_rawequal(L, m, -1)) { normal_error("token lib","lua <token> expected in put_next (3)"); } else { fast_get_avail(x) ; token_info(x) = token_info(p->token); if (h == null) { h = x; } else { token_link(t) = x; } t = x; } lua_pop(L, 1); } } } } else { for (i = 1; i <= n; i++) { p = lua_touserdata(L,i); if (p == NULL) { normal_error("token lib","lua <token> expected in put_next (4)"); } else if (!lua_getmetatable(L, i)) { /* table mt token mt */ normal_error("token lib","lua <token> expected in put_next (5)"); } else if (!lua_rawequal(L, m, -1)) { normal_error("token lib","lua <token> expected in put_next (6)"); } else { fast_get_avail(x) ; token_info(x) = token_info(p->token); if (h == null) { h = x; } else { token_link(t) = x; } t = x; } lua_pop(L, 1); } } if (h == null) { /* can't happen */ } else { begin_token_list(h,0); } lua_settop(L,n); return 0; }