source: trunk/third/perl/cmd.h @ 9009

Revision 9009, 4.9 KB checked in by ghudson, 28 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r9008, which included commits to RCS files with non-trunk default branches.
Line 
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
34extern char *cmdname[];
35#else
36char *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
84extern char *cmdopt[];
85#else
86char *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
106struct acmd {
107    STAB        *ac_stab;       /* a symbol table entry */
108    ARG         *ac_expr;       /* any associated expression */
109};
110
111struct 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
116struct 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
122struct 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
146EXT CMD * VOLATILE main_root INIT(Nullcmd);
147EXT CMD * VOLATILE eval_root INIT(Nullcmd);
148
149EXT CMD compiling;
150EXT CMD * VOLATILE curcmd INIT(&compiling);
151EXT CSV * VOLATILE curcsv INIT(Nullcsv);
152
153struct 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
165struct compcmd {
166    CMD *comp_true;
167    CMD *comp_alt;
168};
169
170void opt_arg();
171ARG* evalstatic();
172int cmd_exec();
173#ifdef DEBUGGING
174void deb();
175#endif
176int copyopt();
Note: See TracBrowser for help on using the repository browser.