浏览代码

+ Initial implementation

michael 22 年之前
父节点
当前提交
c50cbc4c18
共有 12 个文件被更改,包括 3155 次插入0 次删除
  1. 1430 0
      utils/fpmc/Makefile
  2. 28 0
      utils/fpmc/Makefile.fpc
  3. 24 0
      utils/fpmc/README
  4. 27 0
      utils/fpmc/dumpfile.pp
  5. 199 0
      utils/fpmc/fpmc.pp
  6. 13 0
      utils/fpmc/fpmcgtk.pp
  7. 92 0
      utils/fpmc/frmabout.pp
  8. 523 0
      utils/fpmc/frmmain.pp
  9. 228 0
      utils/fpmc/frmoptions.pp
  10. 434 0
      utils/fpmc/msgcomp.pp
  11. 93 0
      utils/fpmc/readmsg.pp
  12. 64 0
      utils/fpmc/test.mc

+ 1430 - 0
utils/fpmc/Makefile

@@ -0,0 +1,1430 @@
+#
+# Don't edit, this file is generated by FPCMake Version 1.1 [2002/10/05]
+#
+default: all
+MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx
+override PATH:=$(subst \,/,$(PATH))
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygwin,$(MACHTYPE)),)
+inCygWin=1
+endif
+endif
+ifeq ($(OS_TARGET),freebsd)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),netbsd)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),openbsd)
+BSDhier=1
+endif
+ifdef inUnix
+BATCHEXT=.sh
+else
+ifdef inOS2
+BATCHEXT=.cmd
+else
+BATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifneq ($(findstring sh.exe,$(SHELL)),)
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPC:=$(shell $(FPCPROG) -PB)
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=ppc386
+endif
+else
+override FPC=ppc386
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+export FPC FPC_VERSION
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+COMPILERINFO:=$(shell $(FPC) -iSP -iTP -iSO -iTO)
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 1,$(COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 2,$(COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 3,$(COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 4,$(COMPILERINFO))
+endif
+else
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+endif
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(OS_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(OS_TARGET), please run fpcmake first)
+endif
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+ifndef CROSSDIR
+CROSSDIR:=$(FPCDIR)/cross/$(FULL_TARGET)
+endif
+ifndef CROSSTARGETDIR
+CROSSTARGETDIR=$(CROSSDIR)/$(FULL_TARGET)
+endif
+ifdef CROSSCOMPILE
+UNITSDIR:=$(wildcard $(CROSSTARGETDIR)/units)
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+else
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override TARGET_PROGRAMS+=fpmc
+ifeq ($(OS_TARGET),linux)
+override TARGET_PROGRAMS+=fpmcgtk
+endif
+ifeq ($(OS_TARGET),win32)
+override TARGET_PROGRAMS+=fpmcgtk
+endif
+override TARGET_RSTS+=frmabout frmmain frmoptions msgcomp
+override CLEAN_UNITS+=frmmain msgcomp frmabout frmoptions
+override INSTALL_FPCPACKAGE=y
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifeq ($(OS_TARGET),linux)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),freebsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),netbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),openbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),sunos)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),qnx)
+UNIXINSTALLDIR=1
+endif
+else
+ifeq ($(OS_SOURCE),linux)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_SOURCE),freebsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_SOURCE),netbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_SOURCE),openbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),sunos)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),qnx)
+UNIXINSTALLDIR=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXINSTALLDIR
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef INSTALL_BASEDIR
+ifdef UNIXINSTALLDIR
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXINSTALLDIR
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(OS_TARGET)
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+ifdef CROSSCOMPILE
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/units
+else
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(OS_TARGET)
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXINSTALLDIR
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXINSTALLDIR
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXINSTALLDIR
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXINSTALLDIR
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(FULL_SOURCE))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifdef inUnix
+ifndef GCCLIBDIR
+GCCLIBDIR:=$(shell dirname `(gcc -v 2>&1)| head -n 1| awk '{ print $$4 } '`)
+endif
+ifeq ($(OS_TARGET),linux)
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+ifeq ($(OS_TARGET),netbsd)
+OTHERLIBDIR+=/usr/pkg/lib
+endif
+export GCCLIBDIR OTHERLIB
+endif
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+STATICLIBPREFIX=libp
+RSTEXT=.rst
+FPCMADE=fpcmade
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+FPCMADE=fpcmade.v1
+PACKAGESUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+FPCMADE=fpcmade.dos
+ZIPSUFFIX=go32
+endif
+ifeq ($(OS_TARGET),linux)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.lnx
+ZIPSUFFIX=linux
+endif
+ifeq ($(OS_TARGET),freebsd)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.freebsd
+ZIPSUFFIX=freebsd
+endif
+ifeq ($(OS_TARGET),netbsd)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.netbsd
+ZIPSUFFIX=netbsd
+endif
+ifeq ($(OS_TARGET),openbsd)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.openbsd
+ZIPSUFFIX=openbsd
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+ZIPSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+ZIPSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.asm
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+FPCMADE=fpcmade.amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+FPCMADE=fpcmade.ata
+endif
+ifeq ($(OS_TARGET),beos)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.be
+ZIPSUFFIX=be
+endif
+ifeq ($(OS_TARGET),sunos)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.sun
+ZIPSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.qnx
+ZIPSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppn
+OEXT=.on
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+FPCMADE=fpcmade.nw
+ZIPSUFFIX=nw
+EXEEXT=.nlm
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE=
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL=
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG=
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG=
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG=
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef ECHOREDIR
+ECHOREDIR:=$(subst /,$(PATHSEP),$(ECHO))
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -rfp
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE=
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=as
+LDNAME=ld
+ARNAME=ar
+RCNAME=rc
+ifeq ($(OS_TARGET),win32)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(BATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl fcl
+ifeq ($(OS_TARGET),linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_INET=1
+REQUIRE_PACKAGES_FCL=1
+REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_IBASE=1
+endif
+ifeq ($(OS_TARGET),go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifeq ($(OS_TARGET),win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_IBASE=1
+endif
+ifeq ($(OS_TARGET),os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifeq ($(OS_TARGET),freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_INET=1
+REQUIRE_PACKAGES_FCL=1
+REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_IBASE=1
+endif
+ifeq ($(OS_TARGET),beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifeq ($(OS_TARGET),netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_INET=1
+REQUIRE_PACKAGES_FCL=1
+REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_IBASE=1
+endif
+ifeq ($(OS_TARGET),amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifeq ($(OS_TARGET),atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifeq ($(OS_TARGET),sunos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifeq ($(OS_TARGET),qnx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifeq ($(OS_TARGET),netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifeq ($(OS_TARGET),openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_INET=1
+REQUIRE_PACKAGES_FCL=1
+REQUIRE_PACKAGES_MYSQL=1
+REQUIRE_PACKAGES_IBASE=1
+endif
+ifeq ($(OS_TARGET),wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/$(OS_TARGET)/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/$(OS_TARGET)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/$(OS_TARGET)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_PASZLIB
+PACKAGEDIR_PASZLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_PASZLIB),)
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/$(OS_TARGET)),)
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)/$(OS_TARGET)
+else
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_PASZLIB)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_PASZLIB) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_PASZLIB)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_PASZLIB=
+UNITDIR_PASZLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_PASZLIB),)
+UNITDIR_PASZLIB:=$(firstword $(UNITDIR_PASZLIB))
+else
+UNITDIR_PASZLIB=
+endif
+endif
+ifdef UNITDIR_PASZLIB
+override COMPILER_UNITDIR+=$(UNITDIR_PASZLIB)
+endif
+endif
+ifdef REQUIRE_PACKAGES_INET
+PACKAGEDIR_INET:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /inet/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_INET),)
+ifneq ($(wildcard $(PACKAGEDIR_INET)/$(OS_TARGET)),)
+UNITDIR_INET=$(PACKAGEDIR_INET)/$(OS_TARGET)
+else
+UNITDIR_INET=$(PACKAGEDIR_INET)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_INET)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_INET) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_INET)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_INET=
+UNITDIR_INET:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /inet/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_INET),)
+UNITDIR_INET:=$(firstword $(UNITDIR_INET))
+else
+UNITDIR_INET=
+endif
+endif
+ifdef UNITDIR_INET
+override COMPILER_UNITDIR+=$(UNITDIR_INET)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FCL
+PACKAGEDIR_FCL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FCL),)
+ifneq ($(wildcard $(PACKAGEDIR_FCL)/$(OS_TARGET)),)
+UNITDIR_FCL=$(PACKAGEDIR_FCL)/$(OS_TARGET)
+else
+UNITDIR_FCL=$(PACKAGEDIR_FCL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FCL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FCL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FCL=
+UNITDIR_FCL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FCL),)
+UNITDIR_FCL:=$(firstword $(UNITDIR_FCL))
+else
+UNITDIR_FCL=
+endif
+endif
+ifdef UNITDIR_FCL
+override COMPILER_UNITDIR+=$(UNITDIR_FCL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_MYSQL
+PACKAGEDIR_MYSQL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /mysql/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_MYSQL),)
+ifneq ($(wildcard $(PACKAGEDIR_MYSQL)/$(OS_TARGET)),)
+UNITDIR_MYSQL=$(PACKAGEDIR_MYSQL)/$(OS_TARGET)
+else
+UNITDIR_MYSQL=$(PACKAGEDIR_MYSQL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_MYSQL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_MYSQL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_MYSQL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_MYSQL=
+UNITDIR_MYSQL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /mysql/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_MYSQL),)
+UNITDIR_MYSQL:=$(firstword $(UNITDIR_MYSQL))
+else
+UNITDIR_MYSQL=
+endif
+endif
+ifdef UNITDIR_MYSQL
+override COMPILER_UNITDIR+=$(UNITDIR_MYSQL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_IBASE
+PACKAGEDIR_IBASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /ibase/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_IBASE),)
+ifneq ($(wildcard $(PACKAGEDIR_IBASE)/$(OS_TARGET)),)
+UNITDIR_IBASE=$(PACKAGEDIR_IBASE)/$(OS_TARGET)
+else
+UNITDIR_IBASE=$(PACKAGEDIR_IBASE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_IBASE)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_IBASE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_IBASE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_IBASE=
+UNITDIR_IBASE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /ibase/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_IBASE),)
+UNITDIR_IBASE:=$(firstword $(UNITDIR_IBASE))
+else
+UNITDIR_IBASE=
+endif
+endif
+ifdef UNITDIR_IBASE
+override COMPILER_UNITDIR+=$(UNITDIR_IBASE)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+else
+FPCCPUOPT:=
+endif
+override FPCOPT+=-Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-OG2p3
+endif
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_exes
+ifdef TARGET_PROGRAMS
+override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
+override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS)))
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+endif
+fpc_exes: $(EXEFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp .rc .res
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPUFILES))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPULINKFILES)))
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+fpc_distclean: clean
+ifdef COMPILER_UNITTARGETDIR
+TARGETDIRCLEAN=fpc_clean
+endif
+fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+examples:
+shared:
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+fpmc$(EXEEXT): msgcomp.pp fpmc.pp
+fpmcgtk$(EXEEXT): msgcomp.pp fpmcgtk.pp $(wildcard frm*.pp)

+ 28 - 0
utils/fpmc/Makefile.fpc

@@ -0,0 +1,28 @@
+#
+#   Makefile.fpc for debugserver
+#
+
+[target]
+programs=fpmc
+programs_linux=fpmcgtk
+programs_win32=fpmcgtk
+rsts=frmabout frmmain frmoptions msgcomp
+
+[clean]
+units=frmmain msgcomp frmabout frmoptions
+
+[require]
+packages=fcl
+
+[compiler]
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../..
+
+[rules]
+fpmc$(EXEEXT): msgcomp.pp fpmc.pp
+
+fpmcgtk$(EXEEXT): msgcomp.pp fpmcgtk.pp $(wildcard frm*.pp)

+ 24 - 0
utils/fpmc/README

@@ -0,0 +1,24 @@
+This is the Free Pascal Message Compiler.
+
+It compiles a .mc file into a .rc and .msg file which can be compiled by a
+resource compiler such as windres. For example:
+
+fpmc -l 90 -e -v -i test.mc -p -r -m
+windres -i test.rc -o test.res
+
+It also produces a .pp pascal unit which contains constant definitions
+for any message aliases (SymbolicName) found in the .mc file.
+
+The compiler recognizes the following directives in the .mc file:
+MessageID
+SymbolicName
+Language
+
+Other directives as defined by Microsoft are not yet supported.
+
+The readmsg program reads and dumps a .msg message file to screen.
+dumpfile produces a hex dump of a file. They were mainly used for debugging.
+
+Enjoy !
+
+Michael.

+ 27 - 0
utils/fpmc/dumpfile.pp

@@ -0,0 +1,27 @@
+program dumpfile;
+
+Var
+  F : File of Byte;
+  Col : Integer;
+  B : Byte;
+  
+begin
+  Assign(F,Paramstr(1));
+  Reset(F);
+  Col:=1;
+  while not eof(f) do
+    begin
+    Read(F,B);
+    write(HexStr(B,2),' ');
+    Col:=Col+3;
+    If Col>72 then
+      begin
+      Writeln;
+      Col:=1;
+      end;
+    end;
+  Close(f);  
+  If Col<>1 then  
+    Writeln;
+end.
+    

+ 199 - 0
utils/fpmc/fpmc.pp

@@ -0,0 +1,199 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2003 by the Free Pascal development team
+
+    Free Pascal Message Compiler (command-line version)
+    
+    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.
+
+ **********************************************************************}
+{$mode objfpc}
+{$h+}
+program fpmc;
+
+uses msgcomp,getopts,sysutils,classes;
+
+
+Type
+  TFPMC = Class (TObject)
+    CmdUnitName,
+    InputFileName,
+    MsgFileName,
+    PascalFileName,
+    RCFileName : String;
+    LanguageID,
+    SubLanguageID : Integer;
+    CmdVerbose,
+    CmdUseEscape : Boolean;
+    Procedure DoError(Sender : TObject; Msg : String);
+    Procedure DoVerbose(Sender : TObject; Msg : String);
+    Procedure Usage(WithError : Boolean);
+    Procedure HandleOptions;
+    Procedure CompileFile;
+  end;
+  
+Procedure TFPMC.DoError(Sender : TObject; Msg : String);
+
+begin
+  Writeln(StdErr,Msg);
+end;
+
+Procedure TFPMC.DoVerbose(Sender : TObject; Msg : String);
+
+begin
+  Writeln(Msg);
+end;
+
+    
+Procedure TFPMC.Usage(WithError : Boolean);
+
+begin
+  Writeln('Usage : ',ExtractFileName(Paramstr(0)),' <option>');
+  Writeln('Where options is one or more of :');
+  Writeln(' -a           Produce all files (-m -p -r)');
+  Writeln(' -e           Do not escape backslashes in filenames');
+  Writeln(' -h           Usage screen');
+  Writeln(' -i filename  Input filename');
+  Writeln(' -l ID        Set locale (language ID)');
+  Writeln(' -m [msgfile] Create message file.');
+  Writeln(' -p [pasfile] Create pascal unit from message aliases.');
+  Writeln(' -r [rcfile]  Create .RC file for use with message file');
+  Writeln(' -s ID        Set sublocale (sublanguage)');
+  Writeln(' -u name      Set unitname');
+  Writeln(' -v           Be verbose');
+  Writeln('Names of output files are deduced from input filename if needed.');
+  Halt(Ord(WithError));
+end;
+
+Procedure TFPMC.Handleoptions;
+
+Var
+  C : Char;
+  NeedPasFileName,
+  NeedMsgFileName,
+  NeedRCFileName : Boolean;
+
+begin
+  NeedPasFileName:=False;
+  NeedMsgFileName:=False;
+  NeedRCFileName :=False;
+  CmdUnitName:='';
+  LanguageID:=-1;
+  SubLanguageID:=-1;
+  CmdUseEscape:=True;
+  repeat
+    C:=GetOpt('vahei:m::l:s:u:r::p::');
+    Case C of
+      'a' : begin
+            NeedMsgFilename:=(MsgFileName='');
+            NeedPasFilename:=(PascalFileName='');
+            NeedRCFilename:=(RCFileName='');
+            end;
+      'e' : CmdUseEscape:=False;
+      'h','?' : Usage(false);
+      'i' : InputFileName:=OptArg;
+      'm' : begin
+            MsgFileName:=OptArg;
+            NeedMsgFilename:=(MsgFileName='');
+            end;
+      'l' : LanguageID:=StrToIntDef(OptArg,-1);
+      'p' : begin
+            PascalFileName:=OptArg;
+            NeedPasFilename:=(PascalFileName='');
+            end;
+      's' : SubLanguageID:=StrToIntDef(OptArg,-1);
+      'u' : CmdUnitName:=OptArg;
+      'r' : begin
+            RCFileName:=OptArg;
+            NeedRCFilename:=(RCFileName='');
+            end;
+      'v' : CmdVerbose:=True;      
+    end;
+  Until (C=EndOfOptions);
+  If (InputFileName='') Then
+    Usage(true);
+  If NeedMsgFileName then
+    MsgFileName:=ChangeFileExt(InputFilename,'.msg');
+  If NeedPasFileName then
+    PascalFileName:=ChangeFileExt(InputFilename,'.pp');
+  If NeedRCFileName then
+    RCFileName:=ChangeFileExt(InputFilename,'.rc');
+  If (PascalFileName<>'') and (CmdUnitName='')  then
+    CmdUnitName:=ChangeFileExt(ExtractFileName(PascalFileName),'');
+end;
+
+Procedure TFPMC.CompileFile;
+
+Var
+  M,P,R,I : TStream;
+
+  Procedure SetupStreams;
+
+  begin
+    I:=TFileStream.Create(InputFileName,fmOpenRead);
+    If (PascalFileName<>'') then
+      P:=TFileStream.Create(PascalFileName,fmCreate);
+    If (MsgFileName<>'') then
+      M:=TFileStream.Create(MsgFileName,fmCreate);
+    If (RCFileName<>'') then
+      R:=TFileStream.Create(RCFileName,fmCreate);
+  end;
+
+  Procedure CloseStreams;
+
+  begin
+    M.Free;
+    P.Free;
+    R.Free;
+    I.Free;
+  end;
+
+begin
+  SetupStreams;
+  Try
+  With TMessageCompiler.Create do
+    Try
+      Msg:=M;
+      MC:=I;
+      RC:=R;
+      Pas:=P;
+      OnError:=@DoError;
+      If CmdVerbose then
+        OnVerbose:=@DoVerbose; 
+      UnitName:=CmdUnitName;
+      MessageFileName:=MsgFileName;
+      EscapeNeeded:=CmdUseEscape;
+      If (LanguageID<>-1) then
+        LocaleID:=LanguageID;
+      If (SubLanguageID<>-1) then
+        SubLocaleID:=SubLanguageID;
+      Compile;
+    Finally
+      Free;
+    end;
+  Finally
+    CloseStreams;
+  end;
+end;
+
+begin
+  With TFPMC.Create do
+    Try
+      HandleOptions;
+      CompileFile;
+    Finally
+      Free;
+    end;  
+end.
+{
+  $Log$
+  Revision 1.1  2003-02-14 21:59:21  michael
+  + Initial implementation
+
+}

+ 13 - 0
utils/fpmc/fpmcgtk.pp

@@ -0,0 +1,13 @@
+{$mode objfpc}
+{$H+}
+{$apptype gui}
+program fpmcgtk;
+
+uses fpgtk,fpglib,fpgtkext,frmmain;
+
+begin
+  application := TFPgtkApplication.Create;
+  application.MainWindow := TMainForm.Create;
+  application.Run;
+  application.Free;
+end.

+ 92 - 0
utils/fpmc/frmabout.pp

@@ -0,0 +1,92 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2003 by the Free Pascal development team
+
+    About form for debug server
+    
+    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.
+
+ **********************************************************************}
+{$mode objfpc}
+{$h+}
+
+unit frmabout;
+
+interface
+
+uses fpgtk,gtk,classes,sysutils;
+
+Type
+  TAboutForm = Class (TFPGtkWindow)
+    FAboutText : TFPGtkLabel;
+    FSeparator : TFPGtkHSeparator;
+    FVBox : TFPgtkVBox;
+    FOK,
+    FCancel : TFPGtkButton;
+    FButtonBox: TFPgtkHBox;
+    Constructor Create;
+    Procedure CreateWindow;
+  end;
+  
+Implementation
+
+Resourcestring
+  SAbout1     = 'Free Pascal message compiler - GTK version.';
+  SAbout2     = '(c) 2003, Michael Van Canneyt';
+  SOK         = 'OK';
+  SCancel     = 'Cancel';
+  
+Constructor TAboutForm.Create;
+
+begin
+  Inherited Create(GTK_WINDOW_DIALOG);
+  CreateWindow;
+end;
+
+Procedure TAboutForm.CreateWindow;
+
+Var 
+  S : String;
+  
+
+begin
+  FVBox:=TFPGtkVBox.Create;
+  FVBox.Spacing:=4;
+  FVBox.Border:=8;
+  Add(FVBox);
+  // About text
+  S:=SAbout1+LineEnding+SAbout2;
+  FAboutText:=TFPgtkLabel.Create(S);
+  // button area
+  FOK:=TFpGtkButton.CreateWithLabel(SOK);
+  FOK.ConnectClicked(@CloseWithResult,IntToPointer(drOK));
+  FCancel:=TFPgtkButton.CreateWithLabel(SCancel);
+  FCancel.ConnectCLicked(@CloseWithResult,IntToPointer(drCancel));
+  FSeparator:=TFPgtkHSeparator.Create;
+  FButtonBox:=TfpGtkHBox.Create;
+  FButtonBox.Spacing:=4;
+  FButtonBox.PackEnd(FOK,false,false,4);
+  FButtonBox.PackEnd(FCancel,false,false,4);
+  // Add to window
+  FVBox.PackStart(FAboutText,True,True,0);
+  FVBox.PackStart(FSeparator,False,False,4);
+  FVBox.PackStart(FButtonBox,false,false,0);
+end;
+
+end.  
+
+{
+  $Log$
+  Revision 1.1  2003-02-14 21:59:21  michael
+  + Initial implementation
+
+  Revision 1.1  2003/01/02 14:36:25  michael
+  + Initial implementation
+
+}

+ 523 - 0
utils/fpmc/frmmain.pp

@@ -0,0 +1,523 @@
+{$mode objfpc}
+{$h+}
+unit frmmain;
+
+interface
+
+uses gdk,gtk,fpgtk,fpgtkext,classes,sysutils;
+
+Type
+  TMainForm = Class(TFPGtkWindow)
+    FModified : Boolean;
+    FFileName : String;
+    FUnitName : String;
+    FLanguageID : Integer;
+    FSubLanguageID : Integer;
+    FVerbose,
+    FCreateMsg,
+    FCreatePas,
+    FCreateRC,
+    FEscapePath : Boolean;
+    FMsgLabel : TFPgtkLabel;
+    FMsgList : TFPgtkScrollList;
+    FMsgVBox,
+    FVBox : TFPGtkVBox;
+    FVPaned : TFPgtkVPaned;
+    FFile,
+    FFileNew,
+    FFileOpen,
+    FFileSave,
+    FFileSaveAs,
+    FFileExit,
+    FEdit,
+    FEditCut,
+    FEditCopy,
+    FEditPaste,
+    FProject,
+    FProjectCompile,
+    FProjectOptions,
+    FHelp,
+    FHelpAbout : TFPGtkMenuItem;
+    FMainMenu : TFPGtkMenuBar;
+    FEditor : TFPGtkScrollText;
+    Procedure CreateWindow;
+    Function CheckSaved : Boolean;
+    Procedure SetCaption;
+    Function GetFileName(ATitle : String) : String;
+    // Callback functions.
+    Procedure DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
+    Procedure SaveOptions(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
+    Function  OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
+    Procedure FileNewClick(Sender : TFPGtkObject; Data : Pointer);
+    Procedure FileSaveClick(Sender : TFPgtkObject; Data : Pointer);
+    Procedure FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
+    Procedure FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
+    Procedure FileExitClick(Sender : TFPgtkObject ; Data : Pointer);
+    Procedure EditCCPClick(Sender : TFPGtkObject; Data : Pointer);
+    Procedure ProjectCompileClick(Sender : TFPGtkObject; Data : Pointer);
+    Procedure ProjectOptionsClick(Sender : TFPGtkObject; Data : Pointer);
+    Procedure HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
+    Procedure EditorChanged(Sender : TFPgtkObject; Data : Pointer);
+    Procedure DoError(Sender : TObject; Msg : String);
+    Procedure DoVerbose(Sender : TObject; Msg : String);
+  Public
+    Constructor Create;
+    Procedure Compile;
+    Procedure SetOptions;
+    Procedure LoadFromFile(FN : String);
+    Procedure SaveToFile(FN : String);
+    Procedure NewFile;
+    Procedure EditCut;
+    Procedure EditCopy;
+    Procedure EditPaste;
+    Property Modified : Boolean Read FModified;
+    Property FileName : String Read FFileName;
+  end;
+
+Implementation
+
+uses frmabout,frmoptions,msgcomp;
+
+ResourceString
+  SMenuFile           = '_File';
+  SMenuFileNew        = '_New';
+  SMenuFileOpen       = '_Open';
+  SMenuFileSave       = '_Save';
+  SMenuFileSaveAs     = 'Save _as';
+  SMenuFileExit       = 'E_xit';
+  SMenuEdit           = '_Edit';
+  SMenuEditCut        = 'C_ut';
+  SMenuEditCopy       = '_Copy';
+  SMenuEditPaste      = '_Paste';
+  SMenuProject        = '_Project';
+  SMenuProjectCompile = '_Compile';
+  SMenuProjectoptions = '_Options';
+  SMenuHelp           = '_Help';
+  SMenuHelpAbout      = '_About';
+
+  SCaption        = 'Free Pascal message compiler';
+  SFileModified  = 'File has changed. Save changes ?';
+  SSaveFile      = 'Save file as';
+  SOpenFile      = 'Select file to open';
+  SModified      = '(modified)';
+  SCompilerMessages = 'Compile messages';
+  SErrsCompiling    = 'Encountered %d errors while compiling.';
+  SSuccesCompiling = 'Succesfully compiled messages.';
+  SErrUnexpected  = 'The following unexpected error occurred when compiling:%s';
+  
+{ ---------------------------------------------------------------------
+    Form Creation
+  ---------------------------------------------------------------------}
+    
+Constructor TMainForm.Create;
+
+begin
+  Inherited create (gtk_window_dialog);
+  FCreateMsg:=True;
+  FCreatePas:=True;
+  FCreateRC:=True;
+  FEscapePath:=True;
+  FVerbose:=True;
+  Createwindow;
+  If ParamCount>0 then
+    LoadFromFile(Paramstr(1));
+end;
+
+Procedure TMainForm.CreateWindow;
+
+Var
+  FAccelGroup : Integer;
+
+begin
+  FVBox:=TFPgtkVBox.Create;
+  FAccelGroup:=AccelGroupNew;
+  FFileNew:=NewMenuItem(SMenuFileNew,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_N,[amcontrol]),@FileNewClick,Nil);
+  FFileOpen:=NewMenuItem(SMenuFileOpen,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_O,[amcontrol]),@FileOpenClick,Nil);
+  FFileSave:=NewMenuItem(SMenuFileSave,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_S,[amcontrol]),@FileSaveClick,Nil);
+  FFileSaveAs:=NewMenuItem(SMenuFileSaveAs,'','', @FileSaveAsClick,Nil);
+  FFileExit:=NewMenuItem(SMenuFileExit,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_Q,[amcontrol]),@FileExitClick,Nil);
+  FFile:=NewSubMenu(SmenuFile,'','',[FFileNew,FFileOpen,FFileSave,FFileSaveAs,NewLine,FFileExit]);
+  FEditCut:=NewMenuItem(SMenuEditCut,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_X,[amcontrol]),@EditCCPClick,Nil);
+  FEditCopy:=NewMenuItem(SMenuEditCopy,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_C,[amcontrol]),@EditCCPClick,Nil);
+  FEditPaste:=NewMenuItem(SMenuEditPaste,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_V,[amcontrol]),@EditCCPClick,Nil);
+  FEdit:=NewSubMenu(SMenuEdit,'','',[FEditCut,FEditCopy,FEditPaste]);
+  FProjectCompile:=NewMenuItem(SMenuProjectCompile,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_F9,[amcontrol]),@ProjectCompileClick,Nil);
+  FProjectOptions:=NewMenuItem(SMenuProjectOptions,'','', MakeAccelKeyDef(Self,FaccelGroup,GDK_F11,[amcontrol,amshift]),@ProjectOptionsClick,Nil);
+  FProject := NewSubMenu(SMenuProject,'','',[FProjectCompile,FProjectoptions]);
+  FHelpAbout:=NewMenuItem(SMenuHelpAbout ,'','',@HelpAboutClick,Nil);
+  FHelp := NewSubMenu(SMenuHelp,'','',[FHelpAbout]);
+  FMainMenu:=NewMenuBar([FFile,FEdit,FProject,FHelp]);
+  FEditor:=TFPgtkScrollText.Create;
+  Feditor.TheText.ConnectChanged(@EditorChanged,Nil);
+  // Compiling messages
+  FMsgLabel:=TFPgtkLabel.Create(SCompilerMessages);
+  FMsgList:=TFPgtkScrollList.Create;
+  FMsgVBox:=TFPgtkVbox.Create;
+  FMsgVBox.PackStart(FMsgLabel,False,False,0);
+  FMsgVBox.PackStart(FMsgList,True,True,0);
+  FVPaned:=TFPgtkVPaned.Create;
+  FVPaned.Add1(FEditor);
+  FVPaned.Add2(FMsgVBox);
+  FVPaned.Position:=350;
+  FVBox.PackStart(FmainMenu,False,False,0);
+  FVBox.PackStart(FVPaned,true, true, 0);
+  ConnectDeleteEvent(@OnDeleteEvent,Nil);
+  Add(FVBox);
+  SetUSize(640,480);
+  SetCaption;
+  FEditor.TheText.GrabFocus;
+end;
+
+{ ---------------------------------------------------------------------
+    Callback events
+  ---------------------------------------------------------------------}
+  
+
+Procedure TMainForm.FileNewClick(Sender : TFPGtkObject; Data : Pointer);
+
+begin
+  If CheckSaved then
+    NewFile;
+end;
+
+
+Function TMainForm.OnDeleteEvent(Sender:TFPgtkWidget; Event:PGdkEvent; data:pointer): boolean;
+
+begin
+  Result:=Not CheckSaved;
+end;
+
+
+Procedure TMainForm.FileSaveClick(Sender : TFPgtkObject; Data : Pointer);
+
+begin
+  If (FFileName='') then
+    FileSaveAsClick(Sender,Data)
+  else
+    SaveToFile(FFileName);
+end;
+
+
+Procedure TMainForm.FileSaveAsClick(Sender : TFPGtkObject; Data : Pointer);
+
+Var
+  FN : String;
+
+begin
+  FN:=GetFileName(SSaveFile);
+  If (FN<>'') then
+    SavetoFile(FN);
+end;
+
+
+Procedure TMainForm.FileOpenClick(Sender : TFPGtkObject; Data : Pointer);
+
+Var
+  FN : String;
+
+begin
+  FN:=GetFileName(SOpenFile);
+  If (FN<>'') then
+    LoadFromFile(FN);
+end;
+
+
+Procedure TMainForm.EditorChanged(Sender : TFPgtkObject; Data : Pointer);
+
+begin
+  If FModified<>True then
+    begin
+    FModified:=True;
+    SetCaption;
+    end;
+end;
+
+Procedure TMainForm.EditCCPClick(Sender : TFPGtkObject; Data : Pointer);
+
+begin
+  If Sender=FEditCut then
+    EditCut
+  else if Sender=FEditCopy then
+    EditCopy
+  else
+    EditPaste;
+end;
+
+Procedure TMainForm.FileExitClick(Sender : TFPgtkObject;  Data : Pointer);
+
+begin
+  If CheckSaved then
+    Close;
+end;
+
+
+Procedure TMainForm.HelpAboutClick(Sender : TFPGtkObject; Data : Pointer);
+
+begin
+  With TAboutForm.Create do
+    Execute(Nil,Nil,Nil);
+end;
+
+Procedure TMainForm.ProjectCompileClick(Sender : TFPGtkObject; Data : Pointer);
+
+begin
+  Compile;
+end;
+
+Procedure TMainForm.ProjectOptionsClick(Sender : TFPGtkObject; Data : Pointer);
+
+begin
+  SetOptions;
+end;
+
+Procedure TMainform.DoError(Sender : TObject; Msg : String);
+
+begin
+  FMsgList.list.Add(TFPGtkListItem.CreateWithLabel(Msg));
+end;
+
+Procedure TMainform.DoVerbose(Sender : TObject; Msg : String);
+
+begin
+  FMsgList.list.Add(TFPGtkListItem.CreateWithLabel(Msg));
+end;
+
+
+{ ---------------------------------------------------------------------
+    Auxiliary methods
+  ---------------------------------------------------------------------}
+  
+Procedure TMainForm.SetCaption;
+
+Var
+  S : String;
+  
+begin
+  S:=SCaption;
+  If (FFileName<>'') then
+    S:=S+' : '+ExtractFileName(FFileName);
+  If FModified then 
+    S:=S+' '+SModified;  
+  Title:=S;
+end;
+
+Function TMainForm.CheckSaved : Boolean;
+
+begin
+  Result:=Not FModified;
+  If Not Result then
+    Case MessageDlg(SFileModified,mtInformation,mbYesNoCancel,0) of
+      mrYes : begin
+              FileSaveClick(Self,Nil);
+              Result:=True;
+              end;
+      mrNo  : Result:=True;
+      mrCancel : Result:=False;
+    end;
+end;
+
+Function TMainForm.GetFileName(ATitle : String) : String;
+
+var
+  FS : TFPgtkFileSelection;
+
+begin
+  Result:='';
+  FS := TFPgtkFileSelection.Create (gtk_window_dialog);
+  with FS do
+    begin
+    Title:=ATitle;
+    OKButton.ConnectClicked (@(CloseWithResult), inttopointer(drOk));
+    CancelButton.ConnectClicked (@(CloseWindow), nil);
+    if Not execute (nil, @Result, @DialogSetFilename) = drOk then
+      Result:='';
+    end;
+end;
+
+Procedure TMainForm.DialogSetFilename(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
+
+type
+  PString = ^AnsiString;
+
+begin
+  PString(Data)^:=(Sender as TFPgtkFileSelection).Filename;
+end;
+
+      
+{ ---------------------------------------------------------------------
+    Public methods
+  ---------------------------------------------------------------------}
+        
+
+Procedure TMainForm.LoadFromFile(FN : String);
+
+Var
+  S : TStringList;
+
+begin
+  S:=TStringList.Create;
+  try
+    S.LoadFromFile(FN);
+    FEditor.TheText.Text:=S.Text;
+    FModified:=False;
+  Finally
+    S.Free;
+  end;
+  FFileName:=FN;
+  SetCaption;
+end;
+
+
+Procedure TMainForm.SaveToFile(FN : String);
+
+begin
+  FFileName:=FN;
+  FEditor.TheText.Lines.SaveToFile(FN);
+  FModified:=False;
+  SetCaption;
+end;
+
+
+Procedure TMainForm.EditCut;
+
+begin
+  FEditor.TheText.CutClipBoard;
+end;
+
+
+Procedure TMainForm.EditCopy;
+
+begin
+  FEditor.TheText.CopyCLipBoard;
+end;
+
+
+Procedure TMainForm.EditPaste;
+
+begin
+  FEditor.TheText.PasteClipBoard;
+end;
+
+
+Procedure TMainForm.NewFile;
+
+begin
+  Feditor.TheText.Clear;
+end;
+
+Procedure TMainForm.Compile;
+
+Var
+  M,P,R,I : TStream;
+  S,MsgFileName : String;
+  
+  Procedure SetupStreams;
+
+  begin
+    I:=TFileStream.Create(FFileName,fmOpenRead);
+    If FCreatePas then
+      P:=TFileStream.Create(ChangeFileExt(FFileName,'.pp'),fmCreate);
+    If FCreateMsg then
+      begin
+      MsgFileName:=ChangeFileExt(FFileName,'.msg');
+      M:=TFileStream.Create(MsgFileName,fmCreate);
+      end;
+    If FCreateRC then
+      R:=TFileStream.Create(ChangeFileExt(FFileName,'.rc'),fmCreate);
+  end;
+
+  Procedure CloseStreams;
+
+  begin
+    M.Free;
+    P.Free;
+    R.Free;
+    I.Free;
+  end;
+
+begin
+  FileSaveClick(Self,Nil);
+  If (FUnitName='') then
+    FUnitName:=ExtractFileName(FFileName);
+  FMsgList.List.ClearAll;
+  Try
+    SetupStreams;
+    Try
+    With TMessageCompiler.Create do
+      Try
+        Msg:=M;
+        MC:=I;
+        RC:=R;
+        Pas:=P;
+        OnError:=@DoError;
+        If FVerbose then
+          OnVerbose:=@DoVerbose; 
+        UnitName:=FUnitName;
+        MessageFileName:=MsgFileName;
+        EscapeNeeded:=FEscapePath;
+        If (FLanguageID<>-1) then
+          LocaleID:=FLanguageID;
+        If (FSubLanguageID<>-1) then
+          SubLocaleID:=FSubLanguageID;
+        If Compile then
+          DoVerbose(Nil,SSuccesCompiling)
+        else
+          begin
+          S:=Format(SErrsCompiling,[Errors]);
+          DoVerbose(Nil,S);
+          MessageDlg(S,mtError,[mbOK],0);
+          end;
+      Finally
+        Free;
+      end;
+    Finally
+      CloseStreams;
+    end;
+  except
+    On E : Exception do
+      MessageDlg(SErrUnexpected,[E.Message],mtError,[mbOK],0);
+  end;  
+end;
+
+Procedure TMainForm.SaveOptions(Sender : TFPGtkWindow;Data : Pointer; Action : Integer;Initiator : TFPGtkObject);
+
+begin
+  With TOptionsForm(Data) do
+    begin
+    FUnitName:=UnitName;
+    FLanguageID:=StrToIntDef(Trim(Locale),0);
+    FSubLanguageID:=StrToIntDef(Trim(SubLocale),0);
+    FVerbose:=Verbose;
+    FCreateMsg:=CreateMsgFile;
+    FCreatePas:=CreatePasFile;
+    FCreateRC:=CreateRCFile;
+    FEscapePath:=EscapePath;
+    end;
+end;
+
+
+Procedure TMainForm.SetOptions;
+
+Var
+  F : TOptionsForm;
+
+begin
+  If (FUnitName='') and (FFileName<>'') then
+    FUnitName:=ExtractFileName(FFileName);
+  F:=TOptionsForm.Create;
+  With F do
+    begin
+    UnitName:=FUnitName;
+    Locale:=IntToStr(FLanguageID);
+    SubLocale:=IntToStr(FSubLanguageID);
+    Verbose:=Fverbose;
+    CreateMsgFile:=FCreateMsg;
+    CreatePasFile:=FCreatePas;
+    CreateRCFile:=FCreateRC;
+    EscapePath:=FEscapePath;
+    Execute(Nil,F,@SaveOptions);
+    end;
+end;
+
+
+end.

+ 228 - 0
utils/fpmc/frmoptions.pp

@@ -0,0 +1,228 @@
+{$mode objfpc}
+{$h+}
+
+unit frmoptions;
+
+interface
+
+uses fpgtk,gtk,classes,sysutils;
+
+Type
+  TOptionsForm = Class (TFPGtkWindow)
+  Private
+    FTable : TFPGtkTable;
+    FLVerbose,
+    FLCreateMsgFile,
+    FLCreateRCFile,
+    FLCreatePasFile,
+    FLEscapePath,
+    FLLocale,
+    FLSubLocale,
+    FLUnitName : TFPGtkLabel;
+    FVerbose,
+    FCreateMsgFile,
+    FCreatePasFile,
+    FCreateRCFile,
+    FEscapePath : TFPGtkToggleButton;
+    FUnitName,
+    FLocale,
+    FSubLocale : TFPGtkEntry;
+    FMaxRecentUsed : TFPGtkSpinButton;
+    FSeparator : TFPGtkHSeparator;
+    FVBox : TFPgtkVBox;
+    FHBox : TFPgtkHBox;
+    FOK,
+    FCancel : TFPGtkButton;
+    FButtonBox: TFPgtkHBox;
+  Public  
+    Constructor Create;
+    Procedure CreateWindow;
+    Procedure OnShow(Sender : TFpGtkObject;Data : Pointer);
+    Procedure SaveResult(Sender : TFpGtkObject;Data : Pointer);
+    Function  GetBoolProp (Index : Integer) : Boolean;
+    Procedure SetBoolProp (Index : Integer; Value : Boolean);
+    Function GetStringProp (Index : Integer) : String;
+    Procedure SetStringProp (Index : Integer; Value : String);
+    Property  CreateMsgFile : Boolean Index 1 Read GetBoolProp Write SetBoolProp;
+    Property  CreatePasFile : Boolean Index 2 Read GetBoolProp Write SetBoolProp;
+    Property  CreateRCFile  : Boolean Index 3 Read GetBoolProp Write SetBoolProp;
+    Property  EscapePath    : Boolean Index 4 Read GetBoolProp Write SetBoolProp;
+    Property  Verbose       : Boolean Index 5 Read GetBoolProp Write SetBoolProp;
+    Property  Locale    : String Index 1 Read GetStringProp Write SetStringProp;
+    Property  SubLocale : String Index 2 Read GetStringProp Write SetStringProp;
+    Property  UnitName  : String Index 3 Read GetStringProp Write SetStringProp;
+  end;
+
+Implementation
+
+ResourceString
+  SOptCreateMsgFile = 'Create message file';
+  SOptCreateRCFile  = 'Create RC file';
+  SOptCreatePasFile = 'Create pascal file';
+  SOptEscapePath    = 'Escape path delimiters';
+  SOptLocale        = 'Locale ID';
+  SOptSubLocale     = 'Sublocale ID';
+  SOptUnitName      = 'Unit name';
+  SOK               = 'OK';
+  SCancel           = 'Cancel';
+  SOptVerbose       = 'Be verbose';
+  
+Function MakeLabel(Caption : String) : TFPgtkLabel;
+
+begin
+  Result:=TFPGtkLabel.Create(Caption);
+  Result.Justify:=GTK_JUSTIFY_RIGHT;
+end;
+
+Function MakeCheck : TFPgtkToggleButton;
+
+begin
+  Result:=TFPgtkToggleButton.create;
+  Result.SetUsize(14,14);
+end;
+
+
+Constructor TOptionsForm.Create;
+
+begin
+  Inherited Create(GTK_WINDOW_DIALOG);
+  CreateWindow;
+end;
+
+Function PackBox(W : TFpGtkWidget) : TFpGtkHbox;
+
+begin 
+  Result:=TFPGtkHBox.Create;
+  Result.PackStart(W,True,False,0);
+end;
+
+
+Procedure ToptionsForm.CreateWindow;
+
+Var
+  OH,OV : TgtkAttachOPtions;
+  B : TfpgtkHbox;
+    
+begin
+  FVBox:=TFPGtkVBox.Create;
+  FVBox.Spacing:=4;
+  FVBox.Border:=8;
+  Add(FVBox);
+
+  // Table area
+  FTable:=TFPGtkTable.Create(2,8);
+
+  FLVerbose:=MakeLabel(SOptVerbose);
+  FLCreateMsgFile:=MakeLabel(SOptCreateMsgFile);
+  FLCreateRCFile:=MakeLabel(SOptCreateRCFile);
+  FLCreatePasFile:=MakeLabel(SOptCreatePasFile);
+  FLEscapePath:=MakeLabel(SOptEscapePath);
+  FLLocale:=MakeLabel(SOptLocale);
+  FLSubLocale:=MakeLabel(SOptSubLocale);
+  FLUnitName:=MakeLabel(SOptUnitName);
+
+  FVerbose:=MakeCheck; 
+  FEscapePath:=MakeCheck;
+  FCreateMsgFile:=MakeCheck;
+  FCreateRCFile:=MakeCheck;
+  FCreatePasFile:=MakeCheck;
+  FUnitName:=TFpGtkEntry.Create;
+  FLocale:=TFpGtkEntry.Create;
+  FSubLocale:=TFpGtkEntry.Create;
+
+  OH:=GTK_EXPAND or GTK_FILL;
+  FTable.Attach(FLVerbose          ,0,1,0,1,GTK_FILL,0,4,4);
+  FTable.Attach(FLCreateMsgFile    ,0,1,1,2,GTK_FILL,0,4,4);
+  FTable.Attach(FLCreatePasFile    ,0,1,2,3,GTK_FILL,0,4,4);
+  FTable.Attach(FLCreateRCFile     ,0,1,3,4,GTK_FILL,0,4,4);
+  FTable.Attach(FLEscapePath       ,0,1,4,5,GTK_FILL,0,4,4);
+  FTable.Attach(FLUnitName         ,0,1,5,6,GTK_FILL,0,4,4);
+  FTable.Attach(FLLocale           ,0,1,6,7,GTK_FILL,0,4,4);
+  FTable.Attach(FLSubLocale        ,0,1,7,8,GTK_FILL,0,4,4);
+
+  FTable.Attach(PackBox(FVerbose)        ,1,2,0,1,0,GTK_FILL,4,4);
+  FTable.Attach(PackBox(FCreateMsgFile)  ,1,2,1,2,0,GTK_FILL,4,4);
+  FTable.Attach(PackBox(FCreatePasFile)  ,1,2,2,3,0,GTK_FILL,4,4);
+  FTable.Attach(PackBox(FCreateRCFile)   ,1,2,3,4,0,GTK_FILL,4,4);
+  FTable.Attach(PackBox(FEscapePath)     ,1,2,4,5,0,GTK_FILL,4,4);
+  FTable.Attach(FUnitName                ,1,2,5,6,0,GTK_FILL,4,4);
+  FTable.Attach(FLocale                  ,1,2,6,7,0,GTK_FILL,4,4);
+  FTable.Attach(FSubLocale               ,1,2,7,8,0,GTK_FILL,4,4);
+  
+  // button area
+  FOK:=TFpGtkButton.CreateWithLabel(SOK);
+  FOK.ConnectClicked(@SaveResult,Nil);
+  FCancel:=TFPgtkButton.CreateWithLabel(SCancel);
+  FCancel.ConnectCLicked(@CloseWindow,Nil);
+  FSeparator:=TFPgtkHSeparator.Create;
+  FButtonBox:=TfpGtkHBox.Create;
+  FButtonBox.Spacing:=4;
+  FButtonBox.PackEnd(FOK,false,false,4);
+  FButtonBox.PackEnd(FCancel,false,false,4);
+  // Add to window
+  FVBox.PackStart(FTable,False,False,0);
+  FVBox.PackStart(FSeparator,False,False,4);
+  FVBox.PackStart(FButtonBox,false,false,0);
+  // Some events;
+  ConnectShow(@OnShow,Nil);
+end;
+
+Procedure TOptionsForm.OnShow(Sender : TFpgtkObject; Data : Pointer);
+
+begin
+  FocusedWidget(FCreateMsgFile);
+end;
+
+Procedure TOptionsForm.SaveResult(Sender : TFpgtkObject; Data : Pointer);
+
+begin
+  CloseWithResult(Sender,IntToPointer(drOK));
+end;  
+
+Function  TOptionsForm.GetBoolProp (Index : Integer) : Boolean;
+
+begin
+  Result:=False;
+  Case Index of
+    1 : Result:=FCreateMsgFile.Active; 
+    2 : Result:=FCreatePasFile.Active; 
+    3 : Result:=FCreateRCFile.Active; 
+    4 : Result:=FEscapePath.Active; 
+    5 : Result:=FVerbose.Active; 
+  end;
+end;
+
+Procedure TOptionsForm.SetBoolProp (Index : Integer; Value : Boolean);
+
+begin
+  Case Index of
+    1 : FCreateMsgFile.Active:=Value; 
+    2 : FCreatePasFile.Active:=Value; 
+    3 : FCreateRCFile.Active:=Value; 
+    4 : FEscapePath.Active:=Value; 
+    5 : FVerbose.Active:=Value; 
+  end;
+end;
+
+Function  TOptionsForm.GetStringProp (Index : Integer) : String;
+
+begin
+  Result:='';
+  Case Index of
+    1 : Result:=Flocale.Text;
+    2 : Result:=FSublocale.Text;
+    3 : Result:=FUnitName.Text;
+  end;  
+end;
+
+Procedure TOptionsForm.SetStringProp (Index : Integer; Value : String);
+
+begin
+  Case Index of
+    1 : Flocale.Text:=Value;
+    2 : FSublocale.Text:=Value;
+    3 : FUnitName.Text:=Value;
+  end;  
+end;
+
+end.

+ 434 - 0
utils/fpmc/msgcomp.pp

@@ -0,0 +1,434 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2003 by the Free Pascal development team
+
+    Windows message compiler unit.
+    
+    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.
+
+ **********************************************************************}
+{$ifdef fpc}
+{$mode objfpc}
+{$h+}
+{$endif}
+unit msgcomp;
+
+interface
+
+Uses Classes;
+
+Type
+  TMessagehandler = Procedure(Sender : Tobject; Msg : String) Of Object;
+
+  TMessageCompiler = Class
+  Private
+    FErrors : Integer;
+    FEscapeNeeded : Boolean;
+    FOnVerbose,
+    FOnError : TMessageHandler;
+    FCompiling : Boolean;
+    FMC: TStream;
+    FPas: TStream;
+    FRC: TStream;
+    FMsg: TStream;
+    FLocaleID: Integer;
+    FSubLocaleID: Integer;
+    FMsgFileName: String;
+    FUnitName: String;
+    Procedure SWriteLn(S : String; Stream : TStream);
+    Procedure CompileError(EMsg : String;Line : Integer; Value : String);
+    Procedure ProcessMessages(Lines : TStrings; MsgList : Tlist);
+    Procedure WriteMsgFile(MsgList : TList; Stream : TStream);
+    Procedure WriteRCFile(MsgList : TList; Stream : TStream);
+    Procedure WritePasFile(MsgList : TList; Stream : TStream);
+    Procedure ClearList(MsgList : Tlist);
+    procedure SetStream(const Index: Integer; const Value: TStream);
+    Function  GetStream(const Index: Integer) : TStream;
+    Procedure Verbose(Fmt : String;Args : Array of const);
+  Public
+    Constructor Create;
+    Function Compile : Boolean;
+    Property MC  : TStream index 1 Read GetStream Write SetStream;
+    Property Msg : TStream index 2 Read GetStream Write SetStream;
+    Property Pas : TStream index 3 Read GetStream Write SetStream;
+    Property RC  : TStream Index 4 Read GetStream Write SetStream;
+    Property LocaleID : Integer Read FLocaleID Write FlocaleID;
+    Property SubLocaleID : Integer Read FSubLocaleID Write FSublocaleID;
+    Property MessageFileName : String Read FMsgFileName Write FMsgFileName;
+    Property UnitName : String Read FUnitName Write FUnitName;
+    Property EscapeNeeded : Boolean Read FEscapeNeeded Write FEscapeNeeded;
+    Property OnVerbose : TMessageHandler Read FOnVerbose Write FOnVerbose;
+    Property OnError : TMessageHandler Read FOnError Write FOnError;
+    Property Errors : Integer Read FErrors;
+  End;
+
+  TMessageEntry = Class(TObject)
+    MessageID    : Cardinal;
+    TotalMessageOfs  : Cardinal;
+    MessageAlias,
+    Language,
+    MessageText  : String;
+    Function OffsetToNext : Cardinal;
+  End;
+
+implementation
+
+Uses SysUtils ;
+
+Const
+  SC = SizeOF(Cardinal);
+
+Resourcestring
+  SErrSetStreamNotAllowed = 'Setting stream during compile is not allowed.';
+  SUnknownLine = 'Unknown error: "%s"';
+  SNoMessage = 'Message starts without MessageID : "%s"';
+  SErrUnknownDirective = 'Unknown directive "%s"';
+  SErrInLine = 'Error: line %d: %s';
+  SFoundMessageID = 'Found messageID : %s';
+  SStartCompiling = 'Start compiling: %d lines.';
+  SErrUnexpected = 'Unexpected error : %s';
+  SWritingMessageFile = 'Writing %d entries to message file.';
+  SWritingPasFile = 'Writing to unit "%s"';
+  SWrotePasFile = 'Wrote %d constants to unit "%s"';
+  SWritingRCFile = 'Writing rc file.';
+  SErrNoNumber = 'Not a valid integer: %s';
+  
+procedure TMessageCompiler.ClearList(MsgList: Tlist);
+
+Var
+  I : Integer;
+
+begin
+  For I:=0 to MsgList.Count-1 do
+    TMessageEntry(MsgList[I]).Free;
+  MsgList.Clear;
+end;
+
+Function TMessageCompiler.Compile : Boolean;
+
+Var
+  Lines : TStrings;
+  MsgList : TList;
+
+Begin
+  FErrors:=0;
+  MsgList:=TList.Create;
+  try
+    Lines:=TStringList.Create;
+    Try
+      Lines.LoadFromStream(MC);
+      ProcessMessages(Lines,MSgList);
+      If (FErrors=0) then
+        begin
+        If Assigned(Msg) then
+          WriteMsgFile(MsgList,Msg);
+        if Assigned(Pas) then  
+          WritePasFile(MsgList,Pas);
+        if Assigned(RC) then  
+          WriteRCFile(MsgList,RC);
+        end;  
+    Finally
+      Lines.Free;
+    end;
+  Finally
+    ClearList(MsgList);
+  end;
+  Result:=(FErrors=0);
+End;
+
+Procedure TMessageCompiler.Verbose(Fmt : String;Args : Array of const);
+
+begin
+  if Assigned(FOnverbose) then
+    FOnVerBose(Self,Format(Fmt,Args));
+end;
+
+
+Function HexToInt(Hex : String) : Integer;
+
+Const HexSymbols : String = '0123456789ABCDEF';
+
+Var I,J : Integer;
+
+Begin
+  Hex := UpperCase(Hex);
+  Result := 0;
+  J := Length(Hex);
+  For I := 1 to J do
+    Result := Result+((Pos(Hex[J-I+1],HexSymbols)-1) shl ((I-1)*4));
+End;
+
+Constructor TMessageCompiler.Create;
+
+begin
+  // English
+  LocaleID:=9;
+  SubLocaleID:=1;
+end;
+
+
+Procedure TMessageCompiler.CompileError(EMsg : String;Line : Integer; Value : String);
+
+begin
+  Inc(FErrors);
+  EMsg:=Format(EMsg,[Value]);
+  If Assigned(FOnError) then
+    FOnError(Self,Format(SErrInLine,[Line,EMsg]));
+end;
+
+Procedure TMessageCompiler.ProcessMessages(Lines : TStrings; MsgList : TList);
+
+Var
+  Line : Integer;
+  Me : TMessageEntry;
+
+  Function Pad(S : String; Len : Integer) : String;
+  Var I : Integer;
+  Begin
+    For I := Length(S) to Len-1 do S := S+' ';
+    Result := S;
+  End;
+
+  Function SkipLine(Var S : String) : Boolean;
+
+  Var
+    I : Integer;
+
+  begin
+    I:=Pos(';',S);
+    If (I<>0) then
+      S:=Copy(S,1,I-1);
+    Result:=Length(S)=0;
+  end;
+
+  Procedure DoDirective(S : String; I : Integer);
+
+  Var
+    MsgID : Integer;
+    T : String;
+
+  begin
+    T := UpperCase(Copy(S,1,I-1));
+    Delete(S,1,I);
+    S:=Trim(S);
+    If (T='MESSAGEID') Then
+      begin
+      Verbose(SFoundMessageID,[S]);
+      S:=Uppercase(S);
+      If Pos('0X',S)<>0 then
+        begin
+        Delete(S,1,2);
+        MsgId:=HexToInt(S);
+        end
+      else
+        MsgID:=StrToIntDef(S,-1);
+      If (MsgID=-1) then  
+        CompileError(Format(SErrNoNumber,[S]),Line,T)
+      else
+        begin  
+        Me:=TMessageENtry.Create;
+        Me.MessageID:=MsgID;
+        end;
+      End
+    Else If (T = 'SYMBOLICNAME') Then
+      Begin
+      If Assigned(me) then
+        Me.MessageAlias:=S;
+      End
+    Else If (T = 'LANGUAGE') Then
+      begin
+      If assigned(ME) then
+        Me.Language:=S;
+      end
+    else
+      CompileError(SErrUnknownDirective,Line,T);
+   End;
+
+Var
+  I,Count : Integer;
+  S : String;
+
+Begin
+  Count := Lines.Count-1;
+  Verbose(SStartCOmpiling,[Count]);
+  Line:=0;
+  Me:=Nil;
+  While Line<=Count do
+    Begin
+    Try
+      S:=Lines[Line];
+      If Not SkipLine(S) then
+        begin
+        I:=Pos('=',S);
+        If (I<>0) then
+          DoDirective(S,I)
+        else
+          If (Me=Nil) Then
+            CompileError(SNoMessage,Line,S)
+          else
+            begin
+            // Message starts.
+            While (S<>'.') do
+              begin
+              If Length(Me.MessageText)>0 then
+                Me.MessageText:=Me.MessageText+#13#10+S
+              else
+                Me.MessageText:=S;
+              Inc(Line);
+              If Line<=Count then
+                S:=Lines[Line]
+              end;
+            MsgList.Add(Me);
+            Me:=Nil;
+            end;
+        End;
+    Except
+      On E : Exception do
+        CompileError(SErrUnexpected,Line,E.Message);
+    End;
+    Inc(Line);
+    end;
+End;
+
+procedure TMessageCompiler.SetStream(const Index: Integer;
+  const Value: TStream);
+begin
+  If FCompiling then
+    Raise Exception.Create(SErrSetStreamNotAllowed);
+  Case index of
+   1 : FMC := Value;
+   2 : FMsg := Value;
+   3 : FPas := Value;
+   4 : FRC := Value;
+  end;
+end;
+
+Function TMessageCompiler.GetStream(const Index: Integer) : TStream;
+
+begin
+  Case index of
+   1 : Result:=FMC;
+   2 : Result:=FMsg;
+   3 : Result:=FPas;
+   4 : Result:=FRC;
+  end;
+end;
+
+procedure TMessageCompiler.SWriteLn(S: String; Stream: TStream);
+begin
+  S:=S+#13#10;
+  Stream.Write(S[1],Length(S));
+end;
+
+Procedure TMessageCompiler.WriteMSGFile(MsgList : Tlist; Stream : TStream);
+
+
+Var
+  I,Count : Integer;
+  HeaderEntry,NullEntry: Array[1..3] of cardinal;
+  O,BO  : Cardinal;
+  M : TMessageEntry;
+  S : String;
+
+Begin
+  Verbose(SWritingMessageFile,[MsgList.Count]);
+  NullEntry[1]:=0;
+  NullEntry[2]:=0;
+  NullEntry[3]:=0;
+  Count:=MsgList.Count;
+  Stream.Write(Count,SC);
+  BO:=((SC*3)*Count)+SC; // Header size...
+  // Loop 1: Header entries.
+  For I:=0 to Count-1 do
+    begin
+    M:=TMessageEntry(MsgList[I]);
+    HeaderEntry[1]:=M.MessageID;
+    HeaderEntry[2]:=M.MessageID;
+    HeaderEntry[3]:=BO;
+    BO:=BO+M.OffsetToNext;
+    Stream.Write(HeaderEntry,SizeOf(HeaderEntry));
+    end;
+  For I:=0 to Count-1 do
+    begin
+    M:=TMessageEntry(MsgList[I]);
+    O:=M.OffsetToNext;
+    Stream.Write(O,SizeOf(O));
+    Dec(O,SC);
+    S:=M.MessageText;
+    Stream.Write(S[1],Length(S));
+    If (Length(S)<O) then
+      Stream.Write(NullEntry,O-Length(S));
+    end;
+End;
+
+procedure TMessageCompiler.WritePasFile(MsgList: TList; Stream: TStream);
+
+Var
+  I,Count : Integer;
+  ME : TMessageEntry;
+
+begin
+  Verbose(SWritingPasFile,[UnitName]);
+  SWriteln(Format('Unit %s;',[UnitName]),Stream);
+  SWriteln('',Stream);
+  SWriteln('Interface',Stream);
+  SWriteln('',Stream);
+  SWriteln('Const',Stream);
+  Count:=0;
+  For I:=0 to MsgList.Count-1 do
+    begin
+    Me:=TMessageEntry(MsgList[I]);
+    With Me do
+      If (MessageAlias<>'') then
+        begin
+        Swriteln(Format('  %s = %d; ',[MessageAlias,MessageID]),Stream);
+        Inc(Count);
+        end;
+    end;
+  SWriteln('',Stream);
+  SWriteln('Implementation',Stream);
+  SWriteln('',Stream);
+  SWriteln('end.',Stream);
+  Verbose(SWrotePasFile,[Count,UnitName]);
+end;
+
+procedure TMessageCompiler.WriteRCFile(MsgList: TList; Stream: TStream);
+
+Const
+  LangLine = 'LANGUAGE 0x%s,0x%s';
+  FileLine = '1 11 "%s"';
+
+Var
+  S : String;
+
+begin
+  Verbose(SWritingRCFile,[]);
+  S:=Format(LangLine,[IntToHex(LocaleID,1),IntToHex(SubLocaleID,1)]);
+  SWriteLn(S,Stream);
+  S:=MessageFileName;
+  If EscapeNeeded Then
+    S:=StringReplace(S,'\','\\',[rfReplaceAll]);
+  SWriteLn(Format(FileLine,[S]),Stream);
+end;
+
+{ TMessageEntry }
+
+function TMessageEntry.OffsetToNext: Cardinal;
+begin
+  Result:=((Length(MessageText) div SC) +2) * SC;
+end;
+
+end.
+
+{
+  $Log$
+  Revision 1.1  2003-02-14 21:59:21  michael
+  + Initial implementation
+
+}

+ 93 - 0
utils/fpmc/readmsg.pp

@@ -0,0 +1,93 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 1999-2000 by the Free Pascal development team
+
+    reads and dumps a message file to screen.
+    
+    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.
+
+ **********************************************************************}
+{$mode objfpc}
+{$h+}
+program readmsg;
+
+Type
+  PCardinal = ^Cardinal;
+
+Var
+  F : File of Cardinal;
+  PO,PI : PCardinal;
+  I,J,Count,C,S : Cardinal;
+  Buf : String;
+  
+begin
+  Assign(F,Paramstr(1));
+  Reset(F);
+  Read(F,Count);
+  Writeln('Message count: ',Count);
+  S:=SizeOf(Cardinal)*Count+1;
+  GetMem(PO,S);
+  GetMem(PI,S);
+  FillChar(PI^,S,0);
+  FillChar(PO^,S,0);
+  For I:=1 to Count do
+    begin
+    Read(F,C);
+    PI[I]:=C;
+    Read(F,C);
+    If (C<>PI[I]) then
+      Writeln('Error in ID: ',C,'<>ID',PI[I])
+    else
+      Writeln('Found ID ',C);
+    Read(F,C);
+    PO[I]:=C;
+    Writeln('Found offset : ',C);
+    end;
+  For I:=1 to Count do
+    begin
+    Seek(F,PO[I] div 4);
+    Read(F,S);
+    Writeln('Found offset ',S,' at item ',i,' offset ',PO[I]);
+    For J:=1 to (S div 4)-1 do
+      begin
+      Read(F,C);
+      Move(C,Buf[J*4-3],4);
+      end;
+    J:=S-4;
+    While Buf[J]=#0 do
+      dec(J);
+    SetLength(Buf,J);
+    Writeln('String (',J,') : ',Buf);
+    end;
+  Writeln('Seqential read : ');  
+  Seek(F,PO[1] div 4);
+  For I:=1 to Count do
+    begin
+    Read(F,S);
+    Writeln('Found offset ',S,' at item ',i,' offset ',FilePos(F));
+    For J:=1 to (S div 4)-1 do
+      begin
+      Read(F,C);
+      Move(C,Buf[J*4-3],4);
+      end;
+    J:=S-4;
+    While Buf[J]=#0 do
+      dec(J);
+    SetLength(Buf,J);
+    Writeln('String (',J,') : ',Buf);
+    end; 
+  Close(F);
+end.
+
+{
+  $Log$
+  Revision 1.1  2003-02-14 21:59:21  michael
+  + Initial implementation
+
+}

+ 64 - 0
utils/fpmc/test.mc

@@ -0,0 +1,64 @@
+;******************************************************
+; Default messages for FPC eventlog class
+;******************************************************
+; Categories are mapped from 1 to 4
+; 1 : etInfo
+; 2 : etWarning
+; 3 : etError
+; 4 : etDebug
+;
+; Categories (1-4)
+MessageId=1
+SymbolicName=ECInfo
+Language=English
+Information
+.
+
+MessageId=2
+SymbolicName=ECWarning
+Language=English
+Warning
+.
+
+MessageId=3
+SymbolicName=ECError
+Language=English
+Error
+.
+
+MessageId=4
+SymbolicName=ECDebug
+Language=English
+Debug
+.
+
+;
+; Message Definitions (1000-1004)
+MessageId=1000
+Language=English
+%1.
+.
+
+; Information
+MessageId=1001
+Language=English
+Information: %1
+.
+
+; Warnings
+MessageId=1002
+Language=English
+Warning: %1
+.
+
+; Error
+MessageId=1003
+Language=English
+Error: %1
+.
+
+; Debug
+MessageId=1004
+Language=English
+Debug: %1
+.