aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2024-02-05 21:40:00 -0600
committerDenis Kenzior <denkenz@gmail.com>2024-02-05 22:02:03 -0600
commit86c28534cd47934fcee63bbad80c64e1e1a47392 (patch)
tree947f5067d1ec44ff44e47c1eacb0e3294b7b93c5
parentd8a703340f1ea32a65af44fb1407acf55523628c (diff)
utf8: Add l_ascii_strup
-rw-r--r--ell/ell.sym1
-rw-r--r--ell/utf8.c32
-rw-r--r--ell/utf8.h1
3 files changed, 34 insertions, 0 deletions
diff --git a/ell/ell.sym b/ell/ell.sym
index a7fdbb90..2c207d60 100644
--- a/ell/ell.sym
+++ b/ell/ell.sym
@@ -50,6 +50,7 @@ global:
/* utf8 */
l_ascii_table;
l_ascii_strdown;
+ l_ascii_strup;
l_utf8_get_codepoint;
l_utf8_validate;
l_utf8_strlen;
diff --git a/ell/utf8.c b/ell/utf8.c
index 4f33f557..5bf6b070 100644
--- a/ell/utf8.c
+++ b/ell/utf8.c
@@ -75,6 +75,38 @@ LIB_EXPORT char *l_ascii_strdown(const char *str, ssize_t len)
return ret;
}
+/**
+ * l_ascii_strup
+ * @str: a pointer to an ASCII string
+ * @len: maximum bytes to process or negative if string is null terminated
+ *
+ * Returns: Newly allocated string with all lower case characters converted
+ * to upper case.
+ **/
+LIB_EXPORT char *l_ascii_strup(const char *str, ssize_t len)
+{
+ size_t slen;
+ size_t i;
+ char *ret;
+
+ if (!str)
+ return NULL;
+
+ if (len < 0)
+ slen = strlen(str);
+ else
+ slen = minsize(strlen(str), (size_t) len);
+
+ ret = l_malloc(slen + 1);
+
+ for (i = 0; i < slen; i++)
+ ret[i] = l_ascii_toupper(str[i]);
+
+ ret[i] = '\0';
+
+ return ret;
+}
+
static inline bool __attribute__ ((always_inline))
valid_unicode(wchar_t c)
{
diff --git a/ell/utf8.h b/ell/utf8.h
index 092e70f6..a1dd40b3 100644
--- a/ell/utf8.h
+++ b/ell/utf8.h
@@ -104,6 +104,7 @@ static inline __attribute__ ((always_inline)) char l_ascii_tolower(char c)
}
char *l_ascii_strdown(const char *str, ssize_t len);
+char *l_ascii_strup(const char *str, ssize_t len);
bool l_utf8_validate(const char *src, size_t len, const char **end);
size_t l_utf8_strlen(const char *str);