aboutsummaryrefslogtreecommitdiff
path: root/toys/posix
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2019-08-31 21:27:55 -0700
committerRob Landley <rob@landley.net>2019-09-04 16:12:57 -0500
commit8a5e89bccf04d2d838f96bb063fb3f84f73f980f (patch)
tree632ec096a6dac78f3f0a07a6a6ef9715f10e51a0 /toys/posix
parent2a1b31b92a84b23f7e3ddc5b47930acb95df5486 (diff)
downloadtoybox-8a5e89bccf04d2d838f96bb063fb3f84f73f980f.tar.gz
find: support -printf \0 octal escapes and \c.
I think when I wrote this I tested the named escapes like \n and hex escapes, and when I found \x wasn't supported I didn't even think of octal. And I only learned about \c when I was looking at echo and printf to compare their escape implementations a few weeks back. Add the missing escapes and corresponding tests. Fixes #139.
Diffstat (limited to 'toys/posix')
-rw-r--r--toys/posix/find.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/toys/posix/find.c b/toys/posix/find.c
index 3317448a..64270c00 100644
--- a/toys/posix/find.c
+++ b/toys/posix/find.c
@@ -569,7 +569,15 @@ static int do_find(struct dirtree *new)
if (check) for (fmt = ss[1]; *fmt; fmt++) {
// Print the parts that aren't escapes
if (*fmt == '\\') {
- if (!(ch = unescape(*++fmt))) error_exit("bad \\%c", *fmt);
+ int slash = *++fmt, n = unescape(slash);
+
+ if (n) ch = n;
+ else if (slash=='c') break;
+ else if (slash=='0') {
+ ch = 0;
+ while (*fmt>='0' && *fmt<='7' && n++<3) ch=(ch*8)+*(fmt++)-'0';
+ --fmt;
+ } else error_exit("bad \\%c", *fmt);
putchar(ch);
} else if (*fmt != '%') putchar(*fmt);
else if (*++fmt == '%') putchar('%');