Project Should be working
This commit is contained in:
parent
9136bc7740
commit
8eb004e775
10 changed files with 491 additions and 8 deletions
|
@ -5,7 +5,7 @@ struct node* parse_csv(char* name) {
|
||||||
FILE * file;
|
FILE * file;
|
||||||
file = fopen(name, "r");
|
file = fopen(name, "r");
|
||||||
if(!file) {
|
if(!file) {
|
||||||
printf("Your File was Stolen by the Gremlins\n");
|
perror("Error");
|
||||||
exit(66);
|
exit(66);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
121
directories/directory_list.c
Normal file
121
directories/directory_list.c
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "stdlib.h"
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#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;
|
||||||
|
}
|
10
directories/directory_list.h
Normal file
10
directories/directory_list.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
#ifndef DIR_LISTER
|
||||||
|
#define DIR_LISTER
|
||||||
|
|
||||||
|
|
||||||
|
char* largest_val();
|
||||||
|
char* smallest_val();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -19,3 +19,16 @@ int integer_input(char* val) {
|
||||||
|
|
||||||
return num;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
|
#include "string.h"
|
||||||
#include "stdlib.h"
|
#include "stdlib.h"
|
||||||
#include "unistd.h"
|
#include "unistd.h"
|
||||||
|
|
||||||
|
@ -8,5 +9,6 @@
|
||||||
|
|
||||||
// Error checking integer input
|
// Error checking integer input
|
||||||
int integer_input(char*);
|
int integer_input(char*);
|
||||||
|
char* string_input(char*);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
23
directories/makefile
Normal file
23
directories/makefile
Normal file
|
@ -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)
|
190
directories/movies.c
Normal file
190
directories/movies.c
Normal file
|
@ -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");
|
||||||
|
}
|
||||||
|
|
29
directories/movies.h
Normal file
29
directories/movies.h
Normal file
|
@ -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
|
|
@ -7,13 +7,100 @@ int main() {
|
||||||
// seed random seed
|
// seed random seed
|
||||||
srand(time(NULL));
|
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
|
// Generate the String for movies
|
||||||
char* dir = malloc(sizeof(char)*100);
|
char* dir = malloc(sizeof(char)*100);
|
||||||
sprintf(dir, "temp.movies.%d", rand() % 100000);
|
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) {
|
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) {
|
void print_csv(struct node* head, char* dir) {
|
||||||
|
|
||||||
int result = mkdir(dir, 0750);
|
int result = mkdir(dir, 0750);
|
||||||
printf("%d\n", result);
|
|
||||||
|
|
||||||
chdir(dir);
|
chdir(dir);
|
||||||
|
|
||||||
|
@ -62,6 +148,8 @@ void print_csv(struct node* head, char* dir) {
|
||||||
// Iterate through every year year
|
// Iterate through every year year
|
||||||
iterate_nodes(year, tempish, head);
|
iterate_nodes(year, tempish, head);
|
||||||
|
|
||||||
|
chdir("..");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_year(int* data, int* year) {
|
void check_year(int* data, int* year) {
|
||||||
|
|
|
@ -12,19 +12,26 @@
|
||||||
#include "csv_parser.h"
|
#include "csv_parser.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
#include "directory_list.h"
|
||||||
|
|
||||||
int menu();
|
int menu();
|
||||||
|
int select_ftype();
|
||||||
|
|
||||||
void print_csv(struct node*, char*);
|
void print_csv(struct node*, char*);
|
||||||
|
|
||||||
// Menu Options
|
// Menu Options
|
||||||
enum OPTIONS {
|
enum OPTIONS {
|
||||||
YEAR = 1,
|
PROCCESS = 1,
|
||||||
RATE = 2,
|
EXIT = 2,
|
||||||
LANGUAGE = 3,
|
SELECT = 3,
|
||||||
EXIT = 4,
|
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*);
|
void find_year(struct csv*, void*);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue