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