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