Viewing: head.c
📄 head.c (Read Only) ⬅ To go back
/* AdrOS head utility */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

static void head_fd(int fd, int nlines) {
    char buf[4096];
    int lines = 0;
    int r;
    while (lines < nlines && (r = read(fd, buf, sizeof(buf))) > 0) {
        for (int i = 0; i < r && lines < nlines; i++) {
            write(STDOUT_FILENO, &buf[i], 1);
            if (buf[i] == '\n') lines++;
        }
    }
}

int main(int argc, char** argv) {
    int nlines = 10;
    int start = 1;

    if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'n' && argc > 2) {
        nlines = atoi(argv[2]);
        start = 3;
    } else if (argc > 1 && argv[1][0] == '-' && argv[1][1] >= '0' && argv[1][1] <= '9') {
        nlines = atoi(argv[1] + 1);
        start = 2;
    }

    if (start >= argc) {
        head_fd(STDIN_FILENO, nlines);
    } else {
        for (int i = start; i < argc; i++) {
            if (argc - start > 1) printf("==> %s <==\n", argv[i]);
            int fd = open(argv[i], O_RDONLY);
            if (fd < 0) {
                fprintf(stderr, "head: cannot open '%s'\n", argv[i]);
                continue;
            }
            head_fd(fd, nlines);
            close(fd);
        }
    }
    return 0;
}