Changeset: 58a9c6e4e616 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=58a9c6e4e616
Modified Files:
clients/Tests/exports.stable.out
common/stream/stream.c
common/stream/stream.h
Branch: int128
Log Message:
added int128 / "hge" support in common/stream/stream.[hc]
diffs (148 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
@@ -3206,6 +3206,8 @@ int mnstr_printf(stream *s, _In_z_ _Prin
ssize_t mnstr_read(stream *s, void *buf, size_t elmsize, size_t cnt);
int mnstr_readBte(stream *s, signed char *val);
int mnstr_readBteArray(stream *s, signed char *val, size_t cnt);
+int mnstr_readHge(stream *s, hge *val);
+int mnstr_readHgeArray(stream *s, hge *val, size_t cnt);
int mnstr_readInt(stream *s, int *val);
int mnstr_readIntArray(stream *s, int *val, size_t cnt);
int mnstr_readLng(stream *s, lng *val);
@@ -3221,6 +3223,8 @@ int mnstr_type(stream *s);
ssize_t mnstr_write(stream *s, const void *buf, size_t elmsize, size_t cnt);
int mnstr_writeBte(stream *s, signed char val);
int mnstr_writeBteArray(stream *s, const signed char *val, size_t cnt);
+int mnstr_writeHge(stream *s, hge val);
+int mnstr_writeHgeArray(stream *s, const hge *val, size_t cnt);
int mnstr_writeInt(stream *s, int val);
int mnstr_writeIntArray(stream *s, const int *val, size_t cnt);
int mnstr_writeLng(stream *s, lng val);
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -124,6 +124,12 @@
((((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
+
struct stream {
short byteorder;
@@ -2843,6 +2849,33 @@ mnstr_writeLng(stream *s, lng val)
return s->write(s, (void *) &val, sizeof(val), (size_t) 1) == 1;
}
+#ifdef HAVE_HGE
+int
+mnstr_readHge(stream *s, hge *val)
+{
+ switch (s->read(s, (void *) val, sizeof(*val), 1)) {
+ case 1:
+ if (s->byteorder != 1234)
+ *val = huge_int_SWAP(*val);
+ return 1;
+ case 0:
+ /* consider EOF an error */
+ s->errnr = MNSTR_READ_ERROR;
+ /* fall through */
+ default:
+ /* read failed */
+ return 0;
+ }
+}
+
+int
+mnstr_writeHge(stream *s, hge val)
+{
+ if (!s || s->errnr)
+ return 0;
+ return s->write(s, (void *) &val, sizeof(val), (size_t) 1) == 1;
+}
+#endif
int
mnstr_readBteArray(stream *s, signed char *val, size_t cnt)
@@ -2935,6 +2968,32 @@ mnstr_writeLngArray(stream *s, const lng
return s->write(s, val, sizeof(*val), cnt) == (ssize_t) cnt;
}
+#ifdef HAVE_HGE
+int
+mnstr_readHgeArray(stream *s, hge *val, size_t cnt)
+{
+ if (s->read(s, (void *) val, sizeof(*val), cnt) < (ssize_t) cnt) {
+ s->errnr = MNSTR_READ_ERROR;
+ return 0;
+ }
+
+ if (s->byteorder != 1234) {
+ size_t i;
+ for (i = 0; i < cnt; i++, val++)
+ *val = huge_int_SWAP(*val);
+ }
+ return 1;
+}
+
+int
+mnstr_writeHgeArray(stream *s, const hge *val, size_t cnt)
+{
+ if (!s || s->errnr)
+ return 0;
+ return s->write(s, val, sizeof(*val), cnt) == (ssize_t) cnt;
+}
+#endif
+
int
mnstr_printf(stream *s, const char *format, ...)
{
diff --git a/common/stream/stream.h b/common/stream/stream.h
--- a/common/stream/stream.h
+++ b/common/stream/stream.h
@@ -57,6 +57,18 @@ typedef __int64 lng;
typedef long long lng;
# endif
#endif
+#ifndef HAVE_HGE
+# ifdef HAVE___INT128
+# define HAVE_HGE 1
+typedef __int128 hge;
+# else
+# ifdef HAVE___INT128_T
+# define HAVE_HGE 1
+typedef __int128_t hge;
+# endif
+# endif
+#endif
+
/* Defines to help the compiler check printf-style format arguments.
* These defines are also in our config.h, but we repeat them here so
@@ -104,6 +116,10 @@ stream_export int mnstr_readInt(stream *
stream_export int mnstr_writeInt(stream *s, int val);
stream_export int mnstr_readLng(stream *s, lng *val);
stream_export int mnstr_writeLng(stream *s, lng val);
+#ifdef HAVE_HGE
+stream_export int mnstr_readHge(stream *s, hge *val);
+stream_export int mnstr_writeHge(stream *s, hge val);
+#endif
stream_export int mnstr_readBteArray(stream *s, signed char *val, size_t cnt);
stream_export int mnstr_writeBteArray(stream *s, const signed char *val,
size_t cnt);
@@ -113,6 +129,10 @@ stream_export int mnstr_readIntArray(str
stream_export int mnstr_writeIntArray(stream *s, const int *val, size_t cnt);
stream_export int mnstr_readLngArray(stream *s, lng *val, size_t cnt);
stream_export int mnstr_writeLngArray(stream *s, const lng *val, size_t cnt);
+#ifdef HAVE_HGE
+stream_export int mnstr_readHgeArray(stream *s, hge *val, size_t cnt);
+stream_export int mnstr_writeHgeArray(stream *s, const hge *val, size_t cnt);
+#endif
stream_export int mnstr_printf(stream *s, _In_z_ _Printf_format_string_ const
char *format, ...)
__attribute__((__format__(__printf__, 2, 3)));
stream_export ssize_t mnstr_read(stream *s, void *buf, size_t elmsize, size_t
cnt);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list