diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 12:54:45 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 12:54:45 +0300 |
commit | f20ab7c3039a4023f41372bfe4bde3b16d481df7 (patch) | |
tree | 4425de8c6177df655f165cb61d70d0acb5fdc968 /node.c | |
parent | 6607eb3d5e40b98d2acc8f6b0d6a0b5a4b0f56bd (diff) | |
download | egawk-f20ab7c3039a4023f41372bfe4bde3b16d481df7.tar.gz egawk-f20ab7c3039a4023f41372bfe4bde3b16d481df7.tar.bz2 egawk-f20ab7c3039a4023f41372bfe4bde3b16d481df7.zip |
Move to gawk-3.0.4.
Diffstat (limited to 'node.c')
-rw-r--r-- | node.c | 31 |
1 files changed, 16 insertions, 15 deletions
@@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-1997 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-1999 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -36,6 +36,7 @@ register NODE *n; char save; char *ptr; unsigned int newflags; + extern double strtod(); #ifdef DEBUG if (n == NULL) @@ -140,7 +141,16 @@ register NODE *s; /* not an integral value, or out of range */ if ((val = double_to_int(s->numbr)) != s->numbr || val < LONG_MIN || val > LONG_MAX) { -#ifdef GFMT_WORKAROUND + /* + * Once upon a time, if GFMT_WORKAROUND wasn't defined, + * we just blindly did this: + * sprintf(sp, format, s->numbr); + * s->stlen = strlen(sp); + * s->stfmt = (char) index; + * but that's no good if, e.g., OFMT is %s. So we punt, + * and just always format the value ourselves. + */ + NODE *dummy, *r; unsigned short oflags; extern NODE *format_tree P((const char *, int, NODE *)); @@ -161,15 +171,6 @@ register NODE *s; freenode(dummy); /* to keep s->stptr == r->stpr. */ goto no_malloc; -#else - /* - * no need for a "replacement" formatting by gawk, - * just use sprintf - */ - sprintf(sp, format, s->numbr); - s->stlen = strlen(sp); - s->stfmt = (char) index; -#endif /* GFMT_WORKAROUND */ } else { /* integral value */ /* force conversion to long only once */ @@ -183,11 +184,9 @@ register NODE *s; } s->stfmt = -1; } - emalloc(s->stptr, char *, s->stlen + 2, "force_string"); + emalloc(s->stptr, char *, s->stlen + 2, "format_val"); memcpy(s->stptr, sp, s->stlen+1); -#ifdef GFMT_WORKAROUND no_malloc: -#endif /* GFMT_WORKAROUND */ s->stref = 1; s->flags |= STR; return s; @@ -495,7 +494,9 @@ char **string_ptr; } i = 0; for (;;) { - if (ISXDIGIT((c = *(*string_ptr)++))) { + /* do outside test to avoid multiple side effects */ + c = *(*string_ptr)++; + if (ISXDIGIT(c)) { i *= 16; if (ISDIGIT(c)) i += c - '0'; |