1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22
23 /*
24 * Copyright 1999 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
26 */
27
28 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
29 /* All Rights Reserved */
30
31 #pragma ident "%Z%%M% %I% %E% SMI"
32
33 #include <stdio.h>
34 #include <ctype.h>
35 #include "awk.def"
36 #include "awk.h"
37 #include <wctype.h>
38 #include <getwidth.h>
39 #include <langinfo.h>
40 #include <stdlib.h>
41
42 int dbg = 0;
43 int svargc;
44 wchar_t **svargv;
45 eucwidth_t eucwidth;
46
47 extern FILE *yyin; /* lex input file */
48 wchar_t *lexprog; /* points to program argument if it exists */
49 extern int errorflag; /* non-zero if any syntax errors; set by yyerror */
50
51 wchar_t radixpoint = L'.';
52
53 int filefd, symnum, ansfd;
54 extern int maxsym, errno;
55
56 extern void run(NODE *a);
57 extern void syminit(void);
58
59 int
main(int argc,char * argv[])60 main(int argc, char *argv[])
61 {
62 wchar_t *p, **wargv;
63 int i;
64 static wchar_t L_dash[] = L"-";
65 static wchar_t L_dashd[] = L"-d";
66 char *nl_radix;
67
68 /*
69 * At this point, numbers are still scanned as in
70 * the POSIX locale.
71 * (POSIX.2, volume 2, P867, L4742-4757)
72 */
73 (void) setlocale(LC_ALL, "");
74 (void) setlocale(LC_NUMERIC, "C");
75 #ifndef TEXT_DOMAIN
76 #define TEXT_DOMAIN "SYS_TEST"
77 #endif
78
79 textdomain(TEXT_DOMAIN);
80
81 getwidth(&eucwidth);
82 if (argc == 1) {
83 fprintf(stderr,
84 gettext("awk: Usage: awk [-Fc] [-f source | 'cmds'] [files]\n"));
85 exit(2);
86 }
87 syminit();
88 if ((wargv = (wchar_t **)malloc((argc+1) * sizeof (wchar_t *))) == NULL)
89 error(FATAL, "Insuffcient memory on argv");
90 for (i = 0; i < argc; i++) {
91 if ((p = (wchar_t *)malloc((strlen(argv[i]) + 1)
92 * sizeof (wchar_t))) == NULL)
93 error(FATAL, "Insuffcient memory on argv");
94 mbstowcs(p, argv[i], strlen(argv[i]) + 1);
95 wargv[i] = p;
96 }
97 wargv[argc] = NULL;
98 while (argc > 1) {
99 argc--;
100 wargv++;
101 /* this nonsense is because gcos argument handling */
102 /* folds -F into -f. accordingly, one checks the next */
103 /* character after f to see if it's -f file or -Fx. */
104 if (wargv[0][0] == L'-' && wargv[0][1] == L'f' &&
105 wargv[0][2] == 0) {
106 if (argc <= 1)
107 error(FATAL, "no argument for -f");
108 yyin = (wscmp(wargv[1], L_dash) == 0)
109 ? stdin
110 : fopen(toeuccode(wargv[1]), "r");
111 if (yyin == NULL)
112 error(FATAL, "can't open %ws", wargv[1]);
113 argc--;
114 wargv++;
115 break;
116 } else if (wargv[0][0] == L'-' && wargv[0][1] == L'F') {
117 if (wargv[0][2] == L't')
118 **FS = L'\t';
119 else
120 /* set field sep */
121 **FS = wargv[0][2];
122 continue;
123 } else if (wargv[0][0] != L'-') {
124 dprintf("cmds=|%ws|\n", wargv[0], NULL, NULL);
125 yyin = NULL;
126 lexprog = wargv[0];
127 wargv[0] = wargv[-1]; /* need this space */
128 break;
129 } else if (wscmp(L_dashd, wargv[0]) == 0) {
130 dbg = 1;
131 }
132 }
133 if (argc <= 1) {
134 wargv[0][0] = L'-';
135 wargv[0][1] = 0;
136 argc++;
137 wargv--;
138 }
139 svargc = --argc;
140 svargv = ++wargv;
141 dprintf("svargc=%d svargv[0]=%ws\n", svargc, svargv[0], NULL);
142 *FILENAME = *svargv; /* initial file name */
143 yyparse();
144 dprintf("errorflag=%d\n", errorflag, NULL, NULL);
145 /*
146 * done parsing, so now activate the LC_NUMERIC
147 */
148 (void) setlocale(LC_ALL, "");
149 nl_radix = nl_langinfo(RADIXCHAR);
150 if (nl_radix) {
151 radixpoint = (wchar_t)*nl_radix;
152 }
153 if (errorflag)
154 exit(errorflag);
155 run(winner);
156 return (errorflag);
157 }
158
159 int
yywrap()160 yywrap()
161 {
162 return (1);
163 }
164