version 1.31, 2020/08/11 16:57:05 |
version 1.32, 2020/12/09 20:00:11 |
|
|
free(cp->sval); |
free(cp->sval); |
cp->sval = (char *) ARGVtab; |
cp->sval = (char *) ARGVtab; |
for (i = 0; i < ac; i++) { |
for (i = 0; i < ac; i++) { |
|
double result; |
|
|
snprintf(temp, sizeof temp, "%d", i); |
snprintf(temp, sizeof temp, "%d", i); |
if (is_number(*av)) |
if (is_number(*av, & result)) |
setsymtab(temp, *av, atof(*av), STR|NUM, ARGVtab); |
setsymtab(temp, *av, result, STR|NUM, ARGVtab); |
else |
else |
setsymtab(temp, *av, 0.0, STR, ARGVtab); |
setsymtab(temp, *av, 0.0, STR, ARGVtab); |
av++; |
av++; |
|
|
free(cp->sval); |
free(cp->sval); |
cp->sval = (char *) ENVtab; |
cp->sval = (char *) ENVtab; |
for ( ; *envp; envp++) { |
for ( ; *envp; envp++) { |
|
double result; |
|
|
if ((p = strchr(*envp, '=')) == NULL) |
if ((p = strchr(*envp, '=')) == NULL) |
continue; |
continue; |
if( p == *envp ) /* no left hand side name in env string */ |
if( p == *envp ) /* no left hand side name in env string */ |
continue; |
continue; |
*p++ = 0; /* split into two strings at = */ |
*p++ = 0; /* split into two strings at = */ |
if (is_number(p)) |
if (is_number(p, & result)) |
setsymtab(*envp, p, atof(p), STR|NUM, ENVtab); |
setsymtab(*envp, p, result, STR|NUM, ENVtab); |
else |
else |
setsymtab(*envp, p, 0.0, STR, ENVtab); |
setsymtab(*envp, p, 0.0, STR, ENVtab); |
p[-1] = '='; /* restore in case env is passed down to a shell */ |
p[-1] = '='; /* restore in case env is passed down to a shell */ |
|
|
Array *ap; |
Array *ap; |
Cell **tp; |
Cell **tp; |
|
|
ap = malloc(sizeof(*ap)); |
ap = (Array *) malloc(sizeof(*ap)); |
tp = calloc(n, sizeof(*tp)); |
tp = (Cell **) calloc(n, sizeof(*tp)); |
if (ap == NULL || tp == NULL) |
if (ap == NULL || tp == NULL) |
FATAL("out of space in makesymtab"); |
FATAL("out of space in makesymtab"); |
ap->nelem = 0; |
ap->nelem = 0; |
|
|
(void*)p, NN(p->nval), NN(p->sval), p->fval, p->tval); |
(void*)p, NN(p->nval), NN(p->sval), p->fval, p->tval); |
return(p); |
return(p); |
} |
} |
p = malloc(sizeof(*p)); |
p = (Cell *) malloc(sizeof(*p)); |
if (p == NULL) |
if (p == NULL) |
FATAL("out of space for symbol table at %s", n); |
FATAL("out of space for symbol table at %s", n); |
p->nval = tostring(n); |
p->nval = tostring(n); |
|
|
Cell *cp, *op, **np; |
Cell *cp, *op, **np; |
|
|
nsz = GROWTAB * tp->size; |
nsz = GROWTAB * tp->size; |
np = calloc(nsz, sizeof(*np)); |
np = (Cell **) calloc(nsz, sizeof(*np)); |
if (np == NULL) /* can't do it, but can keep running. */ |
if (np == NULL) /* can't do it, but can keep running. */ |
return; /* someone else will run out later. */ |
return; /* someone else will run out later. */ |
for (i = 0; i < tp->size; i++) { |
for (i = 0; i < tp->size; i++) { |
|
|
else if (isrec(vp) && !donerec) |
else if (isrec(vp) && !donerec) |
recbld(); |
recbld(); |
if (!isnum(vp)) { /* not a number */ |
if (!isnum(vp)) { /* not a number */ |
vp->fval = atof(vp->sval); /* best guess */ |
double fval; |
if (is_number(vp->sval) && !(vp->tval&CON)) |
bool no_trailing; |
vp->tval |= NUM; /* make NUM only sparingly */ |
|
|
if (is_valid_number(vp->sval, true, & no_trailing, & fval)) { |
|
vp->fval = fval; |
|
if (no_trailing && !(vp->tval&CON)) |
|
vp->tval |= NUM; /* make NUM only sparingly */ |
|
} else |
|
vp->fval = 0.0; |
} |
} |
DPRINTF("getfval %p: %s = %g, t=%o\n", |
DPRINTF("getfval %p: %s = %g, t=%o\n", |
(void*)vp, NN(vp->nval), vp->fval, vp->tval); |
(void*)vp, NN(vp->nval), vp->fval, vp->tval); |
|
|
{ |
{ |
char *p; |
char *p; |
|
|
p = malloc(n); |
p = (char *) malloc(n); |
if (p == NULL) |
if (p == NULL) |
FATAL("out of space in tostringN %zu", n); |
FATAL("out of space in tostringN %zu", n); |
if (strlcpy(p, s, n) >= n) |
if (strlcpy(p, s, n) >= n) |
|
|
char *sa = getsval(a); |
char *sa = getsval(a); |
char *sb = getsval(b); |
char *sb = getsval(b); |
size_t l = strlen(sa) + strlen(sb) + 1; |
size_t l = strlen(sa) + strlen(sb) + 1; |
p = malloc(l); |
p = (char *) malloc(l); |
if (p == NULL) |
if (p == NULL) |
FATAL("out of space concatenating %s and %s", sa, sb); |
FATAL("out of space concatenating %s and %s", sa, sb); |
snprintf(p, l, "%s%s", sa, sb); |
snprintf(p, l, "%s%s", sa, sb); |
|
|
l++; // add room for ' ' |
l++; // add room for ' ' |
char *newbuf = malloc(l); |
char *newbuf = (char *) malloc(l); |
if (newbuf == NULL) |
if (newbuf == NULL) |
FATAL("out of space concatenating %s and %s", sa, sb); |
FATAL("out of space concatenating %s and %s", sa, sb); |
// See string() in lex.c; a string "xx" is stored in the symbol |
// See string() in lex.c; a string "xx" is stored in the symbol |
|
|
const uschar *s = (const uschar *) is; |
const uschar *s = (const uschar *) is; |
uschar *buf, *bp; |
uschar *buf, *bp; |
|
|
if ((buf = malloc(strlen(is)+3)) == NULL) |
if ((buf = (uschar *) malloc(strlen(is)+3)) == NULL) |
FATAL( "out of space in qstring(%s)", s); |
FATAL( "out of space in qstring(%s)", s); |
for (bp = buf; (c = *s) != delim; s++) { |
for (bp = buf; (c = *s) != delim; s++) { |
if (c == '\n') |
if (c == '\n') |