version 1.21, 2020/06/10 21:01:32 |
version 1.22, 2020/06/10 21:02:33 |
|
|
if (freeable(cp)) |
if (freeable(cp)) |
xfree(cp->sval); |
xfree(cp->sval); |
temp = cp->cnext; /* avoids freeing then using */ |
temp = cp->cnext; /* avoids freeing then using */ |
free(cp); |
free(cp); |
tp->nelem--; |
tp->nelem--; |
} |
} |
tp->tab[i] = 0; |
tp->tab[i] = NULL; |
} |
} |
if (tp->nelem != 0) |
if (tp->nelem != 0) |
WARNING("can't happen: inconsistent element count freeing %s", ap->nval); |
WARNING("can't happen: inconsistent element count freeing %s", ap->nval); |
|
|
Array *tp; |
Array *tp; |
Cell *p, *prev = NULL; |
Cell *p, *prev = NULL; |
int h; |
int h; |
|
|
tp = (Array *) ap->sval; |
tp = (Array *) ap->sval; |
h = hash(s, tp->size); |
h = hash(s, tp->size); |
for (p = tp->tab[h]; p != NULL; prev = p, p = p->cnext) |
for (p = tp->tab[h]; p != NULL; prev = p, p = p->cnext) |
|
|
int fldno; |
int fldno; |
|
|
f += 0.0; /* normalise negative zero to positive zero */ |
f += 0.0; /* normalise negative zero to positive zero */ |
if ((vp->tval & (NUM | STR)) == 0) |
if ((vp->tval & (NUM | STR)) == 0) |
funnyvar(vp, "assign to"); |
funnyvar(vp, "assign to"); |
if (isfld(vp)) { |
if (isfld(vp)) { |
donerec = 0; /* mark $0 invalid */ |
donerec = 0; /* mark $0 invalid */ |
|
|
} else if (isrec(vp)) { |
} else if (isrec(vp)) { |
donefld = 0; /* mark $1... invalid */ |
donefld = 0; /* mark $1... invalid */ |
donerec = 1; |
donerec = 1; |
|
savefs(); |
} else if (vp == ofsloc) { |
} else if (vp == ofsloc) { |
if (donerec == 0) |
if (donerec == 0) |
recbld(); |
recbld(); |
|
|
int fldno; |
int fldno; |
Awkfloat f; |
Awkfloat f; |
|
|
DPRINTF( ("starting setsval %p: %s = \"%s\", t=%o, r,f=%d,%d\n", |
DPRINTF( ("starting setsval %p: %s = \"%s\", t=%o, r,f=%d,%d\n", |
(void*)vp, NN(vp->nval), s, vp->tval, donerec, donefld) ); |
(void*)vp, NN(vp->nval), s, vp->tval, donerec, donefld) ); |
if ((vp->tval & (NUM | STR)) == 0) |
if ((vp->tval & (NUM | STR)) == 0) |
funnyvar(vp, "assign to"); |
funnyvar(vp, "assign to"); |
|
|
} else if (isrec(vp)) { |
} else if (isrec(vp)) { |
donefld = 0; /* mark $1... invalid */ |
donefld = 0; /* mark $1... invalid */ |
donerec = 1; |
donerec = 1; |
|
savefs(); |
} else if (vp == ofsloc) { |
} else if (vp == ofsloc) { |
if (donerec == 0) |
if (donerec == 0) |
recbld(); |
recbld(); |
|
|
vp->tval |= STR; |
vp->tval |= STR; |
vp->fmt = NULL; |
vp->fmt = NULL; |
setfree(vp); |
setfree(vp); |
DPRINTF( ("setsval %p: %s = \"%s (%p) \", t=%o r,f=%d,%d\n", |
DPRINTF( ("setsval %p: %s = \"%s (%p) \", t=%o r,f=%d,%d\n", |
(void*)vp, NN(vp->nval), t, (void *) t, vp->tval, donerec, donefld) ); |
(void*)vp, NN(vp->nval), t, (void *) t, vp->tval, donerec, donefld) ); |
vp->sval = t; |
vp->sval = t; |
if (&vp->fval == NF) { |
if (&vp->fval == NF) { |
|
|
return p; |
return p; |
} |
} |
|
|
|
Cell *catstr(Cell *a, Cell *b) /* concatenate a and b */ |
|
{ |
|
Cell *c; |
|
char *p; |
|
char *sa = getsval(a); |
|
char *sb = getsval(b); |
|
size_t l = strlen(sa) + strlen(sb) + 1; |
|
p = malloc(l); |
|
if (p == NULL) |
|
FATAL("out of space concatenating %s and %s", sa, sb); |
|
snprintf(p, l, "%s%s", sa, sb); |
|
c = setsymtab(p, p, 0.0, CON|STR|DONTFREE, symtab); |
|
free(p); |
|
return c; |
|
} |
|
|
char *qstring(const char *is, int delim) /* collect string up to next delim */ |
char *qstring(const char *is, int delim) /* collect string up to next delim */ |
{ |
{ |
const char *os = is; |
const char *os = is; |
|
|
if (c == 0) { /* \ at end */ |
if (c == 0) { /* \ at end */ |
*bp++ = '\\'; |
*bp++ = '\\'; |
break; /* for loop */ |
break; /* for loop */ |
} |
} |
switch (c) { |
switch (c) { |
case '\\': *bp++ = '\\'; break; |
case '\\': *bp++ = '\\'; break; |
case 'n': *bp++ = '\n'; break; |
case 'n': *bp++ = '\n'; break; |
case 't': *bp++ = '\t'; break; |
case 't': *bp++ = '\t'; break; |
case 'v': *bp++ = '\v'; break; |
|
case 'b': *bp++ = '\b'; break; |
case 'b': *bp++ = '\b'; break; |
case 'f': *bp++ = '\f'; break; |
case 'f': *bp++ = '\f'; break; |
case 'r': *bp++ = '\r'; break; |
case 'r': *bp++ = '\r'; break; |
case 'a': *bp++ = '\007'; break; |
case 'v': *bp++ = '\v'; break; |
|
case 'a': *bp++ = '\a'; break; |
default: |
default: |
if (!isdigit(c)) { |
if (!isdigit(c)) { |
*bp++ = c; |
*bp++ = c; |