void add(struct task t, int size){
-    int l,m,h,i;
-
-    h = linecount();
+    int l,m,h,i,len;
+    FILE *fcopy;
+    char *s;
+    h = len = linecount();
     m = h / 2;
     l = 0;
 
-    while (h != m  && m != l){
+    while (!(h == m && m == l)){
         i = strcmp(t.task,gettask().task);
 
         if (i < 0) {
         }
 
         m = (h + l)/2;
+        fseek(fp, m, SEEK_SET);
+    }
+
+    fseek(fp, 0, SEEK_SET);
+    fcopy = fopen("/tmp/fcopy", "w");
+
+    for (i = 0; i < len;){
+        if (i == m){
+            fprintf(fp, "%s\t%i\t%s\n",t.task,t.date,t.group);
+        } else {
+            fgets(s, MAXLINE, fp);
+            fputs(s, fcopy);
+            i++;
+        }
     }
+    fclose(fp);
+    fclose(fcopy);
+    remove(TODOLIST);
+    rename("/tmp/fcopy", TODOLIST);
 
-    puttask(t);
     return;
 }
 
 
         if (c == '\n')
             i++;
     }
-    rewind(fp);
+    fseek(fp,0,SEEK_SET);
     return i;
 }
 
 #include "odot.h"
 
-extern int urgency;
 extern FILE *fp;
 
 
     return tmp;
 }
 
-void puttask(struct task n){
-    fprintf(fp, "%s\t%i\t%s\n",n.task,n.date,n.group);
-}
 
 struct task gettask(void){
     struct task tmp;
 
 
 
 void add(struct task t, int size){
-    int l,m,h,i;
-
-    h = linecount();
+    int l,m,h,i,len;
+    FILE *fcopy;
+    char *s;
+    h = len = linecount();
     m = h / 2;
     l = 0;
 
-    while (h != m  && m != l){
+    while (!(h == m && m == l)){
         i = strcmp(t.task,gettask().task);
 
         if (i < 0) {
         }
 
         m = (h + l)/2;
+        fseek(fp, m, SEEK_SET);
+    }
+
+    fseek(fp, 0, SEEK_SET);
+    fcopy = fopen("/tmp/fcopy", "w");
+
+    for (i = 0; i < len;){
+        if (i == m){
+            fprintf(fp, "%s\t%i\t%s\n",t.task,t.date,t.group);
+        } else {
+            fgets(s, MAXLINE, fp);
+            fputs(s, fcopy);
+            i++;
+        }
     }
+    fclose(fp);
+    fclose(fcopy);
+    remove(TODOLIST);
+    rename("/tmp/fcopy", TODOLIST);
 
-    puttask(t);
     return;
 }
 
 
         if (c == '\n')
             i++;
     }
-    rewind(fp);
+    fseek(fp,0,SEEK_SET);
     return i;
 }
 
 #include "odot.h"
 
-extern int urgency;
 extern FILE *fp;
 
 
     return tmp;
 }
 
-void puttask(struct task n){
-    fprintf(fp, "%s\t%i\t%s\n",n.task,n.date,n.group);
-}
 
 struct task gettask(void){
     struct task tmp;