#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
char *ar[] =
{ "--autore=ciccio", "--titolo=c'era una volta in america", "--edizione=c"
};
int parse(char *);
char **a1, **a2;
int i = 0, j = 0;
int main()
{
int m = sizeof(ar)/sizeof(*ar)-1;
while (m >= 0) {
if ((parse(ar[m])) == -1) {
printf("w");
exit(1);
}
printf("\n%s-%s\n", a1[i], a2[j]);
m--;
}
return 0;
}
int parse(char *s)
{
char *token = NULL;
char *a = NULL;
a = strdup(s);
if (a == NULL) {
errno = ENOMEM;
return -1;
}
token = strtok(a, "=");
printf("1");
if (strcmp(token, "--autore") == 0) {
printf("2");
sprintf(a1[i], "%s", "autore");
printf("3");
token = strtok(NULL, "\0");
if (token == NULL) {
printf("4");
free(a);
errno = EINVAL;
return -1;
}
printf("5");
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
printf("6");
} else if (strcmp(token, "--titolo") == 0) {
sprintf(a1[i], "%s", "titolo");
token = strtok(NULL, "\0");
if (token == NULL) {
free(a);
errno = EINVAL;
return -1;
}
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
} else if (strcmp(token, "--editore") == 0) {
sprintf(a1[i], "%s", "editore");
token = strtok(NULL, "\0");
if (token == NULL) {
free(a);
errno = EINVAL;
return -1;
}
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
} else if (strcmp(token, "--luogo_pubblicazione") == 0) {
sprintf(a1[i], "%s", "luogo_pubblicazione");
token = strtok(NULL, "\0");
if (token == NULL) {
free(a);
errno = EINVAL;
return -1;
}
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
} else if (strcmp(token, "--anno") == 0) {
sprintf(a1[i], "%s", "anno");
token = strtok(NULL, "\0");
if (token == NULL) {
free(a);
errno = EINVAL;
return -1;
}
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
} else if (strcmp(token, "--prestito") == 0) {
sprintf(a1[i], "%s", "prestito");
token = strtok(NULL, "\0");
if (token == NULL) {
free(a);
errno = EINVAL;
return -1;
}
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
} else if (strcmp(token, "--collocazione") == 0) {
sprintf(a1[i], "%s", "collocazione");
token = strtok(NULL, "\0");
if (token == NULL) {
free(a);
errno = EINVAL;
return -1;
}
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
} else if (strcmp(token, "--descrizione_fisica") == 0) {
sprintf(a1[i], "%s", "descrizione_fisica");
token = strtok(NULL, "\0");
if (token == NULL) {
free(a);
errno = EINVAL;
return -1;
}
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
} else if (strcmp(token, "--nota") == 0) {
sprintf(a1[i], "%s", "nota");
token = strtok(NULL, "\0");
if (token == NULL) {
free(a);
errno = EINVAL;
return -1;
}
sprintf(a2[j], "%s", token);
i++;
j++;
free(a);
} else {
free(a);
return -1;
}
return 0;
}
max@studio:~/forum> gcc -Wall -g prova.c
max@studio:~/forum> valgrind ./a.out
==30592== Memcheck, a memory error detector
==30592== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==30592== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==30592== Command: ./a.out
==30592==
1w==30592==
==30592== HEAP SUMMARY:
==30592== in use at exit: 0 bytes in 0 blocks
==30592== total heap usage: 1 allocs, 1 frees, 13 bytes allocated
==30592==
==30592== All heap blocks were freed -- no leaks are possible
==30592==
==30592== For counts of detected and suppressed errors, rerun with: -v
==30592== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)