Code:
int loadData(GJCType* menu, char* menuFile, char* submenuFile)
{
drinkType *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 %s does not exist \n", menuFile);
exit(0);
}
/* 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(drinkType));
/* 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 -1node*/
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);
*/
/* get the next row
currentCat = currentCat->nextCategory;
}*/
/* close the first pointer to the file*/
/* check if it can close it otherwise error*/
if(fclose(fp1)!=0)
{
fprintf(stderr, "cannot close file\n");
}
/* Open submenu file for reading. */
fp2 = fopen(submenuFile, "r");
/* check if sub menu file exists*/
if(fp2 == NULL)
{
printf("file %s does not exist \n", submenuFile);
exit(0);
}
/*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("NULL POINTER Error!!!\n");
}
else
{
token = strtok(NULL, "|");
strcpy(newItem->itemName, token);
/* store dollars into struct array*/
/* convert all prices to float when storing*/
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);
/* from the start of the list*/
newItem->nextItem = currentCat->headItem;
currentCat->headItem = newItem;
/* increment the counter*/
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;
}*/
/* try to close the file*/
/* if it wont close provide an error*/
if(fclose(fp2)!=0)
{
fprintf(stderr, "cannot close file\n");
}
return EXIT_SUCCESS;
}