Mercurial > hg > cdb
diff cdbget.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/cdbget.c Wed Jan 29 10:50:34 2025 +0000 @@ -0,0 +1,67 @@ +#include "exit.h" +#include "scan.h" +#include "str.h" +#include "buffer.h" +#include "strerr.h" +#include "cdb.h" + +#define FATAL "cdbget: fatal: " + +void die_read(void) +{ + strerr_die2sys(111,FATAL,"unable to read input: "); +} +void die_write(void) +{ + strerr_die2sys(111,FATAL,"unable to write output: "); +} +void die_usage(void) +{ + strerr_die1x(111,"cdbget: usage: cdbget key [skip]"); +} + +static struct cdb c; +char buf[1024]; + +main(int argc,char **argv) +{ + char *key; + int r; + uint32 pos; + uint32 len; + unsigned long u = 0; + + if (!*argv) die_usage(); + + if (!*++argv) die_usage(); + key = *argv; + + if (*++argv) { + scan_ulong(*argv,&u); + } + + cdb_init(&c,0); + cdb_findstart(&c); + + for (;;) { + r = cdb_findnext(&c,key,str_len(key)); + if (r == -1) die_read(); + if (!r) _exit(100); + if (!u) break; + --u; + } + + pos = cdb_datapos(&c); + len = cdb_datalen(&c); + + while (len > 0) { + r = sizeof buf; + if (r > len) r = len; + if (cdb_read(&c,buf,r,pos) == -1) die_read(); + if (buffer_put(buffer_1small,buf,r) == -1) die_write(); + pos += r; + len -= r; + } + if (buffer_flush(buffer_1small) == -1) die_write(); + _exit(0); +}
