aboutsummaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorStephen Davies <sdavies@sdc.com.au>2014-08-24 10:26:36 +0930
committerStephen Davies <sdavies@sdc.com.au>2014-08-24 10:26:36 +0930
commit8006ef4ca16fa8264dcc1e849783e1f4ce4978a1 (patch)
treee67f3ace9563ebb83d15a438b2124298486d39c0 /eval.c
parent9a7e5828f29d3f5daba5dc5ef1f6b9cd87f596b8 (diff)
parent8f2c2755573b81c1e2c9ef1c42c529d13396d4d2 (diff)
downloadegawk-8006ef4ca16fa8264dcc1e849783e1f4ce4978a1.tar.gz
egawk-8006ef4ca16fa8264dcc1e849783e1f4ce4978a1.tar.bz2
egawk-8006ef4ca16fa8264dcc1e849783e1f4ce4978a1.zip
Merge branch 'comment' of ssh://git.sv.gnu.org/srv/git/gawk into comment
Remote changes?
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/eval.c b/eval.c
index 028f7fee..4fd4fc5e 100644
--- a/eval.c
+++ b/eval.c
@@ -804,9 +804,35 @@ set_BINMODE()
void
set_OFS()
{
+ static bool first = true;
+ size_t new_ofs_len;
+
+ if (first) /* true when called from init_vars() in main() */
+ first = false;
+ else {
+ /* rebuild $0 using OFS that was current when $0 changed */
+ if (! field0_valid) {
+ get_field(UNLIMITED - 1, NULL);
+ rebuild_record();
+ }
+ }
+
+ /*
+ * Save OFS value for use in building record and in printing.
+ * Can't just have OFS point into the OFS_node since it's
+ * already updated when we come into this routine, and we need
+ * the old value to rebuild the record (see above).
+ */
OFS_node->var_value = force_string(OFS_node->var_value);
- OFS = OFS_node->var_value->stptr;
- OFSlen = OFS_node->var_value->stlen;
+ new_ofs_len = OFS_node->var_value->stlen;
+
+ if (OFS == NULL)
+ emalloc(OFS, char *, new_ofs_len + 2, "set_OFS");
+ else if (OFSlen < new_ofs_len)
+ erealloc(OFS, char *, new_ofs_len + 2, "set_OFS");
+
+ memcpy(OFS, OFS_node->var_value->stptr, OFS_node->var_value->stlen);
+ OFSlen = new_ofs_len;
OFS[OFSlen] = '\0';
}