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