/* * 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;