diff options
author | Lukas Fleischer <lfleischer@calcurse.org> | 2017-08-30 16:17:28 +0200 |
---|---|---|
committer | Lukas Fleischer <lfleischer@calcurse.org> | 2017-08-30 16:17:28 +0200 |
commit | 273e32d43d72086ed9b0eeae9e83b2689b0f6154 (patch) | |
tree | 1feb05944eb9dc069b64cc328b3225fad8ed9dc8 /src | |
parent | 6cb26c2f27020e52053b1f1b7e611dc4e657cd99 (diff) | |
download | calcurse-273e32d43d72086ed9b0eeae9e83b2689b0f6154.tar.gz calcurse-273e32d43d72086ed9b0eeae9e83b2689b0f6154.zip |
Factor out UTF-8 code point decoding
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/calcurse.h | 1 | ||||
-rw-r--r-- | src/utf8.c | 31 |
2 files changed, 16 insertions, 16 deletions
diff --git a/src/calcurse.h b/src/calcurse.h index 7abeb03..c5ad2fe 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -1099,6 +1099,7 @@ int ui_todo_get_view(void); void ui_todo_set_view(int); /* utf8.c */ +int utf8_ord(const char *); int utf8_width(char *); int utf8_strwidth(char *); int utf8_chop(char *, int); @@ -269,43 +269,42 @@ static const struct utf8_range utf8_widthtab[] = { {0xe0100, 0xe01ef, 0} }; -/* Get the width of a UTF-8 character. */ -int utf8_width(char *s) +/* Decode a UTF-8 code point. */ +int utf8_ord(const char *s) { - int val, low, high, cur; - if (UTF8_ISCONT(*s)) return 0; switch (UTF8_LENGTH(*s)) { case 1: - val = s[0]; - break; + return s[0]; case 2: - val = (s[1] & 0x3f) | (s[0] & 0x1f) << 6; - break; + return (s[1] & 0x3f) | (s[0] & 0x1f) << 6; case 3: - val = ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) | + return ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) | (s[0] & 0x0f) << 12; - break; case 4: - val = (((s[3] & 0x3f) | (s[2] & 0x3f) << 6) | + return (((s[3] & 0x3f) | (s[2] & 0x3f) << 6) | (s[1] & 0x3f) << 12) | (s[0] & 0x3f) << 18; - break; case 5: - val = ((((s[4] & 0x3f) | (s[3] & 0x3f) << 6) | + return ((((s[4] & 0x3f) | (s[3] & 0x3f) << 6) | (s[2] & 0x3f) << 12) | (s[1] & 0x3f) << 18) | (s[0] & 0x3f) << 24; - break; case 6: - val = (((((s[5] & 0x3f) | (s[4] & 0x3f) << 6) | + return (((((s[5] & 0x3f) | (s[4] & 0x3f) << 6) | (s[3] & 0x3f) << 12) | (s[2] & 0x3f) << 18) | (s[1] & 0x3f) << 24) | (s[0] & 0x3f) << 30; - break; default: return 0; } +} + +/* Get the width of a UTF-8 character. */ +int utf8_width(char *s) +{ + int val, low, high, cur; + val = utf8_ord(s); low = 0; high = ARRAY_SIZE(utf8_widthtab); do { |