Code:
int loadData(GJCType* menu, char* menuFile, char* submenuFile)
{
CategoryType *currentCat, *prevCat, *newCat;
ItemType *currentItem, *prevItem, *newItem;
FILE *fp1;
FILE *fp2;
char *token, *line;
char array[BUFFER_SIZE + 2];
double d;
unsigned doll;
int i;
char nc_array[NC_ARRAY_SIZE + 1];
/* Open menu file for reading. */
fp1 = fopen(menuFile, "r");
/* check if fp1 menu file exists*/
if(fp1 == NULL)
{
printf("file error\n");
}
/* initialize the previous node to NULL*/
prevCat = NULL;
while((line = fgets(array, BUFFER_SIZE + 2, fp1)) != NULL)
{
/* allocate memory for CategoryType pointer*/
newCat = malloc(sizeof(CategoryType));
/* check if memory allocation succeeded if fails exit*/
if(newCat == NULL)
{
printf("Memory Allocation error for newCat\n");
exit(0);
}
/* if the prevCat is NULL point the new node to the
start of the list*/
if(prevCat == NULL)
{
menu->headCategory = newCat;
}
/* if it isnt at the start get the next node*/
else
{
prevCat->nextCategory = newCat;
}
/* tokenize the Pipe and copy the field
pointers into the struct*/
token = strtok(line, "|");
strcpy(newCat->categoryID, token);
token = strtok(NULL, "|");
newCat->drinkType = token[0];
token = strtok(NULL, "|");
strcpy(newCat->categoryName, token);
token = strtok(NULL, "|");
strcpy(newCat->categoryDescription, token);
/* initialize everything to a safe state*/
newCat->nextCategory = NULL;
newCat->headItem = NULL;
newCat->numItems = 0;
prevCat = newCat;
}
/* the current pointer points to headCategory*/
currentCat = menu->headCategory;
/* for testing purposes traverse through the list
and print out linked list*/
while(currentCat != NULL)
{
printf("\n%s, %c, %s, %s", currentCat->categoryID, currentCat->drinkType,
currentCat->categoryName, currentCat->categoryDescription);
currentCat = currentCat->nextCategory;
}
/* close the first pointer to the file*/
fclose(fp1);
/* Open submenu file for reading. */
fp2 = fopen(submenuFile, "r");
/* check if sub menu file exists*/
if(fp2 == NULL)
{
printf("file error\n");
}
/*intialize pointer to the start*/
prevItem = NULL;
currentCat = menu->headCategory;
while((line = fgets(array, BUFFER_SIZE + 2, fp2)) != NULL)
{
newItem = malloc(sizeof(ItemType));
token = strtok(line, "|");
strcpy(newItem->itemID, token);
token = strtok(NULL, "|");
strcpy(nc_array, token);
/* put the current pointer to the head of the list*/
currentCat = menu->headCategory;
/* while current is pointing to a node*/
while(currentCat != NULL)
{
if(strcmp(currentCat->categoryID, nc_array) == 0)
{
break;
}
currentCat = currentCat->nextCategory;
}
if(currentCat == NULL)
{
printf("Problem with data!!!\n");
}
else
{
token = strtok(NULL, "|");
strcpy(newItem->itemName, token);
for(i = 0; i < NUM_PRICES; i++)
{
token = strtok(NULL, "|");
d = atof(token);
doll = (unsigned) d;
newItem->prices[i].dollars = doll;
newItem->prices[i].cents = (d - doll) * 100;
}
token = strtok(NULL, "|");
strcpy(newItem->itemDescription, token);
/*
if(it_prev == NULL)
{
ct_curr->headItem = new_item;
}
else
{
it_prev->nextItem = new_item;
}
new_item->nextItem = NULL;
it_prev = new_item;
new_item->nextItem = ct_curr->headItem;
ct_curr->headItem = new_item;
*/
newItem->nextItem = currentCat->headItem;
currentCat->headItem = newItem;
currentCat->numItems ++;
}
}
currentCat = menu->headCategory;
while(currentCat!= NULL)
{
currentItem = currentCat->headItem;
printf("Items for category %s\n", currentCat->categoryID);
while(currentItem != NULL)
{
printf("\n%s, %s, %s, %d.%d, %d.%d, %d.%d, %s\n",
currentItem->itemID, currentCat->categoryID,
currentItem->itemName, currentItem->prices[0].dollars,currentItem->prices[0].cents,
currentItem->prices[1].dollars, currentItem->prices[1].cents,
currentItem->prices[2].dollars, currentItem->prices[2].cents,
currentItem->itemDescription);
currentItem = currentItem->nextItem;
}
currentCat = currentCat->nextCategory;
}
fclose(fp2);
return EXIT_SUCCESS;
}