This repository has been archived on 2023-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
GINPA/Modele/load.c

81 lines
1.6 KiB
C

#include "load.h"
ErrEnum loadLogs(const char *logsName, Point **tabPoint, uint32_t *nbLigne)
{
/* Ouverture du fichier de logs */
FILE *logsFile = fopen(logsName, "r");
if(logsFile == NULL)
{
fprintf(stderr, "%s\n", strerror(errno));
return MISSING_FILE;
}
*nbLigne = 0;
char tmp[BUFSIZE] = "";
/* Comptage du nombre de lignes */
while(fgets(tmp, BUFSIZE, logsFile) != NULL)
++(*nbLigne);
/* Allocation de la mémoire en fonction du nombre de lignes */
*tabPoint = calloc(*nbLigne, sizeof(Point));
if(*tabPoint == NULL)
{
fprintf(stderr, "%s\n", strerror(errno));
return ALLOCATION_FAILURE;
}
rewind(logsFile);
// On met 'errno' à '0' car ce sera notre seul moyen de vérifier si 'strtol()' a bien fonctionné...
errno = 0;
/* Conversion du fichier en tableau de Points */
for(uint32_t i = 0; i < *nbLigne; ++i)
{
if(!convertLine(fgets(tmp, BUFSIZE, logsFile), &tabPoint[0][i]))
{
fprintf(stderr, "%s\n", strerror(errno));
return CORRUPTED_FILE;
}
}
if(fclose(logsFile) == EOF)
{
fprintf(stderr, "%s\n", strerror(errno));
}
return LOAD_SUCCESS;
}
bool convertLine(char *line, Point *point)
{
char *next = NULL;
next = strchr(line, ':') + 1;
point->date = (time_t)strtol(next, NULL, 10);
// En théorie, la valeur de 'errno' est censée avoir changée si une erreur est apparue...
if(errno != 0)
return false;
strcpy(line, next);
next = strchr(line, ':') + 1;
point->pos.lat = strtod(next, NULL);
if(point->pos.lat == 0)
return false;
strcpy(line, next);
next = strchr(line, ':') + 1;
point->pos.lon = strtod(next, NULL);
if(point->pos.lon == 0)
return false;
point->type = NONE;
return true;
}