diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2017-02-11 22:54:15 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2017-02-11 22:54:15 +0000 |
commit | 1554b00942bc7a1823fc38ea67b53e1f636a1c71 (patch) | |
tree | 8c924ef0337f659d78178bd63f4aabe13b820847 | |
parent | b6987e4c0f674bac01773a7ebe76dae1a8f85466 (diff) |
luatexdir: sync with the upstream
git-svn-id: svn://tug.org/texlive/trunk@43196 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/lnodelib.c | 1929 | ||||
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/ltexlib.c | 79 |
2 files changed, 1054 insertions, 954 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/lnodelib.c b/Build/source/texk/web2c/luatexdir/lua/lnodelib.c index 8a96f328f8b..a6fc98aba17 100644 --- a/Build/source/texk/web2c/luatexdir/lua/lnodelib.c +++ b/Build/source/texk/web2c/luatexdir/lua/lnodelib.c @@ -29,23 +29,25 @@ overhead. Because the userdata approach has some benefits, we stick to this. We did - some experiments with fast access (assuming nodes) and kept some of the code - commented here, but eventually settled for the direct approach. For code that - is proven to be okay, one can use the direct variants and operate on nodes - more directly. Currently these are numbers, but that might become light - userdata at one point, so *never* rely on that property. An important aspect - is that one cannot mix both methods, although with node.direct.tonode and - node.direct.todirect one can cast both representations. + some experiments with fast access (assuming nodes), but eventually settled for + the direct approach. For code that is proven to be okay, one can use the + direct variants and operate on nodes more directly. Currently these are + numbers but don't rely on that property; treat them as abstractions. An + important aspect is that one cannot mix both methods, although with + node.direct.tonode and node.direct.todirect one can cast representations. So the advice is: use the indexed approach when possible and investigate the - direct one when speed might be an issue. For that reason we also provide the + direct one when speed might be an issue. For that reason we also provide some get* and set* functions in the top level node namespace. There is a limited set - of getters and a generic getfield to complement them. + of getters for nodes and a generic getfield to complement them. The direct + namespace has a few more. - Keep in mind that these only make sense when we're calling them millions of - times (which happens in font processing for instance). Setters are less important - as documents have not that many content related nodes (and setting many thousands - of properties is hardly a burden contrary to millions of consultations.) + Keep in mind that such speed considerations only make sense when we're accessing + nodes millions of times (which happens in font processing for instance). Setters + are less important as documents have not that many content related nodes and + setting many thousands of properties is hardly a burden contrary to millions of + consultations. And with millions, we're talking of tens of millions which is not + that common. Another change is that __index and __newindex are (as expected) exposed to users but do no checking. The getfield and setfield functions do check. In @@ -349,91 +351,50 @@ static int lua_nodelib_id(lua_State * L) return 1; } -/* node.getid */ - -static int lua_nodelib_getid(lua_State * L) -{ - /* [given-node] [...] */ - halfword *p = lua_touserdata(L, 1); - if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { - lua_pushnil(L); - return 1; - } - /* [given-node] [mt-given-node] */ - lua_get_metatablelua(luatex_node); - /* [given-node] [mt-given-node] [mt-node] */ - if (!lua_rawequal(L, -1, -2)) { - lua_pushnil(L); - } else { - lua_pushinteger(L, type(*p)); - } - return 1; -} - -/* node.fast.getid - - static int lua_nodelib_fast_getid(lua_State * L) - { - halfword *n; - n = (halfword *) lua_touserdata(L, 1); - lua_pushinteger(L, type(*n)); - return 1; - } - -*/ - /* node.direct.getid */ static int lua_nodelib_direct_getid(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else { + if (n) { lua_pushinteger(L, type(n)); + } else { + lua_pushnil(L); } return 1; } -/* node.getsubtype */ + /* node.getid */ -static int lua_nodelib_getsubtype(lua_State * L) -{ - halfword *p = lua_touserdata(L, 1); - if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { - lua_pushnil(L); - } else { + static int lua_nodelib_getid(lua_State * L) + { + /* [given-node] [...] */ + halfword *p = lua_touserdata(L, 1); + if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { + lua_pushnil(L); + return 1; + } + /* [given-node] [mt-given-node] */ lua_get_metatablelua(luatex_node); - if ( (!lua_rawequal(L, -1, -2)) || (! nodetype_has_subtype(*p))) { + /* [given-node] [mt-given-node] [mt-node] */ + if (!lua_rawequal(L, -1, -2)) { lua_pushnil(L); } else { - lua_pushinteger(L, subtype(*p)); + lua_pushinteger(L, type(*p)); } - } - return 1; -} - -/* node.fast.getsubtype - - static int lua_nodelib_fast_getsubtype(lua_State * L) - { - halfword *n; - n = (halfword *) lua_touserdata(L, 1); - lua_pushinteger(L, subtype(*n)); return 1; } -*/ - /* node.direct.getsubtype */ +/* node.direct.setsubtype */ static int lua_nodelib_direct_getsubtype(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { /* no check, we assume sane use */ - lua_pushnil(L); - } else { + if (n) { lua_pushinteger(L, subtype(n)); + } else { + lua_pushnil(L); } return 1; } @@ -441,75 +402,96 @@ static int lua_nodelib_direct_getsubtype(lua_State * L) static int lua_nodelib_direct_setsubtype(lua_State * L) { halfword n = lua_tointeger(L, 1); - if ((n != null) && (lua_type(L,2) == LUA_TNUMBER)) { + if ((n) && (lua_type(L,2) == LUA_TNUMBER)) { subtype(n) = (halfword) lua_tointeger(L, 2); } return 0; } -/* node.getfont */ + /* node.getsubtype */ + + static int lua_nodelib_getsubtype(lua_State * L) + { + halfword *p = lua_touserdata(L, 1); + if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { + lua_pushnil(L); + } else { + lua_get_metatablelua(luatex_node); + if ( (!lua_rawequal(L, -1, -2)) || (! nodetype_has_subtype(*p))) { + lua_pushnil(L); + } else { + lua_pushinteger(L, subtype(*p)); + } + } + return 1; + } -static int lua_nodelib_getfont(lua_State * L) +/* node.direct.getfont */ +/* node.direct.setfont */ + +static int lua_nodelib_direct_getfont(lua_State * L) { - halfword *n = lua_touserdata(L, 1); - if ( (n == NULL) || (! lua_getmetatable(L,1)) ) { - lua_pushnil(L); - } else { - halfword t = type(*n); + halfword n = lua_tointeger(L, 1); + if (n != null) { + halfword t = type(n); if (t == glyph_node) { - lua_pushinteger(L, font(*n)); + lua_pushinteger(L, font(n)); } else if ((t == math_char_node) || (t == math_text_char_node)) { - lua_pushinteger(L, fam_fnt(math_fam(*n), 0)); + lua_pushinteger(L, fam_fnt(math_fam(n), 0)); } else { lua_pushnil(L); } + } else { + lua_pushnil(L); } return 1; } -/* node.fast.getfont +static int lua_nodelib_direct_setfont(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if ((n) && type(n) == glyph_node) { + font(n) = (halfword) lua_tointeger(L,2); + /* optional char */ + if ((lua_type(L, 3) == LUA_TNUMBER)) { + character(n) = (halfword) lua_tointeger(L, 3); + } + } + return 0; +} - static int lua_nodelib_fast_getfont(lua_State * L) + /* node.getfont */ + + static int lua_nodelib_getfont(lua_State * L) { - halfword *n; - n = (halfword *) lua_touserdata(L, 1); - if (type(*n) != glyph_node) { + halfword *n = lua_touserdata(L, 1); + if ((n == NULL) || (! lua_getmetatable(L,1)) ) { lua_pushnil(L); } else { - lua_pushinteger(L, font(*n)); + halfword t = type(*n); + if (t == glyph_node) { + lua_pushinteger(L, font(*n)); + } else if ((t == math_char_node) || (t == math_text_char_node)) { + lua_pushinteger(L, fam_fnt(math_fam(*n), 0)); + } else { + lua_pushnil(L); + } } return 1; } -*/ - -/* node.direct.getfont */ - -/* - -static int lua_nodelib_direct_getfont(lua_State * L) -{ - halfword n; - n = (halfword) lua_tointeger(L, 1); - if ((n == null) || (type(n) != glyph_node)) { - lua_pushnil(L); - } else { - lua_pushinteger(L, font(n)); - } - return 1; -} - -*/ +/* node.direct.getchar */ +/* node.direct.setchar */ -static int lua_nodelib_direct_getfont(lua_State * L) /* family_font is not yet in manual, what does arg 2 do */ +static int lua_nodelib_direct_getchar(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n != null) { + if (n) { halfword t = type(n); if (t == glyph_node) { - lua_pushinteger(L, font(n)); + lua_pushinteger(L, character(n)); } else if ((t == math_char_node) || (t == math_text_char_node)) { - lua_pushinteger(L, fam_fnt(math_fam(n), 0)); + lua_pushinteger(L, math_character(n)); } else { lua_pushnil(L); } @@ -519,75 +501,70 @@ static int lua_nodelib_direct_getfont(lua_State * L) /* family_font is not yet i return 1; } -/* node.getchar */ - -static int lua_nodelib_getcharacter(lua_State * L) +static int lua_nodelib_direct_setchar(lua_State * L) { - halfword *n = lua_touserdata(L, 1); - if ( (n == NULL) || (! lua_getmetatable(L,1)) ) { - lua_pushnil(L); - } else if (type(*n) == glyph_node) { - lua_pushinteger(L, character(*n)); - } else if ((type(*n) == math_char_node) || (type(*n) == math_text_char_node)) { - lua_pushinteger(L, math_character(*n)); + halfword n = lua_tointeger(L, 1); + if ((n) && (lua_type(L, 2) == LUA_TNUMBER)) { + halfword t = type(n); + if (t == glyph_node) { + character(n) = (halfword) lua_tointeger(L, 2); + } else if ((t == math_char_node) || (t == math_text_char_node)) { + math_character(n) = (halfword) lua_tointeger(L, 2); + } } - return 1; + return 0; } -/* node.fast.getchar - static int lua_nodelib_fast_getcharacter(lua_State * L) + /* node.getchar */ + + static int lua_nodelib_getchar(lua_State * L) { - halfword *n; - n = (halfword *) lua_touserdata(L, 1); - if (type(*n) == glyph_node) { + halfword *n = lua_touserdata(L, 1); + if ( (n == NULL) || (! lua_getmetatable(L,1)) ) { + lua_pushnil(L); + } else if (type(*n) == glyph_node) { lua_pushinteger(L, character(*n)); } else if ((type(*n) == math_char_node) || (type(*n) == math_text_char_node)) { lua_pushinteger(L, math_character(*n)); - } else { - lua_pushnil(L); } return 1; } -*/ - -/* node.direct.getchar */ +/* node.direct.getcomponents */ +/* node.direct.setcomponents */ -static int lua_nodelib_direct_getcharacter(lua_State * L) +static int lua_nodelib_direct_getcomponents(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (type(n) == glyph_node) { - lua_pushinteger(L, character(n)); - } else if ((type(n) == math_char_node) || (type(n) == math_text_char_node)) { - lua_pushinteger(L, math_character(n)); + if ((n) && (type(n) == glyph_node)) { + lua_pushinteger(L, lig_ptr(n)); } else { lua_pushnil(L); } return 1; } -static int lua_nodelib_direct_getcomponents(lua_State * L) +static int lua_nodelib_direct_setcomponents(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (type(n) == glyph_node) { - lua_pushinteger(L, lig_ptr(n)); - } else { - lua_pushnil(L); + if ((n) && (type(n) == glyph_node)) { + if (lua_type(L, 2) == LUA_TNUMBER) { + lig_ptr(n) = (halfword) lua_tointeger(L, 2); + } else { + lig_ptr(n) = null; + } } - return 1; + return 0; } +/* node.direct.getlang */ +/* node.direct.setlang */ + static int lua_nodelib_direct_getlang(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (type(n) == glyph_node) { + if ((n) && (type(n) == glyph_node)) { lua_pushinteger(L, char_lang(n)); } else { lua_pushnil(L); @@ -595,6 +572,22 @@ static int lua_nodelib_direct_getlang(lua_State * L) return 1; } +static int lua_nodelib_direct_setlang(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if ((n) && (type(n) == glyph_node)) { + if (lua_type(L, 2) == LUA_TNUMBER) { + set_char_lang(n,lua_tointeger(L, 2)); + } else { + /* nothing */ + } + } + return 0; +} + +/* node.direct.getattributelist */ +/* node.direct.setattributelist */ + static int lua_nodelib_direct_getattributelist(lua_State * L) { halfword n = lua_tointeger(L, 1); @@ -606,61 +599,260 @@ static int lua_nodelib_direct_getattributelist(lua_State * L) return 1; } +static int lua_nodelib_direct_setattributelist(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if ((n) && nodetype_has_attributes(type(n))) { + if (lua_type(L, 2) == LUA_TNUMBER) { + halfword a =lua_tointeger(L, 2); + if (type(a) == attribute_list_node) { + reassign_attribute(n,a); + } else if (nodetype_has_attributes(type(a))) { + reassign_attribute(n,node_attr(a)); + } else { + reassign_attribute(n,null); + } + } else { + reassign_attribute(n,null); + } + return 0; + } + return 0; +} + +/* node.direct.getpenalty */ +/* node.direct.setpenalty */ + static int lua_nodelib_direct_getpenalty(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (type(n) == penalty_node) { - lua_pushinteger(L, penalty(n)); - } else if (type(n) == disc_node) { - lua_pushinteger(L, disc_penalty(n)); + if (n) { + halfword t = type(n); + if (t == penalty_node) { + lua_pushinteger(L, penalty(n)); + } else if (t == disc_node) { + lua_pushinteger(L, disc_penalty(n)); + } else { + lua_pushnil(L); + } } else { lua_pushnil(L); } return 1; } +static int lua_nodelib_direct_setpenalty(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == penalty_node) { + if (lua_type(L, 2) == LUA_TNUMBER) { + penalty(n) = (halfword) lua_tointeger(L, 2); + } else { + penalty(n) = 0; + } + } else if (t == disc_node) { + if (lua_type(L, 2) == LUA_TNUMBER) { + disc_penalty(n) = (halfword) lua_tointeger(L, 2); + } else { + penalty(n) = 0; + } + } + } + return 0; +} + +/* node.direct.getnucleus */ +/* node.direct.getsub */ +/* node.direct.getsup */ + +static int lua_nodelib_direct_getnucleus(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == simple_noad || t == accent_noad || t == radical_noad) { + lua_pushinteger(L, nucleus(n)); + return 1; + } + } + lua_pushnil(L); + return 1; +} + +static int lua_nodelib_direct_setnucleus(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == simple_noad || t == accent_noad || t == radical_noad) { + if (lua_type(L, 2) == LUA_TNUMBER) { + nucleus(n) = lua_tointeger(L,2); + } else { + nucleus(n) = null; + } + } + } + return 0; +} + +static int lua_nodelib_direct_getsub(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == simple_noad || t == accent_noad || t == radical_noad) { + lua_pushinteger(L, subscr(n)); + return 1; + } + } + lua_pushnil(L); + return 1; +} + +static int lua_nodelib_direct_setsub(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == simple_noad || t == accent_noad || t == radical_noad) { + if (lua_type(L, 2) == LUA_TNUMBER) { + subscr(n) = lua_tointeger(L,2); + } else { + subscr(n) = null; + } + } + } + return 0; +} + +static int lua_nodelib_direct_getsup(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == simple_noad || t == accent_noad || t == radical_noad) { + lua_pushinteger(L, subscr(n)); + return 1; + } + } + lua_pushnil(L); + return 1; +} + +static int lua_nodelib_direct_setsup(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == simple_noad || t == accent_noad || t == radical_noad) { + if (lua_type(L, 2) == LUA_TNUMBER) { + supscr(n) = lua_tointeger(L,2); + } else { + supscr(n) = null; + } + } + } + return 0; +} + +/* node.direct.getkern (overlaps with getwidth) */ +/* node.direct.setkern (overlaps with getwidth) */ + static int lua_nodelib_direct_getkern(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (type(n) == kern_node || type(n) == margin_kern_node) { - lua_pushinteger(L, width(n)); - } else if (type(n) == math_node) { - lua_pushinteger(L, surround(n)); + if (n) { + halfword t = type(n); + if (t == kern_node || t == margin_kern_node) { + lua_pushinteger(L, width(n)); + } else if (t == math_node) { + lua_pushinteger(L, surround(n)); + } else { + lua_pushnil(L); + } } else { lua_pushnil(L); } return 1; } +static int lua_nodelib_direct_setkern(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n != null) { + halfword t = type(n); + if (t == kern_node || t == margin_kern_node) { + if (lua_type(L, 2) == LUA_TNUMBER) { + width(n) = (halfword) lua_tointeger(L, 2); + } else { + width(n) = 0; + } + if (lua_type(L, 3) == LUA_TNUMBER) { + subtype(n) = (halfword) lua_tointeger(L, 3); + } + } else if (t == math_node) { + if (lua_type(L, 2) == LUA_TNUMBER) { + surround(n) = (halfword) lua_tointeger(L, 2); + } else { + surround(n) = 0; + } + } + } + return 0; +} + +/* node.direct.getdir */ +/* node.direct.setdir */ + static int lua_nodelib_direct_getdir(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (type(n) == dir_node) { - lua_push_dir_text(L, dir_dir(n)); - } else if (type(n) == hlist_node || type(n) == vlist_node) { - lua_push_dir_par(L, box_dir(n)); - } else if (type(n) == rule_node) { - lua_push_dir_par(L, rule_dir(n)); - } else if (type(n) == local_par_node) { - lua_push_dir_par(L, local_par_dir(n)); + if (n) { + halfword t = type(n); + if (t == dir_node) { + lua_push_dir_text(L, dir_dir(n)); + } else if (t == hlist_node || t == vlist_node) { + lua_push_dir_par(L, box_dir(n)); + } else if (t == rule_node) { + lua_push_dir_par(L, rule_dir(n)); + } else if (t == local_par_node) { + lua_push_dir_par(L, local_par_dir(n)); + } else { + lua_pushnil(L); + } } else { lua_pushnil(L); } return 1; } +static int lua_nodelib_direct_setdir(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == dir_node) { + dir_dir(n) = nodelib_getdir(L, 2, 0); + } else if (t == hlist_node || type(n) == vlist_node) { + box_dir(n) = nodelib_getdir(L, 2, 1); + } else if (t == rule_node) { + rule_dir(n) = nodelib_getdir(L, 2, 1); + } else if (t == local_par_node) { + local_par_dir(n) = nodelib_getdir(L, 3, 1); + } + } + return 0; +} + +/* node.direct.getoffsets */ +/* node.direct.setoffsets */ + static int lua_nodelib_direct_getoffsets(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (type(n) == glyph_node) { + if ((n) && (type(n) == glyph_node)) { lua_pushinteger(L, x_displace(n)); lua_pushinteger(L, y_displace(n)); return 2; @@ -670,56 +862,98 @@ static int lua_nodelib_direct_getoffsets(lua_State * L) return 1; } -/* node.getdisc */ +static int lua_nodelib_direct_setoffsets(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if ((n) && (type(n) == glyph_node)) { + if ((lua_type(L, 2) == LUA_TNUMBER)) { + x_displace(n) = (halfword) lua_tointeger(L, 2); + } + if ((lua_type(L, 3) == LUA_TNUMBER)) { + y_displace(n) = (halfword) lua_tointeger(L, 3); + } + } + return 0; +} + +/* node.direct.getdisc */ +/* node.direct.setdisc */ -static int lua_nodelib_direct_getdiscretionary(lua_State * L) +static int lua_nodelib_direct_getdisc(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n != null) { - if (type(n) == disc_node) { - nodelib_pushdirect_or_nil(vlink(pre_break(n))); - nodelib_pushdirect_or_nil(vlink(post_break(n))); - nodelib_pushdirect_or_nil(vlink(no_break(n))); - if (lua_isboolean(L, 2)) { - if (lua_toboolean(L, 2)) { - nodelib_pushdirect_or_nil(tlink(pre_break(n))); - nodelib_pushdirect_or_nil(tlink(post_break(n))); - nodelib_pushdirect_or_nil(tlink(no_break(n))); - return 6; + if ((n) && (type(n) == disc_node)) { + nodelib_pushdirect_or_nil(vlink(pre_break(n))); + nodelib_pushdirect_or_nil(vlink(post_break(n))); + nodelib_pushdirect_or_nil(vlink(no_break(n))); + if (lua_isboolean(L, 2) && lua_toboolean(L, 2)) { + nodelib_pushdirect_or_nil(tlink(pre_break(n))); + nodelib_pushdirect_or_nil(tlink(post_break(n))); + nodelib_pushdirect_or_nil(tlink(no_break(n))); + return 6; + } + return 3; + } else { + return 0; + } +} + +static int lua_nodelib_direct_setdisc(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (type(n) == disc_node) { + int t = lua_gettop(L) ; + if (t > 1) { + set_disc_field(pre_break(n), lua_tointeger(L,2)); + if (t > 2) { + set_disc_field(post_break(n), lua_tointeger(L,3)); + if (t > 3) { + set_disc_field(no_break(n), lua_tointeger(L,4)); + if (t > 4) { + subtype(n) = (quarterword) lua_tointeger(L,5); + if (t > 5) { + disc_penalty(n) = lua_tointeger(L,6); + } + } + } else { + set_disc_field(no_break(n), null); } + } else { + set_disc_field(post_break(n), null); + set_disc_field(no_break(n), null); } - return 3; + } else { + set_disc_field(pre_break(n), null); + set_disc_field(post_break(n), null); + set_disc_field(no_break(n), null); } } - lua_pushnil(L); - return 1; + return 0; } -static int lua_nodelib_getdiscretionary(lua_State * L) -{ - halfword *a; - halfword *n = lua_touserdata(L, 1); - if (n != NULL) { - if (type(*n) == disc_node) { + /* node.getdisc */ + + static int lua_nodelib_getdisc(lua_State * L) + { + halfword *a; + halfword *n = lua_touserdata(L, 1); + if ((n != NULL) && (type(*n) == disc_node)) { fast_metatable_or_nil(vlink(pre_break(*n))); fast_metatable_or_nil(vlink(post_break(*n))); fast_metatable_or_nil(vlink(no_break(*n))); - if (lua_isboolean(L, 2)) { - if (lua_toboolean(L, 2)) { - fast_metatable_or_nil(tlink(pre_break(*n))); - fast_metatable_or_nil(tlink(post_break(*n))); - fast_metatable_or_nil(tlink(no_break(*n))); - return 6; - } + if (lua_isboolean(L, 2) && lua_toboolean(L, 2)) { + fast_metatable_or_nil(tlink(pre_break(*n))); + fast_metatable_or_nil(tlink(post_break(*n))); + fast_metatable_or_nil(tlink(no_break(*n))); + return 6; } return 3; } + return 0; } - lua_pushnil(L); - return 1; -} -/* getwhd: only core nodes */ +/* node.direct.getwhd */ +/* node.direct.setwhd */ #define push_list_whd(n) \ lua_pushinteger(L, width(n)); \ @@ -756,31 +990,6 @@ static int lua_nodelib_direct_getwhd(lua_State * L) return 0; } -static int lua_nodelib_getwhd(lua_State * L) -{ - halfword *n = lua_touserdata(L, 1); - if (n != NULL) { - halfword t = type(*n); - if ((t == hlist_node) || (t == vlist_node) || (t == rule_node) || (t == unset_node)) { - push_list_whd(*n); - return 3; - } else if (t == glyph_node) { - push_char_whd(*n); - return 3; - } else if (t == glue_node) { - halfword l = leader_ptr(*n); - if (l != null) { - t = type(l) ; - if ((t == hlist_node) || (t == vlist_node) || (t == rule_node)) { - push_list_whd(l); - return 3; - } - } - } - } - return 0; -} - static int lua_nodelib_direct_setwhd(lua_State * L) { halfword n = lua_tointeger(L, 1); @@ -822,49 +1031,32 @@ static int lua_nodelib_direct_setwhd(lua_State * L) return 0; } -/* node.getlist */ - -static int lua_nodelib_getlist(lua_State * L) -{ - halfword *a; - halfword *n = lua_touserdata(L, 1); - if ((n == NULL) || (! lua_getmetatable(L,1))) { - lua_pushnil(L); - } else if ((type(*n) == hlist_node) || (type(*n) == vlist_node)) { - fast_metatable_or_nil_alink(list_ptr(*n)); - } else if ((type(*n) == sub_box_node) || (type(*n) == sub_mlist_node)) { - fast_metatable_or_nil_alink(math_list(*n)); - } else { - lua_pushnil(L); - } - return 1; -} - -/* + /* node.getwhd */ -static int lua_nodelib_setlist(lua_State * L) -{ - halfword *n = lua_touserdata(L, 1); - if (n != null) { - if ((type(*n) == hlist_node) || (type(*n) == vlist_node)) { - if (lua_type(L,2) == LUA_TNIL) { - list_ptr(n) = null; - } else { - halfword *l = lua_touserdata(L, 2); - list_ptr(n) = l; - } - } else { - if (lua_type(L,2) == LUA_TNIL) { - math_list(n) = null; - } else { - halfword *l = lua_touserdata(L, 2); - math_list(n) = l; + static int lua_nodelib_getwhd(lua_State * L) + { + halfword *n = lua_touserdata(L, 1); + if (n != NULL) { + halfword t = type(*n); + if ((t == hlist_node) || (t == vlist_node) || (t == rule_node) || (t == unset_node)) { + push_list_whd(*n); + return 3; + } else if (t == glyph_node) { + push_char_whd(*n); + return 3; + } else if (t == glue_node) { + halfword l = leader_ptr(*n); + if (l != null) { + t = type(l) ; + if ((t == hlist_node) || (t == vlist_node) || (t == rule_node)) { + push_list_whd(l); + return 3; + } + } } + } + return 0; } - return 0; -} - -*/ /* node.direct.getlist */ @@ -916,30 +1108,31 @@ static int lua_nodelib_direct_setlist(lua_State * L) return 0; } -/* node.getleader */ + /* node.getlist */ -static int lua_nodelib_getleader(lua_State * L) -{ - halfword *a; - halfword *n = lua_touserdata(L, 1); - if ( (n == NULL) || (! lua_getmetatable(L,1)) ) { - lua_pushnil(L); - } else if (type(*n) == glue_node) { - fast_metatable_or_nil(leader_ptr(*n)); - } else { - lua_pushnil(L); + static int lua_nodelib_getlist(lua_State * L) + { + halfword *a; + halfword *n = lua_touserdata(L, 1); + if ((n == NULL) || (! lua_getmetatable(L,1))) { + lua_pushnil(L); + } else if ((type(*n) == hlist_node) || (type(*n) == vlist_node)) { + fast_metatable_or_nil_alink(list_ptr(*n)); + } else if ((type(*n) == sub_box_node) || (type(*n) == sub_mlist_node)) { + fast_metatable_or_nil_alink(math_list(*n)); + } else { + lua_pushnil(L); + } + return 1; } - return 1; -} /* node.direct.getleader */ +/* node.direct.setleader */ static int lua_nodelib_direct_getleader(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (type(n) == glue_node) { + if ((n) && (type(n) == glue_node)) { nodelib_pushdirect_or_nil(leader_ptr(n)); } else { lua_pushnil(L); @@ -947,10 +1140,10 @@ static int lua_nodelib_direct_getleader(lua_State * L) return 1; } -static int lua_nodelib_direct_setleader(lua_State * L) + static int lua_nodelib_direct_setleader(lua_State * L) { halfword n = lua_tointeger(L, 1); - if ((n != null) && (type(n) == glue_node)) { + if ((n) && (type(n) == glue_node)) { if (lua_type(L,2) == LUA_TNUMBER) { leader_ptr(n) = (halfword) lua_tointeger(L, 2); } else { @@ -960,164 +1153,241 @@ static int lua_nodelib_direct_setleader(lua_State * L) return 0; } -/* node.getnext */ + /* node.getleader */ -static int lua_nodelib_getnext(lua_State * L) + static int lua_nodelib_getleader(lua_State * L) + { + halfword *a; + halfword *n = lua_touserdata(L, 1); + if ((n == NULL) || (! lua_getmetatable(L,1)) ) { + lua_pushnil(L); + } else if (type(*n) == glue_node) { + fast_metatable_or_nil(leader_ptr(*n)); + } else { + lua_pushnil(L); + } + return 1; + } + +/* node.direct.getnext */ +/* node.direct.setnext */ + +static int lua_nodelib_direct_getnext(lua_State * L) { - halfword *a; - /* [given-node] [...]*/ - halfword *p = lua_touserdata(L, 1); - if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { + halfword p = lua_tointeger(L, 1); + if (p == null) { lua_pushnil(L); } else { - /* [given-node] [mt-given-node]*/ - lua_get_metatablelua(luatex_node); - /* [given-node] [mt-given-node] [mt-node]*/ - if (!lua_rawequal(L, -1, -2)) { - lua_pushnil(L); + nodelib_pushdirect_or_nil(vlink(p)); + } + return 1; +} + +static int lua_nodelib_direct_setnext(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + if (lua_type(L, 2) == LUA_TNUMBER) { + vlink(n) = (halfword) lua_tointeger(L, 2); } else { - fast_metatable_or_nil(vlink(*p)); + vlink(n) = null; } } - return 1; /* just one*/ + return 0; } -/* node.fast.getnext + /* node.getnext */ - static int lua_nodelib_fast_getnext(lua_State * L) + static int lua_nodelib_getnext(lua_State * L) { halfword *a; + /* [given-node] [...]*/ halfword *p = lua_touserdata(L, 1); - if ((p == NULL) || (!vlink(*p))){ + if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { lua_pushnil(L); } else { - lua_settop(L,1); - lua_getmetatable(L,1); - a = lua_newuserdata(L, sizeof(halfword)); - *a = vlink(*p); - lua_replace(L,1); - lua_setmetatable(L,1); + /* [given-node] [mt-given-node]*/ + lua_get_metatablelua(luatex_node); + /* [given-node] [mt-given-node] [mt-node]*/ + if (!lua_rawequal(L, -1, -2)) { + lua_pushnil(L); + } else { + fast_metatable_or_nil(vlink(*p)); + } } - return 1; + return 1; /* just one*/ } -*/ - -/* node.direct.getnext */ +/* node.direct.getprev */ +/* node.direct.setprev */ -static int lua_nodelib_direct_getnext(lua_State * L) +static int lua_nodelib_direct_getprev(lua_State * L) { halfword p = lua_tointeger(L, 1); if (p == null) { lua_pushnil(L); - } else if ((lua_type(L, 2) == LUA_TNUMBER)) { - /* experiment */ - int n = lua_tointeger(L,2); - while (p != null && n > 0) { - p = vlink(p); - n -= 1; - } - nodelib_pushdirect_or_nil(p); } else { - nodelib_pushdirect_or_nil(vlink(p)); + nodelib_pushdirect_or_nil(alink(p)); } return 1; } -/* node.getprev */ - -static int lua_nodelib_getprev(lua_State * L) +static int lua_nodelib_direct_setprev(lua_State * L) { - halfword *a; - halfword *p = lua_touserdata(L, 1); - if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { - lua_pushnil(L); - } else { - /* experiment */ - lua_get_metatablelua(luatex_node); - if (!lua_rawequal(L, -1, -2)) { - lua_pushnil(L); + halfword n = lua_tointeger(L, 1); + if (n) { + if (lua_type(L, 2) == LUA_TNUMBER) { + alink(n) = (halfword) lua_tointeger(L, 2); } else { - fast_metatable_or_nil(alink(*p)); + alink(n) = null; } } - return 1; + return 0; } -static int lua_nodelib_getboth(lua_State * L) + /* node.getprev */ + + static int lua_nodelib_getprev(lua_State * L) + { + halfword *a; + halfword *p = lua_touserdata(L, 1); + if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { + lua_pushnil(L); + } else { + lua_get_metatablelua(luatex_node); + if (!lua_rawequal(L, -1, -2)) { + lua_pushnil(L); + } else { + fast_metatable_or_nil(alink(*p)); + } + } + return 1; + } + +/* node.direct.getboth */ +/* node.direct.setboth */ + +static int lua_nodelib_direct_getboth(lua_State * L) { - halfword *a; - halfword *p = lua_touserdata(L, 1); - if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { + halfword n = lua_tointeger(L, 1); + if (n) { + nodelib_pushdirect_or_nil(alink(n)); + nodelib_pushdirect_or_nil(vlink(n)); + } else { lua_pushnil(L); lua_pushnil(L); - } else { - lua_get_metatablelua(luatex_node); - if (!lua_rawequal(L, -1, -2)) { - lua_pushnil(L); - lua_pushnil(L); + } + return 2; +} + +static int lua_nodelib_direct_setboth(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + if (lua_type(L, 2) == LUA_TNUMBER) { + alink(n) = (halfword) lua_tointeger(L, 2); } else { - fast_metatable_or_nil(alink(*p)); - fast_metatable_or_nil(vlink(*p)); + alink(n) = null; + } + if (lua_type(L, 3) == LUA_TNUMBER) { + vlink(n) = (halfword) lua_tointeger(L, 3); + } else { + vlink(n) = null; } } - return 2; + return 0; } -/* node.fast.getprev + /* node.getboth */ - static int lua_nodelib_fast_getprev(lua_State * L) + static int lua_nodelib_getboth(lua_State * L) { halfword *a; halfword *p = lua_touserdata(L, 1); - if ((p == NULL) || (!alink(*p))) { + if ( (p == NULL) || (! lua_getmetatable(L,1)) ) { + lua_pushnil(L); lua_pushnil(L); } else { - lua_settop(L,1); - lua_getmetatable(L,1); - a = lua_newuserdata(L, sizeof(halfword)); - *a = alink(*p); - lua_replace(L,1); - lua_setmetatable(L,1); + lua_get_metatablelua(luatex_node); + if (lua_rawequal(L, -1, -2)) { + fast_metatable_or_nil(alink(*p)); + fast_metatable_or_nil(vlink(*p)); + } else { + lua_pushnil(L); + lua_pushnil(L); + } } - return 1; + return 2; } -*/ +/* node.direct.setlink */ +/* node.direct.setsplit */ -/* node.direct.getprev */ +/* + a b b nil c d : prev-a-b-c-next + nil a b b nil c d nil : nil-a-b-c-nil +*/ -static int lua_nodelib_direct_getprev(lua_State * L) +static int lua_nodelib_direct_setlink(lua_State * L) { - halfword p = lua_tointeger(L, 1); - if (p == null) { - lua_pushnil(L); - } else if ((lua_type(L, 2) == LUA_TNUMBER)) { - int n = lua_tointeger(L,2); - while (p != null && n > 0) { - p = alink(p); - n -= 1; + int n = lua_gettop(L); + int i; + halfword h = null; /* head node */ + halfword t = null; /* tail node */ + halfword c = null; /* current node */ + for (i=1;i<=n;i++) { + /* + we don't go for the tail of the current node because we can inject + between existing nodes and the nodes themselves can have old values + for prev and next, so ... only single nodes are looked at! + */ + if (lua_type(L, i) == LUA_TNUMBER) { + c = lua_tointeger(L, i); + if (c != t) { + if (t != null) { + vlink(t) = c; + alink(c) = t; + } else if (i > 1) { + /* we assume that the first node is a kind of head */ + alink(c) = null; + } + t = c; + if (h == null) { + h = t; + } + } else { + /* we ignore duplicate nodes which can be tails or the previous */ + } + } else if (t == null) { + /* we just ignore nil nodes and have no tail yet */ + } else { + /* safeguard: a nil in the list can be meant as end so we nil the next of tail */ + vlink(t) = null; } - nodelib_pushdirect_or_nil(p); + } + if (h == null) { + /* no head */ + lua_pushnil(L); } else { - nodelib_pushdirect_or_nil(alink(p)); + /* first valid head */ + lua_pushinteger(L,h); } return 1; } -/* node.direct.getboth */ - -static int lua_nodelib_direct_getboth(lua_State * L) +static int lua_nodelib_direct_setsplit(lua_State * L) { - halfword p = lua_tointeger(L, 1); - if (p == null) { - lua_pushnil(L); - lua_pushnil(L); - } else { - nodelib_pushdirect_or_nil(alink(p)); - nodelib_pushdirect_or_nil(vlink(p)); + if (lua_type(L, 1) == LUA_TNUMBER && (lua_type(L, 2) == LUA_TNUMBER)) { + halfword l = lua_tointeger(L, 1); + halfword r = lua_tointeger(L, 2); + if (l != r) { + alink(vlink(l)) = null; + vlink(alink(r)) = null; + } + vlink(l) = null; + alink(r) = null; } - return 2; + return 0; } /* node.subtype (maybe also return them for other node types now) */ @@ -2539,6 +2809,9 @@ static int lua_nodelib_find_attribute(lua_State * L) /* returns attr value and n } /* node.direct.get_attribute */ +/* node.direct.set_attribute */ +/* node.direct.unset_attribute */ +/* node.direct.find_attribute */ static int lua_nodelib_direct_get_attribute(lua_State * L) { @@ -2570,6 +2843,26 @@ static int lua_nodelib_direct_get_attribute(lua_State * L) return 1; } +static int lua_nodelib_direct_set_attribute(lua_State * L) +{ + int i, val; + halfword n = lua_tointeger(L, 1); + if (n == null) + return 0; + if (lua_gettop(L) == 3) { + i = (int) lua_tointeger(L, 2); + val = (int) lua_tointeger(L, 3); + if (val == UNUSED_ATTRIBUTE) { + (void) unset_attribute(n, i, val); + } else { + set_attribute(n, i, val); + } + } else { + luaL_error(L, "incorrect number of arguments"); + } + return 0; +} + static int lua_nodelib_direct_find_attribute(lua_State * L) /* returns attr value and node */ { halfword c = lua_tointeger(L, 1); @@ -2607,36 +2900,35 @@ static int lua_nodelib_direct_find_attribute(lua_State * L) /* returns attr valu return 0; } -/* node.set_attribute */ - -static int lua_nodelib_set_attribute(lua_State * L) +static int lua_nodelib_direct_unset_attribute(lua_State * L) { - if (lua_gettop(L) == 3) { - int i = lua_tointeger(L, 2); - int val = lua_tointeger(L, 3); - halfword n = *check_isnode(L, 1); - if (val == UNUSED_ATTRIBUTE) { - (void) unset_attribute(n, i, val); + halfword n = lua_tointeger(L, 1); + if (n == null) { + lua_pushnil(L); + } else if (lua_gettop(L) <= 3) { /* a useless test, we never test for that elsewhere */ + int i = (int)luaL_checknumber(L, 2); + int val = (int)luaL_optnumber(L, 3, UNUSED_ATTRIBUTE); + int ret = unset_attribute(n, i, val); + if (ret > UNUSED_ATTRIBUTE) { + lua_pushinteger(L, ret); } else { - set_attribute(n, i, val); + lua_pushnil(L); } - } else { - luaL_error(L, "incorrect number of arguments"); + } else { /* can go */ + return luaL_error(L, "incorrect number of arguments"); } - return 0; + return 1; } -/* node.direct.set_attribute */ +/* node.set_attribute */ +/* node.unset_attribute */ -static int lua_nodelib_direct_set_attribute(lua_State * L) +static int lua_nodelib_set_attribute(lua_State * L) { - int i, val; - halfword n = lua_tointeger(L, 1); - if (n == null) - return 0; if (lua_gettop(L) == 3) { - i = (int) lua_tointeger(L, 2); - val = (int) lua_tointeger(L, 3); + int i = lua_tointeger(L, 2); + int val = lua_tointeger(L, 3); + halfword n = *check_isnode(L, 1); if (val == UNUSED_ATTRIBUTE) { (void) unset_attribute(n, i, val); } else { @@ -2648,8 +2940,6 @@ static int lua_nodelib_direct_set_attribute(lua_State * L) return 0; } -/* node.unset_attribute */ - static int lua_nodelib_unset_attribute(lua_State * L) { if (lua_gettop(L) <= 3) { @@ -2668,178 +2958,272 @@ static int lua_nodelib_unset_attribute(lua_State * L) } } -/* node.direct.unset_attribute */ +/* node.direct.getwidth */ +/* node.direct.setwidth */ +/* node.direct.getheight (for consistency) */ +/* node.direct.setheight (for consistency) */ +/* node.direct.getdepth (for consistency) */ +/* node.direct.setdepth (for consistency) */ -static int lua_nodelib_direct_unset_attribute(lua_State * L) +/* split ifs for clearity .. compiler will optimize */ + +static int lua_nodelib_direct_getwidth(lua_State * L) { halfword n = lua_tointeger(L, 1); - if (n == null) { - lua_pushnil(L); - } else if (lua_gettop(L) <= 3) { /* a useless test, we never test for that elsewhere */ - int i = (int)luaL_checknumber(L, 2); - int val = (int)luaL_optnumber(L, 3, UNUSED_ATTRIBUTE); - int ret = unset_attribute(n, i, val); - if (ret > UNUSED_ATTRIBUTE) { - lua_pushinteger(L, ret); + if (n) { + halfword t = type(n); + if (t == hlist_node || t == vlist_node || t == rule_node) { + lua_pushinteger(L,width(n)); + } else if (t == glyph_node) { + lua_pushinteger(L, char_width(font(n),character(n))); + } else if (t == glue_node || t == glue_spec_node || t == math_node || t == ins_node) { + lua_pushinteger(L,width(n)); + } else if (t == kern_node || t == margin_kern_node) { + lua_pushinteger(L,width(n)); + } else if (t == unset_node) { + lua_pushinteger(L,width(n)); } else { lua_pushnil(L); } - } else { /* can go */ - return luaL_error(L, "incorrect number of arguments"); + } else { + lua_pushnil(L); } return 1; } -/* glue */ +static int lua_nodelib_direct_setwidth(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == hlist_node || t == vlist_node || t == rule_node || t == glue_node || t == glue_spec_node || t == math_node || + t == kern_node || t == margin_kern_node || t == ins_node || t == unset_node) { + if (lua_type(L, 2) == LUA_TNUMBER) { + width(n) = lua_tointeger(L,2); + } else { + width(n) = 0; + } + } + } + return 0; +} -static int lua_nodelib_set_glue(lua_State * L) +static int lua_nodelib_direct_getheight(lua_State * L) { - halfword n = *check_isnode(L, 1); - int top = lua_gettop(L) ; - if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node || type(n) == math_node)) { - width(n) = ((top > 1 && lua_type(L, 2) == LUA_TNUMBER)) ? lua_roundnumber(L,2) : 0; - stretch(n) = ((top > 2 && lua_type(L, 3) == LUA_TNUMBER)) ? lua_roundnumber(L,3) : 0; - shrink(n) = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_roundnumber(L,4) : 0; - stretch_order(n) = ((top > 4 && lua_type(L, 5) == LUA_TNUMBER)) ? lua_tointeger(L,5) : 0; - shrink_order(n) = ((top > 5 && lua_type(L, 6) == LUA_TNUMBER)) ? lua_tointeger(L,6) : 0; - return 0; + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == hlist_node || t == vlist_node || t == rule_node) { + lua_pushinteger(L,height(n)); + } else if (t == glyph_node) { + lua_pushinteger(L, char_height(font(n),character(n))); + } else if (t == unset_node || t == ins_node) { + lua_pushinteger(L,height(n)); + } else { + lua_pushnil(L); + } } else { - return luaL_error(L, "glue (spec) expected"); + lua_pushnil(L); } + return 1; } -static int lua_nodelib_direct_set_glue(lua_State * L) +static int lua_nodelib_direct_setheight(lua_State * L) { halfword n = lua_tointeger(L, 1); - int top = lua_gettop(L) ; - if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node || type(n) == math_node)) { - width(n) = ((top > 1 && lua_type(L, 2) == LUA_TNUMBER)) ? lua_roundnumber(L,2) : 0; - stretch(n) = ((top > 2 && lua_type(L, 3) == LUA_TNUMBER)) ? lua_roundnumber(L,3) : 0; - shrink(n) = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_roundnumber(L,4) : 0; - stretch_order(n) = ((top > 4 && lua_type(L, 5) == LUA_TNUMBER)) ? lua_tointeger(L,5) : 0; - shrink_order(n) = ((top > 5 && lua_type(L, 6) == LUA_TNUMBER)) ? lua_tointeger(L,6) : 0; - return 0; - } else { - return luaL_error(L, "glue (spec) expected"); + if (n) { + halfword t = type(n); + if (t == hlist_node || t == vlist_node || t == rule_node || t == unset_node) { + if (lua_type(L, 2) == LUA_TNUMBER) { + height(n) = lua_tointeger(L,2); + } else { + height(n) = 0; + } + } } + return 0; } -static int lua_nodelib_get_glue(lua_State * L) +static int lua_nodelib_direct_getdepth(lua_State * L) { - halfword n = *check_isnode(L, 1); - if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node || type(n) == math_node)) { - int b = -1; /* false: only width, true or unset: 5 values */ - if (lua_gettop(L) == 2) { - b = lua_toboolean(L, 2); + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == hlist_node || t == vlist_node || t == rule_node) { + lua_pushinteger(L,depth(n)); + } else if (t == glyph_node) { + lua_pushinteger(L, char_depth(font(n),character(n))); + } else if (t == unset_node || t == ins_node) { + lua_pushinteger(L,depth(n)); + } else { + lua_pushnil(L); } - lua_pushinteger(L,width(n)); - if (b == 0) - return 1; - lua_pushinteger(L,stretch(n)); - lua_pushinteger(L,shrink(n)); - lua_pushinteger(L,stretch_order(n)); - lua_pushinteger(L,shrink_order(n)); - return 5; } else { - return luaL_error(L, "glue (spec) expected"); + lua_pushnil(L); } + return 1; } -static int lua_nodelib_direct_get_glue(lua_State * L) +static int lua_nodelib_direct_setdepth(lua_State * L) { halfword n = lua_tointeger(L, 1); - if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node || type(n) == math_node)) { - int b = -1; - if (lua_gettop(L) == 2) { - b = lua_toboolean(L, 2); + if (n) { + halfword t = type(n); + if (t == hlist_node || t == vlist_node || t == rule_node || t == unset_node) { + if (lua_type(L, 2) == LUA_TNUMBER) { + depth(n) = lua_tointeger(L,2); + } else { + depth(n) = 0; + } } - lua_pushinteger(L,width(n)); - if (b == 0) { + } + return 0; +} + +/* node.direct.getshift */ +/* node.direct.setshift */ + +static int lua_nodelib_direct_getshift(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == hlist_node || t == vlist_node) { + lua_pushinteger(L,shift_amount(n)); return 1; - } else { + } + } + lua_pushnil(L); + return 1; +} + +static int lua_nodelib_direct_setshift(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == hlist_node || t == vlist_node) { + if (lua_type(L, 2) == LUA_TNUMBER) { + shift_amount(n) = lua_tointeger(L,2); + } else { + shift_amount(n) = 0; + } + } + } + return 0; +} + +/* node.direct.getglue */ +/* node.direct.setglue */ +/* node.direct.is_zero_glue */ + +static int lua_nodelib_direct_get_glue(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if (n) { + halfword t = type(n); + if (t == glue_node || t == glue_spec_node || t == math_node || t == ins_node) { + lua_pushinteger(L,width(n)); lua_pushinteger(L,stretch(n)); lua_pushinteger(L,shrink(n)); lua_pushinteger(L,stretch_order(n)); lua_pushinteger(L,shrink_order(n)); return 5; } - } else { - return luaL_error(L, "glue (spec) expected"); } + return 0; } -static int lua_nodelib_is_zero_glue(lua_State * L) +static int lua_nodelib_direct_set_glue(lua_State * L) { - halfword n = *check_isnode(L, 1); - if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node || type(n) == math_node)) { - lua_pushboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0)); - return 1; - } else { - return luaL_error(L, "glue (spec) expected"); + halfword n = lua_tointeger(L, 1); + if (n) { + int top = lua_gettop(L); + halfword t = type(n); + if (t == glue_node || t == glue_spec_node || t == math_node) { + width(n) = ((top > 1 && lua_type(L, 2) == LUA_TNUMBER)) ? lua_roundnumber(L,2) : 0; + stretch(n) = ((top > 2 && lua_type(L, 3) == LUA_TNUMBER)) ? lua_roundnumber(L,3) : 0; + shrink(n) = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_roundnumber(L,4) : 0; + stretch_order(n) = ((top > 4 && lua_type(L, 5) == LUA_TNUMBER)) ? lua_tointeger(L,5) : 0; + shrink_order(n) = ((top > 5 && lua_type(L, 6) == LUA_TNUMBER)) ? lua_tointeger(L,6) : 0; + } } + return 0; } static int lua_nodelib_direct_is_zero_glue(lua_State * L) { halfword n = lua_tointeger(L, 1); - if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node || type(n) == math_node)) { - lua_pushboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0)); - return 1; - } else { - return luaL_error(L, "glue (spec) expected"); + if (n) { + halfword t = type(n); + if (t == glue_node || t == glue_spec_node || t == math_node || t == ins_node) { + lua_pushboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0)); + return 1; + } } + return luaL_error(L, "glue (spec) expected"); } -/* iteration */ +/* node.getglue */ +/* node.setglue */ +/* node.is_zero_glue */ -static int nodelib_aux_nil(lua_State * L) +static int lua_nodelib_get_glue(lua_State * L) { - lua_pushnil(L); - return 1; + halfword n = *check_isnode(L, 1); + if (n) { + halfword t = type(n); + if (t == glue_node || t == glue_spec_node || t == math_node || t== ins_node) { + lua_pushinteger(L,width(n)); + lua_pushinteger(L,stretch(n)); + lua_pushinteger(L,shrink(n)); + lua_pushinteger(L,stretch_order(n)); + lua_pushinteger(L,shrink_order(n)); + return 5; + } + } + return luaL_error(L, "glue (spec) expected"); } -/* node.traverse_id */ - -static int nodelib_aux_next_filtered(lua_State * L) +static int lua_nodelib_set_glue(lua_State * L) { - halfword t; /* traverser */ - halfword *a; - int i = (int) lua_tointeger(L, lua_upvalueindex(1)); - if (lua_isnil(L, 2)) { /* first call */ - t = *check_isnode(L, 1); - lua_settop(L,1); - } else { - t = *check_isnode(L, 2); - t = vlink(t); - lua_settop(L,2); - } - while (t != null && type(t) != i) { - t = vlink(t); - } - if (t == null) { - lua_pushnil(L); - } else { - fast_metatable_top(t); + halfword n = *check_isnode(L, 1); + int top = lua_gettop(L) ; + if (n) { + halfword t = type(n); + if (t == glue_node || t == glue_spec_node || t == math_node) { + width(n) = ((top > 1 && lua_type(L, 2) == LUA_TNUMBER)) ? lua_roundnumber(L,2) : 0; + stretch(n) = ((top > 2 && lua_type(L, 3) == LUA_TNUMBER)) ? lua_roundnumber(L,3) : 0; + shrink(n) = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_roundnumber(L,4) : 0; + stretch_order(n) = ((top > 4 && lua_type(L, 5) == LUA_TNUMBER)) ? lua_tointeger(L,5) : 0; + shrink_order(n) = ((top > 5 && lua_type(L, 6) == LUA_TNUMBER)) ? lua_tointeger(L,6) : 0; + } } - return 1; + return luaL_error(L, "glue (spec) expected"); + return 0; } -static int lua_nodelib_traverse_filtered(lua_State * L) +static int lua_nodelib_is_zero_glue(lua_State * L) { - halfword n; - if (lua_isnil(L, 2)) { - lua_pushcclosure(L, nodelib_aux_nil, 0); + halfword n = *check_isnode(L, 1); + if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node || type(n) == math_node || type(n) == ins_node)) { + lua_pushboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0)); return 1; } - n = *check_isnode(L, 2); - lua_pop(L, 1); /* the node, integer remains */ - lua_pushcclosure(L, nodelib_aux_next_filtered, 1); - lua_nodelib_push_fast(L, n); + return luaL_error(L, "glue (spec) expected"); +} + +/* iteration */ + +static int nodelib_aux_nil(lua_State * L) +{ lua_pushnil(L); - return 3; + return 1; } /* node.direct.traverse_id */ +/* node.direct.traverse */ +/* node.direct.traverse_char */ static int nodelib_direct_aux_next_filtered(lua_State * L) { @@ -2884,7 +3268,42 @@ static int lua_nodelib_direct_traverse_filtered(lua_State * L) return 3; } -/* node.direct.traverse_char */ +static int nodelib_direct_aux_next(lua_State * L) +{ + halfword t; /* traverser */ + if (lua_isnil(L, 2)) { /* first call */ + t = lua_tointeger(L,1) ; + lua_settop(L,1); + } else { + t = lua_tointeger(L,2) ; + t = vlink(t); + lua_settop(L,2); + } + if (t == null) { + lua_pushnil(L); + } else { + lua_pushinteger(L,t); + } + return 1; +} + +static int lua_nodelib_direct_traverse(lua_State * L) +{ + halfword n; + if (lua_isnil(L, 1)) { + lua_pushcclosure(L, nodelib_aux_nil, 0); + return 1; + } + n = (halfword) lua_tointeger(L, 1); + if (n == null) { + lua_pushcclosure(L, nodelib_aux_nil, 0); + return 1; + } + lua_pushcclosure(L, nodelib_direct_aux_next, 0); + lua_pushinteger(L,n); + lua_pushnil(L); + return 3; +} static int nodelib_direct_aux_next_char(lua_State * L) { @@ -2929,13 +3348,16 @@ static int lua_nodelib_direct_traverse_char(lua_State * L) return 3; } +/* node.traverse_id */ /* node.traverse */ +/* node.traverse_char */ -static int nodelib_aux_next(lua_State * L) +static int nodelib_aux_next_filtered(lua_State * L) { - halfword t; /* traverser */ - halfword *a; /* a or *a */ - if (lua_isnil(L, 2)) { /* first call */ + halfword t; /* traverser */ + halfword *a; + int i = (int) lua_tointeger(L, lua_upvalueindex(1)); + if (lua_isnil(L, 2)) { /* first call */ t = *check_isnode(L, 1); lua_settop(L,1); } else { @@ -2943,6 +3365,9 @@ static int nodelib_aux_next(lua_State * L) t = vlink(t); lua_settop(L,2); } + while (t != null && type(t) != i) { + t = vlink(t); + } if (t == null) { lua_pushnil(L); } else { @@ -2951,26 +3376,25 @@ static int nodelib_aux_next(lua_State * L) return 1; } -static int lua_nodelib_traverse(lua_State * L) +static int lua_nodelib_traverse_filtered(lua_State * L) { halfword n; - if (lua_isnil(L, 1)) { + if (lua_isnil(L, 2)) { lua_pushcclosure(L, nodelib_aux_nil, 0); return 1; } - n = *check_isnode(L, 1); - lua_pushcclosure(L, nodelib_aux_next, 0); + n = *check_isnode(L, 2); + lua_pop(L, 1); /* the node, integer remains */ + lua_pushcclosure(L, nodelib_aux_next_filtered, 1); lua_nodelib_push_fast(L, n); lua_pushnil(L); return 3; } -/* node.traverse_char */ - -static int nodelib_aux_next_char(lua_State * L) +static int nodelib_aux_next(lua_State * L) { halfword t; /* traverser */ - halfword *a; + halfword *a; /* a or *a */ if (lua_isnil(L, 2)) { /* first call */ t = *check_isnode(L, 1); lua_settop(L,1); @@ -2979,20 +3403,15 @@ static int nodelib_aux_next_char(lua_State * L) t = vlink(t); lua_settop(L,2); } - while (1) { - if (t == null) { - break; - } else if ((type(t) == glyph_node) && (subtype(t) < 256)){ - fast_metatable_top(t); - return 1; - } else { - t = vlink(t); - } + if (t == null) { + lua_pushnil(L); + } else { + fast_metatable_top(t); } return 1; } -static int lua_nodelib_traverse_char(lua_State * L) +static int lua_nodelib_traverse(lua_State * L) { halfword n; if (lua_isnil(L, 1)) { @@ -3000,47 +3419,47 @@ static int lua_nodelib_traverse_char(lua_State * L) return 1; } n = *check_isnode(L, 1); - lua_pushcclosure(L, nodelib_aux_next_char, 0); + lua_pushcclosure(L, nodelib_aux_next, 0); lua_nodelib_push_fast(L, n); lua_pushnil(L); return 3; } -/* node.direct.traverse */ - -static int nodelib_direct_aux_next(lua_State * L) +static int nodelib_aux_next_char(lua_State * L) { halfword t; /* traverser */ + halfword *a; if (lua_isnil(L, 2)) { /* first call */ - t = lua_tointeger(L,1) ; + t = *check_isnode(L, 1); lua_settop(L,1); } else { - t = lua_tointeger(L,2) ; + t = *check_isnode(L, 2); t = vlink(t); lua_settop(L,2); } - if (t == null) { - lua_pushnil(L); - } else { - lua_pushinteger(L,t); + while (1) { + if (t == null) { + break; + } else if ((type(t) == glyph_node) && (subtype(t) < 256)){ + fast_metatable_top(t); + return 1; + } else { + t = vlink(t); + } } return 1; } -static int lua_nodelib_direct_traverse(lua_State * L) +static int lua_nodelib_traverse_char(lua_State * L) { halfword n; if (lua_isnil(L, 1)) { lua_pushcclosure(L, nodelib_aux_nil, 0); return 1; } - n = (halfword) lua_tointeger(L, 1); - if (n == null) { - lua_pushcclosure(L, nodelib_aux_nil, 0); - return 1; - } - lua_pushcclosure(L, nodelib_direct_aux_next, 0); - lua_pushinteger(L,n); + n = *check_isnode(L, 1); + lua_pushcclosure(L, nodelib_aux_next_char, 0); + lua_nodelib_push_fast(L, n); lua_pushnil(L); return 3; } @@ -3060,23 +3479,8 @@ static int do_lua_nodelib_count(lua_State * L, halfword match, int i, halfword f return 1; } -/* node.length */ - -static int lua_nodelib_length(lua_State * L) -{ - halfword n; - halfword m = null; - if (lua_isnil(L, 1)) { - lua_pushinteger(L, 0); - return 1; - } - n = *check_isnode(L, 1); - if (lua_gettop(L) == 2) - m = *check_isnode(L, 2); - return do_lua_nodelib_count(L, m, -1, n); -} - /* node.direct.length */ +/* node.direct.count */ static int lua_nodelib_direct_length(lua_State * L) { @@ -3090,8 +3494,32 @@ static int lua_nodelib_direct_length(lua_State * L) return do_lua_nodelib_count(L, m, -1, n); } +static int lua_nodelib_direct_count(lua_State * L) +{ + return do_lua_nodelib_count(L, + (halfword) lua_tointeger(L, 3), /* m */ + (int) lua_tointeger(L, 1), /* i */ + (halfword) lua_tointeger(L, 2) /* n */ + ); +} + +/* node.length */ /* node.count */ +static int lua_nodelib_length(lua_State * L) +{ + halfword n; + halfword m = null; + if (lua_isnil(L, 1)) { + lua_pushinteger(L, 0); + return 1; + } + n = *check_isnode(L, 1); + if (lua_gettop(L) == 2) + m = *check_isnode(L, 2); + return do_lua_nodelib_count(L, m, -1, n); +} + static int lua_nodelib_count(lua_State * L) { halfword n; @@ -3107,17 +3535,6 @@ static int lua_nodelib_count(lua_State * L) return do_lua_nodelib_count(L, m, i, n); } -/* node.direct.count */ - -static int lua_nodelib_direct_count(lua_State * L) -{ - return do_lua_nodelib_count(L, - (halfword) lua_tointeger(L, 3), /* m */ - (int) lua_tointeger(L, 1), /* i */ - (halfword) lua_tointeger(L, 2) /* n */ - ); -} - /* getting and setting fields (helpers) */ int nodelib_getlist(lua_State * L, int n) @@ -4527,7 +4944,7 @@ static int lua_nodelib_direct_getfield(lua_State * L) lua_pushnil(L); } } else if (t == margin_kern_node) { - if (lua_key_eq(s, width)) { + if (lua_key_eq(s, kern) ||lua_key_eq(s, width)) { lua_pushinteger(L, width(n)); } else if (lua_key_eq(s, glyph)) { nodelib_pushdirect_or_nil(margin_char(n)); @@ -5861,7 +6278,7 @@ static int lua_nodelib_fast_setfield(lua_State * L) } else if (t == margin_kern_node) { if (lua_key_eq(s, subtype)) { subtype(n) = (quarterword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, width)) { + } else if (lua_key_eq(s, width) || lua_key_eq(s, kern)) { width(n) = (halfword) lua_roundnumber(L, 3); } else if (lua_key_eq(s, glyph)) { margin_char(n) = nodelib_getlist(L, 3); @@ -6235,271 +6652,8 @@ static int lua_nodelib_direct_setfield_whatsit(lua_State * L, int n, const char return 0; } -static int lua_nodelib_direct_setcharacter(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if ((n) && (lua_type(L, 2) == LUA_TNUMBER)) { - if (type(n) == glyph_node) { - character(n) = (halfword) lua_tointeger(L, 2); - } else if ((type(n) == math_char_node) || (type(n) == math_text_char_node)) { - math_character(n) = (halfword) lua_tointeger(L, 2); - } - } - return 0; -} - -static int lua_nodelib_direct_setfont(lua_State * L) /* family_font is not yet in manual, what does arg 2 do */ -{ - halfword n = lua_tointeger(L, 1); - if (n != null) { - halfword t = type(n); - /* mandate font */ - if (t == glyph_node) { - font(n) = (halfword) lua_tointeger(L,2); - /* optional char */ - if ((lua_type(L, 3) == LUA_TNUMBER)) { - character(n) = (halfword) lua_tointeger(L, 3); - } - } - } - return 0; -} - - -static int lua_nodelib_direct_setcomponents(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if ((n) && (lua_type(L, 2) == LUA_TNUMBER)) { - if (type(n) == glyph_node) { - lig_ptr(n) = (halfword) lua_tointeger(L, 2); - } - } - return 0; -} - -static int lua_nodelib_direct_setattributelist(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if ((n) && nodetype_has_attributes(type(n))) { - if (lua_type(L, 2) == LUA_TNUMBER) { - halfword a =lua_tointeger(L, 2); - if (type(a) == attribute_list_node) { - reassign_attribute(n,a); - } else if (nodetype_has_attributes(type(a))) { - reassign_attribute(n,node_attr(a)); - } else { - reassign_attribute(n,null); - } - } else { - reassign_attribute(n,null); - } - return 0; - } - return 0; -} - -static int lua_nodelib_direct_setlang(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if ((n) && (lua_type(L, 2) == LUA_TNUMBER)) { - if (type(n) == glyph_node) { - set_char_lang(n,lua_tointeger(L, 2)); - } - } - return 0; -} - -static int lua_nodelib_direct_setpenalty(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if (n == null) { - if (type(n) == penalty_node) { - if (lua_type(L, 2) == LUA_TNUMBER) { - penalty(n) = (halfword) lua_tointeger(L, 2); - } else { - penalty(n) = 0; - } - } else if (type(n) == disc_node) { - if (lua_type(L, 2) == LUA_TNUMBER) { - disc_penalty(n) = (halfword) lua_tointeger(L, 2); - } else { - penalty(n) = 0; - } - } - } - return 0; -} - -static int lua_nodelib_direct_setkern(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if (n != null) { - if (type(n) == kern_node || type(n) == margin_kern_node) { - if (lua_type(L, 2) == LUA_TNUMBER) { - width(n) = (halfword) lua_tointeger(L, 2); - } else { - width(n) = 0; - } - if (lua_type(L, 3) == LUA_TNUMBER) { - subtype(n) = (halfword) lua_tointeger(L, 3); - } - } else if (type(n) == math_node) { - if (lua_type(L, 2) == LUA_TNUMBER) { - surround(n) = (halfword) lua_tointeger(L, 2); - } else { - surround(n) = 0; - } - } - } - return 0; -} - -static int lua_nodelib_direct_setdir(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if (n != null) { - if (type(n) == dir_node) { - dir_dir(n) = nodelib_getdir(L, 2, 0); - } else if (type(n) == hlist_node || type(n) == vlist_node) { - box_dir(n) = nodelib_getdir(L, 2, 1); - } else if (type(n) == rule_node) { - rule_dir(n) = nodelib_getdir(L, 2, 1); - } else if (type(n) == local_par_node) { - local_par_dir(n) = nodelib_getdir(L, 3, 1); - } - } - return 0; -} - -static int lua_nodelib_direct_setoffsets(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if ((n) && (type(n) == glyph_node)) { - if ((lua_type(L, 2) == LUA_TNUMBER)) { - x_displace(n) = (halfword) lua_tointeger(L, 2); - } - if ((lua_type(L, 3) == LUA_TNUMBER)) { - y_displace(n) = (halfword) lua_tointeger(L, 3); - } - } - return 0; -} - -static int lua_nodelib_direct_setnext(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if (n) { - if (lua_type(L, 2) == LUA_TNUMBER) { - vlink(n) = (halfword) lua_tointeger(L, 2); - } else { - vlink(n) = null; - } - } - return 0; -} - -static int lua_nodelib_direct_setprev(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if (n) { - if (lua_type(L, 2) == LUA_TNUMBER) { - alink(n) = (halfword) lua_tointeger(L, 2); - } else { - alink(n) = null; - } - } - return 0; -} - -static int lua_nodelib_direct_setboth(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if (n) { - if (lua_type(L, 2) == LUA_TNUMBER) { - alink(n) = (halfword) lua_tointeger(L, 2); - } else { - alink(n) = null; - } - if (lua_type(L, 3) == LUA_TNUMBER) { - vlink(n) = (halfword) lua_tointeger(L, 3); - } else { - vlink(n) = null; - } - } - return 0; -} - -/* -static int lua_nodelib_direct_setlink(lua_State * L) -{ - if (lua_type(L, 1) == LUA_TNUMBER) { - halfword a = lua_tointeger(L, 1); - if (lua_type(L, 2) == LUA_TNUMBER) { - halfword b = lua_tointeger(L, 2); - vlink(a) = b; - alink(b) = a; - } else { - vlink(a) = null; - } - } else if (lua_type(L, 2) == LUA_TNUMBER) { - halfword b = lua_tointeger(L, 2); - alink(b) = null; - } - return 0; -} -*/ - -/* - a b b nil c d : prev-a-b-c-next - nil a b b nil c d nil : nil-a-b-c-nil -*/ - -static int lua_nodelib_direct_setlink(lua_State * L) -{ - int n = lua_gettop(L); - int i; - halfword h = null; /* head node */ - halfword t = null; /* tail node */ - halfword c = null; /* current node */ - for (i=1;i<=n;i++) { - /* - we don't go for the tail of the current node because we can inject - between existing nodes and the nodes themselves can have old values - for prev and next, so ... only single nodes are looked at! - */ - if (lua_type(L, i) == LUA_TNUMBER) { - c = lua_tointeger(L, i); - if (c != t) { - if (t != null) { - vlink(t) = c; - alink(c) = t; - } else if (i > 1) { - /* we assume that the first node is a kind of head */ - alink(c) = null; - } - t = c; - if (h == null) { - h = t; - } - } else { - /* we ignore duplicate nodes which can be tails or the previous */ - } - } else if (t == null) { - /* we just ignore nil nodes and have no tail yet */ - } else { - /* safeguard: a nil in the list can be meant as end so we nil the next of tail */ - vlink(t) = null; - } - } - if (h == null) { - /* no head */ - lua_pushnil(L); - } else { - /* first valid head */ - lua_pushinteger(L,h); - } - return 1; -} +/* direct.is_char */ +/* direct.is_glyph */ static int lua_nodelib_direct_is_char(lua_State * L) { @@ -6536,38 +6690,7 @@ static int lua_nodelib_direct_is_glyph(lua_State * L) return 2; } -static int lua_nodelib_direct_setdiscretionary(lua_State * L) -{ - halfword n = lua_tointeger(L, 1); - if (type(n) == disc_node) { - int t = lua_gettop(L) ; - if (t > 1) { - set_disc_field(pre_break(n), lua_tointeger(L,2)); - if (t > 2) { - set_disc_field(post_break(n), lua_tointeger(L,3)); - if (t > 3) { - set_disc_field(no_break(n), lua_tointeger(L,4)); - if (t > 4) { - subtype(n) = (quarterword) lua_tointeger(L,5); - if (t > 5) { - disc_penalty(n) = lua_tointeger(L,6); - } - } - } else { - set_disc_field(no_break(n), null); - } - } else { - set_disc_field(post_break(n), null); - set_disc_field(no_break(n), null); - } - } else { - set_disc_field(pre_break(n), null); - set_disc_field(post_break(n), null); - set_disc_field(no_break(n), null); - } - } - return 0; -} +/* direct.setfield */ static int lua_nodelib_direct_setfield(lua_State * L) { @@ -6960,7 +7083,7 @@ static int lua_nodelib_direct_setfield(lua_State * L) } else if (t == margin_kern_node) { if (lua_key_eq(s, subtype)) { subtype(n) = (quarterword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, width)) { + } else if (lua_key_eq(s, width) || lua_key_eq(s, width)) { width(n) = (halfword) lua_roundnumber(L, 3); } else if (lua_key_eq(s, glyph)) { margin_char(n) = nodelib_popdirect(3); @@ -7112,8 +7235,10 @@ static int direct_get_box_id(lua_State * L, int i) } /* node.getbox = tex.getbox */ +/* node.setbox = tex.setbox */ /* node.direct.getbox */ +/* node.direct.setbox */ static int lua_nodelib_direct_getbox(lua_State * L) { @@ -7129,9 +7254,6 @@ static int lua_nodelib_direct_getbox(lua_State * L) return 1; } -/* node.setbox = tex.setbox */ -/* node.setbox */ - static int lua_nodelib_direct_setbox(lua_State * L) { int isglobal = 0; @@ -7504,15 +7626,19 @@ static const struct luaL_Reg direct_nodelib_f[] = { {"flush_node", lua_nodelib_direct_flush_node}, {"free", lua_nodelib_direct_free}, {"getbox", lua_nodelib_direct_getbox}, - {"getchar", lua_nodelib_direct_getcharacter}, + {"getchar", lua_nodelib_direct_getchar}, {"getcomponents", lua_nodelib_direct_getcomponents}, {"getlang", lua_nodelib_direct_getlang}, {"getkern", lua_nodelib_direct_getkern}, {"getpenalty", lua_nodelib_direct_getpenalty}, {"getdir", lua_nodelib_direct_getdir}, {"getoffsets", lua_nodelib_direct_getoffsets}, - {"getdisc", lua_nodelib_direct_getdiscretionary}, + {"getdisc", lua_nodelib_direct_getdisc}, {"getwhd", lua_nodelib_direct_getwhd}, + {"getwidth", lua_nodelib_direct_getwidth}, + {"getheight", lua_nodelib_direct_getheight}, + {"getdepth", lua_nodelib_direct_getdepth}, + {"getshift", lua_nodelib_direct_getshift}, {"getfield", lua_nodelib_direct_getfield}, {"getfont", lua_nodelib_direct_getfont}, {"getid", lua_nodelib_direct_getid}, @@ -7523,6 +7649,9 @@ static const struct luaL_Reg direct_nodelib_f[] = { {"getleader", lua_nodelib_direct_getleader}, {"getsubtype", lua_nodelib_direct_getsubtype}, {"getattributelist", lua_nodelib_direct_getattributelist}, + {"getnucleus", lua_nodelib_direct_getnucleus}, + {"getsub", lua_nodelib_direct_getsub}, + {"getsup", lua_nodelib_direct_getsup}, {"has_glyph", lua_nodelib_direct_has_glyph}, {"has_attribute", lua_nodelib_direct_has_attribute}, {"get_attribute", lua_nodelib_direct_get_attribute}, @@ -7550,7 +7679,7 @@ static const struct luaL_Reg direct_nodelib_f[] = { {"set_attribute", lua_nodelib_direct_set_attribute}, {"setbox", lua_nodelib_direct_setbox}, {"setfield", lua_nodelib_direct_setfield}, - {"setchar", lua_nodelib_direct_setcharacter}, + {"setchar", lua_nodelib_direct_setchar}, {"setfont", lua_nodelib_direct_setfont}, {"setcomponents", lua_nodelib_direct_setcomponents}, {"setlang", lua_nodelib_direct_setlang}, @@ -7558,16 +7687,24 @@ static const struct luaL_Reg direct_nodelib_f[] = { {"setpenalty", lua_nodelib_direct_setpenalty}, {"setdir", lua_nodelib_direct_setdir}, {"setoffsets", lua_nodelib_direct_setoffsets}, - {"setdisc", lua_nodelib_direct_setdiscretionary}, + {"setdisc", lua_nodelib_direct_setdisc}, {"setwhd", lua_nodelib_direct_setwhd}, + {"setwidth", lua_nodelib_direct_setwidth}, + {"setheight", lua_nodelib_direct_setheight}, + {"setdepth", lua_nodelib_direct_setdepth}, + {"setshift", lua_nodelib_direct_setshift}, {"setnext", lua_nodelib_direct_setnext}, {"setprev", lua_nodelib_direct_setprev}, {"setboth", lua_nodelib_direct_setboth}, {"setlink", lua_nodelib_direct_setlink}, + {"setsplit", lua_nodelib_direct_setsplit}, {"setlist", lua_nodelib_direct_setlist}, {"setleader", lua_nodelib_direct_setleader}, {"setsubtype", lua_nodelib_direct_setsubtype}, {"setattributelist", lua_nodelib_direct_setattributelist}, + {"setnucleus", lua_nodelib_direct_setnucleus}, + {"setsub", lua_nodelib_direct_setsub}, + {"setsup", lua_nodelib_direct_setsup}, {"slide", lua_nodelib_direct_slide}, /* {"subtype", lua_nodelib_subtype}, */ /* no node argument */ {"tail", lua_nodelib_direct_tail}, @@ -7621,14 +7758,14 @@ static const struct luaL_Reg nodelib_f[] = { {"getnext", lua_nodelib_getnext}, {"getprev", lua_nodelib_getprev}, {"getboth", lua_nodelib_getboth}, - {"getdisc", lua_nodelib_getdiscretionary}, + {"getdisc", lua_nodelib_getdisc}, {"getwhd", lua_nodelib_getwhd}, {"getlist", lua_nodelib_getlist}, {"getleader", lua_nodelib_getleader}, {"getid", lua_nodelib_getid}, {"getsubtype", lua_nodelib_getsubtype}, {"getfont", lua_nodelib_getfont}, - {"getchar", lua_nodelib_getcharacter}, + {"getchar", lua_nodelib_getchar}, {"getfield", lua_nodelib_getfield}, {"setfield", lua_nodelib_setfield}, {"has_glyph", lua_nodelib_has_glyph}, diff --git a/Build/source/texk/web2c/luatexdir/lua/ltexlib.c b/Build/source/texk/web2c/luatexdir/lua/ltexlib.c index 04ab2c8079d..a38b608e40f 100644 --- a/Build/source/texk/web2c/luatexdir/lua/ltexlib.c +++ b/Build/source/texk/web2c/luatexdir/lua/ltexlib.c @@ -898,21 +898,11 @@ static int setglue(lua_State * L) top -= 1; } /* [global] slot [width] [stretch] [shrink] [stretch_order] [shrink_order] */ - if (top > 1) { - width(value) = lua_roundnumber(L,index+1); - } - if (top > 2) { - stretch(value) = lua_roundnumber(L,index+2); - } - if (top > 3) { - shrink(value) = lua_roundnumber(L,index+3); - } - if (top > 4) { - stretch_order(value) = lua_tointeger(L,index+4); - } - if (top > 5) { - shrink_order(value) = lua_tointeger(L,index+5); - } + if (top > 1) { width(value) = lua_roundnumber(L,index+1); } + if (top > 2) { stretch(value) = lua_roundnumber(L,index+2); } + if (top > 3) { shrink(value) = lua_roundnumber(L,index+3); } + if (top > 4) { stretch_order(value) = lua_tointeger(L,index+4); } + if (top > 5) { shrink_order(value) = lua_tointeger(L,index+5); } set_item_index_plus(L, index, skip_base, "skip", value, isglobal, is_glue_assign, set_tex_skip_register, true); return 0; } @@ -921,24 +911,15 @@ static int getglue(lua_State * L) { int value = 0; int top = lua_gettop(L); - int b = -1; /* false: only width, true or unset: 5 values */ - if (lua_type(L, top) == LUA_TBOOLEAN) { - b = lua_toboolean(L, top); - top -= 1 ; - } get_item_index_plus(L, top, skip_base, "skip", value, is_glue_assign, get_tex_skip_register, true); if (value == null) { lua_pushinteger(L,0); - if (b == 0) - return 1; lua_pushinteger(L,0); lua_pushinteger(L,0); lua_pushinteger(L,0); lua_pushinteger(L,0); } else { lua_pushinteger(L,width(value)); - if (b == 0) - return 1; lua_pushinteger(L,stretch(value)); lua_pushinteger(L,shrink(value)); lua_pushinteger(L,stretch_order(value)); @@ -983,21 +964,11 @@ static int setmuglue(lua_State * L) top -= 1; } /* [global] slot [width] [stretch] [shrink] [stretch_order] [shrink_order] */ - if (top > 1) { - width(value) = lua_roundnumber(L,index+1); - } - if (top > 2) { - stretch(value) = lua_roundnumber(L,index+2); - } - if (top > 3) { - shrink(value) = lua_roundnumber(L,index+3); - } - if (top > 4) { - stretch_order(value) = lua_tointeger(L,index+4); - } - if (top > 5) { - shrink_order(value) = lua_tointeger(L,index+5); - } + if (top > 1) { width(value) = lua_roundnumber(L,index+1); } + if (top > 2) { stretch(value) = lua_roundnumber(L,index+2); } + if (top > 3) { shrink(value) = lua_roundnumber(L,index+3); } + if (top > 4) { stretch_order(value) = lua_tointeger(L,index+4); } + if (top > 5) { shrink_order(value) = lua_tointeger(L,index+5); } set_item_index_plus(L, index, mu_skip_base, "muskip", value, isglobal, is_mu_glue_assign, set_tex_mu_skip_register, true); return 0; } @@ -1709,26 +1680,18 @@ static int settex(lua_State * L) assign_internal_value((isglobal ? 4 : 0), equiv(cur_cs1), j); } else if (is_glue_assign(cur_cmd1)) { int a = isglobal; -if (lua_type(L, i) == LUA_TNUMBER) { - halfword value = copy_node(zero_glue); - width(value) = lua_roundnumber(L,i); - if (i > 1) { - stretch(value) = lua_roundnumber(L,i+1); - } - if (i > 3) { - shrink(value) = lua_roundnumber(L,i+2); - } - if (i > 4) { - stretch_order(value) = lua_tointeger(L,i+3); - } - if (i > 5) { - shrink_order(value) = lua_tointeger(L,i+4); + if (lua_type(L, i) == LUA_TNUMBER) { + halfword value = copy_node(zero_glue); + width(value) = lua_roundnumber(L,i); + if (i > 1) { stretch(value) = lua_roundnumber(L,i+1); } + if (i > 3) { shrink(value) = lua_roundnumber(L,i+2); } + if (i > 4) { stretch_order(value) = lua_tointeger(L,i+3); } + if (i > 5) { shrink_order(value) = lua_tointeger(L,i+4); } + define(equiv(cur_cs1), assign_glue_cmd, value); + } else { + halfword *j1 = check_isnode(L, i); /* the value */ + define(equiv(cur_cs1), assign_glue_cmd, *j1); } - define(equiv(cur_cs1), assign_glue_cmd, value); -} else { - halfword *j1 = check_isnode(L, i); /* the value */ - define(equiv(cur_cs1), assign_glue_cmd, *j1); -} } else if (is_toks_assign(cur_cmd1)) { if (lua_type(L,i) == LUA_TSTRING) { j = tokenlist_from_lua(L); /* uses stack -1 */ |