xref: /freebsd/crypto/heimdal/lib/hx509/sel-lex.l (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
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