Merge branch 'vendor/OPENSSL'
[dragonfly.git] / contrib / awk20100523 / main.c
1 /****************************************************************
2 Copyright (C) Lucent Technologies 1997
3 All Rights Reserved
4
5 Permission to use, copy, modify, and distribute this software and
6 its documentation for any purpose and without fee is hereby
7 granted, provided that the above copyright notice appear in all
8 copies and that both that the copyright notice and this
9 permission notice and warranty disclaimer appear in supporting
10 documentation, and that the name Lucent Technologies or any of
11 its entities not be used in advertising or publicity pertaining
12 to distribution of the software without specific, written prior
13 permission.
14
15 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
22 THIS SOFTWARE.
23 ****************************************************************/
24
25 const char      *version = "version 20100523";
26
27 #define DEBUG
28 #include <stdio.h>
29 #include <ctype.h>
30 #include <locale.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <signal.h>
34 #include "awk.h"
35 #include "ytab.h"
36
37 extern  char    **environ;
38 extern  int     nfields;
39
40 int     dbg     = 0;
41 char    *cmdname;       /* gets argv[0] for error messages */
42 extern  FILE    *yyin;  /* lex input file */
43 char    *lexprog;       /* points to program argument if it exists */
44 extern  int errorflag;  /* non-zero if any syntax errors; set by yyerror */
45 int     compile_time = 2;       /* for error printing: */
46                                 /* 2 = cmdline, 1 = compile, 0 = running */
47
48 #define MAX_PFILE       20      /* max number of -f's */
49
50 char    *pfile[MAX_PFILE];      /* program filenames from -f's */
51 int     npfile = 0;     /* number of filenames */
52 int     curpfile = 0;   /* current filename */
53
54 int     safe    = 0;    /* 1 => "safe" mode */
55
56 int main(int argc, char *argv[])
57 {
58         const char *fs = NULL;
59
60         setlocale(LC_CTYPE, "");
61         setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
62         cmdname = argv[0];
63         if (argc == 1) {
64                 fprintf(stderr, 
65                   "usage: %s [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]\n", 
66                   cmdname);
67                 exit(1);
68         }
69         signal(SIGFPE, fpecatch);
70         yyin = NULL;
71         symtab = makesymtab(NSYMTAB/NSYMTAB);
72         while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') {
73                 if (strcmp(argv[1],"-version") == 0 || strcmp(argv[1],"--version") == 0) {
74                         printf("awk %s\n", version);
75                         exit(0);
76                         break;
77                 }
78                 if (strncmp(argv[1], "--", 2) == 0) {   /* explicit end of args */
79                         argc--;
80                         argv++;
81                         break;
82                 }
83                 switch (argv[1][1]) {
84                 case 's':
85                         if (strcmp(argv[1], "-safe") == 0)
86                                 safe = 1;
87                         break;
88                 case 'f':       /* next argument is program filename */
89                         argc--;
90                         argv++;
91                         if (argc <= 1)
92                                 FATAL("no program filename");
93                         if (npfile >= MAX_PFILE - 1)
94                                 FATAL("too many -f options"); 
95                         pfile[npfile++] = argv[1];
96                         break;
97                 case 'F':       /* set field separator */
98                         if (argv[1][2] != 0) {  /* arg is -Fsomething */
99                                 if (argv[1][2] == 't' && argv[1][3] == 0)       /* wart: t=>\t */
100                                         fs = "\t";
101                                 else if (argv[1][2] != 0)
102                                         fs = &argv[1][2];
103                         } else {                /* arg is -F something */
104                                 argc--; argv++;
105                                 if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0)   /* wart: t=>\t */
106                                         fs = "\t";
107                                 else if (argc > 1 && argv[1][0] != 0)
108                                         fs = &argv[1][0];
109                         }
110                         if (fs == NULL || *fs == '\0')
111                                 WARNING("field separator FS is empty");
112                         break;
113                 case 'v':       /* -v a=1 to be done NOW.  one -v for each */
114                         if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1]))
115                                 setclvar(argv[1]);
116                         else if (argv[1][2] != '\0')
117                                 setclvar(&argv[1][2]);
118                         break;
119                 case 'd':
120                         dbg = atoi(&argv[1][2]);
121                         if (dbg == 0)
122                                 dbg = 1;
123                         printf("awk %s\n", version);
124                         break;
125                 default:
126                         WARNING("unknown option %s ignored", argv[1]);
127                         break;
128                 }
129                 argc--;
130                 argv++;
131         }
132         /* argv[1] is now the first argument */
133         if (npfile == 0) {      /* no -f; first argument is program */
134                 if (argc <= 1) {
135                         if (dbg)
136                                 exit(0);
137                         FATAL("no program given");
138                 }
139                    dprintf( ("program = |%s|\n", argv[1]) );
140                 lexprog = argv[1];
141                 argc--;
142                 argv++;
143         }
144         recinit(recsize);
145         syminit();
146         compile_time = 1;
147         argv[0] = cmdname;      /* put prog name at front of arglist */
148            dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) );
149         arginit(argc, argv);
150         if (!safe)
151                 envinit(environ);
152         yyparse();
153         setlocale(LC_NUMERIC, ""); /* back to whatever it is locally */
154         if (fs)
155                 *FS = qstring(fs, '\0');
156            dprintf( ("errorflag=%d\n", errorflag) );
157         if (errorflag == 0) {
158                 compile_time = 0;
159                 run(winner);
160         } else
161                 bracecheck();
162         return(errorflag);
163 }
164
165 int pgetc(void)         /* get 1 character from awk program */
166 {
167         int c;
168
169         for (;;) {
170                 if (yyin == NULL) {
171                         if (curpfile >= npfile)
172                                 return EOF;
173                         if (strcmp(pfile[curpfile], "-") == 0)
174                                 yyin = stdin;
175                         else if ((yyin = fopen(pfile[curpfile], "r")) == NULL)
176                                 FATAL("can't open file %s", pfile[curpfile]);
177                         lineno = 1;
178                 }
179                 if ((c = getc(yyin)) != EOF)
180                         return c;
181                 if (yyin != stdin)
182                         fclose(yyin);
183                 yyin = NULL;
184                 curpfile++;
185         }
186 }
187
188 char *cursource(void)   /* current source file name */
189 {
190         if (npfile > 0)
191                 return pfile[curpfile];
192         else
193                 return NULL;
194 }