From ab7109065ced6feac485e3a5621c0f9c52f7aeec Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Tue, 2 May 2023 00:37:30 -0400 Subject: tac, ls fixes --- src/util/shared.c | 9 +++++---- src/util/stack.c | 32 ++++++++++++++++++++++++++++++++ src/util/stack.h | 26 ++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 src/util/stack.c create mode 100644 src/util/stack.h (limited to 'src/util') diff --git a/src/util/shared.c b/src/util/shared.c index e207c6d..3e6fca3 100644 --- a/src/util/shared.c +++ b/src/util/shared.c @@ -20,6 +20,11 @@ void error(const char* format, ...) { FILE* get_file_s(const char* path, const char* type) { struct stat s; + if (streql("-", path) && type[0] == 'r') { + clearerr(stdin); + fflush(stdin); + return stdin; + } if (lstat(path, &s) < 0) { if (type[0] != 'r') goto read; fprintf(stderr, "error: failed to read %s: %s\n", path, strerror(errno)); @@ -40,10 +45,6 @@ read: } FILE* get_file(const char* path, const char* type) { - if (streql("-", path) && type[0] == 'r') { - clearerr(stdin); - return stdin; - } FILE* file = get_file_s(path, type); if (file == NULL) exit(EXIT_FAILURE); return file; diff --git a/src/util/stack.c b/src/util/stack.c new file mode 100644 index 0000000..15d5a8e --- /dev/null +++ b/src/util/stack.c @@ -0,0 +1,32 @@ +#include "stack.h" + +#include +#include +#include +#include + +void stack_init(struct Stack* stack, size_t size) { + stack->size = 0; + stack->capacity = size; + stack->data = malloc(size); +} + +void stack_push(struct Stack* stack, void* data, size_t len) { + size_t new_size = stack->size + len; + if (new_size >= stack->capacity) { + stack->capacity = new_size * 2; + stack->data = realloc(stack->data, stack->capacity); + } + memcpy((uint8_t*)stack->data + stack->size, data, len); + stack->size += len; +} + +void* stack_pop(struct Stack* stack, size_t len) { + if (stack->size < len) return NULL; + stack->size -= len; + return (uint8_t*)stack->data + stack->size; +} + +void stack_free(struct Stack *stack) { + free(stack->data); +} diff --git a/src/util/stack.h b/src/util/stack.h new file mode 100644 index 0000000..01a48e5 --- /dev/null +++ b/src/util/stack.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +struct Stack { + size_t size; + size_t capacity; + void* data; +}; + +void stack_init(struct Stack* stack, size_t size); +void stack_push(struct Stack* stack, void* data, size_t len); +void* stack_pop(struct Stack* stack, size_t len); +void stack_free(struct Stack* stack); + +inline void stack_push_int(struct Stack* stack, int value) { + stack_push(stack, &value, sizeof(int)); +} + +inline bool stack_pop_int(struct Stack* stack, int* value) { + void* d = stack_pop(stack, sizeof(int)); + if (d == NULL) return false; + *value = *(int*)(d); + return true; +} -- cgit v1.2.3-freya