---
 fold.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/fold.c b/fold.c
index 0d68b37..c7f6ae8 100644
--- a/fold.c
+++ b/fold.c
@@ -7,19 +7,22 @@
 
 #include "text.h"
 #include "util.h"
+#include "utf.h"
 
 static int    bflag = 0;
 static int    sflag = 0;
 static size_t width = 80;
 
 static void
-foldline(struct line *l) {
+foldline(struct line *l, const char *fname) {
        size_t i, col, last, spacesect, len;
+       Rune r;
+       int runelen;
 
-       for (i = 0, last = 0, col = 0, spacesect = 0; i < l->len; i++) {
-               if (!UTF8_POINT(l->data[i]) && !bflag)
-                       continue;
+       for (i = 0, last = 0, col = 0, spacesect = 0; i < l->len; i += runelen) 
{
                if (col >= width && ((l->data[i] != '\r' && l->data[i] != '\b') 
|| bflag)) {
+                       if (bflag && col > width)
+                               i -= runelen;   /* never split a character */
                        len = ((sflag && spacesect) ? spacesect : i) - last;
                        if (fwrite(l->data + last, 1, len, stdout) != len)
                                eprintf("fwrite <stdout>:");
@@ -29,8 +32,11 @@ foldline(struct line *l) {
                        col = 0;
                        spacesect = 0;
                }
-               if (sflag && isspace(l->data[i]))
-                       spacesect = i + 1;
+               runelen = charntorune(&r, l->data + i, l->len - i);
+               if (!runelen || r == Runeerror)
+                       eprintf("charntorune: %s: invalid utf\n", fname);
+               if (sflag && isspacerune(r))
+                       spacesect = i + runelen;
                if (!bflag && iscntrl(l->data[i])) {
                        switch(l->data[i]) {
                        case '\b':
@@ -46,7 +52,7 @@ foldline(struct line *l) {
                                break;
                        }
                } else {
-                       col++;
+                       col += bflag ? runelen : 1;
                }
        }
        if (l->len - last)
@@ -62,7 +68,7 @@ fold(FILE *fp, const char *fname)
 
        while ((len = getline(&line.data, &size, fp)) > 0) {
                line.len = len;
-               foldline(&line);
+               foldline(&line, fname);
        }
        if (ferror(fp))
                eprintf("getline %s:", fname);
-- 
2.28.0


Reply via email to