]> granicus.if.org Git - json-c/commitdiff
json_tokener: optimize check for whitespace characters
authorRamiro Polla <ramiro.polla@gmail.com>
Sat, 8 Dec 2018 18:07:49 +0000 (19:07 +0100)
committerRamiro Polla <ramiro.polla@gmail.com>
Thu, 20 Dec 2018 23:24:17 +0000 (00:24 +0100)
speedup for 32-bit: ~15%
speedup for 64-bit: ~ 2%

json_tokener.c

index 561f7303b241894381d985f5312c22911dca882c..d168e3f538504cc1d249000ec4aa44ec035f56ca 100644 (file)
 # error You do not have strncasecmp on your system.
 #endif /* HAVE_STRNCASECMP */
 
+/* The following helper functions are used to speed up parsing. They
+ * are faster than their ctype counterparts because they assume that
+ * the input is in ASCII and that the locale is set to "C". The
+ * compiler will also inline these functions, providing an additional
+ * speedup by saving on function calls.
+ */
+static int is_ws_char(char c)
+{
+       return c == ' '
+           || c == '\t'
+           || c == '\n'
+           || c == '\v'
+           || c == '\f'
+           || c == '\r';
+}
+
 /* Use C99 NAN by default; if not available, nan("") should work too. */
 #ifndef NAN
 #define NAN nan("")
@@ -295,7 +311,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
 
     case json_tokener_state_eatws:
       /* Advance until we change state */
-      while (isspace((unsigned char)c)) {
+      while (is_ws_char(c)) {
        if ((!ADVANCE_CHAR(str, tok)) || (!PEEK_CHAR(c, tok)))
          goto out;
       }