[Groonga-commit] groonga/groonga at e56878a [master] grn_ts: support number literals with signs

Back to archive index

susumu.yata null+****@clear*****
Mon Sep 28 20:41:11 JST 2015


susumu.yata	2015-09-28 20:41:11 +0900 (Mon, 28 Sep 2015)

  New Revision: e56878a8118366d790f057c14686359e18548c41
  https://github.com/groonga/groonga/commit/e56878a8118366d790f057c14686359e18548c41

  Message:
    grn_ts: support number literals with signs
    
    GitHub: #404

  Modified files:
    lib/ts.c

  Modified: lib/ts.c (+35 -3)
===================================================================
--- lib/ts.c    2015-09-28 20:26:51 +0900 (2f54782)
+++ lib/ts.c    2015-09-28 20:41:11 +0900 (5297b9f)
@@ -159,6 +159,40 @@ grn_ts_str_is_value_name(grn_ts_str str) {
          !memcmp(str.ptr, GRN_COLUMN_NAME_VALUE, GRN_COLUMN_NAME_VALUE_LEN);
 }
 
+/*
+ * grn_ts_str_has_number_prefix() returns whether or not a string starts with a
+ * number or not.
+ */
+static grn_ts_bool
+grn_ts_str_has_number_prefix(grn_ts_str str) {
+  if (!str.size) {
+    return GRN_FALSE;
+  }
+  if (grn_ts_byte_is_decimal(str.ptr[0])) {
+    return GRN_TRUE;
+  }
+  if (str.size == 1) {
+    return GRN_FALSE;
+  }
+  switch (str.ptr[0]) {
+    case '+': case '-': {
+      if (grn_ts_byte_is_decimal(str.ptr[1])) {
+        return GRN_TRUE;
+      }
+      if (str.size == 2) {
+        return GRN_FALSE;
+      }
+      return (str.ptr[1] == '.') && grn_ts_byte_is_decimal(str.ptr[2]);
+    }
+    case '.': {
+      return grn_ts_byte_is_decimal(str.ptr[1]);
+    }
+    default: {
+      return GRN_FALSE;
+    }
+  }
+}
+
 /*-------------------------------------------------------------
  * grn_ts_buf.
  */
@@ -5043,9 +5077,7 @@ grn_ts_expr_parser_tokenize_next(grn_ctx *ctx, grn_ts_expr_parser *parser,
   if (!rest.size) {
     return grn_ts_expr_parser_tokenize_end(ctx, parser, rest, token);
   }
-  if (grn_ts_byte_is_decimal(rest.ptr[0]) ||
-      ((rest.size >= 2) && (rest.ptr[0] == '.') &&
-       grn_ts_byte_is_decimal(rest.ptr[1]))) {
+  if (grn_ts_str_has_number_prefix(rest)) {
     return grn_ts_expr_parser_tokenize_number(ctx, parser, rest, token);
   }
   if (rest.ptr[0] == '"') {
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index