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