1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#include "typeutils.h"
typedef struct ExpansionRegion ExpansionRegion;
typedef enum {
UN_Q,
SINGLE_Q,
DOUBLE_Q,
} QuotationMode;
typedef enum {
LITERAL,
REGION_EXP,
VAR_EXP, // TODO: Later include other exps
} ChunkKind;
typedef struct {
ChunkKind kind;
QuotationMode qmode;
union {
char* literal_str;
ExpansionRegion* reg_ptr;
char* varname;
} as;
} Chunk;
DECLARE_VEC(Chunk, ChunkVec)
typedef enum {
TOK_WORD,
TOK_SPECIAL,
} TokenKind;
typedef enum {
PIPE,
WRITE_REDIR_TRUNC,
WRITE_REDIR_APPEND,
READ_REDIR,
L_PROC_SUB_IN,
L_PROC_SUB_OUT,
PAREN,
EOL,
} SpecialToken;
typedef struct {
TokenKind kind;
union {
ChunkVec word;
SpecialToken spec;
} as;
} Token;
DECLARE_VEC(Token, TokenVec)
DECLARE_MAYBE(SpecialToken)
typedef enum {
CMD_SUB,
ARITHM,
} RegionMode;
struct ExpansionRegion {
RegionMode mode;
TokenVec tokens;
};
DECLARE_MAYBE(Chunk);
DECLARE_VEC(ExpansionRegion, ExpansionRegionVec)
|