commit ac237f61261ad447bb1665df7a6341706083683e
parent a83d11b524462fa7f71e8fa5a08fa8f0bccad8b7
Author: Martin J. Klöckner <64109770+klewer-martin@users.noreply.github.com>
Date: Thu, 4 Feb 2021 00:29:26 -0300
Merge pull request #3 from klewer-martin/alpha
Alpha
Diffstat:
13 files changed, 119 insertions(+), 88 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,11 +1,11 @@
CC = gcc
-CFLAGS = -std=c99
+CFLAGS = -std=c99 -Wall -pedantic
all: main clean
-main: main.o arguments.o data.o load_country_codes.o readlines.o
- $(CC) $(CFLAGS) main.o arguments.o data.o load_country_codes.o readlines.o -o main
+main: main.o arguments.o perrors.o load_country_codes.o readlines.o
+ $(CC) $(CFLAGS) main.o arguments.o perrors.o load_country_codes.o readlines.o -o main
main.o: main.c main.h arguments.h macros.h
$(CC) -c main.c
@@ -13,8 +13,8 @@ main.o: main.c main.h arguments.h macros.h
arguments.o: arguments.c arguments.h macros.h
$(CC) -c arguments.c
-data.o: main.c main.h
- $(CC) -c data.c
+perrors.o: main.c main.h
+ $(CC) -c perrors.c
load_country_codes.o: load_country_codes.h main.h
$(CC) -c load_country_codes.c
diff --git a/arguments.c b/arguments.c
@@ -1,11 +1,5 @@
#include "arguments.h"
-#define INPUT_ARGUMENT_FOUND_MSG "Encontre un '-in'\n"
-#define OUTPUT_ARGUMENT_FOUND_MSG "Encontre un '-out'\n"
-
-#define INPUT_FILE_NAME_MSG "\t -> Archivo de entrada: "
-#define OUTPUT_FILE_NAME_MSG "\t -> Archivo de salida: "
-
// Valida que los argumentos esten correctos y guarda los nombres de los
// archivos de entrada y salida en src y dest respectivamente;
status_t validate_arguments(int argc, char * argv[], char * src, char * dest)
@@ -38,6 +32,8 @@ status_t validate_arguments(int argc, char * argv[], char * src, char * dest)
// Marca el archivo de entrada como encontrado;
inputFile = OK;
+
+// 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))
@@ -49,7 +45,8 @@ status_t validate_arguments(int argc, char * argv[], char * src, char * dest)
}
}
-// Return error if it could get input or output file names;
+// 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;
diff --git a/arguments.h b/arguments.h
@@ -1,10 +1,13 @@
-#include "main.h"
-#include "macros.h"
-
#ifndef ARGUMENTS_H
#define ARGUMENTS_H
-void print_error(status_t error);
+#include "main.h"
+
+#define INPUT_ARGUMENT_FOUND_MSG "Encontre un '-in'\n"
+#define OUTPUT_ARGUMENT_FOUND_MSG "Encontre un '-out'\n"
+
+#define INPUT_FILE_NAME_MSG "\t -> Archivo de entrada: "
+#define OUTPUT_FILE_NAME_MSG "\t -> Archivo de salida: "
status_t validate_arguments(int argc, char * argv[], char * src, char * dest);
diff --git a/data.c b/data.c
@@ -1,38 +0,0 @@
-#include "main.h"
-#include "macros.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/data.h b/data.h
@@ -1,9 +0,0 @@
-#include <stdlib.h>
-#include "main.h"
-
-#ifndef DATA_H
-#define DATA_H
-
-void print_error(status_t error);
-
-#endif
diff --git a/load_country_codes.c b/load_country_codes.c
@@ -3,8 +3,6 @@
// a dicho arreglo con los codigos cargados;
-#include "main.h"
-#include "macros.h"
#include "load_country_codes.h"
@@ -38,11 +36,11 @@ status_t empty_country_codes(char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH]
}
-// Abre el archivo "COUNTRY_CODES_FILE_NAME" y lee linea por linea hasta llegar
-// al final, mientras lee lo va guardando en un buffer que recorre caracter por
-// caracter en busqueda de el character separador de datos, en este caso ',',
-// mientras recorre el buffer va separando los datos y los guarda en la variable
-// que corresponda;
+// Abre el archivo "COUNTRY_CODES_FILE_NAME" y lee linea por linea hasta llegar
+// al final, mientras lee lo va guardando en un buffer que recorre caracter por
+// caracter en busqueda de el character separador de datos, en este caso ',',
+// mientras recorre el buffer va separando los datos y los guarda en la variable
+// que corresponda;
status_t load_country_codes(char country_codes[COUNTRIES_NUMBER][ARRAYS_LENGTH])
{
FILE *fp;
diff --git a/macros.h b/macros.h
@@ -10,6 +10,7 @@
#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"
@@ -43,5 +44,5 @@
"el programa nuevamente"
#define MSG_OK "\nEverything executed correctly.\n"
-
+*/
#endif
diff --git a/main.c b/main.c
@@ -11,23 +11,21 @@
// Lee texto de un archivo con extension .csv cuyo nombre recibe
// como argumento; el cual contiene solo numeros que representan
// un pais, una fecha y una cantidad de infectados y lo guarda en
-// un archivo de extension .csv que tambien recibe como argumento,
-// si no recibe un archivo de salida crea uno con el nombre por
-// defecto 'output.csv';
+// un archivo de texto cuyo nombre tambien recibe como argumento.
#include "main.h"
-#include "arguments.h"
#include "macros.h"
+#include "arguments.h"
#include "load_country_codes.h"
#include "readlines.h"
+#include "perrors.h"
int main(int argc, char * argv[])
{
-// Esta variable es para guardar los codigos de error en
-// caso de que haya alguno;
+// Esta variable es para guardar los codigos de error;
status_t st;
// Las siguientes variables son para guardar los nombres de los archivos de
diff --git a/main.h b/main.h
@@ -6,6 +6,8 @@
#include <string.h>
#include <time.h>
+#include "macros.h"
+
#define COUNTRY_CODES_FILE_NAME "iso3166-1.csv"
typedef enum {
diff --git a/perrors.c b/perrors.c
@@ -0,0 +1,37 @@
+#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
@@ -0,0 +1,42 @@
+#ifndef DATA_H
+#define DATA_H
+
+#include "main.h"
+
+void print_error(status_t error);
+
+#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/readlines.c b/readlines.c
@@ -1,15 +1,9 @@
// Lee el archivo de entrada y va separando los datos mientras va leyendo linea
// por linea, y los va imprimiendo en pantalla
-
#include "readlines.h"
-#define COUNTRY_PROMPT "Pais"
-
-#define SIZE_OF_BUFF1 32
-#define SIZE_OF_BUFF2 32
-
-const char date_print_format[] = "%d %b %Y";
+const char formato_de_la_fecha[] = "%d %b %Y";
status_t readlines(char *src, char *dest)
{
@@ -180,7 +174,7 @@ status_t time_translator(time_t unix_time, char *res, size_t size)
if(res == NULL)
return ERROR_NULL_POINTER;
- const char *format = date_print_format;
+ 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
@@ -1,19 +1,25 @@
-#ifndef READLINES
-#define READLINES
+#ifndef READLINES_H
+#define READLINES_H
#include "main.h"
#include "load_country_codes.h"
+#define COUNTRY_PROMPT "Pais"
+
+#define SIZE_OF_BUFF1 32
+#define SIZE_OF_BUFF2 32
+
#define INITIAL_SIZE 1000
#define TIME_MAX_DIGITS 1000
+extern const char formato_de_la_fecha[];
+
typedef enum {
PAIS,
DATE,
INFECTED
} data_t;
-
status_t readlines(char *src, char *dest);
status_t fprintf_date(FILE *dest, size_t data);
status_t fprintf_infected(FILE *dest, size_t data);