sel-lex.l revision 234027
1210284Sjmallett%{ 2215990Sjmallett/* 3215990Sjmallett * Copyright (c) 2004, 2008 Kungliga Tekniska H��gskolan 4210284Sjmallett * (Royal Institute of Technology, Stockholm, Sweden). 5210284Sjmallett * All rights reserved. 6215990Sjmallett * 7215990Sjmallett * Redistribution and use in source and binary forms, with or without 8215990Sjmallett * modification, are permitted provided that the following conditions 9210284Sjmallett * are met: 10215990Sjmallett * 11215990Sjmallett * 1. Redistributions of source code must retain the above copyright 12210284Sjmallett * notice, this list of conditions and the following disclaimer. 13215990Sjmallett * 14215990Sjmallett * 2. Redistributions in binary form must reproduce the above copyright 15215990Sjmallett * notice, this list of conditions and the following disclaimer in the 16215990Sjmallett * documentation and/or other materials provided with the distribution. 17215990Sjmallett * 18215990Sjmallett * 3. Neither the name of the Institute nor the names of its contributors 19215990Sjmallett * may be used to endorse or promote products derived from this software 20215990Sjmallett * without specific prior written permission. 21215990Sjmallett * 22215990Sjmallett * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 23215990Sjmallett * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24215990Sjmallett * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25215990Sjmallett * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 26215990Sjmallett * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27215990Sjmallett * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28215990Sjmallett * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29215990Sjmallett * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30215990Sjmallett * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31215990Sjmallett * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32215990Sjmallett * SUCH DAMAGE. 33215990Sjmallett */ 34215990Sjmallett 35215990Sjmallett/* $Id$ */ 36215990Sjmallett 37215990Sjmallett#ifdef HAVE_CONFIG_H 38210284Sjmallett#include <config.h> 39210284Sjmallett#endif 40210284Sjmallett 41210284Sjmallett#undef ECHO 42210284Sjmallett 43210284Sjmallett#include <stdio.h> 44210284Sjmallett#include <string.h> 45215990Sjmallett#include <stdarg.h> 46210284Sjmallett#include <stdlib.h> 47210284Sjmallett#include "sel.h" 48210284Sjmallett#include "sel-gram.h" 49210284Sjmallettunsigned lineno = 1; 50210284Sjmallett 51215990Sjmallettstatic char * handle_string(void); 52210284Sjmallettstatic int lex_input(char *, int); 53210284Sjmallettstatic int lex_classic_input(void); 54210284Sjmallett 55215990Sjmallettstruct hx_expr_input _hx509_expr_input; 56215990Sjmallett 57215990Sjmallett#ifndef YY_NULL 58215990Sjmallett#define YY_NULL 0 59215990Sjmallett#endif 60210284Sjmallett 61210284Sjmallett#define YY_NO_UNPUT 1 62210284Sjmallett 63215990Sjmallett#undef YY_INPUT 64210284Sjmallett#define YY_INPUT(buf,res,maxsize) (res = lex_input(buf, maxsize)) 65210284Sjmallett 66210284Sjmallett#undef ECHO 67210284Sjmallett 68210284Sjmallett%} 69210284Sjmallett%% 70210284Sjmallett 71210284SjmallettTRUE { return kw_TRUE; } 72210284SjmallettFALSE { return kw_FALSE; } 73210284SjmallettAND { return kw_AND; } 74210284SjmallettOR { return kw_OR; } 75215990SjmallettIN { return kw_IN; } 76215990SjmallettTAILMATCH { return kw_TAILMATCH; } 77210284Sjmallett 78210284Sjmallett[A-Za-z][-A-Za-z0-9_]* { 79210284Sjmallett yylval.string = strdup ((const char *)yytext); 80210284Sjmallett return IDENTIFIER; 81210284Sjmallett } 82210284Sjmallett"\"" { yylval.string = handle_string(); return STRING; } 83215990Sjmallett\n { ++lineno; } 84210284Sjmallett[,.!={}()%] { return *yytext; } 85210284Sjmallett[ \t] ; 86210284Sjmallett%% 87210284Sjmallett 88210284Sjmallettstatic char * 89210284Sjmalletthandle_string(void) 90210284Sjmallett{ 91210284Sjmallett char x[1024]; 92210284Sjmallett int i = 0; 93210284Sjmallett int c; 94210284Sjmallett int quote = 0; 95210284Sjmallett while((c = input()) != EOF){ 96210284Sjmallett if(quote) { 97210284Sjmallett x[i++] = '\\'; 98210284Sjmallett x[i++] = c; 99210284Sjmallett quote = 0; 100210284Sjmallett continue; 101210284Sjmallett } 102210284Sjmallett if(c == '\n'){ 103210284Sjmallett _hx509_sel_yyerror("unterminated string"); 104210284Sjmallett lineno++; 105210284Sjmallett break; 106210284Sjmallett } 107210284Sjmallett if(c == '\\'){ 108210284Sjmallett quote++; 109210284Sjmallett continue; 110210284Sjmallett } 111210284Sjmallett if(c == '\"') 112210284Sjmallett break; 113210284Sjmallett x[i++] = c; 114210284Sjmallett } 115210284Sjmallett x[i] = '\0'; 116210284Sjmallett return strdup(x); 117210284Sjmallett} 118210284Sjmallett 119210284Sjmallettint 120210284Sjmallettyywrap () 121210284Sjmallett{ 122210284Sjmallett return 1; 123210284Sjmallett} 124210284Sjmallett 125210284Sjmallettstatic int 126210284Sjmallettlex_input(char *buf, int max_size) 127210284Sjmallett{ 128210284Sjmallett int n; 129210284Sjmallett 130210284Sjmallett n = _hx509_expr_input.length - _hx509_expr_input.offset; 131210284Sjmallett if (max_size < n) 132210284Sjmallett n = max_size; 133210284Sjmallett if (n <= 0) 134210284Sjmallett return YY_NULL; 135210284Sjmallett 136210284Sjmallett memcpy(buf, _hx509_expr_input.buf + _hx509_expr_input.offset, n); 137210284Sjmallett _hx509_expr_input.offset += n; 138210284Sjmallett 139210284Sjmallett return n; 140210284Sjmallett} 141210284Sjmallett