|
|
1.1 ! root 1: /* ! 2: * AWK header - typedefs and c. ! 3: */ ! 4: ! 5: #include <stdio.h> ! 6: #include <setjmp.h> ! 7: #include <ctype.h> ! 8: ! 9: #define NWORD 400 /* Longest word or identifier in yylex */ ! 10: #define NCSET 256 /* Size of character set (ascii + top bit) */ ! 11: #define MAXRECORD 2048 /* Longest input record */ ! 12: #define NBPC 8 /* Bytes in a char */ ! 13: #define NHASH 64 /* Number of symbol table hash buckets */ ! 14: #define NSBRK 256 /* Amount sbroken per call in `xalloc' */ ! 15: #define NCLASSC 128 /* Number of class characters */ ! 16: #define NCLASS (NCLASSC/NBPC) /* Chars in a class */ ! 17: #define NOFILE 10 /* Limit on the number of open files */ ! 18: #define NNEST 15 /* For/while nesting */ ! 19: ! 20: typedef double FLOAT; /* Floating point type */ ! 21: typedef long INT; /* Integer type */ ! 22: typedef unsigned char CHAR; /* Character type */ ! 23: typedef unsigned char *STRING; /* String type */ ! 24: ! 25: #define stof atof /* String to FLOAT */ ! 26: #define stoi atol /* String to INT */ ! 27: ! 28: /* ! 29: * Used for identifiers, array elements, ! 30: * and just constants. (The name field is ! 31: * not used here). ! 32: */ ! 33: typedef struct TERM { ! 34: CHAR t_op; /* Op type */ ! 35: CHAR t_flag; ! 36: struct TERM *t_next; /* Hash chain */ ! 37: unsigned t_hval; /* Hash value for symbol table */ ! 38: unsigned t_ahval; /* Hash value without array index */ ! 39: union { ! 40: FLOAT t_float; ! 41: INT t_int; ! 42: STRING t_str; ! 43: struct { ! 44: union NODE *(*t_func)(); ! 45: CHAR t_minarg; ! 46: CHAR t_maxarg; ! 47: } t_fun; ! 48: } t_un; ! 49: CHAR t_name[]; /* Name of array or identifier */ ! 50: } TERM; ! 51: ! 52: /* Node types (t_flag) */ ! 53: #define T_NUM 01 /* Numeric value vs. string */ ! 54: #define T_INT 02 /* Integer vs. floating */ ! 55: #define T_VAR 04 /* Variable */ ! 56: #define T_ARRAY 010 /* Array */ ! 57: #define T_ALLOC 020 /* Allocated string */ ! 58: ! 59: /* ! 60: * Expression tree node. ! 61: */ ! 62: typedef struct OPNODE { ! 63: CHAR n_op; ! 64: CHAR n_flag; ! 65: union { ! 66: CHAR *n_charp; ! 67: int n_char; ! 68: struct NODE *n_node; ! 69: } n_o1, n_o2, n_o3, n_o4; ! 70: } OPNODE; ! 71: ! 72: /* Defines to made operand NODES easier to type in */ ! 73: #define n_O1 n_o1.n_node ! 74: #define n_O2 n_o2.n_node ! 75: #define n_O3 n_o3.n_node ! 76: #define n_O4 n_o4.n_node ! 77: #define t_STRING t_un.t_str ! 78: #define t_INT t_un.t_int ! 79: #define t_FLOAT t_un.t_float ! 80: #define t_FUNC t_un.t_fun.t_func ! 81: #define t_MINARG t_un.t_fun.t_minarg ! 82: #define t_MAXARG t_un.t_fun.t_maxarg ! 83: ! 84: /* ! 85: * Basic nodes -- union of a TERM ! 86: * and an expression tree OPNODE. ! 87: */ ! 88: typedef union NODE { ! 89: OPNODE opnode; ! 90: TERM term; ! 91: } NODE; ! 92: ! 93: /* ! 94: * An open file. ! 95: */ ! 96: typedef struct OFILE { ! 97: int of_flag; ! 98: FILE *of_fp; ! 99: CHAR *of_name; ! 100: } OFILE; ! 101: ! 102: /* of_flag bits */ ! 103: #define OFPIPE 01 /* This is a pipe output */ ! 104: ! 105: /* Defined functions */ ! 106: #define nel(x) (sizeof(x)/sizeof((x)[0])) ! 107: #define endof(x) (&(x)[nel(x)]) ! 108: #define streq(s1,s2) (strcmp(s1,s2)==0) ! 109: #define bump(ip,t) (ip+=sizeof(t)/sizeof(int)) /* bump for printf */ ! 110: ! 111: /* Function declaration */ ! 112: CHAR *xalloc(); ! 113: STRING awkinput(); ! 114: NODE *lookup(); ! 115: NODE *alookup(); ! 116: NODE *install(); ! 117: STRING evalstring(); ! 118: INT evalint(); ! 119: FLOAT evalfloat(); ! 120: NODE *evalexpr(); ! 121: FLOAT stof(); ! 122: INT stoi(); ! 123: NODE *node(); ! 124: NODE *cnode(); ! 125: NODE *cpnode(); ! 126: NODE *snode(); ! 127: NODE *fnode(); ! 128: NODE *inode(); ! 129: NODE *fargn(); ! 130: NODE *xadd(); ! 131: NODE *xsub(); ! 132: NODE *xmul(); ! 133: NODE *xdiv(); ! 134: NODE *xmod(); ! 135: NODE *xcmp(); ! 136: NODE *xconc(); ! 137: NODE *xarray(); ! 138: NODE *xfield(); ! 139: NODE *xassign(); ! 140: NODE *xinca(); ! 141: NODE *xdeca(); ! 142: NODE *xneg(); ! 143: ! 144: /* ! 145: * Declaration of built-in ! 146: * functions. ! 147: */ ! 148: NODE *f_length(); ! 149: NODE *f_sqrt(); ! 150: NODE *f_log(); ! 151: NODE *f_exp(); ! 152: NODE *f_int(); ! 153: NODE *f_substr(); ! 154: NODE *f_index(); ! 155: NODE *f_sprintf(); ! 156: NODE *f_split(); ! 157: NODE *f_abs(); ! 158: ! 159: /* ! 160: * External references. ! 161: */ ! 162: extern CHAR *parg; /* Program argument pointer */ ! 163: extern FILE *pfp; /* Program file pointer */ ! 164: extern int lexre; /* Reading regular expression -- yylex */ ! 165: extern CHAR wordbuf[NWORD]; ! 166: extern TERM xzero; ! 167: extern TERM xone; ! 168: extern NODE xfield0; ! 169: extern NODE *codep; ! 170: extern int beginflag; ! 171: extern int endflag; ! 172: extern int runflag; ! 173: extern int yflag; ! 174: extern int nlskip; ! 175: extern int exitflag; ! 176: extern int lineno; ! 177: extern int whitesw; ! 178: extern CHAR *inline; ! 179: extern jmp_buf nextenv; ! 180: extern jmp_buf fwenv[NNEST]; ! 181: extern int fwlevel; ! 182: extern int brlevel; ! 183: extern int outflag; ! 184: extern TERM *symtab[NHASH]; ! 185: extern NODE *tempnodes; ! 186: extern CHAR SNULL[]; ! 187: extern OFILE files[NOFILE]; ! 188: extern CHAR inbuf[BUFSIZ]; ! 189: extern CHAR outbuf[BUFSIZ]; ! 190: ! 191: /* ! 192: * References to the built-in ! 193: * values. ! 194: */ ! 195: extern NODE *FILENAMEp; ! 196: extern NODE *NFp; ! 197: extern NODE *NRp; ! 198: extern NODE *FSp; ! 199: extern NODE *RSp; ! 200: extern NODE *OFSp; ! 201: extern NODE *ORSp; ! 202: extern NODE *OFMTp; ! 203: ! 204: #define FILENAME (FILENAMEp->t_STRING) ! 205: #define NF (NFp->t_INT) ! 206: #define NR (NRp->t_INT) ! 207: #define FS (FSp->t_STRING) ! 208: #define RS (RSp->t_STRING) ! 209: #define OFS (OFSp->t_STRING) ! 210: #define ORS (ORSp->t_STRING) ! 211: #define OFMT (OFMTp->t_STRING) ! 212: #define FSMAP wordbuf /* Map to speed up field selection */ ! 213: ! 214: /* ! 215: * Operators in the expression tree. ! 216: */ ! 217: #define AROOT 1 /* Root -- pattern, action */ ! 218: #define ARE 2 /* /RE/ */ ! 219: #define AREMAT 3 /* s ~ /RE/ */ ! 220: #define ARENMAT 4 /* S !~ /RE/ */ ! 221: #define AEQ 5 /* a==b */ ! 222: #define ANE 6 /* a!=b */ ! 223: #define AGT 7 /* a>b */ ! 224: #define AGE 8 /* a>=b */ ! 225: #define ALT 9 /* a<b */ ! 226: #define ALE 10 /* a<=b */ ! 227: #define AADD 11 /* a+b */ ! 228: #define ASUB 12 /* a-b */ ! 229: #define AMUL 13 /* a*b */ ! 230: #define ADIV 14 /* a/b */ ! 231: #define AMOD 15 /* a%b */ ! 232: #define AASGN 21 /* a=b */ ! 233: #define ANOT 22 /* !a */ ! 234: #define AANDAND 23 /* a&&b */ ! 235: #define AOROR 24 /* a||b */ ! 236: #define AARRAY 25 /* a[b] */ ! 237: #define AINCA 27 /* a++ */ ! 238: #define ADECA 29 /* a-- */ ! 239: #define ARCLOS 30 /* RE -- a* */ ! 240: #define ARNECL 31 /* RE -- a+ */ ! 241: #define ARZOCL 32 /* RE -- a? */ ! 242: #define AROR 33 /* RE -- a|b */ ! 243: #define ARBOL 34 /* RE -- ^ */ ! 244: #define AREOL 35 /* RE -- $ */ ! 245: #define ARANY 36 /* RE -- . */ ! 246: #define ARCON 37 /* RE - ab */ ! 247: #define ARCLASS 38 /* RE - [...] */ ! 248: #define ARDCLASS 39 /* RE -- class under `-y' */ ! 249: #define ARCHAR 40 /* RE -- CHAR */ ! 250: #define ARDCHAR 41 /* RE -- dual case CHAR */ ! 251: #define AFIELD 42 /* $a */ ! 252: #define APRINT 43 /* print */ ! 253: #define APRINTF 44 /* printf */ ! 254: #define AFUN 45 /* function */ ! 255: #define ALIST 46 /* a,b */ ! 256: #define ANUM 48 /* number or string */ ! 257: #define AFOUT 49 /* > file */ ! 258: #define AFAPP 50 /* >> file */ ! 259: #define AFPIPE 51 /* | command */ ! 260: #define AIF 52 /* if (exp) statement */ ! 261: #define AFORIN 53 /* for (x in array ) */ ! 262: #define AFOR 54 /* for(e;e;e) s */ ! 263: #define AWHILE 55 /* while(e)s */ ! 264: #define ABREAK 56 /* break */ ! 265: #define ACONTIN 57 /* continue */ ! 266: #define ACONC 58 /* s1 s2 */ ! 267: #define ABEGIN 59 /* begin */ ! 268: #define AEND 60 /* end */ ! 269: #define AEXIT 61 /* exit */ ! 270: #define ANEXT 62 /* next */ ! 271: #define ARANGE 63 /* a,b */ ! 272: #define ATERM 64 /* Terminal */ ! 273: #define AFUNC 65 /* Function */ ! 274: #define AKEYW 66 /* Dummy type for keyword */ ! 275: #define ANEG 67 /* - a */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.