/** * * testa le funzioni load_planet e store_planet leggendo il pianeta da un file, riscrivendolo su un altro e confrontando i due file * * \param filename il nome del file dal quale leggere i dati del pianeta * \param formato: specifica se il file è formattato correttamente. In questo caso la funzione load_planet deve rilevare l'errore * * \return 1 se il test è superato * \return 0 altrimenti * * * */ int test_load_store (const char *filename, int formato) { FILE *fp, *fo; planet_t *pl; int ret=1; fp = fopen (filename,"r"); pl=load_planet (fp); if ( pl && formato ) { fo = fopen ("custom_test/result.dat","w"); print_planet (fo, pl); rewind (fp); fclose (fo); fo = fopen ("custom_test/result.dat","r"); //se i due file sono uguali, il test è andato a buon fine ret = confronto_file (fp, fo); fclose (fo); } else if ( (pl && !formato) || (!pl && formato) || (!pl && !formato && errno != ERANGE) ) { ret = 0; } free_planet (pl); fclose (fp); return ret; }
wator_t* new_wator (char* fileplan){ FILE *f_p= fopen(fileplan, "r"); FILE *f = fopen(CONFIGURATION_FILE, "r"); wator_t *p ; uint v[3]; /** Le successive variabili sarranno usate per cumulare la lettura * In particolare verranno usate stringhe per semplicità (per usare strcmp) */ char st[3][3]; st[0][2] = st[1][2] = st[2][2] = '\0'; /*verranno letti caratteri per cui l'end line dovrà esser messo a mano*/ if ( ! f || ! f_p ){ if (f) fclose(f); if (f_p) fclose(f); /* errno settato da fopen */ return NULL; } if(fscanf( f, "%c%c %u\n", st[0], st[0]+1, &v[0] ) < 3 /* Se l'esito è true allora il formato è errato*/ || fscanf( f, "%c%c %u\n", st[1], st[1]+1, &v[1] ) < 3 || fscanf( f, "%c%c %u\n", st[2], st[2]+1, &v[2] ) < 3 || ( strcmp(st[0],"sd") && strcmp(st[1],"sd") && strcmp(st[2],"sd") ) || ( strcmp(st[0],"sb") && strcmp(st[1],"sb") && strcmp(st[2],"sb") ) || ( strcmp(st[0],"fb") && strcmp(st[1],"fb") && strcmp(st[2],"fb") ) ){ /** Se uno degli ultimi tre confronti è vero => esiste un st* diverso da tutte le stringhe accettate * Viceversa se l'esito è false allora tutte le stringhe sono ovviamente diverse! */ fclose(f); errno = EBADF; /*Non saprei che errore sia più consono tra i disponibili */ return NULL; } /* alloco wator*/ if ( ! ( p = malloc(sizeof(wator_t)) ) ){ errno = EFAULT; fclose(f); fclose(f_p); return NULL; } /* inizializzazioni non previste dal file conf*/ p->plan = NULL; p->nf = p->ns = p->nwork = p->chronon = 0; /* utilizzo della macro sopra definita per cercare in st il valore "sd" e restituire il rispettivo v */ p->sd = CERCA("sd", st, v); p->sb = CERCA("sb", st, v); p->fb = CERCA("fb", st, v); /***** PARTE DUBBIA ****/ if ( ! (p->plan = load_planet( f_p ) ) ) { /*errno settato da load*/ fclose(f_p); fclose(f); return NULL; } p->ns = shark_count ( p->plan ); p->nf = fish_count ( p->plan ); /************************/ fclose(f_p); fclose(f); return p; }