From 7cc95a79a7a4ed8fb8fb3c5e1946a59c93ff335e Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 1 Aug 2015 11:48:59 -0500 Subject: Move strlower() from find to lib. --- lib/lib.c | 35 +++++++++++++++++++++++++++++++++++ lib/lib.h | 1 + toys/posix/find.c | 35 ----------------------------------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/lib/lib.c b/lib/lib.c index 05e377f8..81c989ab 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -291,6 +291,41 @@ int stridx(char *haystack, char needle) return off-haystack; } +char *strlower(char *s) +{ + char *try, *new; + + if (!CFG_TOYBOX_I18N) { + try = new = xstrdup(s); + for (; *s; s++) *(new++) = tolower(*s); + } else { + // I can't guarantee the string _won't_ expand during reencoding, so...? + try = new = xmalloc(strlen(s)*2+1); + + while (*s) { + wchar_t c; + int len = mbrtowc(&c, s, MB_CUR_MAX, 0); + + if (len < 1) *(new++) = *(s++); + else { + s += len; + // squash title case too + c = towlower(c); + + // if we had a valid utf8 sequence, convert it to lower case, and can't + // encode back to utf8, something is wrong with your libc. But just + // in case somebody finds an exploit... + len = wcrtomb(new, c, 0); + if (len < 1) error_exit("bad utf8 %x", (int)c); + new += len; + } + } + *new = 0; + } + + return try; +} + int unescape(char c) { char *from = "\\abefnrtv", *to = "\\\a\b\033\f\n\r\t\v"; diff --git a/lib/lib.h b/lib/lib.h index 3183f32a..39212df0 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -160,6 +160,7 @@ long xstrtol(char *str, char **end, int base); long atolx(char *c); long atolx_range(char *numstr, long low, long high); int stridx(char *haystack, char needle); +char *strlower(char *s); int unescape(char c); int strstart(char **a, char *b); off_t fdlength(int fd); diff --git a/toys/posix/find.c b/toys/posix/find.c index a11a910a..99cf5e2f 100644 --- a/toys/posix/find.c +++ b/toys/posix/find.c @@ -141,41 +141,6 @@ static void do_print(struct dirtree *new, char c) free(s); } -char *strlower(char *s) -{ - char *try, *new; - - if (!CFG_TOYBOX_I18N) { - try = new = xstrdup(s); - for (; *s; s++) *(new++) = tolower(*s); - } else { - // I can't guarantee the string _won't_ expand during reencoding, so...? - try = new = xmalloc(strlen(s)*2+1); - - while (*s) { - wchar_t c; - int len = mbrtowc(&c, s, MB_CUR_MAX, 0); - - if (len < 1) *(new++) = *(s++); - else { - s += len; - // squash title case too - c = towlower(c); - - // if we had a valid utf8 sequence, convert it to lower case, and can't - // encode back to utf8, something is wrong with your libc. But just - // in case somebody finds an exploit... - len = wcrtomb(new, c, 0); - if (len < 1) error_exit("bad utf8 %x", (int)c); - new += len; - } - } - *new = 0; - } - - return try; -} - // Call this with 0 for first pass argument parsing and syntax checking (which // populates argdata). Later commands traverse argdata (in order) when they // need "do once" results. -- cgit v1.2.3