|
|
1.1 root 1: /* awk.def 4.3 83/12/09 */
2:
3: #define hack int
4: #define AWKFLOAT float
5: #define xfree(a) { if(a!=NULL) { yfree(a); a=NULL;} }
6: #define strfree(a) { if(a!=NULL && a!=EMPTY) { yfree(a);} a=EMPTY; }
7: #define yfree free
8: #define isnull(x) ((x) == EMPTY || (x) == NULL)
9:
10: #ifdef DEBUG
11: # define dprintf if(dbg)printf
12: #else
13: # define dprintf(x1, x2, x3, x4)
14: #endif
15: typedef AWKFLOAT awkfloat;
16:
17: extern char **FS;
18: extern char **RS;
19: extern char **ORS;
20: extern char **OFS;
21: extern char **OFMT;
22: extern awkfloat *NR;
23: extern awkfloat *NF;
24: extern char **FILENAME;
25:
26: extern char record[];
27: extern char EMPTY[];
28: extern int dbg;
29: extern int lineno;
30: extern int errorflag;
31: extern int donefld; /* 1 if record broken into fields */
32: extern int donerec; /* 1 if record is valid (no fld has changed */
33:
34: typedef struct val { /* general value during processing */
35: char *nval; /* name, for variables only */
36: char *sval; /* string value */
37: awkfloat fval; /* value as number */
38: unsigned tval; /* type info */
39: struct val *nextval; /* ptr to next if chained */
40: } cell;
41: extern cell *symtab[];
42: cell *setsymtab(), *lookup(), **makesymtab();
43:
44: extern cell *recloc; /* location of input record */
45: extern cell *nrloc; /* NR */
46: extern cell *nfloc; /* NF */
47:
48: #define STR 01 /* string value is valid */
49: #define NUM 02 /* number value is valid */
50: #define FLD 04 /* FLD means don't free string space */
51: #define CON 010 /* this is a constant */
52: #define ARR 020 /* this is an array */
53:
54: awkfloat setfval(), getfval();
55: char *setsval(), *getsval();
56: char *tostring(), *tokname(), *malloc();
57: double log(), sqrt(), exp(), atof();
58:
59: /* function types */
60: #define FLENGTH 1
61: #define FSQRT 2
62: #define FEXP 3
63: #define FLOG 4
64: #define FINT 5
65:
66: typedef struct {
67: char otype;
68: char osub;
69: cell *optr;
70: } obj;
71:
72: #define BOTCH 1
73: struct nd {
74: char ntype;
75: char subtype;
76: struct nd *nnext;
77: int nobj;
78: struct nd *narg[BOTCH]; /* C won't take a zero length array */
79: };
80: typedef struct nd node;
81: extern node *winner;
82: extern node *nullstat;
83:
84: /* otypes */
85: #define OCELL 0
86: #define OEXPR 1
87: #define OBOOL 2
88: #define OJUMP 3
89:
90: /* cell subtypes */
91: #define CTEMP 4
92: #define CNAME 3
93: #define CVAR 2
94: #define CFLD 1
95: #define CCON 0
96:
97: /* bool subtypes */
98: #define BTRUE 1
99: #define BFALSE 2
100:
101: /* jump subtypes */
102: #define JEXIT 1
103: #define JNEXT 2
104: #define JBREAK 3
105: #define JCONT 4
106:
107: /* node types */
108: #define NVALUE 1
109: #define NSTAT 2
110: #define NEXPR 3
111: #define NPA2 4
112:
113: extern obj (*proctab[])();
114: extern obj true, false;
115: extern int pairstack[], paircnt;
116:
117: #define cantexec(n) (n->ntype == NVALUE)
118: #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN]== nullproc)
119: #define isexpr(n) (n->ntype == NEXPR)
120: #define isjump(n) (n.otype == OJUMP)
121: #define isexit(n) (n.otype == OJUMP && n.osub == JEXIT)
122: #define isbreak(n) (n.otype == OJUMP && n.osub == JBREAK)
123: #define iscont(n) (n.otype == OJUMP && n.osub == JCONT)
124: #define isnext(n) (n.otype == OJUMP && n.osub == JNEXT)
125: #define isstr(n) (n.optr->tval & STR)
126: #define istrue(n) (n.otype == OBOOL && n.osub == BTRUE)
127: #define istemp(n) (n.otype == OCELL && n.osub == CTEMP)
128: #define isfld(n) (!donefld && n.osub==CFLD && n.otype==OCELL && n.optr->nval==EMPTY)
129: #define isrec(n) (donefld && n.osub==CFLD && n.otype==OCELL && n.optr->nval!=EMPTY)
130: obj nullproc();
131: obj relop();
132:
133: #define MAXSYM 50
134: #define HAT 0177 /* matches ^ in regular expr */
135: /* watch out for mach dep */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.