Changeset: 06987f982be4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=06987f982be4
Modified Files:
        monetdb5/extras/pyapi/type_conversion.c
Branch: pyapi
Log Message:

sscanf doesn't like non-null terminated strings.


diffs (160 lines):

diff --git a/monetdb5/extras/pyapi/type_conversion.c 
b/monetdb5/extras/pyapi/type_conversion.c
--- a/monetdb5/extras/pyapi/type_conversion.c
+++ b/monetdb5/extras/pyapi/type_conversion.c
@@ -64,46 +64,25 @@ int hge_to_string(char * str, hge x)
     return TRUE;
 }
 
-bool str_to_hge(char *ptr, size_t maxsize, hge *value)
+PyObject *PyLong_FromHge(hge h)
 {
-    int i = maxsize - 1;
-    hge factor = 1;
-    if (i < 0) i = strlen(ptr) - 1;
-
-    *value = 0;
-    for( ; i >= 0; i--)
-    {
-        switch(ptr[i])
-        {
-            case '0': break;
-            case '1': *value += factor; break;
-            case '2': *value += 2 * factor; break;
-            case '3': *value += 3 * factor; break;
-            case '4': *value += 4 * factor; break;
-            case '5': *value += 5 * factor; break;
-            case '6': *value += 6 * factor; break;
-            case '7': *value += 7 * factor; break;
-            case '8': *value += 8 * factor; break;
-            case '9': *value += 9 * factor; break;
-            case '-': *value *= -1; break;
-            case '.':
-            case ',': *value = 0; factor = 1; continue;
-            case '\0': continue;
-            default:
-            {
-                return false;
-            }
-        }
-        factor *= 10;
+    PyLongObject *z;
+    size_t size = 0;
+    hge shift = h >= 0 ? h : -h;
+    hge prev = shift;
+    int i;
+    while(shift > 0) {
+        size++;
+        shift = shift >> PyLong_SHIFT;
     }
-    return true;
-}
-
-bool unicode_to_hge(Py_UNICODE *utf32, size_t maxsize, hge *value)
-{
-    char utf8[255];
-    utf32_to_utf8(0, 255, utf8, utf32);
-    return str_to_hge(utf8, maxsize, value);
+    z = _PyLong_New(size);
+    for(i = size - 1; i >= 0; i--) {
+        digit result = (digit)(prev >> (PyLong_SHIFT * i));
+        prev = prev - ((prev >> (PyLong_SHIFT * i)) << (PyLong_SHIFT * i));
+        z->ob_digit[i] = result;
+    }
+    if (h < 0) Py_SIZE(z) = -(Py_SIZE(z));
+    return (PyObject*) z;
 }
 #endif
 
@@ -145,38 +124,40 @@ bool pyobject_to_##type(PyObject **pyobj
     return false;                                                              
                                  \
 }
 
-#ifdef HAVE_HGE
-PY_TO_(hge, hge);
-
-PyObject *PyLong_FromHge(hge h)
-{
-    PyLongObject *z;
-    size_t size = 0;
-    hge shift = h >= 0 ? h : -h;
-    hge prev = shift;
-    int i;
-    while(shift > 0) {
-        size++;
-        shift = shift >> PyLong_SHIFT;
-    }
-    z = _PyLong_New(size);
-    for(i = size - 1; i >= 0; i--) {
-        digit result = (digit)(prev >> (PyLong_SHIFT * i));
-        prev = prev - ((prev >> (PyLong_SHIFT * i)) << (PyLong_SHIFT * i));
-        z->ob_digit[i] = result;
-    }
-    if (h < 0) Py_SIZE(z) = -(Py_SIZE(z));
-    return (PyObject*) z;
-}
-#endif
-
-#define CONVERSION_FUNCTION_FACTORY(tpe, fmt, inttpe)              \
-    bool str_to_##tpe(char *ptr, size_t maxsize, tpe *value)       \
-    {                                                              \
-        int read = sscanf(ptr, fmt, value);                        \
-        (void) maxsize;                                            \
-        return read == 1;                                          \
-    }                                                              \
+#define CONVERSION_FUNCTION_FACTORY(tpe, inttpe)              \
+    bool str_to_##tpe(char *ptr, size_t maxsize, tpe *value) \
+    { \
+        int i = maxsize - 1; \
+        tpe factor = 1; \
+        if (i < 0) i = strlen(ptr) - 1; \
+        *value = 0;  \
+        for( ; i >= 0; i--) \
+        { \
+            switch(ptr[i]) \
+            { \
+                case '0': break; \
+                case '1': *value += factor; break; \
+                case '2': *value += 2 * factor; break; \
+                case '3': *value += 3 * factor; break; \
+                case '4': *value += 4 * factor; break; \
+                case '5': *value += 5 * factor; break; \
+                case '6': *value += 6 * factor; break; \
+                case '7': *value += 7 * factor; break; \
+                case '8': *value += 8 * factor; break; \
+                case '9': *value += 9 * factor; break; \
+                case '-': *value *= -1; break; \
+                case '.': \
+                case ',': *value /= factor; factor = 1; continue; \
+                case '\0': continue; \
+                default: \
+                { \
+                    return false; \
+                } \
+            } \
+            factor *= 10; \
+        }  \
+        return true; \
+    } \
     bool unicode_to_##tpe(Py_UNICODE *ptr, size_t maxsize, tpe *value) \
     {                                                              \
         char utf8[255];                                            \
@@ -185,9 +166,13 @@ PyObject *PyLong_FromHge(hge h)
     }                                                              \
     PY_TO_(tpe, inttpe);
 
-CONVERSION_FUNCTION_FACTORY(bit, "%hhd", bit)
-CONVERSION_FUNCTION_FACTORY(sht, "%hd", sht)
-CONVERSION_FUNCTION_FACTORY(int, "%d", int)
-CONVERSION_FUNCTION_FACTORY(lng, LLFMT, lng)
-CONVERSION_FUNCTION_FACTORY(flt, "%f", lng)
-CONVERSION_FUNCTION_FACTORY(dbl, "%lf", lng)
+CONVERSION_FUNCTION_FACTORY(bit, bit)
+CONVERSION_FUNCTION_FACTORY(sht, sht)
+CONVERSION_FUNCTION_FACTORY(int, int)
+CONVERSION_FUNCTION_FACTORY(lng, lng)
+CONVERSION_FUNCTION_FACTORY(flt, lng)
+CONVERSION_FUNCTION_FACTORY(dbl, lng)
+
+#ifdef HAVE_HGE
+CONVERSION_FUNCTION_FACTORY(hge, hge)
+#endif
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to