221 lines
4.7 KiB
C
221 lines
4.7 KiB
C
// Laboratorio 4 - Esercizio 2 - main.c
|
|
// Matteo Schiff - s295565
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#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 <nome file>'");
|
|
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 <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 <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 <data inizio> <data fine>'");
|
|
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 <nome file>'");
|
|
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;
|
|
}
|