iadd more useful functions to utf.h - iomenu - interactive terminal-based selection menu Err bitreich.org 70 hgit clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu URL:git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu bitreich.org 70 1Log /scm/iomenu/log.gph bitreich.org 70 1Files /scm/iomenu/files.gph bitreich.org 70 1Refs /scm/iomenu/refs.gph bitreich.org 70 1Tags /scm/iomenu/tag bitreich.org 70 1README /scm/iomenu/file/README.gph bitreich.org 70 1LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 39fe39ddae414f337914be1aaa03915679635415 /scm/iomenu/commit/39fe39ddae414f337914be1aaa03915679635415.gph bitreich.org 70 1parent 9adba189e74c6b6752d04f8e6954177b35a99bbd /scm/iomenu/commit/9adba189e74c6b6752d04f8e6954177b35a99bbd.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:mail@josuah.net bitreich.org 70 iDate: Tue, 16 Jan 2018 22:34:54 +0100 Err bitreich.org 70 i Err bitreich.org 70 iadd more useful functions to utf.h Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.c | 2 +- Err bitreich.org 70 i A main.c | 18 ++++++++++++++++++ Err bitreich.org 70 i M utf8.c | 78 ++++++++++++++++++++++--------- Err bitreich.org 70 i M utf8.h | 7 ++++--- Err bitreich.org 70 i Err bitreich.org 70 i4 files changed, 80 insertions(+), 25 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -350,7 +350,7 @@ format(char *str, int cols) Err bitreich.org 70 i col++; Err bitreich.org 70 i } Err bitreich.org 70 i str++; Err bitreich.org 70 i- } else if (utf8_to_rune(&rune, str) && utf8_is_print(rune)) { Err bitreich.org 70 i+ } else if (utf8_torune(&rune, str) && utf8_isprint(rune)) { Err bitreich.org 70 i int i = utf8_len(str); Err bitreich.org 70 i while (i--) Err bitreich.org 70 i *fmt++ = *str++; Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/iomenu/file/main.c.gph bitreich.org 70 i@@ -0,0 +1,18 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include "utf8.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+main(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int n = 100; Err bitreich.org 70 i+ char s[] = "浪漫的夢想", *cut; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((cut = utf8_col(s, n)) == NULL) { Err bitreich.org 70 i+ printf("the whole string fit\n"); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ printf("%zd\n", cut - s); Err bitreich.org 70 i+ *cut = '\0'; Err bitreich.org 70 i+ printf("%s\n", s); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/utf8.c b/utf8.c /scm/iomenu/file/utf8.c.gph bitreich.org 70 i@@ -26,32 +26,36 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include /* only used for wcwidth() */ Err bitreich.org 70 i Err bitreich.org 70 i #include "utf8.h" Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i * Return the number of bytes in rune for the `n` next char in `s`, Err bitreich.org 70 i- * or 0 if ti is misencoded. Err bitreich.org 70 i+ * or 0 if is misencoded or if it is '\0'. Err bitreich.org 70 i */ Err bitreich.org 70 i size_t Err bitreich.org 70 i utf8_len(char *s) Err bitreich.org 70 i { Err bitreich.org 70 i unsigned char *sp = (unsigned char *) s; Err bitreich.org 70 i- int i, len = (*sp < 0x80) ? 1 : /* 0xxxxxxx < 10000000 */ Err bitreich.org 70 i- (*sp < 0xc0) ? 0 : /* 10xxxxxx < 11000000 */ Err bitreich.org 70 i- (*sp < 0xe0) ? 2 : /* 110xxxxx < 11100000 */ Err bitreich.org 70 i- (*sp < 0xf0) ? 3 : /* 1110xxxx < 11110000 */ Err bitreich.org 70 i- (*sp < 0xf8) ? 4 : /* 11110xxx < 11111000 */ Err bitreich.org 70 i- (*sp < 0xfc) ? 5 : /* 111110xx < 11111100 */ Err bitreich.org 70 i- (*sp < 0xfe) ? 6 : /* 1111110x < 11111110 */ Err bitreich.org 70 i- (*sp < 0xff) ? 7 : /* 11111110 < 11111111 */ Err bitreich.org 70 i- 0; Err bitreich.org 70 i- if ((size_t) len > strlen(s)) return 0; Err bitreich.org 70 i- Err bitreich.org 70 i- /* check continuation bytes */ Err bitreich.org 70 i- for (sp++, i = 1; i < len; i++, sp++) Err bitreich.org 70 i+ int i, len; Err bitreich.org 70 i+ Err bitreich.org 70 i+ len = (*sp == 0x0) ? 0 : /* 00000000 */ Err bitreich.org 70 i+ (*sp < 0x80) ? 1 : /* 0xxxxxxx < 10000000 */ Err bitreich.org 70 i+ (*sp < 0xc0) ? 0 : /* 10xxxxxx < 11000000 */ Err bitreich.org 70 i+ (*sp < 0xe0) ? 2 : /* 110xxxxx < 11100000 */ Err bitreich.org 70 i+ (*sp < 0xf0) ? 3 : /* 1110xxxx < 11110000 */ Err bitreich.org 70 i+ (*sp < 0xf8) ? 4 : /* 11110xxx < 11111000 */ Err bitreich.org 70 i+ (*sp < 0xfc) ? 5 : /* 111110xx < 11111100 */ Err bitreich.org 70 i+ (*sp < 0xfe) ? 6 : /* 1111110x < 11111110 */ Err bitreich.org 70 i+ (*sp < 0xff) ? 7 : /* 11111110 < 11111111 */ Err bitreich.org 70 i+ 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* check continuation bytes and '\0' */ Err bitreich.org 70 i+ for (sp++, i = 1; i < len; i++, sp++) { Err bitreich.org 70 i if ((*sp & 0xc0) != 0x80) /* 10xxxxxx & 11000000 */ Err bitreich.org 70 i return 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i return len; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -61,11 +65,11 @@ utf8_len(char *s) Err bitreich.org 70 i * 0 if rune is too long. Err bitreich.org 70 i */ Err bitreich.org 70 i size_t Err bitreich.org 70 i-utf8_rune_len(long r) Err bitreich.org 70 i+utf8_runelen(long r) Err bitreich.org 70 i { Err bitreich.org 70 i- return (r <= 0x0000007f) ? 1 : (r <= 0x000007ff) ? 2 : Err bitreich.org 70 i- (r <= 0x0000ffff) ? 3 : (r <= 0x001fffff) ? 4 : Err bitreich.org 70 i- (r <= 0x03ffffff) ? 5 : (r <= 0x7fffffff) ? 6 : 0; Err bitreich.org 70 i+ return (r <= 0x0000007f) ? 1 : (r <= 0x000007ff) ? 2 : Err bitreich.org 70 i+ (r <= 0x0000ffff) ? 3 : (r <= 0x001fffff) ? 4 : Err bitreich.org 70 i+ (r <= 0x03ffffff) ? 5 : (r <= 0x7fffffff) ? 6 : 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -74,7 +78,7 @@ utf8_rune_len(long r) Err bitreich.org 70 i * Return the number of bytes read or 0 if the string is misencoded. Err bitreich.org 70 i */ Err bitreich.org 70 i size_t Err bitreich.org 70 i-utf8_to_rune(long *r, char *s) Err bitreich.org 70 i+utf8_torune(long *r, char *s) Err bitreich.org 70 i { Err bitreich.org 70 i char mask[] = { 0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01 }; Err bitreich.org 70 i size_t i, len = utf8_len(s); Err bitreich.org 70 i@@ -90,17 +94,49 @@ utf8_to_rune(long *r, char *s) Err bitreich.org 70 i *r = (*r << 6) | (*s++ & 0x3f); /* 10xxxxxx */ Err bitreich.org 70 i Err bitreich.org 70 i /* overlong sequences */ Err bitreich.org 70 i- if (utf8_rune_len(*r) != len) Err bitreich.org 70 i+ if (utf8_runelen(*r) != len) Err bitreich.org 70 i return 0; Err bitreich.org 70 i Err bitreich.org 70 i return len; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i+ * Err bitreich.org 70 i+ */ Err bitreich.org 70 i+utf8_tostr(char *s, long r) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i * Return 1 if the rune is a printable character, and 0 otherwise. Err bitreich.org 70 i */ Err bitreich.org 70 i int Err bitreich.org 70 i-utf8_is_print(long r) Err bitreich.org 70 i+utf8_isprint(long r) Err bitreich.org 70 i { Err bitreich.org 70 i return (0x1f < r && r != 0x7f && r < 0x80) || 0x9f < r; Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Return a pointer to the first byte of a character of `s' that would be Err bitreich.org 70 i+ * rendered at the `col'-th column in a monospaced terminal, or NULL if the Err bitreich.org 70 i+ * whole string fit. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+char * Err bitreich.org 70 i+utf8_col(char *s, size_t col) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ long r; Err bitreich.org 70 i+ char *pos; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (n = 0; n < col; n += wcwidth(r)) { Err bitreich.org 70 i+ pos = s; Err bitreich.org 70 i+ if (*s == '\0') Err bitreich.org 70 i+ return NULL; Err bitreich.org 70 i+ s += utf8_torune(&r, s); Err bitreich.org 70 i+ utf8_toutf(); Err bitreich.org 70 i+ printf("%zd:'%s' ", n, s); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return pos; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/utf8.h b/utf8.h /scm/iomenu/file/utf8.h.gph bitreich.org 70 i@@ -1,6 +1,7 @@ Err bitreich.org 70 i size_t utf8_len(char *); Err bitreich.org 70 i size_t rune_len(long); Err bitreich.org 70 i-size_t utf8_to_rune(long *, char *); Err bitreich.org 70 i-int utf8_is_unicode(long); Err bitreich.org 70 i+size_t utf8_torune(long *, char *); Err bitreich.org 70 i+int utf8_isunicode(long); Err bitreich.org 70 i int utf8_check(char *); Err bitreich.org 70 i-int utf8_is_print(long); Err bitreich.org 70 i+int utf8_isprint(long); Err bitreich.org 70 i+char *utf8_col(); Err bitreich.org 70 .