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 */