tizen 2.4 release
[external/xdelta3.git] / examples / encode_decode_test.c
1 //\r
2 // Permission to distribute this example by\r
3 // Copyright (C) 2007 Ralf Junker\r
4 // Ralf Junker <delphi@yunqa.de>\r
5 // http://www.yunqa.de/delphi/\r
6 \r
7 //---------------------------------------------------------------------------\r
8 \r
9 #include <stdio.h>\r
10 #include <sys/stat.h>\r
11 #include "xdelta3.h"\r
12 #include "xdelta3.c"\r
13 \r
14 //---------------------------------------------------------------------------\r
15 \r
16 int code (\r
17   int encode,\r
18   FILE*  InFile,\r
19   FILE*  SrcFile ,\r
20   FILE* OutFile,\r
21   int BufSize )\r
22 {\r
23   int r, ret;\r
24   struct stat statbuf;\r
25   xd3_stream stream;\r
26   xd3_config config;\r
27   xd3_source source;\r
28   void* Input_Buf;\r
29   int Input_Buf_Read;\r
30 \r
31   if (BufSize < XD3_ALLOCSIZE)\r
32     BufSize = XD3_ALLOCSIZE;\r
33 \r
34   memset (&stream, 0, sizeof (stream));\r
35   memset (&source, 0, sizeof (source));\r
36 \r
37   xd3_init_config(&config, XD3_ADLER32);\r
38   config.winsize = BufSize;\r
39   xd3_config_stream(&stream, &config);\r
40 \r
41   if (SrcFile)\r
42   {\r
43     r = fstat(fileno(SrcFile), &statbuf);\r
44     if (r)\r
45       return r;\r
46 \r
47     source.blksize = BufSize;\r
48     source.curblk = malloc(source.blksize);\r
49 \r
50     /* Load 1st block of stream. */\r
51     r = fseek(SrcFile, 0, SEEK_SET);\r
52     if (r)\r
53       return r;\r
54     source.onblk = fread((void*)source.curblk, 1, source.blksize, SrcFile);\r
55     source.curblkno = 0;\r
56     /* Set the stream. */\r
57     xd3_set_source(&stream, &source);\r
58   }\r
59 \r
60   Input_Buf = malloc(BufSize);\r
61 \r
62   fseek(InFile, 0, SEEK_SET);\r
63   do\r
64   {\r
65     Input_Buf_Read = fread(Input_Buf, 1, BufSize, InFile);\r
66     if (Input_Buf_Read < BufSize)\r
67     {\r
68       xd3_set_flags(&stream, XD3_FLUSH | stream.flags);\r
69     }\r
70     xd3_avail_input(&stream, Input_Buf, Input_Buf_Read);\r
71 \r
72 process:\r
73     if (encode)\r
74       ret = xd3_encode_input(&stream);\r
75     else\r
76       ret = xd3_decode_input(&stream);\r
77 \r
78     switch (ret)\r
79     {\r
80     case XD3_INPUT:\r
81       {\r
82         fprintf (stderr,"XD3_INPUT\n");\r
83         continue;\r
84       }\r
85 \r
86     case XD3_OUTPUT:\r
87       {\r
88         fprintf (stderr,"XD3_OUTPUT\n");\r
89         r = fwrite(stream.next_out, 1, stream.avail_out, OutFile);\r
90         if (r != (int)stream.avail_out)\r
91           return r;\r
92         xd3_consume_output(&stream);\r
93         goto process;\r
94       }\r
95 \r
96     case XD3_GETSRCBLK:\r
97       {\r
98         fprintf (stderr,"XD3_GETSRCBLK %qd\n", source.getblkno);\r
99         if (SrcFile)\r
100         {\r
101           r = fseek(SrcFile, source.blksize * source.getblkno, SEEK_SET);\r
102           if (r)\r
103             return r;\r
104           source.onblk = fread((void*)source.curblk, 1,\r
105                                source.blksize, SrcFile);\r
106           source.curblkno = source.getblkno;\r
107         }\r
108         goto process;\r
109       }\r
110 \r
111     case XD3_GOTHEADER:\r
112       {\r
113         fprintf (stderr,"XD3_GOTHEADER\n");\r
114         goto process;\r
115       }\r
116 \r
117     case XD3_WINSTART:\r
118       {\r
119         fprintf (stderr,"XD3_WINSTART\n");\r
120         goto process;\r
121       }\r
122 \r
123     case XD3_WINFINISH:\r
124       {\r
125         fprintf (stderr,"XD3_WINFINISH\n");\r
126         goto process;\r
127       }\r
128 \r
129     default:\r
130       {\r
131         fprintf (stderr,"!!! INVALID %s %d !!!\n",\r
132                 stream.msg, ret);\r
133         return ret;\r
134       }\r
135 \r
136     }\r
137 \r
138   }\r
139   while (Input_Buf_Read == BufSize);\r
140 \r
141   free(Input_Buf);\r
142 \r
143   free((void*)source.curblk);\r
144   xd3_close_stream(&stream);\r
145   xd3_free_stream(&stream);\r
146 \r
147   return 0;\r
148 \r
149 };\r
150 \r
151 \r
152 int main(int argc, char* argv[])\r
153 {\r
154   FILE*  InFile;\r
155   FILE*  SrcFile;\r
156   FILE* OutFile;\r
157   int r;\r
158 \r
159   if (argc != 3) {\r
160     fprintf (stderr, "usage: %s source input\n", argv[0]);\r
161     return 1;\r
162   }\r
163 \r
164   char *input = argv[2];\r
165   char *source = argv[1];\r
166   const char *output = "encoded.testdata";\r
167   const char *decoded = "decoded.testdata";\r
168 \r
169   /* Encode */\r
170 \r
171   InFile = fopen(input, "rb");\r
172   SrcFile = fopen(source, "rb");\r
173   OutFile = fopen(output, "wb");\r
174 \r
175   r = code (1, InFile, SrcFile, OutFile, 0x1000);\r
176 \r
177   fclose(OutFile);\r
178   fclose(SrcFile);\r
179   fclose(InFile);\r
180 \r
181   if (r) {\r
182     fprintf (stderr, "Encode error: %d\n", r);\r
183     return r;\r
184   }\r
185 \r
186   /* Decode */\r
187 \r
188   InFile = fopen(output, "rb");\r
189   SrcFile = fopen(source, "rb");\r
190   OutFile = fopen(decoded, "wb");\r
191 \r
192   r = code (0, InFile, SrcFile, OutFile, 0x1000);\r
193 \r
194   fclose(OutFile);\r
195   fclose(SrcFile);\r
196   fclose(InFile);\r
197 \r
198   if (r) {\r
199     fprintf (stderr, "Decode error: %d\n", r);\r
200     return r;\r
201   }\r
202 \r
203   return 0;\r
204 }\r