The following aspects are from Dan Connolly's suggestions: Binary search, Strcutured object scheme basically, SGML content enum type.
The module is a part of the CERN Common WWW Library (c) Copyright CERN 1991 - See Copyright.html
#ifndef SGML_H #define SGML_H #include "HTUtils.h" #include "HTStream.h"
typedef enum _SGMLContent{ SGML_EMPTY, /* no content */ SGML_LITERAL, /* character data. Recognized exact close tag only. Old www server compatibility only! Not SGML */ SGML_CDATA, /* character data. recognize </ only */ SGML_RCDATA, /* replaceable character data. recognize </ and &ref; */ SGML_MIXED, /* elements and parsed character data. recognize all markup */ SGML_ELEMENT /* any data found will be returned as an error*/ } SGMLContent; typedef struct { char * name; /* The (constant) name of the attribute */ /* Could put type info in here */ } attr; /* A tag structure describes an SGML element. ** ----------------------------------------- ** ** ** name is the string which comes after the tag opener "<". ** ** attributes points to a zero-terminated array ** of attribute names. ** ** litteral determines how the SGML engine parses the charaters ** within the element. If set, tag openers are ignored ** except for that which opens a matching closing tag. ** */ typedef struct _tag HTTag; struct _tag{ char * name; /* The name of the tag */ attr * attributes; /* The list of acceptable attributes */ int number_of_attributes; /* Number of possible attributes */ SGMLContent contents; /* End only on end tag @@ */ }; /* DTD Information ** --------------- ** ** Not the whole DTD, but all this parser usues of it. */ typedef struct { HTTag * tags; /* Must be in strcmp order by name */ int number_of_tags; CONST char ** entity_names; /* Must be in strcmp order by name */ int number_of_entities; } SGML_dtd; #define MAX_ATTRIBUTES 20 /* Max number of attributes per element */ /* SGML context passed to parsers */ typedef struct _HTSGMLContext *HTSGMLContext; /* Hidden */ /*__________________________________________________________________________ */
Superclass: HTStream
The creation methods will vary on the type of Structured Object.Maybe the callerData is enough info to pass along.
typedef struct _HTStructured HTStructured; typedef struct _HTStructuredClass{ char* name; /* Just for diagnostics */ void (*_free) PARAMS(( HTStructured* me)); void (*abort) PARAMS(( HTStructured* me, HTError e)); void (*put_character) PARAMS(( HTStructured* me, char ch)); void (*put_string) PARAMS(( HTStructured* me, CONST char * str)); void (*write) PARAMS(( HTStructured* me, CONST char * str, int len)); void (*start_element) PARAMS(( HTStructured* me, int element_number, CONST BOOL* attribute_present, CONST char** attribute_value)); void (*end_element) PARAMS(( HTStructured* me, int element_number)); void (*put_entity) PARAMS(( HTStructured* me, int entity_number)); }HTStructuredClass;
extern HTTag * SGMLFindTag PARAMS((CONST SGML_dtd* dtd, CONST char * string));
extern int SGMLFindAttribute PARAMS((HTTag* tag, CONST char * string));
/* ** On entry, ** dtd must point to a DTD structure as defined above ** callbacks must point to user routines. ** callData is returned in callbacks transparently. ** On exit, ** The default tag starter has been processed. */ extern HTStream* SGML_new PARAMS(( CONST SGML_dtd * dtd, HTStructured * target)); extern CONST HTStreamClass SGMLParser; #endif /* SGML_H */