Implement loading from .csv
authorLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Sat, 8 Jun 2024 14:28:06 +0000 (16:28 +0200)
committerLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Sat, 8 Jun 2024 14:28:06 +0000 (16:28 +0200)
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
inc/railnation_calc.h
src/load.c [new file with mode: 0644]
src/main.c

index be8c4fa1230821716f0e462211eb83075c500ff1..38d10ec54b39a160ae9acbdb8b62b8b9f61bf240 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -12,6 +12,7 @@ INCLUDE := $(addprefix -I, $(INCDIR))
 SRCDIR := src
 
 SOURCES :=     main.c                  \
+                       load.c                  \
 
 SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES))
 
index 36f4eaa34158a3d0be71f20ced79e4fc44cd75eb..37b83a97c9b50a9bda1c4ae8d69920a74b057f96 100644 (file)
@@ -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 (file)
index 0000000..10e6311
--- /dev/null
@@ -0,0 +1,114 @@
+#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);
+}
index 7320e2c3f6fa9afa6f77db171434ba4d0407d8c1..6cede178d90e0f02aabf29aec7a872f353938a15 100644 (file)
@@ -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);
 }