1
0
Files
Laboratori-ASD/Laboratorio 4/Esercizio 2/main.c
2024-03-22 17:37:24 +01:00

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