lmtinterface.h /size: 61 Kb    last modification: 2025-02-21 11:03
1/*
2    See license.txt in the root of this project.
3*/
4
5# ifndef LMT_LINTERFACE_H
6# define LMT_LINTERFACE_H
7
8# define lmt_linterface_inline 1
9
10/*tex
11
12    In this file we collect all kind of interface stuff related to \LUA. It is a large file because
13    we also create \LUA\ string entries which speeds up the interfacing.
14
15*/
16# include "lua.h"
17# include "lauxlib.h"
18# include "lualib.h"
19
20/*tex Just in case: */
21
22extern int  tex_formatted_error   (const char *t, const char *fmt, ...);
23extern void tex_formatted_warning (const char *t, const char *fmt, ...);
24extern void tex_emergency_message (const char *t, const char *fmt, ...);
25
26/*tex
27
28    In the beginning we had multiple \LUA\ states but that didn't work out well if you want to
29    intercace to the \TEX\ kernel. So, we dropped that and now have only one main state.
30
31*/
32
33typedef struct lua_state_info {
34    lua_State   *lua_instance;
35    int          used_bytes;
36    int          used_bytes_max;
37    int          function_table_id;
38    int          function_callback_count;
39    int          value_callback_count;
40    int          bytecode_callback_count;
41    int          local_callback_count;
42    int          saved_callback_count;
43    int          file_callback_count;
44    int          direct_callback_count;
45    int          message_callback_count;
46    int          function_table_size;
47    int          bytecode_bytes;
48    int          bytecode_max;
49    int          version_number;
50    int          release_number;
51    luaL_Buffer *used_buffer;
52    int          integer_size;
53} lua_state_info ;
54
55extern lua_state_info lmt_lua_state;
56
57/*tex The libraries are opened and initialized by the following functions. */
58
59extern int  luaopen_aes         (lua_State *L);
60extern int  luaopen_basexx      (lua_State *L);
61extern int  luaopen_callback    (lua_State *L);
62extern int  luaopen_filelib     (lua_State *L);
63extern int  luaopen_fio         (lua_State *L);
64extern int  luaopen_font        (lua_State *L);
65extern int  luaopen_language    (lua_State *L);
66extern int  luaopen_library     (lua_State *L);
67extern int  luaopen_lpeg        (lua_State *L);
68extern int  luaopen_lua         (lua_State *L);
69extern int  luaopen_luac        (lua_State *L);
70extern int  luaopen_md5         (lua_State *L);
71extern int  luaopen_mime_core   (lua_State *L);
72extern int  luaopen_mplib       (lua_State *L);
73extern int  luaopen_node        (lua_State *L);
74extern int  luaopen_optional    (lua_State *L);
75extern int  luaopen_pdfdecode   (lua_State *L);
76extern int  luaopen_pdfe        (lua_State *L);
77extern int  luaopen_pngdecode   (lua_State *L);
78extern int  luaopen_posit       (lua_State *L);
79extern int  luaopen_potrace     (lua_State *L);
80extern int  luaopen_sha2        (lua_State *L);
81extern int  luaopen_sio         (lua_State *L);
82extern int  luaopen_socket_core (lua_State *L);
83extern int  luaopen_sparse      (lua_State *L);
84extern int  luaopen_status      (lua_State *L);
85extern int  luaopen_tex         (lua_State *L);
86extern int  luaopen_texio       (lua_State *L);
87extern int  luaopen_token       (lua_State *L);
88extern int  luaopen_xcomplex    (lua_State *L);
89extern int  luaopen_xdecimal    (lua_State *L);
90extern int  luaopen_xmath       (lua_State *L);
91extern int  luaopen_xzip        (lua_State *L);
92
93extern int  luaextend_io        (lua_State *L);
94extern int  luaextend_os        (lua_State *L);
95extern int  luaextend_string    (lua_State *L);
96extern int  luaextend_table     (lua_State *L);
97extern int  luaextend_xcomplex  (lua_State *L);
98
99/*tex
100
101    We finetune the string hasher. When playing with \LUAJIT\ we found that its hashes was pretty
102    inefficient and geared for \URL's! So there we switched to the \LUA\ hasher an din the process
103    we also did experiments with the |LUA_HASHLIMIT| parameter. There's an (already old) article
104    about that in one of the \LUATEX\ histories.
105
106 */
107
108# if !defined(LUAI_HASHLIMIT)
109# define LUAI_HASHLIMIT 6
110# endif
111
112/*tex
113
114    Now comes a large section. Here we create and use macros that preset the access pointers
115    (indices) to keys which is faster in comparison. We also handle the arrays that hold the
116    information about what fields there are in nodes. This is code from the early times when we
117    found out that especially when a lot of access by key happens performance is hit because
118    strings get rehashed. It might be that in the meantime \LUA\ suffers less from this but we
119    keep this abstraction anyway.
120
121    As we share this mechanism between all modules and because, although it is built from
122    components, \LUAMETATEX\ is a whole, we now also moved the \MPLIB\ keys into the same
123    namespace which saves code and macros. Some are shared anyway.
124
125    There is also a bit of metatable lookup involved but we only do that for those modules for
126    which it's critical.
127
128    Contrary to \LUATEX\ we use a struct to collect the indices and keys instead of global
129    pointers. This hides the symbols better.
130
131*/
132
133// todo: add L to some below
134
135# define lua_key_eq(a,b)  (a == lmt_keys.ptr_##b)
136# define lua_key_index(a) lmt_keys.idx_##a
137# define lua_key(a)       lmt_keys.ptr_##a
138
139# define init_lua_key(L,a) \
140    lua_pushliteral(L, #a); \
141    lmt_keys.ptr_##a = lua_tolstring(L, -1, NULL); \
142    lmt_keys.idx_##a = luaL_ref(L, LUA_REGISTRYINDEX);
143
144# define init_lua_key_alias(L,a,b) \
145    lua_pushliteral(L, b); \
146    lmt_keys.ptr_##a = lua_tolstring(L, -1, NULL); \
147    lmt_keys.idx_##a = luaL_ref(L, LUA_REGISTRYINDEX);
148
149# define make_lua_key_ptr(L,a)         const char *ptr_##a
150# define make_lua_key_idx(L,a)         int         idx_##a
151
152# define make_lua_key_ptr_alias(L,a,b) const char *ptr_##a
153# define make_lua_key_idx_alias(L,a,b) int         idx_##a
154
155# define make_lua_key
156# define make_lua_key_alias
157
158# define lua_push_key(a)          lua_rawgeti(L, LUA_REGISTRYINDEX, lua_key_index(a));
159# define lua_push_key_by_index(a) lua_rawgeti(L, LUA_REGISTRYINDEX, a);
160
161# define lua_get_metatablelua(a) do { \
162    lua_rawgeti(L, LUA_REGISTRYINDEX, lua_key_index(a)); \
163    lua_gettable(L, LUA_REGISTRYINDEX); \
164} while (0)
165
166# define lua_push_number(L,x)   lua_pushnumber (L, (lua_Number)  (x))
167# define lua_push_integer(L,x)  lua_pushinteger(L, (int)         (x))
168# define lua_push_halfword(L,x) lua_pushinteger(L, (lua_Integer) (x))
169
170# define lua_push_number_at_index(L,i,x) \
171    lua_pushnumber(L, (lua_Number) (x)); \
172    lua_rawseti(L, -2, i);
173
174# define lua_push_integer_at_index(L,i,x) \
175    lua_pushinteger(L, (x)); \
176    lua_rawseti(L, -2, i);
177
178# define lua_push_string_at_index(L,i,s) \
179    lua_pushstring(L, s); \
180    lua_rawseti(L, -2, i);
181
182/* why not lua_push_key(k); lua_rawseti(L, -2, i); */
183
184# define lua_push_key_at_index(L,k,i) \
185    lua_pushinteger(L, i); \
186    lua_push_key(k); \
187    lua_rawset(L, -3);
188
189# define lua_push_nil_at_key(L,k) \
190    lua_push_key(k); \
191    lua_pushnil(L); \
192    lua_rawset(L, -3);
193
194# define lua_push_number_at_key(L,k,x) \
195    lua_push_key(k); \
196    lua_pushnumber(L, (lua_Number) (x)); \
197    lua_rawset(L, -3);
198
199# define lua_push_integer_at_key(L,k,x) \
200    lua_push_key(k); \
201    lua_pushinteger(L, (x)); \
202    lua_rawset(L, -3);
203
204# define lua_push_string_at_key(L,k,s) \
205    lua_push_key(k); \
206    lua_pushstring(L, s); \
207    lua_rawset(L, -3);
208
209# define mlua_push_lstring_at_key(L,k,s,l) \
210    lua_push_key(k); \
211    lua_pushlstring(L, s, l); \
212    lua_rawset(L, -3);
213
214# define lua_push_boolean_at_key(L,k,b) \
215    lua_push_key(k); \
216    lua_pushboolean(L, b); \
217    lua_rawset(L, -3);
218
219# define lua_push_value_at_key(L,k,v) \
220    lua_push_key(k); \
221    lua_push_key(v); \
222    lua_rawset(L, -3);
223
224# define lua_push_svalue_at_key(L,k,v) \
225    lua_push_key(k); \
226    lua_push_key_by_index(v); \
227    lua_rawset(L, -3);
228
229# define lua_push_specification_at_key(L,k,x) \
230    lua_push_key(k); \
231    lmt_push_specification(L, x, 0); \
232    lua_rawset(L, -3);
233
234/*tex We put some here. These are not public (read: names can change). */
235
236/*tex Used in |lmtnodelib|. */
237
238# define NODE_METATABLE_INSTANCE   "node.instance"
239# define NODE_PROPERTIES_DIRECT    "node.properties"
240# define NODE_PROPERTIES_INDIRECT  "node.properties.indirect"
241# define NODE_PROPERTIES_INSTANCE  "node.properties.instance"
242
243/*tex Used in |lmttokenlib|. */
244
245# define TOKEN_METATABLE_INSTANCE  "token.instance"
246# define TOKEN_METATABLE_PACKAGE   "token.package"
247
248/*tex Used in |lmtepdflib|. */
249
250# define PDFE_METATABLE_INSTANCE   "pdfe.instance"
251# define PDFE_METATABLE_DICTIONARY "pdfe.dictionary"
252# define PDFE_METATABLE_ARRAY      "pdfe.array"
253# define PDFE_METATABLE_STREAM     "pdfe.stream"
254# define PDFE_METATABLE_REFERENCE  "pdfe.reference"
255
256/*tex Used in |lmtmplib|. */
257
258# define MP_METATABLE_INSTANCE     "mp.instance"
259# define MP_METATABLE_FIGURE       "mp.figure"
260# define MP_METATABLE_OBJECT       "mp.object"
261
262/*tex Used in |lmtsparselib|. */
263
264# define SPARSE_METATABLE_INSTANCE "sparse.instance"
265
266/*tex Maybe used in |lmtstrlibext| */
267
268# define STRING_BUFFER_INSTANCE "stringbuffer.instance"
269
270/*tex
271    There are some more but for now we have no reason to alias them for performance reasons, so
272    that got postponed. We then also need to move the defines here:
273*/
274
275/*
276# define DIR_METATABLE             "file.directory"
277
278# define LUA_BYTECODES_INDIRECT
279
280# define TEX_METATABLE_TEX         "tex.tex"
281# define TEX_NEST_INSTANCE         "tex.nest.instance"
282# define TEX_*                     "tex.*"
283
284# define LUA_FUNCTIONS             "lua.functions"
285# define LUA_BYTECODES             "lua.bytecodes"
286# define LUA_BYTECODES_INDIRECT    "lua.bytecodes.indirect"
287
288# define LANGUAGE_METATABLE        "luatex.language"
289# define LANGUAGE_FUNCTIONS        "luatex.language.wordhandlers"
290*/
291
292/*tex
293
294    Currently we sometimes use numbers and sometimes strings in node properties. We can make that
295    consistent by having a check on number and if not then assign a string. The strings are
296    prehashed and we make a bunch of lua tables that have these values. We can preassign these at
297    startup time.
298
299*/
300
301typedef struct value_info {
302    union {
303        int     id;
304        int     type;
305        int     value;
306    };
307    int         lua;
308    const char *name;
309} value_info;
310
311typedef struct node_info {
312    int           id;
313    int           size;
314    value_info   *subtypes;
315    value_info   *fields;
316    const char   *name;
317    int           lua;
318    int           visible;
319    int           first;
320    int           last;
321} node_info;
322
323typedef struct par_info {
324    short cmd;
325    short chr;
326    int   category;
327} par_info;
328
329
330typedef struct command_item {
331    int         id;
332    int         lua;
333    const char *name;
334    int         kind;
335    int         min;
336    int         max;
337    int         base;
338    int         fixedvalue;
339} command_item;
340
341# define unknown_node    0xFFFF
342# define unknown_subtype 0xFFFF
343# define unknown_field   0xFFFF
344# define unknown_value   0xFFFF
345
346# define set_value_entry_nop(target,n)     target[n].lua = 0;                target[n].name  = NULL;       target[n].value = unknown_value;
347# define set_value_entry_key(target,n,k)   target[n].lua = lua_key_index(k); target[n].name  = lua_key(k); target[n].value = n;
348# define set_value_entry_lua(target,n,k)   target[n].lua = lua_key_index(k); target[n].name  = lua_key(k);
349# define set_value_entry_val(target,n,v,k) target[n].lua = lua_key_index(k); target[n].name  = lua_key(k); target[n].value = v;
350
351extern value_info *lmt_aux_allocate_value_info(size_t last);
352
353typedef struct lmt_interface_info {
354    /*tex These are mostly used in lmtnodelib. */
355    value_info    *pack_type_values;
356    value_info    *group_code_values;
357    value_info    *par_context_values;
358    value_info    *page_context_values;
359    value_info    *append_line_context_values;
360    value_info    *alignment_context_values;
361    value_info    *line_break_context_values;
362    value_info    *build_context_values;
363    value_info    *vsplit_context_values;
364    value_info    *par_trigger_values;
365    value_info    *par_mode_values;
366    value_info    *math_style_name_values;
367    value_info    *math_style_variant_values;
368 /* value_info    *noad_option_values; */
369 /* value_info    *glyph_option_values; */
370    /*tex These are mostly used in lmttokenlib. */
371    value_info    *lua_function_values;
372    value_info    *direction_values;
373    value_info    *node_fill_values;
374    value_info    *page_contribute_values;
375    value_info    *math_style_values;
376    value_info    *math_parameter_values;
377    value_info    *math_font_parameter_values;
378    value_info    *math_indirect_values;
379    value_info    *field_type_values;
380    /*tex Here's one for nodes. */
381    node_info     *node_data;
382    par_info      *par_data;
383    /*tex And this one is for tokens. */
384    command_item  *command_names;
385} lmt_interface_info ;
386
387extern lmt_interface_info lmt_interface;
388
389# define lmt_push_pack_type(L,n)           lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.pack_type_values          [n].lua)
390# define lmt_push_group_code(L,n)          lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.group_code_values         [n].lua)
391# define lmt_push_par_context(L,n)         lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.par_context_values        [n].lua)
392# define lmt_push_page_context(L,n)        lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.page_context_values       [n].lua)
393# define lmt_push_append_line_context(L,n) lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.append_line_context_values[n].lua)
394# define lmt_push_alignment_context(L,n)   lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.alignment_context_values  [n].lua)
395# define lmt_push_par_trigger(L,n)         lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.par_trigger_values        [n].lua)
396# define lmt_push_par_mode(L,n)            lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.par_mode_values           [n].lua)
397# define lmt_push_math_style_name(L,n)     lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.math_style_name_values    [n].lua)
398# define lmt_push_math_style_variant(L,n)  lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.math_style_variant_values [n].lua)
399# define lmt_push_math_noad_option(L,n)    lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.math_noad_option_values   [n].lua)
400# define lmt_push_lua_function_values(L,n) lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.lua_function_values       [n].lua)
401# define lmt_push_direction(L,n)           lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.direction_values          [n].lua)
402# define lmt_push_node_fill(L,n)           lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.node_fill_values          [n].lua)
403# define lmt_push_page_contribute(L,n)     lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.page_contribute_values    [n].lua)
404# define lmt_push_math_style(L,n)          lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.math_style_values         [n].lua)
405# define lmt_push_math_parameter(L,n)      lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.math_parameter_values     [n].lua)
406# define lmt_push_math_font_parameter(L,n) lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.math_font_parameter_values[n].lua)
407# define lmt_push_math_indirect(L,n)       lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.math_indirect_values      [n].lua)
408# define lmt_push_field_type(L,n)          lua_rawgeti(L, LUA_REGISTRYINDEX, lmt_interface.field_type_values         [n].lua)
409
410# define lmt_name_of_pack_type(n)           lmt_interface.pack_type_values          [n].name
411# define lmt_name_of_group_code(n)          lmt_interface.group_code_values         [n].name
412# define lmt_name_of_par_context(n)         lmt_interface.par_context_values        [n].name
413# define lmt_name_of_page_context(n)        lmt_interface.page_context_values       [n].name
414# define lmt_name_of_append_line_context(n) lmt_interface.append_line_context_values[n].name
415# define lmt_name_of_alignment_context(n)   lmt_interface.alignment_context_values  [n].name
416# define lmt_name_of_trigger_begin(n)       lmt_interface.par_trigger_values        [n].name
417# define lmt_name_of_par_mode(n)            lmt_interface.par_mode_values           [n].name
418# define lmt_name_of_math_style_name(n)     lmt_interface.math_style_name_values    [n].name
419# define lmt_name_of_math_style_variant(n)  lmt_interface.math_style_variant_values [n].name
420# define lmt_name_of_math_noad_option(n)    lmt_interface.math_noad_option_values   [n].name
421# define lmt_name_of_lua_function_values(n) lmt_interface.lua_function_values       [n].name
422# define lmt_name_of_direction(n)           lmt_interface.direction_values          [n].name
423# define lmt_name_of_node_fill(n)           lmt_interface.node_fill_values          [n].name
424# define lmt_name_of_page_contribute(n)     lmt_interface.page_contribute_values    [n].name
425# define lmt_name_of_math_style(n)          lmt_interface.math_style_values         [n].name
426# define lmt_name_of_math_parameter(n)      lmt_interface.math_parameter_values     [n].name
427# define lmt_name_of_math_font_parameter(n) lmt_interface.math_font_parameter_values[n].name
428# define lmt_name_of_math_indirect(n)       lmt_interface.math_indirect_values      [n].name
429# define lmt_name_of_field_type(n)          lmt_interface.field_type_values         [n].name
430
431/*tex
432    This list will be made smaller because not all values need the boost. Before we define the
433    lot we undefine some possibly conflicting snippets. Actually, we don't really define the
434    key's here but assemble more complex references to registry indices and variables.
435
436    We could do all keys but some are used only for reporting options (values) so we can skip 
437    these (see |lmttexlib.c| for examples of that. 
438*/
439
440# undef quad /* CYGWIN */
441
442# define declare_shared_lua_keys(L) \
443/* */\
444make_lua_key(L, __index);\
445make_lua_key(L, __newindex);\
446make_lua_key(L, above);\
447make_lua_key(L, abovedisplayshortskip);\
448make_lua_key(L, abovedisplayskip);\
449make_lua_key(L, accent);\
450make_lua_key(L, AccentBaseDepth);\
451make_lua_key(L, accentbasedepth);\
452make_lua_key(L, AccentBaseHeight);\
453make_lua_key(L, accentbaseheight);\
454make_lua_key(L, AccentBottomOvershoot);\
455make_lua_key(L, accentbottomovershoot);\
456make_lua_key(L, AccentBottomShiftDown);\
457make_lua_key(L, accentbottomshiftdown);\
458make_lua_key(L, AccentExtendMargin);\
459make_lua_key(L, accentextendmargin);\
460make_lua_key(L, accentkern);\
461make_lua_key(L, AccentSuperscriptDrop);\
462make_lua_key(L, accentsuperscriptdrop);\
463make_lua_key(L, AccentSuperscriptPercent);\
464make_lua_key(L, accentsuperscriptpercent);\
465make_lua_key(L, AccentTopOvershoot);\
466make_lua_key(L, accenttopovershoot);\
467make_lua_key(L, AccentTopShiftUp);\
468make_lua_key(L, accenttopshiftup);\
469make_lua_key(L, accentvariant);\
470make_lua_key(L, active);\
471make_lua_key(L, active_char);\
472make_lua_key(L, adapted);\
473make_lua_key(L, additional);\
474make_lua_key(L, adjacentdemerits);\
475make_lua_key(L, adjdemerits);\
476make_lua_key(L, adjust);\
477make_lua_key(L, adjustedhbox);\
478make_lua_key(L, adjustspacing);\
479make_lua_key(L, adjustspacingshrink);\
480make_lua_key(L, adjustspacingstep);\
481make_lua_key(L, adjustspacingstretch);\
482make_lua_key(L, advance);\
483make_lua_key(L, after_output);\
484make_lua_key(L, after_something);\
485make_lua_key(L, afterdisplay);\
486make_lua_key(L, afterdisplaypenalty);\
487make_lua_key(L, afteroutput);\
488make_lua_key(L, aliased);\
489make_lua_key(L, align);\
490make_lua_key(L, alignhead);\
491make_lua_key(L, alignment);\
492make_lua_key(L, alignment_tab);\
493make_lua_key(L, alignrecord);\
494make_lua_key(L, alignset);\
495make_lua_key(L, alignstack);\
496make_lua_key(L, alsosimple);\
497make_lua_key(L, analyzed);\
498make_lua_key(L, anchor);\
499make_lua_key(L, append);\
500make_lua_key(L, argument);\
501make_lua_key(L, arithmic);\
502make_lua_key(L, atop);\
503make_lua_key(L, association);\
504make_lua_key(L, attr);\
505make_lua_key(L, attribute);\
506make_lua_key(L, attribute_list);\
507make_lua_key(L, attributelist);\
508make_lua_key(L, auto);\
509make_lua_key(L, automatic);\
510make_lua_key(L, auxiliary);\
511make_lua_key(L, axis);\
512make_lua_key(L, AxisHeight);\
513make_lua_key(L, balance);\
514make_lua_key(L, balancefinalpenalty);\
515make_lua_key(L, balanceslot);\
516make_lua_key(L, baselineskip);\
517make_lua_key(L, beforedisplay);\
518make_lua_key(L, beforedisplaypenalty);\
519make_lua_key(L, begin_group);\
520make_lua_key(L, begin_local);\
521make_lua_key(L, begin_paragraph);\
522make_lua_key(L, beginmath);\
523make_lua_key(L, beginbrokenmath);\
524make_lua_key(L, beginparagraph);\
525make_lua_key(L, belowdisplayshortskip);\
526make_lua_key(L, belowdisplayskip);\
527make_lua_key(L, bend_tolerance);\
528make_lua_key(L, bestinsert);\
529make_lua_key(L, bestpagebreak);\
530make_lua_key(L, bestsize);\
531make_lua_key(L, binary);\
532make_lua_key(L, boolean);\
533make_lua_key(L, bothflexible);\
534make_lua_key(L, bottom);\
535make_lua_key(L, bottomaccent);\
536make_lua_key(L, bottomaccentvariant);\
537make_lua_key(L, bottomanchor);\
538make_lua_key(L, bottomleft);\
539make_lua_key(L, bottomlevel);\
540make_lua_key(L, bottommargin);\
541make_lua_key(L, bottomovershoot);\
542make_lua_key(L, bottomright);\
543make_lua_key(L, bottomskip);\
544make_lua_key(L, boundary);\
545make_lua_key(L, box);\
546make_lua_key(L, box_property);\
547make_lua_key(L, broken);\
548make_lua_key(L, brokeninsert);\
549make_lua_key(L, brokenpenalty);\
550make_lua_key(L, brokenpenalties);\
551make_lua_key(L, bytecode);\
552make_lua_key(L, call);\
553make_lua_key(L, callback);\
554make_lua_key(L, cancel);\
555make_lua_key(L, cardinal);\
556make_lua_key(L, case_shift);\
557make_lua_key(L, catalog);\
558make_lua_key(L, Catalog);\
559make_lua_key(L, catcode_table);\
560make_lua_key(L, category);\
561make_lua_key(L, cell);\
562make_lua_key(L, center);\
563make_lua_key(L, char);\
564make_lua_key(L, char_given);\
565make_lua_key(L, char_number);\
566make_lua_key(L, character);\
567make_lua_key(L, characters);\
568make_lua_key(L, check);\
569make_lua_key(L, checks);\
570make_lua_key(L, choice);\
571make_lua_key(L, class);\
572make_lua_key(L, cleaders);\
573make_lua_key(L, close);\
574make_lua_key(L, clubpenalties);\
575make_lua_key(L, clubpenalty);\
576make_lua_key(L, cmd);\
577make_lua_key(L, cmdname);\
578make_lua_key(L, collapse);\
579make_lua_key(L, collect);\
580make_lua_key(L, combine_toks);\
581make_lua_key(L, command);\
582make_lua_key(L, comment);\
583make_lua_key(L, compactmath);\
584make_lua_key(L, compound);\
585make_lua_key(L, compression);\
586make_lua_key(L, condition);\
587make_lua_key(L, conditional);\
588make_lua_key(L, conditionalmathskip);\
589make_lua_key(L, connectoroverlapmin);\
590make_lua_key(L, constant);\
591make_lua_key(L, constant_call);\
592make_lua_key(L, container);\
593make_lua_key(L, continue);\
594make_lua_key(L, contributehead);\
595make_lua_key(L, control);\
596make_lua_key(L, convert);\
597make_lua_key(L, correctionskip);\
598make_lua_key(L, cost);\
599make_lua_key(L, count);\
600make_lua_key(L, cramped);\
601make_lua_key(L, crampeddisplay);\
602make_lua_key(L, crampedscript);\
603make_lua_key(L, crampedscriptscript);\
604make_lua_key(L, crampedtext);\
605make_lua_key(L, cs_name);\
606make_lua_key(L, csname);\
607make_lua_key(L, current);\
608make_lua_key(L, data);\
609make_lua_key(L, dbox);\
610make_lua_key(L, deep_frozen_dont_expand);\
611make_lua_key(L, deep_frozen_end_template);\
612make_lua_key(L, deep_frozen_keep_constant);\
613make_lua_key(L, def);\
614make_lua_key(L, deferred);\
615make_lua_key(L, define_char_code);\
616make_lua_key(L, define_family);\
617make_lua_key(L, define_font);\
618make_lua_key(L, define_lua_call);\
619make_lua_key(L, degree);\
620make_lua_key(L, degreevariant);\
621make_lua_key(L, delete);\
622make_lua_key(L, delimited);\
623make_lua_key(L, DelimitedSubFormulaMinHeight);\
624make_lua_key(L, delimiter);\
625make_lua_key(L, delimiter_number);\
626make_lua_key(L, delimiterextendmargin);\
627make_lua_key(L, DelimiterExtendMargin);\
628make_lua_key(L, delimiterover);\
629make_lua_key(L, delimiterovervariant);\
630make_lua_key(L, DelimiterDisplayPercent);\
631make_lua_key(L, DelimiterPercent);\
632make_lua_key(L, delimiterpercent);\
633make_lua_key(L, DelimiterDisplayShortfall);\
634make_lua_key(L, DelimiterShortfall);\
635make_lua_key(L, delimitershortfall);\
636make_lua_key(L, delimiterunder);\
637make_lua_key(L, delimiterundervariant);\
638make_lua_key(L, delta);\
639make_lua_key(L, demerits);\
640make_lua_key(L, denominator);\
641make_lua_key(L, denominatorvariant);\
642make_lua_key(L, depth);\
643make_lua_key(L, depthbefore);\
644make_lua_key(L, depthafter);\
645make_lua_key(L, designsize);\
646make_lua_key(L, dimension);\
647make_lua_key(L, dimension_reference);\
648make_lua_key(L, dir);\
649make_lua_key(L, direct);\
650make_lua_key(L, direction);\
651make_lua_key(L, directory);\
652make_lua_key(L, disc);\
653make_lua_key(L, discpart);\
654make_lua_key(L, discretionary);\
655make_lua_key(L, discretionarypenalty);\
656make_lua_key(L, display);\
657make_lua_key(L, DisplayOperatorMinHeight);\
658make_lua_key(L, displaywidowpenalties);\
659make_lua_key(L, displaywidowpenalty);\
660make_lua_key(L, doffset);\
661make_lua_key(L, doublehyphendemerits);\
662make_lua_key(L, doublesuperscript);\
663make_lua_key(L, emergencyextrastretch);\
664make_lua_key(L, emergencyleftskip);\
665make_lua_key(L, emergencyrightskip);\
666make_lua_key(L, emergencyshrink);\
667make_lua_key(L, emergencystretch);\
668make_lua_key(L, empty);\
669make_lua_key(L, end);\
670make_lua_key(L, endpartokens);\
671make_lua_key(L, end_cs_name);\
672make_lua_key(L, end_file);\
673make_lua_key(L, end_group);\
674make_lua_key(L, end_job);\
675make_lua_key(L, end_line);\
676make_lua_key(L, end_local);\
677make_lua_key(L, end_match);\
678make_lua_key(L, end_paragraph);\
679make_lua_key(L, end_template);\
680make_lua_key(L, endmath);\
681make_lua_key(L, endbrokenmath);\
682make_lua_key(L, equation);\
683make_lua_key(L, equation_number);\
684make_lua_key(L, equationnumber);\
685make_lua_key(L, equationnumberpenalty);\
686make_lua_key(L, escape);\
687make_lua_key(L, etex);\
688make_lua_key(L, exact);\
689make_lua_key(L, exactly);\
690make_lua_key(L, except);\
691make_lua_key(L, exdepth);\
692make_lua_key(L, exheight);\
693make_lua_key(L, expand_after);\
694make_lua_key(L, expandable);\
695make_lua_key(L, expanded);\
696make_lua_key(L, expansion);\
697make_lua_key(L, exhyphenpenalty);\
698make_lua_key(L, explicit);\
699make_lua_key(L, explicit_space);\
700make_lua_key(L, expression);\
701make_lua_key(L, extender);\
702make_lua_key(L, extensible);\
703make_lua_key(L, extra);\
704make_lua_key(L, extrahyphenpenalty);\
705make_lua_key(L, extraattr);\
706make_lua_key(L, extraspace);\
707make_lua_key(L, extrasubprescriptshift);\
708make_lua_key(L, extrasubprescriptspace);\
709make_lua_key(L, extrasubscriptshift);\
710make_lua_key(L, extrasubscriptspace);\
711make_lua_key(L, extrasuperprescriptshift);\
712make_lua_key(L, extrasuperprescriptspace);\
713make_lua_key(L, extrasuperscriptshift);\
714make_lua_key(L, extrasuperscriptspace);\
715make_lua_key(L, fam);\
716make_lua_key(L, fence);\
717make_lua_key(L, fenced);\
718make_lua_key(L, fi);\
719make_lua_key(L, fil);\
720make_lua_key(L, file);\
721make_lua_key(L, fill);\
722make_lua_key(L, filll);\
723make_lua_key(L, finalhyphendemerits);\
724make_lua_key(L, finalpenalty);\
725make_lua_key(L, finishrow);\
726make_lua_key(L, fireup);\
727make_lua_key(L, first);\
728make_lua_key(L, fitnessclasses);\
729make_lua_key(L, fixedboth);\
730make_lua_key(L, fixedbottom);\
731make_lua_key(L, fixedsuperandsubscript);\
732make_lua_key(L, fixedsuperorsubscript);\
733make_lua_key(L, fixedtop);\
734make_lua_key(L, flags);\
735make_lua_key(L, flataccent);\
736make_lua_key(L, FlattenedAccentBaseDepth);\
737make_lua_key(L, flattenedaccentbasedepth);\
738make_lua_key(L, FlattenedAccentBaseHeight);\
739make_lua_key(L, flattenedaccentbaseheight);\
740make_lua_key(L, FlattenedAccentBottomShiftDown);\
741make_lua_key(L, flattenedaccentbottomshiftdown);\
742make_lua_key(L, flattenedaccenttopshiftup);\
743make_lua_key(L, FlattenedAccentTopShiftUp);\
744make_lua_key(L, float);\
745make_lua_key(L, font);\
746make_lua_key(L, font_property);\
747make_lua_key(L, fontkern);\
748make_lua_key(L, fontspec);\
749make_lua_key(L, force);\
750make_lua_key(L, forcerulethickness);\
751make_lua_key(L, fraction);\
752make_lua_key(L, FractionDelimiterDisplayStyleSize);\
753make_lua_key(L, FractionDelimiterSize);\
754make_lua_key(L, fractiondelsize);\
755make_lua_key(L, fractiondenomdown);\
756make_lua_key(L, FractionDenominatorDisplayStyleGapMin);\
757make_lua_key(L, FractionDenominatorDisplayStyleShiftDown);\
758make_lua_key(L, FractionDenominatorGapMin);\
759make_lua_key(L, FractionDenominatorShiftDown);\
760make_lua_key(L, fractiondenomvgap);\
761make_lua_key(L, FractionNumeratorDisplayStyleGapMin);\
762make_lua_key(L, FractionNumeratorDisplayStyleShiftUp);\
763make_lua_key(L, FractionNumeratorGapMin);\
764make_lua_key(L, FractionNumeratorShiftUp);\
765make_lua_key(L, fractionnumup);\
766make_lua_key(L, fractionnumvgap);\
767make_lua_key(L, fractionrule);\
768make_lua_key(L, FractionRuleThickness);\
769make_lua_key(L, fractionvariant);\
770make_lua_key(L, frozen);\
771make_lua_key(L, function);\
772make_lua_key(L, geometry);\
773make_lua_key(L, get_mark);\
774make_lua_key(L, ghost);\
775make_lua_key(L, gleaders);\
776make_lua_key(L, global);\
777make_lua_key(L, glue);\
778make_lua_key(L, glueorder);\
779make_lua_key(L, glueset);\
780make_lua_key(L, gluesign);\
781make_lua_key(L, gluespec);\
782make_lua_key(L, glyph);\
783make_lua_key(L, group);\
784make_lua_key(L, h);\
785make_lua_key(L, halign);\
786make_lua_key(L, hangafter);\
787make_lua_key(L, hangindent);\
788make_lua_key(L, hbox);\
789make_lua_key(L, hdelimiter);\
790make_lua_key(L, head);\
791make_lua_key(L, height);\
792make_lua_key(L, hextensible);\
793make_lua_key(L, hextensiblevariant);\
794make_lua_key(L, hlist);\
795make_lua_key(L, hfactor);\
796make_lua_key(L, hmodepar);\
797make_lua_key(L, hmove);\
798make_lua_key(L, hoffset);\
799make_lua_key(L, holdhead);\
800make_lua_key(L, horizontal);\
801make_lua_key(L, horizontalmathkern);\
802make_lua_key(L, hrule);\
803make_lua_key(L, hsize);\
804make_lua_key(L, hskip);\
805make_lua_key(L, hyphenate);\
806make_lua_key(L, hyphenated);\
807make_lua_key(L, hyphenation);\
808make_lua_key(L, hyphenationmode);\
809make_lua_key(L, hyphenchar);\
810make_lua_key(L, hyphenpenalty);\
811make_lua_key(L, id);\
812make_lua_key(L, identifier);\
813make_lua_key(L, if_test);\
814make_lua_key(L, ifstack);\
815make_lua_key(L, ignore);\
816make_lua_key(L, ignore_something);\
817make_lua_key(L, ignored);\
818make_lua_key(L, image);\
819make_lua_key(L, immediate);\
820make_lua_key(L, immutable);\
821make_lua_key(L, indent);\
822make_lua_key(L, indentskip);\
823make_lua_key(L, index);\
824make_lua_key(L, Info);\
825make_lua_key(L, info);\
826make_lua_key(L, inherited);\
827make_lua_key(L, initialize);\
828make_lua_key(L, inner);\
829make_lua_key(L, innerlocation);\
830make_lua_key(L, innerxoffset);\
831make_lua_key(L, inneryoffset);\
832make_lua_key(L, input);\
833make_lua_key(L, insert);\
834make_lua_key(L, insertheights);\
835make_lua_key(L, insertpenalties);\
836make_lua_key(L, instance);\
837make_lua_key(L, integer);\
838make_lua_key(L, integer_reference);\
839make_lua_key(L, interaction);\
840make_lua_key(L, interlinepenalties);\
841make_lua_key(L, interlinepenalty);\
842make_lua_key(L, intermathskip);\
843make_lua_key(L, internal_attribute);\
844make_lua_key(L, internal_attribute_reference);\
845make_lua_key(L, internal_box_reference);\
846make_lua_key(L, internal_dimension);\
847make_lua_key(L, internal_dimension_reference);\
848make_lua_key(L, internal_glue);\
849make_lua_key(L, internal_glue_reference);\
850make_lua_key(L, internal_integer);\
851make_lua_key(L, internal_integer_reference);\
852make_lua_key(L, internal_muglue);\
853make_lua_key(L, internal_muglue_reference);\
854make_lua_key(L, internal_posit);\
855make_lua_key(L, internal_posit_reference);\
856make_lua_key(L, internal_toks);\
857make_lua_key(L, internal_toks_reference);\
858make_lua_key(L, internaldimension);\
859make_lua_key(L, internalgluespec);\
860make_lua_key(L, internalinteger);\
861make_lua_key(L, internalmugluespec);\
862make_lua_key(L, invalid_char);\
863make_lua_key(L, italic);\
864make_lua_key(L, italic_correction);\
865make_lua_key(L, italiccorrection);\
866make_lua_key(L, iterator_value);\
867make_lua_key(L, keepbase);\
868make_lua_key(L, kern);\
869make_lua_key(L, kerns);\
870make_lua_key(L, language);\
871make_lua_key(L, largechar);\
872make_lua_key(L, largefamily);\
873make_lua_key(L, last);\
874make_lua_key(L, lastinsert);\
875make_lua_key(L, lastlinefit);\
876make_lua_key(L, leader);\
877make_lua_key(L, leaders);\
878make_lua_key(L, leastpagecost);\
879make_lua_key(L, left);\
880make_lua_key(L, left_brace);\
881make_lua_key(L, leftboundary);\
882make_lua_key(L, leftbox);\
883make_lua_key(L, leftboxwidth);\
884make_lua_key(L, leftcorrectionkern);\
885make_lua_key(L, lefthangskip);\
886make_lua_key(L, leftmargin);\
887make_lua_key(L, leftmarginkern);\
888make_lua_key(L, leftmathslackkern);\
889make_lua_key(L, leftprotrusion);\
890make_lua_key(L, leftslack);\
891make_lua_key(L, leftskip);\
892make_lua_key(L, lefttoright);\
893make_lua_key(L, lefttwindemerits);\
894make_lua_key(L, legacy);\
895make_lua_key(L, leftclass);\
896make_lua_key(L, let);\
897make_lua_key(L, letter);\
898make_lua_key(L, level);\
899make_lua_key(L, lhmin);\
900make_lua_key(L, ligature);\
901make_lua_key(L, ligatures);\
902make_lua_key(L, limitabovebgap);\
903make_lua_key(L, limitabovekern);\
904make_lua_key(L, limitabovevgap);\
905make_lua_key(L, limitbelowbgap);\
906make_lua_key(L, limitbelowkern);\
907make_lua_key(L, limitbelowvgap);\
908make_lua_key(L, limits);\
909make_lua_key(L, line);\
910make_lua_key(L, linebreakchecks);\
911make_lua_key(L, linebreakoptional);\
912make_lua_key(L, linebreakpenalty);\
913make_lua_key(L, linedepth);\
914make_lua_key(L, lineheight);\
915make_lua_key(L, linepenalty);\
916make_lua_key(L, lineskip);\
917make_lua_key(L, lineskiplimit);\
918make_lua_key(L, list);\
919make_lua_key(L, lmtxexpression);\
920make_lua_key(L, local);\
921make_lua_key(L, local_box);\
922make_lua_key(L, localbox);\
923make_lua_key(L, localbreak);\
924make_lua_key(L, log);\
925make_lua_key(L, logfile);\
926make_lua_key(L, loopstate);\
927make_lua_key(L, looseness);\
928make_lua_key(L, LowerLimitBaselineDropMin);\
929make_lua_key(L, LowerLimitGapMin);\
930make_lua_key(L, lua);\
931make_lua_key(L, lua_call);\
932make_lua_key(L, lua_function_call);\
933make_lua_key(L, lua_local_call);\
934make_lua_key(L, lua_protected_call);\
935make_lua_key(L, lua_semiprotected_call);\
936make_lua_key(L, lua_value);\
937make_lua_key(L, luatex);\
938make_lua_key(L, macro);\
939make_lua_key(L, mainclass);\
940make_lua_key(L, make_box);\
941make_lua_key(L, mark);\
942make_lua_key(L, match);\
943make_lua_key(L, math);\
944make_lua_key(L, math_accent);\
945make_lua_key(L, math_char_number);\
946make_lua_key(L, math_choice);\
947make_lua_key(L, math_component);\
948make_lua_key(L, math_fence);\
949make_lua_key(L, math_fraction);\
950make_lua_key(L, math_modifier);\
951make_lua_key(L, math_parameter);\
952make_lua_key(L, math_radical);\
953make_lua_key(L, math_script);\
954make_lua_key(L, math_shift);\
955make_lua_key(L, math_shift_cs);\
956make_lua_key(L, math_style);\
957make_lua_key(L, mathchar);\
958make_lua_key(L, mathchoice);\
959make_lua_key(L, mathcomponent);\
960make_lua_key(L, MathConstants);\
961make_lua_key(L, mathcontrol);\
962make_lua_key(L, mathdir);\
963make_lua_key(L, mathdisplay);\
964make_lua_key(L, mathfence);\
965make_lua_key(L, mathfraction);\
966make_lua_key(L, mathinline);\
967make_lua_key(L, mathkern);\
968make_lua_key(L, mathkerns);\
969make_lua_key(L, MathLeading);\
970make_lua_key(L, mathnumber);\
971make_lua_key(L, mathoperator);\
972make_lua_key(L, mathpack);\
973make_lua_key(L, mathpenaltyfactor);\
974make_lua_key(L, mathpostpenalty);\
975make_lua_key(L, mathprepenalty);\
976make_lua_key(L, mathradical);\
977make_lua_key(L, mathshapekern);\
978make_lua_key(L, mathsimple);\
979make_lua_key(L, mathskip);\
980make_lua_key(L, mathspec);\
981make_lua_key(L, mathstack);\
982make_lua_key(L, mathstyle);\
983make_lua_key(L, mathscale);\
984make_lua_key(L, mathbegin);\
985make_lua_key(L, mathend);\
986make_lua_key(L, mathmode);\
987make_lua_key(L, mathflatten);\
988make_lua_key(L, mathmainstyle);\
989make_lua_key(L, mathparentstyle);\
990make_lua_key(L, mathsubformula);\
991make_lua_key(L, mathtext);\
992make_lua_key(L, mathtextchar);\
993make_lua_key(L, medmuskip);\
994make_lua_key(L, message);\
995make_lua_key(L, middle);\
996make_lua_key(L, middlebox);\
997make_lua_key(L, MinConnectorOverlap);\
998make_lua_key(L, mirror);\
999make_lua_key(L, mkern);\
1000make_lua_key(L, mode);\
1001make_lua_key(L, modeline);\
1002make_lua_key(L, modifier);\
1003make_lua_key(L, move);\
1004make_lua_key(L, move_tolerance);\
1005make_lua_key(L, mrule);\
1006make_lua_key(L, mskip);\
1007make_lua_key(L, muglue);\
1008make_lua_key(L, mugluespec);\
1009make_lua_key(L, mutable);\
1010make_lua_key(L, mvl);\
1011make_lua_key(L, name);\
1012make_lua_key(L, nepalty);\
1013make_lua_key(L, nestedlist);\
1014make_lua_key(L, nestingfactor);\
1015make_lua_key(L, new);\
1016make_lua_key(L, next);\
1017make_lua_key(L, nil);\
1018make_lua_key(L, no);\
1019make_lua_key(L, no_expand);\
1020make_lua_key(L, noad);\
1021make_lua_key(L, noadstate);\
1022make_lua_key(L, noalign);\
1023make_lua_key(L, noaligned);\
1024make_lua_key(L, node);\
1025make_lua_key(L, nodelist);\
1026make_lua_key(L, noindent);\
1027make_lua_key(L, NoLimitSubFactor);\
1028make_lua_key(L, nolimitsubfactor);\
1029make_lua_key(L, nolimitsupfactor);\
1030make_lua_key(L, NoLimitSupFactor);\
1031make_lua_key(L, nomath);\
1032make_lua_key(L, none);\
1033make_lua_key(L, normal);\
1034make_lua_key(L, norule);\
1035make_lua_key(L, nucleus);\
1036make_lua_key(L, number);\
1037make_lua_key(L, numerator);\
1038make_lua_key(L, numeratorvariant);\
1039make_lua_key(L, off);\
1040make_lua_key(L, on);\
1041make_lua_key(L, open);\
1042make_lua_key(L, operator);\
1043make_lua_key(L, operatorsize);\
1044make_lua_key(L, optional);\
1045make_lua_key(L, options);\
1046make_lua_key(L, ordinary);\
1047make_lua_key(L, orientation);\
1048make_lua_key(L, original);\
1049make_lua_key(L, orphanlinefactors);\
1050make_lua_key(L, orphanpenalties);\
1051make_lua_key(L, orphanpenalty);\
1052make_lua_key(L, other_char);\
1053make_lua_key(L, outline);\
1054make_lua_key(L, output);\
1055make_lua_key(L, over);\
1056make_lua_key(L, OverbarExtraAscender);\
1057make_lua_key(L, overbarkern);\
1058make_lua_key(L, overbarrule);\
1059make_lua_key(L, OverbarRuleThickness);\
1060make_lua_key(L, OverbarVerticalGap);\
1061make_lua_key(L, overbarvgap);\
1062make_lua_key(L, overdelimiter);\
1063make_lua_key(L, overdelimiterbgap);\
1064make_lua_key(L, overdelimitervariant);\
1065make_lua_key(L, overdelimitervgap);\
1066make_lua_key(L, overlayaccent);\
1067make_lua_key(L, overlayaccentvariant);\
1068make_lua_key(L, overlinevariant);\
1069make_lua_key(L, overloaded);\
1070make_lua_key(L, package);\
1071make_lua_key(L, packing);\
1072make_lua_key(L, page);\
1073make_lua_key(L, page_property);\
1074make_lua_key(L, pagediscardshead);\
1075make_lua_key(L, pagehead);\
1076make_lua_key(L, pageinserthead);\
1077make_lua_key(L, pages);\
1078make_lua_key(L, Pages);\
1079make_lua_key(L, par);\
1080make_lua_key(L, parameter);\
1081make_lua_key(L, parameter_reference);\
1082make_lua_key(L, parameters);\
1083make_lua_key(L, parfillleftskip);\
1084make_lua_key(L, parfillrightskip);\
1085make_lua_key(L, parfillskip);\
1086make_lua_key(L, parindent);\
1087make_lua_key(L, parinitleftskip);\
1088make_lua_key(L, parinitrightskip);\
1089make_lua_key(L, parpasses);\
1090make_lua_key(L, parshape);\
1091make_lua_key(L, parskip);\
1092make_lua_key(L, parts);\
1093make_lua_key(L, partsitalic);\
1094make_lua_key(L, partsorientation);\
1095make_lua_key(L, passes);\
1096make_lua_key(L, passive);\
1097make_lua_key(L, pdfe);\
1098make_lua_key(L, penalty);\
1099make_lua_key(L, permanent);\
1100make_lua_key(L, phantom);\
1101make_lua_key(L, posit);\
1102make_lua_key(L, post);\
1103make_lua_key(L, post_linebreak);\
1104make_lua_key(L, postadjust);\
1105make_lua_key(L, postadjusthead);\
1106make_lua_key(L, postmigrate);\
1107make_lua_key(L, postmigratehead);\
1108make_lua_key(L, pre);\
1109make_lua_key(L, pre_align);\
1110make_lua_key(L, preadjust);\
1111make_lua_key(L, preadjusthead);\
1112make_lua_key(L, preamble);\
1113make_lua_key(L, prebox);\
1114make_lua_key(L, prefix);\
1115make_lua_key(L, premigrate);\
1116make_lua_key(L, premigratehead);\
1117make_lua_key(L, prepostsup);\
1118make_lua_key(L, prepostsub);\
1119make_lua_key(L, preroll);\
1120make_lua_key(L, presub);\
1121make_lua_key(L, presubscriptshiftdistance);\
1122make_lua_key(L, presup);\
1123make_lua_key(L, presuperscriptshiftdistance);\
1124make_lua_key(L, pretolerance);\
1125make_lua_key(L, prev);\
1126make_lua_key(L, prevdepth);\
1127make_lua_key(L, prevgraf);\
1128make_lua_key(L, prime);\
1129make_lua_key(L, PrimeBaselineDropMax);\
1130make_lua_key(L, primeraise);\
1131make_lua_key(L, primeraisecomposed);\
1132make_lua_key(L, PrimeRaiseComposedPercent);\
1133make_lua_key(L, PrimeRaisePercent);\
1134make_lua_key(L, primeshift);\
1135make_lua_key(L, primeshiftdrop);\
1136make_lua_key(L, primeshiftup);\
1137make_lua_key(L, PrimeShiftUp);\
1138make_lua_key(L, PrimeShiftUpCramped);\
1139make_lua_key(L, primespaceafter);\
1140make_lua_key(L, PrimeSpaceAfter);\
1141make_lua_key(L, primevariant);\
1142make_lua_key(L, primewidth);\
1143make_lua_key(L, PrimeWidthPercent);\
1144make_lua_key(L, primitive);\
1145make_lua_key(L, properties);\
1146make_lua_key(L, protected);\
1147make_lua_key(L, protected_call);\
1148make_lua_key(L, protrudechars);\
1149make_lua_key(L, protrusion);\
1150make_lua_key(L, ptr);\
1151make_lua_key(L, punctuation);\
1152make_lua_key(L, quad);\
1153make_lua_key(L, quit);\
1154make_lua_key(L, radical);\
1155make_lua_key(L, radicaldegreeafter);\
1156make_lua_key(L, radicaldegreebefore);\
1157make_lua_key(L, RadicalDegreeBottomRaisePercent);\
1158make_lua_key(L, radicaldegreeraise);\
1159make_lua_key(L, RadicalDisplayStyleVerticalGap);\
1160make_lua_key(L, radicalextensibleafter);\
1161make_lua_key(L, radicalextensiblebefore);\
1162make_lua_key(L, RadicalExtraAscender);\
1163make_lua_key(L, radicalkern);\
1164make_lua_key(L, RadicalKernAfterDegree);\
1165make_lua_key(L, RadicalKernAfterExtensible);\
1166make_lua_key(L, RadicalKernBeforeDegree);\
1167make_lua_key(L, RadicalKernBeforeExtensible);\
1168make_lua_key(L, radicalrule);\
1169make_lua_key(L, RadicalRuleThickness);\
1170make_lua_key(L, radicalvariant);\
1171make_lua_key(L, RadicalVerticalGap);\
1172make_lua_key(L, radicalvgap);\
1173make_lua_key(L, raise);\
1174make_lua_key(L, reader);\
1175make_lua_key(L, register);\
1176make_lua_key(L, register_attribute);\
1177make_lua_key(L, register_attribute_reference);\
1178make_lua_key(L, register_box);\
1179make_lua_key(L, register_box_reference);\
1180make_lua_key(L, register_dimension);\
1181make_lua_key(L, register_dimension_reference);\
1182make_lua_key(L, register_glue);\
1183make_lua_key(L, register_glue_reference);\
1184make_lua_key(L, register_integer);\
1185make_lua_key(L, register_integer_reference);\
1186make_lua_key(L, register_muglue);\
1187make_lua_key(L, register_muglue_reference);\
1188make_lua_key(L, register_posit);\
1189make_lua_key(L, register_posit_reference);\
1190make_lua_key(L, register_toks);\
1191make_lua_key(L, register_toks_reference);\
1192make_lua_key(L, registerdimension);\
1193make_lua_key(L, registergluespec);\
1194make_lua_key(L, registerinteger);\
1195make_lua_key(L, registermugluespec);\
1196make_lua_key(L, regular);\
1197make_lua_key(L, relation);\
1198make_lua_key(L, relax);\
1199make_lua_key(L, remove_item);\
1200make_lua_key(L, repeat);\
1201make_lua_key(L, rpnexpression);\
1202make_lua_key(L, replace);\
1203make_lua_key(L, report);\
1204make_lua_key(L, reserved);\
1205make_lua_key(L, reset);\
1206make_lua_key(L, rhmin);\
1207make_lua_key(L, right);\
1208make_lua_key(L, right_brace);\
1209make_lua_key(L, rightboundary);\
1210make_lua_key(L, rightbox);\
1211make_lua_key(L, rightboxwidth);\
1212make_lua_key(L, rightclass);\
1213make_lua_key(L, rightcorrectionkern);\
1214make_lua_key(L, righthangskip);\
1215make_lua_key(L, rightmargin);\
1216make_lua_key(L, rightmarginkern);\
1217make_lua_key(L, rightmathslackkern);\
1218make_lua_key(L, rightprotrusion);\
1219make_lua_key(L, rightslack);\
1220make_lua_key(L, rightskip);\
1221make_lua_key(L, righttoleft);\
1222make_lua_key(L, righttwindemerits);\
1223make_lua_key(L, root);\
1224make_lua_key(L, rooted);\
1225make_lua_key(L, rule);\
1226make_lua_key(L, rulebasedmathskip);\
1227make_lua_key(L, ruledepth);\
1228make_lua_key(L, ruleheight);\
1229make_lua_key(L, same);\
1230make_lua_key(L, saved);\
1231make_lua_key(L, scale);\
1232make_lua_key(L, script);\
1233make_lua_key(L, scriptkern);\
1234make_lua_key(L, scriptorder);\
1235make_lua_key(L, ScriptPercentScaleDown);\
1236make_lua_key(L, scripts);\
1237make_lua_key(L, scriptscale);\
1238make_lua_key(L, scriptstate);\
1239make_lua_key(L, scriptxscale);\
1240make_lua_key(L, scriptyscale);\
1241make_lua_key(L, scriptweight);\
1242make_lua_key(L, scriptscript);\
1243make_lua_key(L, ScriptScriptPercentScaleDown);\
1244make_lua_key(L, scriptscriptscale);\
1245make_lua_key(L, scriptscriptxscale);\
1246make_lua_key(L, scriptscriptyscale);\
1247make_lua_key(L, scriptscriptweight);\
1248make_lua_key(L, second);\
1249make_lua_key(L, semi_protected_call);\
1250make_lua_key(L, semiprotected);\
1251make_lua_key(L, semisimple);\
1252make_lua_key(L, set);\
1253make_lua_key(L, set_box);\
1254make_lua_key(L, set_font);\
1255make_lua_key(L, sffactor);\
1256make_lua_key(L, sfstretchfactor);\
1257make_lua_key(L, shape);\
1258make_lua_key(L, shapingpenaltiesmode);\
1259make_lua_key(L, shapingpenalty);\
1260make_lua_key(L, shift);\
1261make_lua_key(L, shorthand_def);\
1262make_lua_key(L, shrink);\
1263make_lua_key(L, shrinkorder);\
1264make_lua_key(L, sign);\
1265make_lua_key(L, simple);\
1266make_lua_key(L, single);\
1267make_lua_key(L, singlelinepenalty);\
1268make_lua_key(L, size);\
1269make_lua_key(L, skewchar);\
1270make_lua_key(L, skewed);\
1271make_lua_key(L, SkewedDelimiterTolerance);\
1272make_lua_key(L, skeweddelimitertolerance);\
1273make_lua_key(L, skewedfractionhgap);\
1274make_lua_key(L, SkewedFractionHorizontalGap);\
1275make_lua_key(L, SkewedFractionVerticalGap);\
1276make_lua_key(L, skewedfractionvgap);\
1277make_lua_key(L, skip);\
1278make_lua_key(L, slant);\
1279make_lua_key(L, small);\
1280make_lua_key(L, smallchar);\
1281make_lua_key(L, smaller);\
1282make_lua_key(L, smallfamily);\
1283make_lua_key(L, some_item);\
1284make_lua_key(L, source);\
1285make_lua_key(L, space);\
1286make_lua_key(L, SpaceAfterScript);\
1287make_lua_key(L, spaceafterscript);\
1288make_lua_key(L, spacebeforescript);\
1289make_lua_key(L, spacebetweenscript);\
1290make_lua_key(L, SpaceBeforeScript);\
1291make_lua_key(L, SpaceBetweenScript);\
1292make_lua_key(L, spacefactor);\
1293make_lua_key(L, spacefontkern);\
1294make_lua_key(L, spacer);\
1295make_lua_key(L, spaceshrink);\
1296make_lua_key(L, spaceskip);\
1297make_lua_key(L, spacestretch);\
1298make_lua_key(L, spacing);\
1299make_lua_key(L, span);\
1300make_lua_key(L, spec);\
1301make_lua_key(L, specification);\
1302make_lua_key(L, specificationspec);\
1303make_lua_key(L, specification_reference);\
1304make_lua_key(L, split);\
1305make_lua_key(L, split_insert);\
1306make_lua_key(L, splitbottom);\
1307make_lua_key(L, splitdiscardshead);\
1308make_lua_key(L, splitfirst);\
1309make_lua_key(L, splitkeep);\
1310make_lua_key(L, splitoff);\
1311make_lua_key(L, splittopskip);\
1312make_lua_key(L, stack);\
1313make_lua_key(L, StackBottomDisplayStyleShiftDown);\
1314make_lua_key(L, StackBottomShiftDown);\
1315make_lua_key(L, stackdenomdown);\
1316make_lua_key(L, StackDisplayStyleGapMin);\
1317make_lua_key(L, StackGapMin);\
1318make_lua_key(L, stacknumup);\
1319make_lua_key(L, StackTopDisplayStyleShiftUp);\
1320make_lua_key(L, StackTopShiftUp);\
1321make_lua_key(L, stackvariant);\
1322make_lua_key(L, stackvgap);\
1323make_lua_key(L, start);\
1324make_lua_key(L, state);\
1325make_lua_key(L, step);\
1326make_lua_key(L, stop);\
1327make_lua_key(L, stretch);\
1328make_lua_key(L, stretched);\
1329make_lua_key(L, stretchorder);\
1330make_lua_key(L, StretchStackBottomShiftDown);\
1331make_lua_key(L, StretchStackGapAboveMin);\
1332make_lua_key(L, StretchStackGapBelowMin);\
1333make_lua_key(L, StretchStackTopShiftUp);\
1334make_lua_key(L, string);\
1335make_lua_key(L, strut);\
1336make_lua_key(L, style);\
1337make_lua_key(L, sub);\
1338make_lua_key(L, subbox);\
1339make_lua_key(L, submlist);\
1340make_lua_key(L, subpre);\
1341make_lua_key(L, subscript);\
1342make_lua_key(L, subshift);\
1343make_lua_key(L, SubscriptBaselineDropMin);\
1344make_lua_key(L, subscriptshiftdistance);\
1345make_lua_key(L, SubscriptShiftDown);\
1346make_lua_key(L, SubscriptShiftDownWithSuperscript);\
1347make_lua_key(L, SubscriptTopMax);\
1348make_lua_key(L, SubscriptSnap);\
1349make_lua_key(L, subscriptsnap);\
1350make_lua_key(L, subscriptvariant);\
1351make_lua_key(L, subshiftdown);\
1352make_lua_key(L, subshiftdrop);\
1353make_lua_key(L, substitute);\
1354make_lua_key(L, SubSuperscriptGapMin);\
1355make_lua_key(L, subsupshiftdown);\
1356make_lua_key(L, subsupvgap);\
1357make_lua_key(L, subtopmax);\
1358make_lua_key(L, subtype);\
1359make_lua_key(L, sup);\
1360make_lua_key(L, supbottommin);\
1361make_lua_key(L, superscript);\
1362make_lua_key(L, SuperscriptBaselineDropMax);\
1363make_lua_key(L, SuperscriptBottomMaxWithSubscript);\
1364make_lua_key(L, SuperscriptBottomMin);\
1365make_lua_key(L, superscriptshiftdistance);\
1366make_lua_key(L, SuperscriptShiftUp);\
1367make_lua_key(L, SuperscriptShiftUpCramped);\
1368make_lua_key(L, SuperscriptSnap);\
1369make_lua_key(L, superscriptsnap);\
1370make_lua_key(L, superscriptvariant);\
1371make_lua_key(L, suppre);\
1372make_lua_key(L, supshift);\
1373make_lua_key(L, supshiftdrop);\
1374make_lua_key(L, supshiftup);\
1375make_lua_key(L, supsubbottommax);\
1376make_lua_key(L, surround);\
1377make_lua_key(L, syllable);\
1378make_lua_key(L, tabskip);\
1379make_lua_key(L, tag);\
1380make_lua_key(L, tail);\
1381make_lua_key(L, target);\
1382make_lua_key(L, temp);\
1383make_lua_key(L, temphead);\
1384make_lua_key(L, terminal);\
1385make_lua_key(L, terminal_and_logfile);\
1386make_lua_key(L, tex);\
1387make_lua_key(L, tex_nest);\
1388make_lua_key(L, text);\
1389make_lua_key(L, textcontrol);\
1390make_lua_key(L, textscale);\
1391make_lua_key(L, textxscale);\
1392make_lua_key(L, textyscale);\
1393make_lua_key(L, textweight);\
1394make_lua_key(L, the);\
1395make_lua_key(L, thickmuskip);\
1396make_lua_key(L, thickness);\
1397make_lua_key(L, thinmuskip);\
1398make_lua_key(L, toddlerpenalty);\
1399make_lua_key(L, toddlerpenalties);\
1400make_lua_key(L, tok);\
1401make_lua_key(L, token);\
1402make_lua_key(L, tokenlist);\
1403make_lua_key(L, tolerance);\
1404make_lua_key(L, tolerant);\
1405make_lua_key(L, tolerant_call);\
1406make_lua_key(L, tolerant_protected_call);\
1407make_lua_key(L, tolerant_semi_protected_call);\
1408make_lua_key(L, top);\
1409make_lua_key(L, topaccent);\
1410make_lua_key(L, topaccentvariant);\
1411make_lua_key(L, topanchor);\
1412make_lua_key(L, topleft);\
1413make_lua_key(L, topmargin);\
1414make_lua_key(L, topovershoot);\
1415make_lua_key(L, topright);\
1416make_lua_key(L, topskip);\
1417make_lua_key(L, total);\
1418make_lua_key(L, tracingbalancing);\
1419make_lua_key(L, tracingparagraphs);\
1420make_lua_key(L, tracingpasses);\
1421make_lua_key(L, tracingfitness);\
1422make_lua_key(L, trailer);\
1423make_lua_key(L, Trailer);\
1424make_lua_key(L, triggered);\
1425make_lua_key(L, type);\
1426make_lua_key(L, uchyph);\
1427make_lua_key(L, uleaders);\
1428make_lua_key(L, un_hbox);\
1429make_lua_key(L, un_vbox);\
1430make_lua_key(L, undefined_cs);\
1431make_lua_key(L, under);\
1432make_lua_key(L, UnderbarExtraDescender);\
1433make_lua_key(L, underbarkern);\
1434make_lua_key(L, underbarrule);\
1435make_lua_key(L, UnderbarRuleThickness);\
1436make_lua_key(L, UnderbarVerticalGap);\
1437make_lua_key(L, underbarvgap);\
1438make_lua_key(L, underdelimiter);\
1439make_lua_key(L, underdelimiterbgap);\
1440make_lua_key(L, underdelimitervariant);\
1441make_lua_key(L, underdelimitervgap);\
1442make_lua_key(L, underlinevariant);\
1443make_lua_key(L, unhbox);\
1444make_lua_key(L, unhyphenated);\
1445make_lua_key(L, unit_reference);\
1446make_lua_key(L, unknown);\
1447make_lua_key(L, unset);\
1448make_lua_key(L, untraced);\
1449make_lua_key(L, unvbox);\
1450make_lua_key(L, uppercase);\
1451make_lua_key(L, UpperLimitBaselineRiseMin);\
1452make_lua_key(L, UpperLimitGapMin);\
1453make_lua_key(L, user);\
1454make_lua_key(L, userkern);\
1455make_lua_key(L, userpenalty);\
1456make_lua_key(L, userskip);\
1457make_lua_key(L, v);\
1458make_lua_key(L, vadjust);\
1459make_lua_key(L, valign);\
1460make_lua_key(L, value);\
1461make_lua_key(L, variable);\
1462make_lua_key(L, variant);\
1463make_lua_key(L, vbox);\
1464make_lua_key(L, vcenter);\
1465make_lua_key(L, vdelimiter);\
1466make_lua_key(L, vertical);\
1467make_lua_key(L, verticalmathkern);\
1468make_lua_key(L, vextensible);\
1469make_lua_key(L, vextensiblevariant);\
1470make_lua_key(L, vfactor);\
1471make_lua_key(L, virtual);\
1472make_lua_key(L, vlist);\
1473make_lua_key(L, vmode);\
1474make_lua_key(L, vmodepar);\
1475make_lua_key(L, vmove);\
1476make_lua_key(L, void);\
1477make_lua_key(L, vrule);\
1478make_lua_key(L, vsize);\
1479make_lua_key(L, vskip);\
1480make_lua_key(L, vtop);\
1481make_lua_key(L, whatsit);\
1482make_lua_key(L, widowpenalties);\
1483make_lua_key(L, widowpenalty);\
1484make_lua_key(L, width);\
1485make_lua_key(L, weight);\
1486make_lua_key(L, woffset);\
1487make_lua_key(L, word);\
1488make_lua_key(L, wordpenalty);\
1489make_lua_key(L, wrapup);\
1490make_lua_key(L, xheight);\
1491make_lua_key(L, xleaders);\
1492make_lua_key(L, xoffset);\
1493make_lua_key(L, xray);\
1494make_lua_key(L, xscale);\
1495make_lua_key(L, xspaceskip);\
1496make_lua_key(L, yoffset);\
1497make_lua_key(L, yscale);\
1498make_lua_key(L, zerospaceskip);\
1499make_lua_key_alias(L, empty_string,             "");\
1500/* */ \
1501make_lua_key_alias(L, node_instance,            NODE_METATABLE_INSTANCE);\
1502make_lua_key_alias(L, node_properties,          NODE_PROPERTIES_DIRECT);\
1503make_lua_key_alias(L, node_properties_indirect, NODE_PROPERTIES_INDIRECT);\
1504/* */ \
1505make_lua_key_alias(L, token_instance,           TOKEN_METATABLE_INSTANCE);\
1506make_lua_key_alias(L, token_package,            TOKEN_METATABLE_PACKAGE);\
1507/* */ \
1508make_lua_key_alias(L, sparse_instance,          SPARSE_METATABLE_INSTANCE);\
1509/* */ \
1510make_lua_key_alias(L, pdfe_instance,            PDFE_METATABLE_INSTANCE);\
1511make_lua_key_alias(L, pdfe_dictionary_instance, PDFE_METATABLE_DICTIONARY);\
1512make_lua_key_alias(L, pdfe_array_instance,      PDFE_METATABLE_ARRAY);\
1513make_lua_key_alias(L, pdfe_stream_instance,     PDFE_METATABLE_STREAM);\
1514make_lua_key_alias(L, pdfe_reference_instance,  PDFE_METATABLE_REFERENCE);\
1515/* */ \
1516make_lua_key_alias(L, file_handle_instance,     LUA_FILEHANDLE);\
1517/* */ \
1518make_lua_key_alias(L, string_buffer_instance,   STRING_BUFFER_INSTANCE);\
1519/* done */
1520
1521# define declare_metapost_lua_keys(L) \
1522/* */\
1523/*          (L, close); */\
1524make_lua_key(L, color);\
1525make_lua_key(L, curl);\
1526make_lua_key(L, curled);\
1527make_lua_key(L, curved);\
1528make_lua_key(L, curvature);\
1529make_lua_key(L, cycle);\
1530make_lua_key(L, dash);\
1531make_lua_key(L, dashes);\
1532/*          (L, depth); */\
1533make_lua_key(L, direction_x);\
1534make_lua_key(L, direction_y);\
1535make_lua_key(L, elliptical);\
1536make_lua_key(L, end_cycle);\
1537make_lua_key(L, endpoint);\
1538make_lua_key(L, error);\
1539make_lua_key(L, error_line);\
1540/*          (L, explicit); */\
1541make_lua_key(L, fig);\
1542/*          (L, fill); */\
1543make_lua_key(L, find_file);\
1544/*          (L, font); */\
1545make_lua_key(L, given);\
1546make_lua_key(L, halt_on_error);\
1547make_lua_key(L, hash);\
1548/*          (L, height); */\
1549make_lua_key(L, htap);\
1550/*          (L, interaction);*/\
1551make_lua_key(L, internals);\
1552make_lua_key(L, job_name);\
1553make_lua_key(L, knots);\
1554make_lua_key(L, left_curl);\
1555make_lua_key(L, left_tension);\
1556make_lua_key(L, left_type);\
1557make_lua_key(L, left_x);\
1558make_lua_key(L, left_y);\
1559make_lua_key(L, linecap);\
1560make_lua_key(L, linejoin);\
1561make_lua_key(L, make_text);\
1562make_lua_key(L, math_mode);\
1563make_lua_key(L, memory);\
1564make_lua_key(L, miterlimit);\
1565make_lua_key(L, nodes);\
1566make_lua_key(L, offset);\
1567/*          (L, open); */\
1568make_lua_key(L, open_file);\
1569/*          (L, outline); */\
1570make_lua_key(L, pairs);\
1571make_lua_key(L, path);\
1572make_lua_key(L, pen);\
1573make_lua_key(L, postscript);\
1574make_lua_key(L, prescript);\
1575make_lua_key(L, primary);\
1576make_lua_key(L, print_line);\
1577make_lua_key(L, random_seed);\
1578/*          (L, reader); */\
1579make_lua_key(L, restore);\
1580make_lua_key(L, right_curl);\
1581make_lua_key(L, right_tension);\
1582make_lua_key(L, right_type);\
1583make_lua_key(L, right_x);\
1584make_lua_key(L, right_y);\
1585make_lua_key(L, run_error);\
1586make_lua_key(L, run_internal);\
1587make_lua_key(L, run_logger);\
1588make_lua_key(L, run_overload);\
1589make_lua_key(L, run_script);\
1590make_lua_key(L, run_warning);\
1591make_lua_key(L, rx);\
1592make_lua_key(L, ry);\
1593make_lua_key(L, save);\
1594make_lua_key(L, secondary);\
1595make_lua_key(L, show_mode);\
1596make_lua_key(L, stacking);\
1597make_lua_key(L, start_bounds);\
1598make_lua_key(L, start_clip);\
1599make_lua_key(L, start_group);\
1600make_lua_key(L, status);\
1601make_lua_key(L, stop_bounds);\
1602make_lua_key(L, stop_clip);\
1603make_lua_key(L, stop_group);\
1604make_lua_key(L, strings);\
1605make_lua_key(L, sx);\
1606make_lua_key(L, sy);\
1607make_lua_key(L, symbols);\
1608make_lua_key(L, tertiary);\
1609/*          (L, text); */\
1610make_lua_key(L, text_mode);\
1611make_lua_key(L, tokens);\
1612make_lua_key(L, transform);\
1613make_lua_key(L, tx);\
1614make_lua_key(L, ty);\
1615/*          (L, type); */\
1616make_lua_key(L, utf8_mode);\
1617make_lua_key(L, warning);\
1618/*          (L, width); */\
1619make_lua_key(L, writer);\
1620make_lua_key(L, x_coord);\
1621make_lua_key(L, y_coord);\
1622/* */\
1623make_lua_key_alias(L, mplib_instance, MP_METATABLE_INSTANCE);\
1624make_lua_key_alias(L, mplib_figure,   MP_METATABLE_FIGURE);\
1625make_lua_key_alias(L, mplib_object,   MP_METATABLE_OBJECT);\
1626/* done */
1627
1628/*tex
1629    We want them properly aligned so we put pointers and indices in blocks.
1630*/
1631
1632typedef struct lmt_keys {
1633# undef make_lua_key
1634# undef make_lua_key_alias
1635# define make_lua_key       make_lua_key_ptr
1636# define make_lua_key_alias make_lua_key_ptr_alias
1637declare_shared_lua_keys(NULL)
1638declare_metapost_lua_keys(NULL)
1639# undef make_lua_key
1640# undef make_lua_key_alias
1641# define make_lua_key       make_lua_key_idx
1642# define make_lua_key_alias make_lua_key_idx_alias
1643declare_shared_lua_keys(NULL)
1644declare_metapost_lua_keys(NULL)
1645# undef make_lua_key
1646# undef make_lua_key_alias
1647} lmt_keys_info ;
1648
1649extern lmt_keys_info lmt_keys;
1650
1651# define make_lua_key       init_lua_key
1652# define make_lua_key_alias init_lua_key_alias
1653
1654# define lmt_initialize_shared_keys    declare_shared_lua_keys
1655# define lmt_initialize_metapost_keys  declare_metapost_lua_keys
1656
1657/*tex
1658
1659    We use round from |math.h| because when in a macro we check for sign we (depending on
1660    optimization) can fetch numbers multiple times. I need to measure this a bit more as inlining
1661    looks a bit faster on for instance |experiment.tex| but of course the bin becomes (some 10K)
1662    larger.
1663
1664*/
1665
1666//define lmt_rounded(d)            (lua_Integer) (round(d))
1667//define lmt_roundedfloat(f)       (lua_Integer) (round((double) f))
1668
1669# define lmt_rounded(d)            (lua_Integer) (llround(d))
1670# define lmt_roundedfloat(f)       (lua_Integer) (llround((double) f))
1671
1672# define lmt_tolong(L,i)           (long)        lua_tointeger(L,i)
1673# define lmt_checklong(L,i)        (long)        luaL_checkinteger(L,i)
1674# define lmt_optlong(L,i,j)        (long)        luaL_optinteger(L,i,j)
1675
1676# define lmt_tointeger(L,i)        (int)          lua_tointeger(L,i)
1677# define lmt_checkinteger(L,i)     (int)          luaL_checkinteger(L,i)
1678# define lmt_optinteger(L,i,j)     (int)          luaL_optinteger(L,i,j)
1679
1680# define lmt_tounsigned(L,i)       (unsigned int) lua_tointeger(L,i)
1681# define lmt_checkinteger(L,i)     (int)          luaL_checkinteger(L,i)
1682# define lmt_optunsigned(L,i,j)    (unsigned int) luaL_optinteger(L,i,j)
1683
1684# define lmt_tosizet(L,i)          (size_t)       lua_tointeger(L,i)
1685# define lmt_checksizet(L,i)       (size_t)       luaL_checkinteger(L,i)
1686# define lmt_optsizet(L,i,j)       (size_t)       luaL_optinteger(L,i,j)
1687                                                  
1688# define lmt_tohalfword(L,i)       (halfword)     lua_tointeger(L,i)
1689# define lmt_checkhalfword(L,i)    (halfword)     luaL_checkinteger(L,i)
1690# define lmt_opthalfword(L,i,j)    (halfword)     luaL_optinteger(L,i,j)
1691                                                  
1692# define lmt_tofullword(L,i)       (fullword)     lua_tointeger(L,i)
1693# define lmt_checkfullword(L,i)    (fullword)     luaL_checkinteger(L,i)
1694# define lmt_optfullword(L,i,j)    (fullword)     luaL_optinteger(L,i,j)
1695                                                  
1696# define lmt_toscaled(L,i)         (scaled)       lua_tointeger(L,i)
1697# define lmt_checkscaled(L,i)      (scaled)       luaL_checkinteger(L,i)
1698# define lmt_optscaled(L,i,j)      (scaled)       luaL_optinteger(L,i,j)
1699                                                  
1700# define lmt_toquarterword(L,i)    (quarterword)  lua_tointeger(L,i)
1701# define lmt_checkquarterword(L,i) (quarterword)  luaL_checkinteger(L,i)
1702# define lmt_optquarterword(L,i,j) (quarterword)  luaL_optinteger(L,i,j)
1703                                                  
1704# define lmt_tosingleword(L,i)     (singleword)   lua_tointeger(L,i)
1705# define lmt_checksingleword(L,i)  (singleword)   luaL_checkinteger(L,i)
1706# define lmt_optsingleword(L,i,j)  (singleword)   luaL_optinteger(L,i,j)
1707
1708# undef lround
1709# include <math.h>
1710
1711static inline int lmt_roundnumber(lua_State *L, int i)
1712{
1713    double n = lua_tonumber(L, i);
1714    return n == 0.0 ? 0 : lround(n);
1715}
1716
1717static inline unsigned int lmt_uroundnumber(lua_State *L, int i)
1718{
1719    double n = lua_tonumber(L, i);
1720    return n == 0.0 ? 0 : (unsigned int) lround(n);
1721}
1722
1723static inline int lmt_optroundnumber(lua_State *L, int i, int dflt)
1724{
1725    double n = luaL_optnumber(L, i, dflt);
1726    return n == 0.0 ? 0 : lround(n);
1727}
1728
1729static inline int lmt_opturoundnumber(lua_State *L, int i, int dflt)
1730{
1731    double n = luaL_optnumber(L, i, dflt);
1732    return n == 0.0 ? 0 : (unsigned int) lround(n);
1733}
1734
1735static inline double lmt_number_from_table(lua_State *L, int i, int j, lua_Number d)
1736{
1737    double n;
1738    lua_rawgeti(L, i, j);
1739    n = luaL_optnumber(L, -1, d);
1740    lua_pop(L, 1);
1741    return n;
1742}
1743
1744extern void lmt_initialize_interface(void);
1745
1746# define lmt_toroundnumber  lmt_roundnumber
1747# define lmt_touroundnumber lmt_uroundnumber
1748
1749static inline void lua_set_string_by_key(lua_State *L, const char *a, const char *b)
1750{
1751    lua_pushstring(L, b ? b : "");
1752    lua_setfield(L, -2, a);
1753}
1754
1755static inline void lua_set_string_by_index(lua_State *L, lua_Integer a, const char *b)
1756{
1757    lua_pushstring(L, b ? b : "");
1758    lua_rawseti(L, -2, a);
1759}
1760
1761static inline void lua_set_integer_by_key(lua_State *L, const char *a, int b)
1762{
1763    lua_pushinteger(L, b);
1764    lua_setfield(L, -2, a);
1765}
1766
1767static inline void lua_set_integer_by_index(lua_State *L, int a, int b)
1768{
1769    lua_pushinteger(L, b);
1770    lua_rawseti(L, -2, a);
1771}
1772
1773static inline void lua_set_number_by_key(lua_State *L, const char *a, double b)
1774{
1775    lua_pushnumber(L, b);
1776    lua_setfield(L, -2, a);
1777}
1778
1779static inline void lua_set_number_by_index(lua_State *L, int a, double b)
1780{
1781    lua_pushnumber(L, b);
1782    lua_rawseti(L, -2, a);
1783}
1784
1785static inline void lua_set_cardinal_by_key(lua_State *L, const char *a, unsigned b)
1786{
1787    lua_pushinteger(L, b);
1788    lua_setfield(L, -2, a);
1789}
1790
1791static inline void lua_set_cardinal_by_index(lua_State *L, int a, unsigned b)
1792{
1793    lua_pushinteger(L, b);
1794    lua_rawseti(L, -2, a);
1795}
1796
1797static inline void lua_set_boolean_by_key(lua_State *L, const char *a, int b)
1798{
1799    lua_pushboolean(L, b);
1800    lua_setfield(L, -2, a);
1801}
1802
1803static inline void lua_set_boolean_by_index(lua_State *L, int a, int b)
1804{
1805    lua_pushboolean(L, b);
1806    lua_rawseti(L, -2, a);
1807}
1808
1809static inline void lmt_string_to_buffer(const char *str)
1810{
1811    luaL_addstring(lmt_lua_state.used_buffer, str);
1812}
1813
1814static inline void lmt_char_to_buffer(char c)
1815{
1816    luaL_addchar(lmt_lua_state.used_buffer, c);
1817}
1818
1819static inline void lmt_newline_to_buffer(void)
1820{
1821    luaL_addchar(lmt_lua_state.used_buffer, '\n');
1822}
1823
1824/* moved here */
1825
1826# if (1) 
1827
1828    # define set_numeric_field_by_index(target,name,dflt) \
1829        lua_push_key(name); \
1830        target = (lua_rawget(L, -2) == LUA_TNUMBER) ? lmt_roundnumber(L, -1) : dflt ; \
1831        lua_pop(L, 1);
1832
1833# else 
1834
1835    # define set_numeric_field_by_index(target,name,dflt) \
1836        lua_push_key(name); \
1837        if (lua_rawget(L, -2) == LUA_TNUMBER) { \
1838            target = lmt_roundnumber(L, -1); \
1839            lua_pop(L, 1); \
1840            lua_push_key(name); \
1841            lua_push_integer(L, target); \
1842            lua_rawset(L, -3); \
1843        } else { \
1844            target = dflt ; \
1845            lua_pop(L, 1); \
1846        } 
1847
1848# endif 
1849
1850# define set_boolean_field_by_index(target,name,dflt) \
1851    lua_push_key(name); \
1852    target = (lua_rawget(L, -2) == LUA_TBOOLEAN) ? lua_toboolean(L, -1) : dflt ; \
1853    lua_pop(L, 1);
1854
1855# define set_string_field_by_index(target,name) \
1856    lua_push_key(name); \
1857    target = (lua_rawget(L, -2) == LUA_TSTRING) ? lua_tostring(L, -1) : NULL ; \
1858    lua_pop(L, 1);
1859
1860# define set_any_field_by_index(target,name) \
1861    lua_push_key(name); \
1862    target = (lua_rawget(L, -2) != LUA_TNIL); \
1863    lua_pop(L, 1);
1864
1865
1866# endif
1867