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