From d33761b04e8d9cd351bdfd4b523167c03f7033c2 Mon Sep 17 00:00:00 2001 From: Alex Gustafsson Date: Wed, 24 Nov 2021 15:28:40 +0100 Subject: [PATCH] Add basic c support --- 2020/1/main.c | 15 +++++++++++++++ scripts/run.sh | 5 +++++ utils/c/input.c | 34 ++++++++++++++++++++++++++++++++++ utils/c/input.h | 12 ++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 2020/1/main.c create mode 100644 utils/c/input.c create mode 100644 utils/c/input.h diff --git a/2020/1/main.c b/2020/1/main.c new file mode 100644 index 0000000..d4fb51d --- /dev/null +++ b/2020/1/main.c @@ -0,0 +1,15 @@ +#include +#include + +#include "../../utils/c/input.h" + +int main(int argc, char **argv) { + input_t input = read_input(); + if (input == NULL) { + return EXIT_FAILURE; + } + + printf("%s\n", input); + free(input); + return EXIT_SUCCESS; +} diff --git a/scripts/run.sh b/scripts/run.sh index 8dce5ac..4f74a7d 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -22,6 +22,7 @@ fi main_files="$(find "$year/$day" -depth 1 -iname "main*")" for file in $main_files; do name="$(basename "$file")" + directory="$(dirname "$file")" case "${name##*.}" in "go") go run "$file" @@ -33,6 +34,10 @@ for file in $main_files; do export PYTHONPATH="$PWD/utils/python/:$PYTHONPATH" python3 "$file" ;; + "c") + out="$(mktemp --suffix=.main)" + gcc -o "$out" "$directory/"*.c utils/c/*.c && "$out" + ;; *) echo "unsupported $file" esac diff --git a/utils/c/input.c b/utils/c/input.c new file mode 100644 index 0000000..358cca0 --- /dev/null +++ b/utils/c/input.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +#include "input.h" + +input_t read_input_impl(char *main_file) { + char *directory = dirname(main_file); + + size_t directory_length = strlen(directory); + + // Room for the directory, a slash, input.txt and a null byte + size_t path_length = path_length + 1 + 9 + 1; + char *input_path = (char *)malloc(path_length); + if (input_path == NULL) { + return NULL; + } + strncpy(input_path, directory, path_length); + strncpy(input_path + directory_length, "/input.txt", path_length); + input_path[path_length - 1] = 0; + + FILE *file = fopen(input_path, "r"); + fseek(file, 0, SEEK_END); + size_t file_size = ftell(file); + fseek(file, 0, SEEK_SET); + + char *input = malloc(file_size + 1); + fread(input, sizeof(char), file_size, file); + fclose(file); + input[file_size] = 0; + + return (input_t)input; +} diff --git a/utils/c/input.h b/utils/c/input.h new file mode 100644 index 0000000..978324b --- /dev/null +++ b/utils/c/input.h @@ -0,0 +1,12 @@ +#ifndef __INPUT_H__ +#define __INPUT_H__ + +#include + +typedef char* input_t; + +#define read_input() read_input_impl(__FILE__) + +input_t read_input_impl(char *main_file); + +#endif