summaryrefslogtreecommitdiff
path: root/source/luametatex/source/lua/lmttexlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/lua/lmttexlib.c')
-rw-r--r--source/luametatex/source/lua/lmttexlib.c153
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));