summaryrefslogtreecommitdiffstats
path: root/cdbdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'cdbdump.c')
-rw-r--r--cdbdump.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/cdbdump.c b/cdbdump.c
new file mode 100644
index 0000000..159d7e7
--- /dev/null
+++ b/cdbdump.c
@@ -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);
+}