SMOLNET PORTAL home about changes
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 <mail@josuah.net>	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 <stdio.h>	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 <stddef.h>	Err	bitreich.org	70
i #include <stdlib.h>	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i+#include <wchar.h>        /* 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
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/iomenu/commit/39fe39ddae414f3...
Content-Typetext/plain; charset=utf-8