1 /************************************************************
2 Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
4 Permission to use, copy, modify, and distribute this
5 software and its documentation for any purpose and without
6 fee is hereby granted, provided that the above copyright
7 notice appear in all copies and that both that copyright
8 notice and this permission notice appear in supporting
9 documentation, and that the name of Silicon Graphics not be
10 used in advertising or publicity pertaining to distribution
11 of the software without specific prior written permission.
12 Silicon Graphics makes no representation about the suitability
13 of this software for any purpose. It is provided "as is"
14 without any express or implied warranty.
16 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23 THE USE OR PERFORMANCE OF THIS SOFTWARE.
25 ********************************************************/
30 #include "xkbcomp-priv.h"
31 #include "parseutils.h"
33 extern int yyparse(struct parser_param *param);
35 #define YY_USER_ACTION { \
36 yylloc->first_line = yylineno; \
37 yylloc->last_line = yylineno; \
40 #define APPEND_S(ch) do { \
41 if (yyextra->s - yyextra->scanBuf >= sizeof(yyextra->scanBuf) - 1) \
48 %option extra-type="struct scanner_extra *"
49 %option bison-bridge bison-locations
51 %option nounistd noyywrap noinput nounput
52 %option never-interactive
53 %option case-insensitive
62 \" yyextra->s = yyextra->scanBuf; BEGIN(S_STR);
63 \< yyextra->s = yyextra->scanBuf; BEGIN(S_KEY);
68 yylval->str = strdup(yyextra->scanBuf);
74 yylval->str = strdup(yyextra->scanBuf);
78 <S_STR,S_KEY>\\[0-7]{1,3} {
79 /* octal escape sequence */
82 (void) sscanf( yytext + 1, "%o", &result );
85 fprintf(stderr, "Illegal octal escape %s\n", yytext);
92 <S_STR,S_KEY>\\[0-9]+ {
93 fprintf(stderr, "Illegal octal escape %s\n", yytext);
97 <S_STR,S_KEY>\\n APPEND_S('\n');
98 <S_STR,S_KEY>\\t APPEND_S('\t');
99 <S_STR,S_KEY>\\r APPEND_S('\r');
100 <S_STR,S_KEY>\\b APPEND_S('\b');
101 <S_STR,S_KEY>\\f APPEND_S('\f');
102 <S_STR,S_KEY>\\v APPEND_S('\v');
103 <S_STR,S_KEY>\\e APPEND_S('\033');
105 <S_STR,S_KEY>. APPEND_S(yytext[0]);
107 xkb_keymap return XKB_KEYMAP;
108 xkb_keycodes return XKB_KEYCODES;
109 xkb_types return XKB_TYPES;
110 xkb_symbols return XKB_SYMBOLS;
111 xkb_compat return XKB_COMPATMAP;
112 xkb_compat_map return XKB_COMPATMAP;
113 xkb_compatibility return XKB_COMPATMAP;
114 xkb_compatibility_map return XKB_COMPATMAP;
115 xkb_geometry return XKB_GEOMETRY;
116 xkb_semantics return XKB_SEMANTICS;
117 xkb_layout return XKB_LAYOUT;
118 include return INCLUDE;
119 override return OVERRIDE;
120 augment return AUGMENT;
121 replace return REPLACE;
122 alternate return ALTERNATE;
123 partial return PARTIAL;
124 default return DEFAULT;
125 hidden return HIDDEN;
126 virtual_modifiers return VIRTUAL_MODS;
128 interpret return INTERPRET;
129 action return ACTION_TOK;
133 modmap return MODIFIER_MAP;
134 mod_map return MODIFIER_MAP;
135 modifier_map return MODIFIER_MAP;
136 indicator return INDICATOR;
140 section return SECTION;
141 overlay return OVERLAY;
143 outline return OUTLINE;
146 virtual return VIRTUAL;
147 alphanumeric_keys return ALPHANUMERIC_KEYS;
148 modifier_keys return MODIFIER_KEYS;
149 keypad_keys return KEYPAD_KEYS;
150 function_keys return FUNCTION_KEYS;
151 alternate_group return ALTERNATE_GROUP;
153 [a-zA-Z_][a-zA-Z_0-9]* yylval->str = strdup(yytext); return IDENT;
158 yylval->num = strtoul(yytext, &end, 0);
164 yylval->num = strtod(yytext, &end) * XkbGeomPtsPerMM;
188 <<EOF>> return END_OF_FILE;
195 yyerror(struct YYLTYPE *loc, void *scanner, const char *msg)
197 struct scanner_extra *extra = yyget_extra(scanner);
199 if (warningLevel > 0) {
200 fprintf(stderr, "%s: line %d of %s\n", msg, loc->first_line,
201 extra->scanFile ? extra->scanFile : "(unknown)");
202 if (warningLevel > 3)
203 fprintf(stderr, "last scanned symbol is: %s\n", extra->scanBuf);
208 XKBParseString(struct xkb_ctx *ctx, const char *string,
209 const char *file_name, XkbFile **out)
212 struct parser_param param;
213 struct scanner_extra extra;
214 YY_BUFFER_STATE state;
221 memset(&extra, 0, sizeof(extra));
222 ret = yylex_init_extra(&extra, ¶m.scanner);
226 extra.scanFile = strdup(file_name);
230 state = yy_scan_string(string, param.scanner);
231 ret = yyparse(¶m);
232 yy_delete_buffer(state, param.scanner);
233 yylex_destroy(param.scanner);
234 free(extra.scanFile);
238 CheckDefaultMap(param.rtrn, file_name);
244 XKBParseFile(struct xkb_ctx *ctx, FILE *file,
245 const char *file_name, XkbFile **out)
248 struct parser_param param;
249 struct scanner_extra extra;
256 memset(&extra, 0, sizeof(extra));
257 ret = yylex_init_extra(&extra, ¶m.scanner);
261 extra.scanFile = strdup(file_name);
265 yyset_in(file, param.scanner);
266 ret = yyparse(¶m);
267 yylex_destroy(param.scanner);
268 free(extra.scanFile);
272 CheckDefaultMap(param.rtrn, file_name);