1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
/*
See license.txt in the root of this project.
*/
# ifndef LMT_SCANNING_H
# define LMT_SCANNING_H
typedef enum value_level_code {
posit_val_level,
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 (int optional_equal, 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_posit (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_posit_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 (int optional_equal);
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 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
|