summaryrefslogtreecommitdiff
path: root/lib
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
parentce4188fd1228c8037d1f059cf24a066941c26501 (diff)
downloadtoybox-7cc95a79a7a4ed8fb8fb3c5e1946a59c93ff335e.tar.gz
toybox-7cc95a79a7a4ed8fb8fb3c5e1946a59c93ff335e.tar.bz2
toybox-7cc95a79a7a4ed8fb8fb3c5e1946a59c93ff335e.zip
Move strlower() from find to lib.
Diffstat (limited to 'lib')
-rw-r--r--lib/lib.c35
-rw-r--r--lib/lib.h1
2 files changed, 36 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";
diff --git a/lib/lib.h b/lib/lib.h
index 3183f32..39212df 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);