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 }