Print this page
3731 Update nawk to version 20121220
*** 21,77 ****
/*
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
*/
! /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
! /* All Rights Reserved */
#ifndef AWK_H
#define AWK_H
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libintl.h>
#include <limits.h>
typedef double Awkfloat;
typedef unsigned char uchar;
! #define xfree(a) { if ((a) != NULL) { free(a); a = NULL; } }
#define DEBUG
#ifdef DEBUG
/* uses have to be doubly parenthesized */
#define dprintf(x) if (dbg) (void) printf x
#else
#define dprintf(x)
#endif
- extern char errbuf[200];
- extern void error(int, char *);
- #define ERROR (void) snprintf(errbuf, sizeof (errbuf),
- /*CSTYLED*/
- #define FATAL ), error(1, errbuf)
- /*CSTYLED*/
- #define WARNING ), error(0, errbuf)
- /*CSTYLED*/
- #define SYNTAX ), yyerror(errbuf)
- /*CSTYLED*/
- #define CONT )
-
extern int compile_time; /* 1 if compiling, 0 if running */
! #define FLD_INCR 64
! #define LINE_INCR 256
!
! /* ensure that there is extra 1 byte in the buffer */
! #define expand_buf(p, n, r) \
! if (*(n) == 0 || (r) >= (*(n) - 1)) r_expand_buf(p, n, r)
extern uchar **FS;
extern uchar **RS;
extern uchar **ORS;
extern uchar **OFS;
--- 21,83 ----
/*
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
*/
! /*
! * Copyright (C) Lucent Technologies 1997
! * All Rights Reserved
! *
! * Permission to use, copy, modify, and distribute this software and
! * its documentation for any purpose and without fee is hereby
! * granted, provided that the above copyright notice appear in all
! * copies and that both that the copyright notice and this
! * permission notice and warranty disclaimer appear in supporting
! * documentation, and that the name Lucent Technologies or any of
! * its entities not be used in advertising or publicity pertaining
! * to distribution of the software without specific, written prior
! * permission.
! *
! * LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
! * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
! * IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
! * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
! * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
! * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
! * THIS SOFTWARE.
! */
#ifndef AWK_H
#define AWK_H
#include <sys/types.h>
+ #include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libintl.h>
#include <limits.h>
typedef double Awkfloat;
typedef unsigned char uchar;
! #define xfree(a) { if ((a) != NULL) { free((void *)(a)); (a) = NULL; } }
#define DEBUG
#ifdef DEBUG
/* uses have to be doubly parenthesized */
#define dprintf(x) if (dbg) (void) printf x
#else
#define dprintf(x)
#endif
extern int compile_time; /* 1 if compiling, 0 if running */
+ extern int safe; /* 0 => unsafe, 1 => safe */
! #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */
extern uchar **FS;
extern uchar **RS;
extern uchar **ORS;
extern uchar **OFS;
*** 99,123 ****
uchar ctype; /* OCELL, OBOOL, OJUMP, etc. */
uchar csub; /* CCON, CTEMP, CFLD, etc. */
uchar *nval; /* name, for variables only */
uchar *sval; /* string value */
Awkfloat fval; /* value as number */
! unsigned tval;
/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
struct Cell *cnext; /* ptr to next if chained */
} Cell;
! typedef struct { /* symbol table array */
int nelem; /* elements in table right now */
int size; /* size of tab */
Cell **tab; /* hash table pointers */
} Array;
#define NSYMTAB 50 /* initial size of a symbol table */
extern Array *symtab, *makesymtab(int);
! extern Cell *setsymtab(uchar *, uchar *, Awkfloat, unsigned int, Array *);
! extern Cell *lookup(uchar *, Array *);
extern Cell *recloc; /* location of input record */
extern Cell *nrloc; /* NR */
extern Cell *fnrloc; /* FNR */
extern Cell *nfloc; /* NF */
--- 105,130 ----
uchar ctype; /* OCELL, OBOOL, OJUMP, etc. */
uchar csub; /* CCON, CTEMP, CFLD, etc. */
uchar *nval; /* name, for variables only */
uchar *sval; /* string value */
Awkfloat fval; /* value as number */
! int tval;
/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
struct Cell *cnext; /* ptr to next if chained */
} Cell;
! typedef struct Array { /* symbol table array */
int nelem; /* elements in table right now */
int size; /* size of tab */
Cell **tab; /* hash table pointers */
} Array;
#define NSYMTAB 50 /* initial size of a symbol table */
extern Array *symtab, *makesymtab(int);
! extern Cell *setsymtab(const uchar *, const uchar *, Awkfloat,
! unsigned int, Array *);
! extern Cell *lookup(const uchar *, Array *);
extern Cell *recloc; /* location of input record */
extern Cell *nrloc; /* NR */
extern Cell *fnrloc; /* FNR */
extern Cell *nfloc; /* NF */
*** 132,151 ****
#define ARR 020 /* this is an array */
#define FCN 040 /* this is a function name */
#define FLD 0100 /* this is a field $1, $2, ... */
#define REC 0200 /* this is $0 */
- #define freeable(p) (!((p)->tval & DONTFREE))
extern Awkfloat setfval(Cell *, Awkfloat), getfval(Cell *), r_getfval(Cell *);
! extern uchar *setsval(Cell *, uchar *), *getsval(Cell *), *r_getsval(Cell *);
! extern uchar *tostring(uchar *), *tokname(int), *qstring(uchar *, int);
!
! #define getfval(p) \
! (((p)->tval & (ARR|FLD|REC|NUM)) == NUM ? (p)->fval : r_getfval(p))
! #define getsval(p) \
! (((p)->tval & (ARR|FLD|REC|STR)) == STR ? (p)->sval : r_getsval(p))
/* function types */
#define FLENGTH 1
#define FSQRT 2
#define FEXP 3
--- 139,155 ----
#define ARR 020 /* this is an array */
#define FCN 040 /* this is a function name */
#define FLD 0100 /* this is a field $1, $2, ... */
#define REC 0200 /* this is $0 */
extern Awkfloat setfval(Cell *, Awkfloat), getfval(Cell *), r_getfval(Cell *);
! extern uchar *setsval(Cell *, const uchar *);
! extern uchar *getsval(Cell *);
! extern uchar *tostring(const uchar *);
! extern uchar *tokname(int);
! extern uchar *qstring(const uchar *, int);
/* function types */
#define FLENGTH 1
#define FSQRT 2
#define FEXP 3
*** 157,166 ****
--- 161,171 ----
#define FSIN 9
#define FCOS 10
#define FATAN 11
#define FTOUPPER 12
#define FTOLOWER 13
+ #define FFLUSH 14
/* Node: parse tree is made of nodes, with Cell's at bottom */
typedef struct Node {
int ntype;
*** 188,197 ****
--- 193,203 ----
#define CCON 5
#define CTEMP 4
#define CNAME 3
#define CVAR 2
#define CFLD 1
+ #define CUNK 0
/* bool subtypes */
#define BTRUE 11
#define BFALSE 12
*** 199,208 ****
--- 205,215 ----
#define JEXIT 21
#define JNEXT 22
#define JBREAK 23
#define JCONT 24
#define JRET 25
+ #define JNEXTFILE 26
/* node types */
#define NVALUE 1
#define NSTAT 2
#define NEXPR 3
*** 210,296 ****
extern Cell *(*proctab[])(Node **, int);
extern Cell *nullproc(Node **, int);
extern int pairstack[], paircnt;
! extern Node *stat1(int, Node *), *stat2(int, Node *, Node *);
extern Node *stat3(int, Node *, Node *, Node *);
extern Node *stat4(int, Node *, Node *, Node *, Node *);
extern Node *pa2stat(Node *, Node *, Node *);
! extern Node *op1(int, Node *), *op2(int, Node *, Node *);
extern Node *op3(int, Node *, Node *, Node *);
extern Node *op4(int, Node *, Node *, Node *, Node *);
! extern Node *linkum(Node *, Node *), *valtonode(Cell *, int);
extern Node *rectonode(void), *exptostat(Node *);
extern Node *makearr(Node *);
#define notlegal(n) \
(n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
#define isvalue(n) ((n)->ntype == NVALUE)
#define isexpr(n) ((n)->ntype == NEXPR)
#define isjump(n) ((n)->ctype == OJUMP)
#define isexit(n) ((n)->csub == JEXIT)
#define isbreak(n) ((n)->csub == JBREAK)
#define iscont(n) ((n)->csub == JCONT)
! #define isnext(n) ((n)->csub == JNEXT)
#define isret(n) ((n)->csub == JRET)
#define isstr(n) ((n)->tval & STR)
#define isnum(n) ((n)->tval & NUM)
#define isarr(n) ((n)->tval & ARR)
! #define isfunc(n) ((n)->tval & FCN)
#define istrue(n) ((n)->csub == BTRUE)
#define istemp(n) ((n)->csub == CTEMP)
! #define NCHARS (256+1)
#define NSTATES 32
typedef struct rrow {
! int ltype;
! int lval;
int *lfollow;
} rrow;
typedef struct fa {
uchar *restr;
int anchor;
int use;
- uchar gototab[NSTATES][NCHARS];
- int *posns[NSTATES];
- uchar out[NSTATES];
int initstat;
int curstat;
int accept;
int reset;
! struct rrow re[1];
} fa;
/* b.c */
! extern fa *makedfa(uchar *, int);
! extern int nematch(fa *, uchar *);
! extern int match(fa *, uchar *);
! extern int pmatch(fa *, uchar *);
/* lib.c */
! extern int isclvar(uchar *);
! extern int is_number(uchar *);
extern void setclvar(uchar *);
extern int readrec(uchar **, size_t *, FILE *);
extern void bracecheck(void);
extern void syminit(void);
extern void yyerror(char *);
extern void fldbld(void);
extern void recbld(void);
! extern int getrec(uchar **, size_t *);
extern Cell *fieldadr(int);
extern void newfld(int);
extern Cell *getfld(int);
extern int fldidx(Cell *);
! extern double errcheck(double, char *);
extern void fpecatch(int);
! extern void init_buf(uchar **, size_t *, size_t);
! extern void adjust_buf(uchar **, size_t);
! extern void r_expand_buf(uchar **, size_t *, size_t);
extern int donefld;
extern int donerec;
extern uchar *record;
extern size_t record_size;
--- 217,327 ----
extern Cell *(*proctab[])(Node **, int);
extern Cell *nullproc(Node **, int);
extern int pairstack[], paircnt;
! extern int pgetc(void);
! extern Node *stat1(int, Node *);
! extern Node *stat2(int, Node *, Node *);
extern Node *stat3(int, Node *, Node *, Node *);
extern Node *stat4(int, Node *, Node *, Node *, Node *);
extern Node *pa2stat(Node *, Node *, Node *);
! extern Node *op1(int, Node *);
! extern Node *op2(int, Node *, Node *);
extern Node *op3(int, Node *, Node *, Node *);
extern Node *op4(int, Node *, Node *, Node *, Node *);
! extern Node *linkum(Node *, Node *);
! extern Node *celltonode(Cell *, int);
extern Node *rectonode(void), *exptostat(Node *);
extern Node *makearr(Node *);
+ extern Node *itonp(int);
#define notlegal(n) \
(n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
#define isvalue(n) ((n)->ntype == NVALUE)
#define isexpr(n) ((n)->ntype == NEXPR)
#define isjump(n) ((n)->ctype == OJUMP)
#define isexit(n) ((n)->csub == JEXIT)
#define isbreak(n) ((n)->csub == JBREAK)
#define iscont(n) ((n)->csub == JCONT)
! #define isnext(n) ((n)->csub == JNEXT || (n)->csub == JNEXTFILE)
#define isret(n) ((n)->csub == JRET)
+ #define isrec(n) ((n)->tval & REC)
+ #define isfld(n) ((n)->tval & FLD)
#define isstr(n) ((n)->tval & STR)
#define isnum(n) ((n)->tval & NUM)
#define isarr(n) ((n)->tval & ARR)
! #define isfcn(n) ((n)->tval & FCN)
#define istrue(n) ((n)->csub == BTRUE)
#define istemp(n) ((n)->csub == CTEMP)
+ #define isargument(n) ((n)->nobj == ARG)
+ /* #define freeable(p) (!((p)->tval & DONTFREE)) */
+ #define freeable(p) (((p)->tval & (STR|DONTFREE)) == STR)
! #define NCHARS (256+3) /* 256 handles 8-bit chars; 128 does 7-bit */
! /* watch out in match(), etc. */
#define NSTATES 32
typedef struct rrow {
! long ltype; /* long avoids pointer warnings on 64-bit */
! union {
! int i;
! Node *np;
! uchar *up;
! } lval; /* because Al stores a pointer in it! */
int *lfollow;
} rrow;
typedef struct fa {
+ uchar gototab[NSTATES][NCHARS];
+ uchar out[NSTATES];
uchar *restr;
+ int *posns[NSTATES];
int anchor;
int use;
int initstat;
int curstat;
int accept;
int reset;
! struct rrow re[1]; /* variable: actual size set by calling malloc */
} fa;
/* b.c */
! extern fa *makedfa(const uchar *, int);
! extern int nematch(fa *, const uchar *);
! extern int match(fa *, const uchar *);
! extern int pmatch(fa *, const uchar *);
!
! /* lex.c */
! extern void unput(int);
! extern void unputstr(const char *);
! extern void startreg(void);
/* lib.c */
! extern void recinit(unsigned int);
! extern void growfldtab(int);
! extern int isclvar(const uchar *);
! extern int is_number(const uchar *);
extern void setclvar(uchar *);
extern int readrec(uchar **, size_t *, FILE *);
extern void bracecheck(void);
extern void syminit(void);
extern void yyerror(char *);
extern void fldbld(void);
extern void recbld(void);
! extern int getrec(uchar **, size_t *, int);
extern Cell *fieldadr(int);
extern void newfld(int);
extern Cell *getfld(int);
extern int fldidx(Cell *);
! extern void SYNTAX(const char *, ...);
! extern void FATAL(const char *, ...) __attribute__((__noreturn__));
! extern void WARNING(const char *, ...);
! extern void error(void);
! extern double errcheck(double, const char *);
extern void fpecatch(int);
! extern void nextfile(void);
extern int donefld;
extern int donerec;
extern uchar *record;
extern size_t record_size;
*** 299,320 ****
extern int dbg;
extern uchar *cmdname;
extern uchar *lexprog;
extern int compile_time;
extern char radixpoint;
/* tran.c */
extern void syminit(void);
extern void arginit(int, uchar **);
extern void envinit(uchar **);
extern void freesymtab(Cell *);
! extern void freeelem(Cell *, uchar *);
extern void funnyvar(Cell *, char *);
! extern int hash(uchar *, int);
extern Awkfloat *ARGC;
/* run.c */
extern void run(Node *);
extern int paircnt;
extern Node *winner;
--- 330,353 ----
extern int dbg;
extern uchar *cmdname;
extern uchar *lexprog;
extern int compile_time;
extern char radixpoint;
+ extern uchar *cursource(void);
/* tran.c */
extern void syminit(void);
extern void arginit(int, uchar **);
extern void envinit(uchar **);
extern void freesymtab(Cell *);
! extern void freeelem(Cell *, const uchar *);
extern void funnyvar(Cell *, char *);
! extern int hash(const uchar *, int);
extern Awkfloat *ARGC;
/* run.c */
+ extern int adjbuf(uchar **, size_t *, int, int, uchar **, const char *);
extern void run(Node *);
extern int paircnt;
extern Node *winner;
*** 323,332 ****
--- 356,370 ----
#endif
extern int yyparse(void);
extern FILE *yyin;
extern off_t lineno;
+ /* parse.c */
+ extern int ptoi(void *);
+ extern int isarg(const uchar *);
+ extern void defn(Cell *, Node *, Node *);
+
/* proc */
extern Cell *nullproc(Node **, int);
extern Cell *program(Node **, int);
extern Cell *boolop(Node **, int);
extern Cell *relop(Node **, int);
*** 334,355 ****
extern Cell *indirect(Node **, int);
extern Cell *substr(Node **, int);
extern Cell *sub(Node **, int);
extern Cell *gsub(Node **, int);
extern Cell *sindex(Node **, int);
! extern Cell *a_sprintf(Node **, int);
extern Cell *arith(Node **, int);
extern Cell *incrdecr(Node **, int);
extern Cell *cat(Node **, int);
extern Cell *pastat(Node **, int);
extern Cell *dopa2(Node **, int);
extern Cell *matchop(Node **, int);
extern Cell *intest(Node **, int);
! extern Cell *aprintf(Node **, int);
! extern Cell *print(Node **, int);
extern Cell *closefile(Node **, int);
! extern Cell *delete(Node **, int);
extern Cell *split(Node **, int);
extern Cell *assign(Node **, int);
extern Cell *condexpr(Node **, int);
extern Cell *ifstat(Node **, int);
extern Cell *whilestat(Node **, int);
--- 372,393 ----
extern Cell *indirect(Node **, int);
extern Cell *substr(Node **, int);
extern Cell *sub(Node **, int);
extern Cell *gsub(Node **, int);
extern Cell *sindex(Node **, int);
! extern Cell *awksprintf(Node **, int);
extern Cell *arith(Node **, int);
extern Cell *incrdecr(Node **, int);
extern Cell *cat(Node **, int);
extern Cell *pastat(Node **, int);
extern Cell *dopa2(Node **, int);
extern Cell *matchop(Node **, int);
extern Cell *intest(Node **, int);
! extern Cell *awkprintf(Node **, int);
! extern Cell *printstat(Node **, int);
extern Cell *closefile(Node **, int);
! extern Cell *awkdelete(Node **, int);
extern Cell *split(Node **, int);
extern Cell *assign(Node **, int);
extern Cell *condexpr(Node **, int);
extern Cell *ifstat(Node **, int);
extern Cell *whilestat(Node **, int);
*** 359,366 ****
extern Cell *jump(Node **, int);
extern Cell *bltin(Node **, int);
extern Cell *call(Node **, int);
extern Cell *arg(Node **, int);
extern Cell *getnf(Node **, int);
! extern Cell *getaline(Node **, int);
#endif /* AWK_H */
--- 397,404 ----
extern Cell *jump(Node **, int);
extern Cell *bltin(Node **, int);
extern Cell *call(Node **, int);
extern Cell *arg(Node **, int);
extern Cell *getnf(Node **, int);
! extern Cell *awkgetline(Node **, int);
#endif /* AWK_H */