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 }