Changeset: 75524953de99 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=75524953de99
Modified Files:
        clients/mapiclient/mclient.c
Branch: Jul2015
Log Message:

Fix up type classifier state machine.


diffs (95 lines):

diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -936,9 +936,24 @@ classify(const char *s, size_t l)
            (l == 5 && strcmp(s, "false") == 0))
                return "bit";
        while (l != 0) {
-               if (*s == 0 || !isascii(*s))
+               if (*s == 0)
                        return "str";
-               if (isdigit((int) *s)) {
+               switch (*s) {
+               case '0':
+                       if (state == 12) {
+                               state = 13;     /* int + '@0' (oid) */
+                               break;
+                       }
+                       /* fall through */
+               case '1':
+               case '2':
+               case '3':
+               case '4':
+               case '5':
+               case '6':
+               case '7':
+               case '8':
+               case '9':
                        switch (state) {
                        case 0:
                        case 1:
@@ -951,36 +966,43 @@ classify(const char *s, size_t l)
                        case 6:
                                state = 7;      /* digit after exponent marker 
and optional sign */
                                break;
-                       case 12:
-                               if (*s == '0')  /* only @0 allowed */
-                                       state = 13;
-                               else
-                                       return "str";
-                               break;
+                       case 2:
+                       case 4:
+                       case 7:
+                               break;          /* more digits */
+                       default:
+                               return "str";
                        }
-               } else if (*s == '.') {
+                       break;
+               case '.':
                        if (state == 2)
                                state = 3;      /* decimal point */
                        else
                                return "str";
-               } else if (*s == 'e' || *s == 'E') {
+                       break;
+               case 'e':
+               case 'E':
                        if (state == 2 || state == 4)
                                state = 5;      /* exponent marker */
                        else
                                return "str";
-               } else if (*s == '+' || *s == '-') {
+                       break;
+               case '+':
+               case '-':
                        if (state == 0)
                                state = 1;      /* sign at start */
                        else if (state == 5)
                                state = 6;      /* sign after exponent marker */
                        else
                                return "str";
-               } else if (*s == '@') {
+                       break;
+               case '@':
                        if (state == 2)
                                state = 12;     /* OID marker */
                        else
                                return "str";
-               } else if (*s == 'L') {
+                       break;
+               case 'L':
                        switch (state) {
                        case 2:
                                state = 8;      /* int + 'L' */
@@ -998,6 +1020,9 @@ classify(const char *s, size_t l)
                        default:
                                return "str";
                        }
+                       break;
+               default:
+                       return "str";
                }
                s++;
                l--;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to