cdbdump.c
changeset 0 eeadadee24f6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cdbdump.c	Fri Oct 19 11:01:15 2007 +0200
@@ -0,0 +1,83 @@
+#include "uint32.h"
+#include "fmt.h"
+#include "buffer.h"
+#include "strerr.h"
+
+#define FATAL "cdbdump: fatal: "
+
+void die_write(void)
+{
+  strerr_die2sys(111,FATAL,"unable to write output: ");
+}
+void put(char *buf,unsigned int len)
+{
+  if (buffer_put(buffer_1,buf,len) == -1) die_write();
+}
+void putflush(void)
+{
+  if (buffer_flush(buffer_1) == -1) die_write();
+}
+
+uint32 pos = 0;
+
+void get(char *buf,unsigned int len)
+{
+  int r;
+  while (len > 0) {
+    r = buffer_get(buffer_0,buf,len);
+    if (r == -1)
+      strerr_die2sys(111,FATAL,"unable to read input: ");
+    if (r == 0)
+      strerr_die2x(111,FATAL,"unable to read input: truncated file");
+    pos += r;
+    buf += r;
+    len -= r;
+  }
+}
+
+char buf[512];
+
+void copy(uint32 len)
+{
+  unsigned int x;
+
+  while (len) {
+    x = sizeof buf;
+    if (len < x) x = len;
+    get(buf,x);
+    put(buf,x);
+    len -= x;
+  }
+}
+
+void getnum(uint32 *num)
+{
+  get(buf,4);
+  uint32_unpack(buf,num);
+}
+
+char strnum[FMT_ULONG];
+
+main()
+{
+  uint32 eod;
+  uint32 klen;
+  uint32 dlen;
+
+  getnum(&eod);
+  while (pos < 2048) getnum(&dlen);
+
+  while (pos < eod) {
+    getnum(&klen);
+    getnum(&dlen);
+    put("+",1); put(strnum,fmt_ulong(strnum,klen));
+    put(",",1); put(strnum,fmt_ulong(strnum,dlen));
+    put(":",1); copy(klen);
+    put("->",2); copy(dlen);
+    put("\n",1);
+  }
+
+  put("\n",1);
+  putflush();
+  _exit(0);
+}