Explorar o código

Merged revisions 7034,7055,7093,7173,7462,7465,7492,7676,7687,7781,7783,7785,7815,7821,7870-7871,7885,7889-7890,7894-7898,7942,8085,8258,8291,8310,8313,8328,8360,8362,8387,8398 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r7034 | jonas | 2007-03-30 10:04:42 +0200 (Fri, 30 Mar 2007) | 2 lines

* regenerated for all platforms

........
r7055 | florian | 2007-04-01 23:04:46 +0200 (Sun, 01 Apr 2007) | 2 lines

+ OO test

........
r7093 | ivost | 2007-04-13 00:06:42 +0200 (Fri, 13 Apr 2007) | 2 lines

* added overloaded sem_timedwait function

........
r7173 | ivost | 2007-04-26 09:54:41 +0200 (Thu, 26 Apr 2007) | 2 lines

* disabled some types in pthrlinux.inc because they already exist in unixtype

........
r7462 | marco | 2007-05-25 08:44:39 +0200 (Fri, 25 May 2007) | 2 lines

* patch from Olivier

........
r7465 | marco | 2007-05-25 10:04:39 +0200 (Fri, 25 May 2007) | 2 lines

* regenned makefile

........
r7492 | daniel | 2007-05-27 22:06:58 +0200 (Sun, 27 May 2007) | 2 lines

* Add initc unit

........
r7676 | florian | 2007-06-15 23:57:46 +0200 (Fri, 15 Jun 2007) | 2 lines

+ treqsize

........
r7687 | florian | 2007-06-16 19:04:15 +0200 (Sat, 16 Jun 2007) | 2 lines

+ some types added

........
r7781 | florian | 2007-06-23 11:21:50 +0200 (Sat, 23 Jun 2007) | 2 lines

* fixed largeint declarations

........
r7783 | florian | 2007-06-23 12:00:36 +0200 (Sat, 23 Jun 2007) | 2 lines

* unified IStream and ISequentialStream declaration

........
r7785 | sekelsenmat | 2007-06-23 19:48:41 +0200 (Sat, 23 Jun 2007) | 1 line

Added carbon controls example
........
r7815 | florian | 2007-06-25 23:05:08 +0200 (Mon, 25 Jun 2007) | 2 lines

+ basic TStreamAdapter implementation

........
r7821 | marco | 2007-06-26 16:50:24 +0200 (Tue, 26 Jun 2007) | 2 lines

* more little winapi fixes (largeuint)

........
r7870 | marco | 2007-06-30 19:30:48 +0200 (Sat, 30 Jun 2007) | 3 lines

* first patch of Darius patch. Moving of demoes and dewinification still to do


........
r7871 | marco | 2007-06-30 20:03:42 +0200 (Sat, 30 Jun 2007) | 2 lines

* move demoes to demodir

........
r7885 | Almindor | 2007-07-01 11:22:04 +0200 (Sun, 01 Jul 2007) | 2 lines

* update library name of openssl to work on darwin/macosX too

........
r7889 | Almindor | 2007-07-01 11:50:32 +0200 (Sun, 01 Jul 2007) | 2 lines

* make use of library suffixes per OS because we are using LoadLibrary()

........
r7890 | Almindor | 2007-07-01 11:54:47 +0200 (Sun, 01 Jul 2007) | 2 lines

* adds examples dir with basic loadlibrary example to openssl

........
r7894 | Almindor | 2007-07-01 12:41:42 +0200 (Sun, 01 Jul 2007) | 2 lines

* adds version hack check :)

........
r7895 | marco | 2007-07-01 12:43:34 +0200 (Sun, 01 Jul 2007) | 2 lines

* Cleanup demodir.

........
r7896 | marco | 2007-07-01 12:49:46 +0200 (Sun, 01 Jul 2007) | 2 lines

* libc was compiled for x86_64. (mantis #8862)

........
r7897 | daniel | 2007-07-01 13:05:39 +0200 (Sun, 01 Jul 2007) | 2 lines

* Put pptrint back in place.

........
r7898 | marco | 2007-07-01 13:16:44 +0200 (Sun, 01 Jul 2007) | 2 lines

* forgot those

........
r7942 | michael | 2007-07-04 01:32:29 +0200 (Wed, 04 Jul 2007) | 1 line

* Implemented sqlite3dyn
........
r8085 | Almindor | 2007-07-17 21:43:37 +0200 (Tue, 17 Jul 2007) | 2 lines

* remove SDL from netBSD, openBSD, Solaris and linux x86_64/ppc (untested/not existing)

........
r8258 | jonas | 2007-08-10 22:39:02 +0200 (Fri, 10 Aug 2007) | 2 lines

* fixed #9402 and removed limitation of 4 dns servers

........
r8291 | michael | 2007-08-20 09:23:33 +0200 (Mon, 20 Aug 2007) | 1 line

* Patch from Darius Blaszijk to clean up all ifdefs so it becomes a pure fpc example.
........
r8310 | jonas | 2007-08-26 11:09:01 +0200 (Sun, 26 Aug 2007) | 2 lines

+ generated Makefile

........
r8313 | jonas | 2007-08-26 14:08:22 +0200 (Sun, 26 Aug 2007) | 3 lines

* more sdl/graph unit reordering (win32, freebsd)
* also compile sdlgraph for darwin/ppc and i386

........
r8328 | jonas | 2007-08-29 08:57:36 +0200 (Wed, 29 Aug 2007) | 2 lines

* more 64 bit overload choosing fixes

........
r8360 | jonas | 2007-09-02 23:10:38 +0200 (Sun, 02 Sep 2007) | 4 lines

* only compile unixutil for linux/i386, since it depends on
packages/base/libc, which is also only compiled for that
target

........
r8362 | jonas | 2007-09-02 23:34:49 +0200 (Sun, 02 Sep 2007) | 4 lines

* don't compile sdlutils for 64 bit platforms for now, as it needs to
be (heavily) changed for that -> also don't compile sdlgraph for
those platforms

........
r8387 | jonas | 2007-09-06 11:28:52 +0200 (Thu, 06 Sep 2007) | 2 lines

* regenerated with up-to-date fpcmake so darwin/ppc64 compiles again

........
r8398 | florian | 2007-09-07 21:30:36 +0200 (Fri, 07 Sep 2007) | 1 line

* packages part of Olivier Coursiere's BeOS patch
........

git-svn-id: branches/fixes_2_2@8456 -

peter %!s(int64=18) %!d(string=hai) anos
pai
achega
415f1c3872
Modificáronse 40 ficheiros con 10836 adicións e 2210 borrados
  1. 17 2
      .gitattributes
  2. 0 1
      packages/base/Makefile.fpc
  3. 12 2
      packages/base/httpd/examples/Makefile
  4. 14 5
      packages/base/netdb/Makefile
  5. 7 1
      packages/base/netdb/Makefile.fpc
  6. 13 14
      packages/base/netdb/netdb.pp
  7. 317 106
      packages/base/paszlib/Makefile
  8. 3 3
      packages/base/paszlib/Makefile.fpc
  9. 1986 0
      packages/base/paszlib/demo/Makefile
  10. 16 0
      packages/base/paszlib/demo/Makefile.fpc
  11. 1 2
      packages/base/paszlib/demo/example.pas
  12. 0 0
      packages/base/paszlib/demo/minigzip.pas
  13. 573 0
      packages/base/paszlib/demo/miniunz.pas
  14. 253 0
      packages/base/paszlib/demo/minizip.pas
  15. 1559 0
      packages/base/paszlib/unzip.pas
  16. 792 0
      packages/base/paszlib/zip.pas
  17. 304 0
      packages/base/paszlib/ziputils.pas
  18. 1 1
      packages/base/pthreads/fpmake.inc
  19. 18 15
      packages/base/pthreads/pthreads.pp
  20. 4 4
      packages/base/pthreads/pthrlinux.inc
  21. 60 54
      packages/base/sqlite/Makefile
  22. 1 1
      packages/base/sqlite/Makefile.fpc
  23. 576 0
      packages/base/sqlite/sqlite3.inc
  24. 2 301
      packages/base/sqlite/sqlite3.pp
  25. 7 0
      packages/base/sqlite/sqlite3dyn.pp
  26. 21 15
      packages/base/winunits/activex.pp
  27. 121 0
      packages/base/winunits/examples/OOTest.pp
  28. 261 255
      packages/base/winunits/richedit.pp
  29. 34 0
      packages/base/winunits/shlobj.pp
  30. 1 1
      packages/extra/gtk2/gtk+/gtk/gtkcontainer.inc
  31. 9 0
      packages/extra/openssl/examples/Makefile
  32. 14 0
      packages/extra/openssl/examples/test1.pas
  33. 1451 1419
      packages/extra/openssl/openssl.pas
  34. 1 0
      packages/extra/univint/Makefile.fpc
  35. 2065 0
      packages/extra/univint/examples/Makefile
  36. 22 0
      packages/extra/univint/examples/Makefile.fpc
  37. 200 0
      packages/extra/univint/examples/controldemo.pas
  38. 1 0
      rtl/inc/systemh.inc
  39. 83 0
      rtl/objpas/classes/streams.inc
  40. 16 8
      rtl/objpas/types.pp

+ 17 - 2
.gitattributes

@@ -1418,7 +1418,12 @@ packages/base/paszlib/Makefile svneol=native#text/plain
 packages/base/paszlib/Makefile.fpc svneol=native#text/plain
 packages/base/paszlib/adler.pas svneol=native#text/plain
 packages/base/paszlib/changes.txt svneol=native#text/plain
-packages/base/paszlib/example.pas svneol=native#text/plain
+packages/base/paszlib/demo/Makefile svneol=native#text/plain
+packages/base/paszlib/demo/Makefile.fpc svneol=native#text/plain
+packages/base/paszlib/demo/example.pas svneol=native#text/plain
+packages/base/paszlib/demo/minigzip.pas svneol=native#text/plain
+packages/base/paszlib/demo/miniunz.pas svneol=native#text/plain
+packages/base/paszlib/demo/minizip.pas svneol=native#text/plain
 packages/base/paszlib/fpmake.inc svneol=native#text/plain
 packages/base/paszlib/fpmake.pp svneol=native#text/plain
 packages/base/paszlib/gzio.pas svneol=native#text/plain
@@ -1427,15 +1432,17 @@ packages/base/paszlib/infcodes.pas svneol=native#text/plain
 packages/base/paszlib/inffast.pas svneol=native#text/plain
 packages/base/paszlib/inftrees.pas svneol=native#text/plain
 packages/base/paszlib/infutil.pas svneol=native#text/plain
-packages/base/paszlib/minigzip.pas svneol=native#text/plain
 packages/base/paszlib/paszlib.pas svneol=native#text/plain
 packages/base/paszlib/readme.txt svneol=native#text/plain
 packages/base/paszlib/trees.pas svneol=native#text/plain
+packages/base/paszlib/unzip.pas svneol=native#text/plain
 packages/base/paszlib/zbase.pas svneol=native#text/plain
 packages/base/paszlib/zcompres.pas svneol=native#text/plain
 packages/base/paszlib/zconf.inc svneol=native#text/plain
 packages/base/paszlib/zdeflate.pas svneol=native#text/plain
 packages/base/paszlib/zinflate.pas svneol=native#text/plain
+packages/base/paszlib/zip.pas svneol=native#text/plain
+packages/base/paszlib/ziputils.pas svneol=native#text/plain
 packages/base/paszlib/zuncompr.pas svneol=native#text/plain
 packages/base/postgres/Makefile svneol=native#text/plain
 packages/base/postgres/Makefile.fpc svneol=native#text/plain
@@ -1472,8 +1479,10 @@ packages/base/sqlite/Makefile.fpc svneol=native#text/plain
 packages/base/sqlite/fpmake.inc svneol=native#text/plain
 packages/base/sqlite/fpmake.pp svneol=native#text/plain
 packages/base/sqlite/sqlite.pp svneol=native#text/plain
+packages/base/sqlite/sqlite3.inc svneol=native#text/plain
 packages/base/sqlite/sqlite3.pp svneol=native#text/plain
 packages/base/sqlite/sqlite3db.pas svneol=native#text/x-pascal
+packages/base/sqlite/sqlite3dyn.pp svneol=native#text/plain
 packages/base/sqlite/sqlitedb.pas svneol=native#text/plain
 packages/base/sqlite/test.pas svneol=native#text/plain
 packages/base/sqlite/testapiv3x.README -text
@@ -1486,6 +1495,7 @@ packages/base/winunits/comconst.pp svneol=native#text/plain
 packages/base/winunits/commctrl.pp svneol=native#text/plain
 packages/base/winunits/comobj.pp svneol=native#text/plain
 packages/base/winunits/examples/OOHelper.pp svneol=native#text/plain
+packages/base/winunits/examples/OOTest.pp -text svneol=unset#text/plain
 packages/base/winunits/examples/testcom1.pp svneol=native#text/plain
 packages/base/winunits/examples/testcom2.pp svneol=native#text/plain
 packages/base/winunits/examples/testver.pp svneol=native#text/plain
@@ -3026,6 +3036,8 @@ packages/extra/opengl/tinygl.inc -text
 packages/extra/opengl/tinyglh.inc -text
 packages/extra/openssl/Makefile svneol=native#text/plain
 packages/extra/openssl/Makefile.fpc svneol=native#text/plain
+packages/extra/openssl/examples/Makefile svneol=native#text/plain
+packages/extra/openssl/examples/test1.pas svneol=native#text/plain
 packages/extra/openssl/fpmake.inc svneol=native#text/plain
 packages/extra/openssl/fpmake.pp svneol=native#text/plain
 packages/extra/openssl/openssl.pas -text svneol=unset#text/plain
@@ -3777,6 +3789,9 @@ packages/extra/univint/UnicodeUtilities.pas svneol=native#text/plain
 packages/extra/univint/UniversalAccess.pas svneol=native#text/plain
 packages/extra/univint/Video.pas svneol=native#text/plain
 packages/extra/univint/WorldScript.pas svneol=native#text/plain
+packages/extra/univint/examples/Makefile svneol=native#text/plain
+packages/extra/univint/examples/Makefile.fpc -text
+packages/extra/univint/examples/controldemo.pas -text
 packages/extra/univint/fenv.pas svneol=native#text/plain
 packages/extra/univint/fp.pas svneol=native#text/plain
 packages/extra/univint/vBLAS.pas svneol=native#text/plain

+ 0 - 1
packages/base/Makefile.fpc

@@ -5,7 +5,6 @@
 [target]
 dirs=hash paszlib pasjpeg regexpr netdb
 dirs_i386_linux=libc
-dirs_x86_64_linux=libc
 dirs_linux=gdbint libasync mysql ibase postgres oracle odbc \
             pthreads sqlite imagemagick dbus httpd
 dirs_win32=gdbint mysql ibase odbc sqlite postgres oracle imagemagick httpd winunits

+ 12 - 2
packages/base/httpd/examples/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/29]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/22]
 #
 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 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-darwin powerpc64-embedded
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
@@ -380,6 +380,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_PROGRAMS+=mod_example  mod_hello  mod_spelling  testmodule
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_PROGRAMS+=mod_example  mod_hello  mod_spelling  testmodule
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_PROGRAMS+=mod_example  mod_hello  mod_spelling  testmodule
 endif
@@ -533,6 +536,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_UNITS+=minimain
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=minimain
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_UNITS+=minimain
 endif
@@ -1516,6 +1522,10 @@ ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HTTPD/HTTPD-2.2=1
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HTTPD/HTTPD-2.2=1
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HTTPD/HTTPD-2.2=1

+ 14 - 5
packages/base/netdb/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/29]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/07/29]
 #
 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 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-darwin powerpc64-embedded
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
@@ -231,7 +231,7 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 override PACKAGE_NAME=netdb
-override PACKAGE_VERSION=2.2.1
+override PACKAGE_VERSION=2.0.0
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_UNITS+=uriparser  netdb
 endif
@@ -248,7 +248,7 @@ ifeq ($(FULL_TARGET),i386-freebsd)
 override TARGET_UNITS+=uriparser  netdb
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=uriparser
+override TARGET_UNITS+=uriparser  netdb netdb
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 override TARGET_UNITS+=uriparser  netdb
@@ -382,6 +382,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_UNITS+=uriparser  netdb
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=uriparser  netdb
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_UNITS+=uriparser
 endif
@@ -401,7 +404,7 @@ ifeq ($(FULL_TARGET),i386-freebsd)
 override TARGET_EXAMPLES+=testuri  testdns testhst testsvc testnet testhosts
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_EXAMPLES+=testuri
+override TARGET_EXAMPLES+=testuri  testdns testhst testsvc testnet testhosts testdns testhst testsvc testnet testhosts
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 override TARGET_EXAMPLES+=testuri  testdns testhst testsvc testnet testhosts
@@ -535,6 +538,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 override TARGET_EXAMPLES+=testuri  testdns testhst testsvc testnet testhosts
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_EXAMPLES+=testuri  testdns testhst testsvc testnet testhosts
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_EXAMPLES+=testuri
 endif
@@ -1437,6 +1443,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 endif

+ 7 - 1
packages/base/netdb/Makefile.fpc

@@ -4,22 +4,26 @@
 
 [package]
 name=netdb
-version=2.2.1
+version=2.0.0
 
 [target]
 units=uriparser
 units_linux=netdb
+units_beos=netdb
 units_freebsd=netdb
 units_openbsd=netdb
 units_netbsd=netdb
 units_darwin=netdb
 units_solaris=netdb
+units_beos=netdb
 examples_linux=testdns testhst testsvc testnet testhosts
+examples_beos=testdns testhst testsvc testnet testhosts
 examples_freebsd=testdns testhst testsvc testnet testhosts
 examples_openbsd=testdns testhst testsvc testnet testhosts
 examples_netbsd=testdns testhst testsvc testnet testhosts
 examples_darwin=testdns testhst testsvc testnet testhosts
 examples_solaris=testdns testhst testsvc testnet testhosts
+examples_beos=testdns testhst testsvc testnet testhosts
 examples=testuri
 
 [require]
@@ -33,3 +37,5 @@ fpcdir=../../..
 [rules]
 .NOTPARALLEL:
 
+
+

+ 13 - 14
packages/base/netdb/netdb.pp

@@ -38,7 +38,6 @@ Type
 
 Const
   DNSPort        = 53;
-  MaxServers     = 4;
   MaxResolveAddr = 10;
   SResolveFile   = '/etc/resolv.conf';
   SServicesFile  = '/etc/services'; 
@@ -50,7 +49,7 @@ Const
   MaxIP4Mapped = 10;
   
 Type
-  TDNSServerArray = Array[1..MaxServers] of THostAddr;
+  TDNSServerArray = Array of THostAddr;
   TServiceEntry = record
     Name     : String;
     Protocol : String;
@@ -96,7 +95,6 @@ Type
 
 Var  
   DNSServers            : TDNSServerArray;
-  DNSServerCount        : Integer;
   DefaultDomainList     : String;
   CheckResolveFileAge   : Boolean; 
   CheckHostsFileAge     : Boolean; 
@@ -482,13 +480,15 @@ begin
           H:=HostToNet(StrToHostAddr(L));
           If (H.s_bytes[1]<>0) then
             begin
-            Inc(Result);
+            setlength(DNSServers,Result+1);
             DNSServers[Result]:=H;
+            Inc(Result);
             end
           else if FindHostEntryInHostsFile(L,H,E) then
             begin
-            Inc(Result);
+            setlength(DNSServers,Result+1);
             DNSServers[Result]:=E.Addr;
+            Inc(Result);
             end;
           end
         else if CheckDirective('domain') then
@@ -499,7 +499,6 @@ begin
   Finally
     Close(R);
   end;    
-  DNSServerCount:=Result;
 end;
 
 Procedure CheckResolveFile;
@@ -834,9 +833,9 @@ Var
 
 begin
   CheckResolveFile;
-  I:=1;
+  I:=0;
   Result:=0;
-  While (Result<=0) and (I<=DNSServerCount) do
+  While (Result<=0) and (I<=high(DNSServers)) do
     begin
     Result:=ResolveNameAt(I,HostName,Addresses,0);
     Inc(I);
@@ -916,9 +915,9 @@ var
   i: Integer;
 begin
   CheckResolveFile;
-  i := 1;
+  i := 0;
   Result := 0;
-  while (Result <= 0) and (I<= DNSServerCount) do begin
+  while (Result <= 0) and (I<= high(DNSServers)) do begin
     Result := ResolveNameAt6(I, Hostname, Addresses, 0);
     Inc(i);
   end;
@@ -969,11 +968,11 @@ Var
   
 begin
   CheckResolveFile;
-  I:=1;
+  I:=0;
   Result:=0;
   nt:=hosttonet(hostaddr);
   S:=Format('%d.%d.%d.%d.in-addr.arpa',[nt.s_bytes[4],nt.s_bytes[3],nt.s_bytes[2],nt.s_bytes[1]]);
-  While (Result=0) and (I<=DNSServerCount) do
+  While (Result=0) and (I<=high(DNSServers)) do
     begin
     Result:=ResolveAddressAt(I,S,Addresses);
     Inc(I);
@@ -999,8 +998,8 @@ begin
     S[1+(7-i)*8] := hexdig[1+(HostAddr.u6_addr16[i] and $0F00) shr 08];
     S[3+(7-i)*8] := hexdig[1+(HostAddr.u6_addr16[i] and $F000) shr 12];
   end;
-  I := 1;
-  While (Result=0) and (I<=DNSServerCount) do
+  I := 0;
+  While (Result=0) and (I<=high(DNSServers)) do
     begin
     Result:=ResolveAddressAt(I,S,Addresses);
     Inc(I);

+ 317 - 106
packages/base/paszlib/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/29]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/22]
 #
 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 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-darwin powerpc64-embedded
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
@@ -231,312 +231,318 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 override PACKAGE_NAME=paszlib
-override PACKAGE_VERSION=2.2.1
+override PACKAGE_VERSION=2.2.0
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
+override TARGET_UNITS+=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
 endif
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_EXAMPLEDIRS+=demo
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_EXAMPLES+=example minigzip
+override TARGET_EXAMPLEDIRS+=demo
 endif
 override INSTALL_FPCPACKAGE=y
 ifdef REQUIRE_UNITSDIR
@@ -1487,6 +1493,10 @@ ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HASH=1
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_HASH=1
@@ -2122,6 +2132,207 @@ endif
 fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
 fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
 fpc_makefiles: fpc_makefile fpc_makefile_dirs
+ifeq ($(FULL_TARGET),i386-linux)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+TARGET_EXAMPLEDIRS_DEMO=1
+endif
+ifdef TARGET_EXAMPLEDIRS_DEMO
+demo_all:
+	$(MAKE) -C demo all
+demo_debug:
+	$(MAKE) -C demo debug
+demo_smart:
+	$(MAKE) -C demo smart
+demo_release:
+	$(MAKE) -C demo release
+demo_units:
+	$(MAKE) -C demo units
+demo_examples:
+	$(MAKE) -C demo examples
+demo_shared:
+	$(MAKE) -C demo shared
+demo_install:
+	$(MAKE) -C demo install
+demo_sourceinstall:
+	$(MAKE) -C demo sourceinstall
+demo_exampleinstall:
+	$(MAKE) -C demo exampleinstall
+demo_distinstall:
+	$(MAKE) -C demo distinstall
+demo_zipinstall:
+	$(MAKE) -C demo zipinstall
+demo_zipsourceinstall:
+	$(MAKE) -C demo zipsourceinstall
+demo_zipexampleinstall:
+	$(MAKE) -C demo zipexampleinstall
+demo_zipdistinstall:
+	$(MAKE) -C demo zipdistinstall
+demo_clean:
+	$(MAKE) -C demo clean
+demo_distclean:
+	$(MAKE) -C demo distclean
+demo_cleanall:
+	$(MAKE) -C demo cleanall
+demo_info:
+	$(MAKE) -C demo info
+demo_makefiles:
+	$(MAKE) -C demo makefiles
+demo:
+	$(MAKE) -C demo all
+.PHONY: demo_all demo_debug demo_smart demo_release demo_units demo_examples demo_shared demo_install demo_sourceinstall demo_exampleinstall demo_distinstall demo_zipinstall demo_zipsourceinstall demo_zipexampleinstall demo_zipdistinstall demo_clean demo_distclean demo_cleanall demo_info demo_makefiles demo
+endif
 all: fpc_all
 debug: fpc_debug
 smart: fpc_smart
@@ -2137,7 +2348,7 @@ zipinstall: fpc_zipinstall
 zipsourceinstall: fpc_zipsourceinstall
 zipexampleinstall: fpc_zipexampleinstall
 zipdistinstall: fpc_zipdistinstall
-clean: fpc_clean
+clean: fpc_clean $(addsuffix _clean,$(TARGET_EXAMPLEDIRS))
 distclean: fpc_distclean
 cleanall: fpc_cleanall
 info: fpc_info

+ 3 - 3
packages/base/paszlib/Makefile.fpc

@@ -4,14 +4,14 @@
 
 [package]
 name=paszlib
-version=2.2.1
+version=2.2.0
 
 [require]
 packages=hash
 
 [target]
-units=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr
-examples=example minigzip
+units=paszlib adler gzio infblock infcodes inffast inftrees infutil trees zcompres zdeflate zinflate zbase zuncompr zip ziputils unzip
+exampledirs=demo
 
 [install]
 fpcpackage=y

+ 1986 - 0
packages/base/paszlib/demo/Makefile

@@ -0,0 +1,1986 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/06/20]
+#
+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-darwin powerpc64-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../../../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPC:=$(shell $(FPCPROG) -PB)
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_PROGRAMS+=minigzip example minizip  miniunz
+endif
+override INSTALL_FPCPACKAGE=y
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl paszlib
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_HASH
+PACKAGEDIR_HASH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /hash/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_HASH),)
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)),)
+UNITDIR_HASH=$(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)
+else
+UNITDIR_HASH=$(PACKAGEDIR_HASH)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_HASH)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_HASH) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_HASH)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_HASH=
+UNITDIR_HASH:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /hash/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_HASH),)
+UNITDIR_HASH:=$(firstword $(UNITDIR_HASH))
+else
+UNITDIR_HASH=
+endif
+endif
+ifdef UNITDIR_HASH
+override COMPILER_UNITDIR+=$(UNITDIR_HASH)
+endif
+endif
+ifdef REQUIRE_PACKAGES_PASZLIB
+PACKAGEDIR_PASZLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_PASZLIB),)
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)),)
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)
+else
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_PASZLIB)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_PASZLIB) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_PASZLIB)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_PASZLIB=
+UNITDIR_PASZLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_PASZLIB),)
+UNITDIR_PASZLIB:=$(firstword $(UNITDIR_PASZLIB))
+else
+UNITDIR_PASZLIB=
+endif
+endif
+ifdef UNITDIR_PASZLIB
+override COMPILER_UNITDIR+=$(UNITDIR_PASZLIB)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX) 
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+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 OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_exes
+ifndef CROSSINSTALL
+ifneq ($(TARGET_PROGRAMS),)
+override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
+override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS)))
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+ifeq ($(OS_TARGET),emx)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+endif
+endif
+fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif

+ 16 - 0
packages/base/paszlib/demo/Makefile.fpc

@@ -0,0 +1,16 @@
+#
+#  Makefile.fpc for paszlib units example
+#
+
+[target]
+programs=minigzip example minizip  miniunz
+
+[require]
+packages=paszlib
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../../../..
+

+ 1 - 2
packages/base/paszlib/example.pas → packages/base/paszlib/demo/example.pas

@@ -18,7 +18,6 @@ program example;
 
 uses
   strings,
-  zutil,
   zbase,
   gzio,
   zinflate,
@@ -390,7 +389,7 @@ begin
   err := deflate(c_stream, Z_FULL_FLUSH);
   CHECK_ERR(err, 'deflate');
 
-  Inc(pzByteArray(compr)^[3]); { force an error in first compressed block }
+  Inc(pchar(compr)[3]); { force an error in first compressed block }
   c_stream.avail_in := len - 3;
 
   err := deflate(c_stream, Z_FINISH);

+ 0 - 0
packages/base/paszlib/minigzip.pas → packages/base/paszlib/demo/minigzip.pas


+ 573 - 0
packages/base/paszlib/demo/miniunz.pas

@@ -0,0 +1,573 @@
+program MiniUnz;
+
+{ mini unzip demo package by Gilles Vollant
+
+  Usage : miniunz [-exvlo] file.zip [file_to_extract]
+
+  -l or -v list the content of the zipfile.
+        -e extract a specific file or all files if [file_to_extract] is missing
+        -x like -e, but extract without path information
+        -o overwrite an existing file without warning
+
+  Pascal tranlastion
+  Copyright (C) 2000 by Jacques Nomssi Nzali
+  For conditions of distribution and use, see copyright notice in readme.txt
+}{$ifdef WIN32}
+  {$define Delphi}
+  {$ifndef FPC}
+    {$define Delphi32}
+  {$endif}
+{$endif}
+
+uses
+  sysutils,
+  {$ifdef Delphi}
+  Windows,
+  {$else}
+   zlib,ctypes,
+  {$endif}
+  ziputils,
+  unzip;
+
+const
+  CASESENSITIVITY = 0;
+  WRITEBUFFERSIZE = 8192;
+
+
+{ change_file_date : change the date/time of a file
+    filename : the filename of the file where date/time must be modified
+    dosdate : the new date at the MSDos format (4 bytes)
+    tmu_date : the SAME new date at the tm_unz format }
+
+  procedure change_file_date(const filename: PChar; dosdate: longword; tmu_date: tm_unz);
+{$ifdef Delphi32}
+  var
+    hFile: THandle;
+    ftm, ftLocal, ftCreate, ftLastAcc, ftLastWrite: TFileTime;
+  begin
+    hFile := CreateFile(filename, GENERIC_READ or GENERIC_WRITE,
+      0, nil, OPEN_EXISTING, 0, 0);
+    GetFileTime(hFile, @ftCreate, @ftLastAcc, @ftLastWrite);
+    DosDateTimeToFileTime(word((dosdate shl 16)), word(dosdate), ftLocal);
+    LocalFileTimeToFileTime(ftLocal, ftm);
+    SetFileTime(hFile, @ftm, @ftLastAcc, @ftm);
+    CloseHandle(hFile);
+  end;
+
+{$else}
+{$if defined(FPC) and defined(win32)}
+var
+  hFile : THandle;
+  ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite : TFileTime;
+begin
+  hFile := CreateFile(filename,GENERIC_READ or GENERIC_WRITE,
+                      0,NIL,OPEN_EXISTING,0,0);
+  GetFileTime(hFile, @ftCreate, @ftLastAcc, @ftLastWrite);
+  DosDateTimeToFileTime(WORD((dosdate shl 16)), WORD(dosdate), @ftLocal);
+  LocalFileTimeToFileTime(ftLocal, @ftm);
+  SetFileTime(hFile,ftm, ftLastAcc, ftm);
+  CloseHandle(hFile);
+end;
+  {$else} {  msdos }
+begin
+  FileSetDate(filename,dosdate);
+end;
+  {$endif}
+{$endif}
+
+
+{ mymkdir and change_file_date are not 100 % portable
+  As I don't know well Unix, I wait feedback for the unix portion }
+
+  function mymkdir(dirname: PChar): boolean;
+  var
+    S: string;
+  begin
+    S := StrPas(dirname);
+  {$I-}
+    mkdir(S);
+    mymkdir := IOresult = 0;
+  end;
+
+  function makedir(newdir: PChar): boolean;
+  var
+    buffer: PChar;
+    p:      PChar;
+    len:    cint;
+  var
+    hold:   char;
+  begin
+    makedir := False;
+    len     := strlen(newdir);
+
+    if (len <= 0) then
+      exit;
+
+    buffer := PChar(allocmem( len + 1));
+
+    strcopy(buffer, newdir);
+
+    if (buffer[len - 1] = '/') then
+      buffer[len - 1] := #0;
+
+    if mymkdir(buffer) then
+    begin
+      if Assigned(buffer) then
+        freemem( buffer);
+      makedir := True;
+      exit;
+    end;
+
+    p := buffer + 1;
+    while True do
+    begin
+      while ((p^ <> #0) and (p^ <> '\') and (p^ <> '/')) do
+        Inc(p);
+      hold := p^;
+      p^   := #0;
+      if (not mymkdir(buffer)) {and (errno = ENOENT)} then
+      begin
+        WriteLn('couldn''t create directory ', buffer);
+        if Assigned(buffer) then
+          freemem( buffer);
+        exit;
+      end;
+      if (hold = #0) then
+        break;
+      p^ := hold;
+      Inc(p);
+    end;
+    if Assigned(buffer) then
+      freemem( buffer);
+    makedir := True;
+  end;
+
+  procedure do_banner;
+  begin
+    WriteLn('MiniUnz 0.15, demo package written by Gilles Vollant');
+    WriteLn('Pascal port by Jacques Nomssi Nzali');
+    WriteLn('more info at http://wwww.tu-chemnitz.de/~nomssi/paszlib.html');
+    WriteLn;
+  end;
+
+  procedure do_help;
+  begin
+    WriteLn('Usage : miniunz [-exvlo] file.zip [file_to_extract]');
+    WriteLn;
+  end;
+
+  function LeadingZero(w: word): string;
+  var
+    s: string;
+  begin
+    Str(w: 0, s);
+    if Length(s) = 1 then
+      s := '0' + s;
+    LeadingZero := s;
+  end;
+
+  function HexToStr(w: clong): string;
+  const
+    ByteToChar: array[0..$F] of char = '0123456789ABCDEF';
+  var
+    s: string;
+    i: cint;
+    x: clong;
+  begin
+    s := '';
+    x := w;
+    for i := 0 to 3 do
+    begin
+      s := ByteToChar[byte(x) shr 4] + ByteToChar[byte(x) and $F] + s;
+      x := x shr 8;
+    end;
+    HexToStr := s;
+  end;
+
+  function do_list(uf: unzFile): cint;
+  var
+    i:      longword;
+    gi:     unz_global_info;
+    err:    cint;
+  var
+    filename_inzip: array[0..255] of char;
+    file_info: unz_file_info;
+    ratio:  longword;
+    string_method: string[255];
+  var
+    iLevel: cuInt;
+  begin
+    err := unzGetGlobalInfo(uf, gi);
+    if (err <> UNZ_OK) then
+      WriteLn('error ', err, ' with zipfile in unzGetGlobalInfo');
+    WriteLn(' Length  Method   Size  Ratio   Date    Time   CRC-32     Name');
+    WriteLn(' ------  ------   ----  -----   ----    ----   ------     ----');
+    for i := 0 to gi.number_entry - 1 do
+    begin
+      ratio := 0;
+      err   := unzGetCurrentFileInfo(uf, @file_info, filename_inzip, sizeof(filename_inzip), nil, 0, nil, 0);
+      if (err <> UNZ_OK) then
+      begin
+        WriteLn('error ', err, ' with zipfile in unzGetCurrentFileInfo');
+        break;
+      end;
+      if (file_info.uncompressed_size > 0) then
+        ratio := (file_info.compressed_size * 100) div file_info.uncompressed_size;
+
+      if (file_info.compression_method = 0) then
+        string_method := 'Stored'
+      else
+      if (file_info.compression_method = Z_DEFLATED) then
+      begin
+        iLevel := cuInt((file_info.flag and $06) div 2);
+        case iLevel of
+          0: string_method    := 'Defl:N';
+          1: string_method    := 'Defl:X';
+          2, 3: string_method := 'Defl:F'; { 2:fast , 3 : extra fast}
+          else
+            string_method := 'Unkn. ';
+        end;
+      end;
+
+      WriteLn(file_info.uncompressed_size: 7, '  ',
+        string_method: 6, ' ',
+        file_info.compressed_size: 7, ' ',
+        ratio: 3, '%  ', LeadingZero(longword(file_info.tmu_date.tm_mon) + 1), '-',
+        LeadingZero(longword(file_info.tmu_date.tm_mday)): 2, '-',
+        LeadingZero(longword(file_info.tmu_date.tm_year mod 100)): 2, '  ',
+        LeadingZero(longword(file_info.tmu_date.tm_hour)), ':',
+        LeadingZero(longword(file_info.tmu_date.tm_min)), '  ',
+        HexToStr(longword(file_info.crc)), '  ',
+        filename_inzip);
+
+      if ((i + 1) < gi.number_entry) then
+      begin
+        err := unzGoToNextFile(uf);
+        if (err <> UNZ_OK) then
+        begin
+          WriteLn('error ', err, ' with zipfile in unzGoToNextFile');
+          break;
+        end;
+      end;
+    end;
+
+    do_list := 0;
+  end;
+
+
+  function do_extract_currentfile(uf: unzFile; const popt_extract_without_path: cint; var popt_overwrite: cint): cint;
+  var
+    filename_inzip: packed array[0..255] of char;
+    filename_withoutpath: PChar;
+    p:      PChar;
+    err:    cint;
+    fout:   FILEptr;
+    buf:    pointer;
+    size_buf: cuInt;
+    file_info: unz_file_info;
+  var
+    write_filename: PChar;
+    skip:   cint;
+  var
+    rep:    char;
+    ftestexist: FILEptr;
+  var
+    answer: string[127];
+  var
+    c:      char;
+  begin
+    fout := nil;
+
+    err := unzGetCurrentFileInfo(uf, @file_info, filename_inzip,
+      sizeof(filename_inzip), nil, 0, nil, 0);
+
+    if (err <> UNZ_OK) then
+    begin
+      WriteLn('error ', err, ' with zipfile in unzGetCurrentFileInfo');
+      do_extract_currentfile := err;
+      exit;
+    end;
+
+    size_buf := WRITEBUFFERSIZE;
+    buf      := allocmem(size_buf);
+    if (buf = nil) then
+    begin
+      WriteLn('Error allocating memory');
+      do_extract_currentfile := UNZ_INTERNALERROR;
+      exit;
+    end;
+
+    filename_withoutpath := filename_inzip;
+    p := filename_withoutpath;
+    while (p^ <> #0) do
+    begin
+      if (p^ = '/') or (p^ = '\') then
+        filename_withoutpath := p + 1;
+      Inc(p);
+    end;
+
+    if (filename_withoutpath^ = #0) then
+    begin
+      if (popt_extract_without_path = 0) then
+      begin
+        WriteLn('creating directory: ', filename_inzip);
+        mymkdir(filename_inzip);
+      end;
+    end
+    else
+    begin
+
+      skip := 0;
+      if (popt_extract_without_path = 0) then
+        write_filename := filename_inzip
+      else
+        write_filename := filename_withoutpath;
+
+      err := unzOpenCurrentFile(uf);
+      if (err <> UNZ_OK) then
+        WriteLn('error ', err, ' with zipfile in unzOpenCurrentFile');
+
+
+      if ((popt_overwrite = 0) and (err = UNZ_OK)) then
+      begin
+        rep := #0;
+
+        ftestexist := fopen(write_filename, fopenread);
+        if (ftestexist <> nil) then
+        begin
+          fclose(ftestexist);
+          repeat
+            Write('The file ', write_filename,
+              ' exist. Overwrite ? [y]es, [n]o, [A]ll: ');
+            ReadLn(answer);
+
+            rep := answer[1];
+            if ((rep >= 'a') and (rep <= 'z')) then
+              Dec(rep, $20);
+          until (rep = 'Y') or (rep = 'N') or (rep = 'A');
+        end;
+
+        if (rep = 'N') then
+          skip := 1;
+
+        if (rep = 'A') then
+          popt_overwrite := 1;
+      end;
+
+      if (skip = 0) and (err = UNZ_OK) then
+      begin
+        fout := fopen(write_filename, fopenwrite);
+
+        { some zipfile don't contain directory alone before file }
+        if (fout = nil) and (popt_extract_without_path = 0) and
+          (filename_withoutpath <> PChar(@filename_inzip)) then
+        begin
+          c := (filename_withoutpath - 1)^;
+          (filename_withoutpath -1)^ := #0;
+          makedir(write_filename);
+          (filename_withoutpath -1)^ := c;
+          fout := fopen(write_filename, fopenwrite);
+        end;
+
+        if (fout = nil) then
+          WriteLn('error opening ', write_filename);
+      end;
+
+      if (fout <> nil) then
+      begin
+        WriteLn(' extracting: ', write_filename);
+
+        repeat
+          err := unzReadCurrentFile(uf, buf, size_buf);
+          if (err < 0) then
+          begin
+            WriteLn('error ', err, ' with zipfile in unzReadCurrentFile');
+            break;
+          end;
+          if (err > 0) then
+            if (fwrite(buf, err, 1, fout) <> 1) then
+            begin
+              WriteLn('error in writing extracted file');
+              err := UNZ_ERRNO;
+              break;
+            end;
+        until (err = 0);
+        fclose(fout);
+        if (err = 0) then
+          change_file_date(write_filename, file_info.dosDate,
+            file_info.tmu_date);
+      end;
+
+      if (err = UNZ_OK) then
+      begin
+        err := unzCloseCurrentFile(uf);
+        if (err <> UNZ_OK) then
+          WriteLn('error ', err, ' with zipfile in unzCloseCurrentFile')
+        else
+          unzCloseCurrentFile(uf); { don't lose the error }
+      end;
+    end;
+
+    if buf <> nil then
+      freemem( buf);
+    do_extract_currentfile := err;
+  end;
+
+
+  function do_extract(uf: unzFile; opt_extract_without_path: cint; opt_overwrite: cint): cint;
+  var
+    i:   longword;
+    gi:  unz_global_info;
+    err: cint;
+  begin
+    err := unzGetGlobalInfo(uf, gi);
+    if (err <> UNZ_OK) then
+      WriteLn('error ', err, ' with zipfile in unzGetGlobalInfo ');
+
+    for i := 0 to gi.number_entry - 1 do
+    begin
+      if (do_extract_currentfile(uf, opt_extract_without_path,
+        opt_overwrite) <> UNZ_OK) then
+        break;
+
+      if ((i + 1) < gi.number_entry) then
+      begin
+        err := unzGoToNextFile(uf);
+        if (err <> UNZ_OK) then
+        begin
+          WriteLn('error ', err, ' with zipfile in unzGoToNextFile');
+          break;
+        end;
+      end;
+    end;
+
+    do_extract := 0;
+  end;
+
+  function do_extract_onefile(uf: unzFile; const filename: PChar; opt_extract_without_path: cint; opt_overwrite: cint): cint;
+  begin
+    if (unzLocateFile(uf, filename, CASESENSITIVITY) <> UNZ_OK) then
+    begin
+      WriteLn('file ', filename, ' not found in the zipfile');
+      do_extract_onefile := 2;
+      exit;
+    end;
+
+    if (do_extract_currentfile(uf, opt_extract_without_path,
+      opt_overwrite) = UNZ_OK) then
+      do_extract_onefile := 0
+    else
+      do_extract_onefile := 1;
+  end;
+
+  { -------------------------------------------------------------------- }
+  function main: cint;
+  const
+    zipfilename: PChar = nil;
+    filename_to_extract: PChar = nil;
+  var
+    i:    cint;
+    opt_do_list: cint;
+    opt_do_extract: cint;
+    opt_do_extract_withoutpath: cint;
+    opt_overwrite: cint;
+    filename_try: array[0..512 - 1] of char;
+    uf:   unzFile;
+  var
+    p:    cint;
+    pstr: string[255];
+    c:    char;
+  begin
+    opt_do_list := 0;
+    opt_do_extract := 1;
+    opt_do_extract_withoutpath := 0;
+    opt_overwrite := 0;
+    uf := nil;
+
+    do_banner;
+    if (ParamCount = 0) then
+    begin
+      do_help;
+      Halt(0);
+    end
+    else
+      for i := 1 to ParamCount do
+      begin
+        pstr := ParamStr(i);
+        if pstr[1] = '-' then
+          for p := 2 to Length(pstr) do
+          begin
+            c := pstr[p];
+            case UpCase(c) of
+              'L',
+              'V': opt_do_list    := 1;
+              'X': opt_do_extract := 1;
+              'E':
+              begin
+                opt_do_extract := 1;
+                opt_do_extract_withoutpath := 1;
+              end;
+              'O': opt_overwrite := 1;
+            end;
+          end
+        else
+        begin
+          pstr := pstr + #0;
+          if (zipfilename = nil) then
+            zipfilename := StrNew(PChar(@pstr[1]))
+          else
+          if (filename_to_extract = nil) then
+            filename_to_extract := StrNew(PChar(@pstr[1]));
+        end;
+      end{ for };
+
+    if (zipfilename <> nil) then
+    begin
+      strcopy(filename_try, zipfilename);
+      uf := unzOpen(zipfilename);
+      if (uf = nil) then
+      begin
+        strcat(filename_try, '.zip');
+        uf := unzOpen(filename_try);
+      end;
+    end;
+
+    if (uf = nil) then
+    begin
+      WriteLn('Cannot open ', zipfilename, ' or ', zipfilename, '.zip');
+      Halt(1);
+    end;
+
+    WriteLn(filename_try, ' opened');
+
+    if (opt_do_list = 1) then
+    begin
+      main := do_list(uf);
+      exit;
+    end
+    else
+    if (opt_do_extract = 1) then
+      if (filename_to_extract = nil) then
+      begin
+        main := do_extract(uf, opt_do_extract_withoutpath, opt_overwrite);
+        exit;
+      end
+      else
+      begin
+        main := do_extract_onefile(uf, filename_to_extract,
+          opt_do_extract_withoutpath, opt_overwrite);
+        exit;
+      end;
+
+    unzCloseCurrentFile(uf);
+
+    strDispose(zipfilename);
+    strDispose(filename_to_extract);
+    main := 0;
+  end;
+
+begin
+  main;
+  Write('Done...');
+  Readln;
+end.

+ 253 - 0
packages/base/paszlib/demo/minizip.pas

@@ -0,0 +1,253 @@
+program MiniZip;
+
+{ minizip demo package by Gilles Vollant
+
+  Usage : minizip [-o] file.zip [files_to_add]
+
+  a file.zip file is created, all files listed in [files_to_add] are added
+  to the new .zip file.
+  -o an existing .zip file with be overwritten without warning
+
+  Pascal tranlastion
+  Copyright (C) 2000 by Jacques Nomssi Nzali
+  For conditions of distribution and use, see copyright notice in readme.txt
+}
+
+uses
+  SysUtils, zlib, ctypes, ziputils, zip;
+
+const
+  WRITEBUFFERSIZE = Z_BUFSIZE;
+  MAXFILENAME     = Z_MAXFILENAMEINZIP;
+
+  function filetime(f: PChar;               { name of file to get info on }
+    var tmzip: tm_zip): cuLong;             { return value: access, modific. and creation times }
+  var
+    dtrec: TDateTime;    { For Pack/UnpackTime}
+    stime: TSystemTime;
+  begin
+    if not FileExists(f) then exit;
+    
+    dtrec := FileDateToDateTime(FileAge(f));
+    DateTimeToSystemTime(dtrec, stime);
+    tmzip.tm_sec  := stime.second;
+    tmzip.tm_min  := stime.minute;
+    tmzip.tm_hour := stime.hour;
+    tmzip.tm_mday := stime.day;
+    tmzip.tm_mon  := stime.month;
+    tmzip.tm_year := stime.year;
+    filetime      := 0;
+  end;
+
+  procedure do_banner;
+  begin
+    WriteLn('MiniZip 0.15, demo package written by Gilles Vollant');
+    WriteLn('Pascal port by Jacques Nomssi Nzali');
+    WriteLn('more info at http://www.tu-chemnitz.de/~nomssi/paszlib.html');
+    WriteLn;
+  end;
+
+  procedure do_help;
+  begin
+    WriteLn('Usage : minizip [-o] file.zip [files_to_add]');
+    WriteLn;
+  end;
+
+  function main: longint;
+  var
+    answer: string[128];
+    argstr: string;
+    buf:    pointer;
+    c:      char;
+    dot_found: longint;
+    err:    longint;
+    errclose: longint;
+    filenameinzip: PChar;
+    filename_try: array[0..MAXFILENAME - 1] of char;
+    fin:    FILEptr;
+    i:      longint;
+    len:    longint;
+    opt_compress_level: longint;
+    opt_overwrite: longint;
+    p:      PChar;
+    rep:    char;
+    size_buf: longint;
+    size_read: longint;
+    zf:     zipFile;
+    zi:     zip_fileinfo;
+    zipfilenamearg: longint;
+    zipok:  longint;
+  begin
+    opt_overwrite := 0;
+    opt_compress_level := Z_DEFAULT_COMPRESSION;
+    zipfilenamearg := 0;
+    err  := 0;
+    main := 0;
+
+    do_banner;
+    if (ParamCount = 0) then
+    begin
+      do_help;
+      main := 0;
+      exit;
+    end
+    else
+      for i := 1 to ParamCount - 1 + 1 do
+      begin
+        argstr := ParamStr(i) + #0;
+        if (argstr[1] = '-') then
+        begin
+          p := @argstr[1 + 1];       {const char *p=argv[i]+1;}
+
+          while (p^ <> #0) do
+          begin
+            c := p^;
+            Inc(p);
+            if (c = 'o') or (c = 'O') then
+              opt_overwrite := 1;
+            if (c >= '0') and (c <= '9') then
+              opt_compress_level := byte(c) - byte('0');
+          end;
+        end
+        else
+        if (zipfilenamearg = 0) then
+          zipfilenamearg := i;
+      end;
+
+    size_buf := WRITEBUFFERSIZE;
+    buf      := AllocMem(size_buf);
+    if (buf = nil) then
+    begin
+      WriteLn('Error allocating memory');
+      main := ZIP_INTERNALERROR;
+      exit;
+    end;
+
+    if (zipfilenamearg = 0) then
+      zipok := 0
+    else
+    begin
+      dot_found := 0;
+
+      zipok  := 1;
+      argstr := ParamStr(zipfilenamearg) + #0;
+      strcopy(filename_try, PChar(@argstr[1]));
+      len := strlen(filename_try);
+      for i := 0 to len - 1 do
+        if (filename_try[i] = '.') then
+          dot_found := 1;
+
+      if (dot_found = 0) then
+        strcat(filename_try, '.zip');
+
+      if (opt_overwrite = 0) then
+        if FileExists(filename_try) then
+        begin
+          repeat
+            WriteLn('The file ', filename_try,
+              ' exist. Overwrite ? [y]es, [n]o : ');
+            ReadLn(answer);
+            rep := answer[1];
+            if (rep >= 'a') and (rep <= 'z') then
+              Dec(rep, $20);
+          until (rep = 'Y') or (rep = 'N');
+          if (rep = 'N') then
+            zipok := 0;
+        end;
+    end;
+
+    if (zipok = 1) then
+    begin
+      zf := zipOpen(filename_try, 0);
+      if (zf = nil) then
+      begin
+        WriteLn('error opening ', filename_try);
+        err := ZIP_ERRNO;
+      end
+      else
+        WriteLn('creating ', filename_try);
+
+      i := zipfilenamearg + 1;
+      while (i <= ParamCount) and (err = ZIP_OK) do
+      begin
+        argstr := ParamStr(i) + #0;
+        if (argstr[1] <> '-') and (argstr[1] <> '/') then
+        begin
+          filenameinzip := PChar(@argstr[1]);
+
+          zi.tmz_date.tm_sec := 0;
+          zi.tmz_date.tm_min := 0;
+          zi.tmz_date.tm_hour := 0;
+          zi.tmz_date.tm_mday := 0;
+          zi.tmz_date.tm_min := 0;
+          zi.tmz_date.tm_year := 0;
+          zi.dosDate     := 0;
+          zi.internal_fa := 0;
+          zi.external_fa := 0;
+          filetime(filenameinzip, zi.tmz_date);
+
+          if (opt_compress_level <> 0) then
+            err := zipOpenNewFileInZip(zf, filenameinzip, @zi,
+              nil, 0, nil, 0, nil { comment}, Z_DEFLATED, opt_compress_level)
+          else
+            err := zipOpenNewFileInZip(zf, filenameinzip, @zi,
+              nil, 0, nil, 0, nil, 0, opt_compress_level);
+
+          if (err <> ZIP_OK) then
+            WriteLn('error in opening ', filenameinzip, ' in zipfile')
+          else
+          begin
+            fin := fopen(filenameinzip, fopenread);
+            if (fin = nil) then
+            begin
+              err := ZIP_ERRNO;
+              WriteLn('error in opening ', filenameinzip, ' for reading');
+            end;
+
+            if (err = ZIP_OK) then
+              repeat
+                err := ZIP_OK;
+                size_read := fread(buf, 1, size_buf, fin);
+
+                if (size_read < size_buf) then
+                  if feof(fin) = 0 then
+                  begin
+                    WriteLn('error in reading ', filenameinzip);
+                    err := ZIP_ERRNO;
+                  end;
+
+                if (size_read > 0) then
+                begin
+                  err := zipWriteInFileInZip(zf, buf, size_read);
+                  if (err < 0) then
+                    WriteLn('error in writing ', filenameinzip, ' in the zipfile');
+                end;
+              until (err <> ZIP_OK) or (size_read = 0);
+
+            fclose(fin);
+          end;
+          if (err < 0) then
+            err := ZIP_ERRNO
+          else
+          begin
+            err := zipCloseFileInZip(zf);
+            if (err <> ZIP_OK) then
+              WriteLn('error in closing ', filenameinzip, ' in the zipfile');
+          end;
+          Inc(i);
+        end; { while }
+      end; { if }
+
+      errclose := zipClose(zf, nil);
+      if (errclose <> ZIP_OK) then
+        WriteLn('error in closing ', filename_try);
+    end;
+
+    FreeMem(buf); {FreeMem(buf, size_buf);}
+  end;
+
+begin
+  main;
+  Write('Done...');
+  ReadLn;
+end.

+ 1559 - 0
packages/base/paszlib/unzip.pas

@@ -0,0 +1,1559 @@
+unit Unzip;
+
+{ ----------------------------------------------------------------- }
+{ unzip.c -- IO on .zip files using zlib
+   Version 0.15 beta, Mar 19th, 1998,
+  unzip.h -- IO for uncompress .zip files using zlib
+  Version 0.15 beta, Mar 19th, 1998,
+
+  Copyright (C) 1998 Gilles Vollant <[email protected]>
+  http://www.winimage.com/zLibDll/zip.htm
+
+   This unzip package allow extract file from .ZIP file, compatible
+   with PKZip 2.04g, WinZip, InfoZip tools and compatible.
+   Encryption and multi volume ZipFile (span) are not supported.
+   Old compressions used by old PKZip 1.x are not supported
+
+  Pascal tranlastion
+  Copyright (C) 2000 by Jacques Nomssi Nzali
+  For conditions of distribution and use, see copyright notice in readme.txt }
+
+
+interface
+
+{$ifdef WIN32}
+  {$define Delphi}
+{$endif}
+
+uses
+  //zutil,
+  zbase,
+  //zLib,
+  ziputils;
+
+const
+  UNZ_OK    = (0);
+  UNZ_END_OF_LIST_OF_FILE = (-100);
+  UNZ_ERRNO = (Z_ERRNO);
+  UNZ_EOF   = (0);
+  UNZ_PARAMERROR = (-102);
+  UNZ_BADZIPFILE = (-103);
+  UNZ_INTERNALERROR = (-104);
+  UNZ_CRCERROR = (-105);
+(*
+{ tm_unz contain date/time info }
+type
+ tm_unz = record
+   tm_sec : integer;       { seconds after the minute - [0,59] }
+   tm_min : integer;       { minutes after the hour - [0,59] }
+   tm_hour : integer;      { hours since midnight - [0,23] }
+   tm_mday : integer;      { day of the month - [1,31] }
+   tm_mon : integer;       { months since January - [0,11] }
+   tm_year : integer;      { years - [1980..2044] }
+  end;
+*)
+{ unz_global_info structure contain global data about the ZIPfile
+  These data comes from the end of central dir }
+type
+  unz_global_info = record
+    number_entry: longint;   { total number of entries in
+                              the central dir on this disk }
+    size_comment: longint;   { size of the global comment of the zipfile }
+  end;
+
+
+{ unz_file_info contain information about a file in the zipfile }
+type
+  unz_file_info = record
+    version: longint;                  { version made by                 2 bytes }
+    version_needed: longint;           { version needed to extract       2 bytes }
+    flag:    longint;                  { general purpose bit flag        2 bytes }
+    compression_method: longint;       { compression method              2 bytes }
+    dosDate: longint;                  { last mod file date in Dos fmt   4 bytes }
+    crc:     longint;                  { crc-32                          4 bytes }
+    compressed_size: longint;          { compressed size                 4 bytes }
+    uncompressed_size: longint;        { uncompressed size               4 bytes }
+    size_filename: longint;            { filename length                 2 bytes }
+    size_file_extra: longint;          { extra field length              2 bytes }
+    size_file_comment: longint;        { file comment length             2 bytes }
+
+    disk_num_start: longint;          { disk number start               2 bytes }
+    internal_fa:    longint;          { internal file attributes        2 bytes }
+    external_fa:    longint;          { external file attributes        4 bytes }
+
+    tmu_date: tm_unz;
+  end;
+  unz_file_info_ptr = ^unz_file_info;
+
+
+function unzStringFileNameCompare(const fileName1: PChar; const fileName2: PChar; iCaseSensitivity: longint): longint;
+{ Compare two filename (fileName1,fileName2).
+  If iCaseSenisivity = 1 (1=true),
+    comparision is case sensitive (like strcmp)
+  If iCaseSenisivity = 2 (0=false),
+    comparision is not case sensitive (like strcmpi or strcasecmp)
+  If iCaseSenisivity = 0, case sensitivity is defaut of your
+    operating system like 1 on Unix, 2 on Windows)
+}
+
+
+function unzOpen(const path: PChar): unzFile;
+
+{ Open a Zip file. path contain the full pathname (by example,
+  on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
+  "zlib/zlib111.zip".
+  If the zipfile cannot be opened (file don't exist or in not valid), the
+  return value is NIL.
+  Else, the return value is a unzFile Handle, usable with other function
+     of this unzip package.
+}
+
+function unzClose(afile: unzFile): longint;
+
+{ Close a ZipFile opened with unzipOpen.
+  If there are files inside the .Zip opened with unzOpenCurrentFile()
+  (see later), these files MUST be closed with unzipCloseCurrentFile()
+  before a call unzipClose.
+  return UNZ_OK if there is no problem. }
+
+function unzGetGlobalInfo(afile: unzFile; var pglobal_info: unz_global_info): longint;
+
+{ Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. }
+
+function unzGetGlobalComment(afile: unzFile; szComment: PChar; uSizeBuf: longint): longint;
+
+{ Get the global comment string of the ZipFile, in the szComment buffer.
+  uSizeBuf is the size of the szComment buffer.
+  return the number of byte copied or an error code <0 }
+
+ {***************************************************************************}
+ { Unzip package allow you browse the directory of the zipfile }
+
+function unzGoToFirstFile(afile: unzFile): longint;
+
+{ Set the current file of the zipfile to the first file.
+  return UNZ_OK if there is no problem }
+
+function unzGoToNextFile(afile: unzFile): longint;
+
+{ Set the current file of the zipfile to the next file.
+  return UNZ_OK if there is no problem
+  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. }
+
+
+function unzLocateFile(afile: unzFile; const szFileName: PChar; iCaseSensitivity: longint): longint; { ZEXPORT }
+
+{ Try locate the file szFileName in the zipfile.
+  For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+  return value :
+  UNZ_OK if the file is found. It becomes the current file.
+  UNZ_END_OF_LIST_OF_FILE if the file is not found }
+
+
+function unzGetCurrentFileInfo(afile: unzFile; pfile_info: unz_file_info_ptr; szFileName: PChar; fileNameBufferSize: longint; extraField: pointer; extraFieldBufferSize: longint; szComment: PChar; commentBufferSize: longint): longint; { ZEXPORT }
+
+{ Get Info about the current file
+  if pfile_info<>NIL, the pfile_info^ structure will contain somes
+  info about the current file
+  if szFileName<>NIL, the filemane string will be copied in szFileName
+      (fileNameBufferSize is the size of the buffer)
+  if extraField<>NIL, the extra field information will be copied in
+    extraField  (extraFieldBufferSize is the size of the buffer).
+    This is the Central-header version of the extra field
+  if szComment<>NIL, the comment string of the file will be copied in
+    szComment (commentBufferSize is the size of the buffer) }
+
+
+{***************************************************************************}
+{* for reading the content of the current zipfile, you can open it, read data
+   from it, and close it (you can close it before reading all the file) }
+
+
+function unzOpenCurrentFile(afile: unzFile): longint; { ZEXPORT }
+
+{ Open for reading data the current file in the zipfile.
+  If there is no error, the return value is UNZ_OK. }
+
+
+function unzCloseCurrentFile(afile: unzFile): longint; { ZEXPORT }
+
+{ Close the file in zip opened with unzOpenCurrentFile
+  Return UNZ_CRCERROR if all the file was read but the CRC is not good }
+
+
+function unzReadCurrentFile(afile: unzFile; buf: pointer; len: cardinal): longint; { ZEXPORT }
+
+{ Read bytes from the current file (opened by unzOpenCurrentFile)
+  buf contain buffer where data must be copied
+  len the size of buf.
+
+  return the number of byte copied if somes bytes are copied
+  return 0 if the end of file was reached
+  return <0 with error code if there is an error
+    (UNZ_ERRNO for IO error, or zLib error for uncompress error) }
+
+function unztell(afile: unzFile): z_off_t;
+
+{ Give the current position in uncompressed data }
+
+function unzeof(afile: unzFile): longint;
+
+{ return 1 if the end of file was reached, 0 elsewhere
+  ! checks for valid params }
+
+function unzGetLocalExtrafield(afile: unzFile; buf: pointer; len: cardinal): longint;
+{ Read extra field from the current file (opened by unzOpenCurrentFile)
+  This is the local-header version of the extra field (sometimes, there is
+    more info in the local-header version than in the central-header)
+
+  if buf=NIL, it return the size of the local extra field
+
+  if buf<>NIL, len is the size of the buffer, the extra header is copied in
+  buf.
+  the return value is the number of bytes copied in buf, or (if <0)
+  the error code }
+
+
+{ ----------------------------------------------------------------- }
+
+implementation
+
+uses
+  {$ifdef Delphi}
+  SysUtils,
+  {$else}
+  strings,
+  {$endif}
+  zInflate, crc;
+
+{$ifdef unix and not def (CASESENSITIVITYDEFAULT_YES) and \
+                      !defined(CASESENSITIVITYDEFAULT_NO)}
+{$define CASESENSITIVITYDEFAULT_NO}
+{$endif}
+
+
+const
+  UNZ_BUFSIZE = Z_BUFSIZE;
+  UNZ_MAXFILENAMEINZIP = Z_MAXFILENAMEINZIP;
+
+const
+  unz_copyright: PChar = ' unzip 0.15 Copyright 1998 Gilles Vollant ';
+
+{ unz_file_info_internal contain internal info about a file in zipfile }
+type
+  unz_file_info_internal = record
+    offset_curfile: longint; { relative offset of local header 4 bytes }
+  end;
+  unz_file_info_internal_ptr = ^unz_file_info_internal;
+
+
+{ file_in_zip_read_info_s contain internal information about a file
+  in zipfile, when reading and decompress it }
+type
+  file_in_zip_read_info_s = record
+    read_buffer: PChar;       { internal buffer for compressed data }
+    stream:      z_stream;    { zLib stream structure for inflate }
+
+    pos_in_zipfile:     longint;       { position in byte on the zipfile, for fseek}
+    stream_initialised: boolean;     { flag set if stream structure is initialised}
+
+    offset_local_extrafield: longint;   { offset of the local extra field }
+    size_local_extrafield:   integer;    { size of the local extra field }
+    pos_local_extrafield:    longint;   { position in the local extra field in read}
+
+    crc32:      longint;                { crc32 of all data uncompressed }
+    crc32_wait: longint;                { crc32 we must obtain after decompress all }
+    rest_read_compressed: longint;      { number of byte to be decompressed }
+    rest_read_uncompressed: longint;    {number of byte to be obtained after decomp}
+    afile:      FILEptr;              { io structure of the zipfile }
+    compression_method: longint;        { compression method (0=store) }
+    byte_before_the_zipfile: longint;   { byte before the zipfile, (>0 for sfx) }
+  end;
+  file_in_zip_read_info_s_ptr = ^file_in_zip_read_info_s;
+
+
+{ unz_s contain internal information about the zipfile }
+type
+  unz_s = record
+    afile: FILEptr;                 { io structore of the zipfile }
+    gi:    unz_global_info;         { public global information }
+    byte_before_the_zipfile: longint; { byte before the zipfile, (>0 for sfx)}
+    num_file: longint;                { number of the current file in the zipfile}
+    pos_in_central_dir: longint;      { pos of the current file in the central dir}
+    current_file_ok: boolean;       { flag about the usability of the current file}
+    central_pos: longint;             { position of the beginning of the central dir}
+
+    size_central_dir:   longint;     { size of the central directory  }
+    offset_central_dir: longint;   { offset of start of central directory with
+                                   respect to the starting disk number }
+
+    cur_file_info:     unz_file_info; { public info about the current file in zip}
+    cur_file_info_internal: unz_file_info_internal; { private info about it}
+    pfile_in_zip_read: file_in_zip_read_info_s_ptr; { structure about the current
+                                      file if we are decompressing it }
+  end;
+  unz_s_ptr = ^unz_s;
+
+
+{ ===========================================================================
+  Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+  for end of file.
+  IN assertion: the stream s has been sucessfully opened for reading. }
+
+
+function unzlocal_getByte(fin: FILEptr; var pi: longint): longint;
+var
+  c:   byte;
+  err: longint;
+begin
+  err := fread(@c, 1, 1, fin);
+
+  if (err = 1) then
+  begin
+    pi := longint(c);
+    unzlocal_getByte := UNZ_OK;
+    {exit;}
+  end
+  else
+  if feof(fin) = 1 then    {if ferror(fin) then}
+    unzlocal_getByte := UNZ_ERRNO
+  else
+    unzlocal_getByte := UNZ_EOF{exit;};
+end;
+
+
+{ ===========================================================================
+   Reads a long in LSB order from the given gz_stream. Sets }
+
+function unzlocal_getShort(fin: FILEptr; var pX: longint): longint;
+var
+  x:   longint;
+  i:   longint;
+  err: longint;
+begin
+  err := unzlocal_getByte(fin, i);
+  x   := longint(i);
+
+  if (err = UNZ_OK) then
+    err := unzlocal_getByte(fin, i);
+  Inc(x, longint(i) shl 8);
+
+  if (err = UNZ_OK) then
+    pX := x
+  else
+    pX := 0;
+  unzlocal_getShort := err;
+end;
+
+function unzlocal_getLong(fin: FILEptr; var pX: longint): longint;
+var
+  x:   longint;
+  i:   longint;
+  err: longint;
+begin
+  err := unzlocal_getByte(fin, i);
+  x   := longint(i);
+
+  if (err = UNZ_OK) then
+    err := unzlocal_getByte(fin, i);
+  Inc(x, longint(i) shl 8);
+
+  if (err = UNZ_OK) then
+    err := unzlocal_getByte(fin, i);
+  Inc(x, longint(i) shl 16);
+
+  if (err = UNZ_OK) then
+    err := unzlocal_getByte(fin, i);
+  Inc(x, longint(i) shl 24);
+
+  if (err = UNZ_OK) then
+    pX := x
+  else
+    pX := 0;
+  unzlocal_getLong := err;
+end;
+
+
+{ My own strcmpi / strcasecmp }
+function strcmpcasenosensitive_internal(fileName1: PChar; fileName2: PChar): longint;
+var
+  c1, c2: char;
+begin
+  repeat
+    c1 := fileName1^;
+    Inc(fileName1);
+    c2 := fileName2^;
+    Inc(fileName2);
+    if (c1 >= 'a') and (c1 <= 'z') then
+      Dec(c1, $20);
+    if (c2 >= 'a') and (c2 <= 'z') then
+      Dec(c2, $20);
+    if (c1 = #0) then
+    begin
+      if c2 = #0 then
+        strcmpcasenosensitive_internal := 0
+      else
+        strcmpcasenosensitive_internal := -1;
+      exit;
+    end;
+    if (c2 = #0) then
+    begin
+      strcmpcasenosensitive_internal := 1;
+      exit;
+    end;
+    if (c1 < c2) then
+    begin
+      strcmpcasenosensitive_internal := -1;
+      exit;
+    end;
+    if (c1 > c2) then
+    begin
+      strcmpcasenosensitive_internal := 1;
+      exit;
+    end;
+  until False;
+end;
+
+
+const
+  CASESENSITIVITYDEFAULTVALUE = 2;
+
+function unzStringFileNameCompare(const fileName1: PChar; const fileName2: PChar; iCaseSensitivity: longint): longint; { ZEXPORT }
+{ Compare two filename (fileName1,fileName2).
+  If iCaseSenisivity = 1 (1=true),
+    comparision is case sensitive (like strcmp)
+  If iCaseSenisivity = 2 (0=false),
+    comparision is not case sensitive (like strcmpi or strcasecmp)
+  If iCaseSenisivity = 0, case sensitivity is defaut of your
+    operating system like 1 on Unix, 2 on Windows)
+}
+begin
+  if (iCaseSensitivity = 0) then
+    iCaseSensitivity := CASESENSITIVITYDEFAULTVALUE;
+
+  if (iCaseSensitivity = 1) then
+  begin
+    unzStringFileNameCompare := strComp(fileName1, fileName2);
+    exit;
+  end;
+
+  unzStringFileNameCompare := strcmpcasenosensitive_internal(fileName1, fileName2);
+end;
+
+const
+  BUFREADCOMMENT = $400;
+
+{ Locate the Central directory of a zipfile (at the end, just before
+  the global comment) }
+
+function unzlocal_SearchCentralDir(fin: FILEptr): longint;
+var
+  buf: Pbytearray;
+  uSizeFile: longint;
+  uBackRead: longint;
+  uMaxBack: longint;
+  uPosFound: longint;
+var
+  uReadSize, uReadPos: longint;
+  i: longint;
+begin
+  uMaxBack  := $ffff; { maximum size of global comment }
+  uPosFound := 0;
+
+  if (fseek(fin, 0, SEEK_END) <> 0) then
+  begin
+    unzlocal_SearchCentralDir := 0;
+    exit;
+  end;
+
+  uSizeFile := ftell(fin);
+
+  if (uMaxBack > uSizeFile) then
+    uMaxBack := uSizeFile;
+
+  buf := Pbytearray(AllocMem(BUFREADCOMMENT + 4));
+  if (buf = nil) then
+  begin
+    unzlocal_SearchCentralDir := 0;
+    exit;
+  end;
+
+  uBackRead := 4;
+  while (uBackRead < uMaxBack) do
+  begin
+
+    if (uBackRead + BUFREADCOMMENT > uMaxBack) then
+      uBackRead := uMaxBack
+    else
+      Inc(uBackRead, BUFREADCOMMENT);
+    uReadPos := uSizeFile - uBackRead;
+
+    if ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) then
+      uReadSize := (BUFREADCOMMENT + 4)
+    else
+      uReadSize := (uSizeFile - uReadPos);
+
+    if fseek(fin, uReadPos, SEEK_SET) <> 0 then
+      break;
+
+    if fread(buf, integer(uReadSize), 1, fin) <> 1 then
+      break;
+
+    i := longint(uReadSize) - 3;
+    while (i > 0) do
+    begin
+      Dec(i);
+      if (buf^[i] = $50) and (buf^[i + 1] = $4b) and    { ENDHEADERMAGIC }
+        (buf^[i + 2] = $05) and (buf^[i + 3] = $06) then
+      begin
+        uPosFound := uReadPos + integer(i);
+        break;
+      end;
+    end;
+
+    if (uPosFound <> 0) then
+      break;
+  end;
+  FreeMem(buf);
+  unzlocal_SearchCentralDir := uPosFound;
+end;
+
+
+{ Open a Zip file. path contain the full pathname (by example,
+  on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
+  "zlib/zlib111.zip".
+  If the zipfile cannot be opened (file don't exist or in not valid), the
+  return value is NIL.
+  Else, the return value is a unzFile Handle, usable with other function
+     of this unzip package.
+}
+
+function unzOpen(const path: PChar): unzFile; { ZEXPORT }
+var
+  us:  unz_s;
+  s:   unz_s_ptr;
+  central_pos, uL: longint;
+  fin: FILEptr;
+
+  number_disk:     longint; { number of the current dist, used for spaning ZIP,
+                         unsupported, always 0 }
+  number_disk_with_CD: longint; { number the the disk with central dir,
+                        used for spaning ZIP, unsupported, always 0 }
+  number_entry_CD: longint; { total number of entries in the central dir
+                                 (same than number_entry on nospan) }
+
+  err: longint;
+begin
+  err := UNZ_OK;
+
+  if (unz_copyright[0] <> ' ') then
+  begin
+    unzOpen := nil;
+    exit;
+  end;
+
+  fin := fopen(path, fopenread);
+  if (fin = nil) then
+  begin
+    unzOpen := nil;
+    exit;
+  end;
+
+  central_pos := unzlocal_SearchCentralDir(fin);
+  if (central_pos = 0) then
+    err := UNZ_ERRNO;
+
+  if (fseek(fin, central_pos, SEEK_SET) <> 0) then
+    err := UNZ_ERRNO;
+
+  { the signature, already checked }
+  if (unzlocal_getLong(fin, uL) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  { number of this disk }
+  if (unzlocal_getShort(fin, number_disk) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  { number of the disk with the start of the central directory }
+  if (unzlocal_getShort(fin, number_disk_with_CD) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  { total number of entries in the central dir on this disk }
+  if (unzlocal_getShort(fin, us.gi.number_entry) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  { total number of entries in the central dir }
+  if (unzlocal_getShort(fin, number_entry_CD) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if ((number_entry_CD <> us.gi.number_entry) or
+    (number_disk_with_CD <> 0) or
+    (number_disk <> 0)) then
+    err := UNZ_BADZIPFILE;
+
+  { size of the central directory }
+  if (unzlocal_getLong(fin, us.size_central_dir) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  { offset of start of central directory with respect to the
+        starting disk number }
+  if (unzlocal_getLong(fin, us.offset_central_dir) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  { zipfile comment length }
+  if (unzlocal_getShort(fin, us.gi.size_comment) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if ((central_pos < us.offset_central_dir + us.size_central_dir) and
+    (err = UNZ_OK)) then
+    err := UNZ_BADZIPFILE;
+
+  if (err <> UNZ_OK) then
+  begin
+    fclose(fin);
+    unzOpen := nil;
+    exit;
+  end;
+
+  us.afile := fin;
+  us.byte_before_the_zipfile := central_pos -
+    (us.offset_central_dir + us.size_central_dir);
+  us.central_pos := central_pos;
+  us.pfile_in_zip_read := nil;
+
+  s  := unz_s_ptr(AllocMem(sizeof(unz_s)));
+  s^ := us;
+  unzGoToFirstFile(unzFile(s));
+  unzOpen := unzFile(s);
+end;
+
+
+{ Close a ZipFile opened with unzipOpen.
+  If there are files inside the .Zip opened with unzOpenCurrentFile()
+  (see later), these files MUST be closed with unzipCloseCurrentFile()
+  before a call unzipClose.
+  return UNZ_OK if there is no problem. }
+
+function unzClose(afile: unzFile): longint; { ZEXPORT }
+var
+  s: unz_s_ptr;
+begin
+  if (afile = nil) then
+  begin
+    unzClose := UNZ_PARAMERROR;
+    exit;
+  end;
+  s := unz_s_ptr(afile);
+
+  if (s^.pfile_in_zip_read <> nil) then
+    unzCloseCurrentFile(afile);
+
+  fclose(s^.afile);
+  FreeMem(s);
+  unzClose := UNZ_OK;
+end;
+
+{ Write info about the ZipFile in the pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. }
+
+function unzGetGlobalInfo(afile: unzFile; var pglobal_info: unz_global_info): longint; { ZEXPORT }
+var
+  s: unz_s_ptr;
+begin
+  if (afile = nil) then
+  begin
+    unzGetGlobalInfo := UNZ_PARAMERROR;
+    exit;
+  end;
+  s := unz_s_ptr(afile);
+  pglobal_info := s^.gi;
+  unzGetGlobalInfo := UNZ_OK;
+end;
+
+
+{ Translate date/time from Dos format to tm_unz (more easily readable) }
+procedure unzlocal_DosDateToTmuDate(ulDosDate: longint; var ptm: tm_unz);
+var
+  uDate: longint;
+begin
+  uDate      := longint(ulDosDate shr 16);
+  ptm.tm_mday := integer(uDate and $1f);
+  ptm.tm_mon := integer((((uDate) and $1E0) div $20) - 1);
+  ptm.tm_year := integer(((uDate and $0FE00) div $0200) + 1980);
+
+  ptm.tm_hour := integer((ulDosDate and $F800) div $800);
+  ptm.tm_min  := integer((ulDosDate and $7E0) div $20);
+  ptm.tm_sec  := integer(2 * (ulDosDate and $1f));
+end;
+
+{ Get Info about the current file in the zipfile, with internal only info }
+function unzlocal_GetCurrentFileInfoInternal(afile: unzFile; pfile_info: unz_file_info_ptr; pfile_info_internal: unz_file_info_internal_ptr; szFileName: PChar; fileNameBufferSize: longint; extraField: pointer; extraFieldBufferSize: longint; szComment: PChar; commentBufferSize: longint): longint;
+var
+  s:      unz_s_ptr;
+  file_info: unz_file_info;
+  file_info_internal: unz_file_info_internal;
+  err:    longint;
+  uMagic: longint;
+  lSeek:  longint;
+var
+  uSizeRead: longint;
+begin
+  err   := UNZ_OK;
+  lSeek := 0;
+  if (afile = nil) then
+  begin
+    unzlocal_GetCurrentFileInfoInternal := UNZ_PARAMERROR;
+    exit;
+  end;
+  s := unz_s_ptr(afile);
+
+  if (fseek(s^.afile,
+    s^.pos_in_central_dir + s^.byte_before_the_zipfile, SEEK_SET) <> 0) then
+    err := UNZ_ERRNO;
+
+  { we check the magic }
+  if (err = UNZ_OK) then
+    if (unzlocal_getLong(s^.afile, uMagic) <> UNZ_OK) then
+      err := UNZ_ERRNO
+    else
+    if (uMagic <> CENTRALHEADERMAGIC) then
+      err := UNZ_BADZIPFILE;
+
+  if (unzlocal_getShort(s^.afile, file_info.version) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, file_info.version_needed) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, file_info.flag) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, file_info.compression_method) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getLong(s^.afile, file_info.dosDate) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  unzlocal_DosDateToTmuDate(file_info.dosDate, file_info.tmu_date);
+
+  if (unzlocal_getLong(s^.afile, file_info.crc) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getLong(s^.afile, file_info.compressed_size) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getLong(s^.afile, file_info.uncompressed_size) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, file_info.size_filename) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, file_info.size_file_extra) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, file_info.size_file_comment) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, file_info.disk_num_start) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, file_info.internal_fa) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getLong(s^.afile, file_info.external_fa) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getLong(s^.afile, file_info_internal.offset_curfile) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  Inc(lSeek, file_info.size_filename);
+  if ((err = UNZ_OK) and (szFileName <> nil)) then
+  begin
+    if (file_info.size_filename < fileNameBufferSize) then
+    begin
+      (szFileName +file_info.size_filename)^ := #0;
+      uSizeRead := file_info.size_filename;
+    end
+    else
+      uSizeRead := fileNameBufferSize;
+
+    if (file_info.size_filename > 0) and (fileNameBufferSize > 0) then
+      if fread(szFileName, integer(uSizeRead), 1, s^.afile) <> 1 then
+        err := UNZ_ERRNO;
+    Dec(lSeek, uSizeRead);
+  end;
+
+  if ((err = UNZ_OK) and (extraField <> nil)) then
+  begin
+    if (file_info.size_file_extra < extraFieldBufferSize) then
+      uSizeRead := file_info.size_file_extra
+    else
+      uSizeRead := extraFieldBufferSize;
+
+    if (lSeek <> 0) then
+      if (fseek(s^.afile, lSeek, SEEK_CUR) = 0) then
+        lSeek := 0
+      else
+        err   := UNZ_ERRNO;
+
+    if ((file_info.size_file_extra > 0) and (extraFieldBufferSize > 0)) then
+      if fread(extraField, integer(uSizeRead), 1, s^.afile) <> 1 then
+        err := UNZ_ERRNO;
+    Inc(lSeek, file_info.size_file_extra - uSizeRead);
+  end
+  else
+    Inc(lSeek, file_info.size_file_extra);
+
+  if ((err = UNZ_OK) and (szComment <> nil)) then
+  begin
+    if (file_info.size_file_comment < commentBufferSize) then
+    begin
+      (szComment +file_info.size_file_comment)^ := #0;
+      uSizeRead := file_info.size_file_comment;
+    end
+    else
+      uSizeRead := commentBufferSize;
+
+    if (lSeek <> 0) then
+      if (fseek(s^.afile, lSeek, SEEK_CUR) = 0) then
+        lSeek := 0
+      else
+        err   := UNZ_ERRNO;
+    if ((file_info.size_file_comment > 0) and (commentBufferSize > 0)) then
+      if fread(szComment, integer(uSizeRead), 1, s^.afile) <> 1 then
+        err := UNZ_ERRNO;
+    Inc(lSeek, file_info.size_file_comment - uSizeRead);
+  end
+  else
+    Inc(lSeek, file_info.size_file_comment);
+
+  if ((err = UNZ_OK) and (pfile_info <> nil)) then
+    pfile_info^ := file_info;
+
+  if ((err = UNZ_OK) and (pfile_info_internal <> nil)) then
+    pfile_info_internal^ := file_info_internal;
+
+  unzlocal_GetCurrentFileInfoInternal := err;
+end;
+
+
+{ Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. }
+
+function unzGetCurrentFileInfo(afile: unzFile; pfile_info: unz_file_info_ptr; szFileName: PChar; fileNameBufferSize: longint; extraField: pointer; extraFieldBufferSize: longint; szComment: PChar; commentBufferSize: longint): longint; { ZEXPORT }
+
+{ Get Info about the current file
+  if pfile_info<>NIL, the pfile_info^ structure will contain somes
+  info about the current file
+  if szFileName<>NIL, the filemane string will be copied in szFileName
+      (fileNameBufferSize is the size of the buffer)
+  if extraField<>NIL, the extra field information will be copied in
+    extraField  (extraFieldBufferSize is the size of the buffer).
+    This is the Central-header version of the extra field
+  if szComment<>NIL, the comment string of the file will be copied in
+    szComment (commentBufferSize is the size of the buffer) }
+
+begin
+  unzGetCurrentFileInfo := unzlocal_GetCurrentFileInfoInternal(afile,
+    pfile_info, nil, szFileName, fileNameBufferSize, extraField,
+    extraFieldBufferSize, szComment, commentBufferSize);
+end;
+
+
+{ Set the current file of the zipfile to the first file.
+  return UNZ_OK if there is no problem }
+
+function unzGoToFirstFile(afile: unzFile): longint;  { ZEXPORT }
+var
+  err: longint;
+  s:   unz_s_ptr;
+begin
+  if (afile = nil) then
+  begin
+    unzGoToFirstFile := UNZ_PARAMERROR;
+    exit;
+  end;
+  s   := unz_s_ptr(afile);
+  s^.pos_in_central_dir := s^.offset_central_dir;
+  s^.num_file := 0;
+  err := unzlocal_GetCurrentFileInfoInternal(afile, @s^.cur_file_info, @s^.cur_file_info_internal, nil, 0, nil, 0, nil, 0);
+  s^.current_file_ok := (err = UNZ_OK);
+  unzGoToFirstFile := err;
+end;
+
+
+{ Set the current file of the zipfile to the next file.
+  return UNZ_OK if there is no problem
+  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. }
+
+function unzGoToNextFile(afile: unzFile): longint; { ZEXPORT }
+var
+  s:   unz_s_ptr;
+  err: longint;
+begin
+  if (afile = nil) then
+  begin
+    unzGoToNextFile := UNZ_PARAMERROR;
+    exit;
+  end;
+  s := unz_s_ptr(afile);
+  if not s^.current_file_ok then
+  begin
+    unzGoToNextFile := UNZ_END_OF_LIST_OF_FILE;
+    exit;
+  end;
+  if (s^.num_file + 1 = s^.gi.number_entry) then
+  begin
+    unzGoToNextFile := UNZ_END_OF_LIST_OF_FILE;
+    exit;
+  end;
+
+  Inc(s^.pos_in_central_dir,
+    SIZECENTRALDIRITEM + s^.cur_file_info.size_filename +
+    s^.cur_file_info.size_file_extra + s^.cur_file_info.size_file_comment);
+  Inc(s^.num_file);
+  err := unzlocal_GetCurrentFileInfoInternal(afile, @s^.cur_file_info, @s^.cur_file_info_internal, nil, 0, nil, 0, nil, 0);
+  s^.current_file_ok := (err = UNZ_OK);
+  unzGoToNextFile := err;
+end;
+
+
+{ Try locate the file szFileName in the zipfile.
+  For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+  return value :
+  UNZ_OK if the file is found. It becomes the current file.
+  UNZ_END_OF_LIST_OF_FILE if the file is not found }
+
+function unzLocateFile(afile: unzFile; const szFileName: PChar; iCaseSensitivity: longint): longint; { ZEXPORT }
+var
+  s:   unz_s_ptr;
+  err: longint;
+  num_fileSaved: longint;
+  pos_in_central_dirSaved: longint;
+var
+  szCurrentFileName: array[0..UNZ_MAXFILENAMEINZIP + 1 - 1] of char;
+begin
+  if (afile = nil) then
+  begin
+    unzLocateFile := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  if (strlen(szFileName) >= UNZ_MAXFILENAMEINZIP) then
+  begin
+    unzLocateFile := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  s := unz_s_ptr(afile);
+  if (not s^.current_file_ok) then
+  begin
+    unzLocateFile := UNZ_END_OF_LIST_OF_FILE;
+    exit;
+  end;
+  num_fileSaved := s^.num_file;
+  pos_in_central_dirSaved := s^.pos_in_central_dir;
+
+  err := unzGoToFirstFile(afile);
+
+  while (err = UNZ_OK) do
+  begin
+    unzGetCurrentFileInfo(afile, nil,
+      szCurrentFileName, sizeof(szCurrentFileName) - 1, nil, 0, nil, 0);
+    if (unzStringFileNameCompare(szCurrentFileName,
+      szFileName, iCaseSensitivity) = 0) then
+    begin
+      unzLocateFile := UNZ_OK;
+      exit;
+    end;
+    err := unzGoToNextFile(afile);
+  end;
+
+  s^.num_file   := num_fileSaved;
+  s^.pos_in_central_dir := pos_in_central_dirSaved;
+  unzLocateFile := err;
+end;
+
+
+{ Read the local header of the current zipfile
+  Check the coherency of the local header and info in the end of central
+        directory about this file
+  store in *piSizeVar the size of extra info in local header
+        (filename and size of extra field data) }
+
+function unzlocal_CheckCurrentFileCoherencyHeader(s: unz_s_ptr; var piSizeVar: integer; var poffset_local_extrafield: longint; var psize_local_extrafield: integer): longint;
+var
+  uMagic, uData, uFlags: longint;
+  size_filename: longint;
+  size_extra_field: longint;
+  err: longint;
+begin
+  err := UNZ_OK;
+
+  piSizeVar := 0;
+  poffset_local_extrafield := 0;
+  psize_local_extrafield := 0;
+
+  if (fseek(s^.afile, s^.cur_file_info_internal.offset_curfile +
+    s^.byte_before_the_zipfile, SEEK_SET) <> 0) then
+  begin
+    unzlocal_CheckCurrentFileCoherencyHeader := UNZ_ERRNO;
+    exit;
+  end;
+
+  if (err = UNZ_OK) then
+    if (unzlocal_getLong(s^.afile, uMagic) <> UNZ_OK) then
+      err := UNZ_ERRNO
+    else
+    if (uMagic <> $04034b50) then
+      err := UNZ_BADZIPFILE;
+
+  if (unzlocal_getShort(s^.afile, uData) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+{
+  else
+    if ((err=UNZ_OK) and (uData<>s^.cur_file_info.wVersion)) then
+      err := UNZ_BADZIPFILE;
+}
+  if (unzlocal_getShort(s^.afile, uFlags) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getShort(s^.afile, uData) <> UNZ_OK) then
+    err := UNZ_ERRNO
+  else
+  if ((err = UNZ_OK) and (uData <> s^.cur_file_info.compression_method)) then
+    err := UNZ_BADZIPFILE;
+
+  if ((err = UNZ_OK) and (s^.cur_file_info.compression_method <> 0) and
+    (s^.cur_file_info.compression_method <> Z_DEFLATED)) then
+    err := UNZ_BADZIPFILE;
+
+  if (unzlocal_getLong(s^.afile, uData) <> UNZ_OK) then { date/time }
+    err := UNZ_ERRNO;
+
+  if (unzlocal_getLong(s^.afile, uData) <> UNZ_OK) then { crc }
+    err := UNZ_ERRNO
+  else
+  if ((err = UNZ_OK) and (uData <> s^.cur_file_info.crc) and
+    ((uFlags and 8) = 0)) then
+    err := UNZ_BADZIPFILE;
+
+  if (unzlocal_getLong(s^.afile, uData) <> UNZ_OK) then { size compr }
+    err := UNZ_ERRNO
+  else
+  if ((err = UNZ_OK) and (uData <> s^.cur_file_info.compressed_size) and
+    ((uFlags and 8) = 0)) then
+    err := UNZ_BADZIPFILE;
+
+  if (unzlocal_getLong(s^.afile, uData) <> UNZ_OK) then { size uncompr }
+    err := UNZ_ERRNO
+  else
+  if ((err = UNZ_OK) and (uData <> s^.cur_file_info.uncompressed_size) and
+    ((uFlags and 8) = 0)) then
+    err := UNZ_BADZIPFILE;
+
+
+  if (unzlocal_getShort(s^.afile, size_filename) <> UNZ_OK) then
+    err := UNZ_ERRNO
+  else
+  if ((err = UNZ_OK) and (size_filename <> s^.cur_file_info.size_filename)) then
+    err := UNZ_BADZIPFILE;
+
+  Inc(piSizeVar, integer(size_filename));
+
+  if (unzlocal_getShort(s^.afile, size_extra_field) <> UNZ_OK) then
+    err := UNZ_ERRNO;
+  poffset_local_extrafield := s^.cur_file_info_internal.offset_curfile +
+    SIZEZIPLOCALHEADER + size_filename;
+  psize_local_extrafield := integer(size_extra_field);
+
+  Inc(piSizeVar, integer(size_extra_field));
+
+  unzlocal_CheckCurrentFileCoherencyHeader := err;
+end;
+
+{ Open for reading data the current file in the zipfile.
+  If there is no error, the return value is UNZ_OK. }
+
+function unzOpenCurrentFile(afile: unzFile): longint; { ZEXPORT }
+var
+  err: longint;
+  Store: boolean;
+  iSizeVar: integer;
+  s: unz_s_ptr;
+  pfile_in_zip_read_info: file_in_zip_read_info_s_ptr;
+  offset_local_extrafield: longint;  { offset of the local extra field }
+  size_local_extrafield: integer;     { size of the local extra field }
+begin
+  err := UNZ_OK;
+
+  if (afile = nil) then
+  begin
+    unzOpenCurrentFile := UNZ_PARAMERROR;
+    exit;
+  end;
+  s := unz_s_ptr(afile);
+  if not s^.current_file_ok then
+  begin
+    unzOpenCurrentFile := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  if (s^.pfile_in_zip_read <> nil) then
+    unzCloseCurrentFile(afile);
+
+  if (unzlocal_CheckCurrentFileCoherencyHeader(s, iSizeVar,
+    offset_local_extrafield, size_local_extrafield) <> UNZ_OK) then
+  begin
+    unzOpenCurrentFile := UNZ_BADZIPFILE;
+    exit;
+  end;
+
+  pfile_in_zip_read_info := file_in_zip_read_info_s_ptr(
+    AllocMem(sizeof(file_in_zip_read_info_s)));
+  if (pfile_in_zip_read_info = nil) then
+  begin
+    unzOpenCurrentFile := UNZ_INTERNALERROR;
+    exit;
+  end;
+
+  pfile_in_zip_read_info^.read_buffer := PChar(AllocMem(UNZ_BUFSIZE));
+  pfile_in_zip_read_info^.offset_local_extrafield := offset_local_extrafield;
+  pfile_in_zip_read_info^.size_local_extrafield := size_local_extrafield;
+  pfile_in_zip_read_info^.pos_local_extrafield := 0;
+
+  if (pfile_in_zip_read_info^.read_buffer = nil) then
+  begin
+    FreeMem(pfile_in_zip_read_info);
+    unzOpenCurrentFile := UNZ_INTERNALERROR;
+    exit;
+  end;
+
+  pfile_in_zip_read_info^.stream_initialised := False;
+
+  if ((s^.cur_file_info.compression_method <> 0) and
+    (s^.cur_file_info.compression_method <> Z_DEFLATED)) then
+    err := UNZ_BADZIPFILE;
+  Store := s^.cur_file_info.compression_method = 0;
+
+  pfile_in_zip_read_info^.crc32_wait := s^.cur_file_info.crc;
+  pfile_in_zip_read_info^.crc32      := 0;
+  pfile_in_zip_read_info^.compression_method := s^.cur_file_info.compression_method;
+  pfile_in_zip_read_info^.afile      := s^.afile;
+  pfile_in_zip_read_info^.byte_before_the_zipfile := s^.byte_before_the_zipfile;
+
+  pfile_in_zip_read_info^.stream.total_out := 0;
+
+  if (not Store) then
+  begin
+    err := inflateInit2(pfile_in_zip_read_info^.stream, -MAX_WBITS);
+
+    if (err = Z_OK) then
+      pfile_in_zip_read_info^.stream_initialised := True;
+        { windowBits is passed < 0 to tell that there is no zlib header.
+          Note that in this case inflate *requires* an extra "dummy" byte
+          after the compressed stream in order to complete decompression and
+          return Z_STREAM_END.
+          In unzip, i don't wait absolutely Z_STREAM_END because I known the
+          size of both compressed and uncompressed data }
+  end;
+  pfile_in_zip_read_info^.rest_read_compressed   := s^.cur_file_info.compressed_size;
+  pfile_in_zip_read_info^.rest_read_uncompressed := s^.cur_file_info.uncompressed_size;
+
+
+  pfile_in_zip_read_info^.pos_in_zipfile :=
+    s^.cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar;
+
+  pfile_in_zip_read_info^.stream.avail_in := integer(0);
+
+
+  s^.pfile_in_zip_read := pfile_in_zip_read_info;
+  unzOpenCurrentFile   := UNZ_OK;
+end;
+
+
+{ Read bytes from the current file (opened by unzOpenCurrentFile)
+  buf contain buffer where data must be copied
+  len the size of buf.
+
+  return the number of byte copied if somes bytes are copied
+  return 0 if the end of file was reached
+  return <0 with error code if there is an error
+    (UNZ_ERRNO for IO error, or zLib error for uncompress error) }
+
+function unzReadCurrentFile(afile: unzFile; buf: pointer; len: cardinal): longint; { ZEXPORT }
+
+var
+  err:   longint;
+  iRead: integer;
+  s:     unz_s_ptr;
+  pfile_in_zip_read_info: file_in_zip_read_info_s_ptr;
+var
+  uReadThis: integer;
+var
+  uDoCopy, i: integer;
+var
+  uTotalOutBefore, uTotalOutAfter: longint;
+  bufBefore: pbyte;
+  uOutThis: longint;
+  flush: longint;
+begin
+  err   := UNZ_OK;
+  iRead := 0;
+  if (afile = nil) then
+  begin
+    unzReadCurrentFile := UNZ_PARAMERROR;
+    exit;
+  end;
+  s := unz_s_ptr(afile);
+  pfile_in_zip_read_info := s^.pfile_in_zip_read;
+
+  if (pfile_in_zip_read_info = nil) then
+  begin
+    unzReadCurrentFile := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  if ((pfile_in_zip_read_info^.read_buffer = nil)) then
+  begin
+    unzReadCurrentFile := UNZ_END_OF_LIST_OF_FILE;
+    exit;
+  end;
+
+  if (len = 0) then
+  begin
+    unzReadCurrentFile := 0;
+    exit;
+  end;
+
+  pfile_in_zip_read_info^.stream.next_out := pbyte(buf);
+
+  pfile_in_zip_read_info^.stream.avail_out := integer(len);
+
+  if (len > pfile_in_zip_read_info^.rest_read_uncompressed) then
+    pfile_in_zip_read_info^.stream.avail_out :=
+      integer(pfile_in_zip_read_info^.rest_read_uncompressed);
+
+  while (pfile_in_zip_read_info^.stream.avail_out > 0) do
+  begin
+    if ((pfile_in_zip_read_info^.stream.avail_in = 0) and
+      (pfile_in_zip_read_info^.rest_read_compressed > 0)) then
+    begin
+      uReadThis := UNZ_BUFSIZE;
+      if (pfile_in_zip_read_info^.rest_read_compressed < uReadThis) then
+        uReadThis := integer(pfile_in_zip_read_info^.rest_read_compressed);
+      if (uReadThis = 0) then
+      begin
+        unzReadCurrentFile := UNZ_EOF;
+        exit;
+      end;
+      if (fseek(pfile_in_zip_read_info^.afile,
+        pfile_in_zip_read_info^.pos_in_zipfile +
+        pfile_in_zip_read_info^.byte_before_the_zipfile, SEEK_SET) <> 0) then
+      begin
+        unzReadCurrentFile := UNZ_ERRNO;
+        exit;
+      end;
+      if fread(pfile_in_zip_read_info^.read_buffer, uReadThis, 1,
+        pfile_in_zip_read_info^.afile) <> 1 then
+      begin
+        unzReadCurrentFile := UNZ_ERRNO;
+        exit;
+      end;
+      Inc(pfile_in_zip_read_info^.pos_in_zipfile, uReadThis);
+
+      Dec(pfile_in_zip_read_info^.rest_read_compressed, uReadThis);
+
+      pfile_in_zip_read_info^.stream.next_in  :=
+        pbyte(pfile_in_zip_read_info^.read_buffer);
+      pfile_in_zip_read_info^.stream.avail_in := integer(uReadThis);
+    end;
+
+    if (pfile_in_zip_read_info^.compression_method = 0) then
+    begin
+      if (pfile_in_zip_read_info^.stream.avail_out <
+        pfile_in_zip_read_info^.stream.avail_in) then
+        uDoCopy := pfile_in_zip_read_info^.stream.avail_out
+      else
+        uDoCopy := pfile_in_zip_read_info^.stream.avail_in;
+
+      for i := 0 to uDoCopy - 1 do
+        Pbytearray(pfile_in_zip_read_info^.stream.next_out)^[i] :=
+          Pbytearray(pfile_in_zip_read_info^.stream.next_in)^[i];
+
+      pfile_in_zip_read_info^.crc32 := crc32(pfile_in_zip_read_info^.crc32,
+        pfile_in_zip_read_info^.stream.next_out, uDoCopy);
+      Dec(pfile_in_zip_read_info^.rest_read_uncompressed, uDoCopy);
+      Dec(pfile_in_zip_read_info^.stream.avail_in, uDoCopy);
+      Dec(pfile_in_zip_read_info^.stream.avail_out, uDoCopy);
+      Inc(pfile_in_zip_read_info^.stream.next_out, uDoCopy);
+      Inc(pfile_in_zip_read_info^.stream.next_in, uDoCopy);
+      Inc(pfile_in_zip_read_info^.stream.total_out, uDoCopy);
+      Inc(iRead, uDoCopy);
+    end
+    else
+    begin
+      flush := Z_SYNC_FLUSH;
+
+      uTotalOutBefore := pfile_in_zip_read_info^.stream.total_out;
+      bufBefore := pfile_in_zip_read_info^.stream.next_out;
+
+      {
+      if ((pfile_in_zip_read_info^.rest_read_uncompressed =
+     pfile_in_zip_read_info^.stream.avail_out) and
+    (pfile_in_zip_read_info^.rest_read_compressed = 0)) then
+        flush := Z_FINISH;
+      }
+      err := inflate(pfile_in_zip_read_info^.stream, flush);
+
+      uTotalOutAfter := pfile_in_zip_read_info^.stream.total_out;
+      uOutThis := uTotalOutAfter - uTotalOutBefore;
+
+      pfile_in_zip_read_info^.crc32 :=
+        crc32(pfile_in_zip_read_info^.crc32, bufBefore, integer(uOutThis));
+
+      Dec(pfile_in_zip_read_info^.rest_read_uncompressed, uOutThis);
+
+      Inc(iRead, integer(uTotalOutAfter - uTotalOutBefore));
+
+      if (err = Z_STREAM_END) then
+      begin
+        if iRead = 0 then
+          unzReadCurrentFile := UNZ_EOF
+        else
+          unzReadCurrentFile := iRead;
+        exit;
+      end;
+      if (err <> Z_OK) then
+        break;
+    end;
+  end; { while }
+
+  if (err = Z_OK) then
+  begin
+    unzReadCurrentFile := iRead;
+    exit;
+  end;
+  unzReadCurrentFile := err;
+end;
+
+{ Give the current position in uncompressed data }
+
+function unztell(afile: unzFile): z_off_t; { ZEXPORT }
+var
+  s: unz_s_ptr;
+  pfile_in_zip_read_info: file_in_zip_read_info_s_ptr;
+begin
+  if (afile = nil) then
+  begin
+    unztell := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  s := unz_s_ptr(afile);
+  pfile_in_zip_read_info := s^.pfile_in_zip_read;
+
+  if (pfile_in_zip_read_info = nil) then
+  begin
+    unztell := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  unztell := z_off_t(pfile_in_zip_read_info^.stream.total_out);
+end;
+
+
+{ return 1 (TRUE) if the end of file was reached, 0 elsewhere }
+
+function unzeof(afile: unzFile): longint;
+var
+  s: unz_s_ptr;
+  pfile_in_zip_read_info: file_in_zip_read_info_s_ptr;
+begin
+  if (afile = nil) then
+  begin
+    unzeof := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  s := unz_s_ptr(afile);
+  pfile_in_zip_read_info := s^.pfile_in_zip_read;
+
+  if (pfile_in_zip_read_info = nil) then
+  begin
+    unzeof := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  if (pfile_in_zip_read_info^.rest_read_uncompressed = 0) then
+    unzeof := 1
+  else
+    unzeof := 0;
+end;
+
+
+{ Read extra field from the current file (opened by unzOpenCurrentFile)
+  This is the local-header version of the extra field (sometimes, there is
+    more info in the local-header version than in the central-header)
+
+  if buf=NIL, it return the size of the local extra field
+
+  if buf<>NIL, len is the size of the buffer, the extra header is copied in
+  buf.
+  the return value is the number of bytes copied in buf, or (if <0)
+  the error code }
+
+function unzGetLocalExtrafield(afile: unzFile; buf: pointer; len: cardinal): longint;
+var
+  s: unz_s_ptr;
+  pfile_in_zip_read_info: file_in_zip_read_info_s_ptr;
+  read_now: integer;
+  size_to_read: longint;
+begin
+  if (afile = nil) then
+  begin
+    unzGetLocalExtrafield := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  s := unz_s_ptr(afile);
+  pfile_in_zip_read_info := s^.pfile_in_zip_read;
+
+  if (pfile_in_zip_read_info = nil) then
+  begin
+    unzGetLocalExtrafield := UNZ_PARAMERROR;
+    exit;
+  end;
+
+  size_to_read := (pfile_in_zip_read_info^.size_local_extrafield -
+    pfile_in_zip_read_info^.pos_local_extrafield);
+
+  if (buf = nil) then
+  begin
+    unzGetLocalExtrafield := longint(size_to_read);
+    exit;
+  end;
+
+  if (len > size_to_read) then
+    read_now := integer(size_to_read)
+  else
+    read_now := integer(len);
+
+  if (read_now = 0) then
+  begin
+    unzGetLocalExtrafield := 0;
+    exit;
+  end;
+
+  if (fseek(pfile_in_zip_read_info^.afile,
+    pfile_in_zip_read_info^.offset_local_extrafield +
+    pfile_in_zip_read_info^.pos_local_extrafield, SEEK_SET) <> 0) then
+  begin
+    unzGetLocalExtrafield := UNZ_ERRNO;
+    exit;
+  end;
+
+  if fread(buf, integer(size_to_read), 1, pfile_in_zip_read_info^.afile) <> 1 then
+  begin
+    unzGetLocalExtrafield := UNZ_ERRNO;
+    exit;
+  end;
+
+  unzGetLocalExtrafield := longint(read_now);
+end;
+
+{ Close the file in zip opened with unzOpenCurrentFile
+  Return UNZ_CRCERROR if all the file was read but the CRC is not good }
+
+function unzCloseCurrentFile(afile: unzFile): longint; { ZEXPORT }
+var
+  err: longint;
+  s:   unz_s_ptr;
+  pfile_in_zip_read_info: file_in_zip_read_info_s_ptr;
+begin
+  err := UNZ_OK;
+
+  if (afile = nil) then
+  begin
+    unzCloseCurrentFile := UNZ_PARAMERROR;
+    exit;
+  end;
+  s := unz_s_ptr(afile);
+  pfile_in_zip_read_info := s^.pfile_in_zip_read;
+
+  if (pfile_in_zip_read_info = nil) then
+  begin
+    unzCloseCurrentFile := UNZ_PARAMERROR;
+    exit;
+  end;
+
+
+  if (pfile_in_zip_read_info^.rest_read_uncompressed = 0) then
+    if (pfile_in_zip_read_info^.crc32 <> pfile_in_zip_read_info^.crc32_wait) then
+      err := UNZ_CRCERROR;
+
+
+  FreeMem(pfile_in_zip_read_info^.read_buffer);
+  pfile_in_zip_read_info^.read_buffer := nil;
+  if (pfile_in_zip_read_info^.stream_initialised) then
+    inflateEnd(pfile_in_zip_read_info^.stream);
+
+  pfile_in_zip_read_info^.stream_initialised := False;
+  FreeMem(pfile_in_zip_read_info);
+
+  s^.pfile_in_zip_read := nil;
+
+  unzCloseCurrentFile := err;
+end;
+
+
+{ Get the global comment string of the ZipFile, in the szComment buffer.
+  uSizeBuf is the size of the szComment buffer.
+  return the number of byte copied or an error code <0 }
+
+function unzGetGlobalComment(afile: unzFile; szComment: PChar; uSizeBuf: longint): longint; { ZEXPORT }
+
+var
+  s: unz_s_ptr;
+  uReadThis: longint;
+begin
+  if (afile = nil) then
+  begin
+    unzGetGlobalComment := UNZ_PARAMERROR;
+    exit;
+  end;
+  s := unz_s_ptr(afile);
+
+  uReadThis := uSizeBuf;
+  if (uReadThis > s^.gi.size_comment) then
+    uReadThis := s^.gi.size_comment;
+
+  if (fseek(s^.afile, s^.central_pos + 22, SEEK_SET) <> 0) then
+  begin
+    unzGetGlobalComment := UNZ_ERRNO;
+    exit;
+  end;
+
+  if (uReadThis > 0) then
+  begin
+    szComment^ := #0;
+    if fread(szComment, integer(uReadThis), 1, s^.afile) <> 1 then
+    begin
+      unzGetGlobalComment := UNZ_ERRNO;
+      exit;
+    end;
+  end;
+
+  if ((szComment <> nil) and (uSizeBuf > s^.gi.size_comment)) then
+    (szComment +s^.gi.size_comment)^ := #0;
+
+  unzGetGlobalComment := longint(uReadThis);
+end;
+
+end.

+ 792 - 0
packages/base/paszlib/zip.pas

@@ -0,0 +1,792 @@
+unit zip;
+
+{ zip.c -- IO on .zip files using zlib
+  zip.h -- IO for compress .zip files using zlib
+   Version 0.15 alpha, Mar 19th, 1998,
+
+   Copyright (C) 1998 Gilles Vollant
+
+   This package allows to create .ZIP file, compatible with PKZip 2.04g
+     WinZip, InfoZip tools and compatible.
+   Encryption and multi volume ZipFile (span) are not supported.
+   Old compressions used by old PKZip 1.x are not supported
+
+  For decompression of .zip files, look at unzip.pas
+
+  Pascal tranlastion
+  Copyright (C) 2000 by Jacques Nomssi Nzali
+  For conditions of distribution and use, see copyright notice in readme.txt }
+
+
+interface
+
+{$ifdef WIN32}
+  {$define Delphi}
+{$endif}
+
+uses
+  //zutil,
+  zbase,
+  //zLib,
+  ziputils;
+
+const
+  ZIP_OK    = (0);
+  ZIP_ERRNO = (Z_ERRNO);
+  ZIP_PARAMERROR = (-102);
+  ZIP_INTERNALERROR = (-104);
+  Z_DEFAULT_COMPRESSION = -(1);
+  Z_DEFLATED = 8;
+
+(*
+{ tm_zip contain date/time info }
+type
+  tm_zip = record
+     tm_sec : integer;            { seconds after the minute - [0,59] }
+     tm_min : integer;            { minutes after the hour - [0,59] }
+     tm_hour : integer;           { hours since midnight - [0,23] }
+     tm_mday : integer;           { day of the month - [1,31] }
+     tm_mon : integer;            { months since January - [0,11] }
+     tm_year : integer;           { years - [1980..2044] }
+  end;
+*)
+type
+  zip_fileinfo = record
+    tmz_date: tm_zip;        { date in understandable format           }
+    dosDate:  longword;         { if dos_date = 0, tmu_date is used       }
+    {   flag : longint;       }{ general purpose bit flag        2 bytes }
+
+    internal_fa: longint;    { internal file attributes        2 bytes }
+    external_fa: longint;    { external file attributes        4 bytes }
+  end;
+  zip_fileinfo_ptr = ^zip_fileinfo;
+
+function zipOpen(const pathname: PChar; append: longint): zipFile; {ZEXPORT}
+{ Create a zipfile.
+  pathname contain on Windows NT a filename like "c:\\zlib\\zlib111.zip" or on
+  an Unix computer "zlib/zlib111.zip".
+  if the file pathname exist and append=1, the zip will be created at the end
+  of the file. (useful if the file contain a self extractor code)
+  If the zipfile cannot be opened, the return value is NIL.
+  Else, the return value is a zipFile Handle, usable with other function
+  of this zip package. }
+
+function zipOpenNewFileInZip(afile: zipFile;
+  {const} filename: PChar; const zipfi: zip_fileinfo_ptr; const extrafield_local: pointer; size_extrafield_local: integer; const extrafield_global: pointer; size_extrafield_global: integer; const comment: PChar; method: longint; level: longint): longint; {ZEXPORT}
+{ Open a file in the ZIP for writing.
+  filename : the filename in zip (if NIL, '-' without quote will be used
+  zipfi^ contain supplemental information
+  if extrafield_local<>NIL and size_extrafield_local>0, extrafield_local
+    contains the extrafield data the the local header
+  if extrafield_global<>NIL and size_extrafield_global>0, extrafield_global
+    contains the extrafield data the the local header
+  if comment <> NIL, comment contain the comment string
+  method contain the compression method (0 for store, Z_DEFLATED for deflate)
+  level contain the level of compression (can be Z_DEFAULT_COMPRESSION) }
+
+function zipWriteInFileInZip(afile: zipFile; const buf: pointer; len: cardinal): longint; {ZEXPORT}
+{ Write data in the zipfile }
+
+function zipCloseFileInZip(afile: zipFile): longint; {ZEXPORT}
+ { Close the current file in the zipfile }
+
+function zipClose(afile: zipFile; const global_comment: PChar): longint; {ZEXPORT}
+ { Close the zipfile }
+
+implementation
+
+uses
+  {$ifdef Delphi}
+  SysUtils,
+  {$else}
+  strings,
+  {$endif}
+  zDeflate, crc;
+
+const
+  VERSIONMADEBY = ($0); { platform depedent }
+
+const
+  zip_copyright: PChar = ' zip 0.15 Copyright 1998 Gilles Vollant ';
+
+
+const
+  SIZEDATA_INDATABLOCK = (4096 - (4 * 4));
+
+  LOCALHEADERMAGIC = $04034b50;
+  {CENTRALHEADERMAGIC = $02014b50;}
+  ENDHEADERMAGIC   = $06054b50;
+
+  FLAG_LOCALHEADER_OFFSET = $06;
+  CRC_LOCALHEADER_OFFSET  = $0e;
+
+  SIZECENTRALHEADER = $2e; { 46 }
+
+type
+  linkedlist_datablock_internal_ptr = ^linkedlist_datablock_internal;
+
+  linkedlist_datablock_internal = record
+    next_datablock: linkedlist_datablock_internal_ptr;
+    avail_in_this_block: longint;
+    filled_in_this_block: longint;
+    unused: longint; { for future use and alignement }
+    Data:   array[0..SIZEDATA_INDATABLOCK - 1] of byte;
+  end;
+
+type
+  linkedlist_data = record
+    first_block: linkedlist_datablock_internal_ptr;
+    last_block:  linkedlist_datablock_internal_ptr;
+  end;
+  linkedlist_data_ptr = ^linkedlist_data;
+
+type
+  curfile_info = record
+    stream: z_stream;            { zLib stream structure for inflate }
+    stream_initialised: boolean; { TRUE is stream is initialised }
+    pos_in_buffered_data: integer;  { last written byte in buffered_data }
+
+    pos_local_header: longint;     { offset of the local header of the file
+                                    currenty writing }
+    central_header: PChar;       { central header data for the current file }
+    size_centralheader: longint;   { size of the central header for cur file }
+    flag: longint;                 { flag of the file currently writing }
+
+    method:  longint;                { compression method of file currenty wr.}
+    buffered_data: array[0..Z_BUFSIZE - 1] of byte;{ buffer contain compressed data to be written}
+    dosDate: longint;
+    crc32:   longint;
+  end;
+
+type
+  zip_internal = record
+    filezip: FILEptr;
+    central_dir: linkedlist_data;  { datablock with central dir in construction}
+    in_opened_file_inzip: boolean; { TRUE if a file in the zip is currently writ.}
+    ci: curfile_info;              { info on the file curretly writing }
+
+    begin_pos:    longint;            { position of the beginning of the zipfile }
+    number_entry: longint;
+  end;
+  zip_internal_ptr = ^zip_internal;
+
+function allocate_new_datablock: linkedlist_datablock_internal_ptr;
+var
+  ldi: linkedlist_datablock_internal_ptr;
+begin
+  ldi := linkedlist_datablock_internal_ptr(GetMem(sizeof(linkedlist_datablock_internal)));
+  if (ldi <> nil) then
+  begin
+    ldi^.next_datablock      := nil;
+    ldi^.filled_in_this_block := 0;
+    ldi^.avail_in_this_block := SIZEDATA_INDATABLOCK;
+  end;
+  allocate_new_datablock := ldi;
+end;
+
+procedure free_datablock(ldi: linkedlist_datablock_internal_ptr);
+var
+  ldinext: linkedlist_datablock_internal_ptr;
+begin
+  while (ldi <> nil) do
+  begin
+    ldinext := ldi^.next_datablock;
+    FreeMem(ldi);
+    ldi := ldinext;
+  end;
+end;
+
+procedure init_linkedlist(var ll: linkedlist_data);
+begin
+  ll.last_block  := nil;
+  ll.first_block := nil;
+end;
+
+procedure free_linkedlist(var ll: linkedlist_data);
+begin
+  free_datablock(ll.first_block);
+  ll.last_block  := nil;
+  ll.first_block := nil;
+end;
+
+function add_data_in_datablock(ll: linkedlist_data_ptr; const buf: pointer; len: longint): longint;
+var
+  ldi: linkedlist_datablock_internal_ptr;
+  from_copy: {const} Pbyte;
+var
+  copy_this: integer;
+  i:   integer;
+  to_copy: Pbyte;
+begin
+  if (ll = nil) then
+  begin
+    add_data_in_datablock := ZIP_INTERNALERROR;
+    exit;
+  end;
+
+  if (ll^.last_block = nil) then
+  begin
+    ll^.last_block  := allocate_new_datablock;
+    ll^.first_block := ll^.last_block;
+    if (ll^.first_block = nil) then
+    begin
+      add_data_in_datablock := ZIP_INTERNALERROR;
+      exit;
+    end;
+  end;
+
+  ldi := ll^.last_block;
+  from_copy := Pbyte(buf);
+
+  while (len > 0) do
+  begin
+    if (ldi^.avail_in_this_block = 0) then
+    begin
+      ldi^.next_datablock := allocate_new_datablock;
+      if (ldi^.next_datablock = nil) then
+      begin
+        add_data_in_datablock := ZIP_INTERNALERROR;
+        exit;
+      end;
+      ldi := ldi^.next_datablock;
+      ll^.last_block := ldi;
+    end;
+
+    if (ldi^.avail_in_this_block < len) then
+      copy_this := integer(ldi^.avail_in_this_block)
+    else
+      copy_this := integer(len);
+
+    to_copy := @(ldi^.Data[ldi^.filled_in_this_block]);
+
+    for i := 0 to copy_this - 1 do
+      Pbytearray(to_copy)^[i] := Pbytearray(from_copy)^[i];
+
+    Inc(ldi^.filled_in_this_block, copy_this);
+    Dec(ldi^.avail_in_this_block, copy_this);
+    Inc(from_copy, copy_this);
+    Dec(len, copy_this);
+  end;
+  add_data_in_datablock := ZIP_OK;
+end;
+
+
+function write_datablock(fout: FILEptr; ll: linkedlist_data_ptr): longint;
+var
+  ldi: linkedlist_datablock_internal_ptr;
+begin
+  ldi := ll^.first_block;
+  while (ldi <> nil) do
+  begin
+    if (ldi^.filled_in_this_block > 0) then
+      if (fwrite(@ldi^.Data, integer(ldi^.filled_in_this_block), 1, fout) <> 1) then
+      begin
+        write_datablock := ZIP_ERRNO;
+        exit;
+      end;
+    ldi := ldi^.next_datablock;
+  end;
+  write_datablock := ZIP_OK;
+end;
+
+{**************************************************************************}
+
+{ ===========================================================================
+   Outputs a long in LSB order to the given file
+   nbByte = 1, 2 or 4 (byte, short or long)  }
+
+function ziplocal_putValue(afile: FILEptr; x: longint; nbByte: longint): longint;
+var
+  buf: array[0..4 - 1] of byte;
+  n:   longint;
+begin
+  for n := 0 to nbByte - 1 do
+  begin
+    buf[n] := byte(x and $ff);
+    x      := x shr 8;
+  end;
+  if (fwrite(@buf, nbByte, 1, afile) <> 1) then
+    ziplocal_putValue := ZIP_ERRNO
+  else
+    ziplocal_putValue := ZIP_OK;
+end;
+
+procedure ziplocal_putValue_inmemory(dest: pointer; x: longint; nbByte: longint);
+var
+  buf: Pbytearray;
+  n:   longint;
+begin
+  buf := Pbytearray(dest);
+  for n := 0 to nbByte - 1 do
+  begin
+    buf^[n] := Byte(x and $ff);
+    x := x shr 8;
+  end;
+end;
+
+{**************************************************************************}
+
+
+function ziplocal_TmzDateToDosDate(var ptm: tm_zip; dosDate: longint): longint;
+var
+  year: longint;
+begin
+  year := longint(ptm.tm_year);
+  if (year > 1980) then
+    Dec(year, 1980)
+  else
+  if (year > 80) then
+    Dec(year, 80);
+  ziplocal_TmzDateToDosDate := longint(
+    ((ptm.tm_mday) + (32 * (ptm.tm_mon + 1)) + (512 * year)) shl 16) or
+    ((ptm.tm_sec div 2) + (32 * ptm.tm_min) + (2048 * longint(ptm.tm_hour)));
+end;
+
+
+{**************************************************************************}
+
+function zipOpen(const pathname: PChar; append: longint): zipFile; {ZEXPORT}
+var
+  ziinit: zip_internal;
+  zi:     zip_internal_ptr;
+begin
+  if (append = 0) then
+    ziinit.filezip := fopen(pathname, fopenwrite)
+  else
+    ziinit.filezip := fopen(pathname, fappendwrite);
+
+  if (ziinit.filezip = nil) then
+  begin
+    zipOpen := nil;
+    exit;
+  end;
+  ziinit.begin_pos    := ftell(ziinit.filezip);
+  ziinit.in_opened_file_inzip := False;
+  ziinit.ci.stream_initialised := False;
+  ziinit.number_entry := 0;
+  init_linkedlist(ziinit.central_dir);
+
+  zi := zip_internal_ptr(AllocMem(sizeof(zip_internal)));
+  if (zi = nil) then
+  begin
+    fclose(ziinit.filezip);
+    zipOpen := nil;
+    exit;
+  end;
+
+  zi^     := ziinit;
+  zipOpen := zipFile(zi);
+end;
+
+function zipOpenNewFileInZip(afile: zipFile;
+  {const} filename: PChar; const zipfi: zip_fileinfo_ptr; const extrafield_local: pointer; size_extrafield_local: integer; const extrafield_global: pointer; size_extrafield_global: integer; const comment: PChar; method: longint; level: longint): longint; {ZEXPORT}
+var
+  zi:  zip_internal_ptr;
+  size_filename: integer;
+  size_comment: integer;
+  i:   integer;
+  err: longint;
+begin
+  err := ZIP_OK;
+  if (afile = nil) then
+  begin
+    zipOpenNewFileInZip := ZIP_PARAMERROR;
+    exit;
+  end;
+  if ((method <> 0) and (method <> Z_DEFLATED)) then
+  begin
+    zipOpenNewFileInZip := ZIP_PARAMERROR;
+    exit;
+  end;
+
+  zi := zip_internal_ptr(afile);
+
+  if (zi^.in_opened_file_inzip = True) then
+  begin
+    err := zipCloseFileInZip(afile);
+    if (err <> ZIP_OK) then
+    begin
+      zipOpenNewFileInZip := err;
+      exit;
+    end;
+  end;
+
+  if (filename = nil) then
+    filename := '-';
+
+  if (comment = nil) then
+    size_comment := 0
+  else
+    size_comment := strlen(comment);
+
+  size_filename := strlen(filename);
+
+  if (zipfi = nil) then
+    zi^.ci.dosDate := 0
+  else
+  if (zipfi^.dosDate <> 0) then
+    zi^.ci.dosDate := zipfi^.dosDate
+  else
+    zi^.ci.dosDate := ziplocal_TmzDateToDosDate(zipfi^.tmz_date, zipfi^.dosDate);
+  zi^.ci.flag := 0;
+  if ((level = 8) or (level = 9)) then
+    zi^.ci.flag := zi^.ci.flag or 2;
+  if ((level = 2)) then
+    zi^.ci.flag := zi^.ci.flag or 4;
+  if ((level = 1)) then
+    zi^.ci.flag := zi^.ci.flag or 6;
+
+  zi^.ci.crc32  := 0;
+  zi^.ci.method := method;
+  zi^.ci.stream_initialised := False;
+  zi^.ci.pos_in_buffered_data := 0;
+  zi^.ci.pos_local_header := ftell(zi^.filezip);
+  zi^.ci.size_centralheader := SIZECENTRALHEADER + size_filename +
+    size_extrafield_global + size_comment;
+  zi^.ci.central_header := PChar(AllocMem(integer(zi^.ci.size_centralheader)));
+
+  ziplocal_putValue_inmemory(zi^.ci.central_header, longint(CENTRALHEADERMAGIC), 4);
+  { version info }
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 4, longint(VERSIONMADEBY), 2);
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 6, longint(20), 2);
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 8, longint(zi^.ci.flag), 2);
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 10, longint(zi^.ci.method), 2);
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 12, longint(zi^.ci.dosDate), 4);
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 16, longint(0), 4); {crc}
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 20, longint(0), 4); {compr size}
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 24, longint(0), 4); {uncompr size}
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 28, longint(size_filename), 2);
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 30, longint(size_extrafield_global), 2);
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 32, longint(size_comment), 2);
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 34, longint(0), 2); {disk nm start}
+
+  if (zipfi = nil) then
+    ziplocal_putValue_inmemory(zi^.ci.central_header + 36, longint(0), 2)
+  else
+    ziplocal_putValue_inmemory(zi^.ci.central_header + 36, longint(zipfi^.internal_fa), 2);
+
+  if (zipfi = nil) then
+    ziplocal_putValue_inmemory(zi^.ci.central_header + 38, longint(0), 4)
+  else
+    ziplocal_putValue_inmemory(zi^.ci.central_header + 38, longint(zipfi^.external_fa), 4);
+
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 42, longint(zi^.ci.pos_local_header), 4);
+
+  i := 0;
+  while (i < size_filename) do
+  begin
+    (zi^.ci.central_header +SIZECENTRALHEADER + i)^ := (filename + i)^;
+    Inc(i);
+  end;
+
+  i := 0;
+  while (i < size_extrafield_global) do
+  begin
+    (zi^.ci.central_header +SIZECENTRALHEADER + size_filename + i)^ :=
+      ({const} PChar(extrafield_global) + i)^;
+    Inc(i);
+  end;
+
+  i := 0;
+  while (i < size_comment) do
+  begin
+    (zi^.ci.central_header +SIZECENTRALHEADER + size_filename + size_extrafield_global + i)^ := (filename + i)^;
+    Inc(i);
+  end;
+  if (zi^.ci.central_header = nil) then
+  begin
+    zipOpenNewFileInZip := ZIP_INTERNALERROR;
+    exit;
+  end;
+
+  { write the local header }
+  err := ziplocal_putValue(zi^.filezip, longint(LOCALHEADERMAGIC), 4);
+
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(20), 2); { version needed to extract }
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(zi^.ci.flag), 2);
+
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(zi^.ci.method), 2);
+
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(zi^.ci.dosDate), 4);
+
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(0), 4); { crc 32, unknown }
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(0), 4); { compressed size, unknown }
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(0), 4); { uncompressed size, unknown }
+
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(size_filename), 2);
+
+  if (err = ZIP_OK) then
+    err := ziplocal_putValue(zi^.filezip, longint(size_extrafield_local), 2);
+
+  if ((err = ZIP_OK) and (size_filename > 0)) then
+    if (fwrite(filename, integer(size_filename), 1, zi^.filezip) <> 1) then
+      err := ZIP_ERRNO;
+
+  if ((err = ZIP_OK) and (size_extrafield_local > 0)) then
+    if (fwrite(extrafield_local, integer(size_extrafield_local), 1, zi^.filezip) <> 1) then
+      err := ZIP_ERRNO;
+
+  zi^.ci.stream.avail_in  := integer(0);
+  zi^.ci.stream.avail_out := integer(Z_BUFSIZE);
+  zi^.ci.stream.next_out  := Pbyte(@zi^.ci.buffered_data);
+  zi^.ci.stream.total_in  := 0;
+  zi^.ci.stream.total_out := 0;
+
+  if ((err = ZIP_OK) and (zi^.ci.method = Z_DEFLATED)) then
+  begin
+    err := deflateInit2(zi^.ci.stream, level,
+      Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, 0);
+
+    if (err = Z_OK) then
+      zi^.ci.stream_initialised := True;
+  end;
+
+  if (err = Z_OK) then
+    zi^.in_opened_file_inzip := True;
+  zipOpenNewFileInZip := err;
+end;
+
+function zipWriteInFileInZip(afile: zipFile; const buf: pointer; len: cardinal): longint; {ZEXPORT}
+var
+  zi:  zip_internal_ptr;
+  err: longint;
+var
+  uTotalOutBefore: longint;
+var
+  copy_this, i: integer;
+begin
+  err := ZIP_OK;
+
+  if (afile = nil) then
+  begin
+    zipWriteInFileInZip := ZIP_PARAMERROR;
+    exit;
+  end;
+  zi := zip_internal_ptr(afile);
+
+  if (zi^.in_opened_file_inzip = False) then
+  begin
+    zipWriteInFileInZip := ZIP_PARAMERROR;
+    exit;
+  end;
+
+  zi^.ci.stream.next_in := buf;
+  zi^.ci.stream.avail_in := len;
+  zi^.ci.crc32 := crc32(zi^.ci.crc32, buf, len);
+
+  while ((err = ZIP_OK) and (zi^.ci.stream.avail_in > 0)) do
+  begin
+    if (zi^.ci.stream.avail_out = 0) then
+    begin
+      if fwrite(@zi^.ci.buffered_data, integer(zi^.ci.pos_in_buffered_data), 1, zi^.filezip) <> 1 then
+        err := ZIP_ERRNO;
+      zi^.ci.pos_in_buffered_data := 0;
+      zi^.ci.stream.avail_out := integer(Z_BUFSIZE);
+      zi^.ci.stream.next_out  := Pbyte(@zi^.ci.buffered_data);
+    end;
+
+    if (zi^.ci.method = Z_DEFLATED) then
+    begin
+      uTotalOutBefore := zi^.ci.stream.total_out;
+      err := deflate(zi^.ci.stream, Z_NO_FLUSH);
+      Inc(zi^.ci.pos_in_buffered_data, integer(zi^.ci.stream.total_out - uTotalOutBefore));
+    end
+    else
+    begin
+      if (zi^.ci.stream.avail_in < zi^.ci.stream.avail_out) then
+        copy_this := zi^.ci.stream.avail_in
+      else
+        copy_this := zi^.ci.stream.avail_out;
+
+      for i := 0 to copy_this - 1 do
+        (PChar(zi^.ci.stream.next_out) +i)^ :=
+          ( {const} PChar(zi^.ci.stream.next_in) + i)^;
+
+
+      Dec(zi^.ci.stream.avail_in, copy_this);
+      Dec(zi^.ci.stream.avail_out, copy_this);
+      Inc(zi^.ci.stream.next_in, copy_this);
+      Inc(zi^.ci.stream.next_out, copy_this);
+      Inc(zi^.ci.stream.total_in, copy_this);
+      Inc(zi^.ci.stream.total_out, copy_this);
+      Inc(zi^.ci.pos_in_buffered_data, copy_this);
+    end;
+  end;
+
+  zipWriteInFileInZip := 0;
+end;
+
+function zipCloseFileInZip(afile: zipFile): longint; {ZEXPORT}
+var
+  zi:  zip_internal_ptr;
+  err: longint;
+var
+  uTotalOutBefore: longint;
+var
+  cur_pos_inzip: longint;
+begin
+  err := ZIP_OK;
+
+  if (afile = nil) then
+  begin
+    zipCloseFileInZip := ZIP_PARAMERROR;
+    exit;
+  end;
+  zi := zip_internal_ptr(afile);
+
+  if (zi^.in_opened_file_inzip = False) then
+  begin
+    zipCloseFileInZip := ZIP_PARAMERROR;
+    exit;
+  end;
+  zi^.ci.stream.avail_in := 0;
+
+  if (zi^.ci.method = Z_DEFLATED) then
+    while (err = ZIP_OK) do
+    begin
+      if (zi^.ci.stream.avail_out = 0) then
+      begin
+        if fwrite(@zi^.ci.buffered_data, integer(zi^.ci.pos_in_buffered_data), 1, zi^.filezip) <> 1 then
+          err := ZIP_ERRNO;
+        zi^.ci.pos_in_buffered_data := 0;
+        zi^.ci.stream.avail_out := integer(Z_BUFSIZE);
+        zi^.ci.stream.next_out  := Pbyte(@zi^.ci.buffered_data);
+      end;
+      uTotalOutBefore := zi^.ci.stream.total_out;
+      err := deflate(zi^.ci.stream, Z_FINISH);
+      Inc(zi^.ci.pos_in_buffered_data, integer(zi^.ci.stream.total_out - uTotalOutBefore));
+    end;
+
+  if (err = Z_STREAM_END) then
+    err := ZIP_OK; { this is normal }
+
+  if (zi^.ci.pos_in_buffered_data > 0) and (err = ZIP_OK) then
+    if fwrite(@zi^.ci.buffered_data, integer(zi^.ci.pos_in_buffered_data), 1, zi^.filezip) <> 1 then
+      err := ZIP_ERRNO;
+
+  if ((zi^.ci.method = Z_DEFLATED) and (err = ZIP_OK)) then
+  begin
+    err := deflateEnd(zi^.ci.stream);
+    zi^.ci.stream_initialised := False;
+  end;
+
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 16, longint(zi^.ci.crc32), 4); {crc}
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 20, longint(zi^.ci.stream.total_out), 4); {compr size}
+  ziplocal_putValue_inmemory(zi^.ci.central_header + 24, longint(zi^.ci.stream.total_in), 4); {uncompr size}
+
+  if (err = ZIP_OK) then
+    err := add_data_in_datablock(@zi^.central_dir, zi^.ci.central_header, longint(zi^.ci.size_centralheader));
+
+  FreeMem(zi^.ci.central_header);
+
+  if (err = ZIP_OK) then
+  begin
+    cur_pos_inzip := ftell(zi^.filezip);
+    if fseek(zi^.filezip, zi^.ci.pos_local_header + 14, SEEK_SET) <> 0 then
+      err := ZIP_ERRNO;
+
+    if (err = ZIP_OK) then
+      err := ziplocal_putValue(zi^.filezip, longint(zi^.ci.crc32), 4); { crc 32, unknown }
+
+    if (err = ZIP_OK) then { compressed size, unknown }
+      err := ziplocal_putValue(zi^.filezip, longint(zi^.ci.stream.total_out), 4);
+
+    if (err = ZIP_OK) then { uncompressed size, unknown }
+      err := ziplocal_putValue(zi^.filezip, longint(zi^.ci.stream.total_in), 4);
+
+    if fseek(zi^.filezip, cur_pos_inzip, SEEK_SET) <> 0 then
+      err := ZIP_ERRNO;
+  end;
+
+  Inc(zi^.number_entry);
+  zi^.in_opened_file_inzip := False;
+
+  zipCloseFileInZip := err;
+end;
+
+function zipClose(afile: zipFile; const global_comment: PChar): longint; {ZEXPORT}
+var
+  zi:  zip_internal_ptr;
+  err: longint;
+  size_centraldir: longint;
+  centraldir_pos_inzip: longint;
+  size_global_comment: integer;
+var
+  ldi: linkedlist_datablock_internal_ptr;
+begin
+  err := 0;
+  size_centraldir := 0;
+  if (afile = nil) then
+  begin
+    zipClose := ZIP_PARAMERROR;
+    exit;
+  end;
+  zi := zip_internal_ptr(afile);
+
+  if (zi^.in_opened_file_inzip = True) then
+    err := zipCloseFileInZip(afile);
+
+  if (global_comment = nil) then
+    size_global_comment := 0
+  else
+    size_global_comment := strlen(global_comment);
+
+  centraldir_pos_inzip := ftell(zi^.filezip);
+  if (err = ZIP_OK) then
+  begin
+    ldi := zi^.central_dir.first_block;
+    while (ldi <> nil) do
+    begin
+      if ((err = ZIP_OK) and (ldi^.filled_in_this_block > 0)) then
+        if fwrite(@ldi^.Data, integer(ldi^.filled_in_this_block), 1, zi^.filezip) <> 1 then
+          err := ZIP_ERRNO;
+
+      Inc(size_centraldir, ldi^.filled_in_this_block);
+      ldi := ldi^.next_datablock;
+    end;
+  end;
+  free_datablock(zi^.central_dir.first_block);
+
+  if (err = ZIP_OK) then { Magic End }
+    err := ziplocal_putValue(zi^.filezip, longint(ENDHEADERMAGIC), 4);
+
+  if (err = ZIP_OK) then { number of this disk }
+    err := ziplocal_putValue(zi^.filezip, longint(0), 2);
+
+  if (err = ZIP_OK) then { number of the disk with the start of the central directory }
+    err := ziplocal_putValue(zi^.filezip, longint(0), 2);
+
+  if (err = ZIP_OK) then { total number of entries in the central dir on this disk }
+    err := ziplocal_putValue(zi^.filezip, longint(zi^.number_entry), 2);
+
+  if (err = ZIP_OK) then { total number of entries in the central dir }
+    err := ziplocal_putValue(zi^.filezip, longint(zi^.number_entry), 2);
+
+  if (err = ZIP_OK) then { size of the central directory }
+    err := ziplocal_putValue(zi^.filezip, longint(size_centraldir), 4);
+
+  if (err = ZIP_OK) then { offset of start of central directory with respect to the
+                          starting disk number }
+    err := ziplocal_putValue(zi^.filezip, longint(centraldir_pos_inzip), 4);
+
+  if (err = ZIP_OK) then { zipfile comment length }
+    err := ziplocal_putValue(zi^.filezip, longint(size_global_comment), 2);
+
+  if ((err = ZIP_OK) and (size_global_comment > 0)) then
+    if fwrite(global_comment, integer(size_global_comment), 1, zi^.filezip) <> 1 then
+      err := ZIP_ERRNO;
+  fclose(zi^.filezip);
+  FreeMem(zi);
+
+  zipClose := err;
+end;
+
+end.

+ 304 - 0
packages/base/paszlib/ziputils.pas

@@ -0,0 +1,304 @@
+unit ziputils;
+
+{ ziputils.pas - IO on .zip files using zlib
+  - definitions, declarations and routines used by both
+    zip.pas and unzip.pas
+    The file IO is implemented here.
+
+  based on work by Gilles Vollant
+
+  March 23th, 2000,
+  Copyright (C) 2000 Jacques Nomssi Nzali }
+
+interface
+
+{$undef UseStream}
+
+{$ifdef WIN32}
+  {$define Delphi}
+  {$ifdef UseStream}
+    {$define Streams}
+  {$endif}
+{$endif}
+
+//uses  Classes, SysUtils;
+
+{ -------------------------------------------------------------- }
+{$ifdef Streams}
+type
+  FILEptr = TFileStream;
+{$else}
+type
+  FILEptr = ^file;
+{$endif}
+
+type
+  seek_mode = (SEEK_SET, SEEK_CUR, SEEK_END);
+  open_mode = (fopenread, fopenwrite, fappendwrite);
+
+function fopen(filename: PChar; mode: open_mode): FILEptr;
+
+procedure fclose(fp: FILEptr);
+
+function fseek(fp: FILEptr; recPos: longint; mode: seek_mode): longint;
+
+function fread(buf: pointer; recSize: longint; recCount: longint; fp: FILEptr): longint;
+
+function fwrite(buf: pointer; recSize: longint; recCount: longint; fp: FILEptr): longint;
+
+function ftell(fp: FILEptr): longint;  { ZIP }
+
+function feof(fp: FILEptr): longint;   { MiniZIP }
+
+{ ------------------------------------------------------------------- }
+
+type
+  zipFile = pointer;
+  unzFile = pointer;
+
+type
+  z_off_t = longint;
+
+{ tm_zip contain date/time info }
+type
+  tm_zip = record
+    tm_sec:  longint;            { seconds after the minute - [0,59] }
+    tm_min:  longint;            { minutes after the hour - [0,59] }
+    tm_hour: longint;            { hours since midnight - [0,23] }
+    tm_mday: longint;            { day of the month - [1,31] }
+    tm_mon:  longint;            { months since January - [0,11] }
+    tm_year: longint;            { years - [1980..2044] }
+  end;
+
+  tm_unz = tm_zip;
+
+const
+  Z_BUFSIZE = (16384);
+  Z_MAXFILENAMEINZIP = (256);
+
+const
+  CENTRALHEADERMAGIC = $02014b50;
+
+const
+  SIZECENTRALDIRITEM = $2e;
+  SIZEZIPLOCALHEADER = $1e;
+
+const
+  Paszip_copyright: PChar = ' Paszip Copyright 2000 Jacques Nomssi Nzali ';
+
+implementation
+
+{$ifdef Streams}
+{ ---------------------------------------------------------------- }
+
+function fopen(filename: PChar; mode: open_mode): FILEptr;
+var
+  fp: FILEptr;
+begin
+  fp := nil;
+  try
+    case mode of
+      fopenread: fp  := TFileStream.Create(filename, fmOpenRead);
+      fopenwrite: fp := TFileStream.Create(filename, fmCreate);
+      fappendwrite:
+      begin
+        fp := TFileStream.Create(filename, fmOpenReadWrite);
+        fp.Seek(soFromEnd, 0);
+      end;
+    end;
+  except
+    on EFOpenError do
+      fp := nil;
+  end;
+  fopen := fp;
+end;
+
+procedure fclose(fp: FILEptr);
+begin
+  fp.Free;
+end;
+
+function fread(buf: pointer; recSize: longint; recCount: longint; fp: FILEptr): longint;
+var
+  totalSize, readcount: longint;
+begin
+  if Assigned(buf) then
+  begin
+    totalSize := recCount * longint(recSize);
+    readCount := fp.Read(buf^, totalSize);
+    if (readcount <> totalSize) then
+      fread := readcount div recSize
+    else
+      fread := recCount;
+  end
+  else
+    fread := 0;
+end;
+
+function fwrite(buf: pointer; recSize: longint; recCount: longint; fp: FILEptr): longint;
+var
+  totalSize, written: longint;
+begin
+  if Assigned(buf) then
+  begin
+    totalSize := recCount * longint(recSize);
+    written   := fp.Write(buf^, totalSize);
+    if (written <> totalSize) then
+      fwrite := written div recSize
+    else
+      fwrite := recCount;
+  end
+  else
+    fwrite := 0;
+end;
+
+function fseek(fp: FILEptr; recPos: longint; mode: seek_mode): int;
+const
+  fsmode: array[seek_mode] of word = (soFromBeginning, soFromCurrent, soFromEnd);
+begin
+  fp.Seek(recPos, fsmode[mode]);
+  fseek := 0; { = 0 for success }
+end;
+
+function ftell(fp: FILEptr): longint;
+begin
+  ftell := fp.Position;
+end;
+
+function feof(fp: FILEptr): longint;
+begin
+  feof := 0;
+  if Assigned(fp) then
+    if fp.Position = fp.Size then
+      feof := 1
+    else
+      feof := 0;
+end;
+
+{$else}
+{ ---------------------------------------------------------------- }
+
+function fopen(filename : PChar; mode : open_mode) : FILEptr;
+var
+  fp : FILEptr;
+  OldFileMode : byte;
+begin
+  fp := NIL;
+  OldFileMode := FileMode;
+
+  GetMem(fp, SizeOf(file));
+  Assign(fp^, filename);
+  {$i-}
+  Case mode of
+  fopenread:
+    begin
+      FileMode := 0;
+      Reset(fp^, 1);
+    end;
+  fopenwrite:
+    begin
+      FileMode := 1;
+      ReWrite(fp^, 1);
+    end;
+  fappendwrite :
+    begin
+      FileMode := 2;
+      Reset(fp^, 1);
+      Seek(fp^, FileSize(fp^));
+    end;
+  end;
+  FileMode := OldFileMode;
+  if IOresult<>0 then
+  begin
+    FreeMem(fp, SizeOf(file));
+    fp := NIL;
+  end;
+
+  fopen := fp;
+end;
+
+procedure fclose(fp : FILEptr);
+begin
+  if Assigned(fp) then
+  begin
+    {$i-}
+    system.close(fp^);
+    if IOresult=0 then;
+    FreeMem(fp, SizeOf(file));
+  end;
+end;
+
+function fread(buf : pointer;
+               recSize : LongInt;
+               recCount : LongInt;
+               fp : FILEptr) : LongInt;
+var
+  totalSize, readcount : LongInt;
+begin
+  if Assigned(buf) then
+  begin
+    totalSize := recCount * LongInt(recSize);
+    {$i-}
+    system.BlockRead(fp^, buf^, totalSize, readcount);
+    if (readcount <> totalSize) then
+      fread := readcount div recSize
+    else
+      fread := recCount;
+  end
+  else
+    fread := 0;
+end;
+
+function fwrite(buf : pointer;
+                recSize : LongInt;
+                recCount : LongInt;
+                fp : FILEptr) : LongInt;
+var
+  totalSize, written : LongInt;
+begin
+  if Assigned(buf) then
+  begin
+    totalSize := recCount * LongInt(recSize);
+    {$i-}
+    system.BlockWrite(fp^, buf^, totalSize, written);
+    if (written <> totalSize) then
+      fwrite := written div recSize
+    else
+      fwrite := recCount;
+  end
+  else
+    fwrite := 0;
+end;
+
+function fseek(fp : FILEptr;
+               recPos : LongInt;
+               mode : seek_mode) : longint;
+begin
+  {$i-}
+  case mode of
+    SEEK_SET : system.Seek(fp^, recPos);
+    SEEK_CUR : system.Seek(fp^, FilePos(fp^)+recPos);
+    SEEK_END : system.Seek(fp^, FileSize(fp^)-1-recPos); { ?? check }
+  end;
+  fseek := IOresult; { = 0 for success }
+end;
+
+function ftell(fp : FILEptr) : LongInt;
+begin
+  ftell := FilePos(fp^);
+end;
+
+function feof(fp : FILEptr) : LongInt;
+begin
+  feof := 0;
+  if Assigned(fp) then
+    if eof(fp^) then
+      feof := 1
+    else
+      feof := 0;
+end;
+
+{$endif}
+{ ---------------------------------------------------------------- }
+
+end.

+ 1 - 1
packages/base/pthreads/fpmake.inc

@@ -4,6 +4,6 @@
     {$ELSEIF defined(BASEPACKAGES)}
     Directory:='pthreads';
     {$ENDIF}
-    OS:=[linux,freebsd,darwin];
+    OS:=[linux,freebsd,darwin,beos],;
     T:=Targets.AddUnit('pthreads');
     EndPackage;

+ 18 - 15
packages/base/pthreads/pthreads.pp

@@ -21,23 +21,26 @@ interface
 {$PACKRECORDS C}
 
 {$ifdef BSD}
-Uses BaseUnix, unixtype;
+uses initc,BaseUnix, unixtype;
 {$i pthrbsd.inc}
 {$else}
-
-{$ifdef linux}
-uses unixtype;
-{$i pthrlinux.inc}
-{$else}
-
-{$ifdef sunos}
-uses
-  unixtype;
-{$i pthrsnos.inc}
-{$else}
-
-{$endif}
-{$endif}
+ {$ifdef linux}
+ uses initc,unixtype;
+ {$i pthrlinux.inc}
+ {$else}
+
+  {$ifdef sunos}
+  uses initc,unixtype;
+  {$i pthrsnos.inc}
+  {$else}
+   {$ifdef beos}
+   uses initc, baseunix, unixtype;
+   {$i pthrbeos.inc}
+   {$else}
+    {$error operating system not detected}
+   {$endif}
+  {$endif}
+ {$endif}
 {$endif}
 
 implementation

+ 4 - 4
packages/base/pthreads/pthrlinux.inc

@@ -64,6 +64,7 @@ Const
   PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP = 2;
   PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_WRITER_NP;
 
+
   _SIGSET_NWORDS  = 1024 div (8 * SizeOf(LongWord));
 
 type
@@ -79,13 +80,13 @@ type
   PSize_t = ^Size_t;
 
   // From scheduler.
-
+{ already in unix type
   timespec =  record
     tv_sec: cint;
     tv_nsec: cint;
   end;
   TTimeSpec = timespec;
-  PTimeSpec = ^TTimeSpec;
+  PTimeSpec = ^TTimeSpec; }
 
   // procedural types used in parameters to pthread functions
 
@@ -94,9 +95,7 @@ type
   TInitOnceProc = Procedure;cdecl;
   TForkHandler = procedure; cdecl;
 
-  TThreadID = pthread_t;
   PPTHREAD_T = ^PTHREAD_T;
-  PThreadID = ^TThreadID;
 
   _PTHREAD_DESCR = Pointer;
   TPTHREAD_DESCR = _PTHREAD_DESCR;
@@ -308,6 +307,7 @@ type
   function sem_trywait(__sem:Psem_t):cint;cdecl;external libthreads;
   function sem_post(__sem:Psem_t):cint;cdecl;external libthreads;
   function sem_getvalue(__sem:Psem_t; __sval:pcint):cint;cdecl;external libthreads;
+  function sem_timedwait(__sem: Psem_t; __abstime: Ptimespec):cint;cdecl; external libthreads;
 
 { ---------------------------------------------------------------------
      Overloaded versions with var args instead of pointers

+ 60 - 54
packages/base/sqlite/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/29]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/22]
 #
 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 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-darwin powerpc64-embedded
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
@@ -231,159 +231,162 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 override PACKAGE_NAME=sqlite
-override PACKAGE_VERSION=2.2.1
+override PACKAGE_VERSION=2.0.0
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_UNITS+=sqlite sqlite3 sqlitedb sqlite3db
+override TARGET_UNITS+=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 endif
 override INSTALL_FPCPACKAGE=y
 override SHARED_BUILD=n
@@ -1286,6 +1289,9 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 endif

+ 1 - 1
packages/base/sqlite/Makefile.fpc

@@ -7,7 +7,7 @@ name=sqlite
 version=2.2.1
 
 [target]
-units=sqlite sqlite3 sqlitedb sqlite3db
+units=sqlite sqlite3 sqlite3dyn sqlitedb sqlite3db
 
 [require]
 

+ 576 - 0
packages/base/sqlite/sqlite3.inc

@@ -0,0 +1,576 @@
+{$mode objfpc}
+
+{$ifdef BSD}
+  {$linklib c}
+  {$linklib pthread}
+{$endif}
+
+interface
+
+{$ifdef LOAD_DYNAMICALLY}
+uses 
+  SysUtils, DynLibs;
+{$endif}
+
+{
+  Automatically converted by H2Pas 0.99.16 from sqlite3.h
+  The following command line parameters were used:
+    -D
+    -c
+    sqlite3.h
+
+  Manual corrections made by Luiz Américo - 2005
+}
+
+{$PACKRECORDS C}
+
+const
+{$IFDEF MSWINDOWS}
+  Sqlite3Lib = 'sqlite3.dll';
+{$else}
+  Sqlite3Lib = 'libsqlite3.so';
+{$endif}
+
+  SQLITE_INTEGER = 1;   
+  SQLITE_FLOAT = 2;   
+{ #define SQLITE_TEXT  3  // See below  }
+  SQLITE_BLOB = 4;   
+  SQLITE_NULL = 5;   
+  SQLITE_TEXT = 3;   
+  SQLITE3_TEXT = 3;   
+  SQLITE_UTF8 = 1;       
+  SQLITE_UTF16LE = 2;       
+  SQLITE_UTF16BE = 3;       
+{ Use native byte order  }
+  SQLITE_UTF16 = 4;       
+{ sqlite3_create_function only  }
+  SQLITE_ANY = 5;  
+   
+   //sqlite_exec return values
+  SQLITE_OK = 0;   
+  SQLITE_ERROR = 1;{ SQL error or missing database  }
+  SQLITE_INTERNAL = 2;{ An internal logic error in SQLite  }
+  SQLITE_PERM = 3;   { Access permission denied  }
+  SQLITE_ABORT = 4; { Callback routine requested an abort  }
+  SQLITE_BUSY = 5;  { The database file is locked  }
+  SQLITE_LOCKED = 6;{ A table in the database is locked  }
+  SQLITE_NOMEM = 7; { A malloc() failed  }
+  SQLITE_READONLY = 8;{ Attempt to write a readonly database  }
+  SQLITE_INTERRUPT = 9;{ Operation terminated by sqlite3_interrupt() }
+  SQLITE_IOERR = 10;   { Some kind of disk I/O error occurred  }
+  SQLITE_CORRUPT = 11;   { The database disk image is malformed  }
+  SQLITE_NOTFOUND = 12;   { (Internal Only) Table or record not found  }
+  SQLITE_FULL = 13;   { Insertion failed because database is full  }
+  SQLITE_CANTOPEN = 14;   { Unable to open the database file  }
+  SQLITE_PROTOCOL = 15;   { Database lock protocol error  }
+  SQLITE_EMPTY = 16;   { Database is empty  }
+  SQLITE_SCHEMA = 17;   { The database schema changed  }
+  SQLITE_TOOBIG = 18;   { Too much data for one row of a table  }
+  SQLITE_CONSTRAINT = 19;   { Abort due to contraint violation  }
+  SQLITE_MISMATCH = 20;   { Data type mismatch  }
+  SQLITE_MISUSE = 21;   { Library used incorrectly  }
+  SQLITE_NOLFS = 22;   { Uses OS features not supported on host  }
+  SQLITE_AUTH = 23;   { Authorization denied  }
+  SQLITE_FORMAT = 24;   { Auxiliary database format error  }
+  SQLITE_RANGE = 25;   { 2nd parameter to sqlite3_bind out of range  }
+  SQLITE_NOTADB = 26;   { File opened that is not a database file  }
+  SQLITE_ROW = 100;   { sqlite3_step() has another row ready  }
+  SQLITE_DONE = 101;   { sqlite3_step() has finished executing  }
+
+   SQLITE_COPY = 0;   
+   SQLITE_CREATE_INDEX = 1;   
+   SQLITE_CREATE_TABLE = 2;   
+   SQLITE_CREATE_TEMP_INDEX = 3;   
+   SQLITE_CREATE_TEMP_TABLE = 4;   
+   SQLITE_CREATE_TEMP_TRIGGER = 5;   
+   SQLITE_CREATE_TEMP_VIEW = 6;   
+   SQLITE_CREATE_TRIGGER = 7;   
+   SQLITE_CREATE_VIEW = 8;   
+   SQLITE_DELETE = 9;   
+   SQLITE_DROP_INDEX = 10;   
+   SQLITE_DROP_TABLE = 11;   
+   SQLITE_DROP_TEMP_INDEX = 12;   
+   SQLITE_DROP_TEMP_TABLE = 13;   
+   SQLITE_DROP_TEMP_TRIGGER = 14;   
+   SQLITE_DROP_TEMP_VIEW = 15;   
+   SQLITE_DROP_TRIGGER = 16;   
+   SQLITE_DROP_VIEW = 17;   
+   SQLITE_INSERT = 18;   
+   SQLITE_PRAGMA = 19;   
+   SQLITE_READ = 20;   
+   SQLITE_SELECT = 21;   
+   SQLITE_TRANSACTION = 22;   
+   SQLITE_UPDATE = 23;   
+   SQLITE_ATTACH = 24;   
+   SQLITE_DETACH = 25;   
+   SQLITE_ALTER_TABLE = 26;   
+   SQLITE_REINDEX = 27;   
+
+  SQLITE_DENY = 1;   
+  SQLITE_IGNORE = 2;   
+
+// Original from sqlite3.h: 
+//#define SQLITE_STATIC      ((void(*)(void *))0)
+//#define SQLITE_TRANSIENT   ((void(*)(void *))-1)
+Const
+  SQLITE_STATIC    =  0;
+  SQLITE_TRANSIENT =  -1;
+
+type
+  sqlite_int64 = int64;
+  sqlite_uint64 = qword;
+  PPPChar = ^PPChar;
+  Psqlite3  = Pointer;
+  PPSqlite3 = ^PSqlite3;
+  Psqlite3_context  = Pointer;
+  Psqlite3_stmt  = Pointer;
+  PPsqlite3_stmt = ^Psqlite3_stmt;
+  Psqlite3_value  = Pointer;
+  PPsqlite3_value  = ^Psqlite3_value;
+
+//Callback function types
+//Notice that most functions were named using as prefix the function name that uses them,
+//rather than describing their functions  
+
+  sqlite3_callback = function (_para1:pointer; _para2:longint; _para3:PPchar; _para4:PPchar):longint;cdecl;
+  busy_handler_func = function (_para1:pointer; _para2:longint):longint;cdecl;
+  sqlite3_set_authorizer_func = function (_para1:pointer; _para2:longint; _para3:Pchar; _para4:Pchar; _para5:Pchar; _para6:Pchar):longint;cdecl;
+  sqlite3_trace_func = procedure (_para1:pointer; _para2:Pchar);cdecl;
+  sqlite3_progress_handler_func = function (_para1:pointer):longint;cdecl;
+  sqlite3_commit_hook_func = function (_para1:pointer):longint;cdecl;
+  bind_destructor_func = procedure (_para1:pointer);cdecl;
+  create_function_step_func = procedure (_para1:Psqlite3_context; _para2:longint; _para3:PPsqlite3_value);cdecl;
+  create_function_func_func = procedure (_para1:Psqlite3_context; _para2:longint; _para3:PPsqlite3_value);cdecl;
+  create_function_final_func = procedure (_para1:Psqlite3_context);cdecl;
+  sqlite3_set_auxdata_func = procedure (_para1:pointer);cdecl;
+  sqlite3_result_func = procedure (_para1:pointer);cdecl;
+  sqlite3_create_collation_func = function (_para1:pointer; _para2:longint; _para3:pointer; _para4:longint; _para5:pointer):longint;cdecl;
+  sqlite3_collation_needed_func = procedure (_para1:pointer; _para2:Psqlite3; eTextRep:longint; _para4:Pchar);cdecl;
+
+{$ifndef win32}
+var
+  //This is not working under windows. Any clues?
+  sqlite3_temp_directory : Pchar;cvar; external;
+{$endif}
+
+{$IFNDEF LOAD_DYNAMICALLY}
+
+function sqlite3_close(_para1:Psqlite3):longint;cdecl; external Sqlite3Lib name 'sqlite3_close';
+function sqlite3_exec(_para1:Psqlite3; sql:Pchar; _para3:sqlite3_callback; _para4:pointer; errmsg:PPchar):longint;cdecl; external Sqlite3Lib name 'sqlite3_exec';
+function sqlite3_last_insert_rowid(_para1:Psqlite3):sqlite_int64;cdecl; external Sqlite3Lib name 'sqlite3_last_insert_rowid';
+function sqlite3_changes(_para1:Psqlite3):longint;cdecl; external Sqlite3Lib name 'sqlite3_changes';
+function sqlite3_total_changes(_para1:Psqlite3):longint;cdecl; external Sqlite3Lib name 'sqlite3_total_changes';
+procedure sqlite3_interrupt(_para1:Psqlite3);cdecl; external Sqlite3Lib name 'sqlite3_interrupt';
+function sqlite3_complete(sql:Pchar):longint;cdecl; external Sqlite3Lib name 'sqlite3_complete';
+function sqlite3_complete16(sql:pointer):longint;cdecl; external Sqlite3Lib name 'sqlite3_complete16';
+function sqlite3_busy_handler(_para1:Psqlite3; _para2:busy_handler_func; _para3:pointer):longint;cdecl; external Sqlite3Lib name 'sqlite3_busy_handler';
+function sqlite3_busy_timeout(_para1:Psqlite3; ms:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_busy_timeout';
+function sqlite3_get_table(_para1:Psqlite3; sql:Pchar; resultp:PPPchar; nrow:Plongint; ncolumn:Plongint; errmsg:PPchar):longint;cdecl; external Sqlite3Lib name 'sqlite3_get_table';
+procedure sqlite3_free_table(result:PPchar);cdecl; external Sqlite3Lib name 'sqlite3_free_table';
+// Todo: see how translate sqlite3_mprintf, sqlite3_vmprintf, sqlite3_snprintf
+// function sqlite3_mprintf(_para1:Pchar; args:array of const):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_mprintf';
+function sqlite3_mprintf(_para1:Pchar):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_mprintf';
+//function sqlite3_vmprintf(_para1:Pchar; _para2:va_list):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_vmprintf';
+procedure sqlite3_free(z:Pchar);cdecl; external Sqlite3Lib name 'sqlite3_free';
+//function sqlite3_snprintf(_para1:longint; _para2:Pchar; _para3:Pchar; args:array of const):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_snprintf';
+function sqlite3_snprintf(_para1:longint; _para2:Pchar; _para3:Pchar):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_snprintf';
+function sqlite3_set_authorizer(_para1:Psqlite3; xAuth:sqlite3_set_authorizer_func; pUserData:pointer):longint;cdecl; external Sqlite3Lib name 'sqlite3_set_authorizer';
+function sqlite3_trace(_para1:Psqlite3; xTrace:sqlite3_trace_func; _para3:pointer):pointer;cdecl; external Sqlite3Lib name 'sqlite3_trace';
+procedure sqlite3_progress_handler(_para1:Psqlite3; _para2:longint; _para3:sqlite3_progress_handler_func; _para4:pointer);cdecl; external Sqlite3Lib name 'sqlite3_progress_handler';
+function sqlite3_commit_hook(_para1:Psqlite3; _para2:sqlite3_commit_hook_func; _para3:pointer):pointer;cdecl; external Sqlite3Lib name 'sqlite3_commit_hook';
+function sqlite3_open(filename:Pchar; ppDb:PPsqlite3):longint;cdecl; external Sqlite3Lib name 'sqlite3_open';
+function sqlite3_open16(filename:pointer; ppDb:PPsqlite3):longint;cdecl; external Sqlite3Lib name 'sqlite3_open16';
+function sqlite3_errcode(db:Psqlite3):longint;cdecl; external Sqlite3Lib name 'sqlite3_errcode';
+function sqlite3_errmsg(_para1:Psqlite3):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_errmsg';
+function sqlite3_errmsg16(_para1:Psqlite3):pointer;cdecl; external Sqlite3Lib name 'sqlite3_errmsg16';
+function sqlite3_prepare(db:Psqlite3; zSql:Pchar; nBytes:longint; ppStmt:PPsqlite3_stmt; pzTail:PPchar):longint;cdecl; external Sqlite3Lib name 'sqlite3_prepare';
+function sqlite3_prepare16(db:Psqlite3; zSql:pointer; nBytes:longint; ppStmt:PPsqlite3_stmt; pzTail:Ppointer):longint;cdecl; external Sqlite3Lib name 'sqlite3_prepare16';
+function sqlite3_bind_blob(_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; n:longint; _para5:bind_destructor_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_blob';
+function sqlite3_bind_double(_para1:Psqlite3_stmt; _para2:longint; _para3:double):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_double';
+function sqlite3_bind_int(_para1:Psqlite3_stmt; _para2:longint; _para3:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_int';
+function sqlite3_bind_int64(_para1:Psqlite3_stmt; _para2:longint; _para3:sqlite_int64):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_int64';
+function sqlite3_bind_null(_para1:Psqlite3_stmt; _para2:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_null';
+function sqlite3_bind_text(_para1:Psqlite3_stmt; _para2:longint; _para3:Pchar; n:longint; _para5:bind_destructor_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_text';
+function sqlite3_bind_text16(_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; _para4:longint; _para5:bind_destructor_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_text16';
+//function sqlite3_bind_value(_para1:Psqlite3_stmt; _para2:longint; _para3:Psqlite3_value):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_value';
+//These overloaded functions were introduced to allow the use of SQLITE_STATIC and SQLITE_TRANSIENT
+//It's the c world man ;-)
+function sqlite3_bind_blob(_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; n:longint; _para5:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_blob';
+function sqlite3_bind_text(_para1:Psqlite3_stmt; _para2:longint; _para3:Pchar; n:longint; _para5:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_text';
+function sqlite3_bind_text16(_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; _para4:longint; _para5:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_text16';
+
+function sqlite3_bind_parameter_count(_para1:Psqlite3_stmt):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_parameter_count';
+function sqlite3_bind_parameter_name(_para1:Psqlite3_stmt; _para2:longint):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_bind_parameter_name';
+function sqlite3_bind_parameter_index(_para1:Psqlite3_stmt; zName:Pchar):longint;cdecl; external Sqlite3Lib name 'sqlite3_bind_parameter_index';
+//function sqlite3_clear_bindings(_para1:Psqlite3_stmt):longint;cdecl; external Sqlite3Lib name 'sqlite3_clear_bindings';
+function sqlite3_column_count(pStmt:Psqlite3_stmt):longint;cdecl; external Sqlite3Lib name 'sqlite3_column_count';
+function sqlite3_column_name(_para1:Psqlite3_stmt; _para2:longint):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_column_name';
+function sqlite3_column_name16(_para1:Psqlite3_stmt; _para2:longint):pointer;cdecl; external Sqlite3Lib name 'sqlite3_column_name16';
+function sqlite3_column_decltype(_para1:Psqlite3_stmt; i:longint):Pchar;cdecl; external Sqlite3Lib name 'sqlite3_column_decltype';
+function sqlite3_column_decltype16(_para1:Psqlite3_stmt; _para2:longint):pointer;cdecl; external Sqlite3Lib name 'sqlite3_column_decltype16';
+function sqlite3_step(_para1:Psqlite3_stmt):longint;cdecl; external Sqlite3Lib name 'sqlite3_step';
+function sqlite3_data_count(pStmt:Psqlite3_stmt):longint;cdecl; external Sqlite3Lib name 'sqlite3_data_count';
+function sqlite3_column_blob(_para1:Psqlite3_stmt; iCol:longint):pointer;cdecl; external Sqlite3Lib name 'sqlite3_column_blob';
+function sqlite3_column_bytes(_para1:Psqlite3_stmt; iCol:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_column_bytes';
+function sqlite3_column_bytes16(_para1:Psqlite3_stmt; iCol:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_column_bytes16';
+function sqlite3_column_double(_para1:Psqlite3_stmt; iCol:longint):double;cdecl; external Sqlite3Lib name 'sqlite3_column_double';
+function sqlite3_column_int(_para1:Psqlite3_stmt; iCol:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_column_int';
+function sqlite3_column_int64(_para1:Psqlite3_stmt; iCol:longint):sqlite_int64;cdecl; external Sqlite3Lib name 'sqlite3_column_int64';
+function sqlite3_column_text(_para1:Psqlite3_stmt; iCol:longint):PChar;cdecl; external Sqlite3Lib name 'sqlite3_column_text';
+function sqlite3_column_text16(_para1:Psqlite3_stmt; iCol:longint):pointer;cdecl; external Sqlite3Lib name 'sqlite3_column_text16';
+function sqlite3_column_type(_para1:Psqlite3_stmt; iCol:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_column_type';
+function sqlite3_finalize(pStmt:Psqlite3_stmt):longint;cdecl; external Sqlite3Lib name 'sqlite3_finalize';
+function sqlite3_reset(pStmt:Psqlite3_stmt):longint;cdecl; external Sqlite3Lib name 'sqlite3_reset';
+function sqlite3_create_function(_para1:Psqlite3; zFunctionName:Pchar; nArg:longint; eTextRep:longint; _para5:pointer;        xFunc:create_function_func_func; xStep:create_function_step_func; xFinal:create_function_final_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_create_function';
+function sqlite3_create_function16(_para1:Psqlite3; zFunctionName:pointer; nArg:longint; eTextRep:longint; _para5:pointer;            xFunc:create_function_func_func; xStep:create_function_step_func; xFinal:create_function_final_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_create_function16';
+function sqlite3_aggregate_count(_para1:Psqlite3_context):longint;cdecl; external Sqlite3Lib name 'sqlite3_aggregate_count';
+function sqlite3_value_blob(_para1:Psqlite3_value):pointer;cdecl; external Sqlite3Lib name 'sqlite3_value_blob';
+function sqlite3_value_bytes(_para1:Psqlite3_value):longint;cdecl; external Sqlite3Lib name 'sqlite3_value_bytes';
+function sqlite3_value_bytes16(_para1:Psqlite3_value):longint;cdecl; external Sqlite3Lib name 'sqlite3_value_bytes16';
+function sqlite3_value_double(_para1:Psqlite3_value):double;cdecl; external Sqlite3Lib name 'sqlite3_value_double';
+function sqlite3_value_int(_para1:Psqlite3_value):longint;cdecl; external Sqlite3Lib name 'sqlite3_value_int';
+function sqlite3_value_int64(_para1:Psqlite3_value):sqlite_int64;cdecl; external Sqlite3Lib name 'sqlite3_value_int64';
+function sqlite3_value_text(_para1:Psqlite3_value):PChar;cdecl; external Sqlite3Lib name 'sqlite3_value_text';
+function sqlite3_value_text16(_para1:Psqlite3_value):pointer;cdecl; external Sqlite3Lib name 'sqlite3_value_text16';
+function sqlite3_value_text16le(_para1:Psqlite3_value):pointer;cdecl; external Sqlite3Lib name 'sqlite3_value_text16le';
+function sqlite3_value_text16be(_para1:Psqlite3_value):pointer;cdecl; external Sqlite3Lib name 'sqlite3_value_text16be';
+function sqlite3_value_type(_para1:Psqlite3_value):longint;cdecl; external Sqlite3Lib name 'sqlite3_value_type';
+function sqlite3_aggregate_context(_para1:Psqlite3_context; nBytes:longint):pointer;cdecl; external Sqlite3Lib name 'sqlite3_aggregate_context';
+function sqlite3_user_data(_para1:Psqlite3_context):pointer;cdecl; external Sqlite3Lib name 'sqlite3_user_data';
+function sqlite3_get_auxdata(_para1:Psqlite3_context; _para2:longint):pointer;cdecl; external Sqlite3Lib name 'sqlite3_get_auxdata';
+procedure sqlite3_set_auxdata(_para1:Psqlite3_context; _para2:longint; _para3:pointer; _para4:sqlite3_set_auxdata_func);cdecl; external Sqlite3Lib name 'sqlite3_set_auxdata';
+procedure sqlite3_result_blob(_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl; external Sqlite3Lib name 'sqlite3_result_blob';
+procedure sqlite3_result_double(_para1:Psqlite3_context; _para2:double);cdecl; external Sqlite3Lib name 'sqlite3_result_double';
+procedure sqlite3_result_error(_para1:Psqlite3_context; _para2:Pchar; _para3:longint);cdecl; external Sqlite3Lib name 'sqlite3_result_error';
+procedure sqlite3_result_error16(_para1:Psqlite3_context; _para2:pointer; _para3:longint);cdecl; external Sqlite3Lib name 'sqlite3_result_error16';
+procedure sqlite3_result_int(_para1:Psqlite3_context; _para2:longint);cdecl; external Sqlite3Lib name 'sqlite3_result_int';
+procedure sqlite3_result_int64(_para1:Psqlite3_context; _para2:sqlite_int64);cdecl; external Sqlite3Lib name 'sqlite3_result_int64';
+procedure sqlite3_result_null(_para1:Psqlite3_context);cdecl; external Sqlite3Lib name 'sqlite3_result_null';
+procedure sqlite3_result_text(_para1:Psqlite3_context; _para2:Pchar; _para3:longint; _para4:sqlite3_result_func);cdecl; external Sqlite3Lib name 'sqlite3_result_text';
+procedure sqlite3_result_text16(_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl; external Sqlite3Lib name 'sqlite3_result_text16';
+procedure sqlite3_result_text16le(_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl; external Sqlite3Lib name 'sqlite3_result_text16le';
+procedure sqlite3_result_text16be(_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl; external Sqlite3Lib name 'sqlite3_result_text16be';
+procedure sqlite3_result_value(_para1:Psqlite3_context; _para2:Psqlite3_value);cdecl; external Sqlite3Lib name 'sqlite3_result_value';     
+function sqlite3_create_collation(_para1:Psqlite3; zName:Pchar; eTextRep:longint; _para4:pointer; xCompare:sqlite3_create_collation_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_create_collation';
+function sqlite3_create_collation16(_para1:Psqlite3; zName:Pchar; eTextRep:longint; _para4:pointer; xCompare:sqlite3_create_collation_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_create_collation16';
+function sqlite3_collation_needed(_para1:Psqlite3; _para2:pointer; _para3:sqlite3_collation_needed_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_collation_needed';
+function sqlite3_collation_needed16(_para1:Psqlite3; _para2:pointer; _para3:sqlite3_collation_needed_func):longint;cdecl; external Sqlite3Lib name 'sqlite3_collation_needed16';
+function sqlite3_libversion:PChar;cdecl; external Sqlite3Lib name 'sqlite3_libversion';
+//Alias for allowing better code portability (win32 is not working with external variables) 
+function sqlite3_version:PChar;cdecl; external Sqlite3Lib name 'sqlite3_libversion';
+
+// Not published functions
+function sqlite3_libversion_number:longint;cdecl; external Sqlite3Lib name 'sqlite3_libversion_number';
+//function sqlite3_key(db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_key';
+//function sqlite3_rekey(db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_rekey';
+//function sqlite3_sleep(_para1:longint):longint;cdecl; external Sqlite3Lib name 'sqlite3_sleep';
+//function sqlite3_expired(_para1:Psqlite3_stmt):longint;cdecl; external Sqlite3Lib name 'sqlite3_expired';
+//function sqlite3_global_recover:longint;cdecl; external Sqlite3Lib name 'sqlite3_global_recover';
+
+{$ELSE LOAD_DYNAMICALLY}
+
+Var
+  sqlite3_close : function (_para1:Psqlite3):longint;cdecl;
+  sqlite3_exec : function (_para1:Psqlite3; sql:Pchar; _para3:sqlite3_callback; _para4:pointer; errmsg:PPchar):longint;cdecl;
+  sqlite3_last_insert_rowid : function (_para1:Psqlite3):sqlite_int64;cdecl;
+  sqlite3_changes : function (_para1:Psqlite3):longint;cdecl;
+  sqlite3_total_changes : function (_para1:Psqlite3):longint;cdecl;
+  sqlite3_interrupt : procedure (_para1:Psqlite3);cdecl;
+  sqlite3_complete : function (sql:Pchar):longint;cdecl;
+  sqlite3_complete16 : function (sql:pointer):longint;cdecl;
+  sqlite3_busy_handler : function (_para1:Psqlite3; _para2:busy_handler_func; _para3:pointer):longint;cdecl;
+  sqlite3_busy_timeout : function (_para1:Psqlite3; ms:longint):longint;cdecl;
+  sqlite3_get_table : function (_para1:Psqlite3; sql:Pchar; resultp:PPPchar; nrow:Plongint; ncolumn:Plongint; errmsg:PPchar):longint;cdecl;
+  sqlite3_free_table : procedure (result:PPchar);cdecl;
+// Todo: see how translate sqlite3_mprintf, sqlite3_vmprintf, sqlite3_snprintf
+//   sqlite3_mprintf : function (_para1:Pchar; args:array of const):Pchar;cdecl;
+  sqlite3_mprintf : function (_para1:Pchar):Pchar;cdecl;
+//  sqlite3_vmprintf : function (_para1:Pchar; _para2:va_list):Pchar;cdecl;
+  sqlite3_free : procedure (z:Pchar);cdecl;
+//  sqlite3_snprintf : function (_para1:longint; _para2:Pchar; _para3:Pchar; args:array of const):Pchar;cdecl;
+  sqlite3_snprintf : function (_para1:longint; _para2:Pchar; _para3:Pchar):Pchar;cdecl;
+  sqlite3_set_authorizer : function (_para1:Psqlite3; xAuth:sqlite3_set_authorizer_func; pUserData:pointer):longint;cdecl;
+  sqlite3_trace : function (_para1:Psqlite3; xTrace:sqlite3_trace_func; _para3:pointer):pointer;cdecl;
+  sqlite3_progress_handler : procedure (_para1:Psqlite3; _para2:longint; _para3:sqlite3_progress_handler_func; _para4:pointer);cdecl;
+  sqlite3_commit_hook : function (_para1:Psqlite3; _para2:sqlite3_commit_hook_func; _para3:pointer):pointer;cdecl;
+  sqlite3_open : function (filename:Pchar; ppDb:PPsqlite3):longint;cdecl;
+  sqlite3_open16 : function (filename:pointer; ppDb:PPsqlite3):longint;cdecl;
+  sqlite3_errcode : function (db:Psqlite3):longint;cdecl;
+  sqlite3_errmsg : function (_para1:Psqlite3):Pchar;cdecl;
+  sqlite3_errmsg16 : function (_para1:Psqlite3):pointer;cdecl;
+  sqlite3_prepare : function (db:Psqlite3; zSql:Pchar; nBytes:longint; ppStmt:PPsqlite3_stmt; pzTail:PPchar):longint;cdecl;
+  sqlite3_prepare16 : function (db:Psqlite3; zSql:pointer; nBytes:longint; ppStmt:PPsqlite3_stmt; pzTail:Ppointer):longint;cdecl;
+  sqlite3_bind_blob : function (_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; n:longint; _para5:bind_destructor_func):longint;cdecl;
+  sqlite3_bind_double : function (_para1:Psqlite3_stmt; _para2:longint; _para3:double):longint;cdecl;
+  sqlite3_bind_int : function (_para1:Psqlite3_stmt; _para2:longint; _para3:longint):longint;cdecl;
+  sqlite3_bind_int64 : function (_para1:Psqlite3_stmt; _para2:longint; _para3:sqlite_int64):longint;cdecl;
+  sqlite3_bind_null : function (_para1:Psqlite3_stmt; _para2:longint):longint;cdecl;
+  sqlite3_bind_text : function (_para1:Psqlite3_stmt; _para2:longint; _para3:Pchar; n:longint; _para5:bind_destructor_func):longint;cdecl;
+  sqlite3_bind_text16 : function (_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; _para4:longint; _para5:bind_destructor_func):longint;cdecl;
+//  sqlite3_bind_value : function (_para1:Psqlite3_stmt; _para2:longint; _para3:Psqlite3_value):longint;cdecl;
+//These overloaded functions were introduced to allow the use of SQLITE_STATIC and SQLITE_TRANSIENT
+//It's the c world man ;-)
+  sqlite3_bind_blob1 : function (_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; n:longint; _para5:longint):longint;cdecl;
+  sqlite3_bind_text1 : function (_para1:Psqlite3_stmt; _para2:longint; _para3:Pchar; n:longint; _para5:longint):longint;cdecl;
+  sqlite3_bind_text161 : function (_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; _para4:longint; _para5:longint):longint;cdecl;
+
+  sqlite3_bind_parameter_count : function (_para1:Psqlite3_stmt):longint;cdecl;
+  sqlite3_bind_parameter_name : function (_para1:Psqlite3_stmt; _para2:longint):Pchar;cdecl;
+  sqlite3_bind_parameter_index : function (_para1:Psqlite3_stmt; zName:Pchar):longint;cdecl;
+//  sqlite3_clear_bindings : function (_para1:Psqlite3_stmt):longint;cdecl;
+  sqlite3_column_count : function (pStmt:Psqlite3_stmt):longint;cdecl;
+  sqlite3_column_name : function (_para1:Psqlite3_stmt; _para2:longint):Pchar;cdecl;
+  sqlite3_column_name16 : function (_para1:Psqlite3_stmt; _para2:longint):pointer;cdecl;
+  sqlite3_column_decltype : function (_para1:Psqlite3_stmt; i:longint):Pchar;cdecl;
+  sqlite3_column_decltype16 : function (_para1:Psqlite3_stmt; _para2:longint):pointer;cdecl;
+  sqlite3_step : function (_para1:Psqlite3_stmt):longint;cdecl;
+  sqlite3_data_count : function (pStmt:Psqlite3_stmt):longint;cdecl;
+  sqlite3_column_blob : function (_para1:Psqlite3_stmt; iCol:longint):pointer;cdecl;
+  sqlite3_column_bytes : function (_para1:Psqlite3_stmt; iCol:longint):longint;cdecl;
+  sqlite3_column_bytes16 : function (_para1:Psqlite3_stmt; iCol:longint):longint;cdecl;
+  sqlite3_column_double : function (_para1:Psqlite3_stmt; iCol:longint):double;cdecl;
+  sqlite3_column_int : function (_para1:Psqlite3_stmt; iCol:longint):longint;cdecl;
+  sqlite3_column_int64 : function (_para1:Psqlite3_stmt; iCol:longint):sqlite_int64;cdecl;
+  sqlite3_column_text : function (_para1:Psqlite3_stmt; iCol:longint):PChar;cdecl;
+  sqlite3_column_text16 : function (_para1:Psqlite3_stmt; iCol:longint):pointer;cdecl;
+  sqlite3_column_type : function (_para1:Psqlite3_stmt; iCol:longint):longint;cdecl;
+  sqlite3_finalize : function (pStmt:Psqlite3_stmt):longint;cdecl;
+  sqlite3_reset : function (pStmt:Psqlite3_stmt):longint;cdecl;
+  sqlite3_create_function : function (_para1:Psqlite3; zFunctionName:Pchar; nArg:longint; eTextRep:longint; _para5:pointer;        xFunc:create_function_func_func; xStep:create_function_step_func; xFinal:create_function_final_func):longint;cdecl;
+  sqlite3_create_function16 : function (_para1:Psqlite3; zFunctionName:pointer; nArg:longint; eTextRep:longint; _para5:pointer;            xFunc:create_function_func_func; xStep:create_function_step_func; xFinal:create_function_final_func):longint;cdecl;
+  sqlite3_aggregate_count : function (_para1:Psqlite3_context):longint;cdecl;
+  sqlite3_value_blob : function (_para1:Psqlite3_value):pointer;cdecl;
+  sqlite3_value_bytes : function (_para1:Psqlite3_value):longint;cdecl;
+  sqlite3_value_bytes16 : function (_para1:Psqlite3_value):longint;cdecl;
+  sqlite3_value_double : function (_para1:Psqlite3_value):double;cdecl;
+  sqlite3_value_int : function (_para1:Psqlite3_value):longint;cdecl;
+  sqlite3_value_int64 : function (_para1:Psqlite3_value):sqlite_int64;cdecl;
+  sqlite3_value_text : function (_para1:Psqlite3_value):PChar;cdecl;
+  sqlite3_value_text16 : function (_para1:Psqlite3_value):pointer;cdecl;
+  sqlite3_value_text16le : function (_para1:Psqlite3_value):pointer;cdecl;
+  sqlite3_value_text16be : function (_para1:Psqlite3_value):pointer;cdecl;
+  sqlite3_value_type : function (_para1:Psqlite3_value):longint;cdecl;
+  sqlite3_aggregate_context : function (_para1:Psqlite3_context; nBytes:longint):pointer;cdecl;
+  sqlite3_user_data : function (_para1:Psqlite3_context):pointer;cdecl;
+  sqlite3_get_auxdata : function (_para1:Psqlite3_context; _para2:longint):pointer;cdecl;
+  sqlite3_set_auxdata : procedure (_para1:Psqlite3_context; _para2:longint; _para3:pointer; _para4:sqlite3_set_auxdata_func);cdecl;
+  sqlite3_result_blob : procedure (_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl;
+  sqlite3_result_double : procedure (_para1:Psqlite3_context; _para2:double);cdecl;
+  sqlite3_result_error : procedure (_para1:Psqlite3_context; _para2:Pchar; _para3:longint);cdecl;
+  sqlite3_result_error16 : procedure (_para1:Psqlite3_context; _para2:pointer; _para3:longint);cdecl;
+  sqlite3_result_int : procedure (_para1:Psqlite3_context; _para2:longint);cdecl;
+  sqlite3_result_int64 : procedure (_para1:Psqlite3_context; _para2:sqlite_int64);cdecl;
+  sqlite3_result_null : procedure (_para1:Psqlite3_context);cdecl;
+  sqlite3_result_text : procedure (_para1:Psqlite3_context; _para2:Pchar; _para3:longint; _para4:sqlite3_result_func);cdecl;
+  sqlite3_result_text16 : procedure (_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl;
+  sqlite3_result_text16le : procedure (_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl;
+  sqlite3_result_text16be : procedure (_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl;
+  sqlite3_result_value : procedure (_para1:Psqlite3_context; _para2:Psqlite3_value);cdecl;     
+  sqlite3_create_collation : function (_para1:Psqlite3; zName:Pchar; eTextRep:longint; _para4:pointer; xCompare:sqlite3_create_collation_func):longint;cdecl;
+  sqlite3_create_collation16 : function (_para1:Psqlite3; zName:Pchar; eTextRep:longint; _para4:pointer; xCompare:sqlite3_create_collation_func):longint;cdecl;
+  sqlite3_collation_needed : function (_para1:Psqlite3; _para2:pointer; _para3:sqlite3_collation_needed_func):longint;cdecl;
+  sqlite3_collation_needed16 : function (_para1:Psqlite3; _para2:pointer; _para3:sqlite3_collation_needed_func):longint;cdecl;
+  sqlite3_libversion: function : PChar;cdecl;
+//Alias for allowing better code portability (win32 is not working with external variables) 
+  sqlite3_version: function: PChar;cdecl;
+
+// Not published functions
+  sqlite3_libversion_number : Function :longint;cdecl;
+//  sqlite3_key : function (db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl;
+//  sqlite3_rekey : function (db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl;
+//  sqlite3_sleep : function (_para1:longint):longint;cdecl;
+//  sqlite3_expired : function (_para1:Psqlite3_stmt):longint;cdecl;
+//function sqlite3_global_recover:longint;cdecl;
+
+Procedure InitialiseSQLite;
+Procedure InitialiseSQLite(LibraryName : String);
+Procedure ReleaseSQLite;
+
+var 
+  SQLiteLibraryHandle : TLibHandle;
+  DefaultLibrary : String = Sqlite3Lib;
+
+{$ENDIF LOAD_DYNAMICALLY}
+
+implementation
+
+{$IFDEF LOAD_DYNAMICALLY}
+
+ResourceString
+  SErrLoadFailed     = 'Can not load SQLite client library "%s". Check your installation.';
+  SErrAlreadyLoaded  = 'SQLIte interface already initialized from library %s.';
+
+Procedure LoadAddresses(LibHandle : TLibHandle);
+
+begin
+  pointer(sqlite3_close) := GetProcedureAddress(LibHandle,'sqlite3_close');
+  pointer(sqlite3_exec) := GetProcedureAddress(LibHandle,'sqlite3_exec');
+  pointer(sqlite3_last_insert_rowid) := GetProcedureAddress(LibHandle,'sqlite3_last_insert_rowid');
+  pointer(sqlite3_changes) := GetProcedureAddress(LibHandle,'sqlite3_changes');
+  pointer(sqlite3_total_changes) := GetProcedureAddress(LibHandle,'sqlite3_total_changes');
+  pointer(sqlite3_interrupt) := GetProcedureAddress(LibHandle,'sqlite3_interrupt');
+  pointer(sqlite3_complete) := GetProcedureAddress(LibHandle,'sqlite3_complete');
+  pointer(sqlite3_complete16) := GetProcedureAddress(LibHandle,'sqlite3_complete16');
+  pointer(sqlite3_busy_handler) := GetProcedureAddress(LibHandle,'sqlite3_busy_handler');
+  pointer(sqlite3_busy_timeout) := GetProcedureAddress(LibHandle,'sqlite3_busy_timeout');
+  pointer(sqlite3_get_table) := GetProcedureAddress(LibHandle,'sqlite3_get_table');
+  pointer(sqlite3_free_table) := GetProcedureAddress(LibHandle,'sqlite3_free_table');
+// Todo: see how translate sqlite3_mprintf, sqlite3_vmprintf, sqlite3_snprintf
+//   pointer(sqlite3_mprintf) := GetProcedureAddress(LibHandle,'sqlite3_mprintf');
+  pointer(sqlite3_mprintf) := GetProcedureAddress(LibHandle,'sqlite3_mprintf');
+//  pointer(sqlite3_vmprintf) := GetProcedureAddress(LibHandle,'sqlite3_vmprintf');
+  pointer(sqlite3_free) := GetProcedureAddress(LibHandle,'sqlite3_free');
+//  pointer(sqlite3_snprintf) := GetProcedureAddress(LibHandle,'sqlite3_snprintf');
+  pointer(sqlite3_snprintf) := GetProcedureAddress(LibHandle,'sqlite3_snprintf');
+  pointer(sqlite3_set_authorizer) := GetProcedureAddress(LibHandle,'sqlite3_set_authorizer');
+  pointer(sqlite3_trace) := GetProcedureAddress(LibHandle,'sqlite3_trace');
+  pointer(sqlite3_progress_handler) := GetProcedureAddress(LibHandle,'sqlite3_progress_handler');
+  pointer(sqlite3_commit_hook) := GetProcedureAddress(LibHandle,'sqlite3_commit_hook');
+  pointer(sqlite3_open) := GetProcedureAddress(LibHandle,'sqlite3_open');
+  pointer(sqlite3_open16) := GetProcedureAddress(LibHandle,'sqlite3_open16');
+  pointer(sqlite3_errcode) := GetProcedureAddress(LibHandle,'sqlite3_errcode');
+  pointer(sqlite3_errmsg) := GetProcedureAddress(LibHandle,'sqlite3_errmsg');
+  pointer(sqlite3_errmsg16) := GetProcedureAddress(LibHandle,'sqlite3_errmsg16');
+  pointer(sqlite3_prepare) := GetProcedureAddress(LibHandle,'sqlite3_prepare');
+  pointer(sqlite3_prepare16) := GetProcedureAddress(LibHandle,'sqlite3_prepare16');
+  pointer(sqlite3_bind_blob) := GetProcedureAddress(LibHandle,'sqlite3_bind_blob');
+  pointer(sqlite3_bind_double) := GetProcedureAddress(LibHandle,'sqlite3_bind_double');
+  pointer(sqlite3_bind_int) := GetProcedureAddress(LibHandle,'sqlite3_bind_int');
+  pointer(sqlite3_bind_int64) := GetProcedureAddress(LibHandle,'sqlite3_bind_int64');
+  pointer(sqlite3_bind_null) := GetProcedureAddress(LibHandle,'sqlite3_bind_null');
+  pointer(sqlite3_bind_text) := GetProcedureAddress(LibHandle,'sqlite3_bind_text');
+  pointer(sqlite3_bind_text16) := GetProcedureAddress(LibHandle,'sqlite3_bind_text16');
+//  pointer(sqlite3_bind_value) := GetProcedureAddress(LibHandle,'sqlite3_bind_value');
+//These overloaded functions were introduced to allow the use of SQLITE_STATIC and SQLITE_TRANSIENT
+//It's the c world man ;-)
+  pointer(sqlite3_bind_blob1) := GetProcedureAddress(LibHandle,'sqlite3_bind_blob');
+  pointer(sqlite3_bind_text1) := GetProcedureAddress(LibHandle,'sqlite3_bind_text');
+  pointer(sqlite3_bind_text161) := GetProcedureAddress(LibHandle,'sqlite3_bind_text16');
+
+  pointer(sqlite3_bind_parameter_count) := GetProcedureAddress(LibHandle,'sqlite3_bind_parameter_count');
+  pointer(sqlite3_bind_parameter_name) := GetProcedureAddress(LibHandle,'sqlite3_bind_parameter_name');
+  pointer(sqlite3_bind_parameter_index) := GetProcedureAddress(LibHandle,'sqlite3_bind_parameter_index');
+//  pointer(sqlite3_clear_bindings) := GetProcedureAddress(LibHandle,'sqlite3_clear_bindings');
+  pointer(sqlite3_column_count) := GetProcedureAddress(LibHandle,'sqlite3_column_count');
+  pointer(sqlite3_column_name) := GetProcedureAddress(LibHandle,'sqlite3_column_name');
+  pointer(sqlite3_column_name16) := GetProcedureAddress(LibHandle,'sqlite3_column_name16');
+  pointer(sqlite3_column_decltype) := GetProcedureAddress(LibHandle,'sqlite3_column_decltype');
+  pointer(sqlite3_column_decltype16) := GetProcedureAddress(LibHandle,'sqlite3_column_decltype16');
+  pointer(sqlite3_step) := GetProcedureAddress(LibHandle,'sqlite3_step');
+  pointer(sqlite3_data_count) := GetProcedureAddress(LibHandle,'sqlite3_data_count');
+  pointer(sqlite3_column_blob) := GetProcedureAddress(LibHandle,'sqlite3_column_blob');
+  pointer(sqlite3_column_bytes) := GetProcedureAddress(LibHandle,'sqlite3_column_bytes');
+  pointer(sqlite3_column_bytes16) := GetProcedureAddress(LibHandle,'sqlite3_column_bytes16');
+  pointer(sqlite3_column_double) := GetProcedureAddress(LibHandle,'sqlite3_column_double');
+  pointer(sqlite3_column_int) := GetProcedureAddress(LibHandle,'sqlite3_column_int');
+  pointer(sqlite3_column_int64) := GetProcedureAddress(LibHandle,'sqlite3_column_int64');
+  pointer(sqlite3_column_text) := GetProcedureAddress(LibHandle,'sqlite3_column_text');
+  pointer(sqlite3_column_text16) := GetProcedureAddress(LibHandle,'sqlite3_column_text16');
+  pointer(sqlite3_column_type) := GetProcedureAddress(LibHandle,'sqlite3_column_type');
+  pointer(sqlite3_finalize) := GetProcedureAddress(LibHandle,'sqlite3_finalize');
+  pointer(sqlite3_reset) := GetProcedureAddress(LibHandle,'sqlite3_reset');
+  pointer(sqlite3_create_function) := GetProcedureAddress(LibHandle,'sqlite3_create_function');
+  pointer(sqlite3_create_function16) := GetProcedureAddress(LibHandle,'sqlite3_create_function16');
+  pointer(sqlite3_aggregate_count) := GetProcedureAddress(LibHandle,'sqlite3_aggregate_count');
+  pointer(sqlite3_value_blob) := GetProcedureAddress(LibHandle,'sqlite3_value_blob');
+  pointer(sqlite3_value_bytes) := GetProcedureAddress(LibHandle,'sqlite3_value_bytes');
+  pointer(sqlite3_value_bytes16) := GetProcedureAddress(LibHandle,'sqlite3_value_bytes16');
+  pointer(sqlite3_value_double) := GetProcedureAddress(LibHandle,'sqlite3_value_double');
+  pointer(sqlite3_value_int) := GetProcedureAddress(LibHandle,'sqlite3_value_int');
+  pointer(sqlite3_value_int64) := GetProcedureAddress(LibHandle,'sqlite3_value_int64');
+  pointer(sqlite3_value_text) := GetProcedureAddress(LibHandle,'sqlite3_value_text');
+  pointer(sqlite3_value_text16) := GetProcedureAddress(LibHandle,'sqlite3_value_text16');
+  pointer(sqlite3_value_text16le) := GetProcedureAddress(LibHandle,'sqlite3_value_text16le');
+  pointer(sqlite3_value_text16be) := GetProcedureAddress(LibHandle,'sqlite3_value_text16be');
+  pointer(sqlite3_value_type) := GetProcedureAddress(LibHandle,'sqlite3_value_type');
+  pointer(sqlite3_aggregate_context) := GetProcedureAddress(LibHandle,'sqlite3_aggregate_context');
+  pointer(sqlite3_user_data) := GetProcedureAddress(LibHandle,'sqlite3_user_data');
+  pointer(sqlite3_get_auxdata) := GetProcedureAddress(LibHandle,'sqlite3_get_auxdata');
+  pointer(sqlite3_set_auxdata) := GetProcedureAddress(LibHandle,'sqlite3_set_auxdata');
+  pointer(sqlite3_result_blob) := GetProcedureAddress(LibHandle,'sqlite3_result_blob');
+  pointer(sqlite3_result_double) := GetProcedureAddress(LibHandle,'sqlite3_result_double');
+  pointer(sqlite3_result_error) := GetProcedureAddress(LibHandle,'sqlite3_result_error');
+  pointer(sqlite3_result_error16) := GetProcedureAddress(LibHandle,'sqlite3_result_error16');
+  pointer(sqlite3_result_int) := GetProcedureAddress(LibHandle,'sqlite3_result_int');
+  pointer(sqlite3_result_int64) := GetProcedureAddress(LibHandle,'sqlite3_result_int64');
+  pointer(sqlite3_result_null) := GetProcedureAddress(LibHandle,'sqlite3_result_null');
+  pointer(sqlite3_result_text) := GetProcedureAddress(LibHandle,'sqlite3_result_text');
+  pointer(sqlite3_result_text16) := GetProcedureAddress(LibHandle,'sqlite3_result_text16');
+  pointer(sqlite3_result_text16le) := GetProcedureAddress(LibHandle,'sqlite3_result_text16le');
+  pointer(sqlite3_result_text16be) := GetProcedureAddress(LibHandle,'sqlite3_result_text16be');
+  pointer(sqlite3_result_value) := GetProcedureAddress(LibHandle,'sqlite3_result_value');
+  pointer(sqlite3_create_collation) := GetProcedureAddress(LibHandle,'sqlite3_create_collation');
+  pointer(sqlite3_create_collation16) := GetProcedureAddress(LibHandle,'sqlite3_create_collation16');
+  pointer(sqlite3_collation_needed) := GetProcedureAddress(LibHandle,'sqlite3_collation_needed');
+  pointer(sqlite3_collation_needed16) := GetProcedureAddress(LibHandle,'sqlite3_collation_needed16');
+  pointer(sqlite3_libversion):=GetProcedureAddress(LibHandle,'sqlite3_libversion');
+//Alias for allowing better code portability (win32 is not working with external variables) 
+  pointer(sqlite3_version):=GetProcedureAddress(LibHandle,'sqlite3_version');
+
+// Not published functions
+  pointer(sqlite3_libversion_number):=GetProcedureAddress(LibHandle,'sqlite3_libversion_number');
+//  pointer(sqlite3_key) := GetProcedureAddress(LibHandle,'sqlite3_key');
+//  pointer(sqlite3_rekey) := GetProcedureAddress(LibHandle,'sqlite3_rekey');
+//  pointer(sqlite3_sleep) := GetProcedureAddress(LibHandle,'sqlite3_sleep');
+//  pointer(sqlite3_expired) := GetProcedureAddress(LibHandle,'sqlite3_expired');
+// function sqlite3_global_recover:longint;cdecl;
+end;
+        
+var
+  RefCount : integer;
+  LoadedLibrary : String;
+            
+
+Function TryInitialiseSqlite(Const LibraryName : String) : Boolean;
+            
+begin
+  Result:=False;
+  if (RefCount=0) then
+    begin
+    SQLiteLibraryHandle:=LoadLibrary(LibraryName);
+    Result:=(SQLiteLibraryHandle<>nilhandle);
+    If not Result then
+      Exit;
+    inc(RefCount);
+    LoadedLibrary:=LibraryName;
+    LoadAddresses(SQLiteLibraryHandle);
+    end
+  else
+    begin
+    If (LoadedLibrary<>LibraryName) then
+      Raise EInoutError.CreateFmt(SErrAlreadyLoaded,[LoadedLibrary]);
+    inc(RefCount);
+    Result:=True;
+    end;
+end;
+
+Procedure InitialiseSQLite;
+
+begin
+  InitialiseSQLite(DefaultLibrary);
+end;
+
+
+Procedure InitialiseSQLite(LibraryName : String);
+
+begin
+  If Not TryInitialiseSQLIte(LibraryName) then
+    Raise EInOutError.CreateFmt(SErrLoadFailed,[LibraryName]);
+end;
+
+Procedure ReleaseSQLITE;
+
+begin
+  if RefCount>1 then
+    Dec(RefCount)
+  else if UnloadLibrary(SQLITELibraryHandle) then
+    begin
+    Dec(RefCount);
+    SQLITELibraryHandle := NilHandle;
+    LoadedLibrary:='';
+    end;
+end;
+
+{$ENDIF}
+
+end.

+ 2 - 301
packages/base/sqlite/sqlite3.pp

@@ -1,304 +1,5 @@
-{$mode objfpc}
-
-{$ifdef BSD}
-  {$linklib c}
-  {$linklib pthread}
-{$endif}
-
 unit sqlite3;
 
-interface
-
-{
-  Automatically converted by H2Pas 0.99.16 from sqlite3.h
-  The following command line parameters were used:
-    -D
-    -c
-    sqlite3.h
-
-  Manual corrections made by Luiz Américo - 2005
-}
-
-{$PACKRECORDS C}
-
-const
-  External_library='sqlite3';
-
-  SQLITE_INTEGER = 1;   
-  SQLITE_FLOAT = 2;   
-{ #define SQLITE_TEXT  3  // See below  }
-  SQLITE_BLOB = 4;   
-  SQLITE_NULL = 5;   
-  SQLITE_TEXT = 3;   
-  SQLITE3_TEXT = 3;   
-  SQLITE_UTF8 = 1;       
-  SQLITE_UTF16LE = 2;       
-  SQLITE_UTF16BE = 3;       
-{ Use native byte order  }
-  SQLITE_UTF16 = 4;       
-{ sqlite3_create_function only  }
-  SQLITE_ANY = 5;  
-   
-   //sqlite_exec return values
-  SQLITE_OK = 0;   
-  SQLITE_ERROR = 1;{ SQL error or missing database  }
-  SQLITE_INTERNAL = 2;{ An internal logic error in SQLite  }
-  SQLITE_PERM = 3;   { Access permission denied  }
-  SQLITE_ABORT = 4; { Callback routine requested an abort  }
-  SQLITE_BUSY = 5;  { The database file is locked  }
-  SQLITE_LOCKED = 6;{ A table in the database is locked  }
-  SQLITE_NOMEM = 7; { A malloc() failed  }
-  SQLITE_READONLY = 8;{ Attempt to write a readonly database  }
-  SQLITE_INTERRUPT = 9;{ Operation terminated by sqlite3_interrupt() }
-  SQLITE_IOERR = 10;   { Some kind of disk I/O error occurred  }
-  SQLITE_CORRUPT = 11;   { The database disk image is malformed  }
-  SQLITE_NOTFOUND = 12;   { (Internal Only) Table or record not found  }
-  SQLITE_FULL = 13;   { Insertion failed because database is full  }
-  SQLITE_CANTOPEN = 14;   { Unable to open the database file  }
-  SQLITE_PROTOCOL = 15;   { Database lock protocol error  }
-  SQLITE_EMPTY = 16;   { Database is empty  }
-  SQLITE_SCHEMA = 17;   { The database schema changed  }
-  SQLITE_TOOBIG = 18;   { Too much data for one row of a table  }
-  SQLITE_CONSTRAINT = 19;   { Abort due to contraint violation  }
-  SQLITE_MISMATCH = 20;   { Data type mismatch  }
-  SQLITE_MISUSE = 21;   { Library used incorrectly  }
-  SQLITE_NOLFS = 22;   { Uses OS features not supported on host  }
-  SQLITE_AUTH = 23;   { Authorization denied  }
-  SQLITE_FORMAT = 24;   { Auxiliary database format error  }
-  SQLITE_RANGE = 25;   { 2nd parameter to sqlite3_bind out of range  }
-  SQLITE_NOTADB = 26;   { File opened that is not a database file  }
-  SQLITE_ROW = 100;   { sqlite3_step() has another row ready  }
-  SQLITE_DONE = 101;   { sqlite3_step() has finished executing  }
-
-type
-  sqlite_int64 = int64;
-  sqlite_uint64 = qword;
-  PPPChar = ^PPChar;
-  Psqlite3  = Pointer;
-  PPSqlite3 = ^PSqlite3;
-  Psqlite3_context  = Pointer;
-  Psqlite3_stmt  = Pointer;
-  PPsqlite3_stmt = ^Psqlite3_stmt;
-  Psqlite3_value  = Pointer;
-  PPsqlite3_value  = ^Psqlite3_value;
-
-//Callback function types
-//Notice that most functions were named using as prefix the function name that uses them,
-//rather than describing their functions  
-
-  sqlite3_callback = function (_para1:pointer; _para2:longint; _para3:PPchar; _para4:PPchar):longint;cdecl;
-  busy_handler_func = function (_para1:pointer; _para2:longint):longint;cdecl;
-  sqlite3_set_authorizer_func = function (_para1:pointer; _para2:longint; _para3:Pchar; _para4:Pchar; _para5:Pchar; _para6:Pchar):longint;cdecl;
-  sqlite3_trace_func = procedure (_para1:pointer; _para2:Pchar);cdecl;
-  sqlite3_progress_handler_func = function (_para1:pointer):longint;cdecl;
-  sqlite3_commit_hook_func = function (_para1:pointer):longint;cdecl;
-  bind_destructor_func = procedure (_para1:pointer);cdecl;
-  create_function_step_func = procedure (_para1:Psqlite3_context; _para2:longint; _para3:PPsqlite3_value);cdecl;
-  create_function_func_func = procedure (_para1:Psqlite3_context; _para2:longint; _para3:PPsqlite3_value);cdecl;
-  create_function_final_func = procedure (_para1:Psqlite3_context);cdecl;
-  sqlite3_set_auxdata_func = procedure (_para1:pointer);cdecl;
-  sqlite3_result_func = procedure (_para1:pointer);cdecl;
-  sqlite3_create_collation_func = function (_para1:pointer; _para2:longint; _para3:pointer; _para4:longint; _para5:pointer):longint;cdecl;
-  sqlite3_collation_needed_func = procedure (_para1:pointer; _para2:Psqlite3; eTextRep:longint; _para4:Pchar);cdecl;
-
-{$ifndef win32}
-var
-  //This is not working under windows. Any clues?
-  sqlite3_temp_directory : Pchar;cvar;external;
-{$endif}
-
-function sqlite3_close(_para1:Psqlite3):longint;cdecl;external External_library name 'sqlite3_close';
-function sqlite3_exec(_para1:Psqlite3; sql:Pchar; _para3:sqlite3_callback; _para4:pointer; errmsg:PPchar):longint;cdecl;external External_library name 'sqlite3_exec';
-function sqlite3_last_insert_rowid(_para1:Psqlite3):sqlite_int64;cdecl;external External_library name 'sqlite3_last_insert_rowid';
-function sqlite3_changes(_para1:Psqlite3):longint;cdecl;external External_library name 'sqlite3_changes';
-function sqlite3_total_changes(_para1:Psqlite3):longint;cdecl;external External_library name 'sqlite3_total_changes';
-procedure sqlite3_interrupt(_para1:Psqlite3);cdecl;external External_library name 'sqlite3_interrupt';
-function sqlite3_complete(sql:Pchar):longint;cdecl;external External_library name 'sqlite3_complete';
-function sqlite3_complete16(sql:pointer):longint;cdecl;external External_library name 'sqlite3_complete16';
-function sqlite3_busy_handler(_para1:Psqlite3; _para2:busy_handler_func; _para3:pointer):longint;cdecl;external External_library name 'sqlite3_busy_handler';
-function sqlite3_busy_timeout(_para1:Psqlite3; ms:longint):longint;cdecl;external External_library name 'sqlite3_busy_timeout';
-function sqlite3_get_table(_para1:Psqlite3; sql:Pchar; resultp:PPPchar; nrow:Plongint; ncolumn:Plongint; 
-           errmsg:PPchar):longint;cdecl;external External_library name 'sqlite3_get_table';
-procedure sqlite3_free_table(result:PPchar);cdecl;external External_library name 'sqlite3_free_table';
-
-// Todo: see how translate sqlite3_mprintf, sqlite3_vmprintf, sqlite3_snprintf
-// function sqlite3_mprintf(_para1:Pchar; args:array of const):Pchar;cdecl;external External_library name 'sqlite3_mprintf';
-function sqlite3_mprintf(_para1:Pchar):Pchar;cdecl;external External_library name 'sqlite3_mprintf';
-//function sqlite3_vmprintf(_para1:Pchar; _para2:va_list):Pchar;cdecl;external External_library name 'sqlite3_vmprintf';
-procedure sqlite3_free(z:Pchar);cdecl;external External_library name 'sqlite3_free';
-//function sqlite3_snprintf(_para1:longint; _para2:Pchar; _para3:Pchar; args:array of const):Pchar;cdecl;external External_library name 'sqlite3_snprintf';
-function sqlite3_snprintf(_para1:longint; _para2:Pchar; _para3:Pchar):Pchar;cdecl;external External_library name 'sqlite3_snprintf';
-
-function sqlite3_set_authorizer(_para1:Psqlite3; xAuth:sqlite3_set_authorizer_func; pUserData:pointer):longint;cdecl;external External_library name 'sqlite3_set_authorizer';
-
-const
-   SQLITE_COPY = 0;   
-{ Index Name      Table Name       }
-   SQLITE_CREATE_INDEX = 1;   
-{ Table Name      NULL             }
-   SQLITE_CREATE_TABLE = 2;   
-{ Index Name      Table Name       }
-   SQLITE_CREATE_TEMP_INDEX = 3;   
-{ Table Name      NULL             }
-   SQLITE_CREATE_TEMP_TABLE = 4;   
-{ Trigger Name    Table Name       }
-   SQLITE_CREATE_TEMP_TRIGGER = 5;   
-{ View Name       NULL             }
-   SQLITE_CREATE_TEMP_VIEW = 6;   
-{ Trigger Name    Table Name       }
-   SQLITE_CREATE_TRIGGER = 7;   
-{ View Name       NULL             }
-   SQLITE_CREATE_VIEW = 8;   
-{ Table Name      NULL             }
-   SQLITE_DELETE = 9;   
-{ Index Name      Table Name       }
-   SQLITE_DROP_INDEX = 10;   
-{ Table Name      NULL             }
-   SQLITE_DROP_TABLE = 11;   
-{ Index Name      Table Name       }
-   SQLITE_DROP_TEMP_INDEX = 12;   
-{ Table Name      NULL             }
-   SQLITE_DROP_TEMP_TABLE = 13;   
-{ Trigger Name    Table Name       }
-   SQLITE_DROP_TEMP_TRIGGER = 14;   
-{ View Name       NULL             }
-   SQLITE_DROP_TEMP_VIEW = 15;   
-{ Trigger Name    Table Name       }
-   SQLITE_DROP_TRIGGER = 16;   
-{ View Name       NULL             }
-   SQLITE_DROP_VIEW = 17;   
-{ Table Name      NULL             }
-   SQLITE_INSERT = 18;   
-{ Pragma Name     1st arg or NULL  }
-   SQLITE_PRAGMA = 19;   
-{ Table Name      Column Name      }
-   SQLITE_READ = 20;   
-{ NULL            NULL             }
-   SQLITE_SELECT = 21;   
-{ NULL            NULL             }
-   SQLITE_TRANSACTION = 22;   
-{ Table Name      Column Name      }
-   SQLITE_UPDATE = 23;   
-{ Filename        NULL             }
-   SQLITE_ATTACH = 24;   
-{ Database Name   NULL             }
-   SQLITE_DETACH = 25;   
-{ Database Name   Table Name       }
-   SQLITE_ALTER_TABLE = 26;   
-{ Index Name      NULL             }
-   SQLITE_REINDEX = 27;   
-
-{ #define SQLITE_OK  0   // Allow access (This is actually defined above)  }
-{ Abort the SQL statement with an error  }
-  SQLITE_DENY = 1;   
-{ Don't allow access, but don't generate an error  }
-  SQLITE_IGNORE = 2;   
-
-function sqlite3_trace(_para1:Psqlite3; xTrace:sqlite3_trace_func; _para3:pointer):pointer;cdecl;external External_library name 'sqlite3_trace';
-procedure sqlite3_progress_handler(_para1:Psqlite3; _para2:longint; _para3:sqlite3_progress_handler_func; _para4:pointer);cdecl;external External_library name 'sqlite3_progress_handler';
-function sqlite3_commit_hook(_para1:Psqlite3; _para2:sqlite3_commit_hook_func; _para3:pointer):pointer;cdecl;external External_library name 'sqlite3_commit_hook';
-function sqlite3_open(filename:Pchar; ppDb:PPsqlite3):longint;cdecl;external External_library name 'sqlite3_open';
-function sqlite3_open16(filename:pointer; ppDb:PPsqlite3):longint;cdecl;external External_library name 'sqlite3_open16';
-function sqlite3_errcode(db:Psqlite3):longint;cdecl;external External_library name 'sqlite3_errcode';
-function sqlite3_errmsg(_para1:Psqlite3):Pchar;cdecl;external External_library name 'sqlite3_errmsg';
-function sqlite3_errmsg16(_para1:Psqlite3):pointer;cdecl;external External_library name 'sqlite3_errmsg16';
-function sqlite3_prepare(db:Psqlite3; zSql:Pchar; nBytes:longint; ppStmt:PPsqlite3_stmt; pzTail:PPchar):longint;cdecl;external External_library name 'sqlite3_prepare';
-function sqlite3_prepare16(db:Psqlite3; zSql:pointer; nBytes:longint; ppStmt:PPsqlite3_stmt; pzTail:Ppointer):longint;cdecl;external External_library name 'sqlite3_prepare16';
-function sqlite3_bind_blob(_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; n:longint; _para5:bind_destructor_func):longint;cdecl;external External_library name 'sqlite3_bind_blob';
-function sqlite3_bind_double(_para1:Psqlite3_stmt; _para2:longint; _para3:double):longint;cdecl;external External_library name 'sqlite3_bind_double';
-function sqlite3_bind_int(_para1:Psqlite3_stmt; _para2:longint; _para3:longint):longint;cdecl;external External_library name 'sqlite3_bind_int';
-function sqlite3_bind_int64(_para1:Psqlite3_stmt; _para2:longint; _para3:sqlite_int64):longint;cdecl;external External_library name 'sqlite3_bind_int64';
-function sqlite3_bind_null(_para1:Psqlite3_stmt; _para2:longint):longint;cdecl;external External_library name 'sqlite3_bind_null';
-function sqlite3_bind_text(_para1:Psqlite3_stmt; _para2:longint; _para3:Pchar; n:longint; _para5:bind_destructor_func):longint;cdecl;external External_library name 'sqlite3_bind_text';
-function sqlite3_bind_text16(_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; _para4:longint; _para5:bind_destructor_func):longint;cdecl;external External_library name 'sqlite3_bind_text16';
-//function sqlite3_bind_value(_para1:Psqlite3_stmt; _para2:longint; _para3:Psqlite3_value):longint;cdecl;external External_library name 'sqlite3_bind_value';
-
-// Original from sqlite3.h: 
-//#define SQLITE_STATIC      ((void(*)(void *))0)
-//#define SQLITE_TRANSIENT   ((void(*)(void *))-1)
-Const
-  SQLITE_STATIC    =  0;
-  SQLITE_TRANSIENT =  -1;
-  
-//These overloaded functions were introduced to allow the use of SQLITE_STATIC and SQLITE_TRANSIENT
-//It's the c world man ;-)
-function sqlite3_bind_blob(_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; n:longint; _para5:longint):longint;cdecl;external External_library name 'sqlite3_bind_blob';
-function sqlite3_bind_text(_para1:Psqlite3_stmt; _para2:longint; _para3:Pchar; n:longint; _para5:longint):longint;cdecl;external External_library name 'sqlite3_bind_text';
-function sqlite3_bind_text16(_para1:Psqlite3_stmt; _para2:longint; _para3:pointer; _para4:longint; _para5:longint):longint;cdecl;external External_library name 'sqlite3_bind_text16';
-
-function sqlite3_bind_parameter_count(_para1:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_bind_parameter_count';
-function sqlite3_bind_parameter_name(_para1:Psqlite3_stmt; _para2:longint):Pchar;cdecl;external External_library name 'sqlite3_bind_parameter_name';
-function sqlite3_bind_parameter_index(_para1:Psqlite3_stmt; zName:Pchar):longint;cdecl;external External_library name 'sqlite3_bind_parameter_index';
-//function sqlite3_clear_bindings(_para1:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_clear_bindings';
-function sqlite3_column_count(pStmt:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_column_count';
-function sqlite3_column_name(_para1:Psqlite3_stmt; _para2:longint):Pchar;cdecl;external External_library name 'sqlite3_column_name';
-function sqlite3_column_name16(_para1:Psqlite3_stmt; _para2:longint):pointer;cdecl;external External_library name 'sqlite3_column_name16';
-function sqlite3_column_decltype(_para1:Psqlite3_stmt; i:longint):Pchar;cdecl;external External_library name 'sqlite3_column_decltype';
-function sqlite3_column_decltype16(_para1:Psqlite3_stmt; _para2:longint):pointer;cdecl;external External_library name 'sqlite3_column_decltype16';
-function sqlite3_step(_para1:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_step';
-function sqlite3_data_count(pStmt:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_data_count';
-function sqlite3_column_blob(_para1:Psqlite3_stmt; iCol:longint):pointer;cdecl;external External_library name 'sqlite3_column_blob';
-function sqlite3_column_bytes(_para1:Psqlite3_stmt; iCol:longint):longint;cdecl;external External_library name 'sqlite3_column_bytes';
-function sqlite3_column_bytes16(_para1:Psqlite3_stmt; iCol:longint):longint;cdecl;external External_library name 'sqlite3_column_bytes16';
-function sqlite3_column_double(_para1:Psqlite3_stmt; iCol:longint):double;cdecl;external External_library name 'sqlite3_column_double';
-function sqlite3_column_int(_para1:Psqlite3_stmt; iCol:longint):longint;cdecl;external External_library name 'sqlite3_column_int';
-function sqlite3_column_int64(_para1:Psqlite3_stmt; iCol:longint):sqlite_int64;cdecl;external External_library name 'sqlite3_column_int64';
-function sqlite3_column_text(_para1:Psqlite3_stmt; iCol:longint):PChar;cdecl;external External_library name 'sqlite3_column_text';
-function sqlite3_column_text16(_para1:Psqlite3_stmt; iCol:longint):pointer;cdecl;external External_library name 'sqlite3_column_text16';
-function sqlite3_column_type(_para1:Psqlite3_stmt; iCol:longint):longint;cdecl;external External_library name 'sqlite3_column_type';
-function sqlite3_finalize(pStmt:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_finalize';
-function sqlite3_reset(pStmt:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_reset';
-function sqlite3_create_function(_para1:Psqlite3; zFunctionName:Pchar; nArg:longint; eTextRep:longint; _para5:pointer; 
-           xFunc:create_function_func_func; xStep:create_function_step_func; xFinal:create_function_final_func):longint;cdecl;external External_library name 'sqlite3_create_function';
-function sqlite3_create_function16(_para1:Psqlite3; zFunctionName:pointer; nArg:longint; eTextRep:longint; _para5:pointer; 
-           xFunc:create_function_func_func; xStep:create_function_step_func; xFinal:create_function_final_func):longint;cdecl;external External_library name 'sqlite3_create_function16';
-function sqlite3_aggregate_count(_para1:Psqlite3_context):longint;cdecl;external External_library name 'sqlite3_aggregate_count';
-function sqlite3_value_blob(_para1:Psqlite3_value):pointer;cdecl;external External_library name 'sqlite3_value_blob';
-function sqlite3_value_bytes(_para1:Psqlite3_value):longint;cdecl;external External_library name 'sqlite3_value_bytes';
-function sqlite3_value_bytes16(_para1:Psqlite3_value):longint;cdecl;external External_library name 'sqlite3_value_bytes16';
-function sqlite3_value_double(_para1:Psqlite3_value):double;cdecl;external External_library name 'sqlite3_value_double';
-function sqlite3_value_int(_para1:Psqlite3_value):longint;cdecl;external External_library name 'sqlite3_value_int';
-function sqlite3_value_int64(_para1:Psqlite3_value):sqlite_int64;cdecl;external External_library name 'sqlite3_value_int64';
-function sqlite3_value_text(_para1:Psqlite3_value):PChar;cdecl;external External_library name 'sqlite3_value_text';
-function sqlite3_value_text16(_para1:Psqlite3_value):pointer;cdecl;external External_library name 'sqlite3_value_text16';
-function sqlite3_value_text16le(_para1:Psqlite3_value):pointer;cdecl;external External_library name 'sqlite3_value_text16le';
-function sqlite3_value_text16be(_para1:Psqlite3_value):pointer;cdecl;external External_library name 'sqlite3_value_text16be';
-function sqlite3_value_type(_para1:Psqlite3_value):longint;cdecl;external External_library name 'sqlite3_value_type';
-function sqlite3_aggregate_context(_para1:Psqlite3_context; nBytes:longint):pointer;cdecl;external External_library name 'sqlite3_aggregate_context';
-function sqlite3_user_data(_para1:Psqlite3_context):pointer;cdecl;external External_library name 'sqlite3_user_data';
-function sqlite3_get_auxdata(_para1:Psqlite3_context; _para2:longint):pointer;cdecl;external External_library name 'sqlite3_get_auxdata';
-procedure sqlite3_set_auxdata(_para1:Psqlite3_context; _para2:longint; _para3:pointer; _para4:sqlite3_set_auxdata_func);cdecl;external External_library name 'sqlite3_set_auxdata';
-procedure sqlite3_result_blob(_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl;external External_library name 'sqlite3_result_blob';
-procedure sqlite3_result_double(_para1:Psqlite3_context; _para2:double);cdecl;external External_library name 'sqlite3_result_double';
-procedure sqlite3_result_error(_para1:Psqlite3_context; _para2:Pchar; _para3:longint);cdecl;external External_library name 'sqlite3_result_error';
-procedure sqlite3_result_error16(_para1:Psqlite3_context; _para2:pointer; _para3:longint);cdecl;external External_library name 'sqlite3_result_error16';
-procedure sqlite3_result_int(_para1:Psqlite3_context; _para2:longint);cdecl;external External_library name 'sqlite3_result_int';
-procedure sqlite3_result_int64(_para1:Psqlite3_context; _para2:sqlite_int64);cdecl;external External_library name 'sqlite3_result_int64';
-procedure sqlite3_result_null(_para1:Psqlite3_context);cdecl;external External_library name 'sqlite3_result_null';
-procedure sqlite3_result_text(_para1:Psqlite3_context; _para2:Pchar; _para3:longint; _para4:sqlite3_result_func);cdecl;external External_library name 'sqlite3_result_text';
-procedure sqlite3_result_text16(_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl;external External_library name 'sqlite3_result_text16';
-procedure sqlite3_result_text16le(_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl;external External_library name 'sqlite3_result_text16le';
-procedure sqlite3_result_text16be(_para1:Psqlite3_context; _para2:pointer; _para3:longint; _para4:sqlite3_result_func);cdecl;external External_library name 'sqlite3_result_text16be';
-procedure sqlite3_result_value(_para1:Psqlite3_context; _para2:Psqlite3_value);cdecl;external External_library name 'sqlite3_result_value';     
-    
-function sqlite3_create_collation(_para1:Psqlite3; zName:Pchar; eTextRep:longint; _para4:pointer; xCompare:sqlite3_create_collation_func):longint;cdecl;external External_library name 'sqlite3_create_collation';
-function sqlite3_create_collation16(_para1:Psqlite3; zName:Pchar; eTextRep:longint; _para4:pointer; xCompare:sqlite3_create_collation_func):longint;cdecl;external External_library name 'sqlite3_create_collation16';
- 
-function sqlite3_collation_needed(_para1:Psqlite3; _para2:pointer; _para3:sqlite3_collation_needed_func):longint;cdecl;external External_library name 'sqlite3_collation_needed';
-function sqlite3_collation_needed16(_para1:Psqlite3; _para2:pointer; _para3:sqlite3_collation_needed_func):longint;cdecl;external External_library name 'sqlite3_collation_needed16';
-
-function sqlite3_libversion:PChar;cdecl;external External_library name 'sqlite3_libversion';
-//Alias for allowing better code portability (win32 is not working with external variables) 
-function sqlite3_version:PChar;cdecl;external External_library name 'sqlite3_libversion';
-
-// Not published functions
-function sqlite3_libversion_number:longint;cdecl;external External_library name 'sqlite3_libversion_number';
-//function sqlite3_key(db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl;external External_library name 'sqlite3_key';
-//function sqlite3_rekey(db:Psqlite3; pKey:pointer; nKey:longint):longint;cdecl;external External_library name 'sqlite3_rekey';
-//function sqlite3_sleep(_para1:longint):longint;cdecl;external External_library name 'sqlite3_sleep';
-//function sqlite3_expired(_para1:Psqlite3_stmt):longint;cdecl;external External_library name 'sqlite3_expired';
-//function sqlite3_global_recover:longint;cdecl;external External_library name 'sqlite3_global_recover';
-
-implementation
+{$i sqlite3.inc}
 
-end.
+end.

+ 7 - 0
packages/base/sqlite/sqlite3dyn.pp

@@ -0,0 +1,7 @@
+unit sqlite3dyn;
+
+{$DEFINE LOAD_DYNAMICALLY}
+
+{$i sqlite3.inc}
+
+end.

+ 21 - 15
packages/base/winunits/activex.pp

@@ -31,6 +31,10 @@ type
    TBStr = POleStr;
    PBStr = ^TBStr;
    TOleEnum = type LongWord;
+   LargeInt = Types.LargeInt;
+   LargeUInt = Types.LargeUInt;
+   PLargeInt = Types.PLargeInt;
+   PLargeUInt = Types.PLargeUInt;
 
 {Glue types, should be linked to the proper windows unit types}
 TYPE
@@ -1520,7 +1524,7 @@ TYPE
 
 // Forward interfaces.
 
-   IStream             = Interface;
+   IStream             = Types.IStream;
    IMoniker            = Interface;
    IEnumMoniker        = Interface;
    IEnumString         = Interface;
@@ -1744,29 +1748,31 @@ TYPE
        Function Clone(Out penum:IEnumString):HResult;StdCall;
        End;
 
-    ISequentialStream = interface(IUnknown)
+    ISequentialStream = Types.ISequentialStream;
+    {interface(IUnknown)
        ['{0c733a30-2a1c-11ce-ade5-00aa0044773d}']
-       function Read(pv : Pointer;cb : DWord;pcbRead : PDWord) : HRESULT;stdcall;
-       function Write(pv : Pointer;cb : DWord;pcbWritten : PDWord): HRESULT;stdcall;
-       end;
+       function Read(pv : Pointer;cb : ULONG;pcbRead : PULONG) : HRESULT;stdcall;
+       function Write(pv : Pointer;cb : ULONG;pcbWritten : PULONG): HRESULT;stdcall;
+     end;
+    }
 
-    IStream = interface(ISequentialStream)
+    { defined above by pulling it in from types IStream = interface(ISequentialStream)
        ['{0000000C-0000-0000-C000-000000000046}']
-       function Seek(dlibMove : Large_integer; dwOrigin: Longint;
-            out libNewPosition : Large_Integer): HResult; stdcall;
-       function SetSize(libNewSize : Large_Integer) : HRESULT;stdcall;
-       function CopyTo(stm: IStream;cb : Large_Integer;out cbRead : Large_Integer;
-            out cbWritten: Large_Integer) : HRESULT;stdcall;
+       function Seek(dlibMove : LargeInt; dwOrigin: Longint;
+            out libNewPosition : LargeInt): HResult; stdcall;
+       function SetSize(libNewSize : LargeInt) : HRESULT;stdcall;
+       function CopyTo(stm: IStream;cb : LargeInt;out cbRead : LargeInt;
+            out cbWritten: LargeInt) : HRESULT;stdcall;
        function Commit(grfCommitFlags : Longint) : HRESULT; stdcall;
        function Revert : HRESULT; stdcall;
-       function LockRegion(libOffset : Large_Integer;cb : Large_Integer;
+       function LockRegion(libOffset : LargeInt;cb : LargeInt;
             dwLockType: Longint) : HRESULT;stdcall;
-       function UnlockRegion(libOffset: Large_Integer;cb: Large_Integer;
+       function UnlockRegion(libOffset: LargeInt;cb: LargeInt;
             dwLockType: Longint) : HRESULT;stdcall;
        Function Stat(out statstg : TStatStg; grfStatFlag: Longint): HRESULT;stdcall;
        function Clone(out stm : IStream) : HRESULT; stdcall;
-       end;
-
+     end;
+    }
     IEnumSTATSTG = Interface (IUnknown)
        ['{0000000d-0000-0000-C000-000000000046}']
         Function Next (Celt:ULong;Out xcelt;pceltfetched : PUlong):HResult; StdCall;

+ 121 - 0
packages/base/winunits/examples/OOTest.pp

@@ -0,0 +1,121 @@
+{***********************************************************************
+ *
+ *  $RCSfile: SampleUI.pas,v $
+ *
+ *  $Revision: 1.2 $
+ *
+ *  last change: $Author: hr $ $Date: 2003/06/30 15:51:41 $
+ *
+ *  The Contents of this file are made available subject to the terms of
+ *  the BSD license.
+ *  
+ *  Copyright (c) 2003 by Sun Microsystems, Inc.
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. Neither the name of Sun Microsystems, Inc. nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *     
+ *************************************************************************}
+{$mode objfpc}
+uses
+  OOHelper;
+  
+var
+  Sample : TSampleCode;
+
+procedure error(const s : string = 'Error');
+  begin
+    writeln(s);
+    halt(1);
+  end;
+  
+  
+begin
+  write('Connection to StarOffice ... ');
+  Sample := TSampleCode.Create();
+  if Sample.Connect() then
+    writeln('done.')
+  else
+    error;
+  write('Creating new text document ... ');
+  if Sample.CreateDocument(false) then
+    writeln('done.')
+  else
+    error;
+{  
+  try
+    writeln('Inserting Table ...');
+    Sample.InsertTable(Edit2.Text, Edit1.Text);
+    writeln('Ready');
+  except
+    Error;
+  end;
+}   
+  write('Disconnection from StarOffice ... ');
+  Sample.Disconnect();
+  writeln('done.');
+  writeln('Finished');
+end.
+
+{
+end;
+
+procedure TOKBottomDlg.OnCreateDocument(Sender: TObject);
+begin
+end;
+
+procedure TOKBottomDlg.OnInsertTable(Sender: TObject);
+begin
+end;
+
+procedure TOKBottomDlg.OnGetDatabasePointer(Sender: TObject);
+var
+    res : String;
+begin
+    try
+        StatusBar1.SimpleText := 'Getting database pointer ...';
+        res := Sample.getDatabasePointer(Edit4.Text, Edit3.Text);
+        Application.MessageBox(PChar('the pointer: ' + res), PChar('Result'), ID_OK);
+        StatusBar1.SimpleText := 'Ready';
+    except
+        StatusBar1.SimpleText := 'Error';
+    end;
+end;
+
+procedure TOKBottomDlg.OnGetCellContent(Sender: TObject);
+var
+    res : String;
+begin
+    try
+        StatusBar1.SimpleText := 'Getting cell content ...';
+        res := Sample.getCellContent(Edit6.Text);
+        Application.MessageBox(PChar('the content: ' + res), PChar('Result'), ID_OK);
+        StatusBar1.SimpleText := 'Ready';
+    except
+        StatusBar1.SimpleText := 'Error';
+    end;
+end;
+
+end.
+}

+ 261 - 255
packages/base/winunits/richedit.pp

@@ -14,259 +14,259 @@ uses Messages, Windows;
 
 {$ifdef UNICODE }
   const
-     RICHEDIT_CLASS = 'RichEdit20W';     
+     RICHEDIT_CLASS = 'RichEdit20W';
 {$else}
   const
-     RICHEDIT_CLASS = 'RichEdit20A';     
+     RICHEDIT_CLASS = 'RichEdit20A';
 {$endif}
 
   const
-     RICHEDIT_CLASS10A = 'RICHEDIT';     
-     CF_RTF = 'Rich Text Format';     
-     CF_RTFNOOBJS = 'Rich Text Format Without Objects';     
-     CF_RETEXTOBJ = 'RichEdit Text and Objects';     
-     CFM_BOLD = 1;     
-     CFM_ITALIC = 2;     
-     CFM_UNDERLINE = 4;     
-     CFM_STRIKEOUT = 8;     
-     CFM_PROTECTED = 16;     
-     CFM_LINK = 32;     
-     CFM_SIZE = $80000000;     
-     CFM_COLOR = $40000000;     
-     CFM_FACE = $20000000;     
-     CFM_OFFSET = $10000000;     
-     CFM_CHARSET = $08000000;     
-     CFM_SUBSCRIPT = $00030000;     
-     CFM_SUPERSCRIPT = $00030000;     
-     CFM_EFFECTS = (((((CFM_BOLD or CFM_ITALIC) or CFM_UNDERLINE) or CFM_COLOR) or CFM_STRIKEOUT) or CFE_PROTECTED) or CFM_LINK;     
-     CFE_BOLD = 1;     
-     CFE_ITALIC = 2;     
-     CFE_UNDERLINE = 4;     
-     CFE_STRIKEOUT = 8;     
-     CFE_PROTECTED = 16;     
-     CFE_AUTOCOLOR = $40000000;     
-     CFE_SUBSCRIPT = $00010000;     
-     CFE_SUPERSCRIPT = $00020000;     
-     IMF_FORCENONE = 1;     
-     IMF_FORCEENABLE = 2;     
-     IMF_FORCEDISABLE = 4;     
-     IMF_CLOSESTATUSWINDOW = 8;     
-     IMF_VERTICAL = 32;     
-     IMF_FORCEACTIVE = 64;     
-     IMF_FORCEINACTIVE = 128;     
-     IMF_FORCEREMEMBER = 256;     
-     SEL_EMPTY = 0;     
-     SEL_TEXT = 1;     
-     SEL_OBJECT = 2;     
-     SEL_MULTICHAR = 4;     
-     SEL_MULTIOBJECT = 8;     
-     MAX_TAB_STOPS = 32;     
-     PFM_ALIGNMENT = 8;     
-     PFM_NUMBERING = 32;     
-     PFM_OFFSET = 4;     
-     PFM_OFFSETINDENT = $80000000;     
-     PFM_RIGHTINDENT = 2;     
-     PFM_STARTINDENT = 1;     
-     PFM_TABSTOPS = 16;     
-     PFM_BORDER = 2048;     
-     PFM_LINESPACING = 256;     
-     PFM_NUMBERINGSTART = 32768;     
-     PFM_NUMBERINGSTYLE = 8192;     
-     PFM_NUMBERINGTAB = 16384;     
-     PFM_SHADING = 4096;     
-     PFM_SPACEAFTER = 128;     
-     PFM_SPACEBEFORE = 64;     
-     PFM_STYLE = 1024;     
-     PFM_DONOTHYPHEN = 4194304;     
-     PFM_KEEP = 131072;     
-     PFM_KEEPNEXT = 262144;     
-     PFM_NOLINENUMBER = 1048576;     
-     PFM_NOWIDOWCONTROL = 2097152;     
-     PFM_PAGEBREAKBEFORE = 524288;     
-     PFM_RTLPARA = 65536;     
-     PFM_SIDEBYSIDE = 8388608;     
-     PFM_TABLE = 1073741824;     
-     PFN_BULLET = 1;     
-     PFE_DONOTHYPHEN = 64;     
-     PFE_KEEP = 2;     
-     PFE_KEEPNEXT = 4;     
-     PFE_NOLINENUMBER = 16;     
-     PFE_NOWIDOWCONTROL = 32;     
-     PFE_PAGEBREAKBEFORE = 8;     
-     PFE_RTLPARA = 1;     
-     PFE_SIDEBYSIDE = 128;     
-     PFE_TABLE = 16384;     
-     PFA_LEFT = 1;     
-     PFA_RIGHT = 2;     
-     PFA_CENTER = 3;     
-     PFA_JUSTIFY = 4;     
-     PFA_FULL_INTERWORD = 4;     
-     SF_TEXT = 1;     
-     SF_RTF = 2;     
-     SF_RTFNOOBJS = 3;     
-     SF_TEXTIZED = 4;     
-     SF_UNICODE = 16;     
-     SF_USECODEPAGE = 32;     
-     SF_NCRFORNONASCII = 64;     
-     SF_RTFVAL = $0700;     
-     SFF_PWD = $0800;     
-     SFF_KEEPDOCINFO = $1000;     
-     SFF_PERSISTVIEWSCALE = $2000;     
-     SFF_PLAINRTF = $4000;     
-     SFF_SELECTION = $8000;     
-     WB_CLASSIFY = 3;     
-     WB_MOVEWORDLEFT = 4;     
-     WB_MOVEWORDRIGHT = 5;     
-     WB_LEFTBREAK = 6;     
-     WB_RIGHTBREAK = 7;     
-     WB_MOVEWORDPREV = 4;     
-     WB_MOVEWORDNEXT = 5;     
-     WB_PREVBREAK = 6;     
-     WB_NEXTBREAK = 7;     
-     WBF_WORDWRAP = 16;     
-     WBF_WORDBREAK = 32;     
-     WBF_OVERFLOW = 64;     
-     WBF_LEVEL1 = 128;     
-     WBF_LEVEL2 = 256;     
-     WBF_CUSTOM = 512;     
-     ES_DISABLENOSCROLL = 8192;     
-     ES_EX_NOCALLOLEINIT = 16777216;     
-     ES_NOIME = 524288;     
-     ES_NOOLEDRAGDROP = 8;     
-     ES_SAVESEL = 32768;     
-     ES_SELECTIONBAR = 16777216;     
-     ES_SELFIME = 262144;     
-     ES_SUNKEN = 16384;     
-     ES_VERTICAL = 4194304;     
-     EM_CANPASTE = WM_USER+50;     
-     EM_DISPLAYBAND = WM_USER+51;     
-     EM_EXGETSEL = WM_USER+52;     
-     EM_EXLIMITTEXT = WM_USER+53;     
-     EM_EXLINEFROMCHAR = WM_USER+54;     
-     EM_EXSETSEL = WM_USER+55;     
-     EM_FINDTEXT = WM_USER+56;     
-     EM_FORMATRANGE = WM_USER+57;     
-     EM_GETCHARFORMAT = WM_USER+58;     
-     EM_GETEVENTMASK = WM_USER+59;     
-     EM_GETOLEINTERFACE = WM_USER+60;     
-     EM_GETPARAFORMAT = WM_USER+61;     
-     EM_GETSELTEXT = WM_USER+62;     
-     EM_HIDESELECTION = WM_USER+63;     
-     EM_PASTESPECIAL = WM_USER+64;     
-     EM_REQUESTRESIZE = WM_USER+65;     
-     EM_SELECTIONTYPE = WM_USER+66;     
-     EM_SETBKGNDCOLOR = WM_USER+67;     
-     EM_SETCHARFORMAT = WM_USER+68;     
-     EM_SETEVENTMASK = WM_USER+69;     
-     EM_SETOLECALLBACK = WM_USER+70;     
-     EM_SETPARAFORMAT = WM_USER+71;     
-     EM_SETTARGETDEVICE = WM_USER+72;     
-     EM_STREAMIN = WM_USER+73;     
-     EM_STREAMOUT = WM_USER+74;     
-     EM_GETTEXTRANGE = WM_USER+75;     
-     EM_FINDWORDBREAK = WM_USER+76;     
-     EM_SETOPTIONS = WM_USER+77;     
-     EM_GETOPTIONS = WM_USER+78;     
-     EM_FINDTEXTEX = WM_USER+79;     
-     EM_GETWORDBREAKPROCEX = WM_USER+80;     
-     EM_SETWORDBREAKPROCEX = WM_USER+81;     
+     RICHEDIT_CLASS10A = 'RICHEDIT';
+     CF_RTF = 'Rich Text Format';
+     CF_RTFNOOBJS = 'Rich Text Format Without Objects';
+     CF_RETEXTOBJ = 'RichEdit Text and Objects';
+     CFM_BOLD = 1;
+     CFM_ITALIC = 2;
+     CFM_UNDERLINE = 4;
+     CFM_STRIKEOUT = 8;
+     CFM_PROTECTED = 16;
+     CFM_LINK = 32;
+     CFM_SIZE = $80000000;
+     CFM_COLOR = $40000000;
+     CFM_FACE = $20000000;
+     CFM_OFFSET = $10000000;
+     CFM_CHARSET = $08000000;
+     CFM_SUBSCRIPT = $00030000;
+     CFM_SUPERSCRIPT = $00030000;
+     CFM_EFFECTS = (((((CFM_BOLD or CFM_ITALIC) or CFM_UNDERLINE) or CFM_COLOR) or CFM_STRIKEOUT) or CFE_PROTECTED) or CFM_LINK;
+     CFE_BOLD = 1;
+     CFE_ITALIC = 2;
+     CFE_UNDERLINE = 4;
+     CFE_STRIKEOUT = 8;
+     CFE_PROTECTED = 16;
+     CFE_AUTOCOLOR = $40000000;
+     CFE_SUBSCRIPT = $00010000;
+     CFE_SUPERSCRIPT = $00020000;
+     IMF_FORCENONE = 1;
+     IMF_FORCEENABLE = 2;
+     IMF_FORCEDISABLE = 4;
+     IMF_CLOSESTATUSWINDOW = 8;
+     IMF_VERTICAL = 32;
+     IMF_FORCEACTIVE = 64;
+     IMF_FORCEINACTIVE = 128;
+     IMF_FORCEREMEMBER = 256;
+     SEL_EMPTY = 0;
+     SEL_TEXT = 1;
+     SEL_OBJECT = 2;
+     SEL_MULTICHAR = 4;
+     SEL_MULTIOBJECT = 8;
+     MAX_TAB_STOPS = 32;
+     PFM_ALIGNMENT = 8;
+     PFM_NUMBERING = 32;
+     PFM_OFFSET = 4;
+     PFM_OFFSETINDENT = $80000000;
+     PFM_RIGHTINDENT = 2;
+     PFM_STARTINDENT = 1;
+     PFM_TABSTOPS = 16;
+     PFM_BORDER = 2048;
+     PFM_LINESPACING = 256;
+     PFM_NUMBERINGSTART = 32768;
+     PFM_NUMBERINGSTYLE = 8192;
+     PFM_NUMBERINGTAB = 16384;
+     PFM_SHADING = 4096;
+     PFM_SPACEAFTER = 128;
+     PFM_SPACEBEFORE = 64;
+     PFM_STYLE = 1024;
+     PFM_DONOTHYPHEN = 4194304;
+     PFM_KEEP = 131072;
+     PFM_KEEPNEXT = 262144;
+     PFM_NOLINENUMBER = 1048576;
+     PFM_NOWIDOWCONTROL = 2097152;
+     PFM_PAGEBREAKBEFORE = 524288;
+     PFM_RTLPARA = 65536;
+     PFM_SIDEBYSIDE = 8388608;
+     PFM_TABLE = 1073741824;
+     PFN_BULLET = 1;
+     PFE_DONOTHYPHEN = 64;
+     PFE_KEEP = 2;
+     PFE_KEEPNEXT = 4;
+     PFE_NOLINENUMBER = 16;
+     PFE_NOWIDOWCONTROL = 32;
+     PFE_PAGEBREAKBEFORE = 8;
+     PFE_RTLPARA = 1;
+     PFE_SIDEBYSIDE = 128;
+     PFE_TABLE = 16384;
+     PFA_LEFT = 1;
+     PFA_RIGHT = 2;
+     PFA_CENTER = 3;
+     PFA_JUSTIFY = 4;
+     PFA_FULL_INTERWORD = 4;
+     SF_TEXT = 1;
+     SF_RTF = 2;
+     SF_RTFNOOBJS = 3;
+     SF_TEXTIZED = 4;
+     SF_UNICODE = 16;
+     SF_USECODEPAGE = 32;
+     SF_NCRFORNONASCII = 64;
+     SF_RTFVAL = $0700;
+     SFF_PWD = $0800;
+     SFF_KEEPDOCINFO = $1000;
+     SFF_PERSISTVIEWSCALE = $2000;
+     SFF_PLAINRTF = $4000;
+     SFF_SELECTION = $8000;
+     WB_CLASSIFY = 3;
+     WB_MOVEWORDLEFT = 4;
+     WB_MOVEWORDRIGHT = 5;
+     WB_LEFTBREAK = 6;
+     WB_RIGHTBREAK = 7;
+     WB_MOVEWORDPREV = 4;
+     WB_MOVEWORDNEXT = 5;
+     WB_PREVBREAK = 6;
+     WB_NEXTBREAK = 7;
+     WBF_WORDWRAP = 16;
+     WBF_WORDBREAK = 32;
+     WBF_OVERFLOW = 64;
+     WBF_LEVEL1 = 128;
+     WBF_LEVEL2 = 256;
+     WBF_CUSTOM = 512;
+     ES_DISABLENOSCROLL = 8192;
+     ES_EX_NOCALLOLEINIT = 16777216;
+     ES_NOIME = 524288;
+     ES_NOOLEDRAGDROP = 8;
+     ES_SAVESEL = 32768;
+     ES_SELECTIONBAR = 16777216;
+     ES_SELFIME = 262144;
+     ES_SUNKEN = 16384;
+     ES_VERTICAL = 4194304;
+     EM_CANPASTE = WM_USER+50;
+     EM_DISPLAYBAND = WM_USER+51;
+     EM_EXGETSEL = WM_USER+52;
+     EM_EXLIMITTEXT = WM_USER+53;
+     EM_EXLINEFROMCHAR = WM_USER+54;
+     EM_EXSETSEL = WM_USER+55;
+     EM_FINDTEXT = WM_USER+56;
+     EM_FORMATRANGE = WM_USER+57;
+     EM_GETCHARFORMAT = WM_USER+58;
+     EM_GETEVENTMASK = WM_USER+59;
+     EM_GETOLEINTERFACE = WM_USER+60;
+     EM_GETPARAFORMAT = WM_USER+61;
+     EM_GETSELTEXT = WM_USER+62;
+     EM_HIDESELECTION = WM_USER+63;
+     EM_PASTESPECIAL = WM_USER+64;
+     EM_REQUESTRESIZE = WM_USER+65;
+     EM_SELECTIONTYPE = WM_USER+66;
+     EM_SETBKGNDCOLOR = WM_USER+67;
+     EM_SETCHARFORMAT = WM_USER+68;
+     EM_SETEVENTMASK = WM_USER+69;
+     EM_SETOLECALLBACK = WM_USER+70;
+     EM_SETPARAFORMAT = WM_USER+71;
+     EM_SETTARGETDEVICE = WM_USER+72;
+     EM_STREAMIN = WM_USER+73;
+     EM_STREAMOUT = WM_USER+74;
+     EM_GETTEXTRANGE = WM_USER+75;
+     EM_FINDWORDBREAK = WM_USER+76;
+     EM_SETOPTIONS = WM_USER+77;
+     EM_GETOPTIONS = WM_USER+78;
+     EM_FINDTEXTEX = WM_USER+79;
+     EM_GETWORDBREAKPROCEX = WM_USER+80;
+     EM_SETWORDBREAKPROCEX = WM_USER+81;
   { RichEdit 2.0 messages  }
-     EM_SETUNDOLIMIT = WM_USER+82;     
-     EM_REDO = WM_USER+84;     
-     EM_CANREDO = WM_USER+85;     
-     EM_GETUNDONAME = WM_USER+86;     
-     EM_GETREDONAME = WM_USER+87;     
-     EM_STOPGROUPTYPING = WM_USER+88;     
-     EM_SETTEXTMODE = WM_USER+89;     
-     EM_GETTEXTMODE = WM_USER+90;     
-     EM_AUTOURLDETECT = WM_USER+91;     
-     EM_GETAUTOURLDETECT = WM_USER+92;     
-     EM_SETPALETTE = WM_USER+93;     
-     EM_GETTEXTEX = WM_USER+94;     
-     EM_GETTEXTLENGTHEX = WM_USER+95;     
-     EM_SHOWSCROLLBAR = WM_USER+96;     
-     EM_SETTEXTEX = WM_USER+97;     
-     EM_SETPUNCTUATION = WM_USER+100;     
-     EM_GETPUNCTUATION = WM_USER+101;     
-     EM_SETWORDWRAPMODE = WM_USER+102;     
-     EM_GETWORDWRAPMODE = WM_USER+103;     
-     EM_SETIMECOLOR = WM_USER+104;     
-     EM_GETIMECOLOR = WM_USER+105;     
-     EM_SETIMEOPTIONS = WM_USER+106;     
-     EM_GETIMEOPTIONS = WM_USER+107;     
-     EM_SETLANGOPTIONS = WM_USER+120;     
-     EM_GETLANGOPTIONS = WM_USER+121;     
-     EM_GETIMECOMPMODE = WM_USER+122;     
-     EM_FINDTEXTW = WM_USER+123;     
-     EM_FINDTEXTEXW = WM_USER+124;     
-     EM_RECONVERSION = WM_USER+125;     
-     EM_SETBIDIOPTIONS = WM_USER+200;     
-     EM_GETBIDIOPTIONS = WM_USER+201;     
-     EM_SETTYPOGRAPHYOPTIONS = WM_USER+202;     
-     EM_GETTYPOGRAPHYOPTIONS = WM_USER+203;     
-     EM_SETEDITSTYLE = WM_USER+204;     
-     EM_GETEDITSTYLE = WM_USER+205;     
-     EM_GETSCROLLPOS = WM_USER+221;     
-     EM_SETSCROLLPOS = WM_USER+222;     
-     EM_SETFONTSIZE = WM_USER+223;     
-     EM_GETZOOM = WM_USER+224;     
-     EM_SETZOOM = WM_USER+225;     
-     EN_CORRECTTEXT = 1797;     
-     EN_DROPFILES = 1795;     
-     EN_IMECHANGE = 1799;     
-     EN_LINK = 1803;     
-     EN_MSGFILTER = 1792;     
-     EN_OLEOPFAILED = 1801;     
-     EN_PROTECTED = 1796;     
-     EN_REQUESTRESIZE = 1793;     
-     EN_SAVECLIPBOARD = 1800;     
-     EN_SELCHANGE = 1794;     
-     EN_STOPNOUNDO = 1798;     
-     ENM_NONE = 0;     
-     ENM_CHANGE = 1;     
-     ENM_CORRECTTEXT = 4194304;     
-     ENM_DRAGDROPDONE = 16;     
-     ENM_DROPFILES = 1048576;     
-     ENM_IMECHANGE = 8388608;     
-     ENM_KEYEVENTS = 65536;     
-     ENM_LANGCHANGE = 16777216;     
-     ENM_LINK = 67108864;     
-     ENM_MOUSEEVENTS = 131072;     
-     ENM_OBJECTPOSITIONS = 33554432;     
-     ENM_PROTECTED = 2097152;     
-     ENM_REQUESTRESIZE = 262144;     
-     ENM_SCROLL = 4;     
-     ENM_SCROLLEVENTS = 8;     
-     ENM_SELCHANGE = 524288;     
-     ENM_UPDATE = 2;     
-     ECO_AUTOWORDSELECTION = 1;     
-     ECO_AUTOVSCROLL = 64;     
-     ECO_AUTOHSCROLL = 128;     
-     ECO_NOHIDESEL = 256;     
-     ECO_READONLY = 2048;     
-     ECO_WANTRETURN = 4096;     
-     ECO_SAVESEL = $8000;     
-     ECO_SELECTIONBAR = $1000000;     
-     ECO_VERTICAL = $400000;     
-     ECOOP_SET = 1;     
-     ECOOP_OR = 2;     
-     ECOOP_AND = 3;     
-     ECOOP_XOR = 4;     
-     SCF_DEFAULT = 0;     
-     SCF_SELECTION = 1;     
-     SCF_WORD = 2;     
-     SCF_ALL = 4;     
-     SCF_USEUIRULES = 8;     
-     TM_PLAINTEXT = 1;     
-     TM_RICHTEXT = 2;     
-     TM_SINGLELEVELUNDO = 4;     
-     TM_MULTILEVELUNDO = 8;     
-     TM_SINGLECODEPAGE = 16;     
-     TM_MULTICODEPAGE = 32;     
-     GT_DEFAULT = 0;     
-     GT_USECRLF = 1;     
-     yHeightCharPtsMost = 1638;     
-     lDefaultTab = 720;     
+     EM_SETUNDOLIMIT = WM_USER+82;
+     EM_REDO = WM_USER+84;
+     EM_CANREDO = WM_USER+85;
+     EM_GETUNDONAME = WM_USER+86;
+     EM_GETREDONAME = WM_USER+87;
+     EM_STOPGROUPTYPING = WM_USER+88;
+     EM_SETTEXTMODE = WM_USER+89;
+     EM_GETTEXTMODE = WM_USER+90;
+     EM_AUTOURLDETECT = WM_USER+91;
+     EM_GETAUTOURLDETECT = WM_USER+92;
+     EM_SETPALETTE = WM_USER+93;
+     EM_GETTEXTEX = WM_USER+94;
+     EM_GETTEXTLENGTHEX = WM_USER+95;
+     EM_SHOWSCROLLBAR = WM_USER+96;
+     EM_SETTEXTEX = WM_USER+97;
+     EM_SETPUNCTUATION = WM_USER+100;
+     EM_GETPUNCTUATION = WM_USER+101;
+     EM_SETWORDWRAPMODE = WM_USER+102;
+     EM_GETWORDWRAPMODE = WM_USER+103;
+     EM_SETIMECOLOR = WM_USER+104;
+     EM_GETIMECOLOR = WM_USER+105;
+     EM_SETIMEOPTIONS = WM_USER+106;
+     EM_GETIMEOPTIONS = WM_USER+107;
+     EM_SETLANGOPTIONS = WM_USER+120;
+     EM_GETLANGOPTIONS = WM_USER+121;
+     EM_GETIMECOMPMODE = WM_USER+122;
+     EM_FINDTEXTW = WM_USER+123;
+     EM_FINDTEXTEXW = WM_USER+124;
+     EM_RECONVERSION = WM_USER+125;
+     EM_SETBIDIOPTIONS = WM_USER+200;
+     EM_GETBIDIOPTIONS = WM_USER+201;
+     EM_SETTYPOGRAPHYOPTIONS = WM_USER+202;
+     EM_GETTYPOGRAPHYOPTIONS = WM_USER+203;
+     EM_SETEDITSTYLE = WM_USER+204;
+     EM_GETEDITSTYLE = WM_USER+205;
+     EM_GETSCROLLPOS = WM_USER+221;
+     EM_SETSCROLLPOS = WM_USER+222;
+     EM_SETFONTSIZE = WM_USER+223;
+     EM_GETZOOM = WM_USER+224;
+     EM_SETZOOM = WM_USER+225;
+     EN_CORRECTTEXT = 1797;
+     EN_DROPFILES = 1795;
+     EN_IMECHANGE = 1799;
+     EN_LINK = 1803;
+     EN_MSGFILTER = 1792;
+     EN_OLEOPFAILED = 1801;
+     EN_PROTECTED = 1796;
+     EN_REQUESTRESIZE = 1793;
+     EN_SAVECLIPBOARD = 1800;
+     EN_SELCHANGE = 1794;
+     EN_STOPNOUNDO = 1798;
+     ENM_NONE = 0;
+     ENM_CHANGE = 1;
+     ENM_CORRECTTEXT = 4194304;
+     ENM_DRAGDROPDONE = 16;
+     ENM_DROPFILES = 1048576;
+     ENM_IMECHANGE = 8388608;
+     ENM_KEYEVENTS = 65536;
+     ENM_LANGCHANGE = 16777216;
+     ENM_LINK = 67108864;
+     ENM_MOUSEEVENTS = 131072;
+     ENM_OBJECTPOSITIONS = 33554432;
+     ENM_PROTECTED = 2097152;
+     ENM_REQUESTRESIZE = 262144;
+     ENM_SCROLL = 4;
+     ENM_SCROLLEVENTS = 8;
+     ENM_SELCHANGE = 524288;
+     ENM_UPDATE = 2;
+     ECO_AUTOWORDSELECTION = 1;
+     ECO_AUTOVSCROLL = 64;
+     ECO_AUTOHSCROLL = 128;
+     ECO_NOHIDESEL = 256;
+     ECO_READONLY = 2048;
+     ECO_WANTRETURN = 4096;
+     ECO_SAVESEL = $8000;
+     ECO_SELECTIONBAR = $1000000;
+     ECO_VERTICAL = $400000;
+     ECOOP_SET = 1;
+     ECOOP_OR = 2;
+     ECOOP_AND = 3;
+     ECOOP_XOR = 4;
+     SCF_DEFAULT = 0;
+     SCF_SELECTION = 1;
+     SCF_WORD = 2;
+     SCF_ALL = 4;
+     SCF_USEUIRULES = 8;
+     TM_PLAINTEXT = 1;
+     TM_RICHTEXT = 2;
+     TM_SINGLELEVELUNDO = 4;
+     TM_MULTILEVELUNDO = 8;
+     TM_SINGLECODEPAGE = 16;
+     TM_MULTICODEPAGE = 32;
+     GT_DEFAULT = 0;
+     GT_USECRLF = 1;
+     yHeightCharPtsMost = 1638;
+     lDefaultTab = 720;
      FT_MATCHCASE = 4;
      FT_WHOLEWORD = 2;
 
@@ -475,6 +475,12 @@ uses Messages, Windows;
      MSGFILTER = _msgfilter;
      TMSGFILTER = _msgfilter;
 
+     TReqSize = record
+       nmhdr: TNMHdr;
+       rc: TRect;
+     end;
+     PReqSize = ^TReqSize;
+
      _paraformat = record
           cbSize : UINT;
           dwMask : DWORD;
@@ -576,15 +582,15 @@ uses Messages, Windows;
   { Defines for EM_SETTYPOGRAPHYOPTIONS  }
 
   const
-     TO_ADVANCEDTYPOGRAPHY = 1;     
-     TO_SIMPLELINEBREAK = 2;     
+     TO_ADVANCEDTYPOGRAPHY = 1;
+     TO_SIMPLELINEBREAK = 2;
   { Defines for GETTEXTLENGTHEX  }
-     GTL_DEFAULT = 0;     
-     GTL_USECRLF = 1;     
-     GTL_PRECISE = 2;     
-     GTL_CLOSE = 4;     
-     GTL_NUMCHARS = 8;     
-     GTL_NUMBYTES = 16;     
+     GTL_DEFAULT = 0;
+     GTL_USECRLF = 1;
+     GTL_PRECISE = 2;
+     GTL_CLOSE = 4;
+     GTL_NUMCHARS = 8;
+     GTL_NUMBYTES = 16;
 
   type
 

+ 34 - 0
packages/base/winunits/shlobj.pp

@@ -1,4 +1,17 @@
 {
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2007 by Florian Klaempfl
+    member of 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.
+
+    Original copyright statement follows.
+
 }
 {$mode objfpc}
 unit shlobj;
@@ -36,6 +49,27 @@ unit shlobj;
         function Enable(fEnable: BOOL): HRESULT; stdcall;
       end;
 
+    const
+      CLSID_AutoComplete: TGUID = '{00BB2763-6A77-11D0-A535-00C04FD7D062}';
+
+    const
+      { IAutoComplete2 options }
+      ACO_NONE           = 0;
+      ACO_AUTOSUGGEST    = $1;
+      ACO_AUTOAPPEND     = $2;
+      ACO_SEARCH         = $4;
+      ACO_FILTERPREFIXES = $8;
+      ACO_USETAB         = $10;
+      ACO_UPDOWNKEYDROPSLIST = $20;
+      ACO_RTLREADING     = $40;
+
+    type
+      IAutoComplete2 = interface(IAutoComplete)
+        ['{EAC04BC0-3791-11d2-BB95-0060977B464C}']
+        function SetOptions(dwFlag: DWORD): HRESULT; stdcall;
+        function GetOptions(var dwFlag: DWORD): HRESULT; stdcall;
+      end;
+
   implementation
 
 end.

+ 1 - 1
packages/extra/gtk2/gtk+/gtk/gtkcontainer.inc

@@ -243,7 +243,7 @@ procedure GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(
   anObject: pointer; property_id: guint; pspec : pointer);
 begin
    writeln('invalid child property id ',property_id,' ',
-     HexStr(PtrUInt(anObject),8),' ',HexStr(PtrUInt(pspec),8));
+     HexStr(PtrInt(anObject),8),' ',HexStr(PtrInt(pspec),8));
    //  G_OBJECT_WARN_INVALID_PSPEC(anObject,'child property id',property_id,pspec);
 end;
 

+ 9 - 0
packages/extra/openssl/examples/Makefile

@@ -0,0 +1,9 @@
+PP=fpc
+ARGS=-O2 -XX -Xs
+DELP=delp
+
+all:
+	$(PP) $(ARGS) test1.pas
+
+clean:
+	$(DELP) .

+ 14 - 0
packages/extra/openssl/examples/test1.pas

@@ -0,0 +1,14 @@
+program test1;
+
+{$mode objfpc}{$H+}
+
+uses
+  OpenSSL;
+
+begin
+  if InitSSLInterface then
+    Writeln('Success')
+  else
+    Writeln('Holy shit!');
+end.
+

+ 1451 - 1419
packages/extra/openssl/openssl.pas

@@ -1,1426 +1,1458 @@
-unit OpenSSL;
-
-{==============================================================================|
-| Project : Ararat Synapse                                       | 003.004.001 |
-|==============================================================================|
-| Content: SSL support by OpenSSL                                              |
-|==============================================================================|
-| Copyright (c)1999-2005, Lukas Gebauer                                        |
-| All rights reserved.                                                         |
-|                                                                              |
-| Redistribution and use in source and binary forms, with or without           |
-| modification, are permitted provided that the following conditions are met:  |
-|                                                                              |
-| Redistributions of source code must retain the above copyright notice, this  |
-| list of conditions and the following disclaimer.                             |
-|                                                                              |
-| Redistributions in binary form must reproduce the above copyright notice,    |
-| this list of conditions and the following disclaimer in the documentation    |
-| and/or other materials provided with the distribution.                       |
-|                                                                              |
-| Neither the name of Lukas Gebauer nor the names of its contributors may      |
-| be used to endorse or promote products derived from this software without    |
-| specific prior written permission.                                           |
-|                                                                              |
-| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  |
-| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE    |
-| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE   |
-| ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR  |
-| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL       |
-| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR   |
-| SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER   |
-| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT           |
-| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY    |
-| OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH  |
-| DAMAGE.                                                                      |
-|==============================================================================|
-| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
-| Portions created by Lukas Gebauer are Copyright (c)2002-2005.                |
-| All Rights Reserved.                                                         |
-|==============================================================================|
-| Contributor(s):                                                              |
+unit OpenSSL;
+
+{==============================================================================|
+| Project : Ararat Synapse                                       | 003.004.001 |
+|==============================================================================|
+| Content: SSL support by OpenSSL                                              |
+|==============================================================================|
+| Copyright (c)1999-2005, Lukas Gebauer                                        |
+| All rights reserved.                                                         |
+|                                                                              |
+| Redistribution and use in source and binary forms, with or without           |
+| modification, are permitted provided that the following conditions are met:  |
+|                                                                              |
+| Redistributions of source code must retain the above copyright notice, this  |
+| list of conditions and the following disclaimer.                             |
+|                                                                              |
+| Redistributions in binary form must reproduce the above copyright notice,    |
+| this list of conditions and the following disclaimer in the documentation    |
+| and/or other materials provided with the distribution.                       |
+|                                                                              |
+| Neither the name of Lukas Gebauer nor the names of its contributors may      |
+| be used to endorse or promote products derived from this software without    |
+| specific prior written permission.                                           |
+|                                                                              |
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  |
+| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE    |
+| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE   |
+| ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR  |
+| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL       |
+| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR   |
+| SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER   |
+| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT           |
+| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY    |
+| OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH  |
+| DAMAGE.                                                                      |
+|==============================================================================|
+| The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
+| Portions created by Lukas Gebauer are Copyright (c)2002-2005.                |
+| All Rights Reserved.                                                         |
+|==============================================================================|
+| Contributor(s):                                                              |
 |==============================================================================|
 | FreePascal basic cleanup (original worked too): Ales Katona                  |
 | WARNING: due to reliance on some units, I have removed the ThreadLocks init  |
 |          if need be, it should be re-added, or handled by the                | 
-|           OS threading init somehow                                          |
-|==============================================================================|
-| History: see HISTORY.HTM from distribution package                           |
-|          (Found at URL: http://www.ararat.cz/synapse/)                       |
-|==============================================================================}
-
-{
-Special thanks to Gregor Ibic <[email protected]>
- (Intelicom d.o.o., http://www.intelicom.si)
- for good inspiration about begin with SSL programming.
-}
-
-{$MODE DELPHI}{$H+}
-
-{:@abstract(OpenSSL support)
-
-This unit is Pascal interface to OpenSSL library (used by @link(ssl_openssl) unit).
-OpenSSL is loaded dynamicly on-demand. If this library is not found in system,
-requested OpenSSL function just return errorcode.
+|           OS threading init somehow                                          |
+|==============================================================================|
+| History: see HISTORY.HTM from distribution package                           |
+|          (Found at URL: http://www.ararat.cz/synapse/)                       |
+|==============================================================================}
+
+{
+Special thanks to Gregor Ibic <[email protected]>
+ (Intelicom d.o.o., http://www.intelicom.si)
+ for good inspiration about begin with SSL programming.
 }
-
-interface
-
-uses
-  DynLibs;
-
-var
-  {$IFDEF WINDOWS}
-  DLLSSLName: string = 'ssleay32.dll';
-  DLLSSLName2: string = 'libssl32.dll';
-  DLLUtilName: string = 'libeay32.dll';
-  {$ELSE}
-  DLLSSLName: string = 'libssl.so';
-  DLLUtilName: string = 'libcrypto.so';
-  {$ENDIF}
-
-type
-  SslPtr = Pointer;
-  PSslPtr = ^SslPtr;
-  PSSL_CTX = SslPtr;
-  PSSL = SslPtr;
-  PSSL_METHOD = SslPtr;
-  PX509 = SslPtr;
-  PX509_NAME = SslPtr;
-  PEVP_MD	= SslPtr;
-  PInteger = ^Integer;
-  PBIO_METHOD = SslPtr;
-  PBIO = SslPtr;
-  EVP_PKEY = SslPtr;
-  PRSA = SslPtr;
-  PASN1_UTCTIME = SslPtr;
-  PASN1_INTEGER = SslPtr;
-  PPasswdCb = SslPtr;
-  PFunction = procedure;
-
-  DES_cblock = array[0..7] of Byte;
-  PDES_cblock = ^DES_cblock;
-  des_ks_struct = packed record
-    ks: DES_cblock;
-    weak_key: Integer;
-  end;
-  des_key_schedule = array[1..16] of des_ks_struct;
-
-const
-  EVP_MAX_MD_SIZE = 16 + 20;
-
-  SSL_ERROR_NONE = 0;
-  SSL_ERROR_SSL = 1;
-  SSL_ERROR_WANT_READ = 2;
-  SSL_ERROR_WANT_WRITE = 3;
-  SSL_ERROR_WANT_X509_LOOKUP = 4;
-  SSL_ERROR_SYSCALL = 5; //look at error stack/return value/errno
-  SSL_ERROR_ZERO_RETURN = 6;
-  SSL_ERROR_WANT_CONNECT = 7;
-  SSL_ERROR_WANT_ACCEPT = 8;
-
-  SSL_OP_NO_SSLv2 = $01000000;
-  SSL_OP_NO_SSLv3 = $02000000;
-  SSL_OP_NO_TLSv1 = $04000000;
-  SSL_OP_ALL = $000FFFFF;
-  SSL_VERIFY_NONE = $00;
-  SSL_VERIFY_PEER = $01;
-
-  OPENSSL_DES_DECRYPT = 0;
-  OPENSSL_DES_ENCRYPT = 1;
-
-  X509_V_OK =	0;
-  X509_V_ILLEGAL = 1;
-  X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT = 2;
-  X509_V_ERR_UNABLE_TO_GET_CRL = 3;
-  X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE = 4;
-  X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE = 5;
-  X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY = 6;
-  X509_V_ERR_CERT_SIGNATURE_FAILURE = 7;
-  X509_V_ERR_CRL_SIGNATURE_FAILURE = 8;
-  X509_V_ERR_CERT_NOT_YET_VALID = 9;
-  X509_V_ERR_CERT_HAS_EXPIRED = 10;
-  X509_V_ERR_CRL_NOT_YET_VALID = 11;
-  X509_V_ERR_CRL_HAS_EXPIRED = 12;
-  X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD = 13;
-  X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD = 14;
-  X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD = 15;
-  X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD = 16;
-  X509_V_ERR_OUT_OF_MEM = 17;
-  X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT = 18;
-  X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN = 19;
-  X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY = 20;
-  X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE = 21;
-  X509_V_ERR_CERT_CHAIN_TOO_LONG = 22;
-  X509_V_ERR_CERT_REVOKED = 23;
-  X509_V_ERR_INVALID_CA = 24;
-  X509_V_ERR_PATH_LENGTH_EXCEEDED = 25;
-  X509_V_ERR_INVALID_PURPOSE = 26;
-  X509_V_ERR_CERT_UNTRUSTED = 27;
-  X509_V_ERR_CERT_REJECTED = 28;
-  //These are 'informational' when looking for issuer cert
-  X509_V_ERR_SUBJECT_ISSUER_MISMATCH = 29;
-  X509_V_ERR_AKID_SKID_MISMATCH = 30;
-  X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH = 31;
-  X509_V_ERR_KEYUSAGE_NO_CERTSIGN = 32;
-  X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER = 33;
-  X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION = 34;
-  //The application is not happy
-  X509_V_ERR_APPLICATION_VERIFICATION = 50;
-
-  SSL_FILETYPE_ASN1	= 2;
-  SSL_FILETYPE_PEM = 1;
-  EVP_PKEY_RSA = 6;
-
-var
-  SSLLibHandle: TLibHandle = 0;
-  SSLUtilHandle: TLibHandle = 0;
-  SSLLibFile: string = '';
-  SSLUtilFile: string = '';
-
-// libssl.dll
-  function SslGetError(s: PSSL; ret_code: Integer):Integer;
-  function SslLibraryInit:Integer;
-  procedure SslLoadErrorStrings;
-//  function SslCtxSetCipherList(arg0: PSSL_CTX; str: PChar):Integer;
-  function SslCtxSetCipherList(arg0: PSSL_CTX; var str: String):Integer;
-  function SslCtxNew(meth: PSSL_METHOD):PSSL_CTX;
-  procedure SslCtxFree(arg0: PSSL_CTX);
-  function SslSetFd(s: PSSL; fd: Integer):Integer;
-  function SslMethodV2:PSSL_METHOD;
-  function SslMethodV3:PSSL_METHOD;
-  function SslMethodTLSV1:PSSL_METHOD;
-  function SslMethodV23:PSSL_METHOD;
-  function SslCtxUsePrivateKey(ctx: PSSL_CTX; pkey: SslPtr):Integer;
-  function SslCtxUsePrivateKeyASN1(pk: integer; ctx: PSSL_CTX; d: String; len: integer):Integer;
-//  function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: PChar; _type: Integer):Integer;
-  function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;
-  function SslCtxUseCertificate(ctx: PSSL_CTX; x: SslPtr):Integer;
-  function SslCtxUseCertificateASN1(ctx: PSSL_CTX; len: integer; d: String):Integer;
-  function SslCtxUseCertificateFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;
-//  function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: PChar):Integer;
-  function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: String):Integer;
-  function SslCtxCheckPrivateKeyFile(ctx: PSSL_CTX):Integer;
-  procedure SslCtxSetDefaultPasswdCb(ctx: PSSL_CTX; cb: PPasswdCb);
-  procedure SslCtxSetDefaultPasswdCbUserdata(ctx: PSSL_CTX; u: SslPtr);
-//  function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: PChar; const CApath: PChar):Integer;
-  function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: String; const CApath: String):Integer;
-  function SslNew(ctx: PSSL_CTX):PSSL;
-  procedure SslFree(ssl: PSSL);
-  function SslAccept(ssl: PSSL):Integer;
-  function SslConnect(ssl: PSSL):Integer;
-  function SslShutdown(ssl: PSSL):Integer;
-  function SslRead(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
-  function SslPeek(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
-  function SslWrite(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
-  function SslPending(ssl: PSSL):Integer;
-  function SslGetVersion(ssl: PSSL):String;
-  function SslGetPeerCertificate(ssl: PSSL):PX509;
-  procedure SslCtxSetVerify(ctx: PSSL_CTX; mode: Integer; arg2: PFunction);
-  function SSLGetCurrentCipher(s: PSSL):SslPtr;
-  function SSLCipherGetName(c: SslPtr): String;
-  function SSLCipherGetBits(c: SslPtr; var alg_bits: Integer):Integer;
-  function SSLGetVerifyResult(ssl: PSSL):Integer;
-
-// libeay.dll
-  function X509New: PX509;
-  procedure X509Free(x: PX509);
-  function X509NameOneline(a: PX509_NAME; var buf: String; size: Integer):String;
-  function X509GetSubjectName(a: PX509):PX509_NAME;
-  function X509GetIssuerName(a: PX509):PX509_NAME;
-  function X509NameHash(x: PX509_NAME):Cardinal;
-//  function SslX509Digest(data: PX509; _type: PEVP_MD; md: PChar; len: PInteger):Integer;
-  function X509Digest(data: PX509; _type: PEVP_MD; md: String; var len: Integer):Integer;
-  function X509print(b: PBIO; a: PX509): integer;
-  function X509SetVersion(x: PX509; version: integer): integer;
-  function X509SetPubkey(x: PX509; pkey: EVP_PKEY): integer;
-  function X509SetIssuerName(x: PX509; name: PX509_NAME): integer;
-  function X509NameAddEntryByTxt(name: PX509_NAME; field: string; _type: integer;
-    bytes: string; len, loc, _set: integer): integer;
-  function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer;
-  function X509GmtimeAdj(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME;
-  function X509SetNotBefore(x: PX509; tm: PASN1_UTCTIME): integer;
-  function X509SetNotAfter(x: PX509; tm: PASN1_UTCTIME): integer;
-  function X509GetSerialNumber(x: PX509): PASN1_INTEGER;
-  function EvpPkeyNew: EVP_PKEY;
-  procedure EvpPkeyFree(pk: EVP_PKEY);
-  function EvpPkeyAssign(pkey: EVP_PKEY; _type: integer; key: Prsa): integer;
-  function EvpGetDigestByName(Name: String): PEVP_MD;
-  procedure EVPcleanup;
-//  function ErrErrorString(e: integer; buf: PChar): PChar;
-  function SSLeayversion(t: integer): string;
-  procedure ErrErrorString(e: integer; var buf: string; len: integer);
-  function ErrGetError: integer;
-  procedure ErrClearError;
-  procedure ErrFreeStrings;
-  procedure ErrRemoveState(pid: integer);
-  procedure OPENSSLaddallalgorithms;
-  procedure CRYPTOcleanupAllExData;
-  procedure RandScreen;
-  function BioNew(b: PBIO_METHOD): PBIO;
-  procedure BioFreeAll(b: PBIO);
-  function BioSMem: PBIO_METHOD;
-  function BioCtrlPending(b: PBIO): integer;
-  function BioRead(b: PBIO; var Buf: String; Len: integer): integer;
-  function BioWrite(b: PBIO; Buf: String; Len: integer): integer;
-  function d2iPKCS12bio(b:PBIO; Pkcs12: SslPtr): SslPtr;
-  function PKCS12parse(p12: SslPtr; pass: string; var pkey, cert, ca: SslPtr): integer;
-  procedure PKCS12free(p12: SslPtr);
-  function RsaGenerateKey(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA;
-  function Asn1UtctimeNew: PASN1_UTCTIME;
-  procedure Asn1UtctimeFree(a: PASN1_UTCTIME);
-  function Asn1IntegerSet(a: PASN1_INTEGER; v: integer): integer;
-  function i2dX509bio(b: PBIO; x: PX509): integer;
-  function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): integer;
-
-  // 3DES functions
-  procedure DESsetoddparity(Key: des_cblock);
-  function DESsetkeychecked(key: des_cblock; schedule: des_key_schedule): Integer;
-  procedure DESecbencrypt(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer);
-
-function IsSSLloaded: Boolean;
-function InitSSLInterface: Boolean;
-function DestroySSLInterface: Boolean;
-
-implementation
-
-type
-// libssl.dll
-  TSslGetError = function(s: PSSL; ret_code: Integer):Integer; cdecl;
-  TSslLibraryInit = function:Integer; cdecl;
-  TSslLoadErrorStrings = procedure; cdecl;
-  TSslCtxSetCipherList = function(arg0: PSSL_CTX; str: PChar):Integer; cdecl;
-  TSslCtxNew = function(meth: PSSL_METHOD):PSSL_CTX; cdecl;
-  TSslCtxFree = procedure(arg0: PSSL_CTX); cdecl;
-  TSslSetFd = function(s: PSSL; fd: Integer):Integer; cdecl;
-  TSslMethodV2 = function:PSSL_METHOD; cdecl;
-  TSslMethodV3 = function:PSSL_METHOD; cdecl;
-  TSslMethodTLSV1 = function:PSSL_METHOD; cdecl;
-  TSslMethodV23 = function:PSSL_METHOD; cdecl;
-  TSslCtxUsePrivateKey = function(ctx: PSSL_CTX; pkey: sslptr):Integer; cdecl;
-  TSslCtxUsePrivateKeyASN1 = function(pk: integer; ctx: PSSL_CTX; d: sslptr; len: integer):Integer; cdecl;
-  TSslCtxUsePrivateKeyFile = function(ctx: PSSL_CTX; const _file: PChar; _type: Integer):Integer; cdecl;
-  TSslCtxUseCertificate = function(ctx: PSSL_CTX; x: SslPtr):Integer; cdecl;
-  TSslCtxUseCertificateASN1 = function(ctx: PSSL_CTX; len: Integer; d: SslPtr):Integer; cdecl;
-  TSslCtxUseCertificateFile = function(ctx: PSSL_CTX; const _file: PChar; _type: Integer):Integer; cdecl;
-  TSslCtxUseCertificateChainFile = function(ctx: PSSL_CTX; const _file: PChar):Integer; cdecl;
-  TSslCtxCheckPrivateKeyFile = function(ctx: PSSL_CTX):Integer; cdecl;
-  TSslCtxSetDefaultPasswdCb = procedure(ctx: PSSL_CTX; cb: SslPtr); cdecl;
-  TSslCtxSetDefaultPasswdCbUserdata = procedure(ctx: PSSL_CTX; u: SslPtr); cdecl;
-  TSslCtxLoadVerifyLocations = function(ctx: PSSL_CTX; const CAfile: PChar; const CApath: PChar):Integer; cdecl;
-  TSslNew = function(ctx: PSSL_CTX):PSSL; cdecl;
-  TSslFree = procedure(ssl: PSSL); cdecl;
-  TSslAccept = function(ssl: PSSL):Integer; cdecl;
-  TSslConnect = function(ssl: PSSL):Integer; cdecl;
-  TSslShutdown = function(ssl: PSSL):Integer; cdecl;
-  TSslRead = function(ssl: PSSL; buf: PChar; num: Integer):Integer; cdecl;
-  TSslPeek = function(ssl: PSSL; buf: PChar; num: Integer):Integer; cdecl;
-  TSslWrite = function(ssl: PSSL; const buf: PChar; num: Integer):Integer; cdecl;
-  TSslPending = function(ssl: PSSL):Integer; cdecl;
-  TSslGetVersion = function(ssl: PSSL):PChar; cdecl;
-  TSslGetPeerCertificate = function(ssl: PSSL):PX509; cdecl;
-  TSslCtxSetVerify = procedure(ctx: PSSL_CTX; mode: Integer; arg2: SslPtr); cdecl;
-  TSSLGetCurrentCipher = function(s: PSSL):SslPtr; cdecl;
-  TSSLCipherGetName = function(c: Sslptr):PChar; cdecl;
-  TSSLCipherGetBits = function(c: SslPtr; alg_bits: PInteger):Integer; cdecl;
-  TSSLGetVerifyResult = function(ssl: PSSL):Integer; cdecl;
-
-// libeay.dll
-  TX509New = function: PX509; cdecl;
-  TX509Free = procedure(x: PX509); cdecl;
-  TX509NameOneline = function(a: PX509_NAME; buf: PChar; size: Integer):PChar; cdecl;
-  TX509GetSubjectName = function(a: PX509):PX509_NAME; cdecl;
-  TX509GetIssuerName = function(a: PX509):PX509_NAME; cdecl;
-  TX509NameHash = function(x: PX509_NAME):Cardinal; cdecl;
-  TX509Digest = function(data: PX509; _type: PEVP_MD; md: PChar; len: PInteger):Integer; cdecl;
-  TX509print = function(b: PBIO; a: PX509): integer; cdecl;
-  TX509SetVersion = function(x: PX509; version: integer): integer; cdecl;
-  TX509SetPubkey = function(x: PX509; pkey: EVP_PKEY): integer; cdecl;
-  TX509SetIssuerName = function(x: PX509; name: PX509_NAME): integer; cdecl;
-  TX509NameAddEntryByTxt = function(name: PX509_NAME; field: PChar; _type: integer;
-    bytes: PChar; len, loc, _set: integer): integer; cdecl;
-  TX509Sign = function(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer; cdecl;
-  TX509GmtimeAdj = function(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME; cdecl;
-  TX509SetNotBefore = function(x: PX509; tm: PASN1_UTCTIME): integer; cdecl;
-  TX509SetNotAfter = function(x: PX509; tm: PASN1_UTCTIME): integer; cdecl;
-  TX509GetSerialNumber = function(x: PX509): PASN1_INTEGER; cdecl;
-  TEvpPkeyNew = function: EVP_PKEY; cdecl;
-  TEvpPkeyFree = procedure(pk: EVP_PKEY); cdecl;
-  TEvpPkeyAssign = function(pkey: EVP_PKEY; _type: integer; key: Prsa): integer; cdecl;
-  TEvpGetDigestByName = function(Name: PChar): PEVP_MD; cdecl;
-  TEVPcleanup = procedure; cdecl;
-  TSSLeayversion = function(t: integer): PChar; cdecl;
-  TErrErrorString = procedure(e: integer; buf: PChar; len: integer); cdecl;
-  TErrGetError = function: integer; cdecl;
-  TErrClearError = procedure; cdecl;
-  TErrFreeStrings = procedure; cdecl;
-  TErrRemoveState = procedure(pid: integer); cdecl;
-  TOPENSSLaddallalgorithms = procedure; cdecl;
-  TCRYPTOcleanupAllExData = procedure; cdecl;
-  TRandScreen = procedure; cdecl;
-  TBioNew = function(b: PBIO_METHOD): PBIO; cdecl;
-  TBioFreeAll = procedure(b: PBIO); cdecl;
-  TBioSMem = function: PBIO_METHOD; cdecl;
-  TBioCtrlPending = function(b: PBIO): integer; cdecl;
-  TBioRead = function(b: PBIO; Buf: PChar; Len: integer): integer; cdecl;
-  TBioWrite = function(b: PBIO; Buf: PChar; Len: integer): integer; cdecl;
-  Td2iPKCS12bio = function(b:PBIO; Pkcs12: SslPtr): SslPtr; cdecl;
-  TPKCS12parse = function(p12: SslPtr; pass: PChar; var pkey, cert, ca: SslPtr): integer; cdecl;
-  TPKCS12free = procedure(p12: SslPtr); cdecl;
-  TRsaGenerateKey = function(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA; cdecl;
-  TAsn1UtctimeNew = function: PASN1_UTCTIME; cdecl;
-  TAsn1UtctimeFree = procedure(a: PASN1_UTCTIME); cdecl;
-  TAsn1IntegerSet = function(a: PASN1_INTEGER; v: integer): integer; cdecl;
-  Ti2dX509bio = function(b: PBIO; x: PX509): integer; cdecl;
-  Ti2dPrivateKeyBio= function(b: PBIO; pkey: EVP_PKEY): integer; cdecl;
-
-  // 3DES functions
-  TDESsetoddparity = procedure(Key: des_cblock); cdecl;
-  TDESsetkeychecked = function(key: des_cblock; schedule: des_key_schedule): Integer; cdecl;
-  TDESecbencrypt = procedure(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer); cdecl;
-  //thread lock functions
-  TCRYPTOnumlocks = function: integer; cdecl;
-  TCRYPTOSetLockingCallback = procedure(cb: Sslptr); cdecl;
-
-var
-// libssl.dll
-  _SslGetError: TSslGetError = nil;
-  _SslLibraryInit: TSslLibraryInit = nil;
-  _SslLoadErrorStrings: TSslLoadErrorStrings = nil;
-  _SslCtxSetCipherList: TSslCtxSetCipherList = nil;
-  _SslCtxNew: TSslCtxNew = nil;
-  _SslCtxFree: TSslCtxFree = nil;
-  _SslSetFd: TSslSetFd = nil;
-  _SslMethodV2: TSslMethodV2 = nil;
-  _SslMethodV3: TSslMethodV3 = nil;
-  _SslMethodTLSV1: TSslMethodTLSV1 = nil;
-  _SslMethodV23: TSslMethodV23 = nil;
-  _SslCtxUsePrivateKey: TSslCtxUsePrivateKey = nil;
-  _SslCtxUsePrivateKeyASN1: TSslCtxUsePrivateKeyASN1 = nil;
-  _SslCtxUsePrivateKeyFile: TSslCtxUsePrivateKeyFile = nil;
-  _SslCtxUseCertificate: TSslCtxUseCertificate = nil;
-  _SslCtxUseCertificateASN1: TSslCtxUseCertificateASN1 = nil;
-  _SslCtxUseCertificateFile: TSslCtxUseCertificateFile = nil;
-  _SslCtxUseCertificateChainFile: TSslCtxUseCertificateChainFile = nil;
-  _SslCtxCheckPrivateKeyFile: TSslCtxCheckPrivateKeyFile = nil;
-  _SslCtxSetDefaultPasswdCb: TSslCtxSetDefaultPasswdCb = nil;
-  _SslCtxSetDefaultPasswdCbUserdata: TSslCtxSetDefaultPasswdCbUserdata = nil;
-  _SslCtxLoadVerifyLocations: TSslCtxLoadVerifyLocations = nil;
-  _SslNew: TSslNew = nil;
-  _SslFree: TSslFree = nil;
-  _SslAccept: TSslAccept = nil;
-  _SslConnect: TSslConnect = nil;
-  _SslShutdown: TSslShutdown = nil;
-  _SslRead: TSslRead = nil;
-  _SslPeek: TSslPeek = nil;
-  _SslWrite: TSslWrite = nil;
-  _SslPending: TSslPending = nil;
-  _SslGetVersion: TSslGetVersion = nil;
-  _SslGetPeerCertificate: TSslGetPeerCertificate = nil;
-  _SslCtxSetVerify: TSslCtxSetVerify = nil;
-  _SSLGetCurrentCipher: TSSLGetCurrentCipher = nil;
-  _SSLCipherGetName: TSSLCipherGetName = nil;
-  _SSLCipherGetBits: TSSLCipherGetBits = nil;
-  _SSLGetVerifyResult: TSSLGetVerifyResult = nil;
-
-// libeay.dll
-  _X509New: TX509New = nil;
-  _X509Free: TX509Free = nil;
-  _X509NameOneline: TX509NameOneline = nil;
-  _X509GetSubjectName: TX509GetSubjectName = nil;
-  _X509GetIssuerName: TX509GetIssuerName = nil;
-  _X509NameHash: TX509NameHash = nil;
-  _X509Digest: TX509Digest = nil;
-  _X509print: TX509print = nil;
-  _X509SetVersion: TX509SetVersion = nil;
-  _X509SetPubkey: TX509SetPubkey = nil;
-  _X509SetIssuerName: TX509SetIssuerName = nil;
-  _X509NameAddEntryByTxt: TX509NameAddEntryByTxt = nil;
-  _X509Sign: TX509Sign = nil;
-  _X509GmtimeAdj: TX509GmtimeAdj = nil;
-  _X509SetNotBefore: TX509SetNotBefore = nil;
-  _X509SetNotAfter: TX509SetNotAfter = nil;
-  _X509GetSerialNumber: TX509GetSerialNumber = nil;
-  _EvpPkeyNew: TEvpPkeyNew = nil;
-  _EvpPkeyFree: TEvpPkeyFree = nil;
-  _EvpPkeyAssign: TEvpPkeyAssign = nil;
-  _EvpGetDigestByName: TEvpGetDigestByName = nil;
-  _EVPcleanup: TEVPcleanup = nil;
-  _SSLeayversion: TSSLeayversion = nil;
-  _ErrErrorString: TErrErrorString = nil;
-  _ErrGetError: TErrGetError = nil;
-  _ErrClearError: TErrClearError = nil;
-  _ErrFreeStrings: TErrFreeStrings = nil;
-  _ErrRemoveState: TErrRemoveState = nil;
-  _OPENSSLaddallalgorithms: TOPENSSLaddallalgorithms = nil;
-  _CRYPTOcleanupAllExData: TCRYPTOcleanupAllExData = nil;
-  _RandScreen: TRandScreen = nil;
-  _BioNew: TBioNew = nil;
-  _BioFreeAll: TBioFreeAll = nil;
-  _BioSMem: TBioSMem = nil;
-  _BioCtrlPending: TBioCtrlPending = nil;
-  _BioRead: TBioRead = nil;
-  _BioWrite: TBioWrite = nil;
-  _d2iPKCS12bio: Td2iPKCS12bio = nil;
-  _PKCS12parse: TPKCS12parse = nil;
-  _PKCS12free: TPKCS12free = nil;
-  _RsaGenerateKey: TRsaGenerateKey = nil;
-  _Asn1UtctimeNew: TAsn1UtctimeNew = nil;
-  _Asn1UtctimeFree: TAsn1UtctimeFree = nil;
-  _Asn1IntegerSet: TAsn1IntegerSet = nil;
-  _i2dX509bio: Ti2dX509bio = nil;
-  _i2dPrivateKeyBio: Ti2dPrivateKeyBio = nil;
-
-  // 3DES functions
-  _DESsetoddparity: TDESsetoddparity = nil;
-  _DESsetkeychecked: TDESsetkeychecked = nil;
-  _DESecbencrypt: TDESecbencrypt = nil;
-  //thread lock functions
-  _CRYPTOnumlocks: TCRYPTOnumlocks = nil;
-  _CRYPTOSetLockingCallback: TCRYPTOSetLockingCallback = nil;
-
-var
-  SSLloaded: boolean = false;
-
-// libssl.dll
-function SslGetError(s: PSSL; ret_code: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslGetError) then
-    Result := _SslGetError(s, ret_code)
-  else
-    Result := SSL_ERROR_SSL;
-end;
-
-function SslLibraryInit:Integer;
-begin
-  if InitSSLInterface and Assigned(_SslLibraryInit) then
-    Result := _SslLibraryInit
-  else
-    Result := 1;
-end;
-
-procedure SslLoadErrorStrings;
-begin
-  if InitSSLInterface and Assigned(_SslLoadErrorStrings) then
-    _SslLoadErrorStrings;
-end;
-
-function SslCtxSetCipherList(arg0: PSSL_CTX; var str: String):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxSetCipherList) then
-    Result := _SslCtxSetCipherList(arg0, PChar(str))
-  else
-    Result := 0;
-end;
-
-function SslCtxNew(meth: PSSL_METHOD):PSSL_CTX;
-begin
-  if InitSSLInterface and Assigned(_SslCtxNew) then
-    Result := _SslCtxNew(meth)
-  else
-    Result := nil;
-end;
-
-procedure SslCtxFree(arg0: PSSL_CTX);
-begin
-  if InitSSLInterface and Assigned(_SslCtxFree) then
-    _SslCtxFree(arg0);
-end;
-
-function SslSetFd(s: PSSL; fd: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslSetFd) then
-    Result := _SslSetFd(s, fd)
-  else
-    Result := 0;
-end;
-
-function SslMethodV2:PSSL_METHOD;
-begin
-  if InitSSLInterface and Assigned(_SslMethodV2) then
-    Result := _SslMethodV2
-  else
-    Result := nil;
-end;
-
-function SslMethodV3:PSSL_METHOD;
-begin
-  if InitSSLInterface and Assigned(_SslMethodV3) then
-    Result := _SslMethodV3
-  else
-    Result := nil;
-end;
-
-function SslMethodTLSV1:PSSL_METHOD;
-begin
-  if InitSSLInterface and Assigned(_SslMethodTLSV1) then
-    Result := _SslMethodTLSV1
-  else
-    Result := nil;
-end;
-
-function SslMethodV23:PSSL_METHOD;
-begin
-  if InitSSLInterface and Assigned(_SslMethodV23) then
-    Result := _SslMethodV23
-  else
-    Result := nil;
-end;
-
-function SslCtxUsePrivateKey(ctx: PSSL_CTX; pkey: SslPtr):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxUsePrivateKey) then
-    Result := _SslCtxUsePrivateKey(ctx, pkey)
-  else
-    Result := 0;
-end;
-
-function SslCtxUsePrivateKeyASN1(pk: integer; ctx: PSSL_CTX; d: String; len: integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxUsePrivateKeyASN1) then
-    Result := _SslCtxUsePrivateKeyASN1(pk, ctx, Sslptr(d), len)
-  else
-    Result := 0;
-end;
-
-function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxUsePrivateKeyFile) then
-    Result := _SslCtxUsePrivateKeyFile(ctx, PChar(_file), _type)
-  else
-    Result := 0;
-end;
-
-function SslCtxUseCertificate(ctx: PSSL_CTX; x: SslPtr):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxUseCertificate) then
-    Result := _SslCtxUseCertificate(ctx, x)
-  else
-    Result := 0;
-end;
-
-function SslCtxUseCertificateASN1(ctx: PSSL_CTX; len: integer; d: String):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxUseCertificateASN1) then
-    Result := _SslCtxUseCertificateASN1(ctx, len, SslPtr(d))
-  else
-    Result := 0;
-end;
-
-function SslCtxUseCertificateFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxUseCertificateFile) then
-    Result := _SslCtxUseCertificateFile(ctx, PChar(_file), _type)
-  else
-    Result := 0;
-end;
-
-function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: String):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxUseCertificateChainFile) then
-    Result := _SslCtxUseCertificateChainFile(ctx, PChar(_file))
-  else
-    Result := 0;
-end;
-
-function SslCtxCheckPrivateKeyFile(ctx: PSSL_CTX):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxCheckPrivateKeyFile) then
-    Result := _SslCtxCheckPrivateKeyFile(ctx)
-  else
-    Result := 0;
-end;
-
-procedure SslCtxSetDefaultPasswdCb(ctx: PSSL_CTX; cb: PPasswdCb);
-begin
-  if InitSSLInterface and Assigned(_SslCtxSetDefaultPasswdCb) then
-    _SslCtxSetDefaultPasswdCb(ctx, cb);
-end;
-
-procedure SslCtxSetDefaultPasswdCbUserdata(ctx: PSSL_CTX; u: SslPtr);
-begin
-  if InitSSLInterface and Assigned(_SslCtxSetDefaultPasswdCbUserdata) then
-    _SslCtxSetDefaultPasswdCbUserdata(ctx, u);
-end;
-
-function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: String; const CApath: String):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslCtxLoadVerifyLocations) then
-    Result := _SslCtxLoadVerifyLocations(ctx, SslPtr(CAfile), SslPtr(CApath))
-  else
-    Result := 0;
-end;
-
-function SslNew(ctx: PSSL_CTX):PSSL;
-begin
-  if InitSSLInterface and Assigned(_SslNew) then
-    Result := _SslNew(ctx)
-  else
-    Result := nil;
-end;
-
-procedure SslFree(ssl: PSSL);
-begin
-  if InitSSLInterface and Assigned(_SslFree) then
-    _SslFree(ssl);
-end;
-
-function SslAccept(ssl: PSSL):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslAccept) then
-    Result := _SslAccept(ssl)
-  else
-    Result := -1;
-end;
-
-function SslConnect(ssl: PSSL):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslConnect) then
-    Result := _SslConnect(ssl)
-  else
-    Result := -1;
-end;
-
-function SslShutdown(ssl: PSSL):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslShutdown) then
-    Result := _SslShutdown(ssl)
-  else
-    Result := -1;
-end;
-
-function SslRead(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslRead) then
-    Result := _SslRead(ssl, PChar(buf), num)
-  else
-    Result := -1;
-end;
-
-function SslPeek(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslPeek) then
-    Result := _SslPeek(ssl, PChar(buf), num)
-  else
-    Result := -1;
-end;
-
-function SslWrite(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslWrite) then
-    Result := _SslWrite(ssl, PChar(buf), num)
-  else
-    Result := -1;
-end;
-
-function SslPending(ssl: PSSL):Integer;
-begin
-  if InitSSLInterface and Assigned(_SslPending) then
-    Result := _SslPending(ssl)
-  else
-    Result := 0;
-end;
-
-//function SslGetVersion(ssl: PSSL):PChar;
-function SslGetVersion(ssl: PSSL):String;
-begin
-  if InitSSLInterface and Assigned(_SslGetVersion) then
-    Result := _SslGetVersion(ssl)
-  else
-    Result := '';
-end;
-
-function SslGetPeerCertificate(ssl: PSSL):PX509;
-begin
-  if InitSSLInterface and Assigned(_SslGetPeerCertificate) then
-    Result := _SslGetPeerCertificate(ssl)
-  else
-    Result := nil;
-end;
-
-procedure SslCtxSetVerify(ctx: PSSL_CTX; mode: Integer; arg2: PFunction);
-begin
-  if InitSSLInterface and Assigned(_SslCtxSetVerify) then
-    _SslCtxSetVerify(ctx, mode, @arg2);
-end;
-
-function SSLGetCurrentCipher(s: PSSL):SslPtr;
-begin
-  if InitSSLInterface and Assigned(_SSLGetCurrentCipher) then
-{$IFDEF CIL}
-{$ELSE}
-    Result := _SSLGetCurrentCipher(s)
-{$ENDIF}
-  else
-    Result := nil;
-end;
-
-function SSLCipherGetName(c: SslPtr):String;
-begin
-  if InitSSLInterface and Assigned(_SSLCipherGetName) then
-    Result := _SSLCipherGetName(c)
-  else
-    Result := '';
-end;
-
-function SSLCipherGetBits(c: SslPtr; var alg_bits: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_SSLCipherGetBits) then
-    Result := _SSLCipherGetBits(c, @alg_bits)
-  else
-    Result := 0;
-end;
-
-function SSLGetVerifyResult(ssl: PSSL):Integer;
-begin
-  if InitSSLInterface and Assigned(_SSLGetVerifyResult) then
-    Result := _SSLGetVerifyResult(ssl)
-  else
-    Result := X509_V_ERR_APPLICATION_VERIFICATION;
-end;
-
-// libeay.dll
-function X509New: PX509;
-begin
-  if InitSSLInterface and Assigned(_X509New) then
-    Result := _X509New
-  else
-    Result := nil;
-end;
-
-procedure X509Free(x: PX509);
-begin
-  if InitSSLInterface and Assigned(_X509Free) then
-    _X509Free(x);
-end;
-
-function X509NameOneline(a: PX509_NAME; var buf: String; size: Integer):String;
-begin
-  if InitSSLInterface and Assigned(_X509NameOneline) then
-    Result := _X509NameOneline(a, PChar(buf),size)
-  else
-    Result := '';
-end;
-
-function X509GetSubjectName(a: PX509):PX509_NAME;
-begin
-  if InitSSLInterface and Assigned(_X509GetSubjectName) then
-    Result := _X509GetSubjectName(a)
-  else
-    Result := nil;
-end;
-
-function X509GetIssuerName(a: PX509):PX509_NAME;
-begin
-  if InitSSLInterface and Assigned(_X509GetIssuerName) then
-    Result := _X509GetIssuerName(a)
-  else
-    Result := nil;
-end;
-
-function X509NameHash(x: PX509_NAME):Cardinal;
-begin
-  if InitSSLInterface and Assigned(_X509NameHash) then
-    Result := _X509NameHash(x)
-  else
-    Result := 0;
-end;
-
-function X509Digest(data: PX509; _type: PEVP_MD; md: String; var len: Integer):Integer;
-begin
-  if InitSSLInterface and Assigned(_X509Digest) then
-    Result := _X509Digest(data, _type, PChar(md), @len)
-  else
-    Result := 0;
-end;
-
-function EvpPkeyNew: EVP_PKEY;
-begin
-  if InitSSLInterface and Assigned(_EvpPkeyNew) then
-    Result := _EvpPkeyNew
-  else
-    Result := nil;
-end;
-
-procedure EvpPkeyFree(pk: EVP_PKEY);
-begin
-  if InitSSLInterface and Assigned(_EvpPkeyFree) then
-    _EvpPkeyFree(pk);
-end;
-
-function SSLeayversion(t: integer): string;
-begin
-  if InitSSLInterface and Assigned(_SSLeayversion) then
-    Result := PChar(_SSLeayversion(t))
-  else
-    Result := '';
-end;
-
-procedure ErrErrorString(e: integer; var buf: string; len: integer);
-begin
-  if InitSSLInterface and Assigned(_ErrErrorString) then
-    _ErrErrorString(e, Pointer(buf), len);
-  buf := PChar(Buf);
-end;
-
-function ErrGetError: integer;
-begin
-  if InitSSLInterface and Assigned(_ErrGetError) then
-    Result := _ErrGetError
-  else
-    Result := SSL_ERROR_SSL;
-end;
-
-procedure ErrClearError;
-begin
-  if InitSSLInterface and Assigned(_ErrClearError) then
-    _ErrClearError;
-end;
-
-procedure ErrFreeStrings;
-begin
-  if InitSSLInterface and Assigned(_ErrFreeStrings) then
-    _ErrFreeStrings;
-end;
-
-procedure ErrRemoveState(pid: integer);
-begin
-  if InitSSLInterface and Assigned(_ErrRemoveState) then
-    _ErrRemoveState(pid);
-end;
-
-procedure OPENSSLaddallalgorithms;
-begin
-  if InitSSLInterface and Assigned(_OPENSSLaddallalgorithms) then
-    _OPENSSLaddallalgorithms;
-end;
-
-procedure EVPcleanup;
-begin
-  if InitSSLInterface and Assigned(_EVPcleanup) then
-    _EVPcleanup;
-end;
-
-procedure CRYPTOcleanupAllExData;
-begin
-  if InitSSLInterface and Assigned(_CRYPTOcleanupAllExData) then
-    _CRYPTOcleanupAllExData;
-end;
-
-procedure RandScreen;
-begin
-  if InitSSLInterface and Assigned(_RandScreen) then
-    _RandScreen;
-end;
-
-function BioNew(b: PBIO_METHOD): PBIO;
-begin
-  if InitSSLInterface and Assigned(_BioNew) then
-    Result := _BioNew(b)
-  else
-    Result := nil;
-end;
-
-procedure BioFreeAll(b: PBIO);
-begin
-  if InitSSLInterface and Assigned(_BioFreeAll) then
-    _BioFreeAll(b);
-end;
-
-function BioSMem: PBIO_METHOD;
-begin
-  if InitSSLInterface and Assigned(_BioSMem) then
-    Result := _BioSMem
-  else
-    Result := nil;
-end;
-
-function BioCtrlPending(b: PBIO): integer;
-begin
-  if InitSSLInterface and Assigned(_BioCtrlPending) then
-    Result := _BioCtrlPending(b)
-  else
-    Result := 0;
-end;
-
-function BioRead(b: PBIO; var Buf: String; Len: integer): integer;
-begin
-  if InitSSLInterface and Assigned(_BioRead) then
-    Result := _BioRead(b, PChar(Buf), Len)
-  else
-    Result := -2;
-end;
-
-//function BioWrite(b: PBIO; Buf: PChar; Len: integer): integer;
-function BioWrite(b: PBIO; Buf: String; Len: integer): integer;
-begin
-  if InitSSLInterface and Assigned(_BioWrite) then
-    Result := _BioWrite(b, PChar(Buf), Len)
-  else
-    Result := -2;
-end;
-
-function X509print(b: PBIO; a: PX509): integer;
-begin
-  if InitSSLInterface and Assigned(_X509print) then
-    Result := _X509print(b, a)
-  else
-    Result := 0;
-end;
-
-function d2iPKCS12bio(b:PBIO; Pkcs12: SslPtr): SslPtr;
-begin
-  if InitSSLInterface and Assigned(_d2iPKCS12bio) then
-    Result := _d2iPKCS12bio(b, Pkcs12)
-  else
-    Result := nil;
-end;
-
-function PKCS12parse(p12: SslPtr; pass: string; var pkey, cert, ca: SslPtr): integer;
-begin
-  if InitSSLInterface and Assigned(_PKCS12parse) then
-    Result := _PKCS12parse(p12, SslPtr(pass), pkey, cert, ca)
-  else
-    Result := 0;
-end;
-
-procedure PKCS12free(p12: SslPtr);
-begin
-  if InitSSLInterface and Assigned(_PKCS12free) then
-    _PKCS12free(p12);
-end;
-
-function RsaGenerateKey(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA;
-begin
-  if InitSSLInterface and Assigned(_RsaGenerateKey) then
-    Result := _RsaGenerateKey(bits, e, callback, cb_arg)
-  else
-    Result := nil;
-end;
-
-function EvpPkeyAssign(pkey: EVP_PKEY; _type: integer; key: Prsa): integer;
-begin
-  if InitSSLInterface and Assigned(_EvpPkeyAssign) then
-    Result := _EvpPkeyAssign(pkey, _type, key)
-  else
-    Result := 0;
-end;
-
-function X509SetVersion(x: PX509; version: integer): integer;
-begin
-  if InitSSLInterface and Assigned(_X509SetVersion) then
-    Result := _X509SetVersion(x, version)
-  else
-    Result := 0;
-end;
-
-function X509SetPubkey(x: PX509; pkey: EVP_PKEY): integer;
-begin
-  if InitSSLInterface and Assigned(_X509SetPubkey) then
-    Result := _X509SetPubkey(x, pkey)
-  else
-    Result := 0;
-end;
-
-function X509SetIssuerName(x: PX509; name: PX509_NAME): integer;
-begin
-  if InitSSLInterface and Assigned(_X509SetIssuerName) then
-    Result := _X509SetIssuerName(x, name)
-  else
-    Result := 0;
-end;
-
-function X509NameAddEntryByTxt(name: PX509_NAME; field: string; _type: integer;
-  bytes: string; len, loc, _set: integer): integer;
-begin
-  if InitSSLInterface and Assigned(_X509NameAddEntryByTxt) then
-    Result := _X509NameAddEntryByTxt(name, PChar(field), _type, PChar(Bytes), len, loc, _set)
-  else
-    Result := 0;
-end;
-
-function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer;
-begin
-  if InitSSLInterface and Assigned(_X509Sign) then
-    Result := _X509Sign(x, pkey, md)
-  else
-    Result := 0;
-end;
-
-function Asn1UtctimeNew: PASN1_UTCTIME;
-begin
-  if InitSSLInterface and Assigned(_Asn1UtctimeNew) then
-    Result := _Asn1UtctimeNew
-  else
-    Result := nil;
-end;
-
-procedure Asn1UtctimeFree(a: PASN1_UTCTIME);
-begin
-  if InitSSLInterface and Assigned(_Asn1UtctimeFree) then
-    _Asn1UtctimeFree(a);
-end;
-
-function X509GmtimeAdj(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME;
-begin
-  if InitSSLInterface and Assigned(_X509GmtimeAdj) then
-    Result := _X509GmtimeAdj(s, adj)
-  else
-    Result := nil;
-end;
-
-function X509SetNotBefore(x: PX509; tm: PASN1_UTCTIME): integer;
-begin
-  if InitSSLInterface and Assigned(_X509SetNotBefore) then
-    Result := _X509SetNotBefore(x, tm)
-  else
-    Result := 0;
-end;
-
-function X509SetNotAfter(x: PX509; tm: PASN1_UTCTIME): integer;
-begin
-  if InitSSLInterface and Assigned(_X509SetNotAfter) then
-    Result := _X509SetNotAfter(x, tm)
-  else
-    Result := 0;
-end;
-
-function i2dX509bio(b: PBIO; x: PX509): integer;
-begin
-  if InitSSLInterface and Assigned(_i2dX509bio) then
-    Result := _i2dX509bio(b, x)
-  else
-    Result := 0;
-end;
-
-function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): integer;
-begin
-  if InitSSLInterface and Assigned(_i2dPrivateKeyBio) then
-    Result := _i2dPrivateKeyBio(b, pkey)
-  else
-    Result := 0;
-end;
-
-function EvpGetDigestByName(Name: String): PEVP_MD;
-begin
-  if InitSSLInterface and Assigned(_EvpGetDigestByName) then
-    Result := _EvpGetDigestByName(PChar(Name))
-  else
-    Result := nil;
-end;
-
-function Asn1IntegerSet(a: PASN1_INTEGER; v: integer): integer;
-begin
-  if InitSSLInterface and Assigned(_Asn1IntegerSet) then
-    Result := _Asn1IntegerSet(a, v)
-  else
-    Result := 0;
-end;
-
-function X509GetSerialNumber(x: PX509): PASN1_INTEGER;
-begin
-  if InitSSLInterface and Assigned(_X509GetSerialNumber) then
-    Result := _X509GetSerialNumber(x)
-  else
-    Result := nil;
-end;
-
-// 3DES functions
-procedure DESsetoddparity(Key: des_cblock);
-begin
-  if InitSSLInterface and Assigned(_DESsetoddparity) then
-    _DESsetoddparity(Key);
-end;
-
-function DESsetkeychecked(key: des_cblock; schedule: des_key_schedule): Integer;
-begin
-  if InitSSLInterface and Assigned(_DESsetkeychecked) then
-    Result := _DESsetkeychecked(key, schedule)
-  else
-    Result := -1;
-end;
-
-procedure DESecbencrypt(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer);
-begin
-  if InitSSLInterface and Assigned(_DESecbencrypt) then
-    _DESecbencrypt(Input, output, ks, enc);
-end;
-
-function LoadLib(const Value: String): HModule;
-begin
-  Result := LoadLibrary(Value);
-end;
-
-function GetProcAddr(module: HModule; const ProcName: string): SslPtr;
-begin
-  Result := GetProcAddress(module, PChar(ProcName));
-end;
-
-function InitSSLInterface: Boolean;
-begin
-    if not IsSSLloaded then
-    begin
-      SSLLibHandle := LoadLib(DLLSSLName);
-      SSLUtilHandle := LoadLib(DLLUtilName);
-  {$IFNDEF UNIX}
-      if (SSLLibHandle = 0) then
-        SSLLibHandle := LoadLib(DLLSSLName2);
-  {$ENDIF}
-      if (SSLLibHandle <> 0) and (SSLUtilHandle <> 0) then
-      begin
-        _SslGetError := GetProcAddr(SSLLibHandle, 'SSL_get_error');
-        _SslLibraryInit := GetProcAddr(SSLLibHandle, 'SSL_library_init');
-        _SslLoadErrorStrings := GetProcAddr(SSLLibHandle, 'SSL_load_error_strings');
-        _SslCtxSetCipherList := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_cipher_list');
-        _SslCtxNew := GetProcAddr(SSLLibHandle, 'SSL_CTX_new');
-        _SslCtxFree := GetProcAddr(SSLLibHandle, 'SSL_CTX_free');
-        _SslSetFd := GetProcAddr(SSLLibHandle, 'SSL_set_fd');
-        _SslMethodV2 := GetProcAddr(SSLLibHandle, 'SSLv2_method');
-        _SslMethodV3 := GetProcAddr(SSLLibHandle, 'SSLv3_method');
-        _SslMethodTLSV1 := GetProcAddr(SSLLibHandle, 'TLSv1_method');
-        _SslMethodV23 := GetProcAddr(SSLLibHandle, 'SSLv23_method');
-        _SslCtxUsePrivateKey := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_PrivateKey');
-        _SslCtxUsePrivateKeyASN1 := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_PrivateKey_ASN1');
-        //use SSL_CTX_use_RSAPrivateKey_file instead SSL_CTX_use_PrivateKey_file,
-        //because SSL_CTX_use_PrivateKey_file not support DER format. :-O
-        _SslCtxUsePrivateKeyFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_RSAPrivateKey_file');
-        _SslCtxUseCertificate := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate');
-        _SslCtxUseCertificateASN1 := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_ASN1');
-        _SslCtxUseCertificateFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_file');
-        _SslCtxUseCertificateChainFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_chain_file');
-        _SslCtxCheckPrivateKeyFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_check_private_key');
-        _SslCtxSetDefaultPasswdCb := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_default_passwd_cb');
-        _SslCtxSetDefaultPasswdCbUserdata := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_default_passwd_cb_userdata');
-        _SslCtxLoadVerifyLocations := GetProcAddr(SSLLibHandle, 'SSL_CTX_load_verify_locations');
-        _SslNew := GetProcAddr(SSLLibHandle, 'SSL_new');
-        _SslFree := GetProcAddr(SSLLibHandle, 'SSL_free');
-        _SslAccept := GetProcAddr(SSLLibHandle, 'SSL_accept');
-        _SslConnect := GetProcAddr(SSLLibHandle, 'SSL_connect');
-        _SslShutdown := GetProcAddr(SSLLibHandle, 'SSL_shutdown');
-        _SslRead := GetProcAddr(SSLLibHandle, 'SSL_read');
-        _SslPeek := GetProcAddr(SSLLibHandle, 'SSL_peek');
-        _SslWrite := GetProcAddr(SSLLibHandle, 'SSL_write');
-        _SslPending := GetProcAddr(SSLLibHandle, 'SSL_pending');
-        _SslGetPeerCertificate := GetProcAddr(SSLLibHandle, 'SSL_get_peer_certificate');
-        _SslGetVersion := GetProcAddr(SSLLibHandle, 'SSL_get_version');
-        _SslCtxSetVerify := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_verify');
-        _SslGetCurrentCipher := GetProcAddr(SSLLibHandle, 'SSL_get_current_cipher');
-        _SslCipherGetName := GetProcAddr(SSLLibHandle, 'SSL_CIPHER_get_name');
-        _SslCipherGetBits := GetProcAddr(SSLLibHandle, 'SSL_CIPHER_get_bits');
-        _SslGetVerifyResult := GetProcAddr(SSLLibHandle, 'SSL_get_verify_result');
-
-        _X509New := GetProcAddr(SSLUtilHandle, 'X509_new');
-        _X509Free := GetProcAddr(SSLUtilHandle, 'X509_free');
-        _X509NameOneline := GetProcAddr(SSLUtilHandle, 'X509_NAME_oneline');
-        _X509GetSubjectName := GetProcAddr(SSLUtilHandle, 'X509_get_subject_name');
-        _X509GetIssuerName := GetProcAddr(SSLUtilHandle, 'X509_get_issuer_name');
-        _X509NameHash := GetProcAddr(SSLUtilHandle, 'X509_NAME_hash');
-        _X509Digest := GetProcAddr(SSLUtilHandle, 'X509_digest');
-        _X509print := GetProcAddr(SSLUtilHandle, 'X509_print');
-        _X509SetVersion := GetProcAddr(SSLUtilHandle, 'X509_set_version');
-        _X509SetPubkey := GetProcAddr(SSLUtilHandle, 'X509_set_pubkey');
-        _X509SetIssuerName := GetProcAddr(SSLUtilHandle, 'X509_set_issuer_name');
-        _X509NameAddEntryByTxt := GetProcAddr(SSLUtilHandle, 'X509_NAME_add_entry_by_txt');
-        _X509Sign := GetProcAddr(SSLUtilHandle, 'X509_sign');
-        _X509GmtimeAdj := GetProcAddr(SSLUtilHandle, 'X509_gmtime_adj');
-        _X509SetNotBefore := GetProcAddr(SSLUtilHandle, 'X509_set_notBefore');
-        _X509SetNotAfter := GetProcAddr(SSLUtilHandle, 'X509_set_notAfter');
-        _X509GetSerialNumber := GetProcAddr(SSLUtilHandle, 'X509_get_serialNumber');
-        _EvpPkeyNew := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_new');
-        _EvpPkeyFree := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_free');
-        _EvpPkeyAssign := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_assign');
-        _EVPCleanup := GetProcAddr(SSLUtilHandle, 'EVP_cleanup');
-        _EvpGetDigestByName := GetProcAddr(SSLUtilHandle, 'EVP_get_digestbyname');
-        _SSLeayversion := GetProcAddr(SSLUtilHandle, 'SSLeay_version');
-        _ErrErrorString := GetProcAddr(SSLUtilHandle, 'ERR_error_string_n');
-        _ErrGetError := GetProcAddr(SSLUtilHandle, 'ERR_get_error');
-        _ErrClearError := GetProcAddr(SSLUtilHandle, 'ERR_clear_error');
-        _ErrFreeStrings := GetProcAddr(SSLUtilHandle, 'ERR_free_strings');
-        _ErrRemoveState := GetProcAddr(SSLUtilHandle, 'ERR_remove_state');
-        _OPENSSLaddallalgorithms := GetProcAddr(SSLUtilHandle, 'OPENSSL_add_all_algorithms_noconf');
-        _CRYPTOcleanupAllExData := GetProcAddr(SSLUtilHandle, 'CRYPTO_cleanup_all_ex_data');
-        _RandScreen := GetProcAddr(SSLUtilHandle, 'RAND_screen');
-        _BioNew := GetProcAddr(SSLUtilHandle, 'BIO_new');
-        _BioFreeAll := GetProcAddr(SSLUtilHandle, 'BIO_free_all');
-        _BioSMem := GetProcAddr(SSLUtilHandle, 'BIO_s_mem');
-        _BioCtrlPending := GetProcAddr(SSLUtilHandle, 'BIO_ctrl_pending');
-        _BioRead := GetProcAddr(SSLUtilHandle, 'BIO_read');
-        _BioWrite := GetProcAddr(SSLUtilHandle, 'BIO_write');
-        _d2iPKCS12bio := GetProcAddr(SSLUtilHandle, 'd2i_PKCS12_bio');
-        _PKCS12parse := GetProcAddr(SSLUtilHandle, 'PKCS12_parse');
-        _PKCS12free := GetProcAddr(SSLUtilHandle, 'PKCS12_free');
-        _RsaGenerateKey := GetProcAddr(SSLUtilHandle, 'RSA_generate_key');
-        _Asn1UtctimeNew := GetProcAddr(SSLUtilHandle, 'ASN1_UTCTIME_new');
-        _Asn1UtctimeFree := GetProcAddr(SSLUtilHandle, 'ASN1_UTCTIME_free');
-        _Asn1IntegerSet := GetProcAddr(SSLUtilHandle, 'ASN1_INTEGER_set');
-        _i2dX509bio := GetProcAddr(SSLUtilHandle, 'i2d_X509_bio');
-        _i2dPrivateKeyBio := GetProcAddr(SSLUtilHandle, 'i2d_PrivateKey_bio');
-
-        // 3DES functions
-        _DESsetoddparity := GetProcAddr(SSLUtilHandle, 'DES_set_odd_parity');
-        _DESsetkeychecked := GetProcAddr(SSLUtilHandle, 'DES_set_key_checked');
-        _DESecbencrypt := GetProcAddr(SSLUtilHandle, 'DES_ecb_encrypt');
-        //
-        _CRYPTOnumlocks := GetProcAddr(SSLUtilHandle, 'CRYPTO_num_locks');
-        _CRYPTOsetlockingcallback := GetProcAddr(SSLUtilHandle, 'CRYPTO_set_locking_callback');
-
-        //init library
-        if assigned(_SslLibraryInit) then
-          _SslLibraryInit;
-        if assigned(_SslLoadErrorStrings) then
-          _SslLoadErrorStrings;
-        if assigned(_OPENSSLaddallalgorithms) then
-          _OPENSSLaddallalgorithms;
-        if assigned(_RandScreen) then
+
+{$MODE DELPHI}{$H+}
+
+{:@abstract(OpenSSL support)
+
+This unit is Pascal interface to OpenSSL library (used by @link(ssl_openssl) unit).
+OpenSSL is loaded dynamicly on-demand. If this library is not found in system,
+requested OpenSSL function just return errorcode.
+}
+
+interface
+
+uses
+  DynLibs;
+
+var
+  {$IFDEF WINDOWS}
+  DLLSSLName: string = 'ssleay32.dll';
+  DLLSSLName2: string = 'libssl32.dll';
+  DLLUtilName: string = 'libeay32.dll';
+  {$ELSE}
+  DLLSSLName: string = 'libssl';
+  DLLUtilName: string = 'libcrypto';
+  
+  { ADD NEW ONES WHEN THEY APPEAR!
+    Always make .so/dylib first, then versions, in descending order!
+    Add "." .before the version, first is always just "" }
+  DLLVersions: array[1..10] of string = ('', '.0.9.9'{futureproof :D}, '.0.9.8',
+                                        '.0.9.7', '.0.9.6', '.0.9.5', '.0.9.4',
+                                        '.0.9.3', '.0.9.2', '.0.9.1');
+  {$ENDIF}
+
+type
+  SslPtr = Pointer;
+  PSslPtr = ^SslPtr;
+  PSSL_CTX = SslPtr;
+  PSSL = SslPtr;
+  PSSL_METHOD = SslPtr;
+  PX509 = SslPtr;
+  PX509_NAME = SslPtr;
+  PEVP_MD	= SslPtr;
+  PInteger = ^Integer;
+  PBIO_METHOD = SslPtr;
+  PBIO = SslPtr;
+  EVP_PKEY = SslPtr;
+  PRSA = SslPtr;
+  PASN1_UTCTIME = SslPtr;
+  PASN1_INTEGER = SslPtr;
+  PPasswdCb = SslPtr;
+  PFunction = procedure;
+
+  DES_cblock = array[0..7] of Byte;
+  PDES_cblock = ^DES_cblock;
+  des_ks_struct = packed record
+    ks: DES_cblock;
+    weak_key: Integer;
+  end;
+  des_key_schedule = array[1..16] of des_ks_struct;
+
+const
+  EVP_MAX_MD_SIZE = 16 + 20;
+
+  SSL_ERROR_NONE = 0;
+  SSL_ERROR_SSL = 1;
+  SSL_ERROR_WANT_READ = 2;
+  SSL_ERROR_WANT_WRITE = 3;
+  SSL_ERROR_WANT_X509_LOOKUP = 4;
+  SSL_ERROR_SYSCALL = 5; //look at error stack/return value/errno
+  SSL_ERROR_ZERO_RETURN = 6;
+  SSL_ERROR_WANT_CONNECT = 7;
+  SSL_ERROR_WANT_ACCEPT = 8;
+
+  SSL_OP_NO_SSLv2 = $01000000;
+  SSL_OP_NO_SSLv3 = $02000000;
+  SSL_OP_NO_TLSv1 = $04000000;
+  SSL_OP_ALL = $000FFFFF;
+  SSL_VERIFY_NONE = $00;
+  SSL_VERIFY_PEER = $01;
+
+  OPENSSL_DES_DECRYPT = 0;
+  OPENSSL_DES_ENCRYPT = 1;
+
+  X509_V_OK =	0;
+  X509_V_ILLEGAL = 1;
+  X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT = 2;
+  X509_V_ERR_UNABLE_TO_GET_CRL = 3;
+  X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE = 4;
+  X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE = 5;
+  X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY = 6;
+  X509_V_ERR_CERT_SIGNATURE_FAILURE = 7;
+  X509_V_ERR_CRL_SIGNATURE_FAILURE = 8;
+  X509_V_ERR_CERT_NOT_YET_VALID = 9;
+  X509_V_ERR_CERT_HAS_EXPIRED = 10;
+  X509_V_ERR_CRL_NOT_YET_VALID = 11;
+  X509_V_ERR_CRL_HAS_EXPIRED = 12;
+  X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD = 13;
+  X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD = 14;
+  X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD = 15;
+  X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD = 16;
+  X509_V_ERR_OUT_OF_MEM = 17;
+  X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT = 18;
+  X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN = 19;
+  X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY = 20;
+  X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE = 21;
+  X509_V_ERR_CERT_CHAIN_TOO_LONG = 22;
+  X509_V_ERR_CERT_REVOKED = 23;
+  X509_V_ERR_INVALID_CA = 24;
+  X509_V_ERR_PATH_LENGTH_EXCEEDED = 25;
+  X509_V_ERR_INVALID_PURPOSE = 26;
+  X509_V_ERR_CERT_UNTRUSTED = 27;
+  X509_V_ERR_CERT_REJECTED = 28;
+  //These are 'informational' when looking for issuer cert
+  X509_V_ERR_SUBJECT_ISSUER_MISMATCH = 29;
+  X509_V_ERR_AKID_SKID_MISMATCH = 30;
+  X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH = 31;
+  X509_V_ERR_KEYUSAGE_NO_CERTSIGN = 32;
+  X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER = 33;
+  X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION = 34;
+  //The application is not happy
+  X509_V_ERR_APPLICATION_VERIFICATION = 50;
+
+  SSL_FILETYPE_ASN1	= 2;
+  SSL_FILETYPE_PEM = 1;
+  EVP_PKEY_RSA = 6;
+
+var
+  SSLLibHandle: TLibHandle = 0;
+  SSLUtilHandle: TLibHandle = 0;
+  SSLLibFile: string = '';
+  SSLUtilFile: string = '';
+
+// libssl.dll
+  function SslGetError(s: PSSL; ret_code: Integer):Integer;
+  function SslLibraryInit:Integer;
+  procedure SslLoadErrorStrings;
+//  function SslCtxSetCipherList(arg0: PSSL_CTX; str: PChar):Integer;
+  function SslCtxSetCipherList(arg0: PSSL_CTX; var str: String):Integer;
+  function SslCtxNew(meth: PSSL_METHOD):PSSL_CTX;
+  procedure SslCtxFree(arg0: PSSL_CTX);
+  function SslSetFd(s: PSSL; fd: Integer):Integer;
+  function SslMethodV2:PSSL_METHOD;
+  function SslMethodV3:PSSL_METHOD;
+  function SslMethodTLSV1:PSSL_METHOD;
+  function SslMethodV23:PSSL_METHOD;
+  function SslCtxUsePrivateKey(ctx: PSSL_CTX; pkey: SslPtr):Integer;
+  function SslCtxUsePrivateKeyASN1(pk: integer; ctx: PSSL_CTX; d: String; len: integer):Integer;
+//  function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: PChar; _type: Integer):Integer;
+  function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;
+  function SslCtxUseCertificate(ctx: PSSL_CTX; x: SslPtr):Integer;
+  function SslCtxUseCertificateASN1(ctx: PSSL_CTX; len: integer; d: String):Integer;
+  function SslCtxUseCertificateFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;
+//  function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: PChar):Integer;
+  function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: String):Integer;
+  function SslCtxCheckPrivateKeyFile(ctx: PSSL_CTX):Integer;
+  procedure SslCtxSetDefaultPasswdCb(ctx: PSSL_CTX; cb: PPasswdCb);
+  procedure SslCtxSetDefaultPasswdCbUserdata(ctx: PSSL_CTX; u: SslPtr);
+//  function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: PChar; const CApath: PChar):Integer;
+  function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: String; const CApath: String):Integer;
+  function SslNew(ctx: PSSL_CTX):PSSL;
+  procedure SslFree(ssl: PSSL);
+  function SslAccept(ssl: PSSL):Integer;
+  function SslConnect(ssl: PSSL):Integer;
+  function SslShutdown(ssl: PSSL):Integer;
+  function SslRead(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
+  function SslPeek(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
+  function SslWrite(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
+  function SslPending(ssl: PSSL):Integer;
+  function SslGetVersion(ssl: PSSL):String;
+  function SslGetPeerCertificate(ssl: PSSL):PX509;
+  procedure SslCtxSetVerify(ctx: PSSL_CTX; mode: Integer; arg2: PFunction);
+  function SSLGetCurrentCipher(s: PSSL):SslPtr;
+  function SSLCipherGetName(c: SslPtr): String;
+  function SSLCipherGetBits(c: SslPtr; var alg_bits: Integer):Integer;
+  function SSLGetVerifyResult(ssl: PSSL):Integer;
+
+// libeay.dll
+  function X509New: PX509;
+  procedure X509Free(x: PX509);
+  function X509NameOneline(a: PX509_NAME; var buf: String; size: Integer):String;
+  function X509GetSubjectName(a: PX509):PX509_NAME;
+  function X509GetIssuerName(a: PX509):PX509_NAME;
+  function X509NameHash(x: PX509_NAME):Cardinal;
+//  function SslX509Digest(data: PX509; _type: PEVP_MD; md: PChar; len: PInteger):Integer;
+  function X509Digest(data: PX509; _type: PEVP_MD; md: String; var len: Integer):Integer;
+  function X509print(b: PBIO; a: PX509): integer;
+  function X509SetVersion(x: PX509; version: integer): integer;
+  function X509SetPubkey(x: PX509; pkey: EVP_PKEY): integer;
+  function X509SetIssuerName(x: PX509; name: PX509_NAME): integer;
+  function X509NameAddEntryByTxt(name: PX509_NAME; field: string; _type: integer;
+    bytes: string; len, loc, _set: integer): integer;
+  function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer;
+  function X509GmtimeAdj(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME;
+  function X509SetNotBefore(x: PX509; tm: PASN1_UTCTIME): integer;
+  function X509SetNotAfter(x: PX509; tm: PASN1_UTCTIME): integer;
+  function X509GetSerialNumber(x: PX509): PASN1_INTEGER;
+  function EvpPkeyNew: EVP_PKEY;
+  procedure EvpPkeyFree(pk: EVP_PKEY);
+  function EvpPkeyAssign(pkey: EVP_PKEY; _type: integer; key: Prsa): integer;
+  function EvpGetDigestByName(Name: String): PEVP_MD;
+  procedure EVPcleanup;
+//  function ErrErrorString(e: integer; buf: PChar): PChar;
+  function SSLeayversion(t: integer): string;
+  procedure ErrErrorString(e: integer; var buf: string; len: integer);
+  function ErrGetError: integer;
+  procedure ErrClearError;
+  procedure ErrFreeStrings;
+  procedure ErrRemoveState(pid: integer);
+  procedure OPENSSLaddallalgorithms;
+  procedure CRYPTOcleanupAllExData;
+  procedure RandScreen;
+  function BioNew(b: PBIO_METHOD): PBIO;
+  procedure BioFreeAll(b: PBIO);
+  function BioSMem: PBIO_METHOD;
+  function BioCtrlPending(b: PBIO): integer;
+  function BioRead(b: PBIO; var Buf: String; Len: integer): integer;
+  function BioWrite(b: PBIO; Buf: String; Len: integer): integer;
+  function d2iPKCS12bio(b:PBIO; Pkcs12: SslPtr): SslPtr;
+  function PKCS12parse(p12: SslPtr; pass: string; var pkey, cert, ca: SslPtr): integer;
+  procedure PKCS12free(p12: SslPtr);
+  function RsaGenerateKey(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA;
+  function Asn1UtctimeNew: PASN1_UTCTIME;
+  procedure Asn1UtctimeFree(a: PASN1_UTCTIME);
+  function Asn1IntegerSet(a: PASN1_INTEGER; v: integer): integer;
+  function i2dX509bio(b: PBIO; x: PX509): integer;
+  function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): integer;
+
+  // 3DES functions
+  procedure DESsetoddparity(Key: des_cblock);
+  function DESsetkeychecked(key: des_cblock; schedule: des_key_schedule): Integer;
+  procedure DESecbencrypt(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer);
+
+function IsSSLloaded: Boolean;
+function InitSSLInterface: Boolean;
+function DestroySSLInterface: Boolean;
+
+implementation
+
+type
+// libssl.dll
+  TSslGetError = function(s: PSSL; ret_code: Integer):Integer; cdecl;
+  TSslLibraryInit = function:Integer; cdecl;
+  TSslLoadErrorStrings = procedure; cdecl;
+  TSslCtxSetCipherList = function(arg0: PSSL_CTX; str: PChar):Integer; cdecl;
+  TSslCtxNew = function(meth: PSSL_METHOD):PSSL_CTX; cdecl;
+  TSslCtxFree = procedure(arg0: PSSL_CTX); cdecl;
+  TSslSetFd = function(s: PSSL; fd: Integer):Integer; cdecl;
+  TSslMethodV2 = function:PSSL_METHOD; cdecl;
+  TSslMethodV3 = function:PSSL_METHOD; cdecl;
+  TSslMethodTLSV1 = function:PSSL_METHOD; cdecl;
+  TSslMethodV23 = function:PSSL_METHOD; cdecl;
+  TSslCtxUsePrivateKey = function(ctx: PSSL_CTX; pkey: sslptr):Integer; cdecl;
+  TSslCtxUsePrivateKeyASN1 = function(pk: integer; ctx: PSSL_CTX; d: sslptr; len: integer):Integer; cdecl;
+  TSslCtxUsePrivateKeyFile = function(ctx: PSSL_CTX; const _file: PChar; _type: Integer):Integer; cdecl;
+  TSslCtxUseCertificate = function(ctx: PSSL_CTX; x: SslPtr):Integer; cdecl;
+  TSslCtxUseCertificateASN1 = function(ctx: PSSL_CTX; len: Integer; d: SslPtr):Integer; cdecl;
+  TSslCtxUseCertificateFile = function(ctx: PSSL_CTX; const _file: PChar; _type: Integer):Integer; cdecl;
+  TSslCtxUseCertificateChainFile = function(ctx: PSSL_CTX; const _file: PChar):Integer; cdecl;
+  TSslCtxCheckPrivateKeyFile = function(ctx: PSSL_CTX):Integer; cdecl;
+  TSslCtxSetDefaultPasswdCb = procedure(ctx: PSSL_CTX; cb: SslPtr); cdecl;
+  TSslCtxSetDefaultPasswdCbUserdata = procedure(ctx: PSSL_CTX; u: SslPtr); cdecl;
+  TSslCtxLoadVerifyLocations = function(ctx: PSSL_CTX; const CAfile: PChar; const CApath: PChar):Integer; cdecl;
+  TSslNew = function(ctx: PSSL_CTX):PSSL; cdecl;
+  TSslFree = procedure(ssl: PSSL); cdecl;
+  TSslAccept = function(ssl: PSSL):Integer; cdecl;
+  TSslConnect = function(ssl: PSSL):Integer; cdecl;
+  TSslShutdown = function(ssl: PSSL):Integer; cdecl;
+  TSslRead = function(ssl: PSSL; buf: PChar; num: Integer):Integer; cdecl;
+  TSslPeek = function(ssl: PSSL; buf: PChar; num: Integer):Integer; cdecl;
+  TSslWrite = function(ssl: PSSL; const buf: PChar; num: Integer):Integer; cdecl;
+  TSslPending = function(ssl: PSSL):Integer; cdecl;
+  TSslGetVersion = function(ssl: PSSL):PChar; cdecl;
+  TSslGetPeerCertificate = function(ssl: PSSL):PX509; cdecl;
+  TSslCtxSetVerify = procedure(ctx: PSSL_CTX; mode: Integer; arg2: SslPtr); cdecl;
+  TSSLGetCurrentCipher = function(s: PSSL):SslPtr; cdecl;
+  TSSLCipherGetName = function(c: Sslptr):PChar; cdecl;
+  TSSLCipherGetBits = function(c: SslPtr; alg_bits: PInteger):Integer; cdecl;
+  TSSLGetVerifyResult = function(ssl: PSSL):Integer; cdecl;
+
+// libeay.dll
+  TX509New = function: PX509; cdecl;
+  TX509Free = procedure(x: PX509); cdecl;
+  TX509NameOneline = function(a: PX509_NAME; buf: PChar; size: Integer):PChar; cdecl;
+  TX509GetSubjectName = function(a: PX509):PX509_NAME; cdecl;
+  TX509GetIssuerName = function(a: PX509):PX509_NAME; cdecl;
+  TX509NameHash = function(x: PX509_NAME):Cardinal; cdecl;
+  TX509Digest = function(data: PX509; _type: PEVP_MD; md: PChar; len: PInteger):Integer; cdecl;
+  TX509print = function(b: PBIO; a: PX509): integer; cdecl;
+  TX509SetVersion = function(x: PX509; version: integer): integer; cdecl;
+  TX509SetPubkey = function(x: PX509; pkey: EVP_PKEY): integer; cdecl;
+  TX509SetIssuerName = function(x: PX509; name: PX509_NAME): integer; cdecl;
+  TX509NameAddEntryByTxt = function(name: PX509_NAME; field: PChar; _type: integer;
+    bytes: PChar; len, loc, _set: integer): integer; cdecl;
+  TX509Sign = function(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer; cdecl;
+  TX509GmtimeAdj = function(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME; cdecl;
+  TX509SetNotBefore = function(x: PX509; tm: PASN1_UTCTIME): integer; cdecl;
+  TX509SetNotAfter = function(x: PX509; tm: PASN1_UTCTIME): integer; cdecl;
+  TX509GetSerialNumber = function(x: PX509): PASN1_INTEGER; cdecl;
+  TEvpPkeyNew = function: EVP_PKEY; cdecl;
+  TEvpPkeyFree = procedure(pk: EVP_PKEY); cdecl;
+  TEvpPkeyAssign = function(pkey: EVP_PKEY; _type: integer; key: Prsa): integer; cdecl;
+  TEvpGetDigestByName = function(Name: PChar): PEVP_MD; cdecl;
+  TEVPcleanup = procedure; cdecl;
+  TSSLeayversion = function(t: integer): PChar; cdecl;
+  TErrErrorString = procedure(e: integer; buf: PChar; len: integer); cdecl;
+  TErrGetError = function: integer; cdecl;
+  TErrClearError = procedure; cdecl;
+  TErrFreeStrings = procedure; cdecl;
+  TErrRemoveState = procedure(pid: integer); cdecl;
+  TOPENSSLaddallalgorithms = procedure; cdecl;
+  TCRYPTOcleanupAllExData = procedure; cdecl;
+  TRandScreen = procedure; cdecl;
+  TBioNew = function(b: PBIO_METHOD): PBIO; cdecl;
+  TBioFreeAll = procedure(b: PBIO); cdecl;
+  TBioSMem = function: PBIO_METHOD; cdecl;
+  TBioCtrlPending = function(b: PBIO): integer; cdecl;
+  TBioRead = function(b: PBIO; Buf: PChar; Len: integer): integer; cdecl;
+  TBioWrite = function(b: PBIO; Buf: PChar; Len: integer): integer; cdecl;
+  Td2iPKCS12bio = function(b:PBIO; Pkcs12: SslPtr): SslPtr; cdecl;
+  TPKCS12parse = function(p12: SslPtr; pass: PChar; var pkey, cert, ca: SslPtr): integer; cdecl;
+  TPKCS12free = procedure(p12: SslPtr); cdecl;
+  TRsaGenerateKey = function(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA; cdecl;
+  TAsn1UtctimeNew = function: PASN1_UTCTIME; cdecl;
+  TAsn1UtctimeFree = procedure(a: PASN1_UTCTIME); cdecl;
+  TAsn1IntegerSet = function(a: PASN1_INTEGER; v: integer): integer; cdecl;
+  Ti2dX509bio = function(b: PBIO; x: PX509): integer; cdecl;
+  Ti2dPrivateKeyBio= function(b: PBIO; pkey: EVP_PKEY): integer; cdecl;
+
+  // 3DES functions
+  TDESsetoddparity = procedure(Key: des_cblock); cdecl;
+  TDESsetkeychecked = function(key: des_cblock; schedule: des_key_schedule): Integer; cdecl;
+  TDESecbencrypt = procedure(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer); cdecl;
+  //thread lock functions
+  TCRYPTOnumlocks = function: integer; cdecl;
+  TCRYPTOSetLockingCallback = procedure(cb: Sslptr); cdecl;
+
+var
+// libssl.dll
+  _SslGetError: TSslGetError = nil;
+  _SslLibraryInit: TSslLibraryInit = nil;
+  _SslLoadErrorStrings: TSslLoadErrorStrings = nil;
+  _SslCtxSetCipherList: TSslCtxSetCipherList = nil;
+  _SslCtxNew: TSslCtxNew = nil;
+  _SslCtxFree: TSslCtxFree = nil;
+  _SslSetFd: TSslSetFd = nil;
+  _SslMethodV2: TSslMethodV2 = nil;
+  _SslMethodV3: TSslMethodV3 = nil;
+  _SslMethodTLSV1: TSslMethodTLSV1 = nil;
+  _SslMethodV23: TSslMethodV23 = nil;
+  _SslCtxUsePrivateKey: TSslCtxUsePrivateKey = nil;
+  _SslCtxUsePrivateKeyASN1: TSslCtxUsePrivateKeyASN1 = nil;
+  _SslCtxUsePrivateKeyFile: TSslCtxUsePrivateKeyFile = nil;
+  _SslCtxUseCertificate: TSslCtxUseCertificate = nil;
+  _SslCtxUseCertificateASN1: TSslCtxUseCertificateASN1 = nil;
+  _SslCtxUseCertificateFile: TSslCtxUseCertificateFile = nil;
+  _SslCtxUseCertificateChainFile: TSslCtxUseCertificateChainFile = nil;
+  _SslCtxCheckPrivateKeyFile: TSslCtxCheckPrivateKeyFile = nil;
+  _SslCtxSetDefaultPasswdCb: TSslCtxSetDefaultPasswdCb = nil;
+  _SslCtxSetDefaultPasswdCbUserdata: TSslCtxSetDefaultPasswdCbUserdata = nil;
+  _SslCtxLoadVerifyLocations: TSslCtxLoadVerifyLocations = nil;
+  _SslNew: TSslNew = nil;
+  _SslFree: TSslFree = nil;
+  _SslAccept: TSslAccept = nil;
+  _SslConnect: TSslConnect = nil;
+  _SslShutdown: TSslShutdown = nil;
+  _SslRead: TSslRead = nil;
+  _SslPeek: TSslPeek = nil;
+  _SslWrite: TSslWrite = nil;
+  _SslPending: TSslPending = nil;
+  _SslGetVersion: TSslGetVersion = nil;
+  _SslGetPeerCertificate: TSslGetPeerCertificate = nil;
+  _SslCtxSetVerify: TSslCtxSetVerify = nil;
+  _SSLGetCurrentCipher: TSSLGetCurrentCipher = nil;
+  _SSLCipherGetName: TSSLCipherGetName = nil;
+  _SSLCipherGetBits: TSSLCipherGetBits = nil;
+  _SSLGetVerifyResult: TSSLGetVerifyResult = nil;
+
+// libeay.dll
+  _X509New: TX509New = nil;
+  _X509Free: TX509Free = nil;
+  _X509NameOneline: TX509NameOneline = nil;
+  _X509GetSubjectName: TX509GetSubjectName = nil;
+  _X509GetIssuerName: TX509GetIssuerName = nil;
+  _X509NameHash: TX509NameHash = nil;
+  _X509Digest: TX509Digest = nil;
+  _X509print: TX509print = nil;
+  _X509SetVersion: TX509SetVersion = nil;
+  _X509SetPubkey: TX509SetPubkey = nil;
+  _X509SetIssuerName: TX509SetIssuerName = nil;
+  _X509NameAddEntryByTxt: TX509NameAddEntryByTxt = nil;
+  _X509Sign: TX509Sign = nil;
+  _X509GmtimeAdj: TX509GmtimeAdj = nil;
+  _X509SetNotBefore: TX509SetNotBefore = nil;
+  _X509SetNotAfter: TX509SetNotAfter = nil;
+  _X509GetSerialNumber: TX509GetSerialNumber = nil;
+  _EvpPkeyNew: TEvpPkeyNew = nil;
+  _EvpPkeyFree: TEvpPkeyFree = nil;
+  _EvpPkeyAssign: TEvpPkeyAssign = nil;
+  _EvpGetDigestByName: TEvpGetDigestByName = nil;
+  _EVPcleanup: TEVPcleanup = nil;
+  _SSLeayversion: TSSLeayversion = nil;
+  _ErrErrorString: TErrErrorString = nil;
+  _ErrGetError: TErrGetError = nil;
+  _ErrClearError: TErrClearError = nil;
+  _ErrFreeStrings: TErrFreeStrings = nil;
+  _ErrRemoveState: TErrRemoveState = nil;
+  _OPENSSLaddallalgorithms: TOPENSSLaddallalgorithms = nil;
+  _CRYPTOcleanupAllExData: TCRYPTOcleanupAllExData = nil;
+  _RandScreen: TRandScreen = nil;
+  _BioNew: TBioNew = nil;
+  _BioFreeAll: TBioFreeAll = nil;
+  _BioSMem: TBioSMem = nil;
+  _BioCtrlPending: TBioCtrlPending = nil;
+  _BioRead: TBioRead = nil;
+  _BioWrite: TBioWrite = nil;
+  _d2iPKCS12bio: Td2iPKCS12bio = nil;
+  _PKCS12parse: TPKCS12parse = nil;
+  _PKCS12free: TPKCS12free = nil;
+  _RsaGenerateKey: TRsaGenerateKey = nil;
+  _Asn1UtctimeNew: TAsn1UtctimeNew = nil;
+  _Asn1UtctimeFree: TAsn1UtctimeFree = nil;
+  _Asn1IntegerSet: TAsn1IntegerSet = nil;
+  _i2dX509bio: Ti2dX509bio = nil;
+  _i2dPrivateKeyBio: Ti2dPrivateKeyBio = nil;
+
+  // 3DES functions
+  _DESsetoddparity: TDESsetoddparity = nil;
+  _DESsetkeychecked: TDESsetkeychecked = nil;
+  _DESecbencrypt: TDESecbencrypt = nil;
+  //thread lock functions
+  _CRYPTOnumlocks: TCRYPTOnumlocks = nil;
+  _CRYPTOSetLockingCallback: TCRYPTOSetLockingCallback = nil;
+
+var
+  SSLloaded: boolean = false;
+
+// libssl.dll
+function SslGetError(s: PSSL; ret_code: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslGetError) then
+    Result := _SslGetError(s, ret_code)
+  else
+    Result := SSL_ERROR_SSL;
+end;
+
+function SslLibraryInit:Integer;
+begin
+  if InitSSLInterface and Assigned(_SslLibraryInit) then
+    Result := _SslLibraryInit
+  else
+    Result := 1;
+end;
+
+procedure SslLoadErrorStrings;
+begin
+  if InitSSLInterface and Assigned(_SslLoadErrorStrings) then
+    _SslLoadErrorStrings;
+end;
+
+function SslCtxSetCipherList(arg0: PSSL_CTX; var str: String):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxSetCipherList) then
+    Result := _SslCtxSetCipherList(arg0, PChar(str))
+  else
+    Result := 0;
+end;
+
+function SslCtxNew(meth: PSSL_METHOD):PSSL_CTX;
+begin
+  if InitSSLInterface and Assigned(_SslCtxNew) then
+    Result := _SslCtxNew(meth)
+  else
+    Result := nil;
+end;
+
+procedure SslCtxFree(arg0: PSSL_CTX);
+begin
+  if InitSSLInterface and Assigned(_SslCtxFree) then
+    _SslCtxFree(arg0);
+end;
+
+function SslSetFd(s: PSSL; fd: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslSetFd) then
+    Result := _SslSetFd(s, fd)
+  else
+    Result := 0;
+end;
+
+function SslMethodV2:PSSL_METHOD;
+begin
+  if InitSSLInterface and Assigned(_SslMethodV2) then
+    Result := _SslMethodV2
+  else
+    Result := nil;
+end;
+
+function SslMethodV3:PSSL_METHOD;
+begin
+  if InitSSLInterface and Assigned(_SslMethodV3) then
+    Result := _SslMethodV3
+  else
+    Result := nil;
+end;
+
+function SslMethodTLSV1:PSSL_METHOD;
+begin
+  if InitSSLInterface and Assigned(_SslMethodTLSV1) then
+    Result := _SslMethodTLSV1
+  else
+    Result := nil;
+end;
+
+function SslMethodV23:PSSL_METHOD;
+begin
+  if InitSSLInterface and Assigned(_SslMethodV23) then
+    Result := _SslMethodV23
+  else
+    Result := nil;
+end;
+
+function SslCtxUsePrivateKey(ctx: PSSL_CTX; pkey: SslPtr):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxUsePrivateKey) then
+    Result := _SslCtxUsePrivateKey(ctx, pkey)
+  else
+    Result := 0;
+end;
+
+function SslCtxUsePrivateKeyASN1(pk: integer; ctx: PSSL_CTX; d: String; len: integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxUsePrivateKeyASN1) then
+    Result := _SslCtxUsePrivateKeyASN1(pk, ctx, Sslptr(d), len)
+  else
+    Result := 0;
+end;
+
+function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxUsePrivateKeyFile) then
+    Result := _SslCtxUsePrivateKeyFile(ctx, PChar(_file), _type)
+  else
+    Result := 0;
+end;
+
+function SslCtxUseCertificate(ctx: PSSL_CTX; x: SslPtr):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxUseCertificate) then
+    Result := _SslCtxUseCertificate(ctx, x)
+  else
+    Result := 0;
+end;
+
+function SslCtxUseCertificateASN1(ctx: PSSL_CTX; len: integer; d: String):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxUseCertificateASN1) then
+    Result := _SslCtxUseCertificateASN1(ctx, len, SslPtr(d))
+  else
+    Result := 0;
+end;
+
+function SslCtxUseCertificateFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxUseCertificateFile) then
+    Result := _SslCtxUseCertificateFile(ctx, PChar(_file), _type)
+  else
+    Result := 0;
+end;
+
+function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: String):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxUseCertificateChainFile) then
+    Result := _SslCtxUseCertificateChainFile(ctx, PChar(_file))
+  else
+    Result := 0;
+end;
+
+function SslCtxCheckPrivateKeyFile(ctx: PSSL_CTX):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxCheckPrivateKeyFile) then
+    Result := _SslCtxCheckPrivateKeyFile(ctx)
+  else
+    Result := 0;
+end;
+
+procedure SslCtxSetDefaultPasswdCb(ctx: PSSL_CTX; cb: PPasswdCb);
+begin
+  if InitSSLInterface and Assigned(_SslCtxSetDefaultPasswdCb) then
+    _SslCtxSetDefaultPasswdCb(ctx, cb);
+end;
+
+procedure SslCtxSetDefaultPasswdCbUserdata(ctx: PSSL_CTX; u: SslPtr);
+begin
+  if InitSSLInterface and Assigned(_SslCtxSetDefaultPasswdCbUserdata) then
+    _SslCtxSetDefaultPasswdCbUserdata(ctx, u);
+end;
+
+function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: String; const CApath: String):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslCtxLoadVerifyLocations) then
+    Result := _SslCtxLoadVerifyLocations(ctx, SslPtr(CAfile), SslPtr(CApath))
+  else
+    Result := 0;
+end;
+
+function SslNew(ctx: PSSL_CTX):PSSL;
+begin
+  if InitSSLInterface and Assigned(_SslNew) then
+    Result := _SslNew(ctx)
+  else
+    Result := nil;
+end;
+
+procedure SslFree(ssl: PSSL);
+begin
+  if InitSSLInterface and Assigned(_SslFree) then
+    _SslFree(ssl);
+end;
+
+function SslAccept(ssl: PSSL):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslAccept) then
+    Result := _SslAccept(ssl)
+  else
+    Result := -1;
+end;
+
+function SslConnect(ssl: PSSL):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslConnect) then
+    Result := _SslConnect(ssl)
+  else
+    Result := -1;
+end;
+
+function SslShutdown(ssl: PSSL):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslShutdown) then
+    Result := _SslShutdown(ssl)
+  else
+    Result := -1;
+end;
+
+function SslRead(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslRead) then
+    Result := _SslRead(ssl, PChar(buf), num)
+  else
+    Result := -1;
+end;
+
+function SslPeek(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslPeek) then
+    Result := _SslPeek(ssl, PChar(buf), num)
+  else
+    Result := -1;
+end;
+
+function SslWrite(ssl: PSSL; buf: SslPtr; num: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslWrite) then
+    Result := _SslWrite(ssl, PChar(buf), num)
+  else
+    Result := -1;
+end;
+
+function SslPending(ssl: PSSL):Integer;
+begin
+  if InitSSLInterface and Assigned(_SslPending) then
+    Result := _SslPending(ssl)
+  else
+    Result := 0;
+end;
+
+//function SslGetVersion(ssl: PSSL):PChar;
+function SslGetVersion(ssl: PSSL):String;
+begin
+  if InitSSLInterface and Assigned(_SslGetVersion) then
+    Result := _SslGetVersion(ssl)
+  else
+    Result := '';
+end;
+
+function SslGetPeerCertificate(ssl: PSSL):PX509;
+begin
+  if InitSSLInterface and Assigned(_SslGetPeerCertificate) then
+    Result := _SslGetPeerCertificate(ssl)
+  else
+    Result := nil;
+end;
+
+procedure SslCtxSetVerify(ctx: PSSL_CTX; mode: Integer; arg2: PFunction);
+begin
+  if InitSSLInterface and Assigned(_SslCtxSetVerify) then
+    _SslCtxSetVerify(ctx, mode, @arg2);
+end;
+
+function SSLGetCurrentCipher(s: PSSL):SslPtr;
+begin
+  if InitSSLInterface and Assigned(_SSLGetCurrentCipher) then
+{$IFDEF CIL}
+{$ELSE}
+    Result := _SSLGetCurrentCipher(s)
+{$ENDIF}
+  else
+    Result := nil;
+end;
+
+function SSLCipherGetName(c: SslPtr):String;
+begin
+  if InitSSLInterface and Assigned(_SSLCipherGetName) then
+    Result := _SSLCipherGetName(c)
+  else
+    Result := '';
+end;
+
+function SSLCipherGetBits(c: SslPtr; var alg_bits: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_SSLCipherGetBits) then
+    Result := _SSLCipherGetBits(c, @alg_bits)
+  else
+    Result := 0;
+end;
+
+function SSLGetVerifyResult(ssl: PSSL):Integer;
+begin
+  if InitSSLInterface and Assigned(_SSLGetVerifyResult) then
+    Result := _SSLGetVerifyResult(ssl)
+  else
+    Result := X509_V_ERR_APPLICATION_VERIFICATION;
+end;
+
+// libeay.dll
+function X509New: PX509;
+begin
+  if InitSSLInterface and Assigned(_X509New) then
+    Result := _X509New
+  else
+    Result := nil;
+end;
+
+procedure X509Free(x: PX509);
+begin
+  if InitSSLInterface and Assigned(_X509Free) then
+    _X509Free(x);
+end;
+
+function X509NameOneline(a: PX509_NAME; var buf: String; size: Integer):String;
+begin
+  if InitSSLInterface and Assigned(_X509NameOneline) then
+    Result := _X509NameOneline(a, PChar(buf),size)
+  else
+    Result := '';
+end;
+
+function X509GetSubjectName(a: PX509):PX509_NAME;
+begin
+  if InitSSLInterface and Assigned(_X509GetSubjectName) then
+    Result := _X509GetSubjectName(a)
+  else
+    Result := nil;
+end;
+
+function X509GetIssuerName(a: PX509):PX509_NAME;
+begin
+  if InitSSLInterface and Assigned(_X509GetIssuerName) then
+    Result := _X509GetIssuerName(a)
+  else
+    Result := nil;
+end;
+
+function X509NameHash(x: PX509_NAME):Cardinal;
+begin
+  if InitSSLInterface and Assigned(_X509NameHash) then
+    Result := _X509NameHash(x)
+  else
+    Result := 0;
+end;
+
+function X509Digest(data: PX509; _type: PEVP_MD; md: String; var len: Integer):Integer;
+begin
+  if InitSSLInterface and Assigned(_X509Digest) then
+    Result := _X509Digest(data, _type, PChar(md), @len)
+  else
+    Result := 0;
+end;
+
+function EvpPkeyNew: EVP_PKEY;
+begin
+  if InitSSLInterface and Assigned(_EvpPkeyNew) then
+    Result := _EvpPkeyNew
+  else
+    Result := nil;
+end;
+
+procedure EvpPkeyFree(pk: EVP_PKEY);
+begin
+  if InitSSLInterface and Assigned(_EvpPkeyFree) then
+    _EvpPkeyFree(pk);
+end;
+
+function SSLeayversion(t: integer): string;
+begin
+  if InitSSLInterface and Assigned(_SSLeayversion) then
+    Result := PChar(_SSLeayversion(t))
+  else
+    Result := '';
+end;
+
+procedure ErrErrorString(e: integer; var buf: string; len: integer);
+begin
+  if InitSSLInterface and Assigned(_ErrErrorString) then
+    _ErrErrorString(e, Pointer(buf), len);
+  buf := PChar(Buf);
+end;
+
+function ErrGetError: integer;
+begin
+  if InitSSLInterface and Assigned(_ErrGetError) then
+    Result := _ErrGetError
+  else
+    Result := SSL_ERROR_SSL;
+end;
+
+procedure ErrClearError;
+begin
+  if InitSSLInterface and Assigned(_ErrClearError) then
+    _ErrClearError;
+end;
+
+procedure ErrFreeStrings;
+begin
+  if InitSSLInterface and Assigned(_ErrFreeStrings) then
+    _ErrFreeStrings;
+end;
+
+procedure ErrRemoveState(pid: integer);
+begin
+  if InitSSLInterface and Assigned(_ErrRemoveState) then
+    _ErrRemoveState(pid);
+end;
+
+procedure OPENSSLaddallalgorithms;
+begin
+  if InitSSLInterface and Assigned(_OPENSSLaddallalgorithms) then
+    _OPENSSLaddallalgorithms;
+end;
+
+procedure EVPcleanup;
+begin
+  if InitSSLInterface and Assigned(_EVPcleanup) then
+    _EVPcleanup;
+end;
+
+procedure CRYPTOcleanupAllExData;
+begin
+  if InitSSLInterface and Assigned(_CRYPTOcleanupAllExData) then
+    _CRYPTOcleanupAllExData;
+end;
+
+procedure RandScreen;
+begin
+  if InitSSLInterface and Assigned(_RandScreen) then
+    _RandScreen;
+end;
+
+function BioNew(b: PBIO_METHOD): PBIO;
+begin
+  if InitSSLInterface and Assigned(_BioNew) then
+    Result := _BioNew(b)
+  else
+    Result := nil;
+end;
+
+procedure BioFreeAll(b: PBIO);
+begin
+  if InitSSLInterface and Assigned(_BioFreeAll) then
+    _BioFreeAll(b);
+end;
+
+function BioSMem: PBIO_METHOD;
+begin
+  if InitSSLInterface and Assigned(_BioSMem) then
+    Result := _BioSMem
+  else
+    Result := nil;
+end;
+
+function BioCtrlPending(b: PBIO): integer;
+begin
+  if InitSSLInterface and Assigned(_BioCtrlPending) then
+    Result := _BioCtrlPending(b)
+  else
+    Result := 0;
+end;
+
+function BioRead(b: PBIO; var Buf: String; Len: integer): integer;
+begin
+  if InitSSLInterface and Assigned(_BioRead) then
+    Result := _BioRead(b, PChar(Buf), Len)
+  else
+    Result := -2;
+end;
+
+//function BioWrite(b: PBIO; Buf: PChar; Len: integer): integer;
+function BioWrite(b: PBIO; Buf: String; Len: integer): integer;
+begin
+  if InitSSLInterface and Assigned(_BioWrite) then
+    Result := _BioWrite(b, PChar(Buf), Len)
+  else
+    Result := -2;
+end;
+
+function X509print(b: PBIO; a: PX509): integer;
+begin
+  if InitSSLInterface and Assigned(_X509print) then
+    Result := _X509print(b, a)
+  else
+    Result := 0;
+end;
+
+function d2iPKCS12bio(b:PBIO; Pkcs12: SslPtr): SslPtr;
+begin
+  if InitSSLInterface and Assigned(_d2iPKCS12bio) then
+    Result := _d2iPKCS12bio(b, Pkcs12)
+  else
+    Result := nil;
+end;
+
+function PKCS12parse(p12: SslPtr; pass: string; var pkey, cert, ca: SslPtr): integer;
+begin
+  if InitSSLInterface and Assigned(_PKCS12parse) then
+    Result := _PKCS12parse(p12, SslPtr(pass), pkey, cert, ca)
+  else
+    Result := 0;
+end;
+
+procedure PKCS12free(p12: SslPtr);
+begin
+  if InitSSLInterface and Assigned(_PKCS12free) then
+    _PKCS12free(p12);
+end;
+
+function RsaGenerateKey(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA;
+begin
+  if InitSSLInterface and Assigned(_RsaGenerateKey) then
+    Result := _RsaGenerateKey(bits, e, callback, cb_arg)
+  else
+    Result := nil;
+end;
+
+function EvpPkeyAssign(pkey: EVP_PKEY; _type: integer; key: Prsa): integer;
+begin
+  if InitSSLInterface and Assigned(_EvpPkeyAssign) then
+    Result := _EvpPkeyAssign(pkey, _type, key)
+  else
+    Result := 0;
+end;
+
+function X509SetVersion(x: PX509; version: integer): integer;
+begin
+  if InitSSLInterface and Assigned(_X509SetVersion) then
+    Result := _X509SetVersion(x, version)
+  else
+    Result := 0;
+end;
+
+function X509SetPubkey(x: PX509; pkey: EVP_PKEY): integer;
+begin
+  if InitSSLInterface and Assigned(_X509SetPubkey) then
+    Result := _X509SetPubkey(x, pkey)
+  else
+    Result := 0;
+end;
+
+function X509SetIssuerName(x: PX509; name: PX509_NAME): integer;
+begin
+  if InitSSLInterface and Assigned(_X509SetIssuerName) then
+    Result := _X509SetIssuerName(x, name)
+  else
+    Result := 0;
+end;
+
+function X509NameAddEntryByTxt(name: PX509_NAME; field: string; _type: integer;
+  bytes: string; len, loc, _set: integer): integer;
+begin
+  if InitSSLInterface and Assigned(_X509NameAddEntryByTxt) then
+    Result := _X509NameAddEntryByTxt(name, PChar(field), _type, PChar(Bytes), len, loc, _set)
+  else
+    Result := 0;
+end;
+
+function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer;
+begin
+  if InitSSLInterface and Assigned(_X509Sign) then
+    Result := _X509Sign(x, pkey, md)
+  else
+    Result := 0;
+end;
+
+function Asn1UtctimeNew: PASN1_UTCTIME;
+begin
+  if InitSSLInterface and Assigned(_Asn1UtctimeNew) then
+    Result := _Asn1UtctimeNew
+  else
+    Result := nil;
+end;
+
+procedure Asn1UtctimeFree(a: PASN1_UTCTIME);
+begin
+  if InitSSLInterface and Assigned(_Asn1UtctimeFree) then
+    _Asn1UtctimeFree(a);
+end;
+
+function X509GmtimeAdj(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME;
+begin
+  if InitSSLInterface and Assigned(_X509GmtimeAdj) then
+    Result := _X509GmtimeAdj(s, adj)
+  else
+    Result := nil;
+end;
+
+function X509SetNotBefore(x: PX509; tm: PASN1_UTCTIME): integer;
+begin
+  if InitSSLInterface and Assigned(_X509SetNotBefore) then
+    Result := _X509SetNotBefore(x, tm)
+  else
+    Result := 0;
+end;
+
+function X509SetNotAfter(x: PX509; tm: PASN1_UTCTIME): integer;
+begin
+  if InitSSLInterface and Assigned(_X509SetNotAfter) then
+    Result := _X509SetNotAfter(x, tm)
+  else
+    Result := 0;
+end;
+
+function i2dX509bio(b: PBIO; x: PX509): integer;
+begin
+  if InitSSLInterface and Assigned(_i2dX509bio) then
+    Result := _i2dX509bio(b, x)
+  else
+    Result := 0;
+end;
+
+function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): integer;
+begin
+  if InitSSLInterface and Assigned(_i2dPrivateKeyBio) then
+    Result := _i2dPrivateKeyBio(b, pkey)
+  else
+    Result := 0;
+end;
+
+function EvpGetDigestByName(Name: String): PEVP_MD;
+begin
+  if InitSSLInterface and Assigned(_EvpGetDigestByName) then
+    Result := _EvpGetDigestByName(PChar(Name))
+  else
+    Result := nil;
+end;
+
+function Asn1IntegerSet(a: PASN1_INTEGER; v: integer): integer;
+begin
+  if InitSSLInterface and Assigned(_Asn1IntegerSet) then
+    Result := _Asn1IntegerSet(a, v)
+  else
+    Result := 0;
+end;
+
+function X509GetSerialNumber(x: PX509): PASN1_INTEGER;
+begin
+  if InitSSLInterface and Assigned(_X509GetSerialNumber) then
+    Result := _X509GetSerialNumber(x)
+  else
+    Result := nil;
+end;
+
+// 3DES functions
+procedure DESsetoddparity(Key: des_cblock);
+begin
+  if InitSSLInterface and Assigned(_DESsetoddparity) then
+    _DESsetoddparity(Key);
+end;
+
+function DESsetkeychecked(key: des_cblock; schedule: des_key_schedule): Integer;
+begin
+  if InitSSLInterface and Assigned(_DESsetkeychecked) then
+    Result := _DESsetkeychecked(key, schedule)
+  else
+    Result := -1;
+end;
+
+procedure DESecbencrypt(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer);
+begin
+  if InitSSLInterface and Assigned(_DESecbencrypt) then
+    _DESecbencrypt(Input, output, ks, enc);
+end;
+
+{$IFNDEF WINDOWS}
+{ Try to load all library versions until you find or run out }
+function LoadLibHack(const Value: String): HModule;
+var
+  i: Integer;
+begin
+  Result := NilHandle;
+  
+  for i := Low(DLLVersions) to High(DLLVersions) do begin
+    {$IFDEF DARWIN}
+    Result := LoadLibrary(Value + DLLVersions[i] + '.dylib');
+    {$ELSE}
+    Result := LoadLibrary(Value + '.so' + DLLVersions[i]);
+    {$ENDIF}
+    
+    if Result <> NilHandle then
+      Break;
+  end;
+end;
+{$ENDIF}
+
+function LoadLib(const Value: String): HModule;
+begin
+  {$IFDEF WINDOWS}
+  Result := LoadLibrary(Value);
+  {$ELSE}
+  Result := LoadLibHack(Value);
+  {$ENDIF}
+end;
+
+function GetProcAddr(module: HModule; const ProcName: string): SslPtr;
+begin
+  Result := GetProcAddress(module, PChar(ProcName));
+end;
+
+function InitSSLInterface: Boolean;
+begin
+    if not IsSSLloaded then
+    begin
+      SSLLibHandle := LoadLib(DLLSSLName);
+      SSLUtilHandle := LoadLib(DLLUtilName);
+  {$IFNDEF UNIX}
+      if (SSLLibHandle = 0) then
+        SSLLibHandle := LoadLib(DLLSSLName2);
+  {$ENDIF}
+      if (SSLLibHandle <> 0) and (SSLUtilHandle <> 0) then
+      begin
+        _SslGetError := GetProcAddr(SSLLibHandle, 'SSL_get_error');
+        _SslLibraryInit := GetProcAddr(SSLLibHandle, 'SSL_library_init');
+        _SslLoadErrorStrings := GetProcAddr(SSLLibHandle, 'SSL_load_error_strings');
+        _SslCtxSetCipherList := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_cipher_list');
+        _SslCtxNew := GetProcAddr(SSLLibHandle, 'SSL_CTX_new');
+        _SslCtxFree := GetProcAddr(SSLLibHandle, 'SSL_CTX_free');
+        _SslSetFd := GetProcAddr(SSLLibHandle, 'SSL_set_fd');
+        _SslMethodV2 := GetProcAddr(SSLLibHandle, 'SSLv2_method');
+        _SslMethodV3 := GetProcAddr(SSLLibHandle, 'SSLv3_method');
+        _SslMethodTLSV1 := GetProcAddr(SSLLibHandle, 'TLSv1_method');
+        _SslMethodV23 := GetProcAddr(SSLLibHandle, 'SSLv23_method');
+        _SslCtxUsePrivateKey := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_PrivateKey');
+        _SslCtxUsePrivateKeyASN1 := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_PrivateKey_ASN1');
+        //use SSL_CTX_use_RSAPrivateKey_file instead SSL_CTX_use_PrivateKey_file,
+        //because SSL_CTX_use_PrivateKey_file not support DER format. :-O
+        _SslCtxUsePrivateKeyFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_RSAPrivateKey_file');
+        _SslCtxUseCertificate := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate');
+        _SslCtxUseCertificateASN1 := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_ASN1');
+        _SslCtxUseCertificateFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_file');
+        _SslCtxUseCertificateChainFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_chain_file');
+        _SslCtxCheckPrivateKeyFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_check_private_key');
+        _SslCtxSetDefaultPasswdCb := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_default_passwd_cb');
+        _SslCtxSetDefaultPasswdCbUserdata := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_default_passwd_cb_userdata');
+        _SslCtxLoadVerifyLocations := GetProcAddr(SSLLibHandle, 'SSL_CTX_load_verify_locations');
+        _SslNew := GetProcAddr(SSLLibHandle, 'SSL_new');
+        _SslFree := GetProcAddr(SSLLibHandle, 'SSL_free');
+        _SslAccept := GetProcAddr(SSLLibHandle, 'SSL_accept');
+        _SslConnect := GetProcAddr(SSLLibHandle, 'SSL_connect');
+        _SslShutdown := GetProcAddr(SSLLibHandle, 'SSL_shutdown');
+        _SslRead := GetProcAddr(SSLLibHandle, 'SSL_read');
+        _SslPeek := GetProcAddr(SSLLibHandle, 'SSL_peek');
+        _SslWrite := GetProcAddr(SSLLibHandle, 'SSL_write');
+        _SslPending := GetProcAddr(SSLLibHandle, 'SSL_pending');
+        _SslGetPeerCertificate := GetProcAddr(SSLLibHandle, 'SSL_get_peer_certificate');
+        _SslGetVersion := GetProcAddr(SSLLibHandle, 'SSL_get_version');
+        _SslCtxSetVerify := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_verify');
+        _SslGetCurrentCipher := GetProcAddr(SSLLibHandle, 'SSL_get_current_cipher');
+        _SslCipherGetName := GetProcAddr(SSLLibHandle, 'SSL_CIPHER_get_name');
+        _SslCipherGetBits := GetProcAddr(SSLLibHandle, 'SSL_CIPHER_get_bits');
+        _SslGetVerifyResult := GetProcAddr(SSLLibHandle, 'SSL_get_verify_result');
+
+        _X509New := GetProcAddr(SSLUtilHandle, 'X509_new');
+        _X509Free := GetProcAddr(SSLUtilHandle, 'X509_free');
+        _X509NameOneline := GetProcAddr(SSLUtilHandle, 'X509_NAME_oneline');
+        _X509GetSubjectName := GetProcAddr(SSLUtilHandle, 'X509_get_subject_name');
+        _X509GetIssuerName := GetProcAddr(SSLUtilHandle, 'X509_get_issuer_name');
+        _X509NameHash := GetProcAddr(SSLUtilHandle, 'X509_NAME_hash');
+        _X509Digest := GetProcAddr(SSLUtilHandle, 'X509_digest');
+        _X509print := GetProcAddr(SSLUtilHandle, 'X509_print');
+        _X509SetVersion := GetProcAddr(SSLUtilHandle, 'X509_set_version');
+        _X509SetPubkey := GetProcAddr(SSLUtilHandle, 'X509_set_pubkey');
+        _X509SetIssuerName := GetProcAddr(SSLUtilHandle, 'X509_set_issuer_name');
+        _X509NameAddEntryByTxt := GetProcAddr(SSLUtilHandle, 'X509_NAME_add_entry_by_txt');
+        _X509Sign := GetProcAddr(SSLUtilHandle, 'X509_sign');
+        _X509GmtimeAdj := GetProcAddr(SSLUtilHandle, 'X509_gmtime_adj');
+        _X509SetNotBefore := GetProcAddr(SSLUtilHandle, 'X509_set_notBefore');
+        _X509SetNotAfter := GetProcAddr(SSLUtilHandle, 'X509_set_notAfter');
+        _X509GetSerialNumber := GetProcAddr(SSLUtilHandle, 'X509_get_serialNumber');
+        _EvpPkeyNew := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_new');
+        _EvpPkeyFree := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_free');
+        _EvpPkeyAssign := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_assign');
+        _EVPCleanup := GetProcAddr(SSLUtilHandle, 'EVP_cleanup');
+        _EvpGetDigestByName := GetProcAddr(SSLUtilHandle, 'EVP_get_digestbyname');
+        _SSLeayversion := GetProcAddr(SSLUtilHandle, 'SSLeay_version');
+        _ErrErrorString := GetProcAddr(SSLUtilHandle, 'ERR_error_string_n');
+        _ErrGetError := GetProcAddr(SSLUtilHandle, 'ERR_get_error');
+        _ErrClearError := GetProcAddr(SSLUtilHandle, 'ERR_clear_error');
+        _ErrFreeStrings := GetProcAddr(SSLUtilHandle, 'ERR_free_strings');
+        _ErrRemoveState := GetProcAddr(SSLUtilHandle, 'ERR_remove_state');
+        _OPENSSLaddallalgorithms := GetProcAddr(SSLUtilHandle, 'OPENSSL_add_all_algorithms_noconf');
+        _CRYPTOcleanupAllExData := GetProcAddr(SSLUtilHandle, 'CRYPTO_cleanup_all_ex_data');
+        _RandScreen := GetProcAddr(SSLUtilHandle, 'RAND_screen');
+        _BioNew := GetProcAddr(SSLUtilHandle, 'BIO_new');
+        _BioFreeAll := GetProcAddr(SSLUtilHandle, 'BIO_free_all');
+        _BioSMem := GetProcAddr(SSLUtilHandle, 'BIO_s_mem');
+        _BioCtrlPending := GetProcAddr(SSLUtilHandle, 'BIO_ctrl_pending');
+        _BioRead := GetProcAddr(SSLUtilHandle, 'BIO_read');
+        _BioWrite := GetProcAddr(SSLUtilHandle, 'BIO_write');
+        _d2iPKCS12bio := GetProcAddr(SSLUtilHandle, 'd2i_PKCS12_bio');
+        _PKCS12parse := GetProcAddr(SSLUtilHandle, 'PKCS12_parse');
+        _PKCS12free := GetProcAddr(SSLUtilHandle, 'PKCS12_free');
+        _RsaGenerateKey := GetProcAddr(SSLUtilHandle, 'RSA_generate_key');
+        _Asn1UtctimeNew := GetProcAddr(SSLUtilHandle, 'ASN1_UTCTIME_new');
+        _Asn1UtctimeFree := GetProcAddr(SSLUtilHandle, 'ASN1_UTCTIME_free');
+        _Asn1IntegerSet := GetProcAddr(SSLUtilHandle, 'ASN1_INTEGER_set');
+        _i2dX509bio := GetProcAddr(SSLUtilHandle, 'i2d_X509_bio');
+        _i2dPrivateKeyBio := GetProcAddr(SSLUtilHandle, 'i2d_PrivateKey_bio');
+
+        // 3DES functions
+        _DESsetoddparity := GetProcAddr(SSLUtilHandle, 'DES_set_odd_parity');
+        _DESsetkeychecked := GetProcAddr(SSLUtilHandle, 'DES_set_key_checked');
+        _DESecbencrypt := GetProcAddr(SSLUtilHandle, 'DES_ecb_encrypt');
+        //
+        _CRYPTOnumlocks := GetProcAddr(SSLUtilHandle, 'CRYPTO_num_locks');
+        _CRYPTOsetlockingcallback := GetProcAddr(SSLUtilHandle, 'CRYPTO_set_locking_callback');
+
+        //init library
+        if assigned(_SslLibraryInit) then
+          _SslLibraryInit;
+        if assigned(_SslLoadErrorStrings) then
+          _SslLoadErrorStrings;
+        if assigned(_OPENSSLaddallalgorithms) then
+          _OPENSSLaddallalgorithms;
+        if assigned(_RandScreen) then
           _RandScreen;
 
-        Result := True;
-        SSLloaded := True;
-      end
-      else
-      begin
-        //load failed!
-        if SSLLibHandle <> 0 then
-        begin
-          FreeLibrary(SSLLibHandle);
-          SSLLibHandle := 0;
-        end;
-        if SSLUtilHandle <> 0 then
-        begin
-          FreeLibrary(SSLUtilHandle);
-          SSLLibHandle := 0;
-        end;
-        Result := False;
-      end;
-    end
-    else
-      //loaded before...
-      Result := true;
-end;
-
-function DestroySSLInterface: Boolean;
-begin
-    if IsSSLLoaded then
-    begin
-      //deinit library
-      EVPCleanup;
-      CRYPTOcleanupAllExData;
-      ErrRemoveState(0);
-    end;
-    SSLloaded := false;
-    if SSLLibHandle <> 0 then
-    begin
-      FreeLibrary(SSLLibHandle);
-      SSLLibHandle := 0;
-    end;
-    if SSLUtilHandle <> 0 then
-    begin
-      FreeLibrary(SSLUtilHandle);
-      SSLLibHandle := 0;
-    end;
-
-    _SslGetError := nil;
-    _SslLibraryInit := nil;
-    _SslLoadErrorStrings := nil;
-    _SslCtxSetCipherList := nil;
-    _SslCtxNew := nil;
-    _SslCtxFree := nil;
-    _SslSetFd := nil;
-    _SslMethodV2 := nil;
-    _SslMethodV3 := nil;
-    _SslMethodTLSV1 := nil;
-    _SslMethodV23 := nil;
-    _SslCtxUsePrivateKey := nil;
-    _SslCtxUsePrivateKeyASN1 := nil;
-    _SslCtxUsePrivateKeyFile := nil;
-    _SslCtxUseCertificate := nil;
-    _SslCtxUseCertificateASN1 := nil;
-    _SslCtxUseCertificateFile := nil;
-    _SslCtxUseCertificateChainFile := nil;
-    _SslCtxCheckPrivateKeyFile := nil;
-    _SslCtxSetDefaultPasswdCb := nil;
-    _SslCtxSetDefaultPasswdCbUserdata := nil;
-    _SslCtxLoadVerifyLocations := nil;
-    _SslNew := nil;
-    _SslFree := nil;
-    _SslAccept := nil;
-    _SslConnect := nil;
-    _SslShutdown := nil;
-    _SslRead := nil;
-    _SslPeek := nil;
-    _SslWrite := nil;
-    _SslPending := nil;
-    _SslGetPeerCertificate := nil;
-    _SslGetVersion := nil;
-    _SslCtxSetVerify := nil;
-    _SslGetCurrentCipher := nil;
-    _SslCipherGetName := nil;
-    _SslCipherGetBits := nil;
-    _SslGetVerifyResult := nil;
-
-    _X509New := nil;
-    _X509Free := nil;
-    _X509NameOneline := nil;
-    _X509GetSubjectName := nil;
-    _X509GetIssuerName := nil;
-    _X509NameHash := nil;
-    _X509Digest := nil;
-    _X509print := nil;
-    _X509SetVersion := nil;
-    _X509SetPubkey := nil;
-    _X509SetIssuerName := nil;
-    _X509NameAddEntryByTxt := nil;
-    _X509Sign := nil;
-    _X509GmtimeAdj := nil;
-    _X509SetNotBefore := nil;
-    _X509SetNotAfter := nil;
-    _X509GetSerialNumber := nil;
-    _EvpPkeyNew := nil;
-    _EvpPkeyFree := nil;
-    _EvpPkeyAssign := nil;
-    _EVPCleanup := nil;
-    _EvpGetDigestByName := nil;
-    _SSLeayversion := nil;
-    _ErrErrorString := nil;
-    _ErrGetError := nil;
-    _ErrClearError := nil;
-    _ErrFreeStrings := nil;
-    _ErrRemoveState := nil;
-    _OPENSSLaddallalgorithms := nil;
-    _CRYPTOcleanupAllExData := nil;
-    _RandScreen := nil;
-    _BioNew := nil;
-    _BioFreeAll := nil;
-    _BioSMem := nil;
-    _BioCtrlPending := nil;
-    _BioRead := nil;
-    _BioWrite := nil;
-    _d2iPKCS12bio := nil;
-    _PKCS12parse := nil;
-    _PKCS12free := nil;
-    _RsaGenerateKey := nil;
-    _Asn1UtctimeNew := nil;
-    _Asn1UtctimeFree := nil;
-    _Asn1IntegerSet := nil;
-    _i2dX509bio := nil;
-    _i2dPrivateKeyBio := nil;
-
-    // 3DES functions
-    _DESsetoddparity := nil;
-    _DESsetkeychecked := nil;
-    _DESecbencrypt := nil;
-    //
-    _CRYPTOnumlocks := nil;
-    _CRYPTOsetlockingcallback := nil;
-  Result := True;
-end;
-
-function IsSSLloaded: Boolean;
-begin
-  Result := SSLLoaded;
-end;
-
-finalization
-  DestroySSLInterface;
-
-end.
+        Result := True;
+        SSLloaded := True;
+      end
+      else
+      begin
+        //load failed!
+        if SSLLibHandle <> 0 then
+        begin
+          FreeLibrary(SSLLibHandle);
+          SSLLibHandle := 0;
+        end;
+        if SSLUtilHandle <> 0 then
+        begin
+          FreeLibrary(SSLUtilHandle);
+          SSLLibHandle := 0;
+        end;
+        Result := False;
+      end;
+    end
+    else
+      //loaded before...
+      Result := true;
+end;
+
+function DestroySSLInterface: Boolean;
+begin
+    if IsSSLLoaded then
+    begin
+      //deinit library
+      EVPCleanup;
+      CRYPTOcleanupAllExData;
+      ErrRemoveState(0);
+    end;
+    SSLloaded := false;
+    if SSLLibHandle <> 0 then
+    begin
+      FreeLibrary(SSLLibHandle);
+      SSLLibHandle := 0;
+    end;
+    if SSLUtilHandle <> 0 then
+    begin
+      FreeLibrary(SSLUtilHandle);
+      SSLLibHandle := 0;
+    end;
+
+    _SslGetError := nil;
+    _SslLibraryInit := nil;
+    _SslLoadErrorStrings := nil;
+    _SslCtxSetCipherList := nil;
+    _SslCtxNew := nil;
+    _SslCtxFree := nil;
+    _SslSetFd := nil;
+    _SslMethodV2 := nil;
+    _SslMethodV3 := nil;
+    _SslMethodTLSV1 := nil;
+    _SslMethodV23 := nil;
+    _SslCtxUsePrivateKey := nil;
+    _SslCtxUsePrivateKeyASN1 := nil;
+    _SslCtxUsePrivateKeyFile := nil;
+    _SslCtxUseCertificate := nil;
+    _SslCtxUseCertificateASN1 := nil;
+    _SslCtxUseCertificateFile := nil;
+    _SslCtxUseCertificateChainFile := nil;
+    _SslCtxCheckPrivateKeyFile := nil;
+    _SslCtxSetDefaultPasswdCb := nil;
+    _SslCtxSetDefaultPasswdCbUserdata := nil;
+    _SslCtxLoadVerifyLocations := nil;
+    _SslNew := nil;
+    _SslFree := nil;
+    _SslAccept := nil;
+    _SslConnect := nil;
+    _SslShutdown := nil;
+    _SslRead := nil;
+    _SslPeek := nil;
+    _SslWrite := nil;
+    _SslPending := nil;
+    _SslGetPeerCertificate := nil;
+    _SslGetVersion := nil;
+    _SslCtxSetVerify := nil;
+    _SslGetCurrentCipher := nil;
+    _SslCipherGetName := nil;
+    _SslCipherGetBits := nil;
+    _SslGetVerifyResult := nil;
+
+    _X509New := nil;
+    _X509Free := nil;
+    _X509NameOneline := nil;
+    _X509GetSubjectName := nil;
+    _X509GetIssuerName := nil;
+    _X509NameHash := nil;
+    _X509Digest := nil;
+    _X509print := nil;
+    _X509SetVersion := nil;
+    _X509SetPubkey := nil;
+    _X509SetIssuerName := nil;
+    _X509NameAddEntryByTxt := nil;
+    _X509Sign := nil;
+    _X509GmtimeAdj := nil;
+    _X509SetNotBefore := nil;
+    _X509SetNotAfter := nil;
+    _X509GetSerialNumber := nil;
+    _EvpPkeyNew := nil;
+    _EvpPkeyFree := nil;
+    _EvpPkeyAssign := nil;
+    _EVPCleanup := nil;
+    _EvpGetDigestByName := nil;
+    _SSLeayversion := nil;
+    _ErrErrorString := nil;
+    _ErrGetError := nil;
+    _ErrClearError := nil;
+    _ErrFreeStrings := nil;
+    _ErrRemoveState := nil;
+    _OPENSSLaddallalgorithms := nil;
+    _CRYPTOcleanupAllExData := nil;
+    _RandScreen := nil;
+    _BioNew := nil;
+    _BioFreeAll := nil;
+    _BioSMem := nil;
+    _BioCtrlPending := nil;
+    _BioRead := nil;
+    _BioWrite := nil;
+    _d2iPKCS12bio := nil;
+    _PKCS12parse := nil;
+    _PKCS12free := nil;
+    _RsaGenerateKey := nil;
+    _Asn1UtctimeNew := nil;
+    _Asn1UtctimeFree := nil;
+    _Asn1IntegerSet := nil;
+    _i2dX509bio := nil;
+    _i2dPrivateKeyBio := nil;
+
+    // 3DES functions
+    _DESsetoddparity := nil;
+    _DESsetkeychecked := nil;
+    _DESecbencrypt := nil;
+    //
+    _CRYPTOnumlocks := nil;
+    _CRYPTOsetlockingcallback := nil;
+  Result := True;
+end;
+
+function IsSSLloaded: Boolean;
+begin
+  Result := SSLLoaded;
+end;
+
+finalization
+  DestroySSLInterface;
+
+end.

+ 1 - 0
packages/extra/univint/Makefile.fpc

@@ -82,6 +82,7 @@ implicitunits=ABActions ABAddressBook ABGlobals ABPeoplePicker ABTypedefs \
   CGImageDestination AXValueConstants AXAttributeConstants \
   AXTextAttributedString CGImageProperties CGImageSource \
   UniversalAccess HostTime
+exampledirs=examples
 
 [libs]
 libversion=2.2.1

+ 2065 - 0
packages/extra/univint/examples/Makefile

@@ -0,0 +1,2065 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/08/22]
+#
+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-darwin powerpc64-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../../../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPC:=$(shell $(FPCPROG) -PB)
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_PROGRAMS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override CLEAN_UNITS+=controldemo
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override CLEAN_UNITS+=controldemo
+endif
+override INSTALL_FPCPACKAGE=y
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl univint
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_UNIVINT
+PACKAGEDIR_UNIVINT:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /univint/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_UNIVINT),)
+ifneq ($(wildcard $(PACKAGEDIR_UNIVINT)/units/$(TARGETSUFFIX)),)
+UNITDIR_UNIVINT=$(PACKAGEDIR_UNIVINT)/units/$(TARGETSUFFIX)
+else
+UNITDIR_UNIVINT=$(PACKAGEDIR_UNIVINT)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_UNIVINT)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_UNIVINT) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_UNIVINT)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_UNIVINT=
+UNITDIR_UNIVINT:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /univint/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_UNIVINT),)
+UNITDIR_UNIVINT:=$(firstword $(UNITDIR_UNIVINT))
+else
+UNITDIR_UNIVINT=
+endif
+endif
+ifdef UNITDIR_UNIVINT
+override COMPILER_UNITDIR+=$(UNITDIR_UNIVINT)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX) 
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+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 OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_exes
+ifndef CROSSINSTALL
+ifneq ($(TARGET_PROGRAMS),)
+override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
+override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS)))
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+ifeq ($(OS_TARGET),emx)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+endif
+endif
+fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:

+ 22 - 0
packages/extra/univint/examples/Makefile.fpc

@@ -0,0 +1,22 @@
+#
+#   Makefile.fpc for Free Pascal Universal Interfaces Examples
+#
+
+[target]
+dirs=
+programs=controldemo
+
+[require]
+packages=univint
+
+[clean]
+units=controldemo
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../../../..
+
+[rules]
+.NOTPARALLEL:

+ 200 - 0
packages/extra/univint/examples/controldemo.pas

@@ -0,0 +1,200 @@
+{
+ controldemo.pas
+
+ *****************************************************************************
+ *                                                                           *
+ *  This demonstration program is public domain, which means no copyright,   *
+ * but also no warranty!                                                     *
+ *                                                                           *
+ *  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.                     *
+ *                                                                           *
+ *****************************************************************************
+
+ This application will create a window with two buttons in it
+
+ When you click the button 'Hello Button',
+  it will show or hide (alternating with each click) a text on the window
+
+ When you click the button 'Show Dialog', it will show a modal message dialog
+
+ Author: Felipe Monteiro de Carvalho
+
+ Contributors: Ingemar Ragnemalm
+}
+program controldemo;
+
+{$mode delphi}
+
+uses
+ SysUtils, FPCMacOSAll, MacPas;
+
+var
+  mainWindow: WindowRef;
+  contentView: HIViewRef;
+  button1, button2: ControlRef;
+  staticText: ControlRef;
+  showTextFlag: Boolean = false;
+
+const
+  kButtonHello = 'HELO';
+  kButtonMessage = 'MSGE';
+
+{ implementation of the functions }
+
+{ Functions to easely generate carbon structures }
+
+function GetQDRect(Left, Top, Width, Height: Integer): FPCMacOSAll.Rect;
+begin
+  result.Left := Left;
+  result.Top := Top;
+  result.Right := Left + Width;
+  result.Bottom := Top + Height;
+end;
+
+{ Shows a message box }
+
+procedure DoShowMessage(ATitle, AMsg: string);
+var
+  outItemHit: SInt16;
+  err: OSErr;
+begin
+  err := StandardAlert(kAlertNoteAlert, ATitle, AMsg, nil, outItemHit);
+end;
+
+{ Event handling routines }
+
+{  Here we alternate the visibility status of the static text
+  with each button click }
+function ButtonHelloPressed: OSStatus;
+begin
+  result := 0;
+
+  showTextFlag := not showTextFlag;
+
+  if showTextFlag then HIViewSetVisible(staticText, True)
+  else HIViewSetVisible(staticText, False);
+end;
+
+function ButtonMessagePressed: OSStatus;
+begin
+  result := 0;
+
+  DoShowMessage('Standard message dialog', 'This dialog is modal');
+end;
+
+{ Message handling function }
+
+function WindowCommandHandler(nextHandler: EventHandlerCallRef; theEvent: EventRef; userDataPtr: UnivPtr): OSStatus; cdecl;
+var
+  status: OSStatus;
+  ignoreresult: OSStatus;
+  aCommand: HICommand;
+begin
+  status := eventNotHandledErr;
+
+  ignoreresult := GetEventParameter(theEvent, kEventParamDirectObject,
+   typeHICommand, nil, sizeof(aCommand), nil, @aCommand);
+
+  if aCommand.commandID = FOUR_CHAR_CODE(kButtonHello) then status := ButtonHelloPressed()
+  else if aCommand.commandID = FOUR_CHAR_CODE(kButtonMessage) then status := ButtonMessagePressed();
+
+  result := status;
+end;
+
+{ Initialization and finalization routines }
+
+procedure Initialize;
+var
+  status, ignoreResult: OSStatus;
+  cmdEvent: EventTypeSpec;
+  eventHandler: EventHandlerUPP;
+  fontStyle: ControlFontStyleRec;
+begin
+  status := CreateNewWindow(kDocumentWindowClass,
+   (kWindowStandardDocumentAttributes or kWindowStandardHandlerAttribute
+    or kWindowCompositingAttribute),
+   GetQDRect(100, 100, 350, 350), mainWindow);
+
+  if (status <> noErr) or (mainWindow = nil) then
+  begin
+    DoShowMessage('Error', 'CreateNewWindow failed');
+    Exit;
+  end;
+
+  ignoreResult := SetWindowTitleWithCFString(mainWindow, CFSTRP('Carbon FPC Controls Demo'));
+
+  ignoreResult := HIViewFindByID(HIViewGetRoot(mainWindow), kHIViewWindowContentID, contentView);
+
+  { Add events }
+
+  cmdEvent.eventClass := kEventClassCommand;
+  cmdEvent.eventKind := kEventCommandProcess;
+  eventHandler := NewEventHandlerUPP(@WindowCommandHandler);
+  ignoreResult := InstallEventHandler(GetWindowEventTarget(mainWindow),
+   eventHandler, 1, @cmdEvent, nil, nil);
+
+  { Creates the hello button }
+
+  ignoreResult := CreatePushButtonControl(nil, GetQDRect(50, 200, 100, 50),
+   CFSTRP('Hello Button'), button1);
+
+  ignoreResult := HIViewAddSubview(contentView, button1);
+  ignoreResult := SetControlCommandID(button1, FOUR_CHAR_CODE(kButtonHello));
+  ignoreResult := HIViewSetVisible(button1, TRUE);
+
+  { Creates the message button }
+
+  ignoreResult := CreatePushButtonControl(nil, GetQDRect(200, 200, 100, 50),
+   CFSTRP('Show Dialog'), button2);
+
+  ignoreResult := HIViewAddSubview(contentView, button2);
+  ignoreResult := SetControlCommandID(button2, FOUR_CHAR_CODE(kButtonMessage));
+  ignoreResult := HIViewSetVisible(button2, TRUE);
+
+  { Creates the text control }
+
+  fontStyle.flags := kControlUseJustMask or kControlUseSizeMask;
+  fontStyle.just := teCenter;
+  fontStyle.size := 30;
+
+  ignoreResult := CreateStaticTextControl(mainWindow,
+   GetQDRect(0, 50, 350, 50), nil, @fontStyle, staticText);
+
+  ignoreResult := HIViewAddSubview(contentView, staticText);
+  ignoreResult := HIViewSetVisible(staticText, FALSE);
+
+  HIViewSetText(staticText, CFSTRP('Hello Controls!'));
+
+  { Shows the window }
+
+  ShowWindow(mainWindow);
+end;
+
+procedure DoCloseWindow(theWind: WindowRef);
+var
+  theEvent: EventRef;
+begin
+  CreateEvent(nil, kEventClassWindow, kEventWindowClose, GetCurrentEventTime, kEventAttributeNone, theEvent);
+  SetEventParameter(theEvent, kEventParamDirectObject, typeWindowRef, sizeof(WindowRef), theWind);
+  SendEventToEventTarget(theEvent, GetWindowEventTarget(theWind));
+end;
+
+{ Closes all windows, so they have time to save any user data (none in this case) }
+
+procedure Finalize;
+begin
+  DoCloseWindow(mainWindow);
+end;
+
+{ Main program section }
+
+begin
+  Initialize();
+
+  RunApplicationEventLoop();
+
+  Finalize();
+end.
+

+ 1 - 0
rtl/inc/systemh.inc

@@ -257,6 +257,7 @@ Type
   PQWord              = ^QWord;
   PInt64              = ^Int64;
   PPtrInt             = ^PtrInt;
+  PPtrUInt            = ^PtrUInt;
   PSizeInt            = ^SizeInt;
 
   PPointer            = ^Pointer;

+ 83 - 0
rtl/objpas/classes/streams.inc

@@ -785,3 +785,86 @@ begin
   inherited Destroy;
 end;
 
+{****************************************************************************}
+{*                             TStreamAdapter                               *}
+{****************************************************************************}
+constructor TStreamAdapter.Create(Stream: TStream; Ownership: TStreamOwnership = soReference);
+begin
+  inherited Create;
+  FStream:=Stream;
+  FOwnership:=Ownership;
+end;
+
+
+destructor TStreamAdapter.Destroy;
+begin
+  if StreamOwnership=soOwned then
+    FreeAndNil(FStream);
+  inherited Destroy;
+end;
+  
+  
+function TStreamAdapter.Read(pv: Pointer; cb: DWORD; pcbRead: PDWORD): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.Write(pv: Pointer; cb: DWORD; pcbWritten: PDWORD): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.Seek(dlibMove: Largeint; dwOrigin: Longint; out libNewPosition: Largeint): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.SetSize(libNewSize: Largeint): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint; out cbWritten: Largeint): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.Commit(grfCommitFlags: Longint): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.Revert: HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.LockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.UnlockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult; stdcall;
+begin
+  runerror(217);
+end;
+
+
+function TStreamAdapter.Clone(out stm: IStream): HResult; stdcall;
+begin
+  runerror(217);
+end;

+ 16 - 8
rtl/objpas/types.pp

@@ -37,6 +37,12 @@ type
   PSmallInt = System.PSmallInt;
   PDouble = System.PDouble;
   PByte = System.PByte;
+  Largeint = int64;
+  LARGE_INT = LargeInt;
+  PLargeInt = ^LargeInt;
+  LargeUint = qword;
+  LARGE_UINT= LargeUInt;
+  PLargeuInt = ^LargeuInt;
 
   TIntegerDynArray = array of Integer;
   TCardinalDynArray = array of Cardinal;
@@ -187,8 +193,6 @@ type
   PCLSID = PGUID;
   TCLSID = TGUID;
 
-  LARGE_INT = Int64;
-  Largeint = LARGE_INT;
   PDWord = ^DWord;
 
   PDisplay = Pointer;
@@ -216,6 +220,9 @@ type
   FILETIME = _FILETIME;
   PFileTime = ^TFileTime;
 
+{$endif Windows}
+
+type
   tagSTATSTG =
 {$ifndef FPC_REQUIRES_PROPER_ALIGNMENT}
   packed
@@ -236,17 +243,19 @@ type
   TStatStg = tagSTATSTG;
   STATSTG = TStatStg;
   PStatStg = ^TStatStg;
-
+  
+  { classes depends on these interfaces, we can't use the activex unit in classes though }  
   IClassFactory = Interface(IUnknown) ['{00000001-0000-0000-C000-000000000046}']
      Function CreateInstance(Const unkOuter : IUnknown;Const riid : TGUID;Out vObject) : HResult;StdCall;
      Function LockServer(fLock : LongBool) : HResult;StdCall;
   End;
 
-  ISequentialStream = interface(IUnknown) ['{0c733a30-2a1c-11ce-ade5-00aa0044773d}']
-     function Read(pv : Pointer;cb : DWord;pcbRead : PDWord) : HRESULT;stdcall;
-     function Write(pv : Pointer;cb : DWord;pcbWritten : PDWord) : HRESULT;stdcall;
+  ISequentialStream = interface(IUnknown)
+     ['{0c733a30-2a1c-11ce-ade5-00aa0044773d}']
+     function Read(pv : Pointer;cb : DWORD;pcbRead : PDWORD) : HRESULT;stdcall;
+     function Write(pv : Pointer;cb : DWORD;pcbWritten : PDWORD): HRESULT;stdcall;
   end;
-
+  
   IStream = interface(ISequentialStream) ['{0000000C-0000-0000-C000-000000000046}']
      function Seek(dlibMove : LargeInt; dwOrigin : Longint;
        out libNewPosition : LargeInt) : HResult;stdcall;
@@ -262,7 +271,6 @@ type
      Function Stat(out statstg : TStatStg;grfStatFlag : Longint) : HRESULT;stdcall;
      function Clone(out stm : IStream) : HRESULT;stdcall;
   end;
-{$endif Windows}
 
 function EqualRect(const r1,r2 : TRect) : Boolean;
 function Rect(Left,Top,Right,Bottom : Integer) : TRect;