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