Browse code

Update author email

Dario Rodriguez authored on 07/01/2022 17:57:32
Showing 1 changed files
... ...
@@ -5,7 +5,7 @@
5 5
  *
6 6
  * Tests (ensure correct functionality of modules)
7 7
  *
8
- * Author: Dario Rodriguez dario@softhome.net
8
+ * Author: Dario Rodriguez antartica@whereismybit.com
9 9
  * This program is licensed under the terms of GNU GPL v2.1+
10 10
  */
11 11
 
Browse code

Support the unsaved data recovery plugin from redata. Rework the question interface.

Dario Rodriguez authored on 05/10/2020 21:42:19
Showing 1 changed files
... ...
@@ -154,7 +154,7 @@ fprintf(stderr,"\ntest_newfile(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)
154 154
         redata_filehash(redata,filename,hash129_pre);
155 155
         free(mem),mem=NULL;
156 156
         /* load file */
157
-        if(redata_load(redata,filename,NULL,NULL)!=0) {
157
+        if(redata_load(redata,filename,NULL)!=0) {
158 158
                 unlink(filename);
159 159
                 return("couldn't load file");
160 160
         }
... ...
@@ -163,7 +163,7 @@ fprintf(stderr,"\ntest_newfile(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)
163 163
         if(strcmp(hash129_pre,hash129_post)!=0)
164 164
                 return("loaded file is corrupted");
165 165
         /* save file */
166
-        redata_save(redata,filename);
166
+        redata_save(redata,filename,NULL);
167 167
         hash129_post[0]='\0';
168 168
         redata_filehash(redata,filename,hash129_post);
169 169
         if(strcmp(hash129_pre,hash129_post)!=0)
... ...
@@ -201,7 +201,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
201 201
                                 progress[l+1]='\0';
202 202
                         }
203 203
 if(k!=0) unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
204
-if(k!=0) redata_save(redata,"test.pre");
204
+if(k!=0) redata_save(redata,"test.pre",NULL);
205 205
                         if(*ptr=='A') {
206 206
                                 /* A<insertpos><endchar><text><endchar> */
207 207
                                 ptr++;
... ...
@@ -318,7 +318,7 @@ if(k!=0) redata_save(redata,"test.pre");
318 318
                         if(cursize>maxsize)
319 319
                                 maxsize=cursize;
320 320
                         if(k!=0) {
321
-if(k!=0) redata_save(redata,"test.post");
321
+if(k!=0) redata_save(redata,"test.post",NULL);
322 322
                                 redata_hash(redata,hash129_redata);
323 323
                                 redata_memhash(redata,mem,cursize,hash129_mem);
324 324
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
... ...
@@ -330,7 +330,7 @@ if(k!=0) redata_save(redata,"test.post");
330 330
                                         return(errorbuf);
331 331
                                 }
332 332
                                 redata_op_undo(redata,NULL);
333
-redata_save(redata,"test.undo");
333
+redata_save(redata,"test.undo",NULL);
334 334
                                 redata_hash(redata,hash129_redata);
335 335
                                 if(strcmp(hash129_redata,hash129_memold)!=0) {
336 336
                                         if(mem!=NULL)
... ...
@@ -341,7 +341,7 @@ redata_save(redata,"test.undo");
341 341
                                         return(errorbuf);
342 342
                                 }
343 343
                                 redata_op_redo(redata,NULL);
344
-redata_save(redata,"test.redo");
344
+redata_save(redata,"test.redo",NULL);
345 345
                                 redata_hash(redata,hash129_redata);
346 346
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
347 347
                                         if(mem!=NULL)
... ...
@@ -359,7 +359,7 @@ redata_save(redata,"test.redo");
359 359
                                 return("insuf. mem. for temp. buffer");
360 360
                         if(write_file(filename,mem,filesize)==-1)
361 361
                                 return("couldn't create temporary file");
362
-                        if(redata_load(redata,filename,NULL,NULL)!=0) {
362
+                        if(redata_load(redata,filename,NULL)!=0) {
363 363
                                 unlink(filename);
364 364
                                 return("couldn't load file");
365 365
                         }
Browse code

Have the UI use the undo facilities of re_data.c when Ctrl-Z is pressed

Dario Rodriguez authored on 26/09/2020 21:23:03
Showing 1 changed files
... ...
@@ -329,7 +329,7 @@ if(k!=0) redata_save(redata,"test.post");
329 329
                                         errorbuf[sizeof(errorbuf)-1]='\0';
330 330
                                         return(errorbuf);
331 331
                                 }
332
-                                redata_op_undo(redata);
332
+                                redata_op_undo(redata,NULL);
333 333
 redata_save(redata,"test.undo");
334 334
                                 redata_hash(redata,hash129_redata);
335 335
                                 if(strcmp(hash129_redata,hash129_memold)!=0) {
... ...
@@ -340,7 +340,7 @@ redata_save(redata,"test.undo");
340 340
                                         errorbuf[sizeof(errorbuf)-1]='\0';
341 341
                                         return(errorbuf);
342 342
                                 }
343
-                                redata_op_redo(redata);
343
+                                redata_op_redo(redata,NULL);
344 344
 redata_save(redata,"test.redo");
345 345
                                 redata_hash(redata,hash129_redata);
346 346
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
Browse code

Reworked plugin API

Dario Rodriguez authored on 09/04/2019 14:28:44
Showing 1 changed files
... ...
@@ -154,7 +154,7 @@ fprintf(stderr,"\ntest_newfile(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)
154 154
         redata_filehash(redata,filename,hash129_pre);
155 155
         free(mem),mem=NULL;
156 156
         /* load file */
157
-        if(redata_load(redata,filename,0)!=0) {
157
+        if(redata_load(redata,filename,NULL,NULL)!=0) {
158 158
                 unlink(filename);
159 159
                 return("couldn't load file");
160 160
         }
... ...
@@ -359,7 +359,7 @@ redata_save(redata,"test.redo");
359 359
                                 return("insuf. mem. for temp. buffer");
360 360
                         if(write_file(filename,mem,filesize)==-1)
361 361
                                 return("couldn't create temporary file");
362
-                        if(redata_load(redata,filename,0)!=0) {
362
+                        if(redata_load(redata,filename,NULL,NULL)!=0) {
363 363
                                 unlink(filename);
364 364
                                 return("couldn't load file");
365 365
                         }
Browse code

Refactor unsaved into a plugin of redata

Dario Rodriguez authored on 04/04/2019 21:53:07
Showing 1 changed files
... ...
@@ -75,7 +75,7 @@ main(int argc, char *argv[])
75 75
                 for(i=0;i<(sizeof(tests)/sizeof(tests[0]));i++,total++) {
76 76
                         if(!flag_all && tests[i].int1>=1024)
77 77
                                 continue; /* too slow: skip unless testing --all */
78
-                        if((redata=redata_init())==NULL) {
78
+                        if((redata=redata_init(NULL))==NULL) {
79 79
                                 fprintf(stderr,"ERROR: problem initializing redata module\n");
80 80
                                 return(1);
81 81
                         }
Browse code

renamed recenteditor_data to re_data, recenteditor_tests to re_tests

Dario Rodriguez authored on 01/04/2019 21:26:29
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,374 @@
1
+/*
2
+ * re_tests.c
3
+ *
4
+ * A programmers editor
5
+ *
6
+ * Tests (ensure correct functionality of modules)
7
+ *
8
+ * Author: Dario Rodriguez dario@softhome.net
9
+ * This program is licensed under the terms of GNU GPL v2.1+
10
+ */
11
+
12
+#include <stdio.h>
13
+#include <stdlib.h>
14
+#include <unistd.h>
15
+#include <string.h>
16
+#include <limits.h>
17
+#include <fcntl.h>
18
+#include <errno.h>
19
+
20
+#include "re_data.h"
21
+
22
+#define PREFIX "retest_"
23
+#define TEST_OK "OK"
24
+
25
+typedef struct test_t  {
26
+        char *name;
27
+        char *(*fn)(redata_t *,char *,char *, int, int);
28
+        char *param1;
29
+        char *param2;
30
+        int int1;
31
+        int int2;
32
+} test_t;
33
+
34
+static char *malloc_data(int size, int seed);
35
+static int write_file(char *filename, char *buf, int buflen);
36
+
37
+char *test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2);
38
+char *test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed);
39
+
40
+int
41
+main(int argc, char *argv[])
42
+{
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
+        test_t tests[]={
45
+                {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0},
46
+                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
47
+                {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0},
48
+                {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
49
+                {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
50
+                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
51
+                {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
52
+                {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0},
53
+                {"testedit_move",test_edit,PREFIX "EDIT", "A0$This is a text to move.$M17,7$ move$",0,0},
54
+        };
55
+        int flag_exit=0,flag_all=0;
56
+        redata_t *redata;
57
+        int i,s;
58
+        int nerrors,total;
59
+        char *res;
60
+        for(i=1;i<argc;i++) {
61
+                if(strcmp(argv[i],"--help")==0) {
62
+                        fprintf(stderr,"Syntax: %s [--all] [--exit] [--help]\nExplanation:\n\t--all: do even the slow tests\n\t--exit: exit program at first unsuccessful test\n\t--help: this text\n",argv[0]);
63
+                        return(1);
64
+                } else if(strcmp(argv[i],"--all")==0) {
65
+                        flag_all=1;
66
+                } else if(strcmp(argv[i],"--exit")==0) {
67
+                        flag_exit=1;
68
+                }
69
+        }
70
+        nerrors=0;
71
+        total=0;
72
+        for(s=0;s<(sizeof(sizes)/sizeof(sizes[0]));s++) {
73
+                if(sizes[s]!=-1)
74
+                        fprintf(stderr,"SIZE: %i\n",sizes[s]);
75
+                for(i=0;i<(sizeof(tests)/sizeof(tests[0]));i++,total++) {
76
+                        if(!flag_all && tests[i].int1>=1024)
77
+                                continue; /* too slow: skip unless testing --all */
78
+                        if((redata=redata_init())==NULL) {
79
+                                fprintf(stderr,"ERROR: problem initializing redata module\n");
80
+                                return(1);
81
+                        }
82
+                        if(sizes[s]!=-1)
83
+                                redata_config_chunkdatasize(redata,sizes[s]);
84
+                        fprintf(stderr,"%s...",tests[i].name);
85
+                        res=tests[i].fn(redata,tests[i].param1,tests[i].param2,tests[i].int1,tests[i].int2);
86
+                                if(strcmp(res,TEST_OK)==0) {
87
+                                fprintf(stderr," ok.\n");
88
+                        } else {
89
+                                fprintf(stderr," ERROR: %s\n",res);
90
+                                nerrors++;
91
+                                if(flag_exit) {
92
+                                        /* exit on first error */
93
+                                        s=sizeof(sizes)/sizeof(sizes[0]);
94
+                                        break;
95
+                                }
96
+                        }
97
+                        redata_free(redata),redata=NULL;
98
+                }
99
+                fprintf(stderr,"\n");
100
+        }
101
+        if(nerrors==0)
102
+                fprintf(stderr,"All %i tests passed OK\n",total);
103
+        else
104
+                fprintf(stderr,"%i test(s) failed of %i tests run.\n",nerrors,total);
105
+        redata_free(redata),redata=NULL;
106
+        return((nerrors==0)?0:1);
107
+}
108
+
109
+static char *
110
+malloc_data(int size, int seed)
111
+{
112
+        char *mem;
113
+        int i;
114
+        if(size<=0 || (mem=malloc(size))==NULL)
115
+                return(NULL);
116
+        memset(mem,0,size);
117
+        if(seed==0) {
118
+                for(i=0;i<size;i++)
119
+                        ((unsigned char *)mem)[i]=(i%256);
120
+        } else {
121
+                srandom(*((unsigned int *)(&seed)));
122
+                for(i=0;i<size;i++)
123
+                        ((unsigned char *)mem)[i]=(random()&0xff);
124
+        }
125
+        return(mem);
126
+
127
+}
128
+
129
+static int
130
+write_file(char *filename, char *buf, int buflen)
131
+{
132
+        int fd;
133
+        if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644))==-1) {
134
+                free(buf),buf=NULL;
135
+                return(-1);
136
+        }
137
+        write(fd,buf,buflen);
138
+        close(fd),fd=-1;
139
+        return(0);
140
+}
141
+
142
+char *
143
+test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2)
144
+{
145
+        char *mem;
146
+        char hash129_pre[129];
147
+        char hash129_post[129];
148
+fprintf(stderr,"\ntest_newfile(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(dummy!=NULL)?"\"":"",(dummy!=NULL)?dummy:"NULL",(dummy!=NULL)?"\"":"",filesize,dummy2);
149
+        /* prepare file for loading */
150
+        if((mem=malloc_data(filesize,0))==NULL)
151
+                return("insuf. mem. for temp. buffer");
152
+        if(write_file(filename,mem,filesize)==-1)
153
+                return("couldn't create temporary file");
154
+        redata_filehash(redata,filename,hash129_pre);
155
+        free(mem),mem=NULL;
156
+        /* load file */
157
+        if(redata_load(redata,filename,0)!=0) {
158
+                unlink(filename);
159
+                return("couldn't load file");
160
+        }
161
+        unlink(filename);
162
+        redata_hash(redata,hash129_post);
163
+        if(strcmp(hash129_pre,hash129_post)!=0)
164
+                return("loaded file is corrupted");
165
+        /* save file */
166
+        redata_save(redata,filename);
167
+        hash129_post[0]='\0';
168
+        redata_filehash(redata,filename,hash129_post);
169
+        if(strcmp(hash129_pre,hash129_post)!=0)
170
+                return("saved file is corrupted");
171
+        unlink(filename);
172
+        return(TEST_OK);
173
+}
174
+
175
+char *
176
+test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed)
177
+{
178
+        static char errorbuf[256];
179
+        char progress[256];
180
+        int k;
181
+        int cursize,maxsize;
182
+        char *ptr;
183
+        int l,o;
184
+        char *mem;
185
+        char endcode;
186
+        char *ptrend;
187
+        int size;
188
+        char hash129_memold[129];
189
+        char hash129_mem[129];
190
+        char hash129_redata[129];
191
+        mem=NULL;
192
+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);
193
+        /* two passes: k==0 count needed memory, k==1 do edits */
194
+        for(k=0,maxsize=cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') {
195
+                for(ptr=edits;*ptr!='\0';) {
196
+                        if(k!=0) {
197
+                                redata_memhash(redata,mem,cursize,hash129_memold);
198
+                        }
199
+                        if((l=strlen(progress))<(sizeof(progress)-1)) {
200
+                                progress[l]=(l<(sizeof(progress)-2))?*ptr:'+';
201
+                                progress[l+1]='\0';
202
+                        }
203
+if(k!=0) unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
204
+if(k!=0) redata_save(redata,"test.pre");
205
+                        if(*ptr=='A') {
206
+                                /* A<insertpos><endchar><text><endchar> */
207
+                                ptr++;
208
+                                errno=0;
209
+                                l=(int)strtol(ptr,&ptr,10);
210
+                                if(errno!=0 || l<0 || l>cursize) {
211
+                                        if(mem!=NULL)
212
+                                                free(mem),mem=NULL;
213
+                                        return("test_edit(): error parsing position");
214
+                                }
215
+                                endcode=*ptr;
216
+                                ptr+=(*ptr!='\0')?1:0;
217
+                                ptrend=strchr(ptr,endcode);
218
+                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
219
+                                size=ptrend-ptr;
220
+                                if(k!=0) {
221
+                                        /* editing */
222
+                                        memmove(mem+l+size,mem+l,cursize-l);
223
+                                        memcpy(mem+l,ptr,size);
224
+                                        redata_op_add(redata,l,ptr,size,NULL);
225
+                                }
226
+                                cursize+=size;
227
+                                ptr+=size;
228
+                                ptr+=(*ptr!='\0')?1:0;
229
+                        } else if(*ptr=='D') {
230
+                                /* D<delpos><endchar><text><endchar> */
231
+                                ptr++;
232
+                                errno=0;
233
+                                l=(int)strtol(ptr,&ptr,10);
234
+                                if(errno!=0) {
235
+                                        if(mem!=NULL)
236
+                                                free(mem),mem=NULL;
237
+                                        return("test_edit(): error parsing position");
238
+                                }
239
+                                endcode=*ptr;
240
+                                ptr+=(*ptr!='\0')?1:0;
241
+                                ptrend=strchr(ptr,endcode);
242
+                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
243
+                                size=ptrend-ptr;
244
+                                if(l<0 || (l+size)>cursize) {
245
+                                        if(mem!=NULL)
246
+                                                free(mem),mem=NULL;
247
+                                        return("test_edit(): internal error: invalid pasition or size");
248
+                                }
249
+                                if(k!=0) {
250
+                                        if(memcmp(mem+l,ptr,size)!=0
251
+                                          || redata_data_compare(redata,l,ptr,size)!=0) {
252
+                                                if(mem!=NULL)
253
+                                                        free(mem),mem=NULL;
254
+                                                return("test_edit(): internal error: deletion data doesn't match");
255
+                                        }
256
+                                        /* editing */
257
+                                        memmove(mem+l,mem+l+size,cursize-l-size);
258
+                                        redata_op_del(redata,l,size,NULL);
259
+                                }
260
+                                cursize-=size;
261
+                                ptr+=size;
262
+                                ptr+=(*ptr!='\0')?1:0;
263
+                        } else if(*ptr=='M') {
264
+                                /* M<origpos>,<destpos><endchar><text><endchar> */
265
+                                ptr++;
266
+                                errno=0;
267
+                                l=(int)strtol(ptr,&ptr,10);
268
+                                if(errno!=0) {
269
+                                        if(mem!=NULL)
270
+                                                free(mem),mem=NULL;
271
+                                        return("test_edit(): error parsing position");
272
+                                }
273
+                                ptr+=(*ptr==',')?1:0;
274
+                                errno=0;
275
+                                o=(int)strtol(ptr,&ptr,10);
276
+                                if(errno!=0) {
277
+                                        if(mem!=NULL)
278
+                                                free(mem),mem=NULL;
279
+                                        return("test_edit(): error parsing position");
280
+                                }
281
+                                endcode=*ptr;
282
+                                ptr+=(*ptr!='\0')?1:0;
283
+                                ptrend=strchr(ptr,endcode);
284
+                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
285
+                                size=ptrend-ptr;
286
+                                if(l<0 || (l+size)>cursize || o<0 || o>cursize || (o>=l && o<(l+size))) {
287
+                                        if(mem!=NULL)
288
+                                                free(mem),mem=NULL;
289
+                                        return("test_edit(): internal error: invalid pasition or size");
290
+                                }
291
+                                if(k!=0) {
292
+                                        if(memcmp(mem+l,ptr,size)!=0
293
+                                          || redata_data_compare(redata,l,ptr,size)!=0) {
294
+                                                if(mem!=NULL)
295
+                                                        free(mem),mem=NULL;
296
+                                                return("test_edit(): internal error: move data doesn't match");
297
+                                        }
298
+                                        /* editing */
299
+                                        if(l>o) {
300
+                                                memmove(mem+o+size,mem+o,l-o);
301
+                                                memcpy(mem+o,ptr,size);
302
+                                        } else {
303
+                                                memmove(mem+l,mem+l+size,o-l-size);
304
+                                                memcpy(mem+o-size,ptr,size);
305
+                                        }
306
+                                        redata_op_move(redata,l,size,o,NULL);
307
+                                }
308
+                                ptr+=size;
309
+                                ptr+=(*ptr!='\0')?1:0;
310
+                        } else {
311
+                                if(mem!=NULL)
312
+                                        free(mem),mem=NULL;
313
+                                snprintf(errorbuf,sizeof(errorbuf),
314
+                                  "test_edit(): unknown edit action at pos %i: '%c' (progress: %s)",(int) (ptr-edits),*ptr,progress);
315
+                                errorbuf[sizeof(errorbuf)-1]='\0';
316
+                                return(errorbuf);
317
+                        }
318
+                        if(cursize>maxsize)
319
+                                maxsize=cursize;
320
+                        if(k!=0) {
321
+if(k!=0) redata_save(redata,"test.post");
322
+                                redata_hash(redata,hash129_redata);
323
+                                redata_memhash(redata,mem,cursize,hash129_mem);
324
+                                if(strcmp(hash129_redata,hash129_mem)!=0) {
325
+                                        if(mem!=NULL)
326
+                                                free(mem),mem=NULL;
327
+                                        snprintf(errorbuf,sizeof(errorbuf),
328
+                                          "corrupted edit before pos %i (progress: %s)",(int) (ptr-edits),progress);
329
+                                        errorbuf[sizeof(errorbuf)-1]='\0';
330
+                                        return(errorbuf);
331
+                                }
332
+                                redata_op_undo(redata);
333
+redata_save(redata,"test.undo");
334
+                                redata_hash(redata,hash129_redata);
335
+                                if(strcmp(hash129_redata,hash129_memold)!=0) {
336
+                                        if(mem!=NULL)
337
+                                                free(mem),mem=NULL;
338
+                                        snprintf(errorbuf,sizeof(errorbuf),
339
+                                          "corrupted undo before pos %i (progress: %s)",(int) (ptr-edits),progress);
340
+                                        errorbuf[sizeof(errorbuf)-1]='\0';
341
+                                        return(errorbuf);
342
+                                }
343
+                                redata_op_redo(redata);
344
+redata_save(redata,"test.redo");
345
+                                redata_hash(redata,hash129_redata);
346
+                                if(strcmp(hash129_redata,hash129_mem)!=0) {
347
+                                        if(mem!=NULL)
348
+                                                free(mem),mem=NULL;
349
+                                        snprintf(errorbuf,sizeof(errorbuf),
350
+                                          "corrupted redo before pos %i (progress: %s)",(int) (ptr-edits),progress);
351
+                                        errorbuf[sizeof(errorbuf)-1]='\0';
352
+                                        return(errorbuf);
353
+                                }
354
+                        }
355
+                }
356
+                if(k==0) {
357
+                        /* reserve memory, do init */
358
+                        if((mem=malloc_data(maxsize,seed))==NULL)
359
+                                return("insuf. mem. for temp. buffer");
360
+                        if(write_file(filename,mem,filesize)==-1)
361
+                                return("couldn't create temporary file");
362
+                        if(redata_load(redata,filename,0)!=0) {
363
+                                unlink(filename);
364
+                                return("couldn't load file");
365
+                        }
366
+                        unlink(filename);
367
+                }
368
+        }
369
+        if(mem!=NULL)
370
+                free(mem),mem=NULL;
371
+unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
372
+        return(TEST_OK);
373
+}
374
+