/*********************************************************/
/*    Autori:                                            */
/*            Pelosi Giovanni, 346787, pelosi            */
/*            Pesce  Agatino,  456868, pesce             */
/*                                                       */
/*  Progetto: Sistemi 2: biblioteca                      */
/*  Data Pr.: 9/2/96                                     */
/*      File: libro.c                                    */
/*                                                       */
/*********************************************************/

#include <stdio.h>
#include <string.h>
#include <assert.h>

#include "libro.h"
#include "support.h"

static FILE* Catalogo;
static Libro_t Libro;


/*
************************************************************************
*
*  inizializzazione/chiusura
*
************************************************************************
*/


int InitLibro(char* filename)
{
  Catalogo = fopen(filename,"a+");
  if (!Catalogo)
	 ErrExit("InitLibro: apertura file catalogo");
  Libro.Titolo[0]=0;
  Libro.Autore[0]=0;
  Libro.Anno[0]=0;
  return 0;
}

int ExitLibro(void)
{
  fclose(Catalogo);
  return 0;
}


/*
************************************************************************
*
*  accesso a dato statico
*
************************************************************************
*/


Libro_t* RetrieveLibro(void)
{
  return &Libro;
}

/*
************************************************************************
*
*  visualizzazione libro (usata per debug)
*
************************************************************************
*/

void DumpLibro(Libro_t* pLibro)
{
  puts("------------------");
  puts(pLibro->Titolo);
  puts(pLibro->Autore);
  puts(pLibro->Anno);
  puts("-Premere un tasto-");
  getchar();
}

/*
************************************************************************
*
*  legge un libro da file catalogo
*
************************************************************************
*/

int LeggiLibro(void)
{
  char buffer[LEN_TITOLO+1]; /* Per leggere \0 e \n */

  assert( Catalogo );

  if (fgets(buffer, LEN_TITOLO+1, Catalogo)==NULL)
	 return FALSE;
  /* Nel caso avessi terminato per troppi caratteri chiudo la stringa */
  buffer[LEN_TITOLO-1]=0;
  /* Nel caso avessi terminato con \n lo tiro via */
  if( buffer[strlen(buffer)-1] == '\n' )
	 buffer[strlen(buffer)-1]=0;
  strncpy(Libro.Titolo, buffer, sizeof(Libro.Titolo));

  if (fgets(buffer, LEN_AUTORE+1, Catalogo)==NULL)
	 return FALSE;
  /* Nel caso avessi terminato per troppi caratteri chiudo la stringa */
  buffer[LEN_AUTORE-1]=0;
  /* Nel caso avessi terminato con \n lo tiro via */
  if( buffer[strlen(buffer)-1] == '\n' )
	 buffer[strlen(buffer)-1]=0;
  strncpy(Libro.Autore, buffer, sizeof(Libro.Autore));

  if (fgets(buffer, LEN_ANNO+1, Catalogo)==NULL)
	 return FALSE;
  /* Nel caso avessi terminato per troppi caratteri chiudo la stringa */
  buffer[LEN_ANNO-1]=0;
  /* Nel caso avessi terminato con \n lo tiro via */
  if( buffer[strlen(buffer)-1] == '\n' )
	 buffer[strlen(buffer)-1]=0;
  strncpy(Libro.Anno, buffer, sizeof(Libro.Anno));

  return TRUE;
}

/*
************************************************************************
*
*  scrive un libro su file catalogo
*
************************************************************************
*/

int ScriviLibro(Libro_t* pLibro)
{
  assert( Catalogo );

  if (fprintf(Catalogo, "%s\n%s\n%s\n",
				  pLibro->Titolo, pLibro->Autore, pLibro->Anno)==EOF)
	 return FALSE;
  else
	 return TRUE;
}

/*
************************************************************************
*
*   Aggiunge il Record in fondo al file
*
************************************************************************
*/

int AppendLibro(Libro_t* pLibro)
{
  assert( Catalogo );

  fseek(Catalogo, 0L, SEEK_END);
  return ScriviLibro(pLibro);
}

/*
************************************************************************
*
*   Cerca il prossimo libro dopo la posizione Start. Start=0 primo libro
*
************************************************************************
*/

long SearchLibro(Libro_t * pPattern,     long Start)
{
  assert( Catalogo );
  fseek(Catalogo, Start, SEEK_SET);
  while(LeggiLibro())
	 {
		if( strstr(Libro.Titolo, pPattern->Titolo) != ((char*)0) )
		  /* Qui il libro trovato sta gia' in static Libro */
		  return ftell(Catalogo);
	 }
  return 0;
}