File:
[local] /
rpl /
rplawk /
main.c
Revision
1.2:
download - view:
text,
annotated -
select for diffs -
revision graph
Wed Jun 12 09:47:52 2013 UTC (11 years, 10 months ago) by
bertrand
Branches:
MAIN
CVS tags:
rpl-4_1_35,
rpl-4_1_34,
rpl-4_1_33,
rpl-4_1_32,
rpl-4_1_31,
rpl-4_1_30,
rpl-4_1_29,
rpl-4_1_28,
rpl-4_1_27,
rpl-4_1_26,
rpl-4_1_25,
rpl-4_1_24,
rpl-4_1_23,
rpl-4_1_22,
rpl-4_1_21,
rpl-4_1_20,
rpl-4_1_19,
rpl-4_1_18,
rpl-4_1_17,
rpl-4_1_16,
rpl-4_1_15,
rpl-4_1_14,
HEAD
Quelques patches pour rplawk et ncurses.
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 20121220";
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: Awkfloat srand_seed = 1;
42: char *cmdname; /* gets argv[0] for error messages */
43: extern FILE *yyin; /* lex input file */
44: char *lexprog; /* points to program argument if it exists */
45: extern int errorflag; /* non-zero if any syntax errors; set by yyerror */
46: int compile_time = 2; /* for error printing: */
47: /* 2 = cmdline, 1 = compile, 0 = running */
48:
49: #define MAX_PFILE 20 /* max number of -f's */
50:
51: char *pfile[MAX_PFILE]; /* program filenames from -f's */
52: int npfile = 0; /* number of filenames */
53: int curpfile = 0; /* current filename */
54:
55: int safe = 0; /* 1 => "safe" mode */
56:
57: int main(int argc, char *argv[])
58: {
59: const char *fs = NULL;
60:
61: setlocale(LC_CTYPE, "");
62: setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
63: cmdname = argv[0];
64: if (argc == 1) {
65: fprintf(stderr,
66: "usage: %s [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]\n",
67: cmdname);
68: exit(1);
69: }
70: signal(SIGFPE, fpecatch);
71:
72: srand_seed = 1;
73: srand(srand_seed);
74:
75: yyin = NULL;
76: symtab = makesymtab(NSYMTAB/NSYMTAB);
77: while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') {
78: if (strcmp(argv[1],"-version") == 0 || strcmp(argv[1],"--version") == 0) {
79: printf("awk %s\n", version);
80: exit(0);
81: break;
82: }
83: if (strncmp(argv[1], "--", 2) == 0) { /* explicit end of args */
84: argc--;
85: argv++;
86: break;
87: }
88: switch (argv[1][1]) {
89: case 's':
90: if (strcmp(argv[1], "-safe") == 0)
91: safe = 1;
92: break;
93: case 'f': /* next argument is program filename */
94: if (argv[1][2] != 0) { /* arg is -fsomething */
95: if (npfile >= MAX_PFILE - 1)
96: FATAL("too many -f options");
97: pfile[npfile++] = &argv[1][2];
98: } else { /* arg is -f something */
99: argc--; argv++;
100: if (argc <= 1)
101: FATAL("no program filename");
102: if (npfile >= MAX_PFILE - 1)
103: FATAL("too many -f options");
104: pfile[npfile++] = argv[1];
105: }
106: break;
107: case 'F': /* set field separator */
108: if (argv[1][2] != 0) { /* arg is -Fsomething */
109: if (argv[1][2] == 't' && argv[1][3] == 0) /* wart: t=>\t */
110: fs = "\t";
111: else if (argv[1][2] != 0)
112: fs = &argv[1][2];
113: } else { /* arg is -F something */
114: argc--; argv++;
115: if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0) /* wart: t=>\t */
116: fs = "\t";
117: else if (argc > 1 && argv[1][0] != 0)
118: fs = &argv[1][0];
119: }
120: if (fs == NULL || *fs == '\0')
121: WARNING("field separator FS is empty");
122: break;
123: case 'v': /* -v a=1 to be done NOW. one -v for each */
124: if (argv[1][2] != 0) { /* arg is -vsomething */
125: if (isclvar(&argv[1][2]))
126: setclvar(&argv[1][2]);
127: else
128: FATAL("invalid -v option argument: %s", &argv[1][2]);
129: } else { /* arg is -v something */
130: argc--; argv++;
131: if (argc <= 1)
132: FATAL("no variable name");
133: if (isclvar(argv[1]))
134: setclvar(argv[1]);
135: else
136: FATAL("invalid -v option argument: %s", argv[1]);
137: }
138: break;
139: case 'd':
140: dbg = atoi(&argv[1][2]);
141: if (dbg == 0)
142: dbg = 1;
143: printf("awk %s\n", version);
144: break;
145: default:
146: WARNING("unknown option %s ignored", argv[1]);
147: break;
148: }
149: argc--;
150: argv++;
151: }
152: /* argv[1] is now the first argument */
153: if (npfile == 0) { /* no -f; first argument is program */
154: if (argc <= 1) {
155: if (dbg)
156: exit(0);
157: FATAL("no program given");
158: }
159: dprintf( ("program = |%s|\n", argv[1]) );
160: lexprog = argv[1];
161: argc--;
162: argv++;
163: }
164: recinit(recsize);
165: syminit();
166: compile_time = 1;
167: argv[0] = cmdname; /* put prog name at front of arglist */
168: dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) );
169: arginit(argc, argv);
170: if (!safe)
171: envinit(environ);
172: yyparse();
173: setlocale(LC_NUMERIC, ""); /* back to whatever it is locally */
174: if (fs)
175: *FS = qstring(fs, '\0');
176: dprintf( ("errorflag=%d\n", errorflag) );
177: if (errorflag == 0) {
178: compile_time = 0;
179: run(winner);
180: } else
181: bracecheck();
182: return(errorflag);
183: }
184:
185: int pgetc(void) /* get 1 character from awk program */
186: {
187: int c;
188:
189: for (;;) {
190: if (yyin == NULL) {
191: if (curpfile >= npfile)
192: return EOF;
193: if (strcmp(pfile[curpfile], "-") == 0)
194: yyin = stdin;
195: else if ((yyin = fopen(pfile[curpfile], "r")) == NULL)
196: FATAL("can't open file %s", pfile[curpfile]);
197: lineno = 1;
198: }
199: if ((c = getc(yyin)) != EOF)
200: return c;
201: if (yyin != stdin)
202: fclose(yyin);
203: yyin = NULL;
204: curpfile++;
205: }
206: }
207:
208: char *cursource(void) /* current source file name */
209: {
210: if (npfile > 0)
211: return pfile[curpfile];
212: else
213: return NULL;
214: }
CVSweb interface <joel.bertrand@systella.fr>