plan9port

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

sdbrval.c (1670B)


      1 #include "std.h"
      2 
      3 static char* escape(String*, String);
      4 static void print_col(Sdbr*, char*);
      5 
      6 static String val;
      7 static String ln;
      8 static char *fmt = "%.0s%s";
      9 static void (*print_fn)(Sdbr*, char*) = print_col;
     10 static char* (*escapefn)(String*, String) = sdbr_escape;
     11 
     12 static char*
     13 escape(String *s, String val)
     14 {
     15 	ulong i;
     16 	char c;
     17 
     18 	Strzero(s);
     19 	for (i = 0; i < val.n; ++i) {
     20 		c = val.s[i];
     21 		switch (c) {
     22 		case '\t': c = 't'; break;
     23 		case '\n': c = 'n'; break;
     24 		case '\\': c = '\\'; break;
     25 		default:
     26 			Straddc(s, c);
     27 			continue;
     28 		}
     29 		Straddc(s, '\\');
     30 		Straddc(s, c);
     31 	}
     32 	return s->s;
     33 }
     34 
     35 static void
     36 print_col(Sdbr *r, char *attr)
     37 {
     38 	int n;
     39 
     40 	if (ln.n)
     41 		Straddc(&ln, '\t');
     42 	n = sdbr_attr(*r, attr);
     43 	if (n < 0) {
     44 		Strprint(&ln, fmt, attr, "");
     45 		return;
     46 	}
     47 	escapefn(&val, r->val[n]);
     48 	Strprint(&ln, fmt, r->attr[n].s, val.s);
     49 }
     50 
     51 static void
     52 print_match(Sdbr *r, char *attr)
     53 {
     54 	ulong i;
     55 
     56 	for (i = 0; i < sdbr_n(*r); ++i) {
     57 		if (!sdbr_match(attr, r->attr[i].s))
     58 			continue;
     59 		if (ln.n)
     60 			Straddc(&ln, '\t');
     61 		escapefn(&val, r->val[i]);
     62 		Strprint(&ln, fmt, r->attr[i].s, val.s);
     63 	}
     64 }
     65 
     66 static void
     67 usage(void)
     68 {
     69 	fprint(2, "sdbrval: [-amt] attr ...\n");
     70 	exits("usage");
     71 }
     72 
     73 void
     74 main(int argc, char *argv[])
     75 {
     76 	Sdb db;
     77 	Sdbr *r;
     78 	ulong n;
     79 
     80 	ARGBEGIN {
     81 	case 'a':
     82 		fmt = "%s=%s";
     83 		break;
     84 	case 'm':
     85 		print_fn = print_match;
     86 		break;
     87 	case 't':
     88 		escapefn = escape;
     89 		break;
     90 	default:
     91 		usage();
     92 	} ARGEND;
     93 	if (argc < 1)
     94 		usage();
     95 	Strinit(&val);
     96 	Strinit(&ln);
     97 	sdb_open(&db, nil);
     98 	for (;sdb_next(&db);) {
     99 		r = db.r + db.n;
    100 		Strzero(&ln);
    101 		for (n = 0; n < argc; ++n)
    102 			print_fn(r, argv[n]);
    103 		if (ln.n)
    104 			print("%s\n", ln.s);
    105 	}
    106 	exits(0);
    107 }