enum color {BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE};
 
 
-void add(void){
-    fp = fopen(TODOLIST, "a");
-    if (fp != NULL){
-        fputs(strcat(note,"\n"),fp);
-        fclose(fp);
+void add(struct task t, int size){
+    int l,m,h,i;
+
+    h = linecount();
+    m = h / 2;
+    l = 0;
+
+    while (h != m  && m != l){
+        i = strcmp(t.task,gettask().task);
+
+        if (i < 0) {
+            h = m;
+        } else if (i > 0) {
+            l = m;
+        } else { 
+            dialogue("Task already on list",t.task, BLUE);
+            return;
+        }
+
+        m = (h + l)/2;
     }
+
+    puttask(t);
+    return;
 }
 
 void rem(void){
     free(c);
 }
 
-int listcheck(void){
-    char *s;
-
-    fp = fopen(TODOLIST, "r");
-    s = (char *) malloc(MAXLINE * sizeof(char));
-
-    while (fgets(s, MAXLINE, fp) != NULL){
-        s[strlen(s) - 1] = 0;
-        if (strcmp(note, s) == 0){
-            free(s);
-            return 1;
-        }
-    }
-    free(s);
-    return 0;
-}
 
 #include "odot.h"
 
 enum color {BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE};
+extern FILE *fp;
 
 
 int listcheck(struct task t){
     return NULL;
 }
 
-int linecount(FILE *fp){
+int linecount(void){
     int i = 0;
     char c;
     while ((c = fgetc(fp)) != EOF){
 
 
         free(c);
     }
-
-    if (strlen(o) == 0)
-        o = (listcheck() == 0) ? "n" : "d";
 }
 
 
 extern int urgency;
 
 int main(int argc, char *argv[]){
-    char op;
-    int length,i;
-    struct task t;
-    note = (char *) malloc(MAXLINE * sizeof(char));
-    o = (char *) malloc (3 * sizeof(char));
 
-    t = maketask(argc, argv);
-    getopt(argc, argv);
-    
-    for (i = 0; i < strlen(o); i++)
-        switch (o[i]) {
-            case 'n':
-                if (listcheck(t) == 0){
-                    add();
-                    printf("\033[32mAdded to list\033[0m: %s\n", note);
-                } else {
-                    printf("\033[33mAlready on list\033[0m: %s\nRemove from list? (y/\033[1mn\033[0m): ", note);
-                    if (getchar() == 'y') 
-                        rem();
-                }
-                break;
-            case 'd':
-                if (listcheck(t) == 1) {
-                    rem();
-                    printf("\033[36mRemoved from list\033[0m: %s\n", note);
-                } else {
-                    printf("\033[31mNot on list\033[0m: %s\nAdd to list? (y/\033[1mn\033[0m): ", note);
-                    if (getchar() == 'y') 
-                        add();
-                }
-                break;
-            case 's':
-                printf("\n\tTODO LIST:\n");
-                show();
-                break;
-        }
-    free(note); 
     return 0;
 }
 
 
 char *getnote(int, char *[]);
 void getopt(int, char *[]);
 
-void add(void);
+void add(struct task, int);
 void rem(void);
 void show(void);
 
 
 void error(char);
 
-struct task maketask(int n, char **arg);
+int linecount(void);
+void dialogue(char *, char *, int);
+
+struct task maketask(char *, char *);
 void puttask(struct task n);
 struct task gettask(void);
 
 
 extern FILE *fp;
 
 
-struct task maketask(int n, char **arg){
-    struct task temp;
+struct task maketask(char *task, char *group){
+    struct task tmp;
 
-    temp.task = getnote(n,arg);
-    temp.length = strlen(temp.task);
-    temp.date = gettime();
-    temp.due = 0;
-    temp.urgency = urgency;
+    tmp.task = task;
+    tmp.date = 0;
+    tmp.group = group;
 
-    return temp;
+    return tmp;
 }
 
 void puttask(struct task n){
-    fprintf(fp, "%i\t%s\t%s\t%s\t%i\n",n.length,n.task,n.date,n.due,n.urgency);
+    fprintf(fp, "%s\t%i\t%s\n",n.task,n.date,n.group);
 }
 
 struct task gettask(void){
     struct task tmp;
     
-    fscanf(fp,"%i\t%s\t%s\t%s\t%i\n",&tmp.length,tmp.task,tmp.date,tmp.due,&tmp.urgency);
+    fscanf(fp,"%s\t%i\t%s\n",tmp.task,&tmp.date,tmp.group);
 
     return tmp;
 }
 
 enum color {BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE};
 
 
-void add(void){
-    fp = fopen(TODOLIST, "a");
-    if (fp != NULL){
-        fputs(strcat(note,"\n"),fp);
-        fclose(fp);
+void add(struct task t, int size){
+    int l,m,h,i;
+
+    h = linecount();
+    m = h / 2;
+    l = 0;
+
+    while (h != m  && m != l){
+        i = strcmp(t.task,gettask().task);
+
+        if (i < 0) {
+            h = m;
+        } else if (i > 0) {
+            l = m;
+        } else { 
+            dialogue("Task already on list",t.task, BLUE);
+            return;
+        }
+
+        m = (h + l)/2;
     }
+
+    puttask(t);
+    return;
 }
 
 void rem(void){
     free(c);
 }
 
-int listcheck(void){
-    char *s;
-
-    fp = fopen(TODOLIST, "r");
-    s = (char *) malloc(MAXLINE * sizeof(char));
-
-    while (fgets(s, MAXLINE, fp) != NULL){
-        s[strlen(s) - 1] = 0;
-        if (strcmp(note, s) == 0){
-            free(s);
-            return 1;
-        }
-    }
-    free(s);
-    return 0;
-}
 
 #include "odot.h"
 
 enum color {BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE};
+extern FILE *fp;
 
 
 int listcheck(struct task t){
     return NULL;
 }
 
-int linecount(FILE *fp){
+int linecount(void){
     int i = 0;
     char c;
     while ((c = fgetc(fp)) != EOF){
 
 
         free(c);
     }
-
-    if (strlen(o) == 0)
-        o = (listcheck() == 0) ? "n" : "d";
 }
 
 
 extern int urgency;
 
 int main(int argc, char *argv[]){
-    char op;
-    int length,i;
-    struct task t;
-    note = (char *) malloc(MAXLINE * sizeof(char));
-    o = (char *) malloc (3 * sizeof(char));
 
-    t = maketask(argc, argv);
-    getopt(argc, argv);
-    
-    for (i = 0; i < strlen(o); i++)
-        switch (o[i]) {
-            case 'n':
-                if (listcheck(t) == 0){
-                    add();
-                    printf("\033[32mAdded to list\033[0m: %s\n", note);
-                } else {
-                    printf("\033[33mAlready on list\033[0m: %s\nRemove from list? (y/\033[1mn\033[0m): ", note);
-                    if (getchar() == 'y') 
-                        rem();
-                }
-                break;
-            case 'd':
-                if (listcheck(t) == 1) {
-                    rem();
-                    printf("\033[36mRemoved from list\033[0m: %s\n", note);
-                } else {
-                    printf("\033[31mNot on list\033[0m: %s\nAdd to list? (y/\033[1mn\033[0m): ", note);
-                    if (getchar() == 'y') 
-                        add();
-                }
-                break;
-            case 's':
-                printf("\n\tTODO LIST:\n");
-                show();
-                break;
-        }
-    free(note); 
     return 0;
 }
 
 
 char *getnote(int, char *[]);
 void getopt(int, char *[]);
 
-void add(void);
+void add(struct task, int);
 void rem(void);
 void show(void);
 
 
 void error(char);
 
-struct task maketask(int n, char **arg);
+int linecount(void);
+void dialogue(char *, char *, int);
+
+struct task maketask(char *, char *);
 void puttask(struct task n);
 struct task gettask(void);
 
 
 extern FILE *fp;
 
 
-struct task maketask(int n, char **arg){
-    struct task temp;
+struct task maketask(char *task, char *group){
+    struct task tmp;
 
-    temp.task = getnote(n,arg);
-    temp.length = strlen(temp.task);
-    temp.date = gettime();
-    temp.due = 0;
-    temp.urgency = urgency;
+    tmp.task = task;
+    tmp.date = 0;
+    tmp.group = group;
 
-    return temp;
+    return tmp;
 }
 
 void puttask(struct task n){
-    fprintf(fp, "%i\t%s\t%s\t%s\t%i\n",n.length,n.task,n.date,n.due,n.urgency);
+    fprintf(fp, "%s\t%i\t%s\n",n.task,n.date,n.group);
 }
 
 struct task gettask(void){
     struct task tmp;
     
-    fscanf(fp,"%i\t%s\t%s\t%s\t%i\n",&tmp.length,tmp.task,tmp.date,tmp.due,&tmp.urgency);
+    fscanf(fp,"%s\t%i\t%s\n",tmp.task,&tmp.date,tmp.group);
 
     return tmp;
 }