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
7 //---------------------------------------------------------------------------
\r
10 #include <sys/stat.h>
\r
11 #include "xdelta3.h"
\r
12 #include "xdelta3.c"
\r
14 //---------------------------------------------------------------------------
\r
24 struct stat statbuf;
\r
31 if (BufSize < XD3_ALLOCSIZE)
\r
32 BufSize = XD3_ALLOCSIZE;
\r
34 memset (&stream, 0, sizeof (stream));
\r
35 memset (&source, 0, sizeof (source));
\r
37 xd3_init_config(&config, XD3_ADLER32);
\r
38 config.winsize = BufSize;
\r
39 xd3_config_stream(&stream, &config);
\r
43 r = fstat(fileno(SrcFile), &statbuf);
\r
47 source.blksize = BufSize;
\r
48 source.curblk = malloc(source.blksize);
\r
50 /* Load 1st block of stream. */
\r
51 r = fseek(SrcFile, 0, SEEK_SET);
\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
60 Input_Buf = malloc(BufSize);
\r
62 fseek(InFile, 0, SEEK_SET);
\r
65 Input_Buf_Read = fread(Input_Buf, 1, BufSize, InFile);
\r
66 if (Input_Buf_Read < BufSize)
\r
68 xd3_set_flags(&stream, XD3_FLUSH | stream.flags);
\r
70 xd3_avail_input(&stream, Input_Buf, Input_Buf_Read);
\r
74 ret = xd3_encode_input(&stream);
\r
76 ret = xd3_decode_input(&stream);
\r
82 fprintf (stderr,"XD3_INPUT\n");
\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
92 xd3_consume_output(&stream);
\r
98 fprintf (stderr,"XD3_GETSRCBLK %qd\n", source.getblkno);
\r
101 r = fseek(SrcFile, source.blksize * source.getblkno, SEEK_SET);
\r
104 source.onblk = fread((void*)source.curblk, 1,
\r
105 source.blksize, SrcFile);
\r
106 source.curblkno = source.getblkno;
\r
111 case XD3_GOTHEADER:
\r
113 fprintf (stderr,"XD3_GOTHEADER\n");
\r
119 fprintf (stderr,"XD3_WINSTART\n");
\r
123 case XD3_WINFINISH:
\r
125 fprintf (stderr,"XD3_WINFINISH\n");
\r
131 fprintf (stderr,"!!! INVALID %s %d !!!\n",
\r
139 while (Input_Buf_Read == BufSize);
\r
143 free((void*)source.curblk);
\r
144 xd3_close_stream(&stream);
\r
145 xd3_free_stream(&stream);
\r
152 int main(int argc, char* argv[])
\r
160 fprintf (stderr, "usage: %s source input\n", argv[0]);
\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
171 InFile = fopen(input, "rb");
\r
172 SrcFile = fopen(source, "rb");
\r
173 OutFile = fopen(output, "wb");
\r
175 r = code (1, InFile, SrcFile, OutFile, 0x1000);
\r
182 fprintf (stderr, "Encode error: %d\n", r);
\r
188 InFile = fopen(output, "rb");
\r
189 SrcFile = fopen(source, "rb");
\r
190 OutFile = fopen(decoded, "wb");
\r
192 r = code (0, InFile, SrcFile, OutFile, 0x1000);
\r
199 fprintf (stderr, "Decode error: %d\n", r);
\r