1 /************************************************************************
4 * (c) Copyright $YEAR, $COMPANY_EN. Inc., $CITY_EN, $COUNTRY_EN
5 * (c) Copyright $YEAR, $COMPANY_CN. Inc., $CITY_CN, $COUNTRY_CN
6 ************************************************************************
8 * function: strtokenÄ£¿é¡£
14 ************************************************************************/
16 /************************************************************************
21 ************************************************************************/
23 #ifndef __STRTOKEN_H__
24 #define __STRTOKEN_H__
27 #include "../tokenlist/token.h"
28 #include "../lib/StrBuff.h"
29 #include "../lib/AQStack.h"
31 /* Type Definations */
33 #define PTR_CHAR_CNT (sizeof(char *))
34 /* judge this char to get if it is a ptr value. */
35 #define CHAR_FLAG_BYTE (PTR_CHAR_CNT-1)
53 typedef struct __tag_PARSER_DESC PARSER_DESC
;
55 typedef int (*TOKEN_ID_PROC
) (int evt
, int token
, register const char *str
, register unsigned int len
, PARSER_DESC
*psrcfile
);
60 * normally, ptr is larger then 0xFFFFFF.
61 * but if it is opr-char-string, store string
62 * in ptr buffer, this will decrease memory cost.
66 /* opr-char, it will decrease memory cost */
67 char chars
[PTR_CHAR_CNT
];
76 unsigned char tokensetflags;
82 /* TBD: put symbol_type to other */
84 // enum symbol_type stype;
93 #define MAX_TOKEN_ID_TBL_SIZE 256
94 #define MAX_RSVWD_LEN 32
96 #define MAX_TOKEN_NUM 128
97 #define MAX_STATE_NUM 128
102 TYPE_WORD
= 2, // include multi-byte
103 TYPE_PUNCT
= 3, // pfx/pair/opr char
109 TYPE_BUFF_FULL
= 9, // buffer is full
113 enum STATE_TOKEN_FLAGS
{
120 #define SET_STATE_FLAG(state, flag) ((state)->u32Flag |= ~(flag))
121 #define CLR_STATE_FLAG(state, flag) ((state)->u32Flag &= (flag))
122 #define CHK_STATE_FLAG(state, flag) ((state)->u32Flag & (flag))
124 #define STATE_SWITCH(pfile, state) do { \
125 QStackIF_Push(&(pfile)->stStateStk, (uint32)(pfile)->pstCurrTokenState); \
126 (pfile)->pstCurrTokenState = state_alloc_init((pfile), (state)); \
127 (pfile)->pstCurrTokenState->paired_state = 0; \
130 // int paired_token_tmp = (pfile)->pstCurrTokenState->paired_token; \
131 // char *state_token_str_tmp = (pfile)->pstCurrTokenState->state_token_str; \
133 // (pfile)->pstCurrTokenState->paired_token = paired_token_tmp; \
134 // (pfile)->pstCurrTokenState->state_token_str = state_token_str_tmp; \
137 #define STATE_RECOVERY(pfile) do { \
138 state_free((void *)(pfile)->pstCurrTokenState); \
139 (pfile)->pstCurrTokenState = (TOKEN_PROC_STATE *)QStackIF_Pop(&(pfile)->stStateStk); \
140 if ((pfile)->pstCurrTokenState) \
141 (pfile)->pstStateInfo = (pfile)->pstCurrTokenState->pstStateInfo; \
144 #define STATE_CHK(pfile, state) ((pfile)->pstCurrTokenState->iStateId == (state))
146 #define STATE_VCHK(pvstate, state) ((pvstate)->iStateId == (state))
150 typedef struct __tag_TOKEN_PROC_STATE TOKEN_PROC_STATE
;
151 typedef int (*TOKEN_PROC
) (char *str
, TOKEN_TYPE type
, TOKEN_PROC_STATE
*pstTokenState
);
153 /* static state info struct */
154 typedef struct __tag_TOKEN_PROC_STATE_INFO
{
159 TOKEN_PROC pfnTokenStrProc
;
160 const struct token_id
*pstTokenTbl
;
162 } astTokenTypeTbl
[TYPE_MAX
];
163 short *api16TokenNameLen
[TYPE_MAX
];
164 } TOKEN_PROC_STATE_INFO
, *PTOKEN_PROC_STATE_INFO
;
166 /* run-time state struct */
167 typedef struct __tag_TOKEN_PROC_STATE
{
169 TOKEN_PROC_STATE_INFO
*pstStateInfo
;
176 TOKEN_ID_PROC pfnTokenProc
;
178 char *state_token_str
;
179 TOKEN_ID_PROC pfnPairTokenProc
;
184 * this buffer is used for state txt (cmnt/string/codeblock).
185 * it strores txt beyound token.
186 * eg: a string contains envar/subscript/arithexpr,
187 * stTxtBuff stores the format string for sprintf().
195 /* statement token info */
198 uint32 u32CodeBlockLvl
;
199 } TOKEN_PROC_STATE
, *PTOKEN_PROC_STATE
;
201 typedef struct __tag_PARSER_DESC PARSER_DESC
;
202 typedef struct __tag_FILE_TYPE FILE_TYPE
;
210 typedef struct __tag_SRC_FILE_DESC
{
211 struct __tag_SRC_FILE_DESC
*upper
;
224 /* for getchar() buffering */
227 char aBuff
[2][512*8]; // TBD: use ptr. if src is a buffer, it can reduce mem cost.
229 struct __tag_PARSER_DESC
*pstParser
;
230 FILE_TYPE
*pstFileType
;
231 } SRC_FILE_DESC
, *PSRC_FILE_DESC
;
234 * one parser for one script-txt.
235 * the script-txt src canbe:
238 * @ pipe(it's also a pipe)
240 typedef struct __tag_PARSER_DESC
{
242 TOKEN_PROC_STATE
*pstCurrTokenState
;
243 TOKEN_PROC_STATE_INFO
*pstStateInfo
;
246 SRC_FILE_DESC
*pstCurrSrcFile
;
248 /* corresponding token tbl for src file */
249 TOKEN_PROC_STATE_INFO
*pstStateInfoTbl
;
251 const struct token_id
*pstMTokenTbl
;
253 unsigned short *pu16MTokenNameLen
;
254 TOKEN_PROC pfnMTokenStrProc
;
257 * @ stTxtBuff: store stTxtBuff in last sub state.
258 * when a token is return, this buffer is the coresponding data.
259 * it will be used in cmnt/codeblock/string state, when state recovery,
260 * @ strbuff: ti's a global buffer for parser, it will be free before every token parsing.
263 STR_BUFF stCmntTxtBuff
;
265 /* one type of token string processing */
266 char aTokenStrBuff
[512];
270 /* token string processing info */
278 } PARSER_DESC
, *PPARSER_DESC
;
281 typedef struct __tag_FILE_TYPE
{
282 struct __tag_FILE_TYPE
*next
;
284 char strFileTypeName
[32];
287 /* different file type use different token defination */
288 TOKEN_PROC_STATE_INFO
*pstStateInfoTbl
;
290 const struct token_id
*pstMTokenTbl
;
291 unsigned short *pu16MTokenNameLen
;
292 } FILE_TYPE
, * PFILE_TYPE
;
296 /* Public Variables and Functions */
297 extern TOKEN_PROC_STATE
*state_alloc_init (PARSER_DESC
*pfiledesc
, int iState
);
299 extern PARSER_DESC
*gparser
;
302 /* Source Format Type */
303 extern FILE_TYPE
* SrcFmtType_Append (
305 TOKEN_PROC_STATE_INFO astTokenStateTbl
[],
307 const struct token_id
*pstMTokenTbl
,
308 unsigned short *pu16MTokenNameLen
310 extern bool SrcFmtType_Remove (char *strTypeName
);
315 extern void IptSrc_Close (SRC_FILE_DESC
*pstSrcFile
);
316 extern SRC_FILE_DESC
*IptSrc_Alloc (PARSER_DESC
*pstParser
);
317 extern SRC_FILE_DESC
*IptSrc_InitInParser (PARSER_DESC
*pstParser
, char * pstrFileType
);
318 extern SRC_FILE_DESC
*IptSrc_FileOpen (
319 PARSER_DESC
*pstParser
,
321 char * pstrFileType
);
322 extern SRC_FILE_DESC
*IptSrc_StdinOpen (PARSER_DESC
*pstParser
, char * pstrFileType
);
323 extern SRC_FILE_DESC
*IptSrc_BuffOpen (
324 PARSER_DESC
*pstParser
,
326 char * pstrFileType
);
329 extern bool Parser_CtxFree (PARSER_DESC
*pstParserDesc
);
330 extern PARSER_DESC
*Parser_CtxAlloc (void);
331 extern PARSER_DESC
*Parser_AllocWithFile (char *filename
, char *srctype
);
332 extern bool Parser_CurrSrcClose (PARSER_DESC
*pstParserDesc
);
335 #endif /* __STRTOKEN_H__ */
376 typedef struct __tag_SRC_FILE_DESC
{
381 /* for getchar() buffering */
384 char aBuff
[2][512*8];
386 TOKEN_PROC_STATE
*pstCurrTokenState
;
387 TOKEN_PROC_STATE_INFO
*pstStateInfo
;
388 TOKEN_PROC_STATE_INFO
*pstStateInfoTbl
;
391 /* global token tbl for src file */
392 TOKEN_PROC pfnMTokenStrProc
;
393 const struct token_id
*pstMTokenTbl
;
394 unsigned short *pu16MTokenNameLen
;
396 /* token string processing info */
401 /* one type of token string processing */
402 char aTokenStrBuff
[512];
406 /* parsing state stack */
410 } SRC_FILE_DESC
, *PSRC_FILE_DESC
;