/* File: listerw.c */
/* Time-stamp: "2002-05-20 18:50:19 calvanes" */
/* Scopo: funzioni di lettura di liste e scrittura di liste su file */

/* Richiede le seguenti definizioni preliminari:

   typedef TipoElemLista ...;

   struct nodoLista {
     TipoElemLista info;
     struct nodoLista *next;
   };
   typedef struct nodoLista NodoLista;
   typedef NodoLista *TipoLista;

   void StampaElemento(FILE *fi, TipoElemLista elem)
   {
     ...
   }

   int LeggiElemento(FILE *fi, TipoElemLista *pelem)
   {
     ...
   }

*/


void LeggiLista(char *nomefile, TipoLista *plis)
  /* Restituisce in *plis una lista i cui elementi vengono letti dal file di
     nome nomefile.
     Chiama LeggiElemento per la lettura di un elemento.
     La lettura termina quando LeggiElemento restituisce EOF.
     L'ordine degli elementi nella lista e` lo stesso che nel file. */
{
  TipoLista aux;
  TipoElemLista elem;
  FILE *datafile;

  datafile = fopen(nomefile, "r");
  if (datafile == NULL) {                   /* errore in apertura in lettura */
    fprintf(stderr, "Errore aprendo il file `%s' in lettura\n", nomefile);
    *plis = NULL;
  } else {
    *plis = malloc(sizeof(NodoLista));    /* creazione del record generatore */
    aux = *plis;

                                                      /* lettura della lista */
    while (LeggiElemento(datafile, &elem) != EOF) {
                /* allocazione di una struttura e lettura del nuovo elemento */
      aux->next = malloc(sizeof(NodoLista));
      aux = aux->next;
      aux->info = elem;
    }
    aux->next = NULL;                                /* chiusura della lista */

                                      /* cancellazione del record generatore */
    aux = *plis;
    *plis = (*plis)->next;
    free(aux);

    fclose(datafile);
  } /* else */
}  /* LeggiLista */


void ScriviLista(char *nomefile, TipoLista lis)
  /* Scrive gli elementi della lista lis sul file di nome nomefile.
     Chiama ScriviElemento per la scrittura di un elemento. */
{
  FILE *datafile;

  datafile = fopen(nomefile, "w");
  if (datafile == NULL)                                /* errore in apertura */
    fprintf(stderr, "Errore aprendo il file `%s' in scrittura\n", nomefile);
  else {
    while (lis != NULL) {
      ScriviElemento(datafile, lis->info);
      lis = lis->next;
    }
    fclose(datafile);
  }
}  /* ScriviLista */


void LeggiListaFile(FILE *datafile, TipoLista *plis)
  /* Restituisce in *plis una lista i cui elementi vengono letti dal file
     datafile, che si suppone gia` aperto in lettura.
     Chiama LeggiElemento per la lettura di un elemento.
     La lettura termina quando LeggiElemento restituisce EOF.
     L'ordine degli elementi nella lista e` lo stesso che nel file. */
{
  TipoLista aux;
  TipoElemLista elem;

  *lis = malloc(sizeof(NodoLista));       /* creazione del record generatore */
  aux = *plis;

                                                      /* lettura della lista */
  while (LeggiElemento(datafile, &elem) != EOF) {
                /* allocazione di una struttura e lettura del nuovo elemento */
    aux->next = malloc(sizeof(NodoLista));
    aux = aux->next;
    aux->info = elem;
  }
  aux->next = NULL;                                  /* chiusura della lista */

                                      /* cancellazione del record generatore */
  aux = *plis;
  *plis = (*plis)->next;
  free(aux);
}  /* LeggiListaFile */


void ScriviListaFile(FILE *datafile, TipoLista lis)
  /* Scrive gli elementi della lista lis sul file datafile, che si suppone gia`
     aperto in scrittura.
     Chiama ScriviElemento per la scrittura di un elemento. */
{
  while (lis != NULL) {
    ScriviElemento(datafile, lis->info);
    lis = lis->next;
  }
}  /* ScriviListaFile */