Blame


1 7cf289ca 2004-04-06 devnull #include <u.h>
2 7cf289ca 2004-04-06 devnull #include <libc.h>
3 7cf289ca 2004-04-06 devnull #include <draw.h>
4 7cf289ca 2004-04-06 devnull #include <ctype.h>
5 7cf289ca 2004-04-06 devnull #include <html.h>
6 7cf289ca 2004-04-06 devnull #include "impl.h"
7 7cf289ca 2004-04-06 devnull
8 cbeb0b26 2006-04-01 devnull /* A stack for holding integer values */
9 7cf289ca 2004-04-06 devnull enum {
10 cbeb0b26 2006-04-01 devnull Nestmax = 40 /* max nesting level of lists, font styles, etc. */
11 7cf289ca 2004-04-06 devnull };
12 7cf289ca 2004-04-06 devnull
13 7cf289ca 2004-04-06 devnull struct Stack {
14 cbeb0b26 2006-04-01 devnull int n; /* next available slot (top of stack is stack[n-1]) */
15 cbeb0b26 2006-04-01 devnull int slots[Nestmax]; /* stack entries */
16 7cf289ca 2004-04-06 devnull };
17 7cf289ca 2004-04-06 devnull
18 cbeb0b26 2006-04-01 devnull /* Parsing state */
19 7cf289ca 2004-04-06 devnull struct Pstate
20 7cf289ca 2004-04-06 devnull {
21 cbeb0b26 2006-04-01 devnull Pstate* next; /* in stack of Pstates */
22 cbeb0b26 2006-04-01 devnull int skipping; /* true when we shouldn't add items */
23 cbeb0b26 2006-04-01 devnull int skipwhite; /* true when we should strip leading space */
24 cbeb0b26 2006-04-01 devnull int curfont; /* font index for current font */
25 cbeb0b26 2006-04-01 devnull int curfg; /* current foreground color */
26 cbeb0b26 2006-04-01 devnull Background curbg; /* current background */
27 cbeb0b26 2006-04-01 devnull int curvoff; /* current baseline offset */
28 cbeb0b26 2006-04-01 devnull uchar curul; /* current underline/strike state */
29 cbeb0b26 2006-04-01 devnull uchar curjust; /* current justify state */
30 cbeb0b26 2006-04-01 devnull int curanchor; /* current (href) anchor id (if in one), or 0 */
31 cbeb0b26 2006-04-01 devnull int curstate; /* current value of item state */
32 cbeb0b26 2006-04-01 devnull int literal; /* current literal state */
33 cbeb0b26 2006-04-01 devnull int inpar; /* true when in a paragraph-like construct */
34 cbeb0b26 2006-04-01 devnull int adjsize; /* current font size adjustment */
35 cbeb0b26 2006-04-01 devnull Item* items; /* dummy head of item list we're building */
36 cbeb0b26 2006-04-01 devnull Item* lastit; /* tail of item list we're building */
37 cbeb0b26 2006-04-01 devnull Item* prelastit; /* item before lastit */
38 cbeb0b26 2006-04-01 devnull Stack fntstylestk; /* style stack */
39 cbeb0b26 2006-04-01 devnull Stack fntsizestk; /* size stack */
40 cbeb0b26 2006-04-01 devnull Stack fgstk; /* text color stack */
41 cbeb0b26 2006-04-01 devnull Stack ulstk; /* underline stack */
42 cbeb0b26 2006-04-01 devnull Stack voffstk; /* vertical offset stack */
43 cbeb0b26 2006-04-01 devnull Stack listtypestk; /* list type stack */
44 cbeb0b26 2006-04-01 devnull Stack listcntstk; /* list counter stack */
45 cbeb0b26 2006-04-01 devnull Stack juststk; /* justification stack */
46 cbeb0b26 2006-04-01 devnull Stack hangstk; /* hanging stack */
47 7cf289ca 2004-04-06 devnull };
48 7cf289ca 2004-04-06 devnull
49 7cf289ca 2004-04-06 devnull struct ItemSource
50 7cf289ca 2004-04-06 devnull {
51 7cf289ca 2004-04-06 devnull Docinfo* doc;
52 7cf289ca 2004-04-06 devnull Pstate* psstk;
53 7cf289ca 2004-04-06 devnull int nforms;
54 7cf289ca 2004-04-06 devnull int ntables;
55 7cf289ca 2004-04-06 devnull int nanchors;
56 7cf289ca 2004-04-06 devnull int nframes;
57 7cf289ca 2004-04-06 devnull Form* curform;
58 7cf289ca 2004-04-06 devnull Map* curmap;
59 7cf289ca 2004-04-06 devnull Table* tabstk;
60 7cf289ca 2004-04-06 devnull Kidinfo* kidstk;
61 7cf289ca 2004-04-06 devnull };
62 7cf289ca 2004-04-06 devnull
63 cbeb0b26 2006-04-01 devnull /* Some layout parameters */
64 7cf289ca 2004-04-06 devnull enum {
65 cbeb0b26 2006-04-01 devnull FRKIDMARGIN = 6, /* default margin around kid frames */
66 cbeb0b26 2006-04-01 devnull IMGHSPACE = 0, /* default hspace for images (0 matches IE, Netscape) */
67 cbeb0b26 2006-04-01 devnull IMGVSPACE = 0, /* default vspace for images */
68 cbeb0b26 2006-04-01 devnull FLTIMGHSPACE = 2, /* default hspace for float images */
69 cbeb0b26 2006-04-01 devnull TABSP = 5, /* default cellspacing for tables */
70 cbeb0b26 2006-04-01 devnull TABPAD = 1, /* default cell padding for tables */
71 cbeb0b26 2006-04-01 devnull LISTTAB = 1, /* number of tabs to indent lists */
72 cbeb0b26 2006-04-01 devnull BQTAB = 1, /* number of tabs to indent blockquotes */
73 cbeb0b26 2006-04-01 devnull HRSZ = 2, /* thickness of horizontal rules */
74 cbeb0b26 2006-04-01 devnull SUBOFF = 4, /* vertical offset for subscripts */
75 cbeb0b26 2006-04-01 devnull SUPOFF = 6, /* vertical offset for superscripts */
76 cbeb0b26 2006-04-01 devnull NBSP = 160 /* non-breaking space character */
77 7cf289ca 2004-04-06 devnull };
78 7cf289ca 2004-04-06 devnull
79 cbeb0b26 2006-04-01 devnull /* These tables must be sorted */
80 7cf289ca 2004-04-06 devnull static StringInt *align_tab;
81 7cf289ca 2004-04-06 devnull static AsciiInt _align_tab[] = {
82 7cf289ca 2004-04-06 devnull {"baseline", ALbaseline},
83 7cf289ca 2004-04-06 devnull {"bottom", ALbottom},
84 7cf289ca 2004-04-06 devnull {"center", ALcenter},
85 7cf289ca 2004-04-06 devnull {"char", ALchar},
86 7cf289ca 2004-04-06 devnull {"justify", ALjustify},
87 7cf289ca 2004-04-06 devnull {"left", ALleft},
88 7cf289ca 2004-04-06 devnull {"middle", ALmiddle},
89 7cf289ca 2004-04-06 devnull {"right", ALright},
90 7cf289ca 2004-04-06 devnull {"top", ALtop}
91 7cf289ca 2004-04-06 devnull };
92 3c38dbc0 2005-10-29 devnull #define NALIGNTAB (sizeof(_align_tab)/sizeof(StringInt))
93 7cf289ca 2004-04-06 devnull
94 7cf289ca 2004-04-06 devnull static StringInt *input_tab;
95 7cf289ca 2004-04-06 devnull static AsciiInt _input_tab[] = {
96 7cf289ca 2004-04-06 devnull {"button", Fbutton},
97 7cf289ca 2004-04-06 devnull {"checkbox", Fcheckbox},
98 7cf289ca 2004-04-06 devnull {"file", Ffile},
99 7cf289ca 2004-04-06 devnull {"hidden", Fhidden},
100 7cf289ca 2004-04-06 devnull {"image", Fimage},
101 7cf289ca 2004-04-06 devnull {"password", Fpassword},
102 7cf289ca 2004-04-06 devnull {"radio", Fradio},
103 7cf289ca 2004-04-06 devnull {"reset", Freset},
104 7cf289ca 2004-04-06 devnull {"submit", Fsubmit},
105 7cf289ca 2004-04-06 devnull {"text", Ftext}
106 7cf289ca 2004-04-06 devnull };
107 3c38dbc0 2005-10-29 devnull #define NINPUTTAB (sizeof(_input_tab)/sizeof(StringInt))
108 7cf289ca 2004-04-06 devnull
109 7cf289ca 2004-04-06 devnull static StringInt *clear_tab;
110 7cf289ca 2004-04-06 devnull static AsciiInt _clear_tab[] = {
111 7cf289ca 2004-04-06 devnull {"all", IFcleft|IFcright},
112 7cf289ca 2004-04-06 devnull {"left", IFcleft},
113 7cf289ca 2004-04-06 devnull {"right", IFcright}
114 7cf289ca 2004-04-06 devnull };
115 3c38dbc0 2005-10-29 devnull #define NCLEARTAB (sizeof(_clear_tab)/sizeof(StringInt))
116 7cf289ca 2004-04-06 devnull
117 7cf289ca 2004-04-06 devnull static StringInt *fscroll_tab;
118 7cf289ca 2004-04-06 devnull static AsciiInt _fscroll_tab[] = {
119 7cf289ca 2004-04-06 devnull {"auto", FRhscrollauto|FRvscrollauto},
120 7cf289ca 2004-04-06 devnull {"no", FRnoscroll},
121 7cf289ca 2004-04-06 devnull {"yes", FRhscroll|FRvscroll},
122 7cf289ca 2004-04-06 devnull };
123 3c38dbc0 2005-10-29 devnull #define NFSCROLLTAB (sizeof(_fscroll_tab)/sizeof(StringInt))
124 7cf289ca 2004-04-06 devnull
125 7cf289ca 2004-04-06 devnull static StringInt *shape_tab;
126 7cf289ca 2004-04-06 devnull static AsciiInt _shape_tab[] = {
127 7cf289ca 2004-04-06 devnull {"circ", SHcircle},
128 7cf289ca 2004-04-06 devnull {"circle", SHcircle},
129 7cf289ca 2004-04-06 devnull {"poly", SHpoly},
130 7cf289ca 2004-04-06 devnull {"polygon", SHpoly},
131 7cf289ca 2004-04-06 devnull {"rect", SHrect},
132 7cf289ca 2004-04-06 devnull {"rectangle", SHrect}
133 7cf289ca 2004-04-06 devnull };
134 3c38dbc0 2005-10-29 devnull #define NSHAPETAB (sizeof(_shape_tab)/sizeof(StringInt))
135 7cf289ca 2004-04-06 devnull
136 7cf289ca 2004-04-06 devnull static StringInt *method_tab;
137 7cf289ca 2004-04-06 devnull static AsciiInt _method_tab[] = {
138 7cf289ca 2004-04-06 devnull {"get", HGet},
139 7cf289ca 2004-04-06 devnull {"post", HPost}
140 7cf289ca 2004-04-06 devnull };
141 3c38dbc0 2005-10-29 devnull #define NMETHODTAB (sizeof(_method_tab)/sizeof(StringInt))
142 7cf289ca 2004-04-06 devnull
143 7cf289ca 2004-04-06 devnull static Rune** roman;
144 7cf289ca 2004-04-06 devnull static char* _roman[15]= {
145 7cf289ca 2004-04-06 devnull "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X",
146 7cf289ca 2004-04-06 devnull "XI", "XII", "XIII", "XIV", "XV"
147 7cf289ca 2004-04-06 devnull };
148 7cf289ca 2004-04-06 devnull #define NROMAN 15
149 7cf289ca 2004-04-06 devnull
150 cbeb0b26 2006-04-01 devnull /* List number types */
151 7cf289ca 2004-04-06 devnull enum {
152 7cf289ca 2004-04-06 devnull LTdisc, LTsquare, LTcircle, LT1, LTa, LTA, LTi, LTI
153 7cf289ca 2004-04-06 devnull };
154 7cf289ca 2004-04-06 devnull
155 7cf289ca 2004-04-06 devnull enum {
156 7cf289ca 2004-04-06 devnull SPBefore = 2,
157 7cf289ca 2004-04-06 devnull SPAfter = 4,
158 7cf289ca 2004-04-06 devnull BL = 1,
159 7cf289ca 2004-04-06 devnull BLBA = (BL|SPBefore|SPAfter)
160 7cf289ca 2004-04-06 devnull };
161 7cf289ca 2004-04-06 devnull
162 cbeb0b26 2006-04-01 devnull /* blockbrk[tag] is break info for a block level element, or one */
163 cbeb0b26 2006-04-01 devnull /* of a few others that get the same treatment re ending open paragraphs */
164 cbeb0b26 2006-04-01 devnull /* and requiring a line break / vertical space before them. */
165 cbeb0b26 2006-04-01 devnull /* If we want a line of space before the given element, SPBefore is OR'd in. */
166 cbeb0b26 2006-04-01 devnull /* If we want a line of space after the given element, SPAfter is OR'd in. */
167 7cf289ca 2004-04-06 devnull
168 7cf289ca 2004-04-06 devnull static uchar blockbrk[Numtags]= {
169 c2526742 2004-04-20 devnull /*Notfound*/ 0,
170 c2526742 2004-04-20 devnull /*Comment*/ 0,
171 c2526742 2004-04-20 devnull /*Ta*/ 0,
172 c2526742 2004-04-20 devnull /*Tabbr*/ 0,
173 c2526742 2004-04-20 devnull /*Tacronym*/ 0,
174 c2526742 2004-04-20 devnull /*Taddress*/ BLBA,
175 c2526742 2004-04-20 devnull /*Tapplet*/ 0,
176 c2526742 2004-04-20 devnull /*Tarea*/ 0,
177 c2526742 2004-04-20 devnull /*Tb*/ 0,
178 c2526742 2004-04-20 devnull /*Tbase*/ 0,
179 c2526742 2004-04-20 devnull /*Tbasefont*/ 0,
180 c2526742 2004-04-20 devnull /*Tbdo*/ 0,
181 c2526742 2004-04-20 devnull /*Tbig*/ 0,
182 c2526742 2004-04-20 devnull /*Tblink*/ 0,
183 c2526742 2004-04-20 devnull /*Tblockquote*/ BLBA,
184 c2526742 2004-04-20 devnull /*Tbody*/ 0,
185 c2526742 2004-04-20 devnull /*Tbq*/ 0,
186 c2526742 2004-04-20 devnull /*Tbr*/ 0,
187 c2526742 2004-04-20 devnull /*Tbutton*/ 0,
188 c2526742 2004-04-20 devnull /*Tcaption*/ 0,
189 c2526742 2004-04-20 devnull /*Tcenter*/ BL,
190 c2526742 2004-04-20 devnull /*Tcite*/ 0,
191 c2526742 2004-04-20 devnull /*Tcode*/ 0,
192 c2526742 2004-04-20 devnull /*Tcol*/ 0,
193 c2526742 2004-04-20 devnull /*Tcolgroup*/ 0,
194 c2526742 2004-04-20 devnull /*Tdd*/ BL,
195 c2526742 2004-04-20 devnull /*Tdel*/ 0,
196 c2526742 2004-04-20 devnull /*Tdfn*/ 0,
197 c2526742 2004-04-20 devnull /*Tdir*/ BLBA,
198 c2526742 2004-04-20 devnull /*Tdiv*/ BL,
199 c2526742 2004-04-20 devnull /*Tdl*/ BLBA,
200 c2526742 2004-04-20 devnull /*Tdt*/ BL,
201 c2526742 2004-04-20 devnull /*Tem*/ 0,
202 c2526742 2004-04-20 devnull /*Tfieldset*/ 0,
203 c2526742 2004-04-20 devnull /*Tfont*/ 0,
204 c2526742 2004-04-20 devnull /*Tform*/ BLBA,
205 c2526742 2004-04-20 devnull /*Tframe*/ 0,
206 c2526742 2004-04-20 devnull /*Tframeset*/ 0,
207 c2526742 2004-04-20 devnull /*Th1*/ BL,
208 c2526742 2004-04-20 devnull /*Th2*/ BL,
209 c2526742 2004-04-20 devnull /*Th3*/ BL,
210 c2526742 2004-04-20 devnull /*Th4*/ BL,
211 c2526742 2004-04-20 devnull /*Th5*/ BL,
212 c2526742 2004-04-20 devnull /*Th6*/ BL,
213 c2526742 2004-04-20 devnull /*Thead*/ 0,
214 c2526742 2004-04-20 devnull /*Thr*/ BL,
215 c2526742 2004-04-20 devnull /*Thtml*/ 0,
216 c2526742 2004-04-20 devnull /*Ti*/ 0,
217 c2526742 2004-04-20 devnull /*Tiframe*/ 0,
218 c2526742 2004-04-20 devnull /*Timg*/ 0,
219 c2526742 2004-04-20 devnull /*Tinput*/ 0,
220 c2526742 2004-04-20 devnull /*Tins*/ 0,
221 c2526742 2004-04-20 devnull /*Tisindex*/ BLBA,
222 c2526742 2004-04-20 devnull /*Tkbd*/ 0,
223 c2526742 2004-04-20 devnull /*Tlabel*/ 0,
224 c2526742 2004-04-20 devnull /*Tlegend*/ 0,
225 c2526742 2004-04-20 devnull /*Tli*/ BL,
226 c2526742 2004-04-20 devnull /*Tlink*/ 0,
227 c2526742 2004-04-20 devnull /*Tmap*/ 0,
228 c2526742 2004-04-20 devnull /*Tmenu*/ BLBA,
229 c2526742 2004-04-20 devnull /*Tmeta*/ 0,
230 c2526742 2004-04-20 devnull /*Tnobr*/ 0,
231 c2526742 2004-04-20 devnull /*Tnoframes*/ 0,
232 c2526742 2004-04-20 devnull /*Tnoscript*/ 0,
233 c2526742 2004-04-20 devnull /*Tobject*/ 0,
234 c2526742 2004-04-20 devnull /*Tol*/ BLBA,
235 c2526742 2004-04-20 devnull /*Toptgroup*/ 0,
236 c2526742 2004-04-20 devnull /*Toption*/ 0,
237 c2526742 2004-04-20 devnull /*Tp*/ BLBA,
238 c2526742 2004-04-20 devnull /*Tparam*/ 0,
239 c2526742 2004-04-20 devnull /*Tpre*/ BLBA,
240 c2526742 2004-04-20 devnull /*Tq*/ 0,
241 c2526742 2004-04-20 devnull /*Ts*/ 0,
242 c2526742 2004-04-20 devnull /*Tsamp*/ 0,
243 c2526742 2004-04-20 devnull /*Tscript*/ 0,
244 c2526742 2004-04-20 devnull /*Tselect*/ 0,
245 c2526742 2004-04-20 devnull /*Tsmall*/ 0,
246 c2526742 2004-04-20 devnull /*Tspan*/ 0,
247 c2526742 2004-04-20 devnull /*Tstrike*/ 0,
248 c2526742 2004-04-20 devnull /*Tstrong*/ 0,
249 c2526742 2004-04-20 devnull /*Tstyle*/ 0,
250 c2526742 2004-04-20 devnull /*Tsub*/ 0,
251 c2526742 2004-04-20 devnull /*Tsup*/ 0,
252 c2526742 2004-04-20 devnull /*Ttable*/ 0,
253 c2526742 2004-04-20 devnull /*Ttbody*/ 0,
254 c2526742 2004-04-20 devnull /*Ttd*/ 0,
255 c2526742 2004-04-20 devnull /*Ttextarea*/ 0,
256 c2526742 2004-04-20 devnull /*Ttfoot*/ 0,
257 c2526742 2004-04-20 devnull /*Tth*/ 0,
258 c2526742 2004-04-20 devnull /*Tthead*/ 0,
259 c2526742 2004-04-20 devnull /*Ttitle*/ 0,
260 c2526742 2004-04-20 devnull /*Ttr*/ 0,
261 c2526742 2004-04-20 devnull /*Ttt*/ 0,
262 c2526742 2004-04-20 devnull /*Tu*/ 0,
263 c2526742 2004-04-20 devnull /*Tul*/ BLBA,
264 c2526742 2004-04-20 devnull /*Tvar*/ 0,
265 7cf289ca 2004-04-06 devnull };
266 7cf289ca 2004-04-06 devnull
267 7cf289ca 2004-04-06 devnull enum {
268 7cf289ca 2004-04-06 devnull AGEN = 1
269 7cf289ca 2004-04-06 devnull };
270 7cf289ca 2004-04-06 devnull
271 cbeb0b26 2006-04-01 devnull /* attrinfo is information about attributes. */
272 cbeb0b26 2006-04-01 devnull /* The AGEN value means that the attribute is generic (applies to almost all elements) */
273 7cf289ca 2004-04-06 devnull static uchar attrinfo[Numattrs]= {
274 c2526742 2004-04-20 devnull /*Aabbr*/ 0,
275 c2526742 2004-04-20 devnull /*Aaccept_charset*/ 0,
276 c2526742 2004-04-20 devnull /*Aaccess_key*/ 0,
277 c2526742 2004-04-20 devnull /*Aaction*/ 0,
278 c2526742 2004-04-20 devnull /*Aalign*/ 0,
279 c2526742 2004-04-20 devnull /*Aalink*/ 0,
280 c2526742 2004-04-20 devnull /*Aalt*/ 0,
281 c2526742 2004-04-20 devnull /*Aarchive*/ 0,
282 c2526742 2004-04-20 devnull /*Aaxis*/ 0,
283 c2526742 2004-04-20 devnull /*Abackground*/ 0,
284 c2526742 2004-04-20 devnull /*Abgcolor*/ 0,
285 c2526742 2004-04-20 devnull /*Aborder*/ 0,
286 c2526742 2004-04-20 devnull /*Acellpadding*/ 0,
287 c2526742 2004-04-20 devnull /*Acellspacing*/ 0,
288 c2526742 2004-04-20 devnull /*Achar*/ 0,
289 c2526742 2004-04-20 devnull /*Acharoff*/ 0,
290 c2526742 2004-04-20 devnull /*Acharset*/ 0,
291 c2526742 2004-04-20 devnull /*Achecked*/ 0,
292 c2526742 2004-04-20 devnull /*Acite*/ 0,
293 c2526742 2004-04-20 devnull /*Aclass*/ AGEN,
294 c2526742 2004-04-20 devnull /*Aclassid*/ 0,
295 c2526742 2004-04-20 devnull /*Aclear*/ 0,
296 c2526742 2004-04-20 devnull /*Acode*/ 0,
297 c2526742 2004-04-20 devnull /*Acodebase*/ 0,
298 c2526742 2004-04-20 devnull /*Acodetype*/ 0,
299 c2526742 2004-04-20 devnull /*Acolor*/ 0,
300 c2526742 2004-04-20 devnull /*Acols*/ 0,
301 c2526742 2004-04-20 devnull /*Acolspan*/ 0,
302 c2526742 2004-04-20 devnull /*Acompact*/ 0,
303 c2526742 2004-04-20 devnull /*Acontent*/ 0,
304 c2526742 2004-04-20 devnull /*Acoords*/ 0,
305 c2526742 2004-04-20 devnull /*Adata*/ 0,
306 c2526742 2004-04-20 devnull /*Adatetime*/ 0,
307 c2526742 2004-04-20 devnull /*Adeclare*/ 0,
308 c2526742 2004-04-20 devnull /*Adefer*/ 0,
309 c2526742 2004-04-20 devnull /*Adir*/ 0,
310 c2526742 2004-04-20 devnull /*Adisabled*/ 0,
311 c2526742 2004-04-20 devnull /*Aenctype*/ 0,
312 c2526742 2004-04-20 devnull /*Aface*/ 0,
313 c2526742 2004-04-20 devnull /*Afor*/ 0,
314 c2526742 2004-04-20 devnull /*Aframe*/ 0,
315 c2526742 2004-04-20 devnull /*Aframeborder*/ 0,
316 c2526742 2004-04-20 devnull /*Aheaders*/ 0,
317 c2526742 2004-04-20 devnull /*Aheight*/ 0,
318 c2526742 2004-04-20 devnull /*Ahref*/ 0,
319 c2526742 2004-04-20 devnull /*Ahreflang*/ 0,
320 c2526742 2004-04-20 devnull /*Ahspace*/ 0,
321 c2526742 2004-04-20 devnull /*Ahttp_equiv*/ 0,
322 c2526742 2004-04-20 devnull /*Aid*/ AGEN,
323 c2526742 2004-04-20 devnull /*Aismap*/ 0,
324 c2526742 2004-04-20 devnull /*Alabel*/ 0,
325 c2526742 2004-04-20 devnull /*Alang*/ 0,
326 c2526742 2004-04-20 devnull /*Alink*/ 0,
327 c2526742 2004-04-20 devnull /*Alongdesc*/ 0,
328 c2526742 2004-04-20 devnull /*Amarginheight*/ 0,
329 c2526742 2004-04-20 devnull /*Amarginwidth*/ 0,
330 c2526742 2004-04-20 devnull /*Amaxlength*/ 0,
331 c2526742 2004-04-20 devnull /*Amedia*/ 0,
332 c2526742 2004-04-20 devnull /*Amethod*/ 0,
333 c2526742 2004-04-20 devnull /*Amultiple*/ 0,
334 c2526742 2004-04-20 devnull /*Aname*/ 0,
335 c2526742 2004-04-20 devnull /*Anohref*/ 0,
336 c2526742 2004-04-20 devnull /*Anoresize*/ 0,
337 c2526742 2004-04-20 devnull /*Anoshade*/ 0,
338 c2526742 2004-04-20 devnull /*Anowrap*/ 0,
339 c2526742 2004-04-20 devnull /*Aobject*/ 0,
340 c2526742 2004-04-20 devnull /*Aonblur*/ AGEN,
341 c2526742 2004-04-20 devnull /*Aonchange*/ AGEN,
342 c2526742 2004-04-20 devnull /*Aonclick*/ AGEN,
343 c2526742 2004-04-20 devnull /*Aondblclick*/ AGEN,
344 c2526742 2004-04-20 devnull /*Aonfocus*/ AGEN,
345 c2526742 2004-04-20 devnull /*Aonkeypress*/ AGEN,
346 c2526742 2004-04-20 devnull /*Aonkeyup*/ AGEN,
347 c2526742 2004-04-20 devnull /*Aonload*/ AGEN,
348 c2526742 2004-04-20 devnull /*Aonmousedown*/ AGEN,
349 c2526742 2004-04-20 devnull /*Aonmousemove*/ AGEN,
350 c2526742 2004-04-20 devnull /*Aonmouseout*/ AGEN,
351 c2526742 2004-04-20 devnull /*Aonmouseover*/ AGEN,
352 c2526742 2004-04-20 devnull /*Aonmouseup*/ AGEN,
353 c2526742 2004-04-20 devnull /*Aonreset*/ AGEN,
354 c2526742 2004-04-20 devnull /*Aonselect*/ AGEN,
355 c2526742 2004-04-20 devnull /*Aonsubmit*/ AGEN,
356 c2526742 2004-04-20 devnull /*Aonunload*/ AGEN,
357 c2526742 2004-04-20 devnull /*Aprofile*/ 0,
358 c2526742 2004-04-20 devnull /*Aprompt*/ 0,
359 c2526742 2004-04-20 devnull /*Areadonly*/ 0,
360 c2526742 2004-04-20 devnull /*Arel*/ 0,
361 c2526742 2004-04-20 devnull /*Arev*/ 0,
362 c2526742 2004-04-20 devnull /*Arows*/ 0,
363 c2526742 2004-04-20 devnull /*Arowspan*/ 0,
364 c2526742 2004-04-20 devnull /*Arules*/ 0,
365 c2526742 2004-04-20 devnull /*Ascheme*/ 0,
366 c2526742 2004-04-20 devnull /*Ascope*/ 0,
367 c2526742 2004-04-20 devnull /*Ascrolling*/ 0,
368 c2526742 2004-04-20 devnull /*Aselected*/ 0,
369 c2526742 2004-04-20 devnull /*Ashape*/ 0,
370 c2526742 2004-04-20 devnull /*Asize*/ 0,
371 c2526742 2004-04-20 devnull /*Aspan*/ 0,
372 c2526742 2004-04-20 devnull /*Asrc*/ 0,
373 c2526742 2004-04-20 devnull /*Astandby*/ 0,
374 c2526742 2004-04-20 devnull /*Astart*/ 0,
375 c2526742 2004-04-20 devnull /*Astyle*/ AGEN,
376 c2526742 2004-04-20 devnull /*Asummary*/ 0,
377 c2526742 2004-04-20 devnull /*Atabindex*/ 0,
378 c2526742 2004-04-20 devnull /*Atarget*/ 0,
379 c2526742 2004-04-20 devnull /*Atext*/ 0,
380 c2526742 2004-04-20 devnull /*Atitle*/ AGEN,
381 c2526742 2004-04-20 devnull /*Atype*/ 0,
382 c2526742 2004-04-20 devnull /*Ausemap*/ 0,
383 c2526742 2004-04-20 devnull /*Avalign*/ 0,
384 c2526742 2004-04-20 devnull /*Avalue*/ 0,
385 c2526742 2004-04-20 devnull /*Avaluetype*/ 0,
386 c2526742 2004-04-20 devnull /*Aversion*/ 0,
387 c2526742 2004-04-20 devnull /*Avlink*/ 0,
388 c2526742 2004-04-20 devnull /*Avspace*/ 0,
389 c2526742 2004-04-20 devnull /*Awidth*/ 0,
390 7cf289ca 2004-04-06 devnull };
391 7cf289ca 2004-04-06 devnull
392 7cf289ca 2004-04-06 devnull static uchar scriptev[Numattrs]= {
393 c2526742 2004-04-20 devnull /*Aabbr*/ 0,
394 c2526742 2004-04-20 devnull /*Aaccept_charset*/ 0,
395 c2526742 2004-04-20 devnull /*Aaccess_key*/ 0,
396 c2526742 2004-04-20 devnull /*Aaction*/ 0,
397 c2526742 2004-04-20 devnull /*Aalign*/ 0,
398 c2526742 2004-04-20 devnull /*Aalink*/ 0,
399 c2526742 2004-04-20 devnull /*Aalt*/ 0,
400 c2526742 2004-04-20 devnull /*Aarchive*/ 0,
401 c2526742 2004-04-20 devnull /*Aaxis*/ 0,
402 c2526742 2004-04-20 devnull /*Abackground*/ 0,
403 c2526742 2004-04-20 devnull /*Abgcolor*/ 0,
404 c2526742 2004-04-20 devnull /*Aborder*/ 0,
405 c2526742 2004-04-20 devnull /*Acellpadding*/ 0,
406 c2526742 2004-04-20 devnull /*Acellspacing*/ 0,
407 c2526742 2004-04-20 devnull /*Achar*/ 0,
408 c2526742 2004-04-20 devnull /*Acharoff*/ 0,
409 c2526742 2004-04-20 devnull /*Acharset*/ 0,
410 c2526742 2004-04-20 devnull /*Achecked*/ 0,
411 c2526742 2004-04-20 devnull /*Acite*/ 0,
412 c2526742 2004-04-20 devnull /*Aclass*/ 0,
413 c2526742 2004-04-20 devnull /*Aclassid*/ 0,
414 c2526742 2004-04-20 devnull /*Aclear*/ 0,
415 c2526742 2004-04-20 devnull /*Acode*/ 0,
416 c2526742 2004-04-20 devnull /*Acodebase*/ 0,
417 c2526742 2004-04-20 devnull /*Acodetype*/ 0,
418 c2526742 2004-04-20 devnull /*Acolor*/ 0,
419 c2526742 2004-04-20 devnull /*Acols*/ 0,
420 c2526742 2004-04-20 devnull /*Acolspan*/ 0,
421 c2526742 2004-04-20 devnull /*Acompact*/ 0,
422 c2526742 2004-04-20 devnull /*Acontent*/ 0,
423 c2526742 2004-04-20 devnull /*Acoords*/ 0,
424 c2526742 2004-04-20 devnull /*Adata*/ 0,
425 c2526742 2004-04-20 devnull /*Adatetime*/ 0,
426 c2526742 2004-04-20 devnull /*Adeclare*/ 0,
427 c2526742 2004-04-20 devnull /*Adefer*/ 0,
428 c2526742 2004-04-20 devnull /*Adir*/ 0,
429 c2526742 2004-04-20 devnull /*Adisabled*/ 0,
430 c2526742 2004-04-20 devnull /*Aenctype*/ 0,
431 c2526742 2004-04-20 devnull /*Aface*/ 0,
432 c2526742 2004-04-20 devnull /*Afor*/ 0,
433 c2526742 2004-04-20 devnull /*Aframe*/ 0,
434 c2526742 2004-04-20 devnull /*Aframeborder*/ 0,
435 c2526742 2004-04-20 devnull /*Aheaders*/ 0,
436 c2526742 2004-04-20 devnull /*Aheight*/ 0,
437 c2526742 2004-04-20 devnull /*Ahref*/ 0,
438 c2526742 2004-04-20 devnull /*Ahreflang*/ 0,
439 c2526742 2004-04-20 devnull /*Ahspace*/ 0,
440 c2526742 2004-04-20 devnull /*Ahttp_equiv*/ 0,
441 c2526742 2004-04-20 devnull /*Aid*/ 0,
442 c2526742 2004-04-20 devnull /*Aismap*/ 0,
443 c2526742 2004-04-20 devnull /*Alabel*/ 0,
444 c2526742 2004-04-20 devnull /*Alang*/ 0,
445 c2526742 2004-04-20 devnull /*Alink*/ 0,
446 c2526742 2004-04-20 devnull /*Alongdesc*/ 0,
447 c2526742 2004-04-20 devnull /*Amarginheight*/ 0,
448 c2526742 2004-04-20 devnull /*Amarginwidth*/ 0,
449 c2526742 2004-04-20 devnull /*Amaxlength*/ 0,
450 c2526742 2004-04-20 devnull /*Amedia*/ 0,
451 c2526742 2004-04-20 devnull /*Amethod*/ 0,
452 c2526742 2004-04-20 devnull /*Amultiple*/ 0,
453 c2526742 2004-04-20 devnull /*Aname*/ 0,
454 c2526742 2004-04-20 devnull /*Anohref*/ 0,
455 c2526742 2004-04-20 devnull /*Anoresize*/ 0,
456 c2526742 2004-04-20 devnull /*Anoshade*/ 0,
457 c2526742 2004-04-20 devnull /*Anowrap*/ 0,
458 c2526742 2004-04-20 devnull /*Aobject*/ 0,
459 c2526742 2004-04-20 devnull /*Aonblur*/ SEonblur,
460 c2526742 2004-04-20 devnull /*Aonchange*/ SEonchange,
461 c2526742 2004-04-20 devnull /*Aonclick*/ SEonclick,
462 c2526742 2004-04-20 devnull /*Aondblclick*/ SEondblclick,
463 c2526742 2004-04-20 devnull /*Aonfocus*/ SEonfocus,
464 c2526742 2004-04-20 devnull /*Aonkeypress*/ SEonkeypress,
465 c2526742 2004-04-20 devnull /*Aonkeyup*/ SEonkeyup,
466 c2526742 2004-04-20 devnull /*Aonload*/ SEonload,
467 c2526742 2004-04-20 devnull /*Aonmousedown*/ SEonmousedown,
468 c2526742 2004-04-20 devnull /*Aonmousemove*/ SEonmousemove,
469 c2526742 2004-04-20 devnull /*Aonmouseout*/ SEonmouseout,
470 c2526742 2004-04-20 devnull /*Aonmouseover*/ SEonmouseover,
471 c2526742 2004-04-20 devnull /*Aonmouseup*/ SEonmouseup,
472 c2526742 2004-04-20 devnull /*Aonreset*/ SEonreset,
473 c2526742 2004-04-20 devnull /*Aonselect*/ SEonselect,
474 c2526742 2004-04-20 devnull /*Aonsubmit*/ SEonsubmit,
475 c2526742 2004-04-20 devnull /*Aonunload*/ SEonunload,
476 c2526742 2004-04-20 devnull /*Aprofile*/ 0,
477 c2526742 2004-04-20 devnull /*Aprompt*/ 0,
478 c2526742 2004-04-20 devnull /*Areadonly*/ 0,
479 c2526742 2004-04-20 devnull /*Arel*/ 0,
480 c2526742 2004-04-20 devnull /*Arev*/ 0,
481 c2526742 2004-04-20 devnull /*Arows*/ 0,
482 c2526742 2004-04-20 devnull /*Arowspan*/ 0,
483 c2526742 2004-04-20 devnull /*Arules*/ 0,
484 c2526742 2004-04-20 devnull /*Ascheme*/ 0,
485 c2526742 2004-04-20 devnull /*Ascope*/ 0,
486 c2526742 2004-04-20 devnull /*Ascrolling*/ 0,
487 c2526742 2004-04-20 devnull /*Aselected*/ 0,
488 c2526742 2004-04-20 devnull /*Ashape*/ 0,
489 c2526742 2004-04-20 devnull /*Asize*/ 0,
490 c2526742 2004-04-20 devnull /*Aspan*/ 0,
491 c2526742 2004-04-20 devnull /*Asrc*/ 0,
492 c2526742 2004-04-20 devnull /*Astandby*/ 0,
493 c2526742 2004-04-20 devnull /*Astart*/ 0,
494 c2526742 2004-04-20 devnull /*Astyle*/ 0,
495 c2526742 2004-04-20 devnull /*Asummary*/ 0,
496 c2526742 2004-04-20 devnull /*Atabindex*/ 0,
497 c2526742 2004-04-20 devnull /*Atarget*/ 0,
498 c2526742 2004-04-20 devnull /*Atext*/ 0,
499 c2526742 2004-04-20 devnull /*Atitle*/ 0,
500 c2526742 2004-04-20 devnull /*Atype*/ 0,
501 c2526742 2004-04-20 devnull /*Ausemap*/ 0,
502 c2526742 2004-04-20 devnull /*Avalign*/ 0,
503 c2526742 2004-04-20 devnull /*Avalue*/ 0,
504 c2526742 2004-04-20 devnull /*Avaluetype*/ 0,
505 c2526742 2004-04-20 devnull /*Aversion*/ 0,
506 c2526742 2004-04-20 devnull /*Avlink*/ 0,
507 c2526742 2004-04-20 devnull /*Avspace*/ 0,
508 c2526742 2004-04-20 devnull /*Awidth*/ 0,
509 7cf289ca 2004-04-06 devnull };
510 7cf289ca 2004-04-06 devnull
511 cbeb0b26 2006-04-01 devnull /* Color lookup table */
512 7cf289ca 2004-04-06 devnull static StringInt *color_tab;
513 7cf289ca 2004-04-06 devnull static AsciiInt _color_tab[] = {
514 7cf289ca 2004-04-06 devnull {"aqua", 0x00FFFF},
515 7cf289ca 2004-04-06 devnull {"black", 0x000000},
516 7cf289ca 2004-04-06 devnull {"blue", 0x0000CC},
517 7cf289ca 2004-04-06 devnull {"fuchsia", 0xFF00FF},
518 7cf289ca 2004-04-06 devnull {"gray", 0x808080},
519 7cf289ca 2004-04-06 devnull {"green", 0x008000},
520 7cf289ca 2004-04-06 devnull {"lime", 0x00FF00},
521 7cf289ca 2004-04-06 devnull {"maroon", 0x800000},
522 7cf289ca 2004-04-06 devnull {"navy", 0x000080,},
523 7cf289ca 2004-04-06 devnull {"olive", 0x808000},
524 7cf289ca 2004-04-06 devnull {"purple", 0x800080},
525 7cf289ca 2004-04-06 devnull {"red", 0xFF0000},
526 7cf289ca 2004-04-06 devnull {"silver", 0xC0C0C0},
527 7cf289ca 2004-04-06 devnull {"teal", 0x008080},
528 7cf289ca 2004-04-06 devnull {"white", 0xFFFFFF},
529 7cf289ca 2004-04-06 devnull {"yellow", 0xFFFF00}
530 7cf289ca 2004-04-06 devnull };
531 3c38dbc0 2005-10-29 devnull #define NCOLORS (sizeof(_color_tab)/sizeof(StringInt))
532 7cf289ca 2004-04-06 devnull
533 7cf289ca 2004-04-06 devnull static StringInt *targetmap;
534 7cf289ca 2004-04-06 devnull static int targetmapsize;
535 7cf289ca 2004-04-06 devnull static int ntargets;
536 7cf289ca 2004-04-06 devnull
537 7cf289ca 2004-04-06 devnull static int buildinited = 0;
538 7cf289ca 2004-04-06 devnull
539 7cf289ca 2004-04-06 devnull #define SMALLBUFSIZE 240
540 7cf289ca 2004-04-06 devnull #define BIGBUFSIZE 2000
541 7cf289ca 2004-04-06 devnull
542 7cf289ca 2004-04-06 devnull int dbgbuild = 0;
543 7cf289ca 2004-04-06 devnull int warn = 0;
544 7cf289ca 2004-04-06 devnull
545 7cf289ca 2004-04-06 devnull static Align aalign(Token* tok);
546 7cf289ca 2004-04-06 devnull static int acolorval(Token* tok, int attid, int dflt);
547 7cf289ca 2004-04-06 devnull static void addbrk(Pstate* ps, int sp, int clr);
548 7cf289ca 2004-04-06 devnull static void additem(Pstate* ps, Item* it, Token* tok);
549 7cf289ca 2004-04-06 devnull static void addlinebrk(Pstate* ps, int clr);
550 7cf289ca 2004-04-06 devnull static void addnbsp(Pstate* ps);
551 7cf289ca 2004-04-06 devnull static void addtext(Pstate* ps, Rune* s);
552 7cf289ca 2004-04-06 devnull static Dimen adimen(Token* tok, int attid);
553 7cf289ca 2004-04-06 devnull static int aflagval(Token* tok, int attid);
554 7cf289ca 2004-04-06 devnull static int aintval(Token* tok, int attid, int dflt);
555 7cf289ca 2004-04-06 devnull static Rune* astrval(Token* tok, int attid, Rune* dflt);
556 7cf289ca 2004-04-06 devnull static int atabval(Token* tok, int attid, StringInt* tab, int ntab, int dflt);
557 7cf289ca 2004-04-06 devnull static int atargval(Token* tok, int dflt);
558 7cf289ca 2004-04-06 devnull static int auintval(Token* tok, int attid, int dflt);
559 7cf289ca 2004-04-06 devnull static Rune* aurlval(Token* tok, int attid, Rune* dflt, Rune* base);
560 7cf289ca 2004-04-06 devnull static Rune* aval(Token* tok, int attid);
561 7cf289ca 2004-04-06 devnull static void buildinit(void);
562 7cf289ca 2004-04-06 devnull static Pstate* cell_pstate(Pstate* oldps, int ishead);
563 7cf289ca 2004-04-06 devnull static void changehang(Pstate* ps, int delta);
564 7cf289ca 2004-04-06 devnull static void changeindent(Pstate* ps, int delta);
565 7cf289ca 2004-04-06 devnull static int color(Rune* s, int dflt);
566 7cf289ca 2004-04-06 devnull static void copystack(Stack* tostk, Stack* fromstk);
567 7cf289ca 2004-04-06 devnull static int dimprint(char* buf, int nbuf, Dimen d);
568 7cf289ca 2004-04-06 devnull static Pstate* finishcell(Table* curtab, Pstate* psstk);
569 7cf289ca 2004-04-06 devnull static void finish_table(Table* t);
570 7cf289ca 2004-04-06 devnull static void freeanchor(Anchor* a);
571 7cf289ca 2004-04-06 devnull static void freedestanchor(DestAnchor* da);
572 7cf289ca 2004-04-06 devnull static void freeform(Form* f);
573 7cf289ca 2004-04-06 devnull static void freeformfield(Formfield* ff);
574 7cf289ca 2004-04-06 devnull static void freeitem(Item* it);
575 7cf289ca 2004-04-06 devnull static void freepstate(Pstate* p);
576 7cf289ca 2004-04-06 devnull static void freepstatestack(Pstate* pshead);
577 7cf289ca 2004-04-06 devnull static void freescriptevents(SEvent* ehead);
578 7cf289ca 2004-04-06 devnull static void freetable(Table* t);
579 7cf289ca 2004-04-06 devnull static Map* getmap(Docinfo* di, Rune* name);
580 7cf289ca 2004-04-06 devnull static Rune* getpcdata(Token* toks, int tokslen, int* ptoki);
581 7cf289ca 2004-04-06 devnull static Pstate* lastps(Pstate* psl);
582 7cf289ca 2004-04-06 devnull static Rune* listmark(uchar ty, int n);
583 7cf289ca 2004-04-06 devnull static int listtyval(Token* tok, int dflt);
584 7cf289ca 2004-04-06 devnull static Align makealign(int halign, int valign);
585 7cf289ca 2004-04-06 devnull static Background makebackground(Rune* imgurl, int color);
586 7cf289ca 2004-04-06 devnull static Dimen makedimen(int kind, int spec);
587 7cf289ca 2004-04-06 devnull static Anchor* newanchor(int index, Rune* name, Rune* href, int target, Anchor* link);
588 7cf289ca 2004-04-06 devnull static Area* newarea(int shape, Rune* href, int target, Area* link);
589 7cf289ca 2004-04-06 devnull static DestAnchor* newdestanchor(int index, Rune* name, Item* item, DestAnchor* link);
590 7cf289ca 2004-04-06 devnull static Docinfo* newdocinfo(void);
591 7cf289ca 2004-04-06 devnull static Genattr* newgenattr(Rune* id, Rune* class, Rune* style, Rune* title, SEvent* events);
592 7cf289ca 2004-04-06 devnull static Form* newform(int formid, Rune* name, Rune* action,
593 7cf289ca 2004-04-06 devnull int target, int method, Form* link);
594 7cf289ca 2004-04-06 devnull static Formfield* newformfield(int ftype, int fieldid, Form* form, Rune* name,
595 7cf289ca 2004-04-06 devnull Rune* value, int size, int maxlength, Formfield* link);
596 7cf289ca 2004-04-06 devnull static Item* newifloat(Item* it, int side);
597 7cf289ca 2004-04-06 devnull static Item* newiformfield(Formfield* ff);
598 7cf289ca 2004-04-06 devnull static Item* newiimage(Rune* src, Rune* altrep, int align, int width, int height,
599 7cf289ca 2004-04-06 devnull int hspace, int vspace, int border, int ismap, Map* map);
600 7cf289ca 2004-04-06 devnull static Item* newirule(int align, int size, int noshade, Dimen wspec);
601 7cf289ca 2004-04-06 devnull static Item* newispacer(int spkind);
602 7cf289ca 2004-04-06 devnull static Item* newitable(Table* t);
603 7cf289ca 2004-04-06 devnull static ItemSource* newitemsource(Docinfo* di);
604 7cf289ca 2004-04-06 devnull static Item* newitext(Rune* s, int fnt, int fg, int voff, int ul);
605 7cf289ca 2004-04-06 devnull static Kidinfo* newkidinfo(int isframeset, Kidinfo* link);
606 7cf289ca 2004-04-06 devnull static Option* newoption(int selected, Rune* value, Rune* display, Option* link);
607 7cf289ca 2004-04-06 devnull static Pstate* newpstate(Pstate* link);
608 7cf289ca 2004-04-06 devnull static SEvent* newscriptevent(int type, Rune* script, SEvent* link);
609 7cf289ca 2004-04-06 devnull static Table* newtable(int tableid, Align align, Dimen width, int border,
610 7cf289ca 2004-04-06 devnull int cellspacing, int cellpadding, Background bg, Token* tok, Table* link);
611 7cf289ca 2004-04-06 devnull static Tablecell* newtablecell(int cellid, int rowspan, int colspan, Align align, Dimen wspec,
612 7cf289ca 2004-04-06 devnull int hspec, Background bg, int flags, Tablecell* link);
613 7cf289ca 2004-04-06 devnull static Tablerow* newtablerow(Align align, Background bg, int flags, Tablerow* link);
614 7cf289ca 2004-04-06 devnull static Dimen parsedim(Rune* s, int ns);
615 7cf289ca 2004-04-06 devnull static void pop(Stack* stk);
616 7cf289ca 2004-04-06 devnull static void popfontsize(Pstate* ps);
617 7cf289ca 2004-04-06 devnull static void popfontstyle(Pstate* ps);
618 7cf289ca 2004-04-06 devnull static void popjust(Pstate* ps);
619 7cf289ca 2004-04-06 devnull static int popretnewtop(Stack* stk, int dflt);
620 7cf289ca 2004-04-06 devnull static int push(Stack* stk, int val);
621 7cf289ca 2004-04-06 devnull static void pushfontsize(Pstate* ps, int sz);
622 7cf289ca 2004-04-06 devnull static void pushfontstyle(Pstate* ps, int sty);
623 7cf289ca 2004-04-06 devnull static void pushjust(Pstate* ps, int j);
624 7cf289ca 2004-04-06 devnull static Item* textit(Pstate* ps, Rune* s);
625 7cf289ca 2004-04-06 devnull static Rune* removeallwhite(Rune* s);
626 7cf289ca 2004-04-06 devnull static void resetdocinfo(Docinfo* d);
627 7cf289ca 2004-04-06 devnull static void setcurfont(Pstate* ps);
628 7cf289ca 2004-04-06 devnull static void setcurjust(Pstate* ps);
629 7cf289ca 2004-04-06 devnull static void setdimarray(Token* tok, int attid, Dimen** pans, int* panslen);
630 7cf289ca 2004-04-06 devnull static Rune* stringalign(int a);
631 7cf289ca 2004-04-06 devnull static void targetmapinit(void);
632 7cf289ca 2004-04-06 devnull static int toint(Rune* s);
633 7cf289ca 2004-04-06 devnull static int top(Stack* stk, int dflt);
634 7cf289ca 2004-04-06 devnull static void trim_cell(Tablecell* c);
635 7cf289ca 2004-04-06 devnull static int validalign(Align a);
636 7cf289ca 2004-04-06 devnull static int validdimen(Dimen d);
637 7cf289ca 2004-04-06 devnull static int validformfield(Formfield* f);
638 7cf289ca 2004-04-06 devnull static int validhalign(int a);
639 7cf289ca 2004-04-06 devnull static int validptr(void* p);
640 7cf289ca 2004-04-06 devnull static int validStr(Rune* s);
641 7cf289ca 2004-04-06 devnull static int validtable(Table* t);
642 7cf289ca 2004-04-06 devnull static int validtablerow(Tablerow* r);
643 7cf289ca 2004-04-06 devnull static int validtablecol(Tablecol* c);
644 7cf289ca 2004-04-06 devnull static int validtablecell(Tablecell* c);
645 7cf289ca 2004-04-06 devnull static int validvalign(int a);
646 7cf289ca 2004-04-06 devnull static int Iconv(Fmt *f);
647 7cf289ca 2004-04-06 devnull
648 7cf289ca 2004-04-06 devnull static void
649 7cf289ca 2004-04-06 devnull buildinit(void)
650 7cf289ca 2004-04-06 devnull {
651 7e19561a 2005-01-04 devnull _runetabinit();
652 7e19561a 2005-01-04 devnull roman = _cvtstringtab(_roman, nelem(_roman));
653 7e19561a 2005-01-04 devnull color_tab = _cvtstringinttab(_color_tab, nelem(_color_tab));
654 7e19561a 2005-01-04 devnull method_tab = _cvtstringinttab(_method_tab, nelem(_method_tab));
655 7e19561a 2005-01-04 devnull shape_tab = _cvtstringinttab(_shape_tab, nelem(_shape_tab));
656 7e19561a 2005-01-04 devnull fscroll_tab = _cvtstringinttab(_fscroll_tab, nelem(_fscroll_tab));
657 7e19561a 2005-01-04 devnull clear_tab = _cvtstringinttab(_clear_tab, nelem(_clear_tab));
658 7e19561a 2005-01-04 devnull input_tab = _cvtstringinttab(_input_tab, nelem(_input_tab));
659 7e19561a 2005-01-04 devnull align_tab = _cvtstringinttab(_align_tab, nelem(_align_tab));
660 7cf289ca 2004-04-06 devnull
661 7cf289ca 2004-04-06 devnull fmtinstall('I', Iconv);
662 7cf289ca 2004-04-06 devnull targetmapinit();
663 7cf289ca 2004-04-06 devnull buildinited = 1;
664 7cf289ca 2004-04-06 devnull }
665 7cf289ca 2004-04-06 devnull
666 7cf289ca 2004-04-06 devnull static ItemSource*
667 7cf289ca 2004-04-06 devnull newitemsource(Docinfo* di)
668 7cf289ca 2004-04-06 devnull {
669 7cf289ca 2004-04-06 devnull ItemSource* is;
670 7cf289ca 2004-04-06 devnull Pstate* ps;
671 7cf289ca 2004-04-06 devnull
672 7cf289ca 2004-04-06 devnull ps = newpstate(nil);
673 7cf289ca 2004-04-06 devnull if(di->mediatype != TextHtml) {
674 7cf289ca 2004-04-06 devnull ps->curstate &= ~IFwrap;
675 7cf289ca 2004-04-06 devnull ps->literal = 1;
676 7cf289ca 2004-04-06 devnull pushfontstyle(ps, FntT);
677 7cf289ca 2004-04-06 devnull }
678 7cf289ca 2004-04-06 devnull is = (ItemSource*)emalloc(sizeof(ItemSource));
679 7cf289ca 2004-04-06 devnull is->doc = di;
680 7cf289ca 2004-04-06 devnull is->psstk = ps;
681 7cf289ca 2004-04-06 devnull is->nforms = 0;
682 7cf289ca 2004-04-06 devnull is->ntables = 0;
683 7cf289ca 2004-04-06 devnull is->nanchors = 0;
684 7cf289ca 2004-04-06 devnull is->nframes = 0;
685 7cf289ca 2004-04-06 devnull is->curform = nil;
686 7cf289ca 2004-04-06 devnull is->curmap = nil;
687 7cf289ca 2004-04-06 devnull is->tabstk = nil;
688 7cf289ca 2004-04-06 devnull is->kidstk = nil;
689 7cf289ca 2004-04-06 devnull return is;
690 7cf289ca 2004-04-06 devnull }
691 7cf289ca 2004-04-06 devnull
692 7cf289ca 2004-04-06 devnull static Item *getitems(ItemSource* is, uchar* data, int datalen);
693 7cf289ca 2004-04-06 devnull
694 cbeb0b26 2006-04-01 devnull /* Parse an html document and create a list of layout items. */
695 cbeb0b26 2006-04-01 devnull /* Allocate and return document info in *pdi. */
696 cbeb0b26 2006-04-01 devnull /* When caller is done with the items, it should call */
697 cbeb0b26 2006-04-01 devnull /* freeitems on the returned result, and then */
698 cbeb0b26 2006-04-01 devnull /* freedocinfo(*pdi). */
699 7cf289ca 2004-04-06 devnull Item*
700 7cf289ca 2004-04-06 devnull parsehtml(uchar* data, int datalen, Rune* pagesrc, int mtype, int chset, Docinfo** pdi)
701 7cf289ca 2004-04-06 devnull {
702 7cf289ca 2004-04-06 devnull Item *it;
703 7cf289ca 2004-04-06 devnull Docinfo* di;
704 7cf289ca 2004-04-06 devnull ItemSource* is;
705 7cf289ca 2004-04-06 devnull
706 7cf289ca 2004-04-06 devnull di = newdocinfo();
707 7cf289ca 2004-04-06 devnull di->src = _Strdup(pagesrc);
708 7cf289ca 2004-04-06 devnull di->base = _Strdup(pagesrc);
709 7cf289ca 2004-04-06 devnull di->mediatype = mtype;
710 7cf289ca 2004-04-06 devnull di->chset = chset;
711 7cf289ca 2004-04-06 devnull *pdi = di;
712 7cf289ca 2004-04-06 devnull is = newitemsource(di);
713 7cf289ca 2004-04-06 devnull it = getitems(is, data, datalen);
714 7cf289ca 2004-04-06 devnull freepstatestack(is->psstk);
715 7cf289ca 2004-04-06 devnull free(is);
716 7cf289ca 2004-04-06 devnull return it;
717 7cf289ca 2004-04-06 devnull }
718 7cf289ca 2004-04-06 devnull
719 cbeb0b26 2006-04-01 devnull /* Get a group of tokens for lexer, parse them, and create */
720 cbeb0b26 2006-04-01 devnull /* a list of layout items. */
721 cbeb0b26 2006-04-01 devnull /* When caller is done with the items, it should call */
722 cbeb0b26 2006-04-01 devnull /* freeitems on the returned result. */
723 7cf289ca 2004-04-06 devnull static Item*
724 7cf289ca 2004-04-06 devnull getitems(ItemSource* is, uchar* data, int datalen)
725 7cf289ca 2004-04-06 devnull {
726 7cf289ca 2004-04-06 devnull int i;
727 7cf289ca 2004-04-06 devnull int j;
728 7cf289ca 2004-04-06 devnull int nt;
729 7cf289ca 2004-04-06 devnull int pt;
730 7cf289ca 2004-04-06 devnull int doscripts;
731 7cf289ca 2004-04-06 devnull int tokslen;
732 7cf289ca 2004-04-06 devnull int toki;
733 7cf289ca 2004-04-06 devnull int h;
734 7cf289ca 2004-04-06 devnull int sz;
735 7cf289ca 2004-04-06 devnull int method;
736 7cf289ca 2004-04-06 devnull int n;
737 7cf289ca 2004-04-06 devnull int nblank;
738 7cf289ca 2004-04-06 devnull int norsz;
739 7cf289ca 2004-04-06 devnull int bramt;
740 7cf289ca 2004-04-06 devnull int sty;
741 7cf289ca 2004-04-06 devnull int nosh;
742 7cf289ca 2004-04-06 devnull int oldcuranchor;
743 7cf289ca 2004-04-06 devnull int dfltbd;
744 7cf289ca 2004-04-06 devnull int v;
745 7cf289ca 2004-04-06 devnull int hang;
746 7cf289ca 2004-04-06 devnull int isempty;
747 7cf289ca 2004-04-06 devnull int tag;
748 7cf289ca 2004-04-06 devnull int brksp;
749 7cf289ca 2004-04-06 devnull int target;
750 7cf289ca 2004-04-06 devnull uchar brk;
751 7cf289ca 2004-04-06 devnull uchar flags;
752 7cf289ca 2004-04-06 devnull uchar align;
753 7cf289ca 2004-04-06 devnull uchar al;
754 7cf289ca 2004-04-06 devnull uchar ty;
755 7cf289ca 2004-04-06 devnull uchar ty2;
756 7cf289ca 2004-04-06 devnull Pstate* ps;
757 7cf289ca 2004-04-06 devnull Pstate* nextps;
758 7cf289ca 2004-04-06 devnull Pstate* outerps;
759 7cf289ca 2004-04-06 devnull Table* curtab;
760 7cf289ca 2004-04-06 devnull Token* tok;
761 7cf289ca 2004-04-06 devnull Token* toks;
762 7cf289ca 2004-04-06 devnull Docinfo* di;
763 7cf289ca 2004-04-06 devnull Item* ans;
764 7cf289ca 2004-04-06 devnull Item* img;
765 7cf289ca 2004-04-06 devnull Item* ffit;
766 7cf289ca 2004-04-06 devnull Item* tabitem;
767 7cf289ca 2004-04-06 devnull Rune* s;
768 7cf289ca 2004-04-06 devnull Rune* t;
769 7cf289ca 2004-04-06 devnull Rune* name;
770 7cf289ca 2004-04-06 devnull Rune* enctype;
771 7cf289ca 2004-04-06 devnull Rune* usemap;
772 7cf289ca 2004-04-06 devnull Rune* prompt;
773 7cf289ca 2004-04-06 devnull Rune* equiv;
774 7cf289ca 2004-04-06 devnull Rune* val;
775 7cf289ca 2004-04-06 devnull Rune* nsz;
776 7cf289ca 2004-04-06 devnull Rune* script;
777 7cf289ca 2004-04-06 devnull Map* map;
778 7cf289ca 2004-04-06 devnull Form* frm;
779 7cf289ca 2004-04-06 devnull Iimage* ii;
780 7cf289ca 2004-04-06 devnull Kidinfo* kd;
781 7cf289ca 2004-04-06 devnull Kidinfo* ks;
782 7cf289ca 2004-04-06 devnull Kidinfo* pks;
783 7cf289ca 2004-04-06 devnull Dimen wd;
784 7cf289ca 2004-04-06 devnull Option* option;
785 7cf289ca 2004-04-06 devnull Table* tab;
786 7cf289ca 2004-04-06 devnull Tablecell* c;
787 7cf289ca 2004-04-06 devnull Tablerow* tr;
788 7cf289ca 2004-04-06 devnull Formfield* field;
789 7cf289ca 2004-04-06 devnull Formfield* ff;
790 7cf289ca 2004-04-06 devnull Rune* href;
791 7cf289ca 2004-04-06 devnull Rune* src;
792 7cf289ca 2004-04-06 devnull Rune* scriptsrc;
793 7cf289ca 2004-04-06 devnull Rune* bgurl;
794 7cf289ca 2004-04-06 devnull Rune* action;
795 7cf289ca 2004-04-06 devnull Background bg;
796 7cf289ca 2004-04-06 devnull
797 7cf289ca 2004-04-06 devnull if(!buildinited)
798 7cf289ca 2004-04-06 devnull buildinit();
799 cbeb0b26 2006-04-01 devnull doscripts = 0; /* for now */
800 7cf289ca 2004-04-06 devnull ps = is->psstk;
801 7cf289ca 2004-04-06 devnull curtab = is->tabstk;
802 7cf289ca 2004-04-06 devnull di = is->doc;
803 7cf289ca 2004-04-06 devnull toks = _gettoks(data, datalen, di->chset, di->mediatype, &tokslen);
804 7cf289ca 2004-04-06 devnull toki = 0;
805 7cf289ca 2004-04-06 devnull for(; toki < tokslen; toki++) {
806 7cf289ca 2004-04-06 devnull tok = &toks[toki];
807 7cf289ca 2004-04-06 devnull if(dbgbuild > 1)
808 7cf289ca 2004-04-06 devnull fprint(2, "build: curstate %ux, token %T\n", ps->curstate, tok);
809 7cf289ca 2004-04-06 devnull tag = tok->tag;
810 7cf289ca 2004-04-06 devnull brk = 0;
811 7cf289ca 2004-04-06 devnull brksp = 0;
812 7cf289ca 2004-04-06 devnull if(tag < Numtags) {
813 7cf289ca 2004-04-06 devnull brk = blockbrk[tag];
814 7cf289ca 2004-04-06 devnull if(brk&SPBefore)
815 7cf289ca 2004-04-06 devnull brksp = 1;
816 7cf289ca 2004-04-06 devnull }
817 7cf289ca 2004-04-06 devnull else if(tag < Numtags + RBRA) {
818 7cf289ca 2004-04-06 devnull brk = blockbrk[tag - RBRA];
819 7cf289ca 2004-04-06 devnull if(brk&SPAfter)
820 7cf289ca 2004-04-06 devnull brksp = 1;
821 7cf289ca 2004-04-06 devnull }
822 7cf289ca 2004-04-06 devnull if(brk) {
823 7cf289ca 2004-04-06 devnull addbrk(ps, brksp, 0);
824 7cf289ca 2004-04-06 devnull if(ps->inpar) {
825 7cf289ca 2004-04-06 devnull popjust(ps);
826 7cf289ca 2004-04-06 devnull ps->inpar = 0;
827 7cf289ca 2004-04-06 devnull }
828 7cf289ca 2004-04-06 devnull }
829 cbeb0b26 2006-04-01 devnull /* check common case first (Data), then switch statement on tag */
830 7cf289ca 2004-04-06 devnull if(tag == Data) {
831 cbeb0b26 2006-04-01 devnull /* Lexing didn't pay attention to SGML record boundary rules: */
832 cbeb0b26 2006-04-01 devnull /* \n after start tag or before end tag to be discarded. */
833 cbeb0b26 2006-04-01 devnull /* (Lex has already discarded all \r's). */
834 cbeb0b26 2006-04-01 devnull /* Some pages assume this doesn't happen in <PRE> text, */
835 cbeb0b26 2006-04-01 devnull /* so we won't do it if literal is true. */
836 cbeb0b26 2006-04-01 devnull /* BUG: won't discard \n before a start tag that begins */
837 cbeb0b26 2006-04-01 devnull /* the next bufferful of tokens. */
838 7cf289ca 2004-04-06 devnull s = tok->text;
839 7cf289ca 2004-04-06 devnull n = _Strlen(s);
840 7cf289ca 2004-04-06 devnull if(!ps->literal) {
841 7cf289ca 2004-04-06 devnull i = 0;
842 7cf289ca 2004-04-06 devnull j = n;
843 7cf289ca 2004-04-06 devnull if(toki > 0) {
844 7cf289ca 2004-04-06 devnull pt = toks[toki - 1].tag;
845 cbeb0b26 2006-04-01 devnull /* IE and Netscape both ignore this rule (contrary to spec) */
846 cbeb0b26 2006-04-01 devnull /* if previous tag was img */
847 7cf289ca 2004-04-06 devnull if(pt < Numtags && pt != Timg && j > 0 && s[0] == '\n')
848 7cf289ca 2004-04-06 devnull i++;
849 7cf289ca 2004-04-06 devnull }
850 7cf289ca 2004-04-06 devnull if(toki < tokslen - 1) {
851 7cf289ca 2004-04-06 devnull nt = toks[toki + 1].tag;
852 7cf289ca 2004-04-06 devnull if(nt >= RBRA && nt < Numtags + RBRA && j > i && s[j - 1] == '\n')
853 7cf289ca 2004-04-06 devnull j--;
854 7cf289ca 2004-04-06 devnull }
855 7cf289ca 2004-04-06 devnull if(i > 0 || j < n) {
856 7cf289ca 2004-04-06 devnull t = s;
857 7cf289ca 2004-04-06 devnull s = _Strsubstr(s, i, j);
858 7cf289ca 2004-04-06 devnull free(t);
859 7cf289ca 2004-04-06 devnull n = j-i;
860 7cf289ca 2004-04-06 devnull }
861 7cf289ca 2004-04-06 devnull }
862 7cf289ca 2004-04-06 devnull if(ps->skipwhite) {
863 7cf289ca 2004-04-06 devnull _trimwhite(s, n, &t, &nt);
864 7cf289ca 2004-04-06 devnull if(t == nil) {
865 7cf289ca 2004-04-06 devnull free(s);
866 7cf289ca 2004-04-06 devnull s = nil;
867 7cf289ca 2004-04-06 devnull }
868 7cf289ca 2004-04-06 devnull else if(t != s) {
869 7cf289ca 2004-04-06 devnull t = _Strndup(t, nt);
870 7cf289ca 2004-04-06 devnull free(s);
871 7cf289ca 2004-04-06 devnull s = t;
872 7cf289ca 2004-04-06 devnull }
873 7cf289ca 2004-04-06 devnull if(s != nil)
874 7cf289ca 2004-04-06 devnull ps->skipwhite = 0;
875 7cf289ca 2004-04-06 devnull }
876 cbeb0b26 2006-04-01 devnull tok->text = nil; /* token doesn't own string anymore */
877 cbeb0b26 2006-04-01 devnull if(s != nil){
878 7cf289ca 2004-04-06 devnull addtext(ps, s);
879 cbeb0b26 2006-04-01 devnull s = nil;
880 cbeb0b26 2006-04-01 devnull }
881 7cf289ca 2004-04-06 devnull }
882 7cf289ca 2004-04-06 devnull else
883 7cf289ca 2004-04-06 devnull switch(tag) {
884 cbeb0b26 2006-04-01 devnull /* Some abbrevs used in following DTD comments */
885 cbeb0b26 2006-04-01 devnull /* %text = #PCDATA */
886 cbeb0b26 2006-04-01 devnull /* | TT | I | B | U | STRIKE | BIG | SMALL | SUB | SUP */
887 cbeb0b26 2006-04-01 devnull /* | EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE */
888 cbeb0b26 2006-04-01 devnull /* | A | IMG | APPLET | FONT | BASEFONT | BR | SCRIPT | MAP */
889 cbeb0b26 2006-04-01 devnull /* | INPUT | SELECT | TEXTAREA */
890 cbeb0b26 2006-04-01 devnull /* %block = P | UL | OL | DIR | MENU | DL | PRE | DL | DIV | CENTER */
891 cbeb0b26 2006-04-01 devnull /* | BLOCKQUOTE | FORM | ISINDEX | HR | TABLE */
892 cbeb0b26 2006-04-01 devnull /* %flow = (%text | %block)* */
893 cbeb0b26 2006-04-01 devnull /* %body.content = (%heading | %text | %block | ADDRESS)* */
894 7cf289ca 2004-04-06 devnull
895 cbeb0b26 2006-04-01 devnull /* <!ELEMENT A - - (%text) -(A)> */
896 cbeb0b26 2006-04-01 devnull /* Anchors are not supposed to be nested, but you sometimes see */
897 cbeb0b26 2006-04-01 devnull /* href anchors inside destination anchors. */
898 7cf289ca 2004-04-06 devnull case Ta:
899 7cf289ca 2004-04-06 devnull if(ps->curanchor != 0) {
900 7cf289ca 2004-04-06 devnull if(warn)
901 7cf289ca 2004-04-06 devnull fprint(2, "warning: nested <A> or missing </A>\n");
902 7cf289ca 2004-04-06 devnull ps->curanchor = 0;
903 7cf289ca 2004-04-06 devnull }
904 7cf289ca 2004-04-06 devnull name = aval(tok, Aname);
905 7cf289ca 2004-04-06 devnull href = aurlval(tok, Ahref, nil, di->base);
906 cbeb0b26 2006-04-01 devnull /* ignore rel, rev, and title attrs */
907 7cf289ca 2004-04-06 devnull if(href != nil) {
908 7cf289ca 2004-04-06 devnull target = atargval(tok, di->target);
909 7cf289ca 2004-04-06 devnull di->anchors = newanchor(++is->nanchors, name, href, target, di->anchors);
910 7cf289ca 2004-04-06 devnull if(name != nil)
911 cbeb0b26 2006-04-01 devnull name = _Strdup(name); /* for DestAnchor construction, below */
912 7cf289ca 2004-04-06 devnull ps->curanchor = is->nanchors;
913 7cf289ca 2004-04-06 devnull ps->curfg = push(&ps->fgstk, di->link);
914 7cf289ca 2004-04-06 devnull ps->curul = push(&ps->ulstk, ULunder);
915 7cf289ca 2004-04-06 devnull }
916 7cf289ca 2004-04-06 devnull if(name != nil) {
917 cbeb0b26 2006-04-01 devnull /* add a null item to be destination */
918 7cf289ca 2004-04-06 devnull additem(ps, newispacer(ISPnull), tok);
919 7cf289ca 2004-04-06 devnull di->dests = newdestanchor(++is->nanchors, name, ps->lastit, di->dests);
920 7cf289ca 2004-04-06 devnull }
921 7cf289ca 2004-04-06 devnull break;
922 7cf289ca 2004-04-06 devnull
923 7cf289ca 2004-04-06 devnull case Ta+RBRA :
924 7cf289ca 2004-04-06 devnull if(ps->curanchor != 0) {
925 7cf289ca 2004-04-06 devnull ps->curfg = popretnewtop(&ps->fgstk, di->text);
926 7cf289ca 2004-04-06 devnull ps->curul = popretnewtop(&ps->ulstk, ULnone);
927 7cf289ca 2004-04-06 devnull ps->curanchor = 0;
928 7cf289ca 2004-04-06 devnull }
929 7cf289ca 2004-04-06 devnull break;
930 7cf289ca 2004-04-06 devnull
931 cbeb0b26 2006-04-01 devnull /* <!ELEMENT APPLET - - (PARAM | %text)* > */
932 cbeb0b26 2006-04-01 devnull /* We can't do applets, so ignore PARAMS, and let */
933 cbeb0b26 2006-04-01 devnull /* the %text contents appear for the alternative rep */
934 7cf289ca 2004-04-06 devnull case Tapplet:
935 7cf289ca 2004-04-06 devnull case Tapplet+RBRA:
936 7cf289ca 2004-04-06 devnull if(warn && tag == Tapplet)
937 7cf289ca 2004-04-06 devnull fprint(2, "warning: <APPLET> ignored\n");
938 7cf289ca 2004-04-06 devnull break;
939 7cf289ca 2004-04-06 devnull
940 cbeb0b26 2006-04-01 devnull /* <!ELEMENT AREA - O EMPTY> */
941 7cf289ca 2004-04-06 devnull case Tarea:
942 7cf289ca 2004-04-06 devnull map = di->maps;
943 7cf289ca 2004-04-06 devnull if(map == nil) {
944 7cf289ca 2004-04-06 devnull if(warn)
945 7cf289ca 2004-04-06 devnull fprint(2, "warning: <AREA> not inside <MAP>\n");
946 7cf289ca 2004-04-06 devnull continue;
947 7cf289ca 2004-04-06 devnull }
948 7cf289ca 2004-04-06 devnull map->areas = newarea(atabval(tok, Ashape, shape_tab, NSHAPETAB, SHrect),
949 7cf289ca 2004-04-06 devnull aurlval(tok, Ahref, nil, di->base),
950 7cf289ca 2004-04-06 devnull atargval(tok, di->target),
951 7cf289ca 2004-04-06 devnull map->areas);
952 7cf289ca 2004-04-06 devnull setdimarray(tok, Acoords, &map->areas->coords, &map->areas->ncoords);
953 7cf289ca 2004-04-06 devnull break;
954 7cf289ca 2004-04-06 devnull
955 cbeb0b26 2006-04-01 devnull /* <!ELEMENT (B|STRONG) - - (%text)*> */
956 7cf289ca 2004-04-06 devnull case Tb:
957 7cf289ca 2004-04-06 devnull case Tstrong:
958 7cf289ca 2004-04-06 devnull pushfontstyle(ps, FntB);
959 7cf289ca 2004-04-06 devnull break;
960 7cf289ca 2004-04-06 devnull
961 7cf289ca 2004-04-06 devnull case Tb+RBRA:
962 7cf289ca 2004-04-06 devnull case Tcite+RBRA:
963 7cf289ca 2004-04-06 devnull case Tcode+RBRA:
964 7cf289ca 2004-04-06 devnull case Tdfn+RBRA:
965 7cf289ca 2004-04-06 devnull case Tem+RBRA:
966 7cf289ca 2004-04-06 devnull case Tkbd+RBRA:
967 7cf289ca 2004-04-06 devnull case Ti+RBRA:
968 7cf289ca 2004-04-06 devnull case Tsamp+RBRA:
969 7cf289ca 2004-04-06 devnull case Tstrong+RBRA:
970 7cf289ca 2004-04-06 devnull case Ttt+RBRA:
971 7cf289ca 2004-04-06 devnull case Tvar+RBRA :
972 7cf289ca 2004-04-06 devnull case Taddress+RBRA:
973 7cf289ca 2004-04-06 devnull popfontstyle(ps);
974 7cf289ca 2004-04-06 devnull break;
975 7cf289ca 2004-04-06 devnull
976 cbeb0b26 2006-04-01 devnull /* <!ELEMENT BASE - O EMPTY> */
977 7cf289ca 2004-04-06 devnull case Tbase:
978 7cf289ca 2004-04-06 devnull t = di->base;
979 7cf289ca 2004-04-06 devnull di->base = aurlval(tok, Ahref, di->base, di->base);
980 7cf289ca 2004-04-06 devnull if(t != nil)
981 7cf289ca 2004-04-06 devnull free(t);
982 7cf289ca 2004-04-06 devnull di->target = atargval(tok, di->target);
983 7cf289ca 2004-04-06 devnull break;
984 7cf289ca 2004-04-06 devnull
985 cbeb0b26 2006-04-01 devnull /* <!ELEMENT BASEFONT - O EMPTY> */
986 7cf289ca 2004-04-06 devnull case Tbasefont:
987 7cf289ca 2004-04-06 devnull ps->adjsize = aintval(tok, Asize, 3) - 3;
988 7cf289ca 2004-04-06 devnull break;
989 7cf289ca 2004-04-06 devnull
990 cbeb0b26 2006-04-01 devnull /* <!ELEMENT (BIG|SMALL) - - (%text)*> */
991 7cf289ca 2004-04-06 devnull case Tbig:
992 7cf289ca 2004-04-06 devnull case Tsmall:
993 7cf289ca 2004-04-06 devnull sz = ps->adjsize;
994 7cf289ca 2004-04-06 devnull if(tag == Tbig)
995 7cf289ca 2004-04-06 devnull sz += Large;
996 7cf289ca 2004-04-06 devnull else
997 7cf289ca 2004-04-06 devnull sz += Small;
998 7cf289ca 2004-04-06 devnull pushfontsize(ps, sz);
999 7cf289ca 2004-04-06 devnull break;
1000 7cf289ca 2004-04-06 devnull
1001 7cf289ca 2004-04-06 devnull case Tbig+RBRA:
1002 7cf289ca 2004-04-06 devnull case Tsmall+RBRA:
1003 7cf289ca 2004-04-06 devnull popfontsize(ps);
1004 7cf289ca 2004-04-06 devnull break;
1005 7cf289ca 2004-04-06 devnull
1006 cbeb0b26 2006-04-01 devnull /* <!ELEMENT BLOCKQUOTE - - %body.content> */
1007 7cf289ca 2004-04-06 devnull case Tblockquote:
1008 7cf289ca 2004-04-06 devnull changeindent(ps, BQTAB);
1009 7cf289ca 2004-04-06 devnull break;
1010 7cf289ca 2004-04-06 devnull
1011 7cf289ca 2004-04-06 devnull case Tblockquote+RBRA:
1012 7cf289ca 2004-04-06 devnull changeindent(ps, -BQTAB);
1013 7cf289ca 2004-04-06 devnull break;
1014 7cf289ca 2004-04-06 devnull
1015 cbeb0b26 2006-04-01 devnull /* <!ELEMENT BODY O O %body.content> */
1016 7cf289ca 2004-04-06 devnull case Tbody:
1017 7cf289ca 2004-04-06 devnull ps->skipping = 0;
1018 7cf289ca 2004-04-06 devnull bg = makebackground(nil, acolorval(tok, Abgcolor, di->background.color));
1019 7cf289ca 2004-04-06 devnull bgurl = aurlval(tok, Abackground, nil, di->base);
1020 7cf289ca 2004-04-06 devnull if(bgurl != nil) {
1021 7cf289ca 2004-04-06 devnull if(di->backgrounditem != nil)
1022 7cf289ca 2004-04-06 devnull freeitem((Item*)di->backgrounditem);
1023 cbeb0b26 2006-04-01 devnull /* really should remove old item from di->images list, */
1024 cbeb0b26 2006-04-01 devnull /* but there should only be one BODY element ... */
1025 7cf289ca 2004-04-06 devnull di->backgrounditem = (Iimage*)newiimage(bgurl, nil, ALnone, 0, 0, 0, 0, 0, 0, nil);
1026 7cf289ca 2004-04-06 devnull di->backgrounditem->nextimage = di->images;
1027 7cf289ca 2004-04-06 devnull di->images = di->backgrounditem;
1028 7cf289ca 2004-04-06 devnull }
1029 7cf289ca 2004-04-06 devnull ps->curbg = bg;
1030 7cf289ca 2004-04-06 devnull di->background = bg;
1031 7cf289ca 2004-04-06 devnull di->text = acolorval(tok, Atext, di->text);
1032 7cf289ca 2004-04-06 devnull di->link = acolorval(tok, Alink, di->link);
1033 7cf289ca 2004-04-06 devnull di->vlink = acolorval(tok, Avlink, di->vlink);
1034 7cf289ca 2004-04-06 devnull di->alink = acolorval(tok, Aalink, di->alink);
1035 7cf289ca 2004-04-06 devnull if(di->text != ps->curfg) {
1036 7cf289ca 2004-04-06 devnull ps->curfg = di->text;
1037 7cf289ca 2004-04-06 devnull ps->fgstk.n = 0;
1038 7cf289ca 2004-04-06 devnull }
1039 7cf289ca 2004-04-06 devnull break;
1040 7cf289ca 2004-04-06 devnull
1041 7cf289ca 2004-04-06 devnull case Tbody+RBRA:
1042 cbeb0b26 2006-04-01 devnull /* HTML spec says ignore things after </body>, */
1043 cbeb0b26 2006-04-01 devnull /* but IE and Netscape don't */
1044 cbeb0b26 2006-04-01 devnull /* ps.skipping = 1; */
1045 7cf289ca 2004-04-06 devnull break;
1046 7cf289ca 2004-04-06 devnull
1047 cbeb0b26 2006-04-01 devnull /* <!ELEMENT BR - O EMPTY> */
1048 7cf289ca 2004-04-06 devnull case Tbr:
1049 7cf289ca 2004-04-06 devnull addlinebrk(ps, atabval(tok, Aclear, clear_tab, NCLEARTAB, 0));
1050 7cf289ca 2004-04-06 devnull break;
1051 7cf289ca 2004-04-06 devnull
1052 cbeb0b26 2006-04-01 devnull /* <!ELEMENT CAPTION - - (%text;)*> */
1053 7cf289ca 2004-04-06 devnull case Tcaption:
1054 7cf289ca 2004-04-06 devnull if(curtab == nil) {
1055 7cf289ca 2004-04-06 devnull if(warn)
1056 7cf289ca 2004-04-06 devnull fprint(2, "warning: <CAPTION> outside <TABLE>\n");
1057 7cf289ca 2004-04-06 devnull continue;
1058 7cf289ca 2004-04-06 devnull }
1059 7cf289ca 2004-04-06 devnull if(curtab->caption != nil) {
1060 7cf289ca 2004-04-06 devnull if(warn)
1061 7cf289ca 2004-04-06 devnull fprint(2, "warning: more than one <CAPTION> in <TABLE>\n");
1062 7cf289ca 2004-04-06 devnull continue;
1063 7cf289ca 2004-04-06 devnull }
1064 7cf289ca 2004-04-06 devnull ps = newpstate(ps);
1065 7cf289ca 2004-04-06 devnull curtab->caption_place = atabval(tok, Aalign, align_tab, NALIGNTAB, ALtop);
1066 7cf289ca 2004-04-06 devnull break;
1067 7cf289ca 2004-04-06 devnull
1068 7cf289ca 2004-04-06 devnull case Tcaption+RBRA:
1069 7cf289ca 2004-04-06 devnull nextps = ps->next;
1070 7cf289ca 2004-04-06 devnull if(curtab == nil || nextps == nil) {
1071 7cf289ca 2004-04-06 devnull if(warn)
1072 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </CAPTION>\n");
1073 7cf289ca 2004-04-06 devnull continue;
1074 7cf289ca 2004-04-06 devnull }
1075 7cf289ca 2004-04-06 devnull curtab->caption = ps->items->next;
1076 7cf289ca 2004-04-06 devnull free(ps);
1077 7cf289ca 2004-04-06 devnull ps = nextps;
1078 7cf289ca 2004-04-06 devnull break;
1079 7cf289ca 2004-04-06 devnull
1080 7cf289ca 2004-04-06 devnull case Tcenter:
1081 7cf289ca 2004-04-06 devnull case Tdiv:
1082 7cf289ca 2004-04-06 devnull if(tag == Tcenter)
1083 7cf289ca 2004-04-06 devnull al = ALcenter;
1084 7cf289ca 2004-04-06 devnull else
1085 7cf289ca 2004-04-06 devnull al = atabval(tok, Aalign, align_tab, NALIGNTAB, ps->curjust);
1086 7cf289ca 2004-04-06 devnull pushjust(ps, al);
1087 7cf289ca 2004-04-06 devnull break;
1088 7cf289ca 2004-04-06 devnull
1089 7cf289ca 2004-04-06 devnull case Tcenter+RBRA:
1090 7cf289ca 2004-04-06 devnull case Tdiv+RBRA:
1091 7cf289ca 2004-04-06 devnull popjust(ps);
1092 7cf289ca 2004-04-06 devnull break;
1093 7cf289ca 2004-04-06 devnull
1094 cbeb0b26 2006-04-01 devnull /* <!ELEMENT DD - O %flow > */
1095 7cf289ca 2004-04-06 devnull case Tdd:
1096 7cf289ca 2004-04-06 devnull if(ps->hangstk.n == 0) {
1097 7cf289ca 2004-04-06 devnull if(warn)
1098 7cf289ca 2004-04-06 devnull fprint(2, "warning: <DD> not inside <DL\n");
1099 7cf289ca 2004-04-06 devnull continue;
1100 7cf289ca 2004-04-06 devnull }
1101 7cf289ca 2004-04-06 devnull h = top(&ps->hangstk, 0);
1102 7cf289ca 2004-04-06 devnull if(h != 0)
1103 7cf289ca 2004-04-06 devnull changehang(ps, -10*LISTTAB);
1104 7cf289ca 2004-04-06 devnull else
1105 7cf289ca 2004-04-06 devnull addbrk(ps, 0, 0);
1106 7cf289ca 2004-04-06 devnull push(&ps->hangstk, 0);
1107 7cf289ca 2004-04-06 devnull break;
1108 7cf289ca 2004-04-06 devnull
1109 cbeb0b26 2006-04-01 devnull /*<!ELEMENT (DIR|MENU) - - (LI)+ -(%block) > */
1110 cbeb0b26 2006-04-01 devnull /*<!ELEMENT (OL|UL) - - (LI)+> */
1111 7cf289ca 2004-04-06 devnull case Tdir:
1112 7cf289ca 2004-04-06 devnull case Tmenu:
1113 7cf289ca 2004-04-06 devnull case Tol:
1114 7cf289ca 2004-04-06 devnull case Tul:
1115 7cf289ca 2004-04-06 devnull changeindent(ps, LISTTAB);
1116 7cf289ca 2004-04-06 devnull push(&ps->listtypestk, listtyval(tok, (tag==Tol)? LT1 : LTdisc));
1117 7cf289ca 2004-04-06 devnull push(&ps->listcntstk, aintval(tok, Astart, 1));
1118 7cf289ca 2004-04-06 devnull break;
1119 7cf289ca 2004-04-06 devnull
1120 7cf289ca 2004-04-06 devnull case Tdir+RBRA:
1121 7cf289ca 2004-04-06 devnull case Tmenu+RBRA:
1122 7cf289ca 2004-04-06 devnull case Tol+RBRA:
1123 7cf289ca 2004-04-06 devnull case Tul+RBRA:
1124 7cf289ca 2004-04-06 devnull if(ps->listtypestk.n == 0) {
1125 7cf289ca 2004-04-06 devnull if(warn)
1126 7cf289ca 2004-04-06 devnull fprint(2, "warning: %T ended no list\n", tok);
1127 7cf289ca 2004-04-06 devnull continue;
1128 7cf289ca 2004-04-06 devnull }
1129 7cf289ca 2004-04-06 devnull addbrk(ps, 0, 0);
1130 7cf289ca 2004-04-06 devnull pop(&ps->listtypestk);
1131 7cf289ca 2004-04-06 devnull pop(&ps->listcntstk);
1132 7cf289ca 2004-04-06 devnull changeindent(ps, -LISTTAB);
1133 7cf289ca 2004-04-06 devnull break;
1134 7cf289ca 2004-04-06 devnull
1135 cbeb0b26 2006-04-01 devnull /* <!ELEMENT DL - - (DT|DD)+ > */
1136 7cf289ca 2004-04-06 devnull case Tdl:
1137 7cf289ca 2004-04-06 devnull changeindent(ps, LISTTAB);
1138 7cf289ca 2004-04-06 devnull push(&ps->hangstk, 0);
1139 7cf289ca 2004-04-06 devnull break;
1140 7cf289ca 2004-04-06 devnull
1141 7cf289ca 2004-04-06 devnull case Tdl+RBRA:
1142 7cf289ca 2004-04-06 devnull if(ps->hangstk.n == 0) {
1143 7cf289ca 2004-04-06 devnull if(warn)
1144 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </DL>\n");
1145 7cf289ca 2004-04-06 devnull continue;
1146 7cf289ca 2004-04-06 devnull }
1147 7cf289ca 2004-04-06 devnull changeindent(ps, -LISTTAB);
1148 7cf289ca 2004-04-06 devnull if(top(&ps->hangstk, 0) != 0)
1149 7cf289ca 2004-04-06 devnull changehang(ps, -10*LISTTAB);
1150 7cf289ca 2004-04-06 devnull pop(&ps->hangstk);
1151 7cf289ca 2004-04-06 devnull break;
1152 7cf289ca 2004-04-06 devnull
1153 cbeb0b26 2006-04-01 devnull /* <!ELEMENT DT - O (%text)* > */
1154 7cf289ca 2004-04-06 devnull case Tdt:
1155 7cf289ca 2004-04-06 devnull if(ps->hangstk.n == 0) {
1156 7cf289ca 2004-04-06 devnull if(warn)
1157 7cf289ca 2004-04-06 devnull fprint(2, "warning: <DT> not inside <DL>\n");
1158 7cf289ca 2004-04-06 devnull continue;
1159 7cf289ca 2004-04-06 devnull }
1160 7cf289ca 2004-04-06 devnull h = top(&ps->hangstk, 0);
1161 7cf289ca 2004-04-06 devnull pop(&ps->hangstk);
1162 7cf289ca 2004-04-06 devnull if(h != 0)
1163 7cf289ca 2004-04-06 devnull changehang(ps, -10*LISTTAB);
1164 7cf289ca 2004-04-06 devnull changehang(ps, 10*LISTTAB);
1165 7cf289ca 2004-04-06 devnull push(&ps->hangstk, 1);
1166 7cf289ca 2004-04-06 devnull break;
1167 7cf289ca 2004-04-06 devnull
1168 cbeb0b26 2006-04-01 devnull /* <!ELEMENT FONT - - (%text)*> */
1169 7cf289ca 2004-04-06 devnull case Tfont:
1170 7cf289ca 2004-04-06 devnull sz = top(&ps->fntsizestk, Normal);
1171 7cf289ca 2004-04-06 devnull if(_tokaval(tok, Asize, &nsz, 0)) {
1172 7cf289ca 2004-04-06 devnull if(_prefix(L(Lplus), nsz))
1173 7cf289ca 2004-04-06 devnull sz = Normal + _Strtol(nsz+1, nil, 10) + ps->adjsize;
1174 7cf289ca 2004-04-06 devnull else if(_prefix(L(Lminus), nsz))
1175 7cf289ca 2004-04-06 devnull sz = Normal - _Strtol(nsz+1, nil, 10) + ps->adjsize;
1176 7cf289ca 2004-04-06 devnull else if(nsz != nil)
1177 7cf289ca 2004-04-06 devnull sz = Normal + (_Strtol(nsz, nil, 10) - 3);
1178 7cf289ca 2004-04-06 devnull }
1179 7cf289ca 2004-04-06 devnull ps->curfg = push(&ps->fgstk, acolorval(tok, Acolor, ps->curfg));
1180 7cf289ca 2004-04-06 devnull pushfontsize(ps, sz);
1181 7cf289ca 2004-04-06 devnull break;
1182 7cf289ca 2004-04-06 devnull
1183 7cf289ca 2004-04-06 devnull case Tfont+RBRA:
1184 7cf289ca 2004-04-06 devnull if(ps->fgstk.n == 0) {
1185 7cf289ca 2004-04-06 devnull if(warn)
1186 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </FONT>\n");
1187 7cf289ca 2004-04-06 devnull continue;
1188 7cf289ca 2004-04-06 devnull }
1189 7cf289ca 2004-04-06 devnull ps->curfg = popretnewtop(&ps->fgstk, di->text);
1190 7cf289ca 2004-04-06 devnull popfontsize(ps);
1191 7cf289ca 2004-04-06 devnull break;
1192 7cf289ca 2004-04-06 devnull
1193 cbeb0b26 2006-04-01 devnull /* <!ELEMENT FORM - - %body.content -(FORM) > */
1194 7cf289ca 2004-04-06 devnull case Tform:
1195 7cf289ca 2004-04-06 devnull if(is->curform != nil) {
1196 7cf289ca 2004-04-06 devnull if(warn)
1197 7cf289ca 2004-04-06 devnull fprint(2, "warning: <FORM> nested inside another\n");
1198 7cf289ca 2004-04-06 devnull continue;
1199 7cf289ca 2004-04-06 devnull }
1200 7cf289ca 2004-04-06 devnull action = aurlval(tok, Aaction, di->base, di->base);
1201 7cf289ca 2004-04-06 devnull s = aval(tok, Aid);
1202 7cf289ca 2004-04-06 devnull name = astrval(tok, Aname, s);
1203 7cf289ca 2004-04-06 devnull if(s)
1204 7cf289ca 2004-04-06 devnull free(s);
1205 7cf289ca 2004-04-06 devnull target = atargval(tok, di->target);
1206 7cf289ca 2004-04-06 devnull method = atabval(tok, Amethod, method_tab, NMETHODTAB, HGet);
1207 7cf289ca 2004-04-06 devnull if(warn && _tokaval(tok, Aenctype, &enctype, 0) &&
1208 7cf289ca 2004-04-06 devnull _Strcmp(enctype, L(Lappl_form)))
1209 7cf289ca 2004-04-06 devnull fprint(2, "form enctype %S not handled\n", enctype);
1210 7cf289ca 2004-04-06 devnull frm = newform(++is->nforms, name, action, target, method, di->forms);
1211 7cf289ca 2004-04-06 devnull di->forms = frm;
1212 7cf289ca 2004-04-06 devnull is->curform = frm;
1213 7cf289ca 2004-04-06 devnull break;
1214 7cf289ca 2004-04-06 devnull
1215 7cf289ca 2004-04-06 devnull case Tform+RBRA:
1216 7cf289ca 2004-04-06 devnull if(is->curform == nil) {
1217 7cf289ca 2004-04-06 devnull if(warn)
1218 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </FORM>\n");
1219 7cf289ca 2004-04-06 devnull continue;
1220 7cf289ca 2004-04-06 devnull }
1221 cbeb0b26 2006-04-01 devnull /* put fields back in input order */
1222 7cf289ca 2004-04-06 devnull is->curform->fields = (Formfield*)_revlist((List*)is->curform->fields);
1223 7cf289ca 2004-04-06 devnull is->curform = nil;
1224 7cf289ca 2004-04-06 devnull break;
1225 7cf289ca 2004-04-06 devnull
1226 cbeb0b26 2006-04-01 devnull /* <!ELEMENT FRAME - O EMPTY> */
1227 7cf289ca 2004-04-06 devnull case Tframe:
1228 7cf289ca 2004-04-06 devnull ks = is->kidstk;
1229 7cf289ca 2004-04-06 devnull if(ks == nil) {
1230 7cf289ca 2004-04-06 devnull if(warn)
1231 7cf289ca 2004-04-06 devnull fprint(2, "warning: <FRAME> not in <FRAMESET>\n");
1232 7cf289ca 2004-04-06 devnull continue;
1233 7cf289ca 2004-04-06 devnull }
1234 7cf289ca 2004-04-06 devnull ks->kidinfos = kd = newkidinfo(0, ks->kidinfos);
1235 7cf289ca 2004-04-06 devnull kd->src = aurlval(tok, Asrc, nil, di->base);
1236 7cf289ca 2004-04-06 devnull kd->name = aval(tok, Aname);
1237 7cf289ca 2004-04-06 devnull if(kd->name == nil) {
1238 7cf289ca 2004-04-06 devnull s = _ltoStr(++is->nframes);
1239 7cf289ca 2004-04-06 devnull kd->name = _Strdup2(L(Lfr), s);
1240 7cf289ca 2004-04-06 devnull free(s);
1241 7cf289ca 2004-04-06 devnull }
1242 7cf289ca 2004-04-06 devnull kd->marginw = auintval(tok, Amarginwidth, 0);
1243 7cf289ca 2004-04-06 devnull kd->marginh = auintval(tok, Amarginheight, 0);
1244 7cf289ca 2004-04-06 devnull kd->framebd = auintval(tok, Aframeborder, 1);
1245 7cf289ca 2004-04-06 devnull kd->flags = atabval(tok, Ascrolling, fscroll_tab, NFSCROLLTAB, kd->flags);
1246 7cf289ca 2004-04-06 devnull norsz = aflagval(tok, Anoresize);
1247 7cf289ca 2004-04-06 devnull if(norsz)
1248 7cf289ca 2004-04-06 devnull kd->flags |= FRnoresize;
1249 7cf289ca 2004-04-06 devnull break;
1250 7cf289ca 2004-04-06 devnull
1251 cbeb0b26 2006-04-01 devnull /* <!ELEMENT FRAMESET - - (FRAME|FRAMESET)+> */
1252 7cf289ca 2004-04-06 devnull case Tframeset:
1253 7cf289ca 2004-04-06 devnull ks = newkidinfo(1, nil);
1254 7cf289ca 2004-04-06 devnull pks = is->kidstk;
1255 7cf289ca 2004-04-06 devnull if(pks == nil)
1256 7cf289ca 2004-04-06 devnull di->kidinfo = ks;
1257 7cf289ca 2004-04-06 devnull else {
1258 7cf289ca 2004-04-06 devnull ks->next = pks->kidinfos;
1259 7cf289ca 2004-04-06 devnull pks->kidinfos = ks;
1260 7cf289ca 2004-04-06 devnull }
1261 7cf289ca 2004-04-06 devnull ks->nextframeset = pks;
1262 7cf289ca 2004-04-06 devnull is->kidstk = ks;
1263 7cf289ca 2004-04-06 devnull setdimarray(tok, Arows, &ks->rows, &ks->nrows);
1264 7cf289ca 2004-04-06 devnull if(ks->nrows == 0) {
1265 7cf289ca 2004-04-06 devnull ks->rows = (Dimen*)emalloc(sizeof(Dimen));
1266 7cf289ca 2004-04-06 devnull ks->nrows = 1;
1267 7cf289ca 2004-04-06 devnull ks->rows[0] = makedimen(Dpercent, 100);
1268 7cf289ca 2004-04-06 devnull }
1269 7cf289ca 2004-04-06 devnull setdimarray(tok, Acols, &ks->cols, &ks->ncols);
1270 7cf289ca 2004-04-06 devnull if(ks->ncols == 0) {
1271 7cf289ca 2004-04-06 devnull ks->cols = (Dimen*)emalloc(sizeof(Dimen));
1272 7cf289ca 2004-04-06 devnull ks->ncols = 1;
1273 7cf289ca 2004-04-06 devnull ks->cols[0] = makedimen(Dpercent, 100);
1274 7cf289ca 2004-04-06 devnull }
1275 7cf289ca 2004-04-06 devnull break;
1276 7cf289ca 2004-04-06 devnull
1277 7cf289ca 2004-04-06 devnull case Tframeset+RBRA:
1278 7cf289ca 2004-04-06 devnull if(is->kidstk == nil) {
1279 7cf289ca 2004-04-06 devnull if(warn)
1280 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </FRAMESET>\n");
1281 7cf289ca 2004-04-06 devnull continue;
1282 7cf289ca 2004-04-06 devnull }
1283 7cf289ca 2004-04-06 devnull ks = is->kidstk;
1284 cbeb0b26 2006-04-01 devnull /* put kids back in original order */
1285 cbeb0b26 2006-04-01 devnull /* and add blank frames to fill out cells */
1286 7cf289ca 2004-04-06 devnull n = ks->nrows*ks->ncols;
1287 7cf289ca 2004-04-06 devnull nblank = n - _listlen((List*)ks->kidinfos);
1288 7cf289ca 2004-04-06 devnull while(nblank-- > 0)
1289 7cf289ca 2004-04-06 devnull ks->kidinfos = newkidinfo(0, ks->kidinfos);
1290 7cf289ca 2004-04-06 devnull ks->kidinfos = (Kidinfo*)_revlist((List*)ks->kidinfos);
1291 7cf289ca 2004-04-06 devnull is->kidstk = is->kidstk->nextframeset;
1292 7cf289ca 2004-04-06 devnull if(is->kidstk == nil) {
1293 cbeb0b26 2006-04-01 devnull /* end input */
1294 7cf289ca 2004-04-06 devnull ans = nil;
1295 7cf289ca 2004-04-06 devnull goto return_ans;
1296 7cf289ca 2004-04-06 devnull }
1297 7cf289ca 2004-04-06 devnull break;
1298 7cf289ca 2004-04-06 devnull
1299 cbeb0b26 2006-04-01 devnull /* <!ELEMENT H1 - - (%text;)*>, etc. */
1300 7cf289ca 2004-04-06 devnull case Th1:
1301 7cf289ca 2004-04-06 devnull case Th2:
1302 7cf289ca 2004-04-06 devnull case Th3:
1303 7cf289ca 2004-04-06 devnull case Th4:
1304 7cf289ca 2004-04-06 devnull case Th5:
1305 7cf289ca 2004-04-06 devnull case Th6:
1306 7cf289ca 2004-04-06 devnull bramt = 1;
1307 7cf289ca 2004-04-06 devnull if(ps->items == ps->lastit)
1308 7cf289ca 2004-04-06 devnull bramt = 0;
1309 7cf289ca 2004-04-06 devnull addbrk(ps, bramt, IFcleft|IFcright);
1310 7cf289ca 2004-04-06 devnull sz = Verylarge - (tag - Th1);
1311 7cf289ca 2004-04-06 devnull if(sz < Tiny)
1312 7cf289ca 2004-04-06 devnull sz = Tiny;
1313 7cf289ca 2004-04-06 devnull pushfontsize(ps, sz);
1314 7cf289ca 2004-04-06 devnull sty = top(&ps->fntstylestk, FntR);
1315 7cf289ca 2004-04-06 devnull if(tag == Th1)
1316 7cf289ca 2004-04-06 devnull sty = FntB;
1317 7cf289ca 2004-04-06 devnull pushfontstyle(ps, sty);
1318 7cf289ca 2004-04-06 devnull pushjust(ps, atabval(tok, Aalign, align_tab, NALIGNTAB, ps->curjust));
1319 7cf289ca 2004-04-06 devnull ps->skipwhite = 1;
1320 7cf289ca 2004-04-06 devnull break;
1321 7cf289ca 2004-04-06 devnull
1322 7cf289ca 2004-04-06 devnull case Th1+RBRA:
1323 7cf289ca 2004-04-06 devnull case Th2+RBRA:
1324 7cf289ca 2004-04-06 devnull case Th3+RBRA:
1325 7cf289ca 2004-04-06 devnull case Th4+RBRA:
1326 7cf289ca 2004-04-06 devnull case Th5+RBRA:
1327 7cf289ca 2004-04-06 devnull case Th6+RBRA:
1328 7cf289ca 2004-04-06 devnull addbrk(ps, 1, IFcleft|IFcright);
1329 7cf289ca 2004-04-06 devnull popfontsize(ps);
1330 7cf289ca 2004-04-06 devnull popfontstyle(ps);
1331 7cf289ca 2004-04-06 devnull popjust(ps);
1332 7cf289ca 2004-04-06 devnull break;
1333 7cf289ca 2004-04-06 devnull
1334 7cf289ca 2004-04-06 devnull case Thead:
1335 cbeb0b26 2006-04-01 devnull /* HTML spec says ignore regular markup in head, */
1336 cbeb0b26 2006-04-01 devnull /* but Netscape and IE don't */
1337 cbeb0b26 2006-04-01 devnull /* ps.skipping = 1; */
1338 7cf289ca 2004-04-06 devnull break;
1339 7cf289ca 2004-04-06 devnull
1340 7cf289ca 2004-04-06 devnull case Thead+RBRA:
1341 7cf289ca 2004-04-06 devnull ps->skipping = 0;
1342 7cf289ca 2004-04-06 devnull break;
1343 7cf289ca 2004-04-06 devnull
1344 cbeb0b26 2006-04-01 devnull /* <!ELEMENT HR - O EMPTY> */
1345 7cf289ca 2004-04-06 devnull case Thr:
1346 7cf289ca 2004-04-06 devnull al = atabval(tok, Aalign, align_tab, NALIGNTAB, ALcenter);
1347 7cf289ca 2004-04-06 devnull sz = auintval(tok, Asize, HRSZ);
1348 7cf289ca 2004-04-06 devnull wd = adimen(tok, Awidth);
1349 7cf289ca 2004-04-06 devnull if(dimenkind(wd) == Dnone)
1350 7cf289ca 2004-04-06 devnull wd = makedimen(Dpercent, 100);
1351 7cf289ca 2004-04-06 devnull nosh = aflagval(tok, Anoshade);
1352 7cf289ca 2004-04-06 devnull additem(ps, newirule(al, sz, nosh, wd), tok);
1353 7cf289ca 2004-04-06 devnull addbrk(ps, 0, 0);
1354 7cf289ca 2004-04-06 devnull break;
1355 7cf289ca 2004-04-06 devnull
1356 7cf289ca 2004-04-06 devnull case Ti:
1357 7cf289ca 2004-04-06 devnull case Tcite:
1358 7cf289ca 2004-04-06 devnull case Tdfn:
1359 7cf289ca 2004-04-06 devnull case Tem:
1360 7cf289ca 2004-04-06 devnull case Tvar:
1361 7cf289ca 2004-04-06 devnull case Taddress:
1362 7cf289ca 2004-04-06 devnull pushfontstyle(ps, FntI);
1363 7cf289ca 2004-04-06 devnull break;
1364 7cf289ca 2004-04-06 devnull
1365 cbeb0b26 2006-04-01 devnull /* <!ELEMENT IMG - O EMPTY> */
1366 7cf289ca 2004-04-06 devnull case Timg:
1367 7cf289ca 2004-04-06 devnull map = nil;
1368 7cf289ca 2004-04-06 devnull oldcuranchor = ps->curanchor;
1369 7cf289ca 2004-04-06 devnull if(_tokaval(tok, Ausemap, &usemap, 0)) {
1370 7cf289ca 2004-04-06 devnull if(!_prefix(L(Lhash), usemap)) {
1371 7cf289ca 2004-04-06 devnull if(warn)
1372 7cf289ca 2004-04-06 devnull fprint(2, "warning: can't handle non-local map %S\n", usemap);
1373 7cf289ca 2004-04-06 devnull }
1374 7cf289ca 2004-04-06 devnull else {
1375 7cf289ca 2004-04-06 devnull map = getmap(di, usemap+1);
1376 7cf289ca 2004-04-06 devnull if(ps->curanchor == 0) {
1377 7cf289ca 2004-04-06 devnull di->anchors = newanchor(++is->nanchors, nil, nil, di->target, di->anchors);
1378 7cf289ca 2004-04-06 devnull ps->curanchor = is->nanchors;
1379 7cf289ca 2004-04-06 devnull }
1380 7cf289ca 2004-04-06 devnull }
1381 7cf289ca 2004-04-06 devnull }
1382 7cf289ca 2004-04-06 devnull align = atabval(tok, Aalign, align_tab, NALIGNTAB, ALbottom);
1383 7cf289ca 2004-04-06 devnull dfltbd = 0;
1384 7cf289ca 2004-04-06 devnull if(ps->curanchor != 0)
1385 7cf289ca 2004-04-06 devnull dfltbd = 2;
1386 7cf289ca 2004-04-06 devnull src = aurlval(tok, Asrc, nil, di->base);
1387 7cf289ca 2004-04-06 devnull if(src == nil) {
1388 7cf289ca 2004-04-06 devnull if(warn)
1389 7cf289ca 2004-04-06 devnull fprint(2, "warning: <img> has no src attribute\n");
1390 7cf289ca 2004-04-06 devnull ps->curanchor = oldcuranchor;
1391 7cf289ca 2004-04-06 devnull continue;
1392 7cf289ca 2004-04-06 devnull }
1393 7cf289ca 2004-04-06 devnull img = newiimage(src,
1394 7cf289ca 2004-04-06 devnull aval(tok, Aalt),
1395 7cf289ca 2004-04-06 devnull align,
1396 7cf289ca 2004-04-06 devnull auintval(tok, Awidth, 0),
1397 7cf289ca 2004-04-06 devnull auintval(tok, Aheight, 0),
1398 7cf289ca 2004-04-06 devnull auintval(tok, Ahspace, IMGHSPACE),
1399 7cf289ca 2004-04-06 devnull auintval(tok, Avspace, IMGVSPACE),
1400 7cf289ca 2004-04-06 devnull auintval(tok, Aborder, dfltbd),
1401 7cf289ca 2004-04-06 devnull aflagval(tok, Aismap),
1402 7cf289ca 2004-04-06 devnull map);
1403 7cf289ca 2004-04-06 devnull if(align == ALleft || align == ALright) {
1404 7cf289ca 2004-04-06 devnull additem(ps, newifloat(img, align), tok);
1405 cbeb0b26 2006-04-01 devnull /* if no hspace specified, use FLTIMGHSPACE */
1406 7cf289ca 2004-04-06 devnull if(!_tokaval(tok, Ahspace, &val, 0))
1407 7cf289ca 2004-04-06 devnull ((Iimage*)img)->hspace = FLTIMGHSPACE;
1408 7cf289ca 2004-04-06 devnull }
1409 7cf289ca 2004-04-06 devnull else {
1410 7cf289ca 2004-04-06 devnull ps->skipwhite = 0;
1411 7cf289ca 2004-04-06 devnull additem(ps, img, tok);
1412 7cf289ca 2004-04-06 devnull }
1413 7cf289ca 2004-04-06 devnull if(!ps->skipping) {
1414 7cf289ca 2004-04-06 devnull ((Iimage*)img)->nextimage = di->images;
1415 7cf289ca 2004-04-06 devnull di->images = (Iimage*)img;
1416 7cf289ca 2004-04-06 devnull }
1417 7cf289ca 2004-04-06 devnull ps->curanchor = oldcuranchor;
1418 7cf289ca 2004-04-06 devnull break;
1419 7cf289ca 2004-04-06 devnull
1420 cbeb0b26 2006-04-01 devnull /* <!ELEMENT INPUT - O EMPTY> */
1421 7cf289ca 2004-04-06 devnull case Tinput:
1422 7cf289ca 2004-04-06 devnull ps->skipwhite = 0;
1423 7cf289ca 2004-04-06 devnull if(is->curform == nil) {
1424 7cf289ca 2004-04-06 devnull if(warn)
1425 7cf289ca 2004-04-06 devnull fprint(2, "<INPUT> not inside <FORM>\n");
1426 7cf289ca 2004-04-06 devnull continue;
1427 7cf289ca 2004-04-06 devnull }
1428 7cf289ca 2004-04-06 devnull is->curform->fields = field = newformfield(
1429 7cf289ca 2004-04-06 devnull atabval(tok, Atype, input_tab, NINPUTTAB, Ftext),
1430 7cf289ca 2004-04-06 devnull ++is->curform->nfields,
1431 7cf289ca 2004-04-06 devnull is->curform,
1432 7cf289ca 2004-04-06 devnull aval(tok, Aname),
1433 7cf289ca 2004-04-06 devnull aval(tok, Avalue),
1434 7cf289ca 2004-04-06 devnull auintval(tok, Asize, 0),
1435 7cf289ca 2004-04-06 devnull auintval(tok, Amaxlength, 1000),
1436 7cf289ca 2004-04-06 devnull is->curform->fields);
1437 7cf289ca 2004-04-06 devnull if(aflagval(tok, Achecked))
1438 7cf289ca 2004-04-06 devnull field->flags = FFchecked;
1439 7cf289ca 2004-04-06 devnull
1440 7cf289ca 2004-04-06 devnull switch(field->ftype) {
1441 7cf289ca 2004-04-06 devnull case Ftext:
1442 7cf289ca 2004-04-06 devnull case Fpassword:
1443 7cf289ca 2004-04-06 devnull case Ffile:
1444 7cf289ca 2004-04-06 devnull if(field->size == 0)
1445 7cf289ca 2004-04-06 devnull field->size = 20;
1446 7cf289ca 2004-04-06 devnull break;
1447 7cf289ca 2004-04-06 devnull
1448 7cf289ca 2004-04-06 devnull case Fcheckbox:
1449 7cf289ca 2004-04-06 devnull if(field->name == nil) {
1450 7cf289ca 2004-04-06 devnull if(warn)
1451 7cf289ca 2004-04-06 devnull fprint(2, "warning: checkbox form field missing name\n");
1452 7cf289ca 2004-04-06 devnull continue;
1453 7cf289ca 2004-04-06 devnull }
1454 7cf289ca 2004-04-06 devnull if(field->value == nil)
1455 7cf289ca 2004-04-06 devnull field->value = _Strdup(L(Lone));
1456 7cf289ca 2004-04-06 devnull break;
1457 7cf289ca 2004-04-06 devnull
1458 7cf289ca 2004-04-06 devnull case Fradio:
1459 7cf289ca 2004-04-06 devnull if(field->name == nil || field->value == nil) {
1460 7cf289ca 2004-04-06 devnull if(warn)
1461 7cf289ca 2004-04-06 devnull fprint(2, "warning: radio form field missing name or value\n");
1462 7cf289ca 2004-04-06 devnull continue;
1463 7cf289ca 2004-04-06 devnull }
1464 7cf289ca 2004-04-06 devnull break;
1465 7cf289ca 2004-04-06 devnull
1466 7cf289ca 2004-04-06 devnull case Fsubmit:
1467 7cf289ca 2004-04-06 devnull if(field->value == nil)
1468 7cf289ca 2004-04-06 devnull field->value = _Strdup(L(Lsubmit));
1469 7cf289ca 2004-04-06 devnull if(field->name == nil)
1470 7cf289ca 2004-04-06 devnull field->name = _Strdup(L(Lnoname));
1471 7cf289ca 2004-04-06 devnull break;
1472 7cf289ca 2004-04-06 devnull
1473 7cf289ca 2004-04-06 devnull case Fimage:
1474 7cf289ca 2004-04-06 devnull src = aurlval(tok, Asrc, nil, di->base);
1475 7cf289ca 2004-04-06 devnull if(src == nil) {
1476 7cf289ca 2004-04-06 devnull if(warn)
1477 7cf289ca 2004-04-06 devnull fprint(2, "warning: image form field missing src\n");
1478 7cf289ca 2004-04-06 devnull continue;
1479 7cf289ca 2004-04-06 devnull }
1480 cbeb0b26 2006-04-01 devnull /* width and height attrs aren't specified in HTML 3.2, */
1481 cbeb0b26 2006-04-01 devnull /* but some people provide them and they help avoid */
1482 cbeb0b26 2006-04-01 devnull /* a relayout */
1483 7cf289ca 2004-04-06 devnull field->image = newiimage(src,
1484 7cf289ca 2004-04-06 devnull astrval(tok, Aalt, L(Lsubmit)),
1485 7cf289ca 2004-04-06 devnull atabval(tok, Aalign, align_tab, NALIGNTAB, ALbottom),
1486 7cf289ca 2004-04-06 devnull auintval(tok, Awidth, 0), auintval(tok, Aheight, 0),
1487 7cf289ca 2004-04-06 devnull 0, 0, 0, 0, nil);
1488 7cf289ca 2004-04-06 devnull ii = (Iimage*)field->image;
1489 7cf289ca 2004-04-06 devnull ii->nextimage = di->images;
1490 7cf289ca 2004-04-06 devnull di->images = ii;
1491 7cf289ca 2004-04-06 devnull break;
1492 7cf289ca 2004-04-06 devnull
1493 7cf289ca 2004-04-06 devnull case Freset:
1494 7cf289ca 2004-04-06 devnull if(field->value == nil)
1495 7cf289ca 2004-04-06 devnull field->value = _Strdup(L(Lreset));
1496 7cf289ca 2004-04-06 devnull break;
1497 7cf289ca 2004-04-06 devnull
1498 7cf289ca 2004-04-06 devnull case Fbutton:
1499 7cf289ca 2004-04-06 devnull if(field->value == nil)
1500 7cf289ca 2004-04-06 devnull field->value = _Strdup(L(Lspace));
1501 7cf289ca 2004-04-06 devnull break;
1502 7cf289ca 2004-04-06 devnull }
1503 7cf289ca 2004-04-06 devnull ffit = newiformfield(field);
1504 7cf289ca 2004-04-06 devnull additem(ps, ffit, tok);
1505 7cf289ca 2004-04-06 devnull if(ffit->genattr != nil)
1506 7cf289ca 2004-04-06 devnull field->events = ffit->genattr->events;
1507 7cf289ca 2004-04-06 devnull break;
1508 7cf289ca 2004-04-06 devnull
1509 cbeb0b26 2006-04-01 devnull /* <!ENTITY ISINDEX - O EMPTY> */
1510 7cf289ca 2004-04-06 devnull case Tisindex:
1511 7cf289ca 2004-04-06 devnull ps->skipwhite = 0;
1512 7cf289ca 2004-04-06 devnull prompt = astrval(tok, Aprompt, L(Lindex));
1513 7cf289ca 2004-04-06 devnull target = atargval(tok, di->target);
1514 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, prompt), tok);
1515 7cf289ca 2004-04-06 devnull frm = newform(++is->nforms,
1516 7cf289ca 2004-04-06 devnull nil,
1517 7cf289ca 2004-04-06 devnull di->base,
1518 7cf289ca 2004-04-06 devnull target,
1519 7cf289ca 2004-04-06 devnull HGet,
1520 7cf289ca 2004-04-06 devnull di->forms);
1521 7cf289ca 2004-04-06 devnull di->forms = frm;
1522 7cf289ca 2004-04-06 devnull ff = newformfield(Ftext,
1523 7cf289ca 2004-04-06 devnull 1,
1524 7cf289ca 2004-04-06 devnull frm,
1525 7cf289ca 2004-04-06 devnull _Strdup(L(Lisindex)),
1526 7cf289ca 2004-04-06 devnull nil,
1527 7cf289ca 2004-04-06 devnull 50,
1528 7cf289ca 2004-04-06 devnull 1000,
1529 7cf289ca 2004-04-06 devnull nil);
1530 7cf289ca 2004-04-06 devnull frm->fields = ff;
1531 7cf289ca 2004-04-06 devnull frm->nfields = 1;
1532 7cf289ca 2004-04-06 devnull additem(ps, newiformfield(ff), tok);
1533 7cf289ca 2004-04-06 devnull addbrk(ps, 1, 0);
1534 7cf289ca 2004-04-06 devnull break;
1535 7cf289ca 2004-04-06 devnull
1536 cbeb0b26 2006-04-01 devnull /* <!ELEMENT LI - O %flow> */
1537 7cf289ca 2004-04-06 devnull case Tli:
1538 7cf289ca 2004-04-06 devnull if(ps->listtypestk.n == 0) {
1539 7cf289ca 2004-04-06 devnull if(warn)
1540 7cf289ca 2004-04-06 devnull fprint(2, "<LI> not in list\n");
1541 7cf289ca 2004-04-06 devnull continue;
1542 7cf289ca 2004-04-06 devnull }
1543 7cf289ca 2004-04-06 devnull ty = top(&ps->listtypestk, 0);
1544 7cf289ca 2004-04-06 devnull ty2 = listtyval(tok, ty);
1545 7cf289ca 2004-04-06 devnull if(ty != ty2) {
1546 7cf289ca 2004-04-06 devnull ty = ty2;
1547 7cf289ca 2004-04-06 devnull push(&ps->listtypestk, ty2);
1548 7cf289ca 2004-04-06 devnull }
1549 7cf289ca 2004-04-06 devnull v = aintval(tok, Avalue, top(&ps->listcntstk, 1));
1550 7cf289ca 2004-04-06 devnull if(ty == LTdisc || ty == LTsquare || ty == LTcircle)
1551 7cf289ca 2004-04-06 devnull hang = 10*LISTTAB - 3;
1552 7cf289ca 2004-04-06 devnull else
1553 7cf289ca 2004-04-06 devnull hang = 10*LISTTAB - 1;
1554 7cf289ca 2004-04-06 devnull changehang(ps, hang);
1555 7cf289ca 2004-04-06 devnull addtext(ps, listmark(ty, v));
1556 7cf289ca 2004-04-06 devnull push(&ps->listcntstk, v + 1);
1557 7cf289ca 2004-04-06 devnull changehang(ps, -hang);
1558 7cf289ca 2004-04-06 devnull ps->skipwhite = 1;
1559 7cf289ca 2004-04-06 devnull break;
1560 7cf289ca 2004-04-06 devnull
1561 cbeb0b26 2006-04-01 devnull /* <!ELEMENT MAP - - (AREA)+> */
1562 7cf289ca 2004-04-06 devnull case Tmap:
1563 7cf289ca 2004-04-06 devnull if(_tokaval(tok, Aname, &name, 0))
1564 7cf289ca 2004-04-06 devnull is->curmap = getmap(di, name);
1565 7cf289ca 2004-04-06 devnull break;
1566 7cf289ca 2004-04-06 devnull
1567 7cf289ca 2004-04-06 devnull case Tmap+RBRA:
1568 7cf289ca 2004-04-06 devnull map = is->curmap;
1569 7cf289ca 2004-04-06 devnull if(map == nil) {
1570 7cf289ca 2004-04-06 devnull if(warn)
1571 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </MAP>\n");
1572 7cf289ca 2004-04-06 devnull continue;
1573 7cf289ca 2004-04-06 devnull }
1574 7cf289ca 2004-04-06 devnull map->areas = (Area*)_revlist((List*)map->areas);
1575 7cf289ca 2004-04-06 devnull break;
1576 7cf289ca 2004-04-06 devnull
1577 7cf289ca 2004-04-06 devnull case Tmeta:
1578 7cf289ca 2004-04-06 devnull if(ps->skipping)
1579 7cf289ca 2004-04-06 devnull continue;
1580 7cf289ca 2004-04-06 devnull if(_tokaval(tok, Ahttp_equiv, &equiv, 0)) {
1581 7cf289ca 2004-04-06 devnull val = aval(tok, Acontent);
1582 7cf289ca 2004-04-06 devnull n = _Strlen(equiv);
1583 7cf289ca 2004-04-06 devnull if(!_Strncmpci(equiv, n, L(Lrefresh)))
1584 7cf289ca 2004-04-06 devnull di->refresh = val;
1585 7cf289ca 2004-04-06 devnull else if(!_Strncmpci(equiv, n, L(Lcontent))) {
1586 7cf289ca 2004-04-06 devnull n = _Strlen(val);
1587 7cf289ca 2004-04-06 devnull if(!_Strncmpci(val, n, L(Ljavascript))
1588 7cf289ca 2004-04-06 devnull || !_Strncmpci(val, n, L(Ljscript1))
1589 7cf289ca 2004-04-06 devnull || !_Strncmpci(val, n, L(Ljscript)))
1590 7cf289ca 2004-04-06 devnull di->scripttype = TextJavascript;
1591 7cf289ca 2004-04-06 devnull else {
1592 7cf289ca 2004-04-06 devnull if(warn)
1593 7cf289ca 2004-04-06 devnull fprint(2, "unimplemented script type %S\n", val);
1594 7cf289ca 2004-04-06 devnull di->scripttype = UnknownType;
1595 7cf289ca 2004-04-06 devnull }
1596 7cf289ca 2004-04-06 devnull }
1597 7cf289ca 2004-04-06 devnull }
1598 7cf289ca 2004-04-06 devnull break;
1599 7cf289ca 2004-04-06 devnull
1600 cbeb0b26 2006-04-01 devnull /* Nobr is NOT in HMTL 4.0, but it is ubiquitous on the web */
1601 7cf289ca 2004-04-06 devnull case Tnobr:
1602 7cf289ca 2004-04-06 devnull ps->skipwhite = 0;
1603 7cf289ca 2004-04-06 devnull ps->curstate &= ~IFwrap;
1604 7cf289ca 2004-04-06 devnull break;
1605 7cf289ca 2004-04-06 devnull
1606 7cf289ca 2004-04-06 devnull case Tnobr+RBRA:
1607 7cf289ca 2004-04-06 devnull ps->curstate |= IFwrap;
1608 7cf289ca 2004-04-06 devnull break;
1609 7cf289ca 2004-04-06 devnull
1610 cbeb0b26 2006-04-01 devnull /* We do frames, so skip stuff in noframes */
1611 7cf289ca 2004-04-06 devnull case Tnoframes:
1612 7cf289ca 2004-04-06 devnull ps->skipping = 1;
1613 7cf289ca 2004-04-06 devnull break;
1614 7cf289ca 2004-04-06 devnull
1615 7cf289ca 2004-04-06 devnull case Tnoframes+RBRA:
1616 7cf289ca 2004-04-06 devnull ps->skipping = 0;
1617 7cf289ca 2004-04-06 devnull break;
1618 7cf289ca 2004-04-06 devnull
1619 cbeb0b26 2006-04-01 devnull /* We do scripts (if enabled), so skip stuff in noscripts */
1620 7cf289ca 2004-04-06 devnull case Tnoscript:
1621 7cf289ca 2004-04-06 devnull if(doscripts)
1622 7cf289ca 2004-04-06 devnull ps->skipping = 1;
1623 7cf289ca 2004-04-06 devnull break;
1624 7cf289ca 2004-04-06 devnull
1625 7cf289ca 2004-04-06 devnull case Tnoscript+RBRA:
1626 7cf289ca 2004-04-06 devnull if(doscripts)
1627 7cf289ca 2004-04-06 devnull ps->skipping = 0;
1628 7cf289ca 2004-04-06 devnull break;
1629 7cf289ca 2004-04-06 devnull
1630 cbeb0b26 2006-04-01 devnull /* <!ELEMENT OPTION - O ( //PCDATA)> */
1631 7cf289ca 2004-04-06 devnull case Toption:
1632 7cf289ca 2004-04-06 devnull if(is->curform == nil || is->curform->fields == nil) {
1633 7cf289ca 2004-04-06 devnull if(warn)
1634 7cf289ca 2004-04-06 devnull fprint(2, "warning: <OPTION> not in <SELECT>\n");
1635 7cf289ca 2004-04-06 devnull continue;
1636 7cf289ca 2004-04-06 devnull }
1637 7cf289ca 2004-04-06 devnull field = is->curform->fields;
1638 7cf289ca 2004-04-06 devnull if(field->ftype != Fselect) {
1639 7cf289ca 2004-04-06 devnull if(warn)
1640 7cf289ca 2004-04-06 devnull fprint(2, "warning: <OPTION> not in <SELECT>\n");
1641 7cf289ca 2004-04-06 devnull continue;
1642 7cf289ca 2004-04-06 devnull }
1643 7cf289ca 2004-04-06 devnull val = aval(tok, Avalue);
1644 7cf289ca 2004-04-06 devnull option = newoption(aflagval(tok, Aselected), val, nil, field->options);
1645 7cf289ca 2004-04-06 devnull field->options = option;
1646 7cf289ca 2004-04-06 devnull option->display = getpcdata(toks, tokslen, &toki);
1647 7cf289ca 2004-04-06 devnull if(val == nil)
1648 7cf289ca 2004-04-06 devnull option->value = _Strdup(option->display);
1649 7cf289ca 2004-04-06 devnull break;
1650 7cf289ca 2004-04-06 devnull
1651 cbeb0b26 2006-04-01 devnull /* <!ELEMENT P - O (%text)* > */
1652 7cf289ca 2004-04-06 devnull case Tp:
1653 7cf289ca 2004-04-06 devnull pushjust(ps, atabval(tok, Aalign, align_tab, NALIGNTAB, ps->curjust));
1654 7cf289ca 2004-04-06 devnull ps->inpar = 1;
1655 7cf289ca 2004-04-06 devnull ps->skipwhite = 1;
1656 7cf289ca 2004-04-06 devnull break;
1657 7cf289ca 2004-04-06 devnull
1658 7cf289ca 2004-04-06 devnull case Tp+RBRA:
1659 7cf289ca 2004-04-06 devnull break;
1660 7cf289ca 2004-04-06 devnull
1661 cbeb0b26 2006-04-01 devnull /* <!ELEMENT PARAM - O EMPTY> */
1662 cbeb0b26 2006-04-01 devnull /* Do something when we do applets... */
1663 7cf289ca 2004-04-06 devnull case Tparam:
1664 7cf289ca 2004-04-06 devnull break;
1665 7cf289ca 2004-04-06 devnull
1666 cbeb0b26 2006-04-01 devnull /* <!ELEMENT PRE - - (%text)* -(IMG|BIG|SMALL|SUB|SUP|FONT) > */
1667 7cf289ca 2004-04-06 devnull case Tpre:
1668 7cf289ca 2004-04-06 devnull ps->curstate &= ~IFwrap;
1669 7cf289ca 2004-04-06 devnull ps->literal = 1;
1670 7cf289ca 2004-04-06 devnull ps->skipwhite = 0;
1671 7cf289ca 2004-04-06 devnull pushfontstyle(ps, FntT);
1672 7cf289ca 2004-04-06 devnull break;
1673 7cf289ca 2004-04-06 devnull
1674 7cf289ca 2004-04-06 devnull case Tpre+RBRA:
1675 7cf289ca 2004-04-06 devnull ps->curstate |= IFwrap;
1676 7cf289ca 2004-04-06 devnull if(ps->literal) {
1677 7cf289ca 2004-04-06 devnull popfontstyle(ps);
1678 7cf289ca 2004-04-06 devnull ps->literal = 0;
1679 7cf289ca 2004-04-06 devnull }
1680 7cf289ca 2004-04-06 devnull break;
1681 7cf289ca 2004-04-06 devnull
1682 cbeb0b26 2006-04-01 devnull /* <!ELEMENT SCRIPT - - CDATA> */
1683 7cf289ca 2004-04-06 devnull case Tscript:
1684 7cf289ca 2004-04-06 devnull if(doscripts) {
1685 7cf289ca 2004-04-06 devnull if(!di->hasscripts) {
1686 7cf289ca 2004-04-06 devnull if(di->scripttype == TextJavascript) {
1687 cbeb0b26 2006-04-01 devnull /* TODO: initialize script if nec. */
1688 cbeb0b26 2006-04-01 devnull /* initjscript(di); */
1689 7cf289ca 2004-04-06 devnull di->hasscripts = 1;
1690 7cf289ca 2004-04-06 devnull }
1691 7cf289ca 2004-04-06 devnull }
1692 7cf289ca 2004-04-06 devnull }
1693 7cf289ca 2004-04-06 devnull if(!di->hasscripts) {
1694 7cf289ca 2004-04-06 devnull if(warn)
1695 7cf289ca 2004-04-06 devnull fprint(2, "warning: <SCRIPT> ignored\n");
1696 7cf289ca 2004-04-06 devnull ps->skipping = 1;
1697 7cf289ca 2004-04-06 devnull }
1698 7cf289ca 2004-04-06 devnull else {
1699 7cf289ca 2004-04-06 devnull scriptsrc = aurlval(tok, Asrc, nil, di->base);
1700 7cf289ca 2004-04-06 devnull script = nil;
1701 7cf289ca 2004-04-06 devnull if(scriptsrc != nil) {
1702 7cf289ca 2004-04-06 devnull if(warn)
1703 7cf289ca 2004-04-06 devnull fprint(2, "warning: non-local <SCRIPT> ignored\n");
1704 7cf289ca 2004-04-06 devnull free(scriptsrc);
1705 7cf289ca 2004-04-06 devnull }
1706 7cf289ca 2004-04-06 devnull else {
1707 7cf289ca 2004-04-06 devnull script = getpcdata(toks, tokslen, &toki);
1708 7cf289ca 2004-04-06 devnull }
1709 7cf289ca 2004-04-06 devnull if(script != nil) {
1710 7cf289ca 2004-04-06 devnull if(warn)
1711 7cf289ca 2004-04-06 devnull fprint(2, "script ignored\n");
1712 7cf289ca 2004-04-06 devnull free(script);
1713 7cf289ca 2004-04-06 devnull }
1714 7cf289ca 2004-04-06 devnull }
1715 7cf289ca 2004-04-06 devnull break;
1716 7cf289ca 2004-04-06 devnull
1717 7cf289ca 2004-04-06 devnull case Tscript+RBRA:
1718 7cf289ca 2004-04-06 devnull ps->skipping = 0;
1719 7cf289ca 2004-04-06 devnull break;
1720 7cf289ca 2004-04-06 devnull
1721 cbeb0b26 2006-04-01 devnull /* <!ELEMENT SELECT - - (OPTION+)> */
1722 7cf289ca 2004-04-06 devnull case Tselect:
1723 7cf289ca 2004-04-06 devnull if(is->curform == nil) {
1724 7cf289ca 2004-04-06 devnull if(warn)
1725 7cf289ca 2004-04-06 devnull fprint(2, "<SELECT> not inside <FORM>\n");
1726 7cf289ca 2004-04-06 devnull continue;
1727 7cf289ca 2004-04-06 devnull }
1728 7cf289ca 2004-04-06 devnull field = newformfield(Fselect,
1729 7cf289ca 2004-04-06 devnull ++is->curform->nfields,
1730 7cf289ca 2004-04-06 devnull is->curform,
1731 7cf289ca 2004-04-06 devnull aval(tok, Aname),
1732 7cf289ca 2004-04-06 devnull nil,
1733 7cf289ca 2004-04-06 devnull auintval(tok, Asize, 0),
1734 7cf289ca 2004-04-06 devnull 0,
1735 7cf289ca 2004-04-06 devnull is->curform->fields);
1736 7cf289ca 2004-04-06 devnull is->curform->fields = field;
1737 7cf289ca 2004-04-06 devnull if(aflagval(tok, Amultiple))
1738 7cf289ca 2004-04-06 devnull field->flags = FFmultiple;
1739 7cf289ca 2004-04-06 devnull ffit = newiformfield(field);
1740 7cf289ca 2004-04-06 devnull additem(ps, ffit, tok);
1741 7cf289ca 2004-04-06 devnull if(ffit->genattr != nil)
1742 7cf289ca 2004-04-06 devnull field->events = ffit->genattr->events;
1743 cbeb0b26 2006-04-01 devnull /* throw away stuff until next tag (should be <OPTION>) */
1744 7cf289ca 2004-04-06 devnull s = getpcdata(toks, tokslen, &toki);
1745 7cf289ca 2004-04-06 devnull if(s != nil)
1746 7cf289ca 2004-04-06 devnull free(s);
1747 7cf289ca 2004-04-06 devnull break;
1748 7cf289ca 2004-04-06 devnull
1749 7cf289ca 2004-04-06 devnull case Tselect+RBRA:
1750 7cf289ca 2004-04-06 devnull if(is->curform == nil || is->curform->fields == nil) {
1751 7cf289ca 2004-04-06 devnull if(warn)
1752 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </SELECT>\n");
1753 7cf289ca 2004-04-06 devnull continue;
1754 7cf289ca 2004-04-06 devnull }
1755 7cf289ca 2004-04-06 devnull field = is->curform->fields;
1756 7cf289ca 2004-04-06 devnull if(field->ftype != Fselect)
1757 7cf289ca 2004-04-06 devnull continue;
1758 cbeb0b26 2006-04-01 devnull /* put options back in input order */
1759 7cf289ca 2004-04-06 devnull field->options = (Option*)_revlist((List*)field->options);
1760 7cf289ca 2004-04-06 devnull break;
1761 7cf289ca 2004-04-06 devnull
1762 cbeb0b26 2006-04-01 devnull /* <!ELEMENT (STRIKE|U) - - (%text)*> */
1763 7cf289ca 2004-04-06 devnull case Tstrike:
1764 7cf289ca 2004-04-06 devnull case Tu:
1765 7cf289ca 2004-04-06 devnull ps->curul = push(&ps->ulstk, (tag==Tstrike)? ULmid : ULunder);
1766 7cf289ca 2004-04-06 devnull break;
1767 7cf289ca 2004-04-06 devnull
1768 7cf289ca 2004-04-06 devnull case Tstrike+RBRA:
1769 7cf289ca 2004-04-06 devnull case Tu+RBRA:
1770 7cf289ca 2004-04-06 devnull if(ps->ulstk.n == 0) {
1771 7cf289ca 2004-04-06 devnull if(warn)
1772 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected %T\n", tok);
1773 7cf289ca 2004-04-06 devnull continue;
1774 7cf289ca 2004-04-06 devnull }
1775 7cf289ca 2004-04-06 devnull ps->curul = popretnewtop(&ps->ulstk, ULnone);
1776 7cf289ca 2004-04-06 devnull break;
1777 7cf289ca 2004-04-06 devnull
1778 cbeb0b26 2006-04-01 devnull /* <!ELEMENT STYLE - - CDATA> */
1779 7cf289ca 2004-04-06 devnull case Tstyle:
1780 7cf289ca 2004-04-06 devnull if(warn)
1781 7cf289ca 2004-04-06 devnull fprint(2, "warning: unimplemented <STYLE>\n");
1782 7cf289ca 2004-04-06 devnull ps->skipping = 1;
1783 7cf289ca 2004-04-06 devnull break;
1784 7cf289ca 2004-04-06 devnull
1785 7cf289ca 2004-04-06 devnull case Tstyle+RBRA:
1786 7cf289ca 2004-04-06 devnull ps->skipping = 0;
1787 7cf289ca 2004-04-06 devnull break;
1788 7cf289ca 2004-04-06 devnull
1789 cbeb0b26 2006-04-01 devnull /* <!ELEMENT (SUB|SUP) - - (%text)*> */
1790 7cf289ca 2004-04-06 devnull case Tsub:
1791 7cf289ca 2004-04-06 devnull case Tsup:
1792 7cf289ca 2004-04-06 devnull if(tag == Tsub)
1793 7cf289ca 2004-04-06 devnull ps->curvoff += SUBOFF;
1794 7cf289ca 2004-04-06 devnull else
1795 7cf289ca 2004-04-06 devnull ps->curvoff -= SUPOFF;
1796 7cf289ca 2004-04-06 devnull push(&ps->voffstk, ps->curvoff);
1797 7cf289ca 2004-04-06 devnull sz = top(&ps->fntsizestk, Normal);
1798 7cf289ca 2004-04-06 devnull pushfontsize(ps, sz - 1);
1799 7cf289ca 2004-04-06 devnull break;
1800 7cf289ca 2004-04-06 devnull
1801 7cf289ca 2004-04-06 devnull case Tsub+RBRA:
1802 7cf289ca 2004-04-06 devnull case Tsup+RBRA:
1803 7cf289ca 2004-04-06 devnull if(ps->voffstk.n == 0) {
1804 7cf289ca 2004-04-06 devnull if(warn)
1805 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected %T\n", tok);
1806 7cf289ca 2004-04-06 devnull continue;
1807 7cf289ca 2004-04-06 devnull }
1808 7cf289ca 2004-04-06 devnull ps->curvoff = popretnewtop(&ps->voffstk, 0);
1809 7cf289ca 2004-04-06 devnull popfontsize(ps);
1810 7cf289ca 2004-04-06 devnull break;
1811 7cf289ca 2004-04-06 devnull
1812 cbeb0b26 2006-04-01 devnull /* <!ELEMENT TABLE - - (CAPTION?, TR+)> */
1813 7cf289ca 2004-04-06 devnull case Ttable:
1814 7cf289ca 2004-04-06 devnull ps->skipwhite = 0;
1815 7cf289ca 2004-04-06 devnull tab = newtable(++is->ntables,
1816 7cf289ca 2004-04-06 devnull aalign(tok),
1817 7cf289ca 2004-04-06 devnull adimen(tok, Awidth),
1818 fa325e9b 2020-01-10 cross aflagval(tok, Aborder),
1819 7cf289ca 2004-04-06 devnull auintval(tok, Acellspacing, TABSP),
1820 7cf289ca 2004-04-06 devnull auintval(tok, Acellpadding, TABPAD),
1821 7cf289ca 2004-04-06 devnull makebackground(nil, acolorval(tok, Abgcolor, ps->curbg.color)),
1822 7cf289ca 2004-04-06 devnull tok,
1823 7cf289ca 2004-04-06 devnull is->tabstk);
1824 7cf289ca 2004-04-06 devnull is->tabstk = tab;
1825 7cf289ca 2004-04-06 devnull curtab = tab;
1826 7cf289ca 2004-04-06 devnull break;
1827 7cf289ca 2004-04-06 devnull
1828 7cf289ca 2004-04-06 devnull case Ttable+RBRA:
1829 7cf289ca 2004-04-06 devnull if(curtab == nil) {
1830 7cf289ca 2004-04-06 devnull if(warn)
1831 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </TABLE>\n");
1832 7cf289ca 2004-04-06 devnull continue;
1833 7cf289ca 2004-04-06 devnull }
1834 7cf289ca 2004-04-06 devnull isempty = (curtab->cells == nil);
1835 7cf289ca 2004-04-06 devnull if(isempty) {
1836 7cf289ca 2004-04-06 devnull if(warn)
1837 7cf289ca 2004-04-06 devnull fprint(2, "warning: <TABLE> has no cells\n");
1838 7cf289ca 2004-04-06 devnull }
1839 7cf289ca 2004-04-06 devnull else {
1840 7cf289ca 2004-04-06 devnull ps = finishcell(curtab, ps);
1841 7cf289ca 2004-04-06 devnull if(curtab->rows != nil)
1842 7cf289ca 2004-04-06 devnull curtab->rows->flags = 0;
1843 7cf289ca 2004-04-06 devnull finish_table(curtab);
1844 7cf289ca 2004-04-06 devnull }
1845 7cf289ca 2004-04-06 devnull ps->skipping = 0;
1846 7cf289ca 2004-04-06 devnull if(!isempty) {
1847 7cf289ca 2004-04-06 devnull tabitem = newitable(curtab);
1848 7cf289ca 2004-04-06 devnull al = curtab->align.halign;
1849 7cf289ca 2004-04-06 devnull switch(al) {
1850 7cf289ca 2004-04-06 devnull case ALleft:
1851 7cf289ca 2004-04-06 devnull case ALright:
1852 7cf289ca 2004-04-06 devnull additem(ps, newifloat(tabitem, al), tok);
1853 7cf289ca 2004-04-06 devnull break;
1854 7cf289ca 2004-04-06 devnull default:
1855 7cf289ca 2004-04-06 devnull if(al == ALcenter)
1856 7cf289ca 2004-04-06 devnull pushjust(ps, ALcenter);
1857 7cf289ca 2004-04-06 devnull addbrk(ps, 0, 0);
1858 7cf289ca 2004-04-06 devnull if(ps->inpar) {
1859 7cf289ca 2004-04-06 devnull popjust(ps);
1860 7cf289ca 2004-04-06 devnull ps->inpar = 0;
1861 7cf289ca 2004-04-06 devnull }
1862 7cf289ca 2004-04-06 devnull additem(ps, tabitem, curtab->tabletok);
1863 7cf289ca 2004-04-06 devnull if(al == ALcenter)
1864 7cf289ca 2004-04-06 devnull popjust(ps);
1865 7cf289ca 2004-04-06 devnull break;
1866 7cf289ca 2004-04-06 devnull }
1867 7cf289ca 2004-04-06 devnull }
1868 7cf289ca 2004-04-06 devnull if(is->tabstk == nil) {
1869 7cf289ca 2004-04-06 devnull if(warn)
1870 7cf289ca 2004-04-06 devnull fprint(2, "warning: table stack is wrong\n");
1871 7cf289ca 2004-04-06 devnull }
1872 7cf289ca 2004-04-06 devnull else
1873 7cf289ca 2004-04-06 devnull is->tabstk = is->tabstk->next;
1874 7cf289ca 2004-04-06 devnull curtab->next = di->tables;
1875 7cf289ca 2004-04-06 devnull di->tables = curtab;
1876 7cf289ca 2004-04-06 devnull curtab = is->tabstk;
1877 7cf289ca 2004-04-06 devnull if(!isempty)
1878 7cf289ca 2004-04-06 devnull addbrk(ps, 0, 0);
1879 7cf289ca 2004-04-06 devnull break;
1880 7cf289ca 2004-04-06 devnull
1881 cbeb0b26 2006-04-01 devnull /* <!ELEMENT (TH|TD) - O %body.content> */
1882 cbeb0b26 2006-04-01 devnull /* Cells for a row are accumulated in reverse order. */
1883 cbeb0b26 2006-04-01 devnull /* We push ps on a stack, and use a new one to accumulate */
1884 cbeb0b26 2006-04-01 devnull /* the contents of the cell. */
1885 7cf289ca 2004-04-06 devnull case Ttd:
1886 7cf289ca 2004-04-06 devnull case Tth:
1887 7cf289ca 2004-04-06 devnull if(curtab == nil) {
1888 7cf289ca 2004-04-06 devnull if(warn)
1889 7cf289ca 2004-04-06 devnull fprint(2, "%T outside <TABLE>\n", tok);
1890 7cf289ca 2004-04-06 devnull continue;
1891 7cf289ca 2004-04-06 devnull }
1892 7cf289ca 2004-04-06 devnull if(ps->inpar) {
1893 7cf289ca 2004-04-06 devnull popjust(ps);
1894 7cf289ca 2004-04-06 devnull ps->inpar = 0;
1895 7cf289ca 2004-04-06 devnull }
1896 7cf289ca 2004-04-06 devnull ps = finishcell(curtab, ps);
1897 7cf289ca 2004-04-06 devnull tr = nil;
1898 7cf289ca 2004-04-06 devnull if(curtab->rows != nil)
1899 7cf289ca 2004-04-06 devnull tr = curtab->rows;
1900 7cf289ca 2004-04-06 devnull if(tr == nil || !tr->flags) {
1901 7cf289ca 2004-04-06 devnull if(warn)
1902 7cf289ca 2004-04-06 devnull fprint(2, "%T outside row\n", tok);
1903 7cf289ca 2004-04-06 devnull tr = newtablerow(makealign(ALnone, ALnone),
1904 7cf289ca 2004-04-06 devnull makebackground(nil, curtab->background.color),
1905 7cf289ca 2004-04-06 devnull TFparsing,
1906 7cf289ca 2004-04-06 devnull curtab->rows);
1907 7cf289ca 2004-04-06 devnull curtab->rows = tr;
1908 7cf289ca 2004-04-06 devnull }
1909 7cf289ca 2004-04-06 devnull ps = cell_pstate(ps, tag == Tth);
1910 7cf289ca 2004-04-06 devnull flags = TFparsing;
1911 7cf289ca 2004-04-06 devnull if(aflagval(tok, Anowrap)) {
1912 7cf289ca 2004-04-06 devnull flags |= TFnowrap;
1913 7cf289ca 2004-04-06 devnull ps->curstate &= ~IFwrap;
1914 7cf289ca 2004-04-06 devnull }
1915 7cf289ca 2004-04-06 devnull if(tag == Tth)
1916 7cf289ca 2004-04-06 devnull flags |= TFisth;
1917 7cf289ca 2004-04-06 devnull c = newtablecell(curtab->cells==nil? 1 : curtab->cells->cellid+1,
1918 7cf289ca 2004-04-06 devnull auintval(tok, Arowspan, 1),
1919 fa325e9b 2020-01-10 cross auintval(tok, Acolspan, 1),
1920 fa325e9b 2020-01-10 cross aalign(tok),
1921 7cf289ca 2004-04-06 devnull adimen(tok, Awidth),
1922 7cf289ca 2004-04-06 devnull auintval(tok, Aheight, 0),
1923 7cf289ca 2004-04-06 devnull makebackground(nil, acolorval(tok, Abgcolor, tr->background.color)),
1924 7cf289ca 2004-04-06 devnull flags,
1925 7cf289ca 2004-04-06 devnull curtab->cells);
1926 7cf289ca 2004-04-06 devnull curtab->cells = c;
1927 7cf289ca 2004-04-06 devnull ps->curbg = c->background;
1928 7cf289ca 2004-04-06 devnull if(c->align.halign == ALnone) {
1929 7cf289ca 2004-04-06 devnull if(tr->align.halign != ALnone)
1930 7cf289ca 2004-04-06 devnull c->align.halign = tr->align.halign;
1931 7cf289ca 2004-04-06 devnull else if(tag == Tth)
1932 7cf289ca 2004-04-06 devnull c->align.halign = ALcenter;
1933 7cf289ca 2004-04-06 devnull else
1934 7cf289ca 2004-04-06 devnull c->align.halign = ALleft;
1935 7cf289ca 2004-04-06 devnull }
1936 7cf289ca 2004-04-06 devnull if(c->align.valign == ALnone) {
1937 7cf289ca 2004-04-06 devnull if(tr->align.valign != ALnone)
1938 7cf289ca 2004-04-06 devnull c->align.valign = tr->align.valign;
1939 7cf289ca 2004-04-06 devnull else
1940 7cf289ca 2004-04-06 devnull c->align.valign = ALmiddle;
1941 7cf289ca 2004-04-06 devnull }
1942 7cf289ca 2004-04-06 devnull c->nextinrow = tr->cells;
1943 7cf289ca 2004-04-06 devnull tr->cells = c;
1944 7cf289ca 2004-04-06 devnull break;
1945 7cf289ca 2004-04-06 devnull
1946 7cf289ca 2004-04-06 devnull case Ttd+RBRA:
1947 7cf289ca 2004-04-06 devnull case Tth+RBRA:
1948 7cf289ca 2004-04-06 devnull if(curtab == nil || curtab->cells == nil) {
1949 7cf289ca 2004-04-06 devnull if(warn)
1950 7cf289ca 2004-04-06 devnull fprint(2, "unexpected %T\n", tok);
1951 7cf289ca 2004-04-06 devnull continue;
1952 7cf289ca 2004-04-06 devnull }
1953 7cf289ca 2004-04-06 devnull ps = finishcell(curtab, ps);
1954 7cf289ca 2004-04-06 devnull break;
1955 7cf289ca 2004-04-06 devnull
1956 cbeb0b26 2006-04-01 devnull /* <!ELEMENT TEXTAREA - - ( //PCDATA)> */
1957 7cf289ca 2004-04-06 devnull case Ttextarea:
1958 7cf289ca 2004-04-06 devnull if(is->curform == nil) {
1959 7cf289ca 2004-04-06 devnull if(warn)
1960 7cf289ca 2004-04-06 devnull fprint(2, "<TEXTAREA> not inside <FORM>\n");
1961 7cf289ca 2004-04-06 devnull continue;
1962 7cf289ca 2004-04-06 devnull }
1963 7cf289ca 2004-04-06 devnull field = newformfield(Ftextarea,
1964 7cf289ca 2004-04-06 devnull ++is->curform->nfields,
1965 7cf289ca 2004-04-06 devnull is->curform,
1966 7cf289ca 2004-04-06 devnull aval(tok, Aname),
1967 7cf289ca 2004-04-06 devnull nil,
1968 7cf289ca 2004-04-06 devnull 0,
1969 7cf289ca 2004-04-06 devnull 0,
1970 7cf289ca 2004-04-06 devnull is->curform->fields);
1971 7cf289ca 2004-04-06 devnull is->curform->fields = field;
1972 7cf289ca 2004-04-06 devnull field->rows = auintval(tok, Arows, 3);
1973 7cf289ca 2004-04-06 devnull field->cols = auintval(tok, Acols, 50);
1974 7cf289ca 2004-04-06 devnull field->value = getpcdata(toks, tokslen, &toki);
1975 7cf289ca 2004-04-06 devnull if(warn && toki < tokslen - 1 && toks[toki + 1].tag != Ttextarea + RBRA)
1976 7cf289ca 2004-04-06 devnull fprint(2, "warning: <TEXTAREA> data ended by %T\n", &toks[toki + 1]);
1977 7cf289ca 2004-04-06 devnull ffit = newiformfield(field);
1978 7cf289ca 2004-04-06 devnull additem(ps, ffit, tok);
1979 7cf289ca 2004-04-06 devnull if(ffit->genattr != nil)
1980 7cf289ca 2004-04-06 devnull field->events = ffit->genattr->events;
1981 7cf289ca 2004-04-06 devnull break;
1982 7cf289ca 2004-04-06 devnull
1983 cbeb0b26 2006-04-01 devnull /* <!ELEMENT TITLE - - ( //PCDATA)* -(%head.misc)> */
1984 7cf289ca 2004-04-06 devnull case Ttitle:
1985 7cf289ca 2004-04-06 devnull di->doctitle = getpcdata(toks, tokslen, &toki);
1986 7cf289ca 2004-04-06 devnull if(warn && toki < tokslen - 1 && toks[toki + 1].tag != Ttitle + RBRA)
1987 7cf289ca 2004-04-06 devnull fprint(2, "warning: <TITLE> data ended by %T\n", &toks[toki + 1]);
1988 7cf289ca 2004-04-06 devnull break;
1989 7cf289ca 2004-04-06 devnull
1990 cbeb0b26 2006-04-01 devnull /* <!ELEMENT TR - O (TH|TD)+> */
1991 cbeb0b26 2006-04-01 devnull /* rows are accumulated in reverse order in curtab->rows */
1992 7cf289ca 2004-04-06 devnull case Ttr:
1993 7cf289ca 2004-04-06 devnull if(curtab == nil) {
1994 7cf289ca 2004-04-06 devnull if(warn)
1995 7cf289ca 2004-04-06 devnull fprint(2, "warning: <TR> outside <TABLE>\n");
1996 7cf289ca 2004-04-06 devnull continue;
1997 7cf289ca 2004-04-06 devnull }
1998 7cf289ca 2004-04-06 devnull if(ps->inpar) {
1999 7cf289ca 2004-04-06 devnull popjust(ps);
2000 7cf289ca 2004-04-06 devnull ps->inpar = 0;
2001 7cf289ca 2004-04-06 devnull }
2002 7cf289ca 2004-04-06 devnull ps = finishcell(curtab, ps);
2003 7cf289ca 2004-04-06 devnull if(curtab->rows != nil)
2004 7cf289ca 2004-04-06 devnull curtab->rows->flags = 0;
2005 7cf289ca 2004-04-06 devnull curtab->rows = newtablerow(aalign(tok),
2006 7cf289ca 2004-04-06 devnull makebackground(nil, acolorval(tok, Abgcolor, curtab->background.color)),
2007 7cf289ca 2004-04-06 devnull TFparsing,
2008 7cf289ca 2004-04-06 devnull curtab->rows);
2009 7cf289ca 2004-04-06 devnull break;
2010 7cf289ca 2004-04-06 devnull
2011 7cf289ca 2004-04-06 devnull case Ttr+RBRA:
2012 7cf289ca 2004-04-06 devnull if(curtab == nil || curtab->rows == nil) {
2013 7cf289ca 2004-04-06 devnull if(warn)
2014 7cf289ca 2004-04-06 devnull fprint(2, "warning: unexpected </TR>\n");
2015 7cf289ca 2004-04-06 devnull continue;
2016 7cf289ca 2004-04-06 devnull }
2017 7cf289ca 2004-04-06 devnull ps = finishcell(curtab, ps);
2018 7cf289ca 2004-04-06 devnull tr = curtab->rows;
2019 7cf289ca 2004-04-06 devnull if(tr->cells == nil) {
2020 7cf289ca 2004-04-06 devnull if(warn)
2021 7cf289ca 2004-04-06 devnull fprint(2, "warning: empty row\n");
2022 7cf289ca 2004-04-06 devnull curtab->rows = tr->next;
2023 7cf289ca 2004-04-06 devnull tr->next = nil;
2024 7cf289ca 2004-04-06 devnull }
2025 7cf289ca 2004-04-06 devnull else
2026 7cf289ca 2004-04-06 devnull tr->flags = 0;
2027 7cf289ca 2004-04-06 devnull break;
2028 7cf289ca 2004-04-06 devnull
2029 cbeb0b26 2006-04-01 devnull /* <!ELEMENT (TT|CODE|KBD|SAMP) - - (%text)*> */
2030 7cf289ca 2004-04-06 devnull case Ttt:
2031 7cf289ca 2004-04-06 devnull case Tcode:
2032 7cf289ca 2004-04-06 devnull case Tkbd:
2033 7cf289ca 2004-04-06 devnull case Tsamp:
2034 7cf289ca 2004-04-06 devnull pushfontstyle(ps, FntT);
2035 7cf289ca 2004-04-06 devnull break;
2036 7cf289ca 2004-04-06 devnull
2037 cbeb0b26 2006-04-01 devnull /* Tags that have empty action */
2038 7cf289ca 2004-04-06 devnull case Tabbr:
2039 7cf289ca 2004-04-06 devnull case Tabbr+RBRA:
2040 7cf289ca 2004-04-06 devnull case Tacronym:
2041 7cf289ca 2004-04-06 devnull case Tacronym+RBRA:
2042 7cf289ca 2004-04-06 devnull case Tarea+RBRA:
2043 7cf289ca 2004-04-06 devnull case Tbase+RBRA:
2044 7cf289ca 2004-04-06 devnull case Tbasefont+RBRA:
2045 7cf289ca 2004-04-06 devnull case Tbr+RBRA:
2046 7cf289ca 2004-04-06 devnull case Tdd+RBRA:
2047 7cf289ca 2004-04-06 devnull case Tdt+RBRA:
2048 7cf289ca 2004-04-06 devnull case Tframe+RBRA:
2049 7cf289ca 2004-04-06 devnull case Thr+RBRA:
2050 7cf289ca 2004-04-06 devnull case Thtml:
2051 7cf289ca 2004-04-06 devnull case Thtml+RBRA:
2052 7cf289ca 2004-04-06 devnull case Timg+RBRA:
2053 7cf289ca 2004-04-06 devnull case Tinput+RBRA:
2054 7cf289ca 2004-04-06 devnull case Tisindex+RBRA:
2055 7cf289ca 2004-04-06 devnull case Tli+RBRA:
2056 7cf289ca 2004-04-06 devnull case Tlink:
2057 7cf289ca 2004-04-06 devnull case Tlink+RBRA:
2058 7cf289ca 2004-04-06 devnull case Tmeta+RBRA:
2059 7cf289ca 2004-04-06 devnull case Toption+RBRA:
2060 7cf289ca 2004-04-06 devnull case Tparam+RBRA:
2061 7cf289ca 2004-04-06 devnull case Ttextarea+RBRA:
2062 7cf289ca 2004-04-06 devnull case Ttitle+RBRA:
2063 7cf289ca 2004-04-06 devnull break;
2064 7cf289ca 2004-04-06 devnull
2065 7cf289ca 2004-04-06 devnull
2066 cbeb0b26 2006-04-01 devnull /* Tags not implemented */
2067 7cf289ca 2004-04-06 devnull case Tbdo:
2068 7cf289ca 2004-04-06 devnull case Tbdo+RBRA:
2069 7cf289ca 2004-04-06 devnull case Tbutton:
2070 7cf289ca 2004-04-06 devnull case Tbutton+RBRA:
2071 7cf289ca 2004-04-06 devnull case Tdel:
2072 7cf289ca 2004-04-06 devnull case Tdel+RBRA:
2073 7cf289ca 2004-04-06 devnull case Tfieldset:
2074 7cf289ca 2004-04-06 devnull case Tfieldset+RBRA:
2075 7cf289ca 2004-04-06 devnull case Tiframe:
2076 7cf289ca 2004-04-06 devnull case Tiframe+RBRA:
2077 7cf289ca 2004-04-06 devnull case Tins:
2078 7cf289ca 2004-04-06 devnull case Tins+RBRA:
2079 7cf289ca 2004-04-06 devnull case Tlabel:
2080 7cf289ca 2004-04-06 devnull case Tlabel+RBRA:
2081 7cf289ca 2004-04-06 devnull case Tlegend:
2082 7cf289ca 2004-04-06 devnull case Tlegend+RBRA:
2083 7cf289ca 2004-04-06 devnull case Tobject:
2084 7cf289ca 2004-04-06 devnull case Tobject+RBRA:
2085 7cf289ca 2004-04-06 devnull case Toptgroup:
2086 7cf289ca 2004-04-06 devnull case Toptgroup+RBRA:
2087 7cf289ca 2004-04-06 devnull case Tspan:
2088 7cf289ca 2004-04-06 devnull case Tspan+RBRA:
2089 7cf289ca 2004-04-06 devnull if(warn) {
2090 7cf289ca 2004-04-06 devnull if(tag > RBRA)
2091 7cf289ca 2004-04-06 devnull tag -= RBRA;
2092 7cf289ca 2004-04-06 devnull fprint(2, "warning: unimplemented HTML tag: %S\n", tagnames[tag]);
2093 7cf289ca 2004-04-06 devnull }
2094 7cf289ca 2004-04-06 devnull break;
2095 7cf289ca 2004-04-06 devnull
2096 7cf289ca 2004-04-06 devnull default:
2097 7cf289ca 2004-04-06 devnull if(warn)
2098 7cf289ca 2004-04-06 devnull fprint(2, "warning: unknown HTML tag: %S\n", tok->text);
2099 7cf289ca 2004-04-06 devnull break;
2100 7cf289ca 2004-04-06 devnull }
2101 7cf289ca 2004-04-06 devnull }
2102 cbeb0b26 2006-04-01 devnull /* some pages omit trailing </table> */
2103 7cf289ca 2004-04-06 devnull while(curtab != nil) {
2104 7cf289ca 2004-04-06 devnull if(warn)
2105 7cf289ca 2004-04-06 devnull fprint(2, "warning: <TABLE> not closed\n");
2106 7cf289ca 2004-04-06 devnull if(curtab->cells != nil) {
2107 7cf289ca 2004-04-06 devnull ps = finishcell(curtab, ps);
2108 7cf289ca 2004-04-06 devnull if(curtab->cells == nil) {
2109 7cf289ca 2004-04-06 devnull if(warn)
2110 7cf289ca 2004-04-06 devnull fprint(2, "warning: empty table\n");
2111 7cf289ca 2004-04-06 devnull }
2112 7cf289ca 2004-04-06 devnull else {
2113 7cf289ca 2004-04-06 devnull if(curtab->rows != nil)
2114 7cf289ca 2004-04-06 devnull curtab->rows->flags = 0;
2115 7cf289ca 2004-04-06 devnull finish_table(curtab);
2116 7cf289ca 2004-04-06 devnull ps->skipping = 0;
2117 7cf289ca 2004-04-06 devnull additem(ps, newitable(curtab), curtab->tabletok);
2118 7cf289ca 2004-04-06 devnull addbrk(ps, 0, 0);
2119 7cf289ca 2004-04-06 devnull }
2120 7cf289ca 2004-04-06 devnull }
2121 7cf289ca 2004-04-06 devnull if(is->tabstk != nil)
2122 7cf289ca 2004-04-06 devnull is->tabstk = is->tabstk->next;
2123 7cf289ca 2004-04-06 devnull curtab->next = di->tables;
2124 7cf289ca 2004-04-06 devnull di->tables = curtab;
2125 7cf289ca 2004-04-06 devnull curtab = is->tabstk;
2126 7cf289ca 2004-04-06 devnull }
2127 7cf289ca 2004-04-06 devnull outerps = lastps(ps);
2128 7cf289ca 2004-04-06 devnull ans = outerps->items->next;
2129 cbeb0b26 2006-04-01 devnull /* note: ans may be nil and di->kids not nil, if there's a frameset! */
2130 8241eca9 2020-01-08 crossd freeitem(outerps->items);
2131 7cf289ca 2004-04-06 devnull outerps->items = newispacer(ISPnull);
2132 7cf289ca 2004-04-06 devnull outerps->lastit = outerps->items;
2133 7cf289ca 2004-04-06 devnull is->psstk = ps;
2134 7cf289ca 2004-04-06 devnull if(ans != nil && di->hasscripts) {
2135 cbeb0b26 2006-04-01 devnull /* TODO evalscript(nil); */
2136 7cf289ca 2004-04-06 devnull ;
2137 7cf289ca 2004-04-06 devnull }
2138 8241eca9 2020-01-08 crossd freeitems(outerps->items);
2139 7cf289ca 2004-04-06 devnull
2140 7cf289ca 2004-04-06 devnull return_ans:
2141 7cf289ca 2004-04-06 devnull if(dbgbuild) {
2142 7cf289ca 2004-04-06 devnull assert(validitems(ans));
2143 7cf289ca 2004-04-06 devnull if(ans == nil)
2144 7cf289ca 2004-04-06 devnull fprint(2, "getitems returning nil\n");
2145 7cf289ca 2004-04-06 devnull else
2146 7cf289ca 2004-04-06 devnull printitems(ans, "getitems returning:");
2147 7cf289ca 2004-04-06 devnull }
2148 8241eca9 2020-01-08 crossd _freetokens(toks, tokslen);
2149 7cf289ca 2004-04-06 devnull return ans;
2150 7cf289ca 2004-04-06 devnull }
2151 7cf289ca 2004-04-06 devnull
2152 cbeb0b26 2006-04-01 devnull /* Concatenate together maximal set of Data tokens, starting at toks[toki+1]. */
2153 cbeb0b26 2006-04-01 devnull /* Lexer has ensured that there will either be a following non-data token or */
2154 cbeb0b26 2006-04-01 devnull /* we will be at eof. */
2155 cbeb0b26 2006-04-01 devnull /* Return emallocd trimmed concatenation, and update *ptoki to last used toki */
2156 7cf289ca 2004-04-06 devnull static Rune*
2157 7cf289ca 2004-04-06 devnull getpcdata(Token* toks, int tokslen, int* ptoki)
2158 7cf289ca 2004-04-06 devnull {
2159 7cf289ca 2004-04-06 devnull Rune* ans;
2160 7cf289ca 2004-04-06 devnull Rune* p;
2161 7cf289ca 2004-04-06 devnull Rune* trimans;
2162 7cf289ca 2004-04-06 devnull int anslen;
2163 7cf289ca 2004-04-06 devnull int trimanslen;
2164 7cf289ca 2004-04-06 devnull int toki;
2165 7cf289ca 2004-04-06 devnull Token* tok;
2166 7cf289ca 2004-04-06 devnull
2167 7cf289ca 2004-04-06 devnull ans = nil;
2168 7cf289ca 2004-04-06 devnull anslen = 0;
2169 cbeb0b26 2006-04-01 devnull /* first find length of answer */
2170 7cf289ca 2004-04-06 devnull toki = (*ptoki) + 1;
2171 7cf289ca 2004-04-06 devnull while(toki < tokslen) {
2172 7cf289ca 2004-04-06 devnull tok = &toks[toki];
2173 7cf289ca 2004-04-06 devnull if(tok->tag == Data) {
2174 7cf289ca 2004-04-06 devnull toki++;
2175 7cf289ca 2004-04-06 devnull anslen += _Strlen(tok->text);
2176 7cf289ca 2004-04-06 devnull }
2177 7cf289ca 2004-04-06 devnull else
2178 7cf289ca 2004-04-06 devnull break;
2179 7cf289ca 2004-04-06 devnull }
2180 cbeb0b26 2006-04-01 devnull /* now make up the initial answer */
2181 7cf289ca 2004-04-06 devnull if(anslen > 0) {
2182 7cf289ca 2004-04-06 devnull ans = _newstr(anslen);
2183 7cf289ca 2004-04-06 devnull p = ans;
2184 7cf289ca 2004-04-06 devnull toki = (*ptoki) + 1;
2185 7cf289ca 2004-04-06 devnull while(toki < tokslen) {
2186 7cf289ca 2004-04-06 devnull tok = &toks[toki];
2187 7cf289ca 2004-04-06 devnull if(tok->tag == Data) {
2188 7cf289ca 2004-04-06 devnull toki++;
2189 7cf289ca 2004-04-06 devnull p = _Stradd(p, tok->text, _Strlen(tok->text));
2190 7cf289ca 2004-04-06 devnull }
2191 7cf289ca 2004-04-06 devnull else
2192 7cf289ca 2004-04-06 devnull break;
2193 7cf289ca 2004-04-06 devnull }
2194 7cf289ca 2004-04-06 devnull *p = 0;
2195 7cf289ca 2004-04-06 devnull _trimwhite(ans, anslen, &trimans, &trimanslen);
2196 7cf289ca 2004-04-06 devnull if(trimanslen != anslen) {
2197 7cf289ca 2004-04-06 devnull p = ans;
2198 7cf289ca 2004-04-06 devnull ans = _Strndup(trimans, trimanslen);
2199 7cf289ca 2004-04-06 devnull free(p);
2200 7cf289ca 2004-04-06 devnull }
2201 7cf289ca 2004-04-06 devnull }
2202 7cf289ca 2004-04-06 devnull *ptoki = toki-1;
2203 7cf289ca 2004-04-06 devnull return ans;
2204 7cf289ca 2004-04-06 devnull }
2205 7cf289ca 2004-04-06 devnull
2206 cbeb0b26 2006-04-01 devnull /* If still parsing head of curtab->cells list, finish it off */
2207 cbeb0b26 2006-04-01 devnull /* by transferring the items on the head of psstk to the cell. */
2208 cbeb0b26 2006-04-01 devnull /* Then pop the psstk and return the new psstk. */
2209 7cf289ca 2004-04-06 devnull static Pstate*
2210 7cf289ca 2004-04-06 devnull finishcell(Table* curtab, Pstate* psstk)
2211 7cf289ca 2004-04-06 devnull {
2212 7cf289ca 2004-04-06 devnull Tablecell* c;
2213 7cf289ca 2004-04-06 devnull Pstate* psstknext;
2214 7cf289ca 2004-04-06 devnull
2215 7cf289ca 2004-04-06 devnull c = curtab->cells;
2216 7cf289ca 2004-04-06 devnull if(c != nil) {
2217 7cf289ca 2004-04-06 devnull if((c->flags&TFparsing)) {
2218 7cf289ca 2004-04-06 devnull psstknext = psstk->next;
2219 7cf289ca 2004-04-06 devnull if(psstknext == nil) {
2220 7cf289ca 2004-04-06 devnull if(warn)
2221 7cf289ca 2004-04-06 devnull fprint(2, "warning: parse state stack is wrong\n");
2222 7cf289ca 2004-04-06 devnull }
2223 7cf289ca 2004-04-06 devnull else {
2224 7cf289ca 2004-04-06 devnull c->content = psstk->items->next;
2225 7cf289ca 2004-04-06 devnull c->flags &= ~TFparsing;
2226 7cf289ca 2004-04-06 devnull freepstate(psstk);
2227 7cf289ca 2004-04-06 devnull psstk = psstknext;
2228 7cf289ca 2004-04-06 devnull }
2229 7cf289ca 2004-04-06 devnull }
2230 7cf289ca 2004-04-06 devnull }
2231 7cf289ca 2004-04-06 devnull return psstk;
2232 7cf289ca 2004-04-06 devnull }
2233 7cf289ca 2004-04-06 devnull
2234 cbeb0b26 2006-04-01 devnull /* Make a new Pstate for a cell, based on the old pstate, oldps. */
2235 cbeb0b26 2006-04-01 devnull /* Also, put the new ps on the head of the oldps stack. */
2236 7cf289ca 2004-04-06 devnull static Pstate*
2237 7cf289ca 2004-04-06 devnull cell_pstate(Pstate* oldps, int ishead)
2238 7cf289ca 2004-04-06 devnull {
2239 7cf289ca 2004-04-06 devnull Pstate* ps;
2240 7cf289ca 2004-04-06 devnull int sty;
2241 7cf289ca 2004-04-06 devnull
2242 7cf289ca 2004-04-06 devnull ps = newpstate(oldps);
2243 7cf289ca 2004-04-06 devnull ps->skipwhite = 1;
2244 7cf289ca 2004-04-06 devnull ps->curanchor = oldps->curanchor;
2245 7cf289ca 2004-04-06 devnull copystack(&ps->fntstylestk, &oldps->fntstylestk);
2246 7cf289ca 2004-04-06 devnull copystack(&ps->fntsizestk, &oldps->fntsizestk);
2247 7cf289ca 2004-04-06 devnull ps->curfont = oldps->curfont;
2248 7cf289ca 2004-04-06 devnull ps->curfg = oldps->curfg;
2249 7cf289ca 2004-04-06 devnull ps->curbg = oldps->curbg;
2250 7cf289ca 2004-04-06 devnull copystack(&ps->fgstk, &oldps->fgstk);
2251 7cf289ca 2004-04-06 devnull ps->adjsize = oldps->adjsize;
2252 7cf289ca 2004-04-06 devnull if(ishead) {
2253 7cf289ca 2004-04-06 devnull sty = ps->curfont%NumSize;
2254 7cf289ca 2004-04-06 devnull ps->curfont = FntB*NumSize + sty;
2255 7cf289ca 2004-04-06 devnull }
2256 7cf289ca 2004-04-06 devnull return ps;
2257 7cf289ca 2004-04-06 devnull }
2258 7cf289ca 2004-04-06 devnull
2259 cbeb0b26 2006-04-01 devnull /* Return a new Pstate with default starting state. */
2260 cbeb0b26 2006-04-01 devnull /* Use link to add it to head of a list, if any. */
2261 7cf289ca 2004-04-06 devnull static Pstate*
2262 7cf289ca 2004-04-06 devnull newpstate(Pstate* link)
2263 7cf289ca 2004-04-06 devnull {
2264 7cf289ca 2004-04-06 devnull Pstate* ps;
2265 7cf289ca 2004-04-06 devnull
2266 7cf289ca 2004-04-06 devnull ps = (Pstate*)emalloc(sizeof(Pstate));
2267 7cf289ca 2004-04-06 devnull ps->curfont = DefFnt;
2268 7cf289ca 2004-04-06 devnull ps->curfg = Black;
2269 7cf289ca 2004-04-06 devnull ps->curbg.image = nil;
2270 7cf289ca 2004-04-06 devnull ps->curbg.color = White;
2271 7cf289ca 2004-04-06 devnull ps->curul = ULnone;
2272 7cf289ca 2004-04-06 devnull ps->curjust = ALleft;
2273 7cf289ca 2004-04-06 devnull ps->curstate = IFwrap;
2274 7cf289ca 2004-04-06 devnull ps->items = newispacer(ISPnull);
2275 7cf289ca 2004-04-06 devnull ps->lastit = ps->items;
2276 7cf289ca 2004-04-06 devnull ps->prelastit = nil;
2277 7cf289ca 2004-04-06 devnull ps->next = link;
2278 7cf289ca 2004-04-06 devnull return ps;
2279 7cf289ca 2004-04-06 devnull }
2280 7cf289ca 2004-04-06 devnull
2281 cbeb0b26 2006-04-01 devnull /* Return last Pstate on psl list */
2282 7cf289ca 2004-04-06 devnull static Pstate*
2283 7cf289ca 2004-04-06 devnull lastps(Pstate* psl)
2284 7cf289ca 2004-04-06 devnull {
2285 7cf289ca 2004-04-06 devnull assert(psl != nil);
2286 7cf289ca 2004-04-06 devnull while(psl->next != nil)
2287 7cf289ca 2004-04-06 devnull psl = psl->next;
2288 7cf289ca 2004-04-06 devnull return psl;
2289 7cf289ca 2004-04-06 devnull }
2290 7cf289ca 2004-04-06 devnull
2291 cbeb0b26 2006-04-01 devnull /* Add it to end of ps item chain, adding in current state from ps. */
2292 cbeb0b26 2006-04-01 devnull /* Also, if tok is not nil, scan it for generic attributes and assign */
2293 cbeb0b26 2006-04-01 devnull /* the genattr field of the item accordingly. */
2294 7cf289ca 2004-04-06 devnull static void
2295 7cf289ca 2004-04-06 devnull additem(Pstate* ps, Item* it, Token* tok)
2296 7cf289ca 2004-04-06 devnull {
2297 7cf289ca 2004-04-06 devnull int aid;
2298 7cf289ca 2004-04-06 devnull int any;
2299 7cf289ca 2004-04-06 devnull Rune* i;
2300 7cf289ca 2004-04-06 devnull Rune* c;
2301 7cf289ca 2004-04-06 devnull Rune* s;
2302 7cf289ca 2004-04-06 devnull Rune* t;
2303 7cf289ca 2004-04-06 devnull Attr* a;
2304 7cf289ca 2004-04-06 devnull SEvent* e;
2305 7cf289ca 2004-04-06 devnull
2306 7cf289ca 2004-04-06 devnull if(ps->skipping) {
2307 7cf289ca 2004-04-06 devnull if(warn)
2308 7cf289ca 2004-04-06 devnull fprint(2, "warning: skipping item: %I\n", it);
2309 7cf289ca 2004-04-06 devnull return;
2310 7cf289ca 2004-04-06 devnull }
2311 7cf289ca 2004-04-06 devnull it->anchorid = ps->curanchor;
2312 7cf289ca 2004-04-06 devnull it->state |= ps->curstate;
2313 7cf289ca 2004-04-06 devnull if(tok != nil) {
2314 7cf289ca 2004-04-06 devnull any = 0;
2315 7cf289ca 2004-04-06 devnull i = nil;
2316 7cf289ca 2004-04-06 devnull c = nil;
2317 7cf289ca 2004-04-06 devnull s = nil;
2318 7cf289ca 2004-04-06 devnull t = nil;
2319 7cf289ca 2004-04-06 devnull e = nil;
2320 7cf289ca 2004-04-06 devnull for(a = tok->attr; a != nil; a = a->next) {
2321 7cf289ca 2004-04-06 devnull aid = a->attid;
2322 7cf289ca 2004-04-06 devnull if(!attrinfo[aid])
2323 7cf289ca 2004-04-06 devnull continue;
2324 7cf289ca 2004-04-06 devnull switch(aid) {
2325 7cf289ca 2004-04-06 devnull case Aid:
2326 7cf289ca 2004-04-06 devnull i = a->value;
2327 7cf289ca 2004-04-06 devnull break;
2328 7cf289ca 2004-04-06 devnull
2329 7cf289ca 2004-04-06 devnull case Aclass:
2330 7cf289ca 2004-04-06 devnull c = a->value;
2331 7cf289ca 2004-04-06 devnull break;
2332 7cf289ca 2004-04-06 devnull
2333 7cf289ca 2004-04-06 devnull case Astyle:
2334 7cf289ca 2004-04-06 devnull s = a->value;
2335 7cf289ca 2004-04-06 devnull break;
2336 7cf289ca 2004-04-06 devnull
2337 7cf289ca 2004-04-06 devnull case Atitle:
2338 7cf289ca 2004-04-06 devnull t = a->value;
2339 7cf289ca 2004-04-06 devnull break;
2340 7cf289ca 2004-04-06 devnull
2341 7cf289ca 2004-04-06 devnull default:
2342 7cf289ca 2004-04-06 devnull assert(aid >= Aonblur && aid <= Aonunload);
2343 7cf289ca 2004-04-06 devnull e = newscriptevent(scriptev[a->attid], a->value, e);
2344 7cf289ca 2004-04-06 devnull break;
2345 7cf289ca 2004-04-06 devnull }
2346 7cf289ca 2004-04-06 devnull a->value = nil;
2347 7cf289ca 2004-04-06 devnull any = 1;
2348 7cf289ca 2004-04-06 devnull }
2349 7cf289ca 2004-04-06 devnull if(any)
2350 7cf289ca 2004-04-06 devnull it->genattr = newgenattr(i, c, s, t, e);
2351 7cf289ca 2004-04-06 devnull }
2352 7cf289ca 2004-04-06 devnull ps->curstate &= ~(IFbrk|IFbrksp|IFnobrk|IFcleft|IFcright);
2353 7cf289ca 2004-04-06 devnull ps->prelastit = ps->lastit;
2354 7cf289ca 2004-04-06 devnull ps->lastit->next = it;
2355 7cf289ca 2004-04-06 devnull ps->lastit = it;
2356 7cf289ca 2004-04-06 devnull }
2357 7cf289ca 2004-04-06 devnull
2358 cbeb0b26 2006-04-01 devnull /* Make a text item out of s, */
2359 cbeb0b26 2006-04-01 devnull /* using current font, foreground, vertical offset and underline state. */
2360 7cf289ca 2004-04-06 devnull static Item*
2361 7cf289ca 2004-04-06 devnull textit(Pstate* ps, Rune* s)
2362 7cf289ca 2004-04-06 devnull {
2363 7cf289ca 2004-04-06 devnull assert(s != nil);
2364 7cf289ca 2004-04-06 devnull return newitext(s, ps->curfont, ps->curfg, ps->curvoff + Voffbias, ps->curul);
2365 7cf289ca 2004-04-06 devnull }
2366 7cf289ca 2004-04-06 devnull
2367 cbeb0b26 2006-04-01 devnull /* Add text item or items for s, paying attention to */
2368 cbeb0b26 2006-04-01 devnull /* current font, foreground, baseline offset, underline state, */
2369 cbeb0b26 2006-04-01 devnull /* and literal mode. Unless we're in literal mode, compress */
2370 cbeb0b26 2006-04-01 devnull /* whitespace to single blank, and, if curstate has a break, */
2371 cbeb0b26 2006-04-01 devnull /* trim any leading whitespace. Whether in literal mode or not, */
2372 cbeb0b26 2006-04-01 devnull /* turn nonbreaking spaces into spacer items with IFnobrk set. */
2373 cbeb0b26 2006-04-01 devnull /* */
2374 cbeb0b26 2006-04-01 devnull /* In literal mode, break up s at newlines and add breaks instead. */
2375 cbeb0b26 2006-04-01 devnull /* Also replace tabs appropriate number of spaces. */
2376 cbeb0b26 2006-04-01 devnull /* In nonliteral mode, break up the items every 100 or so characters */
2377 cbeb0b26 2006-04-01 devnull /* just to make the layout algorithm not go quadratic. */
2378 cbeb0b26 2006-04-01 devnull /* */
2379 cbeb0b26 2006-04-01 devnull /* addtext assumes ownership of s. */
2380 7cf289ca 2004-04-06 devnull static void
2381 7cf289ca 2004-04-06 devnull addtext(Pstate* ps, Rune* s)
2382 7cf289ca 2004-04-06 devnull {
2383 7cf289ca 2004-04-06 devnull int n;
2384 7cf289ca 2004-04-06 devnull int i;
2385 7cf289ca 2004-04-06 devnull int j;
2386 7cf289ca 2004-04-06 devnull int k;
2387 7cf289ca 2004-04-06 devnull int col;
2388 7cf289ca 2004-04-06 devnull int c;
2389 7cf289ca 2004-04-06 devnull int nsp;
2390 7cf289ca 2004-04-06 devnull Item* it;
2391 7cf289ca 2004-04-06 devnull Rune* ss;
2392 7cf289ca 2004-04-06 devnull Rune* p;
2393 7cf289ca 2004-04-06 devnull Rune buf[SMALLBUFSIZE];
2394 7cf289ca 2004-04-06 devnull
2395 7cf289ca 2004-04-06 devnull assert(s != nil);
2396 7cf289ca 2004-04-06 devnull n = runestrlen(s);
2397 7cf289ca 2004-04-06 devnull i = 0;
2398 7cf289ca 2004-04-06 devnull j = 0;
2399 7cf289ca 2004-04-06 devnull if(ps->literal) {
2400 7cf289ca 2004-04-06 devnull col = 0;
2401 7cf289ca 2004-04-06 devnull while(i < n) {
2402 7cf289ca 2004-04-06 devnull if(s[i] == '\n') {
2403 7cf289ca 2004-04-06 devnull if(i > j) {
2404 cbeb0b26 2006-04-01 devnull /* trim trailing blanks from line */
2405 7cf289ca 2004-04-06 devnull for(k = i; k > j; k--)
2406 7cf289ca 2004-04-06 devnull if(s[k - 1] != ' ')
2407 7cf289ca 2004-04-06 devnull break;
2408 7cf289ca 2004-04-06 devnull if(k > j)
2409 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, _Strndup(s+j, k-j)), nil);
2410 7cf289ca 2004-04-06 devnull }
2411 7cf289ca 2004-04-06 devnull addlinebrk(ps, 0);
2412 7cf289ca 2004-04-06 devnull j = i + 1;
2413 7cf289ca 2004-04-06 devnull col = 0;
2414 7cf289ca 2004-04-06 devnull }
2415 7cf289ca 2004-04-06 devnull else {
2416 7cf289ca 2004-04-06 devnull if(s[i] == '\t') {
2417 7cf289ca 2004-04-06 devnull col += i - j;
2418 7cf289ca 2004-04-06 devnull nsp = 8 - (col%8);
2419 cbeb0b26 2006-04-01 devnull /* make ss = s[j:i] + nsp spaces */
2420 7cf289ca 2004-04-06 devnull ss = _newstr(i-j+nsp);
2421 7cf289ca 2004-04-06 devnull p = _Stradd(ss, s+j, i-j);
2422 7cf289ca 2004-04-06 devnull p = _Stradd(p, L(Ltab2space), nsp);
2423 7cf289ca 2004-04-06 devnull *p = 0;
2424 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, ss), nil);
2425 7cf289ca 2004-04-06 devnull col += nsp;
2426 7cf289ca 2004-04-06 devnull j = i + 1;
2427 7cf289ca 2004-04-06 devnull }
2428 7cf289ca 2004-04-06 devnull else if(s[i] == NBSP) {
2429 7cf289ca 2004-04-06 devnull if(i > j)
2430 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, _Strndup(s+j, i-j)), nil);
2431 7cf289ca 2004-04-06 devnull addnbsp(ps);
2432 7cf289ca 2004-04-06 devnull col += (i - j) + 1;
2433 7cf289ca 2004-04-06 devnull j = i + 1;
2434 7cf289ca 2004-04-06 devnull }
2435 7cf289ca 2004-04-06 devnull }
2436 7cf289ca 2004-04-06 devnull i++;
2437 7cf289ca 2004-04-06 devnull }
2438 7cf289ca 2004-04-06 devnull if(i > j) {
2439 7cf289ca 2004-04-06 devnull if(j == 0 && i == n) {
2440 cbeb0b26 2006-04-01 devnull /* just transfer s over */
2441 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, s), nil);
2442 7cf289ca 2004-04-06 devnull }
2443 7cf289ca 2004-04-06 devnull else {
2444 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, _Strndup(s+j, i-j)), nil);
2445 7cf289ca 2004-04-06 devnull free(s);
2446 7cf289ca 2004-04-06 devnull }
2447 7cf289ca 2004-04-06 devnull }
2448 a1874172 2020-01-08 crossd else {
2449 a1874172 2020-01-08 crossd free(s);
2450 a1874172 2020-01-08 crossd }
2451 7cf289ca 2004-04-06 devnull }
2452 cbeb0b26 2006-04-01 devnull else { /* not literal mode */
2453 7cf289ca 2004-04-06 devnull if((ps->curstate&IFbrk) || ps->lastit == ps->items)
2454 7cf289ca 2004-04-06 devnull while(i < n) {
2455 7cf289ca 2004-04-06 devnull c = s[i];
2456 7cf289ca 2004-04-06 devnull if(c >= 256 || !isspace(c))
2457 7cf289ca 2004-04-06 devnull break;
2458 7cf289ca 2004-04-06 devnull i++;
2459 7cf289ca 2004-04-06 devnull }
2460 7cf289ca 2004-04-06 devnull p = buf;
2461 7cf289ca 2004-04-06 devnull for(j = i; i < n; i++) {
2462 7cf289ca 2004-04-06 devnull assert(p+i-j < buf+SMALLBUFSIZE-1);
2463 7cf289ca 2004-04-06 devnull c = s[i];
2464 7cf289ca 2004-04-06 devnull if(c == NBSP) {
2465 7cf289ca 2004-04-06 devnull if(i > j)
2466 7cf289ca 2004-04-06 devnull p = _Stradd(p, s+j, i-j);
2467 7cf289ca 2004-04-06 devnull if(p > buf)
2468 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, _Strndup(buf, p-buf)), nil);
2469 7cf289ca 2004-04-06 devnull p = buf;
2470 7cf289ca 2004-04-06 devnull addnbsp(ps);
2471 7cf289ca 2004-04-06 devnull j = i + 1;
2472 7cf289ca 2004-04-06 devnull continue;
2473 7cf289ca 2004-04-06 devnull }
2474 7cf289ca 2004-04-06 devnull if(c < 256 && isspace(c)) {
2475 7cf289ca 2004-04-06 devnull if(i > j)
2476 7cf289ca 2004-04-06 devnull p = _Stradd(p, s+j, i-j);
2477 7cf289ca 2004-04-06 devnull *p++ = ' ';
2478 7cf289ca 2004-04-06 devnull while(i < n - 1) {
2479 7cf289ca 2004-04-06 devnull c = s[i + 1];
2480 7cf289ca 2004-04-06 devnull if(c >= 256 || !isspace(c))
2481 7cf289ca 2004-04-06 devnull break;
2482 7cf289ca 2004-04-06 devnull i++;
2483 7cf289ca 2004-04-06 devnull }
2484 7cf289ca 2004-04-06 devnull j = i + 1;
2485 7cf289ca 2004-04-06 devnull }
2486 7cf289ca 2004-04-06 devnull if(i - j >= 100) {
2487 7cf289ca 2004-04-06 devnull p = _Stradd(p, s+j, i+1-j);
2488 7cf289ca 2004-04-06 devnull j = i + 1;
2489 7cf289ca 2004-04-06 devnull }
2490 7cf289ca 2004-04-06 devnull if(p-buf >= 100) {
2491 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, _Strndup(buf, p-buf)), nil);
2492 7cf289ca 2004-04-06 devnull p = buf;
2493 7cf289ca 2004-04-06 devnull }
2494 7cf289ca 2004-04-06 devnull }
2495 7cf289ca 2004-04-06 devnull if(i > j && j < n) {
2496 7cf289ca 2004-04-06 devnull assert(p+i-j < buf+SMALLBUFSIZE-1);
2497 7cf289ca 2004-04-06 devnull p = _Stradd(p, s+j, i-j);
2498 7cf289ca 2004-04-06 devnull }
2499 cbeb0b26 2006-04-01 devnull /* don't add a space if previous item ended in a space */
2500 7cf289ca 2004-04-06 devnull if(p-buf == 1 && buf[0] == ' ' && ps->lastit != nil) {
2501 7cf289ca 2004-04-06 devnull it = ps->lastit;
2502 7cf289ca 2004-04-06 devnull if(it->tag == Itexttag) {
2503 7cf289ca 2004-04-06 devnull ss = ((Itext*)it)->s;
2504 7cf289ca 2004-04-06 devnull k = _Strlen(ss);
2505 7cf289ca 2004-04-06 devnull if(k > 0 && ss[k] == ' ')
2506 7cf289ca 2004-04-06 devnull p = buf;
2507 7cf289ca 2004-04-06 devnull }
2508 7cf289ca 2004-04-06 devnull }
2509 7cf289ca 2004-04-06 devnull if(p > buf)
2510 7cf289ca 2004-04-06 devnull additem(ps, textit(ps, _Strndup(buf, p-buf)), nil);
2511 7cf289ca 2004-04-06 devnull free(s);
2512 7cf289ca 2004-04-06 devnull }
2513 7cf289ca 2004-04-06 devnull }
2514 7cf289ca 2004-04-06 devnull
2515 cbeb0b26 2006-04-01 devnull /* Add a break to ps->curstate, with extra space if sp is true. */
2516 cbeb0b26 2006-04-01 devnull /* If there was a previous break, combine this one's parameters */
2517 cbeb0b26 2006-04-01 devnull /* with that to make the amt be the max of the two and the clr */
2518 cbeb0b26 2006-04-01 devnull /* be the most general. (amt will be 0 or 1) */
2519 cbeb0b26 2006-04-01 devnull /* Also, if the immediately preceding item was a text item, */
2520 cbeb0b26 2006-04-01 devnull /* trim any whitespace from the end of it, if not in literal mode. */
2521 cbeb0b26 2006-04-01 devnull /* Finally, if this is at the very beginning of the item list */
2522 cbeb0b26 2006-04-01 devnull /* (the only thing there is a null spacer), then don't add the space. */
2523 7cf289ca 2004-04-06 devnull static void
2524 7cf289ca 2004-04-06 devnull addbrk(Pstate* ps, int sp, int clr)
2525 7cf289ca 2004-04-06 devnull {
2526 7cf289ca 2004-04-06 devnull int state;
2527 7cf289ca 2004-04-06 devnull Rune* l;
2528 7cf289ca 2004-04-06 devnull int nl;
2529 7cf289ca 2004-04-06 devnull Rune* r;
2530 7cf289ca 2004-04-06 devnull int nr;
2531 7cf289ca 2004-04-06 devnull Itext* t;
2532 7cf289ca 2004-04-06 devnull Rune* s;
2533 7cf289ca 2004-04-06 devnull
2534 7cf289ca 2004-04-06 devnull state = ps->curstate;
2535 7cf289ca 2004-04-06 devnull clr = clr|(state&(IFcleft|IFcright));
2536 7cf289ca 2004-04-06 devnull if(sp && !(ps->lastit == ps->items))
2537 7cf289ca 2004-04-06 devnull sp = IFbrksp;
2538 7cf289ca 2004-04-06 devnull else
2539 7cf289ca 2004-04-06 devnull sp = 0;
2540 7cf289ca 2004-04-06 devnull ps->curstate = IFbrk|sp|(state&~(IFcleft|IFcright))|clr;
2541 7cf289ca 2004-04-06 devnull if(ps->lastit != ps->items) {
2542 7cf289ca 2004-04-06 devnull if(!ps->literal && ps->lastit->tag == Itexttag) {
2543 7cf289ca 2004-04-06 devnull t = (Itext*)ps->lastit;
2544 7cf289ca 2004-04-06 devnull _splitr(t->s, _Strlen(t->s), notwhitespace, &l, &nl, &r, &nr);
2545 cbeb0b26 2006-04-01 devnull /* try to avoid making empty items */
2546 cbeb0b26 2006-04-01 devnull /* but not crucial f the occasional one gets through */
2547 7cf289ca 2004-04-06 devnull if(nl == 0 && ps->prelastit != nil) {
2548 7cf289ca 2004-04-06 devnull ps->lastit = ps->prelastit;
2549 7cf289ca 2004-04-06 devnull ps->lastit->next = nil;
2550 7cf289ca 2004-04-06 devnull ps->prelastit = nil;
2551 7cf289ca 2004-04-06 devnull }
2552 7cf289ca 2004-04-06 devnull else {
2553 7cf289ca 2004-04-06 devnull s = t->s;
2554 7cf289ca 2004-04-06 devnull if(nl == 0) {
2555 cbeb0b26 2006-04-01 devnull /* need a non-nil pointer to empty string */
2556 cbeb0b26 2006-04-01 devnull /* (_Strdup(L(Lempty)) returns nil) */
2557 7cf289ca 2004-04-06 devnull t->s = emalloc(sizeof(Rune));
2558 7cf289ca 2004-04-06 devnull t->s[0] = 0;
2559 7cf289ca 2004-04-06 devnull }
2560 7cf289ca 2004-04-06 devnull else
2561 7cf289ca 2004-04-06 devnull t->s = _Strndup(l, nl);
2562 7cf289ca 2004-04-06 devnull if(s)
2563 7cf289ca 2004-04-06 devnull free(s);
2564 7cf289ca 2004-04-06 devnull }
2565 7cf289ca 2004-04-06 devnull }
2566 7cf289ca 2004-04-06 devnull }
2567 7cf289ca 2004-04-06 devnull }
2568 7cf289ca 2004-04-06 devnull
2569 cbeb0b26 2006-04-01 devnull /* Add break due to a <br> or a newline within a preformatted section. */
2570 cbeb0b26 2006-04-01 devnull /* We add a null item first, with current font's height and ascent, to make */
2571 cbeb0b26 2006-04-01 devnull /* sure that the current line takes up at least that amount of vertical space. */
2572 cbeb0b26 2006-04-01 devnull /* This ensures that <br>s on empty lines cause blank lines, and that */
2573 cbeb0b26 2006-04-01 devnull /* multiple <br>s in a row give multiple blank lines. */
2574 cbeb0b26 2006-04-01 devnull /* However don't add the spacer if the previous item was something that */
2575 cbeb0b26 2006-04-01 devnull /* takes up space itself. */
2576 7cf289ca 2004-04-06 devnull static void
2577 7cf289ca 2004-04-06 devnull addlinebrk(Pstate* ps, int clr)
2578 7cf289ca 2004-04-06 devnull {
2579 7cf289ca 2004-04-06 devnull int obrkstate;
2580 7cf289ca 2004-04-06 devnull int b;
2581 7cf289ca 2004-04-06 devnull int addit;
2582 7cf289ca 2004-04-06 devnull
2583 cbeb0b26 2006-04-01 devnull /* don't want break before our null item unless the previous item */
2584 cbeb0b26 2006-04-01 devnull /* was also a null item for the purposes of line breaking */
2585 7cf289ca 2004-04-06 devnull obrkstate = ps->curstate&(IFbrk|IFbrksp);
2586 7cf289ca 2004-04-06 devnull b = IFnobrk;
2587 7cf289ca 2004-04-06 devnull addit = 0;
2588 7cf289ca 2004-04-06 devnull if(ps->lastit != nil) {
2589 7cf289ca 2004-04-06 devnull if(ps->lastit->tag == Ispacertag) {
2590 7cf289ca 2004-04-06 devnull if(((Ispacer*)ps->lastit)->spkind == ISPvline)
2591 7cf289ca 2004-04-06 devnull b = IFbrk;
2592 7cf289ca 2004-04-06 devnull addit = 1;
2593 7cf289ca 2004-04-06 devnull }
2594 7cf289ca 2004-04-06 devnull else if(ps->lastit->tag == Ifloattag)
2595 7cf289ca 2004-04-06 devnull addit = 1;
2596 7cf289ca 2004-04-06 devnull }
2597 7cf289ca 2004-04-06 devnull if(addit) {
2598 7cf289ca 2004-04-06 devnull ps->curstate = (ps->curstate&~(IFbrk|IFbrksp))|b;
2599 7cf289ca 2004-04-06 devnull additem(ps, newispacer(ISPvline), nil);
2600 7cf289ca 2004-04-06 devnull ps->curstate = (ps->curstate&~(IFbrk|IFbrksp))|obrkstate;
2601 7cf289ca 2004-04-06 devnull }
2602 7cf289ca 2004-04-06 devnull addbrk(ps, 0, clr);
2603 7cf289ca 2004-04-06 devnull }
2604 7cf289ca 2004-04-06 devnull
2605 cbeb0b26 2006-04-01 devnull /* Add a nonbreakable space */
2606 7cf289ca 2004-04-06 devnull static void
2607 7cf289ca 2004-04-06 devnull addnbsp(Pstate* ps)
2608 7cf289ca 2004-04-06 devnull {
2609 cbeb0b26 2006-04-01 devnull /* if nbsp comes right where a break was specified, */
2610 cbeb0b26 2006-04-01 devnull /* do the break anyway (nbsp is being used to generate undiscardable */
2611 cbeb0b26 2006-04-01 devnull /* space rather than to prevent a break) */
2612 7cf289ca 2004-04-06 devnull if((ps->curstate&IFbrk) == 0)
2613 7cf289ca 2004-04-06 devnull ps->curstate |= IFnobrk;
2614 7cf289ca 2004-04-06 devnull additem(ps, newispacer(ISPhspace), nil);
2615 cbeb0b26 2006-04-01 devnull /* but definitely no break on next item */
2616 7cf289ca 2004-04-06 devnull ps->curstate |= IFnobrk;
2617 7cf289ca 2004-04-06 devnull }
2618 7cf289ca 2004-04-06 devnull
2619 cbeb0b26 2006-04-01 devnull /* Change hang in ps.curstate by delta. */
2620 cbeb0b26 2006-04-01 devnull /* The amount is in 1/10ths of tabs, and is the amount that */
2621 cbeb0b26 2006-04-01 devnull /* the current contiguous set of items with a hang value set */
2622 cbeb0b26 2006-04-01 devnull /* is to be shifted left from its normal (indented) place. */
2623 7cf289ca 2004-04-06 devnull static void
2624 7cf289ca 2004-04-06 devnull changehang(Pstate* ps, int delta)
2625 7cf289ca 2004-04-06 devnull {
2626 7cf289ca 2004-04-06 devnull int amt;
2627 7cf289ca 2004-04-06 devnull
2628 7cf289ca 2004-04-06 devnull amt = (ps->curstate&IFhangmask) + delta;
2629 7cf289ca 2004-04-06 devnull if(amt < 0) {
2630 7cf289ca 2004-04-06 devnull if(warn)
2631 7cf289ca 2004-04-06 devnull fprint(2, "warning: hang went negative\n");
2632 7cf289ca 2004-04-06 devnull amt = 0;
2633 7cf289ca 2004-04-06 devnull }
2634 7cf289ca 2004-04-06 devnull ps->curstate = (ps->curstate&~IFhangmask)|amt;
2635 7cf289ca 2004-04-06 devnull }
2636 7cf289ca 2004-04-06 devnull
2637 cbeb0b26 2006-04-01 devnull /* Change indent in ps.curstate by delta. */
2638 7cf289ca 2004-04-06 devnull static void
2639 7cf289ca 2004-04-06 devnull changeindent(Pstate* ps, int delta)
2640 7cf289ca 2004-04-06 devnull {
2641 7cf289ca 2004-04-06 devnull int amt;
2642 7cf289ca 2004-04-06 devnull
2643 7cf289ca 2004-04-06 devnull amt = ((ps->curstate&IFindentmask) >> IFindentshift) + delta;
2644 7cf289ca 2004-04-06 devnull if(amt < 0) {
2645 7cf289ca 2004-04-06 devnull if(warn)
2646 7cf289ca 2004-04-06 devnull fprint(2, "warning: indent went negative\n");
2647 7cf289ca 2004-04-06 devnull amt = 0;
2648 7cf289ca 2004-04-06 devnull }
2649 7cf289ca 2004-04-06 devnull ps->curstate = (ps->curstate&~IFindentmask)|(amt << IFindentshift);
2650 7cf289ca 2004-04-06 devnull }
2651 7cf289ca 2004-04-06 devnull
2652 cbeb0b26 2006-04-01 devnull /* Push val on top of stack, and also return value pushed */
2653 7cf289ca 2004-04-06 devnull static int
2654 7cf289ca 2004-04-06 devnull push(Stack* stk, int val)
2655 7cf289ca 2004-04-06 devnull {
2656 7cf289ca 2004-04-06 devnull if(stk->n == Nestmax) {
2657 7cf289ca 2004-04-06 devnull if(warn)
2658 7cf289ca 2004-04-06 devnull fprint(2, "warning: build stack overflow\n");
2659 7cf289ca 2004-04-06 devnull }
2660 7cf289ca 2004-04-06 devnull else
2661 7cf289ca 2004-04-06 devnull stk->slots[stk->n++] = val;
2662 7cf289ca 2004-04-06 devnull return val;
2663 7cf289ca 2004-04-06 devnull }
2664 7cf289ca 2004-04-06 devnull
2665 cbeb0b26 2006-04-01 devnull /* Pop top of stack */
2666 7cf289ca 2004-04-06 devnull static void
2667 7cf289ca 2004-04-06 devnull pop(Stack* stk)
2668 7cf289ca 2004-04-06 devnull {
2669 7cf289ca 2004-04-06 devnull if(stk->n > 0)
2670 7cf289ca 2004-04-06 devnull --stk->n;
2671 7cf289ca 2004-04-06 devnull }
2672 7cf289ca 2004-04-06 devnull
2673 cbeb0b26 2006-04-01 devnull /*Return top of stack, using dflt if stack is empty */
2674 7cf289ca 2004-04-06 devnull static int
2675 7cf289ca 2004-04-06 devnull top(Stack* stk, int dflt)
2676 7cf289ca 2004-04-06 devnull {
2677 7cf289ca 2004-04-06 devnull if(stk->n == 0)
2678 7cf289ca 2004-04-06 devnull return dflt;
2679 7cf289ca 2004-04-06 devnull return stk->slots[stk->n-1];
2680 7cf289ca 2004-04-06 devnull }
2681 7cf289ca 2004-04-06 devnull
2682 cbeb0b26 2006-04-01 devnull /* pop, then return new top, with dflt if empty */
2683 7cf289ca 2004-04-06 devnull static int
2684 7cf289ca 2004-04-06 devnull popretnewtop(Stack* stk, int dflt)
2685 7cf289ca 2004-04-06 devnull {
2686 7cf289ca 2004-04-06 devnull if(stk->n == 0)
2687 7cf289ca 2004-04-06 devnull return dflt;
2688 7cf289ca 2004-04-06 devnull stk->n--;
2689 7cf289ca 2004-04-06 devnull if(stk->n == 0)
2690 7cf289ca 2004-04-06 devnull return dflt;
2691 7cf289ca 2004-04-06 devnull return stk->slots[stk->n-1];
2692 7cf289ca 2004-04-06 devnull }
2693 7cf289ca 2004-04-06 devnull
2694 cbeb0b26 2006-04-01 devnull /* Copy fromstk entries into tostk */
2695 7cf289ca 2004-04-06 devnull static void
2696 7cf289ca 2004-04-06 devnull copystack(Stack* tostk, Stack* fromstk)
2697 7cf289ca 2004-04-06 devnull {
2698 7cf289ca 2004-04-06 devnull int n;
2699 7cf289ca 2004-04-06 devnull
2700 7cf289ca 2004-04-06 devnull n = fromstk->n;
2701 7cf289ca 2004-04-06 devnull tostk->n = n;
2702 7cf289ca 2004-04-06 devnull memmove(tostk->slots, fromstk->slots, n*sizeof(int));
2703 7cf289ca 2004-04-06 devnull }
2704 7cf289ca 2004-04-06 devnull
2705 7cf289ca 2004-04-06 devnull static void
2706 7cf289ca 2004-04-06 devnull popfontstyle(Pstate* ps)
2707 7cf289ca 2004-04-06 devnull {
2708 7cf289ca 2004-04-06 devnull pop(&ps->fntstylestk);
2709 7cf289ca 2004-04-06 devnull setcurfont(ps);
2710 7cf289ca 2004-04-06 devnull }
2711 7cf289ca 2004-04-06 devnull
2712 7cf289ca 2004-04-06 devnull static void
2713 7cf289ca 2004-04-06 devnull pushfontstyle(Pstate* ps, int sty)
2714 7cf289ca 2004-04-06 devnull {
2715 7cf289ca 2004-04-06 devnull push(&ps->fntstylestk, sty);
2716 7cf289ca 2004-04-06 devnull setcurfont(ps);
2717 7cf289ca 2004-04-06 devnull }
2718 7cf289ca 2004-04-06 devnull
2719 7cf289ca 2004-04-06 devnull static void
2720 7cf289ca 2004-04-06 devnull popfontsize(Pstate* ps)
2721 7cf289ca 2004-04-06 devnull {
2722 7cf289ca 2004-04-06 devnull pop(&ps->fntsizestk);
2723 7cf289ca 2004-04-06 devnull setcurfont(ps);
2724 7cf289ca 2004-04-06 devnull }
2725 7cf289ca 2004-04-06 devnull
2726 7cf289ca 2004-04-06 devnull static void
2727 7cf289ca 2004-04-06 devnull pushfontsize(Pstate* ps, int sz)
2728 7cf289ca 2004-04-06 devnull {
2729 7cf289ca 2004-04-06 devnull push(&ps->fntsizestk, sz);
2730 7cf289ca 2004-04-06 devnull setcurfont(ps);
2731 7cf289ca 2004-04-06 devnull }
2732 7cf289ca 2004-04-06 devnull
2733 7cf289ca 2004-04-06 devnull static void
2734 7cf289ca 2004-04-06 devnull setcurfont(Pstate* ps)
2735 7cf289ca 2004-04-06 devnull {
2736 7cf289ca 2004-04-06 devnull int sty;
2737 7cf289ca 2004-04-06 devnull int sz;
2738 7cf289ca 2004-04-06 devnull
2739 7cf289ca 2004-04-06 devnull sty = top(&ps->fntstylestk, FntR);
2740 7cf289ca 2004-04-06 devnull sz = top(&ps->fntsizestk, Normal);
2741 7cf289ca 2004-04-06 devnull if(sz < Tiny)
2742 7cf289ca 2004-04-06 devnull sz = Tiny;
2743 7cf289ca 2004-04-06 devnull if(sz > Verylarge)
2744 7cf289ca 2004-04-06 devnull sz = Verylarge;
2745 7cf289ca 2004-04-06 devnull ps->curfont = sty*NumSize + sz;
2746 7cf289ca 2004-04-06 devnull }
2747 7cf289ca 2004-04-06 devnull
2748 7cf289ca 2004-04-06 devnull static void
2749 7cf289ca 2004-04-06 devnull popjust(Pstate* ps)
2750 7cf289ca 2004-04-06 devnull {
2751 7cf289ca 2004-04-06 devnull pop(&ps->juststk);
2752 7cf289ca 2004-04-06 devnull setcurjust(ps);
2753 7cf289ca 2004-04-06 devnull }
2754 7cf289ca 2004-04-06 devnull
2755 7cf289ca 2004-04-06 devnull static void
2756 7cf289ca 2004-04-06 devnull pushjust(Pstate* ps, int j)
2757 7cf289ca 2004-04-06 devnull {
2758 7cf289ca 2004-04-06 devnull push(&ps->juststk, j);
2759 7cf289ca 2004-04-06 devnull setcurjust(ps);
2760 7cf289ca 2004-04-06 devnull }
2761 7cf289ca 2004-04-06 devnull
2762 7cf289ca 2004-04-06 devnull static void
2763 7cf289ca 2004-04-06 devnull setcurjust(Pstate* ps)
2764 7cf289ca 2004-04-06 devnull {
2765 7cf289ca 2004-04-06 devnull int j;
2766 7cf289ca 2004-04-06 devnull int state;
2767 7cf289ca 2004-04-06 devnull
2768 7cf289ca 2004-04-06 devnull j = top(&ps->juststk, ALleft);
2769 7cf289ca 2004-04-06 devnull if(j != ps->curjust) {
2770 7cf289ca 2004-04-06 devnull ps->curjust = j;
2771 7cf289ca 2004-04-06 devnull state = ps->curstate;
2772 7cf289ca 2004-04-06 devnull state &= ~(IFrjust|IFcjust);
2773 7cf289ca 2004-04-06 devnull if(j == ALcenter)
2774 7cf289ca 2004-04-06 devnull state |= IFcjust;
2775 7cf289ca 2004-04-06 devnull else if(j == ALright)
2776 7cf289ca 2004-04-06 devnull state |= IFrjust;
2777 7cf289ca 2004-04-06 devnull ps->curstate = state;
2778 7cf289ca 2004-04-06 devnull }
2779 7cf289ca 2004-04-06 devnull }
2780 7cf289ca 2004-04-06 devnull
2781 cbeb0b26 2006-04-01 devnull /* Do final rearrangement after table parsing is finished */
2782 cbeb0b26 2006-04-01 devnull /* and assign cells to grid points */
2783 7cf289ca 2004-04-06 devnull static void
2784 7cf289ca 2004-04-06 devnull finish_table(Table* t)
2785 7cf289ca 2004-04-06 devnull {
2786 7cf289ca 2004-04-06 devnull int ncol;
2787 7cf289ca 2004-04-06 devnull int nrow;
2788 7cf289ca 2004-04-06 devnull int r;
2789 7cf289ca 2004-04-06 devnull Tablerow* rl;
2790 7cf289ca 2004-04-06 devnull Tablecell* cl;
2791 7cf289ca 2004-04-06 devnull int* rowspancnt;
2792 7cf289ca 2004-04-06 devnull Tablecell** rowspancell;
2793 7cf289ca 2004-04-06 devnull int ri;
2794 7cf289ca 2004-04-06 devnull int ci;
2795 7cf289ca 2004-04-06 devnull Tablecell* c;
2796 7cf289ca 2004-04-06 devnull Tablecell* cnext;
2797 7cf289ca 2004-04-06 devnull Tablerow* row;
2798 7cf289ca 2004-04-06 devnull Tablerow* rownext;
2799 7cf289ca 2004-04-06 devnull int rcols;
2800 7cf289ca 2004-04-06 devnull int newncol;
2801 7cf289ca 2004-04-06 devnull int k;
2802 7cf289ca 2004-04-06 devnull int j;
2803 7cf289ca 2004-04-06 devnull int cspan;
2804 7cf289ca 2004-04-06 devnull int rspan;
2805 7cf289ca 2004-04-06 devnull int i;
2806 7cf289ca 2004-04-06 devnull
2807 7cf289ca 2004-04-06 devnull rl = t->rows;
2808 7cf289ca 2004-04-06 devnull t->nrow = nrow = _listlen((List*)rl);
2809 7cf289ca 2004-04-06 devnull t->rows = (Tablerow*)emalloc(nrow * sizeof(Tablerow));
2810 7cf289ca 2004-04-06 devnull ncol = 0;
2811 7cf289ca 2004-04-06 devnull r = nrow - 1;
2812 7cf289ca 2004-04-06 devnull for(row = rl; row != nil; row = rownext) {
2813 cbeb0b26 2006-04-01 devnull /* copy the data from the allocated Tablerow into the array slot */
2814 7cf289ca 2004-04-06 devnull t->rows[r] = *row;
2815 7cf289ca 2004-04-06 devnull rownext = row->next;
2816 7cf289ca 2004-04-06 devnull row = &t->rows[r];
2817 7cf289ca 2004-04-06 devnull r--;
2818 7cf289ca 2004-04-06 devnull rcols = 0;
2819 7cf289ca 2004-04-06 devnull c = row->cells;
2820 7cf289ca 2004-04-06 devnull
2821 cbeb0b26 2006-04-01 devnull /* If rowspan is > 1 but this is the last row, */
2822 cbeb0b26 2006-04-01 devnull /* reset the rowspan */
2823 7cf289ca 2004-04-06 devnull if(c != nil && c->rowspan > 1 && r == nrow-2)
2824 7cf289ca 2004-04-06 devnull c->rowspan = 1;
2825 7cf289ca 2004-04-06 devnull
2826 cbeb0b26 2006-04-01 devnull /* reverse row->cells list (along nextinrow pointers) */
2827 7cf289ca 2004-04-06 devnull row->cells = nil;
2828 7cf289ca 2004-04-06 devnull while(c != nil) {
2829 7cf289ca 2004-04-06 devnull cnext = c->nextinrow;
2830 7cf289ca 2004-04-06 devnull c->nextinrow = row->cells;
2831 7cf289ca 2004-04-06 devnull row->cells = c;
2832 7cf289ca 2004-04-06 devnull rcols += c->colspan;
2833 7cf289ca 2004-04-06 devnull c = cnext;
2834 7cf289ca 2004-04-06 devnull }
2835 7cf289ca 2004-04-06 devnull if(rcols > ncol)
2836 7cf289ca 2004-04-06 devnull ncol = rcols;
2837 7cf289ca 2004-04-06 devnull }
2838 7cf289ca 2004-04-06 devnull t->ncol = ncol;
2839 7cf289ca 2004-04-06 devnull t->cols = (Tablecol*)emalloc(ncol * sizeof(Tablecol));
2840 7cf289ca 2004-04-06 devnull
2841 cbeb0b26 2006-04-01 devnull /* Reverse cells just so they are drawn in source order. */
2842 cbeb0b26 2006-04-01 devnull /* Also, trim their contents so they don't end in whitespace. */
2843 7cf289ca 2004-04-06 devnull t->cells = (Tablecell*)_revlist((List*)t->cells);
2844 7cf289ca 2004-04-06 devnull for(c = t->cells; c != nil; c= c->next)
2845 7cf289ca 2004-04-06 devnull trim_cell(c);
2846 7cf289ca 2004-04-06 devnull t->grid = (Tablecell***)emalloc(nrow * sizeof(Tablecell**));
2847 7cf289ca 2004-04-06 devnull for(i = 0; i < nrow; i++)
2848 7cf289ca 2004-04-06 devnull t->grid[i] = (Tablecell**)emalloc(ncol * sizeof(Tablecell*));
2849 7cf289ca 2004-04-06 devnull
2850 cbeb0b26 2006-04-01 devnull /* The following arrays keep track of cells that are spanning */
2851 cbeb0b26 2006-04-01 devnull /* multiple rows; rowspancnt[i] is the number of rows left */
2852 cbeb0b26 2006-04-01 devnull /* to be spanned in column i. */
2853 cbeb0b26 2006-04-01 devnull /* When done, cell's (row,col) is upper left grid point. */
2854 7cf289ca 2004-04-06 devnull rowspancnt = (int*)emalloc(ncol * sizeof(int));
2855 7cf289ca 2004-04-06 devnull rowspancell = (Tablecell**)emalloc(ncol * sizeof(Tablecell*));
2856 7cf289ca 2004-04-06 devnull for(ri = 0; ri < nrow; ri++) {
2857 7cf289ca 2004-04-06 devnull row = &t->rows[ri];
2858 7cf289ca 2004-04-06 devnull cl = row->cells;
2859 7cf289ca 2004-04-06 devnull ci = 0;
2860 7cf289ca 2004-04-06 devnull while(ci < ncol || cl != nil) {
2861 7cf289ca 2004-04-06 devnull if(ci < ncol && rowspancnt[ci] > 0) {
2862 7cf289ca 2004-04-06 devnull t->grid[ri][ci] = rowspancell[ci];
2863 7cf289ca 2004-04-06 devnull rowspancnt[ci]--;
2864 7cf289ca 2004-04-06 devnull ci++;
2865 7cf289ca 2004-04-06 devnull }
2866 7cf289ca 2004-04-06 devnull else {
2867 7cf289ca 2004-04-06 devnull if(cl == nil) {
2868 7cf289ca 2004-04-06 devnull ci++;
2869 7cf289ca 2004-04-06 devnull continue;
2870 7cf289ca 2004-04-06 devnull }
2871 7cf289ca 2004-04-06 devnull c = cl;
2872 7cf289ca 2004-04-06 devnull cl = cl->nextinrow;
2873 7cf289ca 2004-04-06 devnull cspan = c->colspan;
2874 7cf289ca 2004-04-06 devnull rspan = c->rowspan;
2875 7cf289ca 2004-04-06 devnull if(ci + cspan > ncol) {
2876 cbeb0b26 2006-04-01 devnull /* because of row spanning, we calculated */
2877 cbeb0b26 2006-04-01 devnull /* ncol incorrectly; adjust it */
2878 7cf289ca 2004-04-06 devnull newncol = ci + cspan;
2879 7cf289ca 2004-04-06 devnull t->cols = (Tablecol*)erealloc(t->cols, newncol * sizeof(Tablecol));
2880 7cf289ca 2004-04-06 devnull rowspancnt = (int*)erealloc(rowspancnt, newncol * sizeof(int));
2881 7cf289ca 2004-04-06 devnull rowspancell = (Tablecell**)erealloc(rowspancell, newncol * sizeof(Tablecell*));
2882 7cf289ca 2004-04-06 devnull k = newncol-ncol;
2883 7cf289ca 2004-04-06 devnull memset(t->cols+ncol, 0, k*sizeof(Tablecol));
2884 7cf289ca 2004-04-06 devnull memset(rowspancnt+ncol, 0, k*sizeof(int));
2885 7cf289ca 2004-04-06 devnull memset(rowspancell+ncol, 0, k*sizeof(Tablecell*));
2886 7cf289ca 2004-04-06 devnull for(j = 0; j < nrow; j++) {
2887 7cf289ca 2004-04-06 devnull t->grid[j] = (Tablecell**)erealloc(t->grid[j], newncol * sizeof(Tablecell*));
2888 7cf289ca 2004-04-06 devnull memset(t->grid[j], 0, k*sizeof(Tablecell*));
2889 7cf289ca 2004-04-06 devnull }
2890 7cf289ca 2004-04-06 devnull t->ncol = ncol = newncol;
2891 7cf289ca 2004-04-06 devnull }
2892 7cf289ca 2004-04-06 devnull c->row = ri;
2893 7cf289ca 2004-04-06 devnull c->col = ci;
2894 7cf289ca 2004-04-06 devnull for(i = 0; i < cspan; i++) {
2895 7cf289ca 2004-04-06 devnull t->grid[ri][ci] = c;
2896 7cf289ca 2004-04-06 devnull if(rspan > 1) {
2897 7cf289ca 2004-04-06 devnull rowspancnt[ci] = rspan - 1;
2898 7cf289ca 2004-04-06 devnull rowspancell[ci] = c;
2899 7cf289ca 2004-04-06 devnull }
2900 7cf289ca 2004-04-06 devnull ci++;
2901 7cf289ca 2004-04-06 devnull }
2902 7cf289ca 2004-04-06 devnull }
2903 7cf289ca 2004-04-06 devnull }
2904 7cf289ca 2004-04-06 devnull }
2905 7cf289ca 2004-04-06 devnull }
2906 7cf289ca 2004-04-06 devnull
2907 cbeb0b26 2006-04-01 devnull /* Remove tail of cell content until it isn't whitespace. */
2908 7cf289ca 2004-04-06 devnull static void
2909 7cf289ca 2004-04-06 devnull trim_cell(Tablecell* c)
2910 7cf289ca 2004-04-06 devnull {
2911 7cf289ca 2004-04-06 devnull int dropping;
2912 7cf289ca 2004-04-06 devnull Rune* s;
2913 7cf289ca 2004-04-06 devnull Rune* x;
2914 7cf289ca 2004-04-06 devnull Rune* y;
2915 7cf289ca 2004-04-06 devnull int nx;
2916 7cf289ca 2004-04-06 devnull int ny;
2917 7cf289ca 2004-04-06 devnull Item* p;
2918 7cf289ca 2004-04-06 devnull Itext* q;
2919 7cf289ca 2004-04-06 devnull Item* pprev;
2920 7cf289ca 2004-04-06 devnull
2921 7cf289ca 2004-04-06 devnull dropping = 1;
2922 7cf289ca 2004-04-06 devnull while(c->content != nil && dropping) {
2923 7cf289ca 2004-04-06 devnull p = c->content;
2924 7cf289ca 2004-04-06 devnull pprev = nil;
2925 7cf289ca 2004-04-06 devnull while(p->next != nil) {
2926 7cf289ca 2004-04-06 devnull pprev = p;
2927 7cf289ca 2004-04-06 devnull p = p->next;
2928 7cf289ca 2004-04-06 devnull }
2929 7cf289ca 2004-04-06 devnull dropping = 0;
2930 7cf289ca 2004-04-06 devnull if(!(p->state&IFnobrk)) {
2931 7cf289ca 2004-04-06 devnull if(p->tag == Itexttag) {
2932 7cf289ca 2004-04-06 devnull q = (Itext*)p;
2933 7cf289ca 2004-04-06 devnull s = q->s;
2934 7cf289ca 2004-04-06 devnull _splitr(s, _Strlen(s), notwhitespace, &x, &nx, &y, &ny);
2935 7cf289ca 2004-04-06 devnull if(nx != 0 && ny != 0) {
2936 7cf289ca 2004-04-06 devnull q->s = _Strndup(x, nx);
2937 7cf289ca 2004-04-06 devnull free(s);
2938 7cf289ca 2004-04-06 devnull }
2939 7cf289ca 2004-04-06 devnull break;
2940 7cf289ca 2004-04-06 devnull }
2941 7cf289ca 2004-04-06 devnull }
2942 7cf289ca 2004-04-06 devnull if(dropping) {
2943 7cf289ca 2004-04-06 devnull if(pprev == nil)
2944 7cf289ca 2004-04-06 devnull c->content = nil;
2945 7cf289ca 2004-04-06 devnull else
2946 7cf289ca 2004-04-06 devnull pprev->next = nil;
2947 7cf289ca 2004-04-06 devnull freeitem(p);
2948 7cf289ca 2004-04-06 devnull }
2949 7cf289ca 2004-04-06 devnull }
2950 7cf289ca 2004-04-06 devnull }
2951 7cf289ca 2004-04-06 devnull
2952 cbeb0b26 2006-04-01 devnull /* Caller must free answer (eventually). */
2953 7cf289ca 2004-04-06 devnull static Rune*
2954 7cf289ca 2004-04-06 devnull listmark(uchar ty, int n)
2955 7cf289ca 2004-04-06 devnull {
2956 7cf289ca 2004-04-06 devnull Rune* s;
2957 7cf289ca 2004-04-06 devnull Rune* t;
2958 7cf289ca 2004-04-06 devnull int n2;
2959 7cf289ca 2004-04-06 devnull int i;
2960 7cf289ca 2004-04-06 devnull
2961 7cf289ca 2004-04-06 devnull s = nil;
2962 7cf289ca 2004-04-06 devnull switch(ty) {
2963 7cf289ca 2004-04-06 devnull case LTdisc:
2964 7cf289ca 2004-04-06 devnull case LTsquare:
2965 7cf289ca 2004-04-06 devnull case LTcircle:
2966 7cf289ca 2004-04-06 devnull s = _newstr(1);
2967 cbeb0b26 2006-04-01 devnull s[0] = (ty == LTdisc)? 0x2022 /* bullet */
2968 cbeb0b26 2006-04-01 devnull : ((ty == LTsquare)? 0x220e /* filled square */
2969 cbeb0b26 2006-04-01 devnull : 0x2218); /* degree */
2970 7cf289ca 2004-04-06 devnull s[1] = 0;
2971 7cf289ca 2004-04-06 devnull break;
2972 7cf289ca 2004-04-06 devnull
2973 7cf289ca 2004-04-06 devnull case LT1:
2974 7cf289ca 2004-04-06 devnull t = _ltoStr(n);
2975 7cf289ca 2004-04-06 devnull n2 = _Strlen(t);
2976 7cf289ca 2004-04-06 devnull s = _newstr(n2+1);
2977 7cf289ca 2004-04-06 devnull t = _Stradd(s, t, n2);
2978 7cf289ca 2004-04-06 devnull *t++ = '.';
2979 7cf289ca 2004-04-06 devnull *t = 0;
2980 7cf289ca 2004-04-06 devnull break;
2981 7cf289ca 2004-04-06 devnull
2982 7cf289ca 2004-04-06 devnull case LTa:
2983 7cf289ca 2004-04-06 devnull case LTA:
2984 7cf289ca 2004-04-06 devnull n--;
2985 7cf289ca 2004-04-06 devnull i = 0;
2986 7cf289ca 2004-04-06 devnull if(n < 0)
2987 7cf289ca 2004-04-06 devnull n = 0;
2988 7cf289ca 2004-04-06 devnull s = _newstr((n <= 25)? 2 : 3);
2989 7cf289ca 2004-04-06 devnull if(n > 25) {
2990 7cf289ca 2004-04-06 devnull n2 = n%26;
2991 7cf289ca 2004-04-06 devnull n /= 26;
2992 7cf289ca 2004-04-06 devnull if(n2 > 25)
2993 7cf289ca 2004-04-06 devnull n2 = 25;
2994 7cf289ca 2004-04-06 devnull s[i++] = n2 + (ty == LTa)? 'a' : 'A';
2995 7cf289ca 2004-04-06 devnull }
2996 7cf289ca 2004-04-06 devnull s[i++] = n + (ty == LTa)? 'a' : 'A';
2997 7cf289ca 2004-04-06 devnull s[i++] = '.';
2998 7cf289ca 2004-04-06 devnull s[i] = 0;
2999 7cf289ca 2004-04-06 devnull break;
3000 7cf289ca 2004-04-06 devnull
3001 7cf289ca 2004-04-06 devnull case LTi:
3002 7cf289ca 2004-04-06 devnull case LTI:
3003 7cf289ca 2004-04-06 devnull if(n >= NROMAN) {
3004 7cf289ca 2004-04-06 devnull if(warn)
3005 7cf289ca 2004-04-06 devnull fprint(2, "warning: unimplemented roman number > %d\n", NROMAN);
3006 7cf289ca 2004-04-06 devnull n = NROMAN;
3007 7cf289ca 2004-04-06 devnull }
3008 7cf289ca 2004-04-06 devnull t = roman[n - 1];
3009 7cf289ca 2004-04-06 devnull n2 = _Strlen(t);
3010 7cf289ca 2004-04-06 devnull s = _newstr(n2+1);
3011 7cf289ca 2004-04-06 devnull for(i = 0; i < n2; i++)
3012 7cf289ca 2004-04-06 devnull s[i] = (ty == LTi)? tolower(t[i]) : t[i];
3013 7cf289ca 2004-04-06 devnull s[i++] = '.';
3014 7cf289ca 2004-04-06 devnull s[i] = 0;
3015 7cf289ca 2004-04-06 devnull break;
3016 7cf289ca 2004-04-06 devnull }
3017 7cf289ca 2004-04-06 devnull return s;
3018 7cf289ca 2004-04-06 devnull }
3019 7cf289ca 2004-04-06 devnull
3020 cbeb0b26 2006-04-01 devnull /* Find map with given name in di.maps. */
3021 cbeb0b26 2006-04-01 devnull /* If not there, add one, copying name. */
3022 cbeb0b26 2006-04-01 devnull /* Ownership of map remains with di->maps list. */
3023 7cf289ca 2004-04-06 devnull static Map*
3024 7cf289ca 2004-04-06 devnull getmap(Docinfo* di, Rune* name)
3025 7cf289ca 2004-04-06 devnull {
3026 7cf289ca 2004-04-06 devnull Map* m;
3027 7cf289ca 2004-04-06 devnull
3028 7cf289ca 2004-04-06 devnull for(m = di->maps; m != nil; m = m->next) {
3029 7cf289ca 2004-04-06 devnull if(!_Strcmp(name, m->name))
3030 7cf289ca 2004-04-06 devnull return m;
3031 7cf289ca 2004-04-06 devnull }
3032 7cf289ca 2004-04-06 devnull m = (Map*)emalloc(sizeof(Map));
3033 7cf289ca 2004-04-06 devnull m->name = _Strdup(name);
3034 7cf289ca 2004-04-06 devnull m->areas = nil;
3035 7cf289ca 2004-04-06 devnull m->next = di->maps;
3036 7cf289ca 2004-04-06 devnull di->maps = m;
3037 7cf289ca 2004-04-06 devnull return m;
3038 7cf289ca 2004-04-06 devnull }
3039 7cf289ca 2004-04-06 devnull
3040 cbeb0b26 2006-04-01 devnull /* Transfers ownership of href to Area */
3041 7cf289ca 2004-04-06 devnull static Area*
3042 7cf289ca 2004-04-06 devnull newarea(int shape, Rune* href, int target, Area* link)
3043 7cf289ca 2004-04-06 devnull {
3044 7cf289ca 2004-04-06 devnull Area* a;
3045 7cf289ca 2004-04-06 devnull
3046 7cf289ca 2004-04-06 devnull a = (Area*)emalloc(sizeof(Area));
3047 7cf289ca 2004-04-06 devnull a->shape = shape;
3048 7cf289ca 2004-04-06 devnull a->href = href;
3049 7cf289ca 2004-04-06 devnull a->target = target;
3050 7cf289ca 2004-04-06 devnull a->next = link;
3051 7cf289ca 2004-04-06 devnull return a;
3052 7cf289ca 2004-04-06 devnull }
3053 7cf289ca 2004-04-06 devnull
3054 cbeb0b26 2006-04-01 devnull /* Return string value associated with attid in tok, nil if none. */
3055 cbeb0b26 2006-04-01 devnull /* Caller must free the result (eventually). */
3056 7cf289ca 2004-04-06 devnull static Rune*
3057 7cf289ca 2004-04-06 devnull aval(Token* tok, int attid)
3058 7cf289ca 2004-04-06 devnull {
3059 7cf289ca 2004-04-06 devnull Rune* ans;
3060 7cf289ca 2004-04-06 devnull
3061 cbeb0b26 2006-04-01 devnull _tokaval(tok, attid, &ans, 1); /* transfers string ownership from token to ans */
3062 7cf289ca 2004-04-06 devnull return ans;
3063 7cf289ca 2004-04-06 devnull }
3064 7cf289ca 2004-04-06 devnull
3065 cbeb0b26 2006-04-01 devnull /* Like aval, but use dflt if there was no such attribute in tok. */
3066 cbeb0b26 2006-04-01 devnull /* Caller must free the result (eventually). */
3067 7cf289ca 2004-04-06 devnull static Rune*
3068 7cf289ca 2004-04-06 devnull astrval(Token* tok, int attid, Rune* dflt)
3069 7cf289ca 2004-04-06 devnull {
3070 7cf289ca 2004-04-06 devnull Rune* ans;
3071 7cf289ca 2004-04-06 devnull
3072 7cf289ca 2004-04-06 devnull if(_tokaval(tok, attid, &ans, 1))
3073 cbeb0b26 2006-04-01 devnull return ans; /* transfers string ownership from token to ans */
3074 7cf289ca 2004-04-06 devnull else
3075 7cf289ca 2004-04-06 devnull return _Strdup(dflt);
3076 7cf289ca 2004-04-06 devnull }
3077 7cf289ca 2004-04-06 devnull
3078 cbeb0b26 2006-04-01 devnull /* Here we're supposed to convert to an int, */
3079 cbeb0b26 2006-04-01 devnull /* and have a default when not found */
3080 7cf289ca 2004-04-06 devnull static int
3081 7cf289ca 2004-04-06 devnull aintval(Token* tok, int attid, int dflt)
3082 7cf289ca 2004-04-06 devnull {
3083 7cf289ca 2004-04-06 devnull Rune* ans;
3084 7cf289ca 2004-04-06 devnull
3085 7cf289ca 2004-04-06 devnull if(!_tokaval(tok, attid, &ans, 0) || ans == nil)
3086 7cf289ca 2004-04-06 devnull return dflt;
3087 7cf289ca 2004-04-06 devnull else
3088 7cf289ca 2004-04-06 devnull return toint(ans);
3089 7cf289ca 2004-04-06 devnull }
3090 7cf289ca 2004-04-06 devnull
3091 cbeb0b26 2006-04-01 devnull /* Like aintval, but result should be >= 0 */
3092 7cf289ca 2004-04-06 devnull static int
3093 7cf289ca 2004-04-06 devnull auintval(Token* tok, int attid, int dflt)
3094 7cf289ca 2004-04-06 devnull {
3095 7cf289ca 2004-04-06 devnull Rune* ans;
3096 7cf289ca 2004-04-06 devnull int v;
3097 7cf289ca 2004-04-06 devnull
3098 7cf289ca 2004-04-06 devnull if(!_tokaval(tok, attid, &ans, 0) || ans == nil)
3099 7cf289ca 2004-04-06 devnull return dflt;
3100 7cf289ca 2004-04-06 devnull else {
3101 7cf289ca 2004-04-06 devnull v = toint(ans);
3102 7cf289ca 2004-04-06 devnull return v >= 0? v : 0;
3103 7cf289ca 2004-04-06 devnull }
3104 7cf289ca 2004-04-06 devnull }
3105 7cf289ca 2004-04-06 devnull
3106 cbeb0b26 2006-04-01 devnull /* int conversion, but with possible error check (if warning) */
3107 7cf289ca 2004-04-06 devnull static int
3108 7cf289ca 2004-04-06 devnull toint(Rune* s)
3109 7cf289ca 2004-04-06 devnull {
3110 7cf289ca 2004-04-06 devnull int ans;
3111 7cf289ca 2004-04-06 devnull Rune* eptr;
3112 7cf289ca 2004-04-06 devnull
3113 7cf289ca 2004-04-06 devnull ans = _Strtol(s, &eptr, 10);
3114 7cf289ca 2004-04-06 devnull if(warn) {
3115 7cf289ca 2004-04-06 devnull if(*eptr != 0) {
3116 7cf289ca 2004-04-06 devnull eptr = _Strclass(eptr, notwhitespace);
3117 7cf289ca 2004-04-06 devnull if(eptr != nil)
3118 7cf289ca 2004-04-06 devnull fprint(2, "warning: expected integer, got %S\n", s);
3119 7cf289ca 2004-04-06 devnull }
3120 7cf289ca 2004-04-06 devnull }
3121 7cf289ca 2004-04-06 devnull return ans;
3122 7cf289ca 2004-04-06 devnull }
3123 7cf289ca 2004-04-06 devnull
3124 cbeb0b26 2006-04-01 devnull /* Attribute value when need a table to convert strings to ints */
3125 7cf289ca 2004-04-06 devnull static int
3126 7cf289ca 2004-04-06 devnull atabval(Token* tok, int attid, StringInt* tab, int ntab, int dflt)
3127 7cf289ca 2004-04-06 devnull {
3128 7cf289ca 2004-04-06 devnull Rune* aval;
3129 7cf289ca 2004-04-06 devnull int ans;
3130 7cf289ca 2004-04-06 devnull
3131 7cf289ca 2004-04-06 devnull ans = dflt;
3132 7cf289ca 2004-04-06 devnull if(_tokaval(tok, attid, &aval, 0)) {
3133 7cf289ca 2004-04-06 devnull if(!_lookup(tab, ntab, aval, _Strlen(aval), &ans)) {
3134 7cf289ca 2004-04-06 devnull ans = dflt;
3135 7cf289ca 2004-04-06 devnull if(warn)
3136 7cf289ca 2004-04-06 devnull fprint(2, "warning: name not found in table lookup: %S\n", aval);
3137 7cf289ca 2004-04-06 devnull }
3138 7cf289ca 2004-04-06 devnull }
3139 7cf289ca 2004-04-06 devnull return ans;
3140 7cf289ca 2004-04-06 devnull }
3141 7cf289ca 2004-04-06 devnull
3142 cbeb0b26 2006-04-01 devnull /* Attribute value when supposed to be a color */
3143 7cf289ca 2004-04-06 devnull static int
3144 7cf289ca 2004-04-06 devnull acolorval(Token* tok, int attid, int dflt)
3145 7cf289ca 2004-04-06 devnull {
3146 7cf289ca 2004-04-06 devnull Rune* aval;
3147 7cf289ca 2004-04-06 devnull int ans;
3148 7cf289ca 2004-04-06 devnull
3149 7cf289ca 2004-04-06 devnull ans = dflt;
3150 7cf289ca 2004-04-06 devnull if(_tokaval(tok, attid, &aval, 0))
3151 7cf289ca 2004-04-06 devnull ans = color(aval, dflt);
3152 7cf289ca 2004-04-06 devnull return ans;
3153 7cf289ca 2004-04-06 devnull }
3154 7cf289ca 2004-04-06 devnull
3155 cbeb0b26 2006-04-01 devnull /* Attribute value when supposed to be a target frame name */
3156 7cf289ca 2004-04-06 devnull static int
3157 7cf289ca 2004-04-06 devnull atargval(Token* tok, int dflt)
3158 7cf289ca 2004-04-06 devnull {
3159 7cf289ca 2004-04-06 devnull int ans;
3160 7cf289ca 2004-04-06 devnull Rune* aval;
3161 7cf289ca 2004-04-06 devnull
3162 7cf289ca 2004-04-06 devnull ans = dflt;
3163 7cf289ca 2004-04-06 devnull if(_tokaval(tok, Atarget, &aval, 0)){
3164 7cf289ca 2004-04-06 devnull ans = targetid(aval);
3165 7cf289ca 2004-04-06 devnull }
3166 7cf289ca 2004-04-06 devnull return ans;
3167 7cf289ca 2004-04-06 devnull }
3168 7cf289ca 2004-04-06 devnull
3169 cbeb0b26 2006-04-01 devnull /* special for list types, where "i" and "I" are different, */
3170 cbeb0b26 2006-04-01 devnull /* but "square" and "SQUARE" are the same */
3171 7cf289ca 2004-04-06 devnull static int
3172 7cf289ca 2004-04-06 devnull listtyval(Token* tok, int dflt)
3173 7cf289ca 2004-04-06 devnull {
3174 7cf289ca 2004-04-06 devnull Rune* aval;
3175 7cf289ca 2004-04-06 devnull int ans;
3176 7cf289ca 2004-04-06 devnull int n;
3177 7cf289ca 2004-04-06 devnull
3178 7cf289ca 2004-04-06 devnull ans = dflt;
3179 7cf289ca 2004-04-06 devnull if(_tokaval(tok, Atype, &aval, 0)) {
3180 7cf289ca 2004-04-06 devnull n = _Strlen(aval);
3181 7cf289ca 2004-04-06 devnull if(n == 1) {
3182 7cf289ca 2004-04-06 devnull switch(aval[0]) {
3183 7cf289ca 2004-04-06 devnull case '1':
3184 7cf289ca 2004-04-06 devnull ans = LT1;
3185 7cf289ca 2004-04-06 devnull break;
3186 7cf289ca 2004-04-06 devnull case 'A':
3187 7cf289ca 2004-04-06 devnull ans = LTA;
3188 7cf289ca 2004-04-06 devnull break;
3189 7cf289ca 2004-04-06 devnull case 'I':
3190 7cf289ca 2004-04-06 devnull ans = LTI;
3191 7cf289ca 2004-04-06 devnull break;
3192 7cf289ca 2004-04-06 devnull case 'a':
3193 7cf289ca 2004-04-06 devnull ans = LTa;
3194 7cf289ca 2004-04-06 devnull break;
3195 7cf289ca 2004-04-06 devnull case 'i':
3196 7cf289ca 2004-04-06 devnull ans = LTi;
3197 7cf289ca 2004-04-06 devnull default:
3198 7cf289ca 2004-04-06 devnull if(warn)
3199 7cf289ca 2004-04-06 devnull fprint(2, "warning: unknown list element type %c\n", aval[0]);
3200 7cf289ca 2004-04-06 devnull }
3201 7cf289ca 2004-04-06 devnull }
3202 7cf289ca 2004-04-06 devnull else {
3203 7cf289ca 2004-04-06 devnull if(!_Strncmpci(aval, n, L(Lcircle)))
3204 7cf289ca 2004-04-06 devnull ans = LTcircle;
3205 7cf289ca 2004-04-06 devnull else if(!_Strncmpci(aval, n, L(Ldisc)))
3206 7cf289ca 2004-04-06 devnull ans = LTdisc;
3207 7cf289ca 2004-04-06 devnull else if(!_Strncmpci(aval, n, L(Lsquare)))
3208 7cf289ca 2004-04-06 devnull ans = LTsquare;
3209 7cf289ca 2004-04-06 devnull else {
3210 7cf289ca 2004-04-06 devnull if(warn)
3211 7cf289ca 2004-04-06 devnull fprint(2, "warning: unknown list element type %S\n", aval);
3212 7cf289ca 2004-04-06 devnull }
3213 7cf289ca 2004-04-06 devnull }
3214 7cf289ca 2004-04-06 devnull }
3215 7cf289ca 2004-04-06 devnull return ans;
3216 7cf289ca 2004-04-06 devnull }
3217 7cf289ca 2004-04-06 devnull
3218 cbeb0b26 2006-04-01 devnull /* Attribute value when value is a URL, possibly relative to base. */
3219 cbeb0b26 2006-04-01 devnull /* FOR NOW: leave the url relative. */
3220 cbeb0b26 2006-04-01 devnull /* Caller must free the result (eventually). */
3221 7cf289ca 2004-04-06 devnull static Rune*
3222 7cf289ca 2004-04-06 devnull aurlval(Token* tok, int attid, Rune* dflt, Rune* base)
3223 7cf289ca 2004-04-06 devnull {
3224 7cf289ca 2004-04-06 devnull Rune* ans;
3225 7cf289ca 2004-04-06 devnull Rune* url;
3226 7cf289ca 2004-04-06 devnull
3227 7cf289ca 2004-04-06 devnull USED(base);
3228 7cf289ca 2004-04-06 devnull ans = nil;
3229 7cf289ca 2004-04-06 devnull if(_tokaval(tok, attid, &url, 0) && url != nil)
3230 7cf289ca 2004-04-06 devnull ans = removeallwhite(url);
3231 7cf289ca 2004-04-06 devnull if(ans == nil)
3232 7cf289ca 2004-04-06 devnull ans = _Strdup(dflt);
3233 7cf289ca 2004-04-06 devnull return ans;
3234 7cf289ca 2004-04-06 devnull }
3235 7cf289ca 2004-04-06 devnull
3236 cbeb0b26 2006-04-01 devnull /* Return copy of s but with all whitespace (even internal) removed. */
3237 cbeb0b26 2006-04-01 devnull /* This fixes some buggy URL specification strings. */
3238 7cf289ca 2004-04-06 devnull static Rune*
3239 7cf289ca 2004-04-06 devnull removeallwhite(Rune* s)
3240 7cf289ca 2004-04-06 devnull {
3241 7cf289ca 2004-04-06 devnull int j;
3242 7cf289ca 2004-04-06 devnull int n;
3243 7cf289ca 2004-04-06 devnull int i;
3244 7cf289ca 2004-04-06 devnull int c;
3245 7cf289ca 2004-04-06 devnull Rune* ans;
3246 7cf289ca 2004-04-06 devnull
3247 7cf289ca 2004-04-06 devnull j = 0;
3248 7cf289ca 2004-04-06 devnull n = _Strlen(s);
3249 7cf289ca 2004-04-06 devnull for(i = 0; i < n; i++) {
3250 7cf289ca 2004-04-06 devnull c = s[i];
3251 7cf289ca 2004-04-06 devnull if(c >= 256 || !isspace(c))
3252 7cf289ca 2004-04-06 devnull j++;
3253 7cf289ca 2004-04-06 devnull }
3254 7cf289ca 2004-04-06 devnull if(j < n) {
3255 7cf289ca 2004-04-06 devnull ans = _newstr(j);
3256 7cf289ca 2004-04-06 devnull j = 0;
3257 7cf289ca 2004-04-06 devnull for(i = 0; i < n; i++) {
3258 7cf289ca 2004-04-06 devnull c = s[i];
3259 7cf289ca 2004-04-06 devnull if(c >= 256 || !isspace(c))
3260 7cf289ca 2004-04-06 devnull ans[j++] = c;
3261 7cf289ca 2004-04-06 devnull }
3262 7cf289ca 2004-04-06 devnull ans[j] = 0;
3263 7cf289ca 2004-04-06 devnull }
3264 7cf289ca 2004-04-06 devnull else
3265 7cf289ca 2004-04-06 devnull ans = _Strdup(s);
3266 7cf289ca 2004-04-06 devnull return ans;
3267 7cf289ca 2004-04-06 devnull }
3268 7cf289ca 2004-04-06 devnull
3269 cbeb0b26 2006-04-01 devnull /* Attribute value when mere presence of attr implies value of 1, */
3270 cbeb0b26 2006-04-01 devnull /* but if there is an integer there, return it as the value. */
3271 7cf289ca 2004-04-06 devnull static int
3272 7cf289ca 2004-04-06 devnull aflagval(Token* tok, int attid)
3273 7cf289ca 2004-04-06 devnull {
3274 7cf289ca 2004-04-06 devnull int val;
3275 7cf289ca 2004-04-06 devnull Rune* sval;
3276 7cf289ca 2004-04-06 devnull
3277 7cf289ca 2004-04-06 devnull val = 0;
3278 7cf289ca 2004-04-06 devnull if(_tokaval(tok, attid, &sval, 0)) {
3279 7cf289ca 2004-04-06 devnull val = 1;
3280 7cf289ca 2004-04-06 devnull if(sval != nil)
3281 7cf289ca 2004-04-06 devnull val = toint(sval);
3282 7cf289ca 2004-04-06 devnull }
3283 7cf289ca 2004-04-06 devnull return val;
3284 7cf289ca 2004-04-06 devnull }
3285 7cf289ca 2004-04-06 devnull
3286 7cf289ca 2004-04-06 devnull static Align
3287 7cf289ca 2004-04-06 devnull makealign(int halign, int valign)
3288 7cf289ca 2004-04-06 devnull {
3289 7cf289ca 2004-04-06 devnull Align al;
3290 7cf289ca 2004-04-06 devnull
3291 7cf289ca 2004-04-06 devnull al.halign = halign;
3292 7cf289ca 2004-04-06 devnull al.valign = valign;
3293 7cf289ca 2004-04-06 devnull return al;
3294 7cf289ca 2004-04-06 devnull }
3295 7cf289ca 2004-04-06 devnull
3296 cbeb0b26 2006-04-01 devnull /* Make an Align (two alignments, horizontal and vertical) */
3297 7cf289ca 2004-04-06 devnull static Align
3298 7cf289ca 2004-04-06 devnull aalign(Token* tok)
3299 7cf289ca 2004-04-06 devnull {
3300 7cf289ca 2004-04-06 devnull return makealign(
3301 7cf289ca 2004-04-06 devnull atabval(tok, Aalign, align_tab, NALIGNTAB, ALnone),
3302 7cf289ca 2004-04-06 devnull atabval(tok, Avalign, align_tab, NALIGNTAB, ALnone));
3303 7cf289ca 2004-04-06 devnull }
3304 7cf289ca 2004-04-06 devnull
3305 cbeb0b26 2006-04-01 devnull /* Make a Dimen, based on value of attid attr */
3306 7cf289ca 2004-04-06 devnull static Dimen
3307 7cf289ca 2004-04-06 devnull adimen(Token* tok, int attid)
3308 7cf289ca 2004-04-06 devnull {
3309 7cf289ca 2004-04-06 devnull Rune* wd;
3310 7cf289ca 2004-04-06 devnull
3311 7cf289ca 2004-04-06 devnull if(_tokaval(tok, attid, &wd, 0))
3312 7cf289ca 2004-04-06 devnull return parsedim(wd, _Strlen(wd));
3313 7cf289ca 2004-04-06 devnull else
3314 7cf289ca 2004-04-06 devnull return makedimen(Dnone, 0);
3315 7cf289ca 2004-04-06 devnull }
3316 7cf289ca 2004-04-06 devnull
3317 cbeb0b26 2006-04-01 devnull /* Parse s[0:n] as num[.[num]][unit][%|*] */
3318 7cf289ca 2004-04-06 devnull static Dimen
3319 7cf289ca 2004-04-06 devnull parsedim(Rune* s, int ns)
3320 7cf289ca 2004-04-06 devnull {
3321 7cf289ca 2004-04-06 devnull int kind;
3322 7cf289ca 2004-04-06 devnull int spec;
3323 7cf289ca 2004-04-06 devnull Rune* l;
3324 7cf289ca 2004-04-06 devnull int nl;
3325 7cf289ca 2004-04-06 devnull Rune* r;
3326 7cf289ca 2004-04-06 devnull int nr;
3327 7cf289ca 2004-04-06 devnull int mul;
3328 7cf289ca 2004-04-06 devnull int i;
3329 7cf289ca 2004-04-06 devnull Rune* f;
3330 7cf289ca 2004-04-06 devnull int nf;
3331 7cf289ca 2004-04-06 devnull int Tkdpi;
3332 7cf289ca 2004-04-06 devnull Rune* units;
3333 7cf289ca 2004-04-06 devnull
3334 7cf289ca 2004-04-06 devnull kind = Dnone;
3335 7cf289ca 2004-04-06 devnull spec = 0;
3336 7cf289ca 2004-04-06 devnull _splitl(s, ns, L(Lnot0to9), &l, &nl, &r, &nr);
3337 7cf289ca 2004-04-06 devnull if(nl != 0) {
3338 7cf289ca 2004-04-06 devnull spec = 1000*_Strtol(l, nil, 10);
3339 7cf289ca 2004-04-06 devnull if(nr > 0 && r[0] == '.') {
3340 7cf289ca 2004-04-06 devnull _splitl(r+1, nr-1, L(Lnot0to9), &f, &nf, &r, &nr);
3341 7cf289ca 2004-04-06 devnull if(nf != 0) {
3342 7cf289ca 2004-04-06 devnull mul = 100;
3343 7cf289ca 2004-04-06 devnull for(i = 0; i < nf; i++) {
3344 7cf289ca 2004-04-06 devnull spec = spec + mul*(f[i]-'0');
3345 7cf289ca 2004-04-06 devnull mul = mul/10;
3346 7cf289ca 2004-04-06 devnull }
3347 7cf289ca 2004-04-06 devnull }
3348 7cf289ca 2004-04-06 devnull }
3349 7cf289ca 2004-04-06 devnull kind = Dpixels;
3350 7cf289ca 2004-04-06 devnull if(nr != 0) {
3351 7cf289ca 2004-04-06 devnull if(nr >= 2) {
3352 7cf289ca 2004-04-06 devnull Tkdpi = 100;
3353 7cf289ca 2004-04-06 devnull units = r;
3354 7cf289ca 2004-04-06 devnull r = r+2;
3355 7cf289ca 2004-04-06 devnull nr -= 2;
3356 7cf289ca 2004-04-06 devnull if(!_Strncmpci(units, 2, L(Lpt)))
3357 7cf289ca 2004-04-06 devnull spec = (spec*Tkdpi)/72;
3358 7cf289ca 2004-04-06 devnull else if(!_Strncmpci(units, 2, L(Lpi)))
3359 7cf289ca 2004-04-06 devnull spec = (spec*12*Tkdpi)/72;
3360 7cf289ca 2004-04-06 devnull else if(!_Strncmpci(units, 2, L(Lin)))
3361 7cf289ca 2004-04-06 devnull spec = spec*Tkdpi;
3362 7cf289ca 2004-04-06 devnull else if(!_Strncmpci(units, 2, L(Lcm)))
3363 7cf289ca 2004-04-06 devnull spec = (spec*100*Tkdpi)/254;
3364 7cf289ca 2004-04-06 devnull else if(!_Strncmpci(units, 2, L(Lmm)))
3365 7cf289ca 2004-04-06 devnull spec = (spec*10*Tkdpi)/254;
3366 7cf289ca 2004-04-06 devnull else if(!_Strncmpci(units, 2, L(Lem)))
3367 7cf289ca 2004-04-06 devnull spec = spec*15;
3368 7cf289ca 2004-04-06 devnull else {
3369 7cf289ca 2004-04-06 devnull if(warn)
3370 7cf289ca 2004-04-06 devnull fprint(2, "warning: unknown units %C%Cs\n", units[0], units[1]);
3371 7cf289ca 2004-04-06 devnull }
3372 7cf289ca 2004-04-06 devnull }
3373 7cf289ca 2004-04-06 devnull if(nr >= 1) {
3374 7cf289ca 2004-04-06 devnull if(r[0] == '%')
3375 7cf289ca 2004-04-06 devnull kind = Dpercent;
3376 7cf289ca 2004-04-06 devnull else if(r[0] == '*')
3377 7cf289ca 2004-04-06 devnull kind = Drelative;
3378 7cf289ca 2004-04-06 devnull }
3379 7cf289ca 2004-04-06 devnull }
3380 7cf289ca 2004-04-06 devnull spec = spec/1000;
3381 7cf289ca 2004-04-06 devnull }
3382 7cf289ca 2004-04-06 devnull else if(nr == 1 && r[0] == '*') {
3383 7cf289ca 2004-04-06 devnull spec = 1;
3384 7cf289ca 2004-04-06 devnull kind = Drelative;
3385 7cf289ca 2004-04-06 devnull }
3386 7cf289ca 2004-04-06 devnull return makedimen(kind, spec);
3387 7cf289ca 2004-04-06 devnull }
3388 7cf289ca 2004-04-06 devnull
3389 7cf289ca 2004-04-06 devnull static void
3390 7cf289ca 2004-04-06 devnull setdimarray(Token* tok, int attid, Dimen** pans, int* panslen)
3391 7cf289ca 2004-04-06 devnull {
3392 7cf289ca 2004-04-06 devnull Rune* s;
3393 7cf289ca 2004-04-06 devnull Dimen* d;
3394 7cf289ca 2004-04-06 devnull int k;
3395 7cf289ca 2004-04-06 devnull int nc;
3396 7cf289ca 2004-04-06 devnull Rune* a[SMALLBUFSIZE];
3397 7cf289ca 2004-04-06 devnull int an[SMALLBUFSIZE];
3398 7cf289ca 2004-04-06 devnull
3399 7cf289ca 2004-04-06 devnull if(_tokaval(tok, attid, &s, 0)) {
3400 7cf289ca 2004-04-06 devnull nc = _splitall(s, _Strlen(s), L(Lcommaspace), a, an, SMALLBUFSIZE);
3401 7cf289ca 2004-04-06 devnull if(nc > 0) {
3402 7cf289ca 2004-04-06 devnull d = (Dimen*)emalloc(nc * sizeof(Dimen));
3403 7cf289ca 2004-04-06 devnull for(k = 0; k < nc; k++) {
3404 7cf289ca 2004-04-06 devnull d[k] = parsedim(a[k], an[k]);
3405 7cf289ca 2004-04-06 devnull }
3406 7cf289ca 2004-04-06 devnull *pans = d;
3407 7cf289ca 2004-04-06 devnull *panslen = nc;
3408 7cf289ca 2004-04-06 devnull return;
3409 7cf289ca 2004-04-06 devnull }
3410 7cf289ca 2004-04-06 devnull }
3411 7cf289ca 2004-04-06 devnull *pans = nil;
3412 7cf289ca 2004-04-06 devnull *panslen = 0;
3413 7cf289ca 2004-04-06 devnull }
3414 7cf289ca 2004-04-06 devnull
3415 7cf289ca 2004-04-06 devnull static Background
3416 7cf289ca 2004-04-06 devnull makebackground(Rune* imageurl, int color)
3417 7cf289ca 2004-04-06 devnull {
3418 7cf289ca 2004-04-06 devnull Background bg;
3419 7cf289ca 2004-04-06 devnull
3420 7cf289ca 2004-04-06 devnull bg.image = imageurl;
3421 7cf289ca 2004-04-06 devnull bg.color = color;
3422 7cf289ca 2004-04-06 devnull return bg;
3423 7cf289ca 2004-04-06 devnull }
3424 7cf289ca 2004-04-06 devnull
3425 7cf289ca 2004-04-06 devnull static Item*
3426 7cf289ca 2004-04-06 devnull newitext(Rune* s, int fnt, int fg, int voff, int ul)
3427 7cf289ca 2004-04-06 devnull {
3428 7cf289ca 2004-04-06 devnull Itext* t;
3429 7cf289ca 2004-04-06 devnull
3430 7cf289ca 2004-04-06 devnull assert(s != nil);
3431 7cf289ca 2004-04-06 devnull t = (Itext*)emalloc(sizeof(Itext));
3432 7cf289ca 2004-04-06 devnull t->item.tag = Itexttag;
3433 7cf289ca 2004-04-06 devnull t->s = s;
3434 7cf289ca 2004-04-06 devnull t->fnt = fnt;
3435 7cf289ca 2004-04-06 devnull t->fg = fg;
3436 7cf289ca 2004-04-06 devnull t->voff = voff;
3437 7cf289ca 2004-04-06 devnull t->ul = ul;
3438 7cf289ca 2004-04-06 devnull return (Item*)t;
3439 7cf289ca 2004-04-06 devnull }
3440 7cf289ca 2004-04-06 devnull
3441 7cf289ca 2004-04-06 devnull static Item*
3442 7cf289ca 2004-04-06 devnull newirule(int align, int size, int noshade, Dimen wspec)
3443 7cf289ca 2004-04-06 devnull {
3444 7cf289ca 2004-04-06 devnull Irule* r;
3445 7cf289ca 2004-04-06 devnull
3446 7cf289ca 2004-04-06 devnull r = (Irule*)emalloc(sizeof(Irule));
3447 7cf289ca 2004-04-06 devnull r->item.tag = Iruletag;
3448 7cf289ca 2004-04-06 devnull r->align = align;
3449 7cf289ca 2004-04-06 devnull r->size = size;
3450 7cf289ca 2004-04-06 devnull r->noshade = noshade;
3451 7cf289ca 2004-04-06 devnull r->wspec = wspec;
3452 7cf289ca 2004-04-06 devnull return (Item*)r;
3453 7cf289ca 2004-04-06 devnull }
3454 7cf289ca 2004-04-06 devnull
3455 cbeb0b26 2006-04-01 devnull /* Map is owned elsewhere. */
3456 7cf289ca 2004-04-06 devnull static Item*
3457 7cf289ca 2004-04-06 devnull newiimage(Rune* src, Rune* altrep, int align, int width, int height,
3458 7cf289ca 2004-04-06 devnull int hspace, int vspace, int border, int ismap, Map* map)
3459 7cf289ca 2004-04-06 devnull {
3460 7cf289ca 2004-04-06 devnull Iimage* i;
3461 7cf289ca 2004-04-06 devnull int state;
3462 7cf289ca 2004-04-06 devnull
3463 7cf289ca 2004-04-06 devnull state = 0;
3464 7cf289ca 2004-04-06 devnull if(ismap)
3465 7cf289ca 2004-04-06 devnull state = IFsmap;
3466 7cf289ca 2004-04-06 devnull i = (Iimage*)emalloc(sizeof(Iimage));
3467 7cf289ca 2004-04-06 devnull i->item.tag = Iimagetag;
3468 7cf289ca 2004-04-06 devnull i->item.state = state;
3469 7cf289ca 2004-04-06 devnull i->imsrc = src;
3470 7cf289ca 2004-04-06 devnull i->altrep = altrep;
3471 7cf289ca 2004-04-06 devnull i->align = align;
3472 7cf289ca 2004-04-06 devnull i->imwidth = width;
3473 7cf289ca 2004-04-06 devnull i->imheight = height;
3474 7cf289ca 2004-04-06 devnull i->hspace = hspace;
3475 7cf289ca 2004-04-06 devnull i->vspace = vspace;
3476 7cf289ca 2004-04-06 devnull i->border = border;
3477 7cf289ca 2004-04-06 devnull i->map = map;
3478 7cf289ca 2004-04-06 devnull i->ctlid = -1;
3479 7cf289ca 2004-04-06 devnull return (Item*)i;
3480 7cf289ca 2004-04-06 devnull }
3481 7cf289ca 2004-04-06 devnull
3482 7cf289ca 2004-04-06 devnull static Item*
3483 7cf289ca 2004-04-06 devnull newiformfield(Formfield* ff)
3484 7cf289ca 2004-04-06 devnull {
3485 7cf289ca 2004-04-06 devnull Iformfield* f;
3486 7cf289ca 2004-04-06 devnull
3487 7cf289ca 2004-04-06 devnull f = (Iformfield*)emalloc(sizeof(Iformfield));
3488 7cf289ca 2004-04-06 devnull f->item.tag = Iformfieldtag;
3489 7cf289ca 2004-04-06 devnull f->formfield = ff;
3490 7cf289ca 2004-04-06 devnull return (Item*)f;
3491 7cf289ca 2004-04-06 devnull }
3492 7cf289ca 2004-04-06 devnull
3493 7cf289ca 2004-04-06 devnull static Item*
3494 7cf289ca 2004-04-06 devnull newitable(Table* tab)
3495 7cf289ca 2004-04-06 devnull {
3496 7cf289ca 2004-04-06 devnull Itable* t;
3497 7cf289ca 2004-04-06 devnull
3498 7cf289ca 2004-04-06 devnull t = (Itable*)emalloc(sizeof(Itable));
3499 7cf289ca 2004-04-06 devnull t->item.tag = Itabletag;
3500 7cf289ca 2004-04-06 devnull t->table = tab;
3501 7cf289ca 2004-04-06 devnull return (Item*)t;
3502 7cf289ca 2004-04-06 devnull }
3503 7cf289ca 2004-04-06 devnull
3504 7cf289ca 2004-04-06 devnull static Item*
3505 7cf289ca 2004-04-06 devnull newifloat(Item* it, int side)
3506 7cf289ca 2004-04-06 devnull {
3507 7cf289ca 2004-04-06 devnull Ifloat* f;
3508 7cf289ca 2004-04-06 devnull
3509 7cf289ca 2004-04-06 devnull f = (Ifloat*)emalloc(sizeof(Ifloat));
3510 7cf289ca 2004-04-06 devnull f->_item.tag = Ifloattag;
3511 7cf289ca 2004-04-06 devnull f->_item.state = IFwrap;
3512 7cf289ca 2004-04-06 devnull f->item = it;
3513 7cf289ca 2004-04-06 devnull f->side = side;
3514 7cf289ca 2004-04-06 devnull return (Item*)f;
3515 7cf289ca 2004-04-06 devnull }
3516 7cf289ca 2004-04-06 devnull
3517 7cf289ca 2004-04-06 devnull static Item*
3518 7cf289ca 2004-04-06 devnull newispacer(int spkind)
3519 7cf289ca 2004-04-06 devnull {
3520 7cf289ca 2004-04-06 devnull Ispacer* s;
3521 7cf289ca 2004-04-06 devnull
3522 7cf289ca 2004-04-06 devnull s = (Ispacer*)emalloc(sizeof(Ispacer));
3523 7cf289ca 2004-04-06 devnull s->item.tag = Ispacertag;
3524 7cf289ca 2004-04-06 devnull s->spkind = spkind;
3525 7cf289ca 2004-04-06 devnull return (Item*)s;
3526 7cf289ca 2004-04-06 devnull }
3527 7cf289ca 2004-04-06 devnull
3528 cbeb0b26 2006-04-01 devnull /* Free one item (caller must deal with next pointer) */
3529 7cf289ca 2004-04-06 devnull static void
3530 7cf289ca 2004-04-06 devnull freeitem(Item* it)
3531 7cf289ca 2004-04-06 devnull {
3532 7cf289ca 2004-04-06 devnull Iimage* ii;
3533 7cf289ca 2004-04-06 devnull Genattr* ga;
3534 7cf289ca 2004-04-06 devnull
3535 7cf289ca 2004-04-06 devnull if(it == nil)
3536 7cf289ca 2004-04-06 devnull return;
3537 7cf289ca 2004-04-06 devnull
3538 7cf289ca 2004-04-06 devnull switch(it->tag) {
3539 7cf289ca 2004-04-06 devnull case Itexttag:
3540 7cf289ca 2004-04-06 devnull free(((Itext*)it)->s);
3541 7cf289ca 2004-04-06 devnull break;
3542 7cf289ca 2004-04-06 devnull case Iimagetag:
3543 7cf289ca 2004-04-06 devnull ii = (Iimage*)it;
3544 7cf289ca 2004-04-06 devnull free(ii->imsrc);
3545 7cf289ca 2004-04-06 devnull free(ii->altrep);
3546 7cf289ca 2004-04-06 devnull break;
3547 7cf289ca 2004-04-06 devnull case Iformfieldtag:
3548 7cf289ca 2004-04-06 devnull freeformfield(((Iformfield*)it)->formfield);
3549 7cf289ca 2004-04-06 devnull break;
3550 7cf289ca 2004-04-06 devnull case Itabletag:
3551 7cf289ca 2004-04-06 devnull freetable(((Itable*)it)->table);
3552 7cf289ca 2004-04-06 devnull break;
3553 7cf289ca 2004-04-06 devnull case Ifloattag:
3554 7cf289ca 2004-04-06 devnull freeitem(((Ifloat*)it)->item);
3555 7cf289ca 2004-04-06 devnull break;
3556 7cf289ca 2004-04-06 devnull }
3557 7cf289ca 2004-04-06 devnull ga = it->genattr;
3558 7cf289ca 2004-04-06 devnull if(ga != nil) {
3559 7cf289ca 2004-04-06 devnull free(ga->id);
3560 7cf289ca 2004-04-06 devnull free(ga->class);
3561 7cf289ca 2004-04-06 devnull free(ga->style);
3562 7cf289ca 2004-04-06 devnull free(ga->title);
3563 7cf289ca 2004-04-06 devnull freescriptevents(ga->events);
3564 7cf289ca 2004-04-06 devnull }
3565 7cf289ca 2004-04-06 devnull free(it);
3566 7cf289ca 2004-04-06 devnull }
3567 7cf289ca 2004-04-06 devnull
3568 cbeb0b26 2006-04-01 devnull /* Free list of items chained through next pointer */
3569 7cf289ca 2004-04-06 devnull void
3570 7cf289ca 2004-04-06 devnull freeitems(Item* ithead)
3571 7cf289ca 2004-04-06 devnull {
3572 7cf289ca 2004-04-06 devnull Item* it;
3573 7cf289ca 2004-04-06 devnull Item* itnext;
3574 7cf289ca 2004-04-06 devnull
3575 7cf289ca 2004-04-06 devnull it = ithead;
3576 7cf289ca 2004-04-06 devnull while(it != nil) {
3577 7cf289ca 2004-04-06 devnull itnext = it->next;
3578 7cf289ca 2004-04-06 devnull freeitem(it);
3579 7cf289ca 2004-04-06 devnull it = itnext;
3580 7cf289ca 2004-04-06 devnull }
3581 7cf289ca 2004-04-06 devnull }
3582 7cf289ca 2004-04-06 devnull
3583 7cf289ca 2004-04-06 devnull static void
3584 7cf289ca 2004-04-06 devnull freeformfield(Formfield* ff)
3585 7cf289ca 2004-04-06 devnull {
3586 7cf289ca 2004-04-06 devnull Option* o;
3587 7cf289ca 2004-04-06 devnull Option* onext;
3588 7cf289ca 2004-04-06 devnull
3589 7cf289ca 2004-04-06 devnull if(ff == nil)
3590 7cf289ca 2004-04-06 devnull return;
3591 7cf289ca 2004-04-06 devnull
3592 7cf289ca 2004-04-06 devnull free(ff->name);
3593 7cf289ca 2004-04-06 devnull free(ff->value);
3594 7cf289ca 2004-04-06 devnull for(o = ff->options; o != nil; o = onext) {
3595 7cf289ca 2004-04-06 devnull onext = o->next;
3596 7cf289ca 2004-04-06 devnull free(o->value);
3597 7cf289ca 2004-04-06 devnull free(o->display);
3598 7cf289ca 2004-04-06 devnull }
3599 7cf289ca 2004-04-06 devnull free(ff);
3600 7cf289ca 2004-04-06 devnull }
3601 7cf289ca 2004-04-06 devnull
3602 7cf289ca 2004-04-06 devnull static void
3603 7cf289ca 2004-04-06 devnull freetable(Table* t)
3604 7cf289ca 2004-04-06 devnull {
3605 7cf289ca 2004-04-06 devnull int i;
3606 7cf289ca 2004-04-06 devnull Tablecell* c;
3607 7cf289ca 2004-04-06 devnull Tablecell* cnext;
3608 7cf289ca 2004-04-06 devnull
3609 7cf289ca 2004-04-06 devnull if(t == nil)
3610 7cf289ca 2004-04-06 devnull return;
3611 7cf289ca 2004-04-06 devnull
3612 cbeb0b26 2006-04-01 devnull /* We'll find all the unique cells via t->cells and next pointers. */
3613 cbeb0b26 2006-04-01 devnull /* (Other pointers to cells in the table are duplicates of these) */
3614 7cf289ca 2004-04-06 devnull for(c = t->cells; c != nil; c = cnext) {
3615 7cf289ca 2004-04-06 devnull cnext = c->next;
3616 7cf289ca 2004-04-06 devnull freeitems(c->content);
3617 7cf289ca 2004-04-06 devnull }
3618 7cf289ca 2004-04-06 devnull if(t->grid != nil) {
3619 7cf289ca 2004-04-06 devnull for(i = 0; i < t->nrow; i++)
3620 7cf289ca 2004-04-06 devnull free(t->grid[i]);
3621 7cf289ca 2004-04-06 devnull free(t->grid);
3622 7cf289ca 2004-04-06 devnull }
3623 7cf289ca 2004-04-06 devnull free(t->rows);
3624 7cf289ca 2004-04-06 devnull free(t->cols);
3625 7cf289ca 2004-04-06 devnull freeitems(t->caption);
3626 7cf289ca 2004-04-06 devnull free(t);
3627 7cf289ca 2004-04-06 devnull }
3628 7cf289ca 2004-04-06 devnull
3629 7cf289ca 2004-04-06 devnull static void
3630 7cf289ca 2004-04-06 devnull freeform(Form* f)
3631 7cf289ca 2004-04-06 devnull {
3632 7cf289ca 2004-04-06 devnull if(f == nil)
3633 7cf289ca 2004-04-06 devnull return;
3634 7cf289ca 2004-04-06 devnull
3635 7cf289ca 2004-04-06 devnull free(f->name);
3636 7cf289ca 2004-04-06 devnull free(f->action);
3637 cbeb0b26 2006-04-01 devnull /* Form doesn't own its fields (Iformfield items do) */
3638 7cf289ca 2004-04-06 devnull free(f);
3639 7cf289ca 2004-04-06 devnull }
3640 7cf289ca 2004-04-06 devnull
3641 7cf289ca 2004-04-06 devnull static void
3642 7cf289ca 2004-04-06 devnull freeforms(Form* fhead)
3643 7cf289ca 2004-04-06 devnull {
3644 7cf289ca 2004-04-06 devnull Form* f;
3645 7cf289ca 2004-04-06 devnull Form* fnext;
3646 7cf289ca 2004-04-06 devnull
3647 7cf289ca 2004-04-06 devnull for(f = fhead; f != nil; f = fnext) {
3648 7cf289ca 2004-04-06 devnull fnext = f->next;
3649 7cf289ca 2004-04-06 devnull freeform(f);
3650 7cf289ca 2004-04-06 devnull }
3651 7cf289ca 2004-04-06 devnull }
3652 7cf289ca 2004-04-06 devnull
3653 7cf289ca 2004-04-06 devnull static void
3654 7cf289ca 2004-04-06 devnull freeanchor(Anchor* a)
3655 7cf289ca 2004-04-06 devnull {
3656 7cf289ca 2004-04-06 devnull if(a == nil)
3657 7cf289ca 2004-04-06 devnull return;
3658 7cf289ca 2004-04-06 devnull
3659 7cf289ca 2004-04-06 devnull free(a->name);
3660 7cf289ca 2004-04-06 devnull free(a->href);
3661 7cf289ca 2004-04-06 devnull free(a);
3662 7cf289ca 2004-04-06 devnull }
3663 7cf289ca 2004-04-06 devnull
3664 7cf289ca 2004-04-06 devnull static void
3665 7cf289ca 2004-04-06 devnull freeanchors(Anchor* ahead)
3666 7cf289ca 2004-04-06 devnull {
3667 7cf289ca 2004-04-06 devnull Anchor* a;
3668 7cf289ca 2004-04-06 devnull Anchor* anext;
3669 7cf289ca 2004-04-06 devnull
3670 7cf289ca 2004-04-06 devnull for(a = ahead; a != nil; a = anext) {
3671 7cf289ca 2004-04-06 devnull anext = a->next;
3672 7cf289ca 2004-04-06 devnull freeanchor(a);
3673 7cf289ca 2004-04-06 devnull }
3674 7cf289ca 2004-04-06 devnull }
3675 7cf289ca 2004-04-06 devnull
3676 7cf289ca 2004-04-06 devnull static void
3677 7cf289ca 2004-04-06 devnull freedestanchor(DestAnchor* da)
3678 7cf289ca 2004-04-06 devnull {
3679 7cf289ca 2004-04-06 devnull if(da == nil)
3680 7cf289ca 2004-04-06 devnull return;
3681 7cf289ca 2004-04-06 devnull
3682 7cf289ca 2004-04-06 devnull free(da->name);
3683 7cf289ca 2004-04-06 devnull free(da);
3684 7cf289ca 2004-04-06 devnull }
3685 7cf289ca 2004-04-06 devnull
3686 7cf289ca 2004-04-06 devnull static void
3687 7cf289ca 2004-04-06 devnull freedestanchors(DestAnchor* dahead)
3688 7cf289ca 2004-04-06 devnull {
3689 7cf289ca 2004-04-06 devnull DestAnchor* da;
3690 7cf289ca 2004-04-06 devnull DestAnchor* danext;
3691 7cf289ca 2004-04-06 devnull
3692 7cf289ca 2004-04-06 devnull for(da = dahead; da != nil; da = danext) {
3693 7cf289ca 2004-04-06 devnull danext = da->next;
3694 7cf289ca 2004-04-06 devnull freedestanchor(da);
3695 7cf289ca 2004-04-06 devnull }
3696 7cf289ca 2004-04-06 devnull }
3697 7cf289ca 2004-04-06 devnull
3698 7cf289ca 2004-04-06 devnull static void
3699 7cf289ca 2004-04-06 devnull freearea(Area* a)
3700 7cf289ca 2004-04-06 devnull {
3701 7cf289ca 2004-04-06 devnull if(a == nil)
3702 7cf289ca 2004-04-06 devnull return;
3703 7cf289ca 2004-04-06 devnull free(a->href);
3704 7cf289ca 2004-04-06 devnull free(a->coords);
3705 7cf289ca 2004-04-06 devnull }
3706 7cf289ca 2004-04-06 devnull
3707 7cf289ca 2004-04-06 devnull static void freekidinfos(Kidinfo* khead);
3708 7cf289ca 2004-04-06 devnull
3709 7cf289ca 2004-04-06 devnull static void
3710 7cf289ca 2004-04-06 devnull freekidinfo(Kidinfo* k)
3711 7cf289ca 2004-04-06 devnull {
3712 7cf289ca 2004-04-06 devnull if(k->isframeset) {
3713 7cf289ca 2004-04-06 devnull free(k->rows);
3714 7cf289ca 2004-04-06 devnull free(k->cols);
3715 7cf289ca 2004-04-06 devnull freekidinfos(k->kidinfos);
3716 7cf289ca 2004-04-06 devnull }
3717 7cf289ca 2004-04-06 devnull else {
3718 7cf289ca 2004-04-06 devnull free(k->src);
3719 7cf289ca 2004-04-06 devnull free(k->name);
3720 7cf289ca 2004-04-06 devnull }
3721 7cf289ca 2004-04-06 devnull free(k);
3722 7cf289ca 2004-04-06 devnull }
3723 7cf289ca 2004-04-06 devnull
3724 7cf289ca 2004-04-06 devnull static void
3725 7cf289ca 2004-04-06 devnull freekidinfos(Kidinfo* khead)
3726 7cf289ca 2004-04-06 devnull {
3727 7cf289ca 2004-04-06 devnull Kidinfo* k;
3728 7cf289ca 2004-04-06 devnull Kidinfo* knext;
3729 7cf289ca 2004-04-06 devnull
3730 7cf289ca 2004-04-06 devnull for(k = khead; k != nil; k = knext) {
3731 7cf289ca 2004-04-06 devnull knext = k->next;
3732 7cf289ca 2004-04-06 devnull freekidinfo(k);
3733 7cf289ca 2004-04-06 devnull }
3734 7cf289ca 2004-04-06 devnull }
3735 7cf289ca 2004-04-06 devnull
3736 7cf289ca 2004-04-06 devnull static void
3737 7cf289ca 2004-04-06 devnull freemap(Map* m)
3738 7cf289ca 2004-04-06 devnull {
3739 7cf289ca 2004-04-06 devnull Area* a;
3740 7cf289ca 2004-04-06 devnull Area* anext;
3741 7cf289ca 2004-04-06 devnull
3742 7cf289ca 2004-04-06 devnull if(m == nil)
3743 7cf289ca 2004-04-06 devnull return;
3744 7cf289ca 2004-04-06 devnull
3745 7cf289ca 2004-04-06 devnull free(m->name);
3746 7cf289ca 2004-04-06 devnull for(a = m->areas; a != nil; a = anext) {
3747 7cf289ca 2004-04-06 devnull anext = a->next;
3748 7cf289ca 2004-04-06 devnull freearea(a);
3749 7cf289ca 2004-04-06 devnull }
3750 7cf289ca 2004-04-06 devnull free(m);
3751 7cf289ca 2004-04-06 devnull }
3752 7cf289ca 2004-04-06 devnull
3753 7cf289ca 2004-04-06 devnull static void
3754 7cf289ca 2004-04-06 devnull freemaps(Map* mhead)
3755 7cf289ca 2004-04-06 devnull {
3756 7cf289ca 2004-04-06 devnull Map* m;
3757 7cf289ca 2004-04-06 devnull Map* mnext;
3758 7cf289ca 2004-04-06 devnull
3759 7cf289ca 2004-04-06 devnull for(m = mhead; m != nil; m = mnext) {
3760 7cf289ca 2004-04-06 devnull mnext = m->next;
3761 7cf289ca 2004-04-06 devnull freemap(m);
3762 7cf289ca 2004-04-06 devnull }
3763 7cf289ca 2004-04-06 devnull }
3764 7cf289ca 2004-04-06 devnull
3765 7cf289ca 2004-04-06 devnull void
3766 7cf289ca 2004-04-06 devnull freedocinfo(Docinfo* d)
3767 7cf289ca 2004-04-06 devnull {
3768 7cf289ca 2004-04-06 devnull if(d == nil)
3769 7cf289ca 2004-04-06 devnull return;
3770 7cf289ca 2004-04-06 devnull free(d->src);
3771 7cf289ca 2004-04-06 devnull free(d->base);
3772 7cf289ca 2004-04-06 devnull freeitem((Item*)d->backgrounditem);
3773 7cf289ca 2004-04-06 devnull free(d->refresh);
3774 7cf289ca 2004-04-06 devnull freekidinfos(d->kidinfo);
3775 7cf289ca 2004-04-06 devnull freeanchors(d->anchors);
3776 7cf289ca 2004-04-06 devnull freedestanchors(d->dests);
3777 7cf289ca 2004-04-06 devnull freeforms(d->forms);
3778 7cf289ca 2004-04-06 devnull freemaps(d->maps);
3779 cbeb0b26 2006-04-01 devnull /* tables, images, and formfields are freed when */
3780 cbeb0b26 2006-04-01 devnull /* the items pointing at them are freed */
3781 7cf289ca 2004-04-06 devnull free(d);
3782 7cf289ca 2004-04-06 devnull }
3783 7cf289ca 2004-04-06 devnull
3784 cbeb0b26 2006-04-01 devnull /* Currently, someone else owns all the memory */
3785 cbeb0b26 2006-04-01 devnull /* pointed to by things in a Pstate. */
3786 7cf289ca 2004-04-06 devnull static void
3787 7cf289ca 2004-04-06 devnull freepstate(Pstate* p)
3788 7cf289ca 2004-04-06 devnull {
3789 7cf289ca 2004-04-06 devnull free(p);
3790 7cf289ca 2004-04-06 devnull }
3791 7cf289ca 2004-04-06 devnull
3792 7cf289ca 2004-04-06 devnull static void
3793 7cf289ca 2004-04-06 devnull freepstatestack(Pstate* pshead)
3794 7cf289ca 2004-04-06 devnull {
3795 7cf289ca 2004-04-06 devnull Pstate* p;
3796 7cf289ca 2004-04-06 devnull Pstate* pnext;
3797 7cf289ca 2004-04-06 devnull
3798 7cf289ca 2004-04-06 devnull for(p = pshead; p != nil; p = pnext) {
3799 7cf289ca 2004-04-06 devnull pnext = p->next;
3800 7cf289ca 2004-04-06 devnull free(p);
3801 7cf289ca 2004-04-06 devnull }
3802 7cf289ca 2004-04-06 devnull }
3803 7cf289ca 2004-04-06 devnull
3804 7cf289ca 2004-04-06 devnull static int
3805 7cf289ca 2004-04-06 devnull Iconv(Fmt *f)
3806 7cf289ca 2004-04-06 devnull {
3807 7cf289ca 2004-04-06 devnull Item* it;
3808 7cf289ca 2004-04-06 devnull Itext* t;
3809 7cf289ca 2004-04-06 devnull Irule* r;
3810 7cf289ca 2004-04-06 devnull Iimage* i;
3811 7cf289ca 2004-04-06 devnull Ifloat* fl;
3812 7cf289ca 2004-04-06 devnull int state;
3813 7cf289ca 2004-04-06 devnull Formfield* ff;
3814 7cf289ca 2004-04-06 devnull Rune* ty;
3815 7cf289ca 2004-04-06 devnull Tablecell* c;
3816 7cf289ca 2004-04-06 devnull Table* tab;
3817 7cf289ca 2004-04-06 devnull char* p;
3818 7cf289ca 2004-04-06 devnull int cl;
3819 7cf289ca 2004-04-06 devnull int hang;
3820 7cf289ca 2004-04-06 devnull int indent;
3821 7cf289ca 2004-04-06 devnull int bi;
3822 7cf289ca 2004-04-06 devnull int nbuf;
3823 7cf289ca 2004-04-06 devnull char buf[BIGBUFSIZE];
3824 7cf289ca 2004-04-06 devnull
3825 7cf289ca 2004-04-06 devnull it = va_arg(f->args, Item*);
3826 7cf289ca 2004-04-06 devnull bi = 0;
3827 7cf289ca 2004-04-06 devnull nbuf = sizeof(buf);
3828 7cf289ca 2004-04-06 devnull state = it->state;
3829 7cf289ca 2004-04-06 devnull nbuf = nbuf-1;
3830 7cf289ca 2004-04-06 devnull if(state&IFbrk) {
3831 7cf289ca 2004-04-06 devnull cl = state&(IFcleft|IFcright);
3832 7cf289ca 2004-04-06 devnull p = "";
3833 7cf289ca 2004-04-06 devnull if(cl) {
3834 7cf289ca 2004-04-06 devnull if(cl == (IFcleft|IFcright))
3835 7cf289ca 2004-04-06 devnull p = " both";
3836 7cf289ca 2004-04-06 devnull else if(cl == IFcleft)
3837 7cf289ca 2004-04-06 devnull p = " left";
3838 7cf289ca 2004-04-06 devnull else
3839 7cf289ca 2004-04-06 devnull p = " right";
3840 7cf289ca 2004-04-06 devnull }
3841 7cf289ca 2004-04-06 devnull bi = snprint(buf, nbuf, "brk(%d%s)", (state&IFbrksp)? 1 : 0, p);
3842 7cf289ca 2004-04-06 devnull }
3843 7cf289ca 2004-04-06 devnull if(state&IFnobrk)
3844 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " nobrk");
3845 7cf289ca 2004-04-06 devnull if(!(state&IFwrap))
3846 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " nowrap");
3847 7cf289ca 2004-04-06 devnull if(state&IFrjust)
3848 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " rjust");
3849 7cf289ca 2004-04-06 devnull if(state&IFcjust)
3850 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " cjust");
3851 7cf289ca 2004-04-06 devnull if(state&IFsmap)
3852 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " smap");
3853 7cf289ca 2004-04-06 devnull indent = (state&IFindentmask) >> IFindentshift;
3854 7cf289ca 2004-04-06 devnull if(indent > 0)
3855 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " indent=%d", indent);
3856 7cf289ca 2004-04-06 devnull hang = state&IFhangmask;
3857 7cf289ca 2004-04-06 devnull if(hang > 0)
3858 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " hang=%d", hang);
3859 7cf289ca 2004-04-06 devnull
3860 7cf289ca 2004-04-06 devnull switch(it->tag) {
3861 7cf289ca 2004-04-06 devnull case Itexttag:
3862 7cf289ca 2004-04-06 devnull t = (Itext*)it;
3863 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " Text '%S', fnt=%d, fg=%x", t->s, t->fnt, t->fg);
3864 7cf289ca 2004-04-06 devnull break;
3865 7cf289ca 2004-04-06 devnull
3866 7cf289ca 2004-04-06 devnull case Iruletag:
3867 7cf289ca 2004-04-06 devnull r = (Irule*)it;
3868 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, "Rule size=%d, al=%S, wspec=", r->size, stringalign(r->align));
3869 7cf289ca 2004-04-06 devnull bi += dimprint(buf+bi, nbuf-bi, r->wspec);
3870 7cf289ca 2004-04-06 devnull break;
3871 7cf289ca 2004-04-06 devnull
3872 7cf289ca 2004-04-06 devnull case Iimagetag:
3873 7cf289ca 2004-04-06 devnull i = (Iimage*)it;
3874 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi,
3875 7cf289ca 2004-04-06 devnull "Image src=%S, alt=%S, al=%S, w=%d, h=%d hsp=%d, vsp=%d, bd=%d, map=%S",
3876 7cf289ca 2004-04-06 devnull i->imsrc, i->altrep? i->altrep : L(Lempty), stringalign(i->align), i->imwidth, i->imheight,
3877 7cf289ca 2004-04-06 devnull i->hspace, i->vspace, i->border, i->map?i->map->name : L(Lempty));
3878 7cf289ca 2004-04-06 devnull break;
3879 7cf289ca 2004-04-06 devnull
3880 7cf289ca 2004-04-06 devnull case Iformfieldtag:
3881 7cf289ca 2004-04-06 devnull ff = ((Iformfield*)it)->formfield;
3882 7cf289ca 2004-04-06 devnull if(ff->ftype == Ftextarea)
3883 7cf289ca 2004-04-06 devnull ty = L(Ltextarea);
3884 7cf289ca 2004-04-06 devnull else if(ff->ftype == Fselect)
3885 7cf289ca 2004-04-06 devnull ty = L(Lselect);
3886 7cf289ca 2004-04-06 devnull else {
3887 7cf289ca 2004-04-06 devnull ty = _revlookup(input_tab, NINPUTTAB, ff->ftype);
3888 7cf289ca 2004-04-06 devnull if(ty == nil)
3889 7cf289ca 2004-04-06 devnull ty = L(Lnone);
3890 7cf289ca 2004-04-06 devnull }
3891 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, "Formfield %S, fieldid=%d, formid=%d, name=%S, value=%S",
3892 7cf289ca 2004-04-06 devnull ty, ff->fieldid, ff->form->formid, ff->name? ff->name : L(Lempty),
3893 7cf289ca 2004-04-06 devnull ff->value? ff->value : L(Lempty));
3894 7cf289ca 2004-04-06 devnull break;
3895 7cf289ca 2004-04-06 devnull
3896 7cf289ca 2004-04-06 devnull case Itabletag:
3897 7cf289ca 2004-04-06 devnull tab = ((Itable*)it)->table;
3898 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, "Table tableid=%d, width=", tab->tableid);
3899 7cf289ca 2004-04-06 devnull bi += dimprint(buf+bi, nbuf-bi, tab->width);
3900 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, ", nrow=%d, ncol=%d, ncell=%d, totw=%d, toth=%d\n",
3901 7cf289ca 2004-04-06 devnull tab->nrow, tab->ncol, tab->ncell, tab->totw, tab->toth);
3902 7cf289ca 2004-04-06 devnull for(c = tab->cells; c != nil; c = c->next)
3903 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, "Cell %d.%d, at (%d,%d) ",
3904 7cf289ca 2004-04-06 devnull tab->tableid, c->cellid, c->row, c->col);
3905 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, "End of Table %d", tab->tableid);
3906 7cf289ca 2004-04-06 devnull break;
3907 7cf289ca 2004-04-06 devnull
3908 7cf289ca 2004-04-06 devnull case Ifloattag:
3909 7cf289ca 2004-04-06 devnull fl = (Ifloat*)it;
3910 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, "Float, x=%d y=%d, side=%S, it=%I",
3911 7cf289ca 2004-04-06 devnull fl->x, fl->y, stringalign(fl->side), fl->item);
3912 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, "\n\t");
3913 7cf289ca 2004-04-06 devnull break;
3914 7cf289ca 2004-04-06 devnull
3915 7cf289ca 2004-04-06 devnull case Ispacertag:
3916 7cf289ca 2004-04-06 devnull p = "";
3917 7cf289ca 2004-04-06 devnull switch(((Ispacer*)it)->spkind) {
3918 7cf289ca 2004-04-06 devnull case ISPnull:
3919 7cf289ca 2004-04-06 devnull p = "null";
3920 7cf289ca 2004-04-06 devnull break;
3921 7cf289ca 2004-04-06 devnull case ISPvline:
3922 7cf289ca 2004-04-06 devnull p = "vline";
3923 7cf289ca 2004-04-06 devnull break;
3924 7cf289ca 2004-04-06 devnull case ISPhspace:
3925 7cf289ca 2004-04-06 devnull p = "hspace";
3926 7cf289ca 2004-04-06 devnull break;
3927 7cf289ca 2004-04-06 devnull }
3928 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, "Spacer %s ", p);
3929 7cf289ca 2004-04-06 devnull break;
3930 7cf289ca 2004-04-06 devnull }
3931 7cf289ca 2004-04-06 devnull bi += snprint(buf+bi, nbuf-bi, " w=%d, h=%d, a=%d, anchor=%d\n",
3932 7cf289ca 2004-04-06 devnull it->width, it->height, it->ascent, it->anchorid);
3933 7cf289ca 2004-04-06 devnull buf[bi] = 0;
3934 7cf289ca 2004-04-06 devnull return fmtstrcpy(f, buf);
3935 7cf289ca 2004-04-06 devnull }
3936 7cf289ca 2004-04-06 devnull
3937 cbeb0b26 2006-04-01 devnull /* String version of alignment 'a' */
3938 7cf289ca 2004-04-06 devnull static Rune*
3939 7cf289ca 2004-04-06 devnull stringalign(int a)
3940 7cf289ca 2004-04-06 devnull {
3941 7cf289ca 2004-04-06 devnull Rune* s;
3942 7cf289ca 2004-04-06 devnull
3943 7cf289ca 2004-04-06 devnull s = _revlookup(align_tab, NALIGNTAB, a);
3944 7cf289ca 2004-04-06 devnull if(s == nil)
3945 7cf289ca 2004-04-06 devnull s = L(Lnone);
3946 7cf289ca 2004-04-06 devnull return s;
3947 7cf289ca 2004-04-06 devnull }
3948 7cf289ca 2004-04-06 devnull
3949 cbeb0b26 2006-04-01 devnull /* Put at most nbuf chars of representation of d into buf, */
3950 cbeb0b26 2006-04-01 devnull /* and return number of characters put */
3951 7cf289ca 2004-04-06 devnull static int
3952 7cf289ca 2004-04-06 devnull dimprint(char* buf, int nbuf, Dimen d)
3953 7cf289ca 2004-04-06 devnull {
3954 7cf289ca 2004-04-06 devnull int n;
3955 7cf289ca 2004-04-06 devnull int k;
3956 7cf289ca 2004-04-06 devnull
3957 7cf289ca 2004-04-06 devnull n = 0;
3958 7cf289ca 2004-04-06 devnull n += snprint(buf, nbuf, "%d", dimenspec(d));
3959 7cf289ca 2004-04-06 devnull k = dimenkind(d);
3960 7cf289ca 2004-04-06 devnull if(k == Dpercent)
3961 7cf289ca 2004-04-06 devnull buf[n++] = '%';
3962 7cf289ca 2004-04-06 devnull if(k == Drelative)
3963 7cf289ca 2004-04-06 devnull buf[n++] = '*';
3964 7cf289ca 2004-04-06 devnull return n;
3965 7cf289ca 2004-04-06 devnull }
3966 7cf289ca 2004-04-06 devnull
3967 7cf289ca 2004-04-06 devnull void
3968 7cf289ca 2004-04-06 devnull printitems(Item* items, char* msg)
3969 7cf289ca 2004-04-06 devnull {
3970 7cf289ca 2004-04-06 devnull Item* il;
3971 7cf289ca 2004-04-06 devnull
3972 7cf289ca 2004-04-06 devnull fprint(2, "%s\n", msg);
3973 7cf289ca 2004-04-06 devnull il = items;
3974 7cf289ca 2004-04-06 devnull while(il != nil) {
3975 7cf289ca 2004-04-06 devnull fprint(2, "%I", il);
3976 7cf289ca 2004-04-06 devnull il = il->next;
3977 7cf289ca 2004-04-06 devnull }
3978 7cf289ca 2004-04-06 devnull }
3979 7cf289ca 2004-04-06 devnull
3980 7cf289ca 2004-04-06 devnull static Genattr*
3981 7cf289ca 2004-04-06 devnull newgenattr(Rune* id, Rune* class, Rune* style, Rune* title, SEvent* events)
3982 7cf289ca 2004-04-06 devnull {
3983 7cf289ca 2004-04-06 devnull Genattr* g;
3984 7cf289ca 2004-04-06 devnull
3985 7cf289ca 2004-04-06 devnull g = (Genattr*)emalloc(sizeof(Genattr));
3986 7cf289ca 2004-04-06 devnull g->id = id;
3987 7cf289ca 2004-04-06 devnull g->class = class;
3988 7cf289ca 2004-04-06 devnull g->style = style;
3989 7cf289ca 2004-04-06 devnull g->title = title;
3990 7cf289ca 2004-04-06 devnull g->events = events;
3991 7cf289ca 2004-04-06 devnull return g;
3992 7cf289ca 2004-04-06 devnull }
3993 7cf289ca 2004-04-06 devnull
3994 7cf289ca 2004-04-06 devnull static Formfield*
3995 7cf289ca 2004-04-06 devnull newformfield(int ftype, int fieldid, Form* form, Rune* name,
3996 7cf289ca 2004-04-06 devnull Rune* value, int size, int maxlength, Formfield* link)
3997 7cf289ca 2004-04-06 devnull {
3998 7cf289ca 2004-04-06 devnull Formfield* ff;
3999 7cf289ca 2004-04-06 devnull
4000 7cf289ca 2004-04-06 devnull ff = (Formfield*)emalloc(sizeof(Formfield));
4001 7cf289ca 2004-04-06 devnull ff->ftype = ftype;
4002 7cf289ca 2004-04-06 devnull ff->fieldid = fieldid;
4003 7cf289ca 2004-04-06 devnull ff->form = form;
4004 7cf289ca 2004-04-06 devnull ff->name = name;
4005 7cf289ca 2004-04-06 devnull ff->value = value;
4006 7cf289ca 2004-04-06 devnull ff->size = size;
4007 7cf289ca 2004-04-06 devnull ff->maxlength = maxlength;
4008 7cf289ca 2004-04-06 devnull ff->ctlid = -1;
4009 7cf289ca 2004-04-06 devnull ff->next = link;
4010 7cf289ca 2004-04-06 devnull return ff;
4011 7cf289ca 2004-04-06 devnull }
4012 7cf289ca 2004-04-06 devnull
4013 cbeb0b26 2006-04-01 devnull /* Transfers ownership of value and display to Option. */
4014 7cf289ca 2004-04-06 devnull static Option*
4015 7cf289ca 2004-04-06 devnull newoption(int selected, Rune* value, Rune* display, Option* link)
4016 7cf289ca 2004-04-06 devnull {
4017 7cf289ca 2004-04-06 devnull Option *o;
4018 7cf289ca 2004-04-06 devnull
4019 7cf289ca 2004-04-06 devnull o = (Option*)emalloc(sizeof(Option));
4020 7cf289ca 2004-04-06 devnull o->selected = selected;
4021 7cf289ca 2004-04-06 devnull o->value = value;
4022 7cf289ca 2004-04-06 devnull o->display = display;
4023 7cf289ca 2004-04-06 devnull o->next = link;
4024 7cf289ca 2004-04-06 devnull return o;
4025 7cf289ca 2004-04-06 devnull }
4026 7cf289ca 2004-04-06 devnull
4027 7cf289ca 2004-04-06 devnull static Form*
4028 7cf289ca 2004-04-06 devnull newform(int formid, Rune* name, Rune* action, int target, int method, Form* link)
4029 7cf289ca 2004-04-06 devnull {
4030 7cf289ca 2004-04-06 devnull Form* f;
4031 7cf289ca 2004-04-06 devnull
4032 7cf289ca 2004-04-06 devnull f = (Form*)emalloc(sizeof(Form));
4033 7cf289ca 2004-04-06 devnull f->formid = formid;
4034 7cf289ca 2004-04-06 devnull f->name = name;
4035 7cf289ca 2004-04-06 devnull f->action = action;
4036 7cf289ca 2004-04-06 devnull f->target = target;
4037 7cf289ca 2004-04-06 devnull f->method = method;
4038 7cf289ca 2004-04-06 devnull f->nfields = 0;
4039 7cf289ca 2004-04-06 devnull f->fields = nil;
4040 7cf289ca 2004-04-06 devnull f->next = link;
4041 7cf289ca 2004-04-06 devnull return f;
4042 7cf289ca 2004-04-06 devnull }
4043 7cf289ca 2004-04-06 devnull
4044 7cf289ca 2004-04-06 devnull static Table*
4045 7cf289ca 2004-04-06 devnull newtable(int tableid, Align align, Dimen width, int border,
4046 7cf289ca 2004-04-06 devnull int cellspacing, int cellpadding, Background bg, Token* tok, Table* link)
4047 7cf289ca 2004-04-06 devnull {
4048 7cf289ca 2004-04-06 devnull Table* t;
4049 7cf289ca 2004-04-06 devnull
4050 7cf289ca 2004-04-06 devnull t = (Table*)emalloc(sizeof(Table));
4051 7cf289ca 2004-04-06 devnull t->tableid = tableid;
4052 7cf289ca 2004-04-06 devnull t->align = align;
4053 7cf289ca 2004-04-06 devnull t->width = width;
4054 7cf289ca 2004-04-06 devnull t->border = border;
4055 7cf289ca 2004-04-06 devnull t->cellspacing = cellspacing;
4056 7cf289ca 2004-04-06 devnull t->cellpadding = cellpadding;
4057 7cf289ca 2004-04-06 devnull t->background = bg;
4058 7cf289ca 2004-04-06 devnull t->caption_place = ALbottom;
4059 7cf289ca 2004-04-06 devnull t->caption_lay = nil;
4060 7cf289ca 2004-04-06 devnull t->tabletok = tok;
4061 7cf289ca 2004-04-06 devnull t->tabletok = nil;
4062 7cf289ca 2004-04-06 devnull t->next = link;
4063 7cf289ca 2004-04-06 devnull return t;
4064 7cf289ca 2004-04-06 devnull }
4065 7cf289ca 2004-04-06 devnull
4066 7cf289ca 2004-04-06 devnull static Tablerow*
4067 7cf289ca 2004-04-06 devnull newtablerow(Align align, Background bg, int flags, Tablerow* link)
4068 7cf289ca 2004-04-06 devnull {
4069 7cf289ca 2004-04-06 devnull Tablerow* tr;
4070 7cf289ca 2004-04-06 devnull
4071 7cf289ca 2004-04-06 devnull tr = (Tablerow*)emalloc(sizeof(Tablerow));
4072 7cf289ca 2004-04-06 devnull tr->align = align;
4073 7cf289ca 2004-04-06 devnull tr->background = bg;
4074 7cf289ca 2004-04-06 devnull tr->flags = flags;
4075 7cf289ca 2004-04-06 devnull tr->next = link;
4076 7cf289ca 2004-04-06 devnull return tr;
4077 7cf289ca 2004-04-06 devnull }
4078 7cf289ca 2004-04-06 devnull
4079 7cf289ca 2004-04-06 devnull static Tablecell*
4080 7cf289ca 2004-04-06 devnull newtablecell(int cellid, int rowspan, int colspan, Align align, Dimen wspec, int hspec,
4081 7cf289ca 2004-04-06 devnull Background bg, int flags, Tablecell* link)
4082 7cf289ca 2004-04-06 devnull {
4083 7cf289ca 2004-04-06 devnull Tablecell* c;
4084 7cf289ca 2004-04-06 devnull
4085 7cf289ca 2004-04-06 devnull c = (Tablecell*)emalloc(sizeof(Tablecell));
4086 7cf289ca 2004-04-06 devnull c->cellid = cellid;
4087 7cf289ca 2004-04-06 devnull c->lay = nil;
4088 7cf289ca 2004-04-06 devnull c->rowspan = rowspan;
4089 7cf289ca 2004-04-06 devnull c->colspan = colspan;
4090 7cf289ca 2004-04-06 devnull c->align = align;
4091 7cf289ca 2004-04-06 devnull c->flags = flags;
4092 7cf289ca 2004-04-06 devnull c->wspec = wspec;
4093 7cf289ca 2004-04-06 devnull c->hspec = hspec;
4094 7cf289ca 2004-04-06 devnull c->background = bg;
4095 7cf289ca 2004-04-06 devnull c->next = link;
4096 7cf289ca 2004-04-06 devnull return c;
4097 7cf289ca 2004-04-06 devnull }
4098 7cf289ca 2004-04-06 devnull
4099 7cf289ca 2004-04-06 devnull static Anchor*
4100 7cf289ca 2004-04-06 devnull newanchor(int index, Rune* name, Rune* href, int target, Anchor* link)
4101 7cf289ca 2004-04-06 devnull {
4102 7cf289ca 2004-04-06 devnull Anchor* a;
4103 7cf289ca 2004-04-06 devnull
4104 7cf289ca 2004-04-06 devnull a = (Anchor*)emalloc(sizeof(Anchor));
4105 7cf289ca 2004-04-06 devnull a->index = index;
4106 7cf289ca 2004-04-06 devnull a->name = name;
4107 7cf289ca 2004-04-06 devnull a->href = href;
4108 7cf289ca 2004-04-06 devnull a->target = target;
4109 7cf289ca 2004-04-06 devnull a->next = link;
4110 7cf289ca 2004-04-06 devnull return a;
4111 7cf289ca 2004-04-06 devnull }
4112 7cf289ca 2004-04-06 devnull
4113 7cf289ca 2004-04-06 devnull static DestAnchor*
4114 7cf289ca 2004-04-06 devnull newdestanchor(int index, Rune* name, Item* item, DestAnchor* link)
4115 7cf289ca 2004-04-06 devnull {
4116 7cf289ca 2004-04-06 devnull DestAnchor* d;
4117 7cf289ca 2004-04-06 devnull
4118 7cf289ca 2004-04-06 devnull d = (DestAnchor*)emalloc(sizeof(DestAnchor));
4119 7cf289ca 2004-04-06 devnull d->index = index;
4120 7cf289ca 2004-04-06 devnull d->name = name;
4121 7cf289ca 2004-04-06 devnull d->item = item;
4122 7cf289ca 2004-04-06 devnull d->next = link;
4123 7cf289ca 2004-04-06 devnull return d;
4124 7cf289ca 2004-04-06 devnull }
4125 7cf289ca 2004-04-06 devnull
4126 7cf289ca 2004-04-06 devnull static SEvent*
4127 7cf289ca 2004-04-06 devnull newscriptevent(int type, Rune* script, SEvent* link)
4128 7cf289ca 2004-04-06 devnull {
4129 7cf289ca 2004-04-06 devnull SEvent* ans;
4130 7cf289ca 2004-04-06 devnull
4131 7cf289ca 2004-04-06 devnull ans = (SEvent*)emalloc(sizeof(SEvent));
4132 7cf289ca 2004-04-06 devnull ans->type = type;
4133 7cf289ca 2004-04-06 devnull ans->script = script;
4134 7cf289ca 2004-04-06 devnull ans->next = link;
4135 7cf289ca 2004-04-06 devnull return ans;
4136 7cf289ca 2004-04-06 devnull }
4137 7cf289ca 2004-04-06 devnull
4138 7cf289ca 2004-04-06 devnull static void
4139 7cf289ca 2004-04-06 devnull freescriptevents(SEvent* ehead)
4140 7cf289ca 2004-04-06 devnull {
4141 7cf289ca 2004-04-06 devnull SEvent* e;
4142 7cf289ca 2004-04-06 devnull SEvent* nexte;
4143 7cf289ca 2004-04-06 devnull
4144 7cf289ca 2004-04-06 devnull e = ehead;
4145 7cf289ca 2004-04-06 devnull while(e != nil) {
4146 7cf289ca 2004-04-06 devnull nexte = e->next;
4147 7cf289ca 2004-04-06 devnull free(e->script);
4148 7cf289ca 2004-04-06 devnull free(e);
4149 7cf289ca 2004-04-06 devnull e = nexte;
4150 7cf289ca 2004-04-06 devnull }
4151 7cf289ca 2004-04-06 devnull }
4152 7cf289ca 2004-04-06 devnull
4153 7cf289ca 2004-04-06 devnull static Dimen
4154 7cf289ca 2004-04-06 devnull makedimen(int kind, int spec)
4155 7cf289ca 2004-04-06 devnull {
4156 7cf289ca 2004-04-06 devnull Dimen d;
4157 7cf289ca 2004-04-06 devnull
4158 7cf289ca 2004-04-06 devnull if(spec&Dkindmask) {
4159 7cf289ca 2004-04-06 devnull if(warn)
4160 7cf289ca 2004-04-06 devnull fprint(2, "warning: dimension spec too big: %d\n", spec);
4161 7cf289ca 2004-04-06 devnull spec = 0;
4162 7cf289ca 2004-04-06 devnull }
4163 7cf289ca 2004-04-06 devnull d.kindspec = kind|spec;
4164 7cf289ca 2004-04-06 devnull return d;
4165 7cf289ca 2004-04-06 devnull }
4166 7cf289ca 2004-04-06 devnull
4167 7cf289ca 2004-04-06 devnull int
4168 7cf289ca 2004-04-06 devnull dimenkind(Dimen d)
4169 7cf289ca 2004-04-06 devnull {
4170 7cf289ca 2004-04-06 devnull return (d.kindspec&Dkindmask);
4171 7cf289ca 2004-04-06 devnull }
4172 7cf289ca 2004-04-06 devnull
4173 7cf289ca 2004-04-06 devnull int
4174 7cf289ca 2004-04-06 devnull dimenspec(Dimen d)
4175 7cf289ca 2004-04-06 devnull {
4176 7cf289ca 2004-04-06 devnull return (d.kindspec&Dspecmask);
4177 7cf289ca 2004-04-06 devnull }
4178 7cf289ca 2004-04-06 devnull
4179 7cf289ca 2004-04-06 devnull static Kidinfo*
4180 7cf289ca 2004-04-06 devnull newkidinfo(int isframeset, Kidinfo* link)
4181 7cf289ca 2004-04-06 devnull {
4182 7cf289ca 2004-04-06 devnull Kidinfo* ki;
4183 7cf289ca 2004-04-06 devnull
4184 7cf289ca 2004-04-06 devnull ki = (Kidinfo*)emalloc(sizeof(Kidinfo));
4185 7cf289ca 2004-04-06 devnull ki->isframeset = isframeset;
4186 7cf289ca 2004-04-06 devnull if(!isframeset) {
4187 7cf289ca 2004-04-06 devnull ki->flags = FRhscrollauto|FRvscrollauto;
4188 7cf289ca 2004-04-06 devnull ki->marginw = FRKIDMARGIN;
4189 7cf289ca 2004-04-06 devnull ki->marginh = FRKIDMARGIN;
4190 7cf289ca 2004-04-06 devnull ki->framebd = 1;
4191 7cf289ca 2004-04-06 devnull }
4192 7cf289ca 2004-04-06 devnull ki->next = link;
4193 7cf289ca 2004-04-06 devnull return ki;
4194 7cf289ca 2004-04-06 devnull }
4195 7cf289ca 2004-04-06 devnull
4196 7cf289ca 2004-04-06 devnull static Docinfo*
4197 7cf289ca 2004-04-06 devnull newdocinfo(void)
4198 7cf289ca 2004-04-06 devnull {
4199 7cf289ca 2004-04-06 devnull Docinfo* d;
4200 7cf289ca 2004-04-06 devnull
4201 7cf289ca 2004-04-06 devnull d = (Docinfo*)emalloc(sizeof(Docinfo));
4202 7cf289ca 2004-04-06 devnull resetdocinfo(d);
4203 7cf289ca 2004-04-06 devnull return d;
4204 7cf289ca 2004-04-06 devnull }
4205 7cf289ca 2004-04-06 devnull
4206 7cf289ca 2004-04-06 devnull static void
4207 7cf289ca 2004-04-06 devnull resetdocinfo(Docinfo* d)
4208 7cf289ca 2004-04-06 devnull {
4209 7cf289ca 2004-04-06 devnull memset(d, 0, sizeof(Docinfo));
4210 7cf289ca 2004-04-06 devnull d->background = makebackground(nil, White);
4211 7cf289ca 2004-04-06 devnull d->text = Black;
4212 7cf289ca 2004-04-06 devnull d->link = Blue;
4213 7cf289ca 2004-04-06 devnull d->vlink = Blue;
4214 7cf289ca 2004-04-06 devnull d->alink = Blue;
4215 7cf289ca 2004-04-06 devnull d->target = FTself;
4216 7cf289ca 2004-04-06 devnull d->chset = ISO_8859_1;
4217 7cf289ca 2004-04-06 devnull d->scripttype = TextJavascript;
4218 7cf289ca 2004-04-06 devnull d->frameid = -1;
4219 7cf289ca 2004-04-06 devnull }
4220 7cf289ca 2004-04-06 devnull
4221 cbeb0b26 2006-04-01 devnull /* Use targetmap array to keep track of name <-> targetid mapping. */
4222 cbeb0b26 2006-04-01 devnull /* Use real malloc(), and never free */
4223 7cf289ca 2004-04-06 devnull static void
4224 7cf289ca 2004-04-06 devnull targetmapinit(void)
4225 7cf289ca 2004-04-06 devnull {
4226 7cf289ca 2004-04-06 devnull targetmapsize = 10;
4227 7cf289ca 2004-04-06 devnull targetmap = (StringInt*)emalloc(targetmapsize*sizeof(StringInt));
4228 7cf289ca 2004-04-06 devnull memset(targetmap, 0, targetmapsize*sizeof(StringInt));
4229 7cf289ca 2004-04-06 devnull targetmap[0].key = _Strdup(L(L_top));
4230 7cf289ca 2004-04-06 devnull targetmap[0].val = FTtop;
4231 7cf289ca 2004-04-06 devnull targetmap[1].key = _Strdup(L(L_self));
4232 7cf289ca 2004-04-06 devnull targetmap[1].val = FTself;
4233 7cf289ca 2004-04-06 devnull targetmap[2].key = _Strdup(L(L_parent));
4234 7cf289ca 2004-04-06 devnull targetmap[2].val = FTparent;
4235 7cf289ca 2004-04-06 devnull targetmap[3].key = _Strdup(L(L_blank));
4236 7cf289ca 2004-04-06 devnull targetmap[3].val = FTblank;
4237 7cf289ca 2004-04-06 devnull ntargets = 4;
4238 7cf289ca 2004-04-06 devnull }
4239 7cf289ca 2004-04-06 devnull
4240 7cf289ca 2004-04-06 devnull int
4241 7cf289ca 2004-04-06 devnull targetid(Rune* s)
4242 7cf289ca 2004-04-06 devnull {
4243 7cf289ca 2004-04-06 devnull int i;
4244 7cf289ca 2004-04-06 devnull int n;
4245 7cf289ca 2004-04-06 devnull
4246 7cf289ca 2004-04-06 devnull n = _Strlen(s);
4247 7cf289ca 2004-04-06 devnull if(n == 0)
4248 7cf289ca 2004-04-06 devnull return FTself;
4249 7cf289ca 2004-04-06 devnull for(i = 0; i < ntargets; i++)
4250 7cf289ca 2004-04-06 devnull if(_Strcmp(s, targetmap[i].key) == 0)
4251 7cf289ca 2004-04-06 devnull return targetmap[i].val;
4252 7cf289ca 2004-04-06 devnull if(i >= targetmapsize) {
4253 7cf289ca 2004-04-06 devnull targetmapsize += 10;
4254 7cf289ca 2004-04-06 devnull targetmap = (StringInt*)erealloc(targetmap, targetmapsize*sizeof(StringInt));
4255 7cf289ca 2004-04-06 devnull }
4256 7cf289ca 2004-04-06 devnull targetmap[i].key = (Rune*)emalloc((n+1)*sizeof(Rune));
4257 7cf289ca 2004-04-06 devnull memmove(targetmap[i].key, s, (n+1)*sizeof(Rune));
4258 7cf289ca 2004-04-06 devnull targetmap[i].val = i;
4259 7cf289ca 2004-04-06 devnull ntargets++;
4260 7cf289ca 2004-04-06 devnull return i;
4261 7cf289ca 2004-04-06 devnull }
4262 7cf289ca 2004-04-06 devnull
4263 7cf289ca 2004-04-06 devnull Rune*
4264 7cf289ca 2004-04-06 devnull targetname(int targid)
4265 7cf289ca 2004-04-06 devnull {
4266 7cf289ca 2004-04-06 devnull int i;
4267 7cf289ca 2004-04-06 devnull
4268 7cf289ca 2004-04-06 devnull for(i = 0; i < ntargets; i++)
4269 7cf289ca 2004-04-06 devnull if(targetmap[i].val == targid)
4270 7cf289ca 2004-04-06 devnull return targetmap[i].key;
4271 7cf289ca 2004-04-06 devnull return L(Lquestion);
4272 7cf289ca 2004-04-06 devnull }
4273 7cf289ca 2004-04-06 devnull
4274 cbeb0b26 2006-04-01 devnull /* Convert HTML color spec to RGB value, returning dflt if can't. */
4275 cbeb0b26 2006-04-01 devnull /* Argument is supposed to be a valid HTML color, or "". */
4276 cbeb0b26 2006-04-01 devnull /* Return the RGB value of the color, using dflt if s */
4277 cbeb0b26 2006-04-01 devnull /* is nil or an invalid color. */
4278 7cf289ca 2004-04-06 devnull static int
4279 7cf289ca 2004-04-06 devnull color(Rune* s, int dflt)
4280 7cf289ca 2004-04-06 devnull {
4281 7cf289ca 2004-04-06 devnull int v;
4282 7cf289ca 2004-04-06 devnull Rune* rest;
4283 7cf289ca 2004-04-06 devnull
4284 7cf289ca 2004-04-06 devnull if(s == nil)
4285 7cf289ca 2004-04-06 devnull return dflt;
4286 7cf289ca 2004-04-06 devnull if(_lookup(color_tab, NCOLORS, s, _Strlen(s), &v))
4287 7cf289ca 2004-04-06 devnull return v;
4288 7cf289ca 2004-04-06 devnull if(s[0] == '#')
4289 7cf289ca 2004-04-06 devnull s++;
4290 7cf289ca 2004-04-06 devnull v = _Strtol(s, &rest, 16);
4291 7cf289ca 2004-04-06 devnull if(*rest == 0)
4292 7cf289ca 2004-04-06 devnull return v;
4293 7cf289ca 2004-04-06 devnull return dflt;
4294 7cf289ca 2004-04-06 devnull }
4295 7cf289ca 2004-04-06 devnull
4296 cbeb0b26 2006-04-01 devnull /* Debugging */
4297 7cf289ca 2004-04-06 devnull
4298 7cf289ca 2004-04-06 devnull #define HUGEPIX 10000
4299 7cf289ca 2004-04-06 devnull
4300 cbeb0b26 2006-04-01 devnull /* A "shallow" validitem, that doesn't follow next links */
4301 cbeb0b26 2006-04-01 devnull /* or descend into tables. */
4302 7cf289ca 2004-04-06 devnull static int
4303 7cf289ca 2004-04-06 devnull validitem(Item* i)
4304 7cf289ca 2004-04-06 devnull {
4305 7cf289ca 2004-04-06 devnull int ok;
4306 7cf289ca 2004-04-06 devnull Itext* ti;
4307 7cf289ca 2004-04-06 devnull Irule* ri;
4308 7cf289ca 2004-04-06 devnull Iimage* ii;
4309 7cf289ca 2004-04-06 devnull Ifloat* fi;
4310 7cf289ca 2004-04-06 devnull int a;
4311 7cf289ca 2004-04-06 devnull
4312 7cf289ca 2004-04-06 devnull ok = (i->tag >= Itexttag && i->tag <= Ispacertag) &&
4313 7cf289ca 2004-04-06 devnull (i->next == nil || validptr(i->next)) &&
4314 7cf289ca 2004-04-06 devnull (i->width >= 0 && i->width < HUGEPIX) &&
4315 7cf289ca 2004-04-06 devnull (i->height >= 0 && i->height < HUGEPIX) &&
4316 7cf289ca 2004-04-06 devnull (i->ascent > -HUGEPIX && i->ascent < HUGEPIX) &&
4317 7cf289ca 2004-04-06 devnull (i->anchorid >= 0) &&
4318 7cf289ca 2004-04-06 devnull (i->genattr == nil || validptr(i->genattr));
4319 cbeb0b26 2006-04-01 devnull /* also, could check state for ridiculous combinations */
4320 cbeb0b26 2006-04-01 devnull /* also, could check anchorid for within-doc-range */
4321 7cf289ca 2004-04-06 devnull if(ok)
4322 7cf289ca 2004-04-06 devnull switch(i->tag) {
4323 7cf289ca 2004-04-06 devnull case Itexttag:
4324 7cf289ca 2004-04-06 devnull ti = (Itext*)i;
4325 7cf289ca 2004-04-06 devnull ok = validStr(ti->s) &&
4326 7cf289ca 2004-04-06 devnull (ti->fnt >= 0 && ti->fnt < NumStyle*NumSize) &&
4327 7cf289ca 2004-04-06 devnull (ti->ul == ULnone || ti->ul == ULunder || ti->ul == ULmid);
4328 7cf289ca 2004-04-06 devnull break;
4329 7cf289ca 2004-04-06 devnull case Iruletag:
4330 7cf289ca 2004-04-06 devnull ri = (Irule*)i;
4331 7cf289ca 2004-04-06 devnull ok = (validvalign(ri->align) || validhalign(ri->align)) &&
4332 7cf289ca 2004-04-06 devnull (ri->size >=0 && ri->size < HUGEPIX);
4333 7cf289ca 2004-04-06 devnull break;
4334 7cf289ca 2004-04-06 devnull case Iimagetag:
4335 7cf289ca 2004-04-06 devnull ii = (Iimage*)i;
4336 7cf289ca 2004-04-06 devnull ok = (ii->imsrc == nil || validptr(ii->imsrc)) &&
4337 7cf289ca 2004-04-06 devnull (ii->item.width >= 0 && ii->item.width < HUGEPIX) &&
4338 7cf289ca 2004-04-06 devnull (ii->item.height >= 0 && ii->item.height < HUGEPIX) &&
4339 7cf289ca 2004-04-06 devnull (ii->imwidth >= 0 && ii->imwidth < HUGEPIX) &&
4340 7cf289ca 2004-04-06 devnull (ii->imheight >= 0 && ii->imheight < HUGEPIX) &&
4341 7cf289ca 2004-04-06 devnull (ii->altrep == nil || validStr(ii->altrep)) &&
4342 7cf289ca 2004-04-06 devnull (ii->map == nil || validptr(ii->map)) &&
4343 7cf289ca 2004-04-06 devnull (validvalign(ii->align) || validhalign(ii->align)) &&
4344 7cf289ca 2004-04-06 devnull (ii->nextimage == nil || validptr(ii->nextimage));
4345 7cf289ca 2004-04-06 devnull break;
4346 7cf289ca 2004-04-06 devnull case Iformfieldtag:
4347 7cf289ca 2004-04-06 devnull ok = validformfield(((Iformfield*)i)->formfield);
4348 7cf289ca 2004-04-06 devnull break;
4349 7cf289ca 2004-04-06 devnull case Itabletag:
4350 7cf289ca 2004-04-06 devnull ok = validptr((Itable*)i);
4351 7cf289ca 2004-04-06 devnull break;
4352 7cf289ca 2004-04-06 devnull case Ifloattag:
4353 7cf289ca 2004-04-06 devnull fi = (Ifloat*)i;
4354 7cf289ca 2004-04-06 devnull ok = (fi->side == ALleft || fi->side == ALright) &&
4355 7cf289ca 2004-04-06 devnull validitem(fi->item) &&
4356 7cf289ca 2004-04-06 devnull (fi->item->tag == Iimagetag || fi->item->tag == Itabletag);
4357 7cf289ca 2004-04-06 devnull break;
4358 7cf289ca 2004-04-06 devnull case Ispacertag:
4359 7cf289ca 2004-04-06 devnull a = ((Ispacer*)i)->spkind;
4360 7cf289ca 2004-04-06 devnull ok = a==ISPnull || a==ISPvline || a==ISPhspace || a==ISPgeneral;
4361 7cf289ca 2004-04-06 devnull break;
4362 7cf289ca 2004-04-06 devnull default:
4363 7cf289ca 2004-04-06 devnull ok = 0;
4364 7cf289ca 2004-04-06 devnull }
4365 7cf289ca 2004-04-06 devnull return ok;
4366 7cf289ca 2004-04-06 devnull }
4367 7cf289ca 2004-04-06 devnull
4368 cbeb0b26 2006-04-01 devnull /* "deep" validation, that checks whole list of items, */
4369 cbeb0b26 2006-04-01 devnull /* and descends into tables and floated tables. */
4370 cbeb0b26 2006-04-01 devnull /* nil is ok for argument. */
4371 7cf289ca 2004-04-06 devnull int
4372 7cf289ca 2004-04-06 devnull validitems(Item* i)
4373 7cf289ca 2004-04-06 devnull {
4374 7cf289ca 2004-04-06 devnull int ok;
4375 7cf289ca 2004-04-06 devnull Item* ii;
4376 7cf289ca 2004-04-06 devnull
4377 7cf289ca 2004-04-06 devnull ok = 1;
4378 7cf289ca 2004-04-06 devnull while(i != nil && ok) {
4379 7cf289ca 2004-04-06 devnull ok = validitem(i);
4380 7cf289ca 2004-04-06 devnull if(ok) {
4381 7cf289ca 2004-04-06 devnull if(i->tag == Itabletag) {
4382 7cf289ca 2004-04-06 devnull ok = validtable(((Itable*)i)->table);
4383 7cf289ca 2004-04-06 devnull }
4384 7cf289ca 2004-04-06 devnull else if(i->tag == Ifloattag) {
4385 7cf289ca 2004-04-06 devnull ii = ((Ifloat*)i)->item;
4386 7cf289ca 2004-04-06 devnull if(ii->tag == Itabletag)
4387 7cf289ca 2004-04-06 devnull ok = validtable(((Itable*)ii)->table);
4388 7cf289ca 2004-04-06 devnull }
4389 7cf289ca 2004-04-06 devnull }
4390 7cf289ca 2004-04-06 devnull if(!ok) {
4391 7cf289ca 2004-04-06 devnull fprint(2, "invalid item: %I\n", i);
4392 7cf289ca 2004-04-06 devnull }
4393 7cf289ca 2004-04-06 devnull i = i->next;
4394 7cf289ca 2004-04-06 devnull }
4395 7cf289ca 2004-04-06 devnull return ok;
4396 7cf289ca 2004-04-06 devnull }
4397 7cf289ca 2004-04-06 devnull
4398 7cf289ca 2004-04-06 devnull static int
4399 7cf289ca 2004-04-06 devnull validformfield(Formfield* f)
4400 7cf289ca 2004-04-06 devnull {
4401 7cf289ca 2004-04-06 devnull int ok;
4402 7cf289ca 2004-04-06 devnull
4403 7cf289ca 2004-04-06 devnull ok = (f->next == nil || validptr(f->next)) &&
4404 7cf289ca 2004-04-06 devnull (f->ftype >= 0 && f->ftype <= Ftextarea) &&
4405 7cf289ca 2004-04-06 devnull f->fieldid >= 0 &&
4406 7cf289ca 2004-04-06 devnull (f->form == nil || validptr(f->form)) &&
4407 7cf289ca 2004-04-06 devnull (f->name == nil || validStr(f->name)) &&
4408 7cf289ca 2004-04-06 devnull (f->value == nil || validStr(f->value)) &&
4409 7cf289ca 2004-04-06 devnull (f->options == nil || validptr(f->options)) &&
4410 7cf289ca 2004-04-06 devnull (f->image == nil || validitem(f->image)) &&
4411 7cf289ca 2004-04-06 devnull (f->events == nil || validptr(f->events));
4412 cbeb0b26 2006-04-01 devnull /* when all built, should have f->fieldid < f->form->nfields, */
4413 cbeb0b26 2006-04-01 devnull /* but this may be called during build... */
4414 7cf289ca 2004-04-06 devnull return ok;
4415 7cf289ca 2004-04-06 devnull }
4416 7cf289ca 2004-04-06 devnull
4417 cbeb0b26 2006-04-01 devnull /* "deep" validation -- checks cell contents too */
4418 7cf289ca 2004-04-06 devnull static int
4419 7cf289ca 2004-04-06 devnull validtable(Table* t)
4420 7cf289ca 2004-04-06 devnull {
4421 7cf289ca 2004-04-06 devnull int ok;
4422 7cf289ca 2004-04-06 devnull int i, j;
4423 7cf289ca 2004-04-06 devnull Tablecell* c;
4424 7cf289ca 2004-04-06 devnull
4425 7cf289ca 2004-04-06 devnull ok = (t->next == nil || validptr(t->next)) &&
4426 7cf289ca 2004-04-06 devnull t->nrow >= 0 &&
4427 7cf289ca 2004-04-06 devnull t->ncol >= 0 &&
4428 7cf289ca 2004-04-06 devnull t->ncell >= 0 &&
4429 7cf289ca 2004-04-06 devnull validalign(t->align) &&
4430 7cf289ca 2004-04-06 devnull validdimen(t->width) &&
4431 7cf289ca 2004-04-06 devnull (t->border >= 0 && t->border < HUGEPIX) &&
4432 7cf289ca 2004-04-06 devnull (t->cellspacing >= 0 && t->cellspacing < HUGEPIX) &&
4433 7cf289ca 2004-04-06 devnull (t->cellpadding >= 0 && t->cellpadding < HUGEPIX) &&
4434 7cf289ca 2004-04-06 devnull validitems(t->caption) &&
4435 7cf289ca 2004-04-06 devnull (t->caption_place == ALtop || t->caption_place == ALbottom) &&
4436 7cf289ca 2004-04-06 devnull (t->totw >= 0 && t->totw < HUGEPIX) &&
4437 7cf289ca 2004-04-06 devnull (t->toth >= 0 && t->toth < HUGEPIX) &&
4438 7cf289ca 2004-04-06 devnull (t->tabletok == nil || validptr(t->tabletok));
4439 cbeb0b26 2006-04-01 devnull /* during parsing, t->rows has list; */
4440 cbeb0b26 2006-04-01 devnull /* only when parsing is done is t->nrow set > 0 */
4441 7cf289ca 2004-04-06 devnull if(ok && t->nrow > 0 && t->ncol > 0) {
4442 cbeb0b26 2006-04-01 devnull /* table is "finished" */
4443 fa325e9b 2020-01-10 cross for(i = 0; i < t->nrow && ok; i++)
4444 7cf289ca 2004-04-06 devnull ok = validtablerow(t->rows+i);
4445 7cf289ca 2004-04-06 devnull for(j = 0; j < t->ncol && ok; j++)
4446 7cf289ca 2004-04-06 devnull ok = validtablecol(t->cols+j);
4447 7cf289ca 2004-04-06 devnull for(c = t->cells; c != nil && ok; c = c->next)
4448 7cf289ca 2004-04-06 devnull ok = validtablecell(c);
4449 7cf289ca 2004-04-06 devnull for(i = 0; i < t->nrow && ok; i++)
4450 7cf289ca 2004-04-06 devnull for(j = 0; j < t->ncol && ok; j++)
4451 7cf289ca 2004-04-06 devnull ok = validptr(t->grid[i][j]);
4452 7cf289ca 2004-04-06 devnull }
4453 7cf289ca 2004-04-06 devnull return ok;
4454 7cf289ca 2004-04-06 devnull }
4455 7cf289ca 2004-04-06 devnull
4456 7cf289ca 2004-04-06 devnull static int
4457 7cf289ca 2004-04-06 devnull validvalign(int a)
4458 7cf289ca 2004-04-06 devnull {
4459 7cf289ca 2004-04-06 devnull return a == ALnone || a == ALmiddle || a == ALbottom || a == ALtop || a == ALbaseline;
4460 7cf289ca 2004-04-06 devnull }
4461 7cf289ca 2004-04-06 devnull
4462 7cf289ca 2004-04-06 devnull static int
4463 7cf289ca 2004-04-06 devnull validhalign(int a)
4464 7cf289ca 2004-04-06 devnull {
4465 7cf289ca 2004-04-06 devnull return a == ALnone || a == ALleft || a == ALcenter || a == ALright ||
4466 7cf289ca 2004-04-06 devnull a == ALjustify || a == ALchar;
4467 7cf289ca 2004-04-06 devnull }
4468 7cf289ca 2004-04-06 devnull
4469 7cf289ca 2004-04-06 devnull static int
4470 7cf289ca 2004-04-06 devnull validalign(Align a)
4471 7cf289ca 2004-04-06 devnull {
4472 7cf289ca 2004-04-06 devnull return validhalign(a.halign) && validvalign(a.valign);
4473 7cf289ca 2004-04-06 devnull }
4474 7cf289ca 2004-04-06 devnull
4475 7cf289ca 2004-04-06 devnull static int
4476 7cf289ca 2004-04-06 devnull validdimen(Dimen d)
4477 7cf289ca 2004-04-06 devnull {
4478 7cf289ca 2004-04-06 devnull int ok;
4479 7cf289ca 2004-04-06 devnull int s;
4480 7cf289ca 2004-04-06 devnull
4481 7cf289ca 2004-04-06 devnull ok = 0;
4482 7cf289ca 2004-04-06 devnull s = d.kindspec&Dspecmask;
4483 7cf289ca 2004-04-06 devnull switch(d.kindspec&Dkindmask) {
4484 7cf289ca 2004-04-06 devnull case Dnone:
4485 7cf289ca 2004-04-06 devnull ok = s==0;
4486 7cf289ca 2004-04-06 devnull break;
4487 7cf289ca 2004-04-06 devnull case Dpixels:
4488 7cf289ca 2004-04-06 devnull ok = s < HUGEPIX;
4489 7cf289ca 2004-04-06 devnull break;
4490 7cf289ca 2004-04-06 devnull case Dpercent:
4491 7cf289ca 2004-04-06 devnull case Drelative:
4492 7cf289ca 2004-04-06 devnull ok = 1;
4493 7cf289ca 2004-04-06 devnull break;
4494 7cf289ca 2004-04-06 devnull }
4495 7cf289ca 2004-04-06 devnull return ok;
4496 7cf289ca 2004-04-06 devnull }
4497 7cf289ca 2004-04-06 devnull
4498 7cf289ca 2004-04-06 devnull static int
4499 7cf289ca 2004-04-06 devnull validtablerow(Tablerow* r)
4500 7cf289ca 2004-04-06 devnull {
4501 7cf289ca 2004-04-06 devnull return (r->cells == nil || validptr(r->cells)) &&
4502 7cf289ca 2004-04-06 devnull (r->height >= 0 && r->height < HUGEPIX) &&
4503 7cf289ca 2004-04-06 devnull (r->ascent > -HUGEPIX && r->ascent < HUGEPIX) &&
4504 7cf289ca 2004-04-06 devnull validalign(r->align);
4505 7cf289ca 2004-04-06 devnull }
4506 7cf289ca 2004-04-06 devnull
4507 7cf289ca 2004-04-06 devnull static int
4508 7cf289ca 2004-04-06 devnull validtablecol(Tablecol* c)
4509 7cf289ca 2004-04-06 devnull {
4510 7cf289ca 2004-04-06 devnull return c->width >= 0 && c->width < HUGEPIX
4511 7cf289ca 2004-04-06 devnull && validalign(c->align);
4512 7cf289ca 2004-04-06 devnull }
4513 7cf289ca 2004-04-06 devnull
4514 7cf289ca 2004-04-06 devnull static int
4515 7cf289ca 2004-04-06 devnull validtablecell(Tablecell* c)
4516 7cf289ca 2004-04-06 devnull {
4517 7cf289ca 2004-04-06 devnull int ok;
4518 7cf289ca 2004-04-06 devnull
4519 7cf289ca 2004-04-06 devnull ok = (c->next == nil || validptr(c->next)) &&
4520 7cf289ca 2004-04-06 devnull (c->nextinrow == nil || validptr(c->nextinrow)) &&
4521 7cf289ca 2004-04-06 devnull (c->content == nil || validptr(c->content)) &&
4522 7cf289ca 2004-04-06 devnull (c->lay == nil || validptr(c->lay)) &&
4523 7cf289ca 2004-04-06 devnull c->rowspan >= 0 &&
4524 7cf289ca 2004-04-06 devnull c->colspan >= 0 &&
4525 7cf289ca 2004-04-06 devnull validalign(c->align) &&
4526 7cf289ca 2004-04-06 devnull validdimen(c->wspec) &&
4527 7cf289ca 2004-04-06 devnull c->row >= 0 &&
4528 7cf289ca 2004-04-06 devnull c->col >= 0;
4529 7cf289ca 2004-04-06 devnull if(ok) {
4530 7cf289ca 2004-04-06 devnull if(c->content != nil)
4531 7cf289ca 2004-04-06 devnull ok = validitems(c->content);
4532 7cf289ca 2004-04-06 devnull }
4533 7cf289ca 2004-04-06 devnull return ok;
4534 7cf289ca 2004-04-06 devnull }
4535 7cf289ca 2004-04-06 devnull
4536 7cf289ca 2004-04-06 devnull static int
4537 7cf289ca 2004-04-06 devnull validptr(void* p)
4538 7cf289ca 2004-04-06 devnull {
4539 cbeb0b26 2006-04-01 devnull /* TODO: a better job of this. */
4540 cbeb0b26 2006-04-01 devnull /* For now, just dereference, which cause a bomb */
4541 cbeb0b26 2006-04-01 devnull /* if not valid */
4542 7cf289ca 2004-04-06 devnull static char c;
4543 7cf289ca 2004-04-06 devnull
4544 7cf289ca 2004-04-06 devnull c = *((char*)p);
4545 c5bfba48 2012-10-21 rsc USED(c);
4546 7cf289ca 2004-04-06 devnull return 1;
4547 7cf289ca 2004-04-06 devnull }
4548 7cf289ca 2004-04-06 devnull
4549 7cf289ca 2004-04-06 devnull static int
4550 7cf289ca 2004-04-06 devnull validStr(Rune* s)
4551 7cf289ca 2004-04-06 devnull {
4552 7cf289ca 2004-04-06 devnull return s != nil && validptr(s);
4553 7cf289ca 2004-04-06 devnull }