Code:
/**********************************************************************************
PROGRAMMER : David King
LANGUAGE : C
CLASS : CSE1320-001, Spring 2008
COMPILER : gcc
OPERATING SYSTEM : UNIX
PLATFORM : OMEGA
COURSE : Intermediate Programming
ASSIGNMENT : Homework #3
ASSIGNED : April 8th, 2008
FILED AS : hw3DavidKingDrivers.c
FILES USED : hw3DavidKingDrivers.c
hw3DavidKingConstants.c
CONCEPTS : Structures, C File Processing,
Command Line Parameters,
Singly-Linked Lists
WEIGHT : 12%
PURPOSE : define main() and all other functions
**********************************************************************************/
#include "hw3Constants.c"
int main(int argc, char *argv[])
{
char selection, readData[50];
struct employeeNode *startPtr = NULL;
FILE *inFile = NULL;
printf("\n%s %d %s %s %s %s %s %s%c\n\n", "This is line number", __LINE__,
"of the file", __FILE__,
"which was\n compiled on", __DATE__,
"at time", __TIME__, '.');
cmdLineTest(argc, argv);
fileOpen(&inFile, argv);
read(inFile, readData);
while (!feof(inFile))
{
if (readData[0] == '*')
{
selection = readData[2];
switch (selection)
{
case 'H': insertNode(inFile, &startPtr, readData);
break;
case 'I': readInitSal(inFile, &startPtr, readData);
break;
case 'P': readPromotions(inFile, &startPtr, readData);
break;
case 'T': readTransfers(inFile, &startPtr, readData);
break;
default: break;
}
}
}
printList(startPtr);
return;
}
void cmdLineTest(int argc, char *argv[])
{
if (argc == ARGSZ)
printf("The argument supplied is %s\n\n", argv[ARGSZ-ONE]);
else
{
if (argc >2)
{
printf("Too many arguments supplied. Exiting Program.\n");
exit(1);
}
else
{
printf("One argument expected. Exiting Program\n");
exit(1);
}
}
return;
}
void dataProcess(char data[], char *fName, char *lName, char *id, char *cl, char tempLName[], char tempFName[], char tempClass[], int *tempID)
{
lName = strtok(data, " ");
fName = strtok(NULL, " ");
id = strtok(NULL, " ");
cl = strtok(NULL, " ");
strcpy(tempLName, lName);
strcpy(tempFName, fName);
strcpy(tempClass, cl);
*tempID = atoi(id);
return;
}
void fileOpen(FILE **inFilePtr, char *argv[])
{
if(( *inFilePtr = fopen(argv[ARGSZ-ONE], "r")) == NULL)
{
printf("File Open Failed. EXITING PROGRAM.\n");
exit(1);
}
return;
}
void insertNode(FILE *inFile, struct employeeNode **startPtr, char readData[])
{
int x=0, tempID=0;
char *firstName=NULL, *lastName=NULL, *id=NULL, *cl=NULL;
char tempClass[20], tempLName[20], tempFName[20];
struct employeeNode *newPtr = NULL;
struct employeeNode *previousPtr = NULL;
struct employeeNode *currentPtr = NULL;
for(x=0; x<50; x++)
{
readData[x] = '\0';
}
fgets(readData, 50, inFile);
do
{
dataProcess(readData, firstName, lastName, id, cl, tempLName, tempFName, tempClass, &tempID);
memAlloc(tempLName, tempFName, tempClass, tempID, &newPtr);
if(newPtr != NULL)
{
memStore(tempLName, tempFName, tempClass, tempID, &newPtr);
previousPtr = NULL;
currentPtr = *startPtr;
while( (currentPtr != NULL) && (strcmp(tempLName, currentPtr->lastName) > 0) )
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextNode;
}
while( (currentPtr != NULL) && (strcmp(tempLName, currentPtr->lastName) == 0) && (strcmp(tempFName, currentPtr->firstName) > 0) )
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextNode;
}
while( (currentPtr != NULL) && (strcmp(tempLName, currentPtr->lastName) == 0) && (strcmp(tempFName, currentPtr->firstName) == 0) && ( tempID > currentPtr->id) )
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextNode;
}
while( (currentPtr != NULL) && (strcmp(tempLName, currentPtr->lastName) == 0) && (strcmp(tempFName, currentPtr->firstName) == 0) && (tempID > currentPtr->id) && (strcmp(tempClass, currentPtr->employeeClass) > 0) )
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextNode;
}
if( (previousPtr == NULL) )
{
newPtr->nextNode = *startPtr;
*startPtr = newPtr;
}
else
{
previousPtr->nextNode = newPtr;
newPtr->nextNode = currentPtr;
}
printList(*startPtr);
printf("[HIRE => INSERT NODE] Read: %s %s %d %s\n\n", tempLName, tempFName, tempID, tempClass);
}
else
{
printf("No Memory Available.\n");
}
fgets(readData, 50, inFile);
}while(readData[0] != '*');
return;
}
void memAlloc(char lName[], char fName[], char eClass[], int tempID, struct employeeNode **newPtr)
{
int firstNum, lastNum, classNum;
*newPtr = calloc(ONE, sizeof(struct employeeNode));
if (newPtr != NULL)
{
firstNum = strlen(fName);
lastNum = strlen(lName);
classNum = strlen(eClass);
lName[lastNum] = '\0';
fName[firstNum] = '\0';
eClass[classNum] = '\0';
(**newPtr).firstName = calloc((firstNum+ONE), sizeof(char));
(**newPtr).lastName = calloc((lastNum+ONE), sizeof(char));
(**newPtr).employeeClass = calloc((classNum+ONE), sizeof(char));
}
else
{
printf("No Memory Available. Exiting Program");
exit(1);
}
return;
}
void memStore(char lName[], char fName[], char eClass[], int id, struct employeeNode **newPtr)
{
int x;
strcpy( (**newPtr).firstName, fName);
strcpy( (**newPtr).lastName, lName);
for(x=0; x<50; x++)
{
if (eClass[x] == '\n')
{
eClass[x] = '\0';
}
}
strcpy( (**newPtr).employeeClass, eClass);
(**newPtr).id = id;
(**newPtr).nextNode = NULL;
return;
}
void printList(struct employeeNode *currentPtr)
{
int numEmployee=1;
if (currentPtr == NULL)
printf("\nThere store has 0 Employees:\n");
else
printf("\nThe Employees Are:\n");
printf("%63s %10s\n", "INITIAL", "PROMOTION");
printf("%3s%9s %-10s%-10s%4s %-15s %9s %10s%13s\n", "NUM", "CURRENT", "FIRST", "LAST", "ID", "CLASSIFICATION", "SALARY", "SALARY", "NEXT");
printf("---------------------------------------------------------------------------------------\n");
if (currentPtr == NULL)
printf("NULL\n");
else
{
while (currentPtr != NULL)
{
printf("%3d%9X %-10s%-10s%4d %-15s$%9.2f $%9.2f",
numEmployee,
currentPtr,
currentPtr->firstName,
currentPtr->lastName,
currentPtr->id,
currentPtr->employeeClass,
currentPtr->salary[0],
currentPtr->salary[1]);
if(currentPtr->nextNode != NULL)
printf("%13X\n", currentPtr->nextNode);
else
printf("%13s\n", "NULL");
numEmployee+=1;
currentPtr = currentPtr->nextNode;
}
}
printf("\n");
return;
}
void read(FILE *inFile, char readData[50])
{
fgets(readData, 50, inFile);
return;
}
void readInitSal(FILE *inFile, struct employeeNode **searchPtr, char readData[])
{
int idTrue=0, x=0;
double salaryTrue=0.0;
char *idStr = NULL, *salaryString = NULL;
struct employeeNode *currentPtr;
fgets(readData, 50, inFile);
do
{
idStr = strtok(readData, " ");
salaryString = strtok(NULL, " ");
idTrue = atoi(idStr);
salaryTrue = atof(salaryString);
fgets(readData, 50, inFile);
currentPtr = *searchPtr;
while (currentPtr != NULL)
{
if ( (currentPtr->id) == idTrue)
{
currentPtr->salary[0] = salaryTrue;
}
currentPtr = currentPtr->nextNode;
}
printList(*searchPtr);
printf("[INITIAL SALARIES => MODIFY NODE] Read: %d %.2f\n\n", idTrue, salaryTrue);
}while(readData[0] != '*');
return;
}
void readPromotions(FILE *inFile, struct employeeNode **searchPtr, char readData[])
{
int idTrue=0, x=0;
double pSalaryTrue=0.00;
char pClass[20]={'\0'}, *idStr=NULL, *pSalaryString=NULL, *pClassString=NULL;
struct employeeNode *currentPtr;
fgets(readData, 50, inFile);
do
{
idStr = strtok(readData, " ");
pSalaryString = strtok(NULL, " ");
pClassString = strtok(NULL, " ");
idTrue = atoi(idStr);
pSalaryTrue = atof(pSalaryString);
strcpy(pClass, pClassString);
for (x=0; x<20; x++)
{
if (pClass[x] == '\n')
pClass[x] = '\0';
}
currentPtr = *searchPtr;
while (currentPtr != NULL)
{
if ((currentPtr->id) == idTrue)
{
currentPtr->salary[1] = pSalaryTrue;
strcpy((currentPtr->employeeClass), pClass);
}
currentPtr = currentPtr->nextNode;
}
fgets(readData, 50, inFile);
printList(*searchPtr);
printf("[PROMOTIONS => MODIFY NODE] Read: %d %.2f %s\n\n", idTrue, pSalaryTrue, pClass);
}while(readData[0] != '*');
return;
}
void readTransfers(FILE *inFile, struct employeeNode **startPtr, char readData[])
{
char idStr[10];
int idTrue;
struct employeeNode *previousPtr = NULL;
struct employeeNode *currentPtr = NULL;
struct employeeNode *tempPtr = NULL;
fgets(readData, 50, inFile);
do
{
strcpy(idStr, readData);
idTrue = atoi(idStr);
if (idTrue == (*startPtr)->id)
{
tempPtr = *startPtr;
*startPtr = (*startPtr)->nextNode;
free(tempPtr);
tempPtr = NULL;
}
else
{
previousPtr = *startPtr;
currentPtr = (*startPtr)->nextNode;
while ((currentPtr != NULL) && (currentPtr->id != idTrue))
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextNode;
}
if (currentPtr != NULL)
{
tempPtr = currentPtr;
previousPtr->nextNode = currentPtr->nextNode;
free(tempPtr);
}
}
fgets(readData, 50, inFile);
printList(*startPtr);
printf("[TRANSFERS => DELETE NODE] Read: %d \n\n", idTrue);
}while(readData[0] != '*');
return;
}