%{ /* * Boa, an http server * Copyright (C) 1995 Paul Phillips * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 1, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /* $Id: boa_lexer.l,v 1.13.2.1 2002/07/07 23:19:55 jnelson Exp $*/ #include "y.tab.h" #include #include #include "parse.h" #define MAX_STR_CONST 1024 #define qspush(c) \ if (string_buf_ptr < string_buf+MAX_STR_CONST) \ *string_buf_ptr++ = c; \ else \ yyerror("quoted string overflow"); char *mime_types = NULL; static int file = 0; int lineno = 1; struct ccommand *k; char string_buf[MAX_STR_CONST]; char *string_buf_ptr; %} %s MIME /* Quoted string handling (almost) straight out of the flex 2.5 man page, April 1995 */ %x STR %% [ \t]+ ; #.* ; [^ \t\n]+\/[^ \t\n]+ { yylval.sval = yytext; return MIMETYPE; } [^ \"\t\n]+ { /* XXX could use better checks that we are in a state to * accept keywords; this version matches original behavior */ if ((YYSTATE==INITIAL) && (k=lookup_keyword(yytext))) { yylval.cval=k; return (k->type); } else { yylval.sval = yytext; return STRING; } } \" { string_buf_ptr = string_buf; BEGIN(STR); } { \" { /* saw closing quote - all done */ BEGIN(INITIAL); *string_buf_ptr = '\0'; /* return string constant token type and value to parser */ yylval.sval = string_buf; return STRING; } \n { /* error - unterminated string constant */ /* generate error message */ yyerror("unterminated string constant"); } \\[0-7]{1,3} { /* octal escape sequence */ int result; (void) sscanf( yytext + 1, "%o", &result ); if ( result > 0xff ) { /* error, constant is out-of-bounds */ } qspush(result); } \\[0-9]+ { /* generate error - bad escape sequence; something * like '\48' or '\0777777' */ yyerror("bad escape sequence"); } \\n qspush('\n'); \\t qspush('\t'); \\r qspush('\r'); \\b qspush('\b'); \\f qspush('\f'); \\(.|\n) *string_buf_ptr++ = yytext[1]; [^\\\n\"]+ { char *yptr = yytext; while ( *yptr ) qspush(*yptr++); } } /* End of dependence */ \n { lineno++; } %% /* In yywrap we track which file we are on. * 1: close boa.conf, open mime.types * 2: return 1; */ int yywrap() { fclose(yyin); file++; switch(file) { case 1: yyin = fopen(mime_types, "r"); if(!yyin) { fprintf(stderr, "Could not open mime.types file, \"%s\", " "for reading\n", mime_types); exit(1); } BEGIN MIME; return 0; default: BEGIN INITIAL; file = 0; /* in case we reread config files */ return 1; } } int yyerror(char * msg) { fprintf(stderr, "Error on line %d of %s: %s\n", lineno, (file == 0 ? "boa.conf" : "mime.types"), msg); return 1; }