aboutsummaryrefslogtreecommitdiff
path: root/toys
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2020-04-13 19:45:09 -0500
committerRob Landley <rob@landley.net>2020-04-13 19:45:09 -0500
commit71ae0e1617218820f405bbf79d5d5dc89d5772ee (patch)
treeb21f46c1a3258b4d5564748374d4291902406e9b /toys
parent64aa0f9c06c4215f64f6385d0afe38f02effd888 (diff)
downloadtoybox-71ae0e1617218820f405bbf79d5d5dc89d5772ee.tar.gz
Add unescape2(), migrate some unescape() users over.
Diffstat (limited to 'toys')
-rw-r--r--toys/posix/echo.c46
-rw-r--r--toys/posix/find.c16
2 files changed, 14 insertions, 48 deletions
diff --git a/toys/posix/echo.c b/toys/posix/echo.c
index c78c2c01..b546e94b 100644
--- a/toys/posix/echo.c
+++ b/toys/posix/echo.c
@@ -41,12 +41,10 @@ config ECHO
void echo_main(void)
{
- int i = 0, out;
- char *arg, *c;
+ int i = 0;
+ char *arg, *c, out[8];
- for (;;) {
- arg = toys.optargs[i];
- if (!arg) break;
+ while ((arg = toys.optargs[i])) {
if (i++) putchar(' ');
// Should we output arg verbatim?
@@ -58,40 +56,12 @@ void echo_main(void)
// Handle -e
- for (c = arg;;) {
- if (!(out = *(c++))) break;
+ for (c = arg; *c; ) {
+ unsigned u;
- // handle \escapes
- if (out == '\\' && *c) {
- int slash = *(c++), n = unescape(slash);
-
- if (n) out = n;
- else if (slash=='c') return;
- else if (slash=='0') {
- out = 0;
- while (*c>='0' && *c<='7' && n++<3) out = (out*8)+*(c++)-'0';
- } else if (slash=='x') {
- out = 0;
- while (n++<2) {
- if (*c>='0' && *c<='9') out = (out*16)+*(c++)-'0';
- else {
- int temp = tolower(*c);
- if (temp>='a' && temp<='f') {
- out = (out*16)+temp-'a'+10;
- c++;
- } else {
- if (n==1) {
- --c;
- out = '\\';
- }
- break;
- }
- }
- }
- // Slash in front of unknown character, print literal.
- } else c--;
- }
- putchar(out);
+ if (*c == '\\' && c[1] == 'c') return;
+ if ((u = unescape2(&c, 1))<128) putchar(u);
+ else printf("%.*s", (int)wcrtomb(out, u, 0), out);
}
}
diff --git a/toys/posix/find.c b/toys/posix/find.c
index 3fb97b1c..9b688d46 100644
--- a/toys/posix/find.c
+++ b/toys/posix/find.c
@@ -585,16 +585,12 @@ static int do_find(struct dirtree *new)
if (check) for (fmt = ss[1]; *fmt; fmt++) {
// Print the parts that aren't escapes
if (*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);
+ unsigned u;
+
+ if (fmt[1] == 'c') break;
+ if ((u = unescape2(&fmt, 0))<128) putchar(u);
+ else printf("%.*s", (int)wcrtomb(buf, u, 0), buf);
+ fmt--;
} else if (*fmt != '%') putchar(*fmt);
else if (*++fmt == '%') putchar('%');
else {