Browse code

Fix some corner cases of op_add, op_del

Dario Rodriguez authored on 16/03/2019 11:04:02
Showing 2 changed files
... ...
@@ -988,7 +988,10 @@ redata_op_add(redata_t *redata, long insertpos, char *buf, long buflen, undostac
988 988
                 bothering=chunk->useddata-pos;
989 989
                 bothering=(bothering>nextavail)?nextavail:bothering;
990 990
                 redata_chunk_movedata(redata,chunkno,chunk->useddata-bothering,chunkno+1,0,bothering);
991
-                redata_chunk_insertdata(redata,chunkno,pos,buf,buflen);
991
+                avail=redata->chunkdatasize-chunk->useddata;
992
+                avail=(avail>buflen)?buflen:avail;
993
+                redata_chunk_insertdata(redata,chunkno,pos,buf,avail);
994
+                redata_chunk_insertdata(redata,chunkno+1,0,buf+avail,buflen-avail);
992 995
         } else {
993 996
                 /* will need to add more chunks */
994 997
                 needed=(buflen+redata->chunkdatasize-1)/redata->chunkdatasize;
... ...
@@ -1068,7 +1071,7 @@ redata_op_del(redata_t *redata, long delpos, long size, undostack_t *fromhere)
1068 1071
                 curpos=(curchunk==chunkno)?pos:0;
1069 1072
                 curdel=redata->chunks[curchunk]->useddata-curpos;
1070 1073
                 curdel=(curdel>(size-ndel))?(size-ndel):curdel;
1071
-                redata_chunk_deletedata(redata,chunkno,curpos,curdel);
1074
+                redata_chunk_deletedata(redata,curchunk,curpos,curdel);
1072 1075
                 ndel+=curdel;
1073 1076
         }
1074 1077
         /* fix nl and delete unused chunks */
... ...
@@ -43,11 +43,13 @@ main(int argc, char *argv[])
43 43
         static int sizes[]={-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,31,32,33,63,64,65,127,128,129,1023,1024,1025,16384};
44 44
         test_t tests[]={
45 45
                 {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0},
46
-/*                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
46
+#if 0 /* more newfile tests (VERY slow) */
47
+                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
47 48
                 {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0},
48 49
                 {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
49 50
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
50
-                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},*/
51
+                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
52
+#endif
51 53
                 {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
52 54
                 {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0},
53 55
         };
... ...
@@ -74,15 +76,20 @@ main(int argc, char *argv[])
74 76
                         } else {
75 77
                                 fprintf(stderr," ERROR: %s\n",res);
76 78
                                 nerrors++;
77
-                                }
79
+#if 0
80
+/* exit on first error */
81
+s=sizeof(sizes)/sizeof(sizes[0]);
82
+break;
83
+#endif
84
+                        }
78 85
                         redata_free(redata),redata=NULL;
79 86
                 }
80 87
                 fprintf(stderr,"\n");
81 88
         }
82 89
         if(nerrors==0)
83
-                fprintf(stderr,"All tests passed OK\n");
90
+                fprintf(stderr,"All %i tests passed OK\n",total);
84 91
         else
85
-                fprintf(stderr,"%i test(s) failed of %i tests run.\n",nerrors,i);
92
+                fprintf(stderr,"%i test(s) failed of %i tests run.\n",nerrors,total);
86 93
         redata_free(redata),redata=NULL;
87 94
         return((nerrors==0)?0:1);
88 95
 }
... ...
@@ -181,7 +188,8 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
181 188
                                 progress[l]=(l<(sizeof(progress)-2))?*ptr:'+';
182 189
                                 progress[l+1]='\0';
183 190
                         }
184
-/*if(k!=0) redata_save(redata,"test.pre");*/
191
+if(k!=0) unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
192
+if(k!=0) redata_save(redata,"test.pre");
185 193
                         if(*ptr=='A') {
186 194
                                 /* A<insertpos><endchar><text><endchar> */
187 195
                                 ptr++;
... ...
@@ -251,7 +259,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
251 259
                         if(cursize>maxsize)
252 260
                                 maxsize=cursize;
253 261
                         if(k!=0) {
254
-/*if(k!=0) redata_save(redata,"test.post");*/
262
+if(k!=0) redata_save(redata,"test.post");
255 263
                                 redata_hash(redata,hash129_redata);
256 264
                                 redata_memhash(redata,mem,cursize,hash129_mem);
257 265
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
... ...
@@ -263,7 +271,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
263 271
                                         return(errorbuf);
264 272
                                 }
265 273
                                 redata_op_undo(redata);
266
-/*redata_save(redata,"test.undo");*/
274
+redata_save(redata,"test.undo");
267 275
                                 redata_hash(redata,hash129_redata);
268 276
                                 if(strcmp(hash129_redata,hash129_memold)!=0) {
269 277
                                         if(mem!=NULL)
... ...
@@ -274,7 +282,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
274 282
                                         return(errorbuf);
275 283
                                 }
276 284
                                 redata_op_redo(redata);
277
-/*redata_save(redata,"test.redo");*/
285
+redata_save(redata,"test.redo");
278 286
                                 redata_hash(redata,hash129_redata);
279 287
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
280 288
                                         if(mem!=NULL)
... ...
@@ -301,6 +309,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
301 309
         }
302 310
         if(mem!=NULL)
303 311
                 free(mem),mem=NULL;
312
+unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
304 313
         return(TEST_OK);
305 314
 }
306 315