~ubuntu-branches/ubuntu/saucy/luatex/saucy

« back to all changes in this revision

Viewing changes to source/texk/web2c/luatexdir/lua/lnodelib.c

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Preining
  • Date: 2009-12-25 09:47:05 UTC
  • mfrom: (1.1.9 upstream) (4.2.3 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091225094705-y33rpflo8t4u9nag
Tags: 0.50.0-1
* new upstream release
* disable fix-hurd-ftbfs patch, included upstream
* disable upstram-fixes, included upstream
* disable ubuntu_libpoppler-0.11, not needed anymore

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* lnodelib.c
2
2
   
3
 
   Copyright 2006-2008 Taco Hoekwater <taco@luatex.org>
 
3
   Copyright 2006-2009 Taco Hoekwater <taco@luatex.org>
4
4
 
5
5
   This file is part of LuaTeX.
6
6
 
17
17
   You should have received a copy of the GNU General Public License along
18
18
   with LuaTeX; if not, see <http://www.gnu.org/licenses/>. */
19
19
 
20
 
#include "luatex-api.h"
 
20
static const char _svn_version[] =
 
21
    "$Id: lnodelib.c 3265 2009-12-18 16:21:40Z taco $ "
 
22
    "$URL: http://foundry.supelec.fr/svn/luatex/tags/beta-0.50.0/source/texk/web2c/luatexdir/lua/lnodelib.c $";
 
23
 
 
24
#include "lua/luatex-api.h"
21
25
#include <ptexlib.h>
22
26
 
23
 
#include "nodes.h"
24
 
 
25
 
#include "commands.h"
26
 
 
27
 
static const char _svn_version[] =
28
 
    "$Id: lnodelib.c 2476 2009-06-12 19:39:05Z taco $ $URL: http://foundry.supelec.fr/svn/luatex/tags/beta-0.40.6/source/texk/web2c/luatexdir/lua/lnodelib.c $";
29
 
 
30
27
#define init_luaS_index(a) do {                                         \
31
28
    lua_pushliteral(L,#a);                                              \
32
29
    luaS_##a##_ptr = (char *)lua_tostring(L,-1);                        \
45
42
 
46
43
make_luaS_index(luatex_node);
47
44
 
 
45
static int nodelib_getdir(lua_State * L, int n);        /* forward */
 
46
 
48
47
halfword *check_isnode(lua_State * L, int ud)
49
48
{
50
49
    register halfword *p = lua_touserdata(L, ud);
168
167
 
169
168
static int lua_nodelib_id(lua_State * L)
170
169
{
171
 
    integer i = get_node_type_id(L, 1);
 
170
    int i = get_node_type_id(L, 1);
172
171
    if (i >= 0) {
173
172
        lua_pushnumber(L, i);
174
173
    } else {
180
179
 
181
180
static int lua_nodelib_subtype(lua_State * L)
182
181
{
183
 
    integer i = get_node_subtype_id(L, 1);
 
182
    int i = get_node_subtype_id(L, 1);
184
183
    if (i >= 0) {
185
184
        lua_pushnumber(L, i);
186
185
    } else {
193
192
 
194
193
static int lua_nodelib_type(lua_State * L)
195
194
{
196
 
    integer i = get_node_type_id(L, 1);
 
195
    int i = get_node_type_id(L, 1);
197
196
    if (i >= 0) {
198
197
        lua_pushstring(L, node_data[i].name);
199
198
    } else {
451
450
    for (i = 1; i <= j; i++) {
452
451
        n = check_isnode(L, i);
453
452
        m = *n;
454
 
        new_tail_append(m);
 
453
        tail_append(m);
455
454
        while (vlink(m) != null) {
456
455
            m = vlink(m);
457
 
            new_tail_append(m);
 
456
            tail_append(m);
458
457
        }
459
458
    }
460
459
    return 0;
477
476
{
478
477
    halfword n, p;
479
478
    char *s;
480
 
    integer w = 0;
 
479
    int w = 0;
481
480
    int m = 1;
 
481
    int d = -1;
482
482
    n = *(check_isnode(L, 1));
483
483
    if (lua_gettop(L) > 1) {
484
484
        w = lua_tointeger(L, 2);
494
494
                                   "3rd argument should be either additional or exactly");
495
495
                    lua_error(L);
496
496
                }
497
 
            }
498
 
 
499
 
            else if (lua_type(L, 3) == LUA_TNUMBER) {
 
497
            } else if (lua_type(L, 3) == LUA_TNUMBER) {
500
498
                m = lua_tonumber(L, 3);
501
499
            } else {
502
500
                lua_pushstring(L, "incorrect 3rd argument");
503
501
            }
 
502
            if (lua_gettop(L) > 3) {
 
503
                if (lua_type(L, 4) == LUA_TSTRING) {
 
504
                    d = nodelib_getdir(L, 4);
 
505
                } else {
 
506
                    lua_pushstring(L, "incorrect 4th argument");
 
507
                }
 
508
            }
504
509
        }
505
510
    }
506
 
    p = hpack(n, w, m);
 
511
    p = hpack(n, w, m, d);
507
512
    lua_nodelib_push_fast(L, p);
508
513
    return 1;
509
514
}
510
515
 
511
516
 
 
517
static int lua_nodelib_dimensions(lua_State * L)
 
518
{
 
519
    int top;
 
520
    top = lua_gettop(L);
 
521
    if (top > 0) {
 
522
        scaled_whd siz;
 
523
        glue_ratio g_mult = 1.0;
 
524
        int g_sign = normal;
 
525
        int g_order = normal;
 
526
        int i = 1;
 
527
        int d = -1;
 
528
        halfword n = null, p = null;
 
529
        if (lua_isnumber(L, 1)) {
 
530
            if (top < 4) {
 
531
                lua_pushnil(L);
 
532
                return 1;
 
533
            }
 
534
            i += 3;
 
535
            g_mult = (glue_ratio) lua_tonumber(L, 1);
 
536
            g_sign = lua_tonumber(L, 2);
 
537
            g_order = lua_tonumber(L, 3);
 
538
        }
 
539
        n = *(check_isnode(L, i));
 
540
        if (lua_gettop(L) > i && !lua_isnil(L, (i + 1))) {
 
541
            if (lua_type(L, (i + 1)) == LUA_TSTRING) {
 
542
                d = nodelib_getdir(L, (i + 1));
 
543
            } else {
 
544
                p = *(check_isnode(L, (i + 1)));
 
545
            }
 
546
        }
 
547
        if (lua_gettop(L) > (i + 1) && lua_type(L, (i + 2)) == LUA_TSTRING) {
 
548
            d = nodelib_getdir(L, (i + 2));
 
549
        }
 
550
        siz = natural_sizes(n, p, g_mult, g_sign, g_order, d);
 
551
        lua_pushnumber(L, siz.wd);
 
552
        lua_pushnumber(L, siz.ht);
 
553
        lua_pushnumber(L, siz.dp);
 
554
        return 3;
 
555
    } else {
 
556
        lua_pushstring(L,
 
557
                       "missing  argument to 'dimensions' (luatex_node expected)");
 
558
        lua_error(L);
 
559
    }
 
560
    return 0;                   /* not reached */
 
561
}
 
562
 
 
563
 
512
564
/* build a vbox */
513
565
static int lua_nodelib_vpack(lua_State * L)
514
566
{
515
567
    halfword n, p;
516
568
    char *s;
517
 
    integer w = 0;
 
569
    int w = 0;
518
570
    int m = 1;
 
571
    int d = -1;
519
572
    n = *(check_isnode(L, 1));
520
573
    if (lua_gettop(L) > 1) {
521
574
        w = lua_tointeger(L, 2);
531
584
                                   "3rd argument should be either additional or exactly");
532
585
                    lua_error(L);
533
586
                }
 
587
                if (lua_gettop(L) > 3) {
 
588
                    if (lua_type(L, 4) == LUA_TSTRING) {
 
589
                        d = nodelib_getdir(L, 4);
 
590
                    } else {
 
591
                        lua_pushstring(L, "incorrect 4th argument");
 
592
                    }
 
593
                }
534
594
            }
535
595
 
536
596
            else if (lua_type(L, 3) == LUA_TNUMBER) {
540
600
            }
541
601
        }
542
602
    }
543
 
    p = vpackage(n, w, m, max_dimen);
 
603
    p = vpackage(n, w, m, max_dimen, d);
544
604
    lua_nodelib_push_fast(L, p);
545
605
    return 1;
546
606
}
557
617
    w = luaL_checkoption(L, 2, "text", math_style_names);
558
618
    luaL_checkany(L, 3);
559
619
    m = lua_toboolean(L, 3);
560
 
    cur_mlist = n;
561
 
    cur_style = w;
562
 
    mlist_penalties = m;
563
 
    mlist_to_hlist();
 
620
    mlist_to_hlist_args(n, w, m);
564
621
    lua_nodelib_push_fast(L, vlink(temp_head));
565
622
    return 1;
566
623
}
777
834
    return 1;
778
835
}
779
836
 
 
837
static int lua_nodelib_tail_only(lua_State * L)
 
838
{
 
839
    halfword *n;
 
840
    halfword t;
 
841
    if (lua_isnil(L, 1))
 
842
        return 1;               /* the nil itself */
 
843
    n = check_isnode(L, 1);
 
844
    t = *n;
 
845
    if (t == null)
 
846
        return 1;               /* the old userdata */
 
847
    while (vlink(t) != null) {
 
848
        t = vlink(t);
 
849
    }
 
850
    lua_nodelib_push_fast(L, t);
 
851
    return 1;
 
852
}
 
853
 
 
854
 
780
855
/* a few utility functions for attribute stuff */
781
856
 
782
857
static int lua_nodelib_has_attribute(lua_State * L)
971
1046
#define nodelib_pushattr(L,n) { lua_pushnumber(L,n); lua_nodelib_push(L); }
972
1047
#define nodelib_pushspec(L,n) { lua_pushnumber(L,n); lua_nodelib_push(L); }
973
1048
#define nodelib_pushaction(L,n) { lua_pushnumber(L,n); lua_nodelib_push(L); }
974
 
#define nodelib_pushstring(L,n) { lua_pushstring(L,makecstring(n)); }
 
1049
#define nodelib_pushstring(L,n) { char *ss=makecstring(n); lua_pushstring(L,ss); free(ss); }
975
1050
 
976
1051
static void nodelib_pushdir(lua_State * L, int n, boolean dirnode)
977
1052
{
978
 
    int f = 0;
979
 
    char dirstring[5] = { 0 };
 
1053
    char s[2];
980
1054
    if (dirnode) {
981
 
        dirstring[f++] = (n < 0 ? '-' : '+');
 
1055
        s[0] = (n < 0 ? '-' : '+');
 
1056
        s[1] = 0;
 
1057
    } else {
 
1058
        s[0] = 0;
982
1059
    }
983
1060
    if (n < 0)
984
1061
        n += 64;
985
 
    dirstring[f++] = dir_names[(int) dir_primary[n]];
986
 
    dirstring[f++] = dir_names[(int) dir_secondary[n]];
987
 
    dirstring[f++] = dir_names[(int) dir_tertiary[n]];
988
 
    lua_pushstring(L, dirstring);
 
1062
    if (n == dir_TLT) {
 
1063
        lua_pushfstring(L, "%sTLT", s);
 
1064
    } else if (n == dir_TRT) {
 
1065
        lua_pushfstring(L, "%sTRT", s);
 
1066
    } else if (n == dir_LTL) {
 
1067
        lua_pushfstring(L, "%sLTL", s);
 
1068
    } else if (n == dir_RTT) {
 
1069
        lua_pushfstring(L, "%sRTT", s);
 
1070
    } else {
 
1071
        lua_pushstring(L, "???");
 
1072
    }
989
1073
}
990
1074
 
991
1075
static void lua_nodelib_getfield_whatsit(lua_State * L, int n, int field)
1115
1199
        case pdf_refxform_node:
1116
1200
            switch (field) {
1117
1201
            case 4:
1118
 
                lua_pushnumber(L, pdf_width(n));
 
1202
                lua_pushnumber(L, width(n));
1119
1203
                break;
1120
1204
            case 5:
1121
 
                lua_pushnumber(L, pdf_height(n));
 
1205
                lua_pushnumber(L, depth(n));
1122
1206
                break;
1123
1207
            case 6:
1124
 
                lua_pushnumber(L, pdf_depth(n));
 
1208
                lua_pushnumber(L, height(n));
1125
1209
                break;
1126
1210
            case 7:
1127
1211
                lua_pushnumber(L, pdf_xform_objnum(n));
1133
1217
        case pdf_refximage_node:
1134
1218
            switch (field) {
1135
1219
            case 4:
1136
 
                lua_pushnumber(L, pdf_width(n));
 
1220
                lua_pushnumber(L, width(n));
1137
1221
                break;
1138
1222
            case 5:
1139
 
                lua_pushnumber(L, pdf_height(n));
 
1223
                lua_pushnumber(L, depth(n));
1140
1224
                break;
1141
1225
            case 6:
1142
 
                lua_pushnumber(L, pdf_depth(n));
 
1226
                lua_pushnumber(L, height(n));
1143
1227
                break;
1144
1228
            case 7:
1145
 
                lua_pushnumber(L, pdf_ximage_objnum(n));
 
1229
                lua_pushnumber(L, pdf_ximage_transform(n));
 
1230
                break;
 
1231
            case 8:
 
1232
                lua_pushnumber(L, pdf_ximage_index(n));
1146
1233
                break;
1147
1234
            default:
1148
1235
                lua_pushnil(L);
1151
1238
        case pdf_annot_node:
1152
1239
            switch (field) {
1153
1240
            case 4:
1154
 
                lua_pushnumber(L, pdf_width(n));
 
1241
                lua_pushnumber(L, width(n));
1155
1242
                break;
1156
1243
            case 5:
1157
 
                lua_pushnumber(L, pdf_height(n));
 
1244
                lua_pushnumber(L, depth(n));
1158
1245
                break;
1159
1246
            case 6:
1160
 
                lua_pushnumber(L, pdf_depth(n));
 
1247
                lua_pushnumber(L, height(n));
1161
1248
                break;
1162
1249
            case 7:
1163
1250
                lua_pushnumber(L, pdf_annot_objnum(n));
1172
1259
        case pdf_start_link_node:
1173
1260
            switch (field) {
1174
1261
            case 4:
1175
 
                lua_pushnumber(L, pdf_width(n));
 
1262
                lua_pushnumber(L, width(n));
1176
1263
                break;
1177
1264
            case 5:
1178
 
                lua_pushnumber(L, pdf_height(n));
 
1265
                lua_pushnumber(L, depth(n));
1179
1266
                break;
1180
1267
            case 6:
1181
 
                lua_pushnumber(L, pdf_depth(n));
 
1268
                lua_pushnumber(L, height(n));
1182
1269
                break;
1183
1270
            case 7:
1184
1271
                lua_pushnumber(L, pdf_link_objnum(n));
1196
1283
        case pdf_dest_node:
1197
1284
            switch (field) {
1198
1285
            case 4:
1199
 
                lua_pushnumber(L, pdf_width(n));
 
1286
                lua_pushnumber(L, width(n));
1200
1287
                break;
1201
1288
            case 5:
1202
 
                lua_pushnumber(L, pdf_height(n));
 
1289
                lua_pushnumber(L, depth(n));
1203
1290
                break;
1204
1291
            case 6:
1205
 
                lua_pushnumber(L, pdf_depth(n));
 
1292
                lua_pushnumber(L, height(n));
1206
1293
                break;
1207
1294
            case 7:
1208
1295
                lua_pushnumber(L, pdf_dest_named_id(n));
1230
1317
        case pdf_start_thread_node:
1231
1318
            switch (field) {
1232
1319
            case 4:
1233
 
                lua_pushnumber(L, pdf_width(n));
 
1320
                lua_pushnumber(L, width(n));
1234
1321
                break;
1235
1322
            case 5:
1236
 
                lua_pushnumber(L, pdf_height(n));
 
1323
                lua_pushnumber(L, depth(n));
1237
1324
                break;
1238
1325
            case 6:
1239
 
                lua_pushnumber(L, pdf_depth(n));
 
1326
                lua_pushnumber(L, height(n));
1240
1327
                break;
1241
1328
            case 7:
1242
1329
                lua_pushnumber(L, pdf_thread_named_id(n));
1877
1964
        case 2:
1878
1965
            lua_pushnumber(L, subtype(n));
1879
1966
            break;
1880
 
        case 3:
 
1967
        case 4:
1881
1968
            lua_pushnumber(L, width(n));
1882
1969
            break;
1883
 
        case 4:
 
1970
        case 5:
1884
1971
            nodelib_pushlist(L, margin_char(n));
1885
1972
            break;
1886
1973
        default:
1973
2060
{
1974
2061
    char *s = NULL;
1975
2062
    int d = 32;                 /* invalid number */
1976
 
    int a = -1, b = -1, c = -1;
1977
2063
    if (lua_type(L, n) == LUA_TSTRING) {
1978
2064
        s = (char *) lua_tostring(L, n);
1979
2065
        if (strlen(s) == 3) {
1987
2073
            s++;
1988
2074
        }
1989
2075
        if (strlen(s) == 3) {
1990
 
            switch (*s) {
1991
 
                /*  *INDENT-OFF* */
1992
 
                case 'T': a=0; break;
1993
 
                case 'L': a=1; break;
1994
 
                case 'B': a=2; break;
1995
 
                case 'R': a=3; break;
1996
 
                /* *INDENT-ON* */
1997
 
            }
1998
 
            switch (*(s + 1)) {
1999
 
                /*  *INDENT-OFF* */
2000
 
                case 'T': b=0; break;
2001
 
                case 'L': b=1; break;
2002
 
                case 'B': b=2; break;
2003
 
                case 'R': b=3; break;
2004
 
                /* *INDENT-ON* */
2005
 
            }
2006
 
            switch (*(s + 2)) {
2007
 
                /*  *INDENT-OFF* */
2008
 
                case 'T': c=0; break;
2009
 
                case 'L': c=1; break;
2010
 
                case 'B': c=2; break;
2011
 
                case 'R': c=3; break;
2012
 
                /* *INDENT-ON* */
2013
 
            }
2014
 
        }
2015
 
        if (a != -1 && b != -1 && c != -1 && !dir_parallel(a, b)) {
2016
 
            d += (a * 8 + dir_rearrange[b] * 4 + c);
2017
 
        }
2018
 
    } else if (lua_isnumber(L, n)) {
2019
 
        d = lua_tonumber(L, n);
 
2076
            if (strcmp(s, "TLT") == 0) {
 
2077
                d += dir_TLT;
 
2078
            } else if (strcmp(s, "TRT") == 0) {
 
2079
                d += dir_TRT;
 
2080
            } else if (strcmp(s, "LTL") == 0) {
 
2081
                d += dir_LTL;
 
2082
            } else if (strcmp(s, "RTT") == 0) {
 
2083
                d += dir_RTT;
 
2084
            }
 
2085
        }
 
2086
    } else {
 
2087
        lua_pushstring(L, "Direction specifiers have to be strings");
 
2088
        lua_error(L);
2020
2089
    }
2021
2090
    if ((d > 31) || (d < -64) || (d < 0 && (d + 64) > 31)) {
2022
2091
        d = 0;
2187
2256
    case pdf_refxform_node:
2188
2257
        switch (field) {
2189
2258
        case 4:
2190
 
            pdf_width(n) = lua_tointeger(L, 3);
 
2259
            width(n) = lua_tointeger(L, 3);
2191
2260
            break;
2192
2261
        case 5:
2193
 
            pdf_height(n) = lua_tointeger(L, 3);
 
2262
            depth(n) = lua_tointeger(L, 3);
2194
2263
            break;
2195
2264
        case 6:
2196
 
            pdf_depth(n) = lua_tointeger(L, 3);
 
2265
            height(n) = lua_tointeger(L, 3);
2197
2266
            break;
2198
2267
        case 7:
2199
2268
            pdf_xform_objnum(n) = lua_tointeger(L, 3);
2205
2274
    case pdf_refximage_node:
2206
2275
        switch (field) {
2207
2276
        case 4:
2208
 
            pdf_width(n) = lua_tointeger(L, 3);
 
2277
            width(n) = lua_tointeger(L, 3);
2209
2278
            break;
2210
2279
        case 5:
2211
 
            pdf_height(n) = lua_tointeger(L, 3);
 
2280
            depth(n) = lua_tointeger(L, 3);
2212
2281
            break;
2213
2282
        case 6:
2214
 
            pdf_depth(n) = lua_tointeger(L, 3);
 
2283
            height(n) = lua_tointeger(L, 3);
2215
2284
            break;
2216
2285
        case 7:
2217
 
            pdf_ximage_objnum(n) = lua_tointeger(L, 3);
 
2286
            pdf_ximage_transform(n) = lua_tointeger(L, 3);
 
2287
            break;
 
2288
        case 8:
 
2289
            pdf_ximage_index(n) = lua_tointeger(L, 3);
2218
2290
            break;
2219
2291
        default:
2220
2292
            return nodelib_cantset(L, field, n);
2223
2295
    case pdf_annot_node:
2224
2296
        switch (field) {
2225
2297
        case 4:
2226
 
            pdf_width(n) = lua_tointeger(L, 3);
 
2298
            width(n) = lua_tointeger(L, 3);
2227
2299
            break;
2228
2300
        case 5:
2229
 
            pdf_height(n) = lua_tointeger(L, 3);
 
2301
            depth(n) = lua_tointeger(L, 3);
2230
2302
            break;
2231
2303
        case 6:
2232
 
            pdf_depth(n) = lua_tointeger(L, 3);
 
2304
            height(n) = lua_tointeger(L, 3);
2233
2305
            break;
2234
2306
        case 7:
2235
2307
            pdf_annot_objnum(n) = lua_tointeger(L, 3);
2244
2316
    case pdf_start_link_node:
2245
2317
        switch (field) {
2246
2318
        case 4:
2247
 
            pdf_width(n) = lua_tointeger(L, 3);
 
2319
            width(n) = lua_tointeger(L, 3);
2248
2320
            break;
2249
2321
        case 5:
2250
 
            pdf_height(n) = lua_tointeger(L, 3);
 
2322
            depth(n) = lua_tointeger(L, 3);
2251
2323
            break;
2252
2324
        case 6:
2253
 
            pdf_depth(n) = lua_tointeger(L, 3);
 
2325
            height(n) = lua_tointeger(L, 3);
2254
2326
            break;
2255
2327
        case 7:
2256
2328
            pdf_link_objnum(n) = lua_tointeger(L, 3);
2274
2346
    case pdf_dest_node:
2275
2347
        switch (field) {
2276
2348
        case 4:
2277
 
            pdf_width(n) = lua_tointeger(L, 3);
 
2349
            width(n) = lua_tointeger(L, 3);
2278
2350
            break;
2279
2351
        case 5:
2280
 
            pdf_height(n) = lua_tointeger(L, 3);
 
2352
            depth(n) = lua_tointeger(L, 3);
2281
2353
            break;
2282
2354
        case 6:
2283
 
            pdf_depth(n) = lua_tointeger(L, 3);
 
2355
            height(n) = lua_tointeger(L, 3);
2284
2356
            break;
2285
2357
        case 7:
2286
2358
            pdf_dest_named_id(n) = lua_tointeger(L, 3);
2308
2380
    case pdf_start_thread_node:
2309
2381
        switch (field) {
2310
2382
        case 4:
2311
 
            pdf_width(n) = lua_tointeger(L, 3);
 
2383
            width(n) = lua_tointeger(L, 3);
2312
2384
            break;
2313
2385
        case 5:
2314
 
            pdf_height(n) = lua_tointeger(L, 3);
 
2386
            depth(n) = lua_tointeger(L, 3);
2315
2387
            break;
2316
2388
        case 6:
2317
 
            pdf_depth(n) = lua_tointeger(L, 3);
 
2389
            height(n) = lua_tointeger(L, 3);
2318
2390
            break;
2319
2391
        case 7:
2320
2392
            pdf_thread_named_id(n) = lua_tointeger(L, 3);
2943
3015
            case 2:
2944
3016
                subtype(n) = lua_tointeger(L, 3);
2945
3017
                break;
2946
 
            case 3:
 
3018
            case 4:
2947
3019
                width(n) = lua_tointeger(L, 3);
2948
3020
                break;
2949
 
            case 4:
 
3021
            case 5:
2950
3022
                margin_char(n) = nodelib_getlist(L, 3);
2951
3023
                break;
2952
3024
            default:
3227
3299
    {"count", lua_nodelib_count},
3228
3300
    {"traverse", lua_nodelib_traverse},
3229
3301
    {"traverse_id", lua_nodelib_traverse_filtered},
 
3302
    {"tail", lua_nodelib_tail_only},
3230
3303
    {"slide", lua_nodelib_tail},
3231
3304
    {"types", lua_nodelib_types},
3232
3305
    {"whatsits", lua_nodelib_whatsits},
3241
3314
    {"last_node", lua_nodelib_last_node},
3242
3315
    {"copy", lua_nodelib_copy},
3243
3316
    {"copy_list", lua_nodelib_copy_list},
 
3317
    {"dimensions", lua_nodelib_dimensions},
3244
3318
    {"hpack", lua_nodelib_hpack},
3245
3319
    {"vpack", lua_nodelib_vpack},
3246
3320
    {"mlist_to_hlist", lua_nodelib_mlist_to_hlist},