scanner: avoid strlen in keyword lookup, we know the len
authorRan Benita <ran234@gmail.com>
Fri, 7 Feb 2014 16:09:30 +0000 (18:09 +0200)
committerRan Benita <ran234@gmail.com>
Fri, 7 Feb 2014 16:12:29 +0000 (18:12 +0200)
Signed-off-by: Ran Benita <ran234@gmail.com>
src/xkbcomp/keywords.c
src/xkbcomp/keywords.gperf
src/xkbcomp/parser-priv.h
src/xkbcomp/scanner.c

index c19d66f..abab7fe 100644 (file)
@@ -339,10 +339,9 @@ keyword_gperf_lookup (register const char *str, register unsigned int len)
 
 
 int
-keyword_to_token(const char *string)
+keyword_to_token(const char *string, unsigned int len)
 {
-    const struct keyword_tok *kt;
-    kt = keyword_gperf_lookup(string, strlen(string));
+    const struct keyword_tok *kt = keyword_gperf_lookup(string, len);
     if (!kt)
         return -1;
     return kt->tok;
index 4a77703..5c64144 100644 (file)
@@ -69,10 +69,9 @@ xkb_types,              XKB_TYPES
 %%
 
 int
-keyword_to_token(const char *string)
+keyword_to_token(const char *string, unsigned int len)
 {
-    const struct keyword_tok *kt;
-    kt = keyword_gperf_lookup(string, strlen(string));
+    const struct keyword_tok *kt = keyword_gperf_lookup(string, len);
     if (!kt)
         return -1;
     return kt->tok;
index 05e725e..08475a7 100644 (file)
@@ -45,6 +45,6 @@ XkbFile *
 parse(struct xkb_context *ctx, void *scanner, const char *map);
 
 int
-keyword_to_token(const char *string);
+keyword_to_token(const char *string, unsigned int len);
 
 #endif
index 48df488..45a5940 100644 (file)
@@ -169,7 +169,7 @@ skip_more_whitespace_and_comments:
             return scanner_error(s, "identifier too long");
 
         /* Keyword. */
-        tok = keyword_to_token(s->buf);
+        tok = keyword_to_token(s->buf, s->buf_pos - 1);
         if (tok != -1) return tok;
 
         yylval->str = strdup(s->buf);