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