summaryrefslogtreecommitdiff
path: root/lib/lib.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2015-08-01 11:48:59 -0500
committerRob Landley <rob@landley.net>2015-08-01 11:48:59 -0500
commit7cc95a79a7a4ed8fb8fb3c5e1946a59c93ff335e (patch)
tree938eb6c27ee5be9f2d5892ad0236024dd75c8f2d /lib/lib.c
parentce4188fd1228c8037d1f059cf24a066941c26501 (diff)
downloadtoybox-7cc95a79a7a4ed8fb8fb3c5e1946a59c93ff335e.tar.gz
toybox-7cc95a79a7a4ed8fb8fb3c5e1946a59c93ff335e.tar.bz2
toybox-7cc95a79a7a4ed8fb8fb3c5e1946a59c93ff335e.zip
Move strlower() from find to lib.
Diffstat (limited to 'lib/lib.c')
-rw-r--r--lib/lib.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 05e377f..81c989a 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";