diff options
Diffstat (limited to 'src/skaembutils/s6-head.c')
-rw-r--r-- | src/skaembutils/s6-head.c | 164 |
1 files changed, 0 insertions, 164 deletions
diff --git a/src/skaembutils/s6-head.c b/src/skaembutils/s6-head.c deleted file mode 100644 index de7d937..0000000 --- a/src/skaembutils/s6-head.c +++ /dev/null @@ -1,164 +0,0 @@ -/* ISC license. */ - -#include <sys/types.h> -#include <sys/uio.h> -#include <errno.h> - -#include <skalibs/allreadwrite.h> -#include <skalibs/sgetopt.h> -#include <skalibs/bytestr.h> -#include <skalibs/types.h> -#include <skalibs/buffer.h> -#include <skalibs/siovec.h> -#include <skalibs/strerr.h> -#include <skalibs/djbunix.h> - -#define USAGE "s6-head [ -S ] [ -1..9 | -n lines | -c chars ] [ file... ]" -#define dieusage() strerr_dieusage(100, USAGE) - -typedef int head_func (int, size_t) ; -typedef head_func *head_func_ref ; - -static int head_dolines (int fd, size_t lines) -{ - char buf[BUFFER_INSIZE] ; - buffer in = BUFFER_INIT(&buffer_read, fd, buf, BUFFER_INSIZE) ; - buffer out = BUFFER_INIT(&buffer_write, 1, buf, BUFFER_INSIZE) ; - struct iovec v[2] ; - while (lines) - { - size_t w = 0 ; - ssize_t r = buffer_fill(&in) ; - if (r <= 0) return !r ; - out.c.n = in.c.n ; out.c.p = in.c.p ; - buffer_rpeek(&in, v) ; - for (;;) - { - size_t n = siovec_len(v, 2) ; - size_t i ; - if (!n) break ; - i = siovec_bytechr(v, 2, '\n') ; - if (i < n) - { - w += i+1 ; - siovec_seek(v, 2, i+1) ; - if (!--lines) - { - out.c.n = (out.c.p + w) % out.c.a ; - break ; - } - } - else siovec_seek(v, 2, i) ; - } - if (!buffer_flush(&out)) return 0 ; - in.c.n = out.c.n ; in.c.p = out.c.p ; - } - return 1 ; -} - -static int head_safedolines (int fd, size_t lines) -{ - char tmp[lines] ; - while (lines) - { - size_t r ; - errno = 0 ; - r = allread(fd, tmp, lines) ; - if (r < lines && errno) return 0 ; - lines -= byte_count(tmp, r, '\n') ; - if (buffer_put(buffer_1, tmp, r) < (ssize_t)r) return 0 ; - } - if (!buffer_flush(buffer_1)) return 0 ; - return 1 ; -} - -static int head_safedochars (int fd, size_t chars) -{ - return (fd_catn(fd, 1, chars) >= chars) ; -} - -int main (int argc, char const *const *argv) -{ - head_func_ref f ; - unsigned int lines = 10 ; - int islines = 1, safe = 0 ; - PROG = "s6-head" ; - { - subgetopt l = SUBGETOPT_ZERO ; - int done = 0 ; - for (;;) - { - int opt = subgetopt_r(argc, argv, "S123456789n:c:", &l) ; - if (opt == -1) break ; - switch (opt) - { - case 'S' : safe = 1 ; break ; - case '1' : - case '2' : - case '3' : - case '4' : - case '5' : - case '6' : - case '7' : - case '8' : - case '9' : - { - if (done) dieusage() ; - islines = 1 ; - lines = opt - '0' ; - done = 1 ; - break ; - } - case 'n' : - { - if (done || !uint0_scan(l.arg, &lines)) - strerr_dieusage(100, USAGE) ; - islines = 1 ; - done = 1 ; - break ; - } - case 'c' : - { - if (done || !uint0_scan(l.arg, &lines)) - strerr_dieusage(100, USAGE) ; - islines = 0 ; - done = 1 ; - break ; - } - default : strerr_dieusage(100, USAGE) ; - } - } - argc -= l.ind ; argv += l.ind ; - } - if (argc) safe = 0 ; - f = islines ? safe ? &head_safedolines : &head_dolines : &head_safedochars ; - if (!argc) - { - if (!(*f)(0, lines)) - strerr_diefu1sys(111, "head stdin") ; - } - else - { - unsigned int i = 0 ; - for (; argv[i] ; i++) - { - int fd ; - if (argc >= 2) - { - if (i) buffer_putnoflush(buffer_1, "\n", 1) ; - buffer_putnoflush(buffer_1, "==> ", 4) ; - if ((buffer_puts(buffer_1, argv[i]) <= 0) - || (buffer_putflush(buffer_1, " <==\n", 5) < 0)) - strerr_diefu1sys(111, "write to stdout") ; - } - if ((argv[i][0] == '-') && !argv[i][1]) fd = 0 ; - else fd = open_readb(argv[i]) ; - if (fd == -1) - strerr_diefu3sys(111, "open ", argv[i], " for reading") ; - if (!(*f)(fd, lines)) - strerr_diefu2sys(111, "head ", argv[i]) ; - fd_close(fd) ; - } - } - return 0 ; -} |