comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:2cb46628feec
1 #include "exit.h"
2 #include "scan.h"
3 #include "str.h"
4 #include "buffer.h"
5 #include "strerr.h"
6 #include "cdb.h"
7
8 #define FATAL "cdbget: fatal: "
9
10 void die_read(void)
11 {
12 strerr_die2sys(111,FATAL,"unable to read input: ");
13 }
14 void die_write(void)
15 {
16 strerr_die2sys(111,FATAL,"unable to write output: ");
17 }
18 void die_usage(void)
19 {
20 strerr_die1x(111,"cdbget: usage: cdbget key [skip]");
21 }
22
23 static struct cdb c;
24 char buf[1024];
25
26 main(int argc,char **argv)
27 {
28 char *key;
29 int r;
30 uint32 pos;
31 uint32 len;
32 unsigned long u = 0;
33
34 if (!*argv) die_usage();
35
36 if (!*++argv) die_usage();
37 key = *argv;
38
39 if (*++argv) {
40 scan_ulong(*argv,&u);
41 }
42
43 cdb_init(&c,0);
44 cdb_findstart(&c);
45
46 for (;;) {
47 r = cdb_findnext(&c,key,str_len(key));
48 if (r == -1) die_read();
49 if (!r) _exit(100);
50 if (!u) break;
51 --u;
52 }
53
54 pos = cdb_datapos(&c);
55 len = cdb_datalen(&c);
56
57 while (len > 0) {
58 r = sizeof buf;
59 if (r > len) r = len;
60 if (cdb_read(&c,buf,r,pos) == -1) die_read();
61 if (buffer_put(buffer_1small,buf,r) == -1) die_write();
62 pos += r;
63 len -= r;
64 }
65 if (buffer_flush(buffer_1small) == -1) die_write();
66 _exit(0);
67 }