#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define NAME_LENGTH 50
#define DES_LENGTH 50
#define PUTS_LINE_STDERR fputs("________________________________________________________________________________\n", stderr);
typedef struct my_articolo
{
signed int code;
char *name;
char *des;
float price;
signed int q_disp;
signed int q_min;
struct my_articolo *n;
} articolo;
articolo *start = 0;
void apri(void);
void inserisci(void);
void cerca(void);
void modifica(void);
void elimina(void);
void visualizza(void);
void esporta(void);
char* r_line(char *str, unsigned int length, FILE *stream);
articolo* if_code(signed int code);
articolo** if_name(articolo **arr, const char *name);
void stampa(articolo **arr);
int main()
{
void (*cmd[])(void) = {apri, inserisci, cerca, modifica, elimina, visualizza, esporta};
unsigned int c_code = 0;
while(1)
{
PUTS_LINE_STDERR;
fputs(" @ Database @\n\n", stderr);
fputs("1 - Apri database\n\n", stderr);
fputs("2 - Inserisci articolo nel database\n\n", stderr);
fputs("3 - Cerca articolo/i nel database\n\n", stderr);
fputs("4 - Modifica articolo del database\n\n", stderr);
fputs("5 - Elimina articolo/i del database o svuota l'intero database\n\n", stderr);
fputs("6 - Visualizza il database\n\n", stderr);
fputs("7 - Esporta database\n\n", stderr);
fputs("8 - Esci dal programma\n", stderr);
PUTS_LINE_STDERR;
fputs("Inserire il codice corrispondente all'operazione: ", stderr);
fflush(stdin);
scanf("%u", &c_code);
c_code--;
if(c_code < 7)
{
(*cmd[c_code])();
fputs("\n------------------------ Premere un tasto per continuare ----------------------\n", stderr);
fflush(stdin);
getchar();
fputs("\n\n", stderr);
}
else if(c_code == 7)
{
return 0;
}
else
{
fputs("\n\nIl codice inserito non e' valido.\n\n------------------------ Premere un tasto per continuare ----------------------\n", stderr);
fflush(stdin);
getchar();
fputs("\n\n", stderr);
}
}
}
char* r_line(char *str, unsigned int length, FILE *stream)
{
signed char ch = '\0';
BYTE i = 0;
if(stream == stdin) fflush(stdin);
while(isspace(ch = fgetc(stream)));
while(((ch != '\n') && (ch != EOF)) && (i < length - 1))
{
str[i++] = ch;
ch = fgetc(stream);
str = (char*) realloc(str, (i + 1) * sizeof(char));
}
if(i == length - 1)
{
str = (char*) realloc(str, (i + 2) * sizeof(char));
str[i] = '~';
str[i + 1] = '\0';
}
str[i] = '\0';
if(stream == stdin) fflush(stdin);
return str;
}
void inserisci()
{
articolo *p = 0, *c = 0, *nn = calloc(1, sizeof(articolo));
char *n_name = (char*) calloc(1, sizeof(char)), *n_des = (char*) calloc(1, sizeof(char));
if(!nn)
{
fputs("\nErrore di memoria. Impossibile aggiungere l'articolo.\n", stderr);
free(nn);
return;
}
i_code:
fputs("\nInserisci il codice del componente (0 - 99999999): ", stderr);
fflush(stdin);
scanf("%8i", &nn->code);
if(nn->code < 0 || nn->code > 99999999)
{
fputs("\nIl codice inserito non e' valido.\n", stderr);
goto i_code;
}
for(c = start, p = 0; c && nn->code > c->code; p = c, c = c->n);
if(c && (nn->code == c->code))
{
fputs("\nL'articolo esiste gia'. Impossibile aggiungerlo.\n", stderr);
free(nn);
return;
}
i_name:
fputs("Inserisci il nome dell'articolo: ", stderr);
r_line(n_name, NAME_LENGTH, stdin);
if(strlen(n_name) <= 0)
{
fputs("\nIl nome inserito non e' valido.\n", stderr);
goto i_name;
}
nn->name = n_name;
i_des:
fputs("Inserisci la descrizione dell'articolo: ", stderr);
r_line(n_des, DES_LENGTH, stdin);
if(strlen(n_des) <= 0)
{
fputs("\nLa descrizione inserita non e' valida.\n", stderr);
goto i_des;
}
nn->des = n_des;
i_price:
fputs("Inserisci il prezzo dell'articolo(0 - 9999999.99): ", stderr);
fflush(stdin);
scanf("%7f", &nn->price);
if(nn->price < 0.0 || nn->price > 9999999.99)
{
fputs("\nIl prezzo inserito non e' valido.\n", stderr);
goto i_price;
}
i_disp:
fputs("Inserisci la disponibilita' dell'articolo(0 - 9999999): ", stderr);
fflush(stdin);
scanf("%7i", &nn->q_disp);
if(nn->q_disp < 0 || nn->q_disp > 9999999)
{
fputs("\nIl valore inserito non e' valido.\n", stderr);
goto i_disp;
}
i_min:
fputs("Inserisci la quantita' minima di riordino(0 - 9999998): ", stderr);
fflush(stdin);
scanf("%7i", &nn->q_min);
if(nn->q_min < 0 || nn->q_min > 9999998)
{
fputs("\nIl valore inserito non e' valido.\n", stderr);
goto i_min;
}
nn->n = c;
if(!p)
{
start = nn;
}
else
{
p->n = nn;
}
}
void elimina()
{
articolo *p = 0, *c = 0;
signed int code = 0, c_code = 0;
if(!start)
{
fputs("\nDatabase vuoto.\n", stderr);
return;
}
menu_e:
fputs("\n1 - Elimina uno o piu' componenti\n", stderr);
fputs("\n2 - Elimina tutto il database\n", stderr);
fputs("\n3 - Torna al menu'\n", stderr);
fputs("\nInserisci il codice corrispondente alla tua scelta: ", stderr);
fflush(stdin);
scanf("%u", &c_code);
switch(c_code)
{
case 1:
del:
fputs("\nInserisci il codice del componente: ", stderr);
fflush(stdin);
scanf("%u", &code);
for(c = start, p = 0; c && (c->code != code); p = c, c = c->n);
if(!c)
{
fputs("\nComponente non trovato. Impossibile completare la cancellazione.\n", stderr);
fputs("\nRiprovare?[s/n]: ", stderr);
fflush(stdin);
if(fgetc(stdin) == 's')
{
PUTS_LINE_STDERR;
goto del;
}
goto ask_e;
}
if(!p)
{
start = c->n;
}
else
{
p->n = c->n;
}
free(c->name);
free(c->des);
free(c);
fputs("\nComponente eliminato.\n", stderr);
break;
case 2:
for(p = start, c = 0; p; p = c)
{
c = p->n;
free(p->name);
free(p->des);
free(p);
}
start = 0;
fputs("\nDatabase svuotato.\n", stderr);
return;
case 3:
return;
default:
fputs("\nIl codice inserito non e' valido.\n", stderr);
PUTS_LINE_STDERR
goto menu_e;
break;
}
ask_e:
fputs("\nContinuare con le eliminazioni?[s/n]: ", stderr);
fflush(stdin);
if(fgetc(stdin) == 's')
{
PUTS_LINE_STDERR;
goto menu_e;
}
}