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
42int	dbg	= 0;
43int	svargc;
44wchar_t **svargv;
45eucwidth_t eucwidth;
46
47extern FILE	*yyin;	/* lex input file */
48wchar_t *lexprog;	/* points to program argument if it exists */
49extern	int errorflag;	/* non-zero if any syntax errors; set by yyerror */
50
51wchar_t	radixpoint = L'.';
52
53int filefd, symnum, ansfd;
54extern int maxsym, errno;
55
56extern void run(NODE *a);
57extern void syminit(void);
58
59int
60main(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,
84gettext("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
159int
160yywrap()
161{
162	return (1);
163}
164