9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

awk.h (4625B)


      1 /*
      2 Copyright (c) Lucent Technologies 1997
      3 	All Rights Reserved
      4 
      5 */
      6 
      7 typedef double	Awkfloat;
      8 
      9 /* unsigned char is more trouble than it's worth */
     10 
     11 typedef	unsigned char uschar;
     12 
     13 #define	xfree(a)	{ if ((a) != NULL) { free((char *) a); a = NULL; } }
     14 
     15 #define	DEBUG
     16 #ifdef	DEBUG
     17 			/* uses have to be doubly parenthesized */
     18 #	define	dprintf(x)	if (dbg) printf x
     19 #else
     20 #	define	dprintf(x)
     21 #endif
     22 
     23 extern	char	errbuf[];
     24 
     25 extern int	compile_time;	/* 1 if compiling, 0 if running */
     26 extern int	safe;		/* 0 => unsafe, 1 => safe */
     27 
     28 #define	RECSIZE	(8 * 1024)	/* sets limit on records, fields, etc., etc. */
     29 extern int	recsize;	/* size of current record, orig RECSIZE */
     30 
     31 extern char	**FS;
     32 extern char	**RS;
     33 extern char	**ORS;
     34 extern char	**OFS;
     35 extern char	**OFMT;
     36 extern Awkfloat *NR;
     37 extern Awkfloat *FNR;
     38 extern Awkfloat *NF;
     39 extern char	**FILENAME;
     40 extern char	**SUBSEP;
     41 extern Awkfloat *RSTART;
     42 extern Awkfloat *RLENGTH;
     43 
     44 extern char	*record;	/* points to $0 */
     45 extern int	lineno;		/* line number in awk program */
     46 extern int	errorflag;	/* 1 if error has occurred */
     47 extern int	donefld;	/* 1 if record broken into fields */
     48 extern int	donerec;	/* 1 if record is valid (no fld has changed */
     49 extern char	inputFS[];	/* FS at time of input, for field splitting */
     50 
     51 extern int	dbg;
     52 
     53 extern	char	*patbeg;	/* beginning of pattern matched */
     54 extern	int	patlen;		/* length of pattern matched.  set in b.c */
     55 
     56 /* Cell:  all information about a variable or constant */
     57 
     58 typedef struct Cell {
     59 	uschar	ctype;		/* OCELL, OBOOL, OJUMP, etc. */
     60 	uschar	csub;		/* CCON, CTEMP, CFLD, etc. */
     61 	char	*nval;		/* name, for variables only */
     62 	char	*sval;		/* string value */
     63 	Awkfloat fval;		/* value as number */
     64 	int	 tval;		/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
     65 	struct Cell *cnext;	/* ptr to next if chained */
     66 } Cell;
     67 
     68 typedef struct Array {		/* symbol table array */
     69 	int	nelem;		/* elements in table right now */
     70 	int	size;		/* size of tab */
     71 	Cell	**tab;		/* hash table pointers */
     72 } Array;
     73 
     74 #define	NSYMTAB	50	/* initial size of a symbol table */
     75 extern Array	*symtab;
     76 
     77 extern Cell	*nrloc;		/* NR */
     78 extern Cell	*fnrloc;	/* FNR */
     79 extern Cell	*nfloc;		/* NF */
     80 extern Cell	*rstartloc;	/* RSTART */
     81 extern Cell	*rlengthloc;	/* RLENGTH */
     82 
     83 /* Cell.tval values: */
     84 #define	NUM	01	/* number value is valid */
     85 #define	STR	02	/* string value is valid */
     86 #define DONTFREE 04	/* string space is not freeable */
     87 #define	CON	010	/* this is a constant */
     88 #define	ARR	020	/* this is an array */
     89 #define	FCN	040	/* this is a function name */
     90 #define FLD	0100	/* this is a field $1, $2, ... */
     91 #define	REC	0200	/* this is $0 */
     92 
     93 
     94 /* function types */
     95 #define	FLENGTH	1
     96 #define	FSQRT	2
     97 #define	FEXP	3
     98 #define	FLOG	4
     99 #define	FINT	5
    100 #define	FSYSTEM	6
    101 #define	FRAND	7
    102 #define	FSRAND	8
    103 #define	FSIN	9
    104 #define	FCOS	10
    105 #define	FATAN	11
    106 #define	FTOUPPER 12
    107 #define	FTOLOWER 13
    108 #define	FFLUSH	14
    109 #define	FUTF	15
    110 
    111 /* Node:  parse tree is made of nodes, with Cell's at bottom */
    112 
    113 typedef struct Node {
    114 	int	ntype;
    115 	struct	Node *nnext;
    116 	int	lineno;
    117 	int	nobj;
    118 	struct	Node *narg[1];	/* variable: actual size set by calling malloc */
    119 } Node;
    120 
    121 #define	NIL	((Node *) 0)
    122 
    123 extern Node	*winner;
    124 extern Node	*nullstat;
    125 extern Node	*nullnode;
    126 
    127 /* ctypes */
    128 #define OCELL	1
    129 #define OBOOL	2
    130 #define OJUMP	3
    131 
    132 /* Cell subtypes: csub */
    133 #define	CFREE	7
    134 #define CCOPY	6
    135 #define CCON	5
    136 #define CTEMP	4
    137 #define CNAME	3 
    138 #define CVAR	2
    139 #define CFLD	1
    140 #define	CUNK	0
    141 
    142 /* bool subtypes */
    143 #define BTRUE	11
    144 #define BFALSE	12
    145 
    146 /* jump subtypes */
    147 #define JEXIT	21
    148 #define JNEXT	22
    149 #define	JBREAK	23
    150 #define	JCONT	24
    151 #define	JRET	25
    152 #define	JNEXTFILE	26
    153 
    154 /* node types */
    155 #define NVALUE	1
    156 #define NSTAT	2
    157 #define NEXPR	3
    158 
    159 
    160 extern	int	pairstack[], paircnt;
    161 
    162 #define notlegal(n)	(n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
    163 #define isvalue(n)	((n)->ntype == NVALUE)
    164 #define isexpr(n)	((n)->ntype == NEXPR)
    165 #define isjump(n)	((n)->ctype == OJUMP)
    166 #define isexit(n)	((n)->csub == JEXIT)
    167 #define	isbreak(n)	((n)->csub == JBREAK)
    168 #define	iscont(n)	((n)->csub == JCONT)
    169 #define	isnext(n)	((n)->csub == JNEXT)
    170 #define	isnextfile(n)	((n)->csub == JNEXTFILE)
    171 #define	isret(n)	((n)->csub == JRET)
    172 #define isrec(n)	((n)->tval & REC)
    173 #define isfld(n)	((n)->tval & FLD)
    174 #define isstr(n)	((n)->tval & STR)
    175 #define isnum(n)	((n)->tval & NUM)
    176 #define isarr(n)	((n)->tval & ARR)
    177 #define isfcn(n)	((n)->tval & FCN)
    178 #define istrue(n)	((n)->csub == BTRUE)
    179 #define istemp(n)	((n)->csub == CTEMP)
    180 #define	isargument(n)	((n)->nobj == ARG)
    181 /* #define freeable(p)	(!((p)->tval & DONTFREE)) */
    182 #define freeable(p)	( ((p)->tval & (STR|DONTFREE)) == STR )
    183 
    184 #include "proto.h"
    185