commit f0bd771b3a03309ea3ba0bff0c8bba377bc1afa9
parent c2ceb1af3cd9615eb23ed21332892bd5223c70c6
Author: ssnf <ssnf@ssnf.xyz>
Date: Thu, 28 Aug 2025 19:20:38 +0000
sdbrval
Diffstat:
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;