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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/* $Header: cmd.h,v 1.0 87/12/18 13:04:59 root Exp $
*
* $Log: cmd.h,v $
* Revision 1.0 87/12/18 13:04:59 root
* Initial revision
*
*/
#define C_NULL 0
#define C_IF 1
#define C_WHILE 2
#define C_EXPR 3
#define C_BLOCK 4
#ifndef DOINIT
extern char *cmdname[];
#else
char *cmdname[] = {
"NULL",
"IF",
"WHILE",
"EXPR",
"BLOCK",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16"
};
#endif
#define CF_OPTIMIZE 077 /* type of optimization */
#define CF_FIRSTNEG 0100/* conditional is ($register NE 'string') */
#define CF_NESURE 0200 /* if first doesn't match we're sure */
#define CF_EQSURE 0400 /* if first does match we're sure */
#define CF_COND 01000 /* test c_expr as conditional first, if not null. */
/* Set for everything except do {} while currently */
#define CF_LOOP 02000 /* loop on the c_expr conditional (loop modifiers) */
#define CF_INVERT 04000 /* it's an "unless" or an "until" */
#define CF_ONCE 010000 /* we've already pushed the label on the stack */
#define CF_FLIP 020000 /* on a match do flipflop */
#define CFT_FALSE 0 /* c_expr is always false */
#define CFT_TRUE 1 /* c_expr is always true */
#define CFT_REG 2 /* c_expr is a simple register */
#define CFT_ANCHOR 3 /* c_expr is an anchored search /^.../ */
#define CFT_STROP 4 /* c_expr is a string comparison */
#define CFT_SCAN 5 /* c_expr is an unanchored search /.../ */
#define CFT_GETS 6 /* c_expr is $reg = <filehandle> */
#define CFT_EVAL 7 /* c_expr is not optimized, so call eval() */
#define CFT_UNFLIP 8 /* 2nd half of range not optimized */
#define CFT_CHOP 9 /* c_expr is a chop on a register */
#ifndef DOINIT
extern char *cmdopt[];
#else
char *cmdopt[] = {
"FALSE",
"TRUE",
"REG",
"ANCHOR",
"STROP",
"SCAN",
"GETS",
"EVAL",
"UNFLIP",
"CHOP",
"10"
};
#endif
struct acmd {
STAB *ac_stab; /* a symbol table entry */
ARG *ac_expr; /* any associated expression */
};
struct ccmd {
CMD *cc_true; /* normal code to do on if and while */
CMD *cc_alt; /* else code or continue code */
};
struct cmd {
CMD *c_next; /* the next command at this level */
ARG *c_expr; /* conditional expression */
CMD *c_head; /* head of this command list */
STR *c_first; /* head of string to match as shortcut */
STAB *c_stab; /* a symbol table entry, mostly for fp */
SPAT *c_spat; /* pattern used by optimization */
char *c_label; /* label for this construct */
union ucmd {
struct acmd acmd; /* normal command */
struct ccmd ccmd; /* compound command */
} ucmd;
short c_flen; /* len of c_first, if not null */
short c_flags; /* optimization flags--see above */
char c_type; /* what this command does */
};
#define Nullcmd Null(CMD*)
EXT CMD *main_root INIT(Nullcmd);
EXT struct compcmd {
CMD *comp_true;
CMD *comp_alt;
};
#ifndef DOINIT
extern struct compcmd Nullccmd;
#else
struct compcmd Nullccmd = {Nullcmd, Nullcmd};
#endif
void opt_arg();
void evalstatic();
STR *cmd_exec();
|