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