Mercurial > hg > cdb
diff cdbdump.c @ 0:2cb46628feec
from cdb-0.75 per http://cr.yp.to/cdb.html,
retrieved 2025-01-03,
contents appear to have been create on 2000-02-19
| author | Henry S. Thompson <ht@inf.ed.ac.uk> |
|---|---|
| date | Wed, 29 Jan 2025 10:50:34 +0000 |
| parents | |
| children | 3bfef1f22a97 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cdbdump.c Wed Jan 29 10:50:34 2025 +0000 @@ -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); +}
