aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2019-11-10 21:19:18 +0200
committerArnold D. Robbins <arnold@skeeve.com>2019-11-10 21:19:18 +0200
commit108224b4845d7ac622cdc3dcbe47b463e4253a4b (patch)
tree7dd5a7746be9b5f7b62621d2037c7e7763926437
parentc879fbf013b5314c27fa236c987ea56a521420e6 (diff)
downloadone-true-awk-108224b4845d7ac622cdc3dcbe47b463e4253a4b.tar.gz
Convert variables to bool and enum.
-rw-r--r--FIXES6
-rw-r--r--awk.h16
-rw-r--r--awkgram.y8
-rw-r--r--b.c38
-rw-r--r--lex.c12
-rw-r--r--lib.c51
-rw-r--r--main.c13
-rw-r--r--proto.h10
-rw-r--r--run.c14
-rw-r--r--tran.c28
10 files changed, 106 insertions, 90 deletions
diff --git a/FIXES b/FIXES
index c7757f9..db8c898 100644
--- a/FIXES
+++ b/FIXES
@@ -25,6 +25,12 @@ THIS SOFTWARE.
This file lists all bug fixes, changes, etc., made since the AWK book
was sent to the printers in August, 1987.
+November 10, 2019:
+ Convert a number of Boolean integer variables into
+ actual bools. Convert compile_time variable into an
+ enum and simplify some of the related code. Thanks
+ to Arnold Robbins.
+
November 8, 2019:
Fix from Ori Bernstein to get UTF-8 characters instead of
bytes when FS = "". This is currently the only bit of
diff --git a/awk.h b/awk.h
index fa76ffc..bede1b0 100644
--- a/awk.h
+++ b/awk.h
@@ -24,6 +24,7 @@ THIS SOFTWARE.
#include <assert.h>
#include <stdint.h>
+#include <stdbool.h>
typedef double Awkfloat;
@@ -48,8 +49,13 @@ typedef unsigned char uschar;
# define dprintf(x)
#endif
-extern int compile_time; /* 1 if compiling, 0 if running */
-extern int safe; /* 0 => unsafe, 1 => safe */
+extern enum compile_states {
+ RUNNING,
+ COMPILING,
+ ERROR_PRINTING
+} compile_time;
+
+extern bool safe; /* false => unsafe, true => safe */
#define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */
extern int recsize; /* size of current record, orig RECSIZE */
@@ -70,8 +76,8 @@ extern Awkfloat *RLENGTH;
extern char *record; /* points to $0 */
extern int lineno; /* line number in awk program */
extern int errorflag; /* 1 if error has occurred */
-extern int donefld; /* 1 if record broken into fields */
-extern int donerec; /* 1 if record is valid (no fld has changed */
+extern bool donefld; /* true if record broken into fields */
+extern bool donerec; /* true if record is valid (no fld has changed */
extern char inputFS[]; /* FS at time of input, for field splitting */
extern int dbg;
@@ -237,7 +243,7 @@ typedef struct fa {
uschar *restr;
int **posns;
int state_count;
- int anchor;
+ bool anchor;
int use;
int initstat;
int curstat;
diff --git a/awkgram.y b/awkgram.y
index c5356d7..894f9b5 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -32,8 +32,8 @@ int yywrap(void) { return(1); }
Node *beginloc = 0;
Node *endloc = 0;
-int infunc = 0; /* = 1 if in arglist or body of func */
-int inloop = 0; /* = 1 if in while, for, do */
+bool infunc = false; /* = true if in arglist or body of func */
+int inloop = 0; /* >= 1 if in while, for, do; can't be bool, since loops can next */
char *curfname = 0; /* current function name */
Node *arglist = 0; /* list of args for current function */
%}
@@ -182,8 +182,8 @@ pa_stat:
{ beginloc = linkum(beginloc, $3); $$ = 0; }
| XEND lbrace stmtlist '}'
{ endloc = linkum(endloc, $3); $$ = 0; }
- | FUNC funcname '(' varlist rparen {infunc++;} lbrace stmtlist '}'
- { infunc--; curfname=0; defn((Cell *)$2, $4, $8); $$ = 0; }
+ | FUNC funcname '(' varlist rparen {infunc = true;} lbrace stmtlist '}'
+ { infunc = false; curfname=0; defn((Cell *)$2, $4, $8); $$ = 0; }
;
pa_stats:
diff --git a/b.c b/b.c
index ac892b8..407e622 100644
--- a/b.c
+++ b/b.c
@@ -141,7 +141,7 @@ out:
overflo(__func__);
}
-fa *makedfa(const char *s, int anchor) /* returns dfa for reg expr s */
+fa *makedfa(const char *s, bool anchor) /* returns dfa for reg expr s */
{
int i, use, nuse;
fa *pfa;
@@ -151,7 +151,7 @@ fa *makedfa(const char *s, int anchor) /* returns dfa for reg expr s */
resizesetvec(__func__);
}
- if (compile_time) /* a constant for sure */
+ if (compile_time != RUNNING) /* a constant for sure */
return mkdfa(s, anchor);
for (i = 0; i < nfatab; i++) /* is it there already? */
if (fatab[i]->anchor == anchor
@@ -179,7 +179,7 @@ fa *makedfa(const char *s, int anchor) /* returns dfa for reg expr s */
return pfa;
}
-fa *mkdfa(const char *s, int anchor) /* does the real work of making a dfa */
+fa *mkdfa(const char *s, bool anchor) /* does the real work of making a dfa */
/* anchor = 1 for anchored matches, else 0 */
{
Node *p, *p1;
@@ -214,7 +214,7 @@ fa *mkdfa(const char *s, int anchor) /* does the real work of making a dfa */
return f;
}
-int makeinit(fa *f, int anchor)
+int makeinit(fa *f, bool anchor)
{
int i, k;
@@ -645,11 +645,11 @@ int nematch(fa *f, const char *p0) /* non-empty match, for sub */
* a match is found, patbeg and patlen are set appropriately.
*
* RETURN VALUES
- * 0 No match found.
- * 1 Match found.
+ * false No match found.
+ * true Match found.
*/
-int fnematch(fa *pfa, FILE *f, char **pbuf, int *pbufsize, int quantum)
+bool fnematch(fa *pfa, FILE *f, char **pbuf, int *pbufsize, int quantum)
{
char *buf = *pbuf;
int bufsize = *pbufsize;
@@ -715,10 +715,10 @@ int fnematch(fa *pfa, FILE *f, char **pbuf, int *pbufsize, int quantum)
FATAL("unable to ungetc '%c'", buf[k]);
while (k > i + patlen);
buf[k] = 0;
- return 1;
+ return true;
}
else
- return 0;
+ return false;
}
Node *reparse(const char *p) /* parses regular expression pointed to by p */
@@ -908,7 +908,7 @@ replace_repeat(const uschar *reptok, int reptoklen, const uschar *atom,
int i, j;
uschar *buf = 0;
int ret = 1;
- int init_q = (firstnum==0); /* first added char will be ? */
+ int init_q = (firstnum == 0); /* first added char will be ? */
int n_q_reps = secondnum-firstnum; /* m>n, so reduce until {1,m-n} left */
int prefix_length = reptok - basestr; /* prefix includes first rep */
int suffix_length = strlen((const char *) reptok) - reptoklen; /* string after rep specifier */
@@ -942,8 +942,9 @@ replace_repeat(const uschar *reptok, int reptoklen, const uschar *atom,
if (special_case == REPEAT_PLUS_APPENDED) {
buf[j++] = '+';
} else if (special_case == REPEAT_WITH_Q) {
- if (init_q) buf[j++] = '?';
- for (i=0; i < n_q_reps; i++) { /* copy x? reps */
+ if (init_q)
+ buf[j++] = '?';
+ for (i = 0; i < n_q_reps; i++) { /* copy x? reps */
memcpy(&buf[j], atom, atomlen);
j += atomlen;
buf[j++] = '?';
@@ -1017,7 +1018,8 @@ int relex(void) /* lexical analyzer for reparse */
uschar *bp;
struct charclass *cc;
int i;
- int num, m, commafound, digitfound;
+ int num, m;
+ bool commafound, digitfound;
const uschar *startreptok;
static int parens = 0;
@@ -1151,8 +1153,8 @@ rescan:
if (isdigit(*(prestr))) {
num = 0; /* Process as a repetition */
n = -1; m = -1;
- commafound = 0;
- digitfound = 0;
+ commafound = false;
+ digitfound = false;
startreptok = prestr-1;
/* Remember start of previous atom here ? */
} else { /* just a { char, not a repetition */
@@ -1199,15 +1201,15 @@ rescan:
lastre);
} else if (isdigit(c)) {
num = 10 * num + c - '0';
- digitfound = 1;
+ digitfound = true;
} else if (c == ',') {
if (commafound)
FATAL("illegal repetition expression: class %.20s",
lastre);
/* looking for {n,} or {n,m} */
- commafound = 1;
+ commafound = true;
n = num;
- digitfound = 0; /* reset */
+ digitfound = false; /* reset */
num = 0;
} else {
FATAL("illegal repetition expression: class %.20s",
diff --git a/lex.c b/lex.c
index d64fa0b..2de0603 100644
--- a/lex.c
+++ b/lex.c
@@ -164,8 +164,8 @@ int gettok(char **pbuf, int *psz) /* get next input token */
int word(char *);
int string(void);
int regexpr(void);
-int sc = 0; /* 1 => return a } right now */
-int reg = 0; /* 1 => return a REGEXPR now */
+bool sc = false; /* true => return a } right now */
+bool reg = false; /* true => return a REGEXPR now */
int yylex(void)
{
@@ -176,11 +176,11 @@ int yylex(void)
if (buf == NULL && (buf = malloc(bufsize)) == NULL)
FATAL( "out of space in yylex" );
if (sc) {
- sc = 0;
+ sc = false;
RET('}');
}
if (reg) {
- reg = 0;
+ reg = false;
return regexpr();
}
for (;;) {
@@ -327,7 +327,7 @@ int yylex(void)
case '}':
if (--bracecnt < 0)
SYNTAX( "extra }" );
- sc = 1;
+ sc = true;
RET(';');
case ']':
if (--brackcnt < 0)
@@ -500,7 +500,7 @@ int word(char *w)
void startreg(void) /* next call to yylex will return a regular expression */
{
- reg = 1;
+ reg = true;
}
int regexpr(void)
diff --git a/lib.c b/lib.c
index 0fa90e4..dbc09c3 100644
--- a/lib.c
+++ b/lib.c
@@ -45,8 +45,8 @@ char inputFS[100] = " ";
#define MAXFLD 2
int nfields = MAXFLD; /* last allocated slot for $i */
-int donefld; /* 1 = implies rec broken into fields */
-int donerec; /* 1 = record is valid (no flds have changed) */
+bool donefld; /* true = implies rec broken into fields */
+bool donerec; /* true = record is valid (no flds have changed) */
int lastfld = 0; /* last used field */
int argno = 1; /* current input argument number */
@@ -121,9 +121,9 @@ void savefs(void)
strcpy(inputFS, *FS);
}
-static int firsttime = 1;
+static bool firsttime = true;
-int getrec(char **pbuf, int *pbufsize, int isrecord) /* get next input record */
+int getrec(char **pbuf, int *pbufsize, bool isrecord) /* get next input record */
{ /* note: cares whether buf == record */
int c;
char *buf = *pbuf;
@@ -131,14 +131,14 @@ int getrec(char **pbuf, int *pbufsize, int isrecord) /* get next input record */
int bufsize = *pbufsize, savebufsize = bufsize;
if (firsttime) {
- firsttime = 0;
+ firsttime = false;
initgetrec();
}
dprintf( ("RS=<%s>, FS=<%s>, ARGC=%g, FILENAME=%s\n",
*RS, *FS, *ARGC, *FILENAME) );
if (isrecord) {
- donefld = 0;
- donerec = 1;
+ donefld = false;
+ donerec = true;
savefs();
}
saveb0 = buf[0];
@@ -210,7 +210,7 @@ int readrec(char **pbuf, int *pbufsize, FILE *inf) /* read one record into buf *
char *rs = getsval(rsloc);
if (*rs && rs[1]) {
- int found;
+ bool found;
fa *pfa = makedfa(rs, 1);
found = fnematch(pfa, inf, &buf, &bufsize, recsize);
@@ -377,7 +377,7 @@ void fldbld(void) /* create fields from current record */
FATAL("record `%.30s...' has too many fields; can't happen", r);
cleanfld(i+1, lastfld); /* clean out junk from previous record */
lastfld = i;
- donefld = 1;
+ donefld = true;
for (j = 1; j <= lastfld; j++) {
p = fldtab[j];
if(is_number(p->sval)) {
@@ -386,7 +386,7 @@ void fldbld(void) /* create fields from current record */
}
}
setfval(nfloc, (Awkfloat) lastfld);
- donerec = 1; /* restore */
+ donerec = true; /* restore */
if (dbg) {
for (j = 0; j <= lastfld; j++) {
p = fldtab[j];
@@ -513,7 +513,7 @@ void recbld(void) /* create $0 from $1..$NF if necessary */
char *r, *p;
char *sep = getsval(ofsloc);
- if (donerec == 1)
+ if (donerec)
return;
r = record;
for (i = 1; i <= *NF; i++) {
@@ -541,7 +541,7 @@ void recbld(void) /* create $0 from $1..$NF if necessary */
dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, (void*)fldtab[0]) );
dprintf( ("recbld = |%s|\n", record) );
- donerec = 1;
+ donerec = true;
}
int errorflag = 0;
@@ -566,7 +566,7 @@ void SYNTAX(const char *fmt, ...)
fprintf(stderr, " at source line %d", lineno);
if (curfname != NULL)
fprintf(stderr, " in function %s", curfname);
- if (compile_time == 1 && cursource() != NULL)
+ if (compile_time == COMPILING && cursource() != NULL)
fprintf(stderr, " source file %s", cursource());
fprintf(stderr, "\n");
errorflag = 2;
@@ -640,17 +640,20 @@ void error()
extern Node *curnode;
fprintf(stderr, "\n");
- if (compile_time != 2 && NR && *NR > 0) {
- fprintf(stderr, " input record number %d", (int) (*FNR));
- if (strcmp(*FILENAME, "-") != 0)
- fprintf(stderr, ", file %s", *FILENAME);
- fprintf(stderr, "\n");
+ if (compile_time != ERROR_PRINTING) {
+ if (NR && *NR > 0) {
+ fprintf(stderr, " input record number %d", (int) (*FNR));
+ if (strcmp(*FILENAME, "-") != 0)
+ fprintf(stderr, ", file %s", *FILENAME);
+ fprintf(stderr, "\n");
+ }
+ if (curnode)
+ fprintf(stderr, " source line number %d", curnode->lineno);
+ else if (lineno)
+ fprintf(stderr, " source line number %d", lineno);
}
- if (compile_time != 2 && curnode)
- fprintf(stderr, " source line number %d", curnode->lineno);
- else if (compile_time != 2 && lineno)
- fprintf(stderr, " source line number %d", lineno);
- if (compile_time == 1 && cursource() != NULL)
+
+ if (compile_time == COMPILING && cursource() != NULL)
fprintf(stderr, " source file %s", cursource());
fprintf(stderr, "\n");
eprint();
@@ -663,7 +666,7 @@ void eprint(void) /* try to print context around error */
static int been_here = 0;
extern char ebuf[], *ep;
- if (compile_time == 2 || compile_time == 0 || been_here++ > 0 || ebuf == ep)
+ if (compile_time != COMPILING || been_here++ > 0 || ebuf == ep)
return;
if (ebuf == ep)
return;
diff --git a/main.c b/main.c
index 255ded7..3e27702 100644
--- a/main.c
+++ b/main.c
@@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
****************************************************************/
-const char *version = "version 20191108";
+const char *version = "version 20191110";
#define DEBUG
#include <stdio.h>
@@ -43,8 +43,7 @@ char *cmdname; /* gets argv[0] for error messages */
extern FILE *yyin; /* lex input file */
char *lexprog; /* points to program argument if it exists */
extern int errorflag; /* non-zero if any syntax errors; set by yyerror */
-int compile_time = 2; /* for error printing: */
- /* 2 = cmdline, 1 = compile, 0 = running */
+enum compile_states compile_time = ERROR_PRINTING;
#define MAX_PFILE 20 /* max number of -f's */
@@ -52,7 +51,7 @@ char *pfile[MAX_PFILE]; /* program filenames from -f's */
int npfile = 0; /* number of filenames */
int curpfile = 0; /* current filename */
-int safe = 0; /* 1 => "safe" mode */
+bool safe = false; /* true => "safe" mode */
/* Can this work with recursive calls? I don't think so.
void segvcatch(int n)
@@ -96,7 +95,7 @@ int main(int argc, char *argv[])
switch (argv[1][1]) {
case 's':
if (strcmp(argv[1], "-safe") == 0)
- safe = 1;
+ safe = true;
break;
case 'f': /* next argument is program filename */
if (argv[1][2] != 0) { /* arg is -fsomething */
@@ -171,7 +170,7 @@ int main(int argc, char *argv[])
}
recinit(recsize);
syminit();
- compile_time = 1;
+ compile_time = COMPILING;
argv[0] = cmdname; /* put prog name at front of arglist */
dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) );
arginit(argc, argv);
@@ -183,7 +182,7 @@ int main(int argc, char *argv[])
*FS = qstring(fs, '\0');
dprintf( ("errorflag=%d\n", errorflag) );
if (errorflag == 0) {
- compile_time = 0;
+ compile_time = RUNNING;
run(winner);
} else
bracecheck();
diff --git a/proto.h b/proto.h
index 00ad151..6918e1f 100644
--- a/proto.h
+++ b/proto.h
@@ -38,9 +38,9 @@ extern int yylook(void);
extern int yyback(int *, int);
extern int yyinput(void);
-extern fa *makedfa(const char *, int);
-extern fa *mkdfa(const char *, int);
-extern int makeinit(fa *, int);
+extern fa *makedfa(const char *, bool);
+extern fa *mkdfa(const char *, bool);
+extern int makeinit(fa *, bool);
extern void penter(Node *);
extern void freetr(Node *);
extern int hexstr(const uschar **);
@@ -54,7 +54,7 @@ extern int member(int, const char *);
extern int match(fa *, const char *);
extern int pmatch(fa *, const char *);
extern int nematch(fa *, const char *);
-extern int fnematch(fa *, FILE *, char **, int *, int);
+extern bool fnematch(fa *, FILE *, char **, int *, int);
extern Node *reparse(const char *);
extern Node *regexp(void);
extern Node *primary(void);
@@ -119,7 +119,7 @@ extern void initgetrec(void);
extern void makefields(int, int);
extern void growfldtab(int n);
extern void savefs(void);
-extern int getrec(char **, int *, int);
+extern int getrec(char **, int *, bool);
extern void nextfile(void);
extern int readrec(char **buf, int *bufsize, FILE *inf);
extern char *getargv(int);
diff --git a/run.c b/run.c
index b1294bd..624a784 100644
--- a/run.c
+++ b/run.c
@@ -189,7 +189,7 @@ Cell *program(Node **a, int n) /* execute an awk program */
tempfree(x);
}
if (a[1] || a[2])
- while (getrec(&record, &recsize, 1) > 0) {
+ while (getrec(&record, &recsize, true) > 0) {
x = execute(a[1]);
if (isexit(x))
break;
@@ -438,9 +438,9 @@ Cell *awkgetline(Node **a, int n) /* get next line from specific input */
}
} else { /* bare getline; use current input */
if (a[0] == NULL) /* getline */
- n = getrec(&record, &recsize, 1);
+ n = getrec(&record, &recsize, true);
else { /* getline var */
- n = getrec(&buf, &bufsize, 0);
+ n = getrec(&buf, &bufsize, false);
x = execute(a[0]);
setsval(x, buf);
if (is_number(x->sval)) {
@@ -457,7 +457,7 @@ Cell *awkgetline(Node **a, int n) /* get next line from specific input */
Cell *getnf(Node **a, int n) /* get NF */
{
- if (donefld == 0)
+ if (!donefld)
fldbld();
return (Cell *) a[0];
}
@@ -821,15 +821,15 @@ int format(char **pbuf, int *pbufsize, const char *s, Node *a) /* printf-like co
#define FMTSZ(a) (fmtsz - ((a) - fmt))
#define BUFSZ(a) (bufsize - ((a) - buf))
- static int first = 1;
- static int have_a_format = 0;
+ static bool first = true;
+ static bool have_a_format = false;
if (first) {
char buf[100];
snprintf(buf, sizeof(buf), "%a", 42.0);
have_a_format = (strcmp(buf, "0x1.5p+5") == 0);
- first = 0;
+ first = false;
}
os = s;
diff --git a/tran.c b/tran.c
index ac74ab0..20125e3 100644
--- a/tran.c
+++ b/tran.c
@@ -306,21 +306,21 @@ Awkfloat setfval(Cell *vp, Awkfloat f) /* set float val of a Cell */
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "assign to");
if (isfld(vp)) {
- donerec = 0; /* mark $0 invalid */
+ donerec = false; /* mark $0 invalid */
fldno = atoi(vp->nval);
if (fldno > *NF)
newfld(fldno);
dprintf( ("setting field %d to %g\n", fldno, f) );
} else if (&vp->fval == NF) {
- donerec = 0; /* mark $0 invalid */
+ donerec = false; /* mark $0 invalid */
setlastfld(f);
dprintf( ("setting NF to %g\n", f) );
} else if (isrec(vp)) {
- donefld = 0; /* mark $1... invalid */
- donerec = 1;
+ donefld = false; /* mark $1... invalid */
+ donerec = true;
savefs();
} else if (vp == ofsloc) {
- if (donerec == 0)
+ if (!donerec)
recbld();
}
if (freeable(vp))
@@ -355,17 +355,17 @@ char *setsval(Cell *vp, const char *s) /* set string val of a Cell */
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "assign to");
if (isfld(vp)) {
- donerec = 0; /* mark $0 invalid */
+ donerec = false; /* mark $0 invalid */
fldno = atoi(vp->nval);
if (fldno > *NF)
newfld(fldno);
dprintf( ("setting field %d to %s (%p)\n", fldno, s, s) );
} else if (isrec(vp)) {
- donefld = 0; /* mark $1... invalid */
- donerec = 1;
+ donefld = false; /* mark $1... invalid */
+ donerec = true;
savefs();
} else if (vp == ofsloc) {
- if (donerec == 0)
+ if (!donerec)
recbld();
}
t = s ? tostring(s) : tostring(""); /* in case it's self-assign */
@@ -379,7 +379,7 @@ char *setsval(Cell *vp, const char *s) /* set string val of a Cell */
(void*)vp, NN(vp->nval), t, t, vp->tval, donerec, donefld) );
vp->sval = t;
if (&vp->fval == NF) {
- donerec = 0; /* mark $0 invalid */
+ donerec = false; /* mark $0 invalid */
f = getfval(vp);
setlastfld(f);
dprintf( ("setting NF to %g\n", f) );
@@ -392,9 +392,9 @@ Awkfloat getfval(Cell *vp) /* get float val of a Cell */
{
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "read value of");
- if (isfld(vp) && donefld == 0)
+ if (isfld(vp) && !donefld)
fldbld();
- else if (isrec(vp) && donerec == 0)
+ else if (isrec(vp) && !donerec)
recbld();
if (!isnum(vp)) { /* not a number */
vp->fval = atof(vp->sval); /* best guess */
@@ -413,9 +413,9 @@ static char *get_str_val(Cell *vp, char **fmt) /* get string val of a Cel
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "read value of");
- if (isfld(vp) && donefld == 0)
+ if (isfld(vp) && ! donefld)
fldbld();
- else if (isrec(vp) && donerec == 0)
+ else if (isrec(vp) && ! donerec)
recbld();
/*