diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/luatoken.w')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/luatoken.w | 423 |
1 files changed, 423 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/luatoken.w b/Build/source/texk/web2c/luatexdir/lua/luatoken.w new file mode 100644 index 00000000000..7a96fcd1a11 --- /dev/null +++ b/Build/source/texk/web2c/luatexdir/lua/luatoken.w @@ -0,0 +1,423 @@ +% luatoken.w +% +% Copyright 2006-2010 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 "lua/luatex-api.h" +#include "ptexlib.h" + +static const char _svn_version[] = + "$Id: luatoken.w 3583 2010-04-02 17:40:44Z hhenkel $ " +"$URL: http://foundry.supelec.fr/svn/luatex/tags/beta-0.60.0/source/texk/web2c/luatexdir/lua/luatoken.w $"; + +@ @c +command_item command_names[] = { + {"relax", relax_cmd, NULL}, + {"left_brace", left_brace_cmd, NULL}, + {"right_brace", right_brace_cmd, NULL}, + {"math_shift", math_shift_cmd, NULL}, + {"tab_mark", tab_mark_cmd, NULL}, + {"car_ret", car_ret_cmd, NULL}, + {"mac_param", mac_param_cmd, NULL}, + {"sup_mark", sup_mark_cmd, NULL}, + {"sub_mark", sub_mark_cmd, NULL}, + {"endv", endv_cmd, NULL}, + {"spacer", spacer_cmd, NULL}, + {"letter", letter_cmd, NULL}, + {"other_char", other_char_cmd, NULL}, + {"par_end", par_end_cmd, NULL}, + {"stop", stop_cmd, NULL}, + {"delim_num", delim_num_cmd, NULL}, + {"char_num", char_num_cmd, NULL}, + {"math_char_num", math_char_num_cmd, NULL}, + {"mark", mark_cmd, NULL}, + {"xray", xray_cmd, NULL}, + {"make_box", make_box_cmd, NULL}, + {"hmove", hmove_cmd, NULL}, + {"vmove", vmove_cmd, NULL}, + {"un_hbox", un_hbox_cmd, NULL}, + {"un_vbox", un_vbox_cmd, NULL}, + {"remove_item", remove_item_cmd, NULL}, + {"hskip", hskip_cmd, NULL}, + {"vskip", vskip_cmd, NULL}, + {"mskip", mskip_cmd, NULL}, + {"kern", kern_cmd, NULL}, + {"mkern", mkern_cmd, NULL}, + {"leader_ship", leader_ship_cmd, NULL}, + {"halign", halign_cmd, NULL}, + {"valign", valign_cmd, NULL}, + {"no_align", no_align_cmd, NULL}, + {"vrule", vrule_cmd, NULL}, + {"hrule", hrule_cmd, NULL}, + {"insert", insert_cmd, NULL}, + {"vadjust", vadjust_cmd, NULL}, + {"ignore_spaces", ignore_spaces_cmd, NULL}, + {"after_assignment", after_assignment_cmd, NULL}, + {"after_group", after_group_cmd, NULL}, + {"break_penalty", break_penalty_cmd, NULL}, + {"start_par", start_par_cmd, NULL}, + {"ital_corr", ital_corr_cmd, NULL}, + {"accent", accent_cmd, NULL}, + {"math_accent", math_accent_cmd, NULL}, + {"discretionary", discretionary_cmd, NULL}, + {"eq_no", eq_no_cmd, NULL}, + {"left_right", left_right_cmd, NULL}, + {"math_comp", math_comp_cmd, NULL}, + {"limit_switch", limit_switch_cmd, NULL}, + {"above", above_cmd, NULL}, + {"math_style", math_style_cmd, NULL}, + {"math_choice", math_choice_cmd, NULL}, + {"non_script", non_script_cmd, NULL}, + {"vcenter", vcenter_cmd, NULL}, + {"case_shift", case_shift_cmd, NULL}, + {"message", message_cmd, NULL}, + {"extension", extension_cmd, NULL}, + {"in_stream", in_stream_cmd, NULL}, + {"begin_group", begin_group_cmd, NULL}, + {"end_group", end_group_cmd, NULL}, + {"omit", omit_cmd, NULL}, + {"ex_space", ex_space_cmd, NULL}, + {"no_boundary", no_boundary_cmd, NULL}, + {"radical", radical_cmd, NULL}, + {"super_sub_script", super_sub_script_cmd, NULL}, + {"math_shift_cs", math_shift_cs_cmd, NULL}, + {"end_cs_name", end_cs_name_cmd, NULL}, + {"char_ghost", char_ghost_cmd, NULL}, + {"assign_local_box", assign_local_box_cmd, NULL}, + {"char_given", char_given_cmd, NULL}, + {"math_given", math_given_cmd, NULL}, + {"omath_given", omath_given_cmd, NULL}, + {"xmath_given", xmath_given_cmd, NULL}, + {"last_item", last_item_cmd, NULL}, + {"toks_register", toks_register_cmd, NULL}, + {"assign_toks", assign_toks_cmd, NULL}, + {"assign_int", assign_int_cmd, NULL}, + {"assign_attr", assign_attr_cmd, NULL}, + {"assign_dimen", assign_dimen_cmd, NULL}, + {"assign_glue", assign_glue_cmd, NULL}, + {"assign_mu_glue", assign_mu_glue_cmd, NULL}, + {"assign_font_dimen", assign_font_dimen_cmd, NULL}, + {"assign_font_int", assign_font_int_cmd, NULL}, + {"set_aux", set_aux_cmd, NULL}, + {"set_prev_graf", set_prev_graf_cmd, NULL}, + {"set_page_dimen", set_page_dimen_cmd, NULL}, + {"set_page_int", set_page_int_cmd, NULL}, + {"set_box_dimen", set_box_dimen_cmd, NULL}, + {"set_tex_shape", set_tex_shape_cmd, NULL}, + {"set_etex_shape", set_etex_shape_cmd, NULL}, + {"def_char_code", def_char_code_cmd, NULL}, + {"def_del_code", def_del_code_cmd, NULL}, + {"extdef_math_code", extdef_math_code_cmd, NULL}, + {"extdef_del_code", extdef_del_code_cmd, NULL}, + {"def_family", def_family_cmd, NULL}, + {"set_math_param", set_math_param_cmd, NULL}, + {"set_font", set_font_cmd, NULL}, + {"def_font", def_font_cmd, NULL}, + {"register", register_cmd, NULL}, + {"assign_box_dir", assign_box_dir_cmd, NULL}, + {"assign_dir", assign_dir_cmd, NULL}, + {"advance", advance_cmd, NULL}, + {"multiply", multiply_cmd, NULL}, + {"divide", divide_cmd, NULL}, + {"prefix", prefix_cmd, NULL}, + {"let", let_cmd, NULL}, + {"shorthand_def", shorthand_def_cmd, NULL}, + {"read_to_cs", read_to_cs_cmd, NULL}, + {"def", def_cmd, NULL}, + {"set_box", set_box_cmd, NULL}, + {"hyph_data", hyph_data_cmd, NULL}, + {"set_interaction", set_interaction_cmd, NULL}, + {"letterspace_font", letterspace_font_cmd, NULL}, + {"pdf_copy_font", pdf_copy_font_cmd, NULL}, + {"set_ocp", set_ocp_cmd, NULL}, + {"def_ocp", def_ocp_cmd, NULL}, + {"set_ocp_list", set_ocp_list_cmd, NULL}, + {"def_ocp_list", def_ocp_list_cmd, NULL}, + {"clear_ocp_lists", clear_ocp_lists_cmd, NULL}, + {"push_ocp_list", push_ocp_list_cmd, NULL}, + {"pop_ocp_list", pop_ocp_list_cmd, NULL}, + {"ocp_list_op", ocp_list_op_cmd, NULL}, + {"ocp_trace_level", ocp_trace_level_cmd, NULL}, + {"undefined_cs", undefined_cs_cmd, NULL}, + {"expand_after", expand_after_cmd, NULL}, + {"no_expand", no_expand_cmd, NULL}, + {"input", input_cmd, NULL}, + {"if_test", if_test_cmd, NULL}, + {"fi_or_else", fi_or_else_cmd, NULL}, + {"cs_name", cs_name_cmd, NULL}, + {"convert", convert_cmd, NULL}, + {"the", the_cmd, NULL}, + {"top_bot_mark", top_bot_mark_cmd, NULL}, + {"call", call_cmd, NULL}, + {"long_call", long_call_cmd, NULL}, + {"outer_call", outer_call_cmd, NULL}, + {"long_outer_call", long_outer_call_cmd, NULL}, + {"end_template", end_template_cmd, NULL}, + {"dont_expand", dont_expand_cmd, NULL}, + {"glue_ref", glue_ref_cmd, NULL}, + {"shape_ref", shape_ref_cmd, NULL}, + {"box_ref", box_ref_cmd, NULL}, + {"data", data_cmd, NULL}, + {NULL, 0, NULL} +}; + + +@ @c +int get_command_id(const 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; +} + +@ @c +static int get_cur_cmd(lua_State * L) +{ + int r = 0; + size_t len = lua_objlen(L, -1); + cur_cs = 0; + if (len == 3 || len == 2) { + r = 1; + lua_rawgeti(L, -1, 1); + cur_cmd = (int) lua_tointeger(L, -1); + lua_rawgeti(L, -2, 2); + cur_chr = (halfword) lua_tointeger(L, -1); + if (len == 3) { + lua_rawgeti(L, -3, 3); + cur_cs = (halfword) lua_tointeger(L, -1); + } + lua_pop(L, (int) len); + if (cur_cs == 0) + cur_tok = token_val(cur_cmd, cur_chr); + else + cur_tok = cs_token_flag + cur_cs; + } + return r; +} + + +@ @c +static int token_from_lua(lua_State * L) +{ + int cmd, chr; + int cs = 0; + size_t len = lua_objlen(L, -1); + if (len == 3 || len == 2) { + lua_rawgeti(L, -1, 1); + cmd = (int) lua_tointeger(L, -1); + lua_rawgeti(L, -2, 2); + chr = (int) lua_tointeger(L, -1); + if (len == 3) { + lua_rawgeti(L, -3, 3); + cs = (int) lua_tointeger(L, -1); + } + lua_pop(L, (int) len); + if (cs == 0) { + return token_val(cmd, chr); + } else { + return cs_token_flag + cs; + } + } + return -1; +} + +@ @c +static int get_cur_cs(lua_State * L) +{ + const char *s; + unsigned j; + size_t l; + int cs; + int save_nncs; + int ret; + ret = 0; + cur_cs = 0; + lua_getfield(L, -1, "name"); + if (lua_isstring(L, -1)) { + s = lua_tolstring(L, -1, &l); + if (l > 0) { + if ((last + (int) l) > buf_size) + check_buffer_overflow((last + (int) l)); + for (j = 0; j < l; j++) { + buffer[(unsigned) last + 1 + j] = (packed_ASCII_code) * s++; + } + save_nncs = no_new_control_sequence; + no_new_control_sequence = false; + cs = id_lookup((last + 1), (int) l); + cur_tok = cs_token_flag + cs; + cur_cmd = eq_type(cs); + cur_chr = equiv(cs); + no_new_control_sequence = save_nncs; + ret = 1; + } + } + lua_pop(L, 1); + return ret; +} + +@ @c +void tokenlist_to_lua(lua_State * L, int p) +{ + int cmd, chr, cs; + int v; + int i = 1; + v = p; + while (v != null && v < (int) fix_mem_end) { + i++; + v = token_link(v); + } + i = 1; + lua_createtable(L, i, 0); + while (p != null && p < (int) fix_mem_end) { + if (token_info(p) >= cs_token_flag) { + cs = token_info(p) - cs_token_flag; + cmd = eq_type(cs); + chr = equiv(cs); + make_token_table(L, cmd, chr, cs); + } else { + cmd = token_cmd(token_info(p)); + chr = token_chr(token_info(p)); + make_token_table(L, cmd, chr, 0); + } + lua_rawseti(L, -2, i++); + p = token_link(p); + } +} + +@ @c +void tokenlist_to_luastring(lua_State * L, int p) +{ + int l; + char *s; + s = tokenlist_to_cstring(p, 1, &l); + lua_pushlstring(L, s, (size_t) l); +} + + +@ @c +int tokenlist_from_lua(lua_State * L) +{ + const char *s; + int tok; + size_t i, j; + halfword p, q, r; + r = get_avail(); + token_info(r) = 0; /* ref count */ + token_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, (int) 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 = lua_tolstring(L, -1, &j); + for (i = 0; i < j; i++) { + if (s[i] == 32) { + tok = token_val(10, s[i]); + } else { + int j = (int) str2uni((const unsigned char *) (s + i)); + i = i + (size_t) (utf8_size(j) - 1); + tok = token_val(12, j); + } + store_new_token(tok); + } + return r; + } else { + free_avail(r); + return null; + } +} + +@ @c +void do_get_token_lua(int callback_id) +{ + lua_State *L = Luas; + while (1) { + if (!get_callback(L, callback_id)) { + get_next(); + lua_pop(L, 2); /* the not-a-function callback and the container */ + break; + } + if (lua_pcall(L, 0, 1, 0) != 0) { /* no arg, 1 result */ + tex_error(lua_tostring(L, -1), NULL); + lua_pop(L, 2); /* container and result */ + break; + } + if (lua_istable(L, -1)) { + lua_rawgeti(L, -1, 1); + if (lua_istable(L, -1)) { /* container, result, result[1] */ + int p, q, r; + size_t i, j; + lua_pop(L, 1); /* container, result */ + /* 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, (int) i); + if (get_cur_cmd(L) || get_cur_cs(L)) { + store_new_token(cur_tok); + } + lua_pop(L, 1); + } + } + if (p != r) { + p = token_link(r); + free_avail(r); + begin_token_list(p, inserted); + cur_input.nofilter_field = true; + get_next(); + } else { + tex_error("error: illegal or empty token list returned", + NULL); + } + lua_pop(L, 2); + break; + } else { /* container, result, whatever */ + lua_pop(L, 1); /* container, result */ + if (get_cur_cmd(L) || get_cur_cs(L)) { + lua_pop(L, 2); + break; + } else { + lua_pop(L, 2); + continue; + } + } + } else { + lua_pop(L, 2); /* container, result */ + } + } + return; +} |