1 | /* $RCSfile: cmd.h,v $$Revision: 1.1.1.1 $$Date: 1996-10-02 06:40:01 $ |
---|
2 | * |
---|
3 | * Copyright (c) 1991, Larry Wall |
---|
4 | * |
---|
5 | * You may distribute under the terms of either the GNU General Public |
---|
6 | * License or the Artistic License, as specified in the README file. |
---|
7 | * |
---|
8 | * $Log: not supported by cvs2svn $ |
---|
9 | * Revision 4.0.1.2 92/06/08 12:01:02 lwall |
---|
10 | * patch20: removed implicit int declarations on funcions |
---|
11 | * |
---|
12 | * Revision 4.0.1.1 91/06/07 10:28:50 lwall |
---|
13 | * patch4: new copyright notice |
---|
14 | * patch4: length($`), length($&), length($') now optimized to avoid string copy |
---|
15 | * |
---|
16 | * Revision 4.0 91/03/20 01:04:34 lwall |
---|
17 | * 4.0 baseline. |
---|
18 | * |
---|
19 | */ |
---|
20 | |
---|
21 | #define C_NULL 0 |
---|
22 | #define C_IF 1 |
---|
23 | #define C_ELSE 2 |
---|
24 | #define C_WHILE 3 |
---|
25 | #define C_BLOCK 4 |
---|
26 | #define C_EXPR 5 |
---|
27 | #define C_NEXT 6 |
---|
28 | #define C_ELSIF 7 /* temporary--turns into an IF + ELSE */ |
---|
29 | #define C_CSWITCH 8 /* created by switch optimization in block_head() */ |
---|
30 | #define C_NSWITCH 9 /* likewise */ |
---|
31 | |
---|
32 | #ifdef DEBUGGING |
---|
33 | #ifndef DOINIT |
---|
34 | extern char *cmdname[]; |
---|
35 | #else |
---|
36 | char *cmdname[] = { |
---|
37 | "NULL", |
---|
38 | "IF", |
---|
39 | "ELSE", |
---|
40 | "WHILE", |
---|
41 | "BLOCK", |
---|
42 | "EXPR", |
---|
43 | "NEXT", |
---|
44 | "ELSIF", |
---|
45 | "CSWITCH", |
---|
46 | "NSWITCH", |
---|
47 | "10" |
---|
48 | }; |
---|
49 | #endif |
---|
50 | #endif /* DEBUGGING */ |
---|
51 | |
---|
52 | #define CF_OPTIMIZE 077 /* type of optimization */ |
---|
53 | #define CF_FIRSTNEG 0100/* conditional is ($register NE 'string') */ |
---|
54 | #define CF_NESURE 0200 /* if short doesn't match we're sure */ |
---|
55 | #define CF_EQSURE 0400 /* if short does match we're sure */ |
---|
56 | #define CF_COND 01000 /* test c_expr as conditional first, if not null. */ |
---|
57 | /* Set for everything except do {} while currently */ |
---|
58 | #define CF_LOOP 02000 /* loop on the c_expr conditional (loop modifiers) */ |
---|
59 | #define CF_INVERT 04000 /* it's an "unless" or an "until" */ |
---|
60 | #define CF_ONCE 010000 /* we've already pushed the label on the stack */ |
---|
61 | #define CF_FLIP 020000 /* on a match do flipflop */ |
---|
62 | #define CF_TERM 040000 /* value of this cmd might be returned */ |
---|
63 | #define CF_DBSUB 0100000 /* this is an inserted cmd for debugging */ |
---|
64 | |
---|
65 | #define CFT_FALSE 0 /* c_expr is always false */ |
---|
66 | #define CFT_TRUE 1 /* c_expr is always true */ |
---|
67 | #define CFT_REG 2 /* c_expr is a simple register */ |
---|
68 | #define CFT_ANCHOR 3 /* c_expr is an anchored search /^.../ */ |
---|
69 | #define CFT_STROP 4 /* c_expr is a string comparison */ |
---|
70 | #define CFT_SCAN 5 /* c_expr is an unanchored search /.../ */ |
---|
71 | #define CFT_GETS 6 /* c_expr is <filehandle> */ |
---|
72 | #define CFT_EVAL 7 /* c_expr is not optimized, so call eval() */ |
---|
73 | #define CFT_UNFLIP 8 /* 2nd half of range not optimized */ |
---|
74 | #define CFT_CHOP 9 /* c_expr is a chop on a register */ |
---|
75 | #define CFT_ARRAY 10 /* this is a foreach loop */ |
---|
76 | #define CFT_INDGETS 11 /* c_expr is <$variable> */ |
---|
77 | #define CFT_NUMOP 12 /* c_expr is a numeric comparison */ |
---|
78 | #define CFT_CCLASS 13 /* c_expr must start with one of these characters */ |
---|
79 | #define CFT_D0 14 /* no special breakpoint at this line */ |
---|
80 | #define CFT_D1 15 /* possible special breakpoint at this line */ |
---|
81 | |
---|
82 | #ifdef DEBUGGING |
---|
83 | #ifndef DOINIT |
---|
84 | extern char *cmdopt[]; |
---|
85 | #else |
---|
86 | char *cmdopt[] = { |
---|
87 | "FALSE", |
---|
88 | "TRUE", |
---|
89 | "REG", |
---|
90 | "ANCHOR", |
---|
91 | "STROP", |
---|
92 | "SCAN", |
---|
93 | "GETS", |
---|
94 | "EVAL", |
---|
95 | "UNFLIP", |
---|
96 | "CHOP", |
---|
97 | "ARRAY", |
---|
98 | "INDGETS", |
---|
99 | "NUMOP", |
---|
100 | "CCLASS", |
---|
101 | "14" |
---|
102 | }; |
---|
103 | #endif |
---|
104 | #endif /* DEBUGGING */ |
---|
105 | |
---|
106 | struct acmd { |
---|
107 | STAB *ac_stab; /* a symbol table entry */ |
---|
108 | ARG *ac_expr; /* any associated expression */ |
---|
109 | }; |
---|
110 | |
---|
111 | struct ccmd { |
---|
112 | CMD *cc_true; /* normal code to do on if and while */ |
---|
113 | CMD *cc_alt; /* else cmd ptr or continue code */ |
---|
114 | }; |
---|
115 | |
---|
116 | struct scmd { |
---|
117 | CMD **sc_next; /* array of pointers to commands */ |
---|
118 | short sc_offset; /* first value - 1 */ |
---|
119 | short sc_max; /* last value + 1 */ |
---|
120 | }; |
---|
121 | |
---|
122 | struct cmd { |
---|
123 | CMD *c_next; /* the next command at this level */ |
---|
124 | ARG *c_expr; /* conditional expression */ |
---|
125 | CMD *c_head; /* head of this command list */ |
---|
126 | STR *c_short; /* string to match as shortcut */ |
---|
127 | STAB *c_stab; /* a symbol table entry, mostly for fp */ |
---|
128 | SPAT *c_spat; /* pattern used by optimization */ |
---|
129 | char *c_label; /* label for this construct */ |
---|
130 | union ucmd { |
---|
131 | struct acmd acmd; /* normal command */ |
---|
132 | struct ccmd ccmd; /* compound command */ |
---|
133 | struct scmd scmd; /* switch command */ |
---|
134 | } ucmd; |
---|
135 | short c_slen; /* len of c_short, if not null */ |
---|
136 | VOLATILE short c_flags; /* optimization flags--see above */ |
---|
137 | HASH *c_stash; /* package line was compiled in */ |
---|
138 | STAB *c_filestab; /* file the following line # is from */ |
---|
139 | line_t c_line; /* line # of this command */ |
---|
140 | char c_type; /* what this command does */ |
---|
141 | }; |
---|
142 | |
---|
143 | #define Nullcmd Null(CMD*) |
---|
144 | #define Nullcsv Null(CSV*) |
---|
145 | |
---|
146 | EXT CMD * VOLATILE main_root INIT(Nullcmd); |
---|
147 | EXT CMD * VOLATILE eval_root INIT(Nullcmd); |
---|
148 | |
---|
149 | EXT CMD compiling; |
---|
150 | EXT CMD * VOLATILE curcmd INIT(&compiling); |
---|
151 | EXT CSV * VOLATILE curcsv INIT(Nullcsv); |
---|
152 | |
---|
153 | struct callsave { |
---|
154 | SUBR *sub; |
---|
155 | STAB *stab; |
---|
156 | CSV *curcsv; |
---|
157 | CMD *curcmd; |
---|
158 | ARRAY *savearray; |
---|
159 | ARRAY *argarray; |
---|
160 | long depth; |
---|
161 | int wantarray; |
---|
162 | char hasargs; |
---|
163 | }; |
---|
164 | |
---|
165 | struct compcmd { |
---|
166 | CMD *comp_true; |
---|
167 | CMD *comp_alt; |
---|
168 | }; |
---|
169 | |
---|
170 | void opt_arg(); |
---|
171 | ARG* evalstatic(); |
---|
172 | int cmd_exec(); |
---|
173 | #ifdef DEBUGGING |
---|
174 | void deb(); |
---|
175 | #endif |
---|
176 | int copyopt(); |
---|