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