|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
2: /* $Header: node.h,v 2.4 85/08/22 16:05:40 timo Exp $ */
3:
4: /*
5: * B editor -- Parse tree and Focus stack.
6: */
7:
8: /*
9: * Assertion macro.
10: *
11: * This one differs from the one in #include <assert.h> in that it
12: * is usable as an expression operand, e.g. up(ep) || Assert(No).
13: * The function asserr() must unconditionally terminate the program.
14: * If the accumulated __FILE__ data wastes too much of your data
15: * space, omit them and change the code in asserr() that uses them.
16: * You better trust your code then, because unless compiled with "-g"
17: * it's difficult to dig the line number information from the core dump.
18: *
19: * There is also a variant called Abort() which is equivalent to Assert(No).
20: */
21:
22: #ifdef NDEBUG
23: #define Abort() abort() /* Always fail */
24: #define Assert(cond) 0 /* Dummy expression */
25: #else NDEBUG
26: #undef __FILE__
27: #define __FILE__ rcsid
28: #ifndef __LINE__
29: #define __LINE__ 0
30: #endif __LINE__
31: #define Abort() asserr(__FILE__, __LINE__)
32: #define Assert(cond) ((cond) || Abort())
33: #endif NDEBUG
34:
35: typedef struct node *node;
36: typedef struct path *path;
37: typedef int markbits;
38:
39: struct node {
40: char type;
41: char _unused;
42: intlet refcnt;
43: intlet len;
44: markbits n_marks;
45: intlet n_width;
46: intlet n_symbol;
47: node n_child[1];
48: };
49:
50: struct path {
51: char type;
52: char _unused;
53: intlet refcnt;
54: intlet len;
55: path p_parent;
56: node p_tree;
57: intlet p_ichild;
58: intlet p_ycoord;
59: intlet p_xcoord;
60: intlet p_level;
61: markbits p_addmarks;
62: markbits p_delmarks;
63: };
64:
65:
66: #define Nnil ((node) NULL)
67:
68: node newnode();
69:
70: #ifndef NDEBUG
71: #define symbol(n) (Assert(Type(n)==Nod), (n)->n_symbol)
72: #define nchildren(n) (Assert(Type(n)==Nod), Length(n))
73: #define marks(n) (Assert(Type(n)==Nod), (n)->n_marks)
74: #define child(n, i) \
75: (Assert(Type(n)==Nod && (i)>0 && (i)<=Length(n)), (n)->n_child[(i)-1])
76: #define lastchild(n) \
77: (Assert(Type(n)==Nod && Length(n)>0), (n)->n_child[Length(n)-1])
78: #define firstchild(n) \
79: (Assert(Type(n)==Nod && Length(n)>0), (n)->n_child[0])
80: #else NDEBUG
81: #define symbol(n) ((n)->n_symbol)
82: #define nchildren(n) (Length(n))
83: #define marks(n) ((n)->n_marks)
84: #define child(n, i) ((n)->n_child[(i)-1])
85: #define lastchild(n) ((n)->n_child[Length(n)-1])
86: #define firstchild(n) ((n)->n_child[0])
87: #endif NDEBUG
88:
89: #define width(n) (Type(n)==Tex ? Length((value)(n)) : (n)->n_width)
90: #define marked(p, x) (marks(tree(p))&(x))
91:
92: #define Pnil ((path) NULL)
93:
94: path newpath();
95:
96: #define parent(p) ((p)->p_parent)
97: #define tree(p) ((p)->p_tree)
98: #define ichild(p) ((p)->p_ichild)
99:
100: #define Ycoord(p) ((p)->p_ycoord)
101: #define Xcoord(p) ((p)->p_xcoord)
102: #define Level(p) ((p)->p_level)
103:
104: /* Procedure markpath(); */
105: /* Procedure unmkpath(); */
106: /* Procedure replace(); */
107: bool up();
108: bool downi();
109:
110: #define down(n) downi(n, 1)
111:
112: bool downrite();
113: bool left();
114: bool rite();
115: /* Procedure top(); */
116: bool nextnode();
117: /* Procedure firstleaf(); */
118: bool nextleaf();
119: bool prevnode();
120: /* Procedure lastleaf(); */
121: bool prevleaf();
122: bool nextmarked();
123: bool prevmarked();
124:
125: /*
126: * The following are routines for lint, but macros for CC.
127: * This way lint can detect wrong arguments passed.
128: */
129:
130: #ifdef lint
131:
132: node nodecopy();
133: noderelease();
134: nodeuniql();
135:
136: path pathcopy();
137: pathrelease();
138: pathuniql();
139:
140: #else
141:
142: #define nodecopy(n) ((node)copy(n))
143: #define noderelease(n) release(n)
144: #define nodeuniql(pn) uniql(pn)
145:
146: #define pathcopy(p) ((path)copy(p))
147: #define pathrelease(p) release(p)
148: #define pathuniql(pp) uniql(pp)
149:
150: #endif
151:
152: node grab_node();
153: path grab_path();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.