summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/utf8.c34
-rw-r--r--src/core/utf8.h9
2 files changed, 43 insertions, 0 deletions
diff --git a/src/core/utf8.c b/src/core/utf8.c
index c9303d19..7c75c374 100644
--- a/src/core/utf8.c
+++ b/src/core/utf8.c
@@ -55,3 +55,37 @@ int string_policy(const char *str)
}
return TREAT_STRING_AS_BYTES;
}
+
+int string_length(const char *str, int policy)
+{
+ g_return_val_if_fail(str != NULL, 0);
+
+ if (policy == -1) {
+ policy = string_policy(str);
+ }
+
+ if (policy == TREAT_STRING_AS_UTF8) {
+ return g_utf8_strlen(str, -1);
+ }
+ else {
+ /* Assume TREAT_STRING_AS_BYTES: */
+ return strlen(str);
+ }
+}
+
+int string_width(const char *str, int policy)
+{
+ int len;
+
+ g_return_val_if_fail(str != NULL, 0);
+
+ if (policy == -1) {
+ policy = string_policy(str);
+ }
+
+ len = 0;
+ while (*str != '\0') {
+ len += string_advance(&str, policy);
+ }
+ return len;
+}
diff --git a/src/core/utf8.h b/src/core/utf8.h
index f1a8f0e1..6f02c5a0 100644
--- a/src/core/utf8.h
+++ b/src/core/utf8.h
@@ -33,6 +33,15 @@ int string_advance(char const **str, int policy);
*/
int string_policy(const char *str);
+/* Return the length of the str string according to the given policy; if policy
+ * is -1, this function will call string_policy().
+ */
+int string_length(const char *str, int policy);
+/* Return the screen width of the str string according to the given policy; if
+ * policy is -1, this function will call string_policy().
+ */
+int string_width(const char *str, int policy);
+
#define unichar_isprint(c) (((c) & ~0x80) >= 32)
#define is_utf8_leading(c) (((c) & 0xc0) != 0x80)