summaryrefslogtreecommitdiff
path: root/source/luametatex/source/tex/texscanning.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/tex/texscanning.h')
-rw-r--r--source/luametatex/source/tex/texscanning.h210
1 files changed, 210 insertions, 0 deletions
diff --git a/source/luametatex/source/tex/texscanning.h b/source/luametatex/source/tex/texscanning.h
new file mode 100644
index 000000000..90897bf54
--- /dev/null
+++ b/source/luametatex/source/tex/texscanning.h
@@ -0,0 +1,210 @@
+/*
+ See license.txt in the root of this project.
+*/
+
+# ifndef LMT_SCANNING_H
+# define LMT_SCANNING_H
+
+typedef enum value_level_code {
+ int_val_level, /*tex integer values */
+ attr_val_level, /*tex integer values */
+ dimen_val_level, /*tex dimension values */
+ glue_val_level, /*tex glue specifications */
+ mu_val_level, /*tex math glue specifications */
+ tok_val_level, /*tex token lists */
+ font_val_level , /*tex font identifier */
+ mathspec_val_level ,
+ fontspec_val_level ,
+ specification_val_level, /*tex special purpose identifier */
+ list_val_level,
+ no_val_level,
+} value_level_code;
+
+# define first_value_level int_val_level
+# define last_value_level mu_val_level
+
+typedef struct scanner_state_info {
+ int current_cmd; /*tex current command set by |get_next| */
+ halfword current_chr; /*tex operand of current command */
+ halfword current_cs; /*tex control sequence found here, zero if none found */
+ // halfword current_flag;
+ halfword current_tok; /*tex packed representative of |cur_cmd| and |cur_chr| */
+ int current_val; /*tex value returned by numeric scanners */
+ int current_val_level; /*tex the level of this value */
+ halfword current_box; /*tex the box to be placed into its context: */
+ halfword last_cs_name; /*tex used in |\csname| and |\ifcsname| */
+ int arithmic_error;
+ int expression_depth;
+} scanner_state_info;
+
+extern scanner_state_info lmt_scanner_state;
+
+/*tex
+ These are rather basic \TEX\ The Program variables (aliases) so for now we stick to the
+ unqualified short names.
+*/
+
+# define cur_cmd lmt_scanner_state.current_cmd
+# define cur_chr lmt_scanner_state.current_chr
+# define cur_cs lmt_scanner_state.current_cs
+# define cur_tok lmt_scanner_state.current_tok
+# define cur_val lmt_scanner_state.current_val
+# define cur_val_level lmt_scanner_state.current_val_level
+# define cur_box lmt_scanner_state.current_box
+
+typedef struct full_scanner_status {
+ int save_scanner_status;
+ halfword save_def_ref;
+ halfword save_warning_index;
+} full_scanner_status;
+
+inline static full_scanner_status tex_save_full_scanner_status(void)
+{
+ full_scanner_status a;
+ a.save_scanner_status = lmt_input_state.scanner_status;
+ a.save_def_ref = lmt_input_state.def_ref;
+ a.save_warning_index = lmt_input_state.warning_index;
+ return a;
+}
+
+inline static void tex_unsave_full_scanner_status(full_scanner_status a)
+{
+ lmt_input_state.warning_index = a.save_warning_index;
+ lmt_input_state.def_ref = a.save_def_ref;
+ lmt_input_state.scanner_status = a.save_scanner_status;
+}
+
+extern void tex_scan_something_simple (halfword cmd, halfword code);
+extern void tex_scan_left_brace (void);
+extern void tex_scan_optional_equals (void);
+extern int tex_scan_cardinal (unsigned *value, int dontbark);
+extern halfword tex_scan_int (int optional_equal, int *radix);
+extern halfword tex_scan_scale (int optional_equal);
+extern halfword tex_scan_dimen (int mu, int inf, int shortcut, int optional_equal, halfword *order);
+extern halfword tex_scan_glue (int level, int optional_equal);
+extern halfword tex_scan_font (int optional_equal);
+extern halfword tex_scan_general_text (halfword *tail);
+/* halfword tex_scan_toks (int macrodef, int xpand, int left_brace_found); */
+extern halfword tex_scan_toks_normal (int left_brace_found, halfword *tail);
+extern halfword tex_scan_toks_expand (int left_brace_found, halfword *tail, int expandconstant);
+extern halfword tex_scan_macro_normal (void); // (int tolerant);
+extern halfword tex_scan_macro_expand (void); // (int tolerant);
+extern halfword tex_scan_font_identifier (halfword *spec);
+extern halfword tex_scan_fontspec_identifier (void);
+extern halfword tex_scan_math_style_identifier (int tolerant, int styles);
+extern halfword tex_scan_math_parameter (void);
+extern halfword tex_scan_limited_scale (int optional_equal);
+extern halfword tex_scan_positive_scale (int optional_equal);
+
+extern quarterword tex_scan_direction (int optional_equal);
+extern halfword tex_scan_geometry (int optional_equal);
+extern halfword tex_scan_orientation (int optional_equal);
+extern halfword tex_scan_anchor (int optional_equal);
+extern halfword tex_scan_anchors (int optional_equal);
+
+extern int tex_scanned_expression (int level);
+
+extern halfword tex_scan_int_register_number (void);
+extern halfword tex_scan_dimen_register_number (void);
+extern halfword tex_scan_attribute_register_number (void);
+extern halfword tex_scan_glue_register_number (void);
+extern halfword tex_scan_mu_glue_register_number (void);
+extern halfword tex_scan_toks_register_number (void);
+extern halfword tex_scan_box_register_number (void);
+extern halfword tex_scan_mark_number (void);
+extern halfword tex_scan_char_number (int optional_equal);
+extern halfword tex_scan_math_char_number (void);
+extern halfword tex_scan_math_family_number (void);
+extern halfword tex_scan_math_class_number (int optional_equal);
+extern halfword tex_scan_math_properties_number (void);
+extern halfword tex_scan_math_group_number (void);
+extern halfword tex_scan_math_index_number (void);
+extern halfword tex_scan_math_discretionary_number (int optional_equal);
+extern halfword tex_scan_category_code (void);
+extern singleword tex_scan_box_index (void); /*tex For local boxes: small for now! */
+extern singleword tex_scan_box_axis (void);
+extern halfword tex_scan_function_reference (int optional_equal);
+extern halfword tex_scan_bytecode_reference (int optional_equal);
+
+extern halfword tex_the_value_toks (int unit, halfword *tail, halfword property); /* returns head */
+extern halfword tex_the_toks (int code, halfword *tail); /* returns head */
+extern halfword tex_the_detokenized_toks (halfword *head);
+extern strnumber tex_the_scanned_result (void);
+
+extern void tex_set_font_dimen (void);
+extern halfword tex_get_font_dimen (void);
+extern void tex_set_scaled_font_dimen (void);
+extern halfword tex_get_scaled_font_dimen (void);
+
+extern void tex_get_x_or_protected (void);
+
+extern int tex_fract (int x, int n, int d, int max_answer);
+
+extern halfword tex_scan_lua_value (int index);
+
+extern int tex_scan_tex_value (halfword level, halfword *value);
+
+extern halfword tex_scan_attribute (halfword attrlist);
+
+/*
+# define token_is_digit(t) ((t >= zero_token ) && (t <= nine_token ))
+# define token_is_xdigit(t) (((t >= zero_token ) && (t <= nine_token )) || \
+ ((t >= a_token_l ) && (t <= f_token_l )) || \
+ ((t >= A_token_l ) && (t <= F_token_l )) || \
+ ((t >= a_token_o ) && (t <= f_token_o )) || \
+ ((t >= A_token_o ) && (t <= F_token_o )))
+# define token_is_exponent(t) ((t == E_token_l ) || (t == e_token_l ) || \
+ (t == E_token_o ) || (t == e_token_o ))
+# define token_is_xexponent(t) ((t == P_token_l ) || (t == p_token_l ) || \
+ (t == P_token_o ) || (t == p_token_o ))
+# define token_is_hexadecimal(t) ((t == X_token_l ) || (t == x_token_l ) || \
+ (t == X_token_o ) || (t == x_token_o ))
+# define token_is_sign(t) ((t == minus_token ) || (t == plus_token ))
+# define token_is_seperator(t) ((t == period_token) || (t == comma_token))
+*/
+
+inline static int tex_token_is_digit(halfword t)
+{
+ return (t >= zero_token) && (t <= nine_token);
+}
+
+inline static int tex_token_is_xdigit(halfword t) {
+ return ((t >= zero_token) && (t <= nine_token))
+ || ((t >= a_token_l ) && (t <= f_token_l))
+ || ((t >= A_token_l ) && (t <= F_token_l))
+ || ((t >= a_token_o ) && (t <= f_token_o))
+ || ((t >= A_token_o ) && (t <= F_token_o));
+}
+
+inline static int tex_token_is_exponent(halfword t)
+{
+ return (t == E_token_l) || (t == e_token_l)
+ || (t == E_token_o) || (t == e_token_o);
+}
+
+inline static int tex_token_is_xexponent(halfword t)
+{
+ return (t == P_token_l) || (t == p_token_l)
+ || (t == P_token_o) || (t == p_token_o);
+}
+
+ inline static int tex_token_is_hexadecimal(halfword t)
+{
+ return (t == X_token_l) || (t == x_token_l)
+ || (t == X_token_o) || (t == x_token_o);
+}
+
+inline static int tex_token_is_sign(halfword t) {
+ return (t == minus_token) || (t == plus_token);
+}
+
+inline static int tex_token_is_seperator(halfword t) {
+ return (t == period_token) || (t == comma_token);
+}
+
+inline static int tex_token_is_operator(halfword t) {
+ return (t == plus_token) || (t == minus_token) || (t == asterisk_token) || (t == slash_token) || (t == colon_token);
+}
+
+# endif
+