From 26bbb05777dbbb6d2f3c7485b53ebeba4b41ecc2 Mon Sep 17 00:00:00 2001 From: mars Date: Wed, 30 Aug 2023 19:09:53 -0600 Subject: [PATCH] tail(1p): tail -n --- src/tail.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/tail.c b/src/tail.c index d576dfa..f798eb3 100644 --- a/src/tail.c +++ b/src/tail.c @@ -28,6 +28,75 @@ #include "yac.h" +typedef struct string_t { + char *mem; + int len; + int capacity; +} string_t; + +string_t *string_new() { + string_t *string = calloc(1, sizeof(string_t)); + string->capacity = 1024; + string->len = 0; + string->mem = calloc(string->capacity, sizeof(char)); + return string; +} + +void string_putc(string_t *string, char c) { + string->mem[string->len] = c; + string->len++; + if (string->len >= string->capacity) { + string->capacity *= 2; + string->mem = realloc(string->mem, string->capacity * sizeof(char)); + } +} + +void tailc(FILE *f, long num) {} + +void tailn(FILE *f, long num) { + string_t *lines[num]; + int cursor = 0; + int looped = 0; + + lines[cursor] = string_new(); + + int c = fgetc(f); + for (;;) { + if (c == EOF) { + string_putc(lines[cursor], '\0'); + break; + } + + string_putc(lines[cursor], c); + + if (c == '\n') { + string_putc(lines[cursor], '\0'); + + if ((c = fgetc(f)) == EOF) { + break; + } + + if (++cursor >= num) { + looped = 1; + cursor = 0; + } + + lines[cursor] = string_new(); + } else { + c = fgetc(f); + } + } + + int read = looped ? cursor + 1 : 0; + do { + if (read >= num) { + read = 0; + } + + fputs(lines[read]->mem, stdout); + } while (read++ != cursor); +} + void tailf(FILE *file) { int byte;