aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/main.c b/main.c
index de3ed72a..03a96f30 100644
--- a/main.c
+++ b/main.c
@@ -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();
}
@@ -981,6 +989,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 +1152,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 +1170,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 +1783,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
+}