tRead up to len and terminate at the first non-printable - spoon - dwm status utility (2f30 fork)
 (HTM) git clone git://src.adamsgaard.dk/spoon
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit cbac9231f348a7b018dfc6ac175cf6c3c78ae872
 (DIR) parent 053ab46b88574588dcbaff5db0757414d453b446
 (HTM) Author: lostd <lostd@2f30.org>
       Date:   Sun,  2 Apr 2017 18:30:37 +0300
       
       Read up to len and terminate at the first non-printable
       
       Diffstat:
         M file.c                              |      26 +++++++++++++++++++++++++-
       
       1 file changed, 25 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/file.c b/file.c
       t@@ -1,24 +1,48 @@
       +#include <ctype.h>
        #include <err.h>
        #include <fcntl.h>
        #include <unistd.h>
        
       +ssize_t
       +readn(int fd, void *buf, size_t nbytes)
       +{
       +        size_t nleft = nbytes;
       +        ssize_t n;
       +
       +        do {
       +                n = read(fd, buf, nleft);
       +                if (n == 0)
       +                        break;
       +                else if (n == -1)
       +                        return -1;
       +                nleft -= n;
       +                buf += n;
       +        } while (nleft > 0);
       +        return (nbytes - nleft);
       +}
       +
        int
        fileread(void *arg, char *buf, size_t len)
        {
                char *path = arg;
                ssize_t n;
                int fd;
       +        int i;
        
                fd = open(path, O_RDONLY);
                if (fd == -1) {
                        warn("open %s", path);
                        return -1;
                }
       -        n = read(fd, buf, len);
       +        n = readn(fd, buf, len);
                close(fd);
                if (n == -1 || n == 0)
                        return -1;
                else
                        buf[n - 1] = '\0';
       +        /* stop at the first non-printable character */
       +        for (i = 0; i < len; i++)
       +                if (!isprint(buf[i]))
       +                        buf[i] = '\0';
                return 0;
        }