diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/luatoken.c')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/luatoken.c | 548 |
1 files changed, 548 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/luatoken.c b/Build/source/texk/web2c/luatexdir/lua/luatoken.c new file mode 100644 index 00000000000..23d9ca82150 --- /dev/null +++ b/Build/source/texk/web2c/luatexdir/lua/luatoken.c @@ -0,0 +1,548 @@ +/* $Id: luatoken.c 1013 2008-02-14 00:09:02Z oneiros $ */ + +#include "luatex-api.h" +#include <ptexlib.h> + +#include "tokens.h" + +command_item command_names[] = + { { "relax", 0, NULL }, + { "left_brace", 0 , NULL }, + { "right_brace", 0 , NULL }, + { "math_shift", 0 , NULL }, + { "tab_mark", 0 , NULL }, + { "car_ret", 0 , NULL }, + { "mac_param", 0 , NULL }, + { "sup_mark", 0 , NULL }, + { "sub_mark", 0 , NULL }, + { "endv", 0 , NULL }, + { "spacer", 0 , NULL }, + { "letter", 0 , NULL }, + { "other_char", 0 , NULL }, + { "par_end", 0 , NULL }, + { "stop", 0 , NULL }, + { "delim_num", 0 , NULL }, + { "char_num", 0 , NULL }, + { "math_char_num", 0 , NULL }, + { "mark", 0 , NULL }, + { "xray", 0 , NULL }, + { "make_box", 0 , NULL }, + { "hmove", 0 , NULL }, + { "vmove", 0 , NULL }, + { "un_hbox", 0 , NULL }, + { "un_vbox", 0 , NULL }, + { "remove_item", 0 , NULL }, + { "hskip", 0 , NULL }, + { "vskip", 0 , NULL }, + { "mskip", 0 , NULL }, + { "kern", 0 , NULL }, + { "mkern", 0 , NULL }, + { "leader_ship", 0 , NULL }, + { "halign", 0 , NULL }, + { "valign", 0 , NULL }, + { "no_align", 0 , NULL }, + { "vrule", 0 , NULL }, + { "hrule", 0 , NULL }, + { "insert", 0 , NULL }, + { "vadjust", 0 , NULL }, + { "ignore_spaces", 0 , NULL }, + { "after_assignment", 0 , NULL }, + { "after_group", 0 , NULL }, + { "break_penalty", 0 , NULL }, + { "start_par", 0 , NULL }, + { "ital_corr", 0 , NULL }, + { "accent", 0 , NULL }, + { "math_accent", 0 , NULL }, + { "discretionary", 0 , NULL }, + { "eq_no", 0 , NULL }, + { "left_right", 0 , NULL }, + { "math_comp", 0 , NULL }, + { "limit_switch", 0 , NULL }, + { "above", 0 , NULL }, + { "math_style", 0 , NULL }, + { "math_choice", 0 , NULL }, + { "non_script", 0 , NULL }, + { "vcenter", 0 , NULL }, + { "case_shift", 0 , NULL }, + { "message", 0 , NULL }, + { "extension", 0 , NULL }, + { "in_stream", 0 , NULL }, + { "begin_group", 0 , NULL }, + { "end_group", 0 , NULL }, + { "omit", 0 , NULL }, + { "ex_space", 0 , NULL }, + { "no_boundary", 0 , NULL }, + { "radical", 0 , NULL }, + { "end_cs_name", 0 , NULL }, + { "char_ghost", 0 , NULL }, + { "assign_local_box", 0 , NULL }, + { "char_given", 0 , NULL }, + { "math_given", 0 , NULL }, + { "omath_given", 0 , NULL }, + { "last_item", 0 , NULL }, + { "toks_register", 0 , NULL }, + { "assign_toks", 0, NULL }, + { "assign_int", 0, NULL }, + { "assign_dimen", 0 , NULL }, + { "assign_glue", 0 ,NULL }, + { "assign_mu_glue", 0 , NULL }, + { "assign_font_dimen", 0 , NULL }, + { "assign_font_int", 0 , NULL }, + { "set_aux", 0 , NULL }, + { "set_prev_graf", 0 , NULL }, + { "set_page_dimen", 0 , NULL }, + { "set_page_int", 0 , NULL }, + { "set_box_dimen", 0 , NULL }, + { "set_shape", 0, NULL }, + { "def_code", 0 , NULL }, + { "extdef_code", 0 , NULL }, + { "def_family", 0 , NULL }, + { "set_font", 0 , NULL }, + { "def_font", 0 , NULL }, + { "register", 0 , NULL }, + { "assign_box_dir", 0 , NULL }, + { "assign_dir", 0 , NULL }, + { "advance", 0 , NULL }, + { "multiply", 0 , NULL }, + { "divide", 0 , NULL }, + { "prefix", 0 , NULL }, + { "let", 0 , NULL }, /* 100 */ + { "shorthand_def", 0 , NULL }, + { "read_to_cs", 0 , NULL }, + { "def", 0 , NULL }, + { "set_box", 0 , NULL }, + { "hyph_data", 0 , NULL }, + { "set_interaction", 0 , NULL }, + { "letterspace_font", 0 , NULL }, + { "set_ocp", 0 , NULL }, + { "def_ocp", 0 , NULL }, + { "set_ocp_list", 0 , NULL }, /* 110 */ + { "def_ocp_list", 0 , NULL }, + { "clear_ocp_lists", 0 , NULL }, + { "push_ocp_list", 0 , NULL }, + { "pop_ocp_list", 0 , NULL }, + { "ocp_list_op", 0 , NULL }, + { "ocp_trace_level", 0 , NULL}, + { "undefined_cs", 0 , NULL }, + { "expand_after", 0 , NULL }, + { "no_expand", 0 , NULL }, + { "input", 0 , NULL }, /* 120 */ + { "if_test", 0 , NULL }, + { "fi_or_else", 0 , NULL }, + { "cs_name", 0 , NULL }, + { "convert", 0 , NULL }, + { "the", 0 , NULL }, + { "top_bot_mark", 0 , NULL }, + { "call", 0 , NULL }, + { "long_call", 0 , NULL }, + { "outer_call", 0 , NULL }, + { "long_outer_call", 0 , NULL }, /* 130 */ + { "end_template", 0 , NULL }, + { "dont_expand", 0, NULL }, + { "glue_ref", 0 , NULL }, + { "shape_ref", 0 , NULL }, + { "box_ref", 0 , NULL }, + { "data", 0 , NULL }, + { NULL, 0, NULL } }; + + +int get_command_id (char *s) { + int i; + int cmd = -1; + for (i=0;command_names[i].cmd_name != NULL;i++) { + if (strcmp(s,command_names[i].cmd_name) == 0) + break; + } + if (command_names[i].cmd_name!=NULL) { + cmd = i; + } + return cmd; +} + +static int +get_cur_cmd (lua_State *L) { + int r = 0; + cur_cs = 0; + int len = lua_objlen(L,-1); + if (len==3 || len==2) { + r = 1; + lua_rawgeti(L,-1,1); + cur_cmd = lua_tointeger(L,-1); + lua_rawgeti(L,-2,2); + cur_chr = lua_tointeger(L,-1); + if (len==3) { + lua_rawgeti(L,-3,3); + cur_cs = lua_tointeger(L,-1); + } + lua_pop(L,len); + if (cur_cs==0) + cur_tok=(cur_cmd*string_offset)+cur_chr; + else + cur_tok=cs_token_flag+cur_cs; + } + return r; +} + + +static int +token_from_lua (lua_State *L) { + int cmd,chr; + int cs = 0; + int len = lua_objlen(L,-1); + if (len==3 || len==2) { + lua_rawgeti(L,-1,1); + cmd = lua_tointeger(L,-1); + lua_rawgeti(L,-2,2); + chr = lua_tointeger(L,-1); + if (len==3) { + lua_rawgeti(L,-3,3); + cs = lua_tointeger(L,-1); + } + lua_pop(L,len); + if (cs==0) { + return (cmd*string_offset)+chr; + } else { + return cs_token_flag+cs; + } + } + return -1; +} + +static int +get_cur_cs (lua_State *L) { + char *s; + unsigned j; + size_t l; + integer cs; + int save_nncs; + int ret; + ret = 0; + cur_cs = 0; + lua_getfield(L,-1,"name"); + if (lua_isstring(L,-1)) { + s = (char *)lua_tolstring(L,-1,&l); + if (l>0) { + if (last+l>buf_size) + check_buffer_overflow(last+l); + for (j=0;j<l;j++) { + buffer[last+1+j]=*s++; + } + save_nncs = no_new_control_sequence; + no_new_control_sequence = false; + cs = id_lookup((last+1),l); + cur_tok = cs_token_flag+cs; + cur_cmd = zget_eq_type(cs); + cur_chr = zget_equiv(cs); + no_new_control_sequence = save_nncs; + ret = 1; + } + } + lua_pop(L,1); + return ret; +} + + +#define append_i_byte(a) { \ + if ((i+2)>alloci) { \ + ret = xrealloc(ret,alloci+64); \ + alloci = alloci + 64; } \ + ret[i++] = a; } + +#define Print_char(a) append_i_byte(a) + +#define Print_uchar(s) { \ + if (s<=0x7F) { \ + Print_char(s); \ + } else if (s<=0x7FF) { \ + Print_char(0xC0 + (s / 0x40)); \ + Print_char(0x80 + (s % 0x40)); \ + } else if (s<=0xFFFF) { \ + Print_char(0xE0 + (s / 0x1000)); \ + Print_char(0x80 + ((s % 0x1000) / 0x40)); \ + Print_char(0x80 + ((s % 0x1000) % 0x40)); \ + } else if (s>=0x10FF00) { \ + Print_char(s-0x10FF00); \ + } else { \ + Print_char(0xF0 + (s / 0x40000)); \ + Print_char(0x80 + ((s % 0x40000) / 0x1000)); \ + Print_char(0x80 + (((s % 0x40000) % 0x1000) / 0x40)); \ + Print_char(0x80 + (((s % 0x40000) % 0x1000) % 0x40)); \ + } } + + +#define Print_esc(b) { if (e>0 && e<string_offset) { Print_uchar (e); Print_uchar (e); } \ + { char *v = b; while (*v) { Print_char(*v); v++; } } } + +#define single_letter(a) (length(a)==1)|| \ + ((length(a)==4)&&(str_pool[str_start_macro(a)]>=0xF0))|| \ + ((length(a)==3)&&(str_pool[str_start_macro(a)]>=0xE0))|| \ + ((length(a)==2)&&(str_pool[str_start_macro(a)]>=0xC0)) + +#define is_cat_letter(a) \ + (get_char_cat_code(pool_to_unichar(str_start_macro(a))) == 11) + +static int active_base = 0; +static int hash_base = 0; +static int eqtb_size = 0; +static int null_cs = 0; +static int undefined_control_sequence; + +char * +tokenlist_to_cstring ( int p , int inhibit_par, int *siz) { + integer m, c ; + integer q; + char *s; + int e; + char *ret=NULL; + int match_chr = '#'; + int n = '0'; + int alloci = 0; + int i = 0; + if (p==null || link(p)==null) { + if (siz!=NULL) + *siz = 0; + return NULL; + } + p = link(p); /* skip refcount */ + if (active_base==0) { + active_base = get_active_base(); + hash_base = get_hash_base(); + null_cs = get_nullcs(); + eqtb_size = get_eqtb_size(); + undefined_control_sequence = get_undefined_control_sequence(); + } + e = get_escape_char(); + while ( p != null ) { + if (p < fix_mem_min || p > fix_mem_end ) { + Print_esc ("CLOBBERED.") ; + break; + } + if (info(p)>=cs_token_flag) { + if ( ! (inhibit_par && info(p)==par_token) ) { + q = info(p) - cs_token_flag; + if (q<hash_base) { + if (q==null_cs) { + /* Print_esc("csname"); Print_esc("endcsname"); */ + } else { + if (q<active_base) { + Print_esc("IMPOSSIBLE."); + } else { + Print_uchar(q-active_base); + } + } + } else if ((q>=undefined_control_sequence)&&((q<=eqtb_size))||(q>eqtb_size+hash_extra)) { + Print_esc("IMPOSSIBLE."); + } else if ((zget_cs_text(q)<0)||(zget_cs_text(q)>=str_ptr)) { + Print_esc("NONEXISTENT."); + } else { + Print_uchar (e); + s = makecstring(zget_cs_text(q)); + while (*s) { Print_char(*s); s++; } + if ((! single_letter(zget_cs_text(q))) || is_cat_letter(zget_cs_text(q))) { + Print_char(' '); + } + } + } + } else { + m=info(p) / string_offset; + c=info(p) % string_offset; + if ( info(p) < 0 ) { + Print_esc ( "BAD.") ; + } else { + switch ( m ) { + case 6 : /* falls through */ + Print_uchar ( c ) ; + case 1 : + case 2 : + case 3 : + case 4 : + case 7 : + case 8 : + case 10 : + case 11 : + case 12 : + Print_uchar ( c ) ; + break ; + case 5 : + Print_uchar ( match_chr ) ; + if ( c <= 9 ) { + Print_char ( c + '0') ; + } else { + Print_char ( '!' ) ; + return NULL; + } + break ; + case 13 : + match_chr = c ; + Print_uchar ( c ) ; + incr ( n ) ; + Print_char ( n ) ; + if ( n > '9' ) + return NULL; + break ; + case 14 : + if ( c == 0 ) { + Print_char ('-'); + Print_char ('>') ; + } + break ; + default: + Print_esc ( "BAD.") ; + break ; + } + } + } + p = link(p); + } + ret[i]=0; + if (siz!=NULL) + *siz = i; + return ret; +} + + +void +tokenlist_to_lua(lua_State *L, int p) { + int cmd,chr,cs; + int v; + int i = 1; + v = p; + while (v!=null && v < fix_mem_end) { i++; v = link(v); } + i = 1; + lua_createtable(L,i,0); + while (p!=null&& p < fix_mem_end) { + if (info(p)>=cs_token_flag) { + cs=info(p)-cs_token_flag; + cmd = zget_eq_type(cs); + chr = zget_equiv(cs); + make_token_table(L,cmd,chr,cs); + } else { + cmd=info(p) / string_offset; + chr=info(p) % string_offset; + make_token_table(L,cmd,chr,0); + } + lua_rawseti(L,-2,i++); + p = link(p); + } +} + + +void +tokenlist_to_luastring(lua_State *L, int p) { + int l; + char *s; + s = tokenlist_to_cstring(p,1,&l); + lua_pushlstring(L,s,l); +} + + +int +tokenlist_from_lua(lua_State *L) { + char *s; + int tok,i; + size_t j; + halfword p,q,r; + r = get_avail(); + info(r)=0; /* ref count */ + link(r)=null; + p = r; + if (lua_istable(L,-1)) { + j = lua_objlen(L,-1); + if (j>0) { + for (i=1;i<=j;i++) { + lua_rawgeti(L,-1,i); + tok = token_from_lua(L); + if (tok>=0) { + store_new_token(tok); + } + lua_pop(L,1); + }; + } + return r; + } else if (lua_isstring(L,-1)) { + s = (char *)lua_tolstring(L,-1,&j); + for (i=0;i<j;i++) { + if (s[i] == 32) { + tok = (10*string_offset)+s[i]; + } else { + tok = (12*string_offset)+s[i]; + } + store_new_token(tok); + } + return r; + } else { + free_avail(r); + return null; + } +} + +void +do_get_token_lua (integer callback_id) { + lua_State *L = Luas[0]; + + lua_rawgeti(L,LUA_REGISTRYINDEX,callback_callbacks_id); + while (1) { + lua_rawgeti(L,-1, callback_id); + if (!lua_isfunction(L,-1)) { + lua_pop(L,2); /* the not-a-function callback and the container */ + get_next(); + return; + } + if (lua_pcall(L,0,1,0) != 0) { /* no arg, 1 result */ + fprintf(stdout,"error: %s\n",lua_tostring(L,-1)); + lua_pop(L,2); + error(); + return; + } + if (lua_istable(L,-1)) { + lua_rawgeti(L,-1,1); + if (lua_istable(L,-1)) { + integer p,q,r; + int i,j; + lua_pop(L,1); + /* build a token list */ + r = get_avail(); + p = r; + j = lua_objlen(L,-1); + if (j>0) { + for (i=1;i<=j;i++) { + lua_rawgeti(L,-1,i); + if (get_cur_cmd(L) || get_cur_cs(L)) { + store_new_token(cur_tok); + } + lua_pop(L,1); + } + } + if (p!=r) { + p = link(r); + free_avail(r); + begin_token_list(p, inserted); + cur_input.nofilter_field=true; + get_next(); + lua_pop(L,1); + break; + } else { + fprintf(stdout,"error: illegal or empty token list returned\n"); + lua_pop(L,2); + error(); + return; + } + } else { + lua_pop(L,1); + if (get_cur_cmd(L) || get_cur_cs(L)) { + lua_pop(L,1); + break; + } else { + lua_pop(L,2); + continue; + } + } + } else { + lua_pop(L,1); + continue; + } + } + lua_pop(L,1); /* callback container */ + return; +} + |