tuc: make uc_dec() more compact by removing its loop - neatvi - [fork] simple vi-type editor with UTF-8 support
(HTM) git clone git://src.adamsgaard.dk/neatvi
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
---
(DIR) commit 98fc156cbe154ff745f271b07f5e97d54807c858
(DIR) parent 7c800ce91775309ad896f377d3be4f994f398e44
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Thu, 12 Mar 2020 20:05:14 +0330
uc: make uc_dec() more compact by removing its loop
Diffstat:
M regex.c | 18 ++++++++++--------
M uc.c | 7 ++-----
2 files changed, 12 insertions(+), 13 deletions(-)
---
(DIR) diff --git a/regex.c b/regex.c
t@@ -113,14 +113,16 @@ static int uc_len(char *s)
static int uc_dec(char *s)
{
- int result;
- int l = uc_len(s);
- if (l <= 1)
- return (unsigned char) *s;
- result = (0x3f >> --l) & (unsigned char) *s++;
- while (l--)
- result = (result << 6) | ((unsigned char) *s++ & 0x3f);
- return result;
+ int c = (unsigned char) s[0];
+ if (!(c & 0x80))
+ return c;
+ if (!(c & 0x20))
+ return ((c & 0x1f) << 6) | (s[1] & 0x3f);
+ if (!(c & 0x10))
+ return ((c & 0x0f) << 12) | ((s[1] & 0x3f) << 6) | (s[2] & 0x3f);
+ if (!(c & 0x08))
+ return ((c & 0x07) << 18) | ((s[1] & 0x3f) << 12) | ((s[2] & 0x3f) << 6) | (s[3] & 0x3f);
+ return c;
}
static void ratom_copy(struct ratom *dst, struct ratom *src)
(DIR) diff --git a/uc.c b/uc.c
t@@ -36,17 +36,14 @@ int uc_slen(char *s)
int uc_code(char *s)
{
int c = (unsigned char) s[0];
- int l;
if (!(c & 0x80))
return c;
if (!(c & 0x20))
return ((c & 0x1f) << 6) | (s[1] & 0x3f);
if (!(c & 0x10))
return ((c & 0x0f) << 12) | ((s[1] & 0x3f) << 6) | (s[2] & 0x3f);
- l = uc_len(s);
- c = (0x3f >> --l) & (unsigned char) *s++;
- while (l--)
- c = (c << 6) | ((unsigned char) *s++ & 0x3f);
+ if (!(c & 0x08))
+ return ((c & 0x07) << 18) | ((s[1] & 0x3f) << 12) | ((s[2] & 0x3f) << 6) | (s[3] & 0x3f);
return c;
}