Browse Source

+ Initial import in CVS. Donated by Maxim Artemev

michael 23 years ago
parent
commit
2f896c88fa
4 changed files with 2442 additions and 0 deletions
  1. 1274 0
      packages/base/tcl/Makefile
  2. 19 0
      packages/base/tcl/Makefile.fpc
  3. 1032 0
      packages/base/tcl/tcl80.pp
  4. 117 0
      packages/base/tcl/tcl_demo.pp

+ 1274 - 0
packages/base/tcl/Makefile

@@ -0,0 +1,1274 @@
+#
+# Don't edit, this file is generated by FPCMake Version 1.1 [2002/05/22]
+#
+default: all
+MAKEFILETARGETS=linux win32
+override PATH:=$(subst \,/,$(PATH))
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+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 cygwin,$(MACHTYPE)),)
+inCygWin=1
+endif
+endif
+ifeq ($(OS_TARGET),freebsd)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),netbsd)
+BSDhier=1
+endif
+ifdef inUnix
+BATCHEXT=.sh
+else
+ifdef inOS2
+BATCHEXT=.cmd
+else
+BATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+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=ppc386
+endif
+else
+override FPC=ppc386
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+export FPC FPC_VERSION
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+COMPILERINFO:=$(shell $(FPC) -iSP -iTP -iSO -iTO)
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 1,$(COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 2,$(COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 3,$(COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 4,$(COMPILERINFO))
+endif
+else
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(OS_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(OS_TARGET), please run fpcmake first)
+endif
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE 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=c:/pp
+endif
+endif
+endif
+endif
+ifndef CROSSDIR
+CROSSDIR:=$(FPCDIR)/cross/$(FULL_TARGET)
+endif
+ifndef CROSSTARGETDIR
+CROSSTARGETDIR=$(CROSSDIR)/$(FULL_TARGET)
+endif
+ifdef CROSSCOMPILE
+UNITSDIR:=$(wildcard $(CROSSTARGETDIR)/units)
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+else
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=tcl
+override PACKAGE_VERSION=1.0.6
+override TARGET_UNITS+=tcl80
+override TARGET_EXAMPLES+=tcl_demo
+override INSTALL_FPCPACKAGE=y
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifeq ($(OS_TARGET),linux)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),freebsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),netbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),sunos)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),qnx)
+UNIXINSTALLDIR=1
+endif
+else
+ifeq ($(OS_SOURCE),linux)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_SOURCE),freebsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_SOURCE),netbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),sunos)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),qnx)
+UNIXINSTALLDIR=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXINSTALLDIR
+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 INSTALL_BASEDIR
+ifdef UNIXINSTALLDIR
+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 UNIXINSTALLDIR
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(OS_TARGET)
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+ifdef CROSSCOMPILE
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/units
+else
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(OS_TARGET)
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXINSTALLDIR
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXINSTALLDIR
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+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 UNIXINSTALLDIR
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+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 UNIXINSTALLDIR
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+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
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(FULL_SOURCE))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifdef inUnix
+ifndef GCCLIBDIR
+GCCLIBDIR:=$(shell dirname `(gcc -v 2>&1)| head -n 1| awk '{ print $$4 } '`)
+endif
+ifeq ($(OS_TARGET),linux)
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+ifeq ($(OS_TARGET),netbsd)
+OTHERLIBDIR+=/usr/pkg/lib
+endif
+export GCCLIBDIR OTHERLIB
+endif
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+STATICLIBPREFIX=libp
+RSTEXT=.rst
+FPCMADE=fpcmade
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+FPCMADE=fpcmade.v1
+PACKAGESUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+FPCMADE=fpcmade.dos
+ZIPSUFFIX=go32
+endif
+ifeq ($(OS_TARGET),linux)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.lnx
+ZIPSUFFIX=linux
+endif
+ifeq ($(OS_TARGET),freebsd)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.freebsd
+ZIPSUFFIX=freebsd
+endif
+ifeq ($(OS_TARGET),netbsd)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.netbsd
+ZIPSUFFIX=netbsd
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+ZIPSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+ZIPSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.asm
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+FPCMADE=fpcmade.amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+FPCMADE=fpcmade.ata
+endif
+ifeq ($(OS_TARGET),beos)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.be
+ZIPSUFFIX=be
+endif
+ifeq ($(OS_TARGET),sunos)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.sun
+ZIPSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.qnx
+ZIPSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppn
+OEXT=.on
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+FPCMADE=fpcmade.nw
+ZIPSUFFIX=nw
+EXEEXT=.nlm
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+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=
+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=
+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=
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG=
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG=
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef ECHOREDIR
+ECHOREDIR:=$(subst /,$(PATHSEP),$(ECHO))
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -rfp
+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=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE=
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=as
+LDNAME=ld
+ARNAME=ar
+RCNAME=rc
+ifeq ($(OS_TARGET),win32)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+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$(BATCHEXT)
+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=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(OS_TARGET),linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(OS_TARGET),win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/$(OS_TARGET)/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/$(OS_TARGET)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/$(OS_TARGET)
+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
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+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
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+else
+FPCCPUOPT:=
+endif
+override FPCOPT+=-Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-OG2p3
+endif
+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 GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+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 COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_units
+ifdef TARGET_UNITS
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_examples
+ifdef TARGET_EXAMPLES
+HASEXAMPLES=1
+override EXAMPLESOURCEFILES:=$(wildcard $(addsuffix .pp,$(TARGET_EXAMPLES)) $(addsuffix .pas,$(TARGET_EXAMPLES)))
+override EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(TARGET_EXAMPLES))
+override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(TARGET_EXAMPLES)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES)))
+override CLEANEXEFILES+=$(EXAMPLEFILES) $(EXAMPLEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))
+endif
+endif
+ifdef TARGET_EXAMPLEDIRS
+HASEXAMPLES=1
+endif
+fpc_examples: all $(EXAMPLEFILES) $(addsuffix _all,$(TARGET_EXAMPLEDIRS))
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release
+$(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 .pp .rc .res
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.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)))
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPUFILES))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPULINKFILES)))
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+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$(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_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(ZIPPREFIX)$(PACKAGE_NAME)$(ZIPSUFFIX)
+endif
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(BATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(ZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(ZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=src
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=exm
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.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)))
+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)
+fpc_distclean: clean
+ifdef COMPILER_UNITTARGETDIR
+TARGETDIRCLEAN=fpc_clean
+endif
+fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+.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)
+	@$(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)  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)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(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
+examples: fpc_examples
+shared:
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif

+ 19 - 0
packages/base/tcl/Makefile.fpc

@@ -0,0 +1,19 @@
+#
+#   Makefile.fpc for Tcl/Tk bindings
+#
+[package]
+name=tcl
+version=1.0.6
+
+[target]
+units=tcl80
+examples=tcl_demo
+
+[require]
+libc=y
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../../..

+ 1032 - 0
packages/base/tcl/tcl80.pp

@@ -0,0 +1,1032 @@
+{*
+ * tcl.h --
+ *
+ * This header file describes the externally-visible facilities of the Tcl
+ * interpreter.
+ * 
+ * Translated to Pascal Copyright (c) 2002 by Max Artemev 
+ * aka Bert Raccoon ([email protected], [email protected]) 
+ *
+ *
+ * Copyright (c) 1998-2000 by Scriptics Corporation.
+ * Copyright (c) 1994-1998 Sun Microsystems, Inc.
+ * Copyright (c) 1993-1996 Lucent Technologies.
+ * Copyright (c) 1987-1994 John Ousterhout, The Regents of the
+ *                         University of California, Berkeley.
+ *
+ * ***********************************************************************  
+ * 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.
+ * ***********************************************************************
+ *}
+unit Tcl80;
+
+{$MODE OBJFPC}
+{$ASMMODE INTEL}
+
+{$IFNDEF WIN32}
+  {$LINKLIB c}
+  {$LINKLIB m}
+{$ENDIF}
+
+{$PACKRECORDS C}
+
+{ $DEFINE USE_C}
+{*
+ * I recommend you to compile and link "argv.o" file to this unit.
+ * If you don't have the GCC and you working on the Intel platform 
+ * undefine/comment the `USE_C` macro
+ *}
+{$IFDEF USE_C}
+   {$LINK argv.o}
+{$ENDIF}
+
+interface
+
+// M$ Win32?
+{$IFDEF WIN32}     
+uses windows;
+{$ENDIF}
+
+const
+{$IFDEF WIN32}
+    TCL_LIBRARY = 'tcl80.dll';
+{$ELSE}
+    TCL_LIBRARY = 'tcl80';
+{$ENDIF}
+
+    TCL_DESTROYED                   = integer($DEADDEAD);  // yeah it dead ;)
+    TCL_OK                          = 0;
+    TCL_ERROR                       = 1;
+    TCL_RETURN                      = 2;
+    TCL_BREAK                       = 3;
+    TCL_CONTINUE                    = 4;
+    TCL_RESULT_SIZE                 = 200;
+    MAX_ARGV                        = $7FFF;
+    TCL_VERSION_MAJOR: integer      = 0;
+    TCL_VERSION_MINOR: integer      = 0;
+
+    TCL_NO_EVAL                     = $10000;
+    TCL_EVAL_GLOBAL                 = $20000;
+
+{* Flag values passed to variable-related procedures. *}
+    TCL_GLOBAL_ONLY                 = 1;
+    TCL_NAMESPACE_ONLY              = 2;
+    TCL_APPEND_VALUE                = 4;
+    TCL_LIST_ELEMENT                = 8;
+    TCL_TRACE_READS                 = $10;
+    TCL_TRACE_WRITES                = $20;
+    TCL_TRACE_UNSETS                = $40;
+    TCL_TRACE_DESTROYED             = $80;
+    TCL_INTERP_DESTROYED            = $100;
+    TCL_LEAVE_ERR_MSG               = $200;
+    TCL_PARSE_PART1                 = $400;
+
+{* Types for linked variables: *}
+    TCL_LINK_INT                    = 1;
+    TCL_LINK_DOUBLE                 = 2;
+    TCL_LINK_BOOLEAN                = 3;
+    TCL_LINK_STRING                 = 4;
+    TCL_LINK_READ_ONLY              = $80;
+    TCL_SMALL_HASH_TABLE            = 4;
+
+{* Hash Table *}
+    TCL_STRING_KEYS                 = 0;
+    TCL_ONE_WORD_KEYS               = 1;
+
+{* Const/enums Tcl_QueuePosition *}
+// typedef enum {
+    TCL_QUEUE_TAIL                  = 0;
+    TCL_QUEUE_HEAD                  = 1;
+    TCL_QUEUE_MARK                  = 2;
+//} Tcl_QueuePosition;
+
+// Event Flags
+    TCL_DONT_WAIT                   = 1 shl 1;
+    TCL_WINDOW_EVENTS               = 1 shl 2;
+    TCL_FILE_EVENTS                 = 1 shl 3;
+    TCL_TIMER_EVENTS                = 1 shl 4;
+    TCL_IDLE_EVENTS                 = 1 shl 5;  {* WAS 0x10 ???? *}
+    TCL_ALL_EVENTS                  = ($FFFFFFFF xor TCL_DONT_WAIT); // (~TCL_DONT_WAIT)
+
+// Result type
+    TCL_VOLATILE                    = 1;
+    TCL_STATIC                      = 0;
+    TCL_DYNAMIC                     = 3;
+
+// Channel
+    TCL_STDIN                       = 1 shl 1;
+    TCL_STDOUT                      = 1 shl 2;
+    TCL_STDERR                      = 1 shl 3;
+    TCL_ENFORCE_MODE                = 1 shl 4;
+
+    TCL_READABLE                    = 1 shl 1;
+    TCL_WRITABLE                    = 1 shl 2;
+    TCL_EXCEPTION                   = 1 shl 3;
+
+{* POSIX *}
+
+    EPERM                           = 1;
+{* Operation not permitted; only the owner of the file (or other
+ * resource) or processes with special privileges can perform the
+ * operation.
+ *}
+
+    ENOENT                          = 2;
+{* No such file or directory.  This is a "file doesn't exist" error
+ * for ordinary files that are referenced in contexts where they are
+ * expected to already exist.
+ *}
+
+    ESRCH                           = 3;
+{* No process matches the specified process ID. *}
+
+    EINTR                           = 4;
+{* Interrupted function call; an asynchronous signal occurred and
+ * prevented completion of the call.  When this happens, you should
+ * try the call again.
+ *}
+
+    EIO                             = 5;
+{* Input/output error; usually used for physical read or write errors. *}
+
+    ENXIO                           = 6;
+{* No such device or address.  The system tried to use the device
+ * represented by a file you specified, and it couldn't find the
+ * device.  This can mean that the device file was installed
+ * incorrectly, or that the physical device is missing or not
+ * correctly attached to the computer.
+ *}
+
+    E2BIG                           = 7;
+{* Argument list too long; used when the arguments passed to a new
+ * program being executed with one of the `exec' functions (*note
+ * Executing a File::.) occupy too much memory space.  This condition
+ * never arises in the GNU system.
+ *}
+
+    ENOEXEC                         = 8;
+{* Invalid executable file format.  This condition is detected by the
+ * `exec' functions; see *Note Executing a File::.
+ *}
+
+    EBADF                           = 9;
+{* Bad file descriptor; for example, I/O on a descriptor that has been
+ * closed or reading from a descriptor open only for writing (or vice
+ * versa).
+ *}
+
+    ECHILD                          = 10;
+{* There are no child processes.  This error happens on operations
+ * that are supposed to manipulate child processes, when there aren't
+ * any processes to manipulate.
+ *}
+
+    EDEADLK                         = 11;
+{* Deadlock avoided; allocating a system resource would have resulted
+ * in a deadlock situation.  The system does not guarantee that it
+ * will notice all such situations.  This error means you got lucky
+ * and the system noticed; it might just hang.  *Note File Locks::,
+ * for an example.
+ *}
+
+    ENOMEM                          = 12;
+{* No memory available.  The system cannot allocate more virtual
+ * memory because its capacity is full.
+ *}
+
+    EACCES                          = 13;
+{* Permission denied; the file permissions do not allow the attempted
+ * operation.
+ *}
+
+    EFAULT                          = 14;
+{* Bad address; an invalid pointer was detected.  In the GNU system,
+ * this error never happens; you get a signal instead.
+ *}
+
+    ENOTBLK                         = 15;
+{* A file that isn't a block special file was given in a situation
+ * that requires one.  For example, trying to mount an ordinary file
+ * as a file system in Unix gives this error.
+ *}
+
+    EBUSY                           = 16;
+{* Resource busy; a system resource that can't be shared is already
+ * in use.  For example, if you try to delete a file that is the root
+ * of a currently mounted filesystem, you get this error.
+ *}
+
+    EEXIST                          = 17;
+{* File exists; an existing file was specified in a context where it
+ * only makes sense to specify a new file.
+ *}
+
+    EXDEV                           = 18;
+{* An attempt to make an improper link across file systems was
+ * detected.  This happens not only when you use `link' (*note Hard
+ * Links::.) but also when you rename a file with `rename' (*note
+ * Renaming Files::.).
+ *}
+
+    ENODEV                          = 19;
+{* The wrong type of device was given to a function that expects a
+ * particular sort of device.
+ *}
+
+    ENOTDIR                         = 20;
+{* A file that isn't a directory was specified when a directory is
+ * required.
+ *}
+
+    EISDIR                          = 21;
+{* File is a directory; you cannot open a directory for writing, or
+ * create or remove hard links to it.
+ *}
+
+    EINVAL                          = 22;
+{* Invalid argument.  This is used to indicate various kinds of
+ * problems with passing the wrong argument to a library function.
+ *}  
+
+    EMFILE                          = 24;
+{* The current process has too many files open and can't open any
+ * more.  Duplicate descriptors do count toward this limit.
+ *
+ * In BSD and GNU, the number of open files is controlled by a
+ * resource limit that can usually be increased.  If you get this
+ * error, you might want to increase the `RLIMIT_NOFILE' limit or
+ * make it unlimited; *note Limits on Resources::..
+ *}
+
+    ENFILE                          = 23;
+{* There are too many distinct file openings in the entire system.
+ * Note that any number of linked channels count as just one file
+ * opening; see *Note Linked Channels::.  This error never occurs in
+ * the GNU system.
+ *}
+
+    ENOTTY                          = 25;
+{* Inappropriate I/O control operation, such as trying to set terminal
+ * modes on an ordinary file.
+ *}
+
+    ETXTBSY                         = 26;
+{* An attempt to execute a file that is currently open for writing, or
+ * write to a file that is currently being executed.  Often using a
+ * debugger to run a program is considered having it open for writing
+ * and will cause this error.  (The name stands for "text file
+ * busy".)  This is not an error in the GNU system; the text is
+ * copied as necessary.
+ *}
+
+    EFBIG                           = 27;
+{* File too big; the size of a file would be larger than allowed by
+ * the system.
+ *}
+
+    ENOSPC                          = 28;
+{* No space left on device; write operation on a file failed because
+ * the disk is full.
+ *}
+
+    ESPIPE                          = 29;
+{* Invalid seek operation (such as on a pipe).  *}
+
+    EROFS                           = 30;
+{* An attempt was made to modify something on a read-only file system.  *}
+
+    EMLINK                          = 31;
+{* Too many links; the link count of a single file would become too
+ * large.  `rename' can cause this error if the file being renamed
+ * already has as many links as it can take (*note Renaming Files::.).
+ *}
+
+    EPIPE                           = 32;
+{* Broken pipe; there is no process reading from the other end of a
+ * pipe.  Every library function that returns this error code also
+ * generates a `SIGPIPE' signal; this signal terminates the program
+ * if not handled or blocked.  Thus, your program will never actually
+ * see `EPIPE' unless it has handled or blocked `SIGPIPE'.
+ *}
+
+    EDOM                            = 33;
+{* Domain error; used by mathematical functions when an argument
+ * value does not fall into the domain over which the function is
+ * defined.
+ *}
+
+    ERANGE                          = 34;
+{* Range error; used by mathematical functions when the result value
+ * is not representable because of overflow or underflow.
+ *}
+
+    EAGAIN                          = 35;
+{* Resource temporarily unavailable; the call might work if you try
+ * again later.  The macro `EWOULDBLOCK' is another name for `EAGAIN';
+ * they are always the same in the GNU C library.
+ *}
+
+    EWOULDBLOCK                     = EAGAIN;
+{* In the GNU C library, this is another name for `EAGAIN' (above).
+ * The values are always the same, on every operating system.
+ * C libraries in many older Unix systems have `EWOULDBLOCK' as a
+ * separate error code.
+ *}
+
+    EINPROGRESS                     = 36;
+{* An operation that cannot complete immediately was initiated on an
+ * object that has non-blocking mode selected.  Some functions that
+ * must always block (such as `connect'; *note Connecting::.) never
+ * return `EAGAIN'.  Instead, they return `EINPROGRESS' to indicate
+ * that the operation has begun and will take some time.  Attempts to
+ * manipulate the object before the call completes return `EALREADY'.
+ * You can use the `select' function to find out when the pending
+ * operation has completed; *note Waiting for I/O::..
+ *}
+
+    EALREADY                        = 37;
+{* An operation is already in progress on an object that has
+ * non-blocking mode selected.
+ *}
+
+    ENOTSOCK                        = 38;
+{* A file that isn't a socket was specified when a socket is required.  *}
+
+    EDESTADDRREQ                    = 39;
+{* No default destination address was set for the socket.  You get
+ * this error when you try to transmit data over a connectionless
+ * socket, without first specifying a destination for the data with
+ * `connect'.
+ *}
+
+    EMSGSIZE                        = 40;
+{* The size of a message sent on a socket was larger than the
+ * supported maximum size.
+ *}
+
+    EPROTOTYPE                      = 41;
+{* The socket type does not support the requested communications
+ * protocol.
+ *}
+
+    ENOPROTOOPT                     = 42;
+{* You specified a socket option that doesn't make sense for the
+ * particular protocol being used by the socket.  *Note Socket
+ * Options::.
+ *}
+
+    EPROTONOSUPPORT                 = 43;
+{* The socket domain does not support the requested communications
+ * protocol (perhaps because the requested protocol is completely
+ * invalid.) *Note Creating a Socket::.
+ *}
+
+    ESOCKTNOSUPPORT                 = 44;
+{* The socket type is not supported.  *}
+
+    EOPNOTSUPP                      = 45;
+{* The operation you requested is not supported.  Some socket
+ * functions don't make sense for all types of sockets, and others
+ * may not be implemented for all communications protocols.  In the
+ * GNU system, this error can happen for many calls when the object
+ * does not support the particular operation; it is a generic
+ * indication that the server knows nothing to do for that call.
+ *}
+
+    EPFNOSUPPORT                    = 46;
+{* The socket communications protocol family you requested is not
+ * supported.
+ *}
+
+    EAFNOSUPPORT                    = 47;
+{* The address family specified for a socket is not supported; it is
+ * inconsistent with the protocol being used on the socket.  *Note
+ * Sockets::.
+ *}
+
+    EADDRINUSE                      = 48;
+{* The requested socket address is already in use.  *Note Socket
+ * Addresses::.
+ *}
+
+    EADDRNOTAVAIL                   = 49;
+{* The requested socket address is not available; for example, you
+ * tried to give a socket a name that doesn't match the local host
+ * name.  *Note Socket Addresses::.
+ *}
+
+    ENETDOWN                        = 50;
+{* A socket operation failed because the network was down.  *}
+
+    ENETUNREACH                     = 51;
+{* A socket operation failed because the subnet containing the remote
+ * host was unreachable.
+ *}
+
+    ENETRESET                       = 52;
+{* A network connection was reset because the remote host crashed.  *}
+
+    ECONNABORTED                    = 53;
+{* A network connection was aborted locally. *}
+
+    ECONNRESET                      = 54;
+{* A network connection was closed for reasons outside the control of
+ * the local host, such as by the remote machine rebooting or an
+ * unrecoverable protocol violation.
+ *}
+
+    ENOBUFS                         = 55;
+{* The kernel's buffers for I/O operations are all in use.  In GNU,
+ * this error is always synonymous with `ENOMEM'; you may get one or
+ * the other from network operations.
+ *}
+
+    EISCONN                         = 56;
+{* You tried to connect a socket that is already connected.  *Note
+ * Connecting::.
+ *}
+
+    ENOTCONN                        = 57;
+{* The socket is not connected to anything.  You get this error when
+ * you try to transmit data over a socket, without first specifying a
+ * destination for the data.  For a connectionless socket (for
+ * datagram protocols, such as UDP), you get `EDESTADDRREQ' instead.
+ *}
+
+    ESHUTDOWN                       = 58;
+{* The socket has already been shut down.  *}
+
+    ETOOMANYREFS                    = 59;
+{* ???  *}
+
+    ETIMEDOUT                       = 60;
+{* A socket operation with a specified timeout received no response
+ * during the timeout period.
+ *}
+
+    ECONNREFUSED                    = 61;
+{* A remote host refused to allow the network connection (typically
+ * because it is not running the requested service).
+ *}
+
+    ELOOP                           = 62;
+{* Too many levels of symbolic links were encountered in looking up a
+ * file name.  This often indicates a cycle of symbolic links.
+ *}
+
+    ENAMETOOLONG                    = 63;
+{* Filename too long (longer than `PATH_MAX'; *note Limits for
+ * Files::.) or host name too long (in `gethostname' or
+ * `sethostname'; *note Host Identification::.).
+ *}
+
+    EHOSTDOWN                       = 64;
+{* The remote host for a requested network connection is down.  *}
+
+    EHOSTUNREACH                    = 65;
+{* The remote host for a requested network connection is not
+ * reachable.
+ *}
+
+    ENOTEMPTY                       = 66;
+{* Directory not empty, where an empty directory was expected.
+ * Typically, this error occurs when you are trying to delete a
+ * directory.
+ *}
+
+    EPROCLIM                        = 67;
+{* This means that the per-user limit on new process would be
+ * exceeded by an attempted `fork'.  *Note Limits on Resources::, for
+ * details on the `RLIMIT_NPROC' limit.
+ *}
+
+    EUSERS                          = 68;
+{* The file quota system is confused because there are too many users.  *}
+
+    EDQUOT                          = 69;
+{* The user's disk quota was exceeded.  *}
+
+    ESTALE                          = 70;
+{* Stale NFS file handle.  This indicates an internal confusion in
+ * the NFS system which is due to file system rearrangements on the
+ * server host.  Repairing this condition usually requires unmounting
+ * and remounting the NFS file system on the local host.
+ *}
+
+    EREMOTE                         = 71;
+{* An attempt was made to NFS-mount a remote file system with a file
+ * name that already specifies an NFS-mounted file.  (This is an
+ * error on some operating systems, but we expect it to work properly
+ * on the GNU system, making this error code impossible.)
+ *}
+
+    EBADRPC                         = 72;
+{* ???  *}
+    ERPCMISMATCH                    = 73;
+{* ???  *}
+    EPROGUNAVAIL                    = 74;
+{* ???  *}
+    EPROGMISMATCH                   = 75;
+{* ???  *}
+    EPROCUNAVAIL                    = 76;
+{* ???  *}
+    ENOLCK                          = 77;
+{* No locks available.  This is used by the file locking facilities;
+ * see *Note File Locks::.  This error is never generated by the GNU
+ * system, but it can result from an operation to an NFS server
+ * running another operating system.
+ *}
+
+    ENOSYS                          = 78;
+{* Function not implemented.  Some functions have commands or options
+ * defined that might not be supported in all implementations, and
+ * this is the kind of error you get if you request them and they are
+ * not supported.
+ *}
+
+    EFTYPE                          = 79;
+{* Inappropriate file type or format.  The file was the wrong type
+ * for the operation, or a data file had the wrong format.
+ * On some systems `chmod' returns this error if you try to set the
+ * sticky bit on a non-directory file; *note Setting Permissions::..
+ *}
+
+
+type
+    PPChar          = ^PChar;
+    Tcl_Argv        = PPChar;
+    Tcl_ClientData  = pointer;
+    Tcl_FreeProc    = procedure(block : pointer); cdecl;
+    PTcl_Interp     = ^Tcl_Interp;
+
+    Tcl_Interp = packed record
+        result  : PChar; {* Do not access this directly. Use
+                          * Tcl_GetStringResult since result
+                          * may be pointing to an object
+                          *}
+        freeProc : Tcl_FreeProc;
+        errorLine: integer;
+    end;
+
+{*  Event Definitions  *}
+    TTcl_EventSetupProc = procedure(clientData: Tcl_ClientData; flags: integer); cdecl;
+    TTcl_EventCheckProc = TTcl_EventSetupProc;
+
+    PTcl_Event          = ^Tcl_Event;
+    TTcl_EventProc      = function(evPtr: PTcl_Event; flags: integer): integer; cdecl;
+
+    Tcl_Event = packed record
+        proc      : TTcl_EventProc;
+        nextPtr   : PTcl_Event;
+        ClientData: TObject;    {* ClientData is just pointer.*}
+    end;
+
+
+    PTcl_Time = ^Tcl_Time;
+    Tcl_Time = packed record
+        sec: longInt;           { * Seconds. * }
+        usec: longInt;          { * Microseconds. * }
+    end;
+
+    Tcl_TimerToken  = pointer;
+    PInteger        = ^integer;
+
+    PTcl_HashTable  = pointer;
+    PTcl_HashEntry  = ^Tcl_HashEntry;
+    PPTcl_HashEntry = ^PTcl_HashEntry;
+
+    Tcl_HashEntry  = packed record
+        nextPtr    : PTcl_HashEntry;
+        tablePtr   : PTcl_HashTable;
+        bucketPtr  : PPTcl_HashEntry;
+        clientData : Tcl_ClientData;
+        key        : array[0..3] of Char;
+    end;
+{      case key: integer of
+        0: (oneWordValue: pChar);
+         1: (words      : pInteger);
+         2: (str        : pChar);
+}
+    Tcl_HashFindProc   = function(tablePtr: PTcl_HashTable; key: PChar): PTcl_HashEntry; cdecl;
+    Tcl_HashCreateProc = function(tablePtr: PTcl_HashTable; key: PChar; newPtr: PInteger): PTcl_HashEntry; cdecl;
+
+    PHashTable = ^Tcl_HashTable;
+    Tcl_HashTable = packed record
+        buckets         : ppTcl_HashEntry;
+        staticBuckets   : array[0..TCL_SMALL_HASH_TABLE - 1] of PTcl_HashEntry;
+        numBuckets      : integer;
+        numEntries      : integer;
+        rebuildSize     : integer;
+        downShift       : integer;
+        mask            : integer;
+        keyType         : integer;
+        findProc        : Tcl_HashFindProc;
+        createProc      : Tcl_HashCreateProc;
+    end;
+
+    PTcl_HashSearch = ^Tcl_HashSearch;
+    Tcl_HashSearch = packed record
+         tablePtr    : PTcl_HashTable;
+         nextIndex   : integer;
+         nextEntryPtr: PTcl_HashEntry;
+    end;
+
+    TTclAppInitProc         = function(interp: pTcl_Interp): integer; cdecl;
+    TTclPackageInitProc     = function(interp: pTcl_Interp): integer; cdecl;
+    TTclCmdProc             = function(clientData : Tcl_ClientData; interp : pTcl_Interp; argc: integer; argv : Tcl_Argv): integer; cdecl;
+    TTclVarTraceProc        = function (clientData: Tcl_ClientData; interp: pTcl_Interp;
+                                        varName: PChar; elemName: PChar; flags: integer): PChar; cdecl;
+    TTclFreeProc            = procedure(block: pointer); cdecl;
+    TTclInterpDeleteProc    = procedure(clientData: Tcl_ClientData; interp: pTcl_Interp); cdecl;
+    TTclCmdDeleteProc       = procedure(clientData: Tcl_ClientData); cdecl;
+    TTclNamespaceDeleteProc = procedure(clientData: Tcl_ClientData); cdecl;
+
+
+const
+    TCL_DSTRING_STATIC_SIZE = 200;
+
+type
+    PTcl_DString = ^Tcl_DString;
+    Tcl_DString = packed record
+        str        : PChar;
+        length     : integer;
+        spaceAvl   : integer;
+        staticSpace: array[0..TCL_DSTRING_STATIC_SIZE - 1] of char;
+    end;
+
+    PTcl_Channel = ^Tcl_Channel;
+    Tcl_Channel = packed record
+    end;
+
+    TTclDriverBlockModeProc     = function(instanceData: Tcl_ClientData; mode: integer): integer; cdecl;
+    TTclDriverCloseProc         = function(instanceData: Tcl_ClientData; interp: PTcl_Interp): integer; cdecl;
+    TTclDriverInputProc         = function(instanceData: Tcl_ClientData; buf: PChar; toRead: integer;
+                                           errorCodePtr: PInteger): integer; cdecl;
+    TTclDriverOutputProc        = function(instanceData: Tcl_ClientData; buf: PChar; toWrite: integer;
+                                           errorCodePtr: PInteger): integer; cdecl;
+    TTclDriverSeekProc          = function(instanceData: Tcl_ClientData; offset: longint; mode: integer;
+                                           errorCodePtr: PInteger): integer; cdecl;
+    TTclDriverSetOptionProc     = function(instanceData: Tcl_ClientData; interp: PTcl_Interp; optionName: PChar;
+                                           value: PChar): integer; cdecl;
+    TTclDriverGetOptionProc     = function(instanceData: Tcl_ClientData; interp: pTcl_Interp; optionName: PChar;
+                                           dsPtr: PTcl_DString): integer; cdecl;
+    TTclDriverWatchProc         = procedure(instanceData: Tcl_ClientData; mask: integer); cdecl;
+    TTclDriverGetHandleProc     = function(instanceData: Tcl_ClientData; direction: integer;
+                                           var handlePtr: Tcl_ClientData): integer; cdecl;
+    PTcl_ChannelType = ^Tcl_ChannelType;
+    Tcl_ChannelType  = packed record
+        typeName     : PChar;
+        blockModeProc: TTclDriverBlockModeProc;
+        closeProc    : TTclDriverCloseProc;
+        inputProc    : TTclDriverInputProc;
+        ouputProc    : TTclDriverOutputProc;
+        seekProc     : TTclDriverSeekProc;
+        setOptionProc: TTclDriverSetOptionProc;
+        getOptionProc: TTclDriverGetOptionProc;
+        watchProc    : TTclDriverWatchProc;
+        getHandleProc: TTclDriverGetHandleProc;
+    end;
+
+    TTclChannelProc = procedure(clientData: Tcl_ClientData; mask: integer); cdecl;
+
+    PTcl_Obj = ^Tcl_Obj;
+    PPTcl_Obj = ^PTcl_Obj;
+    Tcl_Obj = packed record
+        refCount: integer;
+        // ...
+    end;
+
+    TTclObjCmdProc      = function(clientData: Tcl_ClientData; interp: PTcl_Interp; objc: integer; PPObj: PPTcl_Obj): integer; cdecl;
+
+    PTcl_Namespace = ^Tcl_Namespace;
+    Tcl_Namespace = packed record
+        name      : pchar;
+        fullName  : PChar;
+        clientData: Tcl_ClientData;
+        deleteProc: TTclNamespaceDeleteProc;
+        parentPtr : PTcl_Namespace;
+    end;
+
+    PTcl_CallFrame = ^Tcl_CallFrame;
+    Tcl_CallFrame  = packed record
+        nsPtr  : PTcl_Namespace;
+        dummy1 : integer;
+        dummy2 : integer;
+        dummy3 : PChar;
+        dummy4 : PChar;
+        dummy5 : PChar;
+        dummy6 : integer;
+        dummy7 : PChar;
+        dummy8 : PChar;
+        dummy9 : integer;
+        dummy10: PChar;
+    end;
+
+    PTcl_CmdInfo = ^Tcl_CmdInfo;
+    Tcl_CmdInfo  = packed record
+        isNativeObjectProc: integer;
+        objProc           : TTclObjCmdProc;
+        objClientData     : Tcl_ClientData;
+        proc              : TTclCmdProc;
+        clientData        : Tcl_ClientData;
+        deleteProc        : TTclCmdDeleteProc;
+        deleteData        : Tcl_ClientData;
+        namespacePtr      : pTcl_Namespace;
+    end;
+
+    pTcl_Command = ^Tcl_Command;
+    Tcl_Command = packed record
+    end;
+
+{       hPtr            : pTcl_HashEntry;
+        nsPtr           : pTcl_Namespace;
+        refCount        : integer;
+        isCmdEpoch      : integer;
+        compileProc     : pointer;
+        objProc         : pointer;
+        objClientData   : Tcl_ClientData;
+        proc            : pointer;
+        clientData      : Tcl_ClientData;
+        deleteProc      : TTclCmdDeleteProc;
+        deleteData      : Tcl_ClientData;
+        deleted         : integer;
+        importRefPtr    : pointer;
+}
+
+type
+    ulong      = longint;
+    uint       = integer;
+    bool       = longbool;
+
+    TTclPanicProc          = procedure(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8: PChar); cdecl; // 1/15/97 orig. Tcl style
+    TTclClientDataProc     = procedure (clientData: Tcl_ClientData); cdecl;
+    TTclIdleProc           = procedure (clientData: Tcl_ClientData); cdecl; 
+    TTclTimerProc          = TTclIdleProc;
+    TTclCreateCloseHandler = procedure  (channel: pTcl_Channel; proc: TTclClientDataProc; clientData: Tcl_ClientData); cdecl;
+    TTclDeleteCloseHandler = TTclCreateCloseHandler;
+    TTclEventDeleteProc    = function(evPtr: pTcl_Event; clientData: Tcl_ClientData): integer; cdecl;
+
+    function Tcl_Alloc(size: Cardinal): PChar; cdecl; external TCL_LIBRARY;
+    function Tcl_CreateInterp : pTcl_Interp; cdecl; external TCL_LIBRARY;
+    procedure Tcl_DeleteInterp(interp: pTcl_Interp); cdecl; external TCL_LIBRARY;
+    procedure Tcl_ResetResult(interp: pTcl_Interp); cdecl; external TCL_LIBRARY;
+    function Tcl_Eval(interp: pTcl_Interp; script : PChar):integer; cdecl; external TCL_LIBRARY;
+    function Tcl_EvalFile(interp: pTcl_Interp; filename: PChar):integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_AddErrorInfo(interp: pTcl_Interp; message: PChar); cdecl; external TCL_LIBRARY;
+    procedure Tcl_BackgroundError(interp: pTcl_Interp); cdecl; external TCL_LIBRARY;
+    function Tcl_CreateCommand(interp: pTcl_Interp; name: PChar; cmdProc: TTclCmdProc;
+                               clientData: Tcl_ClientData; deleteProc: TTclCmdDeleteProc): pTcl_Command; cdecl; external TCL_LIBRARY;
+
+    function  Tcl_DeleteCommand(interp: pTcl_Interp; name: PChar): integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_CallWhenDeleted(interp: pTcl_Interp; proc: TTclInterpDeleteProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    procedure Tcl_DontCallWhenDeleted(interp: pTcl_Interp; proc: TTclInterpDeleteProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    function  Tcl_CommandComplete(cmd: PChar): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_LinkVar(interp: pTcl_Interp; varName: PChar; var addr; typ: integer): integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_UnlinkVar(interp: pTcl_Interp; varName: PChar); cdecl; external TCL_LIBRARY;
+    function  Tcl_TraceVar(interp: pTcl_Interp; varName: PChar; flags: integer; proc: TTclVarTraceProc;
+                           clientData: Tcl_ClientData): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_TraceVar2(interp: pTcl_Interp; varName: PChar; elemName: PChar; flags : integer; proc: TTclVarTraceProc;
+                            clientData: Tcl_ClientData): integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_UntraceVar(interp: pTcl_Interp; varName: PChar; flags: integer;
+                             proc: TTclVarTraceProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    procedure Tcl_UntraceVar2(interp: pTcl_Interp; varName: PChar; elemName: PChar; flags: integer;
+                              proc: TTclVarTraceProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    function  Tcl_GetVar(interp: pTcl_Interp; varName: PChar; flags: integer): PChar; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetVar2(interp: pTcl_Interp; varName: PChar; elemName: PChar; flags: integer): PChar; cdecl; external TCL_LIBRARY;
+    function  Tcl_SetVar(interp: pTcl_Interp; varName: PChar; newValue: PChar; flags: integer): PChar; cdecl; external TCL_LIBRARY;
+    function  Tcl_SetVar2(interp: pTcl_Interp; varName: PChar; elemName: PChar; newValue: PChar; flags: integer): PChar; cdecl; external TCL_LIBRARY;
+    function  Tcl_UnsetVar(interp: pTcl_Interp; varName: PChar; flags: integer): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_UnsetVar2(interp: pTcl_Interp; varName: PChar; elemName: PChar; flags: integer): integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_SetResult(interp: pTcl_Interp; newValue: PChar; freeProc: TTclFreeProc); cdecl; external TCL_LIBRARY;
+    function  Tcl_FirstHashEntry(hashTbl: pTcl_HashTable; var searchInfo: Tcl_HashSearch): pTcl_HashEntry; cdecl; external TCL_LIBRARY;
+    function  Tcl_NextHashEntry(var searchInfo: Tcl_HashSearch): pTcl_HashEntry; cdecl; external TCL_LIBRARY;
+    procedure Tcl_InitHashTable(hashTbl: pTcl_HashTable; keyType: integer); cdecl; external TCL_LIBRARY;
+    function  Tcl_StringMatch(str: PChar; pattern: PChar): integer; cdecl; external TCL_LIBRARY;
+    function  _Tcl_GetHashKey(hashTbl: pTcl_HashTable; hashEntry: pTcl_HashEntry): PChar; cdecl;
+    function  Tcl_GetErrno:integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_SetErrno(val: integer); cdecl; external TCL_LIBRARY;
+
+
+    procedure Tcl_SetPanicProc(proc: TTclPanicProc); cdecl; external TCL_LIBRARY;
+    function  Tcl_PkgProvide(interp: pTcl_Interp; name: PChar; version: PChar): integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_StaticPackage(interp: pTcl_Interp; pkgName: PChar; initProc: TTclPackageInitProc;
+                                safeInitProc: TTclPackageInitProc); cdecl; external TCL_LIBRARY;
+    procedure Tcl_CreateEventSource(setupProc: TTcl_EventSetupProc;
+                                    checkProc: TTcl_EventCheckProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    procedure Tcl_DeleteEventSource(setupProc: TTcl_EventSetupProc;
+                                    checkProc: TTcl_EventCheckProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    procedure Tcl_QueueEvent(evPtr: pTcl_Event; pos: integer); cdecl; external TCL_LIBRARY;
+    procedure Tcl_SetMaxBlockTime(timePtr: pTcl_Time); cdecl; external TCL_LIBRARY;
+  
+    procedure Tcl_DeleteEvents(proc: TTclEventDeleteProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    function  Tcl_DoOneEvent(flags: integer): integer; cdecl; external TCL_LIBRARY;
+
+
+    procedure Tcl_DoWhenIdle(proc: TTclIdleProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    procedure Tcl_CancelIdleCall(proc: TTclIdleProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    function  Tcl_CreateTimerHandler(milliseconds: integer; proc: TTclTimerProc;
+                                     clientData: Tcl_ClientData): Tcl_TimerToken; cdecl; external TCL_LIBRARY;
+    procedure Tcl_DeleteTimerHandler(token: Tcl_TimerToken); cdecl; external TCL_LIBRARY;
+//    procedure Tcl_CreateModalTimeout(milliseconds: integer; proc: TTclTimerProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+//    procedure Tcl_DeleteModalTimeout(proc: TTclTimerProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+
+    function  Tcl_SplitList(interp: pTcl_Interp; list: PChar; var argcPtr: integer; var argvPtr: Tcl_Argv): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_Merge(argc: integer; argv: Tcl_Argv):PChar; cdecl; external TCL_LIBRARY;
+    procedure Tcl_Free( ptr: PChar ); cdecl; external TCL_LIBRARY;
+    function  Tcl_Init(interp: pTcl_Interp): integer; cdecl; external TCL_LIBRARY;
+//    procedure Tcl_InterpDeleteProc(clientData: Tcl_ClientData; interp: pTcl_Interp); cdecl; external TCL_LIBRARY;
+    function  Tcl_GetAssocData(interp:pTcl_Interp; key: PChar; var proc: TTclInterpDeleteProc): Tcl_ClientData; cdecl; external TCL_LIBRARY;
+    procedure Tcl_DeleteAssocData(interp: pTcl_Interp; key: PChar); cdecl; external TCL_LIBRARY;
+    procedure Tcl_SetAssocData(interp: pTcl_Interp; key: PChar; proc: TTclInterpDeleteProc;
+                               clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    function  Tcl_IsSafe(interp: pTcl_Interp): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_MakeSafe(interp: pTcl_Interp): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_CreateSlave(interp: pTcl_Interp; slaveName: PChar; isSafe: integer): pTcl_Interp; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetSlave(interp: pTcl_Interp; slaveName: PChar): pTcl_Interp; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetMaster(interp: pTcl_Interp): pTcl_Interp; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetInterpPath(askingInterp: pTcl_Interp; slaveInterp: pTcl_Interp): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_CreateAlias(slaveInterp: pTcl_Interp; srcCmd: PChar; targetInterp: pTcl_Interp; targetCmd: PChar;
+                             argc: integer; argv: Tcl_Argv): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetAlias(interp: pTcl_Interp; srcCmd: PChar; var targetInterp: pTcl_Interp; var targetCmd: PChar;
+                          var argc: integer; var argv: Tcl_Argv): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_ExposeCommand(interp: pTcl_Interp; hiddenCmdName: PChar; cmdName: PChar): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_HideCommand(interp: pTcl_Interp; cmdName: PChar; hiddenCmdName: PChar): integer; cdecl; external TCL_LIBRARY;
+
+
+    procedure Tcl_EventuallyFree(clientData: Tcl_ClientData; freeProc: TTclFreeProc); cdecl; external TCL_LIBRARY;
+    procedure Tcl_Preserve(clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    procedure Tcl_Release(clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    function  Tcl_InterpDeleted(interp: pTcl_Interp): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetCommandInfo(interp: pTcl_Interp; cmdName: PChar; var info: Tcl_CmdInfo): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_SetCommandInfo(interp: pTcl_Interp; cmdName: PChar; var info: Tcl_CmdInfo): integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_FindExecutable(path: PChar); cdecl; external TCL_LIBRARY;
+    function  Tcl_GetStringResult(interp: pTcl_Interp): PChar; cdecl; external TCL_LIBRARY; //v1.0
+    function  Tcl_FindCommand(interp: pTcl_Interp; cmdName: PChar;
+                             contextNsPtr: pTcl_Namespace; flags: integer): Tcl_Command; cdecl; external TCL_LIBRARY; //v1.0
+    function  Tcl_DeleteCommandFromToken(interp: pTcl_Interp; cmd: pTcl_Command): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_CreateNamespace(interp: pTcl_Interp; name: PChar; clientData: Tcl_ClientData;
+                                  deleteProc: TTclNamespaceDeleteProc): pTcl_Namespace; cdecl; external TCL_LIBRARY; //v1.0
+    procedure Tcl_DeleteNamespace(namespacePtr: pTcl_Namespace); cdecl; external TCL_LIBRARY;
+    function  Tcl_FindNamespace(interp: pTcl_Interp; name: PChar; contextNsPtr: pTcl_Namespace; flags: integer): pTcl_Namespace; cdecl; external TCL_LIBRARY;
+    function  Tcl_Export(interp: pTcl_Interp; namespacePtr: pTcl_Namespace; pattern: PChar;
+                         resetListFirst: integer): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_Import(interp: pTcl_Interp; namespacePtr: pTcl_Namespace; pattern: PChar;
+                         allowOverwrite: integer): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetCurrentNamespace(interp: pTcl_Interp): pTcl_Namespace; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetGlobalNamespace(interp: pTcl_Interp): pTcl_Namespace; cdecl; external TCL_LIBRARY;
+    function  Tcl_PushCallFrame(interp: pTcl_Interp; var callFramePtr: Tcl_CallFrame;
+                                namespacePtr: pTcl_Namespace; isProcCallFrame: integer): integer; cdecl; external TCL_LIBRARY;
+
+    procedure Tcl_PopCallFrame(interp: pTcl_Interp); cdecl; external TCL_LIBRARY;
+    function  Tcl_VarEval(interp: pTcl_Interp; args: array of const):integer; cdecl; external TCL_LIBRARY;
+
+{* For TkConsole.c *}
+    function  Tcl_RecordAndEval(interp: pTcl_Interp; cmd: PChar; flags: integer): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_GlobalEval(interp: pTcl_Interp; command: PChar): integer; cdecl; external TCL_LIBRARY;
+    procedure Tcl_DStringFree(dsPtr: pTcl_DString); cdecl; external TCL_LIBRARY;
+    function  Tcl_DStringAppend(dsPtr: pTcl_DString; str: PChar; len: integer): PChar; cdecl; external TCL_LIBRARY;
+    function  Tcl_DStringAppendElement(dsPtr: pTcl_DString; str: PChar): PChar; cdecl; external TCL_LIBRARY;
+    procedure Tcl_DStringInit(dsPtr: pTcl_DString); cdecl; external TCL_LIBRARY;
+    procedure Tcl_AppendResult(interp: pTcl_Interp; args: array of const); cdecl; external TCL_LIBRARY; // actually a "C" var array
+    procedure Tcl_SetStdChannel(channel: pTcl_Channel; typ: integer); cdecl; external TCL_LIBRARY;
+    function  Tcl_SetChannelOption(interp: pTcl_Interp; chan: pTcl_Channel; optionName: PChar; newValue: PChar): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_GetChannelOption(interp: pTcl_Interp; chan: pTcl_Channel; optionName: PChar; dsPtr: pTcl_DString): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_CreateChannel(typePtr: pTcl_ChannelType; chanName: PChar;
+                                instanceData: Tcl_ClientData; mask: integer):pTcl_Channel; cdecl; external TCL_LIBRARY;
+    procedure Tcl_RegisterChannel(interp: pTcl_Interp; channel: pTcl_Channel); cdecl; external TCL_LIBRARY;
+    function  Tcl_UnregisterChannel(interp: pTcl_Interp; channel: pTcl_Channel): integer; cdecl; external TCL_LIBRARY;
+
+    procedure Tcl_CreateChannelHandler(chan: pTcl_Channel; mask: integer; proc: TTclChannelProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    function Tcl_GetChannel(interp: pTcl_Interp; chanName: PChar; modePtr: pInteger): pTcl_Channel; cdecl; external TCL_LIBRARY;
+    function Tcl_GetStdChannel(typ: integer): pTcl_Channel; cdecl; external TCL_LIBRARY;
+    function Tcl_Gets(chan: pTcl_Channel; dsPtr: pTcl_DString): integer; cdecl; external TCL_LIBRARY;
+    function Tcl_Write(chan: pTcl_Channel; s: PChar; slen: integer): integer; cdecl; external TCL_LIBRARY;
+    function Tcl_Flush(chan: pTcl_Channel): integer; cdecl; external TCL_LIBRARY;
+//    TclWinLoadLibrary      = function(name: PChar): HMODULE; cdecl; external TCL_LIBRARY;
+    procedure Tcl_CreateExitHandler(proc: TTclClientDataProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    procedure Tcl_DeleteExitHandler(proc: TTclClientDataProc; clientData: Tcl_ClientData); cdecl; external TCL_LIBRARY;
+    function  Tcl_GetStringFromObj(pObj: pTcl_Obj; pLen: pInteger): PChar; cdecl; external TCL_LIBRARY;
+    function  Tcl_CreateObjCommand(interp: pTcl_Interp; name: PChar; cmdProc: TTclObjCmdProc;
+                                   clientData: Tcl_ClientData; deleteProc: TTclCmdDeleteProc): pTcl_Command; cdecl; external TCL_LIBRARY;
+    function  Tcl_NewStringObj(bytes: PChar; len: integer): pTcl_Obj; cdecl; external TCL_LIBRARY;
+//    procedure TclFreeObj(pObj: pTcl_Obj); cdecl; external TCL_LIBRARY;
+    function  Tcl_EvalObj(interp: pTcl_Interp; pObj: pTcl_Obj): integer; cdecl; external TCL_LIBRARY;
+    function  Tcl_GlobalEvalObj(interp: pTcl_Interp; pObj: pTcl_Obj): integer; cdecl; external TCL_LIBRARY;
+    function  TclRegComp(exp: PChar): pointer; cdecl; external TCL_LIBRARY;
+    function  TclRegExec(prog: pointer; str: PChar; start: PChar): integer; cdecl; external TCL_LIBRARY;
+    procedure TclRegError(msg: PChar); cdecl; external TCL_LIBRARY;
+    function  TclGetRegError: PChar; cdecl; external TCL_LIBRARY;
+    procedure Tcl_RegExpRange(prog: pointer; index: integer; var head: PChar; var tail: PChar); cdecl; external TCL_LIBRARY;
+
+// C Macro Emulation
+    function  Tcl_GetCommandTable(interp: pTcl_Interp): pHashTable;
+    function  Tcl_CreateHashEntry(tablePtr: pTcl_HashTable; key: PChar; newPtr: pInteger): pTcl_HashEntry;
+    function  Tcl_FindHashEntry(tablePtr: pTcl_HashTable; key: PChar): pTcl_HashEntry;
+    procedure Tcl_SetHashValue(h: pTcl_HashEntry; clientData: Tcl_ClientData);
+    function  Tcl_GetHashValue(h: pTcl_HashEntry): Tcl_ClientData;
+    procedure Tcl_IncrRefCount(pObj: pTcl_Obj); cdecl; 
+    procedure Tcl_DecrRefCount(pObj: pTcl_Obj); cdecl; 
+    function  Tcl_IsShared(pObj: pTcl_Obj): integer; cdecl;
+
+{$IFDEF USE_C}
+    function ArgvItem(argv: PPChar; idx: integer): PChar; cdecl; external; // argv.c must be compiled by GCC
+{$ELSE}
+    function ArgvItem(argv: PPChar; idx: integer): PChar; cdecl;
+{$ENDIF}
+
+
+implementation
+uses SysUtils, Classes;
+
+
+// Macro emulation
+function Tcl_CreateHashEntry(tablePtr: pTcl_HashTable; key: PChar; newPtr: pInteger): pTcl_HashEntry;
+begin
+     result := pHashTable(tablePtr)^.createProc(tablePtr, key, newPtr);
+end;
+
+function Tcl_FindHashEntry(tablePtr: pTcl_HashTable; key: PChar): pTcl_HashEntry;
+begin
+     result := pHashTable(tablePtr)^.findProc(tablePtr, key);
+end;
+
+procedure Tcl_SetHashValue(h: pTcl_HashEntry; clientData: Tcl_ClientData);
+begin
+     h^.clientData := clientData;
+end;
+
+function Tcl_GetHashValue(h: pTcl_HashEntry): Tcl_ClientData;
+begin
+     result := h^.clientData;
+end;
+
+
+function _Tcl_GetHashKey(hashTbl: pTcl_HashTable; hashEntry: pTcl_HashEntry): PChar; cdecl;
+begin
+     if (hashTbl = nil) or (hashEntry = nil) then
+        result := nil
+     else if pHashTable(hashTbl)^.keyType = 1 then
+        result :=  PChar(pLongInt(@(hashEntry^.key[0]))^)
+     else
+        result := hashEntry^.key;
+end;
+
+
+procedure Tcl_IncrRefCount(pObj: pTcl_Obj); cdecl; 
+begin
+     inc(pObj^.refCount);
+end;
+
+procedure Tcl_DecrRefCount(pObj: pTcl_Obj); cdecl; 
+begin
+     dec(pObj^.refCount);
+     if pObj^.refCount <= 0 then
+        FreeMem(pObj);
+end;
+
+function Tcl_IsShared(pObj: pTcl_Obj): integer; cdecl; 
+begin
+     if pObj^.refCount > 0 then
+        result := 1
+     else
+        result := 0;
+end;
+
+
+function Tcl_GetCommandTable(interp: pTcl_Interp): pHashTable;
+begin
+     if interp = nil then
+        result := nil
+     else if TCL_VERSION_MAJOR >= 8 then // pretty sure it happened in this version
+        result := pHashTable(longint(interp) + sizeof(Tcl_Interp) + sizeof(pointer))
+     else
+        result := pHashTable(longint(interp) + sizeof(Tcl_Interp));
+end;
+
+{$IFNDEF USE_C}
+{*
+ *  Use this if you don't have the C compiler and you're on 
+ *  the Intel platform.
+ *  Otherwise define `USE_C` macro.
+ *}
+function ArgvItem(argv: PPChar; idx: integer): PChar; cdecl;
+var
+   Buf: LongWord;
+begin
+     asm
+        MOV   EAX,idx             //* index please 
+        MOV   EDX,[argv]          //* gotcha argv^ 
+        MOV   EAX,[EDX + EAX*4]   //* PChar is 32bit pointer, so EAX*4 its offset for
+                                  //* one item in array.
+                                  //* gotcha something like this: (argv^)^[idx]
+                                  //*
+        MOV   Buf,EAX
+     end;
+     ArgvItem:=PChar(Buf);
+end;
+{$ENDIF}
+
+end.
+

+ 117 - 0
packages/base/tcl/tcl_demo.pp

@@ -0,0 +1,117 @@
+{* tcl_demo.pas
+ * ------------------------------------------------
+ * Copyright 2002 by Bert Raccoon aka Max Artemev 
+ * ([email protected], [email protected])
+ * ------------------------------------------------
+ * Demo for tcl80.pas unit. 
+ * Creating the Tcl interpreter, executing file, registering 
+ * new commands, call a function defined in the script.
+ *
+ * Under Win32 can cause crash.
+ *}
+program test;
+
+uses tcl80, SysUtils;
+
+{*
+ * Function for testing that string is correct number
+ *}
+function is_num(const src: PChar): Boolean;
+var
+   i: integer;
+begin
+     is_num:=True;
+     i:=0;
+     repeat
+        is_num:=is_num and ((src + i)^  in ['0'..'9']);
+        inc(i);
+     until (src + i)^ = #0;
+end;
+
+function Test_max(clientData: Tcl_ClientData;  {* Some user defined data. *}
+                  interp: PTcl_Interp;         {* Pointer to Tcl interpreter *}
+                  argc: integer;               {* Arguments counter, arguments, etc *}
+                  argv: Tcl_Argv): longint;    {* Remeber! *NIX `integer` type is 16 bit! *} 
+                  cdecl;                       {* C calling convention *}
+var
+   arg    : PChar;
+   idx,
+   value,
+   maxVal : LongInt;
+begin
+     maxVal := 0; {* Zero variable. Very stupid comment? ;)) *}
+
+     {* The `max` can be done with at least two digits
+      * In ArgvItem(argv,0) passed function name
+      *}
+     if (argc < 3) then
+     begin
+          Tcl_AppendResult(interp, ['bad # arg: ', ArgvItem(argv,0), ' num1 num2 [..numN]', nil]);
+          {* Under Win32 calling of this function can cause crash *}
+
+          Test_max:=TCL_ERROR;         {* Error was occured *}
+          exit;                        {* Leave *}
+     end;
+
+     for idx := 1 to argc-1 do         {* In argv[0] passed function name, so 
+                                        * go from the first index, not zero. 
+                                        *}
+     begin
+          arg := ArgvItem(argv,idx);   {* get an argument *}
+          if (not is_num(arg)) then    {* Is right number? *}
+          begin
+               Tcl_AppendResult(interp,[' "', arg, '" is not a valid integer value']);
+               Test_max:=TCL_ERROR;    {* Error was occured *}
+               exit;                   {* leave *}
+          end;
+          Value:=StrToInt(arg);        {* Convert PChar->Integer *}
+          if (value > maxVal) then
+             maxVal := value;          {* Calculate maximum number *}
+     end;
+
+     {* Set the result for the our function.
+      * result type always is PChar
+      *}
+     Tcl_SetResult(interp, PChar(IntToStr(maxVal)), nil);
+
+     {* exit successful *}
+     Test_max:=TCL_OK;
+end;
+
+{*
+ *  Old and good known Pascal procedure :)
+ *}
+function Test_writeln(clientData: Tcl_ClientData; interp: pTcl_Interp; argc: integer; argv: Tcl_Argv): longint; cdecl;
+var
+   i: integer;
+   Buff: string;
+begin
+     Buff := '';
+     for i:=1 to argc-1 do
+       Buff:=Buff + ArgvItem(argv,i);  {* work around some bugs *}
+     writeln(Buff);                  
+     Test_writeln:=TCL_OK;
+end;
+
+
+var
+   interp: PTcl_Interp;
+   code: integer;
+begin
+     interp := Tcl_CreateInterp();  {* Create an interpreter *}
+     Tcl_Init(interp);              {* Initialize *}
+     
+     {* Register/override in the Tcl engine our new functions *}
+     Tcl_CreateCommand(interp,'max', TTclCmdProc(@Test_max),nil,nil);
+     Tcl_CreateCommand(interp,'writeln',TTclCmdProc(@Test_writeln),nil,nil);
+
+     code := Tcl_EvalFile(interp,'test.tcl');   {* Execute script *}
+     if (code <> TCL_OK) then                   {* Is all okay? *}
+        writeln(Tcl_GetStringResult(interp));
+
+     {* Call a function `foo` defined in the script *}
+     code := Tcl_VarEval(interp,['foo ','1 2 3',nil]); 
+     if (code <> TCL_OK) then
+        writeln(Tcl_GetStringResult(interp));
+     Tcl_DeleteInterp(interp);                  {* Release interpreter *}
+end.