/* ** (c) COPYRIGHT MIT 1996. ** Please first read the full copyright statement in the file COPYRIGH. */This module provides the interface to CSParse.c. The parser is used to parse labels, machine-readable descriptions, and users. The application creates one of these and iteratevely calls CSParse_parseChunk until it returns a done or an error.
#ifndef CSPARSE_H #define CSPARSE_H #include "CSLUtils.h" #include "HTChunk.h"
typedef enum {
NowIn_INVALID = 0,
NowIn_NEEDOPEN,
NowIn_ENGINE,
NowIn_NEEDCLOSE,
NowIn_END,
NowIn_MATCHCLOSE,
NowIn_ERROR,
NowIn_CHAIN
} NowIn_t;
extern CSParse_t * CSParse_new(void); extern void CSParse_delete(CSParse_t * me);
#define LPAREN '('
#define RPAREN ')'
#define LCURLY '{'
#define RCURLY '}'
#define LBRACKET '['
#define RBRACKET ']'
#define SQUOTE 0x27 /* avoid confusing parens checking editors */
#define DQUOTE 0x22
#define LPARENSTR "("
#define RPARENSTR ")"
#define raysize(A) (sizeof(A)/sizeof(A[0]))
typedef enum {Punct_ZERO = 1, Punct_WHITE = 2, Punct_LPAREN = 4,
Punct_RPAREN = 8, Punct_ALL = 0xf} Punct_t;
By convention, the following SubState names are used:
{"error test", SubState_A|SubState_C, Punct_LPAREN, 0, "error"} *probs* I meant to keep these 16 bit caompatible, but ran up short at the end of one StateToken list. This can be fixed if anyone needs a 16 bit enum.
typedef enum {SubState_X = -1, SubState_N = 0x4000, SubState_A = 1,
SubState_B = 2, SubState_C = 4, SubState_D = 8,
SubState_E = 0x10, SubState_F = 0x20, SubState_G = 0x40,
SubState_H = 0x80, SubState_I = 0x100} SubState_t;
forward declaration for StateToken_t
typedef struct StateToken_s StateToken_t;
typedef NowIn_t Engine_t(CSParse_t * pCSParse, char demark, void * pVoid);Engine employed by the Label, MacRed, and User parsers
Engine_t CSParse_targetParser;
typedef StateRet_t Check_t(CSParse_t * pCSParse, StateToken_t * pStateToken, char * token, char demark);Punctuation checker to be employed by Check_t functions
extern BOOL Punct_badDemark(Punct_t validPunctuation, char demark);
typedef StateRet_t Open_t(CSParse_t * pCSParse, char * token, char demark);
typedef StateRet_t Close_t(CSParse_t * pCSParse, char * token, char demark);
typedef StateRet_t Prep_t(CSParse_t * pCSParse, char * token, char demark);
typedef void Destroy_t(CSParse_t * pCSParse);
typedef enum {Command_NONE = 0, Command_OPEN = 1, Command_CLOSE = 2,
Command_CHAIN = 4, Command_NOTOKEN = 8,
Command_MATCHANY = 0x10} Command_t;
struct StateToken_s {
char * note; /* some usefull text that describes the state - usefulll for debugging */
SubState_t validSubStates;
Punct_t validPunctuation;
Check_t * pCheck; /* call this function to check token */
char * name1; /* or compare to this name */
char * name2; /* many strings have 2 spellings ("ratings" vs. "r") */
CSParseTC_t targetChange; /* whether target change implies diving or climbing from current state */
TargetObject_t * pNextTargetObject;
SubState_t nextSubState;
Command_t command; /* open, close, chain, etc. */
Prep_t * pPrep; /* prepare for next state */
};
struct TargetObject_s {
char * note;
Open_t * pOpen; /* call this function to open structure */
Close_t * pClose; /* call this function to close structure */
Destroy_t * pDestroy;
StateToken_t * stateTokens; /* array of sub states */
int stateTokenCount; /* number of sub states */
CSParseTC_t targetChange; /* target change signal for opening this parse state */
};
typedef union {
BVal_t * pTargetBVal;
FVal_t * pTargetFVal;
SVal_t * pTargetSVal;
DVal_t * pTargetDVal;
HTList ** pTargetList;
} ValTarget_t;
typedef enum {ValType_NONE, ValType_BVAL, ValType_FVAL,
ValType_SVAL, ValType_DVAL,
ValType_COMMENT} ValType_t;
typedef struct {
Engine_t * engineOf;
TargetChangeCallback_t * pTargetChangeCallback;
ParseErrorHandler_t * pParseErrorHandler;
/* for reading [BFSD]Val_t */
ValTarget_t valTarget;
ValType_t valType;
char * pTokenError;
BOOL observeQuotes;
BOOL observedQuotes;
char * legalChars;
int legalCharCount;
} ParseContext_t;
struct CSParse_s {
char quoteState;
NowIn_t nowIn;
HTChunk * token;
char demark;
int offset;
int depth;
ParseContext_t * pParseContext;
union { /* all the types this parse engine fills */
CSMachRead_t * pCSMachRead; /* defined in CSMacRed.c */
CSLabel_t * pCSLabel; /* defined in CSLabel.c */
CSUser_t * pCSUser; /* defined in CSUser.c */
} target;
TargetObject_t * pTargetObject;
SubState_t currentSubState;
StateToken_t * pStateToken;
};
#endif /* CSPARSE_H */End of Declaration