From b51edf37c4271bf5ec5dcad9d35169f55e38efa9 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Tue, 20 Mar 2012 10:46:03 -0400 Subject: - Add new environment variable AWKLIBPATH to use when searching for shared libraries. - Instead of hardcoding the default ".so" suffix for shared libraries, use autoconf to get the right value for this platform. - Build and install some of the bundled shared library extensions so that they will now be available using the default AWKLIBPATH. --- main.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 8899db59..693db0f4 100644 --- a/main.c +++ b/main.c @@ -973,6 +973,29 @@ init_vars() /* load_environ --- populate the ENVIRON array */ +static void +path_environ(const char *pname, const char *dflt) +{ + char *val; + NODE **aptr; + NODE *tmp; + + tmp = make_string(pname, strlen(pname)); + if (! in_array(ENVIRON_node, tmp)) { + /* + * On VMS, environ[] only holds a subset of what getenv() can + * find, so look AWKPATH up before resorting to default path. + */ + val = getenv(pname); + if (val == NULL) + val = dflt; + aptr = assoc_lookup(ENVIRON_node, tmp); + unref(*aptr); + *aptr = make_string(val, strlen(val)); + } + unref(tmp); +} + static NODE * load_environ() { @@ -1006,23 +1029,11 @@ load_environ() *--val = '='; } /* - * Put AWKPATH into ENVIRON if it's not there. + * Put AWKPATH and AWKLIBPATh into ENVIRON if not already there. * This allows querying it from within awk programs. */ - tmp = make_string("AWKPATH", 7); - if (! in_array(ENVIRON_node, tmp)) { - /* - * On VMS, environ[] only holds a subset of what getenv() can - * find, so look AWKPATH up before resorting to default path. - */ - val = getenv("AWKPATH"); - if (val == NULL) - val = defpath; - aptr = assoc_lookup(ENVIRON_node, tmp); - unref(*aptr); - *aptr = make_string(val, strlen(val)); - } - unref(tmp); + path_environ("AWKPATH", defpath); + path_environ("AWKLIBPATH", deflibpath); return ENVIRON_node; } -- cgit v1.2.3 From 85a195f6f9901e98abe9306f1e05e25107e61955 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Sat, 24 Mar 2012 11:16:23 -0400 Subject: Fix some coding style issues and a typo in a comment. --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'main.c') diff --git a/main.c b/main.c index 693db0f4..dafa15cf 100644 --- a/main.c +++ b/main.c @@ -1029,7 +1029,7 @@ load_environ() *--val = '='; } /* - * Put AWKPATH and AWKLIBPATh into ENVIRON if not already there. + * Put AWKPATH and AWKLIBPATH into ENVIRON if not already there. * This allows querying it from within awk programs. */ path_environ("AWKPATH", defpath); -- cgit v1.2.3 From 15635ff21b6f1a0951f0ff5de6ddaf0edab8edd7 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Mon, 26 Mar 2012 21:36:37 +0200 Subject: Some minor style edits in code and doc. --- main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index dafa15cf..9df5869f 100644 --- a/main.c +++ b/main.c @@ -971,12 +971,12 @@ init_vars() register_deferred_variable("ENVIRON", load_environ); } -/* load_environ --- populate the ENVIRON array */ +/* path_environ --- put path variable into environment if not already there */ static void path_environ(const char *pname, const char *dflt) { - char *val; + const char *val; NODE **aptr; NODE *tmp; @@ -996,6 +996,8 @@ path_environ(const char *pname, const char *dflt) unref(tmp); } +/* load_environ --- populate the ENVIRON array */ + static NODE * load_environ() { -- cgit v1.2.3 From e5353c0f447a8628985722296f57fc02dd2e0063 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 11 May 2012 15:05:35 +0300 Subject: Move to use of bool type, true, false, everywhere. --- main.c | 118 ++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 2324d9a0..fc75db0b 100644 --- a/main.c +++ b/main.c @@ -130,23 +130,23 @@ struct pre_assign { static struct pre_assign *preassigns = NULL; /* requested via -v or -F */ static long numassigns = -1; /* how many of them */ -static int disallow_var_assigns = FALSE; /* true for --exec */ +static bool disallow_var_assigns = false; /* true for --exec */ static void add_preassign(enum assign_type type, char *val); -int do_flags = FALSE; -int do_optimize = TRUE; /* apply default optimizations */ -static int do_nostalgia = FALSE; /* provide a blast from the past */ -static int do_binary = FALSE; /* hands off my data! */ +int do_flags = false; +bool do_optimize = true; /* apply default optimizations */ +static int do_nostalgia = false; /* provide a blast from the past */ +static int do_binary = false; /* hands off my data! */ -int use_lc_numeric = FALSE; /* obey locale for decimal point */ +int use_lc_numeric = false; /* obey locale for decimal point */ #if MBS_SUPPORT int gawk_mb_cur_max; /* MB_CUR_MAX value, see comment in main() */ #endif FILE *output_fp; /* default gawk output, can be redirected in the debugger */ -int output_is_tty = FALSE; /* control flushing of output */ +bool output_is_tty = false; /* control flushing of output */ /* default format for strftime(), available via PROCINFO */ const char def_strftime_format[] = "%a %b %e %H:%M:%S %Z %Y"; @@ -203,13 +203,13 @@ main(int argc, char **argv) * The + on the front tells GNU getopt not to rearrange argv. */ const char *optlist = "+F:f:v:W;m:bcCd::D::e:E:gh:l:L:nNo::Op::MPrStVY"; - int stopped_early = FALSE; + bool stopped_early = false; int old_optind; int i; int c; char *scan, *src; char *extra_stack; - int have_srcfile = FALSE; + int have_srcfile = 0; SRCFILE *s; /* do these checks early */ @@ -296,7 +296,7 @@ main(int argc, char **argv) output_fp = stdout; /* we do error messages ourselves on invalid options */ - opterr = FALSE; + opterr = false; /* copy argv before getopt gets to it; used to restart the debugger */ save_argv(argc, argv); @@ -309,7 +309,7 @@ main(int argc, char **argv) (c = getopt_long(argc, argv, optlist, optab, NULL)) != EOF; optopt = 0, old_optind = optind) { if (do_posix) - opterr = TRUE; + opterr = true; switch (c) { case 'F': @@ -317,7 +317,7 @@ main(int argc, char **argv) break; case 'E': - disallow_var_assigns = TRUE; + disallow_var_assigns = true; /* fall through */ case 'f': /* @@ -358,7 +358,7 @@ main(int argc, char **argv) break; case 'b': - do_binary = TRUE; + do_binary = true; break; case 'c': @@ -428,7 +428,7 @@ main(int argc, char **argv) break; case 'N': - use_lc_numeric = TRUE; + use_lc_numeric = true; break; case 'O': @@ -510,7 +510,7 @@ main(int argc, char **argv) * won't have incremented optind. */ optind = old_optind; - stopped_early = TRUE; + stopped_early = true; goto out; } else if (optopt != '\0') { /* Use POSIX required message format */ @@ -540,7 +540,7 @@ out: } if (do_posix) { - use_lc_numeric = TRUE; + use_lc_numeric = true; if (do_traditional) /* both on command line */ warning(_("`--posix' overrides `--traditional'")); else @@ -609,7 +609,7 @@ out: /* Now process the pre-assignments */ for (i = 0; i <= numassigns; i++) { if (preassigns[i].type == PRE_ASSIGN) - (void) arg_assign(preassigns[i].val, TRUE); + (void) arg_assign(preassigns[i].val, true); else /* PRE_ASSIGN_FS */ cmdline_fs(preassigns[i].val); efree(preassigns[i].val); @@ -632,7 +632,7 @@ out: setbuf(stdout, (char *) NULL); /* make debugging easier */ #endif if (os_isatty(fileno(stdout))) - output_is_tty = TRUE; + output_is_tty = true; /* load extension libs */ for (s = srcfiles->next; s != srcfiles; s = s->next) { @@ -938,42 +938,42 @@ struct varinit { AWKNUM numval; Func_ptr update; Func_ptr assign; - int do_assign; + bool do_assign; int flags; #define NO_INSTALL 0x01 #define NON_STANDARD 0x02 }; static const struct varinit varinit[] = { -{NULL, "ARGC", NULL, 0, NULL, NULL, FALSE, NO_INSTALL }, -{&ARGIND_node, "ARGIND", NULL, 0, NULL, NULL, FALSE, NON_STANDARD }, -{NULL, "ARGV", NULL, 0, NULL, NULL, FALSE, NO_INSTALL }, -{&BINMODE_node, "BINMODE", NULL, 0, NULL, set_BINMODE, FALSE, NON_STANDARD }, -{&CONVFMT_node, "CONVFMT", "%.6g", 0, NULL, set_CONVFMT,TRUE, 0 }, -{NULL, "ENVIRON", NULL, 0, NULL, NULL, FALSE, NO_INSTALL }, -{&ERRNO_node, "ERRNO", "", 0, NULL, NULL, FALSE, NON_STANDARD }, -{&FIELDWIDTHS_node, "FIELDWIDTHS", "", 0, NULL, set_FIELDWIDTHS, FALSE, NON_STANDARD }, -{&FILENAME_node, "FILENAME", "", 0, NULL, NULL, FALSE, 0 }, -{&FNR_node, "FNR", NULL, 0, update_FNR, set_FNR, TRUE, 0 }, -{&FS_node, "FS", " ", 0, NULL, set_FS, FALSE, 0 }, -{&FPAT_node, "FPAT", "[^[:space:]]+", 0, NULL, set_FPAT, FALSE, NON_STANDARD }, -{&IGNORECASE_node, "IGNORECASE", NULL, 0, NULL, set_IGNORECASE, FALSE, NON_STANDARD }, -{&LINT_node, "LINT", NULL, 0, NULL, set_LINT, FALSE, NON_STANDARD }, -{&PREC_node, "PREC", NULL, DEFAULT_PREC, NULL, set_PREC, FALSE, NON_STANDARD}, -{&NF_node, "NF", NULL, -1, update_NF, set_NF, FALSE, 0 }, -{&NR_node, "NR", NULL, 0, update_NR, set_NR, TRUE, 0 }, -{&OFMT_node, "OFMT", "%.6g", 0, NULL, set_OFMT, TRUE, 0 }, -{&OFS_node, "OFS", " ", 0, NULL, set_OFS, TRUE, 0 }, -{&ORS_node, "ORS", "\n", 0, NULL, set_ORS, TRUE, 0 }, -{NULL, "PROCINFO", NULL, 0, NULL, NULL, FALSE, NO_INSTALL | NON_STANDARD }, -{&RLENGTH_node, "RLENGTH", NULL, 0, NULL, NULL, FALSE, 0 }, -{&ROUNDMODE_node, "ROUNDMODE", DEFAULT_ROUNDMODE, 0, NULL, set_ROUNDMODE, FALSE, NON_STANDARD }, -{&RS_node, "RS", "\n", 0, NULL, set_RS, TRUE, 0 }, -{&RSTART_node, "RSTART", NULL, 0, NULL, NULL, FALSE, 0 }, -{&RT_node, "RT", "", 0, NULL, NULL, FALSE, NON_STANDARD }, -{&SUBSEP_node, "SUBSEP", "\034", 0, NULL, set_SUBSEP, TRUE, 0 }, -{&TEXTDOMAIN_node, "TEXTDOMAIN", "messages", 0, NULL, set_TEXTDOMAIN, TRUE, NON_STANDARD }, -{0, NULL, NULL, 0, NULL, NULL, FALSE, 0 }, +{NULL, "ARGC", NULL, 0, NULL, NULL, false, NO_INSTALL }, +{&ARGIND_node, "ARGIND", NULL, 0, NULL, NULL, false, NON_STANDARD }, +{NULL, "ARGV", NULL, 0, NULL, NULL, false, NO_INSTALL }, +{&BINMODE_node, "BINMODE", NULL, 0, NULL, set_BINMODE, false, NON_STANDARD }, +{&CONVFMT_node, "CONVFMT", "%.6g", 0, NULL, set_CONVFMT,true, 0 }, +{NULL, "ENVIRON", NULL, 0, NULL, NULL, false, NO_INSTALL }, +{&ERRNO_node, "ERRNO", "", 0, NULL, NULL, false, NON_STANDARD }, +{&FIELDWIDTHS_node, "FIELDWIDTHS", "", 0, NULL, set_FIELDWIDTHS, false, NON_STANDARD }, +{&FILENAME_node, "FILENAME", "", 0, NULL, NULL, false, 0 }, +{&FNR_node, "FNR", NULL, 0, update_FNR, set_FNR, true, 0 }, +{&FS_node, "FS", " ", 0, NULL, set_FS, false, 0 }, +{&FPAT_node, "FPAT", "[^[:space:]]+", 0, NULL, set_FPAT, false, NON_STANDARD }, +{&IGNORECASE_node, "IGNORECASE", NULL, 0, NULL, set_IGNORECASE, false, NON_STANDARD }, +{&LINT_node, "LINT", NULL, 0, NULL, set_LINT, false, NON_STANDARD }, +{&PREC_node, "PREC", NULL, DEFAULT_PREC, NULL, set_PREC, false, NON_STANDARD}, +{&NF_node, "NF", NULL, -1, update_NF, set_NF, false, 0 }, +{&NR_node, "NR", NULL, 0, update_NR, set_NR, true, 0 }, +{&OFMT_node, "OFMT", "%.6g", 0, NULL, set_OFMT, true, 0 }, +{&OFS_node, "OFS", " ", 0, NULL, set_OFS, true, 0 }, +{&ORS_node, "ORS", "\n", 0, NULL, set_ORS, true, 0 }, +{NULL, "PROCINFO", NULL, 0, NULL, NULL, false, NO_INSTALL | NON_STANDARD }, +{&RLENGTH_node, "RLENGTH", NULL, 0, NULL, NULL, false, 0 }, +{&ROUNDMODE_node, "ROUNDMODE", DEFAULT_ROUNDMODE, 0, NULL, set_ROUNDMODE, false, NON_STANDARD }, +{&RS_node, "RS", "\n", 0, NULL, set_RS, true, 0 }, +{&RSTART_node, "RSTART", NULL, 0, NULL, NULL, false, 0 }, +{&RT_node, "RT", "", 0, NULL, NULL, false, NON_STANDARD }, +{&SUBSEP_node, "SUBSEP", "\034", 0, NULL, set_SUBSEP, true, 0 }, +{&TEXTDOMAIN_node, "TEXTDOMAIN", "messages", 0, NULL, set_TEXTDOMAIN, true, NON_STANDARD }, +{0, NULL, NULL, 0, NULL, NULL, false, 0 }, }; /* init_vars --- actually initialize everything in the symbol table */ @@ -1173,13 +1173,13 @@ is_std_var(const char *var) for (vp = varinit; vp->name != NULL; vp++) { if (strcmp(vp->name, var) == 0) { if ((do_traditional || do_posix) && (vp->flags & NON_STANDARD) != 0) - return FALSE; + return false; - return TRUE; + return true; } } - return FALSE; + return false; } @@ -1205,23 +1205,23 @@ get_spec_varname(Func_ptr fptr) /* arg_assign --- process a command-line assignment */ int -arg_assign(char *arg, int initing) +arg_assign(char *arg, bool initing) { char *cp, *cp2; - int badvar; + bool badvar; NODE *var; NODE *it; NODE **lhs; long save_FNR; if (! initing && disallow_var_assigns) - return FALSE; /* --exec */ + return false; /* --exec */ cp = strchr(arg, '='); if (cp == NULL) { if (! initing) - return FALSE; /* This is file name, not assignment. */ + return false; /* This is file name, not assignment. */ fprintf(stderr, _("%s: `%s' argument to `-v' not in `var=value' form\n\n"), @@ -1238,13 +1238,13 @@ arg_assign(char *arg, int initing) FNR = 0; /* first check that the variable name has valid syntax */ - badvar = FALSE; + badvar = false; if (! isalpha((unsigned char) arg[0]) && arg[0] != '_') - badvar = TRUE; + badvar = true; else for (cp2 = arg+1; *cp2; cp2++) if (! isalnum((unsigned char) *cp2) && *cp2 != '_') { - badvar = TRUE; + badvar = true; break; } @@ -1295,7 +1295,7 @@ arg_assign(char *arg, int initing) exit(EXIT_FATAL); if (var->type == Node_var && var->var_update) var->var_update(); - lhs = get_lhs(var, FALSE); + lhs = get_lhs(var, false); unref(*lhs); *lhs = it; /* check for set_FOO() routine */ -- cgit v1.2.3 From cdf892a07fa67c635997e41ee8fe175aaafb2431 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Sat, 19 May 2012 23:45:07 -0400 Subject: Add -i option, append .awk if initial search fails, and allow -f repeats. --- main.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index fc75db0b..4bdbbc55 100644 --- a/main.c +++ b/main.c @@ -202,7 +202,7 @@ main(int argc, char **argv) /* * The + on the front tells GNU getopt not to rearrange argv. */ - const char *optlist = "+F:f:v:W;m:bcCd::D::e:E:gh:l:L:nNo::Op::MPrStVY"; + const char *optlist = "+F:f:v:W;m:bcCd::D::e:E:gh:i:l:L:nNo::Op::MPrStVY"; bool stopped_early = false; int old_optind; int i; @@ -397,6 +397,10 @@ main(int argc, char **argv) usage(EXIT_SUCCESS, stdout); break; + case 'i': + (void) add_srcfile(SRC_INC, optarg, srcfiles, NULL, NULL); + break; + case 'l': (void) add_srcfile(SRC_EXTLIB, optarg, srcfiles, NULL, NULL); break; @@ -638,7 +642,7 @@ out: for (s = srcfiles->next; s != srcfiles; s = s->next) { if (s->stype == SRC_EXTLIB) (void) load_ext(s->fullpath, "dlload", NULL); - else + else if (s->stype != SRC_INC) have_srcfile++; } @@ -781,6 +785,7 @@ usage(int exitval, FILE *fp) fputs(_("\t-E file\t\t\t--exec=file\n"), fp); fputs(_("\t-g\t\t\t--gen-pot\n"), fp); fputs(_("\t-h\t\t\t--help\n"), fp); + fputs(_("\t-i includefile\t\t--include=includefile\n"), fp); fputs(_("\t-l library\t\t--load=library\n"), fp); fputs(_("\t-L [fatal]\t\t--lint[=fatal]\n"), fp); fputs(_("\t-n\t\t\t--non-decimal-data\n"), fp); -- cgit v1.2.3 From 577c3fc31a2718461fba2e599d162de96fe838fa Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Thu, 24 May 2012 15:34:17 -0400 Subject: First working version of new API mechanism (probably has memory leaks). --- main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'main.c') diff --git a/main.c b/main.c index 4bdbbc55..844052f1 100644 --- a/main.c +++ b/main.c @@ -638,10 +638,13 @@ out: if (os_isatty(fileno(stdout))) output_is_tty = true; + /* initialize API before loading extension libraries */ + init_ext_api(); + /* load extension libs */ for (s = srcfiles->next; s != srcfiles; s = s->next) { if (s->stype == SRC_EXTLIB) - (void) load_ext(s->fullpath, "dlload", NULL); + (void) load_ext(s->fullpath, "dl_load"); else if (s->stype != SRC_INC) have_srcfile++; } -- cgit v1.2.3 From eec7101174a3b2807fb282272f75cc13d4b953c3 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 25 May 2012 15:18:43 +0300 Subject: Additional changes / some cleanups. --- main.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'main.c') diff --git a/main.c b/main.c index 844052f1..e8f087c1 100644 --- a/main.c +++ b/main.c @@ -950,6 +950,7 @@ struct varinit { int flags; #define NO_INSTALL 0x01 #define NON_STANDARD 0x02 +#define NOT_OFF_LIMITS 0x04 /* may be accessed by extension function */ }; static const struct varinit varinit[] = { @@ -973,7 +974,7 @@ static const struct varinit varinit[] = { {&OFMT_node, "OFMT", "%.6g", 0, NULL, set_OFMT, true, 0 }, {&OFS_node, "OFS", " ", 0, NULL, set_OFS, true, 0 }, {&ORS_node, "ORS", "\n", 0, NULL, set_ORS, true, 0 }, -{NULL, "PROCINFO", NULL, 0, NULL, NULL, false, NO_INSTALL | NON_STANDARD }, +{NULL, "PROCINFO", NULL, 0, NULL, NULL, false, NO_INSTALL | NON_STANDARD | NOT_OFF_LIMITS }, {&RLENGTH_node, "RLENGTH", NULL, 0, NULL, NULL, false, 0 }, {&ROUNDMODE_node, "ROUNDMODE", DEFAULT_ROUNDMODE, 0, NULL, set_ROUNDMODE, false, NON_STANDARD }, {&RS_node, "RS", "\n", 0, NULL, set_RS, true, 0 }, @@ -1190,6 +1191,24 @@ is_std_var(const char *var) return false; } +/* + * is_off_limits_var --- return true if a variable is off limits + * to extension functions + */ + +int +is_off_limits_var(const char *var) +{ + const struct varinit *vp; + + for (vp = varinit; vp->name != NULL; vp++) { + if ( (vp->flags & NOT_OFF_LIMITS) != 0 + && strcmp(vp->name, var) == 0) + return false; + } + + return true; +} /* get_spec_varname --- return the name of a special variable with the given assign or update routine. -- cgit v1.2.3 From 62d890d4384a70c7550876c617b3a34e28dab234 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Sat, 26 May 2012 10:44:07 -0400 Subject: Install gawkapi.h, fix is_off_limits_var, and enhance ordchr test. --- main.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index e8f087c1..e2f70d77 100644 --- a/main.c +++ b/main.c @@ -1202,12 +1202,11 @@ is_off_limits_var(const char *var) const struct varinit *vp; for (vp = varinit; vp->name != NULL; vp++) { - if ( (vp->flags & NOT_OFF_LIMITS) != 0 - && strcmp(vp->name, var) == 0) - return false; + if (strcmp(vp->name, var) == 0) + return !(vp->flags & NOT_OFF_LIMITS); } - return true; + return false; } /* get_spec_varname --- return the name of a special variable -- cgit v1.2.3 From e6ddb0631c88b591792e3486f857ca26875de310 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Wed, 30 May 2012 21:47:18 +0300 Subject: Continue refining extension API and implementation. --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'main.c') diff --git a/main.c b/main.c index e2f70d77..91da77d7 100644 --- a/main.c +++ b/main.c @@ -1203,7 +1203,7 @@ is_off_limits_var(const char *var) for (vp = varinit; vp->name != NULL; vp++) { if (strcmp(vp->name, var) == 0) - return !(vp->flags & NOT_OFF_LIMITS); + return ((vp->flags & NOT_OFF_LIMITS) == 0); } return false; -- cgit v1.2.3 From 8ce87087172ee5be4ee72a1513daad3821185bf7 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 12 Jun 2012 23:11:37 +0300 Subject: More API implementations and testext improvements. --- main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 91da77d7..b3f7f9ec 100644 --- a/main.c +++ b/main.c @@ -731,7 +731,7 @@ out: if (extra_stack) efree(extra_stack); - exit(exit_val); /* more portable */ + final_exit(exit_val); return exit_val; /* to suppress warnings */ } @@ -1318,7 +1318,7 @@ arg_assign(char *arg, bool initing) var = variable(0, cp2, Node_var); if (var == NULL) /* error */ - exit(EXIT_FATAL); + final_exit(EXIT_FATAL); if (var->type == Node_var && var->var_update) var->var_update(); lhs = get_lhs(var, false); -- cgit v1.2.3 From 09a6e6fecf9691ea9a0ceb2aef26197f821868cd Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 19 Jun 2012 21:24:19 +0300 Subject: Fix bug with --characters-as-bytes. --- main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'main.c') diff --git a/main.c b/main.c index 3680e3f4..2bb0b01f 100644 --- a/main.c +++ b/main.c @@ -559,9 +559,12 @@ out: #if MBS_SUPPORT if (do_binary) { if (do_posix) - warning(_("`--posix' overrides `--binary'")); + warning(_("`--posix' overrides `--characters-as-bytes'")); else gawk_mb_cur_max = 1; /* hands off my data! */ +#if defined(LC_ALL) + setlocale(LC_ALL, "C"); +#endif } #endif -- cgit v1.2.3 From d0d954cce2ca5a2e0ed41116502b636446ac528f Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Thu, 21 Jun 2012 22:32:46 +0300 Subject: Remove extension() builtin. --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'main.c') diff --git a/main.c b/main.c index b3f7f9ec..bbe656da 100644 --- a/main.c +++ b/main.c @@ -644,7 +644,7 @@ out: /* load extension libs */ for (s = srcfiles->next; s != srcfiles; s = s->next) { if (s->stype == SRC_EXTLIB) - (void) load_ext(s->fullpath, "dl_load"); + load_ext(s->fullpath); else if (s->stype != SRC_INC) have_srcfile++; } -- cgit v1.2.3 From 759f2234c9bfa689151277fd2215bc0927cfc9c3 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 24 Aug 2012 13:40:22 +0300 Subject: Add facility to get vesion info from extensions. --- main.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 9c99c86f..8ac9493e 100644 --- a/main.c +++ b/main.c @@ -138,6 +138,7 @@ int do_flags = false; bool do_optimize = true; /* apply default optimizations */ static int do_nostalgia = false; /* provide a blast from the past */ static int do_binary = false; /* hands off my data! */ +static int do_version = false; /* print version info */ int use_lc_numeric = false; /* obey locale for decimal point */ @@ -180,7 +181,7 @@ static const struct option optab[] = { { "load", required_argument, NULL, 'l' }, { "dump-variables", optional_argument, NULL, 'd' }, { "assign", required_argument, NULL, 'v' }, - { "version", no_argument, NULL, 'V' }, + { "version", no_argument, & do_version, 'V' }, { "help", no_argument, NULL, 'h' }, { "exec", required_argument, NULL, 'E' }, { "use-lc-numeric", no_argument, & use_lc_numeric, 1 }, @@ -469,7 +470,7 @@ main(int argc, char **argv) break; case 'V': - version(); + do_version = true; break; case 'W': /* gawk specific options - now in getopt_long */ @@ -652,6 +653,10 @@ out: have_srcfile++; } + /* do version check after extensions are loaded to get extension info */ + if (do_version) + version(); + /* No -f or --source options, use next arg */ if (! have_srcfile) { if (optind > argc - 1 || stopped_early) /* no args left or no program */ @@ -1409,6 +1414,8 @@ version() printf(" (GNU MPFR %s, GNU MP %s)", mpfr_get_version(), gmp_version); #endif printf("\n"); + print_ext_versions(); + /* * Per GNU coding standards, print copyright info, * then exit successfully, do nothing else. -- cgit v1.2.3 From 5117dd79ab0271ae5e1bb775876e9e1b80fd2f4a Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 14 Sep 2012 12:27:06 +0300 Subject: Add undocumented-for-now PROCINFO["identifiers"]. --- main.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'main.c') diff --git a/main.c b/main.c index 8ac9493e..f2a3c66b 100644 --- a/main.c +++ b/main.c @@ -693,6 +693,8 @@ out: if (do_lint && code_block->nexti->opcode == Op_atexit) lintwarn(_("no program text at all!")); + load_symbols(); + if (do_profile) init_profiling_signals(); -- cgit v1.2.3 From b9a82851866f84ca306a2802b4ca50089a2fe683 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 25 Sep 2012 12:58:05 +0200 Subject: First cut at SYMTAB and FUNCTAB. --- main.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index f2a3c66b..e1cdd3d3 100644 --- a/main.c +++ b/main.c @@ -288,12 +288,18 @@ main(int argc, char **argv) if (argc < 2) usage(EXIT_FAILURE, stderr); + /* initialize the null string */ + Nnull_string = make_string("", 0); + /* Robustness: check that file descriptors 0, 1, 2 are open */ init_fds(); /* init array handling. */ array_init(); + /* init the symbol tables */ + init_symbol_table(); + output_fp = stdout; /* we do error messages ourselves on invalid options */ @@ -588,8 +594,6 @@ out: /* load group set */ init_groupset(); - /* initialize the null string */ - Nnull_string = make_string("", 0); #ifdef HAVE_MPFR if (do_mpfr) { mpz_init(Nnull_string->mpg_i); -- cgit v1.2.3 From 0a1746da98ef24b887074bad1c390523f6c4b190 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 19 Oct 2012 13:36:49 +0200 Subject: SYMTAB enhancements, bug fix. Doc additions. --- main.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'main.c') diff --git a/main.c b/main.c index e1cdd3d3..5e84a3c7 100644 --- a/main.c +++ b/main.c @@ -1064,6 +1064,12 @@ load_environ() NODE **aptr; int i; NODE *tmp; + static bool been_here = false; + + if (been_here) + return ENVIRON_node; + + been_here = true; ENVIRON_node = install_symbol(estrdup("ENVIRON", 7), Node_var_array); for (i = 0; environ[i] != NULL; i++) { @@ -1107,6 +1113,12 @@ load_procinfo() char name[100]; #endif AWKNUM value; + static bool been_here = false; + + if (been_here) + return PROCINFO_node; + + been_here = true; PROCINFO_node = install_symbol(estrdup("PROCINFO", 8), Node_var_array); -- cgit v1.2.3