xref: /minix3/external/bsd/flex/dist/scan.l (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /*	$NetBSD: scan.l,v 1.6 2014/10/30 18:44:05 christos Exp $	*/
2357f1050SThomas Veerman 
3357f1050SThomas Veerman /* scan.l - scanner for flex input -*-C-*- */
4357f1050SThomas Veerman 
5357f1050SThomas Veerman %{
6357f1050SThomas Veerman /*  Copyright (c) 1990 The Regents of the University of California. */
7357f1050SThomas Veerman /*  All rights reserved. */
8357f1050SThomas Veerman 
9357f1050SThomas Veerman /*  This code is derived from software contributed to Berkeley by */
10357f1050SThomas Veerman /*  Vern Paxson. */
11357f1050SThomas Veerman 
12357f1050SThomas Veerman /*  The United States Government has rights in this work pursuant */
13357f1050SThomas Veerman /*  to contract no. DE-AC03-76SF00098 between the United States */
14357f1050SThomas Veerman /*  Department of Energy and the University of California. */
15357f1050SThomas Veerman 
16357f1050SThomas Veerman /*  This file is part of flex. */
17357f1050SThomas Veerman 
18357f1050SThomas Veerman /*  Redistribution and use in source and binary forms, with or without */
19357f1050SThomas Veerman /*  modification, are permitted provided that the following conditions */
20357f1050SThomas Veerman /*  are met: */
21357f1050SThomas Veerman 
22357f1050SThomas Veerman /*  1. Redistributions of source code must retain the above copyright */
23357f1050SThomas Veerman /*     notice, this list of conditions and the following disclaimer. */
24357f1050SThomas Veerman /*  2. Redistributions in binary form must reproduce the above copyright */
25357f1050SThomas Veerman /*     notice, this list of conditions and the following disclaimer in the */
26357f1050SThomas Veerman /*     documentation and/or other materials provided with the distribution. */
27357f1050SThomas Veerman 
28357f1050SThomas Veerman /*  Neither the name of the University nor the names of its contributors */
29357f1050SThomas Veerman /*  may be used to endorse or promote products derived from this software */
30357f1050SThomas Veerman /*  without specific prior written permission. */
31357f1050SThomas Veerman 
32357f1050SThomas Veerman /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
33357f1050SThomas Veerman /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
34357f1050SThomas Veerman /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
35357f1050SThomas Veerman /*  PURPOSE. */
36357f1050SThomas Veerman #include "flexdef.h"
37*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: scan.l,v 1.6 2014/10/30 18:44:05 christos Exp $");
38*0a6a1f1dSLionel Sambuc 
39357f1050SThomas Veerman #include "parse.h"
40357f1050SThomas Veerman extern bool tablesverify, tablesext;
41357f1050SThomas Veerman extern int trlcontxt; /* Set in  parse.y for each rule. */
42357f1050SThomas Veerman extern const char *escaped_qstart, *escaped_qend;
43357f1050SThomas Veerman 
44357f1050SThomas Veerman #define ACTION_ECHO add_action( yytext )
45357f1050SThomas Veerman #define ACTION_IFDEF(def, should_define) \
46357f1050SThomas Veerman 	{ \
47357f1050SThomas Veerman 	if ( should_define ) \
48357f1050SThomas Veerman 		action_define( def, 1 ); \
49357f1050SThomas Veerman 	}
50357f1050SThomas Veerman 
51357f1050SThomas Veerman #define ACTION_ECHO_QSTART add_action (escaped_qstart)
52357f1050SThomas Veerman #define ACTION_ECHO_QEND   add_action (escaped_qend)
53357f1050SThomas Veerman 
54357f1050SThomas Veerman #define ACTION_M4_IFDEF(def, should_define) \
55357f1050SThomas Veerman     do{ \
56357f1050SThomas Veerman         if ( should_define ) \
57357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, def, NULL);\
58357f1050SThomas Veerman         else \
59357f1050SThomas Veerman             buf_m4_undefine( &m4defs_buf, def);\
60357f1050SThomas Veerman     } while(0)
61357f1050SThomas Veerman 
62357f1050SThomas Veerman #define MARK_END_OF_PROLOG mark_prolog();
63357f1050SThomas Veerman 
64357f1050SThomas Veerman #define YY_DECL \
65357f1050SThomas Veerman 	int flexscan()
66357f1050SThomas Veerman 
67357f1050SThomas Veerman #define RETURNCHAR \
68357f1050SThomas Veerman 	yylval = (unsigned char) yytext[0]; \
69357f1050SThomas Veerman 	return CHAR;
70357f1050SThomas Veerman 
71357f1050SThomas Veerman #define RETURNNAME \
72357f1050SThomas Veerman 	if(yyleng < MAXLINE) \
73357f1050SThomas Veerman          { \
74357f1050SThomas Veerman 	strlcpy( nmstr, yytext, sizeof(nmstr) ); \
75357f1050SThomas Veerman 	 } \
76357f1050SThomas Veerman 	else \
77357f1050SThomas Veerman 	 { \
78357f1050SThomas Veerman 	   synerr(_("Input line too long\n")); \
79357f1050SThomas Veerman 	   FLEX_EXIT(EXIT_FAILURE);  \
80357f1050SThomas Veerman 	 }  \
81357f1050SThomas Veerman 	return NAME;
82357f1050SThomas Veerman 
83357f1050SThomas Veerman #define PUT_BACK_STRING(str, start) \
84357f1050SThomas Veerman 	for ( i = strlen( str ) - 1; i >= start; --i ) \
85357f1050SThomas Veerman 		unput((str)[i])
86357f1050SThomas Veerman 
87357f1050SThomas Veerman #define CHECK_RE_JECT(str) \
88357f1050SThomas Veerman 	if ( all_upper( str ) ) \
89357f1050SThomas Veerman 		reject = true
90357f1050SThomas Veerman 
91357f1050SThomas Veerman #define CHECK_YYMORE(str) \
92357f1050SThomas Veerman 	if ( all_lower( str ) ) \
93357f1050SThomas Veerman 		yymore_used = true;
94357f1050SThomas Veerman 
95357f1050SThomas Veerman #define YY_USER_INIT \
96357f1050SThomas Veerman 	if ( getenv("POSIXLY_CORRECT") ) \
97357f1050SThomas Veerman 		posix_compat = true;
98357f1050SThomas Veerman 
99357f1050SThomas Veerman %}
100357f1050SThomas Veerman 
101357f1050SThomas Veerman %option caseless nodefault stack noyy_top_state
102357f1050SThomas Veerman %option nostdinit
103357f1050SThomas Veerman 
104357f1050SThomas Veerman %x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE
105357f1050SThomas Veerman %x FIRSTCCL CCL ACTION RECOVER COMMENT ACTION_STRING PERCENT_BRACE_ACTION
106357f1050SThomas Veerman %x OPTION LINEDIR CODEBLOCK_MATCH_BRACE
107357f1050SThomas Veerman %x GROUP_WITH_PARAMS
108357f1050SThomas Veerman %x GROUP_MINUS_PARAMS
109357f1050SThomas Veerman %x EXTENDED_COMMENT
110357f1050SThomas Veerman %x COMMENT_DISCARD
111357f1050SThomas Veerman 
112357f1050SThomas Veerman WS		[[:blank:]]+
113357f1050SThomas Veerman OPTWS		[[:blank:]]*
114357f1050SThomas Veerman NOT_WS		[^[:blank:]\r\n]
115357f1050SThomas Veerman 
116357f1050SThomas Veerman NL		\r?\n
117357f1050SThomas Veerman 
118357f1050SThomas Veerman NAME		([[:alpha:]_][[:alnum:]_-]*)
119357f1050SThomas Veerman NOT_NAME	[^[:alpha:]_*\n]+
120357f1050SThomas Veerman 
121357f1050SThomas Veerman SCNAME		{NAME}
122357f1050SThomas Veerman 
123357f1050SThomas Veerman ESCSEQ		(\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2}))
124357f1050SThomas Veerman 
125357f1050SThomas Veerman FIRST_CCL_CHAR	([^\\\n]|{ESCSEQ})
126357f1050SThomas Veerman CCL_CHAR	([^\\\n\]]|{ESCSEQ})
127357f1050SThomas Veerman CCL_EXPR	("[:"^?[[:alpha:]]+":]")
128357f1050SThomas Veerman 
129357f1050SThomas Veerman LEXOPT		[aceknopr]
130357f1050SThomas Veerman 
131357f1050SThomas Veerman M4QSTART    "[["
132357f1050SThomas Veerman M4QEND      "]]"
133357f1050SThomas Veerman 
134357f1050SThomas Veerman %%
135357f1050SThomas Veerman 	static int bracelevel, didadef, indented_code;
136357f1050SThomas Veerman 	static int doing_rule_action = false;
137357f1050SThomas Veerman 	static int option_sense;
138357f1050SThomas Veerman 
139357f1050SThomas Veerman 	int doing_codeblock = false;
140357f1050SThomas Veerman 	int i, brace_depth=0, brace_start_line=0;
141357f1050SThomas Veerman 	Char nmdef[MAXLINE];
142357f1050SThomas Veerman 
143357f1050SThomas Veerman 
144357f1050SThomas Veerman <INITIAL>{
145357f1050SThomas Veerman 	^{WS}		indented_code = true; BEGIN(CODEBLOCK);
146357f1050SThomas Veerman 	^"/*"		ACTION_ECHO; yy_push_state( COMMENT );
147357f1050SThomas Veerman 	^#{OPTWS}line{WS}	yy_push_state( LINEDIR );
148357f1050SThomas Veerman 	^"%s"{NAME}?	return SCDECL;
149357f1050SThomas Veerman 	^"%x"{NAME}?	return XSCDECL;
150357f1050SThomas Veerman 	^"%{".*{NL}	{
151357f1050SThomas Veerman 			++linenum;
152357f1050SThomas Veerman 			line_directive_out( (FILE *) 0, 1 );
153357f1050SThomas Veerman 			indented_code = false;
154357f1050SThomas Veerman 			BEGIN(CODEBLOCK);
155357f1050SThomas Veerman 			}
156357f1050SThomas Veerman     ^"%top"[[:blank:]]*"{"[[:blank:]]*{NL}    {
157357f1050SThomas Veerman                 brace_start_line = linenum;
158357f1050SThomas Veerman                 ++linenum;
159357f1050SThomas Veerman                 buf_linedir( &top_buf, infilename?infilename:"<stdin>", linenum);
160357f1050SThomas Veerman                 brace_depth = 1;
161357f1050SThomas Veerman                 yy_push_state(CODEBLOCK_MATCH_BRACE);
162357f1050SThomas Veerman             }
163357f1050SThomas Veerman 
164357f1050SThomas Veerman     ^"%top".*   synerr( _("malformed '%top' directive") );
165357f1050SThomas Veerman 
166357f1050SThomas Veerman 	{WS}		/* discard */
167357f1050SThomas Veerman 
168357f1050SThomas Veerman 	^"%%".*		{
169357f1050SThomas Veerman 			sectnum = 2;
170357f1050SThomas Veerman 			bracelevel = 0;
171357f1050SThomas Veerman 			mark_defs1();
172357f1050SThomas Veerman 			line_directive_out( (FILE *) 0, 1 );
173357f1050SThomas Veerman 			BEGIN(SECT2PROLOG);
174357f1050SThomas Veerman 			return SECTEND;
175357f1050SThomas Veerman 			}
176357f1050SThomas Veerman 
177357f1050SThomas Veerman 	^"%pointer".*{NL}	yytext_is_array = false; ++linenum;
178357f1050SThomas Veerman 	^"%array".*{NL}		yytext_is_array = true; ++linenum;
179357f1050SThomas Veerman 
180357f1050SThomas Veerman 	^"%option"	BEGIN(OPTION); return OPTION_OP;
181357f1050SThomas Veerman 
182357f1050SThomas Veerman 	^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL}	++linenum; /* ignore */
183357f1050SThomas Veerman 	^"%"{LEXOPT}{WS}.*{NL}	++linenum;	/* ignore */
184357f1050SThomas Veerman 
185357f1050SThomas Veerman 	/* xgettext: no-c-format */
186357f1050SThomas Veerman 	^"%"[^sxaceknopr{}].*	synerr( _( "unrecognized '%' directive" ) );
187357f1050SThomas Veerman 
188357f1050SThomas Veerman 	^{NAME}		{
189357f1050SThomas Veerman 			if(yyleng < MAXLINE)
190357f1050SThomas Veerman         		 {
191357f1050SThomas Veerman 			strlcpy( nmstr, yytext, sizeof(nmstr) );
192357f1050SThomas Veerman 			 }
193357f1050SThomas Veerman 			else
194357f1050SThomas Veerman 			 {
19584d9c625SLionel Sambuc 			   synerr( _("Definition name too long\n"));
196357f1050SThomas Veerman 			   FLEX_EXIT(EXIT_FAILURE);
197357f1050SThomas Veerman 			 }
198357f1050SThomas Veerman 
199357f1050SThomas Veerman 			didadef = false;
200357f1050SThomas Veerman 			BEGIN(PICKUPDEF);
201357f1050SThomas Veerman 			}
202357f1050SThomas Veerman 
203357f1050SThomas Veerman 	{SCNAME}	RETURNNAME;
204357f1050SThomas Veerman 	^{OPTWS}{NL}	++linenum; /* allows blank lines in section 1 */
205357f1050SThomas Veerman 	{OPTWS}{NL}	ACTION_ECHO; ++linenum; /* maybe end of comment line */
206357f1050SThomas Veerman }
207357f1050SThomas Veerman 
208357f1050SThomas Veerman 
209357f1050SThomas Veerman <COMMENT>{
210357f1050SThomas Veerman 	"*/"		ACTION_ECHO; yy_pop_state();
211357f1050SThomas Veerman 	"*"		ACTION_ECHO;
212357f1050SThomas Veerman     {M4QSTART}  ACTION_ECHO_QSTART;
213357f1050SThomas Veerman     {M4QEND}    ACTION_ECHO_QEND;
214357f1050SThomas Veerman 	[^*\n]      ACTION_ECHO;
215357f1050SThomas Veerman 	{NL}	    ++linenum; ACTION_ECHO;
216357f1050SThomas Veerman }
217357f1050SThomas Veerman 
218357f1050SThomas Veerman <COMMENT_DISCARD>{
219357f1050SThomas Veerman         /* This is the same as COMMENT, but is discarded rather than output. */
220357f1050SThomas Veerman 	"*/"		yy_pop_state();
221357f1050SThomas Veerman     "*"         ;
222357f1050SThomas Veerman 	[^*\n]      ;
223357f1050SThomas Veerman 	{NL}	    ++linenum;
224357f1050SThomas Veerman }
225357f1050SThomas Veerman 
226357f1050SThomas Veerman <EXTENDED_COMMENT>{
227357f1050SThomas Veerman     ")"         yy_pop_state();
228357f1050SThomas Veerman     [^\n\)]+      ;
229357f1050SThomas Veerman     {NL}        ++linenum;
230357f1050SThomas Veerman }
231357f1050SThomas Veerman 
232357f1050SThomas Veerman <LINEDIR>{
233357f1050SThomas Veerman 	\n		yy_pop_state();
234357f1050SThomas Veerman 	[[:digit:]]+	linenum = myctoi( yytext );
235357f1050SThomas Veerman 
236357f1050SThomas Veerman 	\"[^"\n]*\"	{
237357f1050SThomas Veerman 			flex_free( (void *) infilename );
238357f1050SThomas Veerman 			infilename = copy_string( yytext + 1 );
239357f1050SThomas Veerman 			infilename[strlen( infilename ) - 1] = '\0';
240357f1050SThomas Veerman 			}
241357f1050SThomas Veerman 	.		/* ignore spurious characters */
242357f1050SThomas Veerman }
243357f1050SThomas Veerman 
244357f1050SThomas Veerman <CODEBLOCK>{
245357f1050SThomas Veerman 	^"%}".*{NL}	++linenum; BEGIN(INITIAL);
246357f1050SThomas Veerman 
247357f1050SThomas Veerman     {M4QSTART}  ACTION_ECHO_QSTART;
248357f1050SThomas Veerman     {M4QEND}    ACTION_ECHO_QEND;
249357f1050SThomas Veerman 	.	        ACTION_ECHO;
250357f1050SThomas Veerman 
251357f1050SThomas Veerman 	{NL}		{
252357f1050SThomas Veerman 			++linenum;
253357f1050SThomas Veerman 			ACTION_ECHO;
254357f1050SThomas Veerman 			if ( indented_code )
255357f1050SThomas Veerman 				BEGIN(INITIAL);
256357f1050SThomas Veerman 			}
257357f1050SThomas Veerman }
258357f1050SThomas Veerman 
259357f1050SThomas Veerman <CODEBLOCK_MATCH_BRACE>{
260357f1050SThomas Veerman     "}"     {
261357f1050SThomas Veerman                 if( --brace_depth == 0){
262357f1050SThomas Veerman                     /* TODO: Matched. */
263357f1050SThomas Veerman                     yy_pop_state();
264357f1050SThomas Veerman                 }else
265357f1050SThomas Veerman                     buf_strnappend(&top_buf, yytext, yyleng);
266357f1050SThomas Veerman             }
267357f1050SThomas Veerman 
268357f1050SThomas Veerman     "{"     {
269357f1050SThomas Veerman                 brace_depth++;
270357f1050SThomas Veerman                 buf_strnappend(&top_buf, yytext, yyleng);
271357f1050SThomas Veerman             }
272357f1050SThomas Veerman 
273357f1050SThomas Veerman     {NL}    {
274357f1050SThomas Veerman                 ++linenum;
275357f1050SThomas Veerman                 buf_strnappend(&top_buf, yytext, yyleng);
276357f1050SThomas Veerman             }
277357f1050SThomas Veerman 
278357f1050SThomas Veerman     {M4QSTART}  buf_strnappend(&top_buf, escaped_qstart, strlen(escaped_qstart));
279357f1050SThomas Veerman     {M4QEND}    buf_strnappend(&top_buf, escaped_qend, strlen(escaped_qend));
280357f1050SThomas Veerman 
281357f1050SThomas Veerman     [^{}\r\n]  {
282357f1050SThomas Veerman                 buf_strnappend(&top_buf, yytext, yyleng);
283357f1050SThomas Veerman                }
284357f1050SThomas Veerman 
285357f1050SThomas Veerman     <<EOF>>     {
286357f1050SThomas Veerman                 linenum = brace_start_line;
287357f1050SThomas Veerman                 synerr(_("Unmatched '{'"));
288357f1050SThomas Veerman                 yyterminate();
289357f1050SThomas Veerman                 }
290357f1050SThomas Veerman }
291357f1050SThomas Veerman 
292357f1050SThomas Veerman 
293357f1050SThomas Veerman <PICKUPDEF>{
294357f1050SThomas Veerman 	{WS}		/* separates name and definition */
295357f1050SThomas Veerman 
296357f1050SThomas Veerman 	{NOT_WS}[^\r\n]*	{
297357f1050SThomas Veerman  		        if(yyleng < MAXLINE)
298357f1050SThomas Veerman  		         {
299357f1050SThomas Veerman 			strlcpy( (char *) nmdef, yytext, sizeof(nmdef) );
300357f1050SThomas Veerman  		         }
301357f1050SThomas Veerman  		        else
302357f1050SThomas Veerman  		         {
30384d9c625SLionel Sambuc  		           format_synerr( _("Definition value for {%s} too long\n"), nmstr);
304357f1050SThomas Veerman  		           FLEX_EXIT(EXIT_FAILURE);
305357f1050SThomas Veerman 			 }
306357f1050SThomas Veerman 			/* Skip trailing whitespace. */
307357f1050SThomas Veerman 			for ( i = strlen( (char *) nmdef ) - 1;
308357f1050SThomas Veerman 			      i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t');
309357f1050SThomas Veerman 			      --i )
310357f1050SThomas Veerman 				;
311357f1050SThomas Veerman 
312357f1050SThomas Veerman 			nmdef[i + 1] = '\0';
313357f1050SThomas Veerman 
314357f1050SThomas Veerman 			ndinstal( nmstr, nmdef );
315357f1050SThomas Veerman 			didadef = true;
316357f1050SThomas Veerman 			}
317357f1050SThomas Veerman 
318357f1050SThomas Veerman 	{NL}		{
319357f1050SThomas Veerman 			if ( ! didadef )
320357f1050SThomas Veerman 				synerr( _( "incomplete name definition" ) );
321357f1050SThomas Veerman 			BEGIN(INITIAL);
322357f1050SThomas Veerman 			++linenum;
323357f1050SThomas Veerman 			}
324357f1050SThomas Veerman }
325357f1050SThomas Veerman 
326357f1050SThomas Veerman 
327357f1050SThomas Veerman <OPTION>{
328357f1050SThomas Veerman 	{NL}		++linenum; BEGIN(INITIAL);
329357f1050SThomas Veerman 	{WS}		option_sense = true;
330357f1050SThomas Veerman 
331357f1050SThomas Veerman 	"="		return '=';
332357f1050SThomas Veerman 
333357f1050SThomas Veerman 	no		option_sense = ! option_sense;
334357f1050SThomas Veerman 
335357f1050SThomas Veerman 	7bit		csize = option_sense ? 128 : 256;
336357f1050SThomas Veerman 	8bit		csize = option_sense ? 256 : 128;
337357f1050SThomas Veerman 
338357f1050SThomas Veerman 	align		long_align = option_sense;
339357f1050SThomas Veerman 	always-interactive	{
340357f1050SThomas Veerman 			ACTION_M4_IFDEF( "M4""_YY_ALWAYS_INTERACTIVE", option_sense );
341357f1050SThomas Veerman             interactive = option_sense;
342357f1050SThomas Veerman 			}
343357f1050SThomas Veerman 	array		yytext_is_array = option_sense;
344357f1050SThomas Veerman     ansi-definitions ansi_func_defs = option_sense;
345357f1050SThomas Veerman     ansi-prototypes  ansi_func_protos = option_sense;
346357f1050SThomas Veerman 	backup		backing_up_report = option_sense;
347357f1050SThomas Veerman 	batch		interactive = ! option_sense;
348357f1050SThomas Veerman     bison-bridge     bison_bridge_lval = option_sense;
349357f1050SThomas Veerman     bison-locations  { if((bison_bridge_lloc = option_sense))
350357f1050SThomas Veerman                             bison_bridge_lval = true;
351357f1050SThomas Veerman                      }
352357f1050SThomas Veerman 	"c++"		C_plus_plus = option_sense;
353357f1050SThomas Veerman 	caseful|case-sensitive		sf_set_case_ins(!option_sense);
354357f1050SThomas Veerman 	caseless|case-insensitive	sf_set_case_ins(option_sense);
355357f1050SThomas Veerman 	debug		ddebug = option_sense;
356357f1050SThomas Veerman 	default		spprdflt = ! option_sense;
357357f1050SThomas Veerman 	ecs		useecs = option_sense;
358357f1050SThomas Veerman 	fast		{
359357f1050SThomas Veerman 			useecs = usemecs = false;
360357f1050SThomas Veerman 			use_read = fullspd = true;
361357f1050SThomas Veerman 			}
362357f1050SThomas Veerman 	full		{
363357f1050SThomas Veerman 			useecs = usemecs = false;
364357f1050SThomas Veerman 			use_read = fulltbl = true;
365357f1050SThomas Veerman 			}
366357f1050SThomas Veerman 	input		ACTION_IFDEF("YY_NO_INPUT", ! option_sense);
367357f1050SThomas Veerman 	interactive	interactive = option_sense;
368357f1050SThomas Veerman 	lex-compat	lex_compat = option_sense;
369357f1050SThomas Veerman 	posix-compat	posix_compat = option_sense;
370357f1050SThomas Veerman 	main		{
371357f1050SThomas Veerman 			ACTION_M4_IFDEF( "M4""_YY_MAIN", option_sense);
372357f1050SThomas Veerman             /* Override yywrap */
373357f1050SThomas Veerman             if( option_sense == true )
374357f1050SThomas Veerman                 do_yywrap = false;
375357f1050SThomas Veerman 			}
376357f1050SThomas Veerman 	meta-ecs	usemecs = option_sense;
377357f1050SThomas Veerman 	never-interactive	{
378357f1050SThomas Veerman 			ACTION_M4_IFDEF( "M4""_YY_NEVER_INTERACTIVE", option_sense );
379357f1050SThomas Veerman             interactive = !option_sense;
380357f1050SThomas Veerman 			}
381357f1050SThomas Veerman 	perf-report	performance_report += option_sense ? 1 : -1;
382357f1050SThomas Veerman 	pointer		yytext_is_array = ! option_sense;
383357f1050SThomas Veerman 	read		use_read = option_sense;
384357f1050SThomas Veerman     reentrant   reentrant = option_sense;
385357f1050SThomas Veerman 	reject		reject_really_used = option_sense;
386357f1050SThomas Veerman 	stack		ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense );
387357f1050SThomas Veerman 	stdinit		do_stdinit = option_sense;
388357f1050SThomas Veerman 	stdout		use_stdout = option_sense;
389357f1050SThomas Veerman     unistd      ACTION_IFDEF("YY_NO_UNISTD_H", ! option_sense);
390357f1050SThomas Veerman 	unput		ACTION_M4_IFDEF("M4""_YY_NO_UNPUT", ! option_sense);
391357f1050SThomas Veerman 	verbose		printstats = option_sense;
392357f1050SThomas Veerman 	warn		nowarn = ! option_sense;
393357f1050SThomas Veerman 	yylineno	do_yylineno = option_sense; ACTION_M4_IFDEF("M4""_YY_USE_LINENO", option_sense);
394357f1050SThomas Veerman 	yymore		yymore_really_used = option_sense;
395357f1050SThomas Veerman 	yywrap      do_yywrap = option_sense;
396357f1050SThomas Veerman 
397357f1050SThomas Veerman 	yy_push_state	ACTION_M4_IFDEF("M4""_YY_NO_PUSH_STATE", ! option_sense);
398357f1050SThomas Veerman 	yy_pop_state	ACTION_M4_IFDEF("M4""_YY_NO_POP_STATE", ! option_sense);
399357f1050SThomas Veerman 	yy_top_state	ACTION_M4_IFDEF("M4""_YY_NO_TOP_STATE", ! option_sense);
400357f1050SThomas Veerman 
401357f1050SThomas Veerman 	yy_scan_buffer	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BUFFER", ! option_sense);
402357f1050SThomas Veerman 	yy_scan_bytes	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BYTES", ! option_sense);
403357f1050SThomas Veerman 	yy_scan_string	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_STRING", ! option_sense);
404357f1050SThomas Veerman 
405357f1050SThomas Veerman     yyalloc         ACTION_M4_IFDEF("M4""_YY_NO_FLEX_ALLOC", ! option_sense);
406357f1050SThomas Veerman     yyrealloc       ACTION_M4_IFDEF("M4""_YY_NO_FLEX_REALLOC", ! option_sense);
407357f1050SThomas Veerman     yyfree          ACTION_M4_IFDEF("M4""_YY_NO_FLEX_FREE", ! option_sense);
408357f1050SThomas Veerman 
409357f1050SThomas Veerman     yyget_debug     ACTION_M4_IFDEF("M4""_YY_NO_GET_DEBUG", ! option_sense);
410357f1050SThomas Veerman     yyset_debug     ACTION_M4_IFDEF("M4""_YY_NO_SET_DEBUG", ! option_sense);
411357f1050SThomas Veerman     yyget_extra     ACTION_M4_IFDEF("M4""_YY_NO_GET_EXTRA", ! option_sense);
412357f1050SThomas Veerman     yyset_extra     ACTION_M4_IFDEF("M4""_YY_NO_SET_EXTRA", ! option_sense);
413357f1050SThomas Veerman     yyget_leng      ACTION_M4_IFDEF("M4""_YY_NO_GET_LENG", ! option_sense);
414357f1050SThomas Veerman     yyget_text      ACTION_M4_IFDEF("M4""_YY_NO_GET_TEXT", ! option_sense);
415357f1050SThomas Veerman     yyget_lineno    ACTION_M4_IFDEF("M4""_YY_NO_GET_LINENO", ! option_sense);
416357f1050SThomas Veerman     yyset_lineno    ACTION_M4_IFDEF("M4""_YY_NO_SET_LINENO", ! option_sense);
417357f1050SThomas Veerman     yyget_in        ACTION_M4_IFDEF("M4""_YY_NO_GET_IN", ! option_sense);
418357f1050SThomas Veerman     yyset_in        ACTION_M4_IFDEF("M4""_YY_NO_SET_IN", ! option_sense);
419357f1050SThomas Veerman     yyget_out       ACTION_M4_IFDEF("M4""_YY_NO_GET_OUT", ! option_sense);
420357f1050SThomas Veerman     yyset_out       ACTION_M4_IFDEF("M4""_YY_NO_SET_OUT", ! option_sense);
421357f1050SThomas Veerman     yyget_lval      ACTION_M4_IFDEF("M4""_YY_NO_GET_LVAL", ! option_sense);
422357f1050SThomas Veerman     yyset_lval      ACTION_M4_IFDEF("M4""_YY_NO_SET_LVAL", ! option_sense);
423357f1050SThomas Veerman     yyget_lloc      ACTION_M4_IFDEF("M4""_YY_NO_GET_LLOC", ! option_sense);
424357f1050SThomas Veerman     yyset_lloc      ACTION_M4_IFDEF("M4""_YY_NO_SET_LLOC", ! option_sense);
425357f1050SThomas Veerman 
426357f1050SThomas Veerman 	extra-type	return OPT_EXTRA_TYPE;
427357f1050SThomas Veerman 	outfile		return OPT_OUTFILE;
428357f1050SThomas Veerman 	prefix		return OPT_PREFIX;
429357f1050SThomas Veerman 	yyclass		return OPT_YYCLASS;
430357f1050SThomas Veerman 	header(-file)?      return OPT_HEADER;
431357f1050SThomas Veerman 	tables-file         return OPT_TABLES;
432357f1050SThomas Veerman 	tables-verify   {
433357f1050SThomas Veerman                     tablesverify = option_sense;
434357f1050SThomas Veerman                     if(!tablesext && option_sense)
435357f1050SThomas Veerman                         tablesext = true;
436357f1050SThomas Veerman                     }
437357f1050SThomas Veerman 
438357f1050SThomas Veerman 
439357f1050SThomas Veerman 	\"[^"\n]*\"	{
440357f1050SThomas Veerman 			if(yyleng-1 < MAXLINE)
441357f1050SThomas Veerman         		 {
442357f1050SThomas Veerman 			strlcpy( nmstr, yytext + 1, sizeof(nmstr) );
443357f1050SThomas Veerman 			 }
444357f1050SThomas Veerman 			else
445357f1050SThomas Veerman 			 {
44684d9c625SLionel Sambuc 			   synerr( _("Option line too long\n"));
447357f1050SThomas Veerman 			   FLEX_EXIT(EXIT_FAILURE);
448357f1050SThomas Veerman 			 }
449357f1050SThomas Veerman 			nmstr[strlen( nmstr ) - 1] = '\0';
450357f1050SThomas Veerman 			return NAME;
451357f1050SThomas Veerman 			}
452357f1050SThomas Veerman 
453357f1050SThomas Veerman 	(([a-mo-z]|n[a-np-z])[[:alpha:]\-+]*)|.	{
454357f1050SThomas Veerman 			format_synerr( _( "unrecognized %%option: %s" ),
455357f1050SThomas Veerman 				yytext );
456357f1050SThomas Veerman 			BEGIN(RECOVER);
457357f1050SThomas Veerman 			}
458357f1050SThomas Veerman }
459357f1050SThomas Veerman 
460357f1050SThomas Veerman <RECOVER>.*{NL}		++linenum; BEGIN(INITIAL);
461357f1050SThomas Veerman 
462357f1050SThomas Veerman 
463357f1050SThomas Veerman <SECT2PROLOG>{
464357f1050SThomas Veerman 	^"%{".*	++bracelevel; yyless( 2 );	/* eat only %{ */
465357f1050SThomas Veerman 	^"%}".*	--bracelevel; yyless( 2 );	/* eat only %} */
466357f1050SThomas Veerman 
467357f1050SThomas Veerman 	^{WS}.*	ACTION_ECHO;	/* indented code in prolog */
468357f1050SThomas Veerman 
469357f1050SThomas Veerman 	^{NOT_WS}.*	{	/* non-indented code */
470357f1050SThomas Veerman 			if ( bracelevel <= 0 )
471357f1050SThomas Veerman 				{ /* not in %{ ... %} */
472357f1050SThomas Veerman 				yyless( 0 );	/* put it all back */
473357f1050SThomas Veerman 				yy_set_bol( 1 );
474357f1050SThomas Veerman 				mark_prolog();
475357f1050SThomas Veerman 				BEGIN(SECT2);
476357f1050SThomas Veerman 				}
477357f1050SThomas Veerman 			else
478357f1050SThomas Veerman 				ACTION_ECHO;
479357f1050SThomas Veerman 			}
480357f1050SThomas Veerman 
481357f1050SThomas Veerman 	.		ACTION_ECHO;
482357f1050SThomas Veerman 	{NL}	++linenum; ACTION_ECHO;
483357f1050SThomas Veerman 
484357f1050SThomas Veerman 	<<EOF>>		{
485357f1050SThomas Veerman 			mark_prolog();
486357f1050SThomas Veerman 			sectnum = 0;
487357f1050SThomas Veerman 			yyterminate(); /* to stop the parser */
488357f1050SThomas Veerman 			}
489357f1050SThomas Veerman }
490357f1050SThomas Veerman 
491357f1050SThomas Veerman <SECT2>{
492357f1050SThomas Veerman 	^{OPTWS}{NL}	++linenum; /* allow blank lines in section 2 */
493357f1050SThomas Veerman 
494357f1050SThomas Veerman 	^{OPTWS}"%{"	{
495357f1050SThomas Veerman 			indented_code = false;
496357f1050SThomas Veerman 			doing_codeblock = true;
497357f1050SThomas Veerman 			bracelevel = 1;
498357f1050SThomas Veerman 			BEGIN(PERCENT_BRACE_ACTION);
499357f1050SThomas Veerman 			}
500357f1050SThomas Veerman 
501357f1050SThomas Veerman 	^{OPTWS}"<"	    {
502357f1050SThomas Veerman                         /* Allow "<" to appear in (?x) patterns. */
503357f1050SThomas Veerman                         if (!sf_skip_ws())
504357f1050SThomas Veerman                             BEGIN(SC);
505357f1050SThomas Veerman                         return '<';
506357f1050SThomas Veerman                     }
507357f1050SThomas Veerman 	^{OPTWS}"^"	return '^';
508357f1050SThomas Veerman 	\"		BEGIN(QUOTE); return '"';
509357f1050SThomas Veerman 	"{"/[[:digit:]]	{
510357f1050SThomas Veerman 			BEGIN(NUM);
511357f1050SThomas Veerman 			if ( lex_compat || posix_compat )
512357f1050SThomas Veerman 				return BEGIN_REPEAT_POSIX;
513357f1050SThomas Veerman 			else
514357f1050SThomas Veerman 				return BEGIN_REPEAT_FLEX;
515357f1050SThomas Veerman 			}
516357f1050SThomas Veerman 	"$"/([[:blank:]]|{NL})	return '$';
517357f1050SThomas Veerman 
518357f1050SThomas Veerman 	{WS}"%{"		{
519357f1050SThomas Veerman 			bracelevel = 1;
520357f1050SThomas Veerman 			BEGIN(PERCENT_BRACE_ACTION);
521357f1050SThomas Veerman 
522357f1050SThomas Veerman 			if ( in_rule )
523357f1050SThomas Veerman 				{
524357f1050SThomas Veerman 				doing_rule_action = true;
525357f1050SThomas Veerman 				in_rule = false;
526357f1050SThomas Veerman 				return '\n';
527357f1050SThomas Veerman 				}
528357f1050SThomas Veerman 			}
529357f1050SThomas Veerman 	{WS}"|".*{NL}	{
530357f1050SThomas Veerman                         if (sf_skip_ws()){
531357f1050SThomas Veerman                             /* We're in the middle of a (?x: ) pattern. */
532357f1050SThomas Veerman                             /* Push back everything starting at the "|" */
533357f1050SThomas Veerman                             size_t amt;
534357f1050SThomas Veerman                             amt = strchr (yytext, '|') - yytext;
535357f1050SThomas Veerman                             yyless(amt);
536357f1050SThomas Veerman                         }
537357f1050SThomas Veerman                         else {
538357f1050SThomas Veerman                             continued_action = true;
539357f1050SThomas Veerman                             ++linenum;
540357f1050SThomas Veerman                             return '\n';
541357f1050SThomas Veerman                         }
542357f1050SThomas Veerman                     }
543357f1050SThomas Veerman 
544357f1050SThomas Veerman 	^{WS}"/*"	{
545357f1050SThomas Veerman 
546357f1050SThomas Veerman                 if (sf_skip_ws()){
547357f1050SThomas Veerman                     /* We're in the middle of a (?x: ) pattern. */
548357f1050SThomas Veerman                     yy_push_state(COMMENT_DISCARD);
549357f1050SThomas Veerman                 }
550357f1050SThomas Veerman                 else{
551357f1050SThomas Veerman                     yyless( yyleng - 2 );	/* put back '/', '*' */
552357f1050SThomas Veerman                     bracelevel = 0;
553357f1050SThomas Veerman                     continued_action = false;
554357f1050SThomas Veerman                     BEGIN(ACTION);
555357f1050SThomas Veerman                 }
556357f1050SThomas Veerman 			}
557357f1050SThomas Veerman 
558357f1050SThomas Veerman 	^{WS}		/* allow indented rules */ ;
559357f1050SThomas Veerman 
560357f1050SThomas Veerman 	{WS}		{
561357f1050SThomas Veerman             if (sf_skip_ws()){
562357f1050SThomas Veerman                 /* We're in the middle of a (?x: ) pattern. */
563357f1050SThomas Veerman             }
564357f1050SThomas Veerman             else{
565357f1050SThomas Veerman                 /* This rule is separate from the one below because
566357f1050SThomas Veerman                  * otherwise we get variable trailing context, so
567357f1050SThomas Veerman                  * we can't build the scanner using -{f,F}.
568357f1050SThomas Veerman                  */
569357f1050SThomas Veerman                 bracelevel = 0;
570357f1050SThomas Veerman                 continued_action = false;
571357f1050SThomas Veerman                 BEGIN(ACTION);
572357f1050SThomas Veerman 
573357f1050SThomas Veerman                 if ( in_rule )
574357f1050SThomas Veerman                     {
575357f1050SThomas Veerman                     doing_rule_action = true;
576357f1050SThomas Veerman                     in_rule = false;
577357f1050SThomas Veerman                     return '\n';
578357f1050SThomas Veerman                     }
579357f1050SThomas Veerman             }
580357f1050SThomas Veerman 			}
581357f1050SThomas Veerman 
582357f1050SThomas Veerman 	{OPTWS}{NL}	{
583357f1050SThomas Veerman             if (sf_skip_ws()){
584357f1050SThomas Veerman                 /* We're in the middle of a (?x: ) pattern. */
585357f1050SThomas Veerman                 ++linenum;
586357f1050SThomas Veerman             }
587357f1050SThomas Veerman             else{
588357f1050SThomas Veerman                 bracelevel = 0;
589357f1050SThomas Veerman                 continued_action = false;
590357f1050SThomas Veerman                 BEGIN(ACTION);
591357f1050SThomas Veerman                 unput( '\n' );	/* so <ACTION> sees it */
592357f1050SThomas Veerman 
593357f1050SThomas Veerman                 if ( in_rule )
594357f1050SThomas Veerman                     {
595357f1050SThomas Veerman                     doing_rule_action = true;
596357f1050SThomas Veerman                     in_rule = false;
597357f1050SThomas Veerman                     return '\n';
598357f1050SThomas Veerman                     }
599357f1050SThomas Veerman             }
600357f1050SThomas Veerman 			}
601357f1050SThomas Veerman 
602357f1050SThomas Veerman 	^{OPTWS}"<<EOF>>"	|
603357f1050SThomas Veerman 	"<<EOF>>"	return EOF_OP;
604357f1050SThomas Veerman 
605357f1050SThomas Veerman 	^"%%".*		{
606357f1050SThomas Veerman 			sectnum = 3;
607357f1050SThomas Veerman 			BEGIN(SECT3);
608357f1050SThomas Veerman 			outn("/* Begin user sect3 */");
609357f1050SThomas Veerman 			yyterminate(); /* to stop the parser */
610357f1050SThomas Veerman 			}
611357f1050SThomas Veerman 
612357f1050SThomas Veerman 	"["({FIRST_CCL_CHAR}|{CCL_EXPR})({CCL_CHAR}|{CCL_EXPR})*	{
613357f1050SThomas Veerman 			int cclval;
614357f1050SThomas Veerman 
615357f1050SThomas Veerman 			if(yyleng < MAXLINE)
616357f1050SThomas Veerman         		 {
617357f1050SThomas Veerman 			strlcpy( nmstr, yytext, sizeof(nmstr) );
618357f1050SThomas Veerman 			 }
619357f1050SThomas Veerman 			else
620357f1050SThomas Veerman 			 {
621357f1050SThomas Veerman 			   synerr( _("Input line too long\n"));
622357f1050SThomas Veerman 			   FLEX_EXIT(EXIT_FAILURE);
623357f1050SThomas Veerman 			 }
624357f1050SThomas Veerman 
625357f1050SThomas Veerman 			/* Check to see if we've already encountered this
626357f1050SThomas Veerman 			 * ccl.
627357f1050SThomas Veerman 			 */
628357f1050SThomas Veerman 			if (0 /* <--- This "0" effectively disables the reuse of a
629357f1050SThomas Veerman                    * character class (purely based on its source text).
630357f1050SThomas Veerman                    * The reason it was disabled is so yacc/bison can parse
631357f1050SThomas Veerman                    * ccl operations, such as ccl difference and union.
632357f1050SThomas Veerman                    */
633357f1050SThomas Veerman                 &&  (cclval = ccllookup( (Char *) nmstr )) != 0 )
634357f1050SThomas Veerman 				{
635357f1050SThomas Veerman 				if ( input() != ']' )
636357f1050SThomas Veerman 					synerr( _( "bad character class" ) );
637357f1050SThomas Veerman 
638357f1050SThomas Veerman 				yylval = cclval;
639357f1050SThomas Veerman 				++cclreuse;
640357f1050SThomas Veerman 				return PREVCCL;
641357f1050SThomas Veerman 				}
642357f1050SThomas Veerman 			else
643357f1050SThomas Veerman 				{
644357f1050SThomas Veerman 				/* We fudge a bit.  We know that this ccl will
645357f1050SThomas Veerman 				 * soon be numbered as lastccl + 1 by cclinit.
646357f1050SThomas Veerman 				 */
647357f1050SThomas Veerman 				cclinstal( (Char *) nmstr, lastccl + 1 );
648357f1050SThomas Veerman 
649357f1050SThomas Veerman 				/* Push back everything but the leading bracket
650357f1050SThomas Veerman 				 * so the ccl can be rescanned.
651357f1050SThomas Veerman 				 */
652357f1050SThomas Veerman 				yyless( 1 );
653357f1050SThomas Veerman 
654357f1050SThomas Veerman 				BEGIN(FIRSTCCL);
655357f1050SThomas Veerman 				return '[';
656357f1050SThomas Veerman 				}
657357f1050SThomas Veerman 			}
658357f1050SThomas Veerman     "{-}"       return CCL_OP_DIFF;
659357f1050SThomas Veerman     "{+}"       return CCL_OP_UNION;
660357f1050SThomas Veerman 
661357f1050SThomas Veerman 
662357f1050SThomas Veerman     /* Check for :space: at the end of the rule so we don't
663357f1050SThomas Veerman      * wrap the expanded regex in '(' ')' -- breaking trailing
664357f1050SThomas Veerman      * context.
665357f1050SThomas Veerman      */
666357f1050SThomas Veerman 	"{"{NAME}"}"[[:space:]]?	 {
667357f1050SThomas Veerman 			register Char *nmdefptr;
668357f1050SThomas Veerman             int end_is_ws, end_ch;
669357f1050SThomas Veerman 
670357f1050SThomas Veerman             end_ch = yytext[yyleng-1];
671357f1050SThomas Veerman             end_is_ws = end_ch != '}' ? 1 : 0;
672357f1050SThomas Veerman 
673357f1050SThomas Veerman  			if(yyleng-1 < MAXLINE)
674357f1050SThomas Veerman          		 {
675357f1050SThomas Veerman 			strlcpy( nmstr, yytext + 1, sizeof(nmstr) );
676357f1050SThomas Veerman  			 }
677357f1050SThomas Veerman  			else
678357f1050SThomas Veerman  			 {
679357f1050SThomas Veerman  			   synerr( _("Input line too long\n"));
680357f1050SThomas Veerman  			   FLEX_EXIT(EXIT_FAILURE);
681357f1050SThomas Veerman  			 }
682357f1050SThomas Veerman nmstr[yyleng - 2 - end_is_ws] = '\0';  /* chop trailing brace */
683357f1050SThomas Veerman 
684357f1050SThomas Veerman 			if ( (nmdefptr = ndlookup( nmstr )) == 0 )
685357f1050SThomas Veerman 				format_synerr(
686357f1050SThomas Veerman 					_( "undefined definition {%s}" ),
687357f1050SThomas Veerman 						nmstr );
688357f1050SThomas Veerman 
689357f1050SThomas Veerman 			else
690357f1050SThomas Veerman 				{ /* push back name surrounded by ()'s */
691357f1050SThomas Veerman 				int len = strlen( (char *) nmdefptr );
692357f1050SThomas Veerman                 if (end_is_ws)
693357f1050SThomas Veerman                     unput(end_ch);
694357f1050SThomas Veerman 
695357f1050SThomas Veerman 				if ( lex_compat || nmdefptr[0] == '^' ||
696357f1050SThomas Veerman 				     (len > 0 && nmdefptr[len - 1] == '$')
697357f1050SThomas Veerman                      || (end_is_ws && trlcontxt && !sf_skip_ws()))
698357f1050SThomas Veerman 					{ /* don't use ()'s after all */
699357f1050SThomas Veerman 					PUT_BACK_STRING((char *) nmdefptr, 0);
700357f1050SThomas Veerman 
701357f1050SThomas Veerman 					if ( nmdefptr[0] == '^' )
702357f1050SThomas Veerman 						BEGIN(CARETISBOL);
703357f1050SThomas Veerman 					}
704357f1050SThomas Veerman 
705357f1050SThomas Veerman 				else
706357f1050SThomas Veerman 					{
707357f1050SThomas Veerman 					unput(')');
708357f1050SThomas Veerman 					PUT_BACK_STRING((char *) nmdefptr, 0);
709357f1050SThomas Veerman 					unput('(');
710357f1050SThomas Veerman 					}
711357f1050SThomas Veerman 				}
712357f1050SThomas Veerman 			}
713357f1050SThomas Veerman 
714357f1050SThomas Veerman     "/*"        {
715357f1050SThomas Veerman                     if (sf_skip_ws())
716357f1050SThomas Veerman                         yy_push_state(COMMENT_DISCARD);
717357f1050SThomas Veerman                     else{
718357f1050SThomas Veerman                         /* Push back the "*" and return "/" as usual. */
719357f1050SThomas Veerman                         yyless(1);
720357f1050SThomas Veerman                         return '/';
721357f1050SThomas Veerman                     }
722357f1050SThomas Veerman                 }
723357f1050SThomas Veerman 
724357f1050SThomas Veerman     "(?#"       {
725357f1050SThomas Veerman                     if (lex_compat || posix_compat){
726357f1050SThomas Veerman                         /* Push back the "?#" and treat it like a normal parens. */
727357f1050SThomas Veerman                         yyless(1);
728357f1050SThomas Veerman                         sf_push();
729357f1050SThomas Veerman                         return '(';
730357f1050SThomas Veerman                     }
731357f1050SThomas Veerman                     else
732357f1050SThomas Veerman                         yy_push_state(EXTENDED_COMMENT);
733357f1050SThomas Veerman                 }
734357f1050SThomas Veerman     "(?"        {
735357f1050SThomas Veerman                     sf_push();
736357f1050SThomas Veerman                     if (lex_compat || posix_compat)
737357f1050SThomas Veerman                         /* Push back the "?" and treat it like a normal parens. */
738357f1050SThomas Veerman                         yyless(1);
739357f1050SThomas Veerman                     else
740357f1050SThomas Veerman                         BEGIN(GROUP_WITH_PARAMS);
741357f1050SThomas Veerman                     return '(';
742357f1050SThomas Veerman                 }
743357f1050SThomas Veerman     "("         sf_push(); return '(';
744357f1050SThomas Veerman     ")"         sf_pop(); return ')';
745357f1050SThomas Veerman 
746357f1050SThomas Veerman 	[/|*+?.(){}]	return (unsigned char) yytext[0];
747357f1050SThomas Veerman 	.		RETURNCHAR;
748357f1050SThomas Veerman }
749357f1050SThomas Veerman 
750357f1050SThomas Veerman 
751357f1050SThomas Veerman <SC>{
752357f1050SThomas Veerman 	{OPTWS}{NL}{OPTWS}	++linenum;	/* Allow blank lines & continuations */
753357f1050SThomas Veerman 	[,*]		return (unsigned char) yytext[0];
754357f1050SThomas Veerman 	">"		BEGIN(SECT2); return '>';
755357f1050SThomas Veerman 	">"/^		BEGIN(CARETISBOL); return '>';
756357f1050SThomas Veerman 	{SCNAME}	RETURNNAME;
757357f1050SThomas Veerman 	.		{
758357f1050SThomas Veerman 			format_synerr( _( "bad <start condition>: %s" ),
759357f1050SThomas Veerman 				yytext );
760357f1050SThomas Veerman 			}
761357f1050SThomas Veerman }
762357f1050SThomas Veerman 
763357f1050SThomas Veerman <CARETISBOL>"^"		BEGIN(SECT2); return '^';
764357f1050SThomas Veerman 
765357f1050SThomas Veerman 
766357f1050SThomas Veerman <QUOTE>{
767357f1050SThomas Veerman 	[^"\n]		RETURNCHAR;
768357f1050SThomas Veerman 	\"		BEGIN(SECT2); return '"';
769357f1050SThomas Veerman 
770357f1050SThomas Veerman 	{NL}		{
771357f1050SThomas Veerman 			synerr( _( "missing quote" ) );
772357f1050SThomas Veerman 			BEGIN(SECT2);
773357f1050SThomas Veerman 			++linenum;
774357f1050SThomas Veerman 			return '"';
775357f1050SThomas Veerman 			}
776357f1050SThomas Veerman }
777357f1050SThomas Veerman 
778357f1050SThomas Veerman <GROUP_WITH_PARAMS>{
779357f1050SThomas Veerman     ":"     BEGIN(SECT2);
780357f1050SThomas Veerman     "-"     BEGIN(GROUP_MINUS_PARAMS);
781357f1050SThomas Veerman     i       sf_set_case_ins(1);
782357f1050SThomas Veerman     s       sf_set_dot_all(1);
783357f1050SThomas Veerman     x       sf_set_skip_ws(1);
784357f1050SThomas Veerman }
785357f1050SThomas Veerman <GROUP_MINUS_PARAMS>{
786357f1050SThomas Veerman     ":"     BEGIN(SECT2);
787357f1050SThomas Veerman     i       sf_set_case_ins(0);
788357f1050SThomas Veerman     s       sf_set_dot_all(0);
789357f1050SThomas Veerman     x       sf_set_skip_ws(0);
790357f1050SThomas Veerman }
791357f1050SThomas Veerman 
792357f1050SThomas Veerman <FIRSTCCL>{
793357f1050SThomas Veerman 	"^"/[^-\]\n]	BEGIN(CCL); return '^';
794357f1050SThomas Veerman 	"^"/("-"|"]")	return '^';
795357f1050SThomas Veerman 	.		BEGIN(CCL); RETURNCHAR;
796357f1050SThomas Veerman }
797357f1050SThomas Veerman 
798357f1050SThomas Veerman <CCL>{
799357f1050SThomas Veerman 	-/[^\]\n]	return '-';
800357f1050SThomas Veerman 	[^\]\n]		RETURNCHAR;
801357f1050SThomas Veerman 	"]"		BEGIN(SECT2); return ']';
802357f1050SThomas Veerman 	.|{NL}		{
803357f1050SThomas Veerman 			synerr( _( "bad character class" ) );
804357f1050SThomas Veerman 			BEGIN(SECT2);
805357f1050SThomas Veerman 			return ']';
806357f1050SThomas Veerman 			}
807357f1050SThomas Veerman }
808357f1050SThomas Veerman 
809357f1050SThomas Veerman <FIRSTCCL,CCL>{
810357f1050SThomas Veerman 	"[:alnum:]"	BEGIN(CCL); return CCE_ALNUM;
811357f1050SThomas Veerman 	"[:alpha:]"	BEGIN(CCL); return CCE_ALPHA;
812357f1050SThomas Veerman 	"[:blank:]"	BEGIN(CCL); return CCE_BLANK;
813357f1050SThomas Veerman 	"[:cntrl:]"	BEGIN(CCL); return CCE_CNTRL;
814357f1050SThomas Veerman 	"[:digit:]"	BEGIN(CCL); return CCE_DIGIT;
815357f1050SThomas Veerman 	"[:graph:]"	BEGIN(CCL); return CCE_GRAPH;
816357f1050SThomas Veerman 	"[:lower:]"	BEGIN(CCL); return CCE_LOWER;
817357f1050SThomas Veerman 	"[:print:]"	BEGIN(CCL); return CCE_PRINT;
818357f1050SThomas Veerman 	"[:punct:]"	BEGIN(CCL); return CCE_PUNCT;
819357f1050SThomas Veerman 	"[:space:]"	BEGIN(CCL); return CCE_SPACE;
820357f1050SThomas Veerman 	"[:upper:]"	BEGIN(CCL); return CCE_UPPER;
821357f1050SThomas Veerman 	"[:xdigit:]"	BEGIN(CCL); return CCE_XDIGIT;
822357f1050SThomas Veerman 
823357f1050SThomas Veerman 	"[:^alnum:]"	BEGIN(CCL); return CCE_NEG_ALNUM;
824357f1050SThomas Veerman 	"[:^alpha:]"	BEGIN(CCL); return CCE_NEG_ALPHA;
825357f1050SThomas Veerman 	"[:^blank:]"	BEGIN(CCL); return CCE_NEG_BLANK;
826357f1050SThomas Veerman 	"[:^cntrl:]"	BEGIN(CCL); return CCE_NEG_CNTRL;
827357f1050SThomas Veerman 	"[:^digit:]"	BEGIN(CCL); return CCE_NEG_DIGIT;
828357f1050SThomas Veerman 	"[:^graph:]"	BEGIN(CCL); return CCE_NEG_GRAPH;
829357f1050SThomas Veerman 	"[:^lower:]"	BEGIN(CCL); return CCE_NEG_LOWER;
830357f1050SThomas Veerman 	"[:^print:]"	BEGIN(CCL); return CCE_NEG_PRINT;
831357f1050SThomas Veerman 	"[:^punct:]"	BEGIN(CCL); return CCE_NEG_PUNCT;
832357f1050SThomas Veerman 	"[:^space:]"	BEGIN(CCL); return CCE_NEG_SPACE;
833357f1050SThomas Veerman 	"[:^upper:]"	BEGIN(CCL); return CCE_NEG_UPPER;
834357f1050SThomas Veerman 	"[:^xdigit:]"	BEGIN(CCL); return CCE_NEG_XDIGIT;
835357f1050SThomas Veerman 	{CCL_EXPR}	{
836357f1050SThomas Veerman 			format_synerr(
837357f1050SThomas Veerman 				_( "bad character class expression: %s" ),
838357f1050SThomas Veerman 					yytext );
839357f1050SThomas Veerman 			BEGIN(CCL); return CCE_ALNUM;
840357f1050SThomas Veerman 			}
841357f1050SThomas Veerman }
842357f1050SThomas Veerman 
843357f1050SThomas Veerman <NUM>{
844357f1050SThomas Veerman 	[[:digit:]]+	{
845357f1050SThomas Veerman 			yylval = myctoi( yytext );
846357f1050SThomas Veerman 			return NUMBER;
847357f1050SThomas Veerman 			}
848357f1050SThomas Veerman 
849357f1050SThomas Veerman 	","		return ',';
850357f1050SThomas Veerman 	"}"		{
851357f1050SThomas Veerman 			BEGIN(SECT2);
852357f1050SThomas Veerman 			if ( lex_compat || posix_compat )
853357f1050SThomas Veerman 				return END_REPEAT_POSIX;
854357f1050SThomas Veerman 			else
855357f1050SThomas Veerman 				return END_REPEAT_FLEX;
856357f1050SThomas Veerman 			}
857357f1050SThomas Veerman 
858357f1050SThomas Veerman 	.		{
859357f1050SThomas Veerman 			synerr( _( "bad character inside {}'s" ) );
860357f1050SThomas Veerman 			BEGIN(SECT2);
861357f1050SThomas Veerman 			return '}';
862357f1050SThomas Veerman 			}
863357f1050SThomas Veerman 
864357f1050SThomas Veerman 	{NL}		{
865357f1050SThomas Veerman 			synerr( _( "missing }" ) );
866357f1050SThomas Veerman 			BEGIN(SECT2);
867357f1050SThomas Veerman 			++linenum;
868357f1050SThomas Veerman 			return '}';
869357f1050SThomas Veerman 			}
870357f1050SThomas Veerman }
871357f1050SThomas Veerman 
872357f1050SThomas Veerman 
873357f1050SThomas Veerman <PERCENT_BRACE_ACTION>{
874357f1050SThomas Veerman 	{OPTWS}"%}".*		bracelevel = 0;
875357f1050SThomas Veerman 
876357f1050SThomas Veerman 	<ACTION>"/*"		ACTION_ECHO; yy_push_state( COMMENT );
877357f1050SThomas Veerman 
878357f1050SThomas Veerman 	<CODEBLOCK,ACTION>{
879357f1050SThomas Veerman 		"reject"	{
880357f1050SThomas Veerman 			ACTION_ECHO;
881357f1050SThomas Veerman 			CHECK_RE_JECT(yytext);
882357f1050SThomas Veerman 			}
883357f1050SThomas Veerman 		"yymore"	{
884357f1050SThomas Veerman 			ACTION_ECHO;
885357f1050SThomas Veerman 			CHECK_YYMORE(yytext);
886357f1050SThomas Veerman 			}
887357f1050SThomas Veerman 	}
888357f1050SThomas Veerman 
88984d9c625SLionel Sambuc     {M4QSTART}  ACTION_ECHO_QSTART;
890357f1050SThomas Veerman     {M4QEND}    ACTION_ECHO_QEND;
891357f1050SThomas Veerman     .           ACTION_ECHO;
892357f1050SThomas Veerman 	{NL}		{
893357f1050SThomas Veerman 			++linenum;
894357f1050SThomas Veerman 			ACTION_ECHO;
895357f1050SThomas Veerman 			if ( bracelevel == 0 ||
896357f1050SThomas Veerman 			     (doing_codeblock && indented_code) )
897357f1050SThomas Veerman 				{
898357f1050SThomas Veerman 				if ( doing_rule_action )
899357f1050SThomas Veerman 					add_action( "\tYY_BREAK\n" );
900357f1050SThomas Veerman 
901357f1050SThomas Veerman 				doing_rule_action = doing_codeblock = false;
902357f1050SThomas Veerman 				BEGIN(SECT2);
903357f1050SThomas Veerman 				}
904357f1050SThomas Veerman 			}
905357f1050SThomas Veerman }
906357f1050SThomas Veerman 
907357f1050SThomas Veerman 
908357f1050SThomas Veerman 	/* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */
909357f1050SThomas Veerman <ACTION>{
910357f1050SThomas Veerman 	"{"		ACTION_ECHO; ++bracelevel;
911357f1050SThomas Veerman 	"}"		ACTION_ECHO; --bracelevel;
91284d9c625SLionel Sambuc     {M4QSTART}  ACTION_ECHO_QSTART;
913357f1050SThomas Veerman     {M4QEND}    ACTION_ECHO_QEND;
914357f1050SThomas Veerman 	[^[:alpha:]_{}"'/\n\[\]]+	ACTION_ECHO;
915357f1050SThomas Veerman     [\[\]]      ACTION_ECHO;
916357f1050SThomas Veerman 	{NAME}		ACTION_ECHO;
917357f1050SThomas Veerman 	"'"([^'\\\n]|\\.)*"'"	ACTION_ECHO; /* character constant */
918357f1050SThomas Veerman 	\"		ACTION_ECHO; BEGIN(ACTION_STRING);
919357f1050SThomas Veerman 	{NL}		{
920357f1050SThomas Veerman 			++linenum;
921357f1050SThomas Veerman 			ACTION_ECHO;
922357f1050SThomas Veerman 			if ( bracelevel == 0 )
923357f1050SThomas Veerman 				{
924357f1050SThomas Veerman 				if ( doing_rule_action )
925357f1050SThomas Veerman 					add_action( "\tYY_BREAK\n" );
926357f1050SThomas Veerman 
927357f1050SThomas Veerman 				doing_rule_action = false;
928357f1050SThomas Veerman 				BEGIN(SECT2);
929357f1050SThomas Veerman 				}
930357f1050SThomas Veerman 			}
931357f1050SThomas Veerman 	.		ACTION_ECHO;
932357f1050SThomas Veerman }
933357f1050SThomas Veerman 
934357f1050SThomas Veerman <ACTION_STRING>{
935357f1050SThomas Veerman 	[^"\\\n]+	ACTION_ECHO;
936357f1050SThomas Veerman 	\\.		ACTION_ECHO;
937357f1050SThomas Veerman 	{NL}		++linenum; ACTION_ECHO; BEGIN(ACTION);
938357f1050SThomas Veerman 	\"		ACTION_ECHO; BEGIN(ACTION);
939357f1050SThomas Veerman 	.		ACTION_ECHO;
940357f1050SThomas Veerman }
941357f1050SThomas Veerman 
942357f1050SThomas Veerman <COMMENT,COMMENT_DISCARD,ACTION,ACTION_STRING><<EOF>>	{
943357f1050SThomas Veerman 			synerr( _( "EOF encountered inside an action" ) );
944357f1050SThomas Veerman 			yyterminate();
945357f1050SThomas Veerman 			}
946357f1050SThomas Veerman 
947357f1050SThomas Veerman <EXTENDED_COMMENT,GROUP_WITH_PARAMS,GROUP_MINUS_PARAMS><<EOF>>	{
948357f1050SThomas Veerman 			synerr( _( "EOF encountered inside pattern" ) );
949357f1050SThomas Veerman 			yyterminate();
950357f1050SThomas Veerman 			}
951357f1050SThomas Veerman 
952357f1050SThomas Veerman <SECT2,QUOTE,FIRSTCCL,CCL>{ESCSEQ}	{
953357f1050SThomas Veerman 			yylval = myesc( (Char *) yytext );
954357f1050SThomas Veerman 
955357f1050SThomas Veerman 			if ( YY_START == FIRSTCCL )
956357f1050SThomas Veerman 				BEGIN(CCL);
957357f1050SThomas Veerman 
958357f1050SThomas Veerman 			return CHAR;
959357f1050SThomas Veerman 			}
960357f1050SThomas Veerman 
961357f1050SThomas Veerman 
962357f1050SThomas Veerman <SECT3>{
963357f1050SThomas Veerman     {M4QSTART}  fwrite (escaped_qstart, 1, strlen(escaped_qstart), yyout);
964357f1050SThomas Veerman     {M4QEND}    fwrite (escaped_qend, 1, strlen(escaped_qend), yyout);
965357f1050SThomas Veerman 	[^\[\]\n]*(\n?) ECHO;
966357f1050SThomas Veerman 	(.|\n)      ECHO;
967357f1050SThomas Veerman 	<<EOF>>		sectnum = 0; yyterminate();
968357f1050SThomas Veerman }
969357f1050SThomas Veerman 
970357f1050SThomas Veerman <*>.|\n			format_synerr( _( "bad character: %s" ), yytext );
971357f1050SThomas Veerman 
972357f1050SThomas Veerman %%
973357f1050SThomas Veerman 
974357f1050SThomas Veerman 
975357f1050SThomas Veerman int yywrap()
976357f1050SThomas Veerman 	{
977357f1050SThomas Veerman 	if ( --num_input_files > 0 )
978357f1050SThomas Veerman 		{
979357f1050SThomas Veerman 		set_input_file( *++input_files );
980357f1050SThomas Veerman 		return 0;
981357f1050SThomas Veerman 		}
982357f1050SThomas Veerman 
983357f1050SThomas Veerman 	else
984357f1050SThomas Veerman 		return 1;
985357f1050SThomas Veerman 	}
986357f1050SThomas Veerman 
987357f1050SThomas Veerman 
988357f1050SThomas Veerman /* set_input_file - open the given file (if NULL, stdin) for scanning */
989357f1050SThomas Veerman 
990357f1050SThomas Veerman void set_input_file( file )
991357f1050SThomas Veerman char *file;
992357f1050SThomas Veerman 	{
993357f1050SThomas Veerman 	if ( file && strcmp( file, "-" ) )
994357f1050SThomas Veerman 		{
995357f1050SThomas Veerman 		infilename = copy_string( file );
996357f1050SThomas Veerman 		yyin = fopen( infilename, "r" );
997357f1050SThomas Veerman 
998357f1050SThomas Veerman 		if ( yyin == NULL )
999357f1050SThomas Veerman 			lerrsf( _( "can't open %s" ), file );
1000357f1050SThomas Veerman 		}
1001357f1050SThomas Veerman 
1002357f1050SThomas Veerman 	else
1003357f1050SThomas Veerman 		{
1004357f1050SThomas Veerman 		yyin = stdin;
1005357f1050SThomas Veerman 		infilename = copy_string( "<stdin>" );
1006357f1050SThomas Veerman 		}
1007357f1050SThomas Veerman 
1008357f1050SThomas Veerman 	linenum = 1;
1009357f1050SThomas Veerman 	}
1010357f1050SThomas Veerman 
1011357f1050SThomas Veerman 
1012357f1050SThomas Veerman /* Wrapper routines for accessing the scanner's malloc routines. */
1013357f1050SThomas Veerman 
1014357f1050SThomas Veerman void *flex_alloc( size )
1015357f1050SThomas Veerman size_t size;
1016357f1050SThomas Veerman 	{
1017357f1050SThomas Veerman 	return (void *) malloc( size );
1018357f1050SThomas Veerman 	}
1019357f1050SThomas Veerman 
1020357f1050SThomas Veerman void *flex_realloc( ptr, size )
1021357f1050SThomas Veerman void *ptr;
1022357f1050SThomas Veerman size_t size;
1023357f1050SThomas Veerman 	{
1024357f1050SThomas Veerman 	return (void *) realloc( ptr, size );
1025357f1050SThomas Veerman 	}
1026357f1050SThomas Veerman 
1027357f1050SThomas Veerman void flex_free( ptr )
1028357f1050SThomas Veerman void *ptr;
1029357f1050SThomas Veerman 	{
1030357f1050SThomas Veerman 	if ( ptr )
1031357f1050SThomas Veerman 		free( ptr );
1032357f1050SThomas Veerman 	}
1033