// Laboratorio 4 - Esercizio 2 - main.c // Matteo Schiff - s295565 #include #include #include #include #include #include "item.h" #define MAX_LEN 30 const int MAXL = 100; typedef enum { k_codice_tratta, k_partenza, k_destinazione, k_data } corsa_keys; typedef enum { r_leggi_file, r_leggi_tastiera, r_ricerca_codice, r_cancella_codice, r_cancella_date, r_stampa, r_fine } t_comandi; // Trasforma in lowercase tutti i caratteri di una stringa char *toLower(char *s) { for (char *p = s; *p; p++) *p = tolower(*p); return s; } t_comandi leggiComando() { t_comandi c; char cmd[MAXL]; char tabella[7][20] = { "leggi_file", "leggi_tastiera", "ricerca_codice", "cancella_codice", "cancella_date", "stampa", "fine"}; printf("comando (leggi_file/leggi_tastiera/ricerca_codice"); printf("/cancella_codice/cancella_date/stampa/fine): "); scanf("%s", cmd); toLower(cmd); c = r_leggi_file; while (c < 8 && strcmp(cmd, tabella[c]) != 0) c++; return (c); } void carica_file(char *argomenti, Link * head) { char filename[MAX_LEN+1]; FILE *fp_read; if (sscanf(argomenti, " %30s", filename) != 1) { puts("Sintassi non valida. La sintassi è 'carica '"); return; } puts("Carico il nuovo file..."); if ((fp_read = fopen(filename, "r")) == NULL) { puts("Impossibile aprire il file"); return; } while(!feof(fp_read)) { Item nuovo = ItemRead(fp_read); // skip invalid entries if (nuovo != NULL) *head = insertOrderedByDate(nuovo, *head); } fclose(fp_read); } void carica_tastiera(char *argomenti, Link * head) { Item new = ItemFromString(argomenti); if (new == NULL) { puts("Anagrafica non valida"); return; } *head = insertOrderedByDate(new, *head); } void ricerca_codice(char *argomenti, Link * head) { char codice[CODE_LEN+1]; if (sscanf(argomenti, " %5s", codice) != 1) { puts("Sintassi non valida. La sintassi è 'ricerca_codice '"); return; } Item found = getItemByCode(*head, codice); if (found == NULL) { puts("Non è stato trovato nessun elemento"); return; } ItemPrint(stdout, found); } void cancella_codice(char *argomenti, Link * head) { char codice[CODE_LEN+1]; if (sscanf(argomenti, " %5s", codice) != 1) { puts("Sintassi non valida. La sintassi è 'cancella_codice '"); return; } Item found = extractCode(head, codice); if (found == NULL) { puts("Non è stato trovato nessun elemento"); return; } ItemPrint(stdout, found); free(found); } void cancella_date(char *argomenti, Link * head) { Date start, end; if (sscanf(argomenti, " %d/%d/%d %d/%d/%d", &(start.day), &(start.month), &(start.year), &(end.day), &(end.month), &(end.year)) != 6) { puts("Sintassi non valida. La sintassi è 'cancella_date '"); return; } Item found; while (found = extractDates(head, start, end), found != NULL) { ItemPrint(stdout, found); free(found); } } void stampa_file(char *argomenti, Link * head) { FILE *fp_write; char filename[MAX_LEN+1]; if (sscanf(argomenti, " %30s", filename) != 1) { puts("Sintassi non valida. La sintassi è 'stampa '"); return; } if ((fp_write = fopen(filename, "w")) == NULL) { puts("Impossibile aprire il file"); return; } printList(fp_write, *head); fclose(fp_write); } void menuParola(Link * head) { t_comandi comando; char argomenti[MAXL]; int i, continua = 1; while (continua) { comando = leggiComando(); fgets(argomenti, MAXL, stdin); /* resto della riga */ switch (comando) { case r_leggi_file: carica_file(argomenti, head); break; case r_leggi_tastiera: carica_tastiera(argomenti, head); break; case r_ricerca_codice: ricerca_codice(argomenti, head); break; case r_cancella_codice: cancella_codice(argomenti, head); break; case r_cancella_date: cancella_date(argomenti, head); break; case r_stampa: stampa_file(argomenti, head); break; case r_fine: continua = 0; break; default: puts("Comando non valido\n"); } } } int main() { Link head = NULL; menuParola(&head); freeList(head); return 0; }