diff --git a/src/unicode.c b/src/unicode.c index 572c8d4..3bd59ca 100644 --- a/src/unicode.c +++ b/src/unicode.c @@ -356,14 +356,20 @@ void kmscon_symbol_free_u8(const char *s) free((void*)s); } -struct kmscon_utf8_mach { +/* + * UTF8 State Machine + * This state machine parses UTF8 and converts it into a stream of Unicode + * characters (UCS4 values). + */ + +struct tsm_utf8_mach { int state; uint32_t ch; }; -int kmscon_utf8_mach_new(struct kmscon_utf8_mach **out) +int tsm_utf8_mach_new(struct tsm_utf8_mach **out) { - struct kmscon_utf8_mach *mach; + struct tsm_utf8_mach *mach; if (!out) return -EINVAL; @@ -373,13 +379,13 @@ int kmscon_utf8_mach_new(struct kmscon_utf8_mach **out) return -ENOMEM; memset(mach, 0, sizeof(*mach)); - mach->state = KMSCON_UTF8_START; + mach->state = TSM_UTF8_START; *out = mach; return 0; } -void kmscon_utf8_mach_free(struct kmscon_utf8_mach *mach) +void tsm_utf8_mach_free(struct tsm_utf8_mach *mach) { if (!mach) return; @@ -387,87 +393,87 @@ void kmscon_utf8_mach_free(struct kmscon_utf8_mach *mach) free(mach); } -int kmscon_utf8_mach_feed(struct kmscon_utf8_mach *mach, char ci) +int tsm_utf8_mach_feed(struct tsm_utf8_mach *mach, char ci) { uint32_t c; if (!mach) - return KMSCON_UTF8_START; + return TSM_UTF8_START; c = ci; switch (mach->state) { - case KMSCON_UTF8_START: - case KMSCON_UTF8_ACCEPT: - case KMSCON_UTF8_REJECT: + case TSM_UTF8_START: + case TSM_UTF8_ACCEPT: + case TSM_UTF8_REJECT: if (c == 0xC0 || c == 0xC1) { /* overlong encoding for ASCII, reject */ - mach->state = KMSCON_UTF8_REJECT; + mach->state = TSM_UTF8_REJECT; } else if ((c & 0x80) == 0) { /* single byte, accept */ mach->ch = c; - mach->state = KMSCON_UTF8_ACCEPT; + mach->state = TSM_UTF8_ACCEPT; } else if ((c & 0xC0) == 0x80) { /* parser out of sync, ignore byte */ - mach->state = KMSCON_UTF8_START; + mach->state = TSM_UTF8_START; } else if ((c & 0xE0) == 0xC0) { /* start of two byte sequence */ mach->ch = (c & 0x1F) << 6; - mach->state = KMSCON_UTF8_EXPECT1; + mach->state = TSM_UTF8_EXPECT1; } else if ((c & 0xF0) == 0xE0) { /* start of three byte sequence */ mach->ch = (c & 0x0F) << 12; - mach->state = KMSCON_UTF8_EXPECT2; + mach->state = TSM_UTF8_EXPECT2; } else if ((c & 0xF8) == 0xF0) { /* start of four byte sequence */ mach->ch = (c & 0x07) << 18; - mach->state = KMSCON_UTF8_EXPECT3; + mach->state = TSM_UTF8_EXPECT3; } else { /* overlong encoding, reject */ - mach->state = KMSCON_UTF8_REJECT; + mach->state = TSM_UTF8_REJECT; } break; - case KMSCON_UTF8_EXPECT3: + case TSM_UTF8_EXPECT3: mach->ch |= (c & 0x3F) << 12; if ((c & 0xC0) == 0x80) - mach->state = KMSCON_UTF8_EXPECT2; + mach->state = TSM_UTF8_EXPECT2; else - mach->state = KMSCON_UTF8_REJECT; + mach->state = TSM_UTF8_REJECT; break; - case KMSCON_UTF8_EXPECT2: + case TSM_UTF8_EXPECT2: mach->ch |= (c & 0x3F) << 6; if ((c & 0xC0) == 0x80) - mach->state = KMSCON_UTF8_EXPECT1; + mach->state = TSM_UTF8_EXPECT1; else - mach->state = KMSCON_UTF8_REJECT; + mach->state = TSM_UTF8_REJECT; break; - case KMSCON_UTF8_EXPECT1: + case TSM_UTF8_EXPECT1: mach->ch |= c & 0x3F; if ((c & 0xC0) == 0x80) - mach->state = KMSCON_UTF8_ACCEPT; + mach->state = TSM_UTF8_ACCEPT; else - mach->state = KMSCON_UTF8_REJECT; + mach->state = TSM_UTF8_REJECT; break; default: - mach->state = KMSCON_UTF8_REJECT; + mach->state = TSM_UTF8_REJECT; break; } return mach->state; } -uint32_t kmscon_utf8_mach_get(struct kmscon_utf8_mach *mach) +uint32_t tsm_utf8_mach_get(struct tsm_utf8_mach *mach) { - if (!mach || mach->state != KMSCON_UTF8_ACCEPT) + if (!mach || mach->state != TSM_UTF8_ACCEPT) return KMSCON_UCS4_INVALID; return mach->ch; } -void kmscon_utf8_mach_reset(struct kmscon_utf8_mach *mach) +void tsm_utf8_mach_reset(struct tsm_utf8_mach *mach) { if (!mach) return; - mach->state = KMSCON_UTF8_START; + mach->state = TSM_UTF8_START; } diff --git a/src/unicode.h b/src/unicode.h index 83610af..5a69710 100644 --- a/src/unicode.h +++ b/src/unicode.h @@ -65,22 +65,22 @@ void kmscon_symbol_free_u8(const char *s); /* utf8 state machine */ -struct kmscon_utf8_mach; +struct tsm_utf8_mach; -enum kmscon_utf8_mach_state { - KMSCON_UTF8_START, - KMSCON_UTF8_ACCEPT, - KMSCON_UTF8_REJECT, - KMSCON_UTF8_EXPECT1, - KMSCON_UTF8_EXPECT2, - KMSCON_UTF8_EXPECT3, +enum tsm_utf8_mach_state { + TSM_UTF8_START, + TSM_UTF8_ACCEPT, + TSM_UTF8_REJECT, + TSM_UTF8_EXPECT1, + TSM_UTF8_EXPECT2, + TSM_UTF8_EXPECT3, }; -int kmscon_utf8_mach_new(struct kmscon_utf8_mach **out); -void kmscon_utf8_mach_free(struct kmscon_utf8_mach *mach); +int tsm_utf8_mach_new(struct tsm_utf8_mach **out); +void tsm_utf8_mach_free(struct tsm_utf8_mach *mach); -int kmscon_utf8_mach_feed(struct kmscon_utf8_mach *mach, char c); -uint32_t kmscon_utf8_mach_get(struct kmscon_utf8_mach *mach); -void kmscon_utf8_mach_reset(struct kmscon_utf8_mach *mach); +int tsm_utf8_mach_feed(struct tsm_utf8_mach *mach, char c); +uint32_t tsm_utf8_mach_get(struct tsm_utf8_mach *mach); +void tsm_utf8_mach_reset(struct tsm_utf8_mach *mach); #endif /* KMSCON_UNICODE_H */ diff --git a/src/vte.c b/src/vte.c index 3759886..84793b0 100644 --- a/src/vte.c +++ b/src/vte.c @@ -154,7 +154,7 @@ struct kmscon_vte { kmscon_vte_write_cb write_cb; void *data; - struct kmscon_utf8_mach *mach; + struct tsm_utf8_mach *mach; unsigned long parse_cnt; unsigned int state; @@ -381,7 +381,7 @@ int kmscon_vte_new(struct kmscon_vte **out, struct kmscon_console *con, vte->def_attr.bccode = COLOR_BACKGROUND; to_rgb(vte, &vte->def_attr); - ret = kmscon_utf8_mach_new(&vte->mach); + ret = tsm_utf8_mach_new(&vte->mach); if (ret) goto err_free; @@ -416,7 +416,7 @@ void kmscon_vte_unref(struct kmscon_vte *vte) log_debug("destroying vte object"); kmscon_console_unref(vte->con); - kmscon_utf8_mach_free(vte->mach); + tsm_utf8_mach_free(vte->mach); free(vte); } @@ -568,7 +568,7 @@ void kmscon_vte_reset(struct kmscon_vte *vte) kmscon_console_reset(vte->con); kmscon_console_set_flags(vte->con, KMSCON_CONSOLE_AUTO_WRAP); - kmscon_utf8_mach_reset(vte->mach); + tsm_utf8_mach_reset(vte->mach); vte->state = STATE_GROUND; vte->gl = &kmscon_vte_unicode_lower; vte->gr = &kmscon_vte_unicode_upper; @@ -2105,10 +2105,10 @@ void kmscon_vte_input(struct kmscon_vte *vte, const char *u8, size_t len) } else if (vte->flags & FLAG_8BIT_MODE) { parse_data(vte, u8[i]); } else { - state = kmscon_utf8_mach_feed(vte->mach, u8[i]); - if (state == KMSCON_UTF8_ACCEPT || - state == KMSCON_UTF8_REJECT) { - ucs4 = kmscon_utf8_mach_get(vte->mach); + state = tsm_utf8_mach_feed(vte->mach, u8[i]); + if (state == TSM_UTF8_ACCEPT || + state == TSM_UTF8_REJECT) { + ucs4 = tsm_utf8_mach_get(vte->mach); parse_data(vte, ucs4); } }