Module Name: src
Committed By: christos
Date: Mon Aug 31 23:37:55 UTC 2020
Modified Files:
src/external/historical/nawk/dist: lib.c proto.h run.c
Log Message:
Add a check_number function that does what is repeated in many places in
the code, but better.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/external/historical/nawk/dist/lib.c \
src/external/historical/nawk/dist/run.c
cvs rdiff -u -r1.11 -r1.12 src/external/historical/nawk/dist/proto.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/historical/nawk/dist/lib.c
diff -u src/external/historical/nawk/dist/lib.c:1.12 src/external/historical/nawk/dist/lib.c:1.13
--- src/external/historical/nawk/dist/lib.c:1.12 Fri Apr 17 18:35:18 2020
+++ src/external/historical/nawk/dist/lib.c Mon Aug 31 19:37:55 2020
@@ -191,10 +191,7 @@ int getrec(char **pbuf, int *pbufsize, b
xfree(fldtab[0]->sval);
fldtab[0]->sval = buf; /* buf == record */
fldtab[0]->tval = REC | STR | DONTFREE;
- if (is_number(fldtab[0]->sval)) {
- fldtab[0]->fval = atof(fldtab[0]->sval);
- fldtab[0]->tval |= NUM;
- }
+ check_number(fldtab[0]);
}
setfval(nrloc, nrloc->fval+1);
setfval(fnrloc, fnrloc->fval+1);
@@ -306,10 +303,7 @@ void setclvar(char *s) /* set var=value
p = qstring(p, '\0');
q = setsymtab(s, p, 0.0, STR, symtab);
setsval(q, p);
- if (is_number(q->sval)) {
- q->fval = atof(q->sval);
- q->tval |= NUM;
- }
+ check_number(q);
dprintf( ("command line set %s to |%s|\n", s, p) );
}
@@ -407,10 +401,7 @@ void fldbld(void) /* create fields from
donefld = true;
for (j = 1; j <= lastfld; j++) {
p = fldtab[j];
- if(is_number(p->sval)) {
- p->fval = atof(p->sval);
- p->tval |= NUM;
- }
+ check_number(p);
}
setfval(nfloc, (Awkfloat) lastfld);
donerec = true; /* restore */
@@ -763,7 +754,8 @@ int isclvar(const char *s) /* is s of fo
/* wrong: violates 4.10.1.4 of ansi C standard */
#include <math.h>
-int is_number(const char *s)
+
+static int get_number(const char *s, double *res)
{
double r;
char *ep;
@@ -773,8 +765,20 @@ int is_number(const char *s)
return 0;
while (*ep == ' ' || *ep == '\t' || *ep == '\n')
ep++;
- if (*ep == '\0')
- return 1;
- else
+ if (*ep != '\0')
return 0;
+ if (res)
+ *res = r;
+ return 1;
+}
+
+void check_number(Cell *x)
+{
+ if (get_number(x->sval, &x->fval))
+ x->tval |= NUM;
+}
+
+int is_number(const char *s)
+{
+ return get_number(s, NULL);
}
Index: src/external/historical/nawk/dist/run.c
diff -u src/external/historical/nawk/dist/run.c:1.12 src/external/historical/nawk/dist/run.c:1.13
--- src/external/historical/nawk/dist/run.c:1.12 Thu Feb 20 14:59:12 2020
+++ src/external/historical/nawk/dist/run.c Mon Aug 31 19:37:55 2020
@@ -432,17 +432,11 @@ Cell *awkgetline(Node **a, int n) /* get
} else if (a[0] != NULL) { /* getline var <file */
x = execute(a[0]);
setsval(x, buf);
- if (is_number(x->sval)) {
- x->fval = atof(x->sval);
- x->tval |= NUM;
- }
+ check_number(x);
tempfree(x);
} else { /* getline <file */
setsval(fldtab[0], buf);
- if (is_number(fldtab[0]->sval)) {
- fldtab[0]->fval = atof(fldtab[0]->sval);
- fldtab[0]->tval |= NUM;
- }
+ check_number(fldtab[0]);
}
} else { /* bare getline; use current input */
if (a[0] == NULL) /* getline */
@@ -451,10 +445,7 @@ Cell *awkgetline(Node **a, int n) /* get
n = getrec(&buf, &bufsize, false);
x = execute(a[0]);
setsval(x, buf);
- if (is_number(x->sval)) {
- x->fval = atof(x->sval);
- x->tval |= NUM;
- }
+ check_number(x);
tempfree(x);
}
}
Index: src/external/historical/nawk/dist/proto.h
diff -u src/external/historical/nawk/dist/proto.h:1.11 src/external/historical/nawk/dist/proto.h:1.12
--- src/external/historical/nawk/dist/proto.h:1.11 Thu Feb 20 14:59:12 2020
+++ src/external/historical/nawk/dist/proto.h Mon Aug 31 19:37:55 2020
@@ -149,6 +149,7 @@ extern void bclass(int);
extern double errcheck(double, const char *);
extern int isclvar(const char *);
extern int is_number(const char *);
+extern void check_number(Cell *);
extern int adjbuf(char **, int *, int, int, char **, const char *);
extern void run(Node *);