diff options
-rw-r--r-- | src/core/utf8.c | 13 | ||||
-rw-r--r-- | src/core/utf8.h | 14 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/core/utf8.c b/src/core/utf8.c index 1daaf03f..d931ba19 100644 --- a/src/core/utf8.c +++ b/src/core/utf8.c @@ -25,6 +25,8 @@ #include "utf8.h" #include "module.h" #include "wcwidth.c" +/* Provide is_utf8(): */ +#include "recode.h" int string_advance(char const **str, gboolean utf8) { @@ -41,3 +43,14 @@ int string_advance(char const **str, gboolean utf8) return 1; } } + +int string_policy(const char *str) +{ + if (is_utf8()) { + if (!str || g_utf8_validate(str, -1, NULL)) { + /* No string provided or valid UTF-8 string: treat as UTF-8: */ + return TREAT_STRING_AS_UTF8; + } + } + return TREAT_STRING_AS_BYTES; +} diff --git a/src/core/utf8.h b/src/core/utf8.h index 50ee0886..fa11b737 100644 --- a/src/core/utf8.h +++ b/src/core/utf8.h @@ -19,6 +19,20 @@ int mk_wcwidth(unichar c); */ int string_advance(char const **str, gboolean utf8); +/* TREAT_STRING_AS_BYTES means strings are to be treated using strncpy, + * strnlen, etc. + * TREAT_STRING_AS_UTF8 means strings are to be treated using g_utf8_* + * functions. + */ +#define TREAT_STRING_AS_BYTES 0 +#define TREAT_STRING_AS_UTF8 1 + +/* Return how the str string ought to be treated: TREAT_STRING_AS_UTF8 if the + * terminal handles UTF-8 and if the string appears to be a valid UTF-8 string; + * TREAT_STRING_AS_BYTES otherwise. + */ +int string_policy(const char *str); + #define unichar_isprint(c) (((c) & ~0x80) >= 32) #define is_utf8_leading(c) (((c) & 0xc0) != 0x80) |