+/**************************************************************************************************
+ * marshalling functions
+ **************************************************************************************************/
+
+static uint64_t sl_pack_tag(uint16_t type, uint16_t size, uint32_t val)
+{
+ uint64_t tag = ((uint64_t)val << 32) | ((uint64_t)type << 16) | size;
+ return tag;
+}
+
+static int sl_pack_float(double d, char **buf, int *buf_len, char **toc_buf, int *toc_len, int *toc_idx)
+{
+ union {
+ double d;
+ uint64_t w;
+ } ieee_fp_union;
+
+ SLVAL(*buf, 0, sl_pack_tag(SQ_TYPE_FLOAT, 2, 1));
+ SLVAL(*buf, 8, ieee_fp_union.w);
+ *buf += 2 * sizeof(uint64_t);
+ buf_len += 2 * sizeof(uint64_t);
+
+ return 0;
+}
+
+static int sl_pack_uint64(uint64_t u, char **buf, int *buf_len, char **toc_buf, int *toc_len, int *toc_idx)
+{
+ SLVAL(*buf, 0, sl_pack_tag(SQ_TYPE_INT64, 2, 1));
+ SLVAL(*buf, 8, u);
+ *buf += 2 * sizeof(uint64_t);
+ *buf_len += 2 * sizeof(uint64_t);
+}
+
+/**************************************************************************************************
+ * unmarshalling functions
+ **************************************************************************************************/
+
+static uint64_t sl_unpack_uint64(const char *buf, int offset, uint encoding)
+{
+ if (encoding == SL_ENC_LITTLE_ENDIAN)
+ return LVAL(buf, offset);
+ else
+ return RLVAL(buf, offset);
+}
+
+static int sl_unpack_ints(DALLOC_CTX *query, const char *buf, int offset, uint encoding)