Changeset: 481bbfb39e7e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=481bbfb39e7e
Modified Files:
        monetdb5/modules/atoms/json.c
Branch: json
Log Message:

Refactor JSONjson2number and JSONjson2integer

This commit makes explicit the fact that both those functions share the same
code but call different function to convert strings to values.


diffs (145 lines):

diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -1185,75 +1185,99 @@ JSONjson2textSeparator(str *ret, json *j
        return MAL_SUCCEED;
 }
 
-str
-JSONjson2number(dbl *ret, json *js)
-{
+static str
+JSONjson2numberInternal(void **ret, json *js, void (*str2num)(void **ret, 
const char *nptr, size_t len)) {
        JSON *jt;
-       char *rest;
 
-       *ret = dbl_nil;
        jt = JSONparse(*js);
        CHECK_JSON(jt);
        switch (jt->elm[0].kind) {
        case JSON_NUMBER:
-               *ret = strtod(jt->elm[0].value, &rest);
-               if (rest && (size_t) (rest - jt->elm[0].value) 
!=jt->elm[0].valuelen)
-                       *ret = dbl_nil;
+               str2num(ret, jt->elm[0].value, jt->elm[0].valuelen);
                break;
        case JSON_ARRAY:
                if (jt->free == 2) {
-                       *ret = strtod(jt->elm[1].value, &rest);
-                       if (rest && (size_t) (rest - jt->elm[1].value) 
!=jt->elm[1].valuelen)
-                               *ret = dbl_nil;
+                       str2num(ret, jt->elm[1].value, jt->elm[1].valuelen);
+               }
+               else {
+                       *ret = NULL;
                }
                break;
        case JSON_OBJECT:
                if (jt->free == 3) {
-                       *ret = strtod(jt->elm[2].value, &rest);
-                       if (rest && (size_t) (rest - jt->elm[2].value) 
!=jt->elm[2].valuelen)
-                               *ret = dbl_nil;
+                       str2num(ret, jt->elm[2].value, jt->elm[2].valuelen);
+               }
+               else {
+                       *ret = NULL;
                }
                break;
        default:
+               *ret = NULL;
+       }
+       JSONfree(jt);
+
+       return MAL_SUCCEED;
+}
+
+static void
+strtod_wrapper(void **ret, const char *nptr, size_t len) {
+       char *rest;
+       dbl val;
+
+       val = strtod(nptr, &rest);
+       if(rest && (size_t)(rest - nptr) != len) {
+               *ret = NULL;
+       }
+       else {
+               **(dbl **)ret = val;
+       }
+}
+
+static  void
+strtol_wrapper(void **ret, const char *nptr, size_t len) {
+       char *rest;
+       lng val;
+
+       val = strtol(nptr, &rest, 0);
+       if(rest && (size_t)(rest - nptr) != len) {
+               *ret = NULL;
+       }
+       else {
+               **(lng **)ret = val;
+       }
+}
+
+str
+JSONjson2number(dbl *ret, json *js)
+{
+       dbl val = 0;
+       dbl *val_ptr = &val;
+       JSONjson2numberInternal((void **)&val_ptr, js, strtod_wrapper);
+
+       if (val_ptr == NULL) {
                *ret = dbl_nil;
        }
-       JSONfree(jt);
+       else {
+               *ret = val;
+       }
+
        return MAL_SUCCEED;
 }
 
 str
 JSONjson2integer(lng *ret, json *js)
 {
-       JSON *jt;
-       char *rest;
+       lng val = 0;
+       lng *val_ptr = &val;
 
-       *ret = lng_nil;
-       jt = JSONparse(*js);
-       CHECK_JSON(jt);
-       switch (jt->elm[0].kind) {
-       case JSON_NUMBER:
-               *ret = strtol(jt->elm[0].value, &rest, 0);
-               if (rest && (size_t) (rest - jt->elm[0].value) 
!=jt->elm[0].valuelen)
-                       *ret = lng_nil;
-               break;
-       case JSON_ARRAY:
-               if (jt->free == 2) {
-                       *ret = strtol(jt->elm[1].value, &rest, 0);
-                       if (rest && (size_t) (rest - jt->elm[1].value) 
!=jt->elm[1].valuelen)
-                               *ret = lng_nil;
-               }
-               break;
-       case JSON_OBJECT:
-               if (jt->free == 3) {
-                       *ret = strtol(jt->elm[2].value, &rest, 0);
-                       if (rest && (size_t) (rest - jt->elm[2].value) 
!=jt->elm[2].valuelen)
-                               *ret = lng_nil;
-               }
-               break;
-       default:
+       JSONjson2numberInternal((void **)&val_ptr, js, strtol_wrapper);
+       if (val_ptr == NULL) {
                *ret = lng_nil;
        }
-       JSONfree(jt);
+       else {
+               *ret = val;
+       }
+
        return MAL_SUCCEED;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to