/*$TITLE=Command to jump 'TO' a specified project*/ /* ********************************************************************************************************* * TO * * Command to jump TO a specified project * * * * Filename : TO.C * Programmer(s) : Jean J. Labrosse ********************************************************************************************************* * * This program allows the user to change directory by simply specifying a name which is associated with * the directory's path. * * * Program use: * * TO name [path] * * where : * * name Is the name associated with a path * [path] Is an optional path used to specify the path associated with the project * * Notes : TO assumes the presence of the file TO.TBL on the root directory of the current drive * TO.TBL is an ASCII file which has the following format: * * name, path * name, path * . . * . . * name, path * * where, 'name' is the name associated with 'path' ********************************************************************************************************* */ /*$PAGE*/ /* ********************************************************************************************************* * INCLUDE FILES ********************************************************************************************************* */ #include #include #include #include #include /* ********************************************************************************************************* * CONSTANTS ********************************************************************************************************* */ #define NUL 0x00 #define TO_NOT_EOF 0 #define TO_EOF -1 #define TRUE 1 #define FALSE 0 /* ********************************************************************************************************* * FUNCTION PROTOTYPES ********************************************************************************************************* */ void main(int argc, char *argv[]); static void ToDispUsage(void); static void ToErrNoFile(void); static void ToFindPath(char *project); static int ToAddPath(char *project, char *path); static int ToRdLine(void); /* ********************************************************************************************************* * GLOBAL VARIABLES ********************************************************************************************************* */ static char ToName[100]; static char ToPath[200]; static char ToLine[300]; static char ToLineRd[300]; static FILE *ToFilePtr; static FILE *ToTempFilePtr; /*$PAGE*/ /* ********************************************************************************************************* * TO ENTRY POINT ********************************************************************************************************* */ void main(int argc, char *argv[]) { int stat; switch (argc) { case 1: ToDispUsage(); /* TO */ break; case 2: ToFilePtr = fopen("\\TO.TBL", "r"); /* TO */ if (ToFilePtr != NULL) { ToFindPath(argv[1]); /* Find path assoicated with name */ fclose(ToFilePtr); } else { ToErrNoFile(); /* \TO.TBL does not exist */ } break; case 3: ToFilePtr = fopen("\\TO.TBL", "r"); /* TO */ ToTempFilePtr = fopen("ZZZZZZZZ.ZZZ", "w"); /* Create temporary file */ if (ToFilePtr != NULL && ToTempFilePtr != NULL) { stat = ToAddPath(argv[1], argv[2]); /* Add new entry in \TO.TBL */ fclose(ToFilePtr); fclose(ToTempFilePtr); if (stat == 1) { /* See if unique name ... */ ToFilePtr = fopen("\\TO.TBL", "w"); /* ... ZZZZZZZZ.ZZZ -> \TO.TBL */ ToTempFilePtr = fopen("ZZZZZZZZ.ZZZ", "r"); while (fgets(ToLine, 100, ToTempFilePtr) != NULL) { fputs(ToLine, ToFilePtr); } fclose(ToFilePtr); fclose(ToTempFilePtr); } remove("ZZZZZZZZ.ZZZ"); /* Delete temporary file */ } else { ToErrNoFile(); } break; default: ToDispUsage(); /* default */ break; } } /*$PAGE*/ /* ********************************************************************************************************* * DISPLAY THE USAGE OF THIS PROGRAM ********************************************************************************************************* */ static void ToDispUsage(void) { printf("TO.EXE\n\n"); printf("Program to change directory:\n"); printf(" This program reads a file in the ROOT directory called \"\\TO.TBL\".\n"); printf(" This file is an ASCII file.\n"); printf(" This file contains a table of names and their path.\n"); printf(" This name is separated from the directory by a comma.\n\n"); printf("Usage: TO [path]\n\n"); printf(" To add a new name:\n"); printf(" Type TO followed by the name and finally, its path\n"); } /* ********************************************************************************************************* * DISPLAY ERROR MESSAGE SINCE \TO.TBL NOT FOUND ********************************************************************************************************* */ static void ToErrNoFile(void) { printf("Error:\n"); printf(" \"\\TO.TBL\" does not exist.\n"); printf(" \"\\TO.TBL\" is an ASCII file that contains a name and a path.\n"); printf(" The file is organized as follows:\n"); printf(" , \n"); } /*$PAGE*/ /* ********************************************************************************************************* * FIND PATH ASSOCIATED WITH NAME ********************************************************************************************************* */ static void ToFindPath(char *name) { int stat; char *ptr; ptr = name; /* Convert name to upper case */ while (*ptr) { *ptr = toupper(*ptr); ptr++; } do { stat = ToRdLine(); /* Read line from \TO.TBL and extract name & path */ if (strcmp(name, ToName) == 0) { /* See if found desired name */ clrscr(); /* Clear the screen */ chdir(ToPath); /* Change directory to path associated with name */ return; } } while (stat != TO_EOF); /* Read all lines from \TO.TBL */ printf("Invalid NAME.\n"); /* Name not found in \TO.TBL */ } /*$PAGE*/ /* ********************************************************************************************************* * ADD PATH ASSOCIATED WITH NAME TO \TO.TBL ********************************************************************************************************* */ static int ToAddPath(char *name, char *path) { char *ptr; char buf[20]; ptr = name; /* Convert name name to upper case */ while (*ptr) { *ptr = toupper(*ptr); ptr++; } while (ToRdLine() != TO_EOF) { /* Read line from \TO.TBL */ if (strcmp(name, ToName) == 0) { /* See if name already in \TO.TBL */ clrscr(); /* Clear the screen */ printf("Name <%s> already exist.\n", name); /* Indicate that already exist */ return (0); } fprintf(ToTempFilePtr, "%s", ToLineRd); } strcpy(buf, " "); /* Place name name within 11 characters */ ptr = &buf[0]; while (*name) *ptr++ = *name++; *ptr++ = ','; ptr = path; /* Convert path to upper case characters */ while (*ptr) { *ptr = toupper(*ptr); ptr++; } fprintf(ToTempFilePtr, "%s%s\n", buf, path); /* Add new name & path at the end of TO.TBL */ return (1); } /*$PAGE*/ /* ********************************************************************************************************* * READ A LINE FROM \TO.TBL AND SEPARATE TOKENS ********************************************************************************************************* */ static int ToRdLine(void) { char *ptr; char *source; char *desti; if (fgets(ToLine, 100, ToFilePtr) != NULL) { strcpy(ToLineRd, ToLine); ptr = strchr(ToLine, '\n'); /* Remove the newline character */ if (ptr != NULL) { *ptr = NUL; } ptr = strtok(ToLine, ","); /* Get name */ source = ptr; /* Remove any spaces */ desti = &ToName[0]; while (*source) { if (*source != ' ') { *desti++ = toupper(*source); source++; } else { source++; } } *desti = NUL; ptr = strtok(NULL, ","); /* Get path */ source = ptr; /* Remove any spaces */ desti = &ToPath[0]; while (*source) { if (*source != ' ') { *desti++ = *source++; } else { source++; } } *desti = NUL; return (TO_NOT_EOF); } else { return (TO_EOF); } }