Blame src/stage1scan.l

Packit f00812
/* scan.l - scanner for flex input -*-C-*- */
Packit f00812
Packit f00812
%{
Packit f00812
/*  Copyright (c) 1990 The Regents of the University of California. */
Packit f00812
/*  All rights reserved. */
Packit f00812
Packit f00812
/*  This code is derived from software contributed to Berkeley by */
Packit f00812
/*  Vern Paxson. */
Packit f00812
Packit f00812
/*  The United States Government has rights in this work pursuant */
Packit f00812
/*  to contract no. DE-AC03-76SF00098 between the United States */
Packit f00812
/*  Department of Energy and the University of California. */
Packit f00812
Packit f00812
/*  This file is part of flex. */
Packit f00812
Packit f00812
/*  Redistribution and use in source and binary forms, with or without */
Packit f00812
/*  modification, are permitted provided that the following conditions */
Packit f00812
/*  are met: */
Packit f00812
Packit f00812
/*  1. Redistributions of source code must retain the above copyright */
Packit f00812
/*     notice, this list of conditions and the following disclaimer. */
Packit f00812
/*  2. Redistributions in binary form must reproduce the above copyright */
Packit f00812
/*     notice, this list of conditions and the following disclaimer in the */
Packit f00812
/*     documentation and/or other materials provided with the distribution. */
Packit f00812
Packit f00812
/*  Neither the name of the University nor the names of its contributors */
Packit f00812
/*  may be used to endorse or promote products derived from this software */
Packit f00812
/*  without specific prior written permission. */
Packit f00812
Packit f00812
/*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
Packit f00812
/*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
Packit f00812
/*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
Packit f00812
/*  PURPOSE. */
Packit f00812
Packit f00812
#include "flexdef.h"
Packit f00812
#include "parse.h"
Packit f00812
extern bool tablesverify, tablesext;
Packit f00812
extern int trlcontxt; /* Set in  parse.y for each rule. */
Packit f00812
extern const char *escaped_qstart, *escaped_qend;
Packit f00812
Packit f00812
#define ACTION_ECHO add_action( yytext )
Packit f00812
#define ACTION_IFDEF(def, should_define) \
Packit f00812
	{ \
Packit f00812
	if ( should_define ) \
Packit f00812
		action_define( def, 1 ); \
Packit f00812
	}
Packit f00812
Packit f00812
#define ACTION_ECHO_QSTART add_action (escaped_qstart)
Packit f00812
#define ACTION_ECHO_QEND   add_action (escaped_qend)
Packit f00812
Packit f00812
#define ACTION_M4_IFDEF(def, should_define) \
Packit f00812
    do{ \
Packit f00812
        if ( should_define ) \
Packit f00812
            buf_m4_define( &m4defs_buf, def, NULL);\
Packit f00812
        else \
Packit f00812
            buf_m4_undefine( &m4defs_buf, def);\
Packit f00812
    } while(0)
Packit f00812
Packit f00812
#define MARK_END_OF_PROLOG mark_prolog();
Packit f00812
Packit f00812
#define YY_DECL \
Packit f00812
	int flexscan(void)
Packit f00812
Packit f00812
#define RETURNCHAR \
Packit f00812
	yylval = (unsigned char) yytext[0]; \
Packit f00812
	return CHAR;
Packit f00812
Packit f00812
#define RETURNNAME \
Packit f00812
	if(yyleng < MAXLINE) \
Packit f00812
         { \
Packit f00812
	strcpy( nmstr, yytext ); \
Packit f00812
	 } \
Packit f00812
	else \
Packit f00812
	 { \
Packit f00812
	   synerr(_("Input line too long\n")); \
Packit f00812
	   FLEX_EXIT(EXIT_FAILURE);  \
Packit f00812
	 }  \
Packit f00812
	return NAME;
Packit f00812
Packit f00812
#define PUT_BACK_STRING(str, start) \
Packit f00812
	for ( i = strlen( str ) - 1; i >= start; --i ) \
Packit f00812
		unput((str)[i])
Packit f00812
Packit f00812
#define CHECK_REJECT(str) \
Packit f00812
	if ( all_upper( str ) ) \
Packit f00812
		reject = true;
Packit f00812
Packit f00812
#define CHECK_YYMORE(str) \
Packit f00812
	if ( all_lower( str ) ) \
Packit f00812
		yymore_used = true;
Packit f00812
Packit f00812
#define YY_USER_INIT \
Packit f00812
	if ( getenv("POSIXLY_CORRECT") ) \
Packit f00812
		posix_compat = true;
Packit f00812
Packit f00812
%}
Packit f00812
Packit f00812
%option caseless nodefault noreject stack noyy_top_state
Packit f00812
%option nostdinit
Packit f00812
Packit f00812
%x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE
Packit f00812
%x FIRSTCCL CCL ACTION RECOVER COMMENT ACTION_STRING PERCENT_BRACE_ACTION
Packit f00812
%x OPTION LINEDIR CODEBLOCK_MATCH_BRACE
Packit f00812
%x GROUP_WITH_PARAMS
Packit f00812
%x GROUP_MINUS_PARAMS
Packit f00812
%x EXTENDED_COMMENT
Packit f00812
%x COMMENT_DISCARD
Packit f00812
Packit f00812
WS		[[:blank:]]+
Packit f00812
OPTWS		[[:blank:]]*
Packit f00812
NOT_WS		[^[:blank:]\r\n]
Packit f00812
Packit f00812
NL		\r?\n
Packit f00812
Packit f00812
NAME		([[:alpha:]_][[:alnum:]_-]*)
Packit f00812
NOT_NAME	[^[:alpha:]_*\n]+
Packit f00812
Packit f00812
SCNAME		{NAME}
Packit f00812
Packit f00812
ESCSEQ		(\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2}))
Packit f00812
Packit f00812
FIRST_CCL_CHAR	([^\\\n]|{ESCSEQ})
Packit f00812
CCL_CHAR	([^\\\n\]]|{ESCSEQ})
Packit f00812
CCL_EXPR	("[:"^?[[:alpha:]]+":]")
Packit f00812
Packit f00812
LEXOPT		[aceknopr]
Packit f00812
Packit f00812
M4QSTART    "[["
Packit f00812
M4QEND      "]]"
Packit f00812
Packit f00812
%%
Packit f00812
	static int bracelevel, didadef, indented_code;
Packit f00812
	static int doing_rule_action = false;
Packit f00812
	static int option_sense;
Packit f00812
Packit f00812
	int doing_codeblock = false;
Packit f00812
	int i, brace_depth=0, brace_start_line=0;
Packit f00812
	char nmdef[MAXLINE];
Packit f00812
Packit f00812
Packit f00812
<INITIAL>{
Packit f00812
	^{WS}		indented_code = true; BEGIN(CODEBLOCK);
Packit f00812
	^"/*"		ACTION_ECHO; yy_push_state( COMMENT );
Packit f00812
	^#{OPTWS}line{WS}	yy_push_state( LINEDIR );
Packit f00812
	^"%s"{NAME}?	return SCDECL;
Packit f00812
	^"%x"{NAME}?	return XSCDECL;
Packit f00812
	^"%{".*{NL}	{
Packit f00812
			++linenum;
Packit f00812
			line_directive_out(NULL, 1);
Packit f00812
			indented_code = false;
Packit f00812
			BEGIN(CODEBLOCK);
Packit f00812
			}
Packit f00812
    ^"%top"[[:blank:]]*"{"[[:blank:]]*{NL}    {
Packit f00812
                brace_start_line = linenum;
Packit f00812
                ++linenum;
Packit f00812
                buf_linedir( &top_buf, infilename?infilename:"<stdin>", linenum);
Packit f00812
                brace_depth = 1;
Packit f00812
                yy_push_state(CODEBLOCK_MATCH_BRACE);
Packit f00812
            }
Packit f00812
Packit f00812
    ^"%top".*   synerr( _("malformed '%top' directive") );
Packit f00812
Packit f00812
	{WS}		/* discard */
Packit f00812
Packit f00812
	^"%%".*		{
Packit f00812
			sectnum = 2;
Packit f00812
			bracelevel = 0;
Packit f00812
			mark_defs1();
Packit f00812
			line_directive_out(NULL, 1);
Packit f00812
			BEGIN(SECT2PROLOG);
Packit f00812
			return SECTEND;
Packit f00812
			}
Packit f00812
Packit f00812
	^"%pointer".*{NL}	yytext_is_array = false; ++linenum;
Packit f00812
	^"%array".*{NL}		yytext_is_array = true; ++linenum;
Packit f00812
Packit f00812
	^"%option"	BEGIN(OPTION); return TOK_OPTION;
Packit f00812
Packit f00812
	^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL}	++linenum; /* ignore */
Packit f00812
	^"%"{LEXOPT}{WS}.*{NL}	++linenum;	/* ignore */
Packit f00812
Packit f00812
	/* xgettext: no-c-format */
Packit f00812
	^"%"[^sxaceknopr{}].*	synerr( _( "unrecognized '%' directive" ) );
Packit f00812
Packit f00812
	^{NAME}		{
Packit f00812
			if(yyleng < MAXLINE)
Packit f00812
        		 {
Packit f00812
			strcpy( nmstr, yytext );
Packit f00812
			 }
Packit f00812
			else
Packit f00812
			 {
Packit f00812
			   synerr( _("Definition name too long\n"));
Packit f00812
			   FLEX_EXIT(EXIT_FAILURE);
Packit f00812
			 }
Packit f00812
Packit f00812
			didadef = false;
Packit f00812
			BEGIN(PICKUPDEF);
Packit f00812
			}
Packit f00812
Packit f00812
	{SCNAME}	RETURNNAME;
Packit f00812
	^{OPTWS}{NL}	++linenum; /* allows blank lines in section 1 */
Packit f00812
	{OPTWS}{NL}	ACTION_ECHO; ++linenum; /* maybe end of comment line */
Packit f00812
}
Packit f00812
Packit f00812
Packit f00812
<COMMENT>{
Packit f00812
	"*/"		ACTION_ECHO; yy_pop_state();
Packit f00812
	"*"		ACTION_ECHO;
Packit f00812
    {M4QSTART}  ACTION_ECHO_QSTART;
Packit f00812
    {M4QEND}    ACTION_ECHO_QEND;
Packit f00812
	[^*\n]      ACTION_ECHO;
Packit f00812
	{NL}	    ++linenum; ACTION_ECHO;
Packit f00812
}
Packit f00812
Packit f00812
<COMMENT_DISCARD>{
Packit f00812
        /* This is the same as COMMENT, but is discarded rather than output. */
Packit f00812
	"*/"		yy_pop_state();
Packit f00812
    "*"         ;
Packit f00812
	[^*\n]      ;
Packit f00812
	{NL}	    ++linenum;
Packit f00812
}
Packit f00812
Packit f00812
<EXTENDED_COMMENT>{
Packit f00812
    ")"         yy_pop_state();
Packit f00812
    [^\n\)]+      ;
Packit f00812
    {NL}        ++linenum;        
Packit f00812
}
Packit f00812
Packit f00812
<LINEDIR>{
Packit f00812
	\n		yy_pop_state();
Packit f00812
	[[:digit:]]+	linenum = myctoi( yytext );
Packit f00812
Packit f00812
	\"[^"\n]*\"	{
Packit f00812
			free(infilename);
Packit f00812
			infilename = xstrdup(yytext + 1);
Packit f00812
			infilename[strlen( infilename ) - 1] = '\0';
Packit f00812
			}
Packit f00812
	.		/* ignore spurious characters */
Packit f00812
}
Packit f00812
Packit f00812
<CODEBLOCK>{
Packit f00812
	^"%}".*{NL}	++linenum; BEGIN(INITIAL);
Packit f00812
Packit f00812
    {M4QSTART}  ACTION_ECHO_QSTART;
Packit f00812
    {M4QEND}    ACTION_ECHO_QEND;
Packit f00812
	.	        ACTION_ECHO;
Packit f00812
Packit f00812
	{NL}		{
Packit f00812
			++linenum;
Packit f00812
			ACTION_ECHO;
Packit f00812
			if ( indented_code )
Packit f00812
				BEGIN(INITIAL);
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
<CODEBLOCK_MATCH_BRACE>{
Packit f00812
    "}"     {
Packit f00812
                if( --brace_depth == 0){
Packit f00812
                    /* TODO: Matched. */
Packit f00812
                    yy_pop_state();
Packit f00812
                }else
Packit f00812
                    buf_strnappend(&top_buf, yytext, yyleng);
Packit f00812
            }
Packit f00812
Packit f00812
    "{"     {
Packit f00812
                brace_depth++;
Packit f00812
                buf_strnappend(&top_buf, yytext, yyleng);
Packit f00812
            }
Packit f00812
Packit f00812
    {NL}    {
Packit f00812
                ++linenum;
Packit f00812
                buf_strnappend(&top_buf, yytext, yyleng);
Packit f00812
            }
Packit f00812
Packit f00812
    {M4QSTART}  buf_strnappend(&top_buf, escaped_qstart, (int) strlen(escaped_qstart));
Packit f00812
    {M4QEND}    buf_strnappend(&top_buf, escaped_qend, (int) strlen(escaped_qend));
Packit f00812
Packit f00812
    [^{}\r\n]  {
Packit f00812
                buf_strnappend(&top_buf, yytext, yyleng);
Packit f00812
               }
Packit f00812
Packit f00812
    <<EOF>>     {
Packit f00812
                linenum = brace_start_line;
Packit f00812
                synerr(_("Unmatched '{'"));
Packit f00812
                yyterminate();
Packit f00812
                }
Packit f00812
}
Packit f00812
Packit f00812
Packit f00812
<PICKUPDEF>{
Packit f00812
	{WS}		/* separates name and definition */
Packit f00812
Packit f00812
	{NOT_WS}[^\r\n]*	{
Packit f00812
 		        if(yyleng < MAXLINE)
Packit f00812
 		         {
Packit f00812
			strcpy( nmdef, yytext );
Packit f00812
 		         }
Packit f00812
 		        else
Packit f00812
 		         {
Packit f00812
 		           format_synerr( _("Definition value for {%s} too long\n"), nmstr);
Packit f00812
 		           FLEX_EXIT(EXIT_FAILURE);
Packit f00812
			 }
Packit f00812
			/* Skip trailing whitespace. */
Packit f00812
			for ( i = strlen( nmdef ) - 1;
Packit f00812
			      i >= 0 && (nmdef[i] == ' ' || nmdef[i] == '\t');
Packit f00812
			      --i )
Packit f00812
				;
Packit f00812
Packit f00812
			nmdef[i + 1] = '\0';
Packit f00812
Packit f00812
			ndinstal( nmstr, nmdef );
Packit f00812
			didadef = true;
Packit f00812
			}
Packit f00812
Packit f00812
	{NL}		{
Packit f00812
			if ( ! didadef )
Packit f00812
				synerr( _( "incomplete name definition" ) );
Packit f00812
			BEGIN(INITIAL);
Packit f00812
			++linenum;
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
Packit f00812
<OPTION>{
Packit f00812
	{NL}		++linenum; BEGIN(INITIAL);
Packit f00812
	{WS}		option_sense = true;
Packit f00812
Packit f00812
	"="		return '=';
Packit f00812
Packit f00812
	no		option_sense = ! option_sense;
Packit f00812
Packit f00812
	7bit		csize = option_sense ? 128 : 256;
Packit f00812
	8bit		csize = option_sense ? 256 : 128;
Packit f00812
Packit f00812
	align		long_align = option_sense;
Packit f00812
	always-interactive	{
Packit f00812
			ACTION_M4_IFDEF( "M4""_YY_ALWAYS_INTERACTIVE", option_sense );
Packit f00812
            interactive = option_sense;
Packit f00812
			}
Packit f00812
	array		yytext_is_array = option_sense;
Packit f00812
    ansi-definitions ansi_func_defs = option_sense;
Packit f00812
    ansi-prototypes  ansi_func_protos = option_sense;
Packit f00812
	backup		backing_up_report = option_sense;
Packit f00812
	batch		interactive = ! option_sense;
Packit f00812
    bison-bridge     bison_bridge_lval = option_sense;
Packit f00812
    bison-locations  { if((bison_bridge_lloc = option_sense))
Packit f00812
                            bison_bridge_lval = true;
Packit f00812
                     }
Packit f00812
	"c++"		C_plus_plus = option_sense;
Packit f00812
	caseful|case-sensitive		sf_set_case_ins(!option_sense);
Packit f00812
	caseless|case-insensitive	sf_set_case_ins(option_sense);
Packit f00812
	debug		ddebug = option_sense;
Packit f00812
	default		spprdflt = ! option_sense;
Packit f00812
	ecs		useecs = option_sense;
Packit f00812
	fast		{
Packit f00812
			useecs = usemecs = false;
Packit f00812
			use_read = fullspd = true;
Packit f00812
			}
Packit f00812
	full		{
Packit f00812
			useecs = usemecs = false;
Packit f00812
			use_read = fulltbl = true;
Packit f00812
			}
Packit f00812
	input		ACTION_IFDEF("YY_NO_INPUT", ! option_sense);
Packit f00812
	interactive	interactive = option_sense;
Packit f00812
	lex-compat	lex_compat = option_sense;
Packit f00812
	posix-compat	posix_compat = option_sense;
Packit f00812
	line		gen_line_dirs = option_sense;
Packit f00812
	main		{
Packit f00812
			ACTION_M4_IFDEF( "M4""_YY_MAIN", option_sense);
Packit f00812
            /* Override yywrap */
Packit f00812
            if( option_sense == true )
Packit f00812
                do_yywrap = false;
Packit f00812
			}
Packit f00812
	meta-ecs	usemecs = option_sense;
Packit f00812
	never-interactive	{
Packit f00812
			ACTION_M4_IFDEF( "M4""_YY_NEVER_INTERACTIVE", option_sense );
Packit f00812
            interactive = !option_sense;
Packit f00812
			}
Packit f00812
	perf-report	performance_report += option_sense ? 1 : -1;
Packit f00812
	pointer		yytext_is_array = ! option_sense;
Packit f00812
	read		use_read = option_sense;
Packit f00812
    reentrant   reentrant = option_sense;
Packit f00812
	reject		reject_really_used = option_sense;
Packit f00812
	stack		ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense );
Packit f00812
	stdinit		do_stdinit = option_sense;
Packit f00812
	stdout		use_stdout = option_sense;
Packit f00812
    unistd      ACTION_IFDEF("YY_NO_UNISTD_H", ! option_sense);
Packit f00812
	unput		ACTION_M4_IFDEF("M4""_YY_NO_UNPUT", ! option_sense);
Packit f00812
	verbose		printstats = option_sense;
Packit f00812
	warn		nowarn = ! option_sense;
Packit f00812
	yylineno	do_yylineno = option_sense; ACTION_M4_IFDEF("M4""_YY_USE_LINENO", option_sense);
Packit f00812
	yymore		yymore_really_used = option_sense;
Packit f00812
	yywrap      do_yywrap = option_sense;
Packit f00812
Packit f00812
	yy_push_state	ACTION_M4_IFDEF("M4""_YY_NO_PUSH_STATE", ! option_sense);
Packit f00812
	yy_pop_state	ACTION_M4_IFDEF("M4""_YY_NO_POP_STATE", ! option_sense);
Packit f00812
	yy_top_state	ACTION_M4_IFDEF("M4""_YY_NO_TOP_STATE", ! option_sense);
Packit f00812
Packit f00812
	yy_scan_buffer	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BUFFER", ! option_sense);
Packit f00812
	yy_scan_bytes	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BYTES", ! option_sense);
Packit f00812
	yy_scan_string	ACTION_M4_IFDEF("M4""_YY_NO_SCAN_STRING", ! option_sense);
Packit f00812
Packit f00812
    yyalloc         ACTION_M4_IFDEF("M4""_YY_NO_FLEX_ALLOC", ! option_sense);
Packit f00812
    yyrealloc       ACTION_M4_IFDEF("M4""_YY_NO_FLEX_REALLOC", ! option_sense);
Packit f00812
    yyfree          ACTION_M4_IFDEF("M4""_YY_NO_FLEX_FREE", ! option_sense);
Packit f00812
Packit f00812
    yyget_debug     ACTION_M4_IFDEF("M4""_YY_NO_GET_DEBUG", ! option_sense);
Packit f00812
    yyset_debug     ACTION_M4_IFDEF("M4""_YY_NO_SET_DEBUG", ! option_sense);
Packit f00812
    yyget_extra     ACTION_M4_IFDEF("M4""_YY_NO_GET_EXTRA", ! option_sense);
Packit f00812
    yyset_extra     ACTION_M4_IFDEF("M4""_YY_NO_SET_EXTRA", ! option_sense);
Packit f00812
    yyget_leng      ACTION_M4_IFDEF("M4""_YY_NO_GET_LENG", ! option_sense);
Packit f00812
    yyget_text      ACTION_M4_IFDEF("M4""_YY_NO_GET_TEXT", ! option_sense);
Packit f00812
    yyget_lineno    ACTION_M4_IFDEF("M4""_YY_NO_GET_LINENO", ! option_sense);
Packit f00812
    yyset_lineno    ACTION_M4_IFDEF("M4""_YY_NO_SET_LINENO", ! option_sense);
Packit f00812
    yyget_in        ACTION_M4_IFDEF("M4""_YY_NO_GET_IN", ! option_sense);
Packit f00812
    yyset_in        ACTION_M4_IFDEF("M4""_YY_NO_SET_IN", ! option_sense);
Packit f00812
    yyget_out       ACTION_M4_IFDEF("M4""_YY_NO_GET_OUT", ! option_sense);
Packit f00812
    yyset_out       ACTION_M4_IFDEF("M4""_YY_NO_SET_OUT", ! option_sense);
Packit f00812
    yyget_lval      ACTION_M4_IFDEF("M4""_YY_NO_GET_LVAL", ! option_sense);
Packit f00812
    yyset_lval      ACTION_M4_IFDEF("M4""_YY_NO_SET_LVAL", ! option_sense);
Packit f00812
    yyget_lloc      ACTION_M4_IFDEF("M4""_YY_NO_GET_LLOC", ! option_sense);
Packit f00812
    yyset_lloc      ACTION_M4_IFDEF("M4""_YY_NO_SET_LLOC", ! option_sense);
Packit f00812
Packit f00812
	extra-type	return TOK_EXTRA_TYPE;
Packit f00812
	outfile		return TOK_OUTFILE;
Packit f00812
	prefix		return TOK_PREFIX;
Packit f00812
	yyclass		return TOK_YYCLASS;
Packit f00812
	header(-file)?      return TOK_HEADER_FILE;
Packit f00812
	tables-file         return TOK_TABLES_FILE;
Packit f00812
	tables-verify   {
Packit f00812
                    tablesverify = option_sense;
Packit f00812
                    if(!tablesext && option_sense)
Packit f00812
                        tablesext = true;
Packit f00812
                    }
Packit f00812
Packit f00812
Packit f00812
	\"[^"\n]*\"	{
Packit f00812
			if(yyleng-1 < MAXLINE)
Packit f00812
        		 {
Packit f00812
			strcpy( nmstr, yytext + 1 );
Packit f00812
			 }
Packit f00812
			else
Packit f00812
			 {
Packit f00812
			   synerr( _("Option line too long\n"));
Packit f00812
			   FLEX_EXIT(EXIT_FAILURE);
Packit f00812
			 }
Packit f00812
			nmstr[strlen( nmstr ) - 1] = '\0';
Packit f00812
			return NAME;
Packit f00812
			}
Packit f00812
Packit f00812
	(([a-mo-z]|n[a-np-z])[[:alpha:]\-+]*)|.	{
Packit f00812
			format_synerr( _( "unrecognized %%option: %s" ),
Packit f00812
				yytext );
Packit f00812
			BEGIN(RECOVER);
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
<RECOVER>.*{NL}		++linenum; BEGIN(INITIAL);
Packit f00812
Packit f00812
Packit f00812
<SECT2PROLOG>{
Packit f00812
	^"%{".*	++bracelevel; yyless( 2 );	/* eat only %{ */
Packit f00812
	^"%}".*	--bracelevel; yyless( 2 );	/* eat only %} */
Packit f00812
Packit f00812
	^{WS}.*	ACTION_ECHO;	/* indented code in prolog */
Packit f00812
Packit f00812
	^{NOT_WS}.*	{	/* non-indented code */
Packit f00812
			if ( bracelevel <= 0 )
Packit f00812
				{ /* not in %{ ... %} */
Packit f00812
				yyless( 0 );	/* put it all back */
Packit f00812
				yy_set_bol( 1 );
Packit f00812
				mark_prolog();
Packit f00812
				BEGIN(SECT2);
Packit f00812
				}
Packit f00812
			else
Packit f00812
				ACTION_ECHO;
Packit f00812
			}
Packit f00812
Packit f00812
	.		ACTION_ECHO;
Packit f00812
	{NL}	++linenum; ACTION_ECHO;
Packit f00812
Packit f00812
	<<EOF>>		{
Packit f00812
			mark_prolog();
Packit f00812
			sectnum = 0;
Packit f00812
			yyterminate(); /* to stop the parser */
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
<SECT2>{
Packit f00812
	^{OPTWS}{NL}	++linenum; /* allow blank lines in section 2 */
Packit f00812
Packit f00812
	^{OPTWS}"%{"	{
Packit f00812
			indented_code = false;
Packit f00812
			doing_codeblock = true;
Packit f00812
			bracelevel = 1;
Packit f00812
			BEGIN(PERCENT_BRACE_ACTION);
Packit f00812
			}
Packit f00812
Packit f00812
	^{OPTWS}"<"	    {
Packit f00812
                        /* Allow "<" to appear in (?x) patterns. */
Packit f00812
                        if (!sf_skip_ws())
Packit f00812
                            BEGIN(SC);
Packit f00812
                        return '<';
Packit f00812
                    }
Packit f00812
	^{OPTWS}"^"	return '^';
Packit f00812
	\"		BEGIN(QUOTE); return '"';
Packit f00812
	"{"/[[:digit:]]	{
Packit f00812
			BEGIN(NUM);
Packit f00812
			if ( lex_compat || posix_compat )
Packit f00812
				return BEGIN_REPEAT_POSIX;
Packit f00812
			else
Packit f00812
				return BEGIN_REPEAT_FLEX;
Packit f00812
			}
Packit f00812
	"$"/([[:blank:]]|{NL})	return '$';
Packit f00812
Packit f00812
	{WS}"%{"		{
Packit f00812
			bracelevel = 1;
Packit f00812
			BEGIN(PERCENT_BRACE_ACTION);
Packit f00812
Packit f00812
			if ( in_rule )
Packit f00812
				{
Packit f00812
				doing_rule_action = true;
Packit f00812
				in_rule = false;
Packit f00812
				return '\n';
Packit f00812
				}
Packit f00812
			}
Packit f00812
	{WS}"|".*{NL}	{
Packit f00812
                        if (sf_skip_ws()){
Packit f00812
                            /* We're in the middle of a (?x: ) pattern. */
Packit f00812
                            /* Push back everything starting at the "|" */
Packit f00812
                            int amt = (int) (strchr (yytext, '|') - yytext);
Packit f00812
                            yyless(amt);
Packit f00812
                        }
Packit f00812
                        else {
Packit f00812
                            continued_action = true;
Packit f00812
                            ++linenum;
Packit f00812
                            return '\n';
Packit f00812
                        }
Packit f00812
                    }
Packit f00812
Packit f00812
	^{WS}"/*"	{
Packit f00812
Packit f00812
                if (sf_skip_ws()){
Packit f00812
                    /* We're in the middle of a (?x: ) pattern. */
Packit f00812
                    yy_push_state(COMMENT_DISCARD);
Packit f00812
                }
Packit f00812
                else{
Packit f00812
                    yyless( yyleng - 2 );	/* put back '/', '*' */
Packit f00812
                    bracelevel = 0;
Packit f00812
                    continued_action = false;
Packit f00812
                    BEGIN(ACTION);
Packit f00812
                }
Packit f00812
			}
Packit f00812
Packit f00812
	^{WS}		/* allow indented rules */ ;
Packit f00812
Packit f00812
	{WS}		{
Packit f00812
            if (sf_skip_ws()){
Packit f00812
                /* We're in the middle of a (?x: ) pattern. */
Packit f00812
            }
Packit f00812
            else{
Packit f00812
                /* This rule is separate from the one below because
Packit f00812
                 * otherwise we get variable trailing context, so
Packit f00812
                 * we can't build the scanner using -{f,F}.
Packit f00812
                 */
Packit f00812
                bracelevel = 0;
Packit f00812
                continued_action = false;
Packit f00812
                BEGIN(ACTION);
Packit f00812
Packit f00812
                if ( in_rule )
Packit f00812
                    {
Packit f00812
                    doing_rule_action = true;
Packit f00812
                    in_rule = false;
Packit f00812
                    return '\n';
Packit f00812
                    }
Packit f00812
            }
Packit f00812
			}
Packit f00812
Packit f00812
	{OPTWS}{NL}	{
Packit f00812
            if (sf_skip_ws()){
Packit f00812
                /* We're in the middle of a (?x: ) pattern. */
Packit f00812
                ++linenum;
Packit f00812
            }
Packit f00812
            else{
Packit f00812
                bracelevel = 0;
Packit f00812
                continued_action = false;
Packit f00812
                BEGIN(ACTION);
Packit f00812
                unput( '\n' );	/* so <ACTION> sees it */
Packit f00812
Packit f00812
                if ( in_rule )
Packit f00812
                    {
Packit f00812
                    doing_rule_action = true;
Packit f00812
                    in_rule = false;
Packit f00812
                    return '\n';
Packit f00812
                    }
Packit f00812
            }
Packit f00812
			}
Packit f00812
Packit f00812
	^{OPTWS}"<<EOF>>"	|
Packit f00812
	"<<EOF>>"	return EOF_OP;
Packit f00812
Packit f00812
	^"%%".*		{
Packit f00812
			sectnum = 3;
Packit f00812
			BEGIN(SECT3);
Packit f00812
			outn("/* Begin user sect3 */");
Packit f00812
			yyterminate(); /* to stop the parser */
Packit f00812
			}
Packit f00812
Packit f00812
	"["({FIRST_CCL_CHAR}|{CCL_EXPR})({CCL_CHAR}|{CCL_EXPR})*	{
Packit f00812
			int cclval;
Packit f00812
Packit f00812
			if(yyleng < MAXLINE)
Packit f00812
        		 {
Packit f00812
			strcpy( nmstr, yytext );
Packit f00812
			 }
Packit f00812
			else
Packit f00812
			 {
Packit f00812
			   synerr( _("Input line too long\n"));
Packit f00812
			   FLEX_EXIT(EXIT_FAILURE);
Packit f00812
			 }
Packit f00812
Packit f00812
			/* Check to see if we've already encountered this
Packit f00812
			 * ccl.
Packit f00812
			 */
Packit f00812
			if (0 /* <--- This "0" effectively disables the reuse of a
Packit f00812
                   * character class (purely based on its source text).
Packit f00812
                   * The reason it was disabled is so yacc/bison can parse
Packit f00812
                   * ccl operations, such as ccl difference and union.
Packit f00812
                   */
Packit f00812
                &&  (cclval = ccllookup( nmstr )) != 0 )
Packit f00812
				{
Packit f00812
				if ( input() != ']' )
Packit f00812
					synerr( _( "bad character class" ) );
Packit f00812
Packit f00812
				yylval = cclval;
Packit f00812
				++cclreuse;
Packit f00812
				return PREVCCL;
Packit f00812
				}
Packit f00812
			else
Packit f00812
				{
Packit f00812
				/* We fudge a bit.  We know that this ccl will
Packit f00812
				 * soon be numbered as lastccl + 1 by cclinit.
Packit f00812
				 */
Packit f00812
				cclinstal( nmstr, lastccl + 1 );
Packit f00812
Packit f00812
				/* Push back everything but the leading bracket
Packit f00812
				 * so the ccl can be rescanned.
Packit f00812
				 */
Packit f00812
				yyless( 1 );
Packit f00812
Packit f00812
				BEGIN(FIRSTCCL);
Packit f00812
				return '[';
Packit f00812
				}
Packit f00812
			}
Packit f00812
    "{-}"       return CCL_OP_DIFF;
Packit f00812
    "{+}"       return CCL_OP_UNION;
Packit f00812
Packit f00812
Packit f00812
    /* Check for :space: at the end of the rule so we don't
Packit f00812
     * wrap the expanded regex in '(' ')' -- breaking trailing
Packit f00812
     * context.
Packit f00812
     */
Packit f00812
	"{"{NAME}"}"[[:space:]]?	 {
Packit f00812
			char *nmdefptr;
Packit f00812
            int end_is_ws, end_ch;
Packit f00812
Packit f00812
            end_ch = yytext[yyleng-1];
Packit f00812
            end_is_ws = end_ch != '}' ? 1 : 0;
Packit f00812
Packit f00812
 			if(yyleng-1 < MAXLINE)
Packit f00812
         		 {
Packit f00812
			strcpy( nmstr, yytext + 1 );
Packit f00812
 			 }
Packit f00812
 			else
Packit f00812
 			 {
Packit f00812
 			   synerr( _("Input line too long\n"));
Packit f00812
 			   FLEX_EXIT(EXIT_FAILURE);
Packit f00812
 			 }
Packit f00812
nmstr[yyleng - 2 - end_is_ws] = '\0';  /* chop trailing brace */
Packit f00812
Packit f00812
			if ( (nmdefptr = ndlookup( nmstr )) == 0 )
Packit f00812
				format_synerr(
Packit f00812
					_( "undefined definition {%s}" ),
Packit f00812
						nmstr );
Packit f00812
Packit f00812
			else
Packit f00812
				{ /* push back name surrounded by ()'s */
Packit f00812
				int len = strlen( nmdefptr );
Packit f00812
                if (end_is_ws)
Packit f00812
                    unput(end_ch);
Packit f00812
Packit f00812
				if ( lex_compat || nmdefptr[0] == '^' ||
Packit f00812
				     (len > 0 && nmdefptr[len - 1] == '$')
Packit f00812
                     || (end_is_ws && trlcontxt && !sf_skip_ws()))
Packit f00812
					{ /* don't use ()'s after all */
Packit f00812
					PUT_BACK_STRING(nmdefptr, 0);
Packit f00812
Packit f00812
					if ( nmdefptr[0] == '^' )
Packit f00812
						BEGIN(CARETISBOL);
Packit f00812
					}
Packit f00812
Packit f00812
				else
Packit f00812
					{
Packit f00812
					unput(')');
Packit f00812
					PUT_BACK_STRING(nmdefptr, 0);
Packit f00812
					unput('(');
Packit f00812
					}
Packit f00812
				}
Packit f00812
			}
Packit f00812
Packit f00812
    "/*"        {
Packit f00812
                    if (sf_skip_ws())
Packit f00812
                        yy_push_state(COMMENT_DISCARD);
Packit f00812
                    else{
Packit f00812
                        /* Push back the "*" and return "/" as usual. */
Packit f00812
                        yyless(1);
Packit f00812
                        return '/';
Packit f00812
                    }
Packit f00812
                }
Packit f00812
Packit f00812
    "(?#"       {
Packit f00812
                    if (lex_compat || posix_compat){
Packit f00812
                        /* Push back the "?#" and treat it like a normal parens. */
Packit f00812
                        yyless(1);
Packit f00812
                        sf_push(); 
Packit f00812
                        return '(';
Packit f00812
                    }
Packit f00812
                    else
Packit f00812
                        yy_push_state(EXTENDED_COMMENT);
Packit f00812
                }
Packit f00812
    "(?"        {
Packit f00812
                    sf_push();
Packit f00812
                    if (lex_compat || posix_compat)
Packit f00812
                        /* Push back the "?" and treat it like a normal parens. */
Packit f00812
                        yyless(1);
Packit f00812
                    else
Packit f00812
                        BEGIN(GROUP_WITH_PARAMS);
Packit f00812
                    return '(';
Packit f00812
                }
Packit f00812
    "("         sf_push(); return '(';
Packit f00812
    ")"         {
Packit f00812
                    if (_sf_top_ix > 0) {
Packit f00812
                        sf_pop();
Packit f00812
                        return ')';
Packit f00812
                    } else
Packit f00812
                        synerr(_("unbalanced parenthesis"));
Packit f00812
                }
Packit f00812
Packit f00812
	[/|*+?.(){}]	return (unsigned char) yytext[0];
Packit f00812
	.		RETURNCHAR;
Packit f00812
}
Packit f00812
Packit f00812
Packit f00812
<SC>{
Packit f00812
	{OPTWS}{NL}{OPTWS}	++linenum;	/* Allow blank lines & continuations */
Packit f00812
	[,*]		return (unsigned char) yytext[0];
Packit f00812
	">"		BEGIN(SECT2); return '>';
Packit f00812
	">"/^		BEGIN(CARETISBOL); return '>';
Packit f00812
	{SCNAME}	RETURNNAME;
Packit f00812
	.		{
Packit f00812
			format_synerr( _( "bad <start condition>: %s" ),
Packit f00812
				yytext );
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
<CARETISBOL>"^"		BEGIN(SECT2); return '^';
Packit f00812
Packit f00812
Packit f00812
<QUOTE>{
Packit f00812
	[^"\n]		RETURNCHAR;
Packit f00812
	\"		BEGIN(SECT2); return '"';
Packit f00812
Packit f00812
	{NL}		{
Packit f00812
			synerr( _( "missing quote" ) );
Packit f00812
			BEGIN(SECT2);
Packit f00812
			++linenum;
Packit f00812
			return '"';
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
<GROUP_WITH_PARAMS>{
Packit f00812
    ":"     BEGIN(SECT2);
Packit f00812
    "-"     BEGIN(GROUP_MINUS_PARAMS);
Packit f00812
    i       sf_set_case_ins(1);
Packit f00812
    s       sf_set_dot_all(1);
Packit f00812
    x       sf_set_skip_ws(1);
Packit f00812
}
Packit f00812
<GROUP_MINUS_PARAMS>{
Packit f00812
    ":"     BEGIN(SECT2);
Packit f00812
    i       sf_set_case_ins(0);
Packit f00812
    s       sf_set_dot_all(0);
Packit f00812
    x       sf_set_skip_ws(0);
Packit f00812
}
Packit f00812
Packit f00812
<FIRSTCCL>{
Packit f00812
	"^"/[^-\]\n]	BEGIN(CCL); return '^';
Packit f00812
	"^"/("-"|"]")	return '^';
Packit f00812
	.		BEGIN(CCL); RETURNCHAR;
Packit f00812
}
Packit f00812
Packit f00812
<CCL>{
Packit f00812
	-/[^\]\n]	return '-';
Packit f00812
	[^\]\n]		RETURNCHAR;
Packit f00812
	"]"		BEGIN(SECT2); return ']';
Packit f00812
	.|{NL}		{
Packit f00812
			synerr( _( "bad character class" ) );
Packit f00812
			BEGIN(SECT2);
Packit f00812
			return ']';
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
<FIRSTCCL,CCL>{
Packit f00812
	"[:alnum:]"	BEGIN(CCL); return CCE_ALNUM;
Packit f00812
	"[:alpha:]"	BEGIN(CCL); return CCE_ALPHA;
Packit f00812
	"[:blank:]"	BEGIN(CCL); return CCE_BLANK;
Packit f00812
	"[:cntrl:]"	BEGIN(CCL); return CCE_CNTRL;
Packit f00812
	"[:digit:]"	BEGIN(CCL); return CCE_DIGIT;
Packit f00812
	"[:graph:]"	BEGIN(CCL); return CCE_GRAPH;
Packit f00812
	"[:lower:]"	BEGIN(CCL); return CCE_LOWER;
Packit f00812
	"[:print:]"	BEGIN(CCL); return CCE_PRINT;
Packit f00812
	"[:punct:]"	BEGIN(CCL); return CCE_PUNCT;
Packit f00812
	"[:space:]"	BEGIN(CCL); return CCE_SPACE;
Packit f00812
	"[:upper:]"	BEGIN(CCL); return CCE_UPPER;
Packit f00812
	"[:xdigit:]"	BEGIN(CCL); return CCE_XDIGIT;
Packit f00812
Packit f00812
	"[:^alnum:]"	BEGIN(CCL); return CCE_NEG_ALNUM;
Packit f00812
	"[:^alpha:]"	BEGIN(CCL); return CCE_NEG_ALPHA;
Packit f00812
	"[:^blank:]"	BEGIN(CCL); return CCE_NEG_BLANK;
Packit f00812
	"[:^cntrl:]"	BEGIN(CCL); return CCE_NEG_CNTRL;
Packit f00812
	"[:^digit:]"	BEGIN(CCL); return CCE_NEG_DIGIT;
Packit f00812
	"[:^graph:]"	BEGIN(CCL); return CCE_NEG_GRAPH;
Packit f00812
	"[:^lower:]"	BEGIN(CCL); return CCE_NEG_LOWER;
Packit f00812
	"[:^print:]"	BEGIN(CCL); return CCE_NEG_PRINT;
Packit f00812
	"[:^punct:]"	BEGIN(CCL); return CCE_NEG_PUNCT;
Packit f00812
	"[:^space:]"	BEGIN(CCL); return CCE_NEG_SPACE;
Packit f00812
	"[:^upper:]"	BEGIN(CCL); return CCE_NEG_UPPER;
Packit f00812
	"[:^xdigit:]"	BEGIN(CCL); return CCE_NEG_XDIGIT;
Packit f00812
	{CCL_EXPR}	{
Packit f00812
			format_synerr(
Packit f00812
				_( "bad character class expression: %s" ),
Packit f00812
					yytext );
Packit f00812
			BEGIN(CCL); return CCE_ALNUM;
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
<NUM>{
Packit f00812
	[[:digit:]]+	{
Packit f00812
			yylval = myctoi( yytext );
Packit f00812
			return NUMBER;
Packit f00812
			}
Packit f00812
Packit f00812
	","		return ',';
Packit f00812
	"}"		{
Packit f00812
			BEGIN(SECT2);
Packit f00812
			if ( lex_compat || posix_compat )
Packit f00812
				return END_REPEAT_POSIX;
Packit f00812
			else
Packit f00812
				return END_REPEAT_FLEX;
Packit f00812
			}
Packit f00812
Packit f00812
	.		{
Packit f00812
			synerr( _( "bad character inside {}'s" ) );
Packit f00812
			BEGIN(SECT2);
Packit f00812
			return '}';
Packit f00812
			}
Packit f00812
Packit f00812
	{NL}		{
Packit f00812
			synerr( _( "missing }" ) );
Packit f00812
			BEGIN(SECT2);
Packit f00812
			++linenum;
Packit f00812
			return '}';
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
Packit f00812
<PERCENT_BRACE_ACTION>{
Packit f00812
	{OPTWS}"%}".*		bracelevel = 0;
Packit f00812
Packit f00812
	<ACTION>"/*"		ACTION_ECHO; yy_push_state( COMMENT );
Packit f00812
Packit f00812
	<CODEBLOCK,ACTION>{
Packit f00812
		"reject"	{
Packit f00812
			ACTION_ECHO;
Packit f00812
			CHECK_REJECT(yytext);
Packit f00812
			}
Packit f00812
		"yymore"	{
Packit f00812
			ACTION_ECHO;
Packit f00812
			CHECK_YYMORE(yytext);
Packit f00812
			}
Packit f00812
	}
Packit f00812
Packit f00812
    {M4QSTART}  ACTION_ECHO_QSTART;
Packit f00812
    {M4QEND}    ACTION_ECHO_QEND;
Packit f00812
    .           ACTION_ECHO;
Packit f00812
	{NL}		{
Packit f00812
			++linenum;
Packit f00812
			ACTION_ECHO;
Packit f00812
			if ( bracelevel == 0 ||
Packit f00812
			     (doing_codeblock && indented_code) )
Packit f00812
				{
Packit f00812
				if ( doing_rule_action )
Packit f00812
					add_action( "\tYY_BREAK\n" );
Packit f00812
Packit f00812
				doing_rule_action = doing_codeblock = false;
Packit f00812
				BEGIN(SECT2);
Packit f00812
				}
Packit f00812
			}
Packit f00812
}
Packit f00812
Packit f00812
Packit f00812
	/* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */
Packit f00812
<ACTION>{
Packit f00812
	"{"		ACTION_ECHO; ++bracelevel;
Packit f00812
	"}"		ACTION_ECHO; --bracelevel;
Packit f00812
    {M4QSTART}  ACTION_ECHO_QSTART;
Packit f00812
    {M4QEND}    ACTION_ECHO_QEND;
Packit f00812
	[^[:alpha:]_{}"'/\n\[\]]+	ACTION_ECHO;
Packit f00812
    [\[\]]      ACTION_ECHO;
Packit f00812
	{NAME}		ACTION_ECHO;
Packit f00812
	"'"([^'\\\n]|\\.)*"'"	ACTION_ECHO; /* character constant */
Packit f00812
	\"		ACTION_ECHO; BEGIN(ACTION_STRING);
Packit f00812
	{NL}		{
Packit f00812
			++linenum;
Packit f00812
			ACTION_ECHO;
Packit f00812
			if ( bracelevel == 0 )
Packit f00812
				{
Packit f00812
				if ( doing_rule_action )
Packit f00812
					add_action( "\tYY_BREAK\n" );
Packit f00812
Packit f00812
				doing_rule_action = false;
Packit f00812
				BEGIN(SECT2);
Packit f00812
				}
Packit f00812
			}
Packit f00812
	.		ACTION_ECHO;
Packit f00812
}
Packit f00812
Packit f00812
<ACTION_STRING>{
Packit f00812
	[^"\\\n]+	ACTION_ECHO;
Packit f00812
	\\.		ACTION_ECHO;
Packit f00812
	{NL}		++linenum; ACTION_ECHO; BEGIN(ACTION);
Packit f00812
	\"		ACTION_ECHO; BEGIN(ACTION);
Packit f00812
	.		ACTION_ECHO;
Packit f00812
}
Packit f00812
Packit f00812
<COMMENT,COMMENT_DISCARD,ACTION,ACTION_STRING><<EOF>>	{
Packit f00812
			synerr( _( "EOF encountered inside an action" ) );
Packit f00812
			yyterminate();
Packit f00812
			}
Packit f00812
Packit f00812
<EXTENDED_COMMENT,GROUP_WITH_PARAMS,GROUP_MINUS_PARAMS><<EOF>>	{
Packit f00812
			synerr( _( "EOF encountered inside pattern" ) );
Packit f00812
			yyterminate();
Packit f00812
			}
Packit f00812
Packit f00812
<SECT2,QUOTE,FIRSTCCL,CCL>{ESCSEQ}	{
Packit f00812
			yylval = myesc( (unsigned char *) yytext );
Packit f00812
Packit f00812
			if ( YY_START == FIRSTCCL )
Packit f00812
				BEGIN(CCL);
Packit f00812
Packit f00812
			return CHAR;
Packit f00812
			}
Packit f00812
Packit f00812
Packit f00812
<SECT3>{
Packit f00812
    {M4QSTART}  fwrite (escaped_qstart, 1, strlen(escaped_qstart), yyout);
Packit f00812
    {M4QEND}    fwrite (escaped_qend, 1, strlen(escaped_qend), yyout);
Packit f00812
	[^\[\]\n]*(\n?) ECHO;
Packit f00812
	(.|\n)      ECHO;
Packit f00812
	<<EOF>>		sectnum = 0; yyterminate();
Packit f00812
}
Packit f00812
Packit f00812
<*>.|\n			format_synerr( _( "bad character: %s" ), yytext );
Packit f00812
Packit f00812
%%
Packit f00812
Packit f00812
Packit f00812
int yywrap(void)
Packit f00812
	{
Packit f00812
	if ( --num_input_files > 0 )
Packit f00812
		{
Packit f00812
		set_input_file( *++input_files );
Packit f00812
		return 0;
Packit f00812
		}
Packit f00812
Packit f00812
	else
Packit f00812
		return 1;
Packit f00812
	}
Packit f00812
Packit f00812
Packit f00812
/* set_input_file - open the given file (if NULL, stdin) for scanning */
Packit f00812
Packit f00812
void set_input_file( char *file )
Packit f00812
	{
Packit f00812
	if ( file && strcmp( file, "-" ) )
Packit f00812
		{
Packit f00812
		infilename = xstrdup(file);
Packit f00812
		yyin = fopen( infilename, "r" );
Packit f00812
Packit f00812
		if ( yyin == NULL )
Packit f00812
			lerr( _( "can't open %s" ), file );
Packit f00812
		}
Packit f00812
Packit f00812
	else
Packit f00812
		{
Packit f00812
		yyin = stdin;
Packit f00812
		infilename = xstrdup("<stdin>");
Packit f00812
		}
Packit f00812
Packit f00812
	linenum = 1;
Packit f00812
	}