summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/lua/ltokenlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/ltokenlib.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/ltokenlib.c263
1 files changed, 263 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/ltokenlib.c b/Build/source/texk/web2c/luatexdir/lua/ltokenlib.c
new file mode 100644
index 00000000000..582779623cf
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/lua/ltokenlib.c
@@ -0,0 +1,263 @@
+/* $Id: ltokenlib.c 1013 2008-02-14 00:09:02Z oneiros $ */
+
+#include "luatex-api.h"
+#include <ptexlib.h>
+
+
+extern int get_command_id (char *);
+
+static int max_command = 0;
+static int hash_base = 0;
+static int active_base = 0;
+static int null_cs = 0;
+
+#define protected_token 0x1C00001
+
+#define is_valid_token(L,i) (lua_istable(L,i) && lua_objlen(L,i)==3)
+#define get_token_cmd(L,i) lua_rawgeti(L,i,1)
+#define get_token_chr(L,i) lua_rawgeti(L,i,2)
+#define get_token_cs(L,i) lua_rawgeti(L,i,3)
+
+static int
+test_expandable (lua_State *L) {
+ integer cmd = -1;
+ if (is_valid_token(L,-1)) {
+ get_token_cmd(L,-1);
+ if (lua_isnumber(L,-1)) {
+ cmd = lua_tointeger(L,-1);
+ } else if (lua_isstring(L,-1)) {
+ cmd = get_command_id((char *)lua_tostring(L,-1));
+ }
+ if (cmd>max_command) {
+ lua_pushboolean(L,1);
+ } else {
+ lua_pushboolean(L,0);
+ }
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+
+static int
+test_protected (lua_State *L) {
+ integer chr = -1;
+ if (is_valid_token(L,-1)) {
+ get_token_chr(L,-1);
+ if (lua_isnumber(L,-1)) {
+ chr = lua_tointeger(L,-1);
+ } else if (lua_isstring(L,-1)) {
+ chr = get_command_id((char *)lua_tostring(L,-1));
+ }
+ if (fixmem[fixmem[chr].hhrh].hhlh==protected_token) {
+ lua_pushboolean(L,1);
+ } else {
+ lua_pushboolean(L,0);
+ }
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+static int
+test_activechar (lua_State *L) {
+ integer cmd = -1;
+ if (is_valid_token(L,-1)) {
+ get_token_chr(L,-1);
+ if (lua_isnumber(L,-1)) {
+ cmd = lua_tointeger(L,-1);
+ }
+ if (cmd>0 && cmd==protected_token) {
+ lua_pushboolean(L,1);
+ } else {
+ lua_pushboolean(L,0);
+ }
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+
+static int
+run_get_command_name (lua_State *L) {
+ int cs;
+ if (is_valid_token(L,-1)) {
+ get_token_cmd(L,-1);
+ if (lua_isnumber(L,-1)) {
+ cs = lua_tointeger(L,-1);
+ lua_pushstring(L,command_names[cs].cmd_name);
+ } else {
+ lua_pushstring(L,"");
+ }
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+static int
+run_get_csname_name (lua_State *L) {
+ int cs,cmd,n;
+ char *s;
+
+ if (is_valid_token(L,-1)) {
+ get_token_cmd(L,-1);
+ if (lua_isnumber(L,-1)) {
+ cmd = lua_tointeger(L,-1);
+ }
+ lua_pop(L,1);
+ cs = 0;
+ get_token_cs(L,-1);
+ if (lua_isnumber(L,-1)) {
+ cs = lua_tointeger(L,-1);
+ }
+ lua_pop(L,1);
+
+ if (cs != 0 && (n = zget_cs_text(cs)) && n>=0) {
+ s = makecstring(n);
+ lua_pushstring(L,s);
+ } else {
+ lua_pushstring(L,"");
+ }
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+static int
+run_get_command_id (lua_State *L) {
+ int cs = -1;
+ if (lua_isstring(L,-1)) {
+ cs = get_command_id((char *)lua_tostring(L,-1));
+ }
+ lua_pushnumber(L,cs);
+ return 1;
+}
+
+
+static int
+run_get_csname_id (lua_State *L) {
+ int texstr;
+ char *s;
+ size_t k,cs = 0;
+ if (lua_isstring(L,-1)) {
+ s = (char *)lua_tolstring(L,-1, &k);
+ texstr = maketexlstring(s,k);
+ cs = string_lookup(texstr);
+ flush_str(texstr);
+ }
+ lua_pushnumber(L,cs);
+ return 1;
+}
+
+
+void
+make_token_table (lua_State *L, int cmd, int chr, int cs) {
+ lua_createtable(L,3,0);
+ lua_pushnumber(L,cmd);
+ lua_rawseti(L,-2,1);
+ lua_pushnumber(L,chr);
+ lua_rawseti(L,-2,2);
+ lua_pushnumber(L,cs);
+ lua_rawseti(L,-2,3);
+}
+
+static int
+run_get_next (lua_State *L) {
+ int save_nncs;
+ save_nncs = no_new_control_sequence;
+ no_new_control_sequence = 0;
+ get_next();
+ no_new_control_sequence = save_nncs;
+ make_token_table(L,cur_cmd,cur_chr,cur_cs);
+ return 1;
+}
+
+static int
+run_expand (lua_State *L) {
+ expand();
+ return 0;
+}
+
+
+static int
+run_lookup (lua_State *L) {
+ char *s;
+ size_t l;
+ str_number t;
+ integer cs,cmd,chr;
+ int save_nncs;
+ if (lua_isstring(L,-1)) {
+ s = (char *)lua_tolstring(L,-1,&l);
+ if (l>0) {
+ save_nncs = no_new_control_sequence;
+ no_new_control_sequence = true;
+ cs = id_lookup((last+1),l); /* cleans up the lookup buffer */
+ t = maketexlstring(s,l);
+ cs = string_lookup(t);
+ flush_str(t);
+ cmd = zget_eq_type(cs);
+ chr = zget_equiv(cs);
+ make_token_table(L,cmd,chr,cs);
+ no_new_control_sequence = save_nncs;
+ return 1;
+ }
+ }
+ lua_newtable(L);
+ return 1;
+}
+
+static int
+run_build (lua_State *L) {
+ integer cmd,chr,cs;
+ if (lua_isnumber(L,1)) {
+ cs =0;
+ chr = lua_tointeger(L,1);
+ cmd = luaL_optinteger(L,2,zget_char_cat_code(chr));
+ if (cmd==0 || cmd == 9 || cmd == 14 || cmd == 15) {
+ fprintf(stdout, "\n\nluatex error: not a good token.\nCatcode %i can not be returned, so I replaced it by 12 (other)",(int)cmd);
+ error();
+ cmd=12;
+ }
+ if (cmd == 13) {
+ cs=chr+active_base;
+ cmd=zget_eq_type(cs);
+ chr=zget_equiv(cs);
+ }
+ make_token_table(L,cmd,chr,cs);
+ return 1;
+ } else {
+ return run_lookup(L);
+ }
+}
+
+
+static const struct luaL_reg tokenlib [] = {
+ {"get_next", run_get_next},
+ {"expand", run_expand},
+ {"lookup", run_lookup},
+ {"create", run_build},
+ {"is_expandable",test_expandable},
+ {"is_activechar",test_activechar},
+ {"is_protected", test_protected},
+ {"csname_id", run_get_csname_id},
+ {"csname_name", run_get_csname_name},
+ {"command_name", run_get_command_name},
+ {"command_id", run_get_command_id},
+ {NULL, NULL} /* sentinel */
+};
+
+int luaopen_token (lua_State *L)
+{
+ luaL_register(L, "token", tokenlib);
+ max_command = get_max_command();
+ hash_base = get_hash_base();
+ active_base = get_active_base();
+ null_cs = get_nullcs();
+ return 1;
+}
+