#include #include #include #include "../Implementation/linked_list.h" #include "../../MenuLib/menu.h" #include "book.h" void show_push(Node** list) { char title[101], author[101]; int year; printf("Enter title of Book: "); scanf_s(" %[^\n]s", title, 101); printf("Enter author of Book: "); scanf_s(" %[^\n]s", author, 101); printf("Enter year of Release: "); scanf_s(" %d", &year); list_push(list, book_create(title, author, year)); } void show_append(Node** list) { char title[101], author[101]; int year; printf("Enter title of Book: "); scanf_s(" %[^\n]s", title, 101); printf("Enter author of Book: "); scanf_s(" %[^\n]s", author, 101); printf("Enter year of Release: "); scanf_s(" %d", &year); list_append(list, book_create(title, author, year)); } void show_insert(Node** list) { char title[101], author[101]; int year, index; printf("Enter title of Book: "); scanf_s(" %[^\n]s", title, 101); printf("Enter author of Book: "); scanf_s(" %[^\n]s", author, 101); printf("Enter year of Release: "); scanf_s("%d", &year); printf("Enter place after which book is inserted: "); scanf_s("%d", &index); list_insert(list_get(*list, index), book_create(title, author, year)); } void show_print(Node** list) { list_print(*list, &book_print); } void show_get(Node** list) { int index; printf("Enter place: "); scanf_s("%d", &index); list_print(list_get(*list, index), &book_print); } void show_remove(Node** list) { int index; printf("Enter place: "); scanf_s("%d", &index); list_remove(list_get(*list, index)); } void show_read(Node** list) { char path[101], line[256], * title, * author, * year; FILE* CSV; printf("Enter the path of the CSV file to open: "); gets_s(path, 101); if (!(CSV = fopen(path, "r"))) { puts("Failed to read file!\n"); return; } while (fgets(line, 256, CSV)) { printf("Found line %s", line); title = strtok(line, ";"); author = strtok(NULL, ";"); year = strtok(NULL, ";"); printf("%s, %s, %s\n", title, author, year); list_push(list, book_create(title, author, atoi(year))); } fclose(CSV); } void show_write(Node** list) { char path[101]; FILE* CSV; Node* node = *list; Book* book; printf("Enter the path of the file to write: "); gets_s(path, 101); if (!(CSV = fopen(path, "w"))) { puts("Failed to write file!\n"); return; } while (node) { book = (Book*)node->data; fprintf(CSV, "%s;%s;%d\n", book->title, book->author, book->year); node = node->next; } fclose(CSV); } void show_print_pointers(Node** list) { list_print_pointers(*list); } void show_search(Node** list) { char title[80]; Node* book; printf("Enter the title to search for: "); gets_s(title, 80); book = list_search(*list, title, &title_eq); if (book) book_print(book->data); else puts("No list item matched the given title."); } #define item(NAME, KEY, FUNC) {NAME, KEY, (void*)&FUNC, &list} #define page(NAME, ARR) {ARR, sizeof(ARR) / sizeof(struct MenuItem), NAME, true, true, &SOLID} void main(void) { Node* list = NULL; struct MenuItem items_modification[] = { item("Push Item", '1', show_push), item("Append item", '2', show_append), item("Insert item", '3', show_insert), item("Remove item by index", '4', show_remove), {"BLANK", ' ', NULL, NULL}, {"Quit", 'q', (void*)&exit, NULL} }; struct MenuItem items_util[] = { item("Print list", '1', show_print), item("Print list element by index", '2', show_get), item("Search for title", '3', show_search), item("Read", 'r', show_read), item("Write", 'w', show_write), item("Print pointers", 'p', show_print_pointers), {"BLANK", ' ', NULL, NULL}, {"Quit", 'q', (void*)&exit, NULL} }; struct MenuPage pages[] = { page("Linked List Modification", items_modification), page("Linked List Utility", items_util), }; show_menu(pages, sizeof(pages) / sizeof(struct MenuPage), true); }