summaryrefslogtreecommitdiff
path: root/source/luametatex/source/tex/texmaincontrol.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/tex/texmaincontrol.c')
-rw-r--r--source/luametatex/source/tex/texmaincontrol.c102
1 files changed, 94 insertions, 8 deletions
diff --git a/source/luametatex/source/tex/texmaincontrol.c b/source/luametatex/source/tex/texmaincontrol.c
index c93011ad9..d043209e5 100644
--- a/source/luametatex/source/tex/texmaincontrol.c
+++ b/source/luametatex/source/tex/texmaincontrol.c
@@ -3443,6 +3443,11 @@ inline static halfword tex_aux_get_register_index(int level)
halfword index = tex_scan_attribute_register_number();
return register_attribute_location(index);
}
+ case posit_val_level:
+ {
+ halfword index = tex_scan_posit_register_number();
+ return register_posit_location(index);
+ }
case glue_val_level:
{
halfword index = tex_scan_glue_register_number();
@@ -3469,6 +3474,8 @@ inline static halfword tex_aux_get_register_value(int level, int optionalequal)
case int_val_level:
case attr_val_level:
return tex_scan_int(optionalequal, NULL);
+ case posit_val_level:
+ return tex_scan_posit(optionalequal);
case dimen_val_level:
return tex_scan_dimen(0, 0, 0, optionalequal, NULL);
default:
@@ -3495,6 +3502,12 @@ static int tex_aux_valid_arithmic(int cmd, int *index, int *level, int *varcmd,
*level = attr_val_level;
*original = eq_value(*index);
return 1;
+ case register_posit_cmd:
+ case internal_posit_cmd:
+ *index = cur_chr;
+ *level = posit_val_level;
+ *original = eq_value(*index);
+ return 1;
case register_dimen_cmd:
case internal_dimen_cmd:
*index = cur_chr;
@@ -3530,6 +3543,12 @@ static int tex_aux_valid_arithmic(int cmd, int *index, int *level, int *varcmd,
*original = cur_chr;
*simple = dimension_cmd;
return 1;
+ case posit_cmd:
+ *index = cur_cs;
+ *level = posit_val_level;
+ *original = cur_chr;
+ *simple = posit_cmd;
+ return 1;
case gluespec_cmd:
*index = cur_cs;
*level = glue_val_level;
@@ -3582,6 +3601,12 @@ inline static void tex_aux_update_register(int a, int level, halfword index, hal
tex_change_attribute_register(a, index, value);
tex_word_define(a, index, value);
break;
+ case posit_val_level:
+ tex_word_define(a, index, value);
+ if (is_frozen(a) && cmd == internal_posit_cmd && cur_mode == hmode) {
+ tex_update_par_par(internal_posit_cmd, index - lmt_primitive_state.prim_data[cmd].offset);
+ }
+ break;
case dimen_val_level:
tex_word_define(a, index, value);
if (is_frozen(a) && cmd == internal_dimen_cmd && cur_mode == hmode) {
@@ -3647,6 +3672,13 @@ static void tex_aux_arithmic_register(int a, int code)
} else {
return;
}
+ case posit_val_level:
+ if (tex_posit_eq_zero(amount)) {
+ return;
+ } else {
+ value = tex_posit_add(original, amount);
+ break;
+ }
case glue_val_level:
case mu_val_level:
if (tex_glue_is_zero(amount)) {
@@ -3704,6 +3736,9 @@ static void tex_aux_arithmic_register(int a, int code)
case attr_val_level:
value = tex_multiply_integers(original, amount);
break;
+ case posit_val_level:
+ value = tex_posit_mul(original, amount);
+ break;
case dimen_val_level:
value = tex_nx_plus_y(original, amount, 0);
break;
@@ -3746,6 +3781,9 @@ static void tex_aux_arithmic_register(int a, int code)
case dimen_val_level:
value = tex_x_over_n(original, amount);
break;
+ case posit_val_level:
+ value = tex_posit_div(original, amount);
+ break;
case glue_val_level:
case mu_val_level:
{
@@ -4256,6 +4294,12 @@ static void tex_aux_set_shorthand_def(int a, int force)
tex_define_again(a, p, register_attribute_cmd, register_attribute_location(n));
break;
}
+ case float_def_code:
+ {
+ scaled n = tex_scan_posit_register_number();
+ tex_define_again(a, p, register_posit_cmd, register_posit_location(n));
+ break;
+ }
case dimen_def_code:
{
scaled n = tex_scan_dimen_register_number();
@@ -4300,6 +4344,13 @@ static void tex_aux_set_shorthand_def(int a, int force)
tex_define_again(a, p, dimension_cmd, v);
}
break;
+ case posit_def_code:
+ /* case posit_def_csname_code: */
+ {
+ scaled v = tex_scan_posit(1);
+ tex_define_again(a, p, posit_cmd, v);
+ }
+ break;
case gluespec_def_code:
{
halfword v = tex_scan_glue(glue_val_level, 1);
@@ -5318,6 +5369,20 @@ static void tex_aux_set_register_int(int a)
tex_word_define(a, p, v);
}
+static void tex_aux_set_internal_posit(int a)
+{
+ halfword p = cur_chr;
+ scaled v = tex_scan_posit(1);
+ tex_assign_internal_int_value(a, p, v);
+}
+
+static void tex_aux_set_register_posit(int a)
+{
+ halfword p = cur_chr;
+ scaled v = tex_scan_posit(1);
+ tex_word_define(a, p, v);
+}
+
static void tex_aux_set_internal_attr(int a)
{
halfword p = cur_chr;
@@ -5450,6 +5515,9 @@ static void tex_aux_set_constant_register(halfword cmd, halfword cs, halfword fl
case dimension_cmd:
v = tex_scan_dimen(0, 0, 0, 1, NULL);
break;
+ case posit_cmd:
+ v = tex_scan_posit(1);
+ break;
case gluespec_cmd:
v = tex_scan_glue(glue_val_level, 1);
break;
@@ -5542,6 +5610,12 @@ static void tex_run_prefixed_command(void)
case register_attribute_cmd:
tex_aux_set_register_attr(flags);
break;
+ case internal_posit_cmd:
+ tex_aux_set_internal_posit(flags);
+ break;
+ case register_posit_cmd:
+ tex_aux_set_register_posit(flags);
+ break;
case internal_dimen_cmd:
tex_aux_set_internal_dimen(flags);
break;
@@ -5619,6 +5693,7 @@ static void tex_run_prefixed_command(void)
break;
case integer_cmd:
case dimension_cmd:
+ case posit_cmd:
case gluespec_cmd:
case mugluespec_cmd:
tex_aux_set_constant_register(cur_cmd, cur_cs, flags);
@@ -5964,6 +6039,14 @@ void tex_assign_internal_attribute_value(int a, halfword p, int val)
tex_word_define(a, p, val);
}
+void tex_assign_internal_posit_value(int a, halfword p, int val)
+{
+ tex_word_define(a, p, val);
+ // if (is_frozen(a) && cur_mode == hmode) {
+ // tex_update_par_par(internal_posit_cmd, internal_posit_number(p));
+ // }
+}
+
void tex_assign_internal_dimen_value(int a, halfword p, int val)
{
tex_word_define(a, p, val);
@@ -6316,23 +6399,25 @@ static void tex_aux_run_show_whatever(void)
inline static void tex_aux_big_switch(int mode, int cmd)
{
-
+ /* todo: order */
switch (cmd) {
case arithmic_cmd:
- case register_attribute_cmd:
+ case internal_int_cmd :
+ case register_int_cmd :
case internal_attribute_cmd:
- case register_dimen_cmd:
+ case register_attribute_cmd:
+ case internal_posit_cmd:
+ case register_posit_cmd:
case internal_dimen_cmd:
+ case register_dimen_cmd:
case set_font_property_cmd :
- case register_glue_cmd:
case internal_glue_cmd:
- case register_int_cmd :
- case internal_int_cmd :
- case register_mu_glue_cmd:
+ case register_glue_cmd:
case internal_mu_glue_cmd:
- case register_toks_cmd:
+ case register_mu_glue_cmd:
case internal_toks_cmd:
+ case register_toks_cmd:
case define_char_code_cmd:
case def_cmd:
case define_family_cmd:
@@ -6353,6 +6438,7 @@ inline static void tex_aux_big_switch(int mode, int cmd)
case lua_value_cmd:
case integer_cmd:
case dimension_cmd:
+ case posit_cmd:
case gluespec_cmd:
case mugluespec_cmd:
case combine_toks_cmd: