diff --git a/compte-rendu.md b/compte-rendu.md index 67bb31e..93a2275 100644 --- a/compte-rendu.md +++ b/compte-rendu.md @@ -90,3 +90,243 @@ if(strcmp(read_line,"LOSS") == 0 && ping < 0.1){ } /* ... */ ``` + + +# Réduire la complexité de get_ping_from_temp_log() + +```c +/* + -- get_ping_from_temp_log -- + Desc : + Function which get the ping from a temp log containing the last ping did by the program + In-param : + None + Out-param : + None + Return value : + Ping value as a string or NULL if an error occured +*/ +/*@null@*/char* get_ping_from_temp_log(){ + + /* Variables */ + FILE* fd = NULL; + char* read_line = NULL; + size_t n = 0; + size_t nmatch = 2; + regex_t *p_reg; + regmatch_t* pmatch; + char* ping = NULL; + int start; + int end; + size_t size_ping; + + /* regex struct memory allocation */ + p_reg = (regex_t *) malloc(sizeof(*p_reg)); + if(p_reg == NULL){ + return ping; /* NULL */ + } + + /* Open ping log file */ + fd = fopen("/var/log/ping-report/last-ping.log","r"); + if(fd == NULL){ + free(p_reg); + return ping; /* NULL */ + } + + /* Construct regex to get ping from log file */ + if(regcomp(p_reg,"time=(.*) ms",REG_EXTENDED) != 0){ + if(p_reg != NULL){ + free(p_reg); + } + (void) fclose(fd); + return ping; /* NULL */ + } + + /* match info memory allocation */ + pmatch = malloc(sizeof(*pmatch) * nmatch); + if(pmatch == NULL){ + (void) fclose(fd); + regfree(p_reg); + free(p_reg); + return ping; /* NULL */ + } + + /* Read file */ + while(getline(&read_line,&n,fd) != -1){ + + if(read_line == NULL){ + break; + } + + /* Exec regex to find ping */ + + if(regexec(p_reg,read_line,nmatch,pmatch,0) == 0){ + + /* Extract ping position from read line */ + start = (int) pmatch[1].rm_so; + end = (int) pmatch[1].rm_eo; + size_ping = (size_t) (end - start); + + /* ping string memory allocation */ + ping = malloc(sizeof(char) * (size_ping+2)); + if(ping == NULL){ + free(read_line); + read_line = NULL; + n = 0; + break; + } + + /* Create ping string */ + (void) strncpy(ping, &read_line[start], size_ping); + ping[size_ping]='\n'; + ping[size_ping+1]='\0'; + + /* Free memory */ + free(read_line); + read_line = NULL; + n = 0; + break; + } + + free(read_line); + read_line = NULL; + n = 0; + } + + /* free allocated memory */ + regfree(p_reg); + free(p_reg); + free(pmatch); + if(read_line != NULL){ + free(read_line); + } + + (void) fclose(fd); + + /* ping may be null, then it must mean that the ping request was lost */ + return ping; +} +``` + +à: + +```c +char* prepare(regex_t *p_reg, FILE* fd, regmatch_t* pmatch, char* ping, size_t nmatch){ + /* regex struct memory allocation */ + p_reg = (regex_t *) malloc(sizeof(*p_reg)); + if(p_reg == NULL){ + return ping; /* NULL */ + } + + /* Open ping log file */ + fd = fopen("/var/log/ping-report/last-ping.log","r"); + if(fd == NULL){ + free(p_reg); + return ping; /* NULL */ + } + + /* Construct regex to get ping from log file */ + if(regcomp(p_reg,"time=(.*) ms",REG_EXTENDED) != 0){ + if(p_reg != NULL){ + free(p_reg); + } + (void) fclose(fd); + return ping; /* NULL */ + } + + /* match info memory allocation */ + pmatch = malloc(sizeof(*pmatch) * nmatch); + if(pmatch == NULL){ + (void) fclose(fd); + regfree(p_reg); + free(p_reg); + return ping; /* NULL */ + } + + return NULL; /* success */ +} + +int loop_line(char* read_line) +{ + int start; + int end; + size_t size_ping; + + if(read_line == NULL){ + return -1; + } + + /* Exec regex to find ping */ + + if(regexec(p_reg,read_line,nmatch,pmatch,0) == 0){ + + /* Extract ping position from read line */ + start = (int) pmatch[1].rm_so; + end = (int) pmatch[1].rm_eo; + size_ping = (size_t) (end - start); + + /* ping string memory allocation */ + ping = malloc(sizeof(char) * (size_ping+2)); + if(ping == NULL){ + free(read_line); + read_line = NULL; + n = 0; + return -1; + } + + /* Create ping string */ + (void) strncpy(ping, &read_line[start], size_ping); + ping[size_ping]='\n'; + ping[size_ping+1]='\0'; + + /* Free memory */ + free(read_line); + read_line = NULL; + n = 0; + return 0; /* success */ + } + + free(read_line); + read_line = NULL; + n = 0; + return 1; +} + +char* get_ping_from_temp_log(){ + /* Variables */ + FILE* fd = NULL; + char* read_line = NULL; + size_t n = 0; + size_t nmatch = 2; + regex_t *p_reg; + regmatch_t* pmatch; + char* ping = NULL; + + if(prepare(p_reg, fd, pmatch, ping, nmatch) != NULL){ + return ping; /* NULL */ + } + + /* Read file */ + while(getline(&read_line,&n,fd) != -1){ + if (loop_line(read_line) != 1){ + break; + } + } + + /* free allocated memory */ + regfree(p_reg); + free(p_reg); + free(pmatch); + if(read_line != NULL){ + free(read_line); + } + + (void) fclose(fd); + + /* ping may be null, then it must mean that the ping request was lost */ + return ping; +} +``` + +On répartie la fonction en 3 fonctions pour réduire la complexité. + diff --git a/ping-report/src/stats.c b/ping-report/src/stats.c index 85c62b9..9f8b811 100644 --- a/ping-report/src/stats.c +++ b/ping-report/src/stats.c @@ -11,31 +11,7 @@ #include "../include/stats.h" #include "../include/db-sqlite.h" -/* - -- get_ping_from_temp_log -- - Desc : - Function which get the ping from a temp log containing the last ping did by the program - In-param : - None - Out-param : - None - Return value : - Ping value as a string or NULL if an error occured -*/ -/*@null@*/char* get_ping_from_temp_log(){ - - /* Variables */ - FILE* fd = NULL; - char* read_line = NULL; - size_t n = 0; - size_t nmatch = 2; - regex_t *p_reg; - regmatch_t* pmatch; - char* ping = NULL; - int start; - int end; - size_t size_ping; - +char* prepare(regex_t *p_reg, FILE* fd, regmatch_t* pmatch, char* ping, size_t nmatch){ /* regex struct memory allocation */ p_reg = (regex_t *) malloc(sizeof(*p_reg)); if(p_reg == NULL){ @@ -67,46 +43,74 @@ return ping; /* NULL */ } - /* Read file */ - while(getline(&read_line,&n,fd) != -1){ - - if(read_line == NULL){ - break; - } + return NULL; /* success */ +} - /* Exec regex to find ping */ +int loop_line(char* read_line) +{ + int start; + int end; + size_t size_ping; - if(regexec(p_reg,read_line,nmatch,pmatch,0) == 0){ + if(read_line == NULL){ + return -1; + } - /* Extract ping position from read line */ - start = (int) pmatch[1].rm_so; - end = (int) pmatch[1].rm_eo; - size_ping = (size_t) (end - start); + /* Exec regex to find ping */ - /* ping string memory allocation */ - ping = malloc(sizeof(char) * (size_ping+2)); - if(ping == NULL){ - free(read_line); - read_line = NULL; - n = 0; - break; - } + if(regexec(p_reg,read_line,nmatch,pmatch,0) == 0){ - /* Create ping string */ - (void) strncpy(ping, &read_line[start], size_ping); - ping[size_ping]='\n'; - ping[size_ping+1]='\0'; + /* Extract ping position from read line */ + start = (int) pmatch[1].rm_so; + end = (int) pmatch[1].rm_eo; + size_ping = (size_t) (end - start); - /* Free memory */ + /* ping string memory allocation */ + ping = malloc(sizeof(char) * (size_ping+2)); + if(ping == NULL){ free(read_line); read_line = NULL; n = 0; - break; + return -1; } + /* Create ping string */ + (void) strncpy(ping, &read_line[start], size_ping); + ping[size_ping]='\n'; + ping[size_ping+1]='\0'; + + /* Free memory */ free(read_line); read_line = NULL; n = 0; + return 0; /* success */ + } + + free(read_line); + read_line = NULL; + n = 0; + return 1; +} + +char* get_ping_from_temp_log(){ + /* Variables */ + FILE* fd = NULL; + char* read_line = NULL; + size_t n = 0; + size_t nmatch = 2; + regex_t *p_reg; + regmatch_t* pmatch; + char* ping = NULL; + + if(prepare(p_reg, fd, pmatch, ping, nmatch) != NULL){ + return ping; /* NULL */ + } + + /* Read file */ + while(getline(&read_line,&n,fd) != -1){ + if (loop_line(read_line) != 1){ + break; + } } /* free allocated memory */