-rw-r--r-- 1699 cdb-20251021/cdbdump.c raw
#include <unistd.h> #include "inbuf.h" #include "outbuf.h" #include "strerr.h" #include "cdb.h" #ifdef CDB64 #define FATAL "cdb64dump: fatal: " #else #define FATAL "cdbdump: fatal: " #endif static void die_write(void) { strerr_die2sys(111,FATAL,"unable to write output: "); } static void put(char *buf,num len) { if (outbuf_put(outbuf_1,buf,len) == -1) die_write(); } static void putflush(void) { if (outbuf_flush(outbuf_1) == -1) die_write(); } static num pos = 0; static void get(char *buf,num len) { num r; while (len > 0) { r = inbuf_get(inbuf_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; } } static char buf[512]; static void copy(num len) { num x; while (len > 0) { x = sizeof buf; if (len < x) x = len; get(buf,x); put(buf,x); len -= x; } } static num getnum(void) { num result; get(buf,CDB_NUMBYTES); result = cdb_unpacknum(buf); if (result < 0 || result > CDB_LIMIT) strerr_die2x(111,FATAL,"unable to read input: malformatted file"); return result; } static char strnum[NUM_TOSTRING_NONNEG]; int main(int argc,char **argv) { num eod; num klen; num dlen; eod = getnum(); while (pos < 256*2*CDB_NUMBYTES) dlen = getnum(); while (pos < eod) { klen = getnum(); dlen = getnum(); put("+",1); put(strnum,num_tostring_nonneg(strnum,klen)); put(",",1); put(strnum,num_tostring_nonneg(strnum,dlen)); put(":",1); copy(klen); put("->",2); copy(dlen); put("\n",1); } put("\n",1); putflush(); _exit(0); return 0; }