16 extern char *strchr();
22 static char *usage = "%s [-R] cat | look |... dbmname";
43 "fetch", DLOOK, O_RDONLY,
44 "get", DLOOK, O_RDONLY,
45 "look", DLOOK, O_RDONLY,
46 "add", DINSERT, O_RDWR,
47 "insert", DINSERT, O_RDWR,
48 "store", DINSERT, O_RDWR,
49 "delete", DDELETE, O_RDWR,
50 "remove", DDELETE, O_RDWR,
51 "dump", DCAT, O_RDONLY,
52 "list", DCAT, O_RDONLY,
53 "cat", DCAT, O_RDONLY,
54 "creat", DCREAT, O_RDWR | O_CREAT | O_TRUNC,
55 "new", DCREAT, O_RDWR | O_CREAT | O_TRUNC,
56 "build", DBUILD, O_RDWR | O_CREAT,
57 "squash", DPRESS, O_RDWR,
58 "compact", DPRESS, O_RDWR,
59 "compress", DPRESS, O_RDWR
62 #define CTABSIZ (sizeof (cmds)/sizeof (cmd))
65 static void badk(), doit(), prdatum();
68 main(int argc, char **argv)
77 while ((c = getopt(argc, argv, "R")) != EOF)
79 case 'R': /* raw processing */
84 oops("usage: %s", usage);
88 if ((argc -= optind) < 2)
89 oops("usage: %s", usage);
91 if ((act = parse(argv[optind])) == NULL)
94 doit(act, argv[optind]);
99 doit(register cmd *act, char *file)
112 if ((db = dbm_open(file, act->flags, 0644)) == NULL)
113 oops("cannot open: %s", file);
115 if ((line = (char *) malloc(LINEMAX)) == NULL)
116 oops("%s: cannot get memory", "line alloc");
118 switch (act->scode) {
121 while (fgets(line, LINEMAX, stdin) != NULL) {
122 n = strlen(line) - 1;
126 val = dbm_fetch(db, key);
127 if (val.dptr != NULL) {
128 prdatum(stdout, val);
132 prdatum(stderr, key);
133 fprintf(stderr, ": not found.\n");
139 while (fgets(line, LINEMAX, stdin) != NULL) {
140 n = strlen(line) - 1;
144 if (dbm_delete(db, key) == -1) {
145 prdatum(stderr, key);
146 fprintf(stderr, ": not found.\n");
151 for (key = dbm_firstkey(db); key.dptr != 0;
152 key = dbm_nextkey(db)) {
153 prdatum(stdout, key);
155 prdatum(stdout, dbm_fetch(db, key));
163 while (fgets(line, LINEMAX, stdin) != NULL) {
164 n = strlen(line) - 1;
167 if ((op = strchr(line, '\t')) != 0) {
168 key.dsize = op - line;
171 val.dsize = line + n - op;
174 oops("bad input; %s", line);
176 if (dbm_store(db, key, val, DBM_REPLACE) < 0) {
177 prdatum(stderr, key);
178 fprintf(stderr, ": ");
179 oops("store: %s", "failed");
183 printf("done: %d seconds.\n", time(0) - start);
201 fprintf(stderr, "%s: ", progname);
202 fprintf(stderr, "bad keywd %s. use one of\n", word);
203 for (i = 0; i < (int)CTABSIZ; i++)
204 fprintf(stderr, "%-8s%c", cmds[i].sname,
205 ((i + 1) % 6 == 0) ? '\n' : ' ');
206 fprintf(stderr, "\n");
212 parse(register char *str)
214 register int i = CTABSIZ;
217 for (p = cmds; i--; p++)
218 if (strcmp(p->sname, str) == 0)
224 prdatum(FILE *stream, datum d)
227 register char *p = d.dptr;
228 register int n = d.dsize;
233 fprintf(stream, "M-");
236 if (c == 0177 || c < ' ')
237 fprintf(stream, "^%c", (c == 0177) ? '?' : c + '@');