Browse Source

* Initial CHM support for textmode IDE.

git-svn-id: trunk@11885 -
marco 17 years ago
parent
commit
a091b51e31
6 changed files with 843 additions and 97 deletions
  1. 1 0
      .gitattributes
  2. 314 2
      ide/Makefile
  3. 1 1
      ide/Makefile.fpc
  4. 186 0
      ide/wchmhwrap.pas
  5. 53 0
      ide/whtml.pas
  6. 288 94
      ide/whtmlhlp.pas

+ 1 - 0
.gitattributes

@@ -708,6 +708,7 @@ ide/unit.pt -text
 ide/vesa.pas svneol=native#text/plain
 ide/vesa.pas svneol=native#text/plain
 ide/wansi.pas svneol=native#text/plain
 ide/wansi.pas svneol=native#text/plain
 ide/wcedit.pas svneol=native#text/plain
 ide/wcedit.pas svneol=native#text/plain
+ide/wchmhwrap.pas svneol=native#text/plain
 ide/wconsole.pas svneol=native#text/plain
 ide/wconsole.pas svneol=native#text/plain
 ide/wconsts.pas svneol=native#text/plain
 ide/wconsts.pas svneol=native#text/plain
 ide/wconstse.inc svneol=native#text/plain
 ide/wconstse.inc svneol=native#text/plain

+ 314 - 2
ide/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/08/19]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/10/12]
 #
 #
 default: all
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
@@ -115,6 +115,10 @@ FPC:=$(shell $(FPCPROG) -PB)
 endif
 endif
 ifneq ($(findstring Error,$(FPC)),)
 ifneq ($(findstring Error,$(FPC)),)
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
 endif
 endif
 else
 else
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
@@ -1602,18 +1606,24 @@ else
 TAROPT=vz
 TAROPT=vz
 TAREXT=.tar.gz
 TAREXT=.tar.gz
 endif
 endif
-override REQUIRE_PACKAGES=rtl fv gdbint regexpr
+override REQUIRE_PACKAGES=rtl fv gdbint regexpr chm
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 REQUIRE_PACKAGES_GRAPH=1
 REQUIRE_PACKAGES_GRAPH=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
@@ -1621,336 +1631,508 @@ REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_WINUNITS-BASE=1
+REQUIRE_PACKAGES_WINUNITS-JEDI=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
 ifeq ($(FULL_TARGET),i386-haiku)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 ifeq ($(FULL_TARGET),i386-netware)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 ifeq ($(FULL_TARGET),i386-watcom)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 ifeq ($(FULL_TARGET),i386-netwlibc)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 ifeq ($(FULL_TARGET),i386-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 ifeq ($(FULL_TARGET),i386-symbian)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 ifeq ($(FULL_TARGET),m68k-atari)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 ifeq ($(FULL_TARGET),m68k-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 ifeq ($(FULL_TARGET),powerpc-macos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 ifeq ($(FULL_TARGET),powerpc-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_WINUNITS-BASE=1
+REQUIRE_PACKAGES_WINUNITS-JEDI=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
 ifeq ($(FULL_TARGET),arm-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 ifeq ($(FULL_TARGET),arm-gba)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 ifeq ($(FULL_TARGET),arm-nds)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 ifeq ($(FULL_TARGET),arm-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 ifeq ($(FULL_TARGET),arm-symbian)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
 ifeq ($(FULL_TARGET),avr-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
 ifeq ($(FULL_TARGET),armeb-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 ifeq ($(FULL_TARGET),armeb-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 endif
 ifdef REQUIRE_PACKAGES_RTL
 ifdef REQUIRE_PACKAGES_RTL
 PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
 PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
@@ -2056,6 +2238,84 @@ ifdef UNITDIR_REGEXPR
 override COMPILER_UNITDIR+=$(UNITDIR_REGEXPR)
 override COMPILER_UNITDIR+=$(UNITDIR_REGEXPR)
 endif
 endif
 endif
 endif
+ifdef REQUIRE_PACKAGES_FCL-BASE
+PACKAGEDIR_FCL-BASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-base/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FCL-BASE),)
+ifneq ($(wildcard $(PACKAGEDIR_FCL-BASE)/units/$(TARGETSUFFIX)),)
+UNITDIR_FCL-BASE=$(PACKAGEDIR_FCL-BASE)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FCL-BASE=$(PACKAGEDIR_FCL-BASE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FCL-BASE)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FCL-BASE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-BASE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FCL-BASE=
+UNITDIR_FCL-BASE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-base/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FCL-BASE),)
+UNITDIR_FCL-BASE:=$(firstword $(UNITDIR_FCL-BASE))
+else
+UNITDIR_FCL-BASE=
+endif
+endif
+ifdef UNITDIR_FCL-BASE
+override COMPILER_UNITDIR+=$(UNITDIR_FCL-BASE)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FCL-XML
+PACKAGEDIR_FCL-XML:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-xml/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FCL-XML),)
+ifneq ($(wildcard $(PACKAGEDIR_FCL-XML)/units/$(TARGETSUFFIX)),)
+UNITDIR_FCL-XML=$(PACKAGEDIR_FCL-XML)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FCL-XML=$(PACKAGEDIR_FCL-XML)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FCL-XML)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FCL-XML) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-XML)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FCL-XML=
+UNITDIR_FCL-XML:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-xml/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FCL-XML),)
+UNITDIR_FCL-XML:=$(firstword $(UNITDIR_FCL-XML))
+else
+UNITDIR_FCL-XML=
+endif
+endif
+ifdef UNITDIR_FCL-XML
+override COMPILER_UNITDIR+=$(UNITDIR_FCL-XML)
+endif
+endif
+ifdef REQUIRE_PACKAGES_CHM
+PACKAGEDIR_CHM:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /chm/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_CHM),)
+ifneq ($(wildcard $(PACKAGEDIR_CHM)/units/$(TARGETSUFFIX)),)
+UNITDIR_CHM=$(PACKAGEDIR_CHM)/units/$(TARGETSUFFIX)
+else
+UNITDIR_CHM=$(PACKAGEDIR_CHM)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_CHM)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_CHM) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_CHM)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_CHM=
+UNITDIR_CHM:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /chm/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_CHM),)
+UNITDIR_CHM:=$(firstword $(UNITDIR_CHM))
+else
+UNITDIR_CHM=
+endif
+endif
+ifdef UNITDIR_CHM
+override COMPILER_UNITDIR+=$(UNITDIR_CHM)
+endif
+endif
 ifdef REQUIRE_PACKAGES_GRAPH
 ifdef REQUIRE_PACKAGES_GRAPH
 PACKAGEDIR_GRAPH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /graph/Makefile.fpc,$(PACKAGESDIR))))))
 PACKAGEDIR_GRAPH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /graph/Makefile.fpc,$(PACKAGESDIR))))))
 ifneq ($(PACKAGEDIR_GRAPH),)
 ifneq ($(PACKAGEDIR_GRAPH),)
@@ -2082,6 +2342,58 @@ ifdef UNITDIR_GRAPH
 override COMPILER_UNITDIR+=$(UNITDIR_GRAPH)
 override COMPILER_UNITDIR+=$(UNITDIR_GRAPH)
 endif
 endif
 endif
 endif
+ifdef REQUIRE_PACKAGES_WINUNITS-BASE
+PACKAGEDIR_WINUNITS-BASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /winunits-base/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_WINUNITS-BASE),)
+ifneq ($(wildcard $(PACKAGEDIR_WINUNITS-BASE)/units/$(TARGETSUFFIX)),)
+UNITDIR_WINUNITS-BASE=$(PACKAGEDIR_WINUNITS-BASE)/units/$(TARGETSUFFIX)
+else
+UNITDIR_WINUNITS-BASE=$(PACKAGEDIR_WINUNITS-BASE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_WINUNITS-BASE)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_WINUNITS-BASE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_WINUNITS-BASE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_WINUNITS-BASE=
+UNITDIR_WINUNITS-BASE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /winunits-base/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_WINUNITS-BASE),)
+UNITDIR_WINUNITS-BASE:=$(firstword $(UNITDIR_WINUNITS-BASE))
+else
+UNITDIR_WINUNITS-BASE=
+endif
+endif
+ifdef UNITDIR_WINUNITS-BASE
+override COMPILER_UNITDIR+=$(UNITDIR_WINUNITS-BASE)
+endif
+endif
+ifdef REQUIRE_PACKAGES_WINUNITS-JEDI
+PACKAGEDIR_WINUNITS-JEDI:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /winunits-jedi/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_WINUNITS-JEDI),)
+ifneq ($(wildcard $(PACKAGEDIR_WINUNITS-JEDI)/units/$(TARGETSUFFIX)),)
+UNITDIR_WINUNITS-JEDI=$(PACKAGEDIR_WINUNITS-JEDI)/units/$(TARGETSUFFIX)
+else
+UNITDIR_WINUNITS-JEDI=$(PACKAGEDIR_WINUNITS-JEDI)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_WINUNITS-JEDI)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_WINUNITS-JEDI) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_WINUNITS-JEDI)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_WINUNITS-JEDI=
+UNITDIR_WINUNITS-JEDI:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /winunits-jedi/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_WINUNITS-JEDI),)
+UNITDIR_WINUNITS-JEDI:=$(firstword $(UNITDIR_WINUNITS-JEDI))
+else
+UNITDIR_WINUNITS-JEDI=
+endif
+endif
+ifdef UNITDIR_WINUNITS-JEDI
+override COMPILER_UNITDIR+=$(UNITDIR_WINUNITS-JEDI)
+endif
+endif
 ifndef NOCPUDEF
 ifndef NOCPUDEF
 override FPCOPTDEF=$(ARCH)
 override FPCOPTDEF=$(ARCH)
 endif
 endif

+ 1 - 1
ide/Makefile.fpc

@@ -21,7 +21,7 @@ fpcpackage=y
 options=-Sg
 options=-Sg
 
 
 [require]
 [require]
-packages=fv gdbint regexpr
+packages=fv gdbint regexpr chm
 packages_go32v2=graph
 packages_go32v2=graph
 libc=y
 libc=y
 
 

+ 186 - 0
ide/wchmhwrap.pas

@@ -0,0 +1,186 @@
+{
+    This file is part of the Free Pascal Integrated Development Environment
+    Copyright (c) 2008 by Marco van de Voort
+
+    Wrapper for CHM reading to avoid having to import Delphi units into whtmlhlp,
+      which can cause all kinds of namespace conflicts.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit wchmhwrap;
+
+interface 
+{$Mode Delphi}
+
+Uses  wutils,whelp,whtml,SysUtils,ChmReader,ChmSiteMap,Classes;
+
+Type
+//      TopicLinks: PTopicLinkCollection;IndexEntries : PUnsortedIndexEntryCollection;  
+
+     TChmWrapper = Class
+                     private
+                       ffs   : Classes.TFileStream;
+                       fchmr : TChmReader;
+                       findex: TChmSiteMap;
+                       ftopic: TChmSiteMap;
+                       floaded  : boolean;
+                     public    
+                      constructor Create(name:String);
+                      function	  LoadIndex(id:integer;TopicLinks: PTopicLinkCollection;IndexEntries : PUnsortedIndexEntryCollection;helpfacility:PHelpFacility):boolean;
+                      function    GetTopic(name:string):PMemoryTextFile;
+                      destructor  Destroy;override;
+                    end;
+
+function combinepaths(relpath,basepath:String):String;
+
+implementation
+
+function combinepaths(relpath,basepath:String):String;
+
+begin
+  {$ifdef combinedebug}
+    debugmessage({$i %file%},'combine in "'+relpath+'" and "'+basepath+'"'+{$i %line%},1,1);
+  {$endif}
+
+  if relpath='' then exit;
+  if relpath[length(relpath)]<>'/' Then
+    basepath:=extractfiledir(basepath);
+  while (length(relpath)>0) and (copy(relpath,1,3)='../') do
+     begin
+       basepath:=extractfiledir(basepath);
+       delete(relpath,1,3);
+     end;
+       
+   {$ifdef combinedebug}
+    debugmessage({$i %file%},'combine out "'+relpath+'" and "'+basepath+'"'+{$i %line%},1,1);
+  {$endif}
+  
+  result:=basepath+relpath;
+end;
+
+
+Constructor TChmWrapper.Create(name:string);
+
+begin
+  ffs:=Classes.TFileStream.create(name,fmOpenRead);
+  fchmr:=TChmReader.Create(ffs,True);
+  findex:=nil;
+  if not fchmr.isvalidfile then
+    begin
+      freeandnil(fchmr);
+      freeandnil(ffs);
+      exit;  
+    end;      
+  {$ifdef wdebug}
+    debugmessage({$i %file%},'TCHMWrapper: before sitemap creation '+{$i %line%},1,1);
+  {$endif}
+  findex:=TChmSiteMap.create(stindex);
+  ftopic:=TChmSiteMap.create(sttoc);
+  {$ifdef wdebug}
+    debugmessage({$i %file%},'TCHMWrapper: after sitemap creation '+{$i %line%}+inttostr(ptrint(findex)),1,1);
+  {$endif}
+  floaded:=false;
+end;
+
+function TChmWrapper.LoadIndex(id:integer;TopicLinks: PTopicLinkCollection;IndexEntries : PUnsortedIndexEntryCollection;helpfacility:PHelpFacility):boolean;
+function FormatAlias(Alias: string): string;
+begin
+  if Assigned(HelpFacility) then
+    if length(Alias)>HelpFacility^.IndexTabSize-4 then
+       Alias:=Trim(copy(Alias,1,HelpFacility^.IndexTabSize-4-2))+'..';
+//  if (length(alias)>0) and (alias[1]<>'/') then Alias:='/'+alias;
+  FormatAlias:=Alias;
+end;
+              
+var
+    m : Classes.TMemoryStream;
+    i,j : integer;
+    item : TChmSiteMapItem;
+    tli: integer;
+begin
+ result:=false;
+ if not assigned (fchmr) then exit;
+ if floaded then exit;
+//  m:=Classes.TMemorystream.create;
+  m:=fchmr.getobject(fchmr.indexfile);
+  try
+  {$ifdef wdebug}
+     debugmessage({$i %file%},'TCHMWrapper: before loadfromstream '+{$i %line%},1,1);
+     debugmessage({$i %file%},'TCHMWrapper: stream size loaded'+inttostr(m.size),1,1); 
+  {$endif}
+    findex.loadfromStream(m);
+  finally
+    freeandnil(m);
+    end;
+   {$ifdef wdebug}
+     debugmessage({$i %file%},'TCHMWrapper: loadindex after final '+{$i %line%},1,1); 
+  {$endif}
+  
+  tli:=TopicLinks^.AddItem(fchmr.defaultpage); 
+  TLI:=EncodeHTMLCtx(ID,TLI+1);
+  IndexEntries^.Insert(NewIndexEntry(  FormatAlias('Table of contents'),ID,TLI));
+  for i:=0 to findex.items.count-1 do
+    begin
+      item:=findex.items.item[i];
+      tli:=TopicLinks^.AddItem('/'+item.local); 
+      TLI:=EncodeHTMLCtx(ID,TLI+1);
+      IndexEntries^.Insert(NewIndexEntry(  FormatAlias(item.text),ID,TLI));
+    end;
+   {$ifdef wdebug}
+     debugmessage({$i %file%},'TCHMWrapper: endloadindex '+{$i %line%},1,1); 
+  {$endif}
+  floaded:=true;
+  result:=true;
+end;
+
+function   TChmWrapper.GetTopic(name:string):PMemoryTextFile;
+
+var
+  m : Classes.TMemorystream;
+  linedata:Classes.TStringList;
+  i : integer;
+begin
+  result:=nil;
+  if not assigned(fchmr) or (name='') then exit;
+  
+  If name[1]<>'/' Then
+    name:='/'+name;
+  linedata:=Classes.TStringList.create;
+  try
+    {$ifdef wdebug}
+     debugmessage({$i %file%},'TCHMWrapper: Getting file '+name+' '+{$i %line%},1,1); 
+    {$endif}
+//    if uppercase(name)='TABLE OF CONTENTS' Then
+  //    m:=fchmr.getobject(fchmr.tocfile)
+//    else
+      m:=fchmr.getobject(name);
+    
+    if not assigned(m) then exit;
+    linedata.loadfromstream(m);
+    result:=new(PMemoryTextFile,Init);
+    for i:=0 to linedata.count-1 do
+       result.addline(linedata[i]);
+  finally
+    m.free;
+    linedata.free;
+  end;
+end;
+
+
+destructor TChmWrapper.Destroy;
+
+begin
+  freeandnil(ftopic);
+  freeandnil(findex);
+  freeandnil(fchmr);
+end;
+// m:=r.getobject(r.indexfile);
+//  siteindex.loadfromStream(m);
+
+end.

+ 53 - 0
ide/whtml.pas

@@ -115,6 +115,18 @@ type
       procedure   DocHorizontalRuler; virtual;
       procedure   DocHorizontalRuler; virtual;
     end;
     end;
 
 
+Type
+    PTopicLinkCollection = ^TTopicLinkCollection;
+    TTopicLinkCollection = object(TStringCollection)
+      procedure   Insert(Item: Pointer); virtual;
+      function    At(Index: sw_Integer): PString;
+      function    AddItem(Item: string): integer;
+    end;
+
+function EncodeHTMLCtx(FileID: integer; LinkNo: word): longint;
+procedure DecodeHTMLCtx(Ctx: longint; var FileID: word; var LinkNo: word);
+
+
 implementation
 implementation
 
 
 uses
 uses
@@ -859,6 +871,47 @@ procedure THTMLParser.DocHorizontalRuler;
 begin
 begin
 end;
 end;
 
 
+function EncodeHTMLCtx(FileID: integer; LinkNo: word): longint;
+var Ctx: longint;
+begin
+  Ctx:=(longint(FileID) shl 16)+LinkNo;
+  EncodeHTMLCtx:=Ctx;
+end;
+
+procedure DecodeHTMLCtx(Ctx: longint; var FileID: word; var LinkNo: word);
+begin
+  if (Ctx shr 16)=0 then
+    begin
+      FileID:=$ffff; LinkNo:=0;
+    end
+  else
+    begin
+      FileID:=Ctx shr 16; LinkNo:=Ctx and $ffff;
+    end;
+end;
+
+
+procedure TTopicLinkCollection.Insert(Item: Pointer);
+begin
+  AtInsert(Count,Item);
+end;
+
+function TTopicLinkCollection.At(Index: sw_Integer): PString;
+begin
+  At:=inherited At(Index);
+end;
+
+function TTopicLinkCollection.AddItem(Item: string): integer;
+var Idx: sw_integer;
+begin
+  if Item='' then Idx:=-1 else
+  if Search(@Item,Idx)=false then
+    begin
+      AtInsert(Count,NewStr(Item));
+      Idx:=Count-1;
+    end;
+  AddItem:=Idx;
+end;
 
 
 
 
 END.
 END.

+ 288 - 94
ide/whtmlhlp.pas

@@ -14,11 +14,12 @@ unit WHTMLHlp;
 
 
 interface
 interface
 
 
-uses Objects,WHTML,WAnsi,WHelp;
+uses Objects,WHTML,WAnsi,WHelp,WChmHWrap;
 
 
 const
 const
      extHTML              = '.htm';
      extHTML              = '.htm';
      extHTMLIndex         = '.htx';
      extHTMLIndex         = '.htx';
+     extCHM		  = '.chm';
 
 
      ListIndent = 2;
      ListIndent = 2;
      DefIndent  = 4;
      DefIndent  = 4;
@@ -28,13 +29,6 @@ const
 type
 type
     THTMLSection = (hsNone,hsHeading1,hsHeading2,hsHeading3,hsHeading4,hsHeading5,hsHeading6);
     THTMLSection = (hsNone,hsHeading1,hsHeading2,hsHeading3,hsHeading4,hsHeading5,hsHeading6);
 
 
-    PTopicLinkCollection = ^TTopicLinkCollection;
-    TTopicLinkCollection = object(TStringCollection)
-      procedure   Insert(Item: Pointer); virtual;
-      function    At(Index: sw_Integer): PString;
-      function    AddItem(Item: string): integer;
-    end;
-
     TParagraphAlign = (paLeft,paCenter,paRight);
     TParagraphAlign = (paLeft,paCenter,paRight);
 
 
     PTableElement = ^TTableElement;
     PTableElement = ^TTableElement;
@@ -116,6 +110,7 @@ type
       procedure DocTableHeaderItem(Entered: boolean); virtual;
       procedure DocTableHeaderItem(Entered: boolean); virtual;
       procedure DocTableItem(Entered: boolean); virtual;
       procedure DocTableItem(Entered: boolean); virtual;
       procedure DocHorizontalRuler; virtual;
       procedure DocHorizontalRuler; virtual;
+      function CanonicalizeURL(const Base,Relative:String):string; virtual;
     public
     public
       function  GetSectionColor(Section: THTMLSection; var Color: byte): boolean; virtual;
       function  GetSectionColor(Section: THTMLSection; var Color: byte): boolean; virtual;
     private
     private
@@ -148,24 +143,28 @@ type
       procedure AddCharAt(C: char;AtPtr : sw_word);
       procedure AddCharAt(C: char;AtPtr : sw_word);
       function AddTextAt(const S: string;AtPtr : sw_word) : sw_word;
       function AddTextAt(const S: string;AtPtr : sw_word) : sw_word;
       function ComputeTextLength(TStart,TEnd : sw_word) : sw_word;
       function ComputeTextLength(TStart,TEnd : sw_word) : sw_word;
-
     end;
     end;
 
 
+    PCHMTopicRenderer = ^TCHMTopicRenderer;
+    TCHMTopicRenderer = object(THTMLTopicRenderer)
+      function CanonicalizeURL(const Base,Relative:String):string; virtual;
+      end;
+      
     PCustomHTMLHelpFile = ^TCustomHTMLHelpFile;
     PCustomHTMLHelpFile = ^TCustomHTMLHelpFile;
     TCustomHTMLHelpFile = object(THelpFile)
     TCustomHTMLHelpFile = object(THelpFile)
       constructor Init(AID: word);
       constructor Init(AID: word);
       destructor  Done; virtual;
       destructor  Done; virtual;
     public
     public
+      Renderer: PHTMLTopicRenderer;
       function    GetTopicInfo(T: PTopic) : string; virtual;
       function    GetTopicInfo(T: PTopic) : string; virtual;
       function    SearchTopic(HelpCtx: THelpCtx): PTopic; virtual;
       function    SearchTopic(HelpCtx: THelpCtx): PTopic; virtual;
       function    ReadTopic(T: PTopic): boolean; virtual;
       function    ReadTopic(T: PTopic): boolean; virtual;
     private
     private
-      Renderer: PHTMLTopicRenderer;
       DefaultFileName: string;
       DefaultFileName: string;
       CurFileName: string;
       CurFileName: string;
       TopicLinks: PTopicLinkCollection;
       TopicLinks: PTopicLinkCollection;
     end;
     end;
-
+   
     PHTMLHelpFile = ^THTMLHelpFile;
     PHTMLHelpFile = ^THTMLHelpFile;
     THTMLHelpFile = object(TCustomHTMLHelpFile)
     THTMLHelpFile = object(TCustomHTMLHelpFile)
       constructor Init(AFileName: string; AID: word; ATOCEntry: string);
       constructor Init(AFileName: string; AID: word; ATOCEntry: string);
@@ -175,6 +174,19 @@ type
       TOCEntry: string;
       TOCEntry: string;
     end;
     end;
 
 
+    PCHMHelpFile = ^TCHMHelpFile;
+    TCHMHelpFile = object(TCustomHTMLHelpFile)
+      constructor Init(AFileName: string; AID: word);
+      destructor  Done; virtual; 
+    public
+      function    LoadIndex: boolean; virtual;
+      function    ReadTopic(T: PTopic): boolean; virtual;
+      function    GetTopicInfo(T: PTopic) : string; virtual;
+      function    SearchTopic(HelpCtx: THelpCtx): PTopic; virtual;
+    private
+      Chmw: TCHMWrapper;
+    end;
+
     PHTMLIndexHelpFile = ^THTMLIndexHelpFile;
     PHTMLIndexHelpFile = ^THTMLIndexHelpFile;
     THTMLIndexHelpFile = object(TCustomHTMLHelpFile)
     THTMLIndexHelpFile = object(TCustomHTMLHelpFile)
       constructor Init(AFileName: string; AID: word);
       constructor Init(AFileName: string; AID: word);
@@ -527,25 +539,6 @@ begin
   DefHTMLGetSectionColor:=false;
   DefHTMLGetSectionColor:=false;
 end;
 end;
 
 
-function EncodeHTMLCtx(FileID: integer; LinkNo: word): longint;
-var Ctx: longint;
-begin
-  Ctx:=(longint(FileID) shl 16)+LinkNo;
-  EncodeHTMLCtx:=Ctx;
-end;
-
-procedure DecodeHTMLCtx(Ctx: longint; var FileID: word; var LinkNo: word);
-begin
-  if (Ctx shr 16)=0 then
-    begin
-      FileID:=$ffff; LinkNo:=0;
-    end
-  else
-    begin
-      FileID:=Ctx shr 16; LinkNo:=Ctx and $ffff;
-    end;
-end;
-
 function CharStr(C: char; Count: byte): string;
 function CharStr(C: char; Count: byte): string;
 var S: string;
 var S: string;
 begin
 begin
@@ -554,27 +547,6 @@ begin
   CharStr:=S;
   CharStr:=S;
 end;
 end;
 
 
-procedure TTopicLinkCollection.Insert(Item: Pointer);
-begin
-  AtInsert(Count,Item);
-end;
-
-function TTopicLinkCollection.At(Index: sw_Integer): PString;
-begin
-  At:=inherited At(Index);
-end;
-
-function TTopicLinkCollection.AddItem(Item: string): integer;
-var Idx: sw_integer;
-begin
-  if Item='' then Idx:=-1 else
-  if Search(@Item,Idx)=false then
-    begin
-      AtInsert(Count,NewStr(Item));
-      Idx:=Count-1;
-    end;
-  AddItem:=Idx;
-end;
 
 
 function THTMLTopicRenderer.DocAddTextChar(C: char): boolean;
 function THTMLTopicRenderer.DocAddTextChar(C: char): boolean;
 var Added: boolean;
 var Added: boolean;
@@ -662,9 +634,9 @@ begin
       if Name<>'' then
       if Name<>'' then
         begin
         begin
           Topic^.NamedMarks^.InsertStr(Name);
           Topic^.NamedMarks^.InsertStr(Name);
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           DebugMessage('',' Adding Name "'+Name+'"',1,1);
           DebugMessage('',' Adding Name "'+Name+'"',1,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           AddChar(hscNamedMark);
           AddChar(hscNamedMark);
         end;
         end;
       if (HRef<>'')then
       if (HRef<>'')then
@@ -674,13 +646,17 @@ begin
             begin
             begin
               InAnchor:=true;
               InAnchor:=true;
               AddChar(hscLink);
               AddChar(hscLink);
+{$IFDEF WDEBUG}
+              DebugMessage('',' Adding Link1 "'+HRef+'"'+' "'+url+'"',1,1);
+{$endif WDEBUG}
+              
               if pos('#',HRef)=1 then
               if pos('#',HRef)=1 then
                 Href:=NameAndExtOf(GetFilename)+Href;
                 Href:=NameAndExtOf(GetFilename)+Href;
-              HRef:=CompleteURL(URL,HRef);
+              HRef:=canonicalizeURL(URL,HRef);
               LinkIndexes[LinkPtr]:=TopicLinks^.AddItem(HRef);
               LinkIndexes[LinkPtr]:=TopicLinks^.AddItem(HRef);
-{$ifdef DEBUG}
-              DebugMessage('',' Adding Link "'+HRef+'"',1,1);
-{$endif DEBUG}
+{$IFDEF WDEBUG}
+              DebugMessage('',' Adding Link2 "'+HRef+'"',1,1);
+{$endif WDEBUG}
               Inc(LinkPtr);
               Inc(LinkPtr);
             end;
             end;
           end;
           end;
@@ -694,10 +670,10 @@ end;
 
 
 procedure THTMLTopicRenderer.DocUnknownTag;
 procedure THTMLTopicRenderer.DocUnknownTag;
 begin
 begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
   DebugMessage('',' Unknown tag "'+TagName+'" params "'+
   DebugMessage('',' Unknown tag "'+TagName+'" params "'+
     TagParams+'"',1,1);
     TagParams+'"',1,1);
-{$endif DEBUG}
+{$endif WDEBUG}
 end;
 end;
 
 
 procedure DecodeAlign(Align: string; var PAlign: TParagraphAlign);
 procedure DecodeAlign(Align: string; var PAlign: TParagraphAlign);
@@ -740,6 +716,12 @@ begin
     end;
     end;
 end;
 end;
 
 
+Function  THTMLTopicRenderer.CanonicalizeURL(const Base,Relative:String):string; 
+// uses info from filesystem (curdir) -> overriden for CHM.
+begin
+ CanonicalizeURL:=CompleteURL(Base,relative);
+end;
+
 procedure THTMLTopicRenderer.DocParagraph(Entered: boolean);
 procedure THTMLTopicRenderer.DocParagraph(Entered: boolean);
 var Align: string;
 var Align: string;
 begin
 begin
@@ -776,20 +758,20 @@ var
 begin
 begin
   if pos('tex4ht:',Comment)=0 then
   if pos('tex4ht:',Comment)=0 then
     exit;
     exit;
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
   DebugMessage(GetFileName,'tex4ht comment "'
   DebugMessage(GetFileName,'tex4ht comment "'
         +Comment+'"',Line,1);
         +Comment+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
   if SuppressOutput then
   if SuppressOutput then
     begin
     begin
       if (pos(SuppressUntil,Comment)=0) then
       if (pos(SuppressUntil,Comment)=0) then
         exit
         exit
       else
       else
         begin
         begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           DebugMessage(GetFileName,' Found '+SuppressUntil+'comment "'
           DebugMessage(GetFileName,' Found '+SuppressUntil+'comment "'
             +Comment+'" SuppressOuput reset to false',Line,1);
             +Comment+'" SuppressOuput reset to false',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           SuppressOutput:=false;
           SuppressOutput:=false;
           SuppressUntil:='';
           SuppressUntil:='';
         end;
         end;
@@ -797,20 +779,20 @@ begin
   if (pos('tex4ht:graphics ',Comment)>0) and
   if (pos('tex4ht:graphics ',Comment)>0) and
      LastAnsiLoadFailed then
      LastAnsiLoadFailed then
     begin
     begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
       DebugMessage(GetFileName,' Using tex4ht comment "'
       DebugMessage(GetFileName,' Using tex4ht comment "'
         +Comment+'"',Line,1);
         +Comment+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
       { Try again with this info }
       { Try again with this info }
       TagParams:=Comment;
       TagParams:=Comment;
       DocImage;
       DocImage;
     end;
     end;
   if (pos('tex4ht:syntaxdiagram ',Comment)>0) then
   if (pos('tex4ht:syntaxdiagram ',Comment)>0) then
     begin
     begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
       DebugMessage(GetFileName,' Using tex4ht:syntaxdiagram comment "'
       DebugMessage(GetFileName,' Using tex4ht:syntaxdiagram comment "'
         +Comment+'"',Line,1);
         +Comment+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
       { Try again with this info }
       { Try again with this info }
       TagParams:=Comment;
       TagParams:=Comment;
       DocImage;
       DocImage;
@@ -822,10 +804,10 @@ begin
     end;
     end;
   if (pos('tex4ht:mysyntdiag ',Comment)>0) then
   if (pos('tex4ht:mysyntdiag ',Comment)>0) then
     begin
     begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
       DebugMessage(GetFileName,' Using tex4ht:mysyntdiag comment "'
       DebugMessage(GetFileName,' Using tex4ht:mysyntdiag comment "'
         +Comment+'"',Line,1);
         +Comment+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
       { Try again with this info }
       { Try again with this info }
       TagParams:=Comment;
       TagParams:=Comment;
       DocGetTagParam('SRC',src);
       DocGetTagParam('SRC',src);
@@ -849,16 +831,16 @@ var Name,Src,Alt,SrcLine: string;
 begin
 begin
   if SuppressOutput then
   if SuppressOutput then
     exit;
     exit;
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
   if not DocGetTagParam('NAME',Name) then
   if not DocGetTagParam('NAME',Name) then
      Name:='<No name>';
      Name:='<No name>';
   DebugMessage(GetFileName,' Image "'+Name+'"',Line,1);
   DebugMessage(GetFileName,' Image "'+Name+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
   if DocGetTagParam('SRC',src) then
   if DocGetTagParam('SRC',src) then
     begin
     begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
       DebugMessage(GetFileName,' Image source tag "'+Src+'"',Line,1);
       DebugMessage(GetFileName,' Image source tag "'+Src+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
       if src<>'' then
       if src<>'' then
         begin
         begin
           src:=CompleteURL(URL,src);
           src:=CompleteURL(URL,src);
@@ -866,24 +848,24 @@ begin
             Try to see if a file with same name and extension .git
             Try to see if a file with same name and extension .git
             exists PM }
             exists PM }
           src:=DirAndNameOf(src)+'.ans';
           src:=DirAndNameOf(src)+'.ans';
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           DebugMessage(GetFileName,' Trying "'+Src+'"',Line,1);
           DebugMessage(GetFileName,' Trying "'+Src+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           if not ExistsFile(src) then
           if not ExistsFile(src) then
             begin
             begin
               DocGetTagParam('SRC',src);
               DocGetTagParam('SRC',src);
               src:=DirAndNameOf(src)+'.ans';
               src:=DirAndNameOf(src)+'.ans';
               src:=CompleteURL(DirOf(URL)+'../',src);
               src:=CompleteURL(DirOf(URL)+'../',src);
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
               DebugMessage(GetFileName,' Trying "'+Src+'"',Line,1);
               DebugMessage(GetFileName,' Trying "'+Src+'"',Line,1);
-{$endif DEBUG}
+{$endif wDEBUG}
             end;
             end;
           if not ExistsFile(src) then
           if not ExistsFile(src) then
             begin
             begin
               LastAnsiLoadFailed:=true;
               LastAnsiLoadFailed:=true;
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
               DebugMessage(GetFileName,' "'+Src+'" not found',Line,1);
               DebugMessage(GetFileName,' "'+Src+'" not found',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
             end
             end
           else
           else
             begin
             begin
@@ -908,9 +890,9 @@ begin
           if not ExistsFile(src) then
           if not ExistsFile(src) then
             begin
             begin
               LastAnsiLoadFailed:=true;
               LastAnsiLoadFailed:=true;
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
               DebugMessage(GetFileName,' "'+Src+'" not found',Line,1);
               DebugMessage(GetFileName,' "'+Src+'" not found',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
             end
             end
           else
           else
             begin
             begin
@@ -1336,6 +1318,11 @@ begin
   BuildTopic:=OK;
   BuildTopic:=OK;
 end;
 end;
 
 
+Function  TCHMTopicRenderer.CanonicalizeURL(const Base,Relative:String):string; 
+begin
+ CanonicalizeUrl:=combinepaths(relative,base);
+end;
+
 constructor TCustomHTMLHelpFile.Init(AID: word);
 constructor TCustomHTMLHelpFile.Init(AID: word);
 begin
 begin
   inherited Init(AID);
   inherited Init(AID);
@@ -1388,10 +1375,14 @@ begin
       else
       else
         begin
         begin
           Link:=TopicLinks^.At((T^.HelpCtx and $ffff)-1)^;
           Link:=TopicLinks^.At((T^.HelpCtx and $ffff)-1)^;
+{$IFDEF WDEBUG}
+          DebugMessage(Link,' looking before for ',1,1);
+{$endif WDEBUG}
+          
           Link:=FormatPath(Link);
           Link:=FormatPath(Link);
-{$ifdef DEBUG_WHTMLHLP}
-          DebugMessage(Link,' looking for',1,1);
-{$endif DEBUG_WHTMLHLP}
+{$IFDEF WDEBUG}
+          DebugMessage(Link,' looking after for ',1,1);
+{$endif WDEBUG}
           P:=Pos('#',Link);
           P:=Pos('#',Link);
           if P>0 then
           if P>0 then
           begin
           begin
@@ -1425,10 +1416,15 @@ begin
       else
       else
         begin
         begin
           Link:=TopicLinks^.At((T^.HelpCtx and $ffff)-1)^;
           Link:=TopicLinks^.At((T^.HelpCtx and $ffff)-1)^;
+{$IFDEF WDEBUG}
+          DebugMessage(Link,' looking before for ',1,1);
+{$endif WDEBUG}
+          
           Link:=FormatPath(Link);
           Link:=FormatPath(Link);
-{$ifdef DEBUG}
-          DebugMessage(Link,' looking for',1,1);
-{$endif DEBUG}
+{$IFDEF WDEBUG}
+          DebugMessage(Link,' looking after for ',1,1);
+{$endif WDEBUG}
+
           P:=Pos('#',Link);
           P:=Pos('#',Link);
           if P>0 then
           if P>0 then
           begin
           begin
@@ -1450,18 +1446,18 @@ begin
         end;
         end;
       if (HTMLFile=nil) then
       if (HTMLFile=nil) then
         begin
         begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           DebugMessage(Link,' filename not known :(',1,1);
           DebugMessage(Link,' filename not known :(',1,1);
 {$endif DEBUG}
 {$endif DEBUG}
         end;
         end;
       if (p>1) and (HTMLFile=nil) then
       if (p>1) and (HTMLFile=nil) then
         begin
         begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           if p>0 then
           if p>0 then
             DebugMessage(Name,Link+'#'+Bookmark+' not found',1,1)
             DebugMessage(Name,Link+'#'+Bookmark+' not found',1,1)
           else
           else
             DebugMessage(Name,Link+' not found',1,1);
             DebugMessage(Name,Link+' not found',1,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           New(HTMLFile, Init);
           New(HTMLFile, Init);
           HTMLFile^.AddLine('<HEAD><TITLE>'+msg_pagenotavailable+'</TITLE></HEAD>');
           HTMLFile^.AddLine('<HEAD><TITLE>'+msg_pagenotavailable+'</TITLE></HEAD>');
           HTMLFile^.AddLine(
           HTMLFile^.AddLine(
@@ -1474,12 +1470,12 @@ begin
         CurFileName:=Name
         CurFileName:=Name
       else
       else
         begin
         begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           if p>0 then
           if p>0 then
             DebugMessage(Name,Link+'#'+Bookmark+' not found',1,1)
             DebugMessage(Name,Link+'#'+Bookmark+' not found',1,1)
           else
           else
             DebugMessage(Name,Link+' not found',1,1);
             DebugMessage(Name,Link+' not found',1,1);
-{$endif DEBUG}
+{$endif WDEBUG}
         end;
         end;
       if HTMLFile<>nil then Dispose(HTMLFile, Done);
       if HTMLFile<>nil then Dispose(HTMLFile, Done);
       if BookMark='' then
       if BookMark='' then
@@ -1487,10 +1483,10 @@ begin
       else
       else
         begin
         begin
           P:=T^.GetNamedMarkIndex(BookMark);
           P:=T^.GetNamedMarkIndex(BookMark);
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           if p=-1 then
           if p=-1 then
             DebugMessage(Name,Link+'#'+Bookmark+' bookmark not found',1,1);
             DebugMessage(Name,Link+'#'+Bookmark+' bookmark not found',1,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           T^.StartNamedMark:=P+1;
           T^.StartNamedMark:=P+1;
         end;
         end;
     end;
     end;
@@ -1576,6 +1572,194 @@ begin
   LoadIndex:=OK;
   LoadIndex:=OK;
 end;
 end;
 
 
+constructor TChmHelpFile.Init(AFileName: string; AID: word);
+begin
+  if inherited Init(AID)=false then Fail;
+  renderer^.done;
+  renderer:=New(PCHMTopicRenderer, Init);
+  DefaultFileName:=AFileName; 
+  if (DefaultFileName='') or not ExistsFile(DefaultFilename) then
+  begin
+    Done;
+    Fail;
+  end
+  else
+    chmw:=TCHMWrapper.Create(DefaultFileName);
+end;
+
+function    TChmHelpFile.LoadIndex: boolean; 
+begin
+  loadindex:=false;
+  if assigned(chmw) then
+    loadindex:=chmw.loadindex(id,TopicLinks,IndexEntries,helpfacility);
+end;
+
+function TChmHelpFile.SearchTopic(HelpCtx: THelpCtx): PTopic;
+function MatchCtx(P: PTopic): boolean;
+begin
+  MatchCtx:=P^.HelpCtx=HelpCtx;
+end;
+var FileID,LinkNo: word;
+    P: PTopic;
+    FName: string;
+begin
+  DecodeHTMLCtx(HelpCtx,FileID,LinkNo);
+  if (HelpCtx<>0) and (FileID<>ID) then P:=nil else
+  if (FileID=ID) and (LinkNo>TopicLinks^.Count) then P:=nil else
+    begin
+      P:=Topics^.FirstThat(@MatchCtx);
+      if P=nil then
+        begin
+          if LinkNo=0 then
+            FName:=DefaultFileName
+          else
+            FName:=TopicLinks^.At(LinkNo-1)^;
+          P:=NewTopic(ID,HelpCtx,0,FName,nil,0);
+          Topics^.Insert(P);
+        end;
+    end;
+  SearchTopic:=P;
+end;
+
+function TChmHelpFile.GetTopicInfo(T: PTopic) : string;
+var OK: boolean;
+    Name: string;
+    Link,Bookmark: string;
+    P: sw_integer;
+begin
+  Bookmark:='';
+  OK:=T<>nil;
+  if OK then
+    begin
+      if T^.HelpCtx=0 then
+        begin
+          Name:=DefaultFileName;
+          P:=0;
+        end
+      else
+        begin
+          Link:=TopicLinks^.At((T^.HelpCtx and $ffff)-1)^;
+          Link:=FormatPath(Link);
+{$IFDEF WDEBUG}
+          DebugMessage(Link,' looking for',1,1);
+{$endif WDEBUG}
+          P:=Pos('#',Link);
+          if P>0 then
+          begin
+            Bookmark:=copy(Link,P+1,length(Link));
+            Link:=copy(Link,1,P-1);
+          end;
+{          if CurFileName='' then Name:=Link else
+          Name:=CompletePath(CurFileName,Link);}
+          Name:=Link;
+        end;
+    end;
+  GetTopicInfo:=Name+'#'+BookMark;
+end;
+
+function TChmHelpFile.ReadTopic(T: PTopic): boolean;
+var OK: boolean;
+    HTMLFile: PMemoryTextFile;
+    Name: string;
+    Link,Bookmark: string;
+    P: sw_integer;
+begin
+  Bookmark:='';
+  OK:=T<>nil;
+  if OK then
+    begin
+      if T^.HelpCtx=0 then
+        begin
+          Name:=DefaultFileName;
+          P:=0;
+        end
+      else
+        begin
+          Link:=TopicLinks^.At((T^.HelpCtx and $ffff)-1)^;
+{$IFDEF WDEBUG}
+          DebugMessage(Link,' looking for',1,1);
+{$endif WDEBUG}
+
+          Link:=FormatPath(Link);
+{$IFDEF WDEBUG}
+          DebugMessage(Link,' looking for',1,1);
+{$endif WDEBUG}
+          P:=Pos('#',Link);
+          if P>0 then
+          begin
+            Bookmark:=copy(Link,P+1,length(Link));
+            Link:=copy(Link,1,P-1);
+          end;
+{          if CurFileName='' then Name:=Link else
+          Name:=CompletePath(CurFileName,Link);}
+          Name:=Link;
+        end;
+      HTMLFile:=nil;
+      if Name<>'' then
+        HTMLFile:=chmw.gettopic(name);
+
+      if (HTMLFile=nil) and (CurFileName<>'') then
+        begin
+          Name:=CurFileName;
+          HTMLFile:=chmw.gettopic(name);
+        end;
+      if (HTMLFile=nil) then
+        begin
+{$IFDEF WDEBUG}
+          DebugMessage(Link,' filename not known :(',1,1);
+{$endif WDEBUG}
+        end;
+      if (p>1) and (HTMLFile=nil) then
+        begin
+{$IFDEF WDEBUG}
+          if p>0 then
+            DebugMessage(Name,Link+'#'+Bookmark+' not found',1,1)
+          else
+            DebugMessage(Name,Link+' not found',1,1);
+{$endif WDEBUG}
+          New(HTMLFile, Init);
+          HTMLFile^.AddLine('<HEAD><TITLE>'+msg_pagenotavailable+'</TITLE></HEAD>');
+          HTMLFile^.AddLine(
+            '<BODY>'+
+            FormatStrStr(msg_cantaccessurl,Name)+'<br><br>'+
+            '</BODY>');
+        end;
+      OK:=Renderer^.BuildTopic(T,Name,HTMLFile,TopicLinks);
+      if OK then
+        CurFileName:=Name
+      else
+        begin
+{$IFDEF WDEBUG}
+          if p>0 then
+            DebugMessage(Name,Link+'#'+Bookmark+' not found',1,1)
+          else
+            DebugMessage(Name,Link+' not found',1,1);
+{$endif WDEBUG}
+        end;
+      if HTMLFile<>nil then Dispose(HTMLFile, Done);
+      if BookMark='' then
+        T^.StartNamedMark:=0
+      else
+        begin
+          P:=T^.GetNamedMarkIndex(BookMark);
+{$IFDEF WDEBUG}
+          if p=-1 then
+            DebugMessage(Name,Link+'#'+Bookmark+' bookmark not found',1,1);
+{$endif WDEBUG}
+          T^.StartNamedMark:=P+1;
+        end;
+    end;
+  ReadTopic:=OK;
+end;
+
+destructor TChmHelpFile.done;
+
+begin
+ if assigned(chmw) then
+  chmw.free;
+ inherited Done;
+end;
+
 function CreateProcHTML(const FileName,Param: string;Index : longint): PHelpFile;
 function CreateProcHTML(const FileName,Param: string;Index : longint): PHelpFile;
 var H: PHelpFile;
 var H: PHelpFile;
 begin
 begin
@@ -1585,6 +1769,15 @@ begin
   CreateProcHTML:=H;
   CreateProcHTML:=H;
 end;
 end;
 
 
+function CreateProcCHM(const FileName,Param: string;Index : longint): PHelpFile;
+var H: PHelpFile;
+begin
+  H:=nil;
+  if CompareText(copy(ExtOf(FileName),1,length(extCHM)),extCHM)=0 then
+    H:=New(PCHMHelpFile, Init(FileName,Index));
+  CreateProcCHM:=H;
+end;
+
 function CreateProcHTMLIndex(const FileName,Param: string;Index : longint): PHelpFile;
 function CreateProcHTMLIndex(const FileName,Param: string;Index : longint): PHelpFile;
 var H: PHelpFile;
 var H: PHelpFile;
 begin
 begin
@@ -1598,6 +1791,7 @@ procedure RegisterHelpType;
 begin
 begin
   RegisterHelpFileType({$ifdef FPC}@{$endif}CreateProcHTML);
   RegisterHelpFileType({$ifdef FPC}@{$endif}CreateProcHTML);
   RegisterHelpFileType({$ifdef FPC}@{$endif}CreateProcHTMLIndex);
   RegisterHelpFileType({$ifdef FPC}@{$endif}CreateProcHTMLIndex);
+  RegisterHelpFileType({$ifdef FPC}@{$endif}CreateProcCHM);
 end;
 end;