diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 12:27:41 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 12:27:41 +0300 |
commit | 61bb57af53ebe916d2db6e3585d4fc7ac1d99b92 (patch) | |
tree | 2bfc4e5b127618d286f57a87d416702131b1b01d /main.c | |
parent | 0a9ae0c89481db540e1b817a63cc6c793a62c90d (diff) | |
download | egawk-61bb57af53ebe916d2db6e3585d4fc7ac1d99b92.tar.gz egawk-61bb57af53ebe916d2db6e3585d4fc7ac1d99b92.tar.bz2 egawk-61bb57af53ebe916d2db6e3585d4fc7ac1d99b92.zip |
Move to gawk-2.15.3.
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 89 |
1 files changed, 64 insertions, 25 deletions
@@ -137,7 +137,13 @@ char **argv; extern int optind; extern int opterr; extern char *optarg; - int i; + char *optlist = "+F:f:v:W:"; + +#ifdef __EMX__ + _response(&argc, &argv); + _wildcard(&argc, &argv); + setvbuf(stdout, NULL, _IOLBF, BUFSIZ); +#endif (void) signal(SIGFPE, (SIGTYPE (*) P((int))) catchsig); (void) signal(SIGSEGV, (SIGTYPE (*) P((int))) catchsig); @@ -183,7 +189,9 @@ char **argv; opterr = 0; /* the + on the front tells GNU getopt not to rearrange argv */ - while ((c = getopt_long(argc, argv, "+F:f:v:W:", optab, NULL)) != EOF) { + for (optopt = 0; + (c = getopt_long(argc, argv, optlist, optab, NULL)) != EOF; + optopt = 0) { if (do_posix) opterr = 1; switch (c) { @@ -254,9 +262,21 @@ char **argv; * option stops argument processing so that it can * go into ARGV for the awk program to see. This * makes use of ``#! /bin/gawk -f'' easier. + * + * However, it's never simple. If optopt is set, + * an option that requires an argument didn't get the + * argument. We care because if opterr is 0, then + * getopt_long won't print the error message for us. */ - if (! do_posix) + if (! do_posix + && (optopt == 0 || strchr(optlist, optopt) == NULL)) { + optind--; goto out; + } else if (optopt) + /* Use 1003.2 required message format */ + fprintf (stderr, + "%s: option requires an argument -- %c\n", + myname, optopt); /* else let getopt print error message for us */ break; @@ -319,15 +339,19 @@ usage(exitval) int exitval; { char *opt1 = " -f progfile [--]"; +#if defined(MSDOS) || defined(OS2) + char *opt2 = " [--] \"program\""; +#else char *opt2 = " [--] 'program'"; +#endif char *regops = " [POSIX or GNU style options]"; version(); - fprintf(stderr, "usage: %s%s%s file ...\n %s%s%s file ...\n", + fprintf(stderr, "Usage: %s%s%s file ...\n\t%s%s%s file ...\n", myname, regops, opt1, myname, regops, opt2); /* GNU long options info. Gack. */ - fputs("\nPOSIX options:\t\tGNU long options:\n", stderr); + fputs("POSIX options:\t\tGNU long options:\n", stderr); fputs("\t-f progfile\t\t--file=progfile\n", stderr); fputs("\t-F fs\t\t\t--field-separator=fs\n", stderr); fputs("\t-v var=val\t\t--assign=var=val\n", stderr); @@ -446,7 +470,7 @@ static struct varinit varinit[] = { {&FS_node, "FS", Node_FS, " ", 0, 0 }, {&RS_node, "RS", Node_RS, "\n", 0, set_RS }, {&IGNORECASE_node, "IGNORECASE", Node_IGNORECASE, 0, 0, set_IGNORECASE }, -{&FILENAME_node, "FILENAME", Node_var, "-", 0, 0 }, +{&FILENAME_node, "FILENAME", Node_var, "", 0, 0 }, {&OFS_node, "OFS", Node_OFS, " ", 0, set_OFS }, {&ORS_node, "ORS", Node_ORS, "\n", 0, set_ORS }, {&OFMT_node, "OFMT", Node_OFMT, "%.6g", 0, set_OFMT }, @@ -477,7 +501,7 @@ init_vars() void load_environ() { -#if !defined(MSDOS) && !(defined(VMS) && defined(__DECC)) +#if !defined(MSDOS) && !defined(OS2) && !(defined(VMS) && defined(__DECC)) extern char **environ; #endif register char *var, *val; @@ -510,7 +534,8 @@ char * arg_assign(arg) char *arg; { - char *cp; + char *cp, *cp2; + int badvar; Func_ptr after_assign = NULL; NODE *var; NODE *it; @@ -519,6 +544,19 @@ char *arg; cp = strchr(arg, '='); if (cp != NULL) { *cp++ = '\0'; + /* first check that the variable name has valid syntax */ + badvar = 0; + if (! isalpha(arg[0]) && arg[0] != '_') + badvar = 1; + else + for (cp2 = arg+1; *cp2; cp2++) + if (! isalnum(*cp2) && *cp2 != '_') { + badvar = 1; + break; + } + if (badvar) + fatal("illegal name `%s' in variable assignment", arg); + /* * Recent versions of nawk expand escapes inside assignments. * This makes sense, so we do it too. @@ -691,38 +729,39 @@ version() fprintf(stderr, "%s, patchlevel %d\n", version_string, PATCHLEVEL); } -/* static */ +/* this mess will improve in 2.16 */ char * gawk_name(filespec) char *filespec; { - char *p; - + char *p; + #ifdef VMS /* "device:[root.][directory.subdir]GAWK.EXE;n" -> "GAWK" */ - char *q; + char *q; - p = strrchr(filespec, ']'); /* directory punctuation */ - q = strrchr(filespec, '>'); /* alternate <international> punct */ + p = strrchr(filespec, ']'); /* directory punctuation */ + q = strrchr(filespec, '>'); /* alternate <international> punct */ - if (p == NULL || q > p) p = q; + if (p == NULL || q > p) p = q; p = strdup(p == NULL ? filespec : (p + 1)); if ((q = strrchr(p, '.')) != NULL) *q = '\0'; /* strip .typ;vers */ return p; #endif /*VMS*/ -#if defined(MSDOS) || defined(atarist) - char *q; +#if defined(MSDOS) || defined(OS2) || defined(atarist) + char *q; - p = filespec; - - if (q = strrchr(p, '\\')) - p = q + 1; - if (q = strchr(p, '.')) - *q = '\0'; - strlwr(p); + for (p = filespec; (p = strchr(p, '\\')); *p = '/') + ; + p = filespec; + if ((q = strrchr(p, '/'))) + p = q + 1; + if ((q = strchr(p, '.'))) + *q = '\0'; + strlwr(p); - return (p == NULL ? filespec : p); + return (p == NULL ? filespec : p); #endif /* MSDOS || atarist */ /* "path/name" -> "name" */ |