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 #pragma GCC diagnostic ignored "-Wredundant-decls"
34 #pragma GCC diagnostic ignored "-Wmissing-noreturn"
36 extern int yyparse(struct parser_param *param);
39 scanner_error_extra(struct YYLTYPE *loc, struct scanner_extra *extra,
42 #define YY_USER_ACTION { \
43 yylloc->first_line = yylineno; \
44 yylloc->last_line = yylineno; \
47 #define APPEND_S(ch) do { \
48 if (yyextra->s - yyextra->scanBuf >= sizeof(yyextra->scanBuf) - 1) \
55 %option extra-type="struct scanner_extra *"
56 %option bison-bridge bison-locations
58 %option nounistd noyywrap noinput nounput
59 %option never-interactive
60 %option case-insensitive
69 \" yyextra->s = yyextra->scanBuf; BEGIN(S_STR);
70 \< yyextra->s = yyextra->scanBuf; BEGIN(S_KEY);
75 yylval->str = strdup(yyextra->scanBuf);
82 if (yyextra->s - yyextra->scanBuf > XkbKeyNameLength) {
83 scanner_error_extra(yylloc, yyextra,
88 strncpy(yylval->keyName, yyextra->scanBuf, XkbKeyNameLength);
92 <S_STR,S_KEY>\\[0-7]{1,3} {
93 /* octal escape sequence */
96 (void) sscanf( yytext + 1, "%o", &result );
99 scanner_error_extra(yylloc, yyextra,
100 "Illegal octal escape");
107 <S_STR,S_KEY>\\[0-9]+ {
108 scanner_error_extra(yylloc, yyextra,
109 "Illegal octal escape");
113 <S_STR,S_KEY>\\n APPEND_S('\n');
114 <S_STR,S_KEY>\\t APPEND_S('\t');
115 <S_STR,S_KEY>\\r APPEND_S('\r');
116 <S_STR,S_KEY>\\b APPEND_S('\b');
117 <S_STR,S_KEY>\\f APPEND_S('\f');
118 <S_STR,S_KEY>\\v APPEND_S('\v');
119 <S_STR,S_KEY>\\e APPEND_S('\033');
121 <S_STR,S_KEY>. APPEND_S(yytext[0]);
123 xkb_keymap return XKB_KEYMAP;
124 xkb_keycodes return XKB_KEYCODES;
125 xkb_types return XKB_TYPES;
126 xkb_symbols return XKB_SYMBOLS;
127 xkb_compat return XKB_COMPATMAP;
128 xkb_compat_map return XKB_COMPATMAP;
129 xkb_compatibility return XKB_COMPATMAP;
130 xkb_compatibility_map return XKB_COMPATMAP;
131 xkb_geometry return XKB_GEOMETRY;
132 xkb_semantics return XKB_SEMANTICS;
133 xkb_layout return XKB_LAYOUT;
134 include return INCLUDE;
135 override return OVERRIDE;
136 augment return AUGMENT;
137 replace return REPLACE;
138 alternate return ALTERNATE;
139 partial return PARTIAL;
140 default return DEFAULT;
141 hidden return HIDDEN;
142 virtual_modifiers return VIRTUAL_MODS;
144 interpret return INTERPRET;
145 action return ACTION_TOK;
149 modmap return MODIFIER_MAP;
150 mod_map return MODIFIER_MAP;
151 modifier_map return MODIFIER_MAP;
152 indicator return INDICATOR;
156 section return SECTION;
157 overlay return OVERLAY;
159 outline return OUTLINE;
162 virtual return VIRTUAL;
163 alphanumeric_keys return ALPHANUMERIC_KEYS;
164 modifier_keys return MODIFIER_KEYS;
165 keypad_keys return KEYPAD_KEYS;
166 function_keys return FUNCTION_KEYS;
167 alternate_group return ALTERNATE_GROUP;
169 [a-zA-Z_][a-zA-Z_0-9]* yylval->str = strdup(yytext); return IDENT;
174 yylval->num = strtoul(yytext, &end, 0);
180 yylval->num = strtod(yytext, &end) * XkbGeomPtsPerMM;
204 <<EOF>> return END_OF_FILE;
211 scanner_error_extra(struct YYLTYPE *loc, struct scanner_extra *extra,
214 log_err(extra->ctx, "%s: line %d of %s\n", msg,
216 extra->scanFile ? extra->scanFile : "(unknown)");
218 log_err(extra->ctx, "last scanned symbol was: %s\n",
223 scanner_error(struct YYLTYPE *loc, void *scanner, const char *msg)
225 struct scanner_extra *extra = yyget_extra(scanner);
226 scanner_error_extra(loc, extra, msg);
230 XKBParseString(struct xkb_context *ctx, const char *string,
231 const char *file_name, XkbFile **out)
234 struct parser_param param;
235 struct scanner_extra extra;
236 YY_BUFFER_STATE state;
243 memset(&extra, 0, sizeof(extra));
244 ret = yylex_init_extra(&extra, ¶m.scanner);
250 extra.scanFile = strdup(file_name);
254 state = yy_scan_string(string, param.scanner);
255 ret = yyparse(¶m);
256 yy_delete_buffer(state, param.scanner);
257 yylex_destroy(param.scanner);
258 free(extra.scanFile);
262 CheckDefaultMap(param.ctx, param.rtrn, file_name);
268 XKBParseFile(struct xkb_context *ctx, FILE *file,
269 const char *file_name, XkbFile **out)
272 struct parser_param param;
273 struct scanner_extra extra;
280 memset(&extra, 0, sizeof(extra));
281 ret = yylex_init_extra(&extra, ¶m.scanner);
287 extra.scanFile = strdup(file_name);
291 yyset_in(file, param.scanner);
292 ret = yyparse(¶m);
293 yylex_destroy(param.scanner);
294 free(extra.scanFile);
298 CheckDefaultMap(param.ctx, param.rtrn, file_name);