Annotation of libwww/Library/src/HTMLPDTD.c, revision 2.1

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

Webmaster