aboutsummaryrefslogtreecommitdiffstats
path: root/usr/head.c
blob: 3298e545e1787bea7dd03dd51b6cd25ba0b583e8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "gbos.h"
/* head [-n N] [N] [file]: first N lines of a file or stdin (default 10). */
void main(void) {
    char *argv[8];
    unsigned char argc = argv_parse(argv, 8);
    char *nv = optval(argv, argc, 'n');
    unsigned char n = 10, lines = 0, i, fd = NOFD;
    char *fname = 0;
    int ch;
    if (nv) n = atou(nv);
    for (i = 0; i < argc; i++) {
        if (argv[i][0] == '-') continue;
        if (nv == argv[i]) continue;
        if (!nv && argv[i][0] >= '0' && argv[i][0] <= '9') { n = atou(argv[i]); continue; }
        fname = argv[i]; break;
    }
    if (fname) {
        fd = open(fname, O_READ);
        if (fd > 3) { puts("head: no such file"); nl(); return; }
    }
    for (;;) {
        if (fd > 3) { char c = readc(); if (c == EOF) break; ch = c; }
        else { ch = fgetc(fd); if (ch < 0) break; }
        if (lines < n) putc((char)ch);
        if (ch == '\n') lines++;
    }
    if (fd != NOFD) close(fd);
}