aoc_omni/c/lib/aoc.h

45 lines
991 B
C

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define INITIAL_BUFFER_SIZE 2
char *input_buffer;
char *aoc_read_input(void) {
int buffer_size = INITIAL_BUFFER_SIZE;
input_buffer = malloc(buffer_size);
int chars_read = read(STDIN_FILENO, input_buffer, buffer_size);
char *buffer_position = &input_buffer[chars_read];
while (chars_read == buffer_size) {
buffer_size *= 2;
input_buffer = realloc(input_buffer, buffer_size);
buffer_position = &input_buffer[chars_read];
chars_read += read(STDIN_FILENO, buffer_position, buffer_size / 2);
}
input_buffer[chars_read] = 0;
return input_buffer;
}
char *seek = NULL;
char *aoc_read_line(void) {
if (input_buffer == NULL) aoc_read_input();
if (seek == NULL) seek = input_buffer;
char *line_break = strstr(seek, "\n");
if (line_break == NULL) return NULL;
*line_break = '\0';
char *token = seek;
seek = line_break + 1;
return token;
}
void aoc_free(void) {
free(input_buffer);
}