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 ********************************************************/
28 #include "xkbcomp-priv.h"
29 #include "parser-priv.h"
31 #pragma GCC diagnostic ignored "-Wmissing-noreturn"
33 struct scanner_extra {
34 struct xkb_context *ctx;
41 scanner_error_extra(struct YYLTYPE *loc, struct scanner_extra *extra,
44 #define YY_USER_ACTION { \
45 yylloc->first_line = yylineno; \
46 yylloc->last_line = yylineno; \
49 #define APPEND_S(ch) do { \
50 if (yyextra->s - yyextra->scanBuf >= sizeof(yyextra->scanBuf) - 1) \
57 %option extra-type="struct scanner_extra *"
58 %option bison-bridge bison-locations
60 %option nounistd noyywrap noinput nounput
61 %option never-interactive
62 %option case-insensitive
71 \" yyextra->s = yyextra->scanBuf; BEGIN(S_STR);
72 \< yyextra->s = yyextra->scanBuf; BEGIN(S_KEY);
77 yylval->str = strdup(yyextra->scanBuf);
84 if (yyextra->s - yyextra->scanBuf > XkbKeyNameLength) {
85 scanner_error_extra(yylloc, yyextra,
90 strncpy(yylval->keyName, yyextra->scanBuf, XkbKeyNameLength);
94 <S_STR,S_KEY>\\[0-7]{1,3} {
95 /* octal escape sequence */
98 (void) sscanf( yytext + 1, "%o", &result );
101 scanner_error_extra(yylloc, yyextra,
102 "Illegal octal escape");
109 <S_STR,S_KEY>\\[0-9]+ {
110 scanner_error_extra(yylloc, yyextra,
111 "Illegal octal escape");
115 <S_STR,S_KEY>\\n APPEND_S('\n');
116 <S_STR,S_KEY>\\t APPEND_S('\t');
117 <S_STR,S_KEY>\\r APPEND_S('\r');
118 <S_STR,S_KEY>\\b APPEND_S('\b');
119 <S_STR,S_KEY>\\f APPEND_S('\f');
120 <S_STR,S_KEY>\\v APPEND_S('\v');
121 <S_STR,S_KEY>\\e APPEND_S('\033');
123 <S_STR,S_KEY>. APPEND_S(yytext[0]);
125 xkb_keymap return XKB_KEYMAP;
126 xkb_keycodes return XKB_KEYCODES;
127 xkb_types return XKB_TYPES;
128 xkb_symbols return XKB_SYMBOLS;
129 xkb_compat return XKB_COMPATMAP;
130 xkb_compat_map return XKB_COMPATMAP;
131 xkb_compatibility return XKB_COMPATMAP;
132 xkb_compatibility_map return XKB_COMPATMAP;
133 xkb_geometry return XKB_GEOMETRY;
134 xkb_semantics return XKB_SEMANTICS;
135 xkb_layout return XKB_LAYOUT;
136 include return INCLUDE;
137 override return OVERRIDE;
138 augment return AUGMENT;
139 replace return REPLACE;
140 alternate return ALTERNATE;
141 partial return PARTIAL;
142 default return DEFAULT;
143 hidden return HIDDEN;
144 virtual_modifiers return VIRTUAL_MODS;
146 interpret return INTERPRET;
147 action return ACTION_TOK;
151 modmap return MODIFIER_MAP;
152 mod_map return MODIFIER_MAP;
153 modifier_map return MODIFIER_MAP;
154 indicator return INDICATOR;
158 section return SECTION;
159 overlay return OVERLAY;
161 outline return OUTLINE;
164 virtual return VIRTUAL;
165 alphanumeric_keys return ALPHANUMERIC_KEYS;
166 modifier_keys return MODIFIER_KEYS;
167 keypad_keys return KEYPAD_KEYS;
168 function_keys return FUNCTION_KEYS;
169 alternate_group return ALTERNATE_GROUP;
171 [a-zA-Z_][a-zA-Z_0-9]* yylval->str = strdup(yytext); return IDENT;
176 yylval->num = strtoul(yytext, &end, 0);
182 yylval->num = strtod(yytext, &end) * XkbGeomPtsPerMM;
206 <<EOF>> return END_OF_FILE;
213 scanner_error_extra(struct YYLTYPE *loc, struct scanner_extra *extra,
216 log_err(extra->ctx, "%s: line %d of %s\n", msg,
218 extra->scanFile ? extra->scanFile : "(unknown)");
220 log_err(extra->ctx, "last scanned symbol was: %s\n",
225 scanner_error(struct YYLTYPE *loc, void *scanner, const char *msg)
227 struct scanner_extra *extra = yyget_extra(scanner);
228 scanner_error_extra(loc, extra, msg);
232 CheckDefaultMap(struct xkb_context *ctx, XkbFile *maps, const char *fileName)
234 XkbFile *dflt = NULL, *tmp;
236 for (tmp = maps; tmp; tmp = (XkbFile *) tmp->common.next) {
237 if (!(tmp->flags & XkbLC_Default))
246 "Multiple default components in %s; "
247 "Using %s, ignoring %s\n",
248 (fileName ? fileName : "(unknown)"),
249 (dflt->name ? dflt->name : "(first)"),
250 (tmp->name ? tmp->name : "(subsequent)"));
252 tmp->flags &= (~XkbLC_Default);
257 XkbParseString(struct xkb_context *ctx, const char *string,
258 const char *file_name, XkbFile **out)
261 struct parser_param param;
262 struct scanner_extra extra;
263 YY_BUFFER_STATE state;
270 memset(&extra, 0, sizeof(extra));
271 ret = yylex_init_extra(&extra, ¶m.scanner);
277 extra.scanFile = strdup(file_name);
281 state = yy_scan_string(string, param.scanner);
282 ret = yyparse(¶m);
283 yy_delete_buffer(state, param.scanner);
284 yylex_destroy(param.scanner);
285 free(extra.scanFile);
289 CheckDefaultMap(param.ctx, param.rtrn, file_name);
295 XkbParseFile(struct xkb_context *ctx, FILE *file,
296 const char *file_name, XkbFile **out)
299 struct parser_param param;
300 struct scanner_extra extra;
307 memset(&extra, 0, sizeof(extra));
308 ret = yylex_init_extra(&extra, ¶m.scanner);
314 extra.scanFile = strdup(file_name);
318 yyset_in(file, param.scanner);
319 ret = yyparse(¶m);
320 yylex_destroy(param.scanner);
321 free(extra.scanFile);
325 CheckDefaultMap(param.ctx, param.rtrn, file_name);