ShellExtension erstellen
BZip2 bei RedHat
BZip2 für Windows
Den BZip2-Quellcode kann man direkt in ein Programm miteincompilieren. Ich bevorzuge
es, auf den Code, der Dateien komprimiert und auf die Runtimes zurückgreift, zu
verzichten. Das wird erreicht, indem man den Compilerschalter
-DBZ_NO_STDIO
setzt.
Aus dem BZip2-Quellcode benötigt man die Dateien:
blocksort.c
,
compress.c
,
crctable.c
,
decompress.c
,
huffman.c
und
randtable.c
.
#include <bzlib.h>
#include <atlwfile.h>
#define BZ_MAX_UNUSED 5000
int main(int argc, char* argv[]) {
if(argc!=2) return 0;
bz_stream BZStrm;
char buf[BZ_MAX_UNUSED]={0};
char outbuf[BZ_MAX_UNUSED]={0};
int ret, n;
unsigned long erg;
ATL::CFile Datei, Datei2;
lstrcpy(buf, argv[1]);
lstrcat(buf, ".bz2");
Datei.Create(buf);
Datei2.Open(argv[1], GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN);
ZeroMemory(&BZStrm, sizeof(bz_stream));
BZ2_bzCompressInit(&BZStrm, 9, 0, 30);
Datei2.Read(buf, BZ_MAX_UNUSED, &erg);
while(erg>0) {
BZStrm.next_in = buf;
while (TRUE) {
BZStrm.avail_out = BZ_MAX_UNUSED;
BZStrm.next_out = outbuf;
BZStrm.avail_in = erg;
ret = BZ2_bzCompress ( &BZStrm, BZ_RUN );
if (ret != BZ_RUN_OK) {
return 0;
};
if (BZStrm.avail_out < BZ_MAX_UNUSED) {
n = BZ_MAX_UNUSED - BZStrm.avail_out;
Datei.Write((void*)(outbuf), n);
}
if (BZStrm.avail_in == 0) {
break;
};
}
Datei2.Read(buf, BZ_MAX_UNUSED, &erg);
};
while (TRUE) {
BZStrm.avail_out = BZ_MAX_UNUSED;
BZStrm.next_out = outbuf;
ret = BZ2_bzCompress ( &BZStrm, BZ_FINISH );
if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) {
return 0;
};
if (BZStrm.avail_out < BZ_MAX_UNUSED) {
n = BZ_MAX_UNUSED - BZStrm.avail_out;
Datei.Write((void*)(outbuf), n);
}
if (ret == BZ_STREAM_END) break;
}
BZ2_bzCompressEnd(&BZStrm);
Datei.Close();
Datei2.Close();
return 0;
}