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