... | ... |
@@ -1096,7 +1096,7 @@ redata_data_compare(redata_t *redata, long cmppos, char *buf, long buflen) |
1096 | 1096 |
long compared; |
1097 | 1097 |
long n; |
1098 | 1098 |
int res; |
1099 |
- if(redata==NULL || pos<0 || buf==NULL || buflen<0 |
|
1099 |
+ if(redata==NULL || cmppos<0 || buf==NULL || buflen<0 |
|
1100 | 1100 |
|| cmppos>redata_getused(redata) |
1101 | 1101 |
|| (cmppos+buflen)>redata_getused(redata)) |
1102 | 1102 |
return(-1); /* sanity check failed */ |
... | ... |
@@ -48,6 +48,7 @@ main(int argc, char *argv[]) |
48 | 48 |
{"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0}, |
49 | 49 |
{"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0}, |
50 | 50 |
{"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0}, |
51 |
+ {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0}, |
|
51 | 52 |
}; |
52 | 53 |
redata_t *redata; |
53 | 54 |
int i; |
... | ... |
@@ -149,7 +150,7 @@ test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed) |
149 | 150 |
static char errorbuf[256]; |
150 | 151 |
char progress[256]; |
151 | 152 |
int k; |
152 |
- int cursize; |
|
153 |
+ int cursize,maxsize; |
|
153 | 154 |
char *ptr; |
154 | 155 |
int l; |
155 | 156 |
char *mem; |
... | ... |
@@ -162,7 +163,7 @@ test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed) |
162 | 163 |
mem=NULL; |
163 | 164 |
fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(edits!=NULL)?"\"":"",(edits!=NULL)?edits:"NULL",(edits!=NULL)?"\"":"",filesize,seed); |
164 | 165 |
/* two passes: k==0 count needed memory, k==1 do edits */ |
165 |
- for(k=0,cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') { |
|
166 |
+ for(k=0,maxsize=cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') { |
|
166 | 167 |
for(ptr=edits;*ptr!='\0';) { |
167 | 168 |
if(k!=0) { |
168 | 169 |
redata_memhash(redata,mem,cursize,hash129_memold); |
... | ... |
@@ -196,6 +197,40 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\ |
196 | 197 |
cursize+=size; |
197 | 198 |
ptr+=size; |
198 | 199 |
ptr+=(*ptr!='\0')?1:0; |
200 |
+ } else if(*ptr=='D') { |
|
201 |
+ /* D<delpos><endchar><text><endchar> */ |
|
202 |
+ ptr++; |
|
203 |
+ errno=0; |
|
204 |
+ l=(int)strtol(ptr,&ptr,10); |
|
205 |
+ if(errno!=0) { |
|
206 |
+ if(mem!=NULL) |
|
207 |
+ free(mem),mem=NULL; |
|
208 |
+ return("test_edit(): error parsing position"); |
|
209 |
+ } |
|
210 |
+ endcode=*ptr; |
|
211 |
+ ptr+=(*ptr!='\0')?1:0; |
|
212 |
+ ptrend=strchr(ptr,endcode); |
|
213 |
+ ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend; |
|
214 |
+ size=ptrend-ptr; |
|
215 |
+ if(l<0 || (l+size)>cursize) { |
|
216 |
+ if(mem!=NULL) |
|
217 |
+ free(mem),mem=NULL; |
|
218 |
+ return("test_edit(): internal error: invalid pasition or size"); |
|
219 |
+ } |
|
220 |
+ if(k!=0) { |
|
221 |
+ if(memcmp(mem+l,ptr,size)!=0 |
|
222 |
+ || redata_data_compare(redata,l,ptr,size)!=0) { |
|
223 |
+ if(mem!=NULL) |
|
224 |
+ free(mem),mem=NULL; |
|
225 |
+ return("test_edit(): internal error: deletion data doesn't match"); |
|
226 |
+ } |
|
227 |
+ /* editing */ |
|
228 |
+ memmove(mem+l,mem+l+size,cursize-l-size); |
|
229 |
+ redata_op_del(redata,l,size,NULL); |
|
230 |
+ } |
|
231 |
+ cursize-=size; |
|
232 |
+ ptr+=size; |
|
233 |
+ ptr+=(*ptr!='\0')?1:0; |
|
199 | 234 |
} else { |
200 | 235 |
if(mem!=NULL) |
201 | 236 |
free(mem),mem=NULL; |
... | ... |
@@ -204,6 +239,8 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\ |
204 | 239 |
errorbuf[sizeof(errorbuf)-1]='\0'; |
205 | 240 |
return(errorbuf); |
206 | 241 |
} |
242 |
+ if(cursize>maxsize) |
|
243 |
+ maxsize=cursize; |
|
207 | 244 |
if(k!=0) { |
208 | 245 |
/*if(k!=0) redata_save(redata,"test.post");*/ |
209 | 246 |
redata_hash(redata,hash129_redata); |
... | ... |
@@ -242,7 +279,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\ |
242 | 279 |
} |
243 | 280 |
if(k==0) { |
244 | 281 |
/* reserve memory, do init */ |
245 |
- if((mem=malloc_data(cursize,seed))==NULL) |
|
282 |
+ if((mem=malloc_data(maxsize,seed))==NULL) |
|
246 | 283 |
return("insuf. mem. for temp. buffer"); |
247 | 284 |
if(write_file(filename,mem,filesize)==-1) |
248 | 285 |
return("couldn't create temporary file"); |