[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gawk-diffs] [SCM] gawk branch, feature/fixtype, updated. gawk-4.1.0-189
From: |
Andrew J. Schorr |
Subject: |
[gawk-diffs] [SCM] gawk branch, feature/fixtype, updated. gawk-4.1.0-1896-gce342a0 |
Date: |
Thu, 7 Jul 2016 01:32:08 +0000 (UTC) |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".
The branch, feature/fixtype has been updated
via ce342a04922797cb53557178c54d32c4efafda16 (commit)
from f8424b236fabb881cc977b9e8e2e7c8debf56da0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=ce342a04922797cb53557178c54d32c4efafda16
commit ce342a04922797cb53557178c54d32c4efafda16
Author: Andrew J. Schorr <address@hidden>
Date: Wed Jul 6 21:31:22 2016 -0400
Document string termination in header files and remove no-longer-needed
string termination logic in various places.
diff --git a/ChangeLog b/ChangeLog
index 1eb2fa0..3284747 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,39 @@
2016-07-06 Andrew J. Schorr <address@hidden>
+ * awk.h: Modify stptr comment to indicate that all strings are now
+ NUL-terminated.
+ * builtin.c (do_mktime): Remove unnecessary logic to terminate
+ the string with '\0' temporarily.
+ (do_system) Ditto.
+ (nondec2awknum): Add a comment about termination.
+ * eval.c (posix_compare): Remove logic to terminate strings temporarily.
+ (set_ORS): No need to terminate ORS, since the string node is already
+ terminated. What gave us the right to modify that node anyway?
+ (fmt_index): Remove code to terminate string. This seems to have been
+ invalid anyway, since we don't own that memory.
+ (set_TEXTDOMAIN): Do not terminate TEXTDOMAIN string, since the node
+ is already terminated. We didn't have the right to modify that node
+ anyway.
+ * gawkapi.c (node_to_awk_value): Add assert checks to confirm that the
+ string is NUL-terminated.
+ * gawkapi.h: Modify awk_string comment to indicate that strings are
+ always terminated with '\0'.
+ * int_array.c (isinteger): Remove unnecessary logic to terminate string
+ with '\0' temporarily.
+ * interpret.h (Op_push_i): Ditto.
+ * io.c (nextfile): Remove string termination. We didn't own that memory
+ anyway.
+ * mpfr.c (force_mpnum): Remove unnecessary logic to terminate the
+ string with '\0' temporarily.
+ * node.c (r_force_number): Remove NUL termination around strtod call,
+ since we already know that there is either a white space or '\0'
+ character there. Either one will stop strtod.
+ (get_ieee_magic_val): Ditto.
+ * profile.c (pp_number): No need to terminate string returned by
+ r_format_val.
+
+2016-07-06 Andrew J. Schorr <address@hidden>
+
* interpret.h (Op_field_spec): Now that all $n field values are
NUL-terminated, there is no reason to call dupnode for $n where n > 0.
This saves malloc and copying overhead, thereby more than offsetting the
diff --git a/awk.h b/awk.h
index b210dcd..09757b9 100644
--- a/awk.h
+++ b/awk.h
@@ -473,13 +473,7 @@ typedef struct exp_node {
#define re_cnt flags
/* Node_val */
-/*
- * Note that the string in stptr may not be NUL-terminated, but it is
- * guaranteed to have at least one extra byte that may be temporarily set
- * to '\0'. This is helpful when calling functions such as strtod that require
- * a NUL-terminated argument. In particular, field values $n for n > 0 and
- * n < NF will not have a NUL terminator, since they point into the $0 buffer.
- */
+/* Note that the string in stptr will always be NUL-terminated. */
#define stptr sub.val.sp
#define stlen sub.val.slen
#define valref sub.val.sref
diff --git a/builtin.c b/builtin.c
index a01018e..a21df18 100644
--- a/builtin.c
+++ b/builtin.c
@@ -2035,16 +2035,12 @@ do_mktime(int nargs)
int month, day, hour, minute, second, count;
int dst = -1; /* default is unknown */
time_t then_stamp;
- char save;
t1 = POP_SCALAR();
if (do_lint && (fixtype(t1)->flags & STRING) == 0)
lintwarn(_("mktime: received non-string argument"));
t1 = force_string(t1);
- save = t1->stptr[t1->stlen];
- t1->stptr[t1->stlen] = '\0';
-
count = sscanf(t1->stptr, "%ld %d %d %d %d %d %d",
& year, & month, & day,
& hour, & minute, & second,
@@ -2058,7 +2054,6 @@ do_mktime(int nargs)
|| (month < 1 || month > 12) ))
lintwarn(_("mktime: at least one of the values is out
of the default range"));
- t1->stptr[t1->stlen] = save;
DEREF(t1);
if (count < 6
@@ -2088,7 +2083,6 @@ do_system(int nargs)
NODE *tmp;
AWKNUM ret = 0; /* floating point on purpose, compat Unix awk */
char *cmd;
- char save;
int status;
if (do_sandbox)
@@ -2101,10 +2095,6 @@ do_system(int nargs)
cmd = force_string(tmp)->stptr;
if (cmd && *cmd) {
- /* insure arg to system is zero-terminated */
- save = cmd[tmp->stlen];
- cmd[tmp->stlen] = '\0';
-
os_restore_mode(fileno(stdin));
#ifdef SIGPIPE
signal(SIGPIPE, SIG_DFL);
@@ -2148,7 +2138,6 @@ do_system(int nargs)
signal(SIGPIPE, SIG_IGN);
#endif
- cmd[tmp->stlen] = save;
}
DEREF(tmp);
return make_number((AWKNUM) ret);
@@ -3632,6 +3621,11 @@ nondec2awknum(char *str, size_t len, char **endptr)
*endptr = str;
} else {
decimal:
+ /*
+ * Terminating is probably unnecessary, since the caller always
+ * passes a string ending with '\0' or white space, but it
+ * seems safest to leave this to avoid future problems.
+ */
save = str[len];
str[len] = '\0';
retval = strtod(str, endptr);
diff --git a/eval.c b/eval.c
index 2f47356..aaabdb3 100644
--- a/eval.c
+++ b/eval.c
@@ -493,15 +493,8 @@ static int
posix_compare(NODE *s1, NODE *s2)
{
int ret = 0;
- char save1, save2;
size_t l = 0;
- save1 = s1->stptr[s1->stlen];
- s1->stptr[s1->stlen] = '\0';
-
- save2 = s2->stptr[s2->stlen];
- s2->stptr[s2->stlen] = '\0';
-
if (gawk_mb_cur_max == 1) {
if (strlen(s1->stptr) == s1->stlen && strlen(s2->stptr) ==
s2->stlen)
ret = strcoll(s1->stptr, s2->stptr);
@@ -563,8 +556,6 @@ posix_compare(NODE *s1, NODE *s2)
}
#endif
- s1->stptr[s1->stlen] = save1;
- s2->stptr[s2->stlen] = save2;
return ret;
}
@@ -824,7 +815,6 @@ set_ORS()
ORS_node->var_value = force_string(ORS_node->var_value);
ORS = ORS_node->var_value->stptr;
ORSlen = ORS_node->var_value->stlen;
- ORS[ORSlen] = '\0';
}
/* fmt_ok --- is the conversion format a valid one? */
@@ -887,7 +877,6 @@ fmt_index(NODE *n)
ix++;
}
/* not found */
- n->stptr[n->stlen] = '\0';
if (do_lint && ! fmt_ok(n))
lintwarn(_("bad `%sFMT' specification `%s'"),
n == CONVFMT_node->var_value ? "CONV"
@@ -972,7 +961,6 @@ set_TEXTDOMAIN()
tmp = TEXTDOMAIN_node->var_value =
force_string(TEXTDOMAIN_node->var_value);
TEXTDOMAIN = tmp->stptr;
len = tmp->stlen;
- TEXTDOMAIN[len] = '\0';
/*
* Note: don't call textdomain(); this value is for
* the awk program, not for gawk itself.
diff --git a/gawkapi.c b/gawkapi.c
index df69012..afefa4f 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -440,6 +440,7 @@ node_to_awk_value(NODE *node, awk_value_t *val,
awk_valtype_t wanted)
(void) force_string(node);
val->str_value.str = node->stptr;
val->str_value.len = node->stlen;
+ assert(val->str_value.str[val->str_value.len] == '\0');
ret = awk_true;
break;
@@ -468,6 +469,7 @@ node_to_awk_value(NODE *node, awk_value_t *val,
awk_valtype_t wanted)
val->val_type = AWK_STRING;
val->str_value.str = node->stptr;
val->str_value.len = node->stlen;
+ assert(val->str_value.str[val->str_value.len]
== '\0');
ret = awk_true;
} else
val->val_type = AWK_UNDEFINED;
diff --git a/gawkapi.h b/gawkapi.h
index 975f82d..10eab1c 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -279,11 +279,7 @@ enum {
* be multibyte encoded in the current locale's encoding and character
* set. Gawk will convert internally to wide characters if necessary.
*
- * Note that the string may not be terminated with a '\0' character.
- * In particular, this happens for field values $n where n > 0 and n < NF,
- * since the string points directly into the $0 buffer. All other strings,
- * including those created by extensions, should be NUL-terminated. In general
- * though, extension code should not assume that the string is NUL-terminated!
+ * Note that the string will always be terminated with a '\0' character.
*/
typedef struct awk_string {
char *str; /* data */
diff --git a/int_array.c b/int_array.c
index e7913de..93e96d1 100644
--- a/int_array.c
+++ b/int_array.c
@@ -128,7 +128,6 @@ is_integer(NODE *symbol, NODE *subs)
/* must be a STRING */
char *cp = subs->stptr, *cpend, *ptr;
- char save;
size_t len = subs->stlen;
if (len == 0 || (! isdigit((unsigned char) *cp) && *cp != '-'))
@@ -151,12 +150,9 @@ is_integer(NODE *symbol, NODE *subs)
}
cpend = cp + len;
- save = *cpend;
- *cpend = '\0';
errno = 0;
l = strtol(cp, & ptr, 10);
- *cpend = save;
if (errno != 0 || ptr != cpend)
return NULL;
diff --git a/interpret.h b/interpret.h
index 106367f..9d7b423 100644
--- a/interpret.h
+++ b/interpret.h
@@ -135,13 +135,10 @@ top:
case Op_push_i:
m = pc->memory;
if (! do_traditional && (m->flags & INTLSTR) != 0) {
- char *orig, *trans, save;
+ char *orig, *trans;
- save = m->stptr[m->stlen];
- m->stptr[m->stlen] = '\0';
orig = m->stptr;
trans = dgettext(TEXTDOMAIN, orig);
- m->stptr[m->stlen] = save;
m = make_string(trans, strlen(trans));
} else
UPREF(m);
diff --git a/io.c b/io.c
index b9bce69..5ad7913 100644
--- a/io.c
+++ b/io.c
@@ -480,7 +480,6 @@ nextfile(IOBUF **curfile, bool skipping)
if (arg == NULL || arg->stlen == 0)
continue;
arg = force_string(arg);
- arg->stptr[arg->stlen] = '\0';
if (! do_traditional) {
unref(ARGIND_node->var_value);
ARGIND_node->var_value = make_number((AWKNUM) i);
diff --git a/mpfr.c b/mpfr.c
index 0bb5b43..cf7a7c2 100644
--- a/mpfr.c
+++ b/mpfr.c
@@ -275,7 +275,6 @@ static int
force_mpnum(NODE *n, int do_nondec, int use_locale)
{
char *cp, *cpend, *ptr, *cp1;
- char save;
int tval, base = 10;
if (n->stlen == 0) {
@@ -292,9 +291,6 @@ force_mpnum(NODE *n, int do_nondec, int use_locale)
return false;
}
- save = *cpend;
- *cpend = '\0';
-
if (*cp == '+' || *cp == '-')
cp1 = cp + 1;
else
@@ -329,7 +325,6 @@ done:
/* trailing space is OK for NUMBER */
while (ptr < cpend && isspace((unsigned char) *ptr))
ptr++;
- *cpend = save;
if (errno == 0 && ptr == cpend)
return true;
errno = 0;
diff --git a/node.c b/node.c
index a435e01..2cd8833 100644
--- a/node.c
+++ b/node.c
@@ -59,7 +59,6 @@ r_force_number(NODE *n)
{
char *cp;
char *cpend;
- char save;
char *ptr;
extern double strtod();
@@ -133,10 +132,13 @@ r_force_number(NODE *n)
/* nondec2awknum() saves and restores the byte after the string
itself */
n->numbr = nondec2awknum(cp, cpend - cp, &ptr);
} else {
- save = *cpend;
- *cpend = '\0';
+ /*
+ * There is no need to set *cpend to '\0' because it is either
+ * pointing to white space or the '\0' at the end of the string.
+ * In either case, strtod should terminate on that character
+ * or earlier due to non-numeric characters.
+ */
n->numbr = (AWKNUM) strtod((const char *) cp, &ptr);
- *cpend = save;
}
if (errno == 0) {
@@ -941,13 +943,14 @@ get_ieee_magic_val(char *val)
static bool first = true;
static AWKNUM inf;
static AWKNUM nan;
- char save;
char *ptr;
- save = val[4];
- val[4] = '\0';
+ /*
+ * There is no need to set val[4] to '\0' because it is either white
+ * space or the NUL character at the end of the string. Either way,
+ * strtod should terminate on that character.
+ */
AWKNUM v = strtod(val, &ptr);
- val[4] = save;
if (val == ptr) { /* Older strtod implementations don't support inf or
nan. */
if (first) {
diff --git a/profile.c b/profile.c
index be8977e..aa8a152 100644
--- a/profile.c
+++ b/profile.c
@@ -1541,7 +1541,6 @@ pp_number(NODE *n)
s = r_format_val("%.6g", 0, s);
- s->stptr[s->stlen] = '\0';
str = s->stptr;
freenode(s);
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 34 ++++++++++++++++++++++++++++++++++
awk.h | 8 +-------
builtin.c | 16 +++++-----------
eval.c | 12 ------------
gawkapi.c | 2 ++
gawkapi.h | 6 +-----
int_array.c | 4 ----
interpret.h | 5 +----
io.c | 1 -
mpfr.c | 5 -----
node.c | 19 +++++++++++--------
profile.c | 1 -
12 files changed, 55 insertions(+), 58 deletions(-)
hooks/post-receive
--
gawk
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gawk-diffs] [SCM] gawk branch, feature/fixtype, updated. gawk-4.1.0-1896-gce342a0,
Andrew J. Schorr <=