diff options
Diffstat (limited to 'structures.c')
-rw-r--r-- | structures.c | 184 |
1 files changed, 0 insertions, 184 deletions
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; -} |