From 161920151d11096b9269040c5e7cbe14307207dc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Luk=C3=A1=C5=A1=20Ji=C5=99i=C5=A1t=C4=9B?= Date: Sat, 8 Jun 2024 16:28:06 +0200 Subject: [PATCH] Implement loading from .csv I think that this will not yet work, because the ft_split function does not produce empty strings when there are two separators right after each other. --- Makefile | 1 + inc/railnation_calc.h | 13 +++-- src/load.c | 114 ++++++++++++++++++++++++++++++++++++++++++ src/main.c | 11 ++-- 4 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 src/load.c diff --git a/Makefile b/Makefile index be8c4fa..38d10ec 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ INCLUDE := $(addprefix -I, $(INCDIR)) SRCDIR := src SOURCES := main.c \ + load.c \ SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES)) diff --git a/inc/railnation_calc.h b/inc/railnation_calc.h index 36f4eaa..37b83a9 100644 --- a/inc/railnation_calc.h +++ b/inc/railnation_calc.h @@ -3,12 +3,14 @@ # include "libft.h" -# define ERA_COUNT 6 +typedef enum e_train_type +{ + cargo, + passenger, +} t_train_type; typedef struct s_train_characteristics { - unsigned short era; - unsigned short size; unsigned short capacity; unsigned short reliability; unsigned short acceleration; @@ -25,9 +27,14 @@ typedef struct s_upgrade typedef struct s_train { + unsigned short era; + unsigned short size; char *name; + t_train_type type; t_train_characteristics base; t_vec upgrades; } t_train; +t_vec load_catalog(const char *database_file_name); + #endif //RAILNATION_CALC_H diff --git a/src/load.c b/src/load.c new file mode 100644 index 0000000..10e6311 --- /dev/null +++ b/src/load.c @@ -0,0 +1,114 @@ +#include "railnation_calc.h" +#include "libft.h" +#include +#include +#include + +static t_train_characteristics process_characteristics(char **split_line) +{ + t_train_characteristics characteristics; + + characteristics.capacity = ft_atoi(split_line[3]); + characteristics.reliability = ft_atoi(split_line[4]); + characteristics.acceleration = ft_atoi(split_line[5]); + characteristics.top_speed = ft_atoi(split_line[6]); + characteristics.price = ft_atoi(split_line[7]); + characteristics.research_cost = ft_atoi(split_line[8]); + return (characteristics); +} + +static int process_train(char **split_line, t_vec *catalog, unsigned short era) +{ + t_train new_train; + + if (ft_vec_init(&new_train.upgrades, sizeof(t_upgrade)) != success) + return (1); + if (!ft_strcmp(split_line[1], "passengers")) + new_train.type = passenger; + else if (!ft_strcmp(split_line[1], "cargo")) + new_train.type = cargo; + else + return (2); + new_train.name = ft_strdup(split_line[0]); + if (!new_train.name) + return (3); + new_train.era = era; + new_train.size = ft_atoi(split_line[2]); + new_train.base = process_characteristics(split_line); + if (ft_vec_append(catalog, &new_train) != success) + { + free(new_train.name); + return (4); + } + return (0); +} + +static int process_upgrade(char **split_line, t_vec *catalog) +{ + t_upgrade upgrade; + t_train *train; + size_t i; + + upgrade.name = ft_strdup(split_line[0]); + if (!upgrade.name) + return (3); + upgrade.characteristics = process_characteristics(split_line); + i = 0; + while (i < catalog->size) + { + train = ft_vec_access(catalog, i); + if (!ft_strcmp(split_line[1], train->name)) + return (4 * (ft_vec_append(&train->upgrades, &upgrade) != success)); + ++i; + } + return (5); +} + +static int process_line(const char *line, t_vec *catalog, unsigned short era) +{ + char **split_line; + size_t i; + + if (!ft_strncmp(";;", line, 2)) + return (0); + split_line = ft_split(line, ';'); + if (!split_line) + return (1); + if (!ft_strcmp(split_line[1], "passengers") || !ft_strcmp(split_line[1], "cargo")) + process_train(split_line, catalog, era); + else if (ft_strcmp(split_line[1], "coupling")) + process_upgrade(split_line, catalog); + i = 0; + while (split_line[i]) + free(split_line[i++]); + free(split_line); + return (0); +} + +t_vec load_catalog(char const *database_file_name) +{ + int fd; + t_vec catalog; + unsigned short era; + char *line; + + ft_vec_init(&catalog, sizeof(t_train)); + fd = open(database_file_name, O_RDONLY); + if (fd < 0) + return (catalog); + line = get_next_line(fd); + free(line); + line = get_next_line(fd); + era = 0; + while (line) + { + if (line[0] != ';') + era = ft_atoi(line); + else + process_line(line, &catalog, era); + free(line); + line = get_next_line(fd); + } + close(fd); + return (catalog); +} diff --git a/src/main.c b/src/main.c index 7320e2c..6cede17 100644 --- a/src/main.c +++ b/src/main.c @@ -2,15 +2,18 @@ #include "libft.h" #define DATABASE_FILE_NAME "research.csv" +int main_prompt(t_vec *catalog, t_vec *trains); +void free_train(void *train); int main(void) { - const t_vec catalog = load_catalog(DATABASE_FILE_NAME); - t_vec trains; + t_vec catalog; + t_vec trains; + catalog = load_catalog(DATABASE_FILE_NAME); ft_vec_init(&trains, sizeof(t_train)); - while (main_prompt(&catalog, &train)); + while (main_prompt(&catalog, &trains)); ft_vec_free(&trains, free_train); - free_catalog(&catalog); + ft_vec_free(&catalog, free_train); return (0); } -- 2.30.2