]> mj.ucw.cz Git - libucw.git/commitdiff
macros and inline functions for generating V33 buckets
authorRobert Spalek <robert@ucw.cz>
Mon, 28 Jun 2004 09:49:29 +0000 (09:49 +0000)
committerRobert Spalek <robert@ucw.cz>
Mon, 28 Jun 2004 09:49:29 +0000 (09:49 +0000)
lib/obj2buck.h [new file with mode: 0644]

diff --git a/lib/obj2buck.h b/lib/obj2buck.h
new file mode 100644 (file)
index 0000000..6f7b335
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ *     Generating V33 buckets
+ *
+ *     (c) 2004, Robert Spalek <robert@ucw.cz>
+ */
+
+#define        WRITE_V33(ptr, type, text, len) ({\
+  uns _len = len;              \
+  PUT_UTF8(ptr, _len+1);       \
+  memcpy(ptr, text, _len);     \
+  ptr += _len;                 \
+  *ptr++ = type;               \
+})
+
+#define        PUTS_V33(ptr, type, text)       WRITE_V33(ptr, type, text, strlen(text))
+
+#define        VPRINTF_V33(ptr, type, mask, va)        ({\
+  uns _len = vsprintf(ptr+1, mask, va) + 1;    \
+  *ptr = _len;                 \
+  ptr += _len;                 \
+  *ptr++ = type;               \
+})     // requires _len < 127 !
+
+#define        PRINTF_V33(ptr, type, mask...)  ({\
+  uns _len = sprintf(ptr+1, mask) + 1; \
+  *ptr = _len;                 \
+  ptr += _len;                 \
+  *ptr++ = type;               \
+})     // requires _len < 127 !
+
+#define        PUTL_V33(ptr, type, num)        PRINTF_V33(ptr, type, "%d", num)
+
+#include "charset/unistream.h"
+
+static inline void
+bwrite_v33(struct fastbuf *b, uns type, byte *text, uns len)
+{
+  bput_utf8(b, len+1);
+  bwrite(b, text, len);
+  bputc(b, type);
+}
+
+static inline void
+bputs_v33(struct fastbuf *b, uns type, byte *text)
+{
+  bwrite_v33(b, type, text, strlen(text));
+}
+
+#include <stdarg.h>
+
+static void UNUSED
+bprintf_v33(struct fastbuf *b, uns type, byte *mask, ...)
+  /* requires _len < 127 ! */
+{
+  byte *ptr;
+  if (bdirect_write_prepare(b, &ptr) < 130)
+  {
+    bflush(b);
+    bdirect_write_prepare(b, &ptr);
+  }
+  va_list va;
+  va_start(va, mask);
+  VPRINTF_V33(ptr, type, mask, va);
+  bdirect_write_commit(b, ptr);
+}
+
+static inline void
+bputl_v33(struct fastbuf *b, uns type, uns num)
+{
+  byte *ptr;
+  if (bdirect_write_prepare(b, &ptr) < 20)
+  {
+    bflush(b);
+    bdirect_write_prepare(b, &ptr);
+  }
+  PUTL_V33(ptr, type, num);
+  bdirect_write_commit(b, ptr);
+}