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