1ae771770SStanislav Sedov %{
2ae771770SStanislav Sedov /*
3ae771770SStanislav Sedov * Copyright (c) 2004, 2008 Kungliga Tekniska Högskolan
4ae771770SStanislav Sedov * (Royal Institute of Technology, Stockholm, Sweden).
5ae771770SStanislav Sedov * All rights reserved.
6ae771770SStanislav Sedov *
7ae771770SStanislav Sedov * Redistribution and use in source and binary forms, with or without
8ae771770SStanislav Sedov * modification, are permitted provided that the following conditions
9ae771770SStanislav Sedov * are met:
10ae771770SStanislav Sedov *
11ae771770SStanislav Sedov * 1. Redistributions of source code must retain the above copyright
12ae771770SStanislav Sedov * notice, this list of conditions and the following disclaimer.
13ae771770SStanislav Sedov *
14ae771770SStanislav Sedov * 2. Redistributions in binary form must reproduce the above copyright
15ae771770SStanislav Sedov * notice, this list of conditions and the following disclaimer in the
16ae771770SStanislav Sedov * documentation and/or other materials provided with the distribution.
17ae771770SStanislav Sedov *
18ae771770SStanislav Sedov * 3. Neither the name of the Institute nor the names of its contributors
19ae771770SStanislav Sedov * may be used to endorse or promote products derived from this software
20ae771770SStanislav Sedov * without specific prior written permission.
21ae771770SStanislav Sedov *
22ae771770SStanislav Sedov * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
23ae771770SStanislav Sedov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24ae771770SStanislav Sedov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25ae771770SStanislav Sedov * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
26ae771770SStanislav Sedov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27ae771770SStanislav Sedov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28ae771770SStanislav Sedov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29ae771770SStanislav Sedov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30ae771770SStanislav Sedov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31ae771770SStanislav Sedov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32ae771770SStanislav Sedov * SUCH DAMAGE.
33ae771770SStanislav Sedov */
34ae771770SStanislav Sedov
35ae771770SStanislav Sedov /* $Id$ */
36ae771770SStanislav Sedov
37ae771770SStanislav Sedov #ifdef HAVE_CONFIG_H
38ae771770SStanislav Sedov #include <config.h>
39ae771770SStanislav Sedov #endif
40ae771770SStanislav Sedov
41ae771770SStanislav Sedov #undef ECHO
42ae771770SStanislav Sedov
43ae771770SStanislav Sedov #include <stdio.h>
44ae771770SStanislav Sedov #include <string.h>
45ae771770SStanislav Sedov #include <stdarg.h>
46ae771770SStanislav Sedov #include <stdlib.h>
47ae771770SStanislav Sedov #include "sel.h"
48ae771770SStanislav Sedov #include "sel-gram.h"
49ae771770SStanislav Sedov unsigned lineno = 1;
50ae771770SStanislav Sedov
51ae771770SStanislav Sedov static char * handle_string(void);
52ae771770SStanislav Sedov static int lex_input(char *, int);
53*cf771f22SStanislav Sedov static int lex_classic_input(void);
54ae771770SStanislav Sedov
55ae771770SStanislav Sedov struct hx_expr_input _hx509_expr_input;
56ae771770SStanislav Sedov
57ae771770SStanislav Sedov #ifndef YY_NULL
58ae771770SStanislav Sedov #define YY_NULL 0
59ae771770SStanislav Sedov #endif
60ae771770SStanislav Sedov
61ae771770SStanislav Sedov #define YY_NO_UNPUT 1
62ae771770SStanislav Sedov
63ae771770SStanislav Sedov #undef YY_INPUT
64ae771770SStanislav Sedov #define YY_INPUT(buf,res,maxsize) (res = lex_input(buf, maxsize))
65ae771770SStanislav Sedov
66ae771770SStanislav Sedov #undef ECHO
67ae771770SStanislav Sedov
68ae771770SStanislav Sedov %}
69ae771770SStanislav Sedov %%
70ae771770SStanislav Sedov
71ae771770SStanislav Sedov TRUE { return kw_TRUE; }
72ae771770SStanislav Sedov FALSE { return kw_FALSE; }
73ae771770SStanislav Sedov AND { return kw_AND; }
74ae771770SStanislav Sedov OR { return kw_OR; }
75ae771770SStanislav Sedov IN { return kw_IN; }
76ae771770SStanislav Sedov TAILMATCH { return kw_TAILMATCH; }
77ae771770SStanislav Sedov
78ae771770SStanislav Sedov [A-Za-z][-A-Za-z0-9_]* {
79ae771770SStanislav Sedov yylval.string = strdup ((const char *)yytext);
80ae771770SStanislav Sedov return IDENTIFIER;
81ae771770SStanislav Sedov }
82ae771770SStanislav Sedov "\"" { yylval.string = handle_string(); return STRING; }
83ae771770SStanislav Sedov \n { ++lineno; }
84ae771770SStanislav Sedov [,.!={}()%] { return *yytext; }
85ae771770SStanislav Sedov [ \t] ;
86ae771770SStanislav Sedov %%
87ae771770SStanislav Sedov
88ae771770SStanislav Sedov static char *
89ae771770SStanislav Sedov handle_string(void)
90ae771770SStanislav Sedov {
91ae771770SStanislav Sedov char x[1024];
92ae771770SStanislav Sedov int i = 0;
93ae771770SStanislav Sedov int c;
94ae771770SStanislav Sedov int quote = 0;
95ae771770SStanislav Sedov while((c = input()) != EOF){
96ae771770SStanislav Sedov if(quote) {
97ae771770SStanislav Sedov x[i++] = '\\';
98ae771770SStanislav Sedov x[i++] = c;
99ae771770SStanislav Sedov quote = 0;
100ae771770SStanislav Sedov continue;
101ae771770SStanislav Sedov }
102ae771770SStanislav Sedov if(c == '\n'){
103ae771770SStanislav Sedov _hx509_sel_yyerror("unterminated string");
104ae771770SStanislav Sedov lineno++;
105ae771770SStanislav Sedov break;
106ae771770SStanislav Sedov }
107ae771770SStanislav Sedov if(c == '\\'){
108ae771770SStanislav Sedov quote++;
109ae771770SStanislav Sedov continue;
110ae771770SStanislav Sedov }
111ae771770SStanislav Sedov if(c == '\"')
112ae771770SStanislav Sedov break;
113ae771770SStanislav Sedov x[i++] = c;
114ae771770SStanislav Sedov }
115ae771770SStanislav Sedov x[i] = '\0';
116ae771770SStanislav Sedov return strdup(x);
117ae771770SStanislav Sedov }
118ae771770SStanislav Sedov
119ae771770SStanislav Sedov int
yywrap()120ae771770SStanislav Sedov yywrap ()
121ae771770SStanislav Sedov {
122ae771770SStanislav Sedov return 1;
123ae771770SStanislav Sedov }
124ae771770SStanislav Sedov
125ae771770SStanislav Sedov static int
lex_input(char * buf,int max_size)126ae771770SStanislav Sedov lex_input(char *buf, int max_size)
127ae771770SStanislav Sedov {
128ae771770SStanislav Sedov int n;
129ae771770SStanislav Sedov
130ae771770SStanislav Sedov n = _hx509_expr_input.length - _hx509_expr_input.offset;
131ae771770SStanislav Sedov if (max_size < n)
132ae771770SStanislav Sedov n = max_size;
133ae771770SStanislav Sedov if (n <= 0)
134ae771770SStanislav Sedov return YY_NULL;
135ae771770SStanislav Sedov
136ae771770SStanislav Sedov memcpy(buf, _hx509_expr_input.buf + _hx509_expr_input.offset, n);
137ae771770SStanislav Sedov _hx509_expr_input.offset += n;
138ae771770SStanislav Sedov
139ae771770SStanislav Sedov return n;
140ae771770SStanislav Sedov }
141