diff options
Diffstat (limited to 'source/luametatex/source/lua/lmttexlib.c')
-rw-r--r-- | source/luametatex/source/lua/lmttexlib.c | 153 |
1 files changed, 101 insertions, 52 deletions
diff --git a/source/luametatex/source/lua/lmttexlib.c b/source/luametatex/source/lua/lmttexlib.c index 0d84eebdd..9c1247884 100644 --- a/source/luametatex/source/lua/lmttexlib.c +++ b/source/luametatex/source/lua/lmttexlib.c @@ -1144,7 +1144,7 @@ static int texlib_error(lua_State *L) */ -inline static int texlib_aux_valid_register_index(lua_State *L, int slot, int cmd, int base, int max) +inline static int texlib_aux_valid_register_index(lua_State *L, int slot, int cmd, int base, int max, int constant_cmd) { int index = -1; switch (lua_type(L, slot)) { @@ -1155,6 +1155,8 @@ inline static int texlib_aux_valid_register_index(lua_State *L, int slot, int cm int cs = tex_string_locate(str, len, 0); if (eq_type(cs) == cmd) { index = eq_value(cs) - base; + } else if (eq_type(cs) == constant_cmd) { + return 0xFFFF + cs; // way above max } } break; @@ -1167,6 +1169,8 @@ inline static int texlib_aux_valid_register_index(lua_State *L, int slot, int cm } if (index >= 0 && index <= max) { return index; + } else if (index < (eqtb_size + lmt_hash_state.hash_data.ptr + 1) && eq_type(index) == constant_cmd) { + return index; } else { return -1; } @@ -1194,9 +1198,9 @@ static int texlib_get_register_index(lua_State *L) return 1; } -inline static int texlib_aux_checked_register(lua_State *L, int cmd, int base, int max) +inline static int texlib_aux_checked_register(lua_State *L, int cmd, int base, int max, int constant_cmd) { - int index = texlib_aux_valid_register_index(L, 1, cmd, base, max); + int index = texlib_aux_valid_register_index(L, 1, cmd, base, max, constant_cmd); if (index >= 0) { lua_pushinteger(L, index); } else { @@ -1302,7 +1306,8 @@ static int texlib_aux_check_for_index( int register_cmd, int internal_base, int register_base, - int max_index + int max_index, + int constant_cmd ) { *index = -1; switch (lua_type(L, slot)) { @@ -1317,6 +1322,9 @@ static int texlib_aux_check_for_index( } else if (eq_type(cs) == register_cmd) { *index = eq_value(cs) - register_base; return 0; + } else if (eq_type(cs) == constant_cmd) { + *index = cs; + return 2; } else { luaL_error(L, "incorrect %s name", what); return -1; @@ -1326,9 +1334,14 @@ static int texlib_aux_check_for_index( *index = lmt_tointeger(L, slot); if (*index >= 0 && *index <= max_index) { return 0; - } else { - return -1; + } else { + halfword i = *index - 0xFFFF; + if (i < (eqtb_size + lmt_hash_state.hash_data.ptr + 1) && eq_type(i) == constant_cmd) { + *index = i; + return 2; + } } + return -1; default: luaL_error(L, "%s name or valid index expected", what); return -1; @@ -1347,7 +1360,7 @@ static int texlib_get(lua_State *L); static int texlib_isdimen(lua_State *L) { - return texlib_aux_checked_register(L, register_dimen_cmd, register_dimen_base, max_dimen_register_index); + return texlib_aux_checked_register(L, register_dimen_cmd, register_dimen_base, max_dimen_register_index, dimension_cmd); } /* [global] name|index integer|dimension|false|nil */ @@ -1357,7 +1370,7 @@ static int texlib_setdimen(lua_State *L) int flags = 0; int index = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "dimen", &index, internal_dimen_cmd, register_dimen_cmd, internal_dimen_base, register_dimen_base, max_dimen_register_index); + int state = texlib_aux_check_for_index(L, slot++, "dimen", &index, internal_dimen_cmd, register_dimen_cmd, internal_dimen_base, register_dimen_base, max_dimen_register_index, dimension_cmd); if (state >= 0) { halfword value = 0; switch (lua_type(L, slot)) { @@ -1380,9 +1393,13 @@ static int texlib_setdimen(lua_State *L) luaL_error(L, "unsupported dimen value type"); break; } - tex_set_tex_dimen_register(index, value, flags, state); - if (state == 1 && lua_toboolean(L, slot)) { - tex_update_par_par(internal_dimen_cmd, index); + if (state == 2) { + tex_define(flags, index, dimension_cmd, value); + } else { + tex_set_tex_dimen_register(index, value, flags, state); + if (state == 1 && lua_toboolean(L, slot)) { + tex_update_par_par(internal_dimen_cmd, index); + } } } return 0; @@ -1391,8 +1408,16 @@ static int texlib_setdimen(lua_State *L) static int texlib_getdimen(lua_State *L) { int index; - int state = texlib_aux_check_for_index(L, 1, "dimen", &index, internal_dimen_cmd, register_dimen_cmd, internal_dimen_base, register_dimen_base, max_dimen_register_index); - lua_pushinteger(L, state >= 0 ? tex_get_tex_dimen_register(index, state) : 0); + int state = texlib_aux_check_for_index(L, 1, "dimen", &index, internal_dimen_cmd, register_dimen_cmd, internal_dimen_base, register_dimen_base, max_dimen_register_index, dimension_cmd); + lua_pushinteger(L, state >= 0 ? (state == 2 ? eq_value(index) : tex_get_tex_dimen_register(index, state)) : 0); + // halfword value; + // switch (state) { + // case 0 : value = dimen_parameter(index); break; + // case 1 : value = dimen_parameter(index); break; + // case 2 : value = eq_value(index); break; + // default: value = 0; + // } + // lua_pushinteger(L, value); return 1; } @@ -1459,7 +1484,7 @@ static halfword texlib_aux_get_glue_spec(lua_State *L, int slot) static int texlib_isskip(lua_State *L) { - return texlib_aux_checked_register(L, register_glue_cmd, register_glue_base, max_glue_register_index); + return texlib_aux_checked_register(L, register_glue_cmd, register_glue_base, max_glue_register_index, gluespec_cmd); } /* [global] name|index gluespec|false|nil */ @@ -1469,13 +1494,17 @@ static int texlib_setskip(lua_State *L) int flags = 0; int index = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "skip", &index, internal_glue_cmd, register_glue_cmd, internal_glue_base, register_glue_base, max_glue_register_index); + int state = texlib_aux_check_for_index(L, slot++, "skip", &index, internal_glue_cmd, register_glue_cmd, internal_glue_base, register_glue_base, max_glue_register_index, gluespec_cmd); if (state >= 0) { - halfword value = texlib_aux_get_glue_spec(L, slot++); - tex_set_tex_skip_register(index, value, flags, state); - if (state == 1 && lua_toboolean(L, slot)) { - tex_update_par_par(internal_glue_cmd, index); - } + halfword value = texlib_aux_get_glue_spec(L, slot++); + if (state == 2) { + tex_define(flags, index, gluespec_cmd, value); + } else { + tex_set_tex_skip_register(index, value, flags, state); + if (state == 1 && lua_toboolean(L, slot)) { + tex_update_par_par(internal_glue_cmd, index); + } + } } return 0; } @@ -1483,15 +1512,15 @@ static int texlib_setskip(lua_State *L) static int texlib_getskip(lua_State *L) { int index; - int state = texlib_aux_check_for_index(L, 1, "skip", &index, internal_glue_cmd, register_glue_cmd, internal_glue_base, register_glue_base, max_glue_register_index); - halfword value = state >= 0 ? tex_get_tex_skip_register(index, state) : null; + int state = texlib_aux_check_for_index(L, 1, "skip", &index, internal_glue_cmd, register_glue_cmd, internal_glue_base, register_glue_base, max_glue_register_index, gluespec_cmd); + halfword value = state >= 0 ? (state == 2 ? eq_value(index) : tex_get_tex_skip_register(index, state)) : null; lmt_push_node_fast(L, tex_copy_node(value ? value : zero_glue)); return 1; } static int texlib_isglue(lua_State *L) { - return texlib_aux_checked_register(L, register_glue_cmd, register_glue_base, max_glue_register_index); + return texlib_aux_checked_register(L, register_glue_cmd, register_glue_base, max_glue_register_index, gluespec_cmd); } /* [global] slot [width] [stretch] [shrink] [stretch_order] [shrink_order] */ @@ -1501,9 +1530,14 @@ static int texlib_setglue(lua_State *L) int flags = 0; int index = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "skip", &index, internal_glue_cmd, register_glue_cmd, internal_glue_base, register_glue_base, max_glue_register_index); + int state = texlib_aux_check_for_index(L, slot++, "skip", &index, internal_glue_cmd, register_glue_cmd, internal_glue_base, register_glue_base, max_glue_register_index, gluespec_cmd); if (state >= 0) { - tex_set_tex_skip_register(index, texlib_aux_make_glue(L, lua_gettop(L), slot), flags, state); + halfword value = texlib_aux_make_glue(L, lua_gettop(L), slot); + if (state == 2) { + tex_define(flags, index, gluespec_cmd, value); + } else { + tex_set_tex_skip_register(index, value, flags, state); + } } return 0; } @@ -1512,8 +1546,8 @@ static int texlib_getglue(lua_State *L) { int index; int all = (lua_type(L, 2) == LUA_TBOOLEAN) ? lua_toboolean(L, 2) : 1; - int state = texlib_aux_check_for_index(L, 1, "skip", &index, internal_glue_cmd, register_glue_cmd, internal_glue_base, register_glue_base, max_glue_register_index); - halfword value = state >= 0 ? tex_get_tex_skip_register(index, state) : null; + int state = texlib_aux_check_for_index(L, 1, "skip", &index, internal_glue_cmd, register_glue_cmd, internal_glue_base, register_glue_base, max_glue_register_index, gluespec_cmd); + halfword value = state >= 0 ? (state == 2 ? eq_value(index) : tex_get_tex_skip_register(index, state)) : null; if (! value) { lua_pushinteger(L, 0); if (all) { @@ -1535,7 +1569,7 @@ static int texlib_getglue(lua_State *L) static int texlib_ismuskip(lua_State *L) { - return texlib_aux_checked_register(L, register_mu_glue_cmd, register_mu_glue_base, max_mu_glue_register_index); + return texlib_aux_checked_register(L, register_mu_glue_cmd, register_mu_glue_base, max_mu_glue_register_index, mugluespec_cmd); } static int texlib_setmuskip(lua_State *L) @@ -1543,23 +1577,30 @@ static int texlib_setmuskip(lua_State *L) int flags = 0; int index = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "muskip", &index, internal_mu_glue_cmd, register_mu_glue_cmd, internal_mu_glue_base, register_mu_glue_base, max_mu_glue_register_index); - tex_set_tex_mu_skip_register(index, texlib_aux_get_glue_spec(L, slot), flags, state); + int state = texlib_aux_check_for_index(L, slot++, "muskip", &index, internal_mu_glue_cmd, register_mu_glue_cmd, internal_mu_glue_base, register_mu_glue_base, max_mu_glue_register_index, mugluespec_cmd); + if (state >= 0) { + halfword value =texlib_aux_get_glue_spec(L, slot); + if (state == 2) { + tex_define(flags, index, mugluespec_cmd, value); + } else { + tex_set_tex_mu_skip_register(index, value, flags, state); + } + } return 0; } static int texlib_getmuskip(lua_State *L) { int index; - int state = texlib_aux_check_for_index(L, 1, "muskip", &index, internal_mu_glue_cmd, register_mu_glue_cmd, internal_mu_glue_base, register_mu_glue_base, max_mu_glue_register_index); - halfword value = state >= 0 ? tex_get_tex_mu_skip_register(index, state) : null; + int state = texlib_aux_check_for_index(L, 1, "muskip", &index, internal_mu_glue_cmd, register_mu_glue_cmd, internal_mu_glue_base, register_mu_glue_base, max_mu_glue_register_index, mugluespec_cmd); + halfword value = state >= 0 ? (state == 2 ? eq_value(index) : tex_get_tex_mu_skip_register(index, state)) : null; lmt_push_node_fast(L, tex_copy_node(value ? value : zero_glue)); return 1; } static int texlib_ismuglue(lua_State *L) { - return texlib_aux_checked_register(L, register_mu_glue_cmd, register_mu_glue_base, max_mu_glue_register_index); + return texlib_aux_checked_register(L, register_mu_glue_cmd, register_mu_glue_base, max_mu_glue_register_index, mugluespec_cmd); } static int texlib_setmuglue(lua_State *L) @@ -1567,10 +1608,14 @@ static int texlib_setmuglue(lua_State *L) int flags = 0; int index = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "muskip", &index, internal_mu_glue_cmd, register_mu_glue_cmd, internal_mu_glue_base, register_mu_glue_base, max_mu_glue_register_index); - halfword value = texlib_aux_make_glue(L, lua_gettop(L), slot); + int state = texlib_aux_check_for_index(L, slot++, "muskip", &index, internal_mu_glue_cmd, register_mu_glue_cmd, internal_mu_glue_base, register_mu_glue_base, max_mu_glue_register_index, mugluespec_cmd); if (state >= 0) { - tex_set_tex_mu_skip_register(index, value, flags, state); + halfword value = texlib_aux_make_glue(L, lua_gettop(L), slot); + if (state == 2) { + tex_define(flags, index, mugluespec_cmd, value); + } else { + tex_set_tex_mu_skip_register(index, value, flags, state); + } } return 0; } @@ -1579,8 +1624,8 @@ static int texlib_getmuglue(lua_State *L) { int index; int all = (lua_type(L, 2) == LUA_TBOOLEAN) ? lua_toboolean(L, 2) : 1; - int state = texlib_aux_check_for_index(L, 1, "muskip", &index, internal_mu_glue_cmd, register_mu_glue_cmd, internal_mu_glue_base, register_mu_glue_base, max_mu_glue_register_index); - halfword value = state >= 0 ? tex_get_tex_mu_skip_register(index, state) : null; + int state = texlib_aux_check_for_index(L, 1, "muskip", &index, internal_mu_glue_cmd, register_mu_glue_cmd, internal_mu_glue_base, register_mu_glue_base, max_mu_glue_register_index, mugluespec_cmd); + halfword value = state >= 0 ? (state == 2 ? eq_value(index) : tex_get_tex_mu_skip_register(index, state)) : null; if (! value) { lua_pushinteger(L, 0); return 1; @@ -1595,7 +1640,7 @@ static int texlib_getmuglue(lua_State *L) static int texlib_iscount(lua_State *L) { - return texlib_aux_checked_register(L, register_int_cmd, register_int_base, max_int_register_index); + return texlib_aux_checked_register(L, register_int_cmd, register_int_base, max_int_register_index, integer_cmd); } static int texlib_setcount(lua_State *L) @@ -1603,12 +1648,16 @@ static int texlib_setcount(lua_State *L) int flags = 0; int index = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "count", &index, internal_int_cmd, register_int_cmd, internal_int_base, register_int_base, max_int_register_index); + int state = texlib_aux_check_for_index(L, slot++, "count", &index, internal_int_cmd, register_int_cmd, internal_int_base, register_int_base, max_int_register_index, integer_cmd); if (state >= 0) { halfword value = lmt_optinteger(L, slot++, 0); - tex_set_tex_count_register(index, value, flags, state); - if (state == 1 && lua_toboolean(L, slot)) { - tex_update_par_par(internal_int_cmd, index); + if (state == 2) { + tex_define(flags, index, integer_cmd, value); + } else { + tex_set_tex_count_register(index, value, flags, state); + if (state == 1 && lua_toboolean(L, slot)) { + tex_update_par_par(internal_int_cmd, index); + } } } return 0; @@ -1617,14 +1666,14 @@ static int texlib_setcount(lua_State *L) static int texlib_getcount(lua_State *L) { int index; - int state = texlib_aux_check_for_index(L, 1, "count", &index, internal_int_cmd, register_int_cmd, internal_int_base, register_int_base, max_int_register_index); - lua_pushinteger(L, state >= 0 ? tex_get_tex_count_register(index, state) : 0); + int state = texlib_aux_check_for_index(L, 1, "count", &index, internal_int_cmd, register_int_cmd, internal_int_base, register_int_base, max_int_register_index, integer_cmd); + lua_pushinteger(L, state >= 0 ? (state == 2 ? eq_value(index) : tex_get_tex_count_register(index, state)) : 0); return 1; } static int texlib_isattribute(lua_State *L) { - return texlib_aux_checked_register(L, register_attribute_cmd, register_attribute_base, max_attribute_register_index); + return texlib_aux_checked_register(L, register_attribute_cmd, register_attribute_base, max_attribute_register_index, -1); } /*tex there are no system set attributes so this is a bit overkill */ @@ -1634,7 +1683,7 @@ static int texlib_setattribute(lua_State *L) int flags = 0; int index = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "attribute", &index, internal_attribute_cmd, register_attribute_cmd, internal_attribute_base, register_attribute_base, max_attribute_register_index); + int state = texlib_aux_check_for_index(L, slot++, "attribute", &index, internal_attribute_cmd, register_attribute_cmd, internal_attribute_base, register_attribute_base, max_attribute_register_index, 0); if (state >= 0) { halfword value = lmt_optinteger(L, slot++, unused_attribute_value); tex_set_tex_attribute_register(index, value, flags, state); @@ -1645,7 +1694,7 @@ static int texlib_setattribute(lua_State *L) static int texlib_getattribute(lua_State *L) { int index; - int state = texlib_aux_check_for_index(L, 1, "attribute", &index, internal_attribute_cmd, register_attribute_cmd, internal_attribute_base, register_attribute_base, max_attribute_register_index); + int state = texlib_aux_check_for_index(L, 1, "attribute", &index, internal_attribute_cmd, register_attribute_cmd, internal_attribute_base, register_attribute_base, max_attribute_register_index, 0); lua_pushinteger(L, state >= 0 ? tex_get_tex_attribute_register(index, state) : 0); return 1; } @@ -1656,7 +1705,7 @@ static int texlib_getattribute(lua_State *L) static int texlib_istoks(lua_State *L) { - return texlib_aux_checked_register(L, register_toks_cmd, register_toks_base, max_toks_register_index); + return texlib_aux_checked_register(L, register_toks_cmd, register_toks_base, max_toks_register_index, -1); } /* [global] name|integer string|nil */ @@ -1666,7 +1715,7 @@ static int texlib_settoks(lua_State *L) int flags = 0; int index = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "toks", &index, internal_toks_cmd, register_toks_cmd, internal_toks_base, register_toks_base,max_toks_register_index); + int state = texlib_aux_check_for_index(L, slot++, "toks", &index, internal_toks_cmd, register_toks_cmd, internal_toks_base, register_toks_base,max_toks_register_index, 0); if (state >= 0) { lstring value = { .c = NULL, .l = 0 }; switch (lua_type(L, slot)) { @@ -1691,7 +1740,7 @@ static int texlib_scantoks(lua_State *L) // TODO int index = 0; int flags = 0; int slot = lmt_check_for_flags(L, 1, &flags, 1, 0); - int state = texlib_aux_check_for_index(L, slot++, "toks", &index, internal_toks_cmd, register_toks_cmd, internal_toks_base, register_toks_base,max_toks_register_index); + int state = texlib_aux_check_for_index(L, slot++, "toks", &index, internal_toks_cmd, register_toks_cmd, internal_toks_base, register_toks_base,max_toks_register_index, 0); if (state >= 0) { lstring value = { .c = NULL, .l = 0 }; int cattable = lmt_checkinteger(L, slot++); @@ -1714,7 +1763,7 @@ static int texlib_gettoks(lua_State *L) { int index; int slot = 1; - int state = texlib_aux_check_for_index(L, slot++, "toks", &index, internal_toks_cmd, register_toks_cmd, internal_toks_base, register_toks_base, max_toks_register_index); + int state = texlib_aux_check_for_index(L, slot++, "toks", &index, internal_toks_cmd, register_toks_cmd, internal_toks_base, register_toks_base, max_toks_register_index, 0); if (state >= 0) { if (lua_toboolean(L, slot)) { lmt_token_register_to_lua(L, state ? toks_parameter(index) : toks_register(index)); |