~vcs-imports/gawk/master

« back to all changes in this revision

Viewing changes to main.c

  • Committer: Arnold D. Robbins
  • Date: 2010-07-16 09:27:41 UTC
  • Revision ID: git-v1:61bb57af53ebe916d2db6e3585d4fc7ac1d99b92
Tags: gawk-2.15.3
Move to gawk-2.15.3.

Show diffs side-by-side

added added

removed removed

Lines of Context:
137
137
        extern int optind;
138
138
        extern int opterr;
139
139
        extern char *optarg;
140
 
        int i;
 
140
        char *optlist = "+F:f:v:W:";
 
141
 
 
142
#ifdef __EMX__
 
143
        _response(&argc, &argv);
 
144
        _wildcard(&argc, &argv);
 
145
        setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
 
146
#endif
141
147
 
142
148
        (void) signal(SIGFPE,  (SIGTYPE (*) P((int))) catchsig);
143
149
        (void) signal(SIGSEGV, (SIGTYPE (*) P((int))) catchsig);
183
189
        opterr = 0;
184
190
 
185
191
        /* the + on the front tells GNU getopt not to rearrange argv */
186
 
        while ((c = getopt_long(argc, argv, "+F:f:v:W:", optab, NULL)) != EOF) {
 
192
        for (optopt = 0;
 
193
             (c = getopt_long(argc, argv, optlist, optab, NULL)) != EOF;
 
194
             optopt = 0) {
187
195
                if (do_posix)
188
196
                        opterr = 1;
189
197
                switch (c) {
254
262
                         * option stops argument processing so that it can
255
263
                         * go into ARGV for the awk program to see. This
256
264
                         * makes use of ``#! /bin/gawk -f'' easier.
 
265
                         *
 
266
                         * However, it's never simple. If optopt is set,
 
267
                         * an option that requires an argument didn't get the
 
268
                         * argument. We care because if opterr is 0, then
 
269
                         * getopt_long won't print the error message for us.
257
270
                         */
258
 
                        if (! do_posix)
 
271
                        if (! do_posix
 
272
                            && (optopt == 0 || strchr(optlist, optopt) == NULL)) {
 
273
                                optind--;
259
274
                                goto out;
 
275
                        } else if (optopt)
 
276
                                /* Use 1003.2 required message format */
 
277
                                fprintf (stderr,
 
278
                                "%s: option requires an argument -- %c\n",
 
279
                                        myname, optopt);
260
280
                        /* else
261
281
                                let getopt print error message for us */
262
282
                        break;
319
339
int exitval;
320
340
{
321
341
        char *opt1 = " -f progfile [--]";
 
342
#if defined(MSDOS) || defined(OS2)
 
343
        char *opt2 = " [--] \"program\"";
 
344
#else
322
345
        char *opt2 = " [--] 'program'";
 
346
#endif
323
347
        char *regops = " [POSIX or GNU style options]";
324
348
 
325
349
        version();
326
 
        fprintf(stderr, "usage: %s%s%s file ...\n       %s%s%s file ...\n",
 
350
        fprintf(stderr, "Usage: %s%s%s file ...\n\t%s%s%s file ...\n",
327
351
                myname, regops, opt1, myname, regops, opt2);
328
352
 
329
353
        /* GNU long options info. Gack. */
330
 
        fputs("\nPOSIX options:\t\tGNU long options:\n", stderr);
 
354
        fputs("POSIX options:\t\tGNU long options:\n", stderr);
331
355
        fputs("\t-f progfile\t\t--file=progfile\n", stderr);
332
356
        fputs("\t-F fs\t\t\t--field-separator=fs\n", stderr);
333
357
        fputs("\t-v var=val\t\t--assign=var=val\n", stderr);
446
470
{&FS_node,      "FS",           Node_FS,                " ",    0,  0 },
447
471
{&RS_node,      "RS",           Node_RS,                "\n",   0,  set_RS },
448
472
{&IGNORECASE_node, "IGNORECASE", Node_IGNORECASE,       0,      0,  set_IGNORECASE },
449
 
{&FILENAME_node, "FILENAME",    Node_var,               "-",    0,  0 },
 
473
{&FILENAME_node, "FILENAME",    Node_var,               "",     0,  0 },
450
474
{&OFS_node,     "OFS",          Node_OFS,               " ",    0,  set_OFS },
451
475
{&ORS_node,     "ORS",          Node_ORS,               "\n",   0,  set_ORS },
452
476
{&OFMT_node,    "OFMT",         Node_OFMT,              "%.6g", 0,  set_OFMT },
477
501
void
478
502
load_environ()
479
503
{
480
 
#if !defined(MSDOS) && !(defined(VMS) && defined(__DECC))
 
504
#if !defined(MSDOS) && !defined(OS2) && !(defined(VMS) && defined(__DECC))
481
505
        extern char **environ;
482
506
#endif
483
507
        register char *var, *val;
510
534
arg_assign(arg)
511
535
char *arg;
512
536
{
513
 
        char *cp;
 
537
        char *cp, *cp2;
 
538
        int badvar;
514
539
        Func_ptr after_assign = NULL;
515
540
        NODE *var;
516
541
        NODE *it;
519
544
        cp = strchr(arg, '=');
520
545
        if (cp != NULL) {
521
546
                *cp++ = '\0';
 
547
                /* first check that the variable name has valid syntax */
 
548
                badvar = 0;
 
549
                if (! isalpha(arg[0]) && arg[0] != '_')
 
550
                        badvar = 1;
 
551
                else
 
552
                        for (cp2 = arg+1; *cp2; cp2++)
 
553
                                if (! isalnum(*cp2) && *cp2 != '_') {
 
554
                                        badvar = 1;
 
555
                                        break;
 
556
                                }
 
557
                if (badvar)
 
558
                        fatal("illegal name `%s' in variable assignment", arg);
 
559
 
522
560
                /*
523
561
                 * Recent versions of nawk expand escapes inside assignments.
524
562
                 * This makes sense, so we do it too.
691
729
        fprintf(stderr, "%s, patchlevel %d\n", version_string, PATCHLEVEL);
692
730
}
693
731
 
694
 
/* static */
 
732
/* this mess will improve in 2.16 */
695
733
char *
696
734
gawk_name(filespec)
697
735
char *filespec;
698
736
{
699
 
        char *p;
700
 
    
 
737
        char *p;
 
738
        
701
739
#ifdef VMS      /* "device:[root.][directory.subdir]GAWK.EXE;n" -> "GAWK" */
702
 
        char *q;
703
 
 
704
 
        p = strrchr(filespec, ']');  /* directory punctuation */
705
 
        q = strrchr(filespec, '>');  /* alternate <international> punct */
706
 
 
707
 
        if (p == NULL || q > p) p = q;
 
740
        char *q;
 
741
 
 
742
        p = strrchr(filespec, ']');  /* directory punctuation */
 
743
        q = strrchr(filespec, '>');  /* alternate <international> punct */
 
744
 
 
745
        if (p == NULL || q > p) p = q;
708
746
        p = strdup(p == NULL ? filespec : (p + 1));
709
747
        if ((q = strrchr(p, '.')) != NULL)  *q = '\0';  /* strip .typ;vers */
710
748
 
711
749
        return p;
712
750
#endif /*VMS*/
713
751
 
714
 
#if defined(MSDOS) || defined(atarist)
715
 
        char *q;
716
 
 
717
 
        p = filespec;
718
 
        
719
 
        if (q = strrchr(p, '\\'))
720
 
            p = q + 1;
721
 
        if (q = strchr(p, '.'))
722
 
            *q = '\0';
723
 
        strlwr(p);
724
 
 
725
 
        return (p == NULL ? filespec : p);
 
752
#if defined(MSDOS) || defined(OS2) || defined(atarist)
 
753
        char *q;
 
754
 
 
755
        for (p = filespec; (p = strchr(p, '\\')); *p = '/')
 
756
                ;
 
757
        p = filespec;
 
758
        if ((q = strrchr(p, '/')))
 
759
                p = q + 1;
 
760
        if ((q = strchr(p, '.')))
 
761
                *q = '\0';
 
762
        strlwr(p);
 
763
 
 
764
        return (p == NULL ? filespec : p);
726
765
#endif /* MSDOS || atarist */
727
766
 
728
767
        /* "path/name" -> "name" */