diff options
Diffstat (limited to 'source/luametatex/source/tex/texconditional.h')
-rw-r--r-- | source/luametatex/source/tex/texconditional.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/source/luametatex/source/tex/texconditional.h b/source/luametatex/source/tex/texconditional.h new file mode 100644 index 000000000..f3de5dcdb --- /dev/null +++ b/source/luametatex/source/tex/texconditional.h @@ -0,0 +1,131 @@ +/* + See license.txt in the root of this project. +*/ + +# ifndef LMT_CONDITIONAL_H +# define LMT_CONDITIONAL_H + +/*tex + + The next list should be in sync with |if_branch_mapping| at the top of the |c| file with the + same name. The next ones also go on the condition stack so we need to retain this order and + organization. + + There is a catch here: the codes of the |if_test_cmd|, |fi_or_else_cmd| and |or_else_cmd| are + all in this enumeration. This has to do with the history of not always checking for the cmd + code in the fast skipping branches. We could change that but not now. + + Well, in the end I combined |if_test_cmd|, |fi_or_else_cmd| and |or_else_cmd| because they use + the same chr range anyway and it also simplifies some of the testing (especially after some + more robust cmd/chr checking was added, and after that the |fi_or_else_cmd| and |or_else_cmd| + were combined. The main motivation is that we can have a more consistent \LUA\ token interface + end. It is debatable as we divert from the original, but we already did that by introducing + more conditionals, |\orelse| and the generic |\ifconditional| that also demandeed all kind of + adaptations. Sorry. The comments are mostly the same, including references to the older cmd + codes (pre 2.07 there used to be some switch/case statements in places but these were flattened). + + Btw, the |\unless| prefix is kept out of this because it relates to expansion and prefixes are + separate anyway. It would make the code less pretty. + + One reason for a split in cmd codes is performance but we didn't loose on the change. + +*/ + +typedef enum if_test_codes { + /*tex These are private chr codes: */ + + no_if_code, /*tex We're not in a condition. */ + if_code, /*tex We have a condition. */ + + /*tex These are public chr codes: */ + + fi_code, /*tex |\fi| */ + else_code, /*tex |\else| */ + or_code, /*tex |\or| */ + or_else_code, /*tex |\orelse| */ + or_unless_code, /*tex |\orunless| */ + + /*tex Here come the \if... codes: */ + + if_char_code, /*tex |\if| */ + if_cat_code, /*tex |\ifcat| */ + if_abs_int_code, /*tex |\ifabsnum| */ + if_int_code, /*tex |\ifnum| */ + if_abs_dim_code, /*tex |\ifabsdim| */ + if_dim_code, /*tex |\ifdim| */ + if_odd_code, /*tex |\ifodd| */ + if_vmode_code, /*tex |\ifvmode| */ + if_hmode_code, /*tex |\ifhmode| */ + if_mmode_code, /*tex |\ifmmode| */ + if_inner_code, /*tex |\ifinner| */ + if_void_code, /*tex |\ifvoid| */ + if_hbox_code, /*tex |\ifhbox| */ + if_vbox_code, /*tex |\ifvbox| */ + if_tok_code, /*tex |\iftok| */ + if_cstok_code, /*tex |\ifcstok| */ + if_x_code, /*tex |\ifx| */ + if_true_code, /*tex |\iftrue| */ + if_false_code, /*tex |\iffalse| */ + if_chk_int_code, /*tex |\ifchknum| */ + if_val_int_code, /*tex |\ifcmpnum| */ + if_cmp_int_code, /*tex |\ifcmpnum| */ + if_chk_dim_code, /*tex |\ifchkdim| */ + if_val_dim_code, /*tex |\ifchkdim| */ + if_cmp_dim_code, /*tex |\ifcmpdim| */ + if_case_code, /*tex |\ifcase| */ + if_def_code, /*tex |\ifdefined| */ + if_cs_code, /*tex |\ifcsname| */ + if_in_csname_code, /*tex |\ifincsname| */ + if_font_char_code, /*tex |\iffontchar| */ + if_condition_code, /*tex |\ifcondition| */ + if_flags_code, /*tex |\ifflags| */ + if_empty_cmd_code, /*tex |\ifempty| */ + if_relax_cmd_code, /*tex |\ifrelax| */ + if_boolean_code, /*tex |\ifboolean| */ + if_numexpression_code, /*tex |\ifnumexpression| */ + if_dimexpression_code, /*tex |\ifdimexpression| */ + if_math_parameter_code, /*tex |\ifmathparameter| */ + if_math_style_code, /*tex |\ifmathstyle| */ + if_arguments_code, /*tex |\ifarguments| */ + if_parameters_code, /*tex |\ifparameters| */ + if_parameter_code, /*tex |\ifparameter| */ + if_has_tok_code, /*tex |\ifhastok| */ + if_has_toks_code, /*tex |\ifhastoks| */ + if_has_xtoks_code, /*tex |\ifhasxtoks| */ + if_has_char_code, /*tex |\ifhaschar| */ + if_insert_code /*tex |\ifinsert| */ + // if_bitwise_and_code, /*tex |\ifbitwiseand| */ +} if_test_codes; + +# define first_if_test_code fi_code +# define last_if_test_code if_insert_code +//define last_if_test_code if_bitwise_and_code + +# define first_real_if_test_code if_char_code +# define last_real_if_test_code if_insert_code +//define last_real_if_test_code if_bitwise_and_code + +typedef struct condition_state_info { + halfword cond_ptr; /*tex top of the condition stack */ + int cur_if; /*tex type of conditional being worked on */ + int cur_unless; + int if_step; + int if_unless; + int if_limit; /*tex upper bound on |fi_or_else| codes */ + int if_line; /*tex line where that conditional began */ + int skip_line; /*tex skipping began here */ + halfword chk_num; + scaled chk_dim; + halfword if_nesting; + halfword padding; +} condition_state_info ; + +extern condition_state_info lmt_condition_state; + +extern void tex_conditional_if (halfword code, int unless); +extern void tex_conditional_fi_or_else (void); +extern void tex_conditional_unless (void); +extern void tex_show_ifs (void); +/* void tex_conditional_after_fi (void); */ + +# endif |