Ver código fonte

make netware rtl compilable under 1.9.5

armin 21 anos atrás
pai
commit
8d1c71a835
6 arquivos alterados com 774 adições e 226 exclusões
  1. 173 83
      rtl/netware/Makefile
  2. 33 12
      rtl/netware/Makefile.fpc
  3. 377 36
      rtl/netware/sockets.pp
  4. 41 32
      rtl/netware/system.pp
  5. 140 56
      rtl/netware/systhrds.pp
  6. 10 7
      rtl/netware/tthread.inc

+ 173 - 83
rtl/netware/Makefile

@@ -1,15 +1,25 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 1.1 [2004/07/07]
+# Don't edit, this file is generated by FPCMake Version 1.1 [2004/07/22]
 #
 #
 default: all
 default: all
-MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx palmos macos darwin emx
-override PATH:=$(subst \,/,$(PATH))
+MAKEFILETARGETS=netware
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) sunos qnx
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
 ifeq ($(findstring ;,$(PATH)),)
 ifeq ($(findstring ;,$(PATH)),)
 inUnix=1
 inUnix=1
 SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
 SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
 else
 else
 SEARCHPATH:=$(subst ;, ,$(PATH))
 SEARCHPATH:=$(subst ;, ,$(PATH))
 endif
 endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
 PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
 PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
 ifeq ($(PWD),)
 ifeq ($(PWD),)
 PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
 PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
@@ -36,22 +46,13 @@ ifneq ($(findstring cygdrive,$(PATH)),)
 inCygWin=1
 inCygWin=1
 endif
 endif
 endif
 endif
-ifeq ($(OS_TARGET),freebsd)
-BSDhier=1
-endif
-ifeq ($(OS_TARGET),netbsd)
-BSDhier=1
-endif
-ifeq ($(OS_TARGET),openbsd)
-BSDhier=1
-endif
 ifdef inUnix
 ifdef inUnix
-BATCHEXT=.sh
+SRCBATCHEXT=.sh
 else
 else
 ifdef inOS2
 ifdef inOS2
-BATCHEXT=.cmd
+SRCBATCHEXT=.cmd
 else
 else
-BATCHEXT=.bat
+SRCBATCHEXT=.bat
 endif
 endif
 endif
 endif
 ifdef inUnix
 ifdef inUnix
@@ -155,6 +156,12 @@ ifeq ($(findstring $(OS_TARGET),$(MAKEFILETARGETS)),)
 $(error The Makefile doesn't support target $(OS_TARGET), please run fpcmake first)
 $(error The Makefile doesn't support target $(OS_TARGET), please run fpcmake first)
 endif
 endif
 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 CROSSCOMPILE
 export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE CROSSCOMPILE
 ifdef FPCDIR
 ifdef FPCDIR
 override FPCDIR:=$(subst \,/,$(FPCDIR))
 override FPCDIR:=$(subst \,/,$(FPCDIR))
@@ -184,11 +191,14 @@ override FPCDIR:=$(FPCDIR)/..
 ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 override FPCDIR:=$(FPCDIR)/..
 override FPCDIR:=$(FPCDIR)/..
 ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
 override FPCDIR=c:/pp
 override FPCDIR=c:/pp
 endif
 endif
 endif
 endif
 endif
 endif
 endif
 endif
+endif
 ifndef CROSSDIR
 ifndef CROSSDIR
 CROSSDIR:=$(FPCDIR)/cross/$(FULL_TARGET)
 CROSSDIR:=$(FPCDIR)/cross/$(FULL_TARGET)
 endif
 endif
@@ -218,9 +228,9 @@ override FPCOPT+=-Ur
 override FPCOPT+=-dMT
 override FPCOPT+=-dMT
 CREATESMART=0
 CREATESMART=0
 OBJPASDIR=$(RTL)/objpas
 OBJPASDIR=$(RTL)/objpas
-override TARGET_UNITS+=$(SYSTEMUNIT) systhrds objpas strings winsock dos crt objects matrix sysutils classes typinfo math cpu mmx getopts heaptrc lineinfo sockets aio varutils video mouse keyboard types nwsnut nwserv nwnit nwprot sysconst
+override TARGET_UNITS+=$(SYSTEMUNIT) systhrds objpas strings lineinfo winsock heaptrc matrix initc dos crt objects sysutils classes typinfo math varutils cpu mmx getopts   sockets video mouse keyboard types dateutils rtlconst sysconst strutils convutils aio nwsnut nwserv nwnit nwprot
 override TARGET_LOADERS+=nwpre prelude
 override TARGET_LOADERS+=nwpre prelude
-override TARGET_RSTS+=math typinfo varutils classes
+override TARGET_RSTS+=math varutils typinfo classes dateutils sysconst
 override INSTALL_FPCPACKAGE=y
 override INSTALL_FPCPACKAGE=y
 override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
 override COMPILER_INCLUDEDIR+=$(INC) $(PROCINC)
 override COMPILER_SOURCEDIR+=$(INC) $(PROCINC)
 override COMPILER_SOURCEDIR+=$(INC) $(PROCINC)
@@ -232,42 +242,12 @@ ifdef REQUIRE_PACKAGESDIR
 override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
 override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
 endif
 endif
 ifdef ZIPINSTALL
 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),openbsd)
-UNIXINSTALLDIR=1
-endif
-ifeq ($(OS_TARGET),sunos)
-UNIXINSTALLDIR=1
-endif
-ifeq ($(OS_TARGET),qnx)
-UNIXINSTALLDIR=1
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
 endif
 endif
 else
 else
-ifeq ($(OS_SOURCE),linux)
-UNIXINSTALLDIR=1
-endif
-ifeq ($(OS_SOURCE),freebsd)
-UNIXINSTALLDIR=1
-endif
-ifeq ($(OS_SOURCE),netbsd)
-UNIXINSTALLDIR=1
-endif
-ifeq ($(OS_SOURCE),openbsd)
-UNIXINSTALLDIR=1
-endif
-ifeq ($(OS_TARGET),sunos)
-UNIXINSTALLDIR=1
-endif
-ifeq ($(OS_TARGET),qnx)
-UNIXINSTALLDIR=1
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
 endif
 endif
 endif
 endif
 ifndef INSTALL_PREFIX
 ifndef INSTALL_PREFIX
@@ -276,7 +256,7 @@ INSTALL_PREFIX=$(PREFIX)
 endif
 endif
 endif
 endif
 ifndef INSTALL_PREFIX
 ifndef INSTALL_PREFIX
-ifdef UNIXINSTALLDIR
+ifdef UNIXHier
 INSTALL_PREFIX=/usr/local
 INSTALL_PREFIX=/usr/local
 else
 else
 ifdef INSTALL_FPCPACKAGE
 ifdef INSTALL_FPCPACKAGE
@@ -295,7 +275,7 @@ DIST_DESTDIR:=$(BASEDIR)
 endif
 endif
 export DIST_DESTDIR
 export DIST_DESTDIR
 ifndef INSTALL_BASEDIR
 ifndef INSTALL_BASEDIR
-ifdef UNIXINSTALLDIR
+ifdef UNIXHier
 ifdef INSTALL_FPCPACKAGE
 ifdef INSTALL_FPCPACKAGE
 INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
 INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
 else
 else
@@ -306,10 +286,18 @@ INSTALL_BASEDIR:=$(INSTALL_PREFIX)
 endif
 endif
 endif
 endif
 ifndef INSTALL_BINDIR
 ifndef INSTALL_BINDIR
-ifdef UNIXINSTALLDIR
+ifdef UNIXHier
+ifdef CROSSCOMPILE
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/bin
+else
 INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
 INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+endif
+else
+ifdef CROSSCOMPILE
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/bin
 else
 else
 INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
 INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+endif
 ifdef INSTALL_FPCPACKAGE
 ifdef INSTALL_FPCPACKAGE
 INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(OS_TARGET)
 INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(OS_TARGET)
 endif
 endif
@@ -328,19 +316,23 @@ endif
 endif
 endif
 endif
 endif
 ifndef INSTALL_LIBDIR
 ifndef INSTALL_LIBDIR
-ifdef UNIXINSTALLDIR
+ifdef UNIXHier
 INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
 INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
 else
 else
 INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
 INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
 endif
 endif
 endif
 endif
 ifndef INSTALL_SOURCEDIR
 ifndef INSTALL_SOURCEDIR
-ifdef UNIXINSTALLDIR
+ifdef UNIXHier
 ifdef BSDhier
 ifdef BSDhier
 SRCPREFIXDIR=share/src
 SRCPREFIXDIR=share/src
 else
 else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
 SRCPREFIXDIR=src
 SRCPREFIXDIR=src
 endif
 endif
+endif
 ifdef INSTALL_FPCPACKAGE
 ifdef INSTALL_FPCPACKAGE
 ifdef INSTALL_FPCSUBDIR
 ifdef INSTALL_FPCSUBDIR
 INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
 INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
@@ -363,12 +355,16 @@ endif
 endif
 endif
 endif
 endif
 ifndef INSTALL_DOCDIR
 ifndef INSTALL_DOCDIR
-ifdef UNIXINSTALLDIR
+ifdef UNIXHier
 ifdef BSDhier
 ifdef BSDhier
 DOCPREFIXDIR=share/doc
 DOCPREFIXDIR=share/doc
 else
 else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
 DOCPREFIXDIR=doc
 DOCPREFIXDIR=doc
 endif
 endif
+endif
 ifdef INSTALL_FPCPACKAGE
 ifdef INSTALL_FPCPACKAGE
 INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
 INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
 else
 else
@@ -383,20 +379,28 @@ endif
 endif
 endif
 endif
 endif
 ifndef INSTALL_EXAMPLEDIR
 ifndef INSTALL_EXAMPLEDIR
-ifdef UNIXINSTALLDIR
+ifdef UNIXHier
 ifdef INSTALL_FPCPACKAGE
 ifdef INSTALL_FPCPACKAGE
 ifdef BSDhier
 ifdef BSDhier
 INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
 INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
 else
 else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
 INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
 INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
 endif
 endif
+endif
 else
 else
 ifdef BSDhier
 ifdef BSDhier
 INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
 INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
 else
 else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
 INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
 INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
 endif
 endif
 endif
 endif
+endif
 else
 else
 ifdef INSTALL_FPCPACKAGE
 ifdef INSTALL_FPCPACKAGE
 INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
 INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
@@ -418,6 +422,7 @@ endif
 else
 else
 CROSSBINDIR=
 CROSSBINDIR=
 endif
 endif
+BATCHEXT=.bat
 LOADEREXT=.as
 LOADEREXT=.as
 EXEEXT=.exe
 EXEEXT=.exe
 PPLEXT=.ppl
 PPLEXT=.ppl
@@ -441,25 +446,37 @@ STATICLIBPREFIX=
 FPCMADE=fpcmade.dos
 FPCMADE=fpcmade.dos
 ZIPSUFFIX=go32
 ZIPSUFFIX=go32
 endif
 endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+FPCMADE=fpcmade.wat
+ZIPSUFFIX=watc
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+endif
 ifeq ($(OS_TARGET),linux)
 ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.lnx
 FPCMADE=fpcmade.lnx
 ZIPSUFFIX=linux
 ZIPSUFFIX=linux
 endif
 endif
 ifeq ($(OS_TARGET),freebsd)
 ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.freebsd
 FPCMADE=fpcmade.freebsd
 ZIPSUFFIX=freebsd
 ZIPSUFFIX=freebsd
 endif
 endif
 ifeq ($(OS_TARGET),netbsd)
 ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.netbsd
 FPCMADE=fpcmade.netbsd
 ZIPSUFFIX=netbsd
 ZIPSUFFIX=netbsd
 endif
 endif
 ifeq ($(OS_TARGET),openbsd)
 ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.openbsd
 FPCMADE=fpcmade.openbsd
@@ -471,6 +488,7 @@ FPCMADE=fpcmade.w32
 ZIPSUFFIX=w32
 ZIPSUFFIX=w32
 endif
 endif
 ifeq ($(OS_TARGET),os2)
 ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
 AOUTEXT=.out
 AOUTEXT=.out
 STATICLIBPREFIX=
 STATICLIBPREFIX=
 SHAREDLIBEXT=.dll
 SHAREDLIBEXT=.dll
@@ -479,6 +497,7 @@ ZIPSUFFIX=os2
 ECHO=echo
 ECHO=echo
 endif
 endif
 ifeq ($(OS_TARGET),emx)
 ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
 AOUTEXT=.out
 AOUTEXT=.out
 STATICLIBPREFIX=
 STATICLIBPREFIX=
 SHAREDLIBEXT=.dll
 SHAREDLIBEXT=.dll
@@ -491,21 +510,29 @@ EXEEXT=
 SHAREDLIBEXT=.library
 SHAREDLIBEXT=.library
 FPCMADE=fpcmade.amg
 FPCMADE=fpcmade.amg
 endif
 endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+FPCMADE=fpcmade.mos
+endif
 ifeq ($(OS_TARGET),atari)
 ifeq ($(OS_TARGET),atari)
 EXEEXT=.ttp
 EXEEXT=.ttp
 FPCMADE=fpcmade.ata
 FPCMADE=fpcmade.ata
 endif
 endif
 ifeq ($(OS_TARGET),beos)
 ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 FPCMADE=fpcmade.be
 FPCMADE=fpcmade.be
 ZIPSUFFIX=be
 ZIPSUFFIX=be
 endif
 endif
 ifeq ($(OS_TARGET),sunos)
 ifeq ($(OS_TARGET),sunos)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 FPCMADE=fpcmade.sun
 FPCMADE=fpcmade.sun
 ZIPSUFFIX=sun
 ZIPSUFFIX=sun
 endif
 endif
 ifeq ($(OS_TARGET),qnx)
 ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 FPCMADE=fpcmade.qnx
 FPCMADE=fpcmade.qnx
 ZIPSUFFIX=qnx
 ZIPSUFFIX=qnx
@@ -517,10 +544,14 @@ FPCMADE=fpcmade.nw
 ZIPSUFFIX=nw
 ZIPSUFFIX=nw
 endif
 endif
 ifeq ($(OS_TARGET),macos)
 ifeq ($(OS_TARGET),macos)
+BATCHEXT=
 EXEEXT=
 EXEEXT=
-FPCMADE=fpcmade.mcc
+FPCMADE=fpcmade.macos
+ZIPSUFFIX=macos
+DEBUGSYMEXT=.xcoff
 endif
 endif
 ifeq ($(OS_TARGET),darwin)
 ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.darwin
 FPCMADE=fpcmade.darwin
@@ -543,25 +574,34 @@ STATICLIBPREFIX=
 FPCMADE=fpcmade.dos
 FPCMADE=fpcmade.dos
 ZIPSUFFIX=go32
 ZIPSUFFIX=go32
 endif
 endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+FPCMADE=fpcmade.dos
+ZIPSUFFIX=watcom
+endif
 ifeq ($(OS_TARGET),linux)
 ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.lnx
 FPCMADE=fpcmade.lnx
 ZIPSUFFIX=linux
 ZIPSUFFIX=linux
 endif
 endif
 ifeq ($(OS_TARGET),freebsd)
 ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.freebsd
 FPCMADE=fpcmade.freebsd
 ZIPSUFFIX=freebsd
 ZIPSUFFIX=freebsd
 endif
 endif
 ifeq ($(OS_TARGET),netbsd)
 ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.netbsd
 FPCMADE=fpcmade.netbsd
 ZIPSUFFIX=netbsd
 ZIPSUFFIX=netbsd
 endif
 endif
 ifeq ($(OS_TARGET),openbsd)
 ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
 EXEEXT=
 EXEEXT=
 HASSHAREDLIB=1
 HASSHAREDLIB=1
 FPCMADE=fpcmade.openbsd
 FPCMADE=fpcmade.openbsd
@@ -578,6 +618,7 @@ FPCMADE=fpcmade.w32
 ZIPSUFFIX=w32
 ZIPSUFFIX=w32
 endif
 endif
 ifeq ($(OS_TARGET),os2)
 ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
 PPUEXT=.ppo
 PPUEXT=.ppo
 ASMEXT=.so2
 ASMEXT=.so2
 OEXT=.oo2
 OEXT=.oo2
@@ -610,6 +651,7 @@ EXEEXT=.ttp
 FPCMADE=fpcmade.ata
 FPCMADE=fpcmade.ata
 endif
 endif
 ifeq ($(OS_TARGET),beos)
 ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
 PPUEXT=.ppu
 PPUEXT=.ppu
 ASMEXT=.s
 ASMEXT=.s
 OEXT=.o
 OEXT=.o
@@ -620,6 +662,7 @@ FPCMADE=fpcmade.be
 ZIPSUFFIX=be
 ZIPSUFFIX=be
 endif
 endif
 ifeq ($(OS_TARGET),sunos)
 ifeq ($(OS_TARGET),sunos)
+BATCHEXT=.sh
 PPUEXT=.ppu
 PPUEXT=.ppu
 ASMEXT=.s
 ASMEXT=.s
 OEXT=.o
 OEXT=.o
@@ -630,6 +673,7 @@ FPCMADE=fpcmade.sun
 ZIPSUFFIX=sun
 ZIPSUFFIX=sun
 endif
 endif
 ifeq ($(OS_TARGET),qnx)
 ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
 PPUEXT=.ppu
 PPUEXT=.ppu
 ASMEXT=.s
 ASMEXT=.s
 OEXT=.o
 OEXT=.o
@@ -652,13 +696,15 @@ ZIPSUFFIX=nw
 EXEEXT=.nlm
 EXEEXT=.nlm
 endif
 endif
 ifeq ($(OS_TARGET),macos)
 ifeq ($(OS_TARGET),macos)
+BATCHEXT=
 PPUEXT=.ppu
 PPUEXT=.ppu
 ASMEXT=.s
 ASMEXT=.s
 OEXT=.o
 OEXT=.o
 SMARTEXT=.sl
 SMARTEXT=.sl
 STATICLIBEXT=.a
 STATICLIBEXT=.a
 EXEEXT=
 EXEEXT=
-FPCMADE=fpcmade.mcc
+DEBUGSYMEXT=.xcoff
+FPCMADE=fpcmade.macos
 endif
 endif
 endif
 endif
 ifndef ECHO
 ifndef ECHO
@@ -666,7 +712,7 @@ ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(ECHO),)
 ifeq ($(ECHO),)
 ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
 ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(ECHO),)
 ifeq ($(ECHO),)
-ECHO=
+ECHO= __missing_command__
 else
 else
 ECHO:=$(firstword $(ECHO))
 ECHO:=$(firstword $(ECHO))
 endif
 endif
@@ -680,7 +726,7 @@ DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(DATE),)
 ifeq ($(DATE),)
 DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
 DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(DATE),)
 ifeq ($(DATE),)
-DATE=
+DATE= __missing_command__
 else
 else
 DATE:=$(firstword $(DATE))
 DATE:=$(firstword $(DATE))
 endif
 endif
@@ -694,7 +740,7 @@ GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(GINSTALL),)
 ifeq ($(GINSTALL),)
 GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
 GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(GINSTALL),)
 ifeq ($(GINSTALL),)
-GINSTALL=
+GINSTALL= __missing_command__
 else
 else
 GINSTALL:=$(firstword $(GINSTALL))
 GINSTALL:=$(firstword $(GINSTALL))
 endif
 endif
@@ -706,7 +752,7 @@ export GINSTALL
 ifndef CPPROG
 ifndef CPPROG
 CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
 CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(CPPROG),)
 ifeq ($(CPPROG),)
-CPPROG=
+CPPROG= __missing_command__
 else
 else
 CPPROG:=$(firstword $(CPPROG))
 CPPROG:=$(firstword $(CPPROG))
 endif
 endif
@@ -715,7 +761,7 @@ export CPPROG
 ifndef RMPROG
 ifndef RMPROG
 RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
 RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(RMPROG),)
 ifeq ($(RMPROG),)
-RMPROG=
+RMPROG= __missing_command__
 else
 else
 RMPROG:=$(firstword $(RMPROG))
 RMPROG:=$(firstword $(RMPROG))
 endif
 endif
@@ -724,14 +770,18 @@ export RMPROG
 ifndef MVPROG
 ifndef MVPROG
 MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
 MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(MVPROG),)
 ifeq ($(MVPROG),)
-MVPROG=
+MVPROG= __missing_command__
 else
 else
 MVPROG:=$(firstword $(MVPROG))
 MVPROG:=$(firstword $(MVPROG))
 endif
 endif
 endif
 endif
 export MVPROG
 export MVPROG
 ifndef ECHOREDIR
 ifndef ECHOREDIR
-ECHOREDIR:=$(subst /,$(PATHSEP),$(ECHO))
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
 endif
 endif
 ifndef COPY
 ifndef COPY
 COPY:=$(CPPROG) -fp
 COPY:=$(CPPROG) -fp
@@ -769,7 +819,7 @@ export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
 ifndef PPUMOVE
 ifndef PPUMOVE
 PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
 PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(PPUMOVE),)
 ifeq ($(PPUMOVE),)
-PPUMOVE=
+PPUMOVE= __missing_command__
 else
 else
 PPUMOVE:=$(firstword $(PPUMOVE))
 PPUMOVE:=$(firstword $(PPUMOVE))
 endif
 endif
@@ -778,7 +828,7 @@ export PPUMOVE
 ifndef FPCMAKE
 ifndef FPCMAKE
 FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
 FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(FPCMAKE),)
 ifeq ($(FPCMAKE),)
-FPCMAKE=
+FPCMAKE= __missing_command__
 else
 else
 FPCMAKE:=$(firstword $(FPCMAKE))
 FPCMAKE:=$(firstword $(FPCMAKE))
 endif
 endif
@@ -787,7 +837,7 @@ export FPCMAKE
 ifndef ZIPPROG
 ifndef ZIPPROG
 ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
 ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(ZIPPROG),)
 ifeq ($(ZIPPROG),)
-ZIPPROG=
+ZIPPROG= __missing_command__
 else
 else
 ZIPPROG:=$(firstword $(ZIPPROG))
 ZIPPROG:=$(firstword $(ZIPPROG))
 endif
 endif
@@ -796,21 +846,25 @@ export ZIPPROG
 ifndef TARPROG
 ifndef TARPROG
 TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
 TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
 ifeq ($(TARPROG),)
 ifeq ($(TARPROG),)
-TARPROG=
+TARPROG= __missing_command__
 else
 else
 TARPROG:=$(firstword $(TARPROG))
 TARPROG:=$(firstword $(TARPROG))
 endif
 endif
 endif
 endif
 export TARPROG
 export TARPROG
-ASNAME=as
-LDNAME=ld
-ARNAME=ar
-RCNAME=rc
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
 ifeq ($(OS_TARGET),win32)
 ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
 ASNAME=asw
 ASNAME=asw
 LDNAME=ldw
 LDNAME=ldw
 ARNAME=arw
 ARNAME=arw
 endif
 endif
+endif
+endif
 ifndef ASPROG
 ifndef ASPROG
 ifdef CROSSBINDIR
 ifdef CROSSBINDIR
 ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
 ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
@@ -843,7 +897,7 @@ AS=$(ASPROG)
 LD=$(LDPROG)
 LD=$(LDPROG)
 RC=$(RCPROG)
 RC=$(RCPROG)
 AR=$(ARPROG)
 AR=$(ARPROG)
-PPAS=ppas$(BATCHEXT)
+PPAS=ppas$(SRCBATCHEXT)
 ifdef inUnix
 ifdef inUnix
 LDCONFIG=ldconfig
 LDCONFIG=ldconfig
 else
 else
@@ -891,6 +945,14 @@ endif
 ifeq ($(OS_SOURCE),openbsd)
 ifeq ($(OS_SOURCE),openbsd)
 override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
 override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
 endif
 endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX) -Xc
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
 ifdef UNITDIR
 ifdef UNITDIR
 override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
 override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
 endif
 endif
@@ -917,8 +979,12 @@ ifdef RELEASE
 ifeq ($(CPU_TARGET),i386)
 ifeq ($(CPU_TARGET),i386)
 FPCCPUOPT:=-OG2p3
 FPCCPUOPT:=-OG2p3
 else
 else
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1
+else
 FPCCPUOPT:=
 FPCCPUOPT:=
 endif
 endif
+endif
 override FPCOPT+=-Xs $(FPCCPUOPT) -n
 override FPCOPT+=-Xs $(FPCCPUOPT) -n
 override FPCOPTDEF+=RELEASE
 override FPCOPTDEF+=RELEASE
 endif
 endif
@@ -1000,7 +1066,7 @@ EXECPPAS:=@$(PPAS)
 endif
 endif
 endif
 endif
 .PHONY: fpc_loaders
 .PHONY: fpc_loaders
-ifdef TARGET_LOADERS
+ifneq ($(TARGET_LOADERS),)
 override ALLTARGET+=fpc_loaders
 override ALLTARGET+=fpc_loaders
 override CLEANTARGET+=fpc_loaders_clean
 override CLEANTARGET+=fpc_loaders_clean
 override INSTALLTARGET+=fpc_loaders_install
 override INSTALLTARGET+=fpc_loaders_install
@@ -1015,7 +1081,7 @@ fpc_loaders_install:
 	$(MKDIR) $(INSTALL_UNITDIR)
 	$(MKDIR) $(INSTALL_UNITDIR)
 	$(INSTALL) $(LOADEROFILES) $(INSTALL_UNITDIR)
 	$(INSTALL) $(LOADEROFILES) $(INSTALL_UNITDIR)
 .PHONY: fpc_units
 .PHONY: fpc_units
-ifdef TARGET_UNITS
+ifneq ($(TARGET_UNITS),)
 override ALLTARGET+=fpc_units
 override ALLTARGET+=fpc_units
 override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
 override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
 override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
 override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
@@ -1037,7 +1103,7 @@ fpc_debug:
 	$(MAKE) all DEBUG=1
 	$(MAKE) all DEBUG=1
 fpc_release:
 fpc_release:
 	$(MAKE) all RELEASE=1
 	$(MAKE) all RELEASE=1
-.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp .rc .res
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .dpr .pp .rc .res
 %$(PPUEXT): %.pp
 %$(PPUEXT): %.pp
 	$(COMPILER) $<
 	$(COMPILER) $<
 	$(EXECPPAS)
 	$(EXECPPAS)
@@ -1050,10 +1116,14 @@ fpc_release:
 %$(EXEEXT): %.pas
 %$(EXEEXT): %.pas
 	$(COMPILER) $<
 	$(COMPILER) $<
 	$(EXECPPAS)
 	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
 %.res: %.rc
 %.res: %.rc
 	windres -i $< -o $@
 	windres -i $< -o $@
 vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
 vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
 vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
 vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
 vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
 vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
 .PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
 .PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
 ifdef INSTALL_UNITS
 ifdef INSTALL_UNITS
@@ -1130,6 +1200,9 @@ override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
 endif
 endif
 ifdef CLEANPPUFILES
 ifdef CLEANPPUFILES
 override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
 override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES)) 
+endif
 override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
 override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
 override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
 override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
 endif
 endif
@@ -1153,6 +1226,7 @@ ifdef LIB_NAME
 	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
 	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
 endif
 endif
 	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
 	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
 fpc_distclean: clean
 fpc_distclean: clean
 ifdef COMPILER_UNITTARGETDIR
 ifdef COMPILER_UNITTARGETDIR
 TARGETDIRCLEAN=fpc_clean
 TARGETDIRCLEAN=fpc_clean
@@ -1164,9 +1238,13 @@ endif
 	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
 	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
 	-$(DELTREE) *$(SMARTEXT)
 	-$(DELTREE) *$(SMARTEXT)
 	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
 	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
 ifdef AOUTEXT
 ifdef AOUTEXT
 	-$(DEL) *$(AOUTEXT)
 	-$(DEL) *$(AOUTEXT)
 endif
 endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
 .PHONY: fpc_baseinfo
 .PHONY: fpc_baseinfo
 override INFORULES+=fpc_baseinfo
 override INFORULES+=fpc_baseinfo
 fpc_baseinfo:
 fpc_baseinfo:
@@ -1309,11 +1387,13 @@ objpas$(PPUEXT): $(OBJPASDIR)/objpas.pp $(INC)/except.inc $(SYSTEMUNIT)$(PPUEXT)
 strings$(PPUEXT) : $(INC)/strings.pp $(INC)/stringsi.inc\
 strings$(PPUEXT) : $(INC)/strings.pp $(INC)/stringsi.inc\
 		   $(PROCINC)/strings.inc $(PROCINC)/stringss.inc\
 		   $(PROCINC)/strings.inc $(PROCINC)/stringss.inc\
 		   $(SYSTEMUNIT)$(PPUEXT)
 		   $(SYSTEMUNIT)$(PPUEXT)
+systhrds$(PPUEXT): systhrds.pp $(INC)/threadh.inc $(SYSTEMUNIT)$(PPUEXT) objpas$(PPUEXT)
 netware$(PPUEXT) : netware.pp $(SYSTEMUNIT)$(PPUEXT)
 netware$(PPUEXT) : netware.pp $(SYSTEMUNIT)$(PPUEXT)
 	$(COMPILER) -I$(WININC) netware.pp
 	$(COMPILER) -I$(WININC) netware.pp
 winsock2$(PPUEXT) : winsock2.pp qos.inc netware$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 winsock2$(PPUEXT) : winsock2.pp qos.inc netware$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 sockets$(PPUEXT) : sockets.pp netware$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
 sockets$(PPUEXT) : sockets.pp netware$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
 		   $(INC)/sockets.inc $(INC)/socketsh.inc
 		   $(INC)/sockets.inc $(INC)/socketsh.inc
+initc$(PPUEXT) : initc.pp $(SYSTEMUNIT)$(PPUEXT)
 dos$(PPUEXT) : dos.pp $(INC)/filerec.inc $(INC)/textrec.inc strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 dos$(PPUEXT) : dos.pp $(INC)/filerec.inc $(INC)/textrec.inc strings$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 crt$(PPUEXT) : crt.pp $(INC)/textrec.inc $(SYSTEMUNIT)$(PPUEXT) objpas$(PPUEXT) dos$(PPUEXT)
 crt$(PPUEXT) : crt.pp $(INC)/textrec.inc $(SYSTEMUNIT)$(PPUEXT) objpas$(PPUEXT) dos$(PPUEXT)
 objects$(PPUEXT) : $(INC)/objects.pp $(SYSTEMUNIT)$(PPUEXT)
 objects$(PPUEXT) : $(INC)/objects.pp $(SYSTEMUNIT)$(PPUEXT)
@@ -1321,7 +1401,7 @@ sysutils$(PPUEXT) : sysutils.pp $(wildcard $(OBJPASDIR)/sysutils/*.inc) \
 		    objpas$(PPUEXT) dos$(PPUEXT) nwsys.inc sysconst$(PPUEXT)
 		    objpas$(PPUEXT) dos$(PPUEXT) nwsys.inc sysconst$(PPUEXT)
 	$(COMPILER) -Fi$(OBJPASDIR)/sysutils sysutils.pp
 	$(COMPILER) -Fi$(OBJPASDIR)/sysutils sysutils.pp
 classes$(PPUEXT) : classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
 classes$(PPUEXT) : classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
-		   sysutils$(PPUEXT) typinfo$(PPUEXT)
+		   sysutils$(PPUEXT) typinfo$(PPUEXT) rtlconst$(PPUEXT) sysconst$(PPUEXT)
 	$(COMPILER) -Fi$(OBJPASDIR)/classes classes.pp
 	$(COMPILER) -Fi$(OBJPASDIR)/classes classes.pp
 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT)
 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT)
 	$(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp
 	$(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp
@@ -1329,11 +1409,21 @@ math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT)
 	$(COMPILER) $(OBJPASDIR)/math.pp
 	$(COMPILER) $(OBJPASDIR)/math.pp
 gettext$(PPUEXT): $(OBJPASDIR)/gettext.pp objpas$(PPUEXT) sysutils$(PPUEXT)
 gettext$(PPUEXT): $(OBJPASDIR)/gettext.pp objpas$(PPUEXT) sysutils$(PPUEXT)
 	$(COMPILER) $(OBJPASDIR)/gettext.pp
 	$(COMPILER) $(OBJPASDIR)/gettext.pp
-varutils$(PPUEXT) : $(OBJPASDIR)/cvarutil.inc $(OBJPASDIR)/varutils.inc \
-		    $(OBJPASDIR)/varutilh.inc varutils.pp
-	$(COMPILER) -I$(OBJPASDIR) $(UNIXINC)/varutils.pp
+varutils$(PPUEXT) : varutils.pp $(OBJPASDIR)/cvarutil.inc \
+		    objpas$(PPUEXT) $(OBJPASDIR)/varutilh.inc
+	$(COMPILER) -I$(OBJPASDIR) varutils.pp
 types$(PPUEXT) : $(OBJPASDIR/types.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 types$(PPUEXT) : $(OBJPASDIR/types.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 	$(COMPILER) $(OBJPASDIR)/types.pp
 	$(COMPILER) $(OBJPASDIR)/types.pp
+rtlconst$(PPUEXT) : $(OBJPASDIR)/rtlconst.pp
+	$(COMPILER) $(OBJPASDIR)/rtlconst.pp
+sysconst$(PPUEXT) : $(OBJPASDIR)/sysconst.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+	$(COMPILER) $(OBJPASDIR)/sysconst.pp
+dateutils$(PPUEXT) : $(OBJPASDIR)/dateutils.pp
+	$(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/dateutils.pp
+convutils$(PPUEXT) : $(OBJPASDIR)/convutils.pp
+	$(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/convutils.pp
+strutils$(PPUEXT) : $(OBJPASDIR)/strutils.pp
+	$(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/strutils.pp
 cpu$(PPUEXT) : $(PROCINC)/cpu.pp $(SYSTEMUNIT)$(PPUEXT)
 cpu$(PPUEXT) : $(PROCINC)/cpu.pp $(SYSTEMUNIT)$(PPUEXT)
 mmx$(PPUEXT) : $(PROCINC)/mmx.pp cpu$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 mmx$(PPUEXT) : $(PROCINC)/mmx.pp cpu$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 getopts$(PPUEXT) : $(INC)/getopts.pp $(SYSTEMUNIT)$(PPUEXT)
 getopts$(PPUEXT) : $(INC)/getopts.pp $(SYSTEMUNIT)$(PPUEXT)

+ 33 - 12
rtl/netware/Makefile.fpc

@@ -8,14 +8,15 @@ main=rtl
 [target]
 [target]
 loaders=nwpre prelude
 loaders=nwpre prelude
 units=$(SYSTEMUNIT) systhrds objpas strings \
 units=$(SYSTEMUNIT) systhrds objpas strings \
-      winsock \
-      dos crt objects matrix \
-      sysutils classes typinfo math \
-      cpu mmx getopts heaptrc lineinfo \
-      sockets aio varutils \
-      video mouse keyboard types \
-      nwsnut nwserv nwnit nwprot sysconst
-rsts=math typinfo varutils classes
+      lineinfo winsock heaptrc matrix initc \
+      dos crt objects \
+      sysutils classes typinfo math varutils \
+      cpu mmx getopts   \
+      sockets \
+      video mouse keyboard types dateutils rtlconst sysconst \
+      strutils convutils \
+      aio nwsnut nwserv nwnit nwprot
+rsts=math varutils typinfo classes dateutils sysconst
 
 
 [require]
 [require]
 nortl=y
 nortl=y
@@ -111,6 +112,7 @@ objpas$(PPUEXT): $(OBJPASDIR)/objpas.pp $(INC)/except.inc $(SYSTEMUNIT)$(PPUEXT)
 strings$(PPUEXT) : $(INC)/strings.pp $(INC)/stringsi.inc\
 strings$(PPUEXT) : $(INC)/strings.pp $(INC)/stringsi.inc\
                    $(PROCINC)/strings.inc $(PROCINC)/stringss.inc\
                    $(PROCINC)/strings.inc $(PROCINC)/stringss.inc\
                    $(SYSTEMUNIT)$(PPUEXT)
                    $(SYSTEMUNIT)$(PPUEXT)
+systhrds$(PPUEXT): systhrds.pp $(INC)/threadh.inc $(SYSTEMUNIT)$(PPUEXT) objpas$(PPUEXT)
 
 
 #
 #
 # System Dependent Units
 # System Dependent Units
@@ -127,6 +129,9 @@ sockets$(PPUEXT) : sockets.pp netware$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) \
 
 
 #dynlibs$(PPUEXT) : $(INC)/dynlibs.pp windows$(PPUEXT)
 #dynlibs$(PPUEXT) : $(INC)/dynlibs.pp windows$(PPUEXT)
 
 
+initc$(PPUEXT) : initc.pp $(SYSTEMUNIT)$(PPUEXT)
+
+
 #
 #
 # TP7 Compatible RTL Units
 # TP7 Compatible RTL Units
 #
 #
@@ -146,7 +151,7 @@ sysutils$(PPUEXT) : sysutils.pp $(wildcard $(OBJPASDIR)/sysutils/*.inc) \
         $(COMPILER) -Fi$(OBJPASDIR)/sysutils sysutils.pp
         $(COMPILER) -Fi$(OBJPASDIR)/sysutils sysutils.pp
 
 
 classes$(PPUEXT) : classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
 classes$(PPUEXT) : classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
-                   sysutils$(PPUEXT) typinfo$(PPUEXT)
+                   sysutils$(PPUEXT) typinfo$(PPUEXT) rtlconst$(PPUEXT) sysconst$(PPUEXT)
         $(COMPILER) -Fi$(OBJPASDIR)/classes classes.pp
         $(COMPILER) -Fi$(OBJPASDIR)/classes classes.pp
 
 
 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT)
 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT)
@@ -158,13 +163,29 @@ math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT)
 gettext$(PPUEXT): $(OBJPASDIR)/gettext.pp objpas$(PPUEXT) sysutils$(PPUEXT)
 gettext$(PPUEXT): $(OBJPASDIR)/gettext.pp objpas$(PPUEXT) sysutils$(PPUEXT)
         $(COMPILER) $(OBJPASDIR)/gettext.pp
         $(COMPILER) $(OBJPASDIR)/gettext.pp
 
 
-varutils$(PPUEXT) : $(OBJPASDIR)/cvarutil.inc $(OBJPASDIR)/varutils.inc \
-                    $(OBJPASDIR)/varutilh.inc varutils.pp
-        $(COMPILER) -I$(OBJPASDIR) $(UNIXINC)/varutils.pp
+varutils$(PPUEXT) : varutils.pp $(OBJPASDIR)/cvarutil.inc \
+                    objpas$(PPUEXT) $(OBJPASDIR)/varutilh.inc
+        $(COMPILER) -I$(OBJPASDIR) varutils.pp
 
 
 types$(PPUEXT) : $(OBJPASDIR/types.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 types$(PPUEXT) : $(OBJPASDIR/types.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
         $(COMPILER) $(OBJPASDIR)/types.pp
         $(COMPILER) $(OBJPASDIR)/types.pp
 
 
+rtlconst$(PPUEXT) : $(OBJPASDIR)/rtlconst.pp
+        $(COMPILER) $(OBJPASDIR)/rtlconst.pp
+
+sysconst$(PPUEXT) : $(OBJPASDIR)/sysconst.pp objpas$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
+        $(COMPILER) $(OBJPASDIR)/sysconst.pp
+
+dateutils$(PPUEXT) : $(OBJPASDIR)/dateutils.pp
+        $(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/dateutils.pp
+
+convutils$(PPUEXT) : $(OBJPASDIR)/convutils.pp
+        $(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/convutils.pp
+
+strutils$(PPUEXT) : $(OBJPASDIR)/strutils.pp
+        $(COMPILER) -I$(OBJPASDIR) $(OBJPASDIR)/strutils.pp
+
+
 #
 #
 # Other system-independent RTL Units
 # Other system-independent RTL Units
 #
 #

+ 377 - 36
rtl/netware/sockets.pp

@@ -17,9 +17,25 @@ unit Sockets;
 
 
 Interface
 Interface
 
 
+{$macro on}
+{$define maybelibc:=}
+
+
   Uses
   Uses
      winsock;
      winsock;
 
 
+Type
+  cushort=word;
+  cuint16=word;
+  cuint32=cardinal;
+  size_t =cuint32;
+  ssize_t=cuint16;
+  cint   =longint;
+  pcint  =^cint;
+  tsocklen=cint;
+  psocklen=^tsocklen;
+
+
   Const
   Const
      AF_MAX          = WinSock.AF_MAX;
      AF_MAX          = WinSock.AF_MAX;
      PF_MAX          = AF_MAX;
      PF_MAX          = AF_MAX;
@@ -35,87 +51,78 @@ Implementation
 {******************************************************************************
 {******************************************************************************
                           Basic Socket Functions
                           Basic Socket Functions
 ******************************************************************************}
 ******************************************************************************}
-
-Function socket(Domain,SocketType,Protocol:Longint):Longint;
+(***
+Function fpsocket(Domain,SocketType,Protocol:Longint):Longint;
 begin
 begin
-  Socket:=WinSock.Socket(Domain,SocketType,ProtoCol);
-  if Socket<0 then
-    SocketError:=WSAGetLastError
+  fpSocket:=WinSock.Socket(Domain,SocketType,ProtoCol);
+  if fpSocket<0 then
+    fpSocketError:=WSAGetLastError
   else
   else
-    SocketError:=0;
+    fpSocketError:=0;
 end;
 end;
 
 
-Function CloseSocket(Sock:Longint):Longint;
+Function fpCloseSocket(s:cint):Longint;
 var i : longint;
 var i : longint;
 begin
 begin
-  i := Winsock.CloseSocket (Sock);
+  i := Winsock.CloseSocket (s);
   if i <> 0 then
   if i <> 0 then
   begin
   begin
     SocketError:=WSAGetLastError;
     SocketError:=WSAGetLastError;
-    CloseSocket := i;
+    fpCloseSocket := i;
   end else
   end else
   begin
   begin
-    CloseSocket := 0;
+    fpCloseSocket := 0;
     SocketError := 0;
     SocketError := 0;
   end;
   end;
 end;
 end;
 
 
-Function Send(Sock:Longint;const Buf;BufLen,Flags:Longint):Longint;
+Function fpSend(s:cint;const Buf;BufLen,Flags:Longint):Longint;
 begin
 begin
-  Send:=WinSock.Send(Sock,Buf,BufLen,Flags);
-  if Send<0 then
+  fpSend:=WinSock.Send(s,Buf,BufLen,Flags);
+  if fpSend<0 then
     SocketError:=WSAGetLastError
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
+Function fpSendTo(s:cint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
 begin
 begin
   // Dubious construct, this should be checked.
   // Dubious construct, this should be checked.
-  SendTo:=WinSock.SendTo(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
-  if SendTo<0 then
+  fpSendTo:=WinSock.SendTo(s,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
+  if fpSendTo<0 then
     SocketError:=WSAGetLastError
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
+Function fpRecv(S:cint;Var Buf;BufLen,Flags:Longint):Longint;
 begin
 begin
-  Recv:=WinSock.Recv(Sock,Buf,BufLen,Flags);
-  if Recv<0 then
+  fpRecv:=WinSock.Recv(Sock,Buf,BufLen,Flags);
+  if fpRecv<0 then
     SocketError:=WSAGetLastError
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
 
 
-Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; AddrLen : Integer) : longint;
-
+Function fpRecvFrom(s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
 begin
 begin
-  RecvFrom:=WinSock.RecvFrom(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
-  if RecvFrom<0 then
+  fpRecvFrom:=WinSock.RecvFrom(s,Buf,len,flags,Winsock.TSockAddr(from^),FromLen^);
+  if fpRecvFrom<0 then
     SocketError:=WSAGetLastError
     SocketError:=WSAGetLastError
   else
   else
     SocketError:=0;
     SocketError:=0;
 end;
 end;
 
 
-Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
 
 
-  var
-     l : longint;
+function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
 
 
 begin
 begin
-  l:=WinSock.Bind(Sock,WinSock.PSockAddr(@Addr),AddrLen);
-  if l<0 then
-    begin
-       SocketError:=WSAGetLastError;
-       Bind:=false;
-    end
+  fpbind:=WinSock.Bind(S,WinSock.PSockAddr(Addrx),AddrLen);
+  if fpbind<0 then
+       SocketError:=WSAGetLastError
   else
   else
-    begin
        SocketError:=0;
        SocketError:=0;
-       Bind:=true;
-    end;
 end;
 end;
 
 
 Function Listen(Sock,MaxConnect:Longint):Boolean;
 Function Listen(Sock,MaxConnect:Longint):Boolean;
@@ -248,6 +255,337 @@ function fdRead(handle : longint;var bufptr;size : dword) : dword;
   end;
   end;
 
 
 
 
+{$i sockets.inc}
+
+{ winsocket stack needs an init. and cleanup code }
+var
+  wsadata : twsadata;
+
+initialization
+  WSAStartUp($2,wsadata);
+finalization
+  WSACleanUp;
+end.
+***)
+
+function fpsocket 	(domain:cint; xtype:cint; protocol: cint):cint;
+begin
+  fpSocket:=WinSock.Socket(Domain,xtype,ProtoCol);
+  if fpSocket<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
+begin
+  fpSend:=WinSock.Send(S,msg,len,flags);
+  if fpSend<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
+begin
+  // Dubious construct, this should be checked. (IPV6 fails ?)
+  fpSendTo:=WinSock.SendTo(S,msg,Len,Flags,Winsock.TSockAddr(tox^),toLen);
+  if fpSendTo<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fprecv 	(s:cint; buf: pointer; len: size_t; flags: cint):ssize_t; 
+begin
+  fpRecv:=WinSock.Recv(S,Buf,Len,Flags);
+  if fpRecv<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fprecvfrom    (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t; 
+
+begin
+  fpRecvFrom:=WinSock.RecvFrom(S,Buf,Len,Flags,Winsock.TSockAddr(from^),FromLen^);
+  if fpRecvFrom<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;
+
+begin
+  fpConnect:=WinSock.Connect(S,WinSock.TSockAddr(name^),nameLen);
+  if fpConnect<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpshutdown 	(s:cint; how:cint):cint; 
+begin
+  fpShutDown:=WinSock.ShutDown(S,How);
+  if fpShutDown<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+Function socket(Domain,SocketType,Protocol:Longint):Longint;
+begin
+  socket:=fpsocket(Domain,sockettype,protocol);
+end;
+
+Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
+
+begin
+  send:=fpsend(sock,@buf,buflen,flags);
+end;
+
+Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
+
+begin
+  sendto:=fpsendto(sock,@buf,buflen,flags,@addr,addrlen);
+end;
+
+Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
+begin
+  Recv:=fpRecv(Sock,@Buf,BufLen,Flags);
+end;
+
+Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longint) : longint;
+begin
+  RecvFrom:=fpRecvFrom(Sock,@Buf,BufLen,Flags,@Addr,@AddrLen);
+end;
+
+function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
+
+begin
+  fpbind:=WinSock.Bind(S,WinSock.PSockAddr(Addrx),AddrLen);
+  if fpbind<0 then
+       SocketError:=WSAGetLastError
+  else
+       SocketError:=0;
+end;
+
+function fplisten      (s:cint; backlog : cint):cint;
+
+begin
+  fplisten:=WinSock.Listen(S,backlog);
+  if fplisten<0 then
+       SocketError:=WSAGetLastError
+  else
+       SocketError:=0;
+end;
+
+function fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint; 
+begin
+  fpAccept:=WinSock.Accept(S,WinSock.PSockAddr(Addrx),plongint(@AddrLen));
+  if fpAccept<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint; 
+
+begin
+  fpGetSockName:=WinSock.GetSockName(S,WinSock.TSockAddr(name^),nameLen^);
+  if fpGetSockName<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint; 
+begin
+  fpGetPeerName:=WinSock.GetPeerName(S,WinSock.TSockAddr(name^),NameLen^);
+  if fpGetPeerName<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint; 
+begin
+  fpGetSockOpt:=WinSock.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
+  if fpGetSockOpt<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint; 
+
+begin
+  fpSetSockOpt:=WinSock.SetSockOpt(S,Level,OptName,OptVal,OptLen);
+  if fpSetSockOpt<0 then
+    SocketError:=WSAGetLastError
+  else
+    SocketError:=0;
+end;
+
+function fpsocketpair  (d:cint; xtype:cint; protocol:cint; sv:pcint):cint; 
+begin
+end;
+
+Function CloseSocket(Sock:Longint):Longint;
+var i : longint;
+begin
+  i := Winsock.CloseSocket (Sock);
+  if i <> 0 then
+  begin
+    SocketError:=WSAGetLastError;
+    CloseSocket := i;
+  end else
+  begin
+    CloseSocket := 0;
+    SocketError := 0;
+  end;
+end;
+
+Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
+
+begin
+  bind:=fpBind(Sock,@Addr,AddrLen)=0;
+end;
+
+Function Listen(Sock,MaxConnect:Longint):Boolean;
+
+begin
+  Listen:=fplisten(Sock,MaxConnect)=0;
+end;
+
+Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+
+begin
+  Accept:=FPAccept(sock,@addr,@addrlen);
+end;
+
+Function Shutdown(Sock:Longint;How:Longint):Longint;
+
+begin
+ shutdown:=fpshutdown(sock,how);
+end;
+
+Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
+
+begin
+ connect:=fpconnect(sock,@addr,addrlen)=0;
+end;
+
+Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+begin
+ GetSocketName:=fpGetSockName(sock,@addr,@addrlen);
+end;
+
+Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
+begin
+ GetPeerName:=fpGetPeerName(Sock,@addr,@addrlen);
+end;
+
+Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
+begin
+ GetSocketOptions:=fpGetSockOpt(sock,level,optname,@optval,@optlen);
+end;
+
+Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
+
+begin
+ SetSocketOptions:=fpsetsockopt(sock,level,optname,@optval,optlen);
+end;
+
+Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
+begin
+  // SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);a
+end;
+
+
+{$ifdef unix}
+{ mimic the linux fpWrite/fpRead calls for the file/text socket wrapper }
+function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
+begin
+  fpWrite := dword(WinSock.send(handle, bufptr, size, 0));
+  if fpWrite = dword(SOCKET_ERROR) then
+  begin
+    SocketError := WSAGetLastError;
+    fpWrite := 0;
+  end
+  else
+    SocketError := 0;
+end;
+
+function fpRead(handle : longint;var bufptr;size : dword) : dword;
+  var
+     d : dword;
+
+  begin
+     if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
+       begin
+         SocketError:=WSAGetLastError;
+         fpRead:=0;
+         exit;
+       end;
+     if d>0 then
+       begin
+         if size>d then
+           size:=d;
+         fpRead := dword(WinSock.recv(handle, bufptr, size, 0));
+         if fpRead = dword(SOCKET_ERROR) then
+         begin
+           SocketError:= WSAGetLastError;
+           fpRead := 0;
+         end else
+           SocketError:=0;
+       end
+     else
+       SocketError:=0;
+  end;
+{$else}
+{ mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
+function fdWrite(handle : longint;Const bufptr;size : dword) : dword;
+begin
+  fdWrite := dword(WinSock.send(handle, bufptr, size, 0));
+  if fdWrite = dword(SOCKET_ERROR) then
+  begin
+    SocketError := WSAGetLastError;
+    fdWrite := 0;
+  end
+  else
+    SocketError := 0;
+end;
+
+function fdRead(handle : longint;var bufptr;size : dword) : dword;
+  var
+     d : dword;
+
+  begin
+     if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
+       begin
+         SocketError:=WSAGetLastError;
+         fdRead:=0;
+         exit;
+       end;
+     if d>0 then
+       begin
+         if size>d then
+           size:=d;
+         fdRead := dword(WinSock.recv(handle, bufptr, size, 0));
+         if fdRead = dword(SOCKET_ERROR) then
+         begin
+           SocketError:= WSAGetLastError;
+           fdRead := 0;
+         end else
+           SocketError:=0;
+       end
+     else
+       SocketError:=0;
+  end;
+{$endif}
+
 {$i sockets.inc}
 {$i sockets.inc}
 
 
 { winsocket stack needs an init. and cleanup code }
 { winsocket stack needs an init. and cleanup code }
@@ -261,7 +599,10 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.4  2003-03-25 18:17:54  armin
+  Revision 1.5  2004-07-30 15:05:25  armin
+  make netware rtl compilable under 1.9.5
+
+  Revision 1.4  2003/03/25 18:17:54  armin
   * support for fcl, support for linking without debug info
   * support for fcl, support for linking without debug info
   * renamed winsock2 to winsock for win32 compatinility
   * renamed winsock2 to winsock for win32 compatinility
   * new sockets unit for netware
   * new sockets unit for netware

+ 41 - 32
rtl/netware/system.pp

@@ -27,13 +27,11 @@ interface
   {$define Set_i386_Exception_handler}
   {$define Set_i386_Exception_handler}
 {$endif cpui386}
 {$endif cpui386}
 
 
-
 { include system-independent routine headers }
 { include system-independent routine headers }
 
 
 {$I systemh.inc}
 {$I systemh.inc}
 
 
-type
- THandle = cardinal;
+type THandle = DWord;
 
 
 {Platform specific information}
 {Platform specific information}
 const
 const
@@ -44,27 +42,16 @@ const
  PathSeparator = ';';
  PathSeparator = ';';
 { FileNameCaseSensitive is defined separately below!!! }
 { FileNameCaseSensitive is defined separately below!!! }
 
 
-type
-   { the fields of this record are os dependent  }
-   { and they shouldn't be used in a program     }
-   { only the type TCriticalSection is important }
-   TRTLCriticalSection = packed record
-      SemaHandle : LONGINT;
-      SemaIsOpen : BOOLEAN;
-   end;
-
-{ include threading stuff }
-{ i threadh.inc}
 
 
 { include heap support headers }
 { include heap support headers }
 {$I heaph.inc}
 {$I heaph.inc}
 
 
 CONST
 CONST
   { Default filehandles }
   { Default filehandles }
-   UnusedHandle    : longint = -1;
-   StdInputHandle  : longint = 0;
-   StdOutputHandle : longint = 0;
-   StdErrorHandle  : longint = 0;
+   UnusedHandle    : THandle = -1;
+   StdInputHandle  : THandle = 0;
+   StdOutputHandle : THandle = 0;
+   StdErrorHandle  : THandle = 0;
 
 
    FileNameCaseSensitive : boolean = false;
    FileNameCaseSensitive : boolean = false;
 
 
@@ -261,6 +248,7 @@ var  HeapSbrkBlockList : ^THeapSbrkBlockList = nil;
 { exit (to avoid message "Module did not release xx resources") }
 { exit (to avoid message "Module did not release xx resources") }
 Function Sbrk(size : longint):pointer;
 Function Sbrk(size : longint):pointer;
 var P2 : POINTER;
 var P2 : POINTER;
+    i  : longint;
 begin
 begin
   Sbrk := _malloc (size);
   Sbrk := _malloc (size);
   if Sbrk <> nil then begin
   if Sbrk <> nil then begin
@@ -276,6 +264,13 @@ begin
       fillchar (HeapSbrkBlockList^,sizeof(HeapSbrkBlockList^),0);
       fillchar (HeapSbrkBlockList^,sizeof(HeapSbrkBlockList^),0);
       HeapSbrkAllocated := HeapInitialMaxBlocks;
       HeapSbrkAllocated := HeapInitialMaxBlocks;
     end;
     end;
+    if (HeapSbrkLastUsed > 0) then
+      for i := 1 to HeapSbrkLastUsed do
+        if (HeapSbrkBlockList^[i] = nil) then
+        begin  // reuse free slot
+	  HeapSbrkBlockList^[i] := Sbrk;
+	  exit;
+        end;
     if (HeapSbrkLastUsed = HeapSbrkAllocated) then
     if (HeapSbrkLastUsed = HeapSbrkAllocated) then
     begin  { grow }
     begin  { grow }
       p2 := _realloc (HeapSbrkBlockList, HeapSbrkAllocated + HeapInitialMaxBlocks);
       p2 := _realloc (HeapSbrkBlockList, HeapSbrkAllocated + HeapInitialMaxBlocks);
@@ -299,7 +294,8 @@ begin
   if HeapSbrkBlockList <> nil then
   if HeapSbrkBlockList <> nil then
   begin
   begin
     for i := 1 to HeapSbrkLastUsed do
     for i := 1 to HeapSbrkLastUsed do
-      _free (HeapSbrkBlockList^[i]);
+      if (HeapSbrkBlockList^[i] <> nil) then
+        _free (HeapSbrkBlockList^[i]);
     _free (HeapSbrkBlockList);
     _free (HeapSbrkBlockList);
     HeapSbrkAllocated := 0;
     HeapSbrkAllocated := 0;
     HeapSbrkLastUsed := 0;
     HeapSbrkLastUsed := 0;
@@ -319,8 +315,18 @@ end;
 {$define HAS_SYSOSFREE}
 {$define HAS_SYSOSFREE}
 
 
 procedure SysOSFree(p: pointer; size: ptrint);
 procedure SysOSFree(p: pointer; size: ptrint);
+var i : longint;
 begin
 begin
-  fpmunmap(p, size);
+//fpmunmap(p, size);
+  if (HeapSbrkLastUsed > 0) then
+    for i := 1 to HeapSbrkLastUsed do
+      if (HeapSbrkBlockList^[i] = p) then
+      begin
+	_free (p);
+	HeapSbrkBlockList^[i] := nil;
+	exit;
+      end;
+  HandleError (204);  // invalid pointer operation
 end;
 end;
 
 
 { include standard heap management }
 { include standard heap management }
@@ -383,7 +389,7 @@ BEGIN
 END;
 END;
 
 
 { close a file from the handle value }
 { close a file from the handle value }
-procedure do_close(handle : longint);
+procedure do_close(handle : thandle);
 VAR res : LONGINT;
 VAR res : LONGINT;
 begin
 begin
   res := _close (handle);
   res := _close (handle);
@@ -413,10 +419,10 @@ begin
     InOutRes := 0
     InOutRes := 0
 end;
 end;
 
 
-function do_write(h,addr,len : longint) : longint;
+function do_write(h:thandle;addr:pointer;len : longint) : longint;
 VAR res : LONGINT;
 VAR res : LONGINT;
 begin
 begin
-  res := _write (h,POINTER(addr),len);
+  res := _write (h,addr,len);
   IF res > 0 THEN
   IF res > 0 THEN
     InOutRes := 0
     InOutRes := 0
   ELSE
   ELSE
@@ -424,10 +430,10 @@ begin
   do_write := res;
   do_write := res;
 end;
 end;
 
 
-function do_read(h,addr,len : longint) : longint;
+function do_read(h:thandle;addr:pointer;len : longint) : longint;
 VAR res : LONGINT;
 VAR res : LONGINT;
 begin
 begin
-  res := _read (h,POINTER(addr),len);
+  res := _read (h,addr,len);
   IF res > 0 THEN
   IF res > 0 THEN
     InOutRes := 0
     InOutRes := 0
   ELSE
   ELSE
@@ -436,7 +442,7 @@ begin
 end;
 end;
 
 
 
 
-function do_filepos(handle : longint) : longint;
+function do_filepos(handle : thandle) : longint;
 VAR res : LONGINT;
 VAR res : LONGINT;
 begin
 begin
   InOutRes:=1;
   InOutRes:=1;
@@ -453,7 +459,7 @@ CONST SEEK_SET = 0; // Seek from beginning of file.
       SEEK_END = 2; // Seek from end of file.
       SEEK_END = 2; // Seek from end of file.
 
 
 
 
-procedure do_seek(handle,pos : longint);
+procedure do_seek(handle:thandle;pos : longint);
 VAR res : LONGINT;
 VAR res : LONGINT;
 begin
 begin
   res := _lseek (handle,pos, SEEK_SET);
   res := _lseek (handle,pos, SEEK_SET);
@@ -463,7 +469,7 @@ begin
     SetFileError (res);
     SetFileError (res);
 end;
 end;
 
 
-function do_seekend(handle:longint):longint;
+function do_seekend(handle:thandle):longint;
 VAR res : LONGINT;
 VAR res : LONGINT;
 begin
 begin
   res := _lseek (handle,0, SEEK_END);
   res := _lseek (handle,0, SEEK_END);
@@ -475,7 +481,7 @@ begin
 end;
 end;
 
 
 
 
-function do_filesize(handle : longint) : longint;
+function do_filesize(handle : thandle) : longint;
 VAR res     : LONGINT;
 VAR res     : LONGINT;
 begin
 begin
   res := _filelength (handle);
   res := _filelength (handle);
@@ -491,7 +497,7 @@ begin
 end;
 end;
 
 
 { truncate at a given position }
 { truncate at a given position }
-procedure do_truncate (handle,pos:longint);
+procedure do_truncate (handle:thandle;pos:longint);
 VAR res : LONGINT;
 VAR res : LONGINT;
 begin
 begin
   res := _chsize (handle,pos);
   res := _chsize (handle,pos);
@@ -582,7 +588,7 @@ Begin
     InOutRes := 0;
     InOutRes := 0;
 End;
 End;
 
 
-function do_isdevice(handle:longint):boolean;
+function do_isdevice(handle:THandle):boolean;
 begin
 begin
   do_isdevice := (_isatty (handle) > 0);
   do_isdevice := (_isatty (handle) > 0);
 end;
 end;
@@ -835,7 +841,10 @@ Begin
 End.
 End.
 {
 {
   $Log$
   $Log$
-  Revision 1.22  2004-06-17 16:16:14  peter
+  Revision 1.23  2004-07-30 15:05:25  armin
+  make netware rtl compilable under 1.9.5
+
+  Revision 1.22  2004/06/17 16:16:14  peter
     * New heapmanager that releases memory back to the OS, donated
     * New heapmanager that releases memory back to the OS, donated
       by Micha Nelissen
       by Micha Nelissen
 
 

+ 140 - 56
rtl/netware/systhrds.pp

@@ -13,6 +13,7 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
  **********************************************************************}
  **********************************************************************}
+{$mode objfpc}
 unit systhrds;
 unit systhrds;
 interface
 interface
 
 
@@ -29,8 +30,19 @@ interface
     termination because some versions of netware will abend if there
     termination because some versions of netware will abend if there
     are open semaphores on nlm unload.
     are open semaphores on nlm unload.
 }
 }
-{ Include generic thread interface }
-{$i threadh.inc }
+
+type
+   { the fields of this record are os dependent  }
+   { and they shouldn't be used in a program     }
+   { only the type TCriticalSection is important }
+   PRTLCriticalSection = ^TRTLCriticalSection;
+   TRTLCriticalSection = packed record
+      SemaHandle : LONGINT;
+      SemaIsOpen : BOOLEAN;
+   end;
+
+{ include threading stuff }
+{$i threadh.inc}
 
 
 {Delphi/Windows compatible priority constants, they are also defined for Unix and Win32}
 {Delphi/Windows compatible priority constants, they are also defined for Unix and Win32}
 const
 const
@@ -44,6 +56,8 @@ const
 
 
 implementation
 implementation
 
 
+function  SysGetCurrentThreadId : dword;forward;
+
 {$i thread.inc }
 {$i thread.inc }
 
 
 { some declarations for Netware API calls }
 { some declarations for Netware API calls }
@@ -51,6 +65,12 @@ implementation
 
 
 {  define DEBUG_MT}
 {  define DEBUG_MT}
 
 
+{*****************************************************************************
+                             Threadvar support
+*****************************************************************************}
+
+{$ifdef HASTHREADVAR}
+
 const
 const
    threadvarblocksize : dword = 0;     // total size of allocated threadvars
    threadvarblocksize : dword = 0;     // total size of allocated threadvars
    thredvarsmainthread: pointer = nil; // to free the threadvars in the signal handler
    thredvarsmainthread: pointer = nil; // to free the threadvars in the signal handler
@@ -128,6 +148,8 @@ end;
 { Include OS independent Threadvar initialization }
 { Include OS independent Threadvar initialization }
 {$i threadvr.inc}
 {$i threadvr.inc}
 
 
+{$endif HASTHREADVAR}
+
 
 
 {*****************************************************************************
 {*****************************************************************************
                             Thread starting
                             Thread starting
@@ -147,7 +169,9 @@ procedure DoneThread;
 
 
   begin
   begin
      { release thread vars }
      { release thread vars }
+{$ifdef HASTHREADVAR}
      SysReleaseThreadVars;
      SysReleaseThreadVars;
+{$endif}
   end;
   end;
 
 
 
 
@@ -157,7 +181,11 @@ function ThreadMain(param : pointer) : dword; cdecl;
      ti : tthreadinfo;
      ti : tthreadinfo;
 
 
   begin
   begin
+{$ifdef HASTHREADVAR}
+     { Allocate local thread vars, this must be the first thing,
+       because the exception management and io depends on threadvars }
      SysAllocateThreadVars;
      SysAllocateThreadVars;
+{$endif HASTHREADVAR}
 {$ifdef DEBUG_MT}
 {$ifdef DEBUG_MT}
      ConsolePrintf(#13'New thread started, initialising ...'#13#10);
      ConsolePrintf(#13'New thread started, initialising ...'#13#10);
 {$endif DEBUG_MT}
 {$endif DEBUG_MT}
@@ -171,10 +199,9 @@ function ThreadMain(param : pointer) : dword; cdecl;
      DoneThread;
      DoneThread;
   end;
   end;
 
 
-
-function BeginThread(sa : Pointer;stacksize : dword;
-  ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword;
-  var ThreadId : DWord) : DWord;
+function SysBeginThread(sa : Pointer;stacksize : dword;
+                         ThreadFunction : tthreadfunc;p : pointer;
+                         creationFlags : dword; var ThreadId : DWord) : DWord;
 
 
   var ti : pthreadinfo;
   var ti : pthreadinfo;
 
 
@@ -182,11 +209,13 @@ function BeginThread(sa : Pointer;stacksize : dword;
 {$ifdef DEBUG_MT}
 {$ifdef DEBUG_MT}
      ConsolePrintf(#13'Creating new thread'#13#10);
      ConsolePrintf(#13'Creating new thread'#13#10);
 {$endif DEBUG_MT}
 {$endif DEBUG_MT}
+{$ifdef HASTHREADVAR}
      if not IsMultiThread then
      if not IsMultiThread then
      begin
      begin
        InitThreadVars(@SysRelocateThreadvar);
        InitThreadVars(@SysRelocateThreadvar);
        IsMultithread:=true;
        IsMultithread:=true;
      end;
      end;
+{$endif}     
      { the only way to pass data to the newly created thread }
      { the only way to pass data to the newly created thread }
      { in a MT safe way, is to use the heap                  }
      { in a MT safe way, is to use the heap                  }
      new(ti);
      new(ti);
@@ -196,18 +225,17 @@ function BeginThread(sa : Pointer;stacksize : dword;
 {$ifdef DEBUG_MT}
 {$ifdef DEBUG_MT}
      ConsolePrintf(#13'Starting new thread'#13#10);
      ConsolePrintf(#13'Starting new thread'#13#10);
 {$endif DEBUG_MT}
 {$endif DEBUG_MT}
-     BeginThread :=
+     SysBeginThread :=
        _BeginThread (@ThreadMain,NIL,Stacksize,ti);
        _BeginThread (@ThreadMain,NIL,Stacksize,ti);
   end;
   end;
 
 
 
 
-procedure EndThread(ExitCode : DWord);
+procedure SysEndThread(ExitCode : DWord);
 begin
 begin
   DoneThread;
   DoneThread;
   ExitThread(ExitCode , TSR_THREAD);
   ExitThread(ExitCode , TSR_THREAD);
 end;
 end;
 
 
-
 {*****************************************************************************
 {*****************************************************************************
                             Thread handling
                             Thread handling
 *****************************************************************************}
 *****************************************************************************}
@@ -217,34 +245,34 @@ function __SuspendThread (threadId : dword) : dword; cdecl; external 'clib' name
 function __ResumeThread (threadId : dword) : dword; cdecl; external 'clib' name 'ResumeThread';
 function __ResumeThread (threadId : dword) : dword; cdecl; external 'clib' name 'ResumeThread';
 procedure __ThreadSwitchWithDelay; cdecl; external 'clib' name 'ThreadSwitchWithDelay';
 procedure __ThreadSwitchWithDelay; cdecl; external 'clib' name 'ThreadSwitchWithDelay';
 
 
-{redefined because the interface has not cdecl calling convention}
-function SuspendThread (threadHandle : dword) : dword;
+procedure SysThreadSwitch;
 begin
 begin
-  SuspendThread := __SuspendThread (threadHandle);
+  __ThreadSwitchWithDelay;
 end;
 end;
 
 
 
 
-function ResumeThread (threadHandle : dword) : dword;
+{redefined because the interface has not cdecl calling convention}
+function SysSuspendThread (threadHandle : dword) : dword;
 begin
 begin
-  ResumeThread := __ResumeThread (threadHandle);
+  SysSuspendThread := __SuspendThread (threadHandle);
 end;
 end;
 
 
 
 
-procedure ThreadSwitch;
+function SysResumeThread (threadHandle : dword) : dword;
 begin
 begin
-  __ThreadSwitchWithDelay;
+  SysResumeThread := __ResumeThread (threadHandle);
 end;
 end;
 
 
 
 
-function  KillThread (threadHandle : dword) : dword;
+function  SysKillThread (threadHandle : dword) : dword;
 begin
 begin
-  KillThread := 1;  {not supported for netware}
+  SysKillThread := 1;  {not supported for netware}
 end;
 end;
 
 
 function GetThreadName  (threadId : longint; var threadName) : longint; cdecl; external 'clib' name 'GetThreadName';
 function GetThreadName  (threadId : longint; var threadName) : longint; cdecl; external 'clib' name 'GetThreadName';
 //function __RenameThread (threadId : longint; threadName:pchar) : longint; cdecl; external 'clib' name 'RenameThread';
 //function __RenameThread (threadId : longint; threadName:pchar) : longint; cdecl; external 'clib' name 'RenameThread';
 
 
-function  WaitForThreadTerminate (threadHandle : dword; TimeoutMs : longint) : dword;
+function  SysWaitForThreadTerminate (threadHandle : dword; TimeoutMs : longint) : dword;
 var
 var
   status : longint;
   status : longint;
   buf : array [0..50] of char;
   buf : array [0..50] of char;
@@ -254,24 +282,24 @@ begin
     status := GetThreadName (ThreadHandle,Buf); {should return EBADHNDL if thread is terminated}
     status := GetThreadName (ThreadHandle,Buf); {should return EBADHNDL if thread is terminated}
     ThreadSwitch;
     ThreadSwitch;
   until status <> 0;
   until status <> 0;
-  WaitForThreadTerminate:=0;
+  SysWaitForThreadTerminate:=0;
 end;
 end;
 
 
-function  ThreadSetPriority (threadHandle : dword; Prio: longint): boolean; {-15..+15, 0=normal}
+function  SysThreadSetPriority (threadHandle : dword; Prio: longint): boolean; {-15..+15, 0=normal}
 begin
 begin
-  ThreadSetPriority := true;
+  SysThreadSetPriority := true;
 end;
 end;
 
 
-function  ThreadGetPriority (threadHandle : dword): Integer;
+function  SysThreadGetPriority (threadHandle : dword): Integer;
 begin
 begin
-  ThreadGetPriority := 0;
+  SysThreadGetPriority := 0;
 end;
 end;
 
 
 function GetThreadID : dword; cdecl; external 'clib' name 'GetThreadID';
 function GetThreadID : dword; cdecl; external 'clib' name 'GetThreadID';
 
 
-function  GetCurrentThreadId : dword;
+function  SysGetCurrentThreadId : dword;
 begin
 begin
-  GetCurrentThreadId := GetThreadID;
+  SysGetCurrentThreadId := GetThreadID;
 end;
 end;
 
 
 
 
@@ -352,44 +380,56 @@ end;
 { this allows to do a lot of things in MT safe way }
 { this allows to do a lot of things in MT safe way }
 { it is also used to make the heap management      }
 { it is also used to make the heap management      }
 { thread safe                                      }
 { thread safe                                      }
-procedure InitCriticalSection(var cs : TRTLCriticalSection);
+procedure SysInitCriticalSection(var cs);// : TRTLCriticalSection);
 begin
 begin
-  cs.SemaHandle := _OpenLocalSemaphore (1);
-  if cs.SemaHandle <> 0 then
-  begin
-    cs.SemaIsOpen := true;
-    SaveSema (cs.SemaHandle);
-  end else
+  with PRTLCriticalSection(@cs)^ do
   begin
   begin
-    cs.SemaIsOpen := false;
-    ConsolePrintf (#13'fpc-rtl: InitCriticalsection, OpenLocalSemaphore returned error'#13#10,0);
+    SemaHandle := _OpenLocalSemaphore (1);
+    if SemaHandle <> 0 then
+    begin
+      SemaIsOpen := true;
+      SaveSema (SemaHandle);
+    end else
+    begin
+      SemaIsOpen := false;
+      ConsolePrintf (#13'fpc-rtl: InitCriticalsection, OpenLocalSemaphore returned error'#13#10,0);
+    end;
   end;
   end;
 end;
 end;
 
 
-procedure DoneCriticalsection(var cs : TRTLCriticalSection);
+procedure SysDoneCriticalsection(var cs);
 begin
 begin
-  if cs.SemaIsOpen then
+  with PRTLCriticalSection(@cs)^ do
   begin
   begin
-    _CloseLocalSemaphore (cs.SemaHandle);
-    ReleaseSema (cs.SemaHandle);
-    cs.SemaIsOpen := FALSE;
+    if SemaIsOpen then
+    begin
+      _CloseLocalSemaphore (SemaHandle);
+      ReleaseSema (SemaHandle);
+      SemaIsOpen := FALSE;
+    end;
   end;
   end;
 end;
 end;
 
 
-procedure EnterCriticalsection(var cs : TRTLCriticalSection);
+procedure SysEnterCriticalsection(var cs);
 begin
 begin
-  if cs.SemaIsOpen then
-    _WaitOnLocalSemaphore (cs.SemaHandle)
-  else
-    ConsolePrintf (#13'fpc-rtl: EnterCriticalsection, TRTLCriticalSection not open'#13#10,0);
+  with PRTLCriticalSection(@cs)^ do
+  begin
+    if SemaIsOpen then
+      _WaitOnLocalSemaphore (SemaHandle)
+    else
+      ConsolePrintf (#13'fpc-rtl: EnterCriticalsection, TRTLCriticalSection not open'#13#10,0);
+  end;
 end;
 end;
 
 
-procedure LeaveCriticalsection(var cs : TRTLCriticalSection);
+procedure SysLeaveCriticalSection(var cs);
 begin
 begin
-  if cs.SemaIsOpen then
-    _SignalLocalSemaphore (cs.SemaHandle)
-  else
-    ConsolePrintf (#13'fpc-rtl: LeaveCriticalsection, TRTLCriticalSection not open'#13#10,0);
+  with PRTLCriticalSection(@cs)^ do
+  begin
+    if SemaIsOpen then
+      _SignalLocalSemaphore (SemaHandle)
+    else
+      ConsolePrintf (#13'fpc-rtl: LeaveCriticalsection, TRTLCriticalSection not open'#13#10,0);
+  end;
 end;
 end;
 
 
 
 
@@ -406,7 +446,7 @@ end;
 {*****************************************************************************
 {*****************************************************************************
                            Heap Mutex Protection
                            Heap Mutex Protection
 *****************************************************************************}
 *****************************************************************************}
-			
+
 var
 var
   HeapMutex : TRTLCriticalSection;
   HeapMutex : TRTLCriticalSection;
 				
 				
@@ -424,7 +464,7 @@ procedure NWHeapMutexLock;
 begin
 begin
   EnterCriticalSection(heapmutex);
   EnterCriticalSection(heapmutex);
 end;
 end;
-														
+
 procedure NWHeapMutexUnlock;
 procedure NWHeapMutexUnlock;
 begin
 begin
   LeaveCriticalSection(heapmutex);
   LeaveCriticalSection(heapmutex);
@@ -437,24 +477,68 @@ const
            MutexLock : @NWHeapMutexLock;
            MutexLock : @NWHeapMutexLock;
     	   MutexUnlock : @NWHeapMutexUnlock;
     	   MutexUnlock : @NWHeapMutexUnlock;
   );
   );
-																							
+
 procedure InitHeapMutexes;
 procedure InitHeapMutexes;
 begin
 begin
   SetMemoryMutexManager(NWMemoryMutexManager);
   SetMemoryMutexManager(NWMemoryMutexManager);
 end;
 end;
 
 
+Var
+  NWThreadManager : TThreadManager;
 
 
+Procedure SetNWThreadManager;
 
 
-initialization
+begin
+  With NWThreadManager do
+    begin
+    InitManager            :=Nil;
+    DoneManager            :=Nil;
+    BeginThread            :=@SysBeginThread;
+    EndThread              :=@SysEndThread;
+    SuspendThread          :=@SysSuspendThread;
+    ResumeThread           :=@SysResumeThread;
+    KillThread             :=@SysKillThread;
+    ThreadSwitch           :=@SysThreadSwitch;
+    WaitForThreadTerminate :=@SysWaitForThreadTerminate;
+    ThreadSetPriority      :=@SysThreadSetPriority;
+    ThreadGetPriority      :=@SysThreadGetPriority;
+    GetCurrentThreadId     :=@SysGetCurrentThreadId;
+    InitCriticalSection    :=@SysInitCriticalSection;
+    DoneCriticalSection    :=@SysDoneCriticalSection;
+    EnterCriticalSection   :=@SysEnterCriticalSection;
+    LeaveCriticalSection   :=@SysLeaveCriticalSection;
+{$ifdef HASTHREADVAR}
+    InitThreadVar          :=@SysInitThreadVar;
+    RelocateThreadVar      :=@SysRelocateThreadVar;
+    AllocateThreadVars     :=@SysAllocateThreadVars;
+    ReleaseThreadVars      :=@SysReleaseThreadVars;
+{$endif HASTHREADVAR}
+    BasicEventCreate       :=@NoBasicEventCreate;
+    basiceventdestroy      :=@Nobasiceventdestroy;
+    basiceventResetEvent   :=@NobasiceventResetEvent;
+    basiceventSetEvent     :=@NobasiceventSetEvent;
+    basiceventWaitFor      :=@NobasiceventWaitFor;
+    end;
+  SetThreadManager(NWThreadManager);
   InitHeapMutexes;
   InitHeapMutexes;
+end;
+
+initialization
+  SetNWThreadManager;
   NWSysSetThreadFunctions (@CloseAllRemainingSemaphores,
   NWSysSetThreadFunctions (@CloseAllRemainingSemaphores,
                            @SysReleaseThreadVars,
                            @SysReleaseThreadVars,
-                           @SetThreadDataAreaPtr);
+			   @SetThreadDataAreaPtr);
+
 end.
 end.
 
 
+
+
 {
 {
   $Log$
   $Log$
-  Revision 1.3  2003-10-01 21:00:09  peter
+  Revision 1.4  2004-07-30 15:05:25  armin
+  make netware rtl compilable under 1.9.5
+
+  Revision 1.3  2003/10/01 21:00:09  peter
     * GetCurrentThreadHandle renamed to GetCurrentThreadId
     * GetCurrentThreadHandle renamed to GetCurrentThreadId
 
 
   Revision 1.2  2003/03/27 17:14:27  armin
   Revision 1.2  2003/03/27 17:14:27  armin

+ 10 - 7
rtl/netware/tthread.inc

@@ -118,7 +118,7 @@ end;
 
 
 
 
 { TThread }
 { TThread }
-function ThreadProc(args:pointer): Integer;cdecl;
+function ThreadProc(args:pointer): Integer;
 var
 var
   FreeThread: Boolean;
   FreeThread: Boolean;
   Thread : TThread absolute args;
   Thread : TThread absolute args;
@@ -129,7 +129,7 @@ begin
     Thread.FFatalException := TObject(AcquireExceptionObject);
     Thread.FFatalException := TObject(AcquireExceptionObject);
   end;
   end;
   FreeThread := Thread.FFreeOnTerminate;
   FreeThread := Thread.FFreeOnTerminate;
-  Result := Thread.FReturnValue;
+  ThreadProc := Thread.FReturnValue;
   Thread.FFinished := True;
   Thread.FFinished := True;
   Thread.DoTerminate;
   Thread.DoTerminate;
   if FreeThread then
   if FreeThread then
@@ -146,7 +146,7 @@ begin
   AddThread(self);
   AddThread(self);
   FSuspended := CreateSuspended;
   FSuspended := CreateSuspended;
   { Create new thread }
   { Create new thread }
-  FHandle := BeginThread (@ThreadProc,self);
+  FHandle := BeginThread (@ThreadProc,pointer(self));
   if FSuspended then Suspend;
   if FSuspended then Suspend;
   FThreadID := FHandle;
   FThreadID := FHandle;
   //IsMultiThread := TRUE;  {already set by systhrds}
   //IsMultiThread := TRUE;  {already set by systhrds}
@@ -162,8 +162,8 @@ begin
      Terminate;
      Terminate;
      WaitFor;
      WaitFor;
    end;
    end;
-  if FHandle <> -1 then
-    KillThread (FHandle);  {something went wrong, kill the thread (not possible on netware)}
+  {if FHandle <> -1 then
+    KillThread (FHandle);}  {something went wrong, kill the thread (not possible on netware)}
   FFatalException.Free;
   FFatalException.Free;
   FFatalException := nil;
   FFatalException := nil;
   inherited Destroy;
   inherited Destroy;
@@ -255,12 +255,15 @@ function TThread.WaitFor: Integer;
 begin
 begin
   Result := WaitForThreadTerminate (FHandle,0);
   Result := WaitForThreadTerminate (FHandle,0);
   if Result = 0 then
   if Result = 0 then
-    FHandle := -1;
+    FHandle := 0;
 end;
 end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.1  2003-10-06 21:01:06  peter
+  Revision 1.2  2004-07-30 15:05:25  armin
+  make netware rtl compilable under 1.9.5
+
+  Revision 1.1  2003/10/06 21:01:06  peter
     * moved classes unit to rtl
     * moved classes unit to rtl
 
 
   Revision 1.3  2003/10/06 17:06:55  florian
   Revision 1.3  2003/10/06 17:06:55  florian