plan9port

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

sdbrval.c (1764B)


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