Don't like ads? PRO users don't see any ads ;-)
Guest

bib.h

By: a guest on Mar 20th, 2012  |  syntax: C  |  size: 6.98 KB  |  hits: 68  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /**
  2.    \file
  3.    \author lso-lab 2012
  4.  
  5.    \brief tipi e macro per la rappresentazione di volumi e schede bibliografiche
  6.  
  7.   FORMATO RECORD della scheda relativa ad un volume (usato per la stampa e la registrazione su file)
  8.  
  9.   autore: Cognome/i (char*) , (virgola separatore) Nome/i (char*)
  10.   titolo: stringa del titolo (char*)
  11.   editore: nome editore (char*)
  12.   luogo_pubblicazione: luogo pubblicazione (char*)
  13.   anno: anno di 4 cifre (char*)
  14.   prestito: data di restituzione del prestito gg-mm-aaaa (char *)
  15.             se il campo e' assente il libro e' disponibile al prestito
  16.   collocazione: stringa che rappresenta la collocazione dentro la biblioteca
  17.                 (char *)
  18.   descrizione_fisica: stringa che descrive le caratteristiche fisiche del libro
  19.                     (numero di pagine altezza, illustrazioni etc ) (char*)
  20.   nota: stringa di commento (char*)
  21.  
  22.   ************************************
  23.   NOTE:
  24.   1) i campi sono separati da ';' la scheda terminata da '\n'
  25.   2) nelle stringhe non puo' comparire il separatore (;) e nella stringa nome e cognome dell'autore non puo' comparire nemmeno la virgola (,) ;
  26.   3) possono essere presenti spazi bianchi all'inizio ed alla fine di un campo (devono essere ignorati)
  27.   4) i campi si possono trovare in un ordine qualsiasi! Tuttavia l'ordine sopra descritto e' quello richiesto nelle funzioni di stampa (print_scheda()) e di serializzazione (scheda_to_record())
  28.  */
  29. #ifndef _BIB__H
  30. #define _BIB__H
  31. #include <time.h>
  32.  
  33.  
  34. /** lunghezza massima dell'etichetta di un campo (autore, titolo, etc ...)*/
  35. #define LTAG 32
  36. /** lunghezza massima cognome */
  37. #define LCOGN 256
  38. /** lunghezza massima nome */
  39. #define LNOME 256
  40. /** lunghezza massima anno */
  41. #define LANNO 4
  42. /** lunghezza massima campo stringa corto (descrizione_fisica, prestito, editore, luogo_publicazione, collocazione)*/
  43. #define LSSTRING 64
  44. /** lunghezza massima campo stringa lungo (titolo, nota)*/
  45. #define LLSTRING 1024
  46. /** vero ...*/
  47. #define TRUE 1
  48. /** falso ... */
  49. #define FALSE 0
  50.  
  51. /** numero campi previsti */
  52. #define NCAMPI 9
  53. /** descrizione campi previsti */
  54. typedef enum campo {AUTORE,TITOLO, EDITORE, LUOGO_PUBBLICAZIONE, ANNO, COLLOCAZIONE, DESCRIZIONE_FISICA, NOTA, PRESTITO} campo_t;
  55.  
  56. /** elemento della lista autori */
  57. typedef struct autore {
  58.   /** cognome/i (almeno uno deve essere presente) */
  59.   char cognome[LCOGN +1];
  60.   /** nome/i (almeno uno deve essere presente) */
  61.   char nome [LNOME + 1];
  62.   /** puntatore al prossimo autore */
  63.   struct autore * next;
  64. } autore_t;
  65.  
  66.  
  67. /** descrizione prestito */
  68. typedef struct prestito {
  69.   /** true se e' disponibile, false altrimenti */
  70.   short int disponibile;
  71.   /** data di scadenza prestito */
  72.   struct tm scadenza;    
  73. } prestito_t;
  74.  
  75. /** descrizione pubblicazione */
  76. typedef struct pubblicazione {
  77.   /** nome casa editrice */
  78.   char editore[LSSTRING+1];  
  79.   /** luogo pubblicazione */
  80.   char luogo[LSSTRING+1];    
  81.   /** anno pubblicazione */
  82.   unsigned int anno;        
  83. } pubblicazione_t;
  84.  
  85. /** scheda bibliografica */
  86. typedef struct scheda {
  87.   /** puntatore lista degli autori */
  88.   autore_t* autore;        
  89.   /** titolo */
  90.   char titolo[LLSTRING +1];
  91.   /** dati pubblicazione */
  92.   pubblicazione_t pub;      
  93.   /** dati prestito */
  94.   prestito_t prestito;      
  95.   /** note */
  96.   char nota[LLSTRING+1];    
  97.   /** collocazione nella biblioteca */
  98.   char collocazione[LSSTRING+1];  
  99.   /** informaizoni fisiche */
  100.   char descrizione_fisica[LSSTRING+1];  
  101. } scheda_t;
  102.  
  103. /** crea ed inizializza una nuova scheda
  104.     \returns res la nuova scheda (allocata all'interno della funzione)
  105.     \returns NULL se ci sono stati problemi (setta errno)
  106. */
  107. scheda_t * new_scheda (void);
  108.  
  109. /** libera la memoria occupata da una scheda
  110.  
  111.     \param ps puntatore al puntatore alla scheda (*ps viene settato a NULL dalla funzione)
  112.  */
  113. void free_scheda (scheda_t ** ps);
  114.  
  115. /** confronta due schede
  116.     \param s1 puntatore alla prima scheda
  117.     \param s2 puntatore alla seconda scheda
  118.  
  119.     \returns TRUE se le schede sono uguali (tutti i campi sono uguali) e
  120.     \returns FALSE altrimenti
  121.  */
  122. int is_equal_scheda (scheda_t * s1, scheda_t * s2);
  123.  
  124. /** stampa la scheda in formato ECORD (vedi sopra) sullo stream specificato
  125.  
  126.     \param f stream di output
  127.     \param s puntatore alla scheda
  128.  */
  129. void print_scheda (FILE* f, scheda_t * s);
  130.  
  131. /** trasforma un record in una scheda
  132.     \param r record da trasformare (non viene modificato)
  133.     \param l lunghezza massima del record (serve ad evitare l'overrun ...)
  134.  
  135.     \returns res la nuova scheda (allocata all'interno della funzione)
  136.     \returns NULL se ci sono stati problemi (setta errno)
  137.                   errno=EINVAL per stringa mal formattata
  138. */
  139. scheda_t * record_to_scheda (char* r, int l);
  140.  
  141. /** trasforma una scheda in un record
  142.     \param s la scheda da trasformare
  143.    
  144.     \returns r il puntatore al record che rappresenta la scheda (allocato all'interno della funzione)
  145.     \returns  NULL se ci sono stati problemi (setta errno)
  146. */
  147. char * scheda_to_record(scheda_t* s);
  148.  
  149.  
  150. /** legge tutti i record da un file e li memorizza in un array -- i record malformati vengono scartati ma se c'e' almeno un record convertibile corretamente la funzione ha successo
  151.  
  152.     \param fin stream da cui leggere i record
  153.     \param psarray puntatore alla variabile che conterra' l'indirizzo dell'array di puntatori alle schede (allocato), significativo se n >0
  154.  
  155.     \returns -1 se si e' verificato un errore (setta errno)
  156.     \returns n (n > 0) numero di record convertiti correttamente (ampiezza dell'array di schede) in questo caso *psarray contiene l'indirizzo dell'array allocato
  157.  */
  158. int load_records(FILE* fin, scheda_t** psarray[]);
  159.  
  160. /** scrive su file un array di schede sotto forma di record
  161.     \param fout stream su cui scrivere i record
  162.     \param sarray puntatore all'array di puntatori alle schede
  163.     \param n numero schede nell'array
  164.  
  165.     \returns -1 se si e' verificato un errore (setta errno) -- nota l'errore nella scrittura di un singolo record viene riportato nel numero di record scritti, non provoca il ritorno di (-1)
  166.     \returns n (n > 0) numero di record scritti correttamente */
  167. int store_records(FILE* fout, scheda_t* sarray[], int n);
  168.  
  169. /** ordina i record nell'array relativamente al campo specificato. Gli ordinamenti definiti per i vari campi sono i seguenti:
  170.    AUTORE -- lessicografico (Cognome Nome) sulla lista degli autori
  171.    TITOLO, EDITORE, LUOGO_PUBBLICAZIONE, COLLOCAZONE, DESCRIZIONE_FISICA, NOTA -- Lessicografico sulla stringa
  172.    ANNO -- crescente
  173.    PRESTITO -- crescente
  174.  
  175.    Nota: per ordine Lessicografico si intende quello normalmente usato nella strcmp()  
  176.  
  177.    \param sarray puntatore array da ordinare (viene modificato durante l'ordinamento)
  178.    \param n lunghezza array
  179.    \param c campo rispetto al quale ordinare
  180.  
  181.    \returns -1 se si e' verificato un errore (setta errno) (in questo caso s e' invariato)
  182.    \returns 0 se tutto e' andato bene
  183. */
  184. int sort_schede(scheda_t* sarray[], int n, campo_t c);
  185. #endif