1 /*@z04.c:Token Service:NewToken(), CopyTokenList()@***************************/
2 /* */
3 /* THE LOUT DOCUMENT FORMATTING SYSTEM (VERSION 3.39) */
4 /* COPYRIGHT (C) 1991, 2008 Jeffrey H. Kingston */
5 /* */
6 /* Jeffrey H. Kingston (jeff@it.usyd.edu.au) */
7 /* School of Information Technologies */
8 /* The University of Sydney 2006 */
9 /* AUSTRALIA */
10 /* */
11 /* This program is free software; you can redistribute it and/or modify */
12 /* it under the terms of the GNU General Public License as published by */
13 /* the Free Software Foundation; either Version 3, or (at your option) */
14 /* any later version. */
15 /* */
16 /* This program is distributed in the hope that it will be useful, */
17 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
18 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
19 /* GNU General Public License for more details. */
20 /* */
21 /* You should have received a copy of the GNU General Public License */
22 /* along with this program; if not, write to the Free Software */
23 /* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA */
24 /* */
25 /* FILE: z04.c */
26 /* MODULE: Token Service */
27 /* EXTERNS: NewToken(), CopyTokenList(), EchoCatOp(), EchoToken() */
28 /* */
29 /*****************************************************************************/
30 #include "externs.h"
31
32
33 /*****************************************************************************/
34 /* */
35 /* OBJECT NewToken(xtype, xfpos, xvspace, xhspace, xprec, xactual) */
36 /* */
37 /* Returns a new non-WORD token initialised as the parameters indicate. */
38 /* */
39 /*****************************************************************************/
40
NewToken(unsigned char xtype,FILE_POS * xfpos,unsigned char xvspace,unsigned char xhspace,unsigned char xprec,OBJECT xactual)41 OBJECT NewToken(unsigned char xtype, FILE_POS *xfpos, unsigned char xvspace,
42 unsigned char xhspace, unsigned char xprec, OBJECT xactual)
43 { OBJECT res;
44 debug1(DTS, DDD, "NewToken(%s, ...)", Image(xtype));
45 New(res, xtype); FposCopy(fpos(res), *xfpos);
46 vspace(res) = xvspace; hspace(res) = xhspace;
47 precedence(res) = xprec; actual(res) = xactual;
48 debug1(DTS, DDD, "NewToken returning %s", EchoToken(res));
49 return res;
50 } /* end NewToken */
51
52
53 /*****************************************************************************/
54 /* */
55 /* OBJECT CopyTokenList(x, pos) */
56 /* */
57 /* Returns a copy of the list of tokens pointed to by x. */
58 /* All file positions in the copy are set to *pos. */
59 /* */
60 /*****************************************************************************/
61
CopyTokenList(OBJECT x,FILE_POS * pos)62 OBJECT CopyTokenList(OBJECT x, FILE_POS *pos)
63 { OBJECT y, z, res;
64 res = nilobj; y = x;
65 if( x != nilobj ) do
66 { if( is_word(type(y)) )
67 { z = MakeWord(type(y), string(y), pos);
68 vspace(z) = vspace(y); hspace(z) = hspace(y);
69 }
70 else z = NewToken(type(y), pos,vspace(y),hspace(y),precedence(y),actual(y));
71 res = Append(res, z, PARENT);
72 y = succ(y, PARENT);
73 } while( y != x );
74 return res;
75 } /* end CopyTokenList */
76
77 /*@::EchoCatOp(), EchoToken()@************************************************/
78 /* */
79 /* FULL_CHAR *EchoCatOp(xtype, xmark, xjoin) */
80 /* */
81 /* Return the catenation operator with this type, mark and join. */
82 /* */
83 /*****************************************************************************/
84
EchoCatOp(unsigned xtype,BOOLEAN xmark,BOOLEAN xjoin)85 FULL_CHAR *EchoCatOp(unsigned xtype, BOOLEAN xmark, BOOLEAN xjoin)
86 { switch( xtype )
87 {
88 case VCAT: return (xmark ? xjoin ? KW_VCAT_MJ : KW_VCAT_MN
89 : xjoin ? KW_VCAT_NJ : KW_VCAT_NN);
90
91 case HCAT: return (xmark ? xjoin ? KW_HCAT_MJ : KW_HCAT_MN
92 : xjoin ? KW_HCAT_NJ : KW_HCAT_NN);
93
94 case ACAT: return (xmark ? xjoin ? KW_ACAT_MJ : AsciiToFull("??")
95 : xjoin ? KW_ACAT_NJ : AsciiToFull("??") );
96
97 default: assert(FALSE, "EchoCatOp");
98 return STR_EMPTY;
99
100 } /* end switch */
101 } /* end EchoCatOp */
102
103
104 #if DEBUG_ON
105 /*****************************************************************************/
106 /* */
107 /* FULL_CHAR *EchoToken(x) */
108 /* */
109 /* Return an image of token x. Do not worry about preceding space. */
110 /* */
111 /*****************************************************************************/
112
EchoToken(OBJECT x)113 FULL_CHAR *EchoToken(OBJECT x)
114 { switch( type(x) )
115 {
116 case WORD:
117
118 return string(x);
119
120
121 case QWORD:
122
123 return StringQuotedWord(x);
124
125
126 case TSPACE:
127 case TJUXTA:
128 case USE:
129 case NOT_REVEALED:
130 case GSTUB_EXT:
131 case GSTUB_INT:
132 case GSTUB_NONE:
133
134 return Image(type(x));
135
136
137 case UNEXPECTED_EOF:
138 case BEGIN:
139 case END:
140 case ENV:
141 case ENVA:
142 case ENVB:
143 case ENVC:
144 case ENVD:
145 case CENV:
146 case CLOS:
147 case LBR:
148 case RBR:
149 case NULL_CLOS:
150 case PAGE_LABEL:
151 case CROSS:
152 case FORCE_CROSS:
153 case BEGIN_HEADER:
154 case END_HEADER:
155 case SET_HEADER:
156 case CLEAR_HEADER:
157 case ONE_COL:
158 case ONE_ROW:
159 case WIDE:
160 case HIGH:
161 case HSHIFT:
162 case VSHIFT:
163 case HMIRROR:
164 case VMIRROR:
165 case HSCALE:
166 case VSCALE:
167 case HCOVER:
168 case VCOVER:
169 case SCALE:
170 case KERN_SHRINK:
171 case HCONTRACT:
172 case VCONTRACT:
173 case HLIMITED:
174 case VLIMITED:
175 case HEXPAND:
176 case VEXPAND:
177 case START_HVSPAN:
178 case START_HSPAN:
179 case START_VSPAN:
180 case HSPAN:
181 case VSPAN:
182 case PADJUST:
183 case HADJUST:
184 case VADJUST:
185 case ROTATE:
186 case BACKGROUND:
187 case VERBATIM:
188 case RAW_VERBATIM:
189 case CASE:
190 case YIELD:
191 case BACKEND:
192 case XCHAR:
193 case FONT:
194 case SPACE:
195 case YUNIT:
196 case ZUNIT:
197 case SET_CONTEXT:
198 case GET_CONTEXT:
199 case BREAK:
200 case UNDERLINE:
201 case UNDERLINE_COLOUR:
202 case COLOUR:
203 case TEXTURE:
204 case OUTLINE:
205 case LANGUAGE:
206 case CURR_LANG:
207 case CURR_FAMILY:
208 case CURR_FACE:
209 case CURR_YUNIT:
210 case CURR_ZUNIT:
211 case COMMON:
212 case RUMP:
213 case MELD:
214 case INSERT:
215 case ONE_OF:
216 case NEXT:
217 case PLUS:
218 case MINUS:
219 case OPEN:
220 case TAGGED:
221 case INCGRAPHIC:
222 case SINCGRAPHIC:
223 case PLAIN_GRAPHIC:
224 case GRAPHIC:
225 case LINK_SOURCE:
226 case LINK_DEST:
227 case LINK_DEST_NULL:
228 case LINK_URL:
229 case ACAT:
230 case HCAT:
231 case VCAT:
232 case CLOSURE:
233 case PREPEND:
234 case SYS_PREPEND:
235 case INCG_REPEATED:
236 case SINCG_REPEATED:
237 case DATABASE:
238 case SYS_DATABASE:
239 case LUSE:
240 case LEO:
241 case LVIS:
242
243 return actual(x) != nilobj ? SymName(actual(x)) : Image(type(x));
244
245
246 default:
247
248 assert1(FALSE, "EchoToken:", Image(type(x)));
249 return STR_EMPTY;
250 }
251 } /* end EchoToken */
252 #endif
253