use libgrapheme instead of libutf - lchat - A line oriented chat front end for ii.
 (HTM) git clone git://git.suckless.org/lchat
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit dbc8751dc6c034967d2b3133a58a627834992e8c
 (DIR) parent 2222d76e1a740862f8ba5da876910876abb0a50a
 (HTM) Author: Jan Klemkow <j.klemkow@wemelug.de>
       Date:   Sun,  2 Oct 2022 00:59:19 +0200
       
       use libgrapheme instead of libutf
       
       Diffstat:
         M config.mk                           |       2 +-
         M slackline.c                         |      31 ++++++++-----------------------
       
       2 files changed, 9 insertions(+), 24 deletions(-)
       ---
 (DIR) diff --git a/config.mk b/config.mk
       @@ -9,7 +9,7 @@ CFLAGS = -std=c99 -pedantic -Wall -Wextra -g
        
        # utf.h
        CFLAGS += -I/usr/local/include
       -LIBS = -L/usr/local/lib -lutf
       +LIBS = -L/usr/local/lib -lgrapheme
        
        # For sbase users:
        #CFLAGS += -I../sbase
 (DIR) diff --git a/slackline.c b/slackline.c
       @@ -19,7 +19,7 @@
        #include <stdlib.h>
        #include <string.h>
        
       -#include <utf.h>
       +#include <grapheme.h>
        
        #include "slackline.h"
        
       @@ -74,15 +74,8 @@ sl_postobyte(struct slackline *sl, size_t pos)
                char *ptr = &sl->buf[0];
                size_t byte = 0;
        
       -        for (;pos > 0; pos--) {
       -                for (size_t i = 0;; i++) {
       -                        if (fullrune(ptr, i) == 1) {
       -                                ptr += i;
       -                                byte += i;
       -                                break;
       -                        }
       -                }
       -        }
       +        for (;pos > 0; pos--)
       +                byte += grapheme_next_character_break(ptr+byte, sl->blen-byte);
        
                return byte;
        }
       @@ -90,18 +83,7 @@ sl_postobyte(struct slackline *sl, size_t pos)
        static char *
        sl_postoptr(struct slackline *sl, size_t pos)
        {
       -        char *ptr = &sl->buf[0];
       -
       -        for (;pos > 0; pos--) {
       -                for (size_t i = 0;; i++) {
       -                        if (fullrune(ptr, i) == 1) {
       -                                ptr += i;
       -                                break;
       -                        }
       -                }
       -        }
       -
       -        return ptr;
       +        return &sl->buf[sl_postobyte(sl, pos)];
        }
        
        static void
       @@ -131,6 +113,8 @@ sl_backspace(struct slackline *sl)
        int
        sl_keystroke(struct slackline *sl, int key)
        {
       +        uint_least32_t cp;
       +
                if (sl == NULL || sl->rlen < sl->rcur)
                        return -1;
        
       @@ -245,7 +229,8 @@ sl_keystroke(struct slackline *sl, int key)
        compose:
                /* byte-wise composing of UTF-8 runes */
                sl->ubuf[sl->ubuf_len++] = key;
       -        if (fullrune(sl->ubuf, sl->ubuf_len) == 0)
       +        if (grapheme_decode_utf8(sl->ubuf, sl->ubuf_len, &cp) > sl->ubuf_len ||
       +            cp == GRAPHEME_INVALID_CODEPOINT)
                        return 0;
        
                if (sl->blen + sl->ubuf_len >= sl->bufsize) {