diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-04-04 15:54:37 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-04-04 15:54:37 +0000 |
commit | 6594e56570ac8f430ea4c0681812e2e8103881db (patch) | |
tree | 3912cb8c0fffe05096078d42905c7862a59d2443 /Build/source | |
parent | 2bec95b8ba68b5b743535e19a4ca1c32231eaec3 (diff) |
web2c/luatexdir: sync with the upstream
git-svn-id: svn://tug.org/texlive/trunk@40233 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source')
24 files changed, 754 insertions, 781 deletions
diff --git a/Build/source/texk/web2c/luatexdir/NEWS b/Build/source/texk/web2c/luatexdir/NEWS index 47f8bc4c783..2533d237b4b 100644 --- a/Build/source/texk/web2c/luatexdir/NEWS +++ b/Build/source/texk/web2c/luatexdir/NEWS @@ -2,6 +2,21 @@ This file is in the public domain. ============================================================== +LuaTeX Release 0.95 was released 2016040415 +============================================================== + +This is a prerelease of the stable 1.0 version. + +- glues now have gluespec merged in (idem math and insert) +- registers are still glue specs +- the spec field in glues are gone +- extra tex.setglue and tex.setmuglue +- obsolete dvi related dir fields removed + +(if we are in time, it will be included in TeX Live 2016) + + +============================================================== LuaTeX Release 0.90.0 was released 2016032512 ============================================================== @@ -2689,7 +2704,7 @@ Other news: we probably introduced new problems as well). * Most (all?) files now have a corrected Copyright header, - and link in $Id: NEWS 5886 2016-03-25 12:13:10Z luigi $ and $URL: https://foundry.supelec.fr/svn/luatex/trunk/source/texk/web2c/luatexdir/NEWS $ into the object file. + and link in NEWS source/texk/web2c/luatexdir/NEWS into the object file. * Some unnecessary files were removed from the distribution. diff --git a/Build/source/texk/web2c/luatexdir/lua/lnodelib.c b/Build/source/texk/web2c/luatexdir/lua/lnodelib.c index 3a8982604c6..e5863c61ad9 100644 --- a/Build/source/texk/web2c/luatexdir/lua/lnodelib.c +++ b/Build/source/texk/web2c/luatexdir/lua/lnodelib.c @@ -21,11 +21,6 @@ /* - The node getter and setter are adapted a bit by Hans and Luigi so blame - them! On the agenda: check all keys, maybe hide some fields that are not - supposed to be seen and set (scratch fields for the backend and par - builder). - After doing lots of tests with luatex and luajittex, with and without jit, and with and without ffi, we came to the conclusion that userdata prevents a speedup. We also found that the checking of metatables as well as assignment @@ -45,19 +40,7 @@ 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 get* and set* functions in the top level node namespace. There is a limited set - of getters. - - getnext : parsing nodelist always involves this one - getprev : used less but is logical companion to getnext - getid : consulted a lot - getsubtype : consulted less but also a topper - getfont : used a lot in otf handling (glyph nodes are consulted a lot) - getchar : idem and also in other places - getlist : we often parse nested lists so this is a convenient one too (only hlist/vlist !) - getleader : comparable to list, seldom used in tex (but needs consulting - like lists) - getfield : generic getter, sufficient for the rest (other field names are - often shared so a specific getter makes no sense then) + of getters and a generic getfield to complement them. 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 @@ -66,7 +49,7 @@ 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 - fact, fast mode can be simulated by fast_getfield = __index but the (measured) + fact, a fast mode can be simulated by fast_getfield = __index but the (measured) benefit on average runs is not that large (some 5% when we also use the other fast ones) which is easily nilled by inefficient coding. The direct variants on the other hand can be significantly faster but with the drawback of lack @@ -74,28 +57,6 @@ a speedup on these functions is not representative for a normal run, where much more happens. - todo : check and optimize the direct function when possible - - todo : once the direct ones are proven we can redefine some of the less - critical normal ones to call the direct ones after checking for - a first argument being a node (like protect/unprotect) - - The code below has quite some duplicated code but this is also a prelude - to light userdata for diretc nodes so we prefer this method. Some userdata - variants could call the direct functions but not now (also because we don't - want to touch the originals too much). As usual: blame Luigi and Hans for - issues with this code. You can blame HH for weird or inaccurate comments. - - Todo: as a prelude to lua 5.3 we should use integer instead of number when - possible. A boring job. We can use the direct variants for testing this. - - Remark: when a direct node is set, and an invalid one is passed (or nil) we - normally get zero and that is a predefined glue, so we get a message about - assigning to a glue which is fine. What we should do some day is make node - zero a dummy so that null then can be used as test. - - Hans Hagen, Luigi Scarso (2011-2013) - */ #include "ptexlib.h" @@ -172,7 +133,7 @@ if (n==null) { \ lua_pushnil(L); \ } else { \ - lua_pushinteger(L,n); \ + lua_pushinteger(L,n); \ } \ } while (0) @@ -185,30 +146,6 @@ } \ } while (0) -#define nodelib_check_glue_spec(n,g,field) do { \ - g = glue_ptr(n); \ - v = (halfword) lua_tointeger(L, 3); \ - if (!g) { \ - g = new_node(glue_spec_node,0); \ - add_glue_ref(g); \ - glue_ptr(n) = g; \ - field(g) = v; \ - } else if (field(g) != v) { \ - if (valid_node(g)) { \ - int c = new_spec(g); \ - delete_glue_ref(g); \ - add_glue_ref(c); \ - glue_ptr(n) = c; \ - field(c) = v; \ - } else { \ - g = new_spec(g); \ - add_glue_ref(g); \ - glue_ptr(n) = g; \ - field(g) = v; \ - } \ - } \ -} while (0) - #define nodelib_setattr(L, s, n) reassign_attribute(n,nodelib_getlist(L,s)) #define nodelib_gettoks(L,a) tokenlist_from_lua(L) @@ -220,7 +157,6 @@ #define nodelib_pushlist(L,n) { lua_pushinteger(L,n); lua_nodelib_push(L); } /* can be: fast_metatable_or_nil(n) */ #define nodelib_pushattr(L,n) { lua_pushinteger(L,n); lua_nodelib_push(L); } /* can be: fast_metatable_or_nil(n) */ -#define nodelib_pushspec(L,n) { lua_pushinteger(L,n); lua_nodelib_push_spec(L); } /* can be: fast_metatable_or_nil(n) - different criterium? */ #define nodelib_pushaction(L,n) { lua_pushinteger(L,n); lua_nodelib_push(L); } /* can be: fast_metatable_or_nil(n) */ #define nodelib_pushstring(L,n) { char *ss=makecstring(n); lua_pushstring(L,ss); free(ss); } @@ -357,19 +293,6 @@ static int lua_nodelib_prev(lua_State * L) /* - static void lua_nodelib_push_simple(lua_State * L, halfword p) - { - halfword *a; - a = (halfword *) lua_newuserdata(L, sizeof(halfword)); - *a = p; - lua_get_metatablelua(luatex_node); - lua_setmetatable(L, -2); - } - -*/ - -/* - Creates a userdata object for a number found at the stack top, if it is representing a node (i.e. an pointer into |varmem|). It replaces the stack entry with the new userdata, or pushes |nil| if the number is |null|, @@ -396,27 +319,6 @@ void lua_nodelib_push(lua_State * L) return; } -/* |spec_ptr| fields can legally be zero, which is why there is a special function. */ - -static void lua_nodelib_push_spec(lua_State * L) -{ - halfword n; - halfword *a; - n = -1; - if (lua_type(L, -1) == LUA_TNUMBER) - n = (halfword) lua_tointeger(L, -1); - lua_pop(L, 1); - if ((n < 0) || (n > var_mem_max)) { - lua_pushnil(L); - } else { - a = lua_newuserdata(L, sizeof(halfword)); - *a = n; - lua_get_metatablelua(luatex_node); - lua_setmetatable(L, -2); - } - return; -} - void lua_nodelib_push_fast(lua_State * L, halfword n) { halfword *a; @@ -2398,14 +2300,13 @@ static int lua_nodelib_unset_attribute(lua_State * L) static int lua_nodelib_direct_unset_attribute(lua_State * L) { - int i, val, ret; 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 */ - i=(int)luaL_checknumber(L, 2); - val=(int)luaL_optnumber(L, 3, UNUSED_ATTRIBUTE); - ret = unset_attribute(n, i, val); + 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 { @@ -2417,6 +2318,92 @@ static int lua_nodelib_direct_unset_attribute(lua_State * L) return 1; } +/* glue */ + +static int lua_nodelib_set_glue(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)) { + width(n) = ((top > 1 && lua_type(L, 2) == LUA_TNUMBER)) ? lua_tointeger(L,2) : 0; + stretch(n) = ((top > 2 && lua_type(L, 3) == LUA_TNUMBER)) ? lua_tointeger(L,3) : 0; + shrink(n) = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_tointeger(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"); + } +} + +static int lua_nodelib_direct_set_glue(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)) { + width(n) = ((top > 1 && lua_type(L, 2) == LUA_TNUMBER)) ? lua_tointeger(L,2) : 0; + stretch(n) = ((top > 2 && lua_type(L, 3) == LUA_TNUMBER)) ? lua_tointeger(L,3) : 0; + shrink(n) = ((top > 3 && lua_type(L, 4) == LUA_TNUMBER)) ? lua_tointeger(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"); + } +} + +static int lua_nodelib_get_glue(lua_State * L) +{ + halfword n = *check_isnode(L, 1); + if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_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"); + } +} + +static int lua_nodelib_direct_get_glue(lua_State * L) +{ + halfword n = lua_tointeger(L, 1); + if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_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"); + } +} + +static int lua_nodelib_is_zero_glue(lua_State * L) +{ + halfword n = *check_isnode(L, 1); + if ((n != null) && (type(n) == glue_node || type(n) == glue_spec_node)) { + lua_toboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0)); + return 1; + } else { + return luaL_error(L, "glue (spec) expected"); + } +} + +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)) { + lua_toboolean(L,(width(n) == 0 && stretch(n) == 0 && shrink(n) == 0)); + return 1; + } else { + return luaL_error(L, "glue (spec) expected"); + } +} + /* iteration */ static int nodelib_aux_nil(lua_State * L) @@ -2504,9 +2491,6 @@ static int lua_nodelib_direct_traverse_filtered(lua_State * L) n = (halfword) lua_tointeger(L, 2); if (n == null) return 0; - /* funny duplicate check - n = (halfword) lua_tointeger(L, 2); - */ lua_pop(L, 1); lua_pushcclosure(L, nodelib_direct_aux_next_filtered, 1); lua_pushinteger(L,n); @@ -2518,9 +2502,8 @@ static int lua_nodelib_direct_traverse_filtered(lua_State * L) static int nodelib_direct_aux_next_char(lua_State * L) { - halfword t; /* traverser */ - /*int i = (int) lua_tointeger(L, lua_upvalueindex(1));*/ - if (lua_isnil(L, 2)) { /* first call */ + halfword t; /* traverser */ + if (lua_isnil(L, 2)) { /* first call */ t = lua_tointeger(L,1) ; lua_settop(L,1); } else { @@ -2564,9 +2547,9 @@ static int lua_nodelib_direct_traverse_char(lua_State * L) static int nodelib_aux_next(lua_State * L) { - halfword t; /* traverser */ - halfword *a; /* a or *a */ - if (lua_isnil(L, 2)) { /* first call */ + halfword t; /* traverser */ + halfword *a; /* a or *a */ + if (lua_isnil(L, 2)) { /* first call */ t = *check_isnode(L, 1); lua_settop(L,1); } else { @@ -2600,9 +2583,9 @@ static int lua_nodelib_traverse(lua_State * L) static int nodelib_aux_next_char(lua_State * L) { - halfword t; /* traverser */ + halfword t; /* traverser */ halfword *a; - if (lua_isnil(L, 2)) { /* first call */ + if (lua_isnil(L, 2)) { /* first call */ t = *check_isnode(L, 1); lua_settop(L,1); } else { @@ -2641,9 +2624,8 @@ static int lua_nodelib_traverse_char(lua_State * L) static int nodelib_direct_aux_next(lua_State * L) { - halfword t; /* traverser */ - /*int i = (int) lua_tointeger(L, lua_upvalueindex(1));*/ - if (lua_isnil(L, 2)) { /* first call */ + halfword t; /* traverser */ + if (lua_isnil(L, 2)) { /* first call */ t = lua_tointeger(L,1) ; lua_settop(L,1); } else { @@ -2745,7 +2727,7 @@ 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 */ + (int) lua_tointeger(L, 1), /* i */ (halfword) lua_tointeger(L, 2) /* n */ ); } @@ -2790,12 +2772,6 @@ static int nodelib_cantset(lua_State * L, int n, const char *s) return 0; } -static int nodelib_nonwritable(lua_State * L, int n, const char *s) -{ - luaL_error(L,"You cannot set field %s in a non writable node of type %s",s,node_data[type(n)].name); - return 0; -} - /* node.direct.getfield */ static void lua_nodelib_getfield_whatsit(lua_State * L, int n, const char *s) @@ -3161,31 +3137,6 @@ static int lua_nodelib_fast_getfield(lua_State * L) } else if (t == glue_node) { if (lua_key_eq(s, subtype)) { lua_pushinteger(L, subtype(n)); - } else if (lua_key_eq(s, spec)) { - nodelib_pushspec(L, glue_ptr(n)); - } else if (lua_key_eq(s, leader)) { - fast_metatable_or_nil(leader_ptr(n)); - } else { - n = glue_ptr(n); - if (!n) { - lua_pushinteger(L, 0); /* zero skip constant */ - } else if (lua_key_eq(s, width)) { - lua_pushinteger(L, width(n)); - } else if (lua_key_eq(s, stretch)) { - lua_pushinteger(L, stretch(n)); - } else if (lua_key_eq(s, shrink)) { - lua_pushinteger(L, shrink(n)); - } else if (lua_key_eq(s, stretch_order)) { - lua_pushinteger(L, stretch_order(n)); - } else if (lua_key_eq(s, shrink_order)) { - lua_pushinteger(L, shrink_order(n)); - } else { - lua_pushnil(L); - } - } - } else if (t == glue_spec_node) { - if (lua_key_eq(s, subtype)) { - lua_pushinteger(L, 0); /* dummy, the only one that prevents move up */ } else if (lua_key_eq(s, width)) { lua_pushinteger(L, width(n)); } else if (lua_key_eq(s, stretch)) { @@ -3196,10 +3147,8 @@ static int lua_nodelib_fast_getfield(lua_State * L) lua_pushinteger(L, stretch_order(n)); } else if (lua_key_eq(s, shrink_order)) { lua_pushinteger(L, shrink_order(n)); - } else if (lua_key_eq(s, ref_count)) { - lua_pushinteger(L, glue_ref_count(n)); - } else if (lua_key_eq(s, writable)) { - lua_pushboolean(L, valid_node(n)); + } else if (lua_key_eq(s, leader)) { + fast_metatable_or_nil(leader_ptr(n)); } else { lua_pushnil(L); } @@ -3245,10 +3194,8 @@ static int lua_nodelib_fast_getfield(lua_State * L) lua_push_dir_text(L, dir_dir(n)); } else if (lua_key_eq(s, level)) { lua_pushinteger(L, dir_level(n)); - } else if (lua_key_eq(s, dvi_ptr)) { - lua_pushinteger(L, dir_dvi_ptr(n)); - } else if (lua_key_eq(s, dir_h)) { - lua_pushinteger(L, dir_dvi_h(n)); + } else if (lua_key_eq(s, subtype)) { /* can be used for anything */ + lua_pushinteger(L, subtype(n)); } else { lua_pushnil(L); } @@ -3272,6 +3219,20 @@ static int lua_nodelib_fast_getfield(lua_State * L) } else { lua_pushnil(L); } + } else if (t == glue_spec_node) { + if (lua_key_eq(s, width)) { + lua_pushinteger(L, width(n)); + } else if (lua_key_eq(s, stretch)) { + lua_pushinteger(L, stretch(n)); + } else if (lua_key_eq(s, shrink)) { + lua_pushinteger(L, shrink(n)); + } else if (lua_key_eq(s, stretch_order)) { + lua_pushinteger(L, stretch_order(n)); + } else if (lua_key_eq(s, shrink_order)) { + lua_pushinteger(L, shrink_order(n)); + } else { + lua_pushnil(L); + } } else if (t == whatsit_node) { if (lua_key_eq(s, subtype)) { lua_pushinteger(L, subtype(n)); @@ -3322,10 +3283,19 @@ static int lua_nodelib_fast_getfield(lua_State * L) lua_pushinteger(L, depth(n)); } else if (lua_key_eq(s, height)) { lua_pushinteger(L, height(n)); - } else if (lua_key_eq(s, spec)) { - nodelib_pushspec(L, split_top_ptr(n)); - } else if ((lua_key_eq(s, list)) || (lua_key_eq(s, head))) { + } else if ((lua_key_eq(s, list)) || (lua_key_eq(s, head))) { /* already mapped */ fast_metatable_or_nil_alink(ins_ptr(n)); + /* glue parameters */ + } else if (lua_key_eq(s, width)) { + lua_pushinteger(L, width(n)); + } else if (lua_key_eq(s, stretch)) { + lua_pushinteger(L, stretch(n)); + } else if (lua_key_eq(s, shrink)) { + lua_pushinteger(L, shrink(n)); + } else if (lua_key_eq(s, stretch_order)) { + lua_pushinteger(L, stretch_order(n)); + } else if (lua_key_eq(s, shrink_order)) { + lua_pushinteger(L, shrink_order(n)); } else { lua_pushnil(L); } @@ -3334,6 +3304,17 @@ static int lua_nodelib_fast_getfield(lua_State * L) lua_pushinteger(L, subtype(n)); } else if (lua_key_eq(s, surround)) { lua_pushinteger(L, surround(n)); + /* glue parameters */ + } else if (lua_key_eq(s, width)) { + lua_pushinteger(L, width(n)); + } else if (lua_key_eq(s, stretch)) { + lua_pushinteger(L, stretch(n)); + } else if (lua_key_eq(s, shrink)) { + lua_pushinteger(L, shrink(n)); + } else if (lua_key_eq(s, stretch_order)) { + lua_pushinteger(L, stretch_order(n)); + } else if (lua_key_eq(s, shrink_order)) { + lua_pushinteger(L, shrink_order(n)); } else { lua_pushnil(L); } @@ -3900,29 +3881,6 @@ static int lua_nodelib_direct_getfield(lua_State * L) lua_pushnil(L); } } else if (t == glue_node) { - if (lua_key_eq(s, spec)) { - nodelib_pushdirect(glue_ptr(n)); - } else if (lua_key_eq(s, leader)) { - nodelib_pushdirect_or_nil(leader_ptr(n)); - } else { - n = glue_ptr(n); - if (!n) { - lua_pushinteger(L, 0); /* zero skip constant */ - } else if (lua_key_eq(s, width)) { - lua_pushinteger(L, width(n)); - } else if (lua_key_eq(s, stretch)) { - lua_pushinteger(L, stretch(n)); - } else if (lua_key_eq(s, shrink)) { - lua_pushinteger(L, shrink(n)); - } else if (lua_key_eq(s, stretch_order)) { - lua_pushinteger(L, stretch_order(n)); - } else if (lua_key_eq(s, shrink_order)) { - lua_pushinteger(L, shrink_order(n)); - } else { - lua_pushnil(L); - } - } - } else if (t == glue_spec_node) { if (lua_key_eq(s, width)) { lua_pushinteger(L, width(n)); } else if (lua_key_eq(s, stretch)) { @@ -3933,10 +3891,8 @@ static int lua_nodelib_direct_getfield(lua_State * L) lua_pushinteger(L, stretch_order(n)); } else if (lua_key_eq(s, shrink_order)) { lua_pushinteger(L, shrink_order(n)); - } else if (lua_key_eq(s, ref_count)) { - lua_pushinteger(L, glue_ref_count(n)); - } else if (lua_key_eq(s, writable)) { - lua_pushboolean(L, valid_node(n)); + } else if (lua_key_eq(s, leader)) { + nodelib_pushdirect_or_nil(leader_ptr(n)); } else { lua_pushnil(L); } @@ -3973,13 +3929,11 @@ static int lua_nodelib_direct_getfield(lua_State * L) } } else if (t == dir_node) { if (lua_key_eq(s, dir)) { - lua_push_dir_text(L, dir_dir(n)); + lua_push_dir_text(L, dir_dir(n)); } else if (lua_key_eq(s, level)) { lua_pushinteger(L, dir_level(n)); - } else if (lua_key_eq(s, dvi_ptr)) { - lua_pushinteger(L, dir_dvi_ptr(n)); - } else if (lua_key_eq(s, dir_h)) { - lua_pushinteger(L, dir_dvi_h(n)); + } else if (lua_key_eq(s, subtype)) { /* can be used for anything */ + lua_pushinteger(L, subtype(n)); } else { lua_pushnil(L); } @@ -4038,16 +3992,36 @@ static int lua_nodelib_direct_getfield(lua_State * L) lua_pushinteger(L, depth(n)); } else if (lua_key_eq(s, height)) { lua_pushinteger(L, height(n)); - } else if (lua_key_eq(s, spec)) { - nodelib_pushdirect_or_nil(split_top_ptr(n)); } else if ((lua_key_eq(s, list)) || (lua_key_eq(s, head))) { nodelib_pushdirect_or_nil_alink(ins_ptr(n)); + /* glue */ + } else if (lua_key_eq(s, width)) { + lua_pushinteger(L, width(n)); + } else if (lua_key_eq(s, stretch)) { + lua_pushinteger(L, stretch(n)); + } else if (lua_key_eq(s, shrink)) { + lua_pushinteger(L, shrink(n)); + } else if (lua_key_eq(s, stretch_order)) { + lua_pushinteger(L, stretch_order(n)); + } else if (lua_key_eq(s, shrink_order)) { + lua_pushinteger(L, shrink_order(n)); } else { lua_pushnil(L); } } else if (t == math_node) { if (lua_key_eq(s, surround)) { lua_pushinteger(L, surround(n)); + /* glue */ + } else if (lua_key_eq(s, width)) { + lua_pushinteger(L, width(n)); + } else if (lua_key_eq(s, stretch)) { + lua_pushinteger(L, stretch(n)); + } else if (lua_key_eq(s, shrink)) { + lua_pushinteger(L, shrink(n)); + } else if (lua_key_eq(s, stretch_order)) { + lua_pushinteger(L, stretch_order(n)); + } else if (lua_key_eq(s, shrink_order)) { + lua_pushinteger(L, shrink_order(n)); } else { lua_pushnil(L); } @@ -4213,6 +4187,20 @@ static int lua_nodelib_direct_getfield(lua_State * L) } else { lua_pushnil(L); } + } else if (t == glue_spec_node) { + if (lua_key_eq(s, width)) { + lua_pushinteger(L, width(n)); + } else if (lua_key_eq(s, stretch)) { + lua_pushinteger(L, stretch(n)); + } else if (lua_key_eq(s, shrink)) { + lua_pushinteger(L, shrink(n)); + } else if (lua_key_eq(s, stretch_order)) { + lua_pushinteger(L, stretch_order(n)); + } else if (lua_key_eq(s, shrink_order)) { + lua_pushinteger(L, shrink_order(n)); + } else { + lua_pushnil(L); + } } else { lua_pushnil(L); } @@ -4585,17 +4573,6 @@ static int lua_nodelib_direct_first_glyph(lua_State * L) /* new, fast and dumb ones: only signals that something needs to be processed */ -/* #define do_has_glyph(h) do { \ */ -/* while (h != null) { \ */ -/* if (type(h) == glyph_node) { \ */ -/* return h; \ */ -/* } else { \ */ -/* h = vlink(h); \ */ -/* } \ */ -/* } \ */ -/* return null; \ */ -/* } while (0) */ - /* node.has_glyph */ static int lua_nodelib_has_glyph(lua_State * L) @@ -4803,8 +4780,6 @@ static int lua_nodelib_direct_tonode(lua_State * L) /* node.setfield */ -/* ls-hh: normally a value will not be reassigned */ - #define cleanup_late_lua(n) do { \ if (late_lua_data(n) != 0) { \ if (late_lua_type(n) == normal) { \ @@ -5058,7 +5033,6 @@ static int lua_nodelib_setfield_whatsit(lua_State * L, int n, const char *s) static int lua_nodelib_fast_setfield(lua_State * L) { - halfword g, v; const char *s; halfword n = *((halfword *) lua_touserdata(L, 1)); int t = type(n); @@ -5172,28 +5146,6 @@ static int lua_nodelib_fast_setfield(lua_State * L) } else if (t == glue_node) { if (lua_key_eq(s, subtype)) { subtype(n) = (quarterword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, spec)) { - glue_ptr(n) = nodelib_getspec(L, 3); - } else if (lua_key_eq(s, leader)) { - leader_ptr(n) = nodelib_getlist(L, 3); - } else if (lua_key_eq(s, width)) { - nodelib_check_glue_spec(n, g, width); - } else if (lua_key_eq(s, stretch)) { - nodelib_check_glue_spec(n, g, stretch); - } else if (lua_key_eq(s, shrink)) { - nodelib_check_glue_spec(n, g, shrink); - } else if (lua_key_eq(s, stretch_order)) { - nodelib_check_glue_spec(n, g, stretch_order); - } else if (lua_key_eq(s, shrink_order)) { - nodelib_check_glue_spec(n, g, shrink_order); - } else { - return nodelib_cantset(L, n, s); - } - } else if (t == glue_spec_node) { - if (!valid_node(n)) { - return nodelib_nonwritable(L, n, s); - } else if (lua_key_eq(s, subtype)) { - subtype(n) = (quarterword) lua_tointeger(L, 3); /* dummy, the only one that prevents move up */ } else if (lua_key_eq(s, width)) { width(n) = (halfword) lua_tointeger(L, 3); } else if (lua_key_eq(s, stretch)) { @@ -5204,6 +5156,8 @@ static int lua_nodelib_fast_setfield(lua_State * L) stretch_order(n) = (quarterword) lua_tointeger(L, 3); } else if (lua_key_eq(s, shrink_order)) { shrink_order(n) = (quarterword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, leader)) { + leader_ptr(n) = nodelib_getlist(L, 3); } else { return nodelib_cantset(L, n, s); } @@ -5248,10 +5202,8 @@ static int lua_nodelib_fast_setfield(lua_State * L) dir_dir(n) = nodelib_getdir(L, 3, 0); } else if (lua_key_eq(s, level)) { dir_level(n) = (halfword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, dvi_ptr)) { - dir_dvi_ptr(n) = (halfword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, dir_h)) { - dir_dvi_h(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, subtype)) { /* can be used for anything */ + subtype(n) = (quarterword) lua_tointeger(L, 3); } else { return nodelib_cantset(L, n, s); } @@ -5320,10 +5272,19 @@ static int lua_nodelib_fast_setfield(lua_State * L) depth(n) = (halfword) lua_tointeger(L, 3); } else if (lua_key_eq(s, height)) { height(n) = (halfword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, spec)) { - split_top_ptr(n) = nodelib_getspec(L, 3); } else if ((lua_key_eq(s, list)) || (lua_key_eq(s, head))) { ins_ptr(n) = nodelib_getlist(L, 3); + /* glue */ + } else if (lua_key_eq(s, width)) { + width(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch)) { + stretch(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink)) { + shrink(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch_order)) { + stretch_order(n) = (quarterword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink_order)) { + shrink_order(n) = (quarterword) lua_tointeger(L, 3); } else { return nodelib_cantset(L, n, s); } @@ -5332,6 +5293,17 @@ static int lua_nodelib_fast_setfield(lua_State * L) subtype(n) = (quarterword) lua_tointeger(L, 3); } else if (lua_key_eq(s, surround)) { surround(n) = (halfword) lua_tointeger(L, 3); + /* glue */ + } else if (lua_key_eq(s, width)) { + width(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch)) { + stretch(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink)) { + shrink(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch_order)) { + stretch_order(n) = (quarterword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink_order)) { + shrink_order(n) = (quarterword) lua_tointeger(L, 3); } else { return nodelib_cantset(L, n, s); } @@ -5529,6 +5501,20 @@ static int lua_nodelib_fast_setfield(lua_State * L) } else { return nodelib_cantset(L, n, s); } + } else if (t == glue_spec_node) { + if (lua_key_eq(s, width)) { + width(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch)) { + stretch(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink)) { + shrink(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch_order)) { + stretch_order(n) = (quarterword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink_order)) { + shrink_order(n) = (quarterword) lua_tointeger(L, 3); + } else { + return nodelib_cantset(L, n, s); + } } else { return luaL_error(L, "You can't assign to this %s node (%d)\n", node_data[t].name, n); } @@ -5730,8 +5716,6 @@ static int lua_nodelib_direct_setfield_whatsit(lua_State * L, int n, const char pdf_action_new_window(n) = (halfword) lua_tointeger(L, 3); } else if (lua_key_eq(s, data)) { pdf_action_tokens(n) = nodelib_gettoks(L, 3); - /* } else if (lua_key_eq(s, ref_count)) { - pdf_action_refcount(n) = (halfword) lua_tointeger(L, 3); */ } else { return nodelib_cantset(L, n, s); } @@ -5934,7 +5918,6 @@ static int lua_nodelib_direct_setdiscretionary(lua_State * L) static int lua_nodelib_direct_setfield(lua_State * L) { - halfword g, v; const char *s; halfword n = lua_tointeger(L, 1); @@ -5989,12 +5972,6 @@ static int lua_nodelib_direct_setfield(lua_State * L) y_displace(n) = (halfword) lua_tointeger(L, 3); } else if (lua_key_eq(s, xadvance)) { x_advance(n) = (halfword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, width)) { - /* not yet */ - } else if (lua_key_eq(s, height)) { - /* not yet */ - } else if (lua_key_eq(s, depth)) { - /* not yet */ } else if (lua_key_eq(s, expansion_factor)) { ex_glyph(n) = (halfword) lua_tointeger(L, 3); } else if (lua_key_eq(s, components)) { @@ -6007,6 +5984,12 @@ static int lua_nodelib_direct_setfield(lua_State * L) set_char_rhmin(n, (halfword) lua_tointeger(L, 3)); } else if (lua_key_eq(s, uchyph)) { set_char_uchyph(n, (halfword) lua_tointeger(L, 3)); + } else if (lua_key_eq(s, width)) { + /* not yet */ + } else if (lua_key_eq(s, height)) { + /* not yet */ + } else if (lua_key_eq(s, depth)) { + /* not yet */ } else { return nodelib_cantset(L, n, s); } @@ -6049,28 +6032,6 @@ static int lua_nodelib_direct_setfield(lua_State * L) } else if (t == glue_node) { if (lua_key_eq(s, subtype)) { subtype(n) = (quarterword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, spec)) { - glue_ptr(n) = nodelib_popdirect(3); - } else if (lua_key_eq(s, leader)) { - leader_ptr(n) = nodelib_popdirect(3); - } else if (lua_key_eq(s, width)) { - nodelib_check_glue_spec(n, g, width); - } else if (lua_key_eq(s, stretch)) { - nodelib_check_glue_spec(n, g, stretch); - } else if (lua_key_eq(s, shrink)) { - nodelib_check_glue_spec(n, g, shrink); - } else if (lua_key_eq(s, stretch_order)) { - nodelib_check_glue_spec(n, g, stretch_order); - } else if (lua_key_eq(s, shrink_order)) { - nodelib_check_glue_spec(n, g, shrink_order); - } else { - return nodelib_cantset(L, n, s); - } - } else if (t == glue_spec_node) { - if (!valid_node(n)) { - return nodelib_nonwritable(L, n, s); - } else if (lua_key_eq(s, subtype)) { - subtype(n) = (quarterword) lua_tointeger(L, 3); /* dummy, the only one that prevents move up */ } else if (lua_key_eq(s, width)) { width(n) = (halfword) lua_tointeger(L, 3); } else if (lua_key_eq(s, stretch)) { @@ -6081,6 +6042,8 @@ static int lua_nodelib_direct_setfield(lua_State * L) stretch_order(n) = (quarterword) lua_tointeger(L, 3); } else if (lua_key_eq(s, shrink_order)) { shrink_order(n) = (quarterword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, leader)) { + leader_ptr(n) = nodelib_popdirect(3); } else { return nodelib_cantset(L, n, s); } @@ -6125,14 +6088,12 @@ static int lua_nodelib_direct_setfield(lua_State * L) dir_dir(n) = nodelib_getdir(L, 3, 0); } else if (lua_key_eq(s, level)) { dir_level(n) = (halfword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, dvi_ptr)) { - dir_dvi_ptr(n) = (halfword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, dir_h)) { - dir_dvi_h(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, subtype)) { /* can be used for anything */ + subtype(n) = (quarterword) lua_tointeger(L, 3); } else { return nodelib_cantset(L, n, s); } - } else if (t == whatsit_node) { + } else if (t == whatsit_node) { if (lua_key_eq(s, subtype)) { subtype(n) = (quarterword) lua_tointeger(L, 3); } else { @@ -6197,10 +6158,19 @@ static int lua_nodelib_direct_setfield(lua_State * L) depth(n) = (halfword) lua_tointeger(L, 3); } else if (lua_key_eq(s, height)) { height(n) = (halfword) lua_tointeger(L, 3); - } else if (lua_key_eq(s, spec)) { - split_top_ptr(n) = nodelib_popdirect(3); } else if ((lua_key_eq(s, list)) || (lua_key_eq(s, head))) { ins_ptr(n) = nodelib_popdirect(3); + /* glue */ + } else if (lua_key_eq(s, width)) { + width(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch)) { + stretch(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink)) { + shrink(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch_order)) { + stretch_order(n) = (quarterword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink_order)) { + shrink_order(n) = (quarterword) lua_tointeger(L, 3); } else { return nodelib_cantset(L, n, s); } @@ -6209,6 +6179,17 @@ static int lua_nodelib_direct_setfield(lua_State * L) subtype(n) = (quarterword) lua_tointeger(L, 3); } else if (lua_key_eq(s, surround)) { surround(n) = (halfword) lua_tointeger(L, 3); + /* glue */ + } else if (lua_key_eq(s, width)) { + width(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch)) { + stretch(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink)) { + shrink(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch_order)) { + stretch_order(n) = (quarterword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink_order)) { + shrink_order(n) = (quarterword) lua_tointeger(L, 3); } else { return nodelib_cantset(L, n, s); } @@ -6406,6 +6387,20 @@ static int lua_nodelib_direct_setfield(lua_State * L) } else { return nodelib_cantset(L, n, s); } + } else if (t == glue_spec_node) { + if (lua_key_eq(s, width)) { + width(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch)) { + stretch(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink)) { + shrink(n) = (halfword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, stretch_order)) { + stretch_order(n) = (quarterword) lua_tointeger(L, 3); + } else if (lua_key_eq(s, shrink_order)) { + shrink_order(n) = (quarterword) lua_tointeger(L, 3); + } else { + return nodelib_cantset(L, n, s); + } } else { return luaL_error(L, "You can't assign to this %s node (%d)\n", node_data[t].name, n); } @@ -6689,17 +6684,16 @@ static int lua_nodelib_effective_glue(lua_State * L) if ((glue == NULL) || (type(*glue) != glue_node)) { lua_pushnil(L) ; } else { - halfword s = glue_ptr(*glue); - int w = width(s) ; + int w = width(*glue) ; parent = lua_touserdata(L, 2); if ((parent != NULL) && ((type(*parent) == hlist_node) || (type(*parent) == vlist_node))) { if ((int)glue_sign(*parent) == 1) { - if (stretch_order(s) == glue_order(*parent)) { - w += stretch(s) * glue_set(*parent); + if (stretch_order(*glue) == glue_order(*parent)) { + w += stretch(*glue) * glue_set(*parent); } } else if (glue_sign(*parent) == 2) { - if (shrink_order(s) == glue_order(*parent)) { - w -= shrink(s) * glue_set(*parent); + if (shrink_order(*glue) == glue_order(*parent)) { + w -= shrink(*glue) * glue_set(*parent); } } } @@ -6715,17 +6709,16 @@ static int lua_nodelib_direct_effective_glue(lua_State * L) if ((glue == null) || (type(glue) != glue_node)) { lua_pushnil(L) ; } else { - halfword s = glue_ptr(glue); - int w = width(s) ; + int w = width(glue) ; halfword parent = lua_tointeger(L, 2); if ((parent != null) && ((type(parent) == hlist_node) || (type(parent) == vlist_node))) { if ((int)glue_sign(parent) == 1) { - if (stretch_order(s) == glue_order(parent)) { - w += stretch(s) * glue_set(parent); + if (stretch_order(glue) == glue_order(parent)) { + w += stretch(glue) * glue_set(parent); } } else if (glue_sign(parent) == 2) { - if (shrink_order(s) == glue_order(parent)) { - w -= shrink(s) * glue_set(parent); + if (shrink_order(glue) == glue_order(parent)) { + w -= shrink(glue) * glue_set(parent); } } } @@ -6830,6 +6823,9 @@ static const struct luaL_Reg direct_nodelib_f[] = { /* {"types", lua_nodelib_types}, */ /* no node argument */ {"unprotect_glyphs", lua_nodelib_direct_unprotect_glyphs}, {"unset_attribute", lua_nodelib_direct_unset_attribute}, + {"setglue",lua_nodelib_direct_set_glue}, + {"getglue",lua_nodelib_direct_get_glue}, + {"is_zero_glue",lua_nodelib_direct_is_zero_glue}, {"usedlist", lua_nodelib_direct_usedlist}, {"vpack", lua_nodelib_direct_vpack}, /* {"whatsits", lua_nodelib_whatsits}, */ /* no node argument */ @@ -6910,6 +6906,9 @@ static const struct luaL_Reg nodelib_f[] = { {"types", lua_nodelib_types}, {"unprotect_glyphs", lua_nodelib_unprotect_glyphs}, {"unset_attribute", lua_nodelib_unset_attribute}, + {"setglue",lua_nodelib_set_glue}, + {"getglue",lua_nodelib_get_glue}, + {"is_zero_glue",lua_nodelib_is_zero_glue}, {"usedlist", lua_nodelib_usedlist}, {"vpack", lua_nodelib_vpack}, {"whatsits", lua_nodelib_whatsits}, diff --git a/Build/source/texk/web2c/luatexdir/lua/ltexlib.c b/Build/source/texk/web2c/luatexdir/lua/ltexlib.c index b4bd9a3a63c..84627b2dc3f 100644 --- a/Build/source/texk/web2c/luatexdir/lua/ltexlib.c +++ b/Build/source/texk/web2c/luatexdir/lua/ltexlib.c @@ -890,6 +890,54 @@ static int getskip(lua_State * L) return 1; } +static int setglue(lua_State * L) +{ + int isglobal = 0; + int index = 1; + halfword value = copy_node(zero_glue); + int top = lua_gettop(L); + check_item_global(L,top,isglobal); + if (isglobal) { + index = 2; + top -= 1; + } + /* [global] slot [width] [stretch] [shrink] [stretch_order] [shrink_order] */ + if (top > 1) { + width(value) = lua_tointeger(L,index+1); + } + if (top > 2) { + stretch(value) = lua_tointeger(L,index+2); + } + if (top > 3) { + shrink(value) = lua_tointeger(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; +} + +static int getglue(lua_State * L) +{ + int value = 0; + get_item_index_plus(L, lua_gettop(L), skip_base, "skip", value, is_glue_assign, get_tex_skip_register, true); + if (value == null) { + lua_pushnil(L); + return 1; + } else { + lua_pushinteger(L,width(value)); + lua_pushinteger(L,stretch(value)); + lua_pushinteger(L,shrink(value)); + lua_pushinteger(L,stretch_order(value)); + lua_pushinteger(L,shrink_order(value)); + return 5; + } +} + static int ismuskip(lua_State * L) { check_register(mu_skip_base); @@ -914,6 +962,54 @@ static int getmuskip(lua_State * L) return 1; } +static int setmuglue(lua_State * L) +{ + int isglobal = 0; + int index = 1; + halfword value = copy_node(zero_glue); + int top = lua_gettop(L); + check_item_global(L,top,isglobal); + if (isglobal) { + index = 2; + top -= 1; + } + /* [global] slot [width] [stretch] [shrink] [stretch_order] [shrink_order] */ + if (top > 1) { + width(value) = lua_tointeger(L,index+1); + } + if (top > 2) { + stretch(value) = lua_tointeger(L,index+2); + } + if (top > 3) { + shrink(value) = lua_tointeger(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; +} + +static int getmuglue(lua_State * L) +{ + int value = 0; + get_item_index_plus(L, lua_gettop(L), mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, true); + if (value == null) { + lua_pushnil(L); + return 1; + } else { + lua_pushinteger(L,width(value)); + lua_pushinteger(L,stretch(value)); + lua_pushinteger(L,shrink(value)); + lua_pushinteger(L,stretch_order(value)); + lua_pushinteger(L,shrink_order(value)); + return 5; + } +} + static int iscount(lua_State * L) { check_register(count_base); @@ -2869,9 +2965,13 @@ static const struct luaL_Reg texlib[] = { { "isskip", isskip }, { "setskip", setskip }, { "getskip", getskip }, + { "setglue", setglue }, + { "getglue", getglue }, { "ismuskip", ismuskip }, { "setmuskip", setmuskip }, { "getmuskip", getmuskip }, + { "setmuglue", setmuglue }, + { "getmuglue", getmuglue }, { "isattribute", isattribute }, { "setattribute", setattribute }, { "getattribute", getattribute }, @@ -2945,7 +3045,9 @@ int luaopen_tex(lua_State * L) /* *INDENT-OFF* */ make_table(L, "attribute", "tex.attribute", "getattribute", "setattribute"); make_table(L, "skip", "tex.skip", "getskip", "setskip"); + make_table(L, "glue", "tex.glue", "getglue", "setglue"); make_table(L, "muskip", "tex.muskip", "getmuskip", "setmuskip"); + make_table(L, "muglue", "tex.muglue", "getmuglue", "setmuglue"); make_table(L, "dimen", "tex.dimen", "getdimen", "setdimen"); make_table(L, "count", "tex.count", "getcount", "setcount"); make_table(L, "toks", "tex.toks", "gettoks", "settoks"); diff --git a/Build/source/texk/web2c/luatexdir/lua/luatex-api.h b/Build/source/texk/web2c/luatexdir/lua/luatex-api.h index 8802253c199..07bfcba5a70 100644 --- a/Build/source/texk/web2c/luatexdir/lua/luatex-api.h +++ b/Build/source/texk/web2c/luatexdir/lua/luatex-api.h @@ -556,7 +556,6 @@ make_lua_key(disc);\ make_lua_key(display);\ make_lua_key(doublehyphendemerits);\ make_lua_key(down);\ -make_lua_key(dvi_ptr);\ make_lua_key(embedding);\ make_lua_key(emergencystretch);\ make_lua_key(empty_string);\ @@ -756,7 +755,6 @@ make_lua_key(space);\ make_lua_key(space_shrink);\ make_lua_key(space_stretch);\ make_lua_key(spacefactor);\ -make_lua_key(spec);\ make_lua_key(special);\ make_lua_key(split_discards_head);\ make_lua_key(split_keep);\ @@ -815,7 +813,6 @@ make_lua_key(visiblefilename);\ make_lua_key(vtop);\ make_lua_key(widowpenalty);\ make_lua_key(width);\ -make_lua_key(writable);\ make_lua_key(x_height);\ make_lua_key(xadvance);\ make_lua_key(xformresources);\ @@ -922,7 +919,6 @@ init_lua_key(disc);\ init_lua_key(display);\ init_lua_key(doublehyphendemerits);\ init_lua_key(down);\ -init_lua_key(dvi_ptr);\ init_lua_key(embedding);\ init_lua_key(emergencystretch);\ init_lua_key(encodingbytes);\ @@ -1112,7 +1108,6 @@ init_lua_key(space);\ init_lua_key(space_shrink);\ init_lua_key(space_stretch);\ init_lua_key(spacefactor);\ -init_lua_key(spec);\ init_lua_key(special);\ init_lua_key(split_discards_head);\ init_lua_key(split_keep);\ @@ -1170,7 +1165,6 @@ init_lua_key(visiblefilename);\ init_lua_key(vtop);\ init_lua_key(widowpenalty);\ init_lua_key(width);\ -init_lua_key(writable);\ init_lua_key(x_height);\ init_lua_key(xadvance);\ init_lua_key(xformresources);\ @@ -1334,7 +1328,6 @@ use_lua_key(disc); use_lua_key(display); use_lua_key(doublehyphendemerits); use_lua_key(down); -use_lua_key(dvi_ptr); use_lua_key(embedding); use_lua_key(emergencystretch); use_lua_key(empty_string); @@ -1534,7 +1527,6 @@ use_lua_key(space); use_lua_key(space_shrink); use_lua_key(space_stretch); use_lua_key(spacefactor); -use_lua_key(spec); use_lua_key(special); use_lua_key(split_discards_head); use_lua_key(split_keep); @@ -1593,7 +1585,6 @@ use_lua_key(visiblefilename); use_lua_key(vtop); use_lua_key(widowpenalty); use_lua_key(width); -use_lua_key(writable); use_lua_key(x_height); use_lua_key(xadvance); use_lua_key(xformresources); diff --git a/Build/source/texk/web2c/luatexdir/luatex.c b/Build/source/texk/web2c/luatexdir/luatex.c index 522c24dee7c..7a2d3252d8d 100644 --- a/Build/source/texk/web2c/luatexdir/luatex.c +++ b/Build/source/texk/web2c/luatexdir/luatex.c @@ -28,10 +28,10 @@ #define TeX -int luatex_version = 90; /* \.{\\luatexversion} */ +int luatex_version = 95; /* \.{\\luatexversion} */ int luatex_revision = '0'; /* \.{\\luatexrevision} */ -int luatex_date_info = 2016032512; /* the compile date is now hardwired */ -const char *luatex_version_string = "beta-0.90.0"; +int luatex_date_info = 2016040415; /* the compile date is now hardwired */ +const char *luatex_version_string = "beta-0.95.0"; const char *engine_name = my_name; /* the name of this engine */ #include <kpathsea/c-ctype.h> diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w index c5db4c71413..5f6756b1e7d 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdfgen.w @@ -1427,17 +1427,25 @@ difficult, we start with a simpler implementation using just the first two items @c + +/* + A user supplied trailerid had better be an array! So maybe we need to check + for [] and error otherwise. +*/ + static void print_ID(PDF pdf) { if ((pdf_suppress_optional_info & 512) == 0) { - if (pdf_trailer_id != 0) { - char *s = NULL; - int len; - s = tokenlist_to_cstring(pdf_trailer_id, true, &len); - /* this had better be an array! sp maybe we need to check for [] and error otherwise */ - pdf_add_name(pdf, "ID"); - pdf_out_block(pdf,s,len); + const char *p = NULL; + pdf_add_name(pdf, "ID"); + p = get_pdf_table_string("trailerid"); + if (p && strlen(p) > 0) { + pdf_puts(pdf,p); + } else if (pdf_trailer_id != 0) { + /* user provided one */ + pdf_print_toks(pdf, pdf_trailer_id); } else { + /* system provided one */ time_t t; size_t size; char time_str[32]; @@ -1473,7 +1481,6 @@ static void print_ID(PDF pdf) md5_finish(&state, digest); /* write the IDs */ convertStringToHexString((char *) digest, id, 16); - pdf_add_name(pdf, "ID"); pdf_begin_array(pdf); pdf_printf(pdf, "<%s> <%s>", id, id); pdf_end_array(pdf); diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdflistout.w b/Build/source/texk/web2c/luatexdir/pdf/pdflistout.w index 65295c6145b..b6f3e6ff1a1 100644 --- a/Build/source/texk/web2c/luatexdir/pdf/pdflistout.w +++ b/Build/source/texk/web2c/luatexdir/pdf/pdflistout.w @@ -112,7 +112,7 @@ void init_backend_functionpointers(output_mode o_mode) track of the needed width in |w|. When it finds the node that will end this segment, it stores the accumulated with in the |dir_dvi_h| field of that end node, so that when that node is found later in the -processing, the correct glue correction can be applied. +processing, the correct glue correction can be applied (obsolete). @c static scaled simple_advance_width(halfword p) @@ -154,7 +154,6 @@ static halfword calculate_width_to_enddir(halfword p, real cur_glue, scaled cur_ int dir_nest = 1; halfword q = p, enddir_ptr = p; scaled w = 0; - halfword g; /* this is normally a global variable, but that is just too hideous */ real glue_temp; /* glue value before rounding */ int g_sign = glue_sign(this_box); int g_order = glue_order(this_box); @@ -178,7 +177,7 @@ static halfword calculate_width_to_enddir(halfword p, real cur_glue, scaled cur_ break; case math_node: /* begin mathskip code */ - if (glue_ptr(q) == zero_glue) { + if (glue_is_zero(q)) { w += surround(q); break; } else { @@ -186,17 +185,16 @@ static halfword calculate_width_to_enddir(halfword p, real cur_glue, scaled cur_ } /* end mathskip code */ case glue_node: - g = glue_ptr(q); - w += width(g) - cur_g; + w += width(q) - cur_g; if (g_sign != normal) { if (g_sign == stretching) { - if (stretch_order(g) == g_order) { - cur_glue = cur_glue + stretch(g); + if (stretch_order(q) == g_order) { + cur_glue = cur_glue + stretch(q); vet_glue(float_cast(glue_set(this_box)) * cur_glue); cur_g = float_round(glue_temp); } - } else if (shrink_order(g) == g_order) { - cur_glue = cur_glue - shrink(g); + } else if (shrink_order(q) == g_order) { + cur_glue = cur_glue - shrink(q); vet_glue(float_cast(glue_set(this_box)) * cur_glue); cur_g = float_round(glue_temp); } @@ -442,17 +440,16 @@ cur.h += x_advance(p); case glue_node: { /* move right or output leaders, we use real multiplication */ - halfword g = glue_ptr(p); - rule.wd = width(g) - cur_g; + rule.wd = width(p) - cur_g; if (g_sign != normal) { if (g_sign == stretching) { - if (stretch_order(g) == g_order) { - cur_glue = cur_glue + stretch(g); + if (stretch_order(p) == g_order) { + cur_glue = cur_glue + stretch(p); vet_glue(float_cast(glue_set(this_box)) * cur_glue); cur_g = float_round(glue_temp); } - } else if (shrink_order(g) == g_order) { - cur_glue = cur_glue - shrink(g); + } else if (shrink_order(p) == g_order) { + cur_glue = cur_glue - shrink(p); vet_glue(float_cast(glue_set(this_box)) * cur_glue); cur_g = float_round(glue_temp); } @@ -654,7 +651,7 @@ cur.h += x_advance(p); synctexmath(p, this_box); } /* begin mathskip code */ - if (glue_ptr(p) == zero_glue) { + if (glue_is_zero(p)) { cur.h += surround(p); break; } else { @@ -880,17 +877,16 @@ void vlist_out(PDF pdf, halfword this_box, int rule_callback_id) case glue_node: { /* move down or output leaders, we use real multiplication */ - halfword g = glue_ptr(p); - rule.ht = width(g) - cur_g; + rule.ht = width(p) - cur_g; if (g_sign != normal) { if (g_sign == stretching) { - if (stretch_order(g) == g_order) { - cur_glue = cur_glue + stretch(g); + if (stretch_order(p) == g_order) { + cur_glue = cur_glue + stretch(p); vet_glue(float_cast(glue_set(this_box)) * cur_glue); cur_g = float_round(glue_temp); } - } else if (shrink_order(g) == g_order) { - cur_glue = cur_glue - shrink(g); + } else if (shrink_order(p) == g_order) { + cur_glue = cur_glue - shrink(p); vet_glue(float_cast(glue_set(this_box)) * cur_glue); cur_g = float_round(glue_temp); } diff --git a/Build/source/texk/web2c/luatexdir/tex/align.w b/Build/source/texk/web2c/luatexdir/tex/align.w index d54eabac131..cd8086af301 100644 --- a/Build/source/texk/web2c/luatexdir/tex/align.w +++ b/Build/source/texk/web2c/luatexdir/tex/align.w @@ -518,7 +518,7 @@ void init_row(void) space_factor = 0; else prev_depth = 0; - tail_append(new_glue(glue_ptr(preamble))); + tail_append(new_glue(preamble)); subtype(cur_list.tail_field) = tab_skip_code + 1; cur_align = vlink(preamble); cur_tail = cur_head; @@ -650,7 +650,7 @@ boolean fin_col(void) v_part(p) = token_link(hold_token_head); cur_loop = vlink(cur_loop); - r = new_glue(glue_ptr(cur_loop)); + r = new_glue(cur_loop); vlink(p) = r; } else { const char *hlp[] = @@ -719,7 +719,7 @@ boolean fin_col(void) cur_list.tail_field = u; /* Copy the tabskip glue between columns */ - tail_append(new_glue(glue_ptr(vlink(cur_align)))); + tail_append(new_glue(vlink(cur_align))); subtype(cur_list.tail_field) = tab_skip_code + 1; if (extra_info(cur_align) >= cr_code) { @@ -803,13 +803,13 @@ set so that the columns line up, taking due account of spanned columns. @c void fin_align(void) { - pointer p, q, r, s, u, v, rr; /* registers for the list operations */ + pointer p, q, r, s, u, rr; /* registers for the list operations */ scaled t, w; /* width of column */ scaled o; /* shift offset for unset boxes */ halfword n; /* matching span amount */ scaled rule_save; /* temporary storage for |overfull_rule| */ halfword pd; /* temporary storage for |prev_depth| */ - halfword ng; /* temporary storage for |new_glue| */ + halfword ng; /* temporary storage for |new_glue| */ if (cur_group != align_group) confusion("align1"); unsave(); /* that |align_group| was for individual entries */ @@ -856,12 +856,7 @@ value is changed to zero and so is the next tabskip. /* Nullify |width(q)| and the tabskip glue following this column */ width(q) = 0; r = vlink(q); - s = glue_ptr(r); - if (s != zero_glue) { - add_glue_ref(zero_glue); - delete_glue_ref(s); - glue_ptr(r) = zero_glue; - } + reset_glue_to_zero(r); /* is a lready copy */ } if (span_ptr(q) != end_span) { /* Merge the widths in the span nodes of |q| with those of |p|, @@ -874,7 +869,7 @@ value is changed to zero and so is the next tabskip. have been processed, and the successor of |s| matches |r| or precedes |r| or follows |r|, according as |link(r)=n| or |link(r)>n| or |link(r)<n|. */ - t = width(q) + width(glue_ptr(vlink(q))); + t = width(q) + width(vlink(q)); r = span_ptr(q); s = end_span; span_ptr(s) = p; @@ -987,22 +982,17 @@ value is changed to zero and so is the next tabskip. and update |s| and |t| as the prototype nodes are passed */ s = vlink(s); - v = glue_ptr(s); - ng = new_glue(v); + ng = new_glue(s); vlink(u) = ng; u = vlink(u); subtype(u) = tab_skip_code + 1; - t = t + width(v); + t = t + width(s); if (glue_sign(p) == stretching) { - if (stretch_order(v) == glue_order(p)) - t = t + - round(float_cast(glue_set(p)) * - float_cast(stretch(v))); + if (stretch_order(s) == glue_order(p)) + t = t + round(float_cast(glue_set(p)) * float_cast(stretch(s))); } else if (glue_sign(p) == shrinking) { - if (shrink_order(v) == glue_order(p)) - t = t - - round(float_cast(glue_set(p)) * - float_cast(shrink(v))); + if (shrink_order(s) == glue_order(p)) + t = t - round(float_cast(glue_set(p)) * float_cast(shrink(s))); } s = vlink(s); rr = new_null_box(); diff --git a/Build/source/texk/web2c/luatexdir/tex/buildpage.w b/Build/source/texk/web2c/luatexdir/tex/buildpage.w index 4c61a510a9c..104566f790b 100644 --- a/Build/source/texk/web2c/luatexdir/tex/buildpage.w +++ b/Build/source/texk/web2c/luatexdir/tex/buildpage.w @@ -316,15 +316,14 @@ void build_page(void) p = vlink(contrib_head); /* Update the values of |last_glue|, |last_penalty|, and |last_kern| */ if (last_glue != max_halfword) { - delete_glue_ref(last_glue); + flush_node(last_glue); last_glue = max_halfword; } last_penalty = 0; last_kern = 0; last_node_type = type(p) + 1; if (type(p) == glue_node) { - last_glue = glue_ptr(p); - add_glue_ref(last_glue); + last_glue = new_glue(p); } else if (type(p) == penalty_node) { last_penalty = penalty(p); } else if (type(p) == kern_node) { @@ -360,17 +359,17 @@ void build_page(void) freeze_page_specs(box_there); else page_contents = box_there; - q = new_skip_param(top_skip_code); /* now |temp_ptr=glue_ptr(q)| */ + q = new_skip_param(top_skip_code); if ((type(p) == hlist_node) && is_mirrored(body_direction)) { - if (width(temp_ptr) > depth(p)) - width(temp_ptr) = width(temp_ptr) - depth(p); + if (width(q) > depth(p)) + width(q) = width(q) - depth(p); else - width(temp_ptr) = 0; + width(q) = 0; } else { - if (width(temp_ptr) > height(p)) - width(temp_ptr) = width(temp_ptr) - height(p); + if (width(q) > height(p)) + width(q) = width(q) - height(p); else - width(temp_ptr) = 0; + width(q) = 0; } couple_nodes(q, p); couple_nodes(contrib_head, q); @@ -633,32 +632,24 @@ void build_page(void) /* Update the current page measurements with respect to the glue or kern specified by node~|p| */ - if (type(p) == kern_node) { - q = p; - } else { - q = glue_ptr(p); - if (stretch_order(q) > 1) - page_so_far[1 + stretch_order(q)] = - page_so_far[1 + stretch_order(q)] + stretch(q); + if (type(p) != kern_node) { + if (stretch_order(p) > 1) + page_so_far[1 + stretch_order(p)] = page_so_far[1 + stretch_order(p)] + stretch(p); else - page_so_far[2 + stretch_order(q)] = - page_so_far[2 + stretch_order(q)] + stretch(q); - page_shrink = page_shrink + shrink(q); - if ((shrink_order(q) != normal) && (shrink(q) != 0)) { + page_so_far[2 + stretch_order(p)] = page_so_far[2 + stretch_order(p)] + stretch(p); + page_shrink = page_shrink + shrink(p); + if ((shrink_order(p) != normal) && (shrink(p) != 0)) { print_err("Infinite glue shrinkage found on current page"); help4("The page about to be output contains some infinitely", "shrinkable glue, e.g., `\\vss' or `\\vskip 0pt minus 1fil'.", "Such glue doesn't belong there; but you can safely proceed,", "since the offensive shrinkability has been made finite."); error(); - r = new_spec(q); - shrink_order(r) = normal; - delete_glue_ref(q); - glue_ptr(p) = r; - q = r; + reset_glue_to_zero(p); + shrink_order(p) = normal; } } - page_total = page_total + page_depth + width(q); + page_total = page_total + page_depth + width(p); page_depth = 0; CONTRIBUTE: /* go here to link a node into the current page */ @@ -814,6 +805,7 @@ void fire_up(halfword c) s = last_ins_ptr(r); vlink(s) = ins_ptr(p); if (best_ins_ptr(r) == p) { + halfword t; /* was a global temp_ptr */ /* Wrap up the box specified by node |r|, splitting node |p| if called for; set |wait:=true| if node |p| holds a remainder after splitting */ @@ -826,22 +818,20 @@ void fire_up(halfword c) ins_ptr(p) = prune_page_top(broken_ptr(r), false); if (ins_ptr(p) != null) { - temp_ptr = - vpack(ins_ptr(p), 0, additional, -1); - height(p) = - height(temp_ptr) + depth(temp_ptr); - list_ptr(temp_ptr) = null; - flush_node(temp_ptr); + t = vpack(ins_ptr(p), 0, additional, -1); + height(p) = height(t) + depth(t); + list_ptr(t) = null; + flush_node(t); wait = true; } } } best_ins_ptr(r) = null; n = subtype(r); - temp_ptr = list_ptr(box(n)); + t = list_ptr(box(n)); list_ptr(box(n)) = null; flush_node(box(n)); - box(n) = vpack(temp_ptr, 0, additional, body_direction); + box(n) = vpack(t, 0, additional, body_direction); } else { while (vlink(s) != null) @@ -910,7 +900,7 @@ void fire_up(halfword c) vbadness = save_vbadness; vfuzz = save_vfuzz; if (last_glue != max_halfword) - delete_glue_ref(last_glue); + flush_node(last_glue); /* Start a new current page */ start_new_page(); /* this sets |last_glue:=max_halfword| */ if (q != hold_head) { @@ -921,6 +911,7 @@ void fire_up(halfword c) /* Delete the page-insertion nodes */ r = vlink(page_ins_head); while (r != page_ins_head) { + /* todo: couple */ q = vlink(r); flush_node(r); r = q; diff --git a/Build/source/texk/web2c/luatexdir/tex/directions.w b/Build/source/texk/web2c/luatexdir/tex/directions.w index 7af25187999..20d46606d6a 100644 --- a/Build/source/texk/web2c/luatexdir/tex/directions.w +++ b/Build/source/texk/web2c/luatexdir/tex/directions.w @@ -86,7 +86,6 @@ halfword new_dir(int s) { halfword p = new_node(dir_node, 0); dir_dir(p) = s; - dir_dvi_ptr(p) = -1; dir_level(p) = cur_level; return p; } diff --git a/Build/source/texk/web2c/luatexdir/tex/dumpdata.w b/Build/source/texk/web2c/luatexdir/tex/dumpdata.w index ac4f96f2f0e..be5f0074639 100644 --- a/Build/source/texk/web2c/luatexdir/tex/dumpdata.w +++ b/Build/source/texk/web2c/luatexdir/tex/dumpdata.w @@ -27,7 +27,7 @@ /* we start with 907: the sum of the values of the bytes of "don knuth" */ -#define FORMAT_ID (907+13) +#define FORMAT_ID (907+14) #if ((FORMAT_ID>=0) && (FORMAT_ID<=256)) #error Wrong value for FORMAT_ID. #endif diff --git a/Build/source/texk/web2c/luatexdir/tex/equivalents.w b/Build/source/texk/web2c/luatexdir/tex/equivalents.w index d88b7322a76..cc709c1bd7e 100644 --- a/Build/source/texk/web2c/luatexdir/tex/equivalents.w +++ b/Build/source/texk/web2c/luatexdir/tex/equivalents.w @@ -567,6 +567,8 @@ within |save_stack|, so these counts must be handled carefully. @^reference counts@> @c +/* we don't need to destroy when an assignment has the same node */ + void eq_destroy(memory_word w) { /* gets ready to forget |w| */ halfword q; /* |equiv| field of |w| */ @@ -578,7 +580,7 @@ void eq_destroy(memory_word w) delete_token_ref(equiv_field(w)); break; case glue_ref_cmd: - delete_glue_ref(equiv_field(w)); + flush_node(equiv_field(w)); break; case shape_ref_cmd: q = equiv_field(w); /* we need to free a \.{\\parshape} block */ diff --git a/Build/source/texk/web2c/luatexdir/tex/linebreak.h b/Build/source/texk/web2c/luatexdir/tex/linebreak.h index 1b5d1da96ca..99560ebed2e 100644 --- a/Build/source/texk/web2c/luatexdir/tex/linebreak.h +++ b/Build/source/texk/web2c/luatexdir/tex/linebreak.h @@ -82,7 +82,7 @@ extern halfword find_protchar_right(halfword l, halfword r); ) # define cp_skipable(a) ( (! is_char_node((a))) && ( \ - ((type((a)) == glue_node) && (glue_ptr((a)) == zero_glue)) \ + ((type((a)) == glue_node) && (glue_is_zero((a)))) \ || (type((a)) == penalty_node) \ || ((type((a)) == disc_node) && empty_disc(a)) \ || ((type((a)) == kern_node) && ((width((a)) == 0) || (subtype((a)) == normal))) \ diff --git a/Build/source/texk/web2c/luatexdir/tex/linebreak.w b/Build/source/texk/web2c/luatexdir/tex/linebreak.w index 6560192da93..8b8f47bc9d5 100644 --- a/Build/source/texk/web2c/luatexdir/tex/linebreak.w +++ b/Build/source/texk/web2c/luatexdir/tex/linebreak.w @@ -108,11 +108,10 @@ void line_break(boolean d, int line_break_context) } else if (type(cur_list.tail_field) != glue_node) { tail_append(new_penalty(inf_penalty)); } else { - type(cur_list.tail_field) = penalty_node; - delete_glue_ref(glue_ptr(cur_list.tail_field)); - if (leader_ptr(cur_list.tail_field) != null) - flush_node_list(leader_ptr(cur_list.tail_field)); - penalty(cur_list.tail_field) = inf_penalty; + halfword t = alink(cur_list.tail_field); + flush_node(cur_list.tail_field); + cur_list.tail_field = t; + tail_append(new_penalty(inf_penalty)); } final_par_glue = new_param_glue(par_fill_skip_code); couple_nodes(cur_list.tail_field, final_par_glue); @@ -210,7 +209,6 @@ static boolean no_shrink_error_yet; /*have we complained about infinite shri static halfword finite_shrink(halfword p) { /* recovers from infinite shrinkage */ - halfword q; /*new glue specification */ const char *hlp[] = { "The paragraph just ended includes some glue that has", "infinite shrinkability, e.g., `\\hskip 0pt minus 1fil'.", @@ -223,10 +221,8 @@ static halfword finite_shrink(halfword p) no_shrink_error_yet = false; tex_error("Infinite glue shrinkage found in a paragraph", hlp); } - q = new_spec(p); - shrink_order(q) = normal; - delete_glue_ref(p); - return q; + shrink_order(p) = normal; + return p; } @ A pointer variable |cur_p| runs through the given horizontal list as we look @@ -900,7 +896,7 @@ static void compute_break_width(int break_type, int line_break_dir, int adjust_s switch (type(s)) { case math_node: /* begin mathskip code */ - if (math_skip == zero_glue) { + if (glue_is_zero(math_skip)) { break_width[1] -= surround(s); break; } else { @@ -909,12 +905,9 @@ static void compute_break_width(int break_type, int line_break_dir, int adjust_s /* end mathskip code */ case glue_node: /*Subtract glue from |break_width|; */ - { - halfword v = glue_ptr(s); - break_width[1] -= width(v); - break_width[2 + stretch_order(v)] -= stretch(v); - break_width[7] -= shrink(v); - } + break_width[1] -= width(s); + break_width[2 + stretch_order(s)] -= stretch(s); + break_width[7] -= shrink(s); break; case penalty_node: break; @@ -1698,7 +1691,7 @@ void ext_do_line_break(int paragraph_dir, */ do_last_line_fit = false; if (last_line_fit > 0) { - q = glue_ptr(last_line_fill); + q = last_line_fill; if ((stretch(q) > 0) && (stretch_order(q) > normal)) { if ((background[3] == 0) && (background[4] == 0) && (background[5] == 0) && (background[6] == 0)) { @@ -1845,7 +1838,7 @@ void ext_do_line_break(int paragraph_dir, case math_node: auto_breaking = (subtype(cur_p) == after); /* begin mathskip code */ - if (math_skip == zero_glue) { + if (glue_is_zero(math_skip)) { kern_break(); break; } else { @@ -1886,16 +1879,10 @@ void ext_do_line_break(int paragraph_dir, } } /* *INDENT-ON* */ - check_shrinkage(glue_ptr(cur_p)); - q = glue_ptr(cur_p); - active_width[1] += width(q); - active_width[2 + stretch_order(q)] += stretch(q); - active_width[7] += shrink(q); - /* begin mathskip code */ - if (type(cur_p)==math_node) { - active_width[1]+=surround(cur_p); - } - /* end mathskip code */ + check_shrinkage(cur_p); + active_width[1] += width(cur_p); + active_width[2 + stretch_order(cur_p)] += stretch(cur_p); + active_width[7] += shrink(cur_p); break; case kern_node: if (subtype(cur_p) == explicit_kern || subtype(cur_p) == italic_kern) { @@ -2122,11 +2109,8 @@ void ext_do_line_break(int paragraph_dir, if (active_short(best_bet) == 0) { do_last_line_fit = false; } else { - q = new_spec(glue_ptr(last_line_fill)); - delete_glue_ref(glue_ptr(last_line_fill)); - width(q) += (active_short(best_bet) - active_glue(best_bet)); - stretch(q) = 0; - glue_ptr(last_line_fill) = q; + width(last_line_fill) += (active_short(best_bet) - active_glue(best_bet)); + stretch(last_line_fill) = 0; } } diff --git a/Build/source/texk/web2c/luatexdir/tex/mainbody.w b/Build/source/texk/web2c/luatexdir/tex/mainbody.w index a8d35d7ac56..ad0bb783a1f 100644 --- a/Build/source/texk/web2c/luatexdir/tex/mainbody.w +++ b/Build/source/texk/web2c/luatexdir/tex/mainbody.w @@ -549,7 +549,8 @@ been scanned and |its_all_over|\kern-2pt. void final_cleanup(void) { int c; /* 0 for \.{\\end}, 1 for \.{\\dump} */ - halfword i; /* for looping marks */ + halfword i; /* for looping marks */ + halfword t; /* was a global temp_ptr */ c = cur_chr; if (job_name == 0) open_log_file(); @@ -578,17 +579,16 @@ void final_cleanup(void) tprint(" was incomplete)"); if_line = if_line_field(cond_ptr); cur_if = subtype(cond_ptr); - temp_ptr = cond_ptr; + t = cond_ptr; cond_ptr = vlink(cond_ptr); - flush_node(temp_ptr); + flush_node(t); } if (callback_defined(stop_run_callback) == 0) if (history != spotless) if ((history == warning_issued) || (interaction < error_stop_mode)) if (selector == term_and_log) { selector = term_only; - tprint_nl - ("(see the transcript file for additional information)"); + tprint_nl("(see the transcript file for additional information)"); selector = term_and_log; } if (c == 1) { @@ -602,8 +602,9 @@ void final_cleanup(void) } for (c = last_box_code; c <= vsplit_code; c++) flush_node_list(disc_ptr[c]); - if (last_glue != max_halfword) - delete_glue_ref(last_glue); + if (last_glue != max_halfword) { + flush_node(last_glue); + } while (pseudo_files != null) pseudo_close(); /* flush pseudo files */ store_fmt_file(); diff --git a/Build/source/texk/web2c/luatexdir/tex/maincontrol.h b/Build/source/texk/web2c/luatexdir/tex/maincontrol.h index ea22ff80dc7..c42dcc93aa4 100644 --- a/Build/source/texk/web2c/luatexdir/tex/maincontrol.h +++ b/Build/source/texk/web2c/luatexdir/tex/maincontrol.h @@ -176,7 +176,6 @@ extern void fixup_directions(void); extern void get_r_token(void); extern void assign_internal_value(int a, halfword p, int cur_val); -extern void trap_zero_glue(void); extern void do_register_command(int a); extern void alter_aux(void); extern void alter_prev_graf(void); diff --git a/Build/source/texk/web2c/luatexdir/tex/maincontrol.w b/Build/source/texk/web2c/luatexdir/tex/maincontrol.w index bf432e308da..af89da9d5d7 100644 --- a/Build/source/texk/web2c/luatexdir/tex/maincontrol.w +++ b/Build/source/texk/web2c/luatexdir/tex/maincontrol.w @@ -130,11 +130,7 @@ and kerns, is part of \TeX's ``inner loop''; the whole program runs efficiently when its inner loop is fast, so this part has been written with particular care. -@c -static halfword main_p; /* temporary register for list manipulation */ -static halfword main_s; /* space factor value */ - -@ We leave the |space_factor| unchanged if |sf_code(cur_chr)=0|; otherwise we +We leave the |space_factor| unchanged if |sf_code(cur_chr)=0|; otherwise we set it equal to |sf_code(cur_chr)|, except that it should never change from a value less than 1000 to a value exceeding 1000. The most common case is |sf_code(cur_chr)=1000|, so we want that case to be fast. @@ -142,16 +138,16 @@ case is |sf_code(cur_chr)=1000|, so we want that case to be fast. @c void adjust_space_factor(void) { - main_s = get_sf_code(cur_chr); - if (main_s == 1000) { + halfword s = get_sf_code(cur_chr); + if (s == 1000) { space_factor = 1000; - } else if (main_s < 1000) { - if (main_s > 0) - space_factor = main_s; + } else if (s < 1000) { + if (s > 0) + space_factor = s; } else if (space_factor < 1000) { space_factor = 1000; } else { - space_factor = main_s; + space_factor = s; } } @@ -160,10 +156,6 @@ both time and memory.'' That may be true, but it also punches through the API wall for fonts, so I removed that -- Taco. But a bit of caching is very welcome, which is why I need to have the next two globals: -@c -internal_font_number space_spec_font; -halfword space_spec_cache; - @ To handle the execution state of |main_control|'s eternal loop, an extra global variable is used, along with a macro to define its values. @@ -208,38 +200,32 @@ is zero or~not. @c static void run_app_space (void) { + halfword p; /* was a global temp_ptr */ int method = int_par(disable_space_code) ; if (method == 1) { /* don't inject anything, not even zero skip */ } else if (method == 2) { - temp_ptr = new_glue(zero_glue); - couple_nodes(tail,temp_ptr); - tail = temp_ptr; + p = new_glue(zero_glue); + couple_nodes(tail,p); + tail = p; } else if ((abs(mode) + cur_cmd == hmode + spacer_cmd) && (!(space_factor == 1000))) { app_space(); } else { /* Append a normal inter-word space to the current list */ - if (space_skip == zero_glue) { - /* Find the glue specification, |main_p|, for - text spaces in the current font */ - if (cur_font != space_spec_font) { - if (space_spec_cache != zero_glue) - delete_glue_ref(space_spec_cache); - space_spec_cache = new_spec(zero_glue); - width(space_spec_cache) = space(cur_font); - stretch(space_spec_cache) = space_stretch(cur_font); - shrink(space_spec_cache) = space_shrink(cur_font); - space_spec_font = cur_font; - } - main_p = space_spec_cache; - temp_ptr = new_glue(main_p); + if (glue_is_zero(space_skip)) { + /* Find the glue specification for text spaces in the current font */ + p = new_glue(zero_glue); + width(p) = space(cur_font); + stretch(p) = space_stretch(cur_font); + shrink(p) = space_shrink(cur_font); + } else { - temp_ptr = new_param_glue(space_skip_code); + p = new_param_glue(space_skip_code); } -/* so from now we have a subtype with spaces: */ -subtype(temp_ptr) = space_skip_code + 1 ; - couple_nodes(tail,temp_ptr); - tail = temp_ptr; + /* so from now we have a subtype with spaces: */ + subtype(p) = space_skip_code + 1 ; + couple_nodes(tail,p); + tail = p; } } @@ -1001,28 +987,27 @@ void main_control(void) void app_space(void) { /* handle spaces when |space_factor<>1000| */ halfword q; /* glue node */ - if ((space_factor >= 2000) && (xspace_skip != zero_glue)) { + if ((space_factor >= 2000) && (! glue_is_zero(xspace_skip))) { q = new_param_glue(xspace_skip_code); -/* so from now we have a subtype with spaces: */ -subtype(q) = xspace_skip_code + 1; + /* so from now we have a subtype with spaces: */ + subtype(q) = xspace_skip_code + 1; } else { - if (space_skip != zero_glue) { - main_p = new_spec(space_skip); + if (!glue_is_zero(space_skip)) { + q = new_glue(space_skip); } else { - main_p = new_spec(zero_glue); - width(main_p) = space(cur_font); - stretch(main_p) = space_stretch(cur_font); - shrink(main_p) = space_shrink(cur_font); + q = new_glue(zero_glue); + width(q) = space(cur_font); + stretch(q) = space_stretch(cur_font); + shrink(q) = space_shrink(cur_font); } - /* Modify the glue specification in |main_p| according to the space factor */ + /* Modify the glue specification in |q| according to the space factor */ if (space_factor >= 2000) - width(main_p) = width(main_p) + extra_space(cur_font); - stretch(main_p) = xn_over_d(stretch(main_p), space_factor, 1000); - shrink(main_p) = xn_over_d(shrink(main_p), 1000, space_factor); - q = new_glue(main_p); - glue_ref_count(main_p) = null; -/* so from now we have a subtype with spaces: */ -subtype(q) = space_skip_code + 1; + width(q) = width(q) + extra_space(cur_font); + stretch(q) = xn_over_d(stretch(q), space_factor, 1000); + shrink(q) = xn_over_d(shrink(q), 1000, space_factor); + + /* so from now we have a subtype with spaces: */ + subtype(q) = space_skip_code + 1; } couple_nodes(tail, q); tail = q; @@ -1136,20 +1121,19 @@ used in at least one place where that would be a mistake. @c void append_glue(void) { - int s; /* modifier of skip command */ - s = cur_chr; + int s = cur_chr; switch (s) { case fil_code: - cur_val = fil_glue; + cur_val = new_glue(fil_glue); break; case fill_code: - cur_val = fill_glue; + cur_val = new_glue(fill_glue); break; case ss_code: - cur_val = ss_glue; + cur_val = new_glue(ss_glue); break; case fil_neg_code: - cur_val = fil_neg_glue; + cur_val = new_glue(fil_neg_glue); break; case skip_code: scan_glue(glue_val_level); @@ -1157,12 +1141,12 @@ void append_glue(void) case mskip_code: scan_glue(mu_val_level); break; - } /* now |cur_val| points to the glue specification */ + } + /* now |cur_val| points to the glue specification */ tail_append(new_glue(cur_val)); - if (s >= skip_code) { - decr(glue_ref_count(cur_val)); - if (s > skip_code) - subtype(tail) = mu_glue; + flush_node(cur_val); + if (s > skip_code) { + subtype(tail) = mu_glue; } } @@ -1287,8 +1271,7 @@ void handle_right_brace(void) break; case insert_group: end_graf(insert_group); - q = split_top_skip; - add_glue_ref(q); + q = new_glue(split_top_skip); d = split_max_depth; f = floating_penalty; unsave(); @@ -1306,7 +1289,7 @@ void handle_right_brace(void) } else if (saved_type(0) == saved_adjust) { tail_append(new_node(adjust_node, saved_value(0))); adjust_ptr(tail) = list_ptr(p); - delete_glue_ref(q); + flush_node(q); } else { confusion("insert_group"); } @@ -2539,7 +2522,6 @@ void prefixed_command(void) scan_glue(mu_val_level); else scan_glue(glue_val_level); - trap_zero_glue(); define(p, glue_ref_cmd, cur_val); break; case def_char_code_cmd: @@ -2638,7 +2620,6 @@ void prefixed_command(void) scan_dimen(false, false, false); } else { scan_glue(mu_val_level); - trap_zero_glue(); if (cur_val == glue_par(thin_mu_skip_code)) cur_val = thin_mu_skip_code; else if (cur_val == glue_par(med_mu_skip_code)) @@ -2992,21 +2973,6 @@ void assign_internal_value(int a, halfword p, int val) } } -@ When a glue register or parameter becomes zero, it will always point to -|zero_glue| because of the following procedure. (Exception: The tabskip -glue isn't trapped while preambles are being scanned.) - -@c -void trap_zero_glue(void) -{ - if ((width(cur_val) == 0) && (stretch(cur_val) == 0) - && (shrink(cur_val) == 0)) { - add_glue_ref(zero_glue); - delete_glue_ref(cur_val); - cur_val = zero_glue; - } -} - @ We use the fact that |register<advance<multiply<divide| Compute the register location |l| and its type |p|; but |return| if invalid @@ -3065,20 +3031,20 @@ void do_register_command(int a) if (q == advance_cmd) cur_val = cur_val + eqtb[l].cint; } else { + /* we can probably save a copy */ scan_glue(p); if (q == advance_cmd) { /* Compute the sum of two glue specs */ halfword r = equiv(l); q = new_spec(cur_val); - delete_glue_ref(cur_val); + flush_node(cur_val); width(q) = width(q) + width(r); if (stretch(q) == 0) { stretch_order(q) = normal; } if (stretch_order(q) == stretch_order(r)) { stretch(q) = stretch(q) + stretch(r); - } else if ((stretch_order(q) < stretch_order(r)) - && (stretch(r) != 0)) { + } else if ((stretch_order(q) < stretch_order(r)) && (stretch(r) != 0)) { stretch(q) = stretch(r); stretch_order(q) = stretch_order(r); } @@ -3087,8 +3053,7 @@ void do_register_command(int a) } if (shrink_order(q) == shrink_order(r)) { shrink(q) = shrink(q) + shrink(r); - } else if ((shrink_order(q) < shrink_order(r)) - && (shrink(r) != 0)) { + } else if ((shrink_order(q) < shrink_order(r)) && (shrink(r) != 0)) { shrink(q) = shrink(r); shrink_order(q) = shrink_order(r); } @@ -3128,7 +3093,7 @@ void do_register_command(int a) help2("I can't carry out that multiplication or division,", "since the result is out of range."); if (p >= glue_val_level) - delete_glue_ref(cur_val); + flush_node(cur_val); error(); return; } @@ -3143,7 +3108,6 @@ void do_register_command(int a) else word_define(l, cur_val); } else { - trap_zero_glue(); define(l, glue_ref_cmd, cur_val); } } @@ -3599,11 +3563,9 @@ void initialize(void) set_equiv(glue_base, zero_glue); set_eq_level(glue_base, level_one); set_eq_type(glue_base, glue_ref_cmd); - for (k = glue_base + 1; k <= local_base - 1; k++) + for (k = glue_base + 1; k <= local_base - 1; k++) { eqtb[k] = eqtb[glue_base]; - glue_ref_count(zero_glue) = - glue_ref_count(zero_glue) + local_base - glue_base; - + } par_shape_ptr = null; set_eq_type(par_shape_loc, shape_ref_cmd); set_eq_level(par_shape_loc, level_one); diff --git a/Build/source/texk/web2c/luatexdir/tex/mlist.w b/Build/source/texk/web2c/luatexdir/tex/mlist.w index 5932a9f9dbe..0fc21de7ceb 100644 --- a/Build/source/texk/web2c/luatexdir/tex/mlist.w +++ b/Build/source/texk/web2c/luatexdir/tex/mlist.w @@ -1063,17 +1063,15 @@ static scaled stack_into_box(pointer b, internal_font_number f, int c) } static void stack_glue_into_box(pointer b, scaled min, scaled max) { - pointer p, q; /* new node placed into |b| */ - q = new_spec(zero_glue); - width(q) = min; - stretch(q) = max-min; - p = new_glue(q); + halfword p = new_glue(zero_glue); + width(p) = min; + stretch(p) = max - min; reset_attributes(p, node_attr(b)); if (type(b) == vlist_node) { try_couple_nodes(p,list_ptr(b)); list_ptr(b) = p; } else { - q = list_ptr(b); + halfword q = list_ptr(b); if (q == null) { list_ptr(b) = p; } else { @@ -1543,7 +1541,7 @@ static pointer math_glue(pointer g, scaled m) decr(n); f = f + unity; } - p = new_node(glue_spec_node, 0); + p = new_node(glue_node, 0); width(p) = mu_mult(width(g)); /* convert \.{mu} to \.{pt} */ stretch_order(p) = stretch_order(g); if (stretch_order(p) == normal) @@ -1951,12 +1949,12 @@ static pointer wrapup_over_under_delimiter(pointer x, pointer y, pointer q, scal #define fixup_widths(q,x,y) do { \ if (width(y) >= width(x)) { \ - if (radicalwidth(q) != zero_glue) { \ + if (radicalwidth(q) != 0) { \ shift_amount(x) += half(width(y)-width(x)) ; \ } \ width(x) = width(y); \ } else { \ - if (radicalwidth(q) != zero_glue) { \ + if (radicalwidth(q) != 0) { \ shift_amount(y) += half(width(x)-width(y)) ; \ } \ width(y) = width(x); \ @@ -1965,7 +1963,7 @@ static pointer wrapup_over_under_delimiter(pointer x, pointer y, pointer q, scal #define check_radical(q,stack,r,t) do { \ - if (!stack && (width(r) >= width(t)) && (radicalwidth(q) != zero_glue) && (radicalwidth(q) != width(r))) { \ + if (!stack && (width(r) >= width(t)) && (radicalwidth(q) != 0) && (radicalwidth(q) != width(r))) { \ if (radicalleft(q)) { \ halfword p = new_kern(radicalwidth(q)-width(r)); \ reset_attributes(p, node_attr(q)); \ @@ -1990,7 +1988,7 @@ static pointer wrapup_over_under_delimiter(pointer x, pointer y, pointer q, scal } while (0) #define check_widths(q,p) do { \ - if (radicalwidth(q) != zero_glue) { \ + if (radicalwidth(q) != 0) { \ wd = radicalwidth(q); \ } else { \ wd = width(p); \ @@ -3710,13 +3708,11 @@ static pointer math_spacing_glue(int l_type, int r_type, int mstyle, scaled mmu) /* trap thin/med/thick settings cf. old TeX */ y = math_glue(glue_par(x), mmu); z = new_glue(y); - glue_ref_count(y) = null; /* store a symbolic subtype */ subtype(z) = (quarterword) (x + 1); } else { y = math_glue(x, mmu); z = new_glue(y); - glue_ref_count(y) = null; } } return z; @@ -3968,10 +3964,9 @@ void mlist_to_hlist(pointer mlist, boolean penalties, int cur_style) */ if (subtype(q) == mu_glue) { - x = glue_ptr(q); + x = q; /* was ptr */ y = math_glue(x, cur_mu); - delete_glue_ref(x); - glue_ptr(q) = y; + q = y; /* we can get rid of the indirect */ subtype(q) = normal; } else if ((cur_size != text_size) && (subtype(q) == cond_math_glue)) { p = vlink(q); diff --git a/Build/source/texk/web2c/luatexdir/tex/packaging.w b/Build/source/texk/web2c/luatexdir/tex/packaging.w index 0c474a50add..5b9aa8b8995 100644 --- a/Build/source/texk/web2c/luatexdir/tex/packaging.w +++ b/Build/source/texk/web2c/luatexdir/tex/packaging.w @@ -625,7 +625,6 @@ halfword hpack(halfword p, scaled w, int m, int pack_direction) scaled x = 0; /* natural width */ scaled_whd whd; scaled s; /* shift amount */ - halfword g; /* points to a glue specification */ int o; /* order of infinity */ halfword dir_ptr1 = null; /* for managing the direction stack */ int hpack_dir; /* the current direction */ @@ -758,14 +757,13 @@ halfword hpack(halfword p, scaled w, int m, int pack_direction) /* */ case glue_node: /* Incorporate glue into the horizontal totals */ - g = glue_ptr(p); - x += width(g); - o = stretch_order(g); - total_stretch[o] = total_stretch[o] + stretch(g); - o = shrink_order(g); - total_shrink[o] = total_shrink[o] + shrink(g); + x += width(p); + o = stretch_order(p); + total_stretch[o] = total_stretch[o] + stretch(p); + o = shrink_order(p); + total_shrink[o] = total_shrink[o] + shrink(p); if (subtype(p) >= a_leaders) { - g = leader_ptr(p); + halfword g = leader_ptr(p); if (height(g) > h) h = height(g); if (depth(g) > d) @@ -817,7 +815,7 @@ halfword hpack(halfword p, scaled w, int m, int pack_direction) break; case math_node: /* begin mathskip code */ - if (glue_ptr(p) == zero_glue) { + if (glue_is_zero(p)) { x += surround(p); break; } else { @@ -1198,7 +1196,7 @@ scaled_whd natural_sizes(halfword p, halfword pp, glue_ratio g_mult, /* */ case math_node: /* begin mathskip code */ - if (glue_ptr(p) == zero_glue) { + if (glue_is_zero(p)) { siz.wd += surround(p); break; } else { @@ -1206,15 +1204,14 @@ scaled_whd natural_sizes(halfword p, halfword pp, glue_ratio g_mult, } /* end mathskip code */ case glue_node: - g = glue_ptr(p); - siz.wd += width(g); + siz.wd += width(p); if (g_sign != normal) { if (g_sign == stretching) { - if (stretch_order(g) == g_order) { - siz.wd += float_round(float_cast(g_mult) * float_cast(stretch(g))); + if (stretch_order(p) == g_order) { + siz.wd += float_round(float_cast(g_mult) * float_cast(stretch(p))); } - } else if (shrink_order(g) == g_order) { - siz.wd -= float_round(float_cast(g_mult) * float_cast(shrink(g))); + } else if (shrink_order(p) == g_order) { + siz.wd -= float_round(float_cast(g_mult) * float_cast(shrink(p))); } } if (subtype(p) >= a_leaders) { @@ -1276,7 +1273,6 @@ halfword vpackage(halfword p, scaled h, int m, scaled l, int pack_direction) scaled x = 0; /* natural height */ scaled_whd whd; scaled s; /* shift amount */ - halfword g; /* points to a glue specification */ int o; /* order of infinity */ last_badness = 0; r = new_node(vlist_node, 0); @@ -1347,14 +1343,13 @@ halfword vpackage(halfword p, scaled h, int m, scaled l, int pack_direction) /* Incorporate glue into the vertical totals */ x += d; d = 0; - g = glue_ptr(p); - x += width(g); - o = stretch_order(g); - total_stretch[o] = total_stretch[o] + stretch(g); - o = shrink_order(g); - total_shrink[o] = total_shrink[o] + shrink(g); + x += width(p); + o = stretch_order(p); + total_stretch[o] = total_stretch[o] + stretch(p); + o = shrink_order(p); + total_shrink[o] = total_shrink[o] + shrink(p); if (subtype(p) >= a_leaders) { - g = leader_ptr(p); + halfword g = leader_ptr(p); if (width(g) > w) w = width(g); } @@ -1643,8 +1638,7 @@ void append_to_vlist(halfword b, int location) p = new_param_glue(line_skip_code); } else { p = new_skip_param(baseline_skip_code); - /* |temp_ptr=glue_ptr(p)| */ - width(temp_ptr) = d; + width(p) = d; } couple_nodes(cur_list.tail_field, p); cur_list.tail_field = p; @@ -1702,11 +1696,10 @@ halfword prune_page_top(halfword p, boolean s) q = new_skip_param(split_top_skip_code); vlink(prev_p) = q; vlink(q) = p; - /* now |temp_ptr=glue_ptr(q)| */ - if (width(temp_ptr) > height(p)) - width(temp_ptr) = width(temp_ptr) - height(p); + if (width(q) > height(p)) + width(q) = width(q) - height(p); else - width(temp_ptr) = 0; + width(q) = 0; p = null; break; case boundary_node: @@ -1775,7 +1768,6 @@ halfword vert_break(halfword p, scaled h, scaled d) { halfword prev_p = p; /* if |p| is a glue node, |type(prev_p)| determines whether |p| is a legal breakpoint, an initial glue node is not a legal breakpoint */ - halfword q, r; /* glue specifications */ int pi = 0; /* penalty value */ int b; /* badness at a trial breakpoint */ int t; /* |type| of the node following a kern */ @@ -1881,27 +1873,20 @@ halfword vert_break(halfword p, scaled h, scaled d) contain infinite shrinkability, since that would permit any amount of information to ``fit'' on one page. */ - if (type(p) == kern_node) { - q = p; - } else { - q = glue_ptr(p); - active_height[2 + stretch_order(q)] += stretch(q); - active_height[7] += shrink(q); - if ((shrink_order(q) != normal) && (shrink(q) != 0)) { + if (type(p) != kern_node) { + active_height[2 + stretch_order(p)] += stretch(p); + active_height[7] += shrink(p); + if ((shrink_order(p) != normal) && (shrink(p) != 0)) { print_err("Infinite glue shrinkage found in box being split"); help4("The box you are \\vsplitting contains some infinitely", "shrinkable glue, e.g., `\\vss' or `\\vskip 0pt minus 1fil'.", "Such glue doesn't belong there; but you can safely proceed,", "since the offensive shrinkability has been made finite."); error(); - r = new_spec(q); - shrink_order(r) = normal; - delete_glue_ref(q); - glue_ptr(p) = r; - q = r; + shrink_order(p) = normal; } } - cur_height = cur_height + prev_dp + width(q); + cur_height = cur_height + prev_dp + width(p); prev_dp = 0; NOT_FOUND: if (prev_dp > d) { diff --git a/Build/source/texk/web2c/luatexdir/tex/postlinebreak.w b/Build/source/texk/web2c/luatexdir/tex/postlinebreak.w index 43ceadcca28..fe11d76d0b1 100644 --- a/Build/source/texk/web2c/luatexdir/tex/postlinebreak.w +++ b/Build/source/texk/web2c/luatexdir/tex/postlinebreak.w @@ -163,10 +163,7 @@ void ext_post_line_break(int paragraph_dir, while(q != null) { if (type(q) == math_node) { surround(q) = 0 ; - if (glue_ptr(q) != zero_glue) { - delete_glue_ref(glue_ptr(q)); - glue_ptr(q) = zero_glue; - } + reset_glue_to_zero(q); break; } else if ((type(q) == hlist_node) && (subtype(q) == indent_list)) { /* go on */ @@ -202,16 +199,11 @@ void ext_post_line_break(int paragraph_dir, } else if (type(r) == math_node) { surround(r) = 0; /* begin mathskip code */ - if (glue_ptr(r) != zero_glue) { - delete_glue_ref(glue_ptr(r)); - glue_ptr(r) = zero_glue; - } + reset_glue_to_zero(r); /* end mathskip code */ } else if (type(r) == glue_node) { - delete_glue_ref(glue_ptr(r)); - glue_ptr(r) = right_skip; + copy_glue_values(r,right_skip); subtype(r) = right_skip_code + 1; - incr(glue_ref_count(right_skip)); glue_break = true; /* |q| refers to the last node of the line */ q = r; @@ -357,9 +349,8 @@ void ext_post_line_break(int paragraph_dir, then we append |rightskip| after |q| now */ if (!glue_break) { /* Put the \.{\\rightskip} glue after node |q|; */ - halfword r1 = new_glue((right_skip == null ? null : copy_node(right_skip))); - glue_ref_count(glue_ptr(r1)) = null; - subtype(r1) = right_skip_code+1; + halfword r1 = new_glue((right_skip == null ? zero_glue : right_skip)); + subtype(r1) = right_skip_code+1; try_couple_nodes(r1,vlink(q)); delete_attribute_ref(node_attr(r1)); node_attr(r1) = node_attr(q); @@ -399,7 +390,7 @@ void ext_post_line_break(int paragraph_dir, } /*at this point |q| is the leftmost node; all discardable nodes have been discarded */ if (protrude_chars > 0) { - halfword p; + halfword p; p = q; p = find_protchar_left(p, false); /* no more discardables */ w = char_pw(p, left_side); @@ -412,9 +403,8 @@ void ext_post_line_break(int paragraph_dir, q = k; } } - if (left_skip != zero_glue) { - r = new_glue(copy_node(left_skip)); - glue_ref_count(glue_ptr(r)) = null; + if (! glue_is_zero(left_skip)) { + r = new_glue(left_skip); subtype(r) = left_skip_code+1; delete_attribute_ref(node_attr(r)); node_attr(r) = node_attr(q); @@ -562,11 +552,7 @@ void ext_post_line_break(int paragraph_dir, if (type(q) == math_node) { /* begin mathskip code */ surround(q) = 0 ; - if (glue_ptr(q) != zero_glue) { - delete_glue_ref(glue_ptr(q)); - glue_ptr(q) = zero_glue; - add_glue_ref(glue_ptr(q)); - } + reset_glue_to_zero(q); /* end mathskip code */ } if (q == cur_break(cur_p)) { diff --git a/Build/source/texk/web2c/luatexdir/tex/scanning.w b/Build/source/texk/web2c/luatexdir/tex/scanning.w index 90499e8b4e5..907d25f5bac 100644 --- a/Build/source/texk/web2c/luatexdir/tex/scanning.w +++ b/Build/source/texk/web2c/luatexdir/tex/scanning.w @@ -139,10 +139,10 @@ int cur_val; /* value returned by numeric scanners */ int cur_val1; /* delcodes are sometimes 51 digits */ int cur_val_level; /* the ``level'' of this value */ -#define scanned_result(A,B) do { \ - cur_val=A; \ - cur_val_level=B; \ - } while (0) +#define scanned_result(A,B) do { \ + cur_val=A; \ + cur_val_level=B; \ +} while (0) @ When a |glue_val| changes to a |dimen_val|, we use the width component of the glue; there is no need to decrease the reference count, since it @@ -158,7 +158,7 @@ static void downgrade_cur_val(boolean delete_glue) m = cur_val; cur_val = width(m); if (delete_glue) - delete_glue_ref(m); + flush_node(m); } else if (cur_val_level == mu_val_level) { mu_error(); } @@ -172,7 +172,7 @@ static void negate_cur_val(boolean delete_glue) m = cur_val; cur_val = new_spec(m); if (delete_glue) - delete_glue_ref(m); + flush_node(m); /* Negate all three glue components of |cur_val| */ negate(width(cur_val)); negate(stretch(cur_val)); @@ -215,9 +215,11 @@ static boolean short_scan_something_internal(int cmd, int chr, int level, break; case assign_glue_cmd: scanned_result(equiv(m), glue_val_level); +// cur_val = new_spec(cur_val); break; case assign_mu_glue_cmd: scanned_result(equiv(m), mu_val_level); +// cur_val = new_spec(cur_val); break; case math_style_cmd: scanned_result(m, int_val_level); @@ -401,7 +403,7 @@ static boolean short_scan_something_internal(int cmd, int chr, int level, cur_val = stretch(q); else cur_val = shrink(q); - delete_glue_ref(q); + flush_node(q); break; } /* there are no other cases */ cur_val_level = dimen_val_level; @@ -478,7 +480,7 @@ static boolean short_scan_something_internal(int cmd, int chr, int level, cur_val = stretch_order(q); else cur_val = shrink_order(q); - delete_glue_ref(q); + flush_node(q); break; } /* there are no other cases */ cur_val_level = int_val_level; @@ -510,7 +512,7 @@ static boolean short_scan_something_internal(int cmd, int chr, int level, break; case lastskip_code: if (type(cur_list.tail_field) == glue_node) - cur_val = glue_ptr(cur_list.tail_field); + cur_val = new_glue(cur_list.tail_field); if (subtype(cur_list.tail_field) == mu_glue) cur_val_level = mu_val_level; break; @@ -529,7 +531,7 @@ static boolean short_scan_something_internal(int cmd, int chr, int level, break; case lastskip_code: if (last_glue != max_halfword) - cur_val = last_glue; + cur_val = last_glue; /* maybe new_glue */ break; case last_node_type_code: cur_val = last_node_type; @@ -554,9 +556,8 @@ static boolean short_scan_something_internal(int cmd, int chr, int level, */ if (negative) { negate_cur_val(false); - } else if ((cur_val_level >= glue_val_level) - && (cur_val_level <= mu_val_level)) { - add_glue_ref(cur_val); + } else if ((cur_val_level >= glue_val_level) && (cur_val_level <= mu_val_level)) { + cur_val = new_glue(cur_val); } } return succeeded; @@ -853,9 +854,8 @@ void scan_something_internal(int level, boolean negative) */ if (negative) { negate_cur_val(false); - } else if ((cur_val_level >= glue_val_level) && - (cur_val_level <= mu_val_level)) { - add_glue_ref(cur_val); + } else if ((cur_val_level >= glue_val_level) && (cur_val_level <= mu_val_level)) { + cur_val = new_glue(cur_val); } } } @@ -1103,7 +1103,7 @@ static void coerce_glue(void) int v; if (cur_val_level >= glue_val_level) { v = width(cur_val); - delete_glue_ref(cur_val); + flush_node(cur_val); cur_val = v; } } @@ -1513,36 +1513,18 @@ void scan_glue(int level) Create a new glue specification whose width is |cur_val|; scan for its stretch and shrink components. */ - /* - In several places there is a test for zero glue, for instance in protrusion - left/right node detection. In that case a \hskip\dimen<n> with the dimen being - zero will not be seen as zero glue. Therefore we delay the allocation of - glue till we know for sure that there are no fils involved. (!!) - */ - if (cur_val != 0) { /* !! new test */ - q = new_spec(zero_glue); - width(q) = cur_val; - } + q = new_spec(zero_glue); + width(q) = cur_val; if (scan_keyword("plus")) { - if (q == null) { /* !! new test */ - q = new_spec(zero_glue); - } scan_dimen(mu, true, false); stretch(q) = cur_val; stretch_order(q) = (quarterword) cur_order; } if (scan_keyword("minus")) { - if (q == null) { /* !! new test */ - q = new_spec(zero_glue); - } scan_dimen(mu, true, false); shrink(q) = cur_val; shrink_order(q) = (quarterword) cur_order; } - if (q == null) { /* !! new test */ - q = zero_glue ; - add_glue_ref(zero_glue); - } cur_val = q; } @@ -1698,11 +1680,11 @@ halfword the_toks(void) break; case glue_val_level: print_spec(cur_val, "pt"); - delete_glue_ref(cur_val); + flush_node(cur_val); break; case mu_val_level: print_spec(cur_val, "mu"); - delete_glue_ref(cur_val); + flush_node(cur_val); break; } /* there are no other cases */ selector = old_setting; @@ -1744,11 +1726,11 @@ str_number the_scanned_result(void) break; case glue_val_level: print_spec(cur_val, "pt"); - delete_glue_ref(cur_val); + flush_node(cur_val); break; case mu_val_level: print_spec(cur_val, "mu"); - delete_glue_ref(cur_val); + flush_node(cur_val); break; } /* there are no other cases */ r = make_string(); @@ -2203,8 +2185,7 @@ typedef enum { @c #define glue_error(A) do { \ arith_error=true; \ - delete_glue_ref(A); \ - A=new_spec(zero_glue); \ + reset_glue_to_zero(A); \ } while (0) #define normalize_glue(A) do { \ @@ -2510,9 +2491,11 @@ static void scan_expr(void) unless the next operator is a right parenthesis; this allows us later on to simply modify the glue components. */ + t = f; if ((l >= glue_val_level) && (o != expr_none)) { + /* do we really need to copy here ? */ t = new_spec(f); - delete_glue_ref(f); + flush_node(f); normalize_glue(t); } else { t = f; @@ -2588,7 +2571,7 @@ static void scan_expr(void) shrink(e) = shrink(t); shrink_order(e) = shrink_order(t); } - delete_glue_ref(t); + flush_node(t); normalize_glue(e); } r = o; @@ -2617,9 +2600,7 @@ static void scan_expr(void) "since the result is out of range."); error(); if (l >= glue_val_level) { - delete_glue_ref(e); - e = zero_glue; - add_glue_ref(e); + reset_glue_to_zero(e); } else { e = 0; } diff --git a/Build/source/texk/web2c/luatexdir/tex/texmath.w b/Build/source/texk/web2c/luatexdir/tex/texmath.w index 216d2364984..5067764fbf9 100644 --- a/Build/source/texk/web2c/luatexdir/tex/texmath.w +++ b/Build/source/texk/web2c/luatexdir/tex/texmath.w @@ -2454,9 +2454,8 @@ void after_math(void) } tail_append(new_math(math_surround, before)); /* begin mathskip code */ - if (math_skip != zero_glue) { - glue_ptr(tail) = math_skip; - add_glue_ref(math_skip); + if (! glue_is_zero(math_skip)) { + copy_glue_values(tail,math_skip); } /* end mathskip code */ if (dir_math_save) { @@ -2464,17 +2463,17 @@ void after_math(void) } run_mlist_to_hlist(p, (mode > 0), text_style); vlink(tail) = vlink(temp_head); - while (vlink(tail) != null) + while (vlink(tail) != null) { tail = vlink(tail); + } if (dir_math_save) { tail_append(new_dir(math_direction - dir_swap)); } dir_math_save = false; tail_append(new_math(math_surround, after)); /* begin mathskip code */ - if (math_skip != zero_glue) { - glue_ptr(tail) = math_skip; - add_glue_ref(math_skip); + if (! glue_is_zero(math_skip)) { + copy_glue_values(tail,math_skip); } /* end mathskip code */ space_factor = 1000; diff --git a/Build/source/texk/web2c/luatexdir/tex/texnodes.h b/Build/source/texk/web2c/luatexdir/tex/texnodes.h index 1f1a4e82964..0da84945184 100644 --- a/Build/source/texk/web2c/luatexdir/tex/texnodes.h +++ b/Build/source/texk/web2c/luatexdir/tex/texnodes.h @@ -68,8 +68,6 @@ extern void undump_node_mem(void); # define rlink(a) vlink((a)+1) /* aka alink() */ # define tlink(a) vinfo((a)+1) /* overlaps with node_attr() */ -# define add_glue_ref(a) glue_ref_count(a)++ /* new reference to a glue spec */ - /* really special head node pointers that only need links */ # define temp_node_size 2 @@ -106,15 +104,6 @@ extern void update_attribute_cache(void); extern halfword copy_attribute_list(halfword n); extern halfword do_set_attribute(halfword p, int i, int val); -/* a glue spec */ -# define glue_spec_size 4 -# define stretch(a) vlink((a)+1) -/* width == a+2 */ -# define shrink(a) vinfo((a)+1) -# define stretch_order(a) type((a)+3) -# define shrink_order(a) subtype((a)+3) -# define glue_ref_count(a) vlink((a)+3) - # define width_offset 2 # define depth_offset 3 # define height_offset 4 @@ -138,11 +127,53 @@ typedef enum { # define penalty_node_size 3 # define penalty(a) vlink((a)+2) +/* # define glue_node_size 4 # define glue_ptr(a) vinfo((a)+2) # define leader_ptr(a) vlink((a)+2) # define synctex_tag_glue(a) vinfo((a)+3) # define synctex_line_glue(a) vlink((a)+3) +*/ + +# define glue_node_size 7 +# define glue_spec_size 5 +/* define width(a) vinfo((a)+2) */ +/* define leader_ptr(a) vlink((a)+2) */ +# define shrink(a) vinfo((a)+3) +# define stretch(a) vlink((a)+3) +# define stretch_order(a) vinfo((a)+4) +# define shrink_order(a) vlink((a)+4) +# define leader_ptr(a) vlink((a)+5) /* should be in vlink((a)+2) but fails */ +# define synctex_tag_glue(a) vinfo((a)+6) +# define synctex_line_glue(a) vlink((a)+6) + +#define glue_is_zero(p) \ + ((p == null) || (width(p) == 0 && stretch(p) == 0 && shrink(p) == 0)) + +#define reset_glue_to_zero(p) \ + if (p != null) { \ + width(p) = 0; \ + stretch(p) = 0; \ + shrink(p) = 0; \ + stretch_order(p) = 0; \ + shrink_order(p) = 0; \ + } + +#define copy_glue_values(p,q) \ + if (q == null) { \ + width(p) = 0; \ + stretch(p) = 0; \ + shrink(p) = 0; \ + stretch_order(p) = 0; \ + shrink_order(p) = 0; \ + } else { \ + width(p) = width(q); \ + stretch(p) = stretch(q); \ + shrink(p) = shrink(q); \ + stretch_order(p) = stretch_order(q); \ + shrink_order(p) = shrink_order(q); \ + } + /* disc nodes could eventually be smaller, because the indirect @@ -282,11 +313,17 @@ typedef enum { # define before 0 /* |subtype| for math node that introduces a formula */ # define after 1 /* |subtype| for math node that winds up a formula */ -# define math_node_size 4 -# define surround(a) vlink((a)+2) -/* also: glue_ptr(a) vinfo((a)+2) */ -# define synctex_tag_math(a) vinfo((a)+3) -# define synctex_line_math(a) vlink((a)+3) +# define math_node_size 7 +/* define width(a) vinfo((a)+2) */ +/* overlaps width */ +/* define shrink(a) vinfo((a)+3) */ +/* define stretch(a) vlink((a)+3) */ +/* define stretch_order(a) vinfo((a)+4) */ +/* define shrink_order(a) vlink((a)+4) */ +/* leader_ptr slot */ +# define surround(a) vinfo((a)+5) +# define synctex_tag_math(a) vinfo((a)+6) +# define synctex_line_math(a) vlink((a)+6) # define ins_node_size 6 # define float_cost(a) varmem[(a)+2].cint @@ -620,15 +657,13 @@ typedef enum { # define special_node_size 3 -# define dir_node_size 6 +# define dir_node_size 5 # define dir_dir(a) vinfo((a)+2) # define dir_level(a) vlink((a)+2) -# define dir_dvi_ptr(a) vinfo((a)+3) -# define dir_dvi_h(a) vlink((a)+3) /* obsolete */ -# define dir_refpos_h(a) vinfo((a)+4) -# define dir_refpos_v(a) vlink((a)+4) -# define dir_cur_h(a) vinfo((a)+5) -# define dir_cur_v(a) vlink((a)+5) +# define dir_refpos_h(a) vinfo((a)+3) +# define dir_refpos_v(a) vlink((a)+3) +# define dir_cur_h(a) vinfo((a)+4) +# define dir_cur_v(a) vlink((a)+4) # define write_node_size 3 # define close_node_size 3 @@ -910,10 +945,8 @@ typedef enum { # define is_running(A) ((A)==null_flag) /* tests for a running dimension */ extern halfword tail_of_list(halfword p); -extern void delete_glue_ref(halfword p); extern int var_used; -extern halfword temp_ptr; # define cache_disabled max_halfword diff --git a/Build/source/texk/web2c/luatexdir/tex/texnodes.w b/Build/source/texk/web2c/luatexdir/tex/texnodes.w index a201c6da714..77610988d95 100644 --- a/Build/source/texk/web2c/luatexdir/tex/texnodes.w +++ b/Build/source/texk/web2c/luatexdir/tex/texnodes.w @@ -89,10 +89,10 @@ const char *node_fields_disc[] = { "attr", "pre", "post", "replace", "penalty", NULL }; const char *node_fields_math[] = { - "attr", "surround", NULL + "attr", "surround", "width", "stretch", "shrink", "stretch_order", "shrink_order", NULL }; const char *node_fields_glue[] = { - "attr", "spec", "leader", NULL + "attr", "leader", "width", "stretch", "shrink", "stretch_order", "shrink_order", NULL }; const char *node_fields_kern[] = { "attr", "kern", "expansion_factor", NULL @@ -112,7 +112,8 @@ const char *node_fields_glyph[] = { "xoffset", "yoffset", "width", "height", "depth", "expansion_factor", NULL }; const char *node_fields_inserting[] = { - "height", "last_ins_ptr", "best_ins_ptr", NULL + "height", "last_ins_ptr", "best_ins_ptr", + "width", "stretch", "shrink", "stretch_order", "shrink_order", NULL }; const char *node_fields_splitup[] = { "height", "last_ins_ptr", "best_ins_ptr", "broken_ptr", "broken_ins", NULL @@ -121,8 +122,7 @@ const char *node_fields_attribute[] = { "number", "value", NULL }; const char *node_fields_glue_spec[] = { - "width", "stretch", "shrink", "stretch_order", "shrink_order", "ref_count", - "writable", NULL + "width", "stretch", "shrink", "stretch_order", "shrink_order", NULL }; const char *node_fields_attribute_list[] = { NULL @@ -132,7 +132,7 @@ const char *node_fields_local_par[] = { "box_right", "box_right_width", NULL }; const char *node_fields_dir[] = { - "attr", "dir", "level", "dvi_ptr", "dvi_h", NULL + "attr", "dir", "level", NULL }; const char *node_fields_boundary[] = { "attr", "value", NULL @@ -620,7 +620,6 @@ static int test_count = 1; } } while (0) #define check_action_ref(a) { dorangetest(p,a,var_mem_max); } -#define check_glue_ref(a) { dorangetest(p,a,var_mem_max); } #define check_attribute_ref(a) { dorangetest(p,a,var_mem_max); } #define check_token_ref(a) { confusion("fuzzy token cleanup in node"); } @@ -1078,7 +1077,6 @@ halfword copy_node(const halfword p) copy_sub_list(lig_ptr(r),lig_ptr(p)) ; break; case glue_node: - add_glue_ref(glue_ptr(p)); copy_sub_list(leader_ptr(r),leader_ptr(p)) ; break; case hlist_node: @@ -1116,12 +1114,8 @@ halfword copy_node(const halfword p) } break; case math_node: - if (glue_ptr(p) != zero_glue) { - add_glue_ref(glue_ptr(p)); - } break; case ins_node: - add_glue_ref(split_top_ptr(p)); copy_sub_list(ins_ptr(r),ins_ptr(p)) ; break; case margin_kern_node: @@ -1173,8 +1167,6 @@ halfword copy_node(const halfword p) copy_sub_node(right_delimiter(r),right_delimiter(p)) ; break; case glue_spec_node: - glue_ref_count(r) = null; - break; case dir_node: case local_par_node: case boundary_node: @@ -1320,7 +1312,6 @@ void flush_node(halfword p) free_sub_list(lig_ptr(p)); break; case glue_node: - delete_glue_ref(glue_ptr(p)); free_sub_list(leader_ptr(p)); break; case hlist_node: @@ -1337,24 +1328,14 @@ void flush_node(halfword p) case rule_node: case kern_node: case penalty_node: - break; case math_node: - /* begin mathskip code */ - if (glue_ptr(p) != zero_glue) { - delete_glue_ref(glue_ptr(p)); - } - /* end mathskip code */ break; case glue_spec_node: /* this allows free-ing of lua-allocated glue specs */ - if (valid_node(p)) { - if (glue_ref_count(p)!=null) { - decr(glue_ref_count(p)); - } else { - free_node(p, get_node_size(type(p), subtype(p))); - } - } - return ; +//if (valid_node(p)) { +// free_node(p, subtype(p)); +//} +// return ; break ; case dir_node: case local_par_node: @@ -1372,7 +1353,6 @@ void flush_node(halfword p) break; case ins_node: flush_node_list(ins_ptr(p)); - delete_glue_ref(split_top_ptr(p)); break; case margin_kern_node: flush_node(margin_char(p)); @@ -1579,7 +1559,6 @@ void check_node(halfword p) dorangetest(p, lig_ptr(p), var_mem_max); break; case glue_node: - check_glue_ref(glue_ptr(p)); dorangetest(p, leader_ptr(p), var_mem_max); break; case hlist_node: @@ -1590,7 +1569,6 @@ void check_node(halfword p) break; case ins_node: dorangetest(p, ins_ptr(p), var_mem_max); - check_glue_ref(split_top_ptr(p)); break; case whatsit_node: w = subtype(p) ; @@ -1606,11 +1584,6 @@ void check_node(halfword p) check_node(margin_char(p)); break; case math_node: - /* begin mathskip code */ - if (glue_ptr(p) != zero_glue) { - check_glue_ref(glue_ptr(p)); - } - /* end mathskip code */ break; case disc_node: dorangetest(p, vlink(pre_break(p)), var_mem_max); @@ -1804,7 +1777,6 @@ void init_node_mem(int t) node_size(rover) = (t - rover); var_used = 0; /* initialize static glue specs */ - glue_ref_count(zero_glue) = null + 1; width(zero_glue) = 0; type(zero_glue) = glue_spec_node; vlink(zero_glue) = null; @@ -1812,7 +1784,6 @@ void init_node_mem(int t) stretch_order(zero_glue) = normal; shrink(zero_glue) = 0; shrink_order(zero_glue) = normal; - glue_ref_count(sfi_glue) = null + 1; width(sfi_glue) = 0; type(sfi_glue) = glue_spec_node; vlink(sfi_glue) = null; @@ -1820,7 +1791,6 @@ void init_node_mem(int t) stretch_order(sfi_glue) = sfi; shrink(sfi_glue) = 0; shrink_order(sfi_glue) = normal; - glue_ref_count(fil_glue) = null + 1; width(fil_glue) = 0; type(fil_glue) = glue_spec_node; vlink(fil_glue) = null; @@ -1828,7 +1798,6 @@ void init_node_mem(int t) stretch_order(fil_glue) = fil; shrink(fil_glue) = 0; shrink_order(fil_glue) = normal; - glue_ref_count(fill_glue) = null + 1; width(fill_glue) = 0; type(fill_glue) = glue_spec_node; vlink(fill_glue) = null; @@ -1836,7 +1805,6 @@ void init_node_mem(int t) stretch_order(fill_glue) = fill; shrink(fill_glue) = 0; shrink_order(fill_glue) = normal; - glue_ref_count(ss_glue) = null + 1; width(ss_glue) = 0; type(ss_glue) = glue_spec_node; vlink(ss_glue) = null; @@ -1844,7 +1812,6 @@ void init_node_mem(int t) stretch_order(ss_glue) = fil; shrink(ss_glue) = unity; shrink_order(ss_glue) = fil; - glue_ref_count(fil_neg_glue) = null + 1; width(fil_neg_glue) = 0; type(fil_neg_glue) = glue_spec_node; vlink(fil_neg_glue) = null; @@ -2507,7 +2474,7 @@ void print_short_node_contents(halfword p) print_char('|'); break; case glue_node: - if (glue_ptr(p) != zero_glue) + if (! glue_is_zero(p)) print_char(' '); break; case math_node: @@ -3048,7 +3015,7 @@ void show_node_list(int p) normal_warning("nodes","weird glue leader subtype ignored"); } tprint("leaders "); - print_spec(glue_ptr(p), NULL); + print_spec(p, NULL); node_list_display(leader_ptr(p)); /* recursive call */ } else { tprint_esc("glue"); @@ -3070,9 +3037,9 @@ void show_node_list(int p) if (subtype(p) != cond_math_glue) { print_char(' '); if (subtype(p) < cond_math_glue) - print_spec(glue_ptr(p), NULL); + print_spec(p, NULL); else - print_spec(glue_ptr(p), "mu"); + print_spec(p, "mu"); } } break; @@ -3169,7 +3136,6 @@ void show_node_list(int p) @c pointer actual_box_width(pointer r, scaled base_width) { - pointer q; /* glue specification when calculating |pre_display_size| */ scaled d; /* increment to |v| */ scaled w = -max_dimen; /* calculated |size| */ scaled v = shift_amount(r) + base_width; /* |w| plus possible glue amount */ @@ -3194,7 +3160,7 @@ pointer actual_box_width(pointer r, scaled base_width) break; case math_node: /* begin mathskip code */ - if (glue_ptr(p) == zero_glue) { + if (glue_is_zero(p)) { d = surround(p); break; } else { @@ -3208,15 +3174,12 @@ pointer actual_box_width(pointer r, scaled base_width) |pre_display_size|, since \TeX82 is supposed to make the same decisions on all machines. */ - q = glue_ptr(p); - d = width(q); + d = width(p); if (glue_sign(r) == stretching) { - if ((glue_order(r) == stretch_order(q)) - && (stretch(q) != 0)) + if ((glue_order(r) == stretch_order(p)) && (stretch(p) != 0)) v = max_dimen; } else if (glue_sign(r) == shrinking) { - if ((glue_order(r) == shrink_order(q)) - && (shrink(q) != 0)) + if ((glue_order(r) == shrink_order(p)) && (shrink(p) != 0)) v = max_dimen; } if (subtype(p) >= a_leaders) @@ -3252,26 +3215,10 @@ halfword tail_of_list(halfword p) return q; } -@ |delete_glue_ref| is called when a pointer to a glue - specification is being withdrawn. -@c -void delete_glue_ref(halfword p) -{ /* |p| points to a glue specification */ - if (type(p) == glue_spec_node) { - if (glue_ref_count(p) == null) { - flush_node(p); - } else { - decr(glue_ref_count(p)); - } - } else { - normal_error("nodes","invalid glue spec node"); - } -} @ @c int var_used; -halfword temp_ptr; /* a pointer variable for occasional emergency use */ @ Attribute lists need two extra globals to increase processing efficiency. |max_used_attr| limits the test loop that checks for set attributes, and @@ -3585,10 +3532,8 @@ to be exactly one reference to the new specification. @c halfword new_spec(halfword p) -{ /* duplicates a glue specification */ - halfword q = copy_node(p); - glue_ref_count(q) = null; - return q; +{ + return copy_node(p == null ? zero_glue : p); } @ And here's a function that creates a glue node for a given parameter @@ -3601,8 +3546,11 @@ halfword new_param_glue(int n) { halfword p = new_node(glue_node, n + 1); halfword q = glue_par(n); - glue_ptr(p) = q; - incr(glue_ref_count(q)); + width(p) = width(q); + stretch(p) = stretch(q); + shrink(p) = shrink(q); + stretch_order(p) = stretch_order(q); + shrink_order(p) = shrink_order(q); return p; } @@ -3613,8 +3561,11 @@ whose argument points to a glue specification. halfword new_glue(halfword q) { halfword p = new_node(glue_node, normal); - glue_ptr(p) = q; - incr(glue_ref_count(q)); + width(p) = width(q); + stretch(p) = stretch(q); + shrink(p) = shrink(q); + stretch_order(p) = stretch_order(q); + shrink_order(p) = shrink_order(q); return p; } @@ -3622,17 +3573,22 @@ halfword new_glue(halfword q) of |new_param_glue| and |new_glue|. It creates a glue node for one of the current glue parameters, but it makes a fresh copy of the glue specification, since that specification will probably be subject to change, -while the parameter will stay put. The global variable |temp_ptr| is -set to the address of the new spec. +while the parameter will stay put. + +/* + The global variable |temp_ptr| is set to the address of the new spec. +*/ @c halfword new_skip_param(int n) { - halfword p; /* the new node */ - temp_ptr = new_spec(glue_par(n)); - p = new_glue(temp_ptr); - glue_ref_count(temp_ptr) = null; - subtype(p) = (quarterword) (n + 1); + halfword p = new_node(glue_node, n + 1); + halfword q = glue_par(n); + width(p) = width(q); + stretch(p) = stretch(q); + shrink(p) = shrink(q); + stretch_order(p) = stretch_order(q); + shrink_order(p) = shrink_order(q); return p; } |