diff --git a/src/scanner-utils.h b/src/scanner-utils.h index e2ef6c37..8c8e0092 100644 --- a/src/scanner-utils.h +++ b/src/scanner-utils.h @@ -48,12 +48,21 @@ svaleq(struct sval s1, struct sval s2) return s1.len == s2.len && memcmp(s1.start, s2.start, s1.len) == 0; } +static inline bool +isvaleq(struct sval s1, struct sval s2) +{ + return s1.len == s2.len && istrncmp(s1.start, s2.start, s1.len) == 0; +} + static inline bool svaleq_prefix(struct sval s1, struct sval s2) { return s1.len <= s2.len && memcmp(s1.start, s2.start, s1.len) == 0; } +#define SVAL(start, len) (struct sval){(start), len} +#define SVAL_LIT(literal) SVAL(literal, sizeof(literal) - 1) + /* A line:column location in the input string (1-based). */ struct scanner_loc { size_t line, column; diff --git a/src/xkbcomp/parser-priv.h b/src/xkbcomp/parser-priv.h index f10351a9..d02272f7 100644 --- a/src/xkbcomp/parser-priv.h +++ b/src/xkbcomp/parser-priv.h @@ -30,6 +30,7 @@ struct parser_param; struct scanner; +#include "scanner-utils.h" #include "parser.h" int diff --git a/src/xkbcomp/parser.y b/src/xkbcomp/parser.y index ff4bbe80..c7c158cd 100644 --- a/src/xkbcomp/parser.y +++ b/src/xkbcomp/parser.y @@ -36,7 +36,6 @@ #include "xkbcomp/xkbcomp-priv.h" #include "xkbcomp/ast-build.h" #include "xkbcomp/parser-priv.h" -#include "scanner-utils.h" #include "keysym.h" struct parser_param { @@ -59,25 +58,32 @@ _xkbcommon_error(struct parser_param *param, const char *msg) } static bool -resolve_keysym(struct parser_param *param, const char *name, xkb_keysym_t *sym_rtrn) +resolve_keysym(struct parser_param *param, struct sval name, xkb_keysym_t *sym_rtrn) { xkb_keysym_t sym; - if (!name || istreq(name, "any") || istreq(name, "nosymbol")) { + if (isvaleq(name, SVAL_LIT("any")) || isvaleq(name, SVAL_LIT("nosymbol"))) { *sym_rtrn = XKB_KEY_NoSymbol; return true; } - if (istreq(name, "none") || istreq(name, "voidsymbol")) { + if (isvaleq(name, SVAL_LIT("none")) || isvaleq(name, SVAL_LIT("voidsymbol"))) { *sym_rtrn = XKB_KEY_VoidSymbol; return true; } - sym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS); + char buf[256]; + if (name.len >= sizeof(buf)) { + return false; + } + memcpy(buf, name.start, name.len); + buf[name.len] = '\0'; + + sym = xkb_keysym_from_name(buf, XKB_KEYSYM_NO_FLAGS); if (sym != XKB_KEY_NoSymbol) { *sym_rtrn = sym; check_deprecated_keysyms(parser_warn, param, param->ctx, - sym, name, name, "%s", ""); + sym, buf, buf, "%s", ""); return true; } @@ -168,6 +174,7 @@ resolve_keysym(struct parser_param *param, const char *name, xkb_keysym_t *sym_r int64_t num; enum xkb_file_type file_type; char *str; + struct sval sval; xkb_atom_t atom; enum merge_mode merge; enum xkb_map_flags mapFlags; @@ -195,7 +202,8 @@ resolve_keysym(struct parser_param *param, const char *name, xkb_keysym_t *sym_r } %type INTEGER FLOAT -%type IDENT STRING +%type STRING +%type IDENT %type KEYNAME %type KeyCode Number Integer Float SignedNumber DoodadType %type MergeMode OptMergeMode @@ -765,12 +773,11 @@ KeySym : IDENT parser_warn( param, XKB_WARNING_UNRECOGNIZED_KEYSYM, - "unrecognized keysym \"%s\"", - $1 + "unrecognized keysym \"%.*s\"", + $1.len, $1.start ); $$ = XKB_KEY_NoSymbol; } - free($1); } /* Handle keysym that is also a keyword */ | SECTION { $$ = XKB_KEY_section; } @@ -829,7 +836,7 @@ Integer : INTEGER { $$ = $1; } KeyCode : INTEGER { $$ = $1; } ; -Ident : IDENT { $$ = xkb_atom_intern(param->ctx, $1, strlen($1)); free($1); } +Ident : IDENT { $$ = xkb_atom_intern(param->ctx, $1.start, $1.len); } | DEFAULT { $$ = xkb_atom_intern_literal(param->ctx, "default"); } ; diff --git a/src/xkbcomp/rules.c b/src/xkbcomp/rules.c index e01ccd62..1833954e 100644 --- a/src/xkbcomp/rules.c +++ b/src/xkbcomp/rules.c @@ -172,8 +172,6 @@ enum rules_mlvo { _MLVO_NUM_ENTRIES }; -#define SVAL_LIT(literal) { literal, sizeof(literal) - 1 } - static const struct sval rules_mlvo_svals[_MLVO_NUM_ENTRIES] = { [MLVO_MODEL] = SVAL_LIT("model"), [MLVO_LAYOUT] = SVAL_LIT("layout"), diff --git a/src/xkbcomp/scanner.c b/src/xkbcomp/scanner.c index 931a9a7c..b4dd7a9e 100644 --- a/src/xkbcomp/scanner.c +++ b/src/xkbcomp/scanner.c @@ -25,7 +25,6 @@ #include "xkbcomp-priv.h" #include "parser-priv.h" -#include "scanner-utils.h" static bool number(struct scanner *s, int64_t *out, int *out_tok) @@ -174,9 +173,7 @@ _xkbcommon_lex(YYSTYPE *yylval, struct scanner *s) tok = keyword_to_token(start, len); if (tok >= 0) return tok; - yylval->str = strndup(start, len); - if (!yylval->str) - return ERROR_TOK; + yylval->sval = SVAL(start, len); return IDENT; }