/* * File: clubirs.c * Author: justin hall, section thursday * * this program runs the two fisted film club info retrieval system. * god bless america. * */ #include #include #include #include #define DataBase "twofist.db" #define MaxNumFliks 500 #define MaxNameLen 50 #define MaxMiscLen 100 /* Type: flikT */ typedef struct { int num; int code; char *name; char *misc; } *flikT; /* Type: flikDB */ typedef struct { flikT *fliklist; int nFliks; } *flikDB; /* function declarations */ void Menu(flikDB db, int n); void Init(flikDB *db); flikT FindRent(flikDB db); flikT Find(flikDB db); flikT Rent(flikT); flikT Return(flikDB db); void FindStr(flikDB db); flikDB Entry(flikDB db); flikDB Delete(flikDB db); void Size(flikDB db); void PrintOne(flikT); void PrintAll(flikDB db); void Error(char *msg); void Quit(flikDB db, int n); /* main program */ main() { flikDB db; int n, q; printf("\a\n"); printf(" -/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-/|\\-"); printf("\n"); printf(" Y E A H !\n"); printf(" Swarthmore College Two Fisted Features Film Database\n"); printf(" -\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-\\|/-"); printf("\n"); printf("\n"); printf(" your home for the most violent action packed\n"); printf(" masculine identity affirming movies around.\n"); Init(&db); Size(db); Menu(db, n); printf("Swarthmore College Video Library Club Society, Goodbye.\n"); } void Menu(flikDB db, int n) { int q; printf("\n"); printf(" -> m a i n m e n u <-\n\n"); printf(" 1. Full Listin' 2. Find n' Rent 3. Return 4. Search\n"); printf(" 5. Add Title 6. Delete Title 9. Quit : "); scanf("%d", &q); switch (q) { case 1: PrintAll(db); Menu(db, n); case 2: FindRent(db); Menu(db, n); case 3: Return(db); Menu(db, n); case 4: FindStr(db); Menu(db, n); case 5: Entry(db); Menu(db, n); case 6: Delete(db); Menu(db, n); default: Quit(db, n); break; } Menu(db, n); } void Init(flikDB *thisdb) { FILE *infile; flikDB db; int nscan; int i; char termch; db=malloc(sizeof(*db)); db->nFliks = 0; db->fliklist = malloc(MaxNumFliks); *thisdb=db; infile = fopen(DataBase, "r"); if (infile == NULL) Error(" Capain, she cannae open the DataBase!\n"); i = 0; while (1) { (db->fliklist)[i] = malloc(16); ((db->fliklist)[i])->name = malloc(MaxNameLen); ((db->fliklist)[i])->misc = malloc(MaxMiscLen); nscan = fscanf(infile, "%d, %d, %[^,], %[^.].%c", &(((db->fliklist)[i])->num), &(((db->fliklist)[i])->code), ((db->fliklist)[i])->name, ((db->fliklist)[i])->misc, &termch); if (nscan == EOF) break; if (nscan != 5) { Error(" Improper file format.\n"); } i++; db->nFliks = i; } fclose(infile); } flikT FindRent(flikDB db) { flikT title, output; char confirm[5]; title = Find(db); if (title->code != 1) { return (title); } printf("\n you wanna rent %s ? ", (title->name)); scanf("%20s", confirm); if (0 != (strstr(confirm, "y"))) { output = Rent(title); return(output); } Menu(db, (db->nFliks)); } flikT Find(flikDB db) { int num, i; printf("\n"); printf(" find: 3 digit flik number ? "); scanf("%d", &num); /* what about null? */ printf(" searching for movie number : %d\n", num); i = 0; while (num != ((((db->fliklist)[i])->num) / 10)) { i++; if (i == (db->nFliks)){ printf("\n no title by that number. remember: * 3 digits * \n"); Menu(db, (db->nFliks)); } } if ((db->fliklist)[i]->code == 1) { PrintOne((db->fliklist)[i]); return ((db->fliklist)[i]); } else while ((((db->fliklist)[i]->num) / 10) == (((db->fliklist)[i+1]->num) / 10)) { if ((db->fliklist)[i+1]->code == 1) { PrintOne((db->fliklist)[i+1]); return ((db->fliklist)[i+1]); } else { i++; }} PrintOne((db->fliklist)[i]); printf("\n sorry, that video is out. please select another.\n"); } flikT Rent(flikT title) { int member; printf("\n"); printf(" 3 digit member number ? "); scanf("%d", &member); /* what if not 3, digits ? */ printf(" renting for member number : %d", member); title->code = member; printf("\n"); PrintOne(title); return (title); } flikT Return(flikDB db) { int num, i; printf("\n"); printf(" return: 4 digit flik number ? "); scanf("%d", &num); /* what about letters / null? */ printf(" returning movie number : %d\n", num); i = 0; while (num != (((db->fliklist)[i])->num)) { i++; if (i > (db->nFliks)) { printf(" no such found!\n"); Menu(db, (db->nFliks)); } } ((db->fliklist)[i])->code = 1; PrintOne((db->fliklist)[i]); return ((db->fliklist)[i]); } void FindStr(flikDB db) { char search[21]; int i; printf("\n"); printf(" up to twenty characters,\n"); printf(" (system is capital-sensitive) enter query: "); scanf("%20s", search); /* no consideration for capital letters. */ printf("\n searching for \"%s\"...\n", search); for (i=0; i <= (db->nFliks); i++) { if (0 != (strstr(((db->fliklist)[i])->name, search))) { PrintOne((db->fliklist)[i]); } } printf("\n"); printf(" ...no more \"%s\" found!\n", search); } flikDB Entry(flikDB db) { flikT entry; int namelen, i, temp, top; /* user enters title: */ printf("\n"); printf(" enter fliks:\n"); entry = malloc(sizeof(*entry)); entry->name=malloc(MaxNameLen+1); printf(" name: "); scanf("\n%[^\n]", entry->name); /* no control for null. */ printf(" flik number: "); scanf("%d", &(entry->num)); /* the formula for video numbering: * alphabet letterplace number * 3 (+10) = maximum range * so, a = 11-13, j = 38-40, o = 53-55, z = 86-88 */ printf(" (code set to 1)\n"); (entry->code) = 1; entry->misc=malloc(MaxMiscLen+1); printf(" misc: "); scanf("\n%[^\n]", entry->misc); getchar(); /* program inserts title: */ i=0; while (entry->num > ((db->fliklist)[i])->num) { i++; } /* prevention of double numbering? */ top = (db->nFliks); do { (db->fliklist)[top+1] = (db->fliklist)[top]; top--; } while ((top + 1) >= i); (db->fliklist)[i] = entry; db->nFliks++; return (db); } flikDB Delete(flikDB db) { int num, h, i, j, x; char confirm[5]; printf("\n"); printf(" delete: 4 digit flik number ? "); scanf("%d", &num); /* what about letters? */ printf(" searching for movie number : %d\n", num); i = 0; while (num != (((db->fliklist)[i])->num)) { i++; if (i == (db->nFliks)){ printf("\n\n no title by that number. try again!\n"); Menu(db, (db->nFliks)); } } PrintOne((db->fliklist)[i]); printf("\n you wanna delete %s ? ", ((db->fliklist[i])->name)); scanf("%20s", confirm); printf("\n"); x = (((db->fliklist)[i])->num); if (0 != (strstr(confirm, "y"))) { if (1 == ((((db->fliklist)[i+1])->num) - (((db->fliklist)[i])->num))) { ((db->fliklist)[i+1])->num = ((db->fliklist)[i])->num; } h = i; do { ((db->fliklist)[i]) = ((db->fliklist)[i+1]); i++; } while ((i+1) <= (db->nFliks)); db->nFliks--; if ((x / 10) == (((db->fliklist)[h]->num) / 10)) { if ((((db->fliklist)[h]->num) / 10) == (((db->fliklist)[h+1]->num) / 10)) { for (j=1; j <= 3; j++) { printf("test num h = %d\n", ((db->fliklist)[h]->num)); printf("test num h+1 = %d\n", ((db->fliklist)[h+1]->num)); if (j <= (((db->fliklist)[h])->num + j) % 10) { (((db->fliklist)[h+j])->num)--; } } } } } } void Size(flikDB db) { int p; p = (db->nFliks); printf("\n"); printf(" number of movies in the database: %d\n", p); } void PrintAll(flikDB db) { FILE *infile; int i; printf("\n"); printf(" full movie list:\n"); printf(" flik # code name pertinents\n"); printf(" ------ ---- ------------------ -------------------------------\n"); for (i=0; i<=((db->nFliks)-1); i++) { printf(" %4d %4d ", (db->fliklist)[i]->num, (db->fliklist)[i]->code); printf("%-18.17s %s\n", ((db->fliklist)[i])->name, ((db->fliklist)[i])->misc); } /* notice provided when titles exceed the length of the name field shown ? */ Size(db); } void PrintOne(flikT title) { printf("\n"); printf(" flik # code name pertinents\n"); printf(" ------ ---- ------------------- -------------------------------\n"); printf(" %4d %4d ", title->num, title->code); printf("%-19.18s %s\n", (title)->name, (title)->misc); } void Error(char *msg) { printf("%s", msg); _exit(0); } void Quit(flikDB db, int n) { int i; FILE *outfile; outfile = fopen(DataBase, "w"); i = 0; printf("\n"); printf("\n closing database...\n"); while (1) { fprintf(outfile, "%d, %d, %s, %s.\n", (db->fliklist)[i]->num, (db->fliklist)[i]->code, ((db->fliklist)[i])->name, ((db->fliklist)[i])->misc); i++; if (i == db->nFliks) { fclose(outfile); printf(" ...y'all come back now, y'hear?\n\n"); _exit(0); } } }