home *** CD-ROM | disk | FTP | other *** search
-
- /* W3 Copyright statement
- Copyright 1995 by: Massachusetts Institute of Technology (MIT), INRIA</H2>
-
- This W3C software is being provided by the copyright holders under the
- following license. By obtaining, using and/or copying this software,
- you agree that you have read, understood, and will comply with the
- following terms and conditions:
-
- Permission to use, copy, modify, and distribute this software and its
- documentation for any purpose and without fee or royalty is hereby
- granted, provided that the full text of this NOTICE appears on
- <EM>ALL</EM> copies of the software and documentation or portions
- thereof, including modifications, that you make.
-
- <B>THIS SOFTWARE IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
- REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE,
- BUT NOT LIMITATION, COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR
- WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR
- THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY
- THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
- COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE
- OR DOCUMENTATION.
-
- The name and trademarks of copyright holders may NOT be used
- in advertising or publicity pertaining to the software without
- specific, written prior permission. Title to copyright in this
- software and any associated documentation will at all times remain
- with copyright holders.
- */
- /* Parser for libpics
- PARSER FOR LIBPICS
-
- */
- /*
- ** (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"
- /*
-
- NOWIN
-
- tells CSParse where it is in the task of tokenizing
-
- */
- typedef enum {
- NowIn_INVALID = 0,
- NowIn_NEEDOPEN,
- NowIn_ENGINE,
- NowIn_NEEDCLOSE,
- NowIn_END,
- NowIn_MATCHCLOSE,
- NowIn_ERROR,
- NowIn_CHAIN
- } NowIn_t;
- /*
-
- Construction/Destruction
-
- The parse objects are never created by the application, but instead by one of the
- objects that it is used to parse.
-
- */
- extern CSParse_t * CSParse_new(void);
- extern void CSParse_delete(CSParse_t * me);
- /*
-
- some handy definitions
-
- */
- #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]))
- /*
-
- SUBPARSER DATA
-
- PUNCT
-
- valid punctuation
-
- */
- typedef enum {Punct_ZERO = 1, Punct_WHITE = 2, Punct_LPAREN = 4,
- Punct_WHITE_LPAREN = (Punct_WHITE|Punct_LPAREN),
- Punct_RPAREN = 8, Punct_LPAREN_RPAREN = (Punct_LPAREN|Punct_RPAREN),
- Punct_WHITE_LPAREN_RPAREN = (Punct_WHITE|Punct_LPAREN|Punct_RPAREN),
- Punct_ALL = 0xf} Punct_t;
- /*
-
- SUBSTATE
-
- Enumerated bits that are used to mark a parsing state. Because they are bits, as
- opposed to sequential numbers, a StateToken may or more than one together and serve
- more than one state. They must have identical outcomes if this is to be exploited.
-
- By convention, the following SubState names are used:
-
- X - has no state
-
- N - is a newly created object
-
- A-H - substate definitions. Because they are non-conflicting bits, a subparser may have
- options that sit in more than state. For instance, the string "error" may be matched in
- states A and C with:
-
- {"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;
- /*
-
- ENGINE
-
- called by CSParse to process tokens and punctuation
-
- */
- 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;
- /*
-
- SUBSTATE METHODS
-
- All methods return a StateRet.
-
- Check
-
- see if a value is legitimate, may also record it
-
- */
- 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);
- /*
-
- Open
-
- create a new data structure to be filled by the parser
-
- */
- typedef StateRet_t Open_t(CSParse_t * pCSParse, char * token, char demark);
- /*
-
- Close
-
- tell the state that the data structure is no longer current
-
- */
- typedef StateRet_t Close_t(CSParse_t * pCSParse, char * token, char demark);
- /*
-
- Prep
-
- get ready for next state
-
- */
- typedef StateRet_t Prep_t(CSParse_t * pCSParse, char * token, char demark);
- /*
-
- Destroy
-
- something went wrong, throw away the current object
-
- */
- typedef void Destroy_t(CSParse_t * pCSParse);
- /*
-
- COMMAND
-
- substate commands
-
- open - call the open function for the current data structure
-
- close - call the close
-
- chain - call again on the next state without re-reading data
-
- notoken - clear the token before a chain (so next state just gets punct)
-
- matchany - match any string
-
- */
- typedef enum {Command_NONE = 0, Command_OPEN = 1, Command_CLOSE = 2,
- Command_CHAIN = 4, Command_NOTOKEN = 8,
- Command_CLOSE_CHAIN = (Command_CLOSE|Command_CHAIN),
- Command_CHAIN_NOTOKEN = (Command_CHAIN|Command_NOTOKEN),
- Command_CLOSE_CHAIN_NOTOKEN = (Command_CLOSE|Command_CHAIN|Command_NOTOKEN),
- Command_MATCHANY = 0x10,
- Command_MATCHANY_OPEN_CHAIN = (Command_MATCHANY|Command_OPEN|Command_CHAIN),
- Command_MATCHANY_CLOSE = (Command_MATCHANY|Command_CLOSE),
- Command_MATCHANY_CLOSE_CHAIN = (Command_MATCHANY|Command_CLOSE|Command_CHAIN),
- } Command_t;
- /*
-
- STATETOKEN STRUCTURE
-
- Contains all the information about what tokens are expected in what substates. The
- StateTokens are kept in array referenced by a TargetObject.
-
- */
- struct StateToken_s {
- char * note; /* some usefull text that describes the state - usefulll f
- or 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 cur
- rent state */
- TargetObject_t * pNextTargetObject;
- SubState_t nextSubState;
- Command_t command; /* open, close, chain, etc. */
- Prep_t * pPrep; /* prepare for next state */
- };
- /*
-
- TARGETOBJECT STRUCTURE
-
- Methods and a lists of StateTokens associated with a data structure. The methods know
- how to read data into current object and the StateTokens tell when to proceed to the
- next object.
-
- */
- 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 */
- };
- /*
-
- VALTARGET
-
- */
- typedef union {
- BVal_t * pTargetBVal;
- FVal_t * pTargetFVal;
- SVal_t * pTargetSVal;
- DVal_t * pTargetDVal;
- HTList ** pTargetList;
- } ValTarget_t;
- /*
-
- VALTYPE
-
- Write down what value is to be read, and what type it is
-
- */
- typedef enum {ValType_NONE, ValType_BVAL, ValType_FVAL,
- ValType_SVAL, ValType_DVAL,
- ValType_COMMENT} ValType_t;
- /*
-
- PARSECONTEXT
-
- Part of a CSParse. The boundry is a litte fuzzy. Maybe it should not exist.
-
- */
- 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;
- /*
-
- CSPARSE STRUCTURE
-
- Full parser state and pointer to the object that it is reading.
-
- */
- 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 */
-