Annotation of libwww/Library/src/HTMLPDTD.c, revision 2.18
2.12 frystyk 1: /* HTMLPDTD.c
2: ** STATIC DTD FOR HTML
3: **
2.16 frystyk 4: ** (c) COPYRIGHT MIT 1995.
2.12 frystyk 5: ** Please first read the full copyright statement in the file COPYRIGH.
2.1 timbl 6: **
7: ** 6 Nov 93 MD Increased size of img_attr array to make space
8: ** for terminator.
9: */
10:
2.14 frystyk 11: /* Library include files */
12: #include "tcp.h"
13: #include "HTUtils.h"
2.1 timbl 14: #include "HTMLPDTD.h"
15:
16: /* Entity Names
17: ** ------------
18: **
19: ** This table must be matched exactly with ALL the translation tables
20: */
2.11 timbl 21:
2.17 frystyk 22: PRIVATE CONST char* entities[HTML_ENTITIES] = {
2.1 timbl 23: "AElig", /* capital AE diphthong (ligature) */
24: "Aacute", /* capital A, acute accent */
25: "Acirc", /* capital A, circumflex accent */
26: "Agrave", /* capital A, grave accent */
27: "Aring", /* capital A, ring */
28: "Atilde", /* capital A, tilde */
29: "Auml", /* capital A, dieresis or umlaut mark */
30: "Ccedil", /* capital C, cedilla */
31: "ETH", /* capital Eth, Icelandic */
32: "Eacute", /* capital E, acute accent */
33: "Ecirc", /* capital E, circumflex accent */
34: "Egrave", /* capital E, grave accent */
35: "Euml", /* capital E, dieresis or umlaut mark */
36: "Iacute", /* capital I, acute accent */
37: "Icirc", /* capital I, circumflex accent */
38: "Igrave", /* capital I, grave accent */
39: "Iuml", /* capital I, dieresis or umlaut mark */
40: "Ntilde", /* capital N, tilde */
41: "Oacute", /* capital O, acute accent */
42: "Ocirc", /* capital O, circumflex accent */
43: "Ograve", /* capital O, grave accent */
44: "Oslash", /* capital O, slash */
45: "Otilde", /* capital O, tilde */
46: "Ouml", /* capital O, dieresis or umlaut mark */
47: "THORN", /* capital THORN, Icelandic */
48: "Uacute", /* capital U, acute accent */
49: "Ucirc", /* capital U, circumflex accent */
50: "Ugrave", /* capital U, grave accent */
51: "Uuml", /* capital U, dieresis or umlaut mark */
52: "Yacute", /* capital Y, acute accent */
53: "aacute", /* small a, acute accent */
54: "acirc", /* small a, circumflex accent */
55: "aelig", /* small ae diphthong (ligature) */
56: "agrave", /* small a, grave accent */
57: "amp", /* ampersand */
58: "aring", /* small a, ring */
59: "atilde", /* small a, tilde */
60: "auml", /* small a, dieresis or umlaut mark */
61: "ccedil", /* small c, cedilla */
62: "eacute", /* small e, acute accent */
63: "ecirc", /* small e, circumflex accent */
64: "egrave", /* small e, grave accent */
65: "eth", /* small eth, Icelandic */
66: "euml", /* small e, dieresis or umlaut mark */
67: "gt", /* greater than */
68: "iacute", /* small i, acute accent */
69: "icirc", /* small i, circumflex accent */
70: "igrave", /* small i, grave accent */
71: "iuml", /* small i, dieresis or umlaut mark */
72: "lt", /* less than */
73: "ntilde", /* small n, tilde */
74: "oacute", /* small o, acute accent */
75: "ocirc", /* small o, circumflex accent */
76: "ograve", /* small o, grave accent */
77: "oslash", /* small o, slash */
78: "otilde", /* small o, tilde */
2.10 timbl 79: "ouml", /* small o, dieresis or umlaut mark */
80: "quot", /* double quote sign - June 1994 */
2.1 timbl 81: "szlig", /* small sharp s, German (sz ligature) */
82: "thorn", /* small thorn, Icelandic */
83: "uacute", /* small u, acute accent */
84: "ucirc", /* small u, circumflex accent */
85: "ugrave", /* small u, grave accent */
86: "uuml", /* small u, dieresis or umlaut mark */
87: "yacute", /* small y, acute accent */
88: "yuml", /* small y, dieresis or umlaut mark */
89: };
90:
91:
92:
93: /* Attribute Lists
94: ** ---------------
95: **
96: ** Lists must be in alphatbetical order by attribute name
97: ** The tag elements contain the number of attributes
98: */
2.17 frystyk 99: PRIVATE attr no_attr[1] =
2.1 timbl 100: {{ 0 }};
101:
2.17 frystyk 102: PRIVATE attr a_attr[HTML_A_ATTRIBUTES+1] = { /* Anchor attributes */
2.1 timbl 103: { "EFFECT" },
104: { "HREF"},
105: { "ID" },
106: { "METHODS" },
107: { "NAME" }, /* Should be ID */
108: { "PRINT" },
109: { "REL" }, /* Relationship */
110: { "REV" }, /* Reverse relationship */
111: { "SHAPE" },
112: { "TITLE" },
113: { 0 } /* Terminate list */
114: };
115:
2.17 frystyk 116: PRIVATE attr base_attr[] = { /* BASE attributes */
2.1 timbl 117: { "HREF"},
118: { 0 } /* Terminate list */
119: };
120:
121:
2.17 frystyk 122: PRIVATE attr changed_attr[] = {
2.1 timbl 123: { "ID" },
124: { "IDREF" },
125: { 0 } /* terminate list */
126: };
127:
2.17 frystyk 128: PRIVATE attr fig_attr[] = { /* Figures */
2.1 timbl 129: { "ALIGN" },
130: { "ID" },
131: { "INDEX" },
132: { "ISMAP" }, /* @@@ NO! */
133: { "LANG" },
134: { "SRC" },
135: { 0 } /* terminate list */
136: };
137:
2.17 frystyk 138: PRIVATE attr form_attr[] = { /* General, for many things */
2.1 timbl 139: { "ACTION" },
140: { "ID" },
141: { "INDEX" },
142: { "LANG" },
143: { "METHOD" },
144: { 0 } /* terminate list */
145: };
146:
2.17 frystyk 147: PRIVATE attr gen_attr[] = { /* General, for many things */
2.1 timbl 148: { "ID" },
149: { "INDEX" },
150: { "LANG" },
151: { 0 } /* terminate list */
152: };
153:
2.17 frystyk 154: PRIVATE attr htmlplus_attr[] = { /* wrapper HTMLPLUS */
2.1 timbl 155: { "FORMS" },
156: { "VERSION" },
157: { 0 } /* terminate list */
158: };
159:
2.17 frystyk 160: PRIVATE attr id_attr[2] = {
2.1 timbl 161: { "ID" },
162: { 0 } /* terminate list */
163: };
164:
2.17 frystyk 165: PRIVATE attr image_attr[HTML_IMAGE_ATTRIBUTES+1] = { /* Image attributes */
2.1 timbl 166: { "ALIGN" },
167: { "ISMAP"}, /* Use HTTP SpaceJump instead */
168: { "LANG" },
169: { "SEETHRU"},
170: { "SRC"},
171: { 0 } /* Terminate list */
172: };
173:
2.17 frystyk 174: PRIVATE attr img_attr[HTML_IMG_ATTRIBUTES+1] = { /* IMG attributes */
2.1 timbl 175: { "ALIGN" },
176: { "ALT" },
177: { "ISMAP"}, /* Use HTTP SpaceJump instead */
178: { "SEETHRU"},
179: { "SRC"},
180: { 0 } /* Terminate list */
181: };
182:
2.17 frystyk 183: PRIVATE attr input_attr[HTML_INPUT_ATTRIBUTES+1] = {
2.1 timbl 184: { "ALIGN" },
185: { "CHECKED" },
186: { "DISABLED" },
187: { "ERROR" },
2.15 frystyk 188: { "MAXLENGTH" }, /* WSM bug fix, was MAX */
2.1 timbl 189: { "MIN" },
190: { "NAME" },
191: { "SIZE" },
192: { "SRC" },
193: { "TYPE" },
194: { "VALUE" },
2.2 timbl 195: { "0" }
2.1 timbl 196: };
197:
2.17 frystyk 198: PRIVATE attr l_attr[] = {
2.1 timbl 199: { "ALIGN"},
200: { "ID" },
201: { "LANG" },
202: { "INDEX" },
203: { 0 } /* Terminate list */
204: };
205:
2.17 frystyk 206: PRIVATE attr li_attr[] = {
2.1 timbl 207: { "ID" },
208: { "LANG" },
209: { "INDEX" },
210: { "SRC"},
211: { 0 } /* Terminate list */
212: };
213:
2.17 frystyk 214: PRIVATE attr link_attr[HTML_LINK_ATTRIBUTES+1] = { /* link attributes */
2.1 timbl 215: { "HREF"},
216: { "IDREF" },
217: { "METHODS" },
218: { "REL" }, /* Relationship */
219: { "REV" }, /* Reverse relationship */
220: { 0 } /* Terminate list */
221: };
222:
2.17 frystyk 223: PRIVATE attr list_attr[] = {
2.1 timbl 224: { "COMPACT"},
225: { "ID" },
226: { "LANG" },
227: { "INDEX" },
228: { 0 } /* Terminate list */
229: };
230:
2.17 frystyk 231: PRIVATE attr glossary_attr[HTML_DL_ATTRIBUTES+1] = {
2.3 frystyk 232: { "ID" },
233: { "COMPACT " },
234: { "INDEX" },
2.1 timbl 235: { 0 } /* Terminate list */
236: };
237:
2.17 frystyk 238: PRIVATE attr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
2.1 timbl 239: { "N" },
240: { 0 } /* Terminate list */
241: };
242:
2.17 frystyk 243: PRIVATE attr note_attr[HTML_NOTE_ATTRIBUTES+1] = { /* Footnotes etc etc */
2.1 timbl 244: { "ID" },
245: { "INDEX" },
246: { "LANG" },
247: { "ROLE" },
248: { 0 } /* terminate list */
249: };
250:
2.17 frystyk 251: PRIVATE attr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
2.1 timbl 252: { "DISABLED" },
253: { "LANG" },
254: { "SELECTED" },
255: { 0 }
256: };
257:
2.17 frystyk 258: PRIVATE attr render_attr[HTML_RENDER_ATTRIBUTES+1] = {
2.1 timbl 259: { "STYLE" },
260: { "TAG" },
261: { 0 } /* Terminate list */
262: };
263:
2.17 frystyk 264: PRIVATE attr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
2.1 timbl 265: { "ERROR" },
266: { "LANG" },
2.15 frystyk 267: { "MULTIPLE" }, /* WSM bug fix, was SEVERAL */
2.1 timbl 268: { "NAME" },
2.15 frystyk 269: { "SIZE" }, /* WSM bug fix, missing */
2.1 timbl 270: { 0 },
271: };
272:
2.17 frystyk 273: PRIVATE attr tab_attr[HTML_TAB_ATTRIBUTES+1] = {
2.1 timbl 274: { "ALIGN" },
275: { "AT" },
276: { 0 }
277: };
278:
2.17 frystyk 279: PRIVATE attr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
2.1 timbl 280: { "BORDER" },
281: { "ID" },
282: { "INDEX" },
283: { "LANG" },
284: { 0 }
285: };
286:
2.17 frystyk 287: PRIVATE attr td_attr[HTML_TD_ATTRIBUTES+1] = {
2.1 timbl 288: { "ALIGN" },
289: { "COLSPAN" },
290: { "ROWSPAN" },
291: { "TAG" },
292: { 0 }
293: };
294:
2.17 frystyk 295: PRIVATE attr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
2.1 timbl 296: { "COLS" },
297: { "DISABLED" },
298: { "ERROR" },
299: { "LANG" },
300: { "NAME" },
301: { "ROWS" },
302: { 0 }
303: };
304:
2.17 frystyk 305: PRIVATE attr ul_attr[HTML_UL_ATTRIBUTES+1] = {
2.1 timbl 306: { "COMPACT" },
307: { "ID" },
308: { "INDEX" },
309: { "LANG" },
310: { "PLAIN" },
311: { "WRAP" },
312: { 0 }
313: };
314:
315:
316: /* Elements
317: ** --------
318: **
319: ** Must match definitions in HTMLPDTD.html!
320: ** Must be in alphabetical order.
321: **
322: ** HTML is included to allow HTML documents to be parsed as a subset.
2.4 frystyk 323: ** TITLE is changed to type SGML_MIXED so it get parsed as well
324: ** Henrik 08/03-94
2.1 timbl 325: **
326: ** Name, Attributes, content
327: */
2.17 frystyk 328: PRIVATE HTTag tags[HTMLP_ELEMENTS] = {
2.1 timbl 329: { "A" , a_attr, HTML_A_ATTRIBUTES, SGML_MIXED },
330: { "ABBREV" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
331: { "ABSTRACT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
332: { "ACRONYM" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
333: { "ADDED" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
334: { "ADDRESS" , no_attr, 0, SGML_MIXED },
335: { "ARG" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
336: { "B" , no_attr, 0, SGML_MIXED },
337: { "BASE" , base_attr, HTML_BASE_ATTRIBUTES, SGML_MIXED },
338: { "BLOCKQUOTE", no_attr, 0, SGML_MIXED },
339: { "BODY" , no_attr, 0, SGML_MIXED },
340: { "BOX" , no_attr, 0, SGML_MIXED },
341: { "BR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
342: { "BYLINE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
343: { "CAPTION" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
344: { "CHANGED" , changed_attr, HTML_CHANGED_ATTRIBUTES, SGML_MIXED },
345: { "CITE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
346: { "CMD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
347: { "CODE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
348: { "COMMENT" , no_attr, 0, SGML_MIXED },
349: { "DD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
350: { "DFN" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
351: { "DIR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
352: { "DL" , glossary_attr,HTML_DL_ATTRIBUTES, SGML_MIXED },
353: { "DT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
354: { "EM" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
355: { "FIG" , fig_attr, HTML_FIG_ATTRIBUTES, SGML_MIXED },
356: { "FOOTNOTE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
357: { "FORM" , form_attr, HTML_FORM_ATTRIBUTES, SGML_MIXED },
358: { "H1" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
359: { "H2" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
360: { "H3" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
361: { "H4" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
362: { "H5" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
363: { "H6" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
364: { "H7" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
365: { "HEAD" , no_attr, 0, SGML_MIXED },
366: { "HR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
367: { "HTML" , no_attr, 0, SGML_MIXED }, /* */
2.2 timbl 368: { "HTMLPLUS", htmlplus_attr,HTML_HTMLPLUS_ATTRIBUTES, SGML_MIXED },
2.1 timbl 369: { "I" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
370: { "IMAGE" , image_attr, HTML_IMAGE_ATTRIBUTES, SGML_EMPTY },
2.7 frystyk 371: { "IMG" , img_attr, HTML_IMG_ATTRIBUTES, SGML_EMPTY },
2.1 timbl 372: { "INPUT" , input_attr, HTML_INPUT_ATTRIBUTES, SGML_EMPTY },
373: { "ISINDEX" , no_attr, 0, SGML_EMPTY },
374: { "KBD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
375: { "L" , l_attr, HTML_L_ATTRIBUTES, SGML_MIXED },
376: { "LI" , li_attr, HTML_LI_ATTRIBUTES, SGML_EMPTY },
377: { "LINK" , link_attr, HTML_LINK_ATTRIBUTES, SGML_EMPTY },
378: { "LISTING" , no_attr, 0, SGML_LITERAL },
379: { "LIT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
380: { "MARGIN" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
381: { "MATH" , id_attr, HTML_ID_ATTRIBUTE, SGML_MIXED },
382: { "MENU" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
383: { "NEXTID" , nextid_attr, 1, SGML_EMPTY },
384: { "NOTE" , note_attr, HTML_NOTE_ATTRIBUTES, SGML_EMPTY },
385: { "OL" , list_attr, HTML_LIST_ATTRIBUTES, SGML_MIXED },
2.8 timbl 386: { "OPTION" , option_attr, HTML_OPTION_ATTRIBUTES, SGML_EMPTY },/*Mixed?*/
2.1 timbl 387: { "OVER" , no_attr, 0, SGML_MIXED },
388: { "P" , l_attr, HTML_L_ATTRIBUTES, SGML_EMPTY },
389: { "PERSON" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
390: { "PLAINTEXT", no_attr, 0, SGML_LITERAL },
391: { "PRE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
392: { "Q" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
393: { "QUOTE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
394: { "RENDER" , render_attr, HTML_RENDER_ATTRIBUTES, SGML_MIXED },
395: { "REMOVED" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
396: { "S" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
397: { "SAMP" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
398: { "SELECT" , select_attr, HTML_SELECT_ATTRIBUTES, SGML_MIXED },
399: { "STRONG" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
400: { "SUB" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
401: { "SUP" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
402: { "TAB" , tab_attr, HTML_TAB_ATTRIBUTES, SGML_EMPTY },
403: { "TABLE" , table_attr, HTML_TABLE_ATTRIBUTES, SGML_MIXED },
404: { "TD" , td_attr, HTML_TABLE_ATTRIBUTES, SGML_MIXED },
405: { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES,SGML_MIXED},
406: { "TH" , td_attr, HTML_TD_ATTRIBUTES, SGML_MIXED },
2.4 frystyk 407: { "TITLE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
2.1 timbl 408: { "TR" , id_attr, HTML_ID_ATTRIBUTE, SGML_MIXED },
409: { "TT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
410: { "U" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
411: { "UL" , ul_attr, HTML_UL_ATTRIBUTES, SGML_MIXED },
412: { "VAR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
413: { "XMP" , no_attr, 0, SGML_LITERAL }
414: };
415:
416:
417: PUBLIC CONST SGML_dtd HTMLP_dtd = {
2.18 ! frystyk 418: tags,
! 419: HTMLP_ELEMENTS,
! 420: entities,
! 421: sizeof(entities)/sizeof(char**)
2.1 timbl 422: };
423:
424: /* Utility Routine: useful for people building HTML objects */
425:
426: /* Start anchor element
427: ** --------------------
428: **
429: ** It is kinda convenient to have a particulr routine for
430: ** starting an anchor element, as everything else for HTML is
431: ** simple anyway.
432: */
433: struct _HTStructured {
434: HTStructuredClass * isa;
435: /* ... */
436: };
437:
2.17 frystyk 438: PUBLIC void HTStartAnchor (HTStructured * obj,
439: CONST char * name,
440: CONST char * href)
2.1 timbl 441: {
442: BOOL present[HTML_A_ATTRIBUTES];
443: CONST char* value[HTML_A_ATTRIBUTES];
444:
445: {
446: int i;
447: for(i=0; i<HTML_A_ATTRIBUTES; i++)
448: present[i] = NO;
449: }
450: if (name) {
451: present[HTML_A_NAME] = YES;
452: value[HTML_A_NAME] = name;
453: }
454: if (href) {
455: present[HTML_A_HREF] = YES;
456: value[HTML_A_HREF] = href;
457: }
458:
459: (*obj->isa->start_element)(obj, HTML_A , present, value);
460:
461: }
462:
2.5 frystyk 463: /* Utility Routine: useful for people building HTML objects */
464:
465: /* Put image element
466: ** --------------------
467: **
468: ** Hopefully as usefull as HTStartAnchor. Henrik 23/03-94
469: */
2.17 frystyk 470: PUBLIC void HTMLPutImg (HTStructured * obj,
471: CONST char * src,
472: CONST char * alt,
473: CONST char * align)
2.5 frystyk 474: {
475: BOOL present[HTML_IMG_ATTRIBUTES];
476: CONST char* value[HTML_IMG_ATTRIBUTES];
477:
478: {
479: int i;
480: for(i=0; i<HTML_IMG_ATTRIBUTES; i++)
481: present[i] = NO;
482: }
483: if (src) {
484: present[HTML_IMG_SRC] = YES;
485: value[HTML_IMG_SRC] = src;
486: }
487: if (alt) {
488: present[HTML_IMG_ALT] = YES;
489: value[HTML_IMG_ALT] = alt;
490: }
491: if (align) {
492: present[HTML_IMG_ALIGN] = YES;
493: value[HTML_IMG_ALIGN] = align;
494: }
495: (*obj->isa->start_element)(obj, HTML_IMG , present, value);
2.7 frystyk 496: /* (*obj->isa->end_element)(obj, HTML_IMG); */
2.5 frystyk 497: }
498:
499:
2.17 frystyk 500: PUBLIC void HTNextID (HTStructured * obj,
501: CONST char * next_one)
2.1 timbl 502: {
503: BOOL present[HTML_NEXTID_ATTRIBUTES];
504: CONST char* value[HTML_NEXTID_ATTRIBUTES];
505: {
506: int i;
507: for(i=0; i<HTML_NEXTID_ATTRIBUTES; i++)
508: present[i] = NO;
509: }
510: present[HTML_NEXTID_N] = YES;
2.9 timbl 511: value[HTML_NEXTID_N] = next_one;
2.1 timbl 512:
513: (*obj->isa->start_element)(obj, HTML_NEXTID , present, value);
514:
515: }
Webmaster