9511_project01

project 1 for algorithms & programming I (9511) prof. Cardozo
Index Commits Files Refs README
commit b850c223aed87337023485dd77b7ee36e1d4fd14
parent ecc06276643f36b9c1b9e62a2ae276127ecc330e
Author: Martin J. Klöckner <64109770+klewer-martin@users.noreply.github.com>
Date:   Wed, 10 Feb 2021 18:54:07 -0300

Merge pull request #12 from klewer-martin/alpha

Alpha
Diffstat:
MMakefile | 3+++
Marguments.c | 22+++++++++++++---------
Mmacros.h | 7++++---
Mmain.c | 27++++++++++-----------------
Mmain.h | 2+-
Mperrors.h | 15++++++++-------
Mprint_file.c | 6+++---
Mprint_file.h | 4++--
Mread_file.c | 2+-
Mread_file.h | 6+-----
10 files changed, 46 insertions(+), 48 deletions(-)
diff --git a/Makefile b/Makefile
@@ -30,3 +30,6 @@ clean:
 
 run: 
     ./main -in input.csv -out output.txt
+
+run2: 
+    ./main -out output.txt -in input.csv 
diff --git a/arguments.c b/arguments.c
@@ -4,30 +4,30 @@
 //    archivos de entrada y salida en src y dest respectivamente;
 status_t validate_arguments(int argc, char * argv[], char * src, char * dest)
 {
-    if(argc == NO_CMD_ARGUMENTS)
-        return ERROR_INVOCATING_PROGRAM;
-    else if(argc == ONE_CMD_ARGUMENT)
+    if(argc < EXPECTED_CMD_ARGUMENTS || argc > EXPECTED_CMD_ARGUMENTS)
         return ERROR_INVOCATING_PROGRAM;
     else if(argv == NULL)
         return ERROR_NULL_POINTER;
 
-    int i;
     status_t inputFile, outputFile;
     inputFile = outputFile = IO_FILE_NOT_FOUND;
 
+    size_t i;
     for(i = 1; i < argc; i++) {
 //        Comprueba que el primer argumento sea INPUT_ARGUMENT ('-in');
         if(!strcmp(argv[i], INPUT_ARGUMENT)) {
-            printf(INPUT_ARGUMENT_FOUND_MSG);
 
 //            Si el argumento que sigue es OUTPUT_ARGUMENT entonces hay un error
-//            en la invocacion de el programa;
+//            en la invocacion de el programa, y si el que le sigue a ese no es
+//            OUTPUT_ARGUMENT estamos ante un problema de orden de argumentos;
             if(!strcmp(argv[i + 1], OUTPUT_ARGUMENT))
                 return ERROR_INVOCATING_PROGRAM;
 
 //            Si el primer argumento esta bien y el siguiente es una cadena entonces
 //            guarda en src la cadena e imprime dicha cadena;
             strcpy(src, argv[++i]);
+
+            printf(INPUT_ARGUMENT_FOUND_MSG);
             printf(INPUT_FILE_NAME_MSG"'%s'\n", src);
 
 //            Marca el archivo de entrada como encontrado;
@@ -35,12 +35,15 @@ status_t validate_arguments(int argc, char * argv[], char * src, char * dest)
 
 //        Procede de la misma forma pero para OUTPUT_ARGUMENT ('-out');
         } else if(!strcmp(argv[i], OUTPUT_ARGUMENT)) {
-            printf(OUTPUT_ARGUMENT_FOUND_MSG);
+
             if(!strcmp(argv[i + 1], INPUT_ARGUMENT))
                 return ERROR_INVOCATING_PROGRAM;
 
             strcpy(dest, argv[++i]);
-            printf(OUTPUT_FILE_NAME_MSG"'%s'\n", argv[i]);
+
+            printf(OUTPUT_ARGUMENT_FOUND_MSG);
+            printf(OUTPUT_FILE_NAME_MSG"'%s'\n", dest);
+
             outputFile = OK;
         }
     }
@@ -48,8 +51,9 @@ status_t validate_arguments(int argc, char * argv[], char * src, char * dest)
 //    Si uno o ambos de los argumentos no se encontro entonces imprime un codigo 
 //    de error;
     if((inputFile && outputFile) != OK)
-        return IO_FILE_NOT_FOUND;
+        return ERROR_INVOCATING_PROGRAM;
 
     return OK;
 }
 
+
diff --git a/macros.h b/macros.h
@@ -1,15 +1,16 @@
 #ifndef MACROS_H
 #define MACROS_H
 
-#define NO_CMD_ARGUMENTS    1
-#define ONE_CMD_ARGUMENT    2
-#define MAX_CMD_ARGUMENTS    5
+#define NO_CMD_ARGUMENTS        1
+#define ONE_CMD_ARGUMENT        2
+#define EXPECTED_CMD_ARGUMENTS    5
 
 #define INPUT_ARGUMENT            "-in"
 #define OUTPUT_ARGUMENT            "-out"
 
 #define INITIAL_SIZE        1000
 
+typedef unsigned int uint;
 typedef unsigned long ulong;
 
 #endif
diff --git a/main.c b/main.c
@@ -25,56 +25,49 @@
 
 int main(int argc, char * argv[])
 {
-
-//    Esta variable es para guardar los codigos de error;
     status_t st;
 
 //    Las siguientes variables son para guardar los nombres de los archivos de 
-//    entrada y salida luego de validar que los argumentos recibidos sean correctos;
+//    entrada y salida luego de validar los argumentos
     char src[32], dest[32];
 
     FILE *fpi, *fpo;
-    ulong country, date, infected;
-    country = date = infected = 0;
+    uint country, date, infected;
 
+    country = date = infected = 0;
     prev_month = prev_country = -1;
-
     infected_monthly = 0;
 
-//    El siguiente arreglo de dos dimensiones es donde se van a guardar los
-//    codigos    de los paises;
+//    Arreglo de arreglos de caracteres para guardar los codigos de los paises
     char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH];
-
+    
 //    Valida de que los argumentos sean correctos y guarda los nombres de los
-//    archivos de entrada y salida en src y dest respectivamente, de haber algun
-//    error en el proceso devuelve un codigo de error de tipo status_t (definido
-//    en main.h);
+//    archivos de entrada y salida en src y dest respectivamente
     if((st = validate_arguments(argc, argv, src, dest)) != OK) {
         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', en caso de haber algun
-//    error en el proceso devuelve dicho codigo e impreme por stderr un mensaje
-//    de error; 
+//    el arreglo mencionado previamente 'country_codes'  
     if((st = load_country_codes(country_codes)) != OK) {
         print_error(st);
         return ERROR_LOADING_COUNTRY_CODES;    
     }
 
-//    Abre el archivo de entrada en modo lectura, y el de salida en modo 
-//    escritura, si por algun motivo falla imprime un codigo de error;
+//    Abre el archivo de entrada en modo lectura
     if((fpi = fopen(src, "r")) == NULL) {
         fclose(fpi);
         return ERROR_READING_FILE;
     }
 
+//    Abre el archivo de salida en modo escritura
     if((fpo = fopen(dest, "w")) == NULL) {
         fclose(fpo);
         return ERROR_READING_FILE;
     }
 
+//    Lee el archivo de entrada y va imprimiendo linea por linea en el de salida
     size_t line;
     for(line = 0; (st = read_file(fpi, &country, &date, &infected)) == OK; line++) {
         if(line != 0) {
diff --git a/main.h b/main.h
@@ -26,7 +26,7 @@
 
 extern const char formato_de_la_fecha[];
 
-extern ulong country, date, infected;
+extern uint country, date, infected;
 
 extern ulong infected_monthly;
 
diff --git a/perrors.h b/perrors.h
@@ -3,19 +3,19 @@
 
 #include "main.h"
 
-#define MSG_ERROR_NULL_POINTER    "ERROR_NULL_POINTER\n"\
+#define MSG_ERROR_NULL_POINTER    "ERROR_NULL_POINTER (3)\n"\
                                 "An unexpected error has occured during the execution\n"\
                                 "of the program"
 
-#define MSG_ERROR_INVOCATING_PROGRAM    "\nERROR_INVOCATING_PROGRAM\n"\
+#define MSG_ERROR_INVOCATING_PROGRAM    "\nERROR_INVOCATING_PROGRAM (2)\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"\
+#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\n"\
+#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"\
@@ -24,13 +24,14 @@
 
 #define MSG_ERROR_PRINTING
 
-#define MSG_ERROR_READING_FILE            "\nERROR_READING_FILE\n"\
+#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        "\nstrftime(3): el formato especificado "
+#define MSG_ERROR_ALLOCATING_TIME        "\nERROR_ALOCATING_TIME (7)\n"\
+                                        "strftime(3): el formato especificado\n"
 
-#define MSG_ERROR_DATA_ON_FILE_MISSING    "\nERROR_DATA_ON_FILE_MISSING\n"\
+#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"
diff --git a/print_file.c b/print_file.c
@@ -5,7 +5,7 @@ const char formato_de_la_fecha[] = "%d %b %Y";
 int prev_month, prev_country;
 ulong infected_monthly;
 
-status_t print_file(FILE *dest, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH], ulong *country, ulong *date, ulong *infected) {
+status_t print_file(FILE *dest, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH], uint *country, uint *date, uint *infected) {
 
     int month;
     char time_s[TIME_MAX_DIGITS];
@@ -68,12 +68,12 @@ status_t fprintf_date(FILE *dest, size_t date)
     return OK;
 }
 
-status_t fprintf_infected(FILE *dest, size_t infected, char newline)
+status_t fprintf_infected(FILE *dest, uint infected, char newline)
 {
     if(dest == NULL)
         return ERROR_NULL_POINTER;
 
-    fprintf(dest, "Infectados: %lu\n%c", infected, newline);
+    fprintf(dest, "Infectados: %u\n%c", infected, newline);
     return OK;
 }
 
diff --git a/print_file.h b/print_file.h
@@ -5,11 +5,11 @@
 
 //extern const char formato_de_la_fecha[];
 
-status_t print_file(FILE *dest, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH], ulong *country, ulong *date, ulong *infected);
+status_t print_file(FILE *dest, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH], uint *country, uint *date, uint *infected);
 
 status_t fprintf_country(FILE *dest, size_t country_code, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]);
 status_t fprintf_date(FILE *dest, size_t date);
-status_t fprintf_infected(FILE *dest, size_t infected, char newline);
+status_t fprintf_infected(FILE *dest, uint infected, char newline);
 
 void fprintf_infected_monthly(FILE *dest);
 
diff --git a/read_file.c b/read_file.c
@@ -2,7 +2,7 @@
 #include "read_file.h"
 
 
-status_t read_file(FILE *src, ulong *country, ulong *date, ulong *infected)
+status_t read_file(FILE *src, uint *country, uint *date, uint *infected)
 {
 
 //    Esta variable es para saber de que tipo de dato estamos hablando, si es un
diff --git a/read_file.h b/read_file.h
@@ -10,12 +10,8 @@ typedef enum {
     INFECTED
 } data_t;
 
-status_t read_file(FILE *src, ulong *country, ulong *date, ulong *infected);
+status_t read_file(FILE *src, uint *country, uint *date, uint *infected);
 
-status_t fprintf_date(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, const char *format); 
-status_t fprintf_country(FILE *dest, size_t country_code, char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]);
 
 #endif