/* File: listeirw.c */
/* Time-stamp: "2001-05-09 15:40:55 calvanes" */
/* Scopo: funzioni di lettura e scrittura di liste di interi da file */

/* Richiede le seguenti definizioni preliminari:

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

*/


void LeggiLista(char *nomefile, TipoLista *lis)
  /* Restituisce in lis una lista i cui elementi vengono letti dal file di
     nome nomefile.
     L'ordine degli elementi nella lista e` lo stesso che nel file. */
{
  TipoLista paux;
  int 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);
    *lis = NULL;
  } else {
    *lis = malloc(sizeof(NodoLista));     /* creazione del record generatore */
    paux = *lis;

    fscanf(datafile, "%d", &elem);
    while (!feof(datafile)) {
                /* allocazione di una struttura e lettura del nuovo elemento */
      paux->next = malloc(sizeof(NodoLista));
      paux = paux->next;
      paux->info = elem;
      fscanf(datafile, "%d", &elem);
    }
    paux->next = NULL;                               /* chiusura della lista */

                                      /* cancellazione del record generatore */
    paux = *lis;
    *lis = (*lis)->next;
    free(paux);

    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) {
      fprintf(datafile, "%d ", lis->info);
      lis = lis->next;
    }
    fclose(datafile);
  }
}  /* ScriviLista */


void LeggiListaFile(FILE *datafile, TipoLista *lis)
  /* Restituisce in lis 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 paux;
  TipoElemLista elem;

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

  fscanf(datafile, "%d", &elem);
  while (!feof(datafile)) {
                /* allocazione di una struttura e lettura del nuovo elemento */
    paux->next = malloc(sizeof(NodoLista));
    paux = paux->next;
    paux->info = elem;
    fscanf(datafile, "%d", &elem);
  }
  paux->next = NULL;                                 /* chiusura della lista */

                                      /* cancellazione del record generatore */
  paux = *lis;
  *lis = (*lis)->next;
  free(paux);
}  /* 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) {
    fprintf(datafile, "%d ", lis->info);
    lis = lis->next;
  }
}  /* ScriviListaFile */