diff options
Diffstat (limited to 'source/luametatex/source/tex/texprimitive.h')
-rw-r--r-- | source/luametatex/source/tex/texprimitive.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/source/luametatex/source/tex/texprimitive.h b/source/luametatex/source/tex/texprimitive.h new file mode 100644 index 000000000..640a6b232 --- /dev/null +++ b/source/luametatex/source/tex/texprimitive.h @@ -0,0 +1,95 @@ +/* + See license.txt in the root of this project. +*/ + +# ifndef LMT_PRIMITIVE_H +# define LMT_PRIMITIVE_H + +/*tex + + This is a list of origins for primitive commands. The engine starts out with hardly anything + enabled so as a first step one should enable the \TEX\ primitives, and additional \ETEX\ and + \LUATEX\ primitives. Maybe at some moment we should just enable all by default. + +*/ + +typedef enum command_origin { + tex_command = 1, + etex_command = 2, + luatex_command = 4, + no_command = 8, +} command_origin; + +typedef struct hash_state_info { + memoryword *hash; /*tex The hash table. */ + memory_data hash_data; + memoryword *eqtb; /*tex The equivalents table. */ + memory_data eqtb_data; + int no_new_cs; /*tex Are new identifiers legal? */ + int padding; +} hash_state_info ; + +extern hash_state_info lmt_hash_state; + +/*tex + + We use no defines as a |hash| macro will clash with lua hash. Most hash accessors are in a few + places where it makes sense to be explicit anyway. + +*/ + +# define cs_next(a) lmt_hash_state.hash[(a)].half0 /*tex link for coalesced lists */ +# define cs_text(a) lmt_hash_state.hash[(a)].half1 /*tex string number for control sequence name */ + +# define undefined_primitive 0 +# define prim_size 2100 /*tex (can be 1000) maximum number of primitives (quite a bit more than needed) */ +# define prim_prime 1777 /*tex (can be 853) about 85 percent of |primitive_size| */ + +typedef struct primitive_info { + halfword subids; /*tex number of name entries */ + halfword offset; /*tex offset to be used for |chr_code|s */ + strnumber *names; /*tex array of names */ +} prim_info; + +typedef struct primitive_state_info { + memoryword prim[prim_size + 1]; + memoryword prim_eqtb[prim_size + 1]; + prim_info prim_data[last_cmd + 1]; + halfword prim_used; + /* alignment */ + int padding; +} primitive_state_info; + +extern primitive_state_info lmt_primitive_state; + +# define prim_next(a) lmt_primitive_state.prim[(a)].half0 /*tex Link for coalesced lists. */ +# define prim_text(a) lmt_primitive_state.prim[(a)].half1 /*tex String number for control sequence name. */ +# define prim_origin(a) lmt_primitive_state.prim_eqtb[(a)].quart01 /*tex Level of definition. */ +# define prim_eq_type(a) lmt_primitive_state.prim_eqtb[(a)].quart00 /*tex Command code for equivalent. */ +# define prim_equiv(a) lmt_primitive_state.prim_eqtb[(a)].half1 /*tex Equivalent value. */ + +# define get_prim_eq_type(p) prim_eq_type(p) +# define get_prim_equiv(p) prim_equiv(p) +# define get_prim_text(p) prim_text(p) +# define get_prim_origin(p) prim_origin(p) + +extern void tex_initialize_primitives (void); +extern void tex_initialize_hash_mem (void); +/* int tex_room_in_hash (void); */ +extern halfword tex_prim_lookup (strnumber s); +/* int tex_cs_is_primitive (strnumber csname); */ +extern void tex_primitive (int cmd_origin, const char *ss, singleword cmd, halfword chr, halfword offset); +extern void tex_primitive_def (const char *str, size_t length, singleword cmd, halfword chr); +extern void tex_print_cmd_chr (singleword cmd, halfword chr); +extern void tex_dump_primitives (dumpstream f); +extern void tex_undump_primitives (dumpstream f); +extern void tex_dump_hashtable (dumpstream f); +extern void tex_undump_hashtable (dumpstream f); +/* halfword tex_string_lookup (const char *s, size_t l); */ +extern halfword tex_string_locate (const char *s, size_t l, int create); +extern halfword tex_located_string (const char *s); +/* halfword tex_id_lookup (int j, int l); */ +extern halfword tex_id_locate (int j, int l, int create); +extern void tex_print_cmd_flags (halfword cs, halfword cmd, int flags, int escape); + +# endif |