/* questo programma legge da un file le parole, memorizza quelle contenenti
 * una determinata  lettera e  le scrive  su un secondo  file. Il  tutto e'
 * stato  fatto cercando  di  risparmiare la  memoria  utilizzata. Come  al
 * solito  questo NON  e' un  buon  esempio di  programmazione! infatti  il
 * programma NON e' adeguatamente commentato */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include"util.h"

#define FILE_IN "sample.txt"
#define FILE_OUT "out.txt"
#define LETTER 'r'
#define BUFFERLEN 5

char *leggi_parola(FILE *);
void inserisci_parola_in_lista(char *);
void inserisci_lista_parole_in_file(char **, FILE*);
void libera_array(char **);

/* array di array (*listaparole[]) */
static  char **listaparole;

/******************************************************************************/

int main(int argc, char **argv)
{
 FILE *testo, *parole_trovate;
 char *parola_in_esame;


 /* apro i due file */
 testo=Fopen(FILE_IN, "r");
 parole_trovate=Fopen(FILE_OUT, "w");
 
 listaparole=NULL;

 while (1)
  {
   if(!(parola_in_esame=leggi_parola(testo)))
	   break;
   /* se contiene la lettera di interesse la inserisco */
   if(strchr(parola_in_esame, LETTER))
      inserisci_parola_in_lista(parola_in_esame);
  }
 fclose(testo);

 inserisci_lista_parole_in_file(listaparole, parole_trovate);
 fclose(parole_trovate);
 /* libero memoria allocata dinamicamente */
 libera_array(listaparole);
 return 0;
}

/******************************************************************************/
void inserisci_lista_parole_in_file(char **a, FILE* out)
{
 for(; *a; ++a)
  fprintf(out, "%s\n", *a);
}
/******************************************************************************/

char *leggi_parola(FILE *mio_file)
{
 char c=' ';
 char *parola=NULL;
 int lenparola=1;
 int nbuff=1;

 while((!feof(mio_file))&&(!isalpha((int)c)))
  c=fgetc(mio_file);

 if(feof(mio_file))return NULL;
 
 /* alloco un primo buffer */
 parola=Malloc(sizeof(char)*BUFFERLEN*nbuff+sizeof(char));
 /* ci metto il valore letto */
 *parola=c;

 /* man mano leggo altri caratteri */
 while((!feof(mio_file))&&(isalpha((int)(c=fgetc(mio_file)))))
  {
   if(lenparola>(BUFFERLEN*nbuff))
       parola=Realloc(parola, sizeof(char)*BUFFERLEN*++nbuff+sizeof(char));
   parola[lenparola++]=c;
  }

  /* chiudo la stringa */
 parola[lenparola]='\0';
  
 return parola;
}

/******************************************************************************/

void inserisci_parola_in_lista(char *parola_da_inserire)
{
 static int n_parole=1;
 

 if(listaparole==NULL)
  {
   listaparole=Malloc(sizeof(char**)*2);
   listaparole[0]=parola_da_inserire;
   listaparole[1]=NULL;
  }
 else
  {
   listaparole=Realloc(listaparole, sizeof(char*)*(n_parole+2));
   *(listaparole+n_parole)=parola_da_inserire;
   n_parole++;
   *(listaparole+n_parole)=NULL;
  }
}


/******************************************************************************/

void libera_array(char **a){
 for(; *a; ++a)
  free(*a);
}