1%{
2/*
3 * CDDL HEADER START
4 *
5 * The contents of this file are subject to the terms of the
6 * Common Development and Distribution License, Version 1.0 only
7 * (the "License").  You may not use this file except in compliance
8 * with the License.
9 *
10 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11 * or http://www.opensolaris.org/os/licensing.
12 * See the License for the specific language governing permissions
13 * and limitations under the License.
14 *
15 * When distributing Covered Code, include this CDDL HEADER in each
16 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17 * If applicable, add the following below this CDDL HEADER, with the
18 * fields enclosed by brackets "[]" replaced with your own identifying
19 * information: Portions Copyright [yyyy] [name of copyright owner]
20 *
21 * CDDL HEADER END
22 *
23 * Copyright (c) 1991, 2001 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26#pragma ident	"%Z%%M%	%I%	%E% SMI"
27
28#include <stdio.h>
29#include <string.h>
30
31#define	TRUE	1
32#define	FALSE	0
33
34extern int	stdin_only;
35extern char	curr_file[];	/* Name of file currently being read. */
36extern int	curr_linenum;	/* line number in the current input file */
37extern int	warn_linenum;	/* line number of current warning message */
38extern int	optind;
39extern int	gargc;
40extern char	**gargv;
41
42extern void	handle_macro_line(void);
43extern void	handle_cplus_comment_line(void);
44extern void	handle_open_comment(void);
45extern void	handle_close_comment(void);
46extern void	handle_gettext(void);
47extern void	handle_dgettext(void);
48extern void	handle_dcgettext(void);
49extern void	handle_textdomain(void);
50extern void	handle_character(void);
51extern void	handle_open_paren(void);
52extern void	handle_close_paren(void);
53extern void	handle_esc_newline(void);
54extern void	handle_comma(void);
55extern void	handle_newline(void);
56extern void	handle_quote(void);
57extern void	handle_spaces(void);
58extern void	handle_spaces(void);
59extern void	handle_character(void);
60
61/*
62 * The following lex rule basically wants to recognize tokens
63 * that can change the current state of scanning source code.
64 * Evertime such tokens are recognized, the specific handler will be
65 * executed. All other tokens are treated as regular characters and
66 * they are all handled the same way.
67 * The tricky part was not to miss any specification in ANSI-C code
68 * that looks like a meaningful token but not a meaningful one and
69 * should be treated as regular characters.
70 * For example,
71 *	c= '"';d='"'; printf("\"" "\(\)\\\"");
72 *	c = ABgettext("Not a gettext");
73 *	c = gettextXY("Not a gettext");
74 *	c = ABgettextXY("Not a gettext");
75 */
76%}
77
78IDCHARS		[a-zA-Z0-9_]
79
80%%
81^#(.*\\\n)**.*\n	{ handle_macro_line(); }
82
83\/\/		{ handle_cplus_comment_line(); }
84
85\/\* 		{ handle_open_comment(); }
86
87\*\/ 		{ handle_close_comment(); }
88
89dcgettext	{ handle_dcgettext(); }
90
91dgettext	{ handle_dgettext(); }
92
93gettext		{ handle_gettext(); }
94
95textdomain	{ handle_textdomain(); }
96
97{IDCHARS}+	|
98\'\"\'		|
99\'\\\"\'	|
100\\\\		|
101\\\"		|
102\\\(		|
103\\\)		{ handle_character(); }
104
105\(		{ handle_open_paren(); }
106
107\)		{ handle_close_paren(); }
108
109\\\n		{ handle_esc_newline(); }
110
111\,		{ handle_comma(); }
112
113\n		{ handle_newline(); }
114
115\"		{ handle_quote(); }
116
117" "		{ handle_spaces(); }
118
119"\t"		{ handle_spaces(); }
120
121.		{ handle_character(); }
122
123%%
124
125/*
126 * Since multiple files can be processed, yywrap() should keep feeding
127 * all input files specified.
128 */
129int
130yywrap(void)
131{
132	FILE	*fp;
133
134	if ((optind >= gargc) || (stdin_only == TRUE)) {
135		return (1);
136	} else {
137		/*
138		 * gargv still contains not-processed input files.
139		 */
140		(void) freopen(gargv[optind], "r", stdin);
141		if ((fp = freopen(gargv[optind], "r", stdin)) == NULL) {
142			(void) fprintf(stderr, "ERROR, can't open input file: %s\n",
143					gargv[optind]);
144		}
145#ifdef DEBUG
146		(void) printf("In yywrap(), opening file  %d, <%s>\n",
147				optind, gargv[optind]);
148#endif
149		/*
150		 * Reset global file name and line number for the new file.
151		 */
152		(void) strcpy(curr_file, gargv[optind]);
153		curr_linenum = 0;
154		warn_linenum = 0;
155
156		optind++;
157
158		return (0);
159	}
160
161} /* yywrap */
162