Factor out UTF-8 code point decoding
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This commit is contained in:
parent
6cb26c2f27
commit
273e32d43d
@ -1099,6 +1099,7 @@ int ui_todo_get_view(void);
|
|||||||
void ui_todo_set_view(int);
|
void ui_todo_set_view(int);
|
||||||
|
|
||||||
/* utf8.c */
|
/* utf8.c */
|
||||||
|
int utf8_ord(const char *);
|
||||||
int utf8_width(char *);
|
int utf8_width(char *);
|
||||||
int utf8_strwidth(char *);
|
int utf8_strwidth(char *);
|
||||||
int utf8_chop(char *, int);
|
int utf8_chop(char *, int);
|
||||||
|
31
src/utf8.c
31
src/utf8.c
@ -269,43 +269,42 @@ static const struct utf8_range utf8_widthtab[] = {
|
|||||||
{0xe0100, 0xe01ef, 0}
|
{0xe0100, 0xe01ef, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Get the width of a UTF-8 character. */
|
/* Decode a UTF-8 code point. */
|
||||||
int utf8_width(char *s)
|
int utf8_ord(const char *s)
|
||||||
{
|
{
|
||||||
int val, low, high, cur;
|
|
||||||
|
|
||||||
if (UTF8_ISCONT(*s))
|
if (UTF8_ISCONT(*s))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
switch (UTF8_LENGTH(*s)) {
|
switch (UTF8_LENGTH(*s)) {
|
||||||
case 1:
|
case 1:
|
||||||
val = s[0];
|
return s[0];
|
||||||
break;
|
|
||||||
case 2:
|
case 2:
|
||||||
val = (s[1] & 0x3f) | (s[0] & 0x1f) << 6;
|
return (s[1] & 0x3f) | (s[0] & 0x1f) << 6;
|
||||||
break;
|
|
||||||
case 3:
|
case 3:
|
||||||
val = ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) |
|
return ((s[2] & 0x3f) | (s[1] & 0x3f) << 6) |
|
||||||
(s[0] & 0x0f) << 12;
|
(s[0] & 0x0f) << 12;
|
||||||
break;
|
|
||||||
case 4:
|
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;
|
(s[1] & 0x3f) << 12) | (s[0] & 0x3f) << 18;
|
||||||
break;
|
|
||||||
case 5:
|
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[2] & 0x3f) << 12) | (s[1] & 0x3f) << 18) |
|
||||||
(s[0] & 0x3f) << 24;
|
(s[0] & 0x3f) << 24;
|
||||||
break;
|
|
||||||
case 6:
|
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[3] & 0x3f) << 12) | (s[2] & 0x3f) << 18) |
|
||||||
(s[1] & 0x3f) << 24) | (s[0] & 0x3f) << 30;
|
(s[1] & 0x3f) << 24) | (s[0] & 0x3f) << 30;
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return 0;
|
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;
|
low = 0;
|
||||||
high = ARRAY_SIZE(utf8_widthtab);
|
high = ARRAY_SIZE(utf8_widthtab);
|
||||||
do {
|
do {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user