xref: /freebsd/crypto/heimdal/lib/sl/slc-lex.l (revision cfe30d02adda7c3b5c76156ac52d50d8cab325d9)
1c19800e8SDoug Rabson %{
2c19800e8SDoug Rabson /*
3*ae771770SStanislav Sedov  * Copyright (c) 2004 Kungliga Tekniska Högskolan
4c19800e8SDoug Rabson  * (Royal Institute of Technology, Stockholm, Sweden).
5c19800e8SDoug Rabson  * All rights reserved.
6c19800e8SDoug Rabson  *
7c19800e8SDoug Rabson  * Redistribution and use in source and binary forms, with or without
8c19800e8SDoug Rabson  * modification, are permitted provided that the following conditions
9c19800e8SDoug Rabson  * are met:
10c19800e8SDoug Rabson  *
11c19800e8SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
12c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
13c19800e8SDoug Rabson  *
14c19800e8SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
15c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
16c19800e8SDoug Rabson  *    documentation and/or other materials provided with the distribution.
17c19800e8SDoug Rabson  *
18c19800e8SDoug Rabson  * 3. Neither the name of the Institute nor the names of its contributors
19c19800e8SDoug Rabson  *    may be used to endorse or promote products derived from this software
20c19800e8SDoug Rabson  *    without specific prior written permission.
21c19800e8SDoug Rabson  *
22c19800e8SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
23c19800e8SDoug Rabson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24c19800e8SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25c19800e8SDoug Rabson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
26c19800e8SDoug Rabson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27c19800e8SDoug Rabson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28c19800e8SDoug Rabson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29c19800e8SDoug Rabson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30c19800e8SDoug Rabson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31c19800e8SDoug Rabson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32c19800e8SDoug Rabson  * SUCH DAMAGE.
33c19800e8SDoug Rabson  */
34c19800e8SDoug Rabson 
35*ae771770SStanislav Sedov /* $Id$ */
36c19800e8SDoug Rabson 
37c19800e8SDoug Rabson #undef ECHO
38c19800e8SDoug Rabson 
39c19800e8SDoug Rabson #include <stdio.h>
40c19800e8SDoug Rabson #include <string.h>
41c19800e8SDoug Rabson #include <stdarg.h>
42c19800e8SDoug Rabson #include <stdlib.h>
43c19800e8SDoug Rabson #include "slc.h"
44c19800e8SDoug Rabson #include "slc-gram.h"
45c19800e8SDoug Rabson unsigned lineno = 1;
46c19800e8SDoug Rabson 
47c19800e8SDoug Rabson static void handle_comment(void);
48c19800e8SDoug Rabson static char * handle_string(void);
49c19800e8SDoug Rabson 
50c19800e8SDoug Rabson #undef ECHO
51c19800e8SDoug Rabson 
52c19800e8SDoug Rabson %}
53*ae771770SStanislav Sedov 
54*ae771770SStanislav Sedov %option nounput
55*ae771770SStanislav Sedov 
56c19800e8SDoug Rabson %%
57c19800e8SDoug Rabson [A-Za-z][-A-Za-z0-9_]*	{
58c19800e8SDoug Rabson 			  yylval.string = strdup ((const char *)yytext);
59c19800e8SDoug Rabson 			  return LITERAL;
60c19800e8SDoug Rabson 			}
61c19800e8SDoug Rabson "\""			{ yylval.string = handle_string(); return STRING; }
62c19800e8SDoug Rabson \n			{ ++lineno; }
63c19800e8SDoug Rabson \/\*			{ handle_comment(); }
64c19800e8SDoug Rabson [={}]			{ return *yytext; }
65c19800e8SDoug Rabson [ \t]			;
66c19800e8SDoug Rabson %%
67c19800e8SDoug Rabson 
68c19800e8SDoug Rabson void
69c19800e8SDoug Rabson error_message (const char *format, ...)
70c19800e8SDoug Rabson {
71c19800e8SDoug Rabson      va_list args;
72c19800e8SDoug Rabson 
73c19800e8SDoug Rabson      va_start (args, format);
74c19800e8SDoug Rabson      fprintf (stderr, "%s:%d: ", filename, lineno);
75c19800e8SDoug Rabson      vfprintf (stderr, format, args);
76c19800e8SDoug Rabson      va_end (args);
77c19800e8SDoug Rabson      error_flag++;
78c19800e8SDoug Rabson }
79c19800e8SDoug Rabson 
80c19800e8SDoug Rabson void
yyerror(char * s)81c19800e8SDoug Rabson yyerror (char *s)
82c19800e8SDoug Rabson {
83c19800e8SDoug Rabson     error_message("%s\n", s);
84c19800e8SDoug Rabson }
85c19800e8SDoug Rabson 
86c19800e8SDoug Rabson static void
handle_comment(void)87c19800e8SDoug Rabson handle_comment(void)
88c19800e8SDoug Rabson {
89c19800e8SDoug Rabson     int c;
90c19800e8SDoug Rabson     int start_lineno = lineno;
91c19800e8SDoug Rabson     int level = 1;
92c19800e8SDoug Rabson     int seen_star = 0;
93c19800e8SDoug Rabson     int seen_slash = 0;
94c19800e8SDoug Rabson     while((c = input()) != EOF) {
95c19800e8SDoug Rabson 	if(c == '/') {
96c19800e8SDoug Rabson 	    if(seen_star) {
97c19800e8SDoug Rabson 		if(--level == 0)
98c19800e8SDoug Rabson 		    return;
99c19800e8SDoug Rabson 		seen_star = 0;
100c19800e8SDoug Rabson 		continue;
101c19800e8SDoug Rabson 	    }
102c19800e8SDoug Rabson 	    seen_slash = 1;
103c19800e8SDoug Rabson 	    continue;
104*ae771770SStanislav Sedov 	} else if(c == '*') {
105c19800e8SDoug Rabson 	    if(seen_slash) {
106c19800e8SDoug Rabson 		level++;
107c19800e8SDoug Rabson 		seen_star = seen_slash = 0;
108c19800e8SDoug Rabson 		continue;
109c19800e8SDoug Rabson 	    }
110c19800e8SDoug Rabson 	    seen_star = 1;
111c19800e8SDoug Rabson 	    continue;
112c19800e8SDoug Rabson 	}
113c19800e8SDoug Rabson 	seen_star = seen_slash = 0;
114c19800e8SDoug Rabson 	if(c == '\n') {
115c19800e8SDoug Rabson 	    lineno++;
116c19800e8SDoug Rabson 	    continue;
117c19800e8SDoug Rabson 	}
118c19800e8SDoug Rabson     }
119c19800e8SDoug Rabson     if(c == EOF)
120c19800e8SDoug Rabson 	error_message("unterminated comment, possibly started on line %d\n", start_lineno);
121c19800e8SDoug Rabson }
122c19800e8SDoug Rabson 
123c19800e8SDoug Rabson static char *
handle_string(void)124c19800e8SDoug Rabson handle_string(void)
125c19800e8SDoug Rabson {
126c19800e8SDoug Rabson     char x[1024];
127c19800e8SDoug Rabson     int i = 0;
128c19800e8SDoug Rabson     int c;
129c19800e8SDoug Rabson     int quote = 0;
130c19800e8SDoug Rabson     while((c = input()) != EOF){
131c19800e8SDoug Rabson 	if(quote) {
132c19800e8SDoug Rabson 	    x[i++] = '\\';
133c19800e8SDoug Rabson 	    x[i++] = c;
134c19800e8SDoug Rabson 	    quote = 0;
135c19800e8SDoug Rabson 	    continue;
136c19800e8SDoug Rabson 	}
137c19800e8SDoug Rabson 	if(c == '\n'){
138c19800e8SDoug Rabson 	    error_message("unterminated string");
139c19800e8SDoug Rabson 	    lineno++;
140c19800e8SDoug Rabson 	    break;
141c19800e8SDoug Rabson 	}
142c19800e8SDoug Rabson 	if(c == '\\'){
143c19800e8SDoug Rabson 	    quote++;
144c19800e8SDoug Rabson 	    continue;
145c19800e8SDoug Rabson 	}
146c19800e8SDoug Rabson 	if(c == '\"')
147c19800e8SDoug Rabson 	    break;
148c19800e8SDoug Rabson 	x[i++] = c;
149c19800e8SDoug Rabson     }
150c19800e8SDoug Rabson     x[i] = '\0';
151c19800e8SDoug Rabson     return strdup(x);
152c19800e8SDoug Rabson }
153c19800e8SDoug Rabson 
154c19800e8SDoug Rabson int
yywrap()155c19800e8SDoug Rabson yywrap ()
156c19800e8SDoug Rabson {
157c19800e8SDoug Rabson      return 1;
158c19800e8SDoug Rabson }
159