From f421a5fbef014040712a7c89e8863c7196f6ab93 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Tue, 5 Jul 2016 16:49:05 -0400 Subject: Remove FIELD flag, since it is the inverse of the MALLOC flag. --- eval.c | 1 - 1 file changed, 1 deletion(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 5b4418b8..2f473569 100644 --- a/eval.c +++ b/eval.c @@ -435,7 +435,6 @@ flags2str(int flagval) { NUMCUR, "NUMCUR" }, { NUMBER, "NUMBER" }, { MAYBE_NUM, "MAYBE_NUM" }, - { FIELD, "FIELD" }, { INTLSTR, "INTLSTR" }, { NUMINT, "NUMINT" }, { INTIND, "INTIND" }, -- cgit v1.2.3 From ce342a04922797cb53557178c54d32c4efafda16 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Wed, 6 Jul 2016 21:31:22 -0400 Subject: Document string termination in header files and remove no-longer-needed string termination logic in various places. --- eval.c | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 2f473569..aaabdb3a 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. -- cgit v1.2.3 From eb261daff5e9a96f294cd806d1fd3e68f06fdbaa Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Wed, 6 Jul 2016 22:29:58 -0400 Subject: Modify MAYBE_NUM usage and typeof function to return "strnum" only for actual numeric strings. --- eval.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index aaabdb3a..cfb1d1e6 100644 --- a/eval.c +++ b/eval.c @@ -955,12 +955,10 @@ set_LINT() void set_TEXTDOMAIN() { - int len; NODE *tmp; tmp = TEXTDOMAIN_node->var_value = force_string(TEXTDOMAIN_node->var_value); TEXTDOMAIN = tmp->stptr; - len = tmp->stlen; /* * Note: don't call textdomain(); this value is for * the awk program, not for gawk itself. -- cgit v1.2.3 From c86137f472fdf876c2c223c8d99f673f477b7554 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Fri, 8 Jul 2016 15:26:00 -0400 Subject: Optimization: support unterminated field strings inside gawk, but make terminated copies for the API. --- eval.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index cfb1d1e6..675422e2 100644 --- a/eval.c +++ b/eval.c @@ -493,8 +493,15 @@ 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); @@ -556,6 +563,8 @@ posix_compare(NODE *s1, NODE *s2) } #endif + s1->stptr[s1->stlen] = save1; + s2->stptr[s2->stlen] = save2; return ret; } -- cgit v1.2.3 From cc04afb329cea035d0d9b67cd3b677e06b2f3996 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Sat, 12 Nov 2016 19:12:13 +0200 Subject: Further code improvements and doc changes as diff until merge. --- eval.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 2ce0a25b..8c45ea25 100644 --- a/eval.c +++ b/eval.c @@ -436,7 +436,7 @@ flags2str(int flagval) { STRCUR, "STRCUR" }, { NUMCUR, "NUMCUR" }, { NUMBER, "NUMBER" }, - { MAYBE_NUM, "MAYBE_NUM" }, + { USER_INPUT, "USER_INPUT" }, { INTLSTR, "INTLSTR" }, { NUMINT, "NUMINT" }, { INTIND, "INTIND" }, -- cgit v1.2.3 From e8b0cf14d975304166c58a2d04a2943ab821367a Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 18 Nov 2016 06:00:17 +0200 Subject: Audit use of stptr for NUL termination. Update doc before merge to master. --- eval.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 8c45ea25..2d07a804 100644 --- a/eval.c +++ b/eval.c @@ -606,10 +606,16 @@ cmp_nodes(NODE *t1, NODE *t2, bool use_strcmp) if (IGNORECASE) { const unsigned char *cp1 = (const unsigned char *) t1->stptr; const unsigned char *cp2 = (const unsigned char *) t2->stptr; + char save1 = t1->stptr[t1->stlen]; + char save2 = t2->stptr[t2->stlen]; + if (gawk_mb_cur_max > 1) { + t1->stptr[t1->stlen] = t2->stptr[t2->stlen] = '\0'; ret = strncasecmpmbs((const unsigned char *) cp1, (const unsigned char *) cp2, l); + t1->stptr[t1->stlen] = save1; + t2->stptr[t2->stlen] = save2; } else { /* Could use tolower() here; see discussion above. */ for (ret = 0; l-- > 0 && ret == 0; cp1++, cp2++) @@ -853,6 +859,8 @@ fmt_ok(NODE *n) static const char flags[] = " +-#"; #endif + // We rely on the caller to zero-terminate n->stptr. + if (*p++ != '%') return 0; while (*p && strchr(flags, *p) != NULL) /* flags */ @@ -880,15 +888,21 @@ fmt_index(NODE *n) int ix = 0; static int fmt_num = 4; static int fmt_hiwater = 0; + char save; if (fmt_list == NULL) emalloc(fmt_list, NODE **, fmt_num*sizeof(*fmt_list), "fmt_index"); n = force_string(n); + + save = n->stptr[n->stlen]; + n->stptr[n->stlen] = '\0'; + while (ix < fmt_hiwater) { if (cmp_nodes(fmt_list[ix], n, true) == 0) return ix; ix++; } + /* not found */ if (do_lint && ! fmt_ok(n)) lintwarn(_("bad `%sFMT' specification `%s'"), @@ -896,6 +910,8 @@ fmt_index(NODE *n) : n == OFMT_node->var_value ? "O" : "", n->stptr); + n->stptr[n->stlen] = save; + if (fmt_hiwater >= fmt_num) { fmt_num *= 2; erealloc(fmt_list, NODE **, fmt_num * sizeof(*fmt_list), "fmt_index"); -- cgit v1.2.3