From 5ec60ffc9b25b008360bc4ff076a64e4eefc0d2b Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 11 Feb 2007 22:17:07 +0000 Subject: [PATCH] * move 2.0.x compatibility files to fcl20/ subdir git-svn-id: trunk@6446 - --- .gitattributes | 6 +- utils/fppkg/Makefile | 398 +---- utils/fppkg/Makefile.fpc | 8 +- .../fppkg/{contnrs20.pp => fcl20/contnrs.pp} | 2 +- .../{streamcoll20.pp => fcl20/streamcoll.pp} | 2 +- utils/fppkg/fcl20/zipper.pp | 1451 +++++++++++++++++ utils/fppkg/fcl20/zstream.pp | 440 +++++ 7 files changed, 1978 insertions(+), 329 deletions(-) rename utils/fppkg/{contnrs20.pp => fcl20/contnrs.pp} (99%) rename utils/fppkg/{streamcoll20.pp => fcl20/streamcoll.pp} (99%) create mode 100644 utils/fppkg/fcl20/zipper.pp create mode 100755 utils/fppkg/fcl20/zstream.pp diff --git a/.gitattributes b/.gitattributes index e9e6b9203b..00a8ec02bf 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8216,7 +8216,10 @@ utils/fpmc/test.mc -text utils/fppkg/Makefile svneol=native#text/plain utils/fppkg/Makefile.fpc svneol=native#text/plain utils/fppkg/README svneol=native#text/plain -utils/fppkg/contnrs20.pp svneol=native#text/plain +utils/fppkg/fcl20/contnrs.pp svneol=native#text/plain +utils/fppkg/fcl20/streamcoll.pp svneol=native#text/plain +utils/fppkg/fcl20/zipper.pp svneol=native#text/plain +utils/fppkg/fcl20/zstream.pp svneol=native#text/plain utils/fppkg/fpmkcnst.inc svneol=native#text/plain utils/fppkg/fpmktype.pp svneol=native#text/plain utils/fppkg/fpmkunit.pp svneol=native#text/plain @@ -8267,7 +8270,6 @@ utils/fppkg/pkgwget.pp svneol=native#text/plain utils/fppkg/rep2xml.lpi svneol=native#text/plain utils/fppkg/rep2xml.lpr svneol=native#text/plain utils/fppkg/reptest.pp svneol=native#text/plain -utils/fppkg/streamcoll20.pp svneol=native#text/plain utils/fppkg/testdownload.pp svneol=native#text/plain utils/fprcp/Makefile svneol=native#text/plain utils/fprcp/Makefile.fpc svneol=native#text/plain diff --git a/utils/fppkg/Makefile b/utils/fppkg/Makefile index 7c6c04fc79..20e6e1e06b 100644 --- a/utils/fppkg/Makefile +++ b/utils/fppkg/Makefile @@ -1,8 +1,8 @@ # -# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/01/25] +# Don't edit, this file is generated by FPCMake Version 2.0.0 [2006/10/31] # default: all -MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-embedded +MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos sparc-linux sparc-netbsd sparc-solaris x86_64-linux x86_64-freebsd x86_64-win64 arm-linux arm-palmos arm-wince arm-gba powerpc64-linux BSDs = freebsd netbsd openbsd darwin UNIXs = linux $(BSDs) solaris qnx LIMIT83fs = go32v2 os2 emx watcom @@ -232,6 +232,9 @@ endif PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra) override PACKAGE_NAME=fppkg override PACKAGE_VERSION=2.0.0 +ifneq ($(findstring 2.0.,$(FPC_VERSION)),) +FCL20=fcl20 +endif ifeq ($(FULL_TARGET),i386-linux) override TARGET_PROGRAMS+=fppkg endif @@ -283,12 +286,6 @@ endif ifeq ($(FULL_TARGET),i386-wince) override TARGET_PROGRAMS+=fppkg endif -ifeq ($(FULL_TARGET),i386-embedded) -override TARGET_PROGRAMS+=fppkg -endif -ifeq ($(FULL_TARGET),i386-symbian) -override TARGET_PROGRAMS+=fppkg -endif ifeq ($(FULL_TARGET),m68k-linux) override TARGET_PROGRAMS+=fppkg endif @@ -310,9 +307,6 @@ endif ifeq ($(FULL_TARGET),m68k-palmos) override TARGET_PROGRAMS+=fppkg endif -ifeq ($(FULL_TARGET),m68k-embedded) -override TARGET_PROGRAMS+=fppkg -endif ifeq ($(FULL_TARGET),powerpc-linux) override TARGET_PROGRAMS+=fppkg endif @@ -331,9 +325,6 @@ endif ifeq ($(FULL_TARGET),powerpc-morphos) override TARGET_PROGRAMS+=fppkg endif -ifeq ($(FULL_TARGET),powerpc-embedded) -override TARGET_PROGRAMS+=fppkg -endif ifeq ($(FULL_TARGET),sparc-linux) override TARGET_PROGRAMS+=fppkg endif @@ -343,9 +334,6 @@ endif ifeq ($(FULL_TARGET),sparc-solaris) override TARGET_PROGRAMS+=fppkg endif -ifeq ($(FULL_TARGET),sparc-embedded) -override TARGET_PROGRAMS+=fppkg -endif ifeq ($(FULL_TARGET),x86_64-linux) override TARGET_PROGRAMS+=fppkg endif @@ -355,9 +343,6 @@ endif ifeq ($(FULL_TARGET),x86_64-win64) override TARGET_PROGRAMS+=fppkg endif -ifeq ($(FULL_TARGET),x86_64-embedded) -override TARGET_PROGRAMS+=fppkg -endif ifeq ($(FULL_TARGET),arm-linux) override TARGET_PROGRAMS+=fppkg endif @@ -370,21 +355,9 @@ endif ifeq ($(FULL_TARGET),arm-gba) override TARGET_PROGRAMS+=fppkg endif -ifeq ($(FULL_TARGET),arm-nds) -override TARGET_PROGRAMS+=fppkg -endif -ifeq ($(FULL_TARGET),arm-embedded) -override TARGET_PROGRAMS+=fppkg -endif -ifeq ($(FULL_TARGET),arm-symbian) -override TARGET_PROGRAMS+=fppkg -endif ifeq ($(FULL_TARGET),powerpc64-linux) override TARGET_PROGRAMS+=fppkg endif -ifeq ($(FULL_TARGET),powerpc64-embedded) -override TARGET_PROGRAMS+=fppkg -endif ifeq ($(FULL_TARGET),i386-linux) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet pkglibcurl endif @@ -436,12 +409,6 @@ endif ifeq ($(FULL_TARGET),i386-wince) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet endif -ifeq ($(FULL_TARGET),i386-embedded) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif -ifeq ($(FULL_TARGET),i386-symbian) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif ifeq ($(FULL_TARGET),m68k-linux) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet pkglibcurl endif @@ -463,9 +430,6 @@ endif ifeq ($(FULL_TARGET),m68k-palmos) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload endif -ifeq ($(FULL_TARGET),m68k-embedded) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif ifeq ($(FULL_TARGET),powerpc-linux) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet pkglibcurl endif @@ -484,9 +448,6 @@ endif ifeq ($(FULL_TARGET),powerpc-morphos) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload endif -ifeq ($(FULL_TARGET),powerpc-embedded) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif ifeq ($(FULL_TARGET),sparc-linux) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet pkglibcurl endif @@ -496,9 +457,6 @@ endif ifeq ($(FULL_TARGET),sparc-solaris) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet pkglibcurl endif -ifeq ($(FULL_TARGET),sparc-embedded) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif ifeq ($(FULL_TARGET),x86_64-linux) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet pkglibcurl endif @@ -508,9 +466,6 @@ endif ifeq ($(FULL_TARGET),x86_64-win64) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet endif -ifeq ($(FULL_TARGET),x86_64-embedded) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif ifeq ($(FULL_TARGET),arm-linux) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet pkglibcurl endif @@ -523,21 +478,9 @@ endif ifeq ($(FULL_TARGET),arm-gba) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload endif -ifeq ($(FULL_TARGET),arm-nds) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif -ifeq ($(FULL_TARGET),arm-embedded) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif -ifeq ($(FULL_TARGET),arm-symbian) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif ifeq ($(FULL_TARGET),powerpc64-linux) override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload pkgwget pkglnet pkglibcurl endif -ifeq ($(FULL_TARGET),powerpc64-embedded) -override TARGET_UNITS+=fpmktype fpmkunit fprepos fpxmlrep pkgropts pkghandler pkgmkconv pkgdownload -endif ifeq ($(FULL_TARGET),i386-linux) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif @@ -589,12 +532,6 @@ endif ifeq ($(FULL_TARGET),i386-wince) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif -ifeq ($(FULL_TARGET),i386-embedded) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif -ifeq ($(FULL_TARGET),i386-symbian) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif ifeq ($(FULL_TARGET),m68k-linux) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif @@ -616,9 +553,6 @@ endif ifeq ($(FULL_TARGET),m68k-palmos) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif -ifeq ($(FULL_TARGET),m68k-embedded) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif ifeq ($(FULL_TARGET),powerpc-linux) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif @@ -637,9 +571,6 @@ endif ifeq ($(FULL_TARGET),powerpc-morphos) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif -ifeq ($(FULL_TARGET),powerpc-embedded) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif ifeq ($(FULL_TARGET),sparc-linux) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif @@ -649,9 +580,6 @@ endif ifeq ($(FULL_TARGET),sparc-solaris) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif -ifeq ($(FULL_TARGET),sparc-embedded) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif ifeq ($(FULL_TARGET),x86_64-linux) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif @@ -661,9 +589,6 @@ endif ifeq ($(FULL_TARGET),x86_64-win64) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif -ifeq ($(FULL_TARGET),x86_64-embedded) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif ifeq ($(FULL_TARGET),arm-linux) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif @@ -676,21 +601,9 @@ endif ifeq ($(FULL_TARGET),arm-gba) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif -ifeq ($(FULL_TARGET),arm-nds) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif -ifeq ($(FULL_TARGET),arm-embedded) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif -ifeq ($(FULL_TARGET),arm-symbian) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif ifeq ($(FULL_TARGET),powerpc64-linux) override TARGET_RSTS+=fprepos fpxmlrep fppkg endif -ifeq ($(FULL_TARGET),powerpc64-embedded) -override TARGET_RSTS+=fprepos fpxmlrep fppkg -endif ifeq ($(FULL_TARGET),i386-linux) override TARGET_EXAMPLES+=rep2xml endif @@ -742,12 +655,6 @@ endif ifeq ($(FULL_TARGET),i386-wince) override TARGET_EXAMPLES+=rep2xml endif -ifeq ($(FULL_TARGET),i386-embedded) -override TARGET_EXAMPLES+=rep2xml -endif -ifeq ($(FULL_TARGET),i386-symbian) -override TARGET_EXAMPLES+=rep2xml -endif ifeq ($(FULL_TARGET),m68k-linux) override TARGET_EXAMPLES+=rep2xml endif @@ -769,9 +676,6 @@ endif ifeq ($(FULL_TARGET),m68k-palmos) override TARGET_EXAMPLES+=rep2xml endif -ifeq ($(FULL_TARGET),m68k-embedded) -override TARGET_EXAMPLES+=rep2xml -endif ifeq ($(FULL_TARGET),powerpc-linux) override TARGET_EXAMPLES+=rep2xml endif @@ -790,9 +694,6 @@ endif ifeq ($(FULL_TARGET),powerpc-morphos) override TARGET_EXAMPLES+=rep2xml endif -ifeq ($(FULL_TARGET),powerpc-embedded) -override TARGET_EXAMPLES+=rep2xml -endif ifeq ($(FULL_TARGET),sparc-linux) override TARGET_EXAMPLES+=rep2xml endif @@ -802,9 +703,6 @@ endif ifeq ($(FULL_TARGET),sparc-solaris) override TARGET_EXAMPLES+=rep2xml endif -ifeq ($(FULL_TARGET),sparc-embedded) -override TARGET_EXAMPLES+=rep2xml -endif ifeq ($(FULL_TARGET),x86_64-linux) override TARGET_EXAMPLES+=rep2xml endif @@ -814,9 +712,6 @@ endif ifeq ($(FULL_TARGET),x86_64-win64) override TARGET_EXAMPLES+=rep2xml endif -ifeq ($(FULL_TARGET),x86_64-embedded) -override TARGET_EXAMPLES+=rep2xml -endif ifeq ($(FULL_TARGET),arm-linux) override TARGET_EXAMPLES+=rep2xml endif @@ -829,21 +724,9 @@ endif ifeq ($(FULL_TARGET),arm-gba) override TARGET_EXAMPLES+=rep2xml endif -ifeq ($(FULL_TARGET),arm-nds) -override TARGET_EXAMPLES+=rep2xml -endif -ifeq ($(FULL_TARGET),arm-embedded) -override TARGET_EXAMPLES+=rep2xml -endif -ifeq ($(FULL_TARGET),arm-symbian) -override TARGET_EXAMPLES+=rep2xml -endif ifeq ($(FULL_TARGET),powerpc64-linux) override TARGET_EXAMPLES+=rep2xml endif -ifeq ($(FULL_TARGET),powerpc64-embedded) -override TARGET_EXAMPLES+=rep2xml -endif override INSTALL_FPCPACKAGE=y ifeq ($(FULL_TARGET),i386-linux) override COMPILER_INCLUDEDIR+=lnet/sys @@ -896,12 +779,6 @@ endif ifeq ($(FULL_TARGET),i386-wince) override COMPILER_INCLUDEDIR+=lnet/sys endif -ifeq ($(FULL_TARGET),i386-embedded) -override COMPILER_INCLUDEDIR+=lnet/sys -endif -ifeq ($(FULL_TARGET),i386-symbian) -override COMPILER_INCLUDEDIR+=lnet/sys -endif ifeq ($(FULL_TARGET),m68k-linux) override COMPILER_INCLUDEDIR+=lnet/sys endif @@ -923,9 +800,6 @@ endif ifeq ($(FULL_TARGET),m68k-palmos) override COMPILER_INCLUDEDIR+=lnet/sys endif -ifeq ($(FULL_TARGET),m68k-embedded) -override COMPILER_INCLUDEDIR+=lnet/sys -endif ifeq ($(FULL_TARGET),powerpc-linux) override COMPILER_INCLUDEDIR+=lnet/sys endif @@ -944,9 +818,6 @@ endif ifeq ($(FULL_TARGET),powerpc-morphos) override COMPILER_INCLUDEDIR+=lnet/sys endif -ifeq ($(FULL_TARGET),powerpc-embedded) -override COMPILER_INCLUDEDIR+=lnet/sys -endif ifeq ($(FULL_TARGET),sparc-linux) override COMPILER_INCLUDEDIR+=lnet/sys endif @@ -956,9 +827,6 @@ endif ifeq ($(FULL_TARGET),sparc-solaris) override COMPILER_INCLUDEDIR+=lnet/sys endif -ifeq ($(FULL_TARGET),sparc-embedded) -override COMPILER_INCLUDEDIR+=lnet/sys -endif ifeq ($(FULL_TARGET),x86_64-linux) override COMPILER_INCLUDEDIR+=lnet/sys endif @@ -968,9 +836,6 @@ endif ifeq ($(FULL_TARGET),x86_64-win64) override COMPILER_INCLUDEDIR+=lnet/sys endif -ifeq ($(FULL_TARGET),x86_64-embedded) -override COMPILER_INCLUDEDIR+=lnet/sys -endif ifeq ($(FULL_TARGET),arm-linux) override COMPILER_INCLUDEDIR+=lnet/sys endif @@ -983,173 +848,131 @@ endif ifeq ($(FULL_TARGET),arm-gba) override COMPILER_INCLUDEDIR+=lnet/sys endif -ifeq ($(FULL_TARGET),arm-nds) -override COMPILER_INCLUDEDIR+=lnet/sys -endif -ifeq ($(FULL_TARGET),arm-embedded) -override COMPILER_INCLUDEDIR+=lnet/sys -endif -ifeq ($(FULL_TARGET),arm-symbian) -override COMPILER_INCLUDEDIR+=lnet/sys -endif ifeq ($(FULL_TARGET),powerpc64-linux) override COMPILER_INCLUDEDIR+=lnet/sys endif -ifeq ($(FULL_TARGET),powerpc64-embedded) -override COMPILER_INCLUDEDIR+=lnet/sys -endif ifeq ($(FULL_TARGET),i386-linux) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-go32v2) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-win32) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-os2) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-freebsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-beos) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-netbsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-solaris) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-qnx) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-netware) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-openbsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-wdosx) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-darwin) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-emx) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-watcom) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-netwlibc) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),i386-wince) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),i386-embedded) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),i386-symbian) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),m68k-linux) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),m68k-freebsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),m68k-netbsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),m68k-amiga) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),m68k-atari) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),m68k-openbsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),m68k-palmos) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),m68k-embedded) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),powerpc-linux) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),powerpc-netbsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),powerpc-amiga) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),powerpc-macos) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),powerpc-darwin) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),powerpc-morphos) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),powerpc-embedded) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),sparc-linux) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),sparc-netbsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),sparc-solaris) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),sparc-embedded) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),x86_64-linux) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),x86_64-freebsd) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),x86_64-win64) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),x86_64-embedded) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),arm-linux) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),arm-palmos) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),arm-wince) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),arm-gba) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),arm-nds) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),arm-embedded) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),arm-symbian) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifeq ($(FULL_TARGET),powerpc64-linux) -override COMPILER_UNITDIR+=lnet -endif -ifeq ($(FULL_TARGET),powerpc64-embedded) -override COMPILER_UNITDIR+=lnet +override COMPILER_UNITDIR+=$(FCL20) lnet endif ifdef REQUIRE_UNITSDIR override UNITSDIR+=$(REQUIRE_UNITSDIR) @@ -1508,10 +1331,6 @@ EXEEXT=.gba SHAREDLIBEXT=.so SHORTSUFFIX=gba endif -ifeq ($(OS_TARGET),symbian) -SHAREDLIBEXT=.dll -SHORTSUFFIX=symbian -endif else ifeq ($(OS_TARGET),go32v1) PPUEXT=.pp1 @@ -1961,6 +1780,7 @@ REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 REQUIRE_PACKAGES_PASZLIB=1 REQUIRE_PACKAGES_NETDB=1 +REQUIRE_PACKAGES_WINUNITS=1 REQUIRE_PACKAGES_FCL=1 REQUIRE_PACKAGES_LIBCURL=1 REQUIRE_PACKAGES_PASJPEG=1 @@ -2132,24 +1952,6 @@ REQUIRE_PACKAGES_IBASE=1 REQUIRE_PACKAGES_POSTGRES=1 REQUIRE_PACKAGES_SQLITE=1 endif -ifeq ($(FULL_TARGET),i386-embedded) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif -ifeq ($(FULL_TARGET),i386-symbian) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif ifeq ($(FULL_TARGET),m68k-linux) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 @@ -2243,15 +2045,6 @@ REQUIRE_PACKAGES_LIBCURL=1 REQUIRE_PACKAGES_NETDB=1 REQUIRE_PACKAGES_PASJPEG=1 endif -ifeq ($(FULL_TARGET),m68k-embedded) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif ifeq ($(FULL_TARGET),powerpc-linux) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 @@ -2329,15 +2122,6 @@ REQUIRE_PACKAGES_LIBCURL=1 REQUIRE_PACKAGES_NETDB=1 REQUIRE_PACKAGES_PASJPEG=1 endif -ifeq ($(FULL_TARGET),powerpc-embedded) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif ifeq ($(FULL_TARGET),sparc-linux) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 @@ -2382,15 +2166,6 @@ REQUIRE_PACKAGES_FCL=1 REQUIRE_PACKAGES_LIBCURL=1 REQUIRE_PACKAGES_PASJPEG=1 endif -ifeq ($(FULL_TARGET),sparc-embedded) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif ifeq ($(FULL_TARGET),x86_64-linux) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 @@ -2430,19 +2205,11 @@ REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 REQUIRE_PACKAGES_PASZLIB=1 REQUIRE_PACKAGES_NETDB=1 +REQUIRE_PACKAGES_WINUNITS=1 REQUIRE_PACKAGES_FCL=1 REQUIRE_PACKAGES_LIBCURL=1 REQUIRE_PACKAGES_PASJPEG=1 endif -ifeq ($(FULL_TARGET),x86_64-embedded) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif ifeq ($(FULL_TARGET),arm-linux) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 @@ -2490,33 +2257,6 @@ REQUIRE_PACKAGES_LIBCURL=1 REQUIRE_PACKAGES_NETDB=1 REQUIRE_PACKAGES_PASJPEG=1 endif -ifeq ($(FULL_TARGET),arm-nds) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif -ifeq ($(FULL_TARGET),arm-embedded) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif -ifeq ($(FULL_TARGET),arm-symbian) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif ifeq ($(FULL_TARGET),powerpc64-linux) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_HASH=1 @@ -2534,15 +2274,6 @@ REQUIRE_PACKAGES_ODBC=1 REQUIRE_PACKAGES_ORACLE=1 REQUIRE_PACKAGES_SQLITE=1 endif -ifeq ($(FULL_TARGET),powerpc64-embedded) -REQUIRE_PACKAGES_RTL=1 -REQUIRE_PACKAGES_HASH=1 -REQUIRE_PACKAGES_PASZLIB=1 -REQUIRE_PACKAGES_FCL=1 -REQUIRE_PACKAGES_LIBCURL=1 -REQUIRE_PACKAGES_NETDB=1 -REQUIRE_PACKAGES_PASJPEG=1 -endif ifdef REQUIRE_PACKAGES_RTL PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR)))))) ifneq ($(PACKAGEDIR_RTL),) @@ -2933,6 +2664,32 @@ ifdef UNITDIR_SQLITE override COMPILER_UNITDIR+=$(UNITDIR_SQLITE) endif endif +ifdef REQUIRE_PACKAGES_WINUNITS +PACKAGEDIR_WINUNITS:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /winunits/Makefile.fpc,$(PACKAGESDIR)))))) +ifneq ($(PACKAGEDIR_WINUNITS),) +ifneq ($(wildcard $(PACKAGEDIR_WINUNITS)/units/$(TARGETSUFFIX)),) +UNITDIR_WINUNITS=$(PACKAGEDIR_WINUNITS)/units/$(TARGETSUFFIX) +else +UNITDIR_WINUNITS=$(PACKAGEDIR_WINUNITS) +endif +ifdef CHECKDEPEND +$(PACKAGEDIR_WINUNITS)/$(FPCMADE): + $(MAKE) -C $(PACKAGEDIR_WINUNITS) $(FPCMADE) +override ALLDEPENDENCIES+=$(PACKAGEDIR_WINUNITS)/$(FPCMADE) +endif +else +PACKAGEDIR_WINUNITS= +UNITDIR_WINUNITS:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /winunits/Package.fpc,$(UNITSDIR))))) +ifneq ($(UNITDIR_WINUNITS),) +UNITDIR_WINUNITS:=$(firstword $(UNITDIR_WINUNITS)) +else +UNITDIR_WINUNITS= +endif +endif +ifdef UNITDIR_WINUNITS +override COMPILER_UNITDIR+=$(UNITDIR_WINUNITS) +endif +endif ifndef NOCPUDEF override FPCOPTDEF=$(CPU_TARGET) endif @@ -3043,13 +2800,6 @@ ifeq ($(CPU_TARGET),i386) override FPCOPT+=-Aas endif endif -ifeq ($(findstring 2.0.,$(FPC_VERSION)),) -ifeq ($(OS_TARGET),linux) -ifeq ($(CPU_TARGET),x86_64) -override FPCOPT+=-Cg -endif -endif -endif ifdef LINKSHARED endif ifdef GCCLIBDIR diff --git a/utils/fppkg/Makefile.fpc b/utils/fppkg/Makefile.fpc index 5b026f110a..160fec870f 100644 --- a/utils/fppkg/Makefile.fpc +++ b/utils/fppkg/Makefile.fpc @@ -22,7 +22,7 @@ examples=rep2xml rsts=fprepos fpxmlrep fppkg [compiler] -unitdir=lnet +unitdir=$(FCL20) lnet includedir=lnet/sys [install] @@ -34,6 +34,12 @@ fpcdir=../.. [require] packages=fcl libcurl +[prerules] +# Compatibility to compile with 2.0.x +ifneq ($(findstring 2.0.,$(FPC_VERSION)),) +FCL20=fcl20 +endif + [rules] .NOTPARALLEL: fpmkunit$(PPUEXT) : fpmkunit.pp fpmkcnst.inc fpmktype$(PPUEXT) diff --git a/utils/fppkg/contnrs20.pp b/utils/fppkg/fcl20/contnrs.pp similarity index 99% rename from utils/fppkg/contnrs20.pp rename to utils/fppkg/fcl20/contnrs.pp index d59471ad47..09d0b8591b 100644 --- a/utils/fppkg/contnrs20.pp +++ b/utils/fppkg/fcl20/contnrs.pp @@ -16,7 +16,7 @@ {$H+} {$ifdef CLASSESINLINE}{$inline on}{$endif} -unit contnrs20; +unit contnrs; interface diff --git a/utils/fppkg/streamcoll20.pp b/utils/fppkg/fcl20/streamcoll.pp similarity index 99% rename from utils/fppkg/streamcoll20.pp rename to utils/fppkg/fcl20/streamcoll.pp index cc489ec08c..c17c815a53 100644 --- a/utils/fppkg/streamcoll20.pp +++ b/utils/fppkg/fcl20/streamcoll.pp @@ -17,7 +17,7 @@ {$mode objfpc} {$h+} -unit streamcoll20; +unit streamcoll; interface diff --git a/utils/fppkg/fcl20/zipper.pp b/utils/fppkg/fcl20/zipper.pp new file mode 100644 index 0000000000..801de5a010 --- /dev/null +++ b/utils/fppkg/fcl20/zipper.pp @@ -0,0 +1,1451 @@ +{ + $Id: header,v 1.1 2000/07/13 06:33:45 michael Exp $ + This file is part of the Free Component Library (FCL) + Copyright (c) 1999-2000 by the Free Pascal development team + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +{$mode objfpc} +{$h+} +unit zipper; + +Interface + +Uses + SysUtils,Classes,Contnrs,ZStream; + + +Const + { Signatures } +{$ifdef FPC_BIG_ENDIAN} + END_OF_CENTRAL_DIR_SIGNATURE = $504B0506; + LOCAL_FILE_HEADER_SIGNATURE = $504B0304; + CENTRAL_FILE_HEADER_SIGNATURE = $504B0102; +{$else FPC_BIG_ENDIAN} + END_OF_CENTRAL_DIR_SIGNATURE = $06054B50; + LOCAL_FILE_HEADER_SIGNATURE = $04034B50; + CENTRAL_FILE_HEADER_SIGNATURE = $02014B50; +{$endif FPC_BIG_ENDIAN} + +Type + Local_File_Header_Type = Packed Record + Signature : LongInt; + Extract_Version_Reqd : Word; + Bit_Flag : Word; + Compress_Method : Word; + Last_Mod_Time : Word; + Last_Mod_Date : Word; + Crc32 : LongWord; + Compressed_Size : LongInt; + Uncompressed_Size : LongInt; + Filename_Length : Word; + Extra_Field_Length : Word; + end; + + { Define the Central Directory record types } + + Central_File_Header_Type = Packed Record + Signature : LongInt; + MadeBy_Version : Word; + Extract_Version_Reqd : Word; + Bit_Flag : Word; + Compress_Method : Word; + Last_Mod_Time : Word; + Last_Mod_Date : Word; + Crc32 : LongWord; + Compressed_Size : LongInt; + Uncompressed_Size : LongInt; + Filename_Length : Word; + Extra_Field_Length : Word; + File_Comment_Length : Word; + Starting_Disk_Num : Word; + Internal_Attributes : Word; + External_Attributes : LongInt; + Local_Header_Offset : LongInt; + End; + + End_of_Central_Dir_Type = Packed Record + Signature : LongInt; + Disk_Number : Word; + Central_Dir_Start_Disk : Word; + Entries_This_Disk : Word; + Total_Entries : Word; + Central_Dir_Size : LongInt; + Start_Disk_Offset : LongInt; + ZipFile_Comment_Length : Word; + end; + +Const + Crc_32_Tab : Array[0..255] of LongWord = ( + $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f, $e963a535, $9e6495a3, + $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988, $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, + $1db71064, $6ab020f2, $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7, + $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9, $fa0f3d63, $8d080df5, + $3b6e20c8, $4c69105e, $d56041e4, $a2677172, $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, + $35b5a8fa, $42b2986c, $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59, + $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423, $cfba9599, $b8bda50f, + $2802b89e, $5f058808, $c60cd9b2, $b10be924, $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, + $76dc4190, $01db7106, $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433, + $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d, $91646c97, $e6635c01, + $6b6b51f4, $1c6c6162, $856530d8, $f262004e, $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, + $65b0d9c6, $12b7e950, $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65, + $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7, $a4d1c46d, $d3d6f4fb, + $4369e96a, $346ed9fc, $ad678846, $da60b8d0, $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, + $5005713c, $270241aa, $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f, + $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81, $b7bd5c3b, $c0ba6cad, + $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a, $ead54739, $9dd277af, $04db2615, $73dc1683, + $e3630b12, $94643b84, $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1, + $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb, $196c3671, $6e6b06e7, + $fed41b76, $89d32be0, $10da7a5a, $67dd4acc, $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, + $d6d6a3e8, $a1d1937e, $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b, + $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55, $316e8eef, $4669be79, + $cb61b38c, $bc66831a, $256fd2a0, $5268e236, $cc0c7795, $bb0b4703, $220216b9, $5505262f, + $c5ba3bbe, $b2bd0b28, $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d, + $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f, $72076785, $05005713, + $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38, $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, + $86d3d2d4, $f1d4e242, $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777, + $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69, $616bffd3, $166ccf45, + $a00ae278, $d70dd2ee, $4e048354, $3903b3c2, $a7672661, $d06016f7, $4969474d, $3e6e77db, + $aed16a4a, $d9d65adc, $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9, + $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693, $54de5729, $23d967bf, + $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94, $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d + ); + +Type + + TZipItem = Class(TObject) + Path : String; + Name : String; + Size : LongInt; + DateTime : TDateTime; + HdrPos : Longint; + end; + + TProgressEvent = Procedure(Sender : TObject; Const Pct : Double) of object; + TOnEndOfFileEvent = Procedure(Sender : TObject; Const Ratio : Double) of object; + TOnStartFileEvent = Procedure(Sender : TObject; Const AFileName : String) of object; + +Type + + { TCompressor } + TCompressor = Class(TObject) + Protected + FInFile : TStream; { I/O file variables } + FOutFile : TStream; + FCrc32Val : LongWord; { CRC calculation variable } + FBufferSize : LongWord; + FOnPercent : Integer; + FOnProgress : TProgressEvent; + Procedure UpdC32(Octet: Byte); + Public + Constructor Create(AInFile, AOutFile : TStream; ABufSize : LongWord); virtual; + Procedure Compress; Virtual; Abstract; + Class Function ZipID : Word; virtual; Abstract; + Property BufferSize : LongWord read FBufferSize; + Property OnPercent : Integer Read FOnPercent Write FOnPercent; + Property OnProgress : TProgressEvent Read FOnProgress Write FOnProgress; + Property Crc32Val : LongWord Read FCrc32Val Write FCrc32Val; + end; + + { TDeCompressor } + TDeCompressor = Class(TObject) + Protected + FInFile : TStream; { I/O file variables } + FOutFile : TStream; + FCrc32Val : LongWord; { CRC calculation variable } + FBufferSize : LongWord; + FOnPercent : Integer; + FOnProgress : TProgressEvent; + Procedure UpdC32(Octet: Byte); + Public + Constructor Create(AInFile, AOutFile : TStream; ABufSize : LongWord); virtual; + Procedure DeCompress; Virtual; Abstract; + Class Function ZipID : Word; virtual; Abstract; + Property BufferSize : LongWord read FBufferSize; + Property OnPercent : Integer Read FOnPercent Write FOnPercent; + Property OnProgress : TProgressEvent Read FOnProgress Write FOnProgress; + Property Crc32Val : LongWord Read FCrc32Val Write FCrc32Val; + end; + + { TShrinker } + +Const + TABLESIZE = 8191; + FIRSTENTRY = 257; + +Type + CodeRec = Packed Record + Child : Smallint; + Sibling : Smallint; + Suffix : Byte; + end; + CodeArray = Array[0..TABLESIZE] of CodeRec; + TablePtr = ^CodeArray; + + FreeListPtr = ^FreeListArray; + FreeListArray = Array[FIRSTENTRY..TABLESIZE] of Word; + + BufPtr = PByte; + + TShrinker = Class(TCompressor) + Private + FBufSize : LongWord; + MaxInBufIdx : LongWord; { Count of valid chars in input buffer } + InputEof : Boolean; { End of file indicator } + CodeTable : TablePtr; { Points to code table for LZW compression } + FreeList : FreeListPtr; { Table of free code table entries } + NextFree : Word; { Index into free list table } + + ClearList : Array[0..1023] of Byte; { Bit mapped structure used in } + { during adaptive resets } + CodeSize : Byte; { Size of codes (in bits) currently being written } + MaxCode : Word; { Largest code that can be written in CodeSize bits } + InBufIdx, { Points to next char in buffer to be read } + OutBufIdx : LongWord; { Points to next free space in output buffer } + InBuf, { I/O buffers } + OutBuf : BufPtr; + FirstCh : Boolean; { Flag indicating the START of a shrink operation } + TableFull : Boolean; { Flag indicating a full symbol table } + SaveByte : Byte; { Output code buffer } + BitsUsed : Byte; { Index into output code buffer } + BytesIn : LongInt; { Count of input file bytes processed } + BytesOut : LongInt; { Count of output bytes } + FOnBytes : Longint; + Procedure FillInputBuffer; + Procedure WriteOutputBuffer; + Procedure FlushOutput; + Procedure PutChar(B : Byte); + procedure PutCode(Code : Smallint); + Procedure InitializeCodeTable; + Procedure Prune(Parent : Word); + Procedure Clear_Table; + Procedure Table_Add(Prefix : Word; Suffix : Byte); + function Table_Lookup(TargetPrefix : Smallint; + TargetSuffix : Byte; + Out FoundAt : Smallint) : Boolean; + Procedure Shrink(Suffix : Smallint); + Procedure ProcessLine(Const Source : String); + Procedure DoOnProgress(Const Pct : Double); Virtual; + Public + Constructor Create(AInFile, AOutFile : TStream; ABufSize : LongWord); override; + Destructor Destroy; override; + Procedure Compress; override; + Class Function ZipID : Word; override; + end; + + { TDeflater } + + TDeflater = Class(TCompressor) + private + FCompressionLevel: TCompressionlevel; + Public + Constructor Create(AInFile, AOutFile : TStream; ABufSize : LongWord);override; + Procedure Compress; override; + Class Function ZipID : Word; override; + Property CompressionLevel : TCompressionlevel Read FCompressionLevel Write FCompressionLevel; + end; + + { TInflater } + + TInflater = Class(TDeCompressor) + Public + Constructor Create(AInFile, AOutFile : TStream; ABufSize : LongWord);override; + Procedure DeCompress; override; + Class Function ZipID : Word; override; + end; + + { TZipper } + + TZipper = Class(TObject) + Private + FZipping : Boolean; + FBufSize : LongWord; + FFileName : String; { Name of resulting Zip file } + FFiles : TStrings; + FInMemSize : Integer; + FOutFile : TFileStream; + FInFile : TFileStream; { I/O file variables } + LocalHdr : Local_File_Header_Type; + CentralHdr : Central_File_Header_Type; + EndHdr : End_of_Central_Dir_Type; + FOnPercent : LongInt; + FOnProgress : TProgressEvent; + FOnEndOfFile : TOnEndOfFileEvent; + FOnStartFile : TOnStartFileEvent; + Protected + Procedure OpenOutput; + Procedure CloseOutput; + Procedure CloseInput; + Procedure StartZipFile(Item : TZipItem); + Function UpdateZipHeader(Item : TZipItem; FZip : TStream; ACRC : LongWord;AMethod : Word) : Boolean; + Procedure BuildZipDirectory; + Procedure DoEndOfFile; + Procedure ZipOneFile(Item : TZipItem); virtual; + Function OpenInput(InFileName : String) : Boolean; + Procedure GetFileInfo; + Procedure SetBufSize(Value : LongWord); + Procedure SetFileName(Value : String); + Function CreateCompressor(Item : TZipItem; AinFile,AZipStream : TStream) : TCompressor; virtual; + Public + Constructor Create; + Destructor Destroy;override; + Procedure ZipAllFiles; virtual; + Procedure ZipFiles(AFileName : String; FileList : TStrings); + Procedure Clear; + Public + Property BufferSize : LongWord Read FBufSize Write SetBufSize; + Property OnPercent : Integer Read FOnPercent Write FOnPercent; + Property OnProgress : TProgressEvent Read FOnProgress Write FOnProgress; + Property OnStartFile : TOnStartFileEvent Read FOnStartFile Write FOnStartFile; + Property OnEndFile : TOnEndOfFileEvent Read FOnEndOfFile Write FOnEndOfFile; + Property FileName : String Read FFileName Write SetFileName; + Property Files : TStrings Read FFiles; + Property InMemSize : Integer Read FInMemSize Write FInMemSize; + end; + + { TYbZipper } + + { TUnZipper } + + TUnZipper = Class(TObject) + Private + FUnZipping : Boolean; + FBufSize : LongWord; + FFileName : String; { Name of resulting Zip file } + FOutputPath : String; + FFiles : TStrings; + FZipEntries : TFPObjectList; + FOutFile : TFileStream; + FZipFile : TFileStream; { I/O file variables } + LocalHdr : Local_File_Header_Type; + CentralHdr : Central_File_Header_Type; + EndHdr : End_of_Central_Dir_Type; + + FOnPercent : LongInt; + FOnProgress : TProgressEvent; + FOnEndOfFile : TOnEndOfFileEvent; + FOnStartFile : TOnStartFileEvent; + Protected + Procedure OpenInput; + Procedure CloseOutput; + Procedure CloseInput; + Procedure ReadZipHeader(Item : TZipItem; out ACRC : LongWord;out AMethod : Word); + Procedure ReadZipDirectory; + Procedure DoEndOfFile; + Procedure UnZipOneFile(Item : TZipItem); virtual; + Function OpenOutput(OutFileName : String) : Boolean; + Procedure SetBufSize(Value : LongWord); + Procedure SetFileName(Value : String); + Procedure SetOutputPath(Value:String); + Function CreateDeCompressor(Item : TZipItem; AMethod : Word;AZipFile,AOutFile : TStream) : TDeCompressor; virtual; + Public + Constructor Create; + Destructor Destroy;override; + Procedure UnZipAllFiles; virtual; + Procedure UnZipFiles(AFileName : String; FileList : TStrings); + Procedure UnZipAllFiles(AFileName : String); + Procedure Clear; + Public + Property BufferSize : LongWord Read FBufSize Write SetBufSize; + Property OnPercent : Integer Read FOnPercent Write FOnPercent; + Property OnProgress : TProgressEvent Read FOnProgress Write FOnProgress; + Property OnStartFile : TOnStartFileEvent Read FOnStartFile Write FOnStartFile; + Property OnEndFile : TOnEndOfFileEvent Read FOnEndOfFile Write FOnEndOfFile; + Property FileName : String Read FFileName Write SetFileName; + Property OutputPath : String Read FOutputPath Write SetOutputPath; + Property Files : TStrings Read FFiles; + end; + + EZipError = Class(Exception); + +Implementation + +ResourceString + SErrBufsizeChange = 'Changing buffer size is not allowed while (un)zipping'; + SErrFileChange = 'Changing output file name is not allowed while (un)zipping'; + SErrInvalidCRC = 'Invalid CRC checksum while unzipping %s'; + SErrCorruptZIP = 'Corrupt ZIP file %s'; + SErrUnsupportedCompressionFormat = 'Unsupported compression format %d'; + +{ --------------------------------------------------------------------- + Auxiliary + ---------------------------------------------------------------------} + +Procedure DateTimeToZipDateTime(DT : TDateTime; out ZD,ZT : Word); + +Var + Y,M,D,H,N,S,MS : Word; + +begin + DecodeDate(DT,Y,M,D); + DecodeTime(DT,H,N,S,MS); + Y:=Y-1980; + ZD:=d+(32*M)+(512*Y); + ZT:=(S div 2)+(32*N)+(2048*h); +end; + +Procedure ZipDateTimeToDateTime(ZD,ZT : Word;out DT : TDateTime); + +Var + Y,M,D,H,N,S,MS : Word; + +begin + MS:=0; + S:=(ZT and 31) shl 1; + N:=(ZT shr 5) and 63; + H:=(ZT shr 12) and 31; + D:=ZD and 31; + M:=(ZD shr 5) and 15; + Y:=((ZD shr 9) and 127)+1980; + DT:=ComposeDateTime(EncodeDate(Y,M,D),EncodeTime(H,N,S,MS)); +end; + +{ --------------------------------------------------------------------- + TDeCompressor + ---------------------------------------------------------------------} + + +Procedure TDeCompressor.UpdC32(Octet: Byte); + +Begin + FCrc32Val := Crc_32_Tab[Byte(FCrc32Val XOR LongInt(Octet))] XOR ((FCrc32Val SHR 8) AND $00FFFFFF); +end; + +constructor TDeCompressor.Create(AInFile, AOutFile: TStream; ABufSize: LongWord); +begin + FinFile:=AInFile; + FoutFile:=AOutFile; + FBufferSize:=ABufSize; + CRC32Val:=$FFFFFFFF; +end; + + +{ --------------------------------------------------------------------- + TCompressor + ---------------------------------------------------------------------} + + +Procedure TCompressor.UpdC32(Octet: Byte); + +Begin + FCrc32Val := Crc_32_Tab[Byte(FCrc32Val XOR LongInt(Octet))] XOR ((FCrc32Val SHR 8) AND $00FFFFFF); +end; + +constructor TCompressor.Create(AInFile, AOutFile: TStream; ABufSize: LongWord); +begin + FinFile:=AInFile; + FoutFile:=AOutFile; + FBufferSize:=ABufSize; + CRC32Val:=$FFFFFFFF; +end; + + +{ --------------------------------------------------------------------- + TDeflater + ---------------------------------------------------------------------} + +constructor TDeflater.Create(AInFile, AOutFile: TStream; ABufSize: LongWord); +begin + Inherited; + FCompressionLevel:=clDefault; +end; + + +procedure TDeflater.Compress; + +Var + Buf : PByte; + I,Count,NewCount : Integer; + C : TCompressionStream; + +begin + CRC32Val:=$FFFFFFFF; + Buf:=GetMem(FBufferSize); + Try + C:=TCompressionStream.Create(FCompressionLevel,FOutFile,True); + Try + Repeat + Count:=FInFile.Read(Buf^,FBufferSize); + For I:=0 to Count-1 do + UpdC32(Buf[i]); + NewCount:=Count; + While (NewCount>0) do + NewCount:=NewCount-C.Write(Buf^,NewCount); + Until (Count=0); + Finally + C.Free; + end; + Finally + FreeMem(Buf); + end; + Crc32Val:=NOT Crc32Val; +end; + +class function TDeflater.ZipID: Word; +begin + Result:=8; +end; + +{ --------------------------------------------------------------------- + TInflater + ---------------------------------------------------------------------} + +constructor TInflater.Create(AInFile, AOutFile: TStream; ABufSize: LongWord); +begin + Inherited; +end; + + +procedure TInflater.DeCompress; + +Var + Buf : PByte; + I,Count : Integer; + C : TDeCompressionStream; + +begin + CRC32Val:=$FFFFFFFF; + Buf:=GetMem(FBufferSize); + Try + C:=TDeCompressionStream.Create(FInFile,True); + Try + Repeat + Count:=C.Read(Buf^,FBufferSize); + For I:=0 to Count-1 do + UpdC32(Buf[i]); + FOutFile.Write(Buf^,Count); + Until (Count=0); + Finally + C.Free; + end; + Finally + FreeMem(Buf); + end; + Crc32Val:=NOT Crc32Val; +end; + +class function TInflater.ZipID: Word; +begin + Result:=8; +end; + + +{ --------------------------------------------------------------------- + TShrinker + ---------------------------------------------------------------------} + +Const + DefaultInMemSize = 256*1024; { Files larger than 256k are processed on disk } + DefaultBufSize = 16384; { Use 16K file buffers } + MINBITS = 9; { Starting code size of 9 bits } + MAXBITS = 13; { Maximum code size of 13 bits } + SPECIAL = 256; { Special function code } + INCSIZE = 1; { Code indicating a jump in code size } + CLEARCODE = 2; { Code indicating code table has been cleared } + STDATTR = $23; { Standard file attribute for DOS Find First/Next } + +constructor TShrinker.Create(AInFile, AOutFile : TStream; ABufSize : LongWord); +begin + Inherited; + FBufSize:=ABufSize; + InBuf:=GetMem(FBUFSIZE); + OutBuf:=GetMem(FBUFSIZE); + CodeTable:=GetMem(SizeOf(CodeTable^)); + FreeList:=GetMem(SizeOf(FreeList^)); +end; + +destructor TShrinker.Destroy; +begin + FreeMem(CodeTable); + FreeMem(FreeList); + FreeMem(InBuf); + FreeMem(OutBuf); + inherited Destroy; +end; + +Procedure TShrinker.Compress; + +Var + OneString : String; + Remaining : Word; + +begin + BytesIn := 1; + BytesOut := 1; + InitializeCodeTable; + FillInputBuffer; + FirstCh:= TRUE; + Crc32Val:=$FFFFFFFF; + FOnBytes:=Round((FInFile.Size * FOnPercent) / 100); + While NOT InputEof do + begin + Remaining:=Succ(MaxInBufIdx - InBufIdx); + If Remaining>255 then + Remaining:=255; + If Remaining=0 then + FillInputBuffer + else + begin + SetLength(OneString,Remaining); + Move(InBuf[InBufIdx], OneString[1], Remaining); + Inc(InBufIdx, Remaining); + ProcessLine(OneString); + end; + end; + Crc32Val := NOT Crc32Val; + ProcessLine(''); +end; + +class function TShrinker.ZipID: Word; +begin + Result:=1; +end; + + +Procedure TShrinker.DoOnProgress(Const Pct: Double); + +begin + If Assigned(FOnProgress) then + FOnProgress(Self,Pct); +end; + + +Procedure TShrinker.FillInputBuffer; + +Begin + MaxInbufIDx:=FInfile.Read(InBuf[0], FBufSize); + If MaxInbufIDx=0 then + InputEof := TRUE + else + InputEOF := FALSE; + InBufIdx := 0; +end; + + +Procedure TShrinker.WriteOutputBuffer; +Begin + FOutFile.WriteBuffer(OutBuf[0], OutBufIdx); + OutBufIdx := 0; +end; + + +Procedure TShrinker.PutChar(B : Byte); + +Begin + OutBuf[OutBufIdx] := B; + Inc(OutBufIdx); + If OutBufIdx>=FBufSize then + WriteOutputBuffer; + Inc(BytesOut); +end; + +Procedure TShrinker.FlushOutput; +Begin + If OutBufIdx>0 then + WriteOutputBuffer; +End; + + +procedure TShrinker.PutCode(Code : Smallint); + +var + ACode : LongInt; + XSize : Smallint; + +begin + if (Code=-1) then + begin + if BitsUsed>0 then + PutChar(SaveByte); + end + else + begin + ACode := Longint(Code); + XSize := CodeSize+BitsUsed; + ACode := (ACode shl BitsUsed) or SaveByte; + while (XSize div 8) > 0 do + begin + PutChar(Lo(ACode)); + ACode := ACode shr 8; + Dec(XSize,8); + end; + BitsUsed := XSize; + SaveByte := Lo(ACode); + end; +end; + + +Procedure TShrinker.InitializeCodeTable; + +Var + I : Word; +Begin + For I := 0 to TableSize do + begin + With CodeTable^[I] do + begin + Child := -1; + Sibling := -1; + If (I<=255) then + Suffix := I; + end; + If (I>=257) then + FreeList^[I] := I; + end; + NextFree := FIRSTENTRY; + TableFull := FALSE; +end; + + +Procedure TShrinker.Prune(Parent : Word); + +Var + CurrChild : Smallint; + NextSibling : Smallint; +Begin + CurrChild := CodeTable^[Parent].Child; + { Find first Child that has descendants .. clear any that don't } + While (CurrChild <> -1) AND (CodeTable^[CurrChild].Child = -1) do + begin + CodeTable^[Parent].Child := CodeTable^[CurrChild].Sibling; + CodeTable^[CurrChild].Sibling := -1; + { Turn on ClearList bit to indicate a cleared entry } + ClearList[CurrChild DIV 8] := (ClearList[CurrChild DIV 8] OR (1 SHL (CurrChild MOD 8))); + CurrChild := CodeTable^[Parent].Child; + end; + If CurrChild <> -1 then + begin { If there are any children left ...} + Prune(CurrChild); + NextSibling := CodeTable^[CurrChild].Sibling; + While NextSibling <> -1 do + begin + If CodeTable^[NextSibling].Child = -1 then + begin + CodeTable^[CurrChild].Sibling := CodeTable^[NextSibling].Sibling; + CodeTable^[NextSibling].Sibling := -1; + { Turn on ClearList bit to indicate a cleared entry } + ClearList[NextSibling DIV 8] := (ClearList[NextSibling DIV 8] OR (1 SHL (NextSibling MOD 8))); + NextSibling := CodeTable^[CurrChild].Sibling; + end + else + begin + CurrChild := NextSibling; + Prune(CurrChild); + NextSibling := CodeTable^[CurrChild].Sibling; + end; + end; + end; +end; + + +Procedure TShrinker.Clear_Table; +Var + Node : Word; +Begin + FillChar(ClearList, SizeOf(ClearList), $00); + For Node := 0 to 255 do + Prune(Node); + NextFree := Succ(TABLESIZE); + For Node := TABLESIZE downto FIRSTENTRY do + begin + If (ClearList[Node DIV 8] AND (1 SHL (Node MOD 8))) <> 0 then + begin + Dec(NextFree); + FreeList^[NextFree] := Node; + end; + end; + If NextFree <= TABLESIZE then + TableFull := FALSE; +end; + + +Procedure TShrinker.Table_Add(Prefix : Word; Suffix : Byte); +Var + FreeNode : Word; +Begin + If NextFree <= TABLESIZE then + begin + FreeNode := FreeList^[NextFree]; + Inc(NextFree); + CodeTable^[FreeNode].Child := -1; + CodeTable^[FreeNode].Sibling := -1; + CodeTable^[FreeNode].Suffix := Suffix; + If CodeTable^[Prefix].Child = -1 then + CodeTable^[Prefix].Child := FreeNode + else + begin + Prefix := CodeTable^[Prefix].Child; + While CodeTable^[Prefix].Sibling <> -1 do + Prefix := CodeTable^[Prefix].Sibling; + CodeTable^[Prefix].Sibling := FreeNode; + end; + end; + if NextFree > TABLESIZE then + TableFull := TRUE; +end; + +function TShrinker.Table_Lookup( TargetPrefix : Smallint; + TargetSuffix : Byte; + Out FoundAt : Smallint ) : Boolean; + +var TempPrefix : Smallint; + +begin + TempPrefix := TargetPrefix; + Table_lookup := False; + if CodeTable^[TempPrefix].Child <> -1 then + begin + TempPrefix := CodeTable^[TempPrefix].Child; + repeat + if CodeTable^[TempPrefix].Suffix = TargetSuffix then + begin + Table_lookup := True; + break; + end; + if CodeTable^[TempPrefix].Sibling = -1 then + break; + TempPrefix := CodeTable^[TempPrefix].Sibling; + until False; + end; + if Table_Lookup then + FoundAt := TempPrefix + else + FoundAt := -1; +end; + +Procedure TShrinker.Shrink(Suffix : Smallint); + +Const + LastCode : Smallint = 0; + +Var + WhereFound : Smallint; + +Begin + If FirstCh then + begin + SaveByte := $00; + BitsUsed := 0; + CodeSize := MINBITS; + MaxCode := (1 SHL CodeSize) - 1; + LastCode := Suffix; + FirstCh := FALSE; + end + else + begin + If Suffix <> -1 then + begin + If TableFull then + begin + Putcode(LastCode); + PutCode(SPECIAL); + Putcode(CLEARCODE); + Clear_Table; + Table_Add(LastCode, Suffix); + LastCode := Suffix; + end + else + begin + If Table_Lookup(LastCode, Suffix, WhereFound) then + begin + LastCode := WhereFound; + end + else + begin + PutCode(LastCode); + Table_Add(LastCode, Suffix); + LastCode := Suffix; + If (FreeList^[NextFree] > MaxCode) and (CodeSize < MaxBits) then + begin + PutCode(SPECIAL); + PutCode(INCSIZE); + Inc(CodeSize); + MaxCode := (1 SHL CodeSize) -1; + end; + end; + end; + end + else + begin + PutCode(LastCode); + PutCode(-1); + FlushOutput; + end; + end; +end; + +Procedure TShrinker.ProcessLine(Const Source : String); + +Var + I : Word; + +Begin + If Source = '' then + Shrink(-1) + else + For I := 1 to Length(Source) do + begin + Inc(BytesIn); + If (Pred(BytesIn) MOD FOnBytes) = 0 then + DoOnProgress(100 * ( BytesIn / FInFile.Size)); + UpdC32(Ord(Source[I])); + Shrink(Ord(Source[I])); + end; +end; + +{ --------------------------------------------------------------------- + TZipper + ---------------------------------------------------------------------} + + +Procedure TZipper.GetFileInfo; + +Var + Info : TSearchRec; + I : Word; + NewNode : TZipItem; + + +Begin + For I := 0 to FFiles.Count-1 do + If FindFirst(FFiles[I], STDATTR, Info)=0 then + try + NewNode:=TZipItem.Create; + NewNode.Path := ExtractFilePath(FFiles[i]); + NewNode.Name := Info.Name; + NewNode.Size := Info.Size; + NewNode.DateTime:=FileDateToDateTime(Info.Time); + FFiles.Objects[i]:=NewNode; + finally + FindClose(Info); + end; +end; + +Procedure TZipper.OpenOutput; + +Begin + FOutFile:=TFileStream.Create(FFileName,fmCreate); +End; + + +Function TZipper.OpenInput(InFileName : String) : Boolean; + +Begin + FInFile:=TFileStream.Create(InFileName,fmOpenRead); + Result:=True; + If Assigned(FOnStartFile) then + FOnStartFile(Self,InFileName); +End; + + +Procedure TZipper.CloseOutput; + +Begin + FreeAndNil(FOutFile); +end; + + +Procedure TZipper.CloseInput; + +Begin + FreeAndNil(FInFile); +end; + + +Procedure TZipper.StartZipFile(Item : TZipItem); + +Begin + FillChar(LocalHdr,SizeOf(LocalHdr),0); + With LocalHdr do + begin + Signature := LOCAL_FILE_HEADER_SIGNATURE; + Extract_Version_Reqd := 10; + Bit_Flag := 0; + Compress_Method := 1; + DateTimeToZipDateTime(Item.DateTime,Last_Mod_Date,Last_Mod_Time); + Crc32 := 0; + Compressed_Size := 0; + Uncompressed_Size := Item.Size; + FileName_Length := Length(Item.Name); + Extra_Field_Length := 0; + end ; +End; + + +Function TZipper.UpdateZipHeader(Item : TZipItem; FZip : TStream; ACRC : LongWord; AMethod : Word) : Boolean; + +Begin + With LocalHdr do + begin + Compressed_Size := FZip.Size; + Crc32 := ACRC; + Compress_method:=AMethod; + Result:=Not (Compressed_Size >= Uncompressed_Size); + If Not Result then + begin { No... } + Compress_Method := 0; { ...change stowage type } + Compressed_Size := Uncompressed_Size; { ...update compressed size } + end; + end; + FOutFile.WriteBuffer(LocalHdr,SizeOf(LocalHdr)); + FOutFile.WriteBuffer(Item.Name[1],Length(Item.Name)); +End; + + +Procedure TZipper.BuildZipDirectory; + +Var + SavePos : LongInt; + HdrPos : LongInt; + CenDirPos : LongInt; + Entries : Word; + ZFileName : ShortString; + +Begin + Entries := 0; + CenDirPos := FOutFile.Position; + FOutFile.Seek(0,soFrombeginning); { Rewind output file } + HdrPos := FOutFile.Position; + FOutFile.ReadBuffer(LocalHdr, SizeOf(LocalHdr)); + Repeat + SetLength(ZFileName,LocalHdr.FileName_Length); + FOutFile.ReadBuffer(ZFileName[1], LocalHdr.FileName_Length); + SavePos := FOutFile.Position; + FillChar(CentralHdr,SizeOf(CentralHdr),0); + With CentralHdr do + begin + Signature := CENTRAL_FILE_HEADER_SIGNATURE; + MadeBy_Version := LocalHdr.Extract_Version_Reqd; + Move(LocalHdr.Extract_Version_Reqd, Extract_Version_Reqd, 26); + Last_Mod_Time:=localHdr.Last_Mod_Time; + Last_Mod_Date:=localHdr.Last_Mod_Date; + File_Comment_Length := 0; + Starting_Disk_Num := 0; + Internal_Attributes := 0; + External_Attributes := faARCHIVE; + Local_Header_Offset := HdrPos; + end; + FOutFile.Seek(0,soFromEnd); + FOutFile.WriteBuffer(CentralHdr,SizeOf(CentralHdr)); + FOutFile.WriteBuffer(ZFileName[1],Length(ZFileName)); + Inc(Entries); + FOutFile.Seek(SavePos + LocalHdr.Compressed_Size,soFromBeginning); + HdrPos:=FOutFile.Position; + FOutFile.ReadBuffer(LocalHdr, SizeOf(LocalHdr)); + Until LocalHdr.Signature = CENTRAL_FILE_HEADER_SIGNATURE; + FOutFile.Seek(0,soFromEnd); + FillChar(EndHdr,SizeOf(EndHdr),0); + With EndHdr do + begin + Signature := END_OF_CENTRAL_DIR_SIGNATURE; + Disk_Number := 0; + Central_Dir_Start_Disk := 0; + Entries_This_Disk := Entries; + Total_Entries := Entries; + Central_Dir_Size := FOutFile.Size-CenDirPos; + Start_Disk_Offset := CenDirPos; + ZipFile_Comment_Length := 0; + FOutFile.WriteBuffer(EndHdr, SizeOf(EndHdr)); + end; +end; + +Function TZipper.CreateCompressor(Item : TZipItem; AInFile,AZipStream : TStream) : TCompressor; + +begin + Result:=TDeflater.Create(AinFile,AZipStream,FBufSize); +end; + +Procedure TZipper.ZipOneFile(Item : TZipItem); + +Var + CRC : Integer; + ZMethod : Word; + ZipStream : TStream; + TmpFileName : String; + +Begin + OpenInput(Item.Path+Item.Name); + Try + StartZipFile(Item); + If (FInfile.Size<=FInMemSize) then + ZipStream:=TMemoryStream.Create + else + begin + TmpFileName:=ChangeFileExt(FFileName,'.tmp'); + ZipStream:=TFileStream.Create(TmpFileName,fmCreate); + end; + Try + With CreateCompressor(Item, FinFile,ZipStream) do + Try + OnProgress:=Self.OnProgress; + OnPercent:=Self.OnPercent; + Compress; + CRC:=Crc32Val; + ZMethod:=ZipID; + Finally + Free; + end; + If UpdateZipHeader(Item,ZipStream,CRC,ZMethod) then + // Compressed file smaller than original file. + FOutFile.CopyFrom(ZipStream,0) + else + begin + // Original file smaller than compressed file. + FInfile.Seek(0,soFromBeginning); + FOutFile.CopyFrom(FInFile,0); + end; + finally + ZipStream.Free; + If (TmpFileName<>'') then + DeleteFile(TmpFileName); + end; + Finally + CloseInput; + end; +end; + +Procedure TZipper.ZipAllFiles; +Var + Item : TZipItem; + I : Integer; + +Begin + FZipping:=True; + Try + GetFileInfo; + OpenOutput; + Try + For I:=0 to FFiles.Count-1 do + begin + Item:=FFiles.Objects[i] as TZipItem; + ZipOneFile(Item); + end; + BuildZipDirectory; + Finally + CloseOutput; + end; + finally + FZipping:=False; + end; +end; + + +Procedure TZipper.SetBufSize(Value : LongWord); + +begin + If FZipping then + Raise EZipError.Create(SErrBufsizeChange); + If Value>=DefaultBufSize then + FBufSize:=Value; +end; + +Procedure TZipper.SetFileName(Value : String); + +begin + If FZipping then + Raise EZipError.Create(SErrFileChange); + FFileName:=Value; +end; + +Procedure TZipper.ZipFiles(AFileName : String; FileList : TStrings); + +begin + FFiles.Assign(FileList); + FFileName:=AFileName; + ZipAllFiles; +end; + +Procedure TZipper.DoEndOfFile; + +Var + ComprPct : Double; + +begin + If (LocalHdr.Uncompressed_Size>0) then + ComprPct := (100.0 * (LocalHdr.Uncompressed_Size - LocalHdr.Compressed_Size)) / LocalHdr.Uncompressed_Size + else + ComprPct := 0; + If Assigned(FOnEndOfFile) then + FOnEndOfFile(Self,ComprPct); +end; + +Constructor TZipper.Create; + +begin + FBufSize:=DefaultBufSize; + FInMemSize:=DefaultInMemSize; + FFiles:=TStringList.Create; + TStringlist(FFiles).Sorted:=True; + FOnPercent:=1; +end; + +Procedure TZipper.Clear; + +Var + I : Integer; + +begin + For I:=0 to FFiles.Count-1 do + FFiles.Objects[i].Free; + FFiles.Clear; +end; + +Destructor TZipper.Destroy; + +begin + Clear; + FreeAndNil(FFiles); + Inherited; +end; + + +{ --------------------------------------------------------------------- + TUnZipper + ---------------------------------------------------------------------} + +Procedure TUnZipper.OpenInput; + +Begin + FZipFile:=TFileStream.Create(FFileName,fmOpenRead); +End; + + +Function TUnZipper.OpenOutput(OutFileName : String) : Boolean; + +Begin + FOutFile:=TFileStream.Create(OutFileName,fmCreate); + Result:=True; + If Assigned(FOnStartFile) then + FOnStartFile(Self,OutFileName); +End; + + +Procedure TUnZipper.CloseOutput; + +Begin + FreeAndNil(FOutFile); +end; + + +Procedure TUnZipper.CloseInput; + +Begin + FreeAndNil(FZipFile); +end; + + +Procedure TUnZipper.ReadZipHeader(Item : TZipItem; out ACRC : LongWord; out AMethod : Word); + +Begin + FZipFile.Seek(Item.HdrPos,soFromBeginning); + FZipFile.ReadBuffer(LocalHdr,SizeOf(LocalHdr)); + With LocalHdr do + begin + SetLength(Item.Name,Filename_Length); + FZipFile.ReadBuffer(Item.Name[1],Filename_Length); + FZipFile.Seek(Extra_Field_Length,soCurrent); + Item.Size:=Uncompressed_Size; + ZipDateTimeToDateTime(Last_Mod_Date,Last_Mod_Time,Item.DateTime); + ACrc:=Crc32; + AMethod:=Compress_method; + end; +End; + + +Procedure TUnZipper.ReadZipDirectory; + +Var + i, + EndHdrPos, + CenDirPos : LongInt; + NewNode : TZipItem; +Begin + EndHdrPos:=FZipFile.Size-SizeOf(EndHdr); + if EndHdrPos < 0 then + raise EZipError.CreateFmt(SErrCorruptZIP,[FZipFile.FileName]); + FZipFile.Seek(EndHdrPos,soFromBeginning); + FZipFile.ReadBuffer(EndHdr, SizeOf(EndHdr)); + With EndHdr do + begin + if Signature <> END_OF_CENTRAL_DIR_SIGNATURE then + raise EZipError.CreateFmt(SErrCorruptZIP,[FZipFile.FileName]); + CenDirPos:=Start_Disk_Offset; + end; + FZipFile.Seek(CenDirPos,soFrombeginning); + for i:=0 to EndHdr.Entries_This_Disk-1 do + begin + FZipFile.ReadBuffer(CentralHdr, SizeOf(CentralHdr)); + With CentralHdr do + begin + if Signature<>CENTRAL_FILE_HEADER_SIGNATURE then + raise EZipError.CreateFmt(SErrCorruptZIP,[FZipFile.FileName]); + NewNode:=TZipItem.Create; + NewNode.HdrPos := Local_Header_Offset; + SetLength(NewNode.Name,Filename_Length); + FZipFile.ReadBuffer(NewNode.Name[1],Filename_Length); + FZipFile.Seek(Extra_Field_Length+File_Comment_Length,soCurrent); + FZipEntries.Add(NewNode); + end; + end; +end; + +Function TUnZipper.CreateDeCompressor(Item : TZipItem; AMethod : Word;AZipFile,AOutFile : TStream) : TDeCompressor; +var + Count : Int64; +begin + case AMethod of + 8 : + Result:=TInflater.Create(AZipFile,AOutFile,FBufSize); + else + raise EZipError.CreateFmt(SErrUnsupportedCompressionFormat,[AMethod]); + end; +end; + +Procedure TUnZipper.UnZipOneFile(Item : TZipItem); + +Var + Count : Longint; + CRC : LongWord; + ZMethod : Word; +Begin + Try + ReadZipHeader(Item,CRC,ZMethod); + OpenOutput(FOutputPath+Item.Name); + if ZMethod=0 then + begin + Count:=FOutFile.CopyFrom(FZipFile,LocalHdr.Compressed_Size); +{$warning TODO: Implement CRC Check} + end + else + With CreateDecompressor(Item, ZMethod, FZipFile, FOutFile) do + Try + OnProgress:=Self.OnProgress; + OnPercent:=Self.OnPercent; + DeCompress; + if CRC<>Crc32Val then + raise EZipError.CreateFmt(SErrInvalidCRC,[Item.Name]); + Finally + Free; + end; + Finally + CloseOutput; + end; +end; + + +Procedure TUnZipper.UnZipAllFiles; +Var + Item : TZipItem; + I : Integer; + +Begin + FUnZipping:=True; + Try + OpenInput; + Try + ReadZipDirectory; + For I:=0 to FZipEntries.Count-1 do + begin + Item:=FZipEntries[i] as TZipItem; + UnZipOneFile(Item); + end; + Finally + CloseInput; + end; + finally + FUnZipping:=False; + end; +end; + + +Procedure TUnZipper.SetBufSize(Value : LongWord); + +begin + If FUnZipping then + Raise EZipError.Create(SErrBufsizeChange); + If Value>=DefaultBufSize then + FBufSize:=Value; +end; + +Procedure TUnZipper.SetFileName(Value : String); + +begin + If FUnZipping then + Raise EZipError.Create(SErrFileChange); + FFileName:=Value; +end; + +Procedure TUnZipper.SetOutputPath(Value:String); +begin + If FUnZipping then + Raise EZipError.Create(SErrFileChange); + FOutputPath:=Value; +end; + +Procedure TUnZipper.UnZipFiles(AFileName : String; FileList : TStrings); + +begin + FFiles.Assign(FileList); + FFileName:=AFileName; + UnZipAllFiles; +end; + +Procedure TUnZipper.UnZipAllFiles(AFileName : String); + +begin + FFileName:=AFileName; + UnZipAllFiles; +end; + +Procedure TUnZipper.DoEndOfFile; + +Var + ComprPct : Double; + +begin + If (LocalHdr.Uncompressed_Size>0) then + ComprPct := (100.0 * (LocalHdr.Uncompressed_Size - LocalHdr.Compressed_Size)) / LocalHdr.Uncompressed_Size + else + ComprPct := 0; + If Assigned(FOnEndOfFile) then + FOnEndOfFile(Self,ComprPct); +end; + +Constructor TUnZipper.Create; + +begin + FBufSize:=DefaultBufSize; + FFiles:=TStringList.Create; + FZipEntries:=TFPObjectList.Create(true); + TStringlist(FFiles).Sorted:=True; + FOnPercent:=1; +end; + +Procedure TUnZipper.Clear; + +Var + I : Integer; + +begin + For I:=0 to FFiles.Count-1 do + FFiles.Objects[i].Free; + FFiles.Clear; + FZipEntries.Clear; +end; + +Destructor TUnZipper.Destroy; + +begin + Clear; + FreeAndNil(FFiles); + FreeAndNil(FZipEntries); + Inherited; +end; + +End. diff --git a/utils/fppkg/fcl20/zstream.pp b/utils/fppkg/fcl20/zstream.pp new file mode 100755 index 0000000000..6246fa0234 --- /dev/null +++ b/utils/fppkg/fcl20/zstream.pp @@ -0,0 +1,440 @@ +{ + This file is part of the Free Pascal run time library. + Copyright (c) 1999-2000 by the Free Pascal development team + + Implementation of compression streams. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +{$mode objfpc} + +unit zstream; + + +{ --------------------------------------------------------------------- + For linux and freebsd it's also possible to use ZLib instead + of paszlib. You need to undefine 'usepaszlib'. + ---------------------------------------------------------------------} + +{$define usepaszlib} + + +interface + +uses + Sysutils, Classes +{$ifdef usepaszlib} + ,paszlib,zbase +{$else} + ,zlib +{$endif} + ; + +{$H+} + +type + // Error reporting. + EZlibError = class(EStreamError); + ECompressionError = class(EZlibError); + EDecompressionError = class(EZlibError); + + TCustomZlibStream = class(TOwnerStream) + private + FStrmPos: Integer; + FOnProgress: TNotifyEvent; + FZRec: TZStream; + FBuffer: array [Word] of Byte; + protected + procedure Progress(Sender: TObject); dynamic; + property OnProgress: TNotifyEvent read FOnProgress write FOnProgress; + public + constructor Create(Strm: TStream); + end; + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + TCompressionStream = class(TCustomZlibStream) + private + function GetCompressionRate: extended; + function CompressionCheck(code: Integer): Integer; + procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + var OutBuf: Pointer; var OutBytes: Integer); + public + constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream; ASkipHeader : Boolean = False); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property CompressionRate: extended read GetCompressionRate; + property OnProgress; + end; + + TDecompressionStream = class(TCustomZlibStream) + private + function DecompressionCheck(code: Integer): Integer; + procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; var OutBuf: Pointer; var OutBytes: Integer); + public + constructor Create(ASource: TStream; ASkipHeader : Boolean = False); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property OnProgress; + end; + + TGZOpenMode = (gzOpenRead,gzOpenWrite); + + TGZFileStream = Class(TStream) + Private + FOpenMode : TGZOpenmode; + FFIle : gzfile; + Public + Constructor Create(FileName: String;FileMode: TGZOpenMode); + Destructor Destroy;override; + Function Read(Var Buffer; Count : longint): longint;override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + end; + + +implementation + +Const + ErrorStrings : array [0..6] of string = + ('Unknown error %d','Z_ERRNO','Z_STREAM_ERROR', + 'Z_DATA_ERROR','Z_MEM_ERROR','Z_BUF_ERROR','Z_VERSION_ERROR'); + SCouldntOpenFile = 'Couldn''t open file : %s'; + SReadOnlyStream = 'Decompression streams are read-only'; + SWriteOnlyStream = 'Compression streams are write-only'; + SSeekError = 'Compression stream seek error'; + SInvalidSeek = 'Invalid Compression seek operation'; + +procedure TCompressionStream.CompressBuf(const InBuf: Pointer; InBytes: Integer; + var OutBuf: Pointer; var OutBytes: Integer); +var + strm: TZStream; + P: Pointer; +begin + FillChar(strm, sizeof(strm), 0); + OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; + OutBuf:=GetMem(OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + CompressionCheck(deflateInit(strm, Z_BEST_COMPRESSION)); + try + while CompressionCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, 256); + ReallocMem(OutBuf,OutBytes); + strm.next_out := PByte(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := 256; + end; + finally + CompressionCheck(deflateEnd(strm)); + end; + ReallocMem(OutBuf,strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise; + end; +end; + + +procedure TDecompressionStream.DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; var OutBuf: Pointer; var OutBytes: Integer); +var + strm: TZStream; + P: Pointer; + BufInc: Integer; +Type + PByte = ^Byte; +begin + FillChar(strm, sizeof(strm), 0); + BufInc := (InBytes + 255) and not 255; + if OutEstimate = 0 then + OutBytes := BufInc + else + OutBytes := OutEstimate; + OutBuf:=GetMem(OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + DecompressionCheck(inflateInit(strm)); + try + while DecompressionCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, BufInc); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PByte(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := BufInc; + end; + finally + DecompressionCheck(inflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise; + end; +end; + + +// TCustomZlibStream + +constructor TCustomZLibStream.Create(Strm: TStream); +begin + inherited Create(Strm); + FStrmPos := Strm.Position; +end; + +procedure TCustomZLibStream.Progress(Sender: TObject); +begin + if Assigned(FOnProgress) then FOnProgress(Sender); +end; + + +// TCompressionStream + +constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel; + Dest: TStream; ASkipHeader : Boolean = False); +const + Levels: array [TCompressionLevel] of ShortInt = + (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION); +begin + inherited Create(Dest); + FZRec.next_out := @FBuffer[0]; + FZRec.avail_out := sizeof(FBuffer); + If ASkipHeader then + CompressionCheck(deflateInit2(FZRec, Levels[CompressionLevel],Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, 0)) + else + CompressionCheck(deflateInit(FZRec, Levels[CompressionLevel])); +end; + +destructor TCompressionStream.Destroy; +begin + FZRec.next_in := nil; + FZRec.avail_in := 0; + try + if Source.Position <> FStrmPos then Source.Position := FStrmPos; + while (CompressionCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END) + and (FZRec.avail_out = 0) do + begin + Source.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := @FBuffer[0]; + FZRec.avail_out := sizeof(FBuffer); + end; + if FZRec.avail_out < sizeof(FBuffer) then + Source.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out); + finally + deflateEnd(FZRec); + end; + inherited Destroy; +end; + +function TCompressionStream.CompressionCheck(code: Integer): Integer; +begin + Result := code; + if (code < 0) then + if code < -6 then + raise ECompressionError.CreateFmt(Errorstrings[0],[Code]) + else + raise ECompressionError.Create(ErrorStrings[Abs(Code)]); +end; + + +function TCompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + raise ECompressionError.Create('Invalid stream operation'); + result:=0; +end; + +function TCompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + FZRec.next_in := @Buffer; + FZRec.avail_in := Count; + if Source.Position <> FStrmPos then Source.Position := FStrmPos; + while (FZRec.avail_in > 0) do + begin + CompressionCheck(deflate(FZRec, 0)); + if FZRec.avail_out = 0 then + begin + Source.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := @FBuffer[0]; + FZRec.avail_out := sizeof(FBuffer); + FStrmPos := Source.Position; + Progress(Self); + end; + end; + Result := Count; +end; + +function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +begin + if (Offset = 0) and (Origin = soFromCurrent) then + Result := FZRec.total_in + else + raise ECompressionError.Create(SInvalidSeek); +end; + +function TCompressionStream.GetCompressionRate: extended; +begin + Result:=0.0; +{ With FZrec do + if total_in = 0 then + GetCompressionRate:=0.0 + else + GetCompressionRate:=1.0E2*(1.0E0-(total_out/total_in)); +} +end; + + +// TDecompressionStream + +constructor TDecompressionStream.Create(ASource: TStream; ASkipHeader : Boolean = False); +begin + inherited Create(ASource); + FZRec.next_in := @FBuffer[0]; + If ASkipHeader then + DeCompressionCheck(inflateInit2(FZRec,-MAX_WBITS)) + else + DeCompressionCheck(inflateInit(FZRec)); +end; + +destructor TDecompressionStream.Destroy; +begin + if FZRec.avail_in <> 0 then + Source.Seek(-FZRec.avail_in, soFromCurrent); + inflateEnd(FZRec); + inherited Destroy; +end; + +function TDecompressionStream.DecompressionCheck(code: Integer): Integer; +begin + Result := code; + If Code<0 then + if code < -6 then + raise EDecompressionError.CreateFmt(Errorstrings[0],[Code]) + else + raise EDecompressionError.Create(ErrorStrings[Abs(Code)]); +end; + +function TDecompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + FZRec.next_out := @Buffer; + FZRec.avail_out := Count; + if Source.Position <> FStrmPos then Source.Position := FStrmPos; + while (FZRec.avail_out > 0) do + begin + if FZRec.avail_in = 0 then + begin + FZRec.avail_in := Source.Read(FBuffer, sizeof(FBuffer)); + if FZRec.avail_in = 0 then + begin + Result := Count - FZRec.avail_out; + Exit; + end; + FZRec.next_in := @FBuffer[0]; + FStrmPos := Source.Position; + Progress(Self); + end; + if DeCompressionCheck(inflate(FZRec, 0)) = Z_STREAM_END then + begin + Result := Count - FZRec.avail_out; + Exit; + end; + end; + Result := Count; +end; + +function TDecompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + raise EDecompressionError.Create('Invalid stream operation'); + result:=0; +end; + +function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +var + I: Integer; + Buf: array [0..4095] of Char; +begin + if (Offset = 0) and (Origin = soFromBeginning) then + begin + DecompressionCheck(inflateReset(FZRec)); + FZRec.next_in := @FBuffer[0]; + FZRec.avail_in := 0; + Source.Position := 0; + FStrmPos := 0; + end + else if ( (Offset >= 0) and (Origin = soFromCurrent)) or + ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then + begin + if Origin = soFromBeginning then Dec(Offset, FZRec.total_out); + if Offset > 0 then + begin + for I := 1 to Offset div sizeof(Buf) do + ReadBuffer(Buf, sizeof(Buf)); + ReadBuffer(Buf, Offset mod sizeof(Buf)); + end; + end + else + raise EDecompressionError.Create(SInvalidSeek); + Result := FZRec.total_out; +end; + +// TGZFileStream + +Constructor TGZFileStream.Create(FileName: String;FileMode: TGZOpenMode); + +Const OpenStrings : array[TGZOpenMode] of pchar = ('rb','wb'); + +begin + FOpenMode:=FileMode; + FFile:=gzopen (PChar(FileName),Openstrings[FileMode]); + If FFile=Nil then + Raise ezlibError.CreateFmt (SCouldntOpenFIle,[FileName]); +end; + +Destructor TGZFileStream.Destroy; +begin + gzclose(FFile); + Inherited Destroy; +end; + +Function TGZFileStream.Read(Var Buffer; Count : longint): longint; +begin + If FOpenMode=gzOpenWrite then + Raise ezliberror.create(SWriteOnlyStream); + Result:=gzRead(FFile,@Buffer,Count); +end; + +function TGZFileStream.Write(const Buffer; Count: Longint): Longint; +begin + If FOpenMode=gzOpenRead then + Raise EzlibError.Create(SReadonlyStream); + Result:=gzWrite(FFile,@Buffer,Count); +end; + +function TGZFileStream.Seek(Offset: Longint; Origin: Word): Longint; +begin + Result:=gzseek(FFile,Offset,Origin); + If Result=-1 then + Raise eZlibError.Create(SSeekError); +end; + +end.