一个C++及Delphi做的压缩程序

Delphi教程 2025-08-31

{ this is interface of c++ code.

c++ source code not included to this archive.

look readme.txt file for more information. }

#ifndef __coding_h__

#define __coding_h__

#ifndef coding_impex

#define coding_impex __declspec(dllimport)

#endif

class coding_impex avldecode

{

public:

~avldecode();

avldecode();

virtual int readbuf

( void*buf,

unsignedmaxlen,

unsigned &rdlen

) = 0;

intget(void *buf, unsignedmaxlen);

intget(void *buf, unsignedmaxlen, unsigned &rdlen)

{return ((int)(rdlen = get(buf, maxlen)) < 0)? rdlen :0 ;

}

void reset();

private:

????????? private part not included ???????????????????

};

class coding_impex avlencode

{

public:

~avlencode();

avlencode();

virtual int writebuf

( void*buf,

unsignedlen

) = 0;

intput(void *buf, unsignedn);

void reset();

private:

?????????? private part not icluded ?????????????

};

#endif //__coding_h__

///encode.pas

{$m 8192,120000,120000}

uses avlcodes;

const bufsize=60000;

var p: pointer;

f,f1: file;

s: string;

buf: pointer;

num: word;

{$f+}

function writetofile(var buf; n: integer): integer;

var num: word;

begin

blockwrite(f1,buf,n,num);

end;

{$f-}

begin

if not getmemory then

begin

writeln('not enough memory in heap to compress file.');

halt;

end;

s:=paramstr(1);

setencodeoutbuffer(@writetofile);

assign(f,s);

{$i-}

if s<>'' then reset(f,1);

{$i+}

if (ioresult<>0) or (s='') then

begin

writeln;

writeln('the author of this turbo pascal program and original c++ code is');

writeln('alexander larkin( translated to turbo pascal from c++ on 27/09/1999 )');

writeln;

writeln('e-mail:[email protected]');

writeln('internet:http://www.g*e*oci*ties.com/siliconvalley/6235/tpdl.htm');

writeln;

writeln('usage: encode.exe infile outfile [password]');

writeln;

freememory;

halt;

end;

s:=paramstr(2);

assign(f1,s);

{$i-}

if s<>'' then rewrite(f1,1);

{$i+}

if (ioresult<>0) or (s='') then

begin

close(f);

writeln('cannot create find file '+s);

freememory;

halt;

end;

setpassword(paramstr(3));

getmem(buf,bufsize);

repeat

blockread(f,buf^,bufsize,num);

encodeput(buf^,num);

until num<=0;

if num<0 then writeln('cannot compress file. you do something wrong.');

encodereset;

close(f);

close(f1);

freememory;

end.

///decode.pas

{$m 8192,120000,120000}

uses avlcodes;

const bufsize=60000;

var p: pointer;

f,f1: file;

s: string;

buf: pointer;

num: word;

{$f+}

function readfromfile(var buf; n: integer; var rdlen: integer): integer;

begin

blockread(f,buf,n,rdlen);

readfromfile:=0;

end;

{$f-}

begin

if not getmemory then

begin

writeln('not enough memory in heap to decompress file.');

halt;

end;

s:=paramstr(1);

setdecodeinbuffer(@readfromfile);

assign(f,s);

{$i-}

if s<>'' then reset(f,1);

{$i+}

if (ioresult<>0) or (s='') then

begin

writeln;

writeln('the author of this turbo pascal program and original c++ code is');

writeln('alexander larkin( translated to turbo pascal from c++ on 27/09/1999 )');

writeln;

writeln('e-mail:[email protected]');

writeln('internet:http://www.g*e*oci*ties.com/siliconvalley/6235/tpdl.htm');

writeln;

writeln('usage: decode.exe infile outfile [password]');

writeln;

freememory;

halt;

end;

s:=paramstr(2);

assign(f1,s);

{$i-}

if s<>'' then rewrite(f1,1);

{$i+}

if (ioresult<>0) or (s='') then

begin

close(f);

writeln('cannot create file '+s);

freememory;

halt;

end;

getmem(buf,bufsize);

setpassword(paramstr(3));

repeat

num:=decodeget(buf^,bufsize);

if num<65535 then blockwrite(f1,buf^,num,num);

until (num=0) or (num=65535);

if num=65535 then writeln('error! data corrupted. cannot decompress file.');

close(f);

close(f1);

freememory;

end.