aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c107
1 files changed, 68 insertions, 39 deletions
diff --git a/main.c b/main.c
index de3ed72a..878e8086 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.
@@ -68,6 +68,7 @@ static void version(void) ATTRIBUTE_NORETURN;
static void init_fds(void);
static void init_groupset(void);
static void save_argv(int, char **);
+static const char *platform_name();
/* These nodes store all the special variables AWK uses */
NODE *ARGC_node, *ARGIND_node, *ARGV_node, *BINMODE_node, *CONVFMT_node;
@@ -397,9 +398,10 @@ main(int argc, char **argv)
init_fields();
/* Now process the pre-assignments */
+ int dash_v_errs = 0; // bad stuff for -v
for (i = 0; i <= numassigns; i++) {
if (preassigns[i].type == PRE_ASSIGN)
- (void) arg_assign(preassigns[i].val, true);
+ dash_v_errs += (arg_assign(preassigns[i].val, true) == false);
else /* PRE_ASSIGN_FS */
cmdline_fs(preassigns[i].val);
efree(preassigns[i].val);
@@ -463,12 +465,17 @@ main(int argc, char **argv)
setlocale(LC_NUMERIC, "C");
#endif
/* Read in the program */
- if (parse_program(& code_block) != 0)
+ if (parse_program(& code_block) != 0 || dash_v_errs > 0)
exit(EXIT_FAILURE);
if (do_intl)
exit(EXIT_SUCCESS);
+ if (current_namespace != awk_namespace) {
+ efree((char *) current_namespace);
+ current_namespace = awk_namespace;
+ }
+
install_builtins();
if (do_lint)
@@ -513,6 +520,7 @@ main(int argc, char **argv)
interpret(code_block);
if (do_pretty_print) {
+ current_namespace = awk_namespace;
dump_prog(code_block);
dump_funcs();
}
@@ -737,23 +745,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);
@@ -882,9 +886,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)
@@ -902,12 +905,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)
@@ -931,31 +932,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 */
@@ -981,6 +983,7 @@ load_procinfo()
update_PROCINFO_str("version", VERSION);
update_PROCINFO_str("strftime", def_strftime_format);
+ update_PROCINFO_str("platform", platform_name());
#ifdef HAVE_MPFR
sprintf(name, "GNU MPFR %s", mpfr_get_version());
@@ -1143,7 +1146,7 @@ arg_assign(char *arg, bool initing)
badvar = true;
else
for (cp2 = arg+1; *cp2; cp2++)
- if (! is_identchar((unsigned char) *cp2)) {
+ if (! is_identchar((unsigned char) *cp2) && *cp2 != ':') {
badvar = true;
break;
}
@@ -1161,11 +1164,16 @@ arg_assign(char *arg, bool initing)
// Assigning a string or typed regex
+ if (! validate_qualified_name(arg)) {
+ badvar = true;
+ goto done;
+ }
+
if (check_special(arg) >= 0)
fatal(_("cannot use gawk builtin `%s' as variable name"), arg);
if (! initing) {
- var = lookup(arg);
+ var = lookup(arg, false);
if (var != NULL && var->type == Node_func)
fatal(_("cannot use function `%s' as variable name"), arg);
}
@@ -1769,3 +1777,24 @@ set_locale_stuff(void)
(void) bindtextdomain(PACKAGE, locale_dir);
(void) textdomain(PACKAGE);
}
+
+/* platform_name --- return the platform name */
+
+static const char *
+platform_name()
+{
+ // Cygwin and Mac OS X count as POSIX
+#if defined(__VMS)
+ return "vms";
+#elif defined(__MINGW32__)
+ return "mingw";
+#elif defined(__DJGPP__)
+ return "djgpp";
+#elif defined(__EMX__)
+ return "os2";
+#elif defined(USE_EBCDIC)
+ return "os390";
+#else
+ return "posix";
+#endif
+}