diff options
-rw-r--r-- | draw.c | 131 | ||||
-rw-r--r-- | entry.c | 88 | ||||
-rw-r--r-- | entry.h | 18 | ||||
-rw-r--r-- | group.c | 146 | ||||
-rw-r--r-- | group.h | 26 | ||||
-rw-r--r-- | read_cfg.c | 93 | ||||
-rw-r--r-- | read_cfg.h | 8 | ||||
-rw-r--r-- | structures.c | 184 |
8 files changed, 510 insertions, 184 deletions
@@ -0,0 +1,131 @@ +#include <ncurses.h> +#include <stdbool.h> +#include <string.h> +#include "entry.h" +#include "group.h" +#include "read_cfg.h" +#define MAX_LEN 6 +#define BUF_LEN 1024 + +void draw_title(int width); +void draw_win(char *title, int x, int y, int width, int height); +void fill_groups(GROUP **group_arr, int count, int startx, int starty, int maxx, int maxy); +char *trim_group_name(GROUP *g, int max_len); + +int main(){ + static int width; + static int height; + bool tall = true; //is the window a certain height (tbd what the threshold should be TODO) + bool wide = true; //is the window a certain width (tbd what the threshold should be TODO) + GROUP **g; + int g_count; + + initscr(); + + width = getmaxx(stdscr); + height = getmaxy(stdscr); + + //title at the top (Terminal Media Launcher) (23 chars) + draw_title(width); + + //Draw Search Bar 2 spaces (3 spaces if window is big enough) under the title + move(3, width/4); + printw("[ Search: "); + move(3, (width*3)/4); + printw("]"); + move(3, (width/4)+10); + + //Draw Columns + //TODO create conditionals based on size of window) + draw_win("GROUP", 0, 4, width/3, height-4); + draw_win("ENTRY", (width/3), 4, width/3, height-4); + draw_win("INFO", (2*width/3), 4, width/3, height-4); + + //Fill Groups + cfg_interp(); //read the contents of the cfg file + g = get_groups(); //retrieve results of previous function + g_count = get_gcount(g); //retrieve number of groups in g + fill_groups(g, g_count, 1, 5, ((width/3)-1), height); + + /* + //DEBUG + move(5, 1); + printw("This is test output to test the limits of a window"); + //END DEBUG + */ + + getch(); + endwin(); + return 0; +} + +void draw_title(int width){ + WINDOW *title; + + title = newwin(2, width, 0, 0); + refresh(); + attron(A_BOLD | A_UNDERLINE); + move(0, (width-23)/2); + printw("Terminal Media Launcher"); + attroff(A_BOLD | A_UNDERLINE); + box(title, 0, 0); + wrefresh(title); + + return; +} + +void draw_win(char *title, int x, int y, int width, int height){ + WINDOW *new; + int title_len = strlen(title); + + new = newwin(height, width, y, x); + refresh(); + attron(A_UNDERLINE); + move(y, x+(width-title_len)/2); + printw("%s", title); + attroff(A_UNDERLINE); + box(new, 0, 0); + wrefresh(new); + + return; +} + +void fill_groups(GROUP **group_arr, int count, int startx, int starty, int maxx, int maxy){ + int i; + int max_len = maxx - startx; //longest possible string length that can be displayed in the window + char *name; + + for(i = 0; i < count; i++){ + name = get_gname(group_arr[i]); + + //the name is too long, take the group to the trimming function + if(strlen(name) > max_len) name = trim_group_name(group_arr[i], max_len); + move(starty, startx); + printw("%s", name); + starty++; + } + + return; +} + +char *trim_group_name(GROUP *g, int max_len){ + char *name = get_gname(g); + char *tok; //for use in finding relative path name + char *tok_ahead; + char *delims = "/\t\n"; + + //group name and path are equivalent: special procedure + if(!(strcmp(name, get_gpath(g)))){ + //find relative path name + tok_ahead = strtok(name, delims); + while(tok_ahead != NULL){ + tok = tok_ahead; + tok_ahead = strtok(NULL, delims); + } + name = tok; + if(strlen(name) <= max_len) return name; + } + + name[max_len] = '\0'; + return name; +} @@ -0,0 +1,88 @@ +#include <assert.h> +#include <dirent.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include "entry.h" +#include "group.h" +#define BUF_LEN 1024 + +typedef struct entry{ + char name[BUF_LEN]; + char path[BUF_LEN]; + struct entry *next; +} ENTRY; + +ENTRY *create_entry(char *new_path, char *new_group); +ENTRY *entry_add_last(ENTRY *tail, ENTRY *add); +ENTRY **get_entries(ENTRY *head, int count); +char *get_ename(ENTRY *e); +char *get_epath(ENTRY *e); + +ENTRY *create_entry(char *new_path, char *new_group){ + ENTRY *new; + char full_path[BUF_LEN] = ""; + + if(new_group != NULL) strcat(full_path, new_group); + strcat(full_path, new_path); + + //check if file exists + if(access(full_path, F_OK) == -1){ + printf("Error: Invalid File Name \"%s\"\n", full_path); + return NULL; + } + + new = malloc(sizeof(ENTRY)); + + strcpy(new->name, new_path); + strcpy(new->path, full_path); + new->next = NULL; + + return new; +} + +ENTRY *entry_add_last(ENTRY *tail, ENTRY *add){ + assert(add != NULL); + + if(tail == NULL) tail = add; + else{ + tail->next = add; + tail = add; + } + + return tail; +} + +ENTRY **get_entries(ENTRY *head, int count){ + ENTRY **arr = malloc(sizeof(ENTRY *) * count); + ENTRY *trav = head; + int i; + + for(i = 0; i < count; i++){ + arr[i] = trav; + trav = trav->next; + } + + return arr; +} + +char *get_ename(ENTRY *e){ + assert(e != NULL); + return e->name; +} +char *get_epath(ENTRY *e){ + assert(e != NULL); + return e->name; + return e->path; +} + +void entry_debug(ENTRY *trav){ + + while(trav != NULL){ + printf("%s, \n", trav->name); + trav = trav->next; + } + + return; +} @@ -0,0 +1,18 @@ +#ifndef ENTRY_H +#define ENTRY_H + +typedef struct entry ENTRY; + +ENTRY *create_entry(char *new_path, char *new_group); + +ENTRY *entry_add_last(ENTRY *tail, ENTRY *add); + +ENTRY **get_entries(ENTRY *head, int count); + +char *get_ename(ENTRY *e); + +char *get_epath(ENTRY *e); + +void entry_debug(ENTRY *trav); + +#endif @@ -0,0 +1,146 @@ +#include <assert.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include "entry.h" +#include "group.h" +#define BUF_LEN 1024 + +typedef struct group{ + char name[BUF_LEN]; + char path[BUF_LEN]; + char program[BUF_LEN]; + struct entry *head; + struct entry *tail; + struct group *next; + int entry_count; +} GROUP; + +GROUP *create_group(char *new_path); +void group_add(char *gname, ENTRY *addme); +GROUP **get_groups(); +char *get_gname(GROUP *g); +char *get_gpath(GROUP *g); +char *get_gprog(GROUP *g); +ENTRY *get_ghead(GROUP *g); +int get_ecount(GROUP *g); +int get_gcount(); +void group_debug(); //debug function to output all groups + +GROUP *groups_head; +GROUP *gp; //pointer to remember last group that was looked at +int group_count = 0; +int total_count = 0; + +GROUP *create_group(char *new_path){ + GROUP *new = malloc(sizeof(GROUP)); + + strcpy(new->name, new_path); //by default, group name is equivalent to the path + strcpy(new->path, new_path); + strcpy(new->program, "./"); //by default, launch an entry by executing it + new->head = NULL; + new->tail = NULL; + new->next = NULL; + new->entry_count = 0; + + group_count++; + return new; +} + +//FIXME maybe make this function part of a seperate file to handle a tree (AVL?) +//for now, simple linked list implementation +void group_add(char *gname, ENTRY *addme){ + int i; + GROUP *new; + GROUP *last = NULL; //last element in an existing group list (NULL to start) + + //The previous group is not the same as the new group to add to + if(!(gp != NULL && (!(strcmp(gp->name, gname)) || !(strcmp(gp->path, gname))))){ + gp = groups_head; + while(gp != NULL){ + //gname matches groups[i]'s name or path, add entry here + if(!(strcmp(gp->name, gname)) || !(strcmp(gp->path, gname))) break; + + last = gp; + gp = gp->next; + } + } + + //was unable to find a matching existing group + //need to create new group to insert the entry into + if(gp == NULL){ + new = create_group(gname); + + //first group + if(last == NULL) groups_head = new; + + //add to the end of the groups + else last->next = new; + + gp = new; + } + + //add the entry to the list of entries in the group + gp->tail = entry_add_last(gp->tail, addme); + if(gp->head == NULL) gp->head = gp->tail; //first element of the new list + + gp->entry_count++; + total_count++; + return; +} + +GROUP **get_groups(){ + GROUP **arr = malloc(sizeof(GROUP *) * group_count); + GROUP *trav = groups_head; + int i; + + for(i = 0; i < group_count; i++){ + arr[i] = trav; + trav = trav->next; + } + + return arr; +} + +char *get_gname(GROUP *g){ + assert(g != NULL); + return g->name; +} + +char *get_gpath(GROUP *g){ + assert(g != NULL); + return g->path; +} + +char *get_gprog(GROUP *g){ + assert(g != NULL); + return g->program; +} + +ENTRY *get_ghead(GROUP *g){ + assert(g != NULL); + return g->head; +} + +int get_ecount(GROUP *g){ + assert(g != NULL); + return g->entry_count; +} + +int get_gcount(){ + return group_count; +} + +void group_debug(){ + GROUP *trav = groups_head; + + while(trav != NULL){ + entry_debug(trav->head); + printf("\tfrom group %s\n", trav->name); + trav = trav->next; + } + + return; +} @@ -0,0 +1,26 @@ +#ifndef GROUP_H +#define GROUP_H + +typedef struct group GROUP; + +GROUP *create_group(char *new_path); + +void group_add(char *gname, ENTRY *addme); + +GROUP **get_groups(); + +char *get_gname(GROUP *g); + +char *get_gpath(GROUP *g); + +char *get_gprog(GROUP *g); + +ENTRY *get_ghead(GROUP *g); + +int get_ecount(GROUP *g); + +int get_gcount(); + +void group_debug(); + +#endif diff --git a/read_cfg.c b/read_cfg.c new file mode 100644 index 0000000..8def4ef --- /dev/null +++ b/read_cfg.c @@ -0,0 +1,93 @@ +#include <assert.h> +#include <ctype.h> +#include <dirent.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include "entry.h" +#include "group.h" +#define BUF_LEN 1024 //maybe move this line to the header file + +void cfg_interp(); +void check_line(char *buffer); + +void cfg_interp(){ + FILE *fp; + char buffer[BUF_LEN]; + GROUP **g; + ENTRY **e; + int count; + int e_count; + int i; + int j; + + //TODO have this check in certain locations for a config file, give error message if "config" does not exist + fp = fopen("config", "r"); + assert(fp != NULL); + + //Read each line of "config" + while(fgets(buffer, BUF_LEN, fp)){ + check_line(buffer); + } + + /* + //DEBUG: test to see if the list was added to properly + g = get_groups(); + count = get_gcount(); + for(i = 0; i < count; i++){ + printf("Looking at group %s\n", get_gname(g[i])); + e_count = get_ecount(g[i]); + e = get_entries(get_ghead(g[i]), e_count); + for(j = 0; j < e_count; j++){ + printf("\t%s\n", get_ename(e[j])); + } + } + //END DEBUG + */ + + return; +} + +void check_line(char *buffer){ + char *delims = " \t\n"; + char *tok = strtok(buffer, delims); + DIR *dp; + struct dirent *d_entry; + ENTRY *new; + + //add a path to the entry list + //TODO add potential dash functions + //TODO account for spaces in file name + if(!(strcmp(tok, "add"))){ + tok = strtok(NULL, delims); + new = create_entry(tok, NULL); + if(new != NULL) group_add(tok, new); + } + + //recursively add entries from a directory + if(!(strcmp(tok, "addDir"))){ + tok = strtok(NULL, delims); + dp = opendir(tok); + + //check if the directory is valid + if(dp == NULL) printf("Error: Invalid Directory \"%s\"\n", tok); + + else{ + while((d_entry = readdir(dp))){ + //only add if its a file (d_type = 8) + if(d_entry->d_type == 8){ + new = create_entry(d_entry->d_name, tok); + if(new != NULL) group_add(tok, new); + } + } + } + + //TODO add option to also add files from directories inside directory (-r) + + closedir(dp); + } + + return; +} diff --git a/read_cfg.h b/read_cfg.h new file mode 100644 index 0000000..2e8c708 --- /dev/null +++ b/read_cfg.h @@ -0,0 +1,8 @@ +#ifndef READ_CFG_H +#define READ_CFG_H + +void cfg_interp(); + +void check_line(char *buffer); + +#endif diff --git a/structures.c b/structures.c deleted file mode 100644 index e8d42dd..0000000 --- a/structures.c +++ /dev/null @@ -1,184 +0,0 @@ -#include <assert.h> -#include <ctype.h> -#include <dirent.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#define BUF_LEN 1024 -#define MAX_GRPS 50 - -typedef struct entry{ - char name[BUF_LEN]; - char path[BUF_LEN]; - struct entry *next; -} ENTRY; - -typedef struct group{ - char name[BUF_LEN]; - char path[BUF_LEN]; - struct entry *head; - struct entry *tail; - struct group *next; -} GROUP; - -void check_line(char *buffer); -ENTRY *create_entry(char *new_path, char *new_group); -GROUP *create_group(char *new_path); -void group_add(char *gname, ENTRY *addme); - -GROUP *groups_head; -GROUP *gp; //pointer to remember last group that was looked at - -int main(){ - FILE *fp; - char buffer[BUF_LEN]; - - fp = fopen("config", "r"); - assert(fp != NULL); - - while(fgets(buffer, BUF_LEN, fp)){ - check_line(buffer); - } - - //DEBUG: test to see if the list was added to properly - GROUP *gtrav = groups_head; - ENTRY *etrav; - while(gtrav != NULL){ - etrav = gtrav->head; - while(etrav != NULL){ - printf("%s, from group %s\n", etrav->name, gtrav->name); - etrav = etrav->next; - } - gtrav = gtrav->next; - } - - return 0; -} - -void check_line(char *buffer){ - char *delims = " \t\n"; - char *tok = strtok(buffer, delims); - DIR *dp; - struct dirent *entry; - ENTRY *new; - - //add a path to the entry list - //TODO add potential dash functions - //TODO account for spaces in file name - if(!(strcmp(tok, "add"))){ - tok = strtok(NULL, delims); - new = create_entry(tok, NULL); - if(new != NULL) group_add(tok, new); - } - - //recursively add entries from a directory - if(!(strcmp(tok, "addDir"))){ - tok = strtok(NULL, delims); - dp = opendir(tok); - - //check if the directory is valid - if(dp == NULL) printf("Error: Invalid Directory \"%s\"\n", tok); - - else{ - while((entry = readdir(dp))){ - //only add if its a file (d_type = 8) - if(entry->d_type == 8){ - new = create_entry(entry->d_name, tok); - if(new != NULL) group_add(tok, new); - } - } - } - - //TODO add option to also add files from directories inside directory (-r) - - closedir(dp); - } - - return; -} - -ENTRY *create_entry(char *new_path, char *new_group){ - ENTRY *new; - char full_path[BUF_LEN] = ""; - - if(new_group != NULL) strcat(full_path, new_group); - strcat(full_path, new_path); - - //check if file exists - if(access(full_path, F_OK) == -1){ - printf("Error: Invalid File Name \"%s\"\n", full_path); - return NULL; - } - - new = malloc(sizeof(ENTRY)); - - strcpy(new->name, new_path); - strcpy(new->path, full_path); - new->next = NULL; - - return new; -} - -GROUP *create_group(char *new_path){ - GROUP *new = malloc(sizeof(GROUP)); - - strcpy(new->name, new_path); //by default, group name is equivalent to the path - strcpy(new->path, new_path); - new->head = NULL; - new->tail = NULL; - new->next = NULL; - - return new; -} - -//FIXME maybe make this function part of a seperate file to handle a tree (AVL?) -//for now, simple linked list implementation -void group_add(char *gname, ENTRY *addme){ - int i; - bool new_group = false; //do we need to create a new group? - GROUP *new; - GROUP *last = NULL; //last element in an existing group list (NULL to start) - - //The previous group is not the same as the new group to add to - if(!(gp != NULL && (!(strcmp(gp->name, gname)) || !(strcmp(gp->path, gname))))){ - gp = groups_head; - while(gp != NULL){ - //gname matches groups[i]'s name or path, add entry here - if(!(strcmp(gp->name, gname)) || !(strcmp(gp->path, gname))) break; - - last = gp; - gp = gp->next; - } - } - - //was unable to find a matching existing group - if(gp == NULL) new_group = true; - - //need to create new group to insert the entry into - if(new_group){ - new = create_group(gname); - - //first group - if(last == NULL) groups_head = new; - - //add to the end of the groups - else last->next = new; - - gp = new; - } - - //add the entry to the list of entries in the group - if(gp->head == NULL){ - gp->head = addme; - gp->tail = addme; - } - - else{ - gp->tail->next = addme; - gp->tail = addme; - } - - return; -} |