1 extern const char *cmd2lex(const wchar_t *);
2 extern int ispattern(const wchar_t *);
3 extern int isquoted(const wchar_t *);
4 extern int usw_dequote(USTRINGW *, const wchar_t *,  size_t);
5 
6 enum LEX_TYPE {
7 	/* 1X = space */
8 	LEX_SPACE = 10,		/* white space */
9 
10 	/* 2X = word */
11 	LEX_PLAINTEXT = 20,	/* text */
12 	LEX_QMARK,			/* quotation mark */
13 	LEX_VAR,			/* $ symbol (variable substitution) */
14 
15 	/* 3X special characters */
16 	LEX_IO = 30,		/* > or < */
17 	LEX_CMDSEP,			/* ; & | ( or opening backtick */
18 	LEX_OTHER,			/* e.g. } or closing backtick */
19 
20 	/* 4X begin and end */
21 	LEX_BEGIN = 40,		 /* begin of text */
22 	/* end of text + exit code */
23 	LEX_END_OK,			/* ok */
24 	LEX_END_ERR_BQ,		/* trailing backslash */
25 	LEX_END_ERR_SQ,		/* open single quote */
26 	LEX_END_ERR_DQ		/* open double quote */
27 };
28 
29 /* basic categories and basic tests */
30 #define LEX_TYPE_SPACE		1
31 #define LEX_TYPE_WORD		2
32 #define LEX_TYPE_SPECIAL	3
33 #define LEX_TYPE_END		4
34 #define LEX_TYPE(X)			((X) / 10)
35 #define IS_LEX_SPACE(X)		(LEX_TYPE(X) == LEX_TYPE_SPACE)
36 #define IS_LEX_WORD(X)		(LEX_TYPE(X) == LEX_TYPE_WORD)
37 #define IS_LEX_SPECIAL(X)	(LEX_TYPE(X) == LEX_TYPE_SPECIAL)
38 #define IS_LEX_END(X)		(LEX_TYPE(X) == LEX_TYPE_END)
39 
40 /* extended tests */
41 #define IS_LEX_EMPTY(X)		(LEX_TYPE(X) == LEX_TYPE_END  || LEX_TYPE(X) == LEX_TYPE_SPACE)
42 #define IS_LEX_CMDSEP(X)	((X) == LEX_CMDSEP || (X) == LEX_BEGIN)
43