--- /dev/null
+#include "railnation_calc.h"
+#include "libft.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+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);
+}
#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);
}