4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
42 char *version
= "version Oct 11, 1989";
45 uchar
*cmdname
; /* gets argv[0] for error messages */
46 uchar
*lexprog
; /* points to program argument if it exists */
47 int compile_time
= 2; /* for error printing: */
48 /* 2 = cmdline, 1 = compile, 0 = running */
49 char radixpoint
= '.';
51 static uchar
**pfile
= NULL
; /* program filenames from -f's */
52 static int npfile
= 0; /* number of filenames */
53 static int curpfile
= 0; /* current filename */
56 main(int argc
, char *argv
[], char *envp
[])
61 * At this point, numbers are still scanned as in
63 * (POSIX.2, volume 2, P867, L4742-4757)
65 (void) setlocale(LC_ALL
, "");
66 (void) setlocale(LC_NUMERIC
, "C");
67 #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
68 #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
70 (void) textdomain(TEXT_DOMAIN
);
71 cmdname
= (uchar
*)argv
[0];
73 (void) fprintf(stderr
, gettext(
74 "Usage: %s [-f programfile | 'program'] [-Ffieldsep] "
75 "[-v var=value] [files]\n"), cmdname
);
78 (void) signal(SIGFPE
, fpecatch
);
81 while (argc
> 1 && argv
[1][0] == '-' && argv
[1][1] != '\0') {
82 if (strcmp(argv
[1], "--") == 0) {
83 /* explicit end of args */
89 case 'f': /* next argument is program filename */
93 ERROR
"no program filename" FATAL
;
94 pfile
= realloc(pfile
, sizeof (uchar
*) * (npfile
+ 1));
96 ERROR
"out of space in main" FATAL
;
97 pfile
[npfile
++] = (uchar
*)argv
[1];
99 case 'F': /* set field separator */
100 if (argv
[1][2] != 0) { /* arg is -Fsomething */
102 if (argv
[1][2] == 't' && argv
[1][3] == 0)
104 else if (argv
[1][2] != 0)
105 fs
= (uchar
*)&argv
[1][2];
106 } else { /* arg is -F something */
110 if (argv
[1][0] == 't' &&
113 else if (argv
[1][0] != 0)
114 fs
= (uchar
*)&argv
[1][0];
117 if (fs
== NULL
|| *fs
== '\0')
118 ERROR
"field separator FS is empty" WARNING
;
120 case 'v': /* -v a=1 to be done NOW. one -v for each */
121 if (argv
[1][2] == '\0' && --argc
> 1 &&
122 isclvar((uchar
*)(++argv
)[1]))
123 setclvar((uchar
*)argv
[1]);
126 dbg
= atoi(&argv
[1][2]);
129 (void) printf("awk %s\n", version
);
132 ERROR
"unknown option %s ignored", argv
[1] WARNING
;
138 /* argv[1] is now the first argument */
139 if (npfile
== 0) { /* no -f; first argument is program */
143 ERROR
"no program given" FATAL
;
145 dprintf(("program = |%s|\n", argv
[1]));
146 lexprog
= (uchar
*)argv
[1];
151 argv
[0] = (char *)cmdname
; /* put prog name at front of arglist */
152 dprintf(("argc=%d, argv[0]=%s\n", argc
, argv
[0]));
153 arginit(argc
, (uchar
**)argv
);
154 envinit((uchar
**)envp
);
157 *FS
= qstring(fs
, '\0');
158 dprintf(("errorflag=%d\n", errorflag
));
160 * done parsing, so now activate the LC_NUMERIC
162 (void) setlocale(LC_ALL
, "");
163 nl_radix
= nl_langinfo(RADIXCHAR
);
165 radixpoint
= *nl_radix
;
167 if (errorflag
== 0) {
176 pgetc(void) /* get program character */
182 if (curpfile
>= npfile
)
184 yyin
= (strcmp((char *)pfile
[curpfile
], "-") == 0) ?
185 stdin
: fopen((char *)pfile
[curpfile
], "r");
187 ERROR
"can't open file %s",
188 pfile
[curpfile
] FATAL
;
191 if ((c
= getc(yyin
)) != EOF
)