summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/lua/lnodelib.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/lnodelib.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/lnodelib.c4679
1 files changed, 3008 insertions, 1671 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/lnodelib.c b/Build/source/texk/web2c/luatexdir/lua/lnodelib.c
index de269d5d9c8..0bbbc021987 100644
--- a/Build/source/texk/web2c/luatexdir/lua/lnodelib.c
+++ b/Build/source/texk/web2c/luatexdir/lua/lnodelib.c
@@ -1,10 +1,32 @@
-/* $Id: lnodelib.c 1056 2008-02-19 15:42:17Z taco $ */
+/* lnodelib.c
+
+ Copyright 2006-2008 Taco Hoekwater <taco@luatex.org>
+
+ This file is part of LuaTeX.
+
+ LuaTeX is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ LuaTeX is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with LuaTeX; if not, see <http://www.gnu.org/licenses/>. */
#include "luatex-api.h"
#include <ptexlib.h>
#include "nodes.h"
+#include "commands.h"
+
+static const char _svn_version[] =
+ "$Id: lnodelib.c 2027 2009-03-14 18:47:32Z oneiros $ $URL: http://scm.foundry.supelec.fr/svn/luatex/trunk/src/texk/web2c/luatexdir/lua/lnodelib.c $";
+
#define init_luaS_index(a) do { \
lua_pushliteral(L,#a); \
luaS_##a##_ptr = (char *)lua_tostring(L,-1); \
@@ -15,7 +37,7 @@
static int luaS_##a##_index = 0; \
static char * luaS_##a##_ptr = NULL
-#define luaS_index(a) luaS_##a##_index
+#define luaS_index(a) luaS_##a##_index
#define luaS_ptr_eq(a,b) (a==luaS_##b##_ptr)
@@ -23,75 +45,81 @@
make_luaS_index(luatex_node);
-halfword *check_isnode (lua_State *L, int ud) {
- register halfword *p = lua_touserdata(L, ud);
- if (p != NULL) {
- if (lua_getmetatable(L, ud)) {
- lua_rawgeti(L,LUA_REGISTRYINDEX,luaS_index(luatex_node));
- lua_gettable(L, LUA_REGISTRYINDEX);
- if (lua_rawequal(L, -1, -2)) {
- lua_pop(L, 2);
- return p;
- }
+halfword *check_isnode(lua_State * L, int ud)
+{
+ register halfword *p = lua_touserdata(L, ud);
+ if (p != NULL) {
+ if (lua_getmetatable(L, ud)) {
+ lua_rawgeti(L, LUA_REGISTRYINDEX, luaS_index(luatex_node));
+ lua_gettable(L, LUA_REGISTRYINDEX);
+ if (lua_rawequal(L, -1, -2)) {
+ lua_pop(L, 2);
+ return p;
+ }
+ }
}
- }
- luaL_typerror(L, ud, NODE_METATABLE);
- return NULL;
+ luaL_typerror(L, ud, NODE_METATABLE);
+ return NULL;
}
/* This routine finds the numerical value of a string (or number) at
lua stack index |n|. If it is not a valid node type, returns -1 */
-static
-int do_get_node_type_id (lua_State *L, int n, node_info *data) {
- register int j;
- if (lua_type(L,n)==LUA_TSTRING) {
- char *s = (char *)lua_tostring(L,n);
- for (j=0;data[j].id!=-1;j++) {
- if (strcmp(s,data[j].name)==0)
- return j;
- }
- } else if (lua_type(L,n)==LUA_TNUMBER) {
- register int i = lua_tointeger(L,n);
- if (data[i].id==i)
- return i;
- for (j=0;data[j].id!=-1;j++) {
- if (data[j].id==i)
- return j;
+static
+int do_get_node_type_id(lua_State * L, int n, node_info * data)
+{
+ register int j;
+ if (lua_type(L, n) == LUA_TSTRING) {
+ char *s = (char *) lua_tostring(L, n);
+ for (j = 0; data[j].id != -1; j++) {
+ if (strcmp(s, data[j].name) == 0)
+ return j;
+ }
+ } else if (lua_type(L, n) == LUA_TNUMBER) {
+ register int i = lua_tointeger(L, n);
+ for (j = 0; data[j].id != -1; j++) {
+ if (data[j].id == i)
+ return j;
+ }
}
- }
- return -1;
+ return -1;
}
#define get_node_type_id(L,n) do_get_node_type_id(L,n,node_data)
#define get_node_subtype_id(L,n) do_get_node_type_id(L,n,whatsit_node_data)
-static
-int get_valid_node_type_id (lua_State *L, int n) {
- int i = get_node_type_id(L,n);
- if (i==-1) {
- if (lua_type(L,n)==LUA_TSTRING) {
- lua_pushfstring(L, "Invalid node type id: %s",(char *)lua_tostring(L,n));
- } else {
- lua_pushfstring(L, "Invalid node type id: %d",(int)lua_tonumber(L,n));
+static
+int get_valid_node_type_id(lua_State * L, int n)
+{
+ int i = get_node_type_id(L, n);
+ if (i == -1) {
+ if (lua_type(L, n) == LUA_TSTRING) {
+ lua_pushfstring(L, "Invalid node type id: %s",
+ (char *) lua_tostring(L, n));
+ } else {
+ lua_pushfstring(L, "Invalid node type id: %d",
+ (int) lua_tonumber(L, n));
+ }
+ return lua_error(L);
}
- return lua_error(L);
- }
- return i;
+ return i;
}
-static
-int get_valid_node_subtype_id (lua_State *L, int n) {
- int i = get_node_subtype_id(L,n);
- if (i==-1) {
- if (lua_type(L,n)==LUA_TSTRING) {
- lua_pushfstring(L, "Invalid whatsit node id: %s",(char *)lua_tostring(L,n));
- } else {
- lua_pushfstring(L, "Invalid whatsit node id: %d",(int)lua_tonumber(L,n));
+static
+int get_valid_node_subtype_id(lua_State * L, int n)
+{
+ int i = get_node_subtype_id(L, n);
+ if (i == -1) {
+ if (lua_type(L, n) == LUA_TSTRING) {
+ lua_pushfstring(L, "Invalid whatsit node id: %s",
+ (char *) lua_tostring(L, n));
+ } else {
+ lua_pushfstring(L, "Invalid whatsit node id: %d",
+ (int) lua_tonumber(L, n));
+ }
+ return lua_error(L);
}
- return lua_error(L);
- }
- return i;
+ return i;
}
@@ -103,362 +131,454 @@ int get_valid_node_subtype_id (lua_State *L, int n) {
range. This test could be improved.
*/
-void
-lua_nodelib_push(lua_State *L) {
- halfword n;
- halfword *a;
- n = -1;
- if (lua_isnumber(L,-1)) {
- n = lua_tointeger(L,-1);
- }
- lua_pop(L,1);
- if ((n==null) || (n<0) || (n>var_mem_max)) {
- lua_pushnil(L);
- } else {
- a = lua_newuserdata(L, sizeof(halfword));
- *a = n;
- lua_rawgeti(L,LUA_REGISTRYINDEX,luaS_index(luatex_node));
- lua_gettable(L, LUA_REGISTRYINDEX);
- lua_setmetatable(L,-2);
- }
- return;
+void lua_nodelib_push(lua_State * L)
+{
+ halfword n;
+ halfword *a;
+ n = -1;
+ if (lua_isnumber(L, -1)) {
+ n = lua_tointeger(L, -1);
+ }
+ lua_pop(L, 1);
+ if ((n == null) || (n < 0) || (n > var_mem_max)) {
+ lua_pushnil(L);
+ } else {
+ a = lua_newuserdata(L, sizeof(halfword));
+ *a = n;
+ lua_rawgeti(L, LUA_REGISTRYINDEX, luaS_index(luatex_node));
+ lua_gettable(L, LUA_REGISTRYINDEX);
+ lua_setmetatable(L, -2);
+ }
+ return;
}
-void
-lua_nodelib_push_fast(lua_State *L, halfword n) {
- halfword *a;
- a = lua_newuserdata(L, sizeof(halfword));
- *a = n;
- lua_rawgeti(L,LUA_REGISTRYINDEX,luaS_index(luatex_node));
- lua_gettable(L, LUA_REGISTRYINDEX);
- lua_setmetatable(L,-2);
- return;
+void lua_nodelib_push_fast(lua_State * L, halfword n)
+{
+ halfword *a;
+ a = lua_newuserdata(L, sizeof(halfword));
+ *a = n;
+ lua_rawgeti(L, LUA_REGISTRYINDEX, luaS_index(luatex_node));
+ lua_gettable(L, LUA_REGISTRYINDEX);
+ lua_setmetatable(L, -2);
+ return;
}
/* converts type strings to type ids */
-static int
-lua_nodelib_id (lua_State *L) {
- integer i = get_node_type_id(L,1);
- if (i>=0) {
- lua_pushnumber(L,i);
- } else {
- lua_pushnil(L);
- }
- return 1;
+static int lua_nodelib_id(lua_State * L)
+{
+ integer i = get_node_type_id(L, 1);
+ if (i >= 0) {
+ lua_pushnumber(L, i);
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
}
-static int
-lua_nodelib_subtype (lua_State *L) {
- integer i = get_node_subtype_id(L,1);
- if (i>=0) {
- lua_pushnumber(L,i);
- } else {
- lua_pushnil(L);
- }
- return 1;
+static int lua_nodelib_subtype(lua_State * L)
+{
+ integer i = get_node_subtype_id(L, 1);
+ if (i >= 0) {
+ lua_pushnumber(L, i);
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
}
/* converts id numbers to type names */
-static int
-lua_nodelib_type (lua_State *L) {
- integer i = get_node_type_id(L,1);
- if (i>=0) {
- lua_pushstring(L,node_data[i].name);
- } else {
- lua_pushnil(L);
- }
- return 1;
+static int lua_nodelib_type(lua_State * L)
+{
+ integer i = get_node_type_id(L, 1);
+ if (i >= 0) {
+ lua_pushstring(L, node_data[i].name);
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
}
/* allocate a new node */
-static int
-lua_nodelib_new(lua_State *L) {
- int i,j;
- halfword n = null;
- i = get_valid_node_type_id(L,1);
-
- if (i==whatsit_node) {
- j = -1;
- if (lua_gettop(L)>1) { j = get_valid_node_subtype_id(L,2); }
- if (j<0) {
- lua_pushstring(L, "Creating a whatsit requires the subtype number as a second argument");
- lua_error(L);
- }
- } else {
- j = 0;
- if (lua_gettop(L)>1) { j = lua_tointeger(L,2); }
- }
- n = new_node(i,j);
- lua_nodelib_push_fast(L,n);
- return 1;
+static int lua_nodelib_new(lua_State * L)
+{
+ int i, j;
+ halfword n = null;
+ i = get_valid_node_type_id(L, 1);
+
+ if (i == whatsit_node) {
+ j = -1;
+ if (lua_gettop(L) > 1) {
+ j = get_valid_node_subtype_id(L, 2);
+ }
+ if (j < 0) {
+ lua_pushstring(L,
+ "Creating a whatsit requires the subtype number as a second argument");
+ lua_error(L);
+ }
+ } else {
+ j = 0;
+ if (lua_gettop(L) > 1) {
+ j = lua_tointeger(L, 2);
+ }
+ }
+ n = new_node(i, j);
+ lua_nodelib_push_fast(L, n);
+ return 1;
}
/* Free a node.
This function returns the 'next' node, because that may be helpful */
-static int
-lua_nodelib_free(lua_State *L) {
- halfword *n;
- halfword p;
- if (lua_gettop(L)<1) {
- lua_pushnil(L);
+static int lua_nodelib_free(lua_State * L)
+{
+ halfword *n;
+ halfword p;
+ if (lua_gettop(L) < 1) {
+ lua_pushnil(L);
+ return 1;
+ } else if (lua_isnil(L, 1)) {
+ return 1; /* the nil itself */
+ }
+ n = check_isnode(L, 1);
+ p = vlink(*n);
+ flush_node(*n);
+ lua_pushnumber(L, p);
+ lua_nodelib_push(L);
return 1;
- } else if(lua_isnil(L,1)) {
- return 1; /* the nil itself */
- }
- n = check_isnode(L,1);
- p = vlink(*n);
- flush_node(*n);
- lua_pushnumber(L,p);
- lua_nodelib_push(L);
- return 1;
}
/* Free a node list */
-static int
-lua_nodelib_flush_list(lua_State *L) {
- halfword *n_ptr;
- if ((lua_gettop(L)<1) || lua_isnil(L,1))
+static int lua_nodelib_flush_list(lua_State * L)
+{
+ halfword *n_ptr;
+ if ((lua_gettop(L) < 1) || lua_isnil(L, 1))
+ return 0;
+ n_ptr = check_isnode(L, 1);
+ flush_node_list(*n_ptr);
return 0;
- n_ptr = check_isnode(L,1);
- flush_node_list(*n_ptr);
- return 0;
}
/* find prev, and fix backlinks */
-#define set_t_to_prev(head,current) \
- t = head; \
- while (vlink(t)!=current && t != null) { \
- if (vlink(t)!=null) \
- alink(vlink(t)) = t; \
- t = vlink(t); \
+#define set_t_to_prev(head,current) \
+ t = head; \
+ while (vlink(t)!=current && t != null) { \
+ if (vlink(t)!=null) \
+ alink(vlink(t)) = t; \
+ t = vlink(t); \
}
/* remove a node from a list */
-static int
-lua_nodelib_remove (lua_State *L) {
- halfword head, current, t;
- if (lua_gettop(L)<2) {
- lua_pushstring(L,"Not enough arguments for node.remove()");
- lua_error(L);
- }
- head = *(check_isnode(L,1));
- if (lua_isnil(L,2)) {
- return 2; /* the arguments, as they are */
- }
- current = *(check_isnode(L,2));
-
- if (head == current) {
- if (alink(head)!=null && vlink(current)!=null) {
- alink(vlink(current)) = alink(head);
- }
- head = vlink(current);
- current = head;
- } else { /* head != current */
- t = alink(current);
- if (t==null || vlink(t)!=current) {
- set_t_to_prev(head,current);
- if (t==null) { /* error! */
- lua_pushstring(L,"Attempt to node.remove() a non-existing node");
- lua_error(L);
- }
- }
- /* t is now the previous node */
- vlink(t) = vlink(current);
- if (vlink(current)!=null) {
- alink(vlink(current)) = t;
- }
- current = vlink(current);
- }
- lua_pushnumber(L,head);
- lua_nodelib_push(L);
- lua_pushnumber(L,current);
- lua_nodelib_push(L);
- return 2;
+static int lua_nodelib_remove(lua_State * L)
+{
+ halfword head, current, t;
+ if (lua_gettop(L) < 2) {
+ lua_pushstring(L, "Not enough arguments for node.remove()");
+ lua_error(L);
+ }
+ head = *(check_isnode(L, 1));
+ if (lua_isnil(L, 2)) {
+ return 2; /* the arguments, as they are */
+ }
+ current = *(check_isnode(L, 2));
+
+ if (head == current) {
+ if (alink(head) != null && vlink(current) != null) {
+ alink(vlink(current)) = alink(head);
+ }
+ head = vlink(current);
+ current = head;
+ } else { /* head != current */
+ t = alink(current);
+ if (t == null || vlink(t) != current) {
+ set_t_to_prev(head, current);
+ if (t == null) { /* error! */
+ lua_pushstring(L,
+ "Attempt to node.remove() a non-existing node");
+ lua_error(L);
+ }
+ }
+ /* t is now the previous node */
+ vlink(t) = vlink(current);
+ if (vlink(current) != null) {
+ alink(vlink(current)) = t;
+ }
+ current = vlink(current);
+ }
+ lua_pushnumber(L, head);
+ lua_nodelib_push(L);
+ lua_pushnumber(L, current);
+ lua_nodelib_push(L);
+ return 2;
}
/* Insert a node in a list */
-static int
-lua_nodelib_insert_before (lua_State *L) {
- halfword head, current, n, t;
- if (lua_gettop(L)<3) {
- lua_pushstring(L,"Not enough arguments for node.insert_before()");
- lua_error(L);
- }
- if (lua_isnil(L,3)) {
- lua_pop(L,1);
- return 2;
- } else {
- n = *(check_isnode(L,3));
- }
- if (lua_isnil(L,1)) { /* no head */
- vlink(n) = null;
- alink(n) = null;
- lua_nodelib_push_fast(L,n);
- lua_pushvalue(L,-1);
- return 2;
- } else {
- head = *(check_isnode(L,1));
- }
- if (lua_isnil(L,2)) {
- current = tail_of_list(head);
- } else {
- current = *(check_isnode(L,2));
- }
- t = alink(current);
- if (t==null || vlink(t)!=current) {
- set_t_to_prev(head,current);
- if (t==null) { /* error! */
- lua_pushstring(L,"Attempt to node.insert_before() a non-existing node");
- lua_error(L);
+static int lua_nodelib_insert_before(lua_State * L)
+{
+ halfword head, current, n, t;
+ if (lua_gettop(L) < 3) {
+ lua_pushstring(L, "Not enough arguments for node.insert_before()");
+ lua_error(L);
}
- }
- couple_nodes(t,n);
- couple_nodes(n,current);
- if (head==current) {
- lua_nodelib_push_fast(L,n);
- } else {
- lua_nodelib_push_fast(L,head);
- }
- lua_nodelib_push_fast(L,n);
- return 2;
+ if (lua_isnil(L, 3)) {
+ lua_pop(L, 1);
+ return 2;
+ } else {
+ n = *(check_isnode(L, 3));
+ }
+ if (lua_isnil(L, 1)) { /* no head */
+ vlink(n) = null;
+ alink(n) = null;
+ lua_nodelib_push_fast(L, n);
+ lua_pushvalue(L, -1);
+ return 2;
+ } else {
+ head = *(check_isnode(L, 1));
+ }
+ if (lua_isnil(L, 2)) {
+ current = tail_of_list(head);
+ } else {
+ current = *(check_isnode(L, 2));
+ }
+ if (head != current) {
+ t = alink(current);
+ if (t == null || vlink(t) != current) {
+ set_t_to_prev(head, current);
+ if (t == null) { /* error! */
+ lua_pushstring(L,
+ "Attempt to node.insert_before() a non-existing node");
+ lua_error(L);
+ }
+ }
+ couple_nodes(t, n);
+ }
+ couple_nodes(n, current);
+ if (head == current) {
+ lua_nodelib_push_fast(L, n);
+ } else {
+ lua_nodelib_push_fast(L, head);
+ }
+ lua_nodelib_push_fast(L, n);
+ return 2;
}
-static int
-lua_nodelib_insert_after (lua_State *L) {
- halfword head, current, n;
- if (lua_gettop(L)<3) {
- lua_pushstring(L,"Not enough arguments for node.insert_after()");
- lua_error(L);
- }
- if (lua_isnil(L,3)) {
- lua_pop(L,1);
- return 2;
- } else {
- n = *(check_isnode(L,3));
- }
- if (lua_isnil(L,1)) { /* no head */
- vlink(n) = null;
- alink(n) = null;
- lua_nodelib_push_fast(L,n);
- lua_pushvalue(L,-1);
- return 2;
- } else {
- head = *(check_isnode(L,1));
- }
- if (lua_isnil(L,2)) {
- current = head;
- while (vlink(current)!=null)
- current = vlink(current);
- } else {
- current = *(check_isnode(L,2));
- }
- try_couple_nodes(n,vlink(current));
- couple_nodes(current, n);
+static int lua_nodelib_insert_after(lua_State * L)
+{
+ halfword head, current, n;
+ if (lua_gettop(L) < 3) {
+ lua_pushstring(L, "Not enough arguments for node.insert_after()");
+ lua_error(L);
+ }
+ if (lua_isnil(L, 3)) {
+ lua_pop(L, 1);
+ return 2;
+ } else {
+ n = *(check_isnode(L, 3));
+ }
+ if (lua_isnil(L, 1)) { /* no head */
+ vlink(n) = null;
+ alink(n) = null;
+ lua_nodelib_push_fast(L, n);
+ lua_pushvalue(L, -1);
+ return 2;
+ } else {
+ head = *(check_isnode(L, 1));
+ }
+ if (lua_isnil(L, 2)) {
+ current = head;
+ while (vlink(current) != null)
+ current = vlink(current);
+ } else {
+ current = *(check_isnode(L, 2));
+ }
+ try_couple_nodes(n, vlink(current));
+ couple_nodes(current, n);
- lua_pop(L,2);
- lua_nodelib_push_fast(L,n);
- return 2;
+ lua_pop(L, 2);
+ lua_nodelib_push_fast(L, n);
+ return 2;
}
/* Copy a node list */
-static int
-lua_nodelib_copy_list (lua_State *L) {
- halfword *n;
- halfword m;
- if (lua_isnil(L,1))
- return 1; /* the nil itself */
- n = check_isnode(L,1);
- m = copy_node_list(*n);
- lua_nodelib_push_fast(L,m);
- return 1;
+static int lua_nodelib_copy_list(lua_State * L)
+{
+ halfword *n;
+ halfword m;
+ if (lua_isnil(L, 1))
+ return 1; /* the nil itself */
+ n = check_isnode(L, 1);
+ m = copy_node_list(*n);
+ lua_nodelib_push_fast(L, m);
+ return 1;
}
/* (Deep) copy a node */
-static int
-lua_nodelib_copy(lua_State *L) {
- halfword *n;
- halfword m;
- if (lua_isnil(L,1))
- return 1; /* the nil itself */
- n = check_isnode(L,1);
- m = copy_node(*n);
- lua_nodelib_push_fast(L,m);
- return 1;
+static int lua_nodelib_copy(lua_State * L)
+{
+ halfword *n;
+ halfword m;
+ if (lua_isnil(L, 1))
+ return 1; /* the nil itself */
+ n = check_isnode(L, 1);
+ m = copy_node(*n);
+ lua_nodelib_push_fast(L, m);
+ return 1;
}
/* output (write) a node to tex's processor */
-static int
-lua_nodelib_append(lua_State *L) {
- halfword *n;
- halfword m;
- int i, j;
- j = lua_gettop(L);
- for (i=1;i<=j;i++) {
- n = check_isnode(L,i);
- m = copy_node_list(*n);
- new_tail_append(m);
- while (vlink(m)!= null) {
- m = vlink(m);
- new_tail_append(m);
- }
- }
- return 0;
+static int lua_nodelib_append(lua_State * L)
+{
+ halfword *n;
+ halfword m;
+ int i, j;
+ j = lua_gettop(L);
+ for (i = 1; i <= j; i++) {
+ n = check_isnode(L, i);
+ m = copy_node_list(*n);
+ new_tail_append(m);
+ while (vlink(m) != null) {
+ m = vlink(m);
+ new_tail_append(m);
+ }
+ }
+ return 0;
}
-static int
-lua_nodelib_last_node(lua_State *L) {
- halfword m;
- m = pop_tail();
- lua_pushnumber(L,m);
- lua_nodelib_push(L);
- return 1;
+static int lua_nodelib_last_node(lua_State * L)
+{
+ halfword m;
+ m = pop_tail();
+ lua_pushnumber(L, m);
+ lua_nodelib_push(L);
+ return 1;
}
/* build a hbox */
-static int
-lua_nodelib_hpack(lua_State *L) {
- halfword n, p;
- char *s;
- integer w = 0;
- int m = 1;
- n = *(check_isnode(L,1));
- if (lua_gettop(L)>1) {
- w = lua_tointeger(L,2);
- if (lua_gettop(L)>2 && lua_type(L,3)==LUA_TSTRING) {
- s = (char *)lua_tostring(L,3);
- if (strcmp(s,"additional")==0) {
- m = 1;
- } else {
- m = lua_tonumber(L,3);
- }
+static int lua_nodelib_hpack(lua_State * L)
+{
+ halfword n, p;
+ char *s;
+ integer w = 0;
+ int m = 1;
+ n = *(check_isnode(L, 1));
+ if (lua_gettop(L) > 1) {
+ w = lua_tointeger(L, 2);
+ if (lua_gettop(L) > 2) {
+ if (lua_type(L, 3) == LUA_TSTRING) {
+ s = (char *) lua_tostring(L, 3);
+ if (strcmp(s, "additional") == 0)
+ m = 1;
+ else if (strcmp(s, "exactly") == 0)
+ m = 0;
+ else {
+ lua_pushstring(L,
+ "3rd argument should be either additional or exactly");
+ lua_error(L);
+ }
+ }
+
+ else if (lua_type(L, 3) == LUA_TNUMBER) {
+ m = lua_tonumber(L, 3);
+ } else {
+ lua_pushstring(L, "incorrect 3rd argument");
+ }
+ }
}
- }
- p = hpack(n,w,m);
- lua_nodelib_push_fast(L,p);
- return 1;
+ p = hpack(n, w, m);
+ lua_nodelib_push_fast(L, p);
+ return 1;
+}
+
+
+/* build a vbox */
+static int lua_nodelib_vpack(lua_State * L)
+{
+ halfword n, p;
+ char *s;
+ integer w = 0;
+ int m = 1;
+ n = *(check_isnode(L, 1));
+ if (lua_gettop(L) > 1) {
+ w = lua_tointeger(L, 2);
+ if (lua_gettop(L) > 2) {
+ if (lua_type(L, 3) == LUA_TSTRING) {
+ s = (char *) lua_tostring(L, 3);
+ if (strcmp(s, "additional") == 0)
+ m = 1;
+ else if (strcmp(s, "exactly") == 0)
+ m = 0;
+ else {
+ lua_pushstring(L,
+ "3rd argument should be either additional or exactly");
+ lua_error(L);
+ }
+ }
+
+ else if (lua_type(L, 3) == LUA_TNUMBER) {
+ m = lua_tonumber(L, 3);
+ } else {
+ lua_pushstring(L, "incorrect 3rd argument");
+ }
+ }
+ }
+ p = vpackage(n, w, m, max_dimen);
+ lua_nodelib_push_fast(L, p);
+ return 1;
+}
+
+
+/* create a hlist from a formula */
+
+static int lua_nodelib_mlist_to_hlist(lua_State * L)
+{
+ halfword n;
+ int w;
+ boolean m;
+ n = *(check_isnode(L, 1));
+ w = luaL_checkoption(L, 2, "text", math_style_names);
+ luaL_checkany(L, 3);
+ m = lua_toboolean(L, 3);
+ cur_mlist = n;
+ cur_style = w;
+ mlist_penalties = m;
+ mlist_to_hlist();
+ lua_nodelib_push_fast(L, vlink(temp_head));
+ return 1;
}
+static int lua_nodelib_mfont(lua_State * L)
+{
+ int f, s;
+ f = luaL_checkinteger(L, 1);
+ if (lua_gettop(L) == 2)
+ s = lua_tointeger(L, 2); /* this should be a multiple of 256 ! */
+ else
+ s = 0;
+ lua_pushnumber(L, fam_fnt(f, s));
+ return 1;
+}
+
+
+
/* This function is similar to |get_node_type_id|, for field
identifiers. It has to do some more work, because not all
identifiers are valid for all types of nodes.
@@ -486,338 +606,363 @@ make_luaS_index(xoffset);
make_luaS_index(yoffset);
-void initialize_luaS_indexes(lua_State *L) {
- init_luaS_index(id);
- init_luaS_index(next);
- init_luaS_index(char);
- init_luaS_index(font);
- init_luaS_index(attr);
- init_luaS_index(prev);
- init_luaS_index(lang);
- init_luaS_index(subtype);
- init_luaS_index(left);
- init_luaS_index(right);
- init_luaS_index(uchyph);
- init_luaS_index(components);
- init_luaS_index(xoffset);
- init_luaS_index(yoffset);
+void initialize_luaS_indexes(lua_State * L)
+{
+ init_luaS_index(id);
+ init_luaS_index(next);
+ init_luaS_index(char);
+ init_luaS_index(font);
+ init_luaS_index(attr);
+ init_luaS_index(prev);
+ init_luaS_index(lang);
+ init_luaS_index(subtype);
+ init_luaS_index(left);
+ init_luaS_index(right);
+ init_luaS_index(uchyph);
+ init_luaS_index(components);
+ init_luaS_index(xoffset);
+ init_luaS_index(yoffset);
}
-static int
-get_node_field_id (lua_State *L, int n, int node ) {
- register int t = type(node);
- register char *s = (char *)lua_tostring(L,n);
- if (luaS_ptr_eq(s,next)) { return 0; }
- else if (luaS_ptr_eq(s,id)) { return 1; }
- else if (luaS_ptr_eq(s,attr) &&
- nodetype_has_attributes(t)) { return 3 ; }
- else if (t==glyph_node) {
- if (luaS_ptr_eq(s,subtype)) { return 2; }
- else if (luaS_ptr_eq(s,font)) { return 5; }
- else if (luaS_ptr_eq(s,char)) { return 4; }
- else if (luaS_ptr_eq(s,prev)) { return -1; }
- else if (luaS_ptr_eq(s,lang)) { return 6; }
- else if (luaS_ptr_eq(s,left)) { return 7; }
- else if (luaS_ptr_eq(s,right)) { return 8; }
- else if (luaS_ptr_eq(s,uchyph)) { return 9; }
- else if (luaS_ptr_eq(s,components)) { return 10; }
- else if (luaS_ptr_eq(s,xoffset)) { return 11; }
- else if (luaS_ptr_eq(s,yoffset)) { return 12; }
- }
- else if (luaS_ptr_eq(s,prev)) { return -1; }
- else if (luaS_ptr_eq(s,subtype)) { return 2; }
- else {
- int j;
- char **fields = node_data[t].fields;
- if (t==whatsit_node)
- fields = whatsit_node_data[subtype(node)].fields;
- for (j=0;fields[j]!=NULL;j++) {
- if (strcmp(s,fields[j])==0) {
- return j+3;
- }
- }
- }
- return -2;
+static int get_node_field_id(lua_State * L, int n, int node)
+{
+ register int t = type(node);
+ register char *s = (char *) lua_tostring(L, n);
+ if (luaS_ptr_eq(s, next)) {
+ return 0;
+ } else if (luaS_ptr_eq(s, id)) {
+ return 1;
+ } else if (luaS_ptr_eq(s, attr) && nodetype_has_attributes(t)) {
+ return 3;
+ } else if (t == glyph_node) {
+ if (luaS_ptr_eq(s, subtype)) {
+ return 2;
+ } else if (luaS_ptr_eq(s, font)) {
+ return 5;
+ } else if (luaS_ptr_eq(s, char)) {
+ return 4;
+ } else if (luaS_ptr_eq(s, prev)) {
+ return -1;
+ } else if (luaS_ptr_eq(s, lang)) {
+ return 6;
+ } else if (luaS_ptr_eq(s, left)) {
+ return 7;
+ } else if (luaS_ptr_eq(s, right)) {
+ return 8;
+ } else if (luaS_ptr_eq(s, uchyph)) {
+ return 9;
+ } else if (luaS_ptr_eq(s, components)) {
+ return 10;
+ } else if (luaS_ptr_eq(s, xoffset)) {
+ return 11;
+ } else if (luaS_ptr_eq(s, yoffset)) {
+ return 12;
+ }
+ } else if (luaS_ptr_eq(s, prev)) {
+ return -1;
+ } else if (luaS_ptr_eq(s, subtype)) {
+ return 2;
+ } else {
+ int j;
+ char **fields = node_data[t].fields;
+ if (t == whatsit_node)
+ fields = whatsit_node_data[subtype(node)].fields;
+ for (j = 0; fields[j] != NULL; j++) {
+ if (strcmp(s, fields[j]) == 0) {
+ return j + 3;
+ }
+ }
+ }
+ return -2;
}
-static int
-get_valid_node_field_id (lua_State *L, int n, int node ) {
- int i = get_node_field_id(L,n,node);
- if (i==-2) {
- char *s = (char *)lua_tostring(L,n);
- lua_pushfstring(L, "Invalid field id %s for node type %s (%d)" , s, node_data[type(node)].name,subtype(node));
- lua_error(L);
- }
- return i;
+static int get_valid_node_field_id(lua_State * L, int n, int node)
+{
+ int i = get_node_field_id(L, n, node);
+ if (i == -2) {
+ char *s = (char *) lua_tostring(L, n);
+ lua_pushfstring(L, "Invalid field id %s for node type %s (%d)", s,
+ node_data[type(node)].name, subtype(node));
+ lua_error(L);
+ }
+ return i;
}
-static int
-lua_nodelib_has_field (lua_State *L) {
- int i= -2;
- if (!lua_isnil(L,1)) {
- i = get_node_field_id(L,2,*(check_isnode(L,1)));
- }
- lua_pushboolean(L,(i!=-2));
- return 1;
+static int lua_nodelib_has_field(lua_State * L)
+{
+ int i = -2;
+ if (!lua_isnil(L, 1)) {
+ i = get_node_field_id(L, 2, *(check_isnode(L, 1)));
+ }
+ lua_pushboolean(L, (i != -2));
+ return 1;
}
/* fetch the list of valid node types */
-static int
-do_lua_nodelib_types (lua_State *L, node_info *data) {
- int i;
- lua_newtable(L);
- for (i=0;data[i].id!=-1;i++) {
- lua_pushstring(L,data[i].name);
- lua_rawseti(L,-2,data[i].id);
- }
- return 1;
+static int do_lua_nodelib_types(lua_State * L, node_info * data)
+{
+ int i;
+ lua_newtable(L);
+ for (i = 0; data[i].id != -1; i++) {
+ lua_pushstring(L, data[i].name);
+ lua_rawseti(L, -2, data[i].id);
+ }
+ return 1;
}
-static int
-lua_nodelib_types (lua_State *L) {
- return do_lua_nodelib_types (L, node_data);
+static int lua_nodelib_types(lua_State * L)
+{
+ return do_lua_nodelib_types(L, node_data);
}
-static int
-lua_nodelib_whatsits (lua_State *L) {
- return do_lua_nodelib_types (L, whatsit_node_data);
+static int lua_nodelib_whatsits(lua_State * L)
+{
+ return do_lua_nodelib_types(L, whatsit_node_data);
}
/* fetch the list of valid fields */
-static int
-lua_nodelib_fields (lua_State *L) {
- int i = -1;
- char ** fields;
- int t = get_valid_node_type_id(L,1);
- if (t==whatsit_node ) {
- t = get_valid_node_subtype_id(L,2);
- fields = whatsit_node_data[t].fields;
- } else {
- fields = node_data[t].fields;
- }
- lua_checkstack(L,2);
- lua_newtable(L);
- lua_pushstring(L,"next");
- lua_rawseti(L,-2,0);
- lua_pushstring(L,"id");
- lua_rawseti(L,-2,1);
- lua_pushstring(L,"subtype");
- lua_rawseti(L,-2,2);
- if (fields!=NULL) {
- lua_pushstring(L,"prev");
- lua_rawseti(L,-2,-1);
- for (i=0;fields[i]!=NULL;i++) {
- lua_pushstring(L,fields[i]);
- lua_rawseti(L,-2,(i+3));
+static int lua_nodelib_fields(lua_State * L)
+{
+ int i = -1;
+ char **fields;
+ int t = get_valid_node_type_id(L, 1);
+ if (t == whatsit_node) {
+ t = get_valid_node_subtype_id(L, 2);
+ fields = whatsit_node_data[t].fields;
+ } else {
+ fields = node_data[t].fields;
}
- }
- return 1;
+ lua_checkstack(L, 2);
+ lua_newtable(L);
+ lua_pushstring(L, "next");
+ lua_rawseti(L, -2, 0);
+ lua_pushstring(L, "id");
+ lua_rawseti(L, -2, 1);
+ lua_pushstring(L, "subtype");
+ lua_rawseti(L, -2, 2);
+ if (fields != NULL) {
+ lua_pushstring(L, "prev");
+ lua_rawseti(L, -2, -1);
+ for (i = 0; fields[i] != NULL; i++) {
+ lua_pushstring(L, fields[i]);
+ lua_rawseti(L, -2, (i + 3));
+ }
+ }
+ return 1;
}
/* find the end of a list */
-static int
-lua_nodelib_tail (lua_State *L) {
- halfword *n;
- halfword t;
- if (lua_isnil(L,1))
- return 1; /* the nil itself */
- n = check_isnode(L,1);
- t=*n;
- if (t==null)
- return 1; /* the old userdata */
- alink(t) = null;
- while (vlink(t)!=null) {
- alink(vlink(t)) = t;
- t = vlink(t);
- }
- lua_nodelib_push_fast(L,t);
- return 1;
+static int lua_nodelib_tail(lua_State * L)
+{
+ halfword *n;
+ halfword t;
+ if (lua_isnil(L, 1))
+ return 1; /* the nil itself */
+ n = check_isnode(L, 1);
+ t = *n;
+ if (t == null)
+ return 1; /* the old userdata */
+ alink(t) = null;
+ while (vlink(t) != null) {
+ alink(vlink(t)) = t;
+ t = vlink(t);
+ }
+ lua_nodelib_push_fast(L, t);
+ return 1;
}
/* a few utility functions for attribute stuff */
-static int
-lua_nodelib_has_attribute (lua_State *L) {
- halfword *n;
- int i, val ;
- if (lua_isnil(L,1))
- return 1; /* the nil itself */
- n = check_isnode(L,1);
- i = lua_tointeger(L,2);
- val = luaL_optinteger(L,3,-1);
- if((val = has_attribute(*n,i,val))>=0) {
- lua_pushnumber(L,val);
- } else {
+static int lua_nodelib_has_attribute(lua_State * L)
+{
+ halfword *n;
+ int i, val;
+ n = check_isnode(L, 1);
+ if (n != NULL) {
+ i = lua_tointeger(L, 2);
+ val = luaL_optinteger(L, 3, -1);
+ if ((val = has_attribute(*n, i, val)) >= 0) {
+ lua_pushnumber(L, val);
+ return 1;
+ }
+ }
lua_pushnil(L);
- }
- return 1;
+ return 1;
}
-static int
-lua_nodelib_set_attribute (lua_State *L) {
- halfword *n;
- int i, val;
- if (lua_gettop(L)==3) {
- i = lua_tointeger(L,2);
- val = lua_tointeger(L,3);
- n = check_isnode(L,1);
- if (val<0) {
- (void)unset_attribute(*n,i,val);
+static int lua_nodelib_set_attribute(lua_State * L)
+{
+ halfword *n;
+ int i, val;
+ if (lua_gettop(L) == 3) {
+ i = lua_tointeger(L, 2);
+ val = lua_tointeger(L, 3);
+ n = check_isnode(L, 1);
+ if (val < 0) {
+ (void) unset_attribute(*n, i, val);
+ } else {
+ set_attribute(*n, i, val);
+ }
} else {
- set_attribute(*n,i,val);
+ lua_pushstring(L, "incorrect number of arguments");
+ lua_error(L);
}
- } else {
- lua_pushstring(L,"incorrect number of arguments");
- lua_error(L);
- }
- return 0;
+ return 0;
}
-static int
-lua_nodelib_unset_attribute (lua_State *L) {
- halfword *n;
- int i, val, ret;
- if (lua_gettop(L)<=3) {
- i = luaL_checknumber(L,2);
- val = luaL_optnumber(L,3,-1);
- n = check_isnode(L,1);
- ret = unset_attribute(*n,i,val);
- if(ret>=0) {
- lua_pushnumber(L,ret);
+static int lua_nodelib_unset_attribute(lua_State * L)
+{
+ halfword *n;
+ int i, val, ret;
+ if (lua_gettop(L) <= 3) {
+ i = luaL_checknumber(L, 2);
+ val = luaL_optnumber(L, 3, -1);
+ n = check_isnode(L, 1);
+ ret = unset_attribute(*n, i, val);
+ if (ret >= 0) {
+ lua_pushnumber(L, ret);
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
} else {
- lua_pushnil(L);
+ lua_pushstring(L, "incorrect number of arguments");
+ return lua_error(L);
}
- return 1;
- } else {
- lua_pushstring(L,"incorrect number of arguments");
- return lua_error(L);
- }
}
/* iteration */
-static int nodelib_aux_nil (lua_State *L) {
- lua_pushnil(L);
- return 1;
+static int nodelib_aux_nil(lua_State * L)
+{
+ lua_pushnil(L);
+ return 1;
}
-static int
-nodelib_aux_next_filtered (lua_State *L) {
- register halfword t; /* traverser */
- register int i = lua_tointeger(L,lua_upvalueindex(1));
- if (lua_isnil(L,2)) { /* first call */
- t = *check_isnode(L,1);
- } else {
- t = *check_isnode(L,2);
- t = vlink(t);
- }
- while (t!=null && type(t)!=i) { t = vlink(t); }
- if (t==null) {
- lua_pushnil(L);
- } else {
- lua_nodelib_push_fast(L,t);
- }
- return 1;
+static int nodelib_aux_next_filtered(lua_State * L)
+{
+ register halfword t; /* traverser */
+ register int i = lua_tointeger(L, lua_upvalueindex(1));
+ if (lua_isnil(L, 2)) { /* first call */
+ t = *check_isnode(L, 1);
+ } else {
+ t = *check_isnode(L, 2);
+ t = vlink(t);
+ }
+ while (t != null && type(t) != i) {
+ t = vlink(t);
+ }
+ if (t == null) {
+ lua_pushnil(L);
+ } else {
+ lua_nodelib_push_fast(L, t);
+ }
+ return 1;
}
-static int
-lua_nodelib_traverse_filtered (lua_State *L) {
- halfword n;
- if (lua_isnil(L,2)) {
- lua_pushcclosure(L, nodelib_aux_nil, 0);
- return 1;
- }
- n = *(check_isnode(L,2));
- lua_pop(L,1); /* the node, integer remains */
- lua_pushcclosure(L, nodelib_aux_next_filtered, 1);
- lua_nodelib_push_fast(L,n);
- lua_pushnil(L);
- return 3;
-}
-
-static int
-nodelib_aux_next (lua_State *L) {
- register halfword t; /* traverser */
- if (lua_isnil(L,2)) { /* first call */
- t = *check_isnode(L,1);
- } else {
- t = *check_isnode(L,2);
- t = vlink(t);
- }
- if (t==null) {
+static int lua_nodelib_traverse_filtered(lua_State * L)
+{
+ halfword n;
+ if (lua_isnil(L, 2)) {
+ lua_pushcclosure(L, nodelib_aux_nil, 0);
+ return 1;
+ }
+ n = *(check_isnode(L, 2));
+ lua_pop(L, 1); /* the node, integer remains */
+ lua_pushcclosure(L, nodelib_aux_next_filtered, 1);
+ lua_nodelib_push_fast(L, n);
lua_pushnil(L);
- } else {
- lua_nodelib_push_fast(L,t);
- }
- return 1;
+ return 3;
}
-static int
-lua_nodelib_traverse (lua_State *L) {
- halfword n;
- if (lua_isnil(L,1)) {
- lua_pushcclosure(L, nodelib_aux_nil, 0);
+static int nodelib_aux_next(lua_State * L)
+{
+ register halfword t; /* traverser */
+ if (lua_isnil(L, 2)) { /* first call */
+ t = *check_isnode(L, 1);
+ } else {
+ t = *check_isnode(L, 2);
+ t = vlink(t);
+ }
+ if (t == null) {
+ lua_pushnil(L);
+ } else {
+ lua_nodelib_push_fast(L, t);
+ }
return 1;
- }
- n = *(check_isnode(L,1));
- lua_pushcclosure(L, nodelib_aux_next, 0);
- lua_nodelib_push_fast(L,n);
- lua_pushnil(L);
- return 3;
-;
+}
+
+static int lua_nodelib_traverse(lua_State * L)
+{
+ halfword n;
+ if (lua_isnil(L, 1)) {
+ lua_pushcclosure(L, nodelib_aux_nil, 0);
+ return 1;
+ }
+ n = *(check_isnode(L, 1));
+ lua_pushcclosure(L, nodelib_aux_next, 0);
+ lua_nodelib_push_fast(L, n);
+ lua_pushnil(L);
+ return 3;
+ ;
}
static int
-do_lua_nodelib_count (lua_State *L, halfword match, int i, halfword first) {
- int count = 0;
- int t = first;
- while (t!=match) {
- if (i<0 || type(t)==i) { count++; }
- t = vlink(t);
- }
- lua_pushnumber(L,count);
- return 1;
+do_lua_nodelib_count(lua_State * L, halfword match, int i, halfword first)
+{
+ int count = 0;
+ int t = first;
+ while (t != match) {
+ if (i < 0 || type(t) == i) {
+ count++;
+ }
+ t = vlink(t);
+ }
+ lua_pushnumber(L, count);
+ return 1;
}
-static int lua_nodelib_length (lua_State *L) {
- halfword n;
- halfword m = null;
- if (lua_isnil(L,1)) {
- lua_pushnumber(L,0);
- return 1;
- }
- n = *(check_isnode(L,1));
- if (lua_gettop(L)==2) {
- m = *(check_isnode(L,2));
- }
- return do_lua_nodelib_count(L,m,-1,n);
+static int lua_nodelib_length(lua_State * L)
+{
+ halfword n;
+ halfword m = null;
+ if (lua_isnil(L, 1)) {
+ lua_pushnumber(L, 0);
+ return 1;
+ }
+ n = *(check_isnode(L, 1));
+ if (lua_gettop(L) == 2) {
+ m = *(check_isnode(L, 2));
+ }
+ return do_lua_nodelib_count(L, m, -1, n);
}
-static int lua_nodelib_count (lua_State *L) {
- halfword n;
- halfword m = null;
- int i = -1;
- i = lua_tointeger(L,1);
- if (lua_isnil(L,2)) {
- lua_pushnumber(L,0);
- return 1;
- }
- n = *(check_isnode(L,2));
- if (lua_gettop(L)==3)
- m = *(check_isnode(L,3));
- return do_lua_nodelib_count(L,m,i,n);
+static int lua_nodelib_count(lua_State * L)
+{
+ halfword n;
+ halfword m = null;
+ int i = -1;
+ i = lua_tointeger(L, 1);
+ if (lua_isnil(L, 2)) {
+ lua_pushnumber(L, 0);
+ return 1;
+ }
+ n = *(check_isnode(L, 2));
+ if (lua_gettop(L) == 3)
+ m = *(check_isnode(L, 3));
+ return do_lua_nodelib_count(L, m, i, n);
}
/* fetching a field from a node */
@@ -828,1140 +973,2332 @@ static int lua_nodelib_count (lua_State *L) {
#define nodelib_pushaction(L,n) { lua_pushnumber(L,n); lua_nodelib_push(L); }
#define nodelib_pushstring(L,n) { lua_pushstring(L,makecstring(n)); }
-static void
-lua_nodelib_getfield_whatsit (lua_State *L, int n, int field) {
- if (field==2) {
- lua_pushnumber(L,subtype(n));
- } else {
- switch (subtype(n)) {
- case open_node:
- switch (field) {
- case 4: lua_pushnumber(L,write_stream(n)); break;
- case 5: nodelib_pushstring(L,open_name(n)); break;
- case 6: nodelib_pushstring(L,open_area(n)); break;
- case 7: nodelib_pushstring(L,open_ext(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case write_node:
- switch (field) {
- case 4: lua_pushnumber(L,write_stream(n)); break;
- case 5: tokenlist_to_lua(L,write_tokens(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case close_node:
- switch (field) {
- case 4: lua_pushnumber(L,write_stream(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case special_node:
- switch (field) {
- case 4: tokenlist_to_luastring(L,write_tokens(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case local_par_node:
- switch (field) {
- case 4: lua_pushnumber(L,local_pen_inter(n)); break;
- case 5: lua_pushnumber(L,local_pen_broken(n)); break;
- case 6: lua_pushnumber(L,local_par_dir(n)); break;
- case 7: nodelib_pushlist(L,local_box_left(n)); break;
- case 8: lua_pushnumber(L,local_box_left_width(n)); break;
- case 9: nodelib_pushlist(L,local_box_right(n)); break;
- case 10: lua_pushnumber(L,local_box_right_width(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case dir_node:
- switch (field) {
- case 4: lua_pushnumber(L,dir_dir(n)); break;
- case 5: lua_pushnumber(L,dir_level(n)); break;
- case 6: lua_pushnumber(L,dir_dvi_ptr(n)); break;
- case 7: lua_pushnumber(L,dir_dvi_h(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_literal_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_literal_mode(n)); break;
- case 5: tokenlist_to_luastring(L,pdf_literal_data(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_refobj_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_obj_objnum(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_refxform_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_width(n)); break;
- case 5: lua_pushnumber(L,pdf_height(n)); break;
- case 6: lua_pushnumber(L,pdf_depth(n)); break;
- case 7: lua_pushnumber(L,pdf_xform_objnum(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_refximage_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_width(n)); break;
- case 5: lua_pushnumber(L,pdf_height(n)); break;
- case 6: lua_pushnumber(L,pdf_depth(n)); break;
- case 7: lua_pushnumber(L,pdf_ximage_objnum(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_annot_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_width(n)); break;
- case 5: lua_pushnumber(L,pdf_height(n)); break;
- case 6: lua_pushnumber(L,pdf_depth(n)); break;
- case 7: lua_pushnumber(L,pdf_annot_objnum(n)); break;
- case 8: tokenlist_to_luastring(L,pdf_annot_data(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_start_link_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_width(n)); break;
- case 5: lua_pushnumber(L,pdf_height(n)); break;
- case 6: lua_pushnumber(L,pdf_depth(n)); break;
- case 7: lua_pushnumber(L,pdf_link_objnum(n)); break;
- case 8: tokenlist_to_luastring(L,pdf_link_attr(n)); break;
- case 9: nodelib_pushaction(L,pdf_link_action(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_dest_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_width(n)); break;
- case 5: lua_pushnumber(L,pdf_height(n)); break;
- case 6: lua_pushnumber(L,pdf_depth(n)); break;
- case 7: lua_pushnumber(L,pdf_dest_named_id(n)); break;
- case 8: if (pdf_dest_named_id(n) == 1)
- tokenlist_to_luastring(L,pdf_dest_id(n));
- else
- lua_pushnumber(L,pdf_dest_id(n)); break;
- case 9: lua_pushnumber(L,pdf_dest_type(n)); break;
- case 10: lua_pushnumber(L,pdf_dest_xyz_zoom(n)); break;
- case 11: lua_pushnumber(L,pdf_dest_objnum(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_thread_node:
- case pdf_start_thread_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_width(n)); break;
- case 5: lua_pushnumber(L,pdf_height(n)); break;
- case 6: lua_pushnumber(L,pdf_depth(n)); break;
- case 7: lua_pushnumber(L,pdf_thread_named_id(n)); break;
- case 8: if (pdf_thread_named_id(n) == 1)
- tokenlist_to_luastring(L,pdf_thread_id(n));
- else
- lua_pushnumber(L,pdf_thread_id(n)); break;
- case 9: tokenlist_to_luastring(L,pdf_thread_attr(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case late_lua_node:
- switch (field) {
- case 4: lua_pushnumber(L,late_lua_reg(n)); break;
- case 5: tokenlist_to_luastring(L,late_lua_data(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case close_lua_node:
- switch (field) {
- case 4: lua_pushnumber(L,late_lua_reg(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_colorstack_node:
- switch (field) {
- case 4: lua_pushnumber(L,pdf_colorstack_stack(n)); break;
- case 5: lua_pushnumber(L,pdf_colorstack_cmd(n)); break;
- case 6: tokenlist_to_luastring(L,pdf_colorstack_data(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case pdf_setmatrix_node:
- switch (field) {
- case 4: tokenlist_to_luastring(L,pdf_setmatrix_data(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case user_defined_node:
- switch (field) {
- case 4: lua_pushnumber(L,user_node_id(n)); break;
- case 5: lua_pushnumber(L,user_node_type(n)); break;
- case 6:
- switch (user_node_type(n)) {
- case 'a': nodelib_pushlist(L,user_node_value(n)); break;
- case 'd': lua_pushnumber(L,user_node_value(n)); break;
- case 'n': nodelib_pushlist(L,user_node_value(n)); break;
- case 's': nodelib_pushstring(L,user_node_value(n)); break;
- case 't': tokenlist_to_lua(L,user_node_value(n)); break;
- default: lua_pushnumber(L,user_node_value(n)); break;
- } break;
- default: lua_pushnil(L);
- }
- break;
- default:
- lua_pushnil(L);
- break;
- }
- }
+static void nodelib_pushdir(lua_State * L, int n, boolean dirnode)
+{
+ int f = 0;
+ char dirstring[5] = { 0 };
+ if (dirnode) {
+ dirstring[f++] = (n < 0 ? '-' : '+');
+ }
+ if (n < 0)
+ n += 64;
+ dirstring[f++] = dir_names[(int) dir_primary[n]];
+ dirstring[f++] = dir_names[(int) dir_secondary[n]];
+ dirstring[f++] = dir_names[(int) dir_tertiary[n]];
+ lua_pushstring(L, dirstring);
+}
+
+static void lua_nodelib_getfield_whatsit(lua_State * L, int n, int field)
+{
+ if (field == 2) {
+ lua_pushnumber(L, subtype(n));
+ } else {
+ switch (subtype(n)) {
+ case open_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, write_stream(n));
+ break;
+ case 5:
+ nodelib_pushstring(L, open_name(n));
+ break;
+ case 6:
+ nodelib_pushstring(L, open_area(n));
+ break;
+ case 7:
+ nodelib_pushstring(L, open_ext(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case write_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, write_stream(n));
+ break;
+ case 5:
+ tokenlist_to_lua(L, write_tokens(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case close_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, write_stream(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case special_node:
+ switch (field) {
+ case 4:
+ tokenlist_to_luastring(L, write_tokens(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case local_par_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, local_pen_inter(n));
+ break;
+ case 5:
+ lua_pushnumber(L, local_pen_broken(n));
+ break;
+ case 6:
+ nodelib_pushdir(L, local_par_dir(n), false);
+ break;
+ case 7:
+ nodelib_pushlist(L, local_box_left(n));
+ break;
+ case 8:
+ lua_pushnumber(L, local_box_left_width(n));
+ break;
+ case 9:
+ nodelib_pushlist(L, local_box_right(n));
+ break;
+ case 10:
+ lua_pushnumber(L, local_box_right_width(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case dir_node:
+ switch (field) {
+ case 4:
+ nodelib_pushdir(L, dir_dir(n), true);
+ break;
+ case 5:
+ lua_pushnumber(L, dir_level(n));
+ break;
+ case 6:
+ lua_pushnumber(L, dir_dvi_ptr(n));
+ break;
+ case 7:
+ lua_pushnumber(L, dir_dvi_h(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_literal_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_literal_mode(n));
+ break;
+ case 5:
+ tokenlist_to_luastring(L, pdf_literal_data(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_refobj_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_obj_objnum(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_refxform_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, pdf_height(n));
+ break;
+ case 6:
+ lua_pushnumber(L, pdf_depth(n));
+ break;
+ case 7:
+ lua_pushnumber(L, pdf_xform_objnum(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_refximage_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, pdf_height(n));
+ break;
+ case 6:
+ lua_pushnumber(L, pdf_depth(n));
+ break;
+ case 7:
+ lua_pushnumber(L, pdf_ximage_objnum(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_annot_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, pdf_height(n));
+ break;
+ case 6:
+ lua_pushnumber(L, pdf_depth(n));
+ break;
+ case 7:
+ lua_pushnumber(L, pdf_annot_objnum(n));
+ break;
+ case 8:
+ tokenlist_to_luastring(L, pdf_annot_data(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_start_link_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, pdf_height(n));
+ break;
+ case 6:
+ lua_pushnumber(L, pdf_depth(n));
+ break;
+ case 7:
+ lua_pushnumber(L, pdf_link_objnum(n));
+ break;
+ case 8:
+ tokenlist_to_luastring(L, pdf_link_attr(n));
+ break;
+ case 9:
+ nodelib_pushaction(L, pdf_link_action(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_dest_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, pdf_height(n));
+ break;
+ case 6:
+ lua_pushnumber(L, pdf_depth(n));
+ break;
+ case 7:
+ lua_pushnumber(L, pdf_dest_named_id(n));
+ break;
+ case 8:
+ if (pdf_dest_named_id(n) == 1)
+ tokenlist_to_luastring(L, pdf_dest_id(n));
+ else
+ lua_pushnumber(L, pdf_dest_id(n));
+ break;
+ case 9:
+ lua_pushnumber(L, pdf_dest_type(n));
+ break;
+ case 10:
+ lua_pushnumber(L, pdf_dest_xyz_zoom(n));
+ break;
+ case 11:
+ lua_pushnumber(L, pdf_dest_objnum(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_thread_node:
+ case pdf_start_thread_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, pdf_height(n));
+ break;
+ case 6:
+ lua_pushnumber(L, pdf_depth(n));
+ break;
+ case 7:
+ lua_pushnumber(L, pdf_thread_named_id(n));
+ break;
+ case 8:
+ if (pdf_thread_named_id(n) == 1)
+ tokenlist_to_luastring(L, pdf_thread_id(n));
+ else
+ lua_pushnumber(L, pdf_thread_id(n));
+ break;
+ case 9:
+ tokenlist_to_luastring(L, pdf_thread_attr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case late_lua_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, late_lua_reg(n));
+ break;
+ case 5:
+ tokenlist_to_luastring(L, late_lua_data(n));
+ break;
+ case 6:
+ tokenlist_to_luastring(L, late_lua_name(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case close_lua_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, late_lua_reg(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_colorstack_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, pdf_colorstack_stack(n));
+ break;
+ case 5:
+ lua_pushnumber(L, pdf_colorstack_cmd(n));
+ break;
+ case 6:
+ tokenlist_to_luastring(L, pdf_colorstack_data(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case pdf_setmatrix_node:
+ switch (field) {
+ case 4:
+ tokenlist_to_luastring(L, pdf_setmatrix_data(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case user_defined_node:
+ switch (field) {
+ case 4:
+ lua_pushnumber(L, user_node_id(n));
+ break;
+ case 5:
+ lua_pushnumber(L, user_node_type(n));
+ break;
+ case 6:
+ switch (user_node_type(n)) {
+ case 'a':
+ nodelib_pushlist(L, user_node_value(n));
+ break;
+ case 'd':
+ lua_pushnumber(L, user_node_value(n));
+ break;
+ case 'n':
+ nodelib_pushlist(L, user_node_value(n));
+ break;
+ case 's':
+ nodelib_pushstring(L, user_node_value(n));
+ break;
+ case 't':
+ tokenlist_to_lua(L, user_node_value(n));
+ break;
+ default:
+ lua_pushnumber(L, user_node_value(n));
+ break;
+ }
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ default:
+ lua_pushnil(L);
+ break;
+ }
+ }
}
-static int
-lua_nodelib_getfield (lua_State *L) {
- halfword *n_ptr, n;
- int field;
- if (lua_isnil(L,1))
- return 1; /* a nil */
- n_ptr = check_isnode(L,1);
- n = *n_ptr;
- field = get_valid_node_field_id(L,2, n);
-
- if (field<-1)
- return 0;
- if (field==0) {
- lua_pushnumber(L,vlink(n));
- lua_nodelib_push(L);
- } else if (field==1) {
- lua_pushnumber(L,type(n));
- } else if (field==-1) {
- lua_pushnumber(L,alink(n));
- lua_nodelib_push(L);
- } else if (field==3 && nodetype_has_attributes(type(n))) {
- nodelib_pushattr(L,node_attr(n));
- } else {
+static int lua_nodelib_getfield(lua_State * L)
+{
+ register halfword n;
+ register int field;
+ n = *((halfword *) lua_touserdata(L, 1));
+ field = get_valid_node_field_id(L, 2, n);
+ if (field == 0) {
+ lua_pushnumber(L, vlink(n));
+ lua_nodelib_push(L);
+ return 1;
+ }
+ if (field == 1) {
+ lua_pushnumber(L, type(n));
+ return 1;
+ }
+ if (field == -1) {
+ lua_pushnumber(L, alink(n));
+ lua_nodelib_push(L);
+ return 1;
+ }
+ if (field == 3 && nodetype_has_attributes(type(n))) {
+ nodelib_pushattr(L, node_attr(n));
+ return 1;
+ }
+ if (field < -1)
+ return 0;
switch (type(n)) {
case hlist_node:
case vlist_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: lua_pushnumber(L,width(n)); break;
- case 5: lua_pushnumber(L,depth(n)); break;
- case 6: lua_pushnumber(L,height(n)); break;
- case 7: lua_pushnumber(L,box_dir(n)); break;
- case 8: lua_pushnumber(L,shift_amount(n)); break;
- case 9: lua_pushnumber(L,glue_order(n)); break;
- case 10: lua_pushnumber(L,glue_sign(n)); break;
- case 11: lua_pushnumber(L,(double)glue_set(n)); break;
- case 12: nodelib_pushlist(L,list_ptr(n)); break;
- default: lua_pushnil(L);
- }
- break;
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, depth(n));
+ break;
+ case 6:
+ lua_pushnumber(L, height(n));
+ break;
+ case 7:
+ nodelib_pushdir(L, box_dir(n), false);
+ break;
+ case 8:
+ lua_pushnumber(L, shift_amount(n));
+ break;
+ case 9:
+ lua_pushnumber(L, glue_order(n));
+ break;
+ case 10:
+ lua_pushnumber(L, glue_sign(n));
+ break;
+ case 11:
+ lua_pushnumber(L, (double) glue_set(n));
+ break;
+ case 12:
+ nodelib_pushlist(L, list_ptr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
case unset_node:
- switch (field) {
- case 2: lua_pushnumber(L,0); break;
- case 4: lua_pushnumber(L,width(n)); break;
- case 5: lua_pushnumber(L,depth(n)); break;
- case 6: lua_pushnumber(L,height(n)); break;
- case 7: lua_pushnumber(L,box_dir(n)); break;
- case 8: lua_pushnumber(L,glue_shrink(n)); break;
- case 9: lua_pushnumber(L,glue_order(n)); break;
- case 10: lua_pushnumber(L,glue_sign(n)); break;
- case 11: lua_pushnumber(L,glue_stretch(n)); break;
- case 12: lua_pushnumber(L,span_count(n)); break;
- case 13: nodelib_pushlist(L,list_ptr(n)); break;
- default: lua_pushnil(L);
- }
- break;
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, 0);
+ break;
+ case 4:
+ lua_pushnumber(L, width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, depth(n));
+ break;
+ case 6:
+ lua_pushnumber(L, height(n));
+ break;
+ case 7:
+ nodelib_pushdir(L, box_dir(n), false);
+ break;
+ case 8:
+ lua_pushnumber(L, glue_shrink(n));
+ break;
+ case 9:
+ lua_pushnumber(L, glue_order(n));
+ break;
+ case 10:
+ lua_pushnumber(L, glue_sign(n));
+ break;
+ case 11:
+ lua_pushnumber(L, glue_stretch(n));
+ break;
+ case 12:
+ lua_pushnumber(L, span_count(n));
+ break;
+ case 13:
+ nodelib_pushlist(L, list_ptr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
case rule_node:
- switch (field) {
- case 2: lua_pushnumber(L,0); break;
- case 4: lua_pushnumber(L,width(n)); break;
- case 5: lua_pushnumber(L,depth(n)); break;
- case 6: lua_pushnumber(L,height(n)); break;
- case 7: lua_pushnumber(L,rule_dir(n)); break;
- default: lua_pushnil(L);
- }
- break;
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, 0);
+ break;
+ case 4:
+ lua_pushnumber(L, width(n));
+ break;
+ case 5:
+ lua_pushnumber(L, depth(n));
+ break;
+ case 6:
+ lua_pushnumber(L, height(n));
+ break;
+ case 7:
+ nodelib_pushdir(L, rule_dir(n), false);
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
case ins_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: lua_pushnumber(L,float_cost(n)); break;
- case 5: lua_pushnumber(L,depth(n)); break;
- case 6: lua_pushnumber(L,height(n)); break;
- case 7: nodelib_pushspec(L,split_top_ptr(n)); break;
- case 8: nodelib_pushlist(L,ins_ptr(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case mark_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: lua_pushnumber(L,mark_class(n)); break;
- case 5: tokenlist_to_lua(L,mark_ptr(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case adjust_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: nodelib_pushlist(L,adjust_ptr(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case disc_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: nodelib_pushlist(L,vlink(pre_break(n))); break;
- case 5: nodelib_pushlist(L,vlink(post_break(n))); break;
- case 6: nodelib_pushlist(L,vlink(no_break(n))); break;
- default: lua_pushnil(L);
- }
- break;
- case math_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: lua_pushnumber(L,surround(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case glue_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: nodelib_pushspec(L,glue_ptr(n)); break;
- case 5: nodelib_pushlist(L,leader_ptr(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case glue_spec_node:
- switch (field) {
- case 2: lua_pushnumber(L,0); break;
- case 3: lua_pushnumber(L,width(n)); break;
- case 4: lua_pushnumber(L,stretch(n)); break;
- case 5: lua_pushnumber(L,shrink(n)); break;
- case 6: lua_pushnumber(L,stretch_order(n)); break;
- case 7: lua_pushnumber(L,shrink_order(n)); break;
- case 8: lua_pushnumber(L,glue_ref_count(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case kern_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: lua_pushnumber(L,width(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case penalty_node:
- switch (field) {
- case 2: lua_pushnumber(L,0); break;
- case 4: lua_pushnumber(L,penalty(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case glyph_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 4: lua_pushnumber(L,character(n)); break;
- case 5: lua_pushnumber(L,font(n)); break;
- case 6: lua_pushnumber(L,char_lang(n)); break;
- case 7: lua_pushnumber(L,char_lhmin(n)); break;
- case 8: lua_pushnumber(L,char_rhmin(n)); break;
- case 9: lua_pushnumber(L,char_uchyph(n)); break;
- case 10: nodelib_pushlist(L,lig_ptr(n)); break;
- case 11: lua_pushnumber(L,x_displace(n)); break;
- case 12: lua_pushnumber(L,y_displace(n)); break;
- default: lua_pushnil(L);
- }
- break;
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, float_cost(n));
+ break;
+ case 5:
+ lua_pushnumber(L, depth(n));
+ break;
+ case 6:
+ lua_pushnumber(L, height(n));
+ break;
+ case 7:
+ nodelib_pushspec(L, split_top_ptr(n));
+ break;
+ case 8:
+ nodelib_pushlist(L, ins_ptr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case mark_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, mark_class(n));
+ break;
+ case 5:
+ tokenlist_to_lua(L, mark_ptr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case adjust_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, adjust_ptr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case disc_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, vlink(pre_break(n)));
+ break;
+ case 5:
+ nodelib_pushlist(L, vlink(post_break(n)));
+ break;
+ case 6:
+ nodelib_pushlist(L, vlink(no_break(n)));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case math_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, surround(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case glue_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushspec(L, glue_ptr(n));
+ break;
+ case 5:
+ nodelib_pushlist(L, leader_ptr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case glue_spec_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, 0);
+ break;
+ case 3:
+ lua_pushnumber(L, width(n));
+ break;
+ case 4:
+ lua_pushnumber(L, stretch(n));
+ break;
+ case 5:
+ lua_pushnumber(L, shrink(n));
+ break;
+ case 6:
+ lua_pushnumber(L, stretch_order(n));
+ break;
+ case 7:
+ lua_pushnumber(L, shrink_order(n));
+ break;
+ case 8:
+ lua_pushnumber(L, glue_ref_count(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case kern_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, width(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case penalty_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, 0);
+ break;
+ case 4:
+ lua_pushnumber(L, penalty(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case glyph_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, character(n));
+ break;
+ case 5:
+ lua_pushnumber(L, font(n));
+ break;
+ case 6:
+ lua_pushnumber(L, char_lang(n));
+ break;
+ case 7:
+ lua_pushnumber(L, char_lhmin(n));
+ break;
+ case 8:
+ lua_pushnumber(L, char_rhmin(n));
+ break;
+ case 9:
+ lua_pushnumber(L, char_uchyph(n));
+ break;
+ case 10:
+ nodelib_pushlist(L, lig_ptr(n));
+ break;
+ case 11:
+ lua_pushnumber(L, x_displace(n));
+ break;
+ case 12:
+ lua_pushnumber(L, y_displace(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case style_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, 0);
+ break;
+ case 4:
+ lua_pushstring(L, math_style_names[subtype(n)]);
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case choice_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, display_mlist(n));
+ break;
+ case 5:
+ nodelib_pushlist(L, text_mlist(n));
+ break;
+ case 6:
+ nodelib_pushlist(L, script_mlist(n));
+ break;
+ case 7:
+ nodelib_pushlist(L, script_script_mlist(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case ord_noad:
+ case op_noad:
+ case bin_noad:
+ case rel_noad:
+ case open_noad:
+ case close_noad:
+ case punct_noad:
+ case inner_noad:
+ case under_noad:
+ case over_noad:
+ case vcenter_noad:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, nucleus(n));
+ break;
+ case 5:
+ nodelib_pushlist(L, subscr(n));
+ break;
+ case 6:
+ nodelib_pushlist(L, supscr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case radical_noad:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, nucleus(n));
+ break;
+ case 5:
+ nodelib_pushlist(L, subscr(n));
+ break;
+ case 6:
+ nodelib_pushlist(L, supscr(n));
+ break;
+ case 7:
+ nodelib_pushlist(L, left_delimiter(n));
+ break;
+ case 8:
+ nodelib_pushlist(L, degree(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case fraction_noad:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, thickness(n));
+ break;
+ case 5:
+ nodelib_pushlist(L, numerator(n));
+ break;
+ case 6:
+ nodelib_pushlist(L, denominator(n));
+ break;
+ case 7:
+ nodelib_pushlist(L, left_delimiter(n));
+ break;
+ case 8:
+ nodelib_pushlist(L, right_delimiter(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case accent_noad:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, nucleus(n));
+ break;
+ case 5:
+ nodelib_pushlist(L, subscr(n));
+ break;
+ case 6:
+ nodelib_pushlist(L, supscr(n));
+ break;
+ case 7:
+ nodelib_pushlist(L, accent_chr(n));
+ break;
+ case 8:
+ nodelib_pushlist(L, bot_accent_chr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case fence_noad:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, delimiter(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case math_char_node:
+ case math_text_char_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, math_fam(n));
+ break;
+ case 5:
+ lua_pushnumber(L, math_character(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case sub_box_node:
+ case sub_mlist_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, math_list(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case delim_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 4:
+ lua_pushnumber(L, small_fam(n));
+ break;
+ case 5:
+ lua_pushnumber(L, small_char(n));
+ break;
+ case 6:
+ lua_pushnumber(L, large_fam(n));
+ break;
+ case 7:
+ lua_pushnumber(L, large_char(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
case inserting_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 3: nodelib_pushlist(L,last_ins_ptr(n)); break;
- case 4: nodelib_pushlist(L,best_ins_ptr(n)); break;
- default: lua_pushnil(L);
- }
- break;
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 3:
+ nodelib_pushlist(L, last_ins_ptr(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, best_ins_ptr(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
case split_up_node:
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 3: nodelib_pushlist(L,last_ins_ptr(n)); break;
- case 4: nodelib_pushlist(L,best_ins_ptr(n)); break;
- case 5: nodelib_pushlist(L,broken_ptr(n)); break;
- case 6: nodelib_pushlist(L,broken_ins(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case margin_kern_node :
- switch (field) {
- case 2: lua_pushnumber(L,subtype(n)); break;
- case 3: lua_pushnumber(L,width(n)); break;
- case 4: nodelib_pushlist(L,margin_char(n)); break;
- default: lua_pushnil(L);
- }
- break;
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 3:
+ nodelib_pushlist(L, last_ins_ptr(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, best_ins_ptr(n));
+ break;
+ case 5:
+ nodelib_pushlist(L, broken_ptr(n));
+ break;
+ case 6:
+ nodelib_pushlist(L, broken_ins(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case margin_kern_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, subtype(n));
+ break;
+ case 3:
+ lua_pushnumber(L, width(n));
+ break;
+ case 4:
+ nodelib_pushlist(L, margin_char(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
case action_node:
- switch (field) {
- case 2: lua_pushnil(L); /* dummy subtype */ break;
- case 3: lua_pushnumber(L,pdf_action_type(n)); break;
- case 4: lua_pushnumber(L,pdf_action_named_id(n)); break;
- case 5: if (pdf_action_named_id(n)==1) {
- tokenlist_to_luastring(L,pdf_action_id(n));
- } else {
- lua_pushnumber(L,pdf_action_id(n));
- } break;
- case 6: tokenlist_to_luastring(L,pdf_action_file(n)); break;
- case 7: lua_pushnumber(L,pdf_action_new_window(n)); break;
- case 8: tokenlist_to_luastring(L,pdf_action_tokens(n));break;
- case 9: lua_pushnumber(L,pdf_action_refcount(n)); break;
- default: lua_pushnil(L);
- }
- break;
- case attribute_list_node :
- switch (field) {
- case 2: lua_pushnumber(L,0); break;
- default: lua_pushnil(L);
- }
- break;
- case attribute_node :
- switch (field) {
- case 2: lua_pushnumber(L,0); break;
- case 3: lua_pushnumber(L,attribute_id(n)); break;
- case 4: lua_pushnumber(L,attribute_value(n)); break;
- default: lua_pushnil(L);
- }
- break;
+ switch (field) {
+ case 2:
+ lua_pushnil(L); /* dummy subtype */
+ break;
+ case 3:
+ lua_pushnumber(L, pdf_action_type(n));
+ break;
+ case 4:
+ lua_pushnumber(L, pdf_action_named_id(n));
+ break;
+ case 5:
+ if (pdf_action_named_id(n) == 1) {
+ tokenlist_to_luastring(L, pdf_action_id(n));
+ } else {
+ lua_pushnumber(L, pdf_action_id(n));
+ }
+ break;
+ case 6:
+ tokenlist_to_luastring(L, pdf_action_file(n));
+ break;
+ case 7:
+ lua_pushnumber(L, pdf_action_new_window(n));
+ break;
+ case 8:
+ tokenlist_to_luastring(L, pdf_action_tokens(n));
+ break;
+ case 9:
+ lua_pushnumber(L, pdf_action_refcount(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case attribute_list_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, 0);
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
+ case attribute_node:
+ switch (field) {
+ case 2:
+ lua_pushnumber(L, 0);
+ break;
+ case 3:
+ lua_pushnumber(L, attribute_id(n));
+ break;
+ case 4:
+ lua_pushnumber(L, attribute_value(n));
+ break;
+ default:
+ lua_pushnil(L);
+ }
+ break;
case whatsit_node:
- lua_nodelib_getfield_whatsit(L,n,field);
- break;
- default:
- lua_pushnil(L);
- break;
+ lua_nodelib_getfield_whatsit(L, n, field);
+ break;
+ default:
+ lua_pushnil(L);
+ break;
}
- }
- return 1;
+ return 1;
}
-static int nodelib_getlist(lua_State *L, int n) {
- halfword *m;
- if (lua_isuserdata(L,n)) {
- m = check_isnode(L,n);
- return *m;
- } else {
- return null ;
- }
+
+
+static int nodelib_getlist(lua_State * L, int n)
+{
+ halfword *m;
+ if (lua_isuserdata(L, n)) {
+ m = check_isnode(L, n);
+ return *m;
+ } else {
+ return null;
+ }
}
+static int nodelib_getdir(lua_State * L, int n)
+{
+ char *s = NULL;
+ int d = 32; /* invalid number */
+ int a = -1, b = -1, c = -1;
+ if (lua_type(L, n) == LUA_TSTRING) {
+ s = (char *) lua_tostring(L, n);
+ if (strlen(s) == 3) {
+ d = 0;
+ }
+ if (strlen(s) == 4) {
+ if (*s == '-')
+ d = -64;
+ else if (*s == '+')
+ d = 0;
+ s++;
+ }
+ if (strlen(s) == 3) {
+ switch (*s) {
+ /* *INDENT-OFF* */
+ case 'T': a=0; break;
+ case 'L': a=1; break;
+ case 'B': a=2; break;
+ case 'R': a=3; break;
+ /* *INDENT-ON* */
+ }
+ switch (*(s + 1)) {
+ /* *INDENT-OFF* */
+ case 'T': b=0; break;
+ case 'L': b=1; break;
+ case 'B': b=2; break;
+ case 'R': b=3; break;
+ /* *INDENT-ON* */
+ }
+ switch (*(s + 2)) {
+ /* *INDENT-OFF* */
+ case 'T': c=0; break;
+ case 'L': c=1; break;
+ case 'B': c=2; break;
+ case 'R': c=3; break;
+ /* *INDENT-ON* */
+ }
+ }
+ if (a != -1 && b != -1 && c != -1 && !dir_parallel(a, b)) {
+ d += (a * 8 + dir_rearrange[b] * 4 + c);
+ }
+ } else if (lua_isnumber(L, n)) {
+ d = lua_tonumber(L, n);
+ }
+ if ((d > 31) || (d < -64) || (d < 0 && (d + 64) > 31)) {
+ d = 0;
+ lua_pushfstring(L, "Bad direction specifier %s",
+ (char *) lua_tostring(L, n));
+ lua_error(L);
+ }
+ return d;
+}
+
+
#define nodelib_getspec nodelib_getlist
#define nodelib_getaction nodelib_getlist
-static str_number
-nodelib_getstring(lua_State *L, int a) {
- size_t k;
- char *s=(char *)lua_tolstring(L,a, &k);
- return maketexlstring(s,k);
+static str_number nodelib_getstring(lua_State * L, int a)
+{
+ size_t k;
+ char *s = (char *) lua_tolstring(L, a, &k);
+ return maketexlstring(s, k);
}
#define nodelib_gettoks(L,a) tokenlist_from_lua(L)
-static void nodelib_setattr (lua_State *L, int stackindex, halfword n) {
- halfword p;
- p = nodelib_getlist(L,stackindex);
- if (node_attr(n) != p) {
- if (node_attr(n)!=null)
- delete_attribute_ref(node_attr(n));
- node_attr(n) = p;
- attr_list_ref(p)++;
- }
+static void nodelib_setattr(lua_State * L, int stackindex, halfword n)
+{
+ halfword p;
+ p = nodelib_getlist(L, stackindex);
+ if (node_attr(n) != p) {
+ if (node_attr(n) != null)
+ delete_attribute_ref(node_attr(n));
+ node_attr(n) = p;
+ attr_list_ref(p)++;
+ }
}
-static int nodelib_cantset (lua_State *L, int field, int n) {
- lua_pushfstring(L,"You cannot set field %d in a node of type %s",
- field, node_data[type(n)].name);
- lua_error(L);
- return 0;
+static int nodelib_cantset(lua_State * L, int field, int n)
+{
+ lua_pushfstring(L, "You cannot set field %d in a node of type %s",
+ field, node_data[type(n)].name);
+ lua_error(L);
+ return 0;
}
-static int
-lua_nodelib_setfield_whatsit(lua_State *L, int n, int field) {
- switch (subtype(n)) {
- case open_node:
- switch (field) {
- case 4: write_stream(n) = lua_tointeger(L,3); break;
- case 5: open_name(n) = nodelib_getstring(L,3); break;
- case 6: open_area(n) = nodelib_getstring(L,3); break;
- case 7: open_ext(n) = nodelib_getstring(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case write_node:
- switch (field) {
- case 4: write_stream(n) = lua_tointeger(L,3); break;
- case 5: write_tokens(n) = nodelib_gettoks(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case close_node:
- switch (field) {
- case 4: write_stream(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case special_node:
- switch (field) {
- case 4: write_tokens(n) = nodelib_gettoks(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case local_par_node:
- switch (field) {
- case 4: local_pen_inter(n) = lua_tointeger(L,3); break;
- case 5: local_pen_broken(n) = lua_tointeger(L,3); break;
- case 6: local_par_dir(n) = lua_tointeger(L,3); break;
- case 7: local_box_left(n) = nodelib_getlist(L,3); break;
- case 8: local_box_left_width(n) = lua_tointeger(L,3); break;
- case 9: local_box_right(n) = nodelib_getlist(L,3); break;
- case 10: local_box_right_width(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case dir_node:
- switch (field) {
- case 4: dir_dir(n) = lua_tointeger(L,3); break;
- case 5: dir_level(n) = lua_tointeger(L,3); break;
- case 6: dir_dvi_ptr(n) = lua_tointeger(L,3); break;
- case 7: dir_dvi_h(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_literal_node:
- switch (field) {
- case 4: pdf_literal_mode(n) = lua_tointeger(L,3); break;
- case 5: pdf_literal_data(n) = nodelib_gettoks(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_refobj_node:
- switch (field) {
- case 4: pdf_obj_objnum(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_refxform_node:
- switch (field) {
- case 4: pdf_width(n) = lua_tointeger(L,3); break;
- case 5: pdf_height(n) = lua_tointeger(L,3); break;
- case 6: pdf_depth(n) = lua_tointeger(L,3); break;
- case 7: pdf_xform_objnum(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_refximage_node:
- switch (field) {
- case 4: pdf_width(n) = lua_tointeger(L,3); break;
- case 5: pdf_height(n) = lua_tointeger(L,3); break;
- case 6: pdf_depth(n) = lua_tointeger(L,3); break;
- case 7: pdf_ximage_objnum(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_annot_node:
- switch (field) {
- case 4: pdf_width(n) = lua_tointeger(L,3); break;
- case 5: pdf_height(n) = lua_tointeger(L,3); break;
- case 6: pdf_depth(n) = lua_tointeger(L,3); break;
- case 7: pdf_annot_objnum(n) = lua_tointeger(L,3); break;
- case 8: pdf_annot_data(n) = nodelib_getstring(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_start_link_node:
- switch (field) {
- case 4: pdf_width(n) = lua_tointeger(L,3); break;
- case 5: pdf_height(n) = lua_tointeger(L,3); break;
- case 6: pdf_depth(n) = lua_tointeger(L,3); break;
- case 7: pdf_link_objnum(n) = lua_tointeger(L,3); break;
- case 8: pdf_link_attr(n) = nodelib_getstring(L,3); break;
- case 9: pdf_link_action(n) = nodelib_getaction(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_end_link_node:
- switch (field) {
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_dest_node:
- switch (field) {
- case 4: pdf_width(n) = lua_tointeger(L,3); break;
- case 5: pdf_height(n) = lua_tointeger(L,3); break;
- case 6: pdf_depth(n) = lua_tointeger(L,3); break;
- case 7: pdf_dest_named_id(n) = lua_tointeger(L,3); break;
- case 8: if (pdf_dest_named_id(n)==1)
- pdf_dest_id(n) = nodelib_gettoks(L,3);
- else
- pdf_dest_id(n) = lua_tointeger(L,3); break;
- case 9: pdf_dest_type(n) = lua_tointeger(L,3); break;
- case 10: pdf_dest_xyz_zoom(n) = lua_tointeger(L,3); break;
- case 11: pdf_dest_objnum(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_thread_node:
- case pdf_start_thread_node:
- switch (field) {
- case 4: pdf_width(n) = lua_tointeger(L,3); break;
- case 5: pdf_height(n) = lua_tointeger(L,3); break;
- case 6: pdf_depth(n) = lua_tointeger(L,3); break;
- case 7: pdf_thread_named_id(n) = lua_tointeger(L,3); break;
- case 8: if (pdf_thread_named_id(n)==1)
- pdf_thread_id(n) = nodelib_gettoks(L,3);
- else
- pdf_thread_id(n) = lua_tointeger(L,3); break;
- case 9: pdf_thread_attr(n) = nodelib_gettoks(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_end_thread_node:
- case pdf_save_pos_node:
- return nodelib_cantset(L,field,n);
- break;
- case late_lua_node:
- switch (field) {
- case 4: late_lua_reg(n) = lua_tointeger(L,3); break;
- case 5: late_lua_data(n) = nodelib_gettoks(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case close_lua_node:
- switch (field) {
- case 4: late_lua_reg(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_colorstack_node:
- switch (field) {
- case 4: pdf_colorstack_stack(n) = lua_tointeger(L,3); break;
- case 5: pdf_colorstack_cmd(n) = lua_tointeger(L,3); break;
- case 6: pdf_colorstack_data(n) = nodelib_gettoks(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_setmatrix_node:
- switch (field) {
- case 4: pdf_setmatrix_data(n) = nodelib_gettoks(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case pdf_save_node:
- case pdf_restore_node:
- case cancel_boundary_node:
- return nodelib_cantset(L,field,n);
- break;
- case user_defined_node:
- switch (field) {
- case 4: user_node_id(n) = lua_tointeger(L,3); break;
- case 5: user_node_type(n) = lua_tointeger(L,3); break;
- case 6:
- switch(user_node_type(n)) {
- case 'a': user_node_value(n) = nodelib_getlist(L,3); break;
- case 'd': user_node_value(n) = lua_tointeger(L,3); break;
- case 'n': user_node_value(n) = nodelib_getlist(L,3); break;
- case 's': user_node_value(n) = nodelib_getstring(L,3); break;
- case 't': user_node_value(n) = nodelib_gettoks(L,3); break;
- default: user_node_value(n) = lua_tointeger(L,3); break;
- } break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- default:
- /* do nothing */
- break;
- }
- return 0;
+static int lua_nodelib_setfield_whatsit(lua_State * L, int n, int field)
+{
+ switch (subtype(n)) {
+ case open_node:
+ switch (field) {
+ case 4:
+ write_stream(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ open_name(n) = nodelib_getstring(L, 3);
+ break;
+ case 6:
+ open_area(n) = nodelib_getstring(L, 3);
+ break;
+ case 7:
+ open_ext(n) = nodelib_getstring(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case write_node:
+ switch (field) {
+ case 4:
+ write_stream(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ write_tokens(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case close_node:
+ switch (field) {
+ case 4:
+ write_stream(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case special_node:
+ switch (field) {
+ case 4:
+ write_tokens(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case local_par_node:
+ switch (field) {
+ case 4:
+ local_pen_inter(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ local_pen_broken(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ local_par_dir(n) = nodelib_getdir(L, 3);
+ break;
+ case 7:
+ local_box_left(n) = nodelib_getlist(L, 3);
+ break;
+ case 8:
+ local_box_left_width(n) = lua_tointeger(L, 3);
+ break;
+ case 9:
+ local_box_right(n) = nodelib_getlist(L, 3);
+ break;
+ case 10:
+ local_box_right_width(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case dir_node:
+ switch (field) {
+ case 4:
+ dir_dir(n) = nodelib_getdir(L, 3);
+ break;
+ case 5:
+ dir_level(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ dir_dvi_ptr(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ dir_dvi_h(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_literal_node:
+ switch (field) {
+ case 4:
+ pdf_literal_mode(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ pdf_literal_data(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_refobj_node:
+ switch (field) {
+ case 4:
+ pdf_obj_objnum(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_refxform_node:
+ switch (field) {
+ case 4:
+ pdf_width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ pdf_height(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ pdf_depth(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ pdf_xform_objnum(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_refximage_node:
+ switch (field) {
+ case 4:
+ pdf_width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ pdf_height(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ pdf_depth(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ pdf_ximage_objnum(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_annot_node:
+ switch (field) {
+ case 4:
+ pdf_width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ pdf_height(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ pdf_depth(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ pdf_annot_objnum(n) = lua_tointeger(L, 3);
+ break;
+ case 8:
+ pdf_annot_data(n) = nodelib_getstring(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_start_link_node:
+ switch (field) {
+ case 4:
+ pdf_width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ pdf_height(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ pdf_depth(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ pdf_link_objnum(n) = lua_tointeger(L, 3);
+ break;
+ case 8:
+ pdf_link_attr(n) = nodelib_getstring(L, 3);
+ break;
+ case 9:
+ pdf_link_action(n) = nodelib_getaction(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_end_link_node:
+ switch (field) {
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_dest_node:
+ switch (field) {
+ case 4:
+ pdf_width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ pdf_height(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ pdf_depth(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ pdf_dest_named_id(n) = lua_tointeger(L, 3);
+ break;
+ case 8:
+ if (pdf_dest_named_id(n) == 1)
+ pdf_dest_id(n) = nodelib_gettoks(L, 3);
+ else
+ pdf_dest_id(n) = lua_tointeger(L, 3);
+ break;
+ case 9:
+ pdf_dest_type(n) = lua_tointeger(L, 3);
+ break;
+ case 10:
+ pdf_dest_xyz_zoom(n) = lua_tointeger(L, 3);
+ break;
+ case 11:
+ pdf_dest_objnum(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_thread_node:
+ case pdf_start_thread_node:
+ switch (field) {
+ case 4:
+ pdf_width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ pdf_height(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ pdf_depth(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ pdf_thread_named_id(n) = lua_tointeger(L, 3);
+ break;
+ case 8:
+ if (pdf_thread_named_id(n) == 1)
+ pdf_thread_id(n) = nodelib_gettoks(L, 3);
+ else
+ pdf_thread_id(n) = lua_tointeger(L, 3);
+ break;
+ case 9:
+ pdf_thread_attr(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_end_thread_node:
+ case pdf_save_pos_node:
+ return nodelib_cantset(L, field, n);
+ break;
+ case late_lua_node:
+ switch (field) {
+ case 4:
+ late_lua_reg(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ late_lua_data(n) = nodelib_gettoks(L, 3);
+ break;
+ case 6:
+ late_lua_name(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case close_lua_node:
+ switch (field) {
+ case 4:
+ late_lua_reg(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_colorstack_node:
+ switch (field) {
+ case 4:
+ pdf_colorstack_stack(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ pdf_colorstack_cmd(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ pdf_colorstack_data(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_setmatrix_node:
+ switch (field) {
+ case 4:
+ pdf_setmatrix_data(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case pdf_save_node:
+ case pdf_restore_node:
+ case cancel_boundary_node:
+ return nodelib_cantset(L, field, n);
+ break;
+ case user_defined_node:
+ switch (field) {
+ case 4:
+ user_node_id(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ user_node_type(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ switch (user_node_type(n)) {
+ case 'a':
+ user_node_value(n) = nodelib_getlist(L, 3);
+ break;
+ case 'd':
+ user_node_value(n) = lua_tointeger(L, 3);
+ break;
+ case 'n':
+ user_node_value(n) = nodelib_getlist(L, 3);
+ break;
+ case 's':
+ user_node_value(n) = nodelib_getstring(L, 3);
+ break;
+ case 't':
+ user_node_value(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ user_node_value(n) = lua_tointeger(L, 3);
+ break;
+ }
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+ return 0;
}
-static int
-lua_nodelib_setfield (lua_State *L) {
- register halfword n;
- register int field;
- n = *check_isnode(L,1);
- field = get_valid_node_field_id(L,2,n);
- if (field<-1)
- return 0;
- if (field==0) {
- vlink(n) = nodelib_getlist(L,3);
- } else if (field==-1) {
- alink(n) = nodelib_getlist(L,3);
- } else if (field==3 && nodetype_has_attributes(type(n))) {
- nodelib_setattr(L,3,n);
- } else if (type(n)==glyph_node) {
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: character(n) = lua_tointeger(L,3); break;
- case 5: font(n) = lua_tointeger(L,3); break;
- case 6: set_char_lang(n,lua_tointeger(L,3)); break;
- case 7: set_char_lhmin(n,lua_tointeger(L,3)); break;
- case 8: set_char_rhmin(n,lua_tointeger(L,3)); break;
- case 9: set_char_uchyph(n,lua_tointeger(L,3)); break;
- case 10: lig_ptr(n) = nodelib_getlist(L,3); break;
- case 11: x_displace(n) = lua_tointeger(L,3); break;
- case 12: y_displace(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- } else {
- switch (type(n)) {
- case hlist_node:
- case vlist_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: width(n) = lua_tointeger(L,3); break;
- case 5: depth(n) = lua_tointeger(L,3); break;
- case 6: height(n) = lua_tointeger(L,3); break;
- case 7: box_dir(n) = lua_tointeger(L,3); break;
- case 8: shift_amount(n) = lua_tointeger(L,3); break;
- case 9: glue_order(n) = lua_tointeger(L,3); break;
- case 10: glue_sign(n) = lua_tointeger(L,3); break;
- case 11: glue_set(n) = (double)lua_tonumber(L,3); break;
- case 12: list_ptr(n) = nodelib_getlist(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case unset_node:
- switch (field) {
- case 2: /* dummy subtype */ break;
- case 4: width(n) = lua_tointeger(L,3); break;
- case 5: depth(n) = lua_tointeger(L,3); break;
- case 6: height(n) = lua_tointeger(L,3); break;
- case 7: box_dir(n) = lua_tointeger(L,3); break;
- case 8: glue_shrink(n) = lua_tointeger(L,3); break;
- case 9: glue_order(n) = lua_tointeger(L,3); break;
- case 10: glue_sign(n) = lua_tointeger(L,3); break;
- case 11: glue_stretch(n) = lua_tointeger(L,3); break;
- case 12: span_count(n) = lua_tointeger(L,3); break;
- case 13: list_ptr(n) = nodelib_getlist(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case rule_node:
- switch (field) {
- case 2: /* dummy subtype */ break;
- case 4: width(n) = lua_tointeger(L,3); break;
- case 5: depth(n) = lua_tointeger(L,3); break;
- case 6: height(n) = lua_tointeger(L,3); break;
- case 7: rule_dir(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case ins_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: float_cost(n) = lua_tointeger(L,3); break;
- case 5: depth(n) = lua_tointeger(L,3); break;
- case 6: height(n) = lua_tointeger(L,3); break;
- case 7: split_top_ptr(n) = nodelib_getspec(L,3); break;
- case 8: ins_ptr(n) = nodelib_getlist(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case mark_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: mark_class(n) = lua_tointeger(L,3); break;
- case 5: mark_ptr(n) = nodelib_gettoks(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case adjust_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: adjust_ptr(n) = nodelib_getlist(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case disc_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: set_disc_field(pre_break(n),nodelib_getlist(L,3)); break;
- case 5: set_disc_field(post_break(n),nodelib_getlist(L,3)); break;
- case 6: set_disc_field(no_break(n),nodelib_getlist(L,3)); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case math_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: surround(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case glue_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: glue_ptr(n) = nodelib_getspec(L,3); break;
- case 5: leader_ptr(n) = nodelib_getlist(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case glue_spec_node:
- switch (field) {
- case 2: /* dummy subtype */ break;
- case 3: width(n) = lua_tointeger(L,3); break;
- case 4: stretch(n) = lua_tointeger(L,3); break;
- case 5: shrink(n) = lua_tointeger(L,3); break;
- case 6: stretch_order(n) = lua_tointeger(L,3); break;
- case 7: shrink_order(n) = lua_tointeger(L,3); break;
- case 8: glue_ref_count(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case kern_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 4: width(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case penalty_node:
- switch (field) {
- case 2: /* dummy subtype */ break;
- case 4: penalty(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case action_node:
- switch (field) {
- case 2: /* dummy subtype */ break;
- case 3: pdf_action_type(n) = lua_tointeger(L,3); break;
- case 4: pdf_action_named_id(n) = lua_tointeger(L,3); break;
- case 5: if (pdf_action_named_id(n)==1) {
- pdf_action_id(n) = nodelib_gettoks(L,3);
- } else {
- pdf_action_id(n) = lua_tointeger(L,3);
- } break;
- case 6: pdf_action_file(n) = nodelib_gettoks(L,3); break;
- case 7: pdf_action_new_window(n) = lua_tointeger(L,3); break;
- case 8: pdf_action_tokens(n) = nodelib_gettoks(L,3); break;
- case 9: pdf_action_refcount(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case margin_kern_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 3: width(n) = lua_tointeger(L,3); break;
- case 4: margin_char(n) = nodelib_getlist(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case inserting_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 3: last_ins_ptr(n) = nodelib_getlist(L,3); break;
- case 4: best_ins_ptr(n) = nodelib_getlist(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case split_up_node:
- switch (field) {
- case 2: subtype(n) = lua_tointeger(L,3); break;
- case 3: last_ins_ptr(n) = nodelib_getlist(L,3); break;
- case 4: best_ins_ptr(n) = nodelib_getlist(L,3); break;
- case 5: broken_ptr(n) = nodelib_getlist(L,3); break;
- case 6: broken_ins(n) = nodelib_getlist(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case attribute_list_node:
- switch (field) {
- case 2: /* dummy subtype */ break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case attribute_node:
- switch (field) {
- case 2: /* dummy subtype */ break;
- case 3: attribute_id(n) = lua_tointeger(L,3); break;
- case 4: attribute_value(n) = lua_tointeger(L,3); break;
- default: return nodelib_cantset(L,field,n);
- }
- break;
- case whatsit_node:
- lua_nodelib_setfield_whatsit(L,n,field);
- break;
- default:
- /* do nothing */
- break;
+static int lua_nodelib_setfield(lua_State * L)
+{
+ register halfword n;
+ register int field;
+ n = *((halfword *) lua_touserdata(L, 1));
+ field = get_valid_node_field_id(L, 2, n);
+ if (field < -1)
+ return 0;
+ if (field == 0) {
+ vlink(n) = nodelib_getlist(L, 3);
+ } else if (field == -1) {
+ alink(n) = nodelib_getlist(L, 3);
+ } else if (field == 3 && nodetype_has_attributes(type(n))) {
+ nodelib_setattr(L, 3, n);
+ } else if (type(n) == glyph_node) {
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ character(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ font(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ set_char_lang(n, lua_tointeger(L, 3));
+ break;
+ case 7:
+ set_char_lhmin(n, lua_tointeger(L, 3));
+ break;
+ case 8:
+ set_char_rhmin(n, lua_tointeger(L, 3));
+ break;
+ case 9:
+ set_char_uchyph(n, lua_tointeger(L, 3));
+ break;
+ case 10:
+ lig_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ case 11:
+ x_displace(n) = lua_tointeger(L, 3);
+ break;
+ case 12:
+ y_displace(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ } else {
+ switch (type(n)) {
+ case hlist_node:
+ case vlist_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ depth(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ height(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ box_dir(n) = nodelib_getdir(L, 3);
+ break;
+ case 8:
+ shift_amount(n) = lua_tointeger(L, 3);
+ break;
+ case 9:
+ glue_order(n) = lua_tointeger(L, 3);
+ break;
+ case 10:
+ glue_sign(n) = lua_tointeger(L, 3);
+ break;
+ case 11:
+ glue_set(n) = (double) lua_tonumber(L, 3);
+ break;
+ case 12:
+ list_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case unset_node:
+ switch (field) {
+ case 2: /* dummy subtype */
+ break;
+ case 4:
+ width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ depth(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ height(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ box_dir(n) = lua_tointeger(L, 3);
+ break;
+ case 8:
+ glue_shrink(n) = lua_tointeger(L, 3);
+ break;
+ case 9:
+ glue_order(n) = lua_tointeger(L, 3);
+ break;
+ case 10:
+ glue_sign(n) = lua_tointeger(L, 3);
+ break;
+ case 11:
+ glue_stretch(n) = lua_tointeger(L, 3);
+ break;
+ case 12:
+ span_count(n) = lua_tointeger(L, 3);
+ break;
+ case 13:
+ list_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case rule_node:
+ switch (field) {
+ case 2: /* dummy subtype */
+ break;
+ case 4:
+ width(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ depth(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ height(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ rule_dir(n) = nodelib_getdir(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case ins_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ float_cost(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ depth(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ height(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ split_top_ptr(n) = nodelib_getspec(L, 3);
+ break;
+ case 8:
+ ins_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case mark_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ mark_class(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ mark_ptr(n) = nodelib_gettoks(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case adjust_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ adjust_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case disc_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ set_disc_field(pre_break(n), nodelib_getlist(L, 3));
+ break;
+ case 5:
+ set_disc_field(post_break(n), nodelib_getlist(L, 3));
+ break;
+ case 6:
+ set_disc_field(no_break(n), nodelib_getlist(L, 3));
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case math_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ surround(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case glue_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ glue_ptr(n) = nodelib_getspec(L, 3);
+ break;
+ case 5:
+ leader_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case glue_spec_node:
+ switch (field) {
+ case 2: /* dummy subtype */
+ break;
+ case 3:
+ width(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ stretch(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ shrink(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ stretch_order(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ shrink_order(n) = lua_tointeger(L, 3);
+ break;
+ case 8:
+ glue_ref_count(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case kern_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ width(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case penalty_node:
+ switch (field) {
+ case 2: /* dummy subtype */
+ break;
+ case 4:
+ penalty(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case action_node:
+ switch (field) {
+ case 2: /* dummy subtype */
+ break;
+ case 3:
+ pdf_action_type(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ pdf_action_named_id(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ if (pdf_action_named_id(n) == 1) {
+ pdf_action_id(n) = nodelib_gettoks(L, 3);
+ } else {
+ pdf_action_id(n) = lua_tointeger(L, 3);
+ }
+ break;
+ case 6:
+ pdf_action_file(n) = nodelib_gettoks(L, 3);
+ break;
+ case 7:
+ pdf_action_new_window(n) = lua_tointeger(L, 3);
+ break;
+ case 8:
+ pdf_action_tokens(n) = nodelib_gettoks(L, 3);
+ break;
+ case 9:
+ pdf_action_refcount(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case style_node:
+ switch (field) {
+ case 2: /* dummy subtype */
+ break;
+ case 4:
+ subtype(n) = luaL_checkoption(L, 3, "text", math_style_names);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case choice_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ display_mlist(n) = nodelib_getlist(L, 3);
+ break;
+ case 5:
+ text_mlist(n) = nodelib_getlist(L, 3);
+ break;
+ case 6:
+ script_mlist(n) = nodelib_getlist(L, 3);
+ break;
+ case 7:
+ script_script_mlist(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case ord_noad:
+ case op_noad:
+ case bin_noad:
+ case rel_noad:
+ case open_noad:
+ case close_noad:
+ case punct_noad:
+ case inner_noad:
+ case under_noad:
+ case over_noad:
+ case vcenter_noad:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ nucleus(n) = nodelib_getlist(L, 3);
+ break;
+ case 5:
+ subscr(n) = nodelib_getlist(L, 3);
+ break;
+ case 6:
+ supscr(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case radical_noad:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ nucleus(n) = nodelib_getlist(L, 3);
+ break;
+ case 5:
+ subscr(n) = nodelib_getlist(L, 3);
+ break;
+ case 6:
+ supscr(n) = nodelib_getlist(L, 3);
+ break;
+ case 7:
+ left_delimiter(n) = nodelib_getlist(L, 3);
+ break;
+ case 8:
+ degree(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case fraction_noad:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ thickness(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ numerator(n) = nodelib_getlist(L, 3);
+ break;
+ case 6:
+ denominator(n) = nodelib_getlist(L, 3);
+ break;
+ case 7:
+ left_delimiter(n) = nodelib_getlist(L, 3);
+ break;
+ case 8:
+ right_delimiter(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case accent_noad:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ nucleus(n) = nodelib_getlist(L, 3);
+ break;
+ case 5:
+ subscr(n) = nodelib_getlist(L, 3);
+ break;
+ case 6:
+ supscr(n) = nodelib_getlist(L, 3);
+ break;
+ case 7:
+ accent_chr(n) = nodelib_getlist(L, 3);
+ break;
+ case 8:
+ bot_accent_chr(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case fence_noad:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ delimiter(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case math_char_node:
+ case math_text_char_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ math_fam(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ math_character(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case sub_box_node:
+ case sub_mlist_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ math_list(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case delim_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ small_fam(n) = lua_tointeger(L, 3);
+ break;
+ case 5:
+ small_char(n) = lua_tointeger(L, 3);
+ break;
+ case 6:
+ large_fam(n) = lua_tointeger(L, 3);
+ break;
+ case 7:
+ large_char(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case margin_kern_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 3:
+ width(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ margin_char(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case inserting_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 3:
+ last_ins_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ case 4:
+ best_ins_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case split_up_node:
+ switch (field) {
+ case 2:
+ subtype(n) = lua_tointeger(L, 3);
+ break;
+ case 3:
+ last_ins_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ case 4:
+ best_ins_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ case 5:
+ broken_ptr(n) = nodelib_getlist(L, 3);
+ break;
+ case 6:
+ broken_ins(n) = nodelib_getlist(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case attribute_list_node:
+ switch (field) {
+ case 2: /* dummy subtype */
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case attribute_node:
+ switch (field) {
+ case 2: /* dummy subtype */
+ break;
+ case 3:
+ attribute_id(n) = lua_tointeger(L, 3);
+ break;
+ case 4:
+ attribute_value(n) = lua_tointeger(L, 3);
+ break;
+ default:
+ return nodelib_cantset(L, field, n);
+ }
+ break;
+ case whatsit_node:
+ lua_nodelib_setfield_whatsit(L, n, field);
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
}
- }
- return 0;
+ return 0;
}
-static int
-lua_nodelib_print (lua_State *L) {
- char *msg;
- char a[7] = {' ',' ',' ', 'n', 'i', 'l', 0};
- char v[7] = {' ',' ',' ', 'n', 'i', 'l', 0};
- halfword *n;
- n = check_isnode(L,1);
- msg = xmalloc(256);
- if (alink(*n)!=null)
- snprintf(a,7,"%6d",(int)alink(*n));
- if (vlink(*n)!=null)
- snprintf(v,7,"%6d",(int)vlink(*n));
- snprintf(msg,255,"<node %s < %6d > %s : %s %d>", a, (int)*n, v, node_data[type(*n)].name, subtype(*n));
- lua_pushstring(L,msg);
- free(msg);
- return 1;
+static int lua_nodelib_print(lua_State * L)
+{
+ char *msg;
+ char a[7] = { ' ', ' ', ' ', 'n', 'i', 'l', 0 };
+ char v[7] = { ' ', ' ', ' ', 'n', 'i', 'l', 0 };
+ halfword *n;
+ n = check_isnode(L, 1);
+ msg = xmalloc(256);
+ if (alink(*n) != null)
+ snprintf(a, 7, "%6d", (int) alink(*n));
+ if (vlink(*n) != null)
+ snprintf(v, 7, "%6d", (int) vlink(*n));
+ snprintf(msg, 255, "<node %s < %6d > %s : %s %d>", a, (int) *n, v,
+ node_data[type(*n)].name, subtype(*n));
+ lua_pushstring(L, msg);
+ free(msg);
+ return 1;
}
-static int
-lua_nodelib_equal (lua_State *L) {
- halfword n, m;
- n = *(check_isnode(L,1));
- m = *(check_isnode(L,2));
- lua_pushboolean(L,(n==m));
- return 1;
-}
-
-static int
-font_tex_ligaturing (lua_State *L) {
- /* on the stack are two nodes and a direction */
- halfword tmp_head;
- halfword *h;
- halfword t =null;
- if (lua_gettop(L)<1) {
- lua_pushnil(L);
- lua_pushboolean(L,0);
- return 2;
- }
- h = check_isnode(L,1);
- if (lua_gettop(L)>1) {
- t = *(check_isnode(L,2));
- }
- tmp_head = new_node(nesting_node,1);
- couple_nodes(tmp_head,*h);
- tlink(tmp_head)=t;
- t = handle_ligaturing(tmp_head,t);
- lua_pushnumber(L,vlink(tmp_head));
- flush_node(tmp_head);
- lua_nodelib_push(L);
- lua_pushnumber(L,t);
- lua_nodelib_push(L);
- lua_pushboolean(L,1);
- return 3;
-}
-
-static int
-font_tex_kerning (lua_State *L) {
- /* on the stack are two nodes and a direction */
-
- halfword tmp_head;
- halfword *h;
- halfword t =null;
- if (lua_gettop(L)<1) {
- lua_pushnil(L);
- lua_pushboolean(L,0);
- return 2;
- }
- h = check_isnode(L,1);
- if (lua_gettop(L)>1) {
- t = *(check_isnode(L,2));
- }
- tmp_head = new_node(nesting_node,1);
- couple_nodes(tmp_head,*h);
- tlink(tmp_head)=t;
- t = handle_kerning(tmp_head,t);
- lua_pushnumber(L,vlink(tmp_head));
- flush_node(tmp_head);
- lua_nodelib_push(L);
- lua_pushnumber(L,t);
- lua_nodelib_push(L);
- lua_pushboolean(L,1);
- return 3;
+static int lua_nodelib_equal(lua_State * L)
+{
+ register halfword n, m;
+ n = *((halfword *) lua_touserdata(L, 1));
+ m = *((halfword *) lua_touserdata(L, 2));
+ lua_pushboolean(L, (n == m));
+ return 1;
}
-static int
-lua_nodelib_protect_glyphs (lua_State *L) {
- int t = 0;
- halfword head = *(check_isnode(L,1));
- while (head!=null) {
- if (type(head)==glyph_node) {
- register int s = subtype(head);
- if (s<256) {
- t = 1;
- subtype(head) = ((s&0xFE) << 8);
- }
- }
- head = vlink(head);
- }
- lua_pushboolean(L,t);
- lua_pushvalue(L,1);
- return 2;
+static int font_tex_ligaturing(lua_State * L)
+{
+ /* on the stack are two nodes and a direction */
+ halfword tmp_head;
+ halfword *h;
+ halfword t = null;
+ if (lua_gettop(L) < 1) {
+ lua_pushnil(L);
+ lua_pushboolean(L, 0);
+ return 2;
+ }
+ h = check_isnode(L, 1);
+ if (lua_gettop(L) > 1) {
+ t = *(check_isnode(L, 2));
+ }
+ tmp_head = new_node(nesting_node, 1);
+ couple_nodes(tmp_head, *h);
+ tlink(tmp_head) = t;
+ t = handle_ligaturing(tmp_head, t);
+ lua_pushnumber(L, vlink(tmp_head));
+ flush_node(tmp_head);
+ lua_nodelib_push(L);
+ lua_pushnumber(L, t);
+ lua_nodelib_push(L);
+ lua_pushboolean(L, 1);
+ return 3;
}
-static int
-lua_nodelib_unprotect_glyphs (lua_State *L) {
- int t = 0;
- halfword head = *(check_isnode(L,1));
- while (head!=null) {
- if (type(head)==glyph_node) {
- register int s = subtype(head);
- if (s>=256) {
- t = 1;
- subtype(head) = (s >> 8);
- }
- }
- head = vlink(head);
- }
- lua_pushboolean(L,t);
- lua_pushvalue(L,1);
- return 2;
+static int font_tex_kerning(lua_State * L)
+{
+ /* on the stack are two nodes and a direction */
+
+ halfword tmp_head;
+ halfword *h;
+ halfword t = null;
+ if (lua_gettop(L) < 1) {
+ lua_pushnil(L);
+ lua_pushboolean(L, 0);
+ return 2;
+ }
+ h = check_isnode(L, 1);
+ if (lua_gettop(L) > 1) {
+ t = *(check_isnode(L, 2));
+ }
+ tmp_head = new_node(nesting_node, 1);
+ couple_nodes(tmp_head, *h);
+ tlink(tmp_head) = t;
+ t = handle_kerning(tmp_head, t);
+ lua_pushnumber(L, vlink(tmp_head));
+ flush_node(tmp_head);
+ lua_nodelib_push(L);
+ lua_pushnumber(L, t);
+ lua_nodelib_push(L);
+ lua_pushboolean(L, 1);
+ return 3;
}
+static int lua_nodelib_protect_glyphs(lua_State * L)
+{
+ int t = 0;
+ halfword head = *(check_isnode(L, 1));
+ while (head != null) {
+ if (type(head) == glyph_node) {
+ register int s = subtype(head);
+ if (s <= 256) {
+ t = 1;
+ subtype(head) = (s == 1 ? 256 : 256 + s);
+ }
+ }
+ head = vlink(head);
+ }
+ lua_pushboolean(L, t);
+ lua_pushvalue(L, 1);
+ return 2;
+}
-static int
-lua_nodelib_first_character (lua_State *L) {
- /* on the stack are two nodes and a direction */
- halfword h, savetail = null, t = null;
- if (lua_gettop(L)<1) {
- lua_pushnil(L);
- lua_pushboolean(L,0);
+static int lua_nodelib_unprotect_glyphs(lua_State * L)
+{
+ int t = 0;
+ halfword head = *(check_isnode(L, 1));
+ while (head != null) {
+ if (type(head) == glyph_node) {
+ register int s = subtype(head);
+ if (s > 256) {
+ t = 1;
+ subtype(head) = s - 256;
+ }
+ }
+ head = vlink(head);
+ }
+ lua_pushboolean(L, t);
+ lua_pushvalue(L, 1);
+ return 2;
+}
+
+
+static int lua_nodelib_first_character(lua_State * L)
+{
+ /* on the stack are two nodes and a direction */
+ halfword h, savetail = null, t = null;
+ if (lua_gettop(L) < 1) {
+ lua_pushnil(L);
+ lua_pushboolean(L, 0);
+ return 2;
+ }
+ h = *(check_isnode(L, 1));
+ if (lua_gettop(L) > 1) {
+ t = *(check_isnode(L, 2));
+ savetail = vlink(t);
+ vlink(t) = null;
+ }
+ while (h != null && !is_simple_character(h)) {
+ h = vlink(h);
+ }
+ if (savetail != null) {
+ vlink(t) = savetail;
+ }
+ lua_pushnumber(L, h);
+ lua_nodelib_push(L);
+ lua_pushboolean(L, (h == null ? 0 : 1));
return 2;
- }
- h = *(check_isnode(L,1));
- if (lua_gettop(L)>1) {
- t = *(check_isnode(L,2));
- savetail = vlink(t);
- vlink(t) = null;
- }
- while (h!=null && !is_simple_character(h)) {
- h = vlink(h);
- }
- if (savetail!=null) { vlink(t) = savetail; }
- lua_pushnumber(L,h);
- lua_nodelib_push(L);
- lua_pushboolean(L,(h==null? 0 : 1));
- return 2;
}
/* this is too simplistic, but it helps Hans to get going */
-halfword
-do_ligature_n (halfword prev, halfword stop, halfword lig) {
- vlink(lig) = vlink(stop);
- vlink(stop) = null;
- lig_ptr(lig) = vlink(prev);
- vlink(prev) = lig;
- return lig;
+halfword do_ligature_n(halfword prev, halfword stop, halfword lig)
+{
+ vlink(lig) = vlink(stop);
+ vlink(stop) = null;
+ lig_ptr(lig) = vlink(prev);
+ vlink(prev) = lig;
+ return lig;
}
/* node.do_ligature_n(node prev, node last, node lig) */
-static int
-lua_nodelib_do_ligature_n (lua_State *L) {
- halfword n, m, o, p, tmp_head;
- n = *(check_isnode(L,1));
- m = *(check_isnode(L,2));
- o = *(check_isnode(L,3));
- if (alink(n)==null || vlink(alink(n))!=n) {
- tmp_head = new_node(temp_node,0);
- couple_nodes(tmp_head,n);
- p = do_ligature_n(tmp_head,m,o);
- flush_node(tmp_head);
- } else {
- p = do_ligature_n(alink(n),m,o);
- }
- lua_pushnumber(L,p);
- lua_nodelib_push(L);
- return 1;
+static int lua_nodelib_do_ligature_n(lua_State * L)
+{
+ halfword n, m, o, p, tmp_head;
+ n = *(check_isnode(L, 1));
+ m = *(check_isnode(L, 2));
+ o = *(check_isnode(L, 3));
+ if (alink(n) == null || vlink(alink(n)) != n) {
+ tmp_head = new_node(temp_node, 0);
+ couple_nodes(tmp_head, n);
+ p = do_ligature_n(tmp_head, m, o);
+ flush_node(tmp_head);
+ } else {
+ p = do_ligature_n(alink(n), m, o);
+ }
+ lua_pushnumber(L, p);
+ lua_nodelib_push(L);
+ return 1;
}
-extern halfword list_node_mem_usage (void) ;
+extern halfword list_node_mem_usage(void);
-static int
-lua_nodelib_usedlist (lua_State *L) {
- lua_pushnumber(L,list_node_mem_usage());
- lua_nodelib_push(L);
- return 1;
-}
-
-
-static const struct luaL_reg nodelib_f [] = {
- {"id", lua_nodelib_id},
- {"subtype", lua_nodelib_subtype},
- {"type", lua_nodelib_type},
- {"new", lua_nodelib_new},
- {"length", lua_nodelib_length},
- {"count", lua_nodelib_count},
- {"traverse", lua_nodelib_traverse},
- {"traverse_id", lua_nodelib_traverse_filtered},
- {"slide", lua_nodelib_tail},
- {"types", lua_nodelib_types},
- {"whatsits", lua_nodelib_whatsits},
- {"fields", lua_nodelib_fields},
- {"has_field", lua_nodelib_has_field},
- {"free", lua_nodelib_free},
- {"flush_list", lua_nodelib_flush_list},
- {"remove", lua_nodelib_remove},
- {"insert_before", lua_nodelib_insert_before},
- {"insert_after", lua_nodelib_insert_after},
- {"write", lua_nodelib_append},
- {"last_node", lua_nodelib_last_node},
- {"copy", lua_nodelib_copy},
- {"copy_list", lua_nodelib_copy_list},
- {"hpack", lua_nodelib_hpack},
- {"has_attribute", lua_nodelib_has_attribute},
- {"set_attribute", lua_nodelib_set_attribute},
- {"unset_attribute", lua_nodelib_unset_attribute},
- {"do_ligature_n", lua_nodelib_do_ligature_n},
- {"ligaturing", font_tex_ligaturing},
- {"kerning", font_tex_kerning},
- {"first_character", lua_nodelib_first_character},
- {"usedlist", lua_nodelib_usedlist},
- {"protect_glyphs", lua_nodelib_protect_glyphs},
- {"unprotect_glyphs", lua_nodelib_unprotect_glyphs},
- {NULL, NULL} /* sentinel */
+static int lua_nodelib_usedlist(lua_State * L)
+{
+ lua_pushnumber(L, list_node_mem_usage());
+ lua_nodelib_push(L);
+ return 1;
+}
+
+
+static const struct luaL_reg nodelib_f[] = {
+ {"id", lua_nodelib_id},
+ {"subtype", lua_nodelib_subtype},
+ {"type", lua_nodelib_type},
+ {"new", lua_nodelib_new},
+ {"length", lua_nodelib_length},
+ {"count", lua_nodelib_count},
+ {"traverse", lua_nodelib_traverse},
+ {"traverse_id", lua_nodelib_traverse_filtered},
+ {"slide", lua_nodelib_tail},
+ {"types", lua_nodelib_types},
+ {"whatsits", lua_nodelib_whatsits},
+ {"fields", lua_nodelib_fields},
+ {"has_field", lua_nodelib_has_field},
+ {"free", lua_nodelib_free},
+ {"flush_list", lua_nodelib_flush_list},
+ {"remove", lua_nodelib_remove},
+ {"insert_before", lua_nodelib_insert_before},
+ {"insert_after", lua_nodelib_insert_after},
+ {"write", lua_nodelib_append},
+ {"last_node", lua_nodelib_last_node},
+ {"copy", lua_nodelib_copy},
+ {"copy_list", lua_nodelib_copy_list},
+ {"hpack", lua_nodelib_hpack},
+ {"vpack", lua_nodelib_vpack},
+ {"mlist_to_hlist", lua_nodelib_mlist_to_hlist},
+ {"family_font", lua_nodelib_mfont},
+ {"has_attribute", lua_nodelib_has_attribute},
+ {"set_attribute", lua_nodelib_set_attribute},
+ {"unset_attribute", lua_nodelib_unset_attribute},
+ {"do_ligature_n", lua_nodelib_do_ligature_n},
+ {"ligaturing", font_tex_ligaturing},
+ {"kerning", font_tex_kerning},
+ {"first_character", lua_nodelib_first_character},
+ {"usedlist", lua_nodelib_usedlist},
+ {"protect_glyphs", lua_nodelib_protect_glyphs},
+ {"unprotect_glyphs", lua_nodelib_unprotect_glyphs},
+ {NULL, NULL} /* sentinel */
};
-static const struct luaL_reg nodelib_m [] = {
- {"__index", lua_nodelib_getfield},
- {"__newindex", lua_nodelib_setfield},
- {"__tostring", lua_nodelib_print},
- {"__eq", lua_nodelib_equal},
- {NULL, NULL} /* sentinel */
+static const struct luaL_reg nodelib_m[] = {
+ {"__index", lua_nodelib_getfield},
+ {"__newindex", lua_nodelib_setfield},
+ {"__tostring", lua_nodelib_print},
+ {"__eq", lua_nodelib_equal},
+ {NULL, NULL} /* sentinel */
};
-int
-luaopen_node (lua_State *L)
+int luaopen_node(lua_State * L)
{
- luaL_newmetatable(L,NODE_METATABLE);
- luaL_register(L, NULL, nodelib_m);
- luaL_register(L, "node", nodelib_f);
- init_luaS_index(luatex_node);
- initialize_luaS_indexes(L);
- return 1;
+ luaL_newmetatable(L, NODE_METATABLE);
+ luaL_register(L, NULL, nodelib_m);
+ luaL_register(L, "node", nodelib_f);
+ init_luaS_index(luatex_node);
+ initialize_luaS_indexes(L);
+ return 1;
}
-void
-nodelist_to_lua (lua_State *L, int n) {
- lua_pushnumber(L,n);
- lua_nodelib_push(L);
+void nodelist_to_lua(lua_State * L, int n)
+{
+ lua_pushnumber(L, n);
+ lua_nodelib_push(L);
}
-int
-nodelist_from_lua (lua_State *L) {
- halfword *n;
- if (lua_isnil(L,-1))
- return null;
- n = check_isnode(L,-1);
- return *n;
+int nodelist_from_lua(lua_State * L)
+{
+ halfword *n;
+ if (lua_isnil(L, -1))
+ return null;
+ n = check_isnode(L, -1);
+ return *n;
}
-