plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }