Added serialization primitives
authorfluffymormegil <mpread@chiark.greenend.org.uk>
Thu, 21 Oct 2010 22:04:31 +0000 (23:04 +0100)
committerfluffymormegil <mpread@chiark.greenend.org.uk>
Thu, 21 Oct 2010 22:04:31 +0000 (23:04 +0100)
include/libmormegil/serial.hh [new file with mode: 0644]
man/libmormegil::serialize.3 [new file with mode: 0644]

diff --git a/include/libmormegil/serial.hh b/include/libmormegil/serial.hh
new file mode 100644 (file)
index 0000000..0d1b0ea
--- /dev/null
@@ -0,0 +1,274 @@
+// libmormegil/serial.hh - serialization primitives
+// 
+// Copyright 2010 Martin Read. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the author nor the names of any other contributors
+//    may be used to endorse or promote products derived from this software
+//    without their specific prior written permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+#ifndef libmormegil_serial_hh
+#define libmormegil_serial_hh
+
+#include <stdint.h>
+#include <stdio.h>
+
+#include <libmormegil/Coord.hh>
+
+namespace libmormegil
+{
+
+    inline int serialize(FILE *fp, const int64_t *data)
+    {
+        unsigned char buf[8];
+        for (int i = 0; i < 8; ++i)
+        {
+            buf[i] = data >> ((7 - i) << 3);
+        }
+        return fwrite(buf, 8, 1, fp);
+    }
+
+    inline int serialize(FILE *fp, const int32_t *data)
+    {
+        unsigned char buf[4];
+        for (int i = 0; i < 4; ++i)
+        {
+            buf[i] = data >> ((3 - i) << 3);
+        }
+        return fwrite(buf, 4, 1, fp);
+    }
+
+    inline int serialize(FILE *fp, const int16_t *data)
+    {
+        unsigned char buf[2];
+        for (int i = 0; i < 2; ++i)
+        {
+            buf[i] = data >> ((1 - i) << 3);
+        }
+        return fwrite(buf, 2, 1, fp);
+    }
+
+    inline int serialize(FILE *fp, const uint64_t *data)
+    {
+        unsigned char buf[8];
+        for (int i = 0; i < 8; ++i)
+        {
+            buf[i] = data >> ((7 - i) << 3);
+        }
+        return fwrite(buf, 8, 1, fp);
+    }
+
+    inline int serialize(FILE *fp, const uint32_t *data)
+    {
+        unsigned char buf[4];
+        for (int i = 0; i < 4; ++i)
+        {
+            buf[i] = data >> ((3 - i) << 3);
+        }
+        return fwrite(buf, 4, 1, fp);
+    }
+
+    inline int serialize(FILE *fp, const uint16_t *data)
+    {
+        unsigned char buf[2];
+        for (int i = 0; i < 2; ++i)
+        {
+            buf[i] = data >> ((1 - i) << 3);
+        }
+        return fwrite(buf, 2, 1, fp);
+    }
+
+    inline int serialize(FILE *fp, Coord const *data)
+    {
+        int i1, i2;
+        i1 = serialize(fp, &data->y);
+        i2 = serialize(fp, &data->x);
+        return (i1 > 0) && (i2 > 0) ? 0 : -1;
+    }
+
+    inline int serialize(FILE *fp, Coord64 const *data)
+    {
+        int i1, i2;
+        i1 = serialize(fp, &data->y);
+        i2 = serialize(fp, &data->x);
+        return (i1 > 0) && (i2 > 0) ? 0 : -1;
+    }
+
+    inline int serialize(FILE *fp, Offset64 const *data)
+    {
+        int i1, i2;
+        i1 = serialize(fp, &data->y);
+        i2 = serialize(fp, &data->x);
+        return (i1 > 0) && (i2 > 0) ? 0 : -1;
+    }
+
+    inline int serialize(FILE *fp, Offset const *data)
+    {
+        int i1, i2;
+        i1 = serialize(fp, &data->y);
+        i2 = serialize(fp, &data->x);
+        return (i1 > 0) && (i2 > 0) ? 0 : -1;
+    }
+
+    inline int deserialize(FILE *fp, int64_t *data)
+    {
+        unsigned char buf[8];
+        int64_t tmp;
+        int r = fread(buf, 8, 1, fp);
+        if (r > 0)
+        {
+            tmp = 0;
+            for (int i = 0; i < 8; ++i)
+            {
+                tmp <<= 8;
+                tmp |= buf[i];
+            }
+            *data = tmp;
+        }
+        return r;
+    }
+
+    inline int deserialize(FILE *fp, int32_t *data)
+    {
+        unsigned char buf[4];
+        int32_t tmp;
+        int r = fread(buf, 4, 1, fp);
+        if (r > 0)
+        {
+            for (int i = 0; i < 4; ++i)
+            {
+                tmp <<= 8;
+                tmp |= buf[i];
+            }
+            *data = tmp;
+        }
+        return r;
+    }
+
+    inline int deserialize(FILE *fp, int16_t *data)
+    {
+        unsigned char buf[2];
+        int32_t tmp;
+        int r = fread(buf, 2, 1, fp);
+        if (r > 0)
+        {
+            for (int i = 0; i < 2; ++i)
+            {
+                tmp <<= 8;
+                tmp |= buf[i];
+            }
+            *data = tmp;
+        }
+        return r;
+    }
+
+    inline int deserialize(FILE *fp, uint64_t *data)
+    {
+        unsigned char buf[8];
+        uint64_t tmp;
+        int r = fread(buf, 8, 1, fp);
+        if (r > 0)
+        {
+            tmp = 0;
+            for (int i = 0; i < 8; ++i)
+            {
+                tmp <<= 8;
+                tmp |= buf[i];
+            }
+            *data = tmp;
+        }
+        return r;
+    }
+
+    inline int deserialize(FILE *fp, uint32_t *data)
+    {
+        unsigned char buf[4];
+        uint32_t tmp;
+        int r = fread(buf, 4, 1, fp);
+        if (r > 0)
+        {
+            for (int i = 0; i < 4; ++i)
+            {
+                tmp <<= 8;
+                tmp |= buf[i];
+            }
+            *data = tmp;
+        }
+        return r;
+    }
+
+    inline int deserialize(FILE *fp, uint16_t *data)
+    {
+        unsigned char buf[2];
+        uint32_t tmp;
+        int r = fread(buf, 2, 1, fp);
+        if (r > 0)
+        {
+            for (int i = 0; i < 2; ++i)
+            {
+                tmp <<= 8;
+                tmp |= buf[i];
+            }
+            *data = tmp;
+        }
+        return r;
+    }
+
+    inline int deserialize(FILE *fp, Coord *data)
+    {
+        int i1, i2;
+        i1 = deserialize(fp, &data->y);
+        i2 = deserialize(fp, &data->x);
+        return (i1 > 0) && (i2 > 0) ? 0 : -1;
+    }
+
+    inline int deserialize(FILE *fp, Coord64 *data)
+    {
+        int i1, i2;
+        i1 = deserialize(fp, &data->y);
+        i2 = deserialize(fp, &data->x);
+        return (i1 > 0) && (i2 > 0) ? 0 : -1;
+    }
+
+    inline int deserialize(FILE *fp, Offset *data)
+    {
+        int i1, i2;
+        i1 = deserialize(fp, &data->y);
+        i2 = deserialize(fp, &data->x);
+        return (i1 > 0) && (i2 > 0) ? 0 : -1;
+    }
+
+    inline int deserialize(FILE *fp, Offset64 *data)
+    {
+        int i1, i2;
+        i1 = deserialize(fp, &data->y);
+        i2 = deserialize(fp, &data->x);
+        return (i1 > 0) && (i2 > 0) ? 0 : -1;
+    }
+
+}
+
+#endif
+
+// vim:ts=8:sw=4:expandtab:fo=c
+// libmormegil/serial.hh
diff --git a/man/libmormegil::serialize.3 b/man/libmormegil::serialize.3
new file mode 100644 (file)
index 0000000..0c10348
--- /dev/null
@@ -0,0 +1,22 @@
+.TH "LIBMORMEGIL::SERIAL" 3 "October 10, 2010" "libmormegil Version 1.0" "libmormegil User Manual"
+.SH NAME
+libmormegil::serialize, libmormegil::deserialize \- offsets and points on a plane
+.SH SYNOPSIS
+#include <libmormegil/serial.hh>
+
+.SH DESCRIPTION
+.I libmormegil::serialize
+is a family of overloaded functions providing host-endianness-independent
+serialization for basic integer types and the coordinate/offset types provided
+in \fIlibmormegil/Coord.hh\fP
+
+.SH CAVEATS
+
+These functions are not templatized.
+
+.SH AUTHOR
+Martin Read <mpread@chiark.greenend.org.uk>
+
+.SH SEE ALSO
+
+libmormegil(3), dice(3)