Listing 5 DFA.H

// Definitions and structs for DFA_CLASS object

// User-defined constants here;
// these are the defaults
#define LBR     '{'
#define RBR     '}'
#define GS      ':'
#define FS      '\\'
#define EOR     '\n'
#define TAB     '\t'
#define DOT     '.'
#define WSPACE     ' '
#define MAXBUFLEN  512

// Control modes for file operations
#define READ_TEXT       "rt"
#define READ_BINARY     "rb"
#define WRITE_TEXT      "wt"
#define WRITE_BINARY    "wb"

// DFA-specific constants are here,
//  and following. Dangerous to edit these.
#define GOOD    1
#define BAD 0
#define ERR    -1
#define OK  0
#define OUT 99
#define YES 1
#define NO  0
#define EMPTY  ((char) '\0')

// Definition of state table
// (a data table to the state machine)
typedef struct dfa {
   short (*target)(char*);    // validate token fcn
   short good;                // passed dest state
   short bad;                 // failed dest state
   short (*goodfcn)(char *);  // target passed
   short (*badfcn)(char*);    // target failed
} DFATBL;

// Definition of the state machinery:
typedef struct object {
// public-overidable elements
   DFATBL *tbl;    // ptr to the state table
   FILE *infile;   // input file to be parsed
   char *(*get_token)(struct object *); // tokenizer
   char *delim;        // ptr to string of delimiters
// Internal working variables
   short (*movest)(struct object *, short);
   short ndx;          // current index (substate)
   short oflag;        // general work flag
   char *wp;           // ptr into workbuf
   int cp;             // character holding area
   char workbuf[MAXBUFLEN];// working area
} DFA_CLASS;

extern DFA_CLASS *o;
extern short need_token;
extern short linenbr;
extern short StateMachine(DFA_CLASS *);
extern void InitStateMachine(DFA_CLASS *,
             void *, char *, FILE *, char *);

// declarations for DFA_CLASS functions
extern short block(char *);
extern short errmsg(char *);
extern char *get_token(DFA_CLASS *);
extern short isEOF(char *);
extern short isFS(char *);
extern short isGS(char *);
extern short isLBR(char *);
extern short isRBR(char *);
extern short move(DFA_CLASS *, short);
extern void mystrtok(char *, char *, char *);
extern short skip(char *);

#define IGNORE(x)       (x);     // for portability
#define CURRENT_STATE   (o->ndx)
#define STATE_TBL       o->tbl
#define GOODSTATE   (STATE_TBL[CURRENT_STATE].good)
#define BADSTATE    (STATE_TBL[CURRENT_STATE].bad)
#define GOODFCN(x)  \
   ((*(STATE_TBL[CURRENT_STATE].goodfcn))(x))
#define BADFCN(x)   \
   ((*(STATE_TBL[CURRENT_STATE].badfcn))(x))
#define TARGET(x)   \
       ((*(STATE_TBL[CURRENT_STATE].target))(x))
#define NEXT_STATE(x)   ((*o->movest)(o,x))
#define GET_TOKEN       ((*o->get_token)(o))
#define INFILE          (o->infile)

// Useful Macros
#define PTRSUB(p,x)     ((long) p - (long) x)
#define PTRADD(p,x)     ((long) p + (long) x)
#define LASTBYTE(x)     (x[strlen(x)-l])
#define DIMEN(x)    (sizeof(x)/sizeof(x[0]))
/* End of File */