Changeset: 8ec3150441ef for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8ec3150441ef
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk.h
        gdk/gdk_atoms.c
        gdk/gdk_atoms.h
        monetdb5/modules/mal/Tests/remote03.stable.out
        
monetdb5/tests/BugDay_2005-10-06_4.9.3/Tests/return_types_of_head_and_tail.SF-701641.stable.out
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check5.stable.out
        sql/test/leaks/Tests/drop3.stable.out
        sql/test/leaks/Tests/select1.stable.out
        sql/test/leaks/Tests/select2.stable.out
        sql/test/leaks/Tests/temp1.stable.out
        sql/test/leaks/Tests/temp2.stable.out
        sql/test/leaks/Tests/temp3.stable.out
Branch: int128
Log Message:

added 128-bit integer type "hge" ("huge") and related functions to gdk.h & 
gdk_atoms.[hc]


diffs (truncated from 563 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -424,6 +424,9 @@ const flt flt_nil;
 char *get_bin_path(void);
 int gettimeofday(struct timeval *tv, int *ignore_zone);
 int gprof_pthread_create(pthread_t *__restrict, __const pthread_attr_t 
*__restrict, void *( *fcn)(void *), void *__restrict);
+int hgeFromStr(const char *src, int *len, hge **dst);
+int hgeToStr(str *dst, int *len, const hge *src);
+const hge hge_nil;
 int intFromStr(const char *src, int *len, int **dst);
 int intToStr(str *dst, int *len, const int *src);
 const int int_nil;
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -479,7 +479,12 @@
 #define TYPE_flt       9
 #define TYPE_dbl       10
 #define TYPE_lng       11
+#ifdef HAVE_HGE
+#define TYPE_hge       12
+#define TYPE_str       13
+#else
 #define TYPE_str       12
+#endif
 #define TYPE_any       255     /* limit types to <255! */
 
 typedef signed char bit;
@@ -740,6 +745,9 @@ typedef struct {
                str sval;
                dbl dval;
                lng lval;
+#ifdef HAVE_HGE
+               hge hval;
+#endif
        } val;
        int len, vtype;
 } *ValPtr, ValRecord;
@@ -2324,6 +2332,9 @@ VALptr(const ValRecord *v)
        case TYPE_flt: return (const void *) &v->val.fval;
        case TYPE_dbl: return (const void *) &v->val.dval;
        case TYPE_lng: return (const void *) &v->val.lval;
+#ifdef HAVE_HGE
+       case TYPE_hge: return (const void *) &v->val.hval;
+#endif
        case TYPE_str: return (const void *) v->val.sval;
        default:       return (const void *) v->val.pval;
        }
@@ -2416,6 +2427,12 @@ VALptr(const ValRecord *v)
                ((((lng)normal_int_SWAP(l))<<32) |\
                 (0xffffffff&normal_int_SWAP(l>>32)))
 
+#ifdef HAVE_HGE
+#define huge_int_SWAP(h) \
+               ((((hge)long_long_SWAP(h))<<64) |\
+                (0xffffffffffffffff&long_long_SWAP(h>>64)))
+#endif
+
 /*
  * The kernel maintains a central table of all active threads.  They
  * are indexed by their tid. The structure contains information on the
@@ -2970,6 +2987,9 @@ gdk_export int ALIGNsetH(BAT *b1, BAT *b
 #define HASHloop_int(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, int)
 #define HASHloop_wrd(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, wrd)
 #define HASHloop_lng(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, lng)
+#ifdef HAVE_HGE
+#define HASHloop_hge(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, hge)
+#endif
 #define HASHloop_oid(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, oid)
 #define HASHloop_bat(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, bat)
 #define HASHloop_flt(bi, h, hb, v)     HASHloop_TYPE(bi, h, hb, v, flt)
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -66,6 +66,14 @@ lngCmp(const lng *l, const lng *r)
        return simple_CMP(l, r, lng);
 }
 
+#ifdef HAVE_HGE
+static int
+hgeCmp(const hge *l, const hge *r)
+{
+       return simple_CMP(l, r, hge);
+}
+#endif
+
 static int
 dblCmp(const dbl *l, const dbl *r)
 {
@@ -100,6 +108,15 @@ lngHash(const lng *v)
        return (BUN) mix_int(((const unsigned int *) v)[0] ^ ((const unsigned 
int *) v)[1]);
 }
 
+#ifdef HAVE_HGE
+static BUN
+hgeHash(const hge *v)
+{
+       return (BUN) mix_int(((const unsigned int *) v)[0] ^ ((const unsigned 
int *) v)[1] ^ \
+                            ((const unsigned int *) v)[2] ^ ((const unsigned 
int *) v)[3]);
+}
+#endif
+
 /*
  * @+ Standard Atoms
  */
@@ -121,6 +138,14 @@ lngConvert(lng *s)
        *s = long_long_SWAP(*s);
 }
 
+#ifdef HAVE_HGE
+static inline void
+hgeConvert(hge *s)
+{
+       *s = huge_int_SWAP(*s);
+}
+#endif
+
 static inline int
 batFix(const bat *b)
 {
@@ -337,6 +362,9 @@ const int int_nil = GDK_int_min;
 const flt flt_nil = GDK_flt_min;
 const dbl dbl_nil = GDK_dbl_min;
 const lng lng_nil = GDK_lng_min;
+#ifdef HAVE_HGE
+const hge hge_nil = GDK_hge_min;
+#endif
 const oid oid_nil = (oid) 1 << (sizeof(oid) * 8 - 1);
 const wrd wrd_nil = GDK_wrd_min;
 const char str_nil[2] = { '\200', 0 };
@@ -392,6 +420,10 @@ ATOMcmp(int t, const void *l, const void
                return simple_CMP(l, r, flt);
        case TYPE_lng:
                return simple_CMP(l, r, lng);
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               return simple_CMP(l, r, hge);
+#endif
        case TYPE_dbl:
                return simple_CMP(l, r, dbl);
        default:
@@ -686,8 +718,13 @@ numFromStr(const char *src, int *len, vo
 {
        const char *p = src;
        int sz = ATOMsize(tp);
+#ifdef HAVE_HGE
+       hge base = 0;
+       hge maxdiv10 = 0;       /* max value / 10 */
+#else
        lng base = 0;
        lng maxdiv10 = 0;       /* max value / 10 */
+#endif
        int maxmod10 = 7;       /* max value % 10 */
        int sign = 1;
 
@@ -722,6 +759,12 @@ numFromStr(const char *src, int *len, vo
        case 8:
                maxdiv10 = LL_CONSTANT(922337203685477580)/*7*/;
                break;
+#ifdef HAVE_HGE
+       case 16:
+               maxdiv10 = GDK_hge_max / 10;
+               //         17014118346046923173168730371588410572/*7*/;
+               break;
+#endif
        }
        do {
                if (base > maxdiv10 ||
@@ -756,6 +799,15 @@ numFromStr(const char *src, int *len, vo
                        p += 2;
                break;
        }
+#ifdef HAVE_HGE
+       case 16: {
+               hge **dsthge = (hge **) dst;
+               **dsthge = (hge) base;
+               if (p[0] == 'L' && p[1] == 'L')
+                       p += 2;
+               break;
+       }
+#endif
        }
        return (int) (p - src);
 }
@@ -784,6 +836,14 @@ lngFromStr(const char *src, int *len, ln
        return numFromStr(src, len, (void **) dst, TYPE_lng);
 }
 
+#ifdef HAVE_HGE
+int
+hgeFromStr(const char *src, int *len, hge **dst)
+{
+       return numFromStr(src, len, (void **) dst, TYPE_hge);
+}
+#endif
+
 #define atom_io(TYPE, NAME, CAST)                                      \
 static TYPE *                                                          \
 TYPE##Read(TYPE *a, stream *s, size_t cnt)                             \
@@ -808,8 +868,36 @@ atomtostr(int, "%d", )
 atom_io(int, Int, int)
 
 atomtostr(lng, LLFMT, )
+atom_io(lng, Lng, lng)
 
-atom_io(lng, Lng, lng)
+#ifdef HAVE_HGE
+#ifdef WIN32
+#define HGE_LL018FMT "%018I64d"
+#else
+#define HGE_LL018FMT "%018lld"
+#endif
+#define HGE_LL18DIGITS LL_CONSTANT(1000000000000000000)
+
+int
+hgeToStr(char **dst, int *len, const hge *src)
+{
+       atommem(char, hgeStrlen);
+       if (*src == hge_nil) {
+               strncpy(*dst, "nil", *len);
+               return 3;
+       }
+       if ((hge) GDK_lng_min <= *src && *src <= (hge) GDK_lng_max) {
+               lng s = (lng) *src;
+               return lngToStr(dst, len, &s);
+       } else {
+               hge s = *src / HGE_LL18DIGITS;
+               int l = hgeToStr(dst, len, &s);
+               snprintf(*dst + l, *len - l, HGE_LL018FMT, (lng) ABS(*src % 
HGE_LL18DIGITS));
+               return (int) strlen(*dst);
+       }
+}
+atom_io(hge, Hge, hge)
+#endif
 
 int
 ptrFromStr(const char *src, int *len, ptr **dst)
@@ -1900,6 +1988,17 @@ atomDesc BATatoms[MAXATOMS] = {
         0, 0,
         0, 0,
         0, 0},
+#ifdef HAVE_HGE
+       {"hge", TYPE_hge, 1, sizeof(hge), sizeof(hge), 0, 0, (ptr) &hge_nil,
+        (int (*)(const char *, int *, ptr *)) hgeFromStr, (int (*)(str *, int 
*, const void *)) hgeToStr,
+        (void *(*)(void *, stream *, size_t)) hgeRead, (int (*)(const void *, 
stream *, size_t)) hgeWrite,
+        (int (*)(const void *, const void *)) hgeCmp,
+        (BUN (*)(const void *)) hgeHash, (void (*)(ptr, int)) hgeConvert,
+        0, 0,
+        0, 0,
+        0, 0,
+        0, 0},
+#endif
        {"str", TYPE_str, 1, sizeof(var_t), sizeof(var_t), 0, 1, (ptr) str_nil,
         (int (*)(const char *, int *, ptr *)) strFromStr, (int (*)(str *, int 
*, const void *)) strToStr,
         (void *(*)(void *, stream *, size_t)) strRead, (int (*)(const void *, 
stream *, size_t)) strWrite,
diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h
--- a/gdk/gdk_atoms.h
+++ b/gdk/gdk_atoms.h
@@ -69,6 +69,9 @@
 #define ptrStrlen      48
 #endif
 #define lngStrlen      48
+#ifdef HAVE_HGE
+#define hgeStrlen      96
+#endif
 #define fltStrlen      48
 #define dblStrlen      96
 
@@ -79,6 +82,10 @@
  * leads to the following type descriptor table.
  */
 
+#ifdef HAVE_HGE
+gdk_export int hgeFromStr(const char *src, int *len, hge **dst);
+gdk_export int hgeToStr(str *dst, int *len, const hge *src);
+#endif
 gdk_export int lngFromStr(const char *src, int *len, lng **dst);
 gdk_export int lngToStr(str *dst, int *len, const lng *src);
 gdk_export int intFromStr(const char *src, int *len, int **dst);
@@ -127,6 +134,11 @@ gdk_export int escapedStr(char *dst, con
 #define GDK_flt_min (-GDK_flt_max)
 #define GDK_lng_max ((lng) LLONG_MAX)
 #define GDK_lng_min ((lng) LLONG_MIN)
+#ifdef HAVE_HGE
+#define GDK_hge_max ((((hge) 1) << 126) - 1 + \
+                     (((hge) 1) << 126))
+#define GDK_hge_min (((hge) 1) << 127)
+#endif
 #define GDK_dbl_max ((dbl) DBL_MAX)
 #define GDK_dbl_min (-GDK_dbl_max)
 /* GDK_oid_max see below */
@@ -138,6 +150,9 @@ gdk_export const int int_nil;
 gdk_export const flt flt_nil;
 gdk_export const dbl dbl_nil;
 gdk_export const lng lng_nil;
+#ifdef HAVE_HGE
+gdk_export const hge hge_nil;
+#endif
 gdk_export const oid oid_nil;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to