From 8eb004e7752b42dc548bc19805426bde559ae7cf Mon Sep 17 00:00:00 2001 From: stitchy Date: Mon, 30 Oct 2023 03:25:48 -0700 Subject: [PATCH] Project Should be working --- directories/csv_parser.c | 2 +- directories/directory_list.c | 121 ++++++++++++++++++++++ directories/directory_list.h | 10 ++ directories/input.c | 13 +++ directories/input.h | 2 + directories/makefile | 23 +++++ directories/movies.c | 190 +++++++++++++++++++++++++++++++++++ directories/movies.h | 29 ++++++ directories/movies_by_year.c | 94 ++++++++++++++++- directories/movies_by_year.h | 15 ++- 10 files changed, 491 insertions(+), 8 deletions(-) create mode 100644 directories/directory_list.c create mode 100644 directories/directory_list.h create mode 100644 directories/makefile create mode 100644 directories/movies.c create mode 100644 directories/movies.h diff --git a/directories/csv_parser.c b/directories/csv_parser.c index bfbf168..a08b9fe 100644 --- a/directories/csv_parser.c +++ b/directories/csv_parser.c @@ -5,7 +5,7 @@ struct node* parse_csv(char* name) { FILE * file; file = fopen(name, "r"); if(!file) { - printf("Your File was Stolen by the Gremlins\n"); + perror("Error"); exit(66); } diff --git a/directories/directory_list.c b/directories/directory_list.c new file mode 100644 index 0000000..7fb4d41 --- /dev/null +++ b/directories/directory_list.c @@ -0,0 +1,121 @@ +#include +#include "stdlib.h" +#include +#include +#include "string.h" + + +static int +filter_movies (const struct dirent *unused) +{ + if(strstr(unused->d_name, "movies_") == unused->d_name) { + char* temp = strchr(unused->d_name, '.'); + if(temp != NULL) + if( !strcmp(temp, ".csv")) + return 1; + } + + return 0; +} + +void dir_free(struct dirent** ent, int n) { + + int i = 0; + while(n--) { + free(ent[n]); + i++; + } + + free(ent); + + +} + +char* largest_val() { + + struct dirent** eps; + int num = scandir ("./", &eps, filter_movies, alphasort); + + if(num < 1) + exit(1); + + struct dirent* max = eps[0]; + struct stat *cur_stat = malloc(sizeof(struct stat)); + stat(eps[0]->d_name, cur_stat); + int n = 1; + + struct stat *st = malloc(sizeof(struct stat)); + while(n < num) { + stat (eps[n]->d_name, st); + + if(st->st_size > cur_stat->st_size) { + struct stat* temp = cur_stat; + cur_stat = st; + st = temp; + max = eps[n]; + } + + n++; + } + + char* ret = malloc((strlen(max->d_name) + 1) * sizeof(char)); + strcpy(ret, max->d_name); + + free(cur_stat); + free(st); + dir_free(eps, n); + + return ret; +} + + + +char* smallest_val() { + + struct dirent** eps; + int num = scandir ("./", &eps, filter_movies, alphasort); + + if(num < 1) + exit(1); + + struct dirent* max = eps[0]; + struct stat *cur_stat = malloc(sizeof(struct stat)); + stat(eps[0]->d_name, cur_stat); + int n = 1; + + struct stat *st = malloc(sizeof(struct stat)); + while(n < num) { + stat (eps[n]->d_name, st); + + if(st->st_size < cur_stat->st_size) { + struct stat* temp = cur_stat; + cur_stat = st; + st = temp; + max = eps[n]; + } + + n++; + } + + char* ret = malloc((strlen(max->d_name) + 1) * sizeof(char)); + strcpy(ret, max->d_name); + + free(cur_stat); + free(st); + dir_free(eps, n); + + return ret; +} + +int temp() { + + char* large = largest_val(); + printf("Largest Moives: %s\n", large); + char* small = smallest_val(); + printf("Smallest Moives: %s\n", small); + + free(small); + free(large); + + return 0; +} diff --git a/directories/directory_list.h b/directories/directory_list.h new file mode 100644 index 0000000..8f1ad35 --- /dev/null +++ b/directories/directory_list.h @@ -0,0 +1,10 @@ + +#ifndef DIR_LISTER +#define DIR_LISTER + + +char* largest_val(); +char* smallest_val(); + +#endif + diff --git a/directories/input.c b/directories/input.c index 0c9b6f9..4bf067f 100644 --- a/directories/input.c +++ b/directories/input.c @@ -19,3 +19,16 @@ int integer_input(char* val) { return num; } + +char* string_input(char* val) { + + char* string = malloc(sizeof(char) * 1000); + + printf("%s", val); + fflush(stdout); + + ssize_t n = read(STDIN_FILENO, string, 1000); + string[n - 1] = '\0'; + + return string; +} diff --git a/directories/input.h b/directories/input.h index a2d4906..4ec80ad 100644 --- a/directories/input.h +++ b/directories/input.h @@ -1,5 +1,6 @@ #include "stdio.h" +#include "string.h" #include "stdlib.h" #include "unistd.h" @@ -8,5 +9,6 @@ // Error checking integer input int integer_input(char*); +char* string_input(char*); #endif diff --git a/directories/makefile b/directories/makefile new file mode 100644 index 0000000..663bc06 --- /dev/null +++ b/directories/makefile @@ -0,0 +1,23 @@ +CC=gcc --std=gnu99 -g +output=movies_by_year + +all: movies_by_year.c movies_by_year.h csv_parser.o node.o input.o directory_list.o + $(CC) movies_by_year.c csv_parser.o node.o input.o directory_list.o -o $(output) + +csv_parser.o: csv_parser.c csv_parser.h + $(CC) -c csv_parser.c -o csv_parser.o + +node.o: node.c node.h + $(CC) -c node.c -o node.o + +input.o: input.h input.c + $(CC) -c input.c -o input.o + +directory_list.o: directory_list.c directory_list.h + $(CC) -c directory_list.c -o directory_list.o + +run: + ./movies_by_year movies_sample_1.csv + +clean: + rm -fr *.o vgcore.* temp.movies.* $(output) diff --git a/directories/movies.c b/directories/movies.c new file mode 100644 index 0000000..4b70b38 --- /dev/null +++ b/directories/movies.c @@ -0,0 +1,190 @@ +#include "movies.h" + +int haschanged = 0; + +int main(int argc, char** argv) { + + if(argc < 2) { + printf("Please Specify Filename\n"); + return 64; + } + + struct node* head = parse_csv(argv[1]); + + // menu logic + enum OPTIONS menu_select = 0; + while(1) { + + menu_select = menu(); + + switch(menu_select) { + case YEAR: + movie_year(head); + break; + case RATE: + movie_rate(head); + break; + case LANGUAGE: + movie_lang(head); + break; + case EXIT: + printf("Goodbye~\n"); + return 0; + default: + printf("You naughty~ Pick a correct option next time.\n"); + } + } +} + +int menu() { + + printf("1. Show movies released in the specified year\n"); + printf("2. Show highest rated movie for each year\n"); + printf("3. Show the title and year of release of all movies in a specific language\n"); + printf("4. Exit from the program\n"); + + int option; + do { + option = integer_input("Enter a choice from 1 to 4: "); + } while(option > 4 || option < 1); + + return option; +} + +void year_print(struct csv* data, void* val) { + + if(data->year != *(int*)val) + return; + + printf("%s\n", data->title); + haschanged = 1; +} + +void movie_year(struct node* head) { + + void* f = &year_print; + int* val = malloc(sizeof(int)); + + *val = integer_input("Enter year to search movies from: "); + haschanged = 0; + + // Prints each node if movie year the same as specified + iterate_nodes(head, f, val); + + if(!haschanged) { + printf("No data about movies released in the year %d", *val); + } + + printf("\n\n"); + +} + +void lang_print(struct csv* data, void* val) { + + for(int i = 0; i < data->numlang; i++) { + + // Prints if movie is in given language + if(!strcmp(val, data->languages[i])) { + printf("%d %s\n", data->year, data->title); + haschanged = 1; + } + } +} + +void movie_lang(struct node* head) { + + void* f = &lang_print; + char val[41]; + + printf("Enter Language to search for: "); + fflush(stdout); + fgets(val, 40, stdin); + + // Replace newline character with the null terminator + val[strlen(val)-1] = '\0'; + + haschanged = 0; + iterate_nodes(head, f, &val); + + if(!haschanged) + printf("No data about movies released in %s\n", val); + printf("\n"); + +} + +void check_year(int* data, int* year) { + + if(*data == *year) + haschanged = 1; + +} + +void find_year(struct csv* data, void* year) { + + void* f = &check_year; + + haschanged = 0; + // Finds every year that has a movie produced in our list + iterate_nodes(year, f, &data->year); + + if(!haschanged) + appendv_node(year, &data->year); + + haschanged = 0; + +} + +void print_rating(struct csv* data, struct csv** val) { + + // Null case handled here + if(val[0] == NULL) { + if(data->year == haschanged) + val[0] = data; + return; + } + + // Sets pointer to movie struct of new highest rating + if(data->rating > val[0]->rating + && data->year == haschanged) + val[0] = data; + +} + +void index_nodes(int* val, void* head) { + + haschanged = *val; + + struct csv ** cur_val = malloc(sizeof(struct csv*)); + cur_val[0] = NULL; + + void* f = &print_rating; + + // Find the node of highest rating for specified year + iterate_nodes(head, f, cur_val); + + printf("%d %2.1f %s\n", cur_val[0]->year, cur_val[0]->rating, cur_val[0]->title); + + haschanged = 0; + +} + +void movie_rate(struct node* head) { + + struct csv* temp = head->data; + + struct node* year = appendv_node(NULL, &temp->year); + + void* f = &find_year; + + // Make a list of every year that has a movie + iterate_nodes(head, f, year); + + void* tempish = &index_nodes; + + + // Iterate though every year and find the highest rating + iterate_nodes(year, tempish, head); + + printf("\n"); +} + diff --git a/directories/movies.h b/directories/movies.h new file mode 100644 index 0000000..ed2cd78 --- /dev/null +++ b/directories/movies.h @@ -0,0 +1,29 @@ + + +#ifndef MOVIES +#define MOVIES + +#include "stdio.h" +#include "stdlib.h" + +#include "csv_parser.h" +#include "node.h" +#include "input.h" + +int menu(); + +// Headers for the options called by menu +void movie_year(struct node*); +void movie_rate(struct node*); +void movie_lang(struct node*); + +// Menu Options +enum OPTIONS { + YEAR = 1, + RATE = 2, + LANGUAGE = 3, + EXIT = 4, +}; + + +#endif diff --git a/directories/movies_by_year.c b/directories/movies_by_year.c index 98897ed..1ff91a7 100644 --- a/directories/movies_by_year.c +++ b/directories/movies_by_year.c @@ -7,13 +7,100 @@ int main() { // seed random seed srand(time(NULL)); - struct node* head = parse_csv("movies_sample_1.csv"); + enum OPTIONS menu_select = 0; + while(1) { + + if(menu_select == 0) + menu_select = menu(); + + switch(menu_select) { + case SMALL: + movie_by_small(); + menu_select = 0; + break; + case LARGE: + movie_by_large(); + menu_select = 0; + break; + case SELECT: + movie_by_select(); + menu_select = 0; + break; + case PROCCESS: + menu_select = select_ftype(); + break; + case EXIT: + printf("Goodbye~\n"); + return 0; + default: + printf("You naughty~ Pick a correct option next time.\n"); + } + } +} + +void movie_by_small() { + + char* name = smallest_val(); + choose_movie(name); +} + +void movie_by_large() { + + char* name = largest_val(); + choose_movie(name); + +} + +int select_ftype() { + + while(1) { + printf("Enter 1 to pick the largest file\n"); + printf("Enter 2 to pick the smallest file\n"); + printf("Enter 3 to specify the name of a file\n"); + + switch(integer_input("Enter a choice from 1 to 3: ")) { + case 1: + return 4; + case 2: + return 5; + case 3: + return 3; + default: + break; + } + } +} + +int menu() { + printf("1. Select file to process\n"); + printf("2. Exit program\n"); + int choice = 0; + while((choice > 2) || (choice < 1)) { + choice = integer_input("Enter Choice 1 or 2: "); + } + return choice; +} + +void movie_by_select() { + + char* dir_str = string_input("Enter CSV to parse: "); + + choose_movie(dir_str); +} + +void choose_movie(char* dir_str) { + //printf("\nDirectory: %s\n", dir_str); + struct node* head = parse_csv(dir_str); // Generate the String for movies char* dir = malloc(sizeof(char)*100); sprintf(dir, "temp.movies.%d", rand() % 100000); - return 0; + printf("Created directory with the name %s\n", dir); + print_csv(head, dir); + + free(dir_str); + free(dir); } void write_file(struct csv* node, FILE* mov_file) { @@ -46,7 +133,6 @@ void index_nodes(int* val, void* head) { void print_csv(struct node* head, char* dir) { int result = mkdir(dir, 0750); - printf("%d\n", result); chdir(dir); @@ -62,6 +148,8 @@ void print_csv(struct node* head, char* dir) { // Iterate through every year year iterate_nodes(year, tempish, head); + chdir(".."); + } void check_year(int* data, int* year) { diff --git a/directories/movies_by_year.h b/directories/movies_by_year.h index b0c8f2b..a7ffce0 100644 --- a/directories/movies_by_year.h +++ b/directories/movies_by_year.h @@ -12,19 +12,26 @@ #include "csv_parser.h" #include "node.h" #include "input.h" +#include "directory_list.h" int menu(); +int select_ftype(); void print_csv(struct node*, char*); // Menu Options enum OPTIONS { - YEAR = 1, - RATE = 2, - LANGUAGE = 3, - EXIT = 4, + PROCCESS = 1, + EXIT = 2, + SELECT = 3, + LARGE = 4, + SMALL = 5, }; +void movie_by_small(); +void movie_by_large(); +void movie_by_select(); +void choose_movie(char*); void find_year(struct csv*, void*); #endif