Przeglądaj źródła

Merged revisions 11885-11887,11890,11928-11929,11936,11944,11969,11988-11989,12033-12034 via svnmerge from
svn+ssh://[email protected]/FPC/svn/fpc/trunk

........
r11885 | marco | 2008-10-12 12:22:47 +0200 (Sun, 12 Oct 2008) | 2 lines

* Initial CHM support for textmode IDE.
........
r11886 | marco | 2008-10-12 12:56:15 +0200 (Sun, 12 Oct 2008) | 1 line

* small enhancement to wutils 'writeln(stderr,...); kind of debugging'
........
r11887 | marco | 2008-10-12 13:14:35 +0200 (Sun, 12 Oct 2008) | 2 lines

* some more minor fixes to the debug info
........
r11890 | marco | 2008-10-12 16:52:48 +0200 (Sun, 12 Oct 2008) | 2 lines

* removed a forgotten writeln that could cause havoc in GUI programs.
........
r11928 | marco | 2008-10-18 20:28:56 +0200 (Sat, 18 Oct 2008) | 2 lines

* put expansion of pathname for debugging purposes under ifdef to ease mingw use.
........
r11929 | marco | 2008-10-18 20:29:32 +0200 (Sat, 18 Oct 2008) | 2 lines

* fixed typo
........
r11936 | marco | 2008-10-19 14:52:56 +0200 (Sun, 19 Oct 2008) | 2 lines

* added chm to default extensions to search in help->files "new" dialog.
........
r11944 | marco | 2008-10-22 19:15:59 +0200 (Wed, 22 Oct 2008) | 2 lines

* Modernized debug code, fixed crash for .chms without index.
........
r11969 | marco | 2008-10-24 17:36:34 +0200 (Fri, 24 Oct 2008) | 2 lines

* memleak in chm support fixed, added some comments
........
r11988 | vincents | 2008-10-27 22:49:20 +0100 (Mon, 27 Oct 2008) | 1 line

* fixed memleak
........
r11989 | marco | 2008-10-28 15:28:38 +0100 (Tue, 28 Oct 2008) | 2 lines

* fix for several -W macro's.
........
r12033 | paul | 2008-11-08 11:10:24 +0100 (Sat, 08 Nov 2008) | 1 line

gtk2: add g_slice_xxx functions from glib 2.10
........
r12034 | marco | 2008-11-08 12:52:59 +0100 (Sat, 08 Nov 2008) | 1 line

* fix for 12480, unify multiple styles of stderr debugmsgs
........

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

marco 17 lat temu
rodzic
commit
a7742196ea

+ 2 - 0
.gitattributes

@@ -671,6 +671,7 @@ ide/unit.pt -text
 ide/vesa.pas svneol=native#text/plain
 ide/wansi.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/wconsts.pas svneol=native#text/plain
 ide/wconstse.inc svneol=native#text/plain
@@ -2069,6 +2070,7 @@ packages/gtk2/src/glib/grel.inc svneol=native#text/plain
 packages/gtk2/src/glib/gscanner.inc svneol=native#text/plain
 packages/gtk2/src/glib/gshell.inc svneol=native#text/plain
 packages/gtk2/src/glib/gsignal.inc svneol=native#text/plain
+packages/gtk2/src/glib/gslice.inc svneol=native#text/pascal
 packages/gtk2/src/glib/gslist.inc svneol=native#text/plain
 packages/gtk2/src/glib/gsourceclosure.inc svneol=native#text/plain
 packages/gtk2/src/glib/gspawn.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/06/15]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/11/08]
 #
 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
@@ -115,6 +115,10 @@ FPC:=$(shell $(FPCPROG) -PB)
 endif
 ifneq ($(findstring Error,$(FPC)),)
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
 endif
 else
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
@@ -1594,18 +1598,24 @@ else
 TAROPT=vz
 TAREXT=.tar.gz
 endif
-override REQUIRE_PACKAGES=rtl fv gdbint regexpr
+override REQUIRE_PACKAGES=rtl fv gdbint regexpr chm
 ifeq ($(FULL_TARGET),i386-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 REQUIRE_PACKAGES_GRAPH=1
 endif
 ifeq ($(FULL_TARGET),i386-win32)
@@ -1613,336 +1623,508 @@ REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=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
 ifeq ($(FULL_TARGET),i386-os2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=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
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_FV=1
 REQUIRE_PACKAGES_GDBINT=1
 REQUIRE_PACKAGES_REGEXPR=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifdef REQUIRE_PACKAGES_RTL
 PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
@@ -2048,6 +2230,84 @@ ifdef UNITDIR_REGEXPR
 override COMPILER_UNITDIR+=$(UNITDIR_REGEXPR)
 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
 PACKAGEDIR_GRAPH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /graph/Makefile.fpc,$(PACKAGESDIR))))))
 ifneq ($(PACKAGEDIR_GRAPH),)
@@ -2074,6 +2334,58 @@ ifdef UNITDIR_GRAPH
 override COMPILER_UNITDIR+=$(UNITDIR_GRAPH)
 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
 override FPCOPTDEF=$(ARCH)
 endif

+ 1 - 1
ide/Makefile.fpc

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

+ 1 - 1
ide/fpconst.pas

@@ -79,7 +79,7 @@ const
      NGExt                = '.ng';
      INFExt               = '.inf';
      WinHelpExt           = '.hlp';
-     HelpFileExts         = '*.tph;*.htm*;*'+HTMLIndexExt+';*'+NGExt+';*'+WinHelpExt+';*'+INFExt;
+     HelpFileExts         = '*.tph;*.htm*;*'+HTMLIndexExt+';*'+NGExt+';*'+WinHelpExt+';*'+INFExt+';*'+ExtChm;
 
      EnterSign            = #17#196#217;
 

+ 2 - 0
ide/fpdebug.pas

@@ -543,9 +543,11 @@ begin
 {$endif Windows}
       st[i]:='/';
 {$ifdef Windows}
+  {$ifndef USE_MINGW_GDB} // see mantis 11968 because of mingw build. MvdV
 { for Windows we should convert e:\ into //e/ PM }
   if (length(st)>2) and (st[2]=':') and (st[3]='/') then
     st:=CygDrivePrefix+'/'+st[1]+copy(st,3,length(st));
+  {$endif}
 { support spaces in the name by escaping them but without changing '\ ' into '\\ ' }
   for i:=Length(st) downto 1 do
     if (st[i]=' ') and ((i=1) or (st[i-1]<>'\')) then

+ 1 - 1
ide/fphelp.pas

@@ -455,7 +455,7 @@ begin
   WOS2Help.RegisterHelpType;
   WWinHelp.RegisterHelpType;
   WVPHelp.RegisterHelpType;
-  WHTMLHlp.RegisterHelpType;
+  WHTMLHlp.RegisterHelpType; // Also registers chm and html index (.htx)
 
   PushStatus(msg_LoadingHelpFiles);
   for I:=0 to HelpFiles^.Count-1 do

+ 4 - 4
ide/fptools.pas

@@ -150,7 +150,7 @@ const
 
 procedure RegisterFPTools;
 {$ifdef DEBUG}
-Procedure FpToolsDebugMessage(AFileName, AText : string; ALine, APos : sw_word);
+Procedure FpToolsDebugMessage(AFileName, AText : string; ALine, APos : string;nrline,nrpos:sw_word);
 {$endif DEBUG}
 
 implementation
@@ -1652,13 +1652,13 @@ begin
 end;
 
 {$ifdef DEBUG}
-Procedure FpToolsDebugMessage(AFileName, AText : string; ALine, APos : sw_word);
+Procedure FpToolsDebugMessage(AFileName, AText : string; ALine, APos :string ;nrline,nrpos:sw_word);
 begin
-  AddToolMessage(AFileName,AText,Aline,APos);
+  AddToolMessage(AFileName,AText,nrline,nrPos);
   UpdateToolMessages;
 end;
 
 begin
-  DebugMessage:=@FpToolsDebugMessage;
+  DebugMessageS:=@FpToolsDebugMessage;
 {$endif DEBUG}
 END.

+ 191 - 0
ide/wchmhwrap.pas

@@ -0,0 +1,191 @@
+{
+    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}
+    debugmessageS({$i %file%},'combine in "'+relpath+'" and "'+basepath+'"',{$i %line%},'1',0,0);
+  {$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}
+    debugmessageS({$i %file%},'combine out "'+relpath+'" and "'+basepath+'"',{$i %line%},'1',0,0);
+  {$endif}
+  
+  result:=basepath+relpath;
+end;
+
+
+Constructor TChmWrapper.Create(name:string);
+
+begin
+  ffs:=Classes.TFileStream.create(name,fmOpenRead);
+  fchmr:=TChmReader.Create(ffs,True); // owns ffs
+  findex:=nil;
+  if not fchmr.isvalidfile then
+    begin
+      freeandnil(fchmr);
+      freeandnil(ffs);
+      exit;  
+    end;      
+  {$ifdef wdebug}
+    debugmessageS({$i %file%},'TCHMWrapper: before sitemap creation ',{$i %line%},'1',0,0);
+  {$endif}
+  findex:=TChmSiteMap.create(stindex);
+  ftopic:=TChmSiteMap.create(sttoc);
+  {$ifdef wdebug}
+    debugmessageS({$i %file%},'TCHMWrapper: after sitemap creation ',{$i %line%},'1',0,0);
+  {$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;
+ {$ifdef wdebug}
+     debugmessageS({$i %file%},'TCHMWrapper: indexfilename:'+fchmr.indexfile,{$i %line%},'1',0,0); 
+ {$endif}
+  
+  m:=fchmr.getobject(fchmr.indexfile);
+  try
+   if assigned(m) then
+     begin
+      {$ifdef wdebug}
+       debugmessageS({$i %file%},'TCHMWrapper: stream size loaded :'+inttostr(m.size),{$i %line%},'1',0,0); 
+      {$endif}
+      findex.loadfromStream(m);
+    end;
+  finally
+    freeandnil(m);
+    end;
+   {$ifdef wdebug}
+     debugmessageS({$i %file%},'TCHMWrapper: loadindex after final ',{$i %line%},'1',0,0); 
+  {$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}
+     debugmessageS({$i %file%},'TCHMWrapper: endloadindex ',{$i %line%},'1',0,0); 
+  {$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]<>'/') and (copy(name,1,7)<>'ms-its:') Then
+    name:='/'+name;
+  linedata:=Classes.TStringList.create;
+  try
+    {$ifdef wdebug}
+     debugmessageS({$i %file%},'TCHMWrapper: Getting file '+name,{$i %line%},'1',0,0); 
+    {$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;
     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
 
 uses
@@ -859,6 +871,47 @@ procedure THTMLParser.DocHorizontalRuler;
 begin
 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.

+ 297 - 100
ide/whtmlhlp.pas

@@ -14,27 +14,21 @@ unit WHTMLHlp;
 
 interface
 
-uses Objects,WHTML,WAnsi,WHelp;
+uses Objects,WHTML,WAnsi,WHelp,WChmHWrap;
 
 const
      extHTML              = '.htm';
      extHTMLIndex         = '.htx';
+     extCHM		  = '.chm';
 
      ListIndent = 2;
      DefIndent  = 4;
 
-     MaxTopicLinks = 4000; { maximum number of links on a single HTML page }
+     MaxTopicLinks = 24000; { maximum number of links on a single HTML page }
 
 type
     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);
 
     PTableElement = ^TTableElement;
@@ -116,6 +110,7 @@ type
       procedure DocTableHeaderItem(Entered: boolean); virtual;
       procedure DocTableItem(Entered: boolean); virtual;
       procedure DocHorizontalRuler; virtual;
+      function CanonicalizeURL(const Base,Relative:String):string; virtual;
     public
       function  GetSectionColor(Section: THTMLSection; var Color: byte): boolean; virtual;
     private
@@ -148,24 +143,28 @@ type
       procedure AddCharAt(C: char;AtPtr : sw_word);
       function AddTextAt(const S: string;AtPtr : sw_word) : sw_word;
       function ComputeTextLength(TStart,TEnd : sw_word) : sw_word;
-
     end;
 
+    PCHMTopicRenderer = ^TCHMTopicRenderer;
+    TCHMTopicRenderer = object(THTMLTopicRenderer)
+      function CanonicalizeURL(const Base,Relative:String):string; virtual;
+      end;
+      
     PCustomHTMLHelpFile = ^TCustomHTMLHelpFile;
     TCustomHTMLHelpFile = object(THelpFile)
       constructor Init(AID: word);
       destructor  Done; virtual;
     public
+      Renderer: PHTMLTopicRenderer;
       function    GetTopicInfo(T: PTopic) : string; virtual;
       function    SearchTopic(HelpCtx: THelpCtx): PTopic; virtual;
       function    ReadTopic(T: PTopic): boolean; virtual;
     private
-      Renderer: PHTMLTopicRenderer;
       DefaultFileName: string;
       CurFileName: string;
       TopicLinks: PTopicLinkCollection;
     end;
-
+   
     PHTMLHelpFile = ^THTMLHelpFile;
     THTMLHelpFile = object(TCustomHTMLHelpFile)
       constructor Init(AFileName: string; AID: word; ATOCEntry: string);
@@ -175,6 +174,19 @@ type
       TOCEntry: string;
     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;
     THTMLIndexHelpFile = object(TCustomHTMLHelpFile)
       constructor Init(AFileName: string; AID: word);
@@ -527,25 +539,6 @@ begin
   DefHTMLGetSectionColor:=false;
 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;
 var S: string;
 begin
@@ -554,27 +547,6 @@ begin
   CharStr:=S;
 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;
 var Added: boolean;
@@ -662,9 +634,9 @@ begin
       if Name<>'' then
         begin
           Topic^.NamedMarks^.InsertStr(Name);
-{$ifdef DEBUG}
-          DebugMessage('',' Adding Name "'+Name+'"',1,1);
-{$endif DEBUG}
+{$IFDEF WDEBUG}
+          DebugMessageS({$i %file%},' Adding Name "'+Name+'"',{$i %line%},'1',0,0);
+{$endif WDEBUG}
           AddChar(hscNamedMark);
         end;
       if (HRef<>'')then
@@ -674,13 +646,17 @@ begin
             begin
               InAnchor:=true;
               AddChar(hscLink);
+{$IFDEF WDEBUG}
+              DebugMessageS({$i %file%},' Adding Link1 "'+HRef+'"'+' "'+url+'"',{$i %line%},'1',0,0);
+{$ENDIF WDEBUG}
+              
               if pos('#',HRef)=1 then
                 Href:=NameAndExtOf(GetFilename)+Href;
-              HRef:=CompleteURL(URL,HRef);
+              HRef:=canonicalizeURL(URL,HRef);
               LinkIndexes[LinkPtr]:=TopicLinks^.AddItem(HRef);
-{$ifdef DEBUG}
-              DebugMessage('',' Adding Link "'+HRef+'"',1,1);
-{$endif DEBUG}
+{$IFDEF WDEBUG}
+              DebugMessageS({$i %file%},' Adding Link2 "'+HRef+'"',{$i %line%},'1',0,0);
+{$ENDIF WDEBUG}
               Inc(LinkPtr);
             end;
           end;
@@ -694,10 +670,9 @@ end;
 
 procedure THTMLTopicRenderer.DocUnknownTag;
 begin
-{$ifdef DEBUG}
-  DebugMessage('',' Unknown tag "'+TagName+'" params "'+
-    TagParams+'"',1,1);
-{$endif DEBUG}
+{$IFDEF WDEBUG}
+  DebugMessageS({$i %file%},' Unknown tag "'+TagName+'" params "'+TagParams+'"'  ,{$i %line%},'1',0,0);
+{$endif WDEBUG}
 end;
 
 procedure DecodeAlign(Align: string; var PAlign: TParagraphAlign);
@@ -740,6 +715,12 @@ begin
     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);
 var Align: string;
 begin
@@ -776,20 +757,20 @@ var
 begin
   if pos('tex4ht:',Comment)=0 then
     exit;
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
   DebugMessage(GetFileName,'tex4ht comment "'
         +Comment+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
   if SuppressOutput then
     begin
       if (pos(SuppressUntil,Comment)=0) then
         exit
       else
         begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           DebugMessage(GetFileName,' Found '+SuppressUntil+'comment "'
             +Comment+'" SuppressOuput reset to false',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           SuppressOutput:=false;
           SuppressUntil:='';
         end;
@@ -797,20 +778,20 @@ begin
   if (pos('tex4ht:graphics ',Comment)>0) and
      LastAnsiLoadFailed then
     begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
       DebugMessage(GetFileName,' Using tex4ht comment "'
         +Comment+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
       { Try again with this info }
       TagParams:=Comment;
       DocImage;
     end;
   if (pos('tex4ht:syntaxdiagram ',Comment)>0) then
     begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
       DebugMessage(GetFileName,' Using tex4ht:syntaxdiagram comment "'
         +Comment+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
       { Try again with this info }
       TagParams:=Comment;
       DocImage;
@@ -822,10 +803,10 @@ begin
     end;
   if (pos('tex4ht:mysyntdiag ',Comment)>0) then
     begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
       DebugMessage(GetFileName,' Using tex4ht:mysyntdiag comment "'
         +Comment+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
       { Try again with this info }
       TagParams:=Comment;
       DocGetTagParam('SRC',src);
@@ -849,16 +830,16 @@ var Name,Src,Alt,SrcLine: string;
 begin
   if SuppressOutput then
     exit;
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
   if not DocGetTagParam('NAME',Name) then
      Name:='<No name>';
   DebugMessage(GetFileName,' Image "'+Name+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
   if DocGetTagParam('SRC',src) then
     begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
       DebugMessage(GetFileName,' Image source tag "'+Src+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
       if src<>'' then
         begin
           src:=CompleteURL(URL,src);
@@ -866,24 +847,24 @@ begin
             Try to see if a file with same name and extension .git
             exists PM }
           src:=DirAndNameOf(src)+'.ans';
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           DebugMessage(GetFileName,' Trying "'+Src+'"',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           if not ExistsFile(src) then
             begin
               DocGetTagParam('SRC',src);
               src:=DirAndNameOf(src)+'.ans';
               src:=CompleteURL(DirOf(URL)+'../',src);
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
               DebugMessage(GetFileName,' Trying "'+Src+'"',Line,1);
-{$endif DEBUG}
+{$endif wDEBUG}
             end;
           if not ExistsFile(src) then
             begin
               LastAnsiLoadFailed:=true;
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
               DebugMessage(GetFileName,' "'+Src+'" not found',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
             end
           else
             begin
@@ -908,9 +889,9 @@ begin
           if not ExistsFile(src) then
             begin
               LastAnsiLoadFailed:=true;
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
               DebugMessage(GetFileName,' "'+Src+'" not found',Line,1);
-{$endif DEBUG}
+{$endif WDEBUG}
             end
           else
             begin
@@ -1318,6 +1299,9 @@ begin
           if Topic^.LinkCount>0 then { FP causes numeric RTE 215 without this }
           for I:=0 to Min(Topic^.LinkCount-1,High(LinkIndexes)-1) do
             begin
+              {$IFDEF WDEBUG}
+                DebugMessageS({$i %file%},' Indexing links ('+inttostr(i)+')'+topiclinks^.at(linkindexes[i])^,{$i %line%},'1',0,0);
+              {$endif WDEBUG}
               Topic^.Links^[I].FileID:=Topic^.FileID;
               Topic^.Links^[I].Context:=EncodeHTMLCtx(Topic^.FileID,LinkIndexes[I]+1);
             end;
@@ -1336,6 +1320,14 @@ begin
   BuildTopic:=OK;
 end;
 
+Function  TCHMTopicRenderer.CanonicalizeURL(const Base,Relative:String):string; 
+begin
+ if copy(relative,1,7)<>'ms-its:' then 
+   CanonicalizeUrl:=combinepaths(relative,base)
+  else
+   CanonicalizeUrl:=relative; 
+end;
+
 constructor TCustomHTMLHelpFile.Init(AID: word);
 begin
   inherited Init(AID);
@@ -1388,10 +1380,14 @@ begin
       else
         begin
           Link:=TopicLinks^.At((T^.HelpCtx and $ffff)-1)^;
+{$IFDEF WDEBUG}
+          DebugMessageS({$i %file%},'(Topicinfo) Link before formatpath "'+link+'"',{$i %line%},'1',0,0);
+{$ENDIF WDEBUG}
+          
           Link:=FormatPath(Link);
-{$ifdef DEBUG_WHTMLHLP}
-          DebugMessage(Link,' looking for',1,1);
-{$endif DEBUG_WHTMLHLP}
+{$IFDEF WDEBUG}
+          DebugMessageS({$i %file%},'(Topicinfo) Link after formatpath "'+link+'"',{$i %line%},'1',0,0);
+{$ENDIF WDEBUG}
           P:=Pos('#',Link);
           if P>0 then
           begin
@@ -1425,10 +1421,13 @@ begin
       else
         begin
           Link:=TopicLinks^.At((T^.HelpCtx and $ffff)-1)^;
+{$IFDEF WDEBUG}
+          DebugMessageS({$i %file%},'(ReadTopic) Link before formatpath "'+link+'"',{$i %line%},'1',0,0);
+{$ENDIF WDEBUG}
           Link:=FormatPath(Link);
-{$ifdef DEBUG}
-          DebugMessage(Link,' looking for',1,1);
-{$endif DEBUG}
+{$IFDEF WDEBUG}
+          DebugMessageS({$i %file%},'(ReadTopic) Link before formatpath "'+link+'"',{$i %line%},'1',0,0);
+{$ENDIF WDEBUG}
           P:=Pos('#',Link);
           if P>0 then
           begin
@@ -1450,18 +1449,18 @@ begin
         end;
       if (HTMLFile=nil) then
         begin
-{$ifdef DEBUG}
-          DebugMessage(Link,' filename not known :(',1,1);
-{$endif DEBUG}
+{$IFDEF WDEBUG}
+          DebugMessageS({$i %file%},'(ReadTopic) Filename not known:  "'+link+'"',{$i %line%},'1',0,0);
+{$ENDIF WDEBUG}
         end;
       if (p>1) and (HTMLFile=nil) then
         begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           if p>0 then
             DebugMessage(Name,Link+'#'+Bookmark+' not found',1,1)
           else
             DebugMessage(Name,Link+' not found',1,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           New(HTMLFile, Init);
           HTMLFile^.AddLine('<HEAD><TITLE>'+msg_pagenotavailable+'</TITLE></HEAD>');
           HTMLFile^.AddLine(
@@ -1474,12 +1473,12 @@ begin
         CurFileName:=Name
       else
         begin
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           if p>0 then
             DebugMessage(Name,Link+'#'+Bookmark+' not found',1,1)
           else
             DebugMessage(Name,Link+' not found',1,1);
-{$endif DEBUG}
+{$endif WDEBUG}
         end;
       if HTMLFile<>nil then Dispose(HTMLFile, Done);
       if BookMark='' then
@@ -1487,10 +1486,10 @@ begin
       else
         begin
           P:=T^.GetNamedMarkIndex(BookMark);
-{$ifdef DEBUG}
+{$IFDEF WDEBUG}
           if p=-1 then
             DebugMessage(Name,Link+'#'+Bookmark+' bookmark not found',1,1);
-{$endif DEBUG}
+{$endif WDEBUG}
           T^.StartNamedMark:=P+1;
         end;
     end;
@@ -1576,6 +1575,194 @@ begin
   LoadIndex:=OK;
 end;
 
+constructor TChmHelpFile.Init(AFileName: string; AID: word);
+begin
+  if inherited Init(AID)=false then 
+    Fail;
+  Dispose(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}
+          DebugMessageS({$i %file%},' Looking for  "'+Link+'"',{$i %line%},'1',0,0);
+{$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}
+          DebugMessageS({$i %file%},' Looking for  "'+Link+'"',{$i %line%},'1',0,0);
+{$endif WDEBUG}
+          Link:=FormatPath(Link);
+{$IFDEF WDEBUG}
+          DebugMessageS({$i %file%},' Looking for (after formatpath)  "'+Link+'"',{$i %line%},'1',0,0);
+{$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;
 var H: PHelpFile;
 begin
@@ -1585,6 +1772,15 @@ begin
   CreateProcHTML:=H;
 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;
 var H: PHelpFile;
 begin
@@ -1598,6 +1794,7 @@ procedure RegisterHelpType;
 begin
   RegisterHelpFileType({$ifdef FPC}@{$endif}CreateProcHTML);
   RegisterHelpFileType({$ifdef FPC}@{$endif}CreateProcHTMLIndex);
+  RegisterHelpFileType({$ifdef FPC}@{$endif}CreateProcCHM);
 end;
 
 

+ 13 - 5
ide/wutils.pas

@@ -184,13 +184,15 @@ const LastStrToIntResult : integer = 0;
 
 procedure RegisterWUtils;
 
-Procedure WUtilsDebugMessage(AFileName, AText : string; ALine, APos : sw_word);
+Procedure DebugMessage(AFileName, AText : string; ALine, APos : sw_word); // calls DebugMessage
+
+Procedure WUtilsDebugMessage(AFileName, AText : string; ALine, APos : string; nrLine, nrPos : sw_word);
+
 type
-  TDebugMessage = procedure(AFileName, AText : string; ALine, APos : sw_word);
+  TDebugMessage = procedure(AFileName, AText : string; ALine, APos : String; nrLine, nrPos : sw_word);
 
 Const
-  DebugMessage : TDebugMessage = @WUtilsDebugMessage;
-
+  DebugMessageS : TDebugMessage = @WUtilsDebugMessage;
 
 implementation
 
@@ -1265,9 +1267,15 @@ begin
 {$endif}
 end;
 
-Procedure WUtilsDebugMessage(AFileName, AText : string; ALine, APos : sw_word);
+Procedure DebugMessage(AFileName, AText : string; ALine, APos : sw_word); // calls DebugMessage
+begin
+  DebugMessageS(Afilename,AText,'','',aline,apos);
+end;
+
+Procedure WUtilsDebugMessage(AFileName, AText : string; ALine, APos : string;nrLine, nrPos : sw_word);
 begin
   writeln(stderr,AFileName,' (',ALine,',',APos,') ',AText);
+  flush(stderr);
 end;
 
 BEGIN

+ 1 - 0
packages/chm/src/chmfilewriter.pas

@@ -175,6 +175,7 @@ begin
   Cfg.SetValue('Settings/Title/Value', Title);
   Cfg.SetValue('Settings/OutputFileName/Value', OutputFileName);
   Cfg.SetValue('Settings/DefaultFont/Value', DefaultFont);
+  Cfg.Flush;
   Cfg.Free;
 end;
 

+ 1 - 0
packages/chm/src/chmreader.pas

@@ -1139,6 +1139,7 @@ end;
 destructor TChmFileList.Destroy;
 begin
   fUnNotifiedFiles.Free;
+  inherited Destroy;
 end;
 
 procedure TChmFileList.SetOnOpenNewFile(AValue: TChmFileOpenEvent);

+ 4 - 0
packages/gtk2/src/glib/gincludes.inc

@@ -72,4 +72,8 @@
 
 {$include goption.inc}
 
+{$ifdef HasGLIB2_10}
+{$include gslice.inc}
+{$endif}
+
 // included by glib2.pas

+ 2 - 0
packages/gtk2/src/glib/glib2.pas

@@ -76,6 +76,8 @@ const
   {$WARNINGS OFF}
 {$ENDIF}
 
+// {$define HasGLIB2_10}
+
 {$DEFINE read_forward_definitions}
 type
   // internal types

+ 55 - 0
packages/gtk2/src/glib/gslice.inc

@@ -0,0 +1,55 @@
+// included by glib2.pas
+
+// slices - fast allocation/release of small memory blocks
+
+{$IFDEF read_forward_definitions}
+{$ENDIF read_forward_definitions}
+
+//------------------------------------------------------------------------------
+
+{$IFDEF read_interface_types}
+  TGSliceConfig = (
+    G_SLICE_CONFIG_ALWAYS_MALLOC = 1,
+    G_SLICE_CONFIG_BYPASS_MAGAZINES,
+    G_SLICE_CONFIG_WORKING_SET_MSECS,
+    G_SLICE_CONFIG_COLOR_INCREMENT,
+    G_SLICE_CONFIG_CHUNK_SIZES,
+    G_SLICE_CONFIG_CONTENTION_COUNTER
+  ) ;
+{$ENDIF read_interface_types}
+
+//------------------------------------------------------------------------------
+
+{$IFDEF read_interface_rest}
+
+function g_slice_alloc(block_size:gsize):gpointer;cdecl;external gliblib;
+function g_slice_alloc0(block_size:gsize):gpointer;cdecl;external gliblib;
+function g_slice_copy(block_size:gsize; mem_block:gconstpointer):gpointer;cdecl;external gliblib;
+procedure g_slice_free1(block_size:gsize; mem_block:gpointer);cdecl;external gliblib;
+procedure g_slice_free_chain_with_offset(block_size:gsize; mem_chain:gpointer; next_offset:gsize);cdecl;external gliblib;
+
+{
+  MemoryBlockType *
+         g_slice_dup                    (MemoryBlockType,
+  	                                 MemoryBlockType *mem_block);
+         g_slice_free                   (MemoryBlockType,
+  	                                 MemoryBlockType *mem_block);
+         g_slice_free_chain             (MemoryBlockType,
+                                         MemoryBlockType *first_chain_block,
+                                         memory_block_next_field);
+   pseudo prototypes for the macro
+   definitions following below.
+}
+
+procedure g_slice_set_config(ckey:TGSliceConfig; value:gint64);cdecl;external gliblib;
+function g_slice_get_config(ckey:TGSliceConfig):gint64;cdecl;external gliblib;
+function g_slice_get_config_state(ckey:TGSliceConfig; address:gint64; n_values:pguint):Pgint64;cdecl;external gliblib;
+
+{$ENDIF read_interface_rest}
+
+{$IFDEF read_implementation}
+{$ENDIF read_implementation}
+
+// included by glib2.pas
+
+

+ 11 - 6
rtl/win/wininc/func.inc

@@ -2241,6 +2241,11 @@ begin
   SNDMSG:=SendMessage(hWnd,Msg,wParam,lParam);
 end;
 
+function SNDMSGW(hWnd:HWND; Msg:UINT; wParam:WPARAM; lParam:LPARAM):LRESULT;
+begin
+  SNDMSGW:=SendMessageW(hWnd,Msg,wParam,lParam);
+end;
+
 
 function CommDlg_OpenSave_GetSpecA(_hdlg:HWND;_psz:LPSTR;_cbmax : longint) : LRESULT;
 begin
@@ -2250,7 +2255,7 @@ end;
 
 function CommDlg_OpenSave_GetSpecW(_hdlg:HWND;_psz:LPWSTR;_cbmax : longint) : LRESULT;
 begin
-  CommDlg_OpenSave_GetSpecW:=SNDMSG(_hdlg,CDM_GETSPEC,WPARAM(_cbmax),LPARAM(_psz));
+  CommDlg_OpenSave_GetSpecW:=SNDMSGW(_hdlg,CDM_GETSPEC,WPARAM(_cbmax),LPARAM(_psz));
 end;
 
 
@@ -2262,7 +2267,7 @@ end;
 {$else Unicode}
 function CommDlg_OpenSave_GetSpec(_hdlg:HWND;_psz:LPWSTR;_cbmax : longint) : LRESULT;
 begin
-  CommDlg_OpenSave_GetSpec:=SNDMSG(_hdlg,CDM_GETSPEC,WPARAM(_cbmax),LPARAM(_psz));
+  CommDlg_OpenSave_GetSpec:=SNDMSGW(_hdlg,CDM_GETSPEC,WPARAM(_cbmax),LPARAM(_psz));
 end;
 {$endif Unicode}
 
@@ -2275,7 +2280,7 @@ end;
 
 function CommDlg_OpenSave_GetFilePathW(_hdlg:HWND;_psz:LPWSTR;_cbmax : longint) : LRESULT;
 begin
-  CommDlg_OpenSave_GetFilePathW:=SNDMSG(_hdlg,CDM_GETFILEPATH,WPARAM(_cbmax),LPARAM(LPWSTR(_psz)));
+  CommDlg_OpenSave_GetFilePathW:=SNDMSGW(_hdlg,CDM_GETFILEPATH,WPARAM(_cbmax),LPARAM(LPWSTR(_psz)));
 end;
 
 {$ifndef Unicode}
@@ -2286,7 +2291,7 @@ end;
 {$else Unicode}
 function CommDlg_OpenSave_GetFilePath(_hdlg:HWND;_psz:LPWSTR;_cbmax : longint) : LRESULT;
 begin
-  CommDlg_OpenSave_GetFilePath:=SNDMSG(_hdlg,CDM_GETFILEPATH,WPARAM(_cbmax),LPARAM(_psz));
+  CommDlg_OpenSave_GetFilePath:=SNDMSGW(_hdlg,CDM_GETFILEPATH,WPARAM(_cbmax),LPARAM(_psz));
 end;
 {$endif Unicode}
 
@@ -2298,7 +2303,7 @@ end;
 
 function CommDlg_OpenSave_GetFolderPathW(_hdlg:HWND;_psz:LPWSTR;_cbmax : longint) : LRESULT;
 begin
-  CommDlg_OpenSave_GetFolderPathW:=SNDMSG(_hdlg,CDM_GETFOLDERPATH,WPARAM(_cbmax),LPARAM(LPWSTR(_psz)));
+  CommDlg_OpenSave_GetFolderPathW:=SNDMSGW(_hdlg,CDM_GETFOLDERPATH,WPARAM(_cbmax),LPARAM(LPWSTR(_psz)));
 end;
 
 {$ifndef Unicode}
@@ -2309,7 +2314,7 @@ end;
 {$else Unicode}
 function CommDlg_OpenSave_GetFolderPath(_hdlg:HWND;_psz:LPWSTR;_cbmax : longint) : LRESULT;
 begin
-  CommDlg_OpenSave_GetFolderPath:=SNDMSG(_hdlg,CDM_GETFOLDERPATH,WPARAM(_cbmax),LPARAM(LPWSTR(_psz)));
+  CommDlg_OpenSave_GetFolderPath:=SNDMSGW(_hdlg,CDM_GETFOLDERPATH,WPARAM(_cbmax),LPARAM(LPWSTR(_psz)));
 end;
 {$endif Unicode}