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;
}