9511_project01

project 1 for algorithms & programming I (9511) prof. Cardozo
Index Commits Files Refs README
commit 249ec1ae34e4389b8a9a588dc8f61447af644919
parent 4a26fde3a0287ba15d08a369427dd40411b86183
Author: klewer-martin <martin.cachari@gmail.com>
Date:   Thu, 15 Apr 2021 01:14:02 -0300

Update: Little improvements in main, now the country codes array is dynamic

Diffstat:
MMakefile | 12++++++------
Mload_country_codes.c | 4++--
Mload_country_codes.h | 6++++--
Mmain.c | 34+++++++++++++++++++++++++---------
Dperrors.c | 37-------------------------------------
Dperrors.h | 46----------------------------------------------
Aprint_error.c | 37+++++++++++++++++++++++++++++++++++++
Aprint_error.h | 46++++++++++++++++++++++++++++++++++++++++++++++
Mprint_file.c | 2+-
9 files changed, 121 insertions(+), 103 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,10 +1,10 @@
 CC = gcc
-CFLAGS = -std=c99 -Wall -pedantic
+CFLAGS = -std=c99 -Wall -pedantic -g
 
 all: main clean
 
-main: main.o arguments.o perrors.o load_country_codes.o read_file.o print_file.o
-    $(CC) $(CFLAGS) main.o arguments.o perrors.o load_country_codes.o read_file.o print_file.o -g -o analisis_covid 
+main: main.o arguments.o print_error.o load_country_codes.o read_file.o print_file.o
+    $(CC) $(CFLAGS) main.o arguments.o print_error.o load_country_codes.o read_file.o print_file.o -o analisis_covid 
 
 main.o: main.c main.h arguments.h macros.h
     $(CC) $(CFLAGS) -c main.c
@@ -12,12 +12,12 @@ main.o: main.c main.h arguments.h macros.h
 arguments.o: arguments.c arguments.h macros.h
     $(CC) $(CFLAGS) -c arguments.c
 
-perrors.o: main.c main.h
-    $(CC) $(CFLAGS) -c perrors.c
-
 load_country_codes.o: load_country_codes.h main.h
     $(CC) $(CFLAGS) -c load_country_codes.c 
 
+print_error.o: main.c main.h
+    $(CC) $(CFLAGS) -c print_error.c
+
 read_file.o: read_file.h main.h
     $(CC) $(CFLAGS) -c read_file.c
 
diff --git a/load_country_codes.c b/load_country_codes.c
@@ -6,7 +6,7 @@
 #include "load_country_codes.h"
 
 
-status_t load_country_codes(char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH])
+status_t load_country_codes(char **country_codes)
 {
     FILE *fp;
 
@@ -75,7 +75,7 @@ status_t clean (char *buffer, size_t size)
 }
 
 //    Inicializa el arreglo alocando el caracter '\0' en todas las posiciones;
-status_t empty_country_codes(char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]) 
+status_t empty_country_codes(char **country_codes) 
 {
     size_t i, j;
     for(i = 0; i < COUNTRIES_NUMBER; i++)
diff --git a/load_country_codes.h b/load_country_codes.h
@@ -10,7 +10,9 @@ typedef enum {
 } part_t;
 
 status_t clean (char *buffer, size_t size);
-status_t empty_country_codes(char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]); 
-status_t load_country_codes(char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]);
+//status_t empty_country_codes(char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]); 
+status_t empty_country_codes(char **country_codes); 
+//status_t load_country_codes(char country_codes[][ARRAYS_LENGTH]);
+status_t load_country_codes(char **country_codes);
 
 #endif
diff --git a/main.c b/main.c
@@ -21,8 +21,15 @@
 #include "load_country_codes.h"
 #include "read_file.h"
 #include "print_file.h"
-#include "perrors.h"
+#include "print_error.h"
 
+void free_array(char **arr)
+{
+    for (size_t i = 0; i < COUNTRIES_NUMBER; i++)
+         free(arr[i]);
+
+    free(arr);
+}
 
 int main(int argc, char * argv[])
 {
@@ -31,32 +38,37 @@ int main(int argc, char * argv[])
 //    Las siguientes variables son para guardar los nombres de los archivos de 
 //    entrada y salida luego de validar los argumentos
 //    char src[MAX_NAME_LENGTH], dest[MAX_NAME_LENGTH];
-    char *src;
-    char *dest;
+    char src[MAX_NAME_LENGTH];
+    char dest[MAX_NAME_LENGTH];
 
-    src = (char *)malloc(MAX_NAME_LENGTH);
-    dest = (char *)malloc(MAX_NAME_LENGTH);
+    //src = (char *)malloc(MAX_NAME_LENGTH);
+    //dest = (char *)malloc(MAX_NAME_LENGTH);
 
     FILE *fpi, *fpo;
     uint country, date, infected;
 
     country = date = infected = 0;
+
     prev_month = prev_country = -1;
     infected_monthly = 0;
 
 //    Arreglo de arreglos de caracteres para guardar los codigos de los paises
-    char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH];
+//    char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH];
+    char **country_codes = (char **)malloc(COUNTRIES_NUMBER * sizeof(char *));
+    for (size_t i = 0; i < COUNTRIES_NUMBER; i++)
+         country_codes[i] = (char *)malloc(ARRAYS_LENGTH * sizeof(double));
 
 //    Valida de que los argumentos sean correctos y guarda los nombres de los
 //    archivos de entrada y salida en src y dest respectivamente
     if((st = validate_arguments(argc, argv, src, dest)) != OK) {
+        free_array(country_codes);
         print_error(st);
         return st;
     }
-    
 //    Carga los codigos de error de los paises de acuerdo al standard iso3166 en
 //    el arreglo mencionado previamente 'country_codes'  
     if((st = load_country_codes(country_codes)) != OK) {
+        free_array(country_codes);
         print_error(st);
         return ERROR_LOADING_COUNTRY_CODES;    
     }
@@ -65,12 +77,15 @@ int main(int argc, char * argv[])
     if((fpi = fopen(src, "r")) == NULL) {
         fclose(fpi);
         print_error(ERROR_READING_FILE);
+        free_array(country_codes);
         return ERROR_READING_FILE;
     }
 
 //    Abre el archivo de salida en modo escritura
     if((fpo = fopen(dest, "w")) == NULL) {
+        fclose(fpi);
         fclose(fpo);
+        free_array(country_codes);
         print_error(ERROR_READING_FILE);
         return ERROR_READING_FILE;
     }
@@ -79,13 +94,14 @@ int main(int argc, char * argv[])
     size_t line;
     for(line = 0; (st = read_file(fpi, &country, &date, &infected)) == OK; line++) {
         if(line != 0) {
-            print_file(fpo, country_codes, &country, &date, &infected);
+//            print_file(fpo, country_codes, &country, &date, &infected);
         }
     }
 
 
 //    Si hubo algun error al leer o escribir el archivo va a imprimir un error
     if((st != OK) && (st != END_OF_INPUT_FILE)) {
+        free_array(country_codes);
         fclose(fpi);
         fclose(fpo);
         print_error(st);
@@ -97,7 +113,7 @@ int main(int argc, char * argv[])
 
     fclose(fpi);
     fclose(fpo);
-
+    free_array(country_codes);
     printf(MSG_OK);
     return OK;
 }
diff --git a/perrors.c b/perrors.c
@@ -1,37 +0,0 @@
-#include "perrors.h"
-#include "main.h"
-
-//    The switch below the order of the error must be in the same as "main.h" 
-//    status_t structure, in order to print the correct errors;
-void print_error(status_t error)
-{
-    switch (error) {
-        case IO_FILE_NOT_FOUND: 
-            fprintf(stderr, MSG_IO_FILE_NOT_FOUND"\n");
-            break;
-        case ERROR_INVOCATING_PROGRAM: 
-            fprintf(stderr, MSG_ERROR_INVOCATING_PROGRAM"\n");
-            break;
-        case ERROR_NULL_POINTER:
-            fprintf(stderr, MSG_ERROR_NULL_POINTER"\n");
-            break;
-        case ERROR_LOADING_COUNTRY_CODES:
-            fprintf(stderr, MSG_ERROR_LOADING_COUNTRY_CODES"\n");
-            break;
-        case ERROR_PRINTING: 
-            fprintf(stderr, MSG_ERROR_PRINTING"\n");
-            break;
-        case ERROR_READING_FILE:
-            fprintf(stderr, MSG_ERROR_READING_FILE"\n");
-            break;
-        case ERROR_ALLOCATING_TIME: 
-            fprintf(stderr, MSG_ERROR_ALLOCATING_TIME"\n");
-            break;
-        case ERROR_DATA_ON_FILE_MISSING: 
-            fprintf(stderr, MSG_ERROR_DATA_ON_FILE_MISSING"\n");
-            break;
-        default:
-            fprintf(stdin, MSG_OK"\n");
-    }
-}
-
diff --git a/perrors.h b/perrors.h
@@ -1,46 +0,0 @@
-#ifndef DATA_H
-#define DATA_H
-
-#include "main.h"
-
-#define MSG_ERROR_NULL_POINTER    "ERROR_NULL_POINTER (3)\n"\
-                                "Un error inesperado ha ocurrido durante la ejecucion de\n"\
-                                "el programa"
-
-#define MSG_ERROR_INVOCATING_PROGRAM    "\nERROR_INVOCATING_PROGRAM (2)\n"\
-                                        "Uso:\t$ ./main -in <input file> -out <outputfile>\n"\
-                                        "\t    $ ./main -out <output file -in <input file>\n\n"\
-                                        "Lee el archivo README.md para saber mas"
-
-#define MSG_IO_FILE_NOT_FOUND     "\nIO_FILE_NOT_FOUND (1)\n"\
-                                "Un de los archivos de entrada o salida no se ha especificado"\
-
-#define MSG_ERROR_LOADING_COUNTRY_CODES "\nERROR_LOADING_COUNTRY_CODES (4)\n"\
-                                        "Ha ocurrido un error al cargar los codigos de los paises.\n"\
-                                        "compruebe que el archivo \""COUNTRY_CODES_FILE_NAME"\" se encuentre\n"\
-                                        "disponible en el directorio de el programa ejecutado y que\n"\
-                                        "el nombre coincida con el de \"COUNTRY_CODES_FILE_NAME\" dentro\n"\
-                                        "de el archivo main.h"
-
-#define MSG_ERROR_PRINTING
-
-#define MSG_ERROR_READING_FILE            "\nERROR_READING_FILE (6)\n"\
-                                        "El archivo de entrada no pudo ser leido, compruebe que el nombre este\n"\
-                                        "escrito correctamente y la existencia de el mismo"
-
-#define MSG_ERROR_ALLOCATING_TIME        "\nERROR_ALOCATING_TIME (7)\n"\
-                                        "Hubo un problema inesperado durante la traduccion de la fecha al formato\n"\
-                                        "especificado."
-
-#define MSG_ERROR_DATA_ON_FILE_MISSING    "\nERROR_DATA_ON_FILE_MISSING (8)\n"\
-                                        "En alguna linea de el archivo de entrada falta un dato,\n"\
-                                        "compruebe que dicho archivo no esta corrupto y ejecute\n"\
-                                        "el programa nuevamente"
-
-#define MSG_OK "\nOperacion realizada exitosamente!\n"
-
-
-void print_error(status_t error);
-
-
-#endif
diff --git a/print_error.c b/print_error.c
@@ -0,0 +1,37 @@
+#include "print_error.h"
+#include "main.h"
+
+//    The switch below the order of the error must be in the same as "main.h" 
+//    status_t structure, in order to print the correct errors;
+void print_error(status_t error)
+{
+    switch (error) {
+        case IO_FILE_NOT_FOUND: 
+            fprintf(stderr, MSG_IO_FILE_NOT_FOUND"\n");
+            break;
+        case ERROR_INVOCATING_PROGRAM: 
+            fprintf(stderr, MSG_ERROR_INVOCATING_PROGRAM"\n");
+            break;
+        case ERROR_NULL_POINTER:
+            fprintf(stderr, MSG_ERROR_NULL_POINTER"\n");
+            break;
+        case ERROR_LOADING_COUNTRY_CODES:
+            fprintf(stderr, MSG_ERROR_LOADING_COUNTRY_CODES"\n");
+            break;
+        case ERROR_PRINTING: 
+            fprintf(stderr, MSG_ERROR_PRINTING"\n");
+            break;
+        case ERROR_READING_FILE:
+            fprintf(stderr, MSG_ERROR_READING_FILE"\n");
+            break;
+        case ERROR_ALLOCATING_TIME: 
+            fprintf(stderr, MSG_ERROR_ALLOCATING_TIME"\n");
+            break;
+        case ERROR_DATA_ON_FILE_MISSING: 
+            fprintf(stderr, MSG_ERROR_DATA_ON_FILE_MISSING"\n");
+            break;
+        default:
+            fprintf(stdin, MSG_OK"\n");
+    }
+}
+
diff --git a/print_error.h b/print_error.h
@@ -0,0 +1,46 @@
+#ifndef PRINT_ERROR_H
+#define PRINT_ERROR_H
+
+#include "main.h"
+
+#define MSG_ERROR_NULL_POINTER    "ERROR_NULL_POINTER (3)\n"\
+                                "Un error inesperado ha ocurrido durante la ejecucion de\n"\
+                                "el programa"
+
+#define MSG_ERROR_INVOCATING_PROGRAM    "\nERROR_INVOCATING_PROGRAM (2)\n"\
+                                        "Uso:\t$ ./main -in <input file> -out <outputfile>\n"\
+                                        "\t    $ ./main -out <output file -in <input file>\n\n"\
+                                        "Lee el archivo README.md para saber mas"
+
+#define MSG_IO_FILE_NOT_FOUND     "\nIO_FILE_NOT_FOUND (1)\n"\
+                                "Un de los archivos de entrada o salida no se ha especificado"\
+
+#define MSG_ERROR_LOADING_COUNTRY_CODES "\nERROR_LOADING_COUNTRY_CODES (4)\n"\
+                                        "Ha ocurrido un error al cargar los codigos de los paises.\n"\
+                                        "compruebe que el archivo \""COUNTRY_CODES_FILE_NAME"\" se encuentre\n"\
+                                        "disponible en el directorio de el programa ejecutado y que\n"\
+                                        "el nombre coincida con el de \"COUNTRY_CODES_FILE_NAME\" dentro\n"\
+                                        "de el archivo main.h"
+
+#define MSG_ERROR_PRINTING
+
+#define MSG_ERROR_READING_FILE            "\nERROR_READING_FILE (6)\n"\
+                                        "El archivo de entrada no pudo ser leido, compruebe que el nombre este\n"\
+                                        "escrito correctamente y la existencia de el mismo"
+
+#define MSG_ERROR_ALLOCATING_TIME        "\nERROR_ALOCATING_TIME (7)\n"\
+                                        "Hubo un problema inesperado durante la traduccion de la fecha al formato\n"\
+                                        "especificado."
+
+#define MSG_ERROR_DATA_ON_FILE_MISSING    "\nERROR_DATA_ON_FILE_MISSING (8)\n"\
+                                        "En alguna linea de el archivo de entrada falta un dato,\n"\
+                                        "compruebe que dicho archivo no esta corrupto y ejecute\n"\
+                                        "el programa nuevamente"
+
+#define MSG_OK "\nOperacion realizada exitosamente!\n"
+
+
+void print_error(status_t error);
+
+
+#endif
diff --git a/print_file.c b/print_file.c
@@ -99,7 +99,7 @@ void fprintf_infected_monthly(FILE *dest)
     char guion_medio[] = "-----------";
 
     int length = snprintf( NULL, 0, "%lu", infected_monthly );
-    char* str_infected_monthly = (char *)malloc( length + 1 );
+    char* str_infected_monthly = (char *)malloc( length + 1 * sizeof(char) );
     snprintf( str_infected_monthly, length + 1, "%lu", infected_monthly );