187 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
 * a small awk clone
 | 
						|
 *
 | 
						|
 * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi
 | 
						|
 *
 | 
						|
 * Absolutely no warranty. Use this software with your own risk.
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify and distribute this software for any
 | 
						|
 * purpose and without fee is hereby granted, provided that the above
 | 
						|
 * copyright and disclaimer notice.
 | 
						|
 *
 | 
						|
 * This program was written to fit into 64K+64K memory of the Minix 1.2.
 | 
						|
 */
 | 
						|
 | 
						|
/* lexical/parser tokens and executable statements */
 | 
						|
 | 
						|
#define FIRSTP	256
 | 
						|
#define ARG	256
 | 
						|
#define ARITH	257
 | 
						|
#define ARRAY	258
 | 
						|
#define ASSIGN	259
 | 
						|
#define CALL	260
 | 
						|
#define CAT	261
 | 
						|
#define COND	262
 | 
						|
#define DELETE	263
 | 
						|
#define DO	264
 | 
						|
#define ELEMENT	265
 | 
						|
#define FIELD	266
 | 
						|
#define FOR	267
 | 
						|
#define FORIN	268
 | 
						|
#define GETLINE	269
 | 
						|
#define IF	270
 | 
						|
#define IN	271
 | 
						|
#define JUMP	272
 | 
						|
#define MATHFUN	273
 | 
						|
#define NULPROC	274
 | 
						|
#define P1STAT	275
 | 
						|
#define P2STAT	276
 | 
						|
#define PRINT	277
 | 
						|
#define PRINT0	278
 | 
						|
#define STRFUN	279
 | 
						|
#define SUBST	280
 | 
						|
#define USRFUN	281
 | 
						|
#define WHILE	282
 | 
						|
#define LASTP	282
 | 
						|
	/* lexical token */
 | 
						|
 | 
						|
#define ADD	300	/* + */
 | 
						|
#define ADDEQ	301	/* += */
 | 
						|
#define AND	302	/* && */
 | 
						|
#define BEGIN	303	/* BEGIN */
 | 
						|
#define BINAND	304	/* & */
 | 
						|
#define BINOR	305	/* | */
 | 
						|
#define BREAK	306	/* break */
 | 
						|
#define CLOSE	307	/* close */
 | 
						|
#define CONTIN	308	/* continue */
 | 
						|
#define DEC	309	/* -- */
 | 
						|
#define DIV	310	/* / */
 | 
						|
#define DIVEQ	311	/* /= */
 | 
						|
#define	ELSE	312	/* else */
 | 
						|
#define END	313	/* END */
 | 
						|
#define EOL	314	/* ; or '\n' */
 | 
						|
#define EQ	315	/* == */
 | 
						|
#define EXIT	316	/* exit */
 | 
						|
#define FUNC	317	/* function */
 | 
						|
#define GE	318	/* >= */
 | 
						|
#define GT	319	/* > */
 | 
						|
#define IDENT	320	/* identifier */
 | 
						|
#define INC	321	/* ++ */
 | 
						|
#define LE	322	/* <= */
 | 
						|
#define LT	323	/* < */
 | 
						|
#define MATCH	324	/* ~ */
 | 
						|
#define MOD	325	/* % */
 | 
						|
#define MODEQ	326	/* %= */
 | 
						|
#define MULT	327	/* * */
 | 
						|
#define MULTEQ	328	/* *= */
 | 
						|
#define NE	329	/* != */
 | 
						|
#define NEXT	330	/* next */
 | 
						|
#define NOMATCH	331	/* !~ */
 | 
						|
#define NOT	332	/* ! */
 | 
						|
#define NUMBER	333	/* integer or floating number */
 | 
						|
#define OR	334	/* || */
 | 
						|
#define POWEQ	335	/* ^= */
 | 
						|
#define POWER	336	/* ^ */
 | 
						|
#define PRINTF	337	/* printf */
 | 
						|
#define REGEXP	338	/* /REG/ */
 | 
						|
#define RETURN	339	/* return */
 | 
						|
#define SHIFTL	340	/* << */
 | 
						|
#define SHIFTR	341	/* >> */
 | 
						|
#define SPRINT	342	/* sprint */
 | 
						|
#define SPRINTF	343	/* sprintf */
 | 
						|
#define STRING	344	/* ".." */
 | 
						|
#define SUB	345	/* - */
 | 
						|
#define SUBEQ	346	/* -= */
 | 
						|
#define SYSTEM	347	/* system */
 | 
						|
#define UMINUS	348	/* - */
 | 
						|
 | 
						|
/* tokens in parser */
 | 
						|
 | 
						|
#define VALUE	400	/* value node */
 | 
						|
#define INCDEC	401	/* ++, -- */
 | 
						|
#define PRE	402	/* pre incre/decre */
 | 
						|
#define POST	403	/* post incre/decre */
 | 
						|
 | 
						|
/* redirect in print(f) statement */
 | 
						|
 | 
						|
#define R_OUT	410	/* > */
 | 
						|
#define R_APD	411	/* >> */
 | 
						|
#define R_PIPE	412	/* | */
 | 
						|
#define R_IN	413	/* < */
 | 
						|
#define R_PIN	414	/* | getline */
 | 
						|
#define R_POUT	415	/* print | */
 | 
						|
 | 
						|
/* function */
 | 
						|
 | 
						|
#define ATAN2	500	/* atan2 */
 | 
						|
#define COS	501	/* cos */
 | 
						|
#define EXP	502	/* exp */
 | 
						|
#define INDEX	503	/* index */
 | 
						|
#define INT	504	/* int */
 | 
						|
#define LENGTH	505	/* length */
 | 
						|
#define LOG	506	/* log */
 | 
						|
#define RAND	507	/* rand */
 | 
						|
#define RGSUB	508	/* gsub */
 | 
						|
#define RMATCH	509	/* match */
 | 
						|
#define RSUB	510	/* sub */
 | 
						|
#define SIN	511	/* sin */
 | 
						|
#define SPLIT	512	/* split */
 | 
						|
#define SQRT	513	/* sqrt */
 | 
						|
#define SRAND	514	/* srand */
 | 
						|
#define SUBSTR	515	/* substr */
 | 
						|
 | 
						|
/* print(f) options */
 | 
						|
 | 
						|
#define FORMAT	1024	/* PRINTF, SPRINTF */
 | 
						|
#define STROUT	2048	/* SPRINTF */
 | 
						|
#define PRMASK	0x3ff	/* ~(FORMAT|STROUT) */
 | 
						|
 | 
						|
	/* node - used in parsed tree */
 | 
						|
 | 
						|
struct node {
 | 
						|
  int n_type;			/* node type */
 | 
						|
  struct node *n_next;		/* pointer to next node */
 | 
						|
  struct node *n_arg[1];	/* argument (variable length) */
 | 
						|
};
 | 
						|
 | 
						|
typedef struct node NODE;
 | 
						|
 | 
						|
	/* object cell */
 | 
						|
 | 
						|
struct cell {
 | 
						|
  int c_type;		/* cell type */
 | 
						|
  char *c_sval;		/* string value */
 | 
						|
  double c_fval;	/* floating value */
 | 
						|
};
 | 
						|
 | 
						|
typedef struct cell CELL;
 | 
						|
 | 
						|
	/* cell type */
 | 
						|
 | 
						|
#define UDF	0	/* pass parameter */
 | 
						|
#define VAR	1	/* variable */
 | 
						|
#define NUM	2	/* number */
 | 
						|
#define ARR	4	/* array */
 | 
						|
#define STR	8	/* string */
 | 
						|
#define REC	16	/* record */
 | 
						|
#define FLD	32	/* filed */
 | 
						|
#define PAT	64	/* pattern (compiled REGEXPR) */
 | 
						|
#define BRK	128	/* break */
 | 
						|
#define CNT	256	/* continue */
 | 
						|
#define NXT	512	/* next */
 | 
						|
#define EXT	1024	/* exit */
 | 
						|
#define RTN	2048	/* return */
 | 
						|
#define TMP	4096	/* temp cell */
 | 
						|
#define POS	8192	/* argument position */
 | 
						|
#define FUN	16384	/* function */
 | 
						|
 | 
						|
	/* symbol cell - linked to symbol table */
 | 
						|
 | 
						|
struct symbol {
 | 
						|
  char *s_name;
 | 
						|
  CELL *s_val;
 | 
						|
  struct symbol *s_next;
 | 
						|
};
 | 
						|
 | 
						|
typedef struct symbol SYMBOL;
 |