aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2019-01-20 22:20:47 +0200
committerArnold D. Robbins <arnold@skeeve.com>2019-01-20 22:20:47 +0200
commit9a0812e1b5ed67c3e75e70749a7e2a54f9c2bfcc (patch)
treef7924aeb58a0b721e91f1127c92e18b3fbf3e54e /main.c
parenta6ece4a82072150e4b269b5698bb8caf14075bcb (diff)
parent5766636f7bb7eb6d8fa9fd1b097ca74329062173 (diff)
downloadegawk-9a0812e1b5ed67c3e75e70749a7e2a54f9c2bfcc.tar.gz
egawk-9a0812e1b5ed67c3e75e70749a7e2a54f9c2bfcc.tar.bz2
egawk-9a0812e1b5ed67c3e75e70749a7e2a54f9c2bfcc.zip
Merge branch 'master' into feature/fix-ns-memleak
Diffstat (limited to 'main.c')
-rw-r--r--main.c64
1 files changed, 29 insertions, 35 deletions
diff --git a/main.c b/main.c
index 1eb6d6a9..3d3af968 100644
--- a/main.c
+++ b/main.c
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 1986, 1988, 1989, 1991-2018 the Free Software Foundation, Inc.
+ * Copyright (C) 1986, 1988, 1989, 1991-2019 the Free Software Foundation, Inc.
*
* This file is part of GAWK, the GNU implementation of the
* AWK Programming Language.
@@ -742,23 +742,19 @@ static void
init_args(int argc0, int argc, const char *argv0, char **argv)
{
int i, j;
- NODE **aptr;
- NODE *tmp;
+ NODE *sub, *val;
ARGV_node = install_symbol(estrdup("ARGV", 4), Node_var_array);
- tmp = make_number(0.0);
- aptr = assoc_lookup(ARGV_node, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(argv0, strlen(argv0));
- (*aptr)->flags |= USER_INPUT;
+ sub = make_number(0.0);
+ val = make_string(argv0, strlen(argv0));
+ val->flags |= USER_INPUT;
+ assoc_set(ARGV_node, sub, val);
+
for (i = argc0, j = 1; i < argc; i++, j++) {
- tmp = make_number((AWKNUM) j);
- aptr = assoc_lookup(ARGV_node, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(argv[i], strlen(argv[i]));
- (*aptr)->flags |= USER_INPUT;
+ sub = make_number((AWKNUM) j);
+ val = make_string(argv[i], strlen(argv[i]));
+ val->flags |= USER_INPUT;
+ assoc_set(ARGV_node, sub, val);
}
ARGC_node = install_symbol(estrdup("ARGC", 4), Node_var);
@@ -887,9 +883,8 @@ load_environ()
extern char **environ;
#endif
char *var, *val;
- NODE **aptr;
int i;
- NODE *tmp;
+ NODE *sub, *newval;
static bool been_here = false;
if (been_here)
@@ -907,12 +902,10 @@ load_environ()
*val++ = '\0';
else
val = nullstr;
- tmp = make_string(var, strlen(var));
- aptr = assoc_lookup(ENVIRON_node, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(val, strlen(val));
- (*aptr)->flags |= USER_INPUT;
+ sub = make_string(var, strlen(var));
+ newval = make_string(val, strlen(val));
+ newval->flags |= USER_INPUT;
+ assoc_set(ENVIRON_node, sub, newval);
/* restore '=' so that system() gets a valid environment */
if (val != nullstr)
@@ -936,31 +929,32 @@ load_environ()
return ENVIRON_node;
}
+/* load_procinfo_argv --- populate PROCINFO["argv"] */
+
static void
load_procinfo_argv()
{
- NODE *tmp;
- NODE **aptr;
+ NODE *sub;
+ NODE *val;
NODE *argv_array;
int i;
- tmp = make_string("argv", 4);
- aptr = assoc_lookup(PROCINFO_node, tmp);
- unref(tmp);
- unref(*aptr);
+ // build the sub-array first
getnode(argv_array);
memset(argv_array, '\0', sizeof(NODE)); /* valgrind wants this */
null_array(argv_array);
- *aptr = argv_array;
argv_array->parent_array = PROCINFO_node;
argv_array->vname = estrdup("argv", 4);
for (i = 0; d_argv[i] != NULL; i++) {
- tmp = make_number(i);
- aptr = assoc_lookup(argv_array, tmp);
- unref(tmp);
- unref(*aptr);
- *aptr = make_string(d_argv[i], strlen(d_argv[i]));
+ sub = make_number(i);
+ val = make_string(d_argv[i], strlen(d_argv[i]));
+ assoc_set(argv_array, sub, val);
}
+
+ // hook it into PROCINFO
+ sub = make_string("argv", 4);
+ assoc_set(PROCINFO_node, sub, argv_array);
+
}
/* load_procinfo --- populate the PROCINFO array */