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:
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 );