tail(1p): tail -n

This commit is contained in:
mars 2023-08-30 19:09:53 -06:00 committed by emma
parent 94537bc948
commit 26bbb05777
Signed by untrusted user: emma
GPG Key ID: 6D661C738815E7DD

View File

@ -28,6 +28,75 @@
#include "yac.h" #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) { void tailf(FILE *file) {
int byte; int byte;