9511_project01

project 1 for algorithms & programming I (9511) prof. Cardozo
Index Commits Files Refs README
commit 079b0ef6c40e936f61d157c988f5ab9aa56f4e43
parent a7ad93763f665debfe54e711119f8a3c88c9ea25
Author: klewer-martin <martin.cachari@gmail.com>
Date:   Sun,  7 Feb 2021 23:41:28 -0300

Updated source code, trying to separeta bigger functions into more
smaller ones. Readlines.c needs to be smaller;

Diffstat:
MMakefile | 2+-
Mmacros.h | 35-----------------------------------
Mmain.c | 2+-
Moutput.txt | 4++++
Mreadlines.c | 61++++++++++++++++++++++++++++++++++++++++++++-----------------
Mreadlines.h | 6+++---
6 files changed, 53 insertions(+), 57 deletions(-)
diff --git a/Makefile b/Makefile
@@ -27,4 +27,4 @@ clean:
     rm -f *.o 
 
 run: 
-    ./main -in input.csv
+    ./main -in input.csv -out output.txt
diff --git a/macros.h b/macros.h
@@ -10,39 +10,4 @@
 
 #define INITIAL_SIZE        1000
 
-/*
-#define MSG_ERROR_NULL_POINTER    "ERROR_NULL_POINTER\n"\
-                                "An unexpected error has occured during the execution\n"\
-                                "of the program"
-
-#define MSG_ERROR_INVOCATING_PROGRAM    "\nERROR_INVOCATING_PROGRAM\n"\
-                                        "Usage:\t$ ./main -in <input file> -out <outputfile>\n"\
-                                        "\t$ ./main -out <output file -in <input file>\n"\
-                                        "Read documentation to know more"
-
-#define MSG_IO_FILE_NOT_FOUND     "\nIO_FILE_NOT_FOUND\n"\
-                                "Un de los archivos de entrada o salida no se ha especificado"\
-
-#define MSG_ERROR_LOADING_COUNTRY_CODES "\nERROR_LOADING_COUNTRY_CODES\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\n"
-
-#define MSG_ERROR_PRINTING
-
-#define MSG_ERROR_READING_FILE            "\nERROR_READING_FILE\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        "\nstrftime(3): el formato especificado "
-
-#define MSG_ERROR_DATA_ON_FILE_MISSING    "\nERROR_DATA_ON_FILE_MISSING\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 "\nEverything executed correctly.\n"
-*/
 #endif
diff --git a/main.c b/main.c
@@ -53,7 +53,7 @@ int main(int argc, char * argv[])
         return ERROR_LOADING_COUNTRY_CODES;    
     }
 
-    if((st = readlines(src, dest)) != OK) {
+    if((st = readlines(src, dest, country_codes)) != OK) {
         print_error(st);
         return st;
     }    
diff --git a/output.txt b/output.txt
@@ -10,6 +10,8 @@ Pais: Argentina
 Fecha: 15 Jan 2020
 Infectados: 9324
 
+Infectados por mes: 16589
+
 Pais: Colombia
 Fecha: 01 Jan 2020
 Infectados: 8234
@@ -22,6 +24,8 @@ Pais: Colombia
 Fecha: 15 Jan 2020
 Infectados: 9423
 
+Infectados por mes: 35246
+
 Pais: Germany
 Fecha: 01 Jan 2020
 Infectados: 8432
diff --git a/readlines.c b/readlines.c
@@ -5,7 +5,7 @@
 
 const char formato_de_la_fecha[] = "%d %b %Y";
 
-status_t readlines(char *src, char *dest)
+status_t readlines(char *src, char *dest, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH])
 {
     size_t line, i, j;
     status_t st;
@@ -29,13 +29,16 @@ status_t readlines(char *src, char *dest)
     unsigned long date;
     unsigned long infected;
 
-//    Arreglo para almacenar los codigos de los paises segun el standard iso3166-1,
-    char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH];
+    unsigned long prev_country;
 
-//    Carga los datos al arreglo mencionado previamente, en caso de haber algun
-//    error devuelve el codigo de dicho error;
-    if((st = load_country_codes(country_codes)) != OK) 
-        return st;
+    char time_s[TIME_MAX_DIGITS];
+    unsigned int month;
+    unsigned int prev_month;
+
+//    Inizializamos la variable country en cero;
+    prev_country = 0; 
+    prev_month = -1;
+    unsigned long infected_monthly;
     
 //    Abre el archivo de entrada en modo lectura si por algun motivo no se puede
 //    abrir devuelve un codigo de error;
@@ -55,7 +58,6 @@ status_t readlines(char *src, char *dest)
 //            un pais, una fecha o el numero de infectados;
             for(i = 0, j = 0, data = PAIS; buff1[i] != '\0'; i++)
             {
-
 //                Si encuentra una coma cambia el tipo de dato;
                 if((buff1[i] == ','))
                 {
@@ -66,7 +68,9 @@ status_t readlines(char *src, char *dest)
 //                    coma va a guardarlo de distinta manera, ej: si el dato que
 //                    se guardo en buff2 era el codigo de un PAIS, entonces lo 
 //                    guarda en la variable country, si el tipo de dato que se 
-//                    guardo en buff2 era una fecha entonces lo guarda en date, etc;
+//                    guardo en buff2 era una fecha entonces lo guarda en date, etc.
+//                    Solo puede ser PAIS o DATE, ya que INFECTADOS seria cuando
+//                    ecuentra un caracter de nueva linea;
                     switch(data) 
                     {
                         case PAIS: country = atoi(buff2); break;
@@ -110,9 +114,30 @@ status_t readlines(char *src, char *dest)
                     case INFECTED: buff2[j] = buff1[i]; j++; break;
                 }
             }
+
+            time_translator(date, time_s, sizeof(time_s), "%m");
+            month = atoi(time_s);
+            printf("%d\n", month);
+
+            if(prev_country == 0 && prev_month == -1) {
+                prev_country = country;
+                prev_month = month;
+            }
+
+//            Imprime la suma de infectados por mes cada vez que cambia el pais;
+            if(country == prev_country && month == prev_month) {
+                infected_monthly += infected;
+            }    
+            else if(country != prev_country) {
+                fprintf(fpo, "Infectados por mes: %lu\n\n", infected_monthly);    
+                prev_country = country;
+            }
+
+//            Imprime datos segun el archivo de entrada;
             fprintf_country(fpo, country, country_codes);
             fprintf_date(fpo, date);
-            fprintf_infected(fpo, infected);
+            fprintf_infected(fpo, infected, '\n');
+
         }
     }
 
@@ -122,7 +147,6 @@ status_t readlines(char *src, char *dest)
 }
 
 
-
 status_t fprintf_country(FILE *dest, size_t country_code, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH])
 {
     if((country_codes == NULL) || (dest == NULL))
@@ -140,19 +164,19 @@ status_t fprintf_date(FILE *dest, size_t date)
     if(dest == NULL)
         return ERROR_NULL_POINTER;
 
-    if((st = time_translator(date, time_c, sizeof(time_c))) != OK)
+    if((st = time_translator(date, time_c, sizeof(time_c), formato_de_la_fecha)) != OK)
         return st;
 
     fprintf(dest, "Fecha: %s\n", time_c);
     return OK;
 }
 
-status_t fprintf_infected(FILE *dest, size_t infected)
+status_t fprintf_infected(FILE *dest, size_t infected, char newline)
 {
     if(dest == NULL)
         return ERROR_NULL_POINTER;
 
-    fprintf(dest, "Infectados: %lu\n\n", infected);
+    fprintf(dest, "Infectados: %lu\n%c", infected, newline);
     return OK;
 }
 
@@ -169,12 +193,15 @@ status_t clean_buffer(char *buffer, size_t size)
 }
 
 
-status_t time_translator(time_t unix_time, char *res, size_t size) 
+
+//    Traduce de la fecha de formato unix a format y lo guarda en res como
+//    como una cadena de caracteres;
+status_t time_translator(time_t unix_time, char *res, size_t size, const char *format) 
 {
-    if(res == NULL)
+    if(res == NULL || format == NULL)
         return ERROR_NULL_POINTER;
 
-    const char *format = formato_de_la_fecha;
+    
     struct tm *tmp = gmtime(&unix_time);
 
     if (strftime(res, size, format, tmp) == 0) {
diff --git a/readlines.h b/readlines.h
@@ -20,11 +20,11 @@ typedef enum {
     INFECTED
 } data_t;
 
-status_t readlines(char *src, char *dest);
+status_t readlines(char *src, char *dest, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]);
 status_t fprintf_date(FILE *dest, size_t data);
-status_t fprintf_infected(FILE *dest, size_t data);
+status_t fprintf_infected(FILE *dest, size_t data, char newline);
 status_t clean_buffer(char *buffer, size_t size);
-status_t time_translator(time_t unix_time, char *res, size_t size); 
+status_t time_translator(time_t unix_time, char *res, size_t size, const char *format); 
 status_t fprintf_country(FILE *dest, size_t country_code, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]);
 
 #endif