/*********************************************************/ /* 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; }