diff --git a/c_impl/Makefile b/c_impl/Makefile index c114eb7..44e29a5 100644 --- a/c_impl/Makefile +++ b/c_impl/Makefile @@ -1,4 +1,4 @@ -COMMON_FLAGS = -Wall -Wextra -Wpedantic +COMMON_FLAGS = -std=gnu11 -Wall -Wextra -Wpedantic ifdef DEBUG CFLAGS = $(COMMON_FLAGS) -O0 -g diff --git a/c_impl/src/main.c b/c_impl/src/main.c index 11b7fad..e1a29eb 100644 --- a/c_impl/src/main.c +++ b/c_impl/src/main.c @@ -1,3 +1,113 @@ +#include +#include +#include + +#define INIT_SPLIT_LIST_SIZE 8 +#define INIT_INPUT_LIST_SIZE 8 +#define INIT_OUTPUT_LIST_SIZE 8 + +void print_help() { + puts("./program "); +} + +void print_l(unsigned int size, int *list) { + for(unsigned int i = 0; i < size; ++i) { + printf("%d ", list[i]); + } + printf("\n"); +} + +void push_l(unsigned int *size, unsigned int *capacity, int **list, int new) { + if(*size == *capacity) { + int *new_list = (int*)malloc(*capacity * sizeof(int) * 2); + memcpy(new_list, *list, *capacity * sizeof(int)); + free(*list); + *list = new_list; + *capacity = *capacity * 2; + } + + (*list)[*size] = new; + *size = *size + 1; +} + int main(int argc, char **argv) { + if(argc != 3) { + puts("ERROR: Requires two arguments:"); + print_help(); + return 1; + } + + unsigned int sl_size = 0; + unsigned int sl_capacity = INIT_SPLIT_LIST_SIZE; + int *split_list = (int*)malloc(sl_capacity * sizeof(int)); + + unsigned int il_size = 0; + unsigned int il_capacity = INIT_INPUT_LIST_SIZE; + int *input_list = (int*)malloc(il_capacity * sizeof(int)); + + int temp = 0; + for(unsigned int i = 0; argv[1][i] != 0; ++i) { + if(argv[1][i] != ',') { + temp = temp * 10 + (int)(argv[1][i] - '0'); + } else { + push_l(&sl_size, &sl_capacity, &split_list, temp); + temp = 0; + } + } + push_l(&sl_size, &sl_capacity, &split_list, temp); + temp = 0; + + for(unsigned int i = 0; argv[2][i] != 0; ++i) { + if(argv[2][i] != ',') { + temp = temp * 10 + (int)(argv[2][i] - '0'); + } else { + push_l(&il_size, &il_capacity, &input_list, temp); + temp = 0; + } + } + push_l(&il_size, &il_capacity, &input_list, temp); + + puts("Got input:"); + print_l(sl_size, split_list); + print_l(il_size, input_list); + + unsigned int *out_sizes = (unsigned int*)calloc( + sl_size, sizeof(unsigned int)); + unsigned int *out_capacities = (unsigned int*)malloc( + sl_size * sizeof(unsigned int)); + for(unsigned int i = 0; i < sl_size; ++i) { + out_capacities[i] = INIT_OUTPUT_LIST_SIZE; + } + int **out_lists = (int**)malloc( + sl_size * sizeof(int*)); + for(unsigned int i = 0; i < sl_size; ++i) { + out_lists[i] = (int*)malloc( + INIT_OUTPUT_LIST_SIZE * sizeof(int)); + } + + unsigned int il_idx = 0; + for(unsigned int i = 0; i < sl_size; ++i) { + for(unsigned int j = 0; j < split_list[i]; ++j) { + if(il_idx >= il_size) { + } else { + push_l(out_sizes + i, out_capacities + i, out_lists + i, + input_list[il_idx++]); + } + } + } + + puts("Output lists:"); + for(unsigned int i = 0; i < sl_size; ++i) { + print_l(out_sizes[i], out_lists[i]); + } + + free(split_list); + free(input_list); + free(out_sizes); + free(out_capacities); + for(unsigned int i = 0; i < sl_size; ++i) { + free(out_lists[i]); + } + free(out_lists); return 0; }