plan9port

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

commit f0bd771b3a03309ea3ba0bff0c8bba377bc1afa9
parent c2ceb1af3cd9615eb23ed21332892bd5223c70c6
Author: ssnf <ssnf@ssnf.xyz>
Date:   Thu, 28 Aug 2025 19:20:38 +0000

sdbrval

Diffstat:
Mman/man1/sdb.1 | 7++++++-
Msrc/cmd/sdb/sdbrval.c | 34+++++++++++++++++++++++++++++++---
2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/man/man1/sdb.1 b/man/man1/sdb.1 @@ -56,7 +56,7 @@ sdbquery, sdbedit, sdbjoin, sdbmap, sdbpretty, sdbrval, sdbuniq \- simple databa .br .B sdbrval [ -.B -am +.B -amt ] .I attr \&... @@ -155,6 +155,11 @@ it prints attribute names and values in the form With .BR -m , it uses pattern matching to select attributes. +With +.BR -t , +it uses minimal escaping that only handles essential +tab-separated format requirements (escaping tabs, newlines, and +backslashes) rather than full SDB format escaping. It reads from standard input and prints tab-separated values for each record. .PP .I Sdbuniq diff --git a/src/cmd/sdb/sdbrval.c b/src/cmd/sdb/sdbrval.c @@ -1,11 +1,36 @@ #include "std.h" +static char* escape(String*, String); static void print_col(Sdbr*, char*); static String val; static String ln; static char *fmt = "%.0s%s"; static void (*print_fn)(Sdbr*, char*) = print_col; +static char* (*escapefn)(String*, String) = sdbr_escape; + +static char* +escape(String *s, String val) +{ + ulong i; + char c; + + Strzero(s); + for (i = 0; i < val.n; ++i) { + c = val.s[i]; + switch (c) { + case '\t': c = 't'; break; + case '\n': c = 'n'; break; + case '\\': c = '\\'; break; + default: + Straddc(s, c); + continue; + } + Straddc(s, '\\'); + Straddc(s, c); + } + return s->s; +} static void print_col(Sdbr *r, char *attr) @@ -19,7 +44,7 @@ print_col(Sdbr *r, char *attr) Strprint(&ln, fmt, attr, ""); return; } - sdbr_escape(&val, r->val[n]); + escapefn(&val, r->val[n]); Strprint(&ln, fmt, r->attr[n].s, val.s); } @@ -33,7 +58,7 @@ print_match(Sdbr *r, char *attr) continue; if (ln.n) Straddc(&ln, '\t'); - sdbr_escape(&val, r->val[i]); + escapefn(&val, r->val[i]); Strprint(&ln, fmt, r->attr[i].s, val.s); } } @@ -41,7 +66,7 @@ print_match(Sdbr *r, char *attr) static void usage(void) { - fprint(2, "sdbrval: [-am] attr ...\n"); + fprint(2, "sdbrval: [-amt] attr ...\n"); exits("usage"); } @@ -59,6 +84,9 @@ main(int argc, char *argv[]) case 'm': print_fn = print_match; break; + case 't': + escapefn = escape; + break; default: usage(); } ARGEND;