예제 #1
0
/**
 * 
 * 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;	
}