sdbmap.c (904B)
1 #include "std.h" 2 3 static void usage(void); 4 5 static char* file; 6 static char* key; 7 8 static void 9 usage(void) 10 { 11 fprint(2, "sdbmap: [-k attr] [-f file0] file attr0 attr1\n"); 12 exits("usage"); 13 } 14 15 void 16 main(int argc, char* argv[]) 17 { 18 Sdb db, map; 19 Sdbr r; 20 String p; 21 22 ARGBEGIN { 23 case 'f': 24 file = EARGF(usage()); 25 break; 26 case 'k': 27 key = EARGF(usage()); 28 break; 29 default: 30 usage(); 31 } ARGEND; 32 if (argc < 3) 33 usage(); 34 sdb_open(&db, file); 35 sdb_open(&map, *argv++); 36 if (!key) 37 key = argv[0]; 38 sdbr_init(&r); 39 for (;sdb_next(&db);) { 40 p = sdbr_val(db.r[db.n], argv[0]); 41 if (!p.s) 42 goto print; 43 sdb_rewind(&map); 44 sdbr_zero(&r); 45 sdbr_add(&r, Str(key), p); 46 if (!sdb_query(&map, r)) 47 goto print; 48 p = sdbr_val(map.r[map.n], argv[1]); 49 if (!p.s) 50 goto print; 51 sdbr_zero(&r); 52 sdbr_add(&r, Str(argv[0]), p); 53 sdbr_edit(db.r + db.n, r); 54 print: 55 sdbr_print(db.r[db.n]); 56 } 57 exits(0); 58 }