diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 43 |
1 files changed, 39 insertions, 4 deletions
@@ -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 +} |