summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/Makefile12
-rw-r--r--packages/Makefile.fpc10
-rw-r--r--packages/cdrom/src/cdromlin.inc55
-rw-r--r--packages/cdrom/src/lincd.pp64
-rw-r--r--packages/cocoaint/utils/uikit-skel/src/uikit/UIKit.inc3
-rw-r--r--packages/fcl-base/src/eventlog.pp13
-rw-r--r--packages/fcl-base/src/inifiles.pp6
-rw-r--r--packages/fcl-db/src/base/fields.inc25
-rw-r--r--packages/fcl-db/src/memds/memds.pp59
-rw-r--r--packages/fcl-db/src/sqldb/mysql/mysql50conn.pas1
-rw-r--r--packages/fcl-db/src/sqldb/mysql/mysql51conn.pas2
-rw-r--r--packages/fcl-db/src/sqldb/mysql/mysqlconn.inc10
-rw-r--r--packages/fcl-db/src/sqldb/postgres/pqconnection.pp16
-rw-r--r--packages/fcl-db/tests/sqldbtoolsunit.pas10
-rw-r--r--packages/fcl-db/tests/testfieldtypes.pas12
-rw-r--r--packages/fcl-image/Makefile36
-rw-r--r--packages/fcl-image/Makefile.fpc1
-rw-r--r--packages/fcl-image/src/fpcanvas.inc69
-rw-r--r--packages/fcl-image/src/fpcanvas.pp21
-rw-r--r--packages/fcl-image/src/fpfont.inc11
-rw-r--r--packages/fcl-json/Makefile25
-rw-r--r--packages/fcl-passrc/examples/test_parser.pp1924
-rw-r--r--packages/fcl-passrc/examples/testunit1.pp713
-rw-r--r--packages/fcl-passrc/src/pastree.pp60
-rw-r--r--packages/fcl-passrc/src/pparser.pp138
-rw-r--r--packages/fcl-process/Makefile98
-rw-r--r--packages/fcl-registry/src/regini.inc48
-rw-r--r--packages/fcl-registry/src/registry.pp7
-rw-r--r--packages/fcl-registry/src/xmlreg.pp34
-rw-r--r--packages/fcl-registry/tests/testbasics.pp43
-rw-r--r--packages/fcl-stl/Makefile2427
-rw-r--r--packages/fcl-stl/Makefile.fpc23
-rw-r--r--packages/fcl-stl/doc/arrayutils.tex47
-rw-r--r--packages/fcl-stl/doc/deque.tex81
-rw-r--r--packages/fcl-stl/doc/dequeexample.pp24
-rw-r--r--packages/fcl-stl/doc/main.tex63
-rw-r--r--packages/fcl-stl/doc/makra.tex263
-rw-r--r--packages/fcl-stl/doc/map.tex87
-rw-r--r--packages/fcl-stl/doc/mapexample.pp24
-rw-r--r--packages/fcl-stl/doc/priorityqueue.tex44
-rw-r--r--packages/fcl-stl/doc/priorityqueueexample.pp30
-rw-r--r--packages/fcl-stl/doc/queue.tex39
-rw-r--r--packages/fcl-stl/doc/queueexample.pp17
-rw-r--r--packages/fcl-stl/doc/set.tex76
-rw-r--r--packages/fcl-stl/doc/setexample.pp24
-rw-r--r--packages/fcl-stl/doc/sortingexample.pp20
-rw-r--r--packages/fcl-stl/doc/stack.tex39
-rw-r--r--packages/fcl-stl/doc/stackexample.pp17
-rw-r--r--packages/fcl-stl/doc/util.tex9
-rw-r--r--packages/fcl-stl/doc/vector.tex73
-rw-r--r--packages/fcl-stl/doc/vectorexample.pp21
-rw-r--r--packages/fcl-stl/src/garrayutils.pp254
-rw-r--r--packages/fcl-stl/src/gdeque.pp204
-rw-r--r--packages/fcl-stl/src/gmap.pp163
-rw-r--r--packages/fcl-stl/src/gpriorityqueue.pp141
-rw-r--r--packages/fcl-stl/src/gqueue.pp75
-rw-r--r--packages/fcl-stl/src/gset.pp423
-rw-r--r--packages/fcl-stl/src/gstack.pp73
-rw-r--r--packages/fcl-stl/src/gutil.pp39
-rw-r--r--packages/fcl-stl/src/gvector.pp173
-rwxr-xr-xpackages/fcl-stl/tests/clean2
-rw-r--r--packages/fcl-stl/tests/garrayutilstest.pp116
-rw-r--r--packages/fcl-stl/tests/gdequetest.pp55
-rw-r--r--packages/fcl-stl/tests/gmaptest.pp84
-rw-r--r--packages/fcl-stl/tests/gmaptestzal.pp84
-rw-r--r--packages/fcl-stl/tests/gpriorityqueuetest.pp47
-rw-r--r--packages/fcl-stl/tests/gqueuetest.pp43
-rw-r--r--packages/fcl-stl/tests/gsetrefcounttest.pp59
-rw-r--r--packages/fcl-stl/tests/gsettest.pp110
-rw-r--r--packages/fcl-stl/tests/gstacktest.pp43
-rw-r--r--packages/fcl-stl/tests/gvectortest.pp111
-rwxr-xr-xpackages/fcl-stl/tests/run-all-tests4
-rw-r--r--packages/fcl-stl/tests/suiteconfig.pp27
-rw-r--r--packages/fcl-stl/tests/testrunner.pp138
-rw-r--r--packages/fcl-web/Makefile2438
-rw-r--r--packages/fcl-web/Makefile.fpc48
-rw-r--r--packages/fcl-web/Makefile.org30
-rw-r--r--packages/fcl-web/examples/combined/combined.html20
-rw-r--r--packages/fcl-web/examples/combined/combined.icobin0 -> 137040 bytes
-rw-r--r--packages/fcl-web/examples/combined/combined.ini4
-rw-r--r--packages/fcl-web/examples/combined/combined.lpi116
-rw-r--r--packages/fcl-web/examples/combined/combined.lpr15
-rw-r--r--packages/fcl-web/examples/combined/combined.resbin0 -> 138128 bytes
-rw-r--r--packages/fcl-web/examples/combined/combined.sql11
-rw-r--r--packages/fcl-web/examples/combined/login.js105
-rw-r--r--packages/fcl-web/examples/combined/login.pngbin0 -> 13618 bytes
-rw-r--r--packages/fcl-web/examples/combined/users.html18
-rw-r--r--packages/fcl-web/examples/combined/users.js108
-rw-r--r--packages/fcl-web/examples/combined/users.sql15
-rw-r--r--packages/fcl-web/examples/combined/wmlogin.lfm76
-rw-r--r--packages/fcl-web/examples/combined/wmlogin.pp129
-rw-r--r--packages/fcl-web/examples/combined/wmusers.lfm94
-rw-r--r--packages/fcl-web/examples/combined/wmusers.lrs35
-rw-r--r--packages/fcl-web/examples/combined/wmusers.pp145
-rw-r--r--packages/fcl-web/fpmake.pp2
-rw-r--r--packages/fcl-web/src/base/custfcgi.pp330
-rw-r--r--packages/fcl-web/src/base/custweb.pp1
-rw-r--r--packages/fcl-web/src/base/fphtml.pp197
-rw-r--r--packages/fcl-web/src/base/webpage.pp114
-rw-r--r--packages/fcl-web/src/base/websession.pp1
-rw-r--r--packages/fcl-web/src/jsonrpc/fpextdirect.pp1
-rw-r--r--packages/fcl-web/src/jsonrpc/fpjsonrpc.pp6
-rw-r--r--packages/fcl-web/src/webdata/extjsjson.pp29
-rw-r--r--packages/fcl-web/src/webdata/fpwebdata.pp21
-rw-r--r--packages/fcl-web/src/webdata/sqldbwebdata.pp27
-rw-r--r--packages/fcl-xml/src/dom.pp2
-rw-r--r--packages/fpmkunit/src/fpmkunit.pp30
-rw-r--r--packages/fpvectorial/src/avisocncgcodewriter.pas44
-rw-r--r--packages/fpvectorial/src/dxfvectorialreader.pas270
-rw-r--r--packages/fpvectorial/src/fpvectorial.pas32
-rw-r--r--packages/fpvectorial/src/fpvtocanvas.pas209
-rw-r--r--packages/gdbint/src/gdbint.pp27
-rw-r--r--packages/libogcfpc/Makefile.fpc2
-rw-r--r--packages/libogcfpc/examples/devices/Makefile94
-rw-r--r--packages/libogcfpc/examples/devices/Makefile.fpc2
-rw-r--r--packages/libogcfpc/examples/devices/network/Makefile322
-rw-r--r--packages/libogcfpc/examples/devices/network/Makefile.fpc2
-rw-r--r--packages/libogcfpc/examples/devices/usbgecko/Makefile322
-rw-r--r--packages/libogcfpc/examples/devices/usbgecko/Makefile.fpc2
-rw-r--r--packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile2
-rw-r--r--packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile.fpc2
-rw-r--r--packages/libogcfpc/examples/devices/usbkeyboard/Makefile322
-rw-r--r--packages/libogcfpc/examples/devices/usbkeyboard/Makefile.fpc2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile33
-rw-r--r--packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile.fpc37
-rw-r--r--packages/libogcfpc/examples/graphics/gx/gxSprites/gxsprites.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson1/lesson1.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson2/lesson2.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson3/lesson3.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson4/lesson4.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson5/lesson5.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile33
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile.fpc35
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/lesson6.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile33
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile.fpc35
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/lesson7.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile33
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile.fpc35
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/lesson8.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile37
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile.fpc39
-rw-r--r--packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/lesson9.pp2
-rw-r--r--packages/libogcfpc/examples/graphics/gx/triangle/triangle.pp2
-rw-r--r--packages/libogcfpc/fpmake.pp2
-rw-r--r--packages/libogcfpc/src/gccore.inc34
-rw-r--r--packages/libogcfpc/src/ogc/lwp_heap.inc85
-rw-r--r--packages/libogcfpc/src/ogc/lwp_mutex.inc99
-rw-r--r--packages/libogcfpc/src/ogc/lwp_priority.inc49
-rw-r--r--packages/libogcfpc/src/ogc/lwp_threads.inc97
-rw-r--r--packages/libogcfpc/src/ogc/lwp_watchdog.inc83
-rw-r--r--packages/libogcfpc/src/ogc/machine/processor.inc32
-rw-r--r--packages/odbc/src/odbcsql.inc4
-rw-r--r--packages/opencl/src/cl.pp7
-rw-r--r--packages/opencl/src/cl_gl.pp7
-rw-r--r--packages/winunits-base/src/activex.pp5
-rw-r--r--packages/winunits-base/src/uxtheme.pp8
-rw-r--r--packages/zlib/src/zlib.pp4
158 files changed, 12634 insertions, 3520 deletions
diff --git a/packages/Makefile b/packages/Makefile
index 80ea808c74..aeaba5ed07 100644
--- a/packages/Makefile
+++ b/packages/Makefile
@@ -1,5 +1,5 @@
#
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/02/21]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/02/07]
#
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 i386-nativent i386-iphonesim 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-solaris 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 mipsel-linux
@@ -9703,11 +9703,11 @@ winunits-base_shared: fcl-registry_shared fcl-base_shared
winunits-base_smart: fcl-registry_smart fcl-base_smart
winunits-base_debug: fcl-registry_debug fcl-base_debug
winunits-base_release: fcl-registry_release fcl-base_release
-winunits-jedi_all: winunits-base_all fcl-registry fcl-base_all
-winunits-jedi_shared: winunits-base_shared fcl-registry fcl-base_shared
-winunits-jedi_smart: winunits-base_smart fcl-registry fcl-base_smart
-winunits-jedi_debug: winunits-base_debug fcl-registry fcl-base_debug
-winunits-jedi_release: winunits-base_release fcl-registry fcl-base_release
+winunits-jedi_all: winunits-base_all fcl-registry_all fcl-base_all
+winunits-jedi_shared: winunits-base_shared fcl-registry_shared fcl-base_shared
+winunits-jedi_smart: winunits-base_smart fcl-registry_smart fcl-base_smart
+winunits-jedi_debug: winunits-base_debug fcl-registry_debug fcl-base_debug
+winunits-jedi_release: winunits-base_release fcl-registry_release fcl-base_release
xforms_all: x11_all
xforms_shared: x11_shared
xforms_smart: x11_smart
diff --git a/packages/Makefile.fpc b/packages/Makefile.fpc
index 4e84bde5e5..e7e93d599a 100644
--- a/packages/Makefile.fpc
+++ b/packages/Makefile.fpc
@@ -346,11 +346,11 @@ winunits-base_smart: fcl-registry_smart fcl-base_smart
winunits-base_debug: fcl-registry_debug fcl-base_debug
winunits-base_release: fcl-registry_release fcl-base_release
-winunits-jedi_all: winunits-base_all fcl-registry fcl-base_all
-winunits-jedi_shared: winunits-base_shared fcl-registry fcl-base_shared
-winunits-jedi_smart: winunits-base_smart fcl-registry fcl-base_smart
-winunits-jedi_debug: winunits-base_debug fcl-registry fcl-base_debug
-winunits-jedi_release: winunits-base_release fcl-registry fcl-base_release
+winunits-jedi_all: winunits-base_all fcl-registry_all fcl-base_all
+winunits-jedi_shared: winunits-base_shared fcl-registry_shared fcl-base_shared
+winunits-jedi_smart: winunits-base_smart fcl-registry_smart fcl-base_smart
+winunits-jedi_debug: winunits-base_debug fcl-registry_debug fcl-base_debug
+winunits-jedi_release: winunits-base_release fcl-registry_release fcl-base_release
xforms_all: x11_all
diff --git a/packages/cdrom/src/cdromlin.inc b/packages/cdrom/src/cdromlin.inc
index 43e1b1178e..f5b22faf12 100644
--- a/packages/cdrom/src/cdromlin.inc
+++ b/packages/cdrom/src/cdromlin.inc
@@ -117,20 +117,55 @@ end;
Function GetCDRomDevices(Var Devices : Array of string) : Integer;
-Var
- S : String;
-begin
- Result:=TestFSTab(Devices);
- If (Result<1) then
+ Function AlreadyAdded(AName: String; AMax: Integer): Boolean;
+ var
+ I: Integer;
+ begin
+ Result := False;
+ for I := 0 to AMax do
+ if Devices[I] = AName then
+ Exit(True);
+ end;
+
+ // Resolves name if it's a symlink and adds it ensuring no dups
+ Function AddCdrom(ACDRom: String; I: Integer): Integer;
+ var
+ SInfo : stat;
+ RealName: String;
+ begin
+ Result := I;
+ if fpStat(PChar(ACDRom), SInfo) <> -1 then
begin
- S:=DetectCD;
- If (S<>'') then
+ RealName := ACDRom;
+ if SInfo.st_mode and S_IFMT = S_IFLNK then
+ RealName := fpReadLink(ACDRom);
+
+ if not AlreadyAdded(RealName, I-1) then
begin
- Devices[0]:=S;
- Result:=1;
+ Devices[I] := RealName;
+ Result := I+1;
end;
- end
+ end;
+ end;
+
+var
+ I,J: Integer;
+ CDRec: TCDSearchRec;
+ FSTab: array[0..10] of String;
+
+begin
+ I := 0;
+ // First Add Entries From FSTab
+ for J := 0 to TestFSTab(FSTab)-1 do
+ I := AddCdrom(FSTab[J], I);
+
+ //Now Do A Search
+ if FindFirstCD(CDRec) then
+ repeat
+ I := AddCdrom(CDRec.Name, I);
+ until FindNextCD(CDRec) = False;
+ Result := I;
end;
diff --git a/packages/cdrom/src/lincd.pp b/packages/cdrom/src/lincd.pp
index 9eef43bb3e..f038e79e25 100644
--- a/packages/cdrom/src/lincd.pp
+++ b/packages/cdrom/src/lincd.pp
@@ -708,8 +708,15 @@ procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8);
{ ---------------------------------------------------------------------
Utility functions
---------------------------------------------------------------------}
+type
+ TCDSearchRec = record
+ Name: String;
+ i,j: Integer;
+ end;
Function IsCDDevice(Device : String) : Boolean;
+Function FindFirstCD(var ACDSearchRec: TCDSearchRec): Boolean;
+Function FindNextCD(var ACDSearchRec: TCDSearchRec): Boolean;
Function DetectCd : String;
implementation
@@ -1098,6 +1105,61 @@ Const
'/dev/sr?',
'/dev/optcd');
+function FindFirstCD(var ACDSearchRec: TCDSearchRec): Boolean;
+begin
+ Result := False;
+ With ACDSearchRec do
+ begin
+ I := 1;
+ J := 0;
+ Name := '';
+ end;
+ Result := FindNextCD(ACDSearchRec);
+end;
+
+function FindNextCD(var ACDSearchRec: TCDSearchRec): Boolean;
+var
+ L: integer;
+ S: String;
+ FoundDev: String;
+begin
+
+ Result := False;
+ FoundDev := '';
+ with ACDSearchRec do
+ begin
+ While (FoundDev='') and (I<NrDevices) do
+ begin
+ S:=Devices[i];
+ L:=Length(S);
+ If S[l]='?' then
+ begin
+ S:=Copy(S,1,L-1);
+ if j >= 3 then
+ j := 0;
+ while (j <= 3) and (Length(FoundDev)=0) do
+ begin
+ If IsCdDevice(S+Chr(Ord('0')+J)) then
+ FoundDev:=S+Chr(Ord('0')+J)
+ else If IsCdDevice(S+Chr(Ord('a')+J)) then
+ FoundDev:=S+Chr(Ord('a')+J);
+ Inc(j);
+ end;
+ if J >= 3 then
+ Inc(i);
+ end
+ else
+ begin
+ If IsCdDevice(S) then
+ FoundDev:=S;
+ Inc(i);
+ end;
+ end;
+ end;
+ Result := Length(FoundDev) > 0;
+ ACDSearchRec.Name:=FoundDev;
+end;
+
Function DetectCD : String;
Var
@@ -1163,7 +1225,9 @@ begin
If fpStat(Device,info)<>0 then
exit;
DeviceMajor:=info.st_rdev shr 8;
+ {$ifdef debug}
Writeln('Device major : ',DeviceMajor);
+ {$endif}
If DeviceMajor in [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR] then
Result:=TestCDRomIOCTL(Device)
else
diff --git a/packages/cocoaint/utils/uikit-skel/src/uikit/UIKit.inc b/packages/cocoaint/utils/uikit-skel/src/uikit/UIKit.inc
index f4d048e343..e8e7dc497e 100644
--- a/packages/cocoaint/utils/uikit-skel/src/uikit/UIKit.inc
+++ b/packages/cocoaint/utils/uikit-skel/src/uikit/UIKit.inc
@@ -78,4 +78,5 @@
{$ifdef IOS_SDK_4_2_OR_HIGHER}
{$include UIActionSheet.inc}
{$include UILocalNotification.inc}
-{$endif} \ No newline at end of file
+{$include UIAlertView.inc}
+{$endif}
diff --git a/packages/fcl-base/src/eventlog.pp b/packages/fcl-base/src/eventlog.pp
index 00c679abb4..d17d5881f5 100644
--- a/packages/fcl-base/src/eventlog.pp
+++ b/packages/fcl-base/src/eventlog.pp
@@ -29,6 +29,7 @@ Type
TEventLog = Class(TComponent)
Private
+ fAppendContent : Boolean;
FEventIDOffset : DWord;
FLogHandle : Pointer;
FStream : TFileStream;
@@ -84,6 +85,7 @@ Type
Procedure Info (const Msg : String); {$ifndef fpc }Overload;{$endif}
Procedure Info (const Fmt : String; Args : Array of const); {$ifndef fpc }Overload;{$endif}
Published
+ Property AppendContent : Boolean Read fAppendContent Write fAppendContent;
Property Identification : String Read FIdentification Write SetIdentification;
Property LogType : TLogType Read Flogtype Write SetlogType;
Property Active : Boolean Read FActive write SetActive;
@@ -240,12 +242,19 @@ begin
end;
Procedure TEventLog.ActivateFileLog;
-
+var
+ fFileFlags : Word;
begin
If (FFileName='') then
FFileName:=DefaultFileName;
// This will raise an exception if the file cannot be opened for writing !
- FStream:=TFileStream.Create(FFileName,fmCreate or fmShareDenyWrite);
+ if fAppendContent and FileExists(FFileName) then
+ fFileFlags := fmOpenWrite
+ else
+ fFileFlags := fmCreate;
+
+ fFileFlags := fFileFlags or fmShareDenyWrite;
+ FStream:=TFileStream.Create(FFileName,fFileFlags);
end;
Procedure TEventLog.DeActivateFileLog;
diff --git a/packages/fcl-base/src/inifiles.pp b/packages/fcl-base/src/inifiles.pp
index eb4164bc1b..f75416d5e9 100644
--- a/packages/fcl-base/src/inifiles.pp
+++ b/packages/fcl-base/src/inifiles.pp
@@ -657,7 +657,11 @@ end;
destructor TIniFile.destroy;
begin
If FDirty and FCacheUpdates then
- UpdateFile;
+ try
+ UpdateFile;
+ except
+ // Eat exception. Compatible to D7 behaviour, see comments to bug 19046
+ end;
inherited destroy;
end;
diff --git a/packages/fcl-db/src/base/fields.inc b/packages/fcl-db/src/base/fields.inc
index 5b0e8b1b8b..66f5bc7d15 100644
--- a/packages/fcl-db/src/base/fields.inc
+++ b/packages/fcl-db/src/base/fields.inc
@@ -819,7 +819,13 @@ procedure TField.SetData(Buffer: Pointer; NativeFormat : Boolean);
begin
If Not Assigned(FDataset) then
- EDatabaseError.CreateFmt(SNoDataset,[FieldName]);
+ DatabaseErrorFmt(SNoDataset,[FieldName]);
+ if (FieldNo>0) and not (FDataSet.State in [dsSetKey, dsFilter]) then
+ begin
+ if ReadOnly then
+ DatabaseErrorFmt(SReadOnlyField, [DisplayName], Self);
+ Validate(Buffer);
+ end;
FDataSet.SetFieldData(Self,Buffer, NativeFormat);
end;
@@ -1070,7 +1076,7 @@ function TStringField.GetDataSize: Integer;
begin
if DataType=ftFixedChar then
- Result:=Size
+ Result:=Size+1
else
Result:=Size+1;
end;
@@ -2475,28 +2481,23 @@ end;
procedure TFMTBCDField.GetText(var TheText: string; ADisplayText: Boolean);
var
bcd: TBCD;
- E: double; //remove when formatBCD,BCDToStrF in fmtbcd.pp will be implemented
fmt: String;
begin
if GetData(@bcd) then begin
- E:=BCDToDouble(bcd);
if aDisplayText or (FEditFormat='') then
fmt := FDisplayFormat
else
fmt := FEditFormat;
if fmt<>'' then
- TheText := FormatFloat(fmt,E)
- //TheText := FormatBCD(fmt,bcd)
+ TheText := BCDToStr(bcd)
+ //TheText := FormatBCD(fmt,bcd) //uncomment when formatBCD in fmtbcd.pp will be implemented
else if fCurrency then begin
if aDisplayText then
- TheText := FloatToStrF(E, ffCurrency, FPrecision, 2{digits?})
- //TheText := BcdToStrF(bcd, ffCurrency, FPrecision, 2{digits?})
+ TheText := BcdToStrF(bcd, ffCurrency, FPrecision, 2)
else
- TheText := FloatToStrF(E, ffFixed, FPrecision, 2{digits?});
- //TheText := BcdToStrF(bcd, ffFixed, FPrecision, 2{digits?});
+ TheText := BcdToStrF(bcd, ffFixed, FPrecision, 2);
end else
- TheText := BcdToStr(bcd);
- //TheText := BcdToStrF(bcd, ffGeneral, FPrecision, FSize);
+ TheText := BcdToStrF(bcd, ffGeneral, FPrecision, FSize);
end else
TheText := '';
end;
diff --git a/packages/fcl-db/src/memds/memds.pp b/packages/fcl-db/src/memds/memds.pp
index d109fd4547..f7807f68d0 100644
--- a/packages/fcl-db/src/memds/memds.pp
+++ b/packages/fcl-db/src/memds/memds.pp
@@ -11,8 +11,10 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
+{$IFDEF FPC}
{$mode objfpc}
{$H+}
+{$ENDIF}
{
TMemDataset : In-memory dataset.
- Has possibility to copy Structure/Data from other dataset.
@@ -37,6 +39,10 @@ const
smData = 2;
type
+ {$IFNDEF FPC}
+ ptrint = Integer;
+ {$ENDIF}
+
MDSError=class(Exception);
PRecInfo=^TMTRecInfo;
@@ -63,6 +69,9 @@ type
FFilterBuffer: PChar;
ffieldoffsets: PInteger;
ffieldsizes: PInteger;
+ function GetCharPointer(p:PChar; Pos:Integer):PChar;
+ function GetIntegerPointer(p:PInteger; Pos:Integer):PInteger;
+
procedure calcrecordlayout;
function MDSGetRecordOffset(ARecNo: integer): longint;
function MDSGetFieldOffset(FieldNo: integer): integer;
@@ -123,16 +132,16 @@ type
Function DataSize : Integer;
- procedure Clear(ClearDefs : Boolean);
- procedure Clear;
- Procedure SaveToFile(AFileName : String);
- Procedure SaveToFile(AFileName : String; SaveData : Boolean);
- Procedure SaveToStream(F : TStream);
- Procedure SaveToStream(F : TStream; SaveData : Boolean);
+ procedure Clear(ClearDefs : Boolean);{$IFNDEF FPC} overload; {$ENDIF}
+ procedure Clear;{$IFNDEF FPC} overload; {$ENDIF}
+ Procedure SaveToFile(AFileName : String);{$IFNDEF FPC} overload; {$ENDIF}
+ Procedure SaveToFile(AFileName : String; SaveData : Boolean);{$IFNDEF FPC} overload; {$ENDIF}
+ Procedure SaveToStream(F : TStream); {$IFNDEF FPC} overload; {$ENDIF}
+ Procedure SaveToStream(F : TStream; SaveData : Boolean);{$IFNDEF FPC} overload; {$ENDIF}
Procedure LoadFromStream(F : TStream);
Procedure LoadFromFile(AFileName : String);
- Procedure CopyFromDataset(DataSet : TDataSet);
- Procedure CopyFromDataset(DataSet : TDataSet; CopyData : Boolean);
+ Procedure CopyFromDataset(DataSet : TDataSet); {$IFNDEF FPC} overload; {$ENDIF}
+ Procedure CopyFromDataset(DataSet : TDataSet; CopyData : Boolean); {$IFNDEF FPC} overload; {$ENDIF}
Property FileModified : Boolean Read FFileModified;
@@ -284,7 +293,7 @@ end;
function TMemDataset.MDSGetFieldOffset(FieldNo: integer): integer;
begin
- result:= ffieldoffsets[fieldno-1];
+ result:= getIntegerpointer(ffieldoffsets, fieldno-1)^;
end;
Procedure TMemDataset.RaiseError(Fmt : String; Args : Array of const);
@@ -300,6 +309,7 @@ begin
dt1:= FieldDefs.Items[FieldNo-1].Datatype;
case dt1 of
ftString: result:=FieldDefs.Items[FieldNo-1].Size+1;
+ ftFixedChar:result:=FieldDefs.Items[FieldNo-1].Size+1;
ftBoolean: result:=SizeOf(Wordbool);
ftFloat: result:=SizeOf(Double);
ftLargeInt: result:=SizeOf(int64);
@@ -705,7 +715,7 @@ begin
not getfieldisnull(pointer(srcbuffer),I);
if result and (buffer <> nil) then
begin
- Move((SrcBuffer+ffieldoffsets[I])^, Buffer^,FFieldSizes[I]);
+ Move(getcharpointer(SrcBuffer,getintegerpointer(ffieldoffsets,I)^)^, Buffer^,GetIntegerPointer(FFieldSizes, I)^);
end;
end;
@@ -723,10 +733,10 @@ begin
else
begin
unsetfieldisnull(pointer(destbuffer),I);
- J:=FFieldSizes[I];
+ J:=GetIntegerPointer(FFieldSizes, I)^;
if Field.DataType=ftString then
Dec(J); // Do not move terminating 0, which is in the size.
- Move(Buffer^,(DestBuffer+FFieldOffsets[I])^,J);
+ Move(Buffer^,GetCharPointer(DestBuffer, getIntegerPointer(FFieldOffsets, I)^)^,J);
dataevent(defieldchange,ptrint(field));
end;
end;
@@ -842,18 +852,22 @@ begin
// Avoid mem-leak if CreateTable is called twice
FreeMem(ffieldoffsets);
Freemem(ffieldsizes);
-
+ {$IFDEF FPC}
FFieldOffsets:=getmem(Count*sizeof(integer));
FFieldSizes:=getmem(Count*sizeof(integer));
+ {$ELSE}
+ getmem(FFieldOffsets, Count*sizeof(integer));
+ getmem(FFieldSizes, Count*sizeof(integer));
+ {$ENDIF}
FRecSize:= (Count+7) div 8; //null mask
{$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
FRecSize:=Align(FRecSize,4);
{$ENDIF}
for i:= 0 to Count-1 do
begin
- ffieldoffsets[i] := frecsize;
- ffieldsizes[i] := MDSGetbufferSize(i+1);
- FRecSize:= FRecSize+FFieldSizes[i];
+ GetIntegerPointer(ffieldoffsets, i)^ := frecsize;
+ GetIntegerPointer(ffieldsizes, i)^ := MDSGetbufferSize(i+1);
+ FRecSize:= FRecSize+GetIntegerPointeR(FFieldSizes, i)^;
end;
end;
@@ -964,6 +978,7 @@ begin
ftInteger : F1.AsInteger:=F2.AsInteger;
ftDate : F1.AsDateTime:=F2.AsDateTime;
ftTime : F1.AsDateTime:=F2.AsDateTime;
+ ftDateTime : F1.AsDateTime:=F2.AsDateTime;
end;
end;
Try
@@ -986,4 +1001,16 @@ begin
end;
end;
+function TMemDataset.GetCharPointer(p:PChar; Pos:Integer):PChar;
+begin
+ Result:=p;
+ inc(Result, Pos);
+end;
+
+function TMemDataset.GetIntegerPointer(p:PInteger; Pos:Integer):PInteger;
+begin
+ Result:=p;
+ inc(Result, Pos);
+end;
+
end.
diff --git a/packages/fcl-db/src/sqldb/mysql/mysql50conn.pas b/packages/fcl-db/src/sqldb/mysql/mysql50conn.pas
index a3695ad929..80e3994d91 100644
--- a/packages/fcl-db/src/sqldb/mysql/mysql50conn.pas
+++ b/packages/fcl-db/src/sqldb/mysql/mysql50conn.pas
@@ -4,6 +4,7 @@
unit mysql50conn;
+{$DEFINE MYSQL50_up}
{$DEFINE MYSQL50}
{$i mysqlconn.inc}
diff --git a/packages/fcl-db/src/sqldb/mysql/mysql51conn.pas b/packages/fcl-db/src/sqldb/mysql/mysql51conn.pas
index 9088bc80f4..41bbc113b0 100644
--- a/packages/fcl-db/src/sqldb/mysql/mysql51conn.pas
+++ b/packages/fcl-db/src/sqldb/mysql/mysql51conn.pas
@@ -4,6 +4,8 @@
unit mysql51conn;
+{$DEFINE MYSQL50_UP}
+{$DEFINE MYSQL51_UP}
{$DEFINE MYSQL51}
{$i mysqlconn.inc}
diff --git a/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc b/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc
index 0ed85ff45c..8f6f7a61e2 100644
--- a/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc
+++ b/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc
@@ -188,12 +188,8 @@ const
'MYSQL_OPT_USE_REMOTE_CONNECTION','MYSQL_OPT_USE_EMBEDDED_CONNECTION',
'MYSQL_OPT_GUESS_CONNECTION','MYSQL_SET_CLIENT_IP',
'MYSQL_SECURE_AUTH'
-{$IFDEF MYSQL50}
+{$IFDEF MYSQL50_UP}
,'MYSQL_REPORT_DATA_TRUNCATION', 'MYSQL_OPT_RECONNECT'
-{$ELSE}
- {$IFDEF MYSQL51}
- ,'MYSQL_REPORT_DATA_TRUNCATION', 'MYSQL_OPT_RECONNECT'
- {$ENDIF}
{$ENDIF}
);
@@ -559,7 +555,7 @@ begin
NewType := ftInteger;
NewSize := 0;
end;
-{$ifdef mysql50}
+{$ifdef mysql50_up}
FIELD_TYPE_NEWDECIMAL,
{$endif}
FIELD_TYPE_DECIMAL: if ADecimals < 5 then
@@ -867,7 +863,7 @@ begin
VL := 0;
Move(VL, Dest^, SizeOf(LargeInt));
end;
-{$ifdef mysql50}
+{$ifdef mysql50_up}
FIELD_TYPE_NEWDECIMAL,
{$endif}
FIELD_TYPE_DECIMAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
diff --git a/packages/fcl-db/src/sqldb/postgres/pqconnection.pp b/packages/fcl-db/src/sqldb/postgres/pqconnection.pp
index 664b8a2bd9..d40e9a9398 100644
--- a/packages/fcl-db/src/sqldb/postgres/pqconnection.pp
+++ b/packages/fcl-db/src/sqldb/postgres/pqconnection.pp
@@ -546,7 +546,7 @@ begin
FPrepared := True;
end
else
- statement := buf;
+ statement := AParams.ParseSQL(buf,false,sqEscapeSlash in ConnOptions, sqEscapeRepeat in ConnOptions,psPostgreSQL);
end;
end;
@@ -561,10 +561,11 @@ begin
res := pqexec(tr.PGConn,pchar('deallocate prepst'+nr));
if (PQresultStatus(res) <> PGRES_COMMAND_OK) then
begin
+ pqclear(res);
+ DatabaseError(SErrPrepareFailed + ' (PostgreSQL: ' + PQerrorMessage(tr.PGConn) + ')',self)
+ end
+ else
pqclear(res);
- DatabaseError(SErrPrepareFailed + ' (PostgreSQL: ' + PQerrorMessage(tr.PGConn) + ')',self)
- end;
- pqclear(res);
end;
FPrepared := False;
end;
@@ -641,9 +642,12 @@ begin
s := Statement;
res := pqexec(tr.PGConn,pchar(s));
if (PQresultStatus(res) in [PGRES_COMMAND_OK,PGRES_TUPLES_OK]) then
- pqclear(res);
+ begin
+ pqclear(res);
+ res:=nil;
+ end;
end;
- if not (PQresultStatus(res) in [PGRES_COMMAND_OK,PGRES_TUPLES_OK]) then
+ if assigned(res) and not (PQresultStatus(res) in [PGRES_COMMAND_OK,PGRES_TUPLES_OK]) then
begin
s := PQerrorMessage(tr.PGConn);
pqclear(res);
diff --git a/packages/fcl-db/tests/sqldbtoolsunit.pas b/packages/fcl-db/tests/sqldbtoolsunit.pas
index 0c4482fbd2..60d9893ca2 100644
--- a/packages/fcl-db/tests/sqldbtoolsunit.pas
+++ b/packages/fcl-db/tests/sqldbtoolsunit.pas
@@ -7,13 +7,13 @@ interface
uses
Classes, SysUtils, toolsunit,
db,
- sqldb, ibconnection, mysql40conn, mysql41conn, mysql50conn, pqconnection,odbcconn,oracleconnection,sqlite3conn;
+ sqldb, ibconnection, mysql40conn, mysql41conn, mysql50conn, mysql51conn, pqconnection,odbcconn,oracleconnection,sqlite3conn;
-type TSQLDBTypes = (mysql40,mysql41,mysql50,postgresql,interbase,odbc,oracle,sqlite3);
+type TSQLDBTypes = (mysql40,mysql41,mysql50,mysql51,postgresql,interbase,odbc,oracle,sqlite3);
const MySQLdbTypes = [mysql40,mysql41,mysql50];
DBTypesNames : Array [TSQLDBTypes] of String[19] =
- ('MYSQL40','MYSQL41','MYSQL50','POSTGRESQL','INTERBASE','ODBC','ORACLE','SQLITE3');
+ ('MYSQL40','MYSQL41','MYSQL50','MYSQL51','POSTGRESQL','INTERBASE','ODBC','ORACLE','SQLITE3');
FieldtypeDefinitionsConst : Array [TFieldType] of String[15] =
(
@@ -115,8 +115,7 @@ begin
testStringValues[t] := TrimRight(testStringValues[t]);
end;
if SQLDbType = MYSQL50 then Fconnection := tMySQL50Connection.Create(nil);
- if SQLDbType in MySQLdbTypes then
- FieldtypeDefinitions[ftLargeint] := 'BIGINT';
+ if SQLDbType = MYSQL51 then Fconnection := tMySQL51Connection.Create(nil);
if SQLDbType = sqlite3 then
begin
Fconnection := TSQLite3Connection.Create(nil);
@@ -134,7 +133,6 @@ begin
if SQLDbType = INTERBASE then
begin
Fconnection := tIBConnection.Create(nil);
- FieldtypeDefinitions[ftLargeint] := 'BIGINT';
end;
if SQLDbType = ODBC then Fconnection := tODBCConnection.Create(nil);
if SQLDbType = ORACLE then Fconnection := TOracleConnection.Create(nil);
diff --git a/packages/fcl-db/tests/testfieldtypes.pas b/packages/fcl-db/tests/testfieldtypes.pas
index 0925465ce8..67b634a76a 100644
--- a/packages/fcl-db/tests/testfieldtypes.pas
+++ b/packages/fcl-db/tests/testfieldtypes.pas
@@ -1391,7 +1391,10 @@ begin
begin
with query do
begin
- SQL.Text:='select NAME from FPDEV where NAME=''TestName21'' limit 1';
+ if (sqlDBtype=interbase) then
+ SQL.Text:='select first 1 NAME from FPDEV where NAME=''TestName21'''
+ else
+ SQL.Text:='select NAME from FPDEV where NAME=''TestName21'' limit 1';
Open;
close;
ServerFilter:='ID=21';
@@ -1626,6 +1629,8 @@ procedure TTestFieldTypes.TestSQLClob;
AssertEquals(testStringValues[a],AField.AsString);
end;
begin
+ if SQLDbType=interbase then
+ Ignore('This test does not apply to Interbase/Firebird, since it does not support CLOB fields');
TestSQLFieldType(ftMemo, 'CLOB', 0, @TestSQLClob_GetSQLText, @CheckFieldValue);
end;
@@ -1641,7 +1646,10 @@ procedure TTestFieldTypes.TestSQLLargeint;
AssertEquals(testLargeIntValues[a],AField.AsLargeInt);
end;
begin
- TestSQLFieldType(ftLargeint, 'LARGEINT', 8, @TestSQLLargeint_GetSQLText, @CheckFieldValue);
+ if sqlDBType=interbase then
+ TestSQLFieldType(ftLargeint, 'BIGINT', 8, @TestSQLLargeint_GetSQLText, @CheckFieldValue)
+ else
+ TestSQLFieldType(ftLargeint, 'LARGEINT', 8, @TestSQLLargeint_GetSQLText, @CheckFieldValue);
end;
diff --git a/packages/fcl-image/Makefile b/packages/fcl-image/Makefile
index 46987dec8b..66a18b59ab 100644
--- a/packages/fcl-image/Makefile
+++ b/packages/fcl-image/Makefile
@@ -1,8 +1,8 @@
#
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2010/09/29]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/03/21]
#
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 i386-nativent i386-iphonesim 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-solaris 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 mipsel-linux
+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 i386-nativent i386-iphonesim 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 powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris 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 mipsel-linux
BSDs = freebsd netbsd openbsd darwin
UNIXs = linux $(BSDs) solaris qnx haiku
LIMIT83fs = go32v2 os2 emx watcom
@@ -377,6 +377,9 @@ endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override TARGET_UNITS+=fpimgcmn fpimage pngcomn fpreadpng fpwritepng fpreadxpm fpwritexpm clipping fpcanvas pixtools fppixlcanv fpimgcanv pscanvas fpwritebmp fpreadbmp bmpcomn fpreadpnm fpwritepnm fpreadjpeg fpwritejpeg pcxcomn fpreadpcx fpwritepcx fptiffcmn fpreadtiff fpwritetiff targacmn fpreadtga fpwritetga ellipses fpcolhash fpditherer fpquantizer extinterpolation fpreadgif fpreadpsd xwdfile fpreadxwd
endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override TARGET_UNITS+=fpimgcmn fpimage pngcomn fpreadpng fpwritepng fpreadxpm fpwritexpm clipping fpcanvas pixtools fppixlcanv fpimgcanv pscanvas fpwritebmp fpreadbmp bmpcomn fpreadpnm fpwritepnm fpreadjpeg fpwritejpeg pcxcomn fpreadpcx fpwritepcx fptiffcmn fpreadtiff fpwritetiff targacmn fpreadtga fpwritetga ellipses fpcolhash fpditherer fpquantizer extinterpolation fpreadgif fpreadpsd xwdfile fpreadxwd
+endif
ifeq ($(FULL_TARGET),sparc-linux)
override TARGET_UNITS+=fpimgcmn fpimage pngcomn fpreadpng fpwritepng fpreadxpm fpwritexpm clipping fpcanvas pixtools fppixlcanv fpimgcanv pscanvas fpwritebmp fpreadbmp bmpcomn fpreadpnm fpwritepnm fpreadjpeg fpwritejpeg pcxcomn fpreadpcx fpwritepcx fptiffcmn fpreadtiff fpwritetiff targacmn fpreadtga fpwritetga ellipses fpcolhash fpditherer fpquantizer extinterpolation fpreadgif fpreadpsd xwdfile fpreadxwd freetypeh freetype ftfont
endif
@@ -402,7 +405,7 @@ ifeq ($(FULL_TARGET),x86_64-darwin)
override TARGET_UNITS+=fpimgcmn fpimage pngcomn fpreadpng fpwritepng fpreadxpm fpwritexpm clipping fpcanvas pixtools fppixlcanv fpimgcanv pscanvas fpwritebmp fpreadbmp bmpcomn fpreadpnm fpwritepnm fpreadjpeg fpwritejpeg pcxcomn fpreadpcx fpwritepcx fptiffcmn fpreadtiff fpwritetiff targacmn fpreadtga fpwritetga ellipses fpcolhash fpditherer fpquantizer extinterpolation fpreadgif fpreadpsd xwdfile fpreadxwd freetypeh freetype ftfont
endif
ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=fpimgcmn fpimage pngcomn fpreadpng fpwritepng fpreadxpm fpwritexpm clipping fpcanvas pixtools fppixlcanv fpimgcanv pscanvas fpwritebmp fpreadbmp bmpcomn fpreadpnm fpwritepnm fpreadjpeg fpwritejpeg pcxcomn fpreadpcx fpwritepcx fptiffcmn fpreadtiff fpwritetiff targacmn fpreadtga fpwritetga ellipses fpcolhash fpditherer fpquantizer extinterpolation fpreadgif fpreadpsd xwdfile fpreadxwd
+override TARGET_UNITS+=fpimgcmn fpimage pngcomn fpreadpng fpwritepng fpreadxpm fpwritexpm clipping fpcanvas pixtools fppixlcanv fpimgcanv pscanvas fpwritebmp fpreadbmp bmpcomn fpreadpnm fpwritepnm fpreadjpeg fpwritejpeg pcxcomn fpreadpcx fpwritepcx fptiffcmn fpreadtiff fpwritetiff targacmn fpreadtga fpwritetga ellipses fpcolhash fpditherer fpquantizer extinterpolation fpreadgif fpreadpsd xwdfile fpreadxwd freetypeh freetype ftfont
endif
ifeq ($(FULL_TARGET),x86_64-embedded)
override TARGET_UNITS+=fpimgcmn fpimage pngcomn fpreadpng fpwritepng fpreadxpm fpwritexpm clipping fpcanvas pixtools fppixlcanv fpimgcanv pscanvas fpwritebmp fpreadbmp bmpcomn fpreadpnm fpwritepnm fpreadjpeg fpwritejpeg pcxcomn fpreadpcx fpwritepcx fptiffcmn fpreadtiff fpwritetiff targacmn fpreadtga fpwritetga ellipses fpcolhash fpditherer fpquantizer extinterpolation fpreadgif fpreadpsd xwdfile fpreadxwd
@@ -563,6 +566,9 @@ endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override TARGET_RSTS+=pscanvas
endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override TARGET_RSTS+=pscanvas
+endif
ifeq ($(FULL_TARGET),sparc-linux)
override TARGET_RSTS+=pscanvas
endif
@@ -749,6 +755,9 @@ endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override TARGET_EXAMPLEDIRS+=examples
endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override TARGET_EXAMPLEDIRS+=examples
+endif
ifeq ($(FULL_TARGET),sparc-linux)
override TARGET_EXAMPLEDIRS+=examples
endif
@@ -936,6 +945,9 @@ endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override COMPILER_OPTIONS+=-S2h
endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override COMPILER_OPTIONS+=-S2h
+endif
ifeq ($(FULL_TARGET),sparc-linux)
override COMPILER_OPTIONS+=-S2h
endif
@@ -1122,6 +1134,9 @@ endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override COMPILER_SOURCEDIR+=src
endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override COMPILER_SOURCEDIR+=src
+endif
ifeq ($(FULL_TARGET),sparc-linux)
override COMPILER_SOURCEDIR+=src
endif
@@ -1543,6 +1558,11 @@ ifeq ($(OS_TARGET),NativeNT)
SHAREDLIBEXT=.dll
SHORTSUFFIX=nativent
endif
+ifeq ($(OS_TARGET),wii)
+EXEEXT=.dol
+SHAREDLIBEXT=.so
+SHORTSUFFIX=wii
+endif
else
ifeq ($(OS_TARGET),go32v1)
PPUEXT=.pp1
@@ -2230,6 +2250,13 @@ REQUIRE_PACKAGES_HASH=1
REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-BASE=1
endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASJPEG=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-BASE=1
+endif
ifeq ($(FULL_TARGET),sparc-linux)
REQUIRE_PACKAGES_RTL=1
REQUIRE_PACKAGES_PASJPEG=1
@@ -3268,6 +3295,9 @@ endif
ifeq ($(FULL_TARGET),powerpc-embedded)
TARGET_EXAMPLEDIRS_EXAMPLES=1
endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
ifeq ($(FULL_TARGET),sparc-linux)
TARGET_EXAMPLEDIRS_EXAMPLES=1
endif
diff --git a/packages/fcl-image/Makefile.fpc b/packages/fcl-image/Makefile.fpc
index ba1fa87890..391e22119c 100644
--- a/packages/fcl-image/Makefile.fpc
+++ b/packages/fcl-image/Makefile.fpc
@@ -14,6 +14,7 @@ units=fpimgcmn fpimage pngcomn fpreadpng fpwritepng fpreadxpm fpwritexpm \
targacmn fpreadtga fpwritetga ellipses fpcolhash fpditherer fpquantizer \
extinterpolation fpreadgif fpreadpsd xwdfile fpreadxwd
units_win32=freetypeh freetype ftfont
+units_win64=freetypeh freetype ftfont
units_beos=freetypeh freetype ftfont
units_haiku=freetypeh freetype ftfont
units_linux=freetypeh freetype ftfont
diff --git a/packages/fcl-image/src/fpcanvas.inc b/packages/fcl-image/src/fpcanvas.inc
index 99784a8e8d..b3729fb5c3 100644
--- a/packages/fcl-image/src/fpcanvas.inc
+++ b/packages/fcl-image/src/fpcanvas.inc
@@ -402,6 +402,56 @@ begin
FPenPos := points[high(points)];
end;
+procedure TFPCustomCanvas.RadialPie(x1, y1, x2, y2, StartAngle16Deg, Angle16DegLength: Integer);
+
+begin
+ DoRadialPie(X1, y1, x2, y2, StartAngle16Deg, Angle16DegLength);
+end;
+
+procedure TFPCustomCanvas.DoRadialPie(x1, y1, x2, y2, StartAngle16Deg, Angle16DegLength: Integer);
+
+begin
+ // To be implemented
+end;
+
+procedure TFPCustomCanvas.DoPolyBezier(Points: PPoint; NumPts: Integer;
+ Filled: boolean = False;
+ Continuous: boolean = False);
+
+begin
+ // To be implemented
+end;
+
+procedure TFPCustomCanvas.PolyBezier(Points: PPoint; NumPts: Integer;
+ Filled: boolean = False;
+ Continuous: boolean = False);
+begin
+ DoPolyBezier(Points,NumPts,Filled,Continuous);
+end;
+
+procedure TFPCustomCanvas.PolyBezier(const Points: array of TPoint;
+ Filled: boolean = False;
+ Continuous: boolean = False);
+var
+ NPoints{, i}: integer;
+// PointArray: ^TPoint;
+begin
+ NPoints:=High(Points)-Low(Points)+1;
+ if NPoints>0 then
+ DoPolyBezier(@Points[Low(Points)],NPoints,Filled,Continuous);
+{
+ NPoints:=High(Points)-Low(Points)+1;
+ if NPoints<=0 then exit;
+ GetMem(PointArray,SizeOf(TPoint)*NPoints);
+ try
+ for i:=0 to NPoints-1 do
+ PointArray[i]:=Points[i+Low(Points)];
+ DoPolyBezier(PointArray, NPoints, Filled, Continuous);
+ finally
+ FreeMem(PointArray);
+ end;}
+end;
+
procedure TFPCustomCanvas.Clear;
var r : TRect;
begin
@@ -500,6 +550,25 @@ begin
Rectangle (Rect(left,top,right,bottom));
end;
+procedure TFPCustomCanvas.FillRect(const ARect: TRect);
+
+begin
+ if (Brush.style <> bsClear) then
+ begin
+ if not (brush is TFPCustomDrawBrush) then
+ DoRectangleFill (ARect)
+ else
+ with ARect do
+ TFPCustomDrawBrush(Brush).Rectangle (left,top,right,bottom);
+ end;
+end;
+
+procedure TFPCustomCanvas.FillRect(X1,Y1,X2,Y2: Integer);
+
+begin
+ FillRect (Rect(X1,Y1,X2,Y2));
+end;
+
procedure TFPCustomCanvas.Rectangle (const Bounds:TRect);
var np,nb,dp,db,pb : boolean;
begin
diff --git a/packages/fcl-image/src/fpcanvas.pp b/packages/fcl-image/src/fpcanvas.pp
index 6c82cae7f7..c9ca814463 100644
--- a/packages/fcl-image/src/fpcanvas.pp
+++ b/packages/fcl-image/src/fpcanvas.pp
@@ -24,6 +24,7 @@ const
type
+ PPoint = ^TPoint;
TFPCanvasException = class (Exception);
TFPPenException = class (TFPCanvasException);
TFPBrushException = class (TFPCanvasException);
@@ -82,11 +83,14 @@ type
TFPCustomFont = class (TFPCanvasHelper)
private
FName : string;
+ FOrientation,
FSize : integer;
protected
procedure DoCopyProps (From:TFPCanvasHelper); override;
procedure SetName (AValue:string); virtual;
procedure SetSize (AValue:integer); virtual;
+ procedure SetOrientation (AValue:integer); virtual;
+ function GetOrientation : Integer;
public
function CopyFont : TFPCustomFont;
// Creates a copy of the font with all properties the same, but not allocated
@@ -99,6 +103,8 @@ type
property Italic : boolean index 6 read GetFlags write SetFlags;
property Underline : boolean index 7 read GetFlags write SetFlags;
property StrikeTrough : boolean index 8 read GetFlags write SetFlags;
+ property Orientation: Integer read GetOrientation write SetOrientation default 0;
+
end;
TFPCustomFontClass = class of TFPCustomFont;
@@ -255,6 +261,10 @@ type
procedure DoLine (x1,y1,x2,y2:integer); virtual; abstract;
procedure DoCopyRect (x,y:integer; canvas:TFPCustomCanvas; Const SourceRect:TRect); virtual; abstract;
procedure DoDraw (x,y:integer; Const image:TFPCustomImage); virtual; abstract;
+ procedure DoRadialPie(x1, y1, x2, y2, StartAngle16Deg, Angle16DegLength: Integer); virtual;
+ procedure DoPolyBezier(Points: PPoint; NumPts: Integer;
+ Filled: boolean = False;
+ Continuous: boolean = False); virtual;
procedure CheckHelper (AHelper:TFPCanvasHelper); virtual;
procedure AddHelper (AHelper:TFPCanvasHelper);
public
@@ -277,8 +287,17 @@ type
procedure EllipseC (x,y:integer; rx,ry:longword);
procedure Polygon (Const points:array of TPoint);
procedure Polyline (Const points:array of TPoint);
- procedure Rectangle (Const Bounds:TRect);
+ procedure RadialPie(x1, y1, x2, y2, StartAngle16Deg, Angle16DegLength: Integer);
+ procedure PolyBezier(Points: PPoint; NumPts: Integer;
+ Filled: boolean = False;
+ Continuous: boolean = False);
+ procedure PolyBezier(const Points: array of TPoint;
+ Filled: boolean = False;
+ Continuous: boolean = False);
+ procedure Rectangle (Const Bounds : TRect);
procedure Rectangle (left,top,right,bottom:integer);
+ procedure FillRect(const ARect: TRect);
+ procedure FillRect(X1,Y1,X2,Y2: Integer);
// using brush
procedure FloodFill (x,y:integer);
procedure Clear;
diff --git a/packages/fcl-image/src/fpfont.inc b/packages/fcl-image/src/fpfont.inc
index a63f435fb6..b61c78a448 100644
--- a/packages/fcl-image/src/fpfont.inc
+++ b/packages/fcl-image/src/fpfont.inc
@@ -24,6 +24,17 @@ begin
FSize := AValue;
end;
+procedure TFPCustomFont.SetOrientation (AValue:integer);
+begin
+ FOrientation := AValue;
+end;
+
+function TFPCustomFont.GetOrientation : Integer;
+begin
+ Result := FOrientation;
+end;
+
+
procedure TFPCustomFont.DoCopyProps (From:TFPCanvasHelper);
begin
with from as TFPCustomFont do
diff --git a/packages/fcl-json/Makefile b/packages/fcl-json/Makefile
index dcf4e98380..4ad9d8c0fc 100644
--- a/packages/fcl-json/Makefile
+++ b/packages/fcl-json/Makefile
@@ -1,8 +1,8 @@
#
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2010/09/20]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2010/10/20]
#
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 i386-nativent 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-solaris 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 mipsel-linux
+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 i386-nativent i386-iphonesim 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-solaris 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 mipsel-linux
BSDs = freebsd netbsd openbsd darwin
UNIXs = linux $(BSDs) solaris qnx haiku
LIMIT83fs = go32v2 os2 emx watcom
@@ -245,7 +245,7 @@ endif
ifndef CROSSBINDIR
CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
endif
-ifeq ($(OS_TARGET),darwin)
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
ifeq ($(OS_SOURCE),darwin)
DARWIN2DARWIN=1
endif
@@ -329,6 +329,9 @@ endif
ifeq ($(FULL_TARGET),i386-nativent)
override TARGET_UNITS+=fpjson jsonscanner jsonparser jsonconf fpjsonrtti
endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override TARGET_UNITS+=fpjson jsonscanner jsonparser jsonconf fpjsonrtti
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override TARGET_UNITS+=fpjson jsonscanner jsonparser jsonconf fpjsonrtti
endif
@@ -512,6 +515,9 @@ endif
ifeq ($(FULL_TARGET),i386-nativent)
override TARGET_RSTS+=fpjson jsonscanner jsonparser jsonconf fpjsonrtti
endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override TARGET_RSTS+=fpjson jsonscanner jsonparser jsonconf fpjsonrtti
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override TARGET_RSTS+=fpjson jsonscanner jsonparser jsonconf fpjsonrtti
endif
@@ -696,6 +702,9 @@ endif
ifeq ($(FULL_TARGET),i386-nativent)
override COMPILER_OPTIONS+=-S2h
endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_OPTIONS+=-S2h
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override COMPILER_OPTIONS+=-S2h
endif
@@ -879,6 +888,9 @@ endif
ifeq ($(FULL_TARGET),i386-nativent)
override COMPILER_SOURCEDIR+=src
endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_SOURCEDIR+=src
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override COMPILER_SOURCEDIR+=src
endif
@@ -1326,7 +1338,7 @@ DEBUGSYMEXT=.xcoff
SHORTSUFFIX=mac
IMPORTLIBPREFIX=imp
endif
-ifeq ($(OS_TARGET),darwin)
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
BATCHEXT=.sh
EXEEXT=
HASSHAREDLIB=1
@@ -1855,6 +1867,11 @@ ifeq ($(FULL_TARGET),i386-nativent)
REQUIRE_PACKAGES_RTL=1
REQUIRE_PACKAGES_FCL-BASE=1
endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_UNIVINT=1
+REQUIRE_PACKAGES_FCL-BASE=1
+endif
ifeq ($(FULL_TARGET),m68k-linux)
REQUIRE_PACKAGES_RTL=1
REQUIRE_PACKAGES_FCL-BASE=1
diff --git a/packages/fcl-passrc/examples/test_parser.pp b/packages/fcl-passrc/examples/test_parser.pp
index ae178e7334..c857b78f05 100644
--- a/packages/fcl-passrc/examples/test_parser.pp
+++ b/packages/fcl-passrc/examples/test_parser.pp
@@ -1,7 +1,151 @@
+{ This is a test-program for the fcl-passrc package (except writer-class).
+
+ Please notice that i have done this to find out how good the parser workes,
+ it is not thought to be a good example to use the fcl-passrc package but
+ may give you hints on using it.
+
+ It is done to test the source of these units for usability, completeness and
+ bugs. It is base on the fcl-passrc exampe.
+ It workes like a pretty-printer to compare the output of this program with
+ the original code, but is not thought to be a real pretty-printer as
+ e.g. the semicolons can sometimes not be set at the place they sould be
+ (this imformation is not available from the parsing-engine, as a parser
+ should only give you a positiv result if the source is valid, otherwise
+ you get a negative result).
+ Also the output is not always in the same order as in input as this
+ information is not available easily.
+
+ !!!Do not expect this program to produce executeable output!!!
+
+ Status: -workes with one Unit or Program
+ -Some type declarations missing
+ -string[n] the [n] part missing -> missing in parser
+ -array of const -> missing in parser
+ -Hints deprecated, etc. missing sometimes
+ -the parser splits x,y:atype
+ x:atype
+ y:atype
+ i tryed to put them together again
+ - () missing in statements: () expression and typecast
+ -missing forward class declaration like x=class
+ -incomplete !
+
+ parser: -ugly ''' quotation from scanner, why not #39 ?
+ -see comments in the program for hints
+ -incomplete !
+
+ Usage: call with one complete filename of a Unit or Program
+ defaults for the parser are 'linux' and 'i386'
+
+ Output: is 'pretty-printed' to stdout or unformated
+ The unformated output is thought to be diffed with the original
+ source to see differences caused by the parser (a tool to unformat
+ a souce file is in progress but not finished jet).
+
+ Bugs: 1. In case of unimplemented statements (like up to now asm) the parser
+ cause a excemtion to abort the program hard.
+ 2. Missing implementaion in this program should not print out anything
+ or result in not pascal conform output.
+
+ Hit: The parser uses directives given in the source file.
+
+ Hints to read the code:
+ There are comments in the code with hints and marks of possible bugs.
+ During development some code was modified for true order output but the
+ old code is still available as a comment as it is easier to understand.
+ This is programmed using 'recursive' calls. Most options in functions are
+ for printing the output.
+ There is no writer-class used to keep it simple and see what is done.
+ All output is produced by direct writing to stdout, this cause problems in
+ furter development; a function result as string may be more usable.
+
+ The parser was written to be used for unit interface and was expanded to
+ work with program and implementation too. It does nearly no seperate
+ things for programs, they are adapted to the unit scheme (see main).
+
+ The order will change in following case:
+ -function with forward declaration (also overloading etc.)
+
+
+ Inheritance (only the important ones):
+
+ TInterfaceSection, TImplementationSection, TProgramSection
+ |
+ TPasSection
+ |
+ TPasDeclarations
+ |
+ TPasElement
+ |
+ TPasElementBase
+ |
+ TObject
+
+ TInitializationSection, TFinalizationSection
+ |
+ TPasImplBlock
+ |
+ TPasImplElement
+ |
+ TPasElement
+ |
+ TPasElementBase
+ |
+ TObject
+
+ TPasProgram
+ |
+ TPasModule
+ |
+ TPasElement
+ |
+ TPasElementBase
+ |
+ TObject
+
+ Dependance Structure :
+
+ TPasPackage = class(TPasElement)
+ |
+ Modules: TList;
+
+ TPasModule = class(TPasElement)
+ |-InterfaceSection: TInterfaceSection;
+ | |-Declarations -> forward part, unit only
+ |
+ |-ImplementationSection: TImplementationSection;
+ | |-Declarations -> full declaration, unit and program
+ | |-Functions: TList;
+ | |-TPasFunction = class(TPasProcedureBase)
+ | |-Body: TProcedureBody;
+ | |-Declarations -> declaration and sub function
+ | |-Body: TPasImplBlock; -> procedure block
+ |
+ |-InitializationSection: TInitializationSection;
+ | |-TPasImplBlock.Elements: TList; -> main block
+ |
+ |-FinalizationSection: TFinalizationSection;
+ |-TPasImplBlock.Elements: TList; -> unit only
+
+ Declarations = class(TPasElement)
+ |-Declarations: TList; -> the following are all in here
+ |-ResStrings: TList;
+ |-Types: TList;
+ |-Consts: TList;
+ |-Classes: TList;
+ |-Functions: TList;
+ |-Variables: TList;
+ |-Properties: TList;
+ }
+
+
+program test_parser1;
{$mode objfpc}{$H+}
uses SysUtils, Classes, PParser, PasTree;
+//# types the parser needs
+
type
{ We have to override abstract TPasTreeContainer methods.
See utils/fpdoc/dglobals.pp for an implementation of TFPDocEngine,
@@ -31,43 +175,1779 @@ begin
Result := nil;
end;
+
+//# main var
var
M: TPasModule;
E: TPasTreeContainer;
I: Integer;
- Decls: TList;
- cmdl : string;
+ cmdl, TargetOS, TargetCPU : string;
+ isim, //is Impleamentation, only for GetTPasProcedureBody
+ Unformated:boolean; // no Formating in output
+
+
+//# tools
+
+ function GetIndent(indent:integer):String;
+ var i:integer;
+ begin
+ Result:='';
+ if not Unformated then
+ for i:=1 to indent do Result:=Result+' ';
+ end;
+
+ //delete ugly quoting '''STRING'''
+ function DelQuot(s:String):String;
+ var i:integer;
+ const s1=#39#39#39;
+ begin
+ Result:='';
+ i:=pos(s1,s);
+ while i > 0 do
+ begin
+ if i > 0 then delete(s,i,2);
+ i:=pos(s1,s);
+ end;
+ //if i > 0 then delete(s,i,2);
+ Result:=s;
+ end;
+
+ //LeadingSpace only valid if Formated output (as this will be one line in output)
+ //UnFormated: all is printed in a new line
+ procedure WriteFmt(LeadingSpace:boolean; s:String; Semicolon:boolean);
+ begin
+ if Semicolon then s:=s+';';
+ if Unformated then writeln(s)
+ else if LeadingSpace then write(' ',s)
+ else write(s);
+ end;
+
+//# parsing output
+
+function GetTPasImplBlock(lb:TPasImplBlock; indent,declistby:integer;
+ LastNoSem,NoFirstIndent:boolean):boolean; forward;
+
+function GetTPasImplElement(le:TPasImplElement; lindent:integer;
+ lLastNoSem,NoFirstIndent:boolean):boolean; forward;
+
+procedure GetDecls(Decl:TPasDeclarations; indent:integer); forward;
+//procedure PrintDecls(Decl:TPasDeclarations; indent:integer); forward;
+
+//# most is for implementation or implblocks except the expr things
+
+function ReturnTPasMemberHints(h:TPasMemberHints):String;
+ begin
+ Result:='';
+ if hDeprecated in h then Result:=' deprecated';
+ if hLibrary in h then Result:=Result+' library';
+ if hPlatform in h then Result:=Result+' platform';
+ if hExperimental in h then Result:=Result+' experimental';
+ if hUnimplemented in h then Result:=Result+' unimplemented';
+ end;
+
+function GetTPasMemberHints(h:TPasMemberHints):Boolean;
+ begin
+ Result:=false;
+ if hDeprecated in h then begin write(' deprecated'); Result:=true; end;
+ if hLibrary in h then begin write(' library'); Result:=true; end;
+ if hPlatform in h then begin write(' platform'); Result:=true; end;
+ if hExperimental in h then begin write(' experimental'); Result:=true; end;
+ if hUnimplemented in h then begin write(' unimplemented'); Result:=true; end;
+ end;
+
+
+
+
+function GetTPasExprKind(lpek:TPasExprKind):String;
+ begin
+ Result:='';
+ case lpek of
+ pekIdent:Result:='ID';
+ pekNumber:Result:='NUMBER';
+ pekString:Result:='STRING';
+ pekSet:Result:='SET';
+ pekNil:Result:='NIL';
+ pekBoolConst:Result:='BOOL';
+ pekRange:Result:='RANGE';
+ pekUnary:Result:='UNARY';
+ pekBinary:Result:='BINARY';
+ pekFuncParams:Result:='FUNCPAR';
+ pekArrayParams:Result:='ARRAYPAR';
+ pekListOfExp:Result:='EXPLIST';
+ end;
+ end;
+
+procedure GetTPasExpr(lex:TPasExpr);
+ var lex1:TpasExpr;
+ lpe:TParamsExpr;
+ l:integer;
+ lbk,rbk,sep:string;
+ lav:TArrayValues;
+ lrv:TRecordValues;
+ rvi:TRecordValuesItem;
+
+
+ function GetExpKind(ek:TPasExprKind; var lbrak,rbrak:string):string;
+ begin
+ lbrak:='';
+ rbrak:='';
+ Result:='';
+ case ek of
+ pekIdent:Result:='ID';
+ pekNumber:Result:='NU';
+ pekString:begin lbrak:=#39; rbrak:=#39; Result:=#39; end;
+ pekSet:begin lbrak:='['; rbrak:=']'; Result:=','; end;
+ pekNil:Result:='NIL';
+ pekBoolConst:Result:='';
+ pekRange:Result:='..';
+ pekUnary:Result:='';
+ pekBinary:Result:='';
+ pekFuncParams:begin lbrak:='('; rbrak:=')'; Result:=','; end;
+ pekArrayParams:begin lbrak:='['; rbrak:=']'; Result:=','; end;
+ pekListOfExp:Result:=',';
+ pekInherited:Result:=' InheriteD';
+ pekSelf:Result:=' SelF';
+ end;
+ end;
+
+ function GetOp(lop:TExprOpCode):string;
+ begin
+ Result:='';
+ case lop of
+ eopNone:Result:='';
+ eopAdd:Result:='+';
+ eopSubtract:Result:='-';
+ eopMultiply:Result:='*';
+ eopDivide:Result:='/';
+ eopDiv:Result:=' div ';
+ eopMod:Result:=' mod ';
+ eopPower:Result:='^';
+ eopShr:Result:=' shr ';
+ eopSHl:Result:=' shl ';
+ eopNot:Result:=' not ';
+ eopAnd:Result:=' and ';
+ eopOr:Result:=' or ';
+ eopXor:Result:=' xor ';
+ eopEqual:Result:='=';
+ eopNotEqual:Result:='<>';
+ eopLessThan:Result:='<';
+ eopGreaterThan:Result:='>';
+ eopLessthanEqual:Result:='<=';
+ eopGreaterThanEqual:Result:='>=';
+ eopIn:Result:=' in ';
+ eopIs:Result:=' is ';
+ eopAs:Result:=' as ';
+ eopSymmetricaldifference:Result:='><';
+ eopAddress:Result:='@';
+ eopDeref:Result:='^';
+ eopSubIdent:Result:='.';
+ end;
+ end;
+
+ begin
+ if lex is TBinaryExpr then //compined constants
+ begin
+ sep:=GetExpKind(lex.Kind,lbk,rbk);
+ //write('|');
+ write(lbk);
+ GetTPasExpr(TBinaryExpr(lex).left);
+ write(GetOp(TBinaryExpr(lex).OpCode));
+ write(sep);
+ GetTPasExpr(TBinaryExpr(lex).right);
+ write(rbk);
+ //write('|');
+ //write(' [',lex.Name,' ',GetTPasExprKind(lex.Kind),']');
+ end
+ else
+ begin
+ //write('UNARY');
+ if lex is TUnaryExpr then
+ begin
+ lex1:=TUnaryExpr(lex).Operand;
+ if lex.OpCode = eopDeref then
+ begin
+ GetTPasExpr(lex1);
+ write(GetOp(lex.OpCode)); //unary last, only: p^
+ end
+ else
+ begin
+ write(GetOp(lex.OpCode)); //unary first: -1
+ GetTPasExpr(lex1);
+ end;
+ end;
+ if lex is TPrimitiveExpr then write(TPrimitiveExpr(lex).Value) //simple constant
+ else
+ if lex is TBoolConstExpr then write(TBoolConstExpr(lex).Value)
+ else
+ if lex is TNilExpr then write('nil')
+ else
+ if lex is TInheritedExpr then write('Inherited ')
+ else
+ if lex is TSelfExpr then write('Self')
+ else
+ if lex is TParamsExpr then //writeln(param1,param2,..,paramn);
+ begin
+ //write(' PAREX ');
+ lpe:=TParamsExpr(lex);
+ GetTPasExpr(lpe.Value);
+ if length(lpe.Params) >0 then
+ begin
+ sep:=GetExpKind(lpe.Kind,lbk,rbk);
+ write(lbk); //write('(');
+ for l:=0 to High(lpe.Params)-1 do
+ begin
+ GetTPasExpr(lpe.Params[l]);
+ write(sep); //seperator
+ end;
+ GetTPasExpr(lpe.Params[High(lpe.Params)]);
+ write(rbk);//write(')');
+ end
+ else
+ begin //funcion()
+ sep:=GetExpKind(lpe.Kind,lbk,rbk);
+ write(lbk,rbk);
+ end;
+ end
+ else if lex is TArrayValues then //const AnArrayConst: Array[1..3] of Integer = (1,2,3);
+ begin
+ write('(');
+ lav:=TArrayValues(lex);
+ if length(lav.Values) > 0 then
+ begin
+ for l:=0 to high(lav.Values)-1 do
+ begin
+ GetTPasExpr(TPasExpr(lav.Values[l]));
+ write(',');
+ end;
+ GetTPasExpr(TPasExpr(lav.Values[high(lav.Values)]));
+ end;
+ write(')');
+ end
+ else if lex is TRecordValues then
+ begin
+ write('(');
+ lrv:=TRecordValues(lex);
+ if length(lrv.Fields) > 0 then
+ begin
+ for l:=0 to high(lrv.Fields)-1 do
+ begin
+ rvi:=TRecordValuesItem(lrv.Fields[l]);
+ write(rvi.Name,':');
+ GetTPasExpr(rvi.ValueExp);
+ write(';');
+ end;
+ rvi:=TRecordValuesItem(lrv.Fields[high(lrv.Fields)]);
+ write(rvi.Name,':');
+ GetTPasExpr(rvi.ValueExp);
+ end;
+ write(')');
+ end
+ else
+ begin
+ //?
+ //writeln('{ Unknown Expression: ');
+ //if assigned(lex) then GetTPasExprKind(lex.Kind);
+ //writeln('}');
+ end;
+ end;
+ end;
+
+
+//NoFirstIndent only for block in case:
+procedure GetTPasSmt(lsmt:TPasImplStatement; lindent:integer; DoNoSem,NoFirstIndent:boolean);
+ var l:integer;
+ lics:TPasImplCaseStatement;
+ DoSem:boolean;
+ liwd:TPasImplWithDo;
+ liwhd:TPasImplWhileDo;
+ lieo:TPasImplExceptOn;
+ lifl:TPasImplForLoop;
+ lir:TPasImplRaise;
+ s,s1:String;//s1 only first line of block statement
+
+begin
+ DoSem:=true;
+ s:=GetIndent(lindent);
+ if NoFirstIndent then s1:=' ' else s1:=s;
+ if lsmt is TPasImplSimple then
+ begin
+ write(s1); GetTPasExpr(TPasImplSimple(lsmt).expr);
+ //DoSem:=true;
+ end
+ else if lsmt is TPasImplAssign then
+ begin
+ write(s1); GetTPasExpr(TPasImplAssign(lsmt).left);
+ write(':= ');
+ GetTPasExpr(TPasImplAssign(lsmt).right);
+ //DoSem:=true;
+ end
+ else if lsmt is TPasImplCaseStatement then
+ begin
+ lics:=TPasImplCaseStatement(lsmt);
+ if lics.Expressions.Count>0 then
+ begin
+ write(s);
+ for l:=0 to lics.Expressions.Count-2 do
+ write(DelQuot(lics.Expressions[l]),',');
+ write(DelQuot(lics.Expressions[lics.Expressions.Count-1]),': '); // !!bug too much ' in expression
+ //if not assigned(lics.Body) then writeln('TPasImplCaseStatement missing BODY');
+ //if assigned(lics.Body) and (TPasImplBlock(lics.Body).Elements.Count >0) then
+ // GetTPasImplBlock(TPasImplBlock(lics.Body),lindent+1,0,false,true)
+ // else GetTPasImplBlock(TPasImplBlock(lics),lindent+1,0,false,true); // !!bug missing body, assigned but empty
+ if assigned(lics.Body) then
+ begin
+ if not GetTPasImplElement(lics.Body,lindent+1,false,true) then ;//writeln(';');
+ end
+ else writeln(';');
+ end;
+ DoSem:=false;
+ end
+ else if lsmt is TPasImplWithDo then
+ begin
+ liwd:=TPasImplWithDo(lsmt); // !!Bug: missing with do at following with do !solved see Bug
+ write(s1,'with ',liwd.Name);
+ if liwd.Expressions.Count>0 then
+ begin
+ for l:=0 to liwd.Expressions.Count-2 do
+ write(liwd.Expressions[l],',');
+ write(liwd.Expressions[liwd.Expressions.Count-1]);
+ end;
+ writeln(' do');
+ //if TPasImplBlock(liwd.Body).Elements.Count >0 then
+ //GetTPasImplBlock(TPasImplBlock(liwd.Body),0); // !!Bug: BODY Not used
+ //else
+ GetTPasImplBlock(TPasImplBlock(liwd),lindent+1,0,false,false);
+ DoSem:=false;
+ end
+ else if lsmt is TPasImplWhileDo then
+ begin
+ liwhd:=TPasImplWhileDo(lsmt);
+ writeln(s1,'while ',DelQuot(liwhd.Condition),' do');
+ //if not GetTPasImplBlock(TPasImplBlock(liwhd.Body),0) then // !!Bug: BODY Not used
+ GetTPasImplBlock(TPasImplBlock(liwhd),lindent,0,DoNoSem,false); //OK for all constructs
+ DoNoSem:=false; //?
+ DoSem:=false;
+ end
+ else if lsmt is TPasImplExceptOn then
+ begin
+ lieo:=TPasImplExceptOn(lsmt);
+ writeln(s,'on ',lieo.VariableName,': ',lieo.TypeName,' do');
+ if TPasImplBlock(lieo.Body) is TPasImplRaise then
+ begin
+ write(s,'raise ');//raise is in TPasImplBlock in this case
+ GetTPasImplBlock(TPasImplBlock(lieo.Body),lindent+1,0,false,true);
+ end
+ else GetTPasImplBlock(TPasImplBlock(lieo.Body),lindent+1,0,false,false);
+ DoSem:=false;
+ end
+ else if lsmt is TPasImplForLoop then
+ begin
+ lifl:=TPasImplForLoop(lsmt);
+ //TODO variable
+ write(s1,'for ',lifl.VariableName,':= ',lifl.StartValue,' ');
+ if lifl.Down then write('down');
+ writeln('to ',lifl.EndValue,' do');
+ GetTPasImplBlock(TPasImplBlock(lifl),lindent+1,0,false,false);
+ DoSem:=false;
+ end
+ else if lsmt is TPasImplRaise then
+ begin
+ write(s1,'raise ');
+ lir:=TPasImplRaise(lsmt);
+ if not GetTPasImplBlock(TPasImplBlock(lir),lindent,0,DoNoSem,true) then
+ writeln(';');
+ DoNoSem:=false;
+ DoSem:=false;
+ end
+ else
+ begin
+ if assigned(lsmt.Elements) then
+ begin
+ writeln('{ Unknown SMT(s): '); //,lsmt.Name,' ',lsmt.ElementTypeName);
+ for l:=0 to lsmt.Elements.Count-1 do
+ write(s,' SMT ',l,' ',TPasElement(lsmt.Elements[l]).Name);
+ writeln('}');
+ end;
+ DoSem:=false;
+ end;
+ if not DoNoSem then
+ begin
+ if DoSem then writeln(';');
+ end
+ else writeln;
+end;
+
+
+ //result: result of TPasImplBlock or valid element
+ //NoFirstIndent only for block in case:
+ function GetTPasImplElement(le:TPasImplElement; lindent:integer;
+ lLastNoSem,NoFirstIndent:boolean):boolean;
+ var liie:TPasImplIfElse;
+ lico:TPasImplCaseOf;
+ lice:TPasImplCaseElse;
+ liru:TPasImplRepeatUntil;
+ lit:TPasImplTry;
+ //lic:TPasImplCommand;
+ s,s1:String;//s1 only first line of block statement
+
begin
- if Paramcount<1 then
+ Result:=true;
+ s:=GetIndent(lindent);
+ if NoFirstIndent then s1:=' ' else s1:=s;
+ if le is TPasImplStatement then
+ begin
+ if NoFirstIndent then lindent:=0;
+ GetTPasSmt(TPasImplStatement(le),lindent+1,lLastNoSem,NoFirstIndent);
+ end
+ else if le is TPasImplIfElse then
+ begin
+ liie:=TPasImplIfElse(le);
+ write(s1,'if ',DelQuot(liie.Condition),' then ');
+ if assigned(liie.ElseBranch) then
+ begin
+ writeln;
+ GetTPasImplElement(liie.IfBranch,lindent+1,true,false);
+ writeln(s,'else');// {if}');
+ GetTPasImplElement(liie.ElseBranch,lindent+1,lLastNoSem,false);
+ end
+ else
+ begin //no else part
+ if assigned(liie.IfBranch) then
+ begin
+ writeln;
+ if not GetTPasImplElement(liie.IfBranch,lindent+1,false,false) then
+ writeln(';');
+ end
+ else writeln(';'); //empty if then;
+ end;
+ end
+ else if le is TPasImplCaseOf then
+ begin
+ lico:=TPasImplCaseOf(le);
+ writeln(s1,'case ',lico.Expression,' of ');
+ if assigned(lico.ElseBranch) then //workaround duplicate bug
+ begin //reduce count of CaseOf as CaseElse is in there
+ lice:=lico.ElseBranch;
+ GetTPasImplBlock(TPasImplBlock(lico),lindent+1,1,false,false);
+ end
+ else GetTPasImplBlock(TPasImplBlock(lico),lindent+1,0,false,false); // !! else duplicate in here
+ if assigned(lico.ElseBranch) then
+ begin
+ writeln(s,'else');//' {case}');
+ lice:=lico.ElseBranch;
+ GetTPasImplBlock(TPasImplBlock(lice),lindent+1,0,false,false);
+ end;
+ if lLastNoSem then writeln(s,'end')//' {case}')
+ else writeln(s,'end;');// {case}');
+ //Result:=false; ??? GetTPasImplBlock
+ end
+ else if le is TPasImplRepeatUntil then
+ begin
+ liru:=TPasImplRepeatUntil(le);
+ writeln(s1,'repeat');
+ GetTPasImplBlock(TPasImplBlock(liru),lindent+1,0,false,false);
+ write(s,'until ',DelQuot(liru.Condition));
+ if lLastNoSem then writeln
+ else writeln(';');
+ end
+ else if le is TPasImplTryFinally then
+ begin
+ writeln(s,'finally');
+ GetTPasImplBlock(TPasImplBlock(le),lindent+1,0,false,false);
+ end
+ else if le is TPasImplTryExcept then
+ begin
+ writeln(s,'except');
+ GetTPasImplBlock(TPasImplBlock(le),lindent+1,0,false,false);
+ end
+ else if le is TPasImplTryExceptElse then
+ begin
+ writeln(s,'else');// {try}');
+ GetTPasImplBlock(TPasImplBlock(le),lindent+1,0,false,false);
+ end
+ else if le is TPasImplTry then
+ begin
+ lit:=TPasImplTry(le);
+ writeln(s1,'try');
+ GetTPasImplBlock(TPasImplBlock(le),lindent+1,0,false,false);
+ if assigned(lit.FinallyExcept) then
+ GetTPasImplElement(TPasImplElement(lit.FinallyExcept),lindent+1,false,false);
+ if assigned(lit.ElseBranch) then
+ GetTPasImplElement(TPasImplElement(lit.ElseBranch),lindent+1,false,false);
+ if lLastNoSem then writeln(s,'end')// {try} ') //there is no ImplBeginBlock
+ else writeln(s,'end;');// {try} ');
+ end
+ else if le is TPasImplCommand then
+ begin
+ //ignore because empty
+ // lic:=TPasImplCommand(le);
+ // writeln(' CMD ',lic.Command,' ',lic.Name,' ',lic.ElementTypeName);
+ end
+ else if le is TPasImplLabelMark then
+ begin
+ writeln(s1,'label ',TPasImplLabelMark(le).LabelId,';');
+ end
+ else if le is TPasImplBlock then
+ begin
+ //IfElse, case:
+ Result:=GetTPasImplBlock(TPasImplBlock(le),lindent+1,0,lLastNoSem,NoFirstIndent);
+ end
+ else
+ begin
+ Result:=false;
+ //writeln(s,';');
+ //writeln(' EL ',l);//,' ',le.Name)//,' ',le.ElementTypeName,' ',le.FullName);
+ end;
+ end;
+
+// indent: indent from page left side
+// DecListBy: dec(elements.count) because of case duplicate else bug
+// LastNoSem: only true on last expr before else in a if clause
+// NoFirstIndent: if line was started by other block like in case at -> 1:Noindent;
+// Result: true if elements not empty
+function GetTPasImplBlock(lb:TPasImplBlock; indent,declistby:integer;
+ LastNoSem,NoFirstIndent:boolean):boolean;
+ var l,n:integer;
+ lbe:TPasImplElement;
+ NoSem:boolean;
+ ls:String;
+
+begin
+ Result:=false;
+ NoSem:=false;
+ ls:=GetIndent(indent);
+ if not assigned(lb) then exit;
+ //if lb is TPasImplRaise then writeln('RAISE');
+ if assigned(lb.Elements) then
+ begin
+ if lb is TPasImplBeginBlock then
+ begin
+ NoSem:=LastNoSem;
+ LastNoSem:=false;
+ if NoFirstIndent then
+ begin
+ writeln('begin');////NFI');
+ NoFirstIndent:=false;
+ end
+ else writeln(ls,'begin');
+ inc(indent);
+ end;
+
+ if lb.Elements.Count >0 then
+ begin
+ Result:=true;
+ n:=lb.Elements.Count-1;
+ //workaround CaseOf duplicate bug
+ if (declistby >0)and(lb.Elements.Count >declistby) then dec(n,declistby);
+ for l:=0 to n do
+ begin
+ lbe:=TPasImplElement(lb.Elements[l]);
+ //write(l:2,'/',n:2,' '); //No of curent element, max element
+ if ((l = 0)and NoFirstIndent) then
+ begin //index0
+ if l=n then GetTPasImplElement(lbe,0,LastNoSem,false)
+ else GetTPasImplElement(lbe,0,false,false)
+ end
+ else if l<>n then GetTPasImplElement(lbe,indent,false,false) //other index
+ else GetTPasImplElement(lbe,indent,LastNoSem,false); //indexn
+ end;
+ end
+ else
+ begin //block is empty
+ //write(ls,' {!EMPTY!}');
+ {if not NoSem then
+ begin
+ if lb is TPasImplBeginBlock then writeln //empty compound need no ;
+ else writeln(';')
+ end
+ else
+ writeln;}
+ end;
+ if lb is TPasImplBeginBlock then
+ if not NoSem then writeln(ls,'end;')// {Block}')
+ else writeln(ls,'end');// {Block}');
+ end
+ else
+ writeln(';'); //writeln(' {!empty!};')
+end;
+
+
+//# Declarations (type,var,const,..)
+
+procedure GetTPasArrayType(lpat:TPasArrayType);
+ begin
+ if lpat.IsPacked then write('packed ');
+ write('Array');
+ if lpat.IndexRange <> '' then write('[',lpat.IndexRange,']');
+ if assigned(lpat.ElType) then write(' of ',lpat.ElType.Name);
+ // BUG: of const missing in Procedure ConstArrayArgProc(A: Array of const); pparser: 643
+ end;
+
+//write out one variable or constant declaration, also used in types
+//In spite of the use of GetPasVariables this is still used !
+procedure GetTPasVar(lpv:TPasVariable; lindent:integer; NoLF:boolean);//BUG string[] pparser: 482
+ var i,j:integer;
+ //lppt:TPasProcedureType;
+ //lpa:TPasArgument;
+ //lpat:TPasArrayType;
+ s,s1:string;
+ prct:TPasRecordType;
+
+ begin
+ if not Assigned(lpv) then exit;
+ s:=GetIndent(lindent);
+ write(s,lpv.Name);//,' ',lpv.value,' ',lpv.Modifiers,' ',lpv.AbsoluteLocation);
+ if assigned(lpv.VarType) then
+ begin
+ //if TPasType(lpa.ArgType).ElementTypeName <>'unresolved type reference' then
+ //,TPasType(lpa.ArgType).Name,' ');//,TPasType(lpa.ArgType).FullName,TPasType(lpa.ArgType).ElementTypeName)
+ // PParser 2099: ArgType := nil; if IsUntyped then => Arg.ArgType := ArgType;
+ // else write(':? ');
+ write(': ');
+ if lpv.VarType is TPasArrayType then
+ begin
+ GetTPasArrayType(TPasArrayType(lpv.VarType));
+ end
+ else if lpv.VarType is TPasSetType then
+ begin
+ write('set of ',TPasSetType(lpv.VarType).EnumType.Name);
+ end
+ else
+ begin
+ if lpv.VarType is TPasPointerType then
+ write('^',TPasPointerType(lpv.VarType).DestType.Name)
+ else if lpv.VarType is TPasRecordType then //var record
+ begin
+ j:=lindent+Length(lpv.Name)+4;
+ s1:=GetIndent(j);
+ prct:=TPasRecordType(lpv.VarType);
+ if prct.IsBitPacked then write('bitpacked ');
+ if prct.IsPacked then write('packed ');
+ writeln('Record');
+ for i:=0 to prct.Members.Count-1 do
+ begin
+ GetTPasVar(TPasVariable(prct.Members[i]),j+1,false);
+ end;
+ write(s1,'end');
+ end
+ else
+ begin
+ write(TPasType(lpv.VarType).Name);
+ //if TPasType(lpv.VarType) is TPasAliasType then write(TPasAliasType(lpv.VarType).Name);
+ end;
+ end;
+ end;
+ if lpv.Value <> '' then write('=',lpv.Value);
+ if assigned(lpv.Expr) then // var ?, const AnArrayConst : Array[1..3] of Integer = (1,2,3);
+ begin
+ write('=');
+ GetTPasExpr(lpv.Expr);
+ end;
+
+ if lpv.Modifiers <>'' then //Modifiers starts with ;
+ begin
+ write(' ',lpv.Modifiers,';');
+ if GetTPasMemberHints(lpv.Hints) then write(';');
+ end
+ else
begin
- // remember to put the whole cmdline in quotes, and
- // to always add some path options. Even if only -Fu. -Fi.
- writeln('usage: test_parser <commandline>');
- halt;
+ GetTPasMemberHints(lpv.Hints);
+ write(';');
end;
- cmdl:=paramstr(1);
- if paramcount>1 then
- for i:=2 to paramcount do
- cmdl:=cmdl+' '+paramstr(i);
+ if not NoLF then writeln;
+ end;
+
+//write out a list of variables only
+//more compact than the output of seperate calls of GetTPasVar
+procedure GetPasVariables(vl:TList; lindent:integer; NoLF,NoSEM:boolean);
+ var v,i,j:integer;
+ s,s1:string;
+ prct:TPasRecordType;
+ lpv:TPasVariable;
+
+ same:boolean;
+ samestr,tmpstr:Ansistring;
+ samevar:array of integer;
+ svi:integer;
+
+ begin
+ if vl.Count <= 0 then exit;
+ s:=GetIndent(lindent);
+ //> compare all variable types as string to find the ones with same type
+ samestr:='';
+ svi:=0;
+ SetLength(samevar,vl.count);
+ for v:=0 to vl.count-1 do
+ begin
+ tmpstr:='';
+ same:=true;
+ lpv:=TPasVariable(vl[v]);
+ //write(s,lpv.Name);
+ if assigned(lpv.VarType) then
+ begin
+ tmpstr:=tmpstr+': ';
+ if lpv.VarType is TPasArrayType then
+ begin
+ //GetTPasArrayType(TPasArrayType(lpv.VarType));
+ tmpstr:=tmpstr+'array'+TPasArrayType(lpv.VarType).IndexRange;
+ if assigned(TPasArrayType(lpv.VarType).ElType) then
+ tmpstr:=tmpstr+TPasArrayType(lpv.VarType).ElType.Name;
+ end
+ else if lpv.VarType is TPasSetType then
+ begin
+ tmpstr:=tmpstr+'set of '+TPasSetType(lpv.VarType).EnumType.Name;
+ end
+ else
+ begin
+ if lpv.VarType is TPasPointerType then
+ tmpstr:=tmpstr+'^'+TPasPointerType(lpv.VarType).DestType.Name
+ else if lpv.VarType is TPasRecordType then //var record
+ begin
+ prct:=TPasRecordType(lpv.VarType);
+ if prct.IsBitPacked then tmpstr:=tmpstr+'bitpacked ';
+ if prct.IsPacked then tmpstr:=tmpstr+'packed ';
+ tmpstr:=tmpstr+'Record ';
+ for i:=0 to prct.Members.Count-1 do
+ begin
+ //todo
+ //GetTPasVar(TPasVariable(prct.Members[i]),j+1,false);
+ end;
+ tmpstr:=tmpstr+'end';
+ end
+ else
+ begin
+ tmpstr:=tmpstr+TPasType(lpv.VarType).Name;
+ end;
+ end;
+ end
+ else same:=false;
+ if lpv.Value <> '' then same:=false;//=
+ if assigned(lpv.Expr) then // var ?, const AnArrayConst : Array[1..3] of Integer = (1,2,3);
+ begin
+ same:=false;//=
+ end;
+ if lpv.Modifiers <>'' then //Modifiers starts with ;
+ begin
+ tmpstr:=tmpstr+' '+lpv.Modifiers+';';
+ tmpstr:=tmpstr+ReturnTPasMemberHints(lpv.Hints);
+ end
+ else
+ begin
+ tmpstr:=tmpstr+ReturnTPasMemberHints(lpv.Hints);
+ end;
+ //if v = 0 then begin samestr:=tmpstr; end;
+ if (not same)or(samestr <> tmpstr) then
+ begin
+ samestr:=tmpstr;
+ inc(svi);
+ end;
+ samevar[v]:=svi;
+ end;
+ //compare <
+ //now print them
+ svi:=-1;
+ for v:=0 to vl.count-1 do
+ begin
+ lpv:=TPasVariable(vl[v]);
+ if not Assigned(lpv) then continue;
+ if svi <> samevar[v] then
+ begin
+ svi:=samevar[v];
+ if v>0 then writeln;
+ write(s,lpv.Name);//variblenname
+ end
+ else write(lpv.Name);
+ if (v < vl.Count-1)and(samevar[v+1]=svi) then write(',')
+ else
+ begin
+ if assigned(lpv.VarType) then
+ begin
+ write(': ');
+ if lpv.VarType is TPasArrayType then
+ begin
+ GetTPasArrayType(TPasArrayType(lpv.VarType));
+ end
+ else if lpv.VarType is TPasSetType then
+ begin
+ write('set of ',TPasSetType(lpv.VarType).EnumType.Name);
+ end
+ else
+ begin
+ if lpv.VarType is TPasPointerType then
+ write('^',TPasPointerType(lpv.VarType).DestType.Name)
+ else if lpv.VarType is TPasRecordType then //var record
+ begin
+ j:=lindent+Length(lpv.Name)+4;
+ s1:=GetIndent(j);
+ prct:=TPasRecordType(lpv.VarType);
+ if prct.IsBitPacked then write('bitpacked ');
+ if prct.IsPacked then write('packed ');
+ writeln('Record');
+ {for i:=0 to prct.Members.Count-1 do
+ begin
+ GetTPasVar(TPasVariable(prct.Members[i]),j+1,false);
+ end;}
+ if prct.Members.Count > 0 then
+ GetPasVariables(prct.Members,j+1,false,false);
+ write(s1,'end');
+ end
+ else
+ begin
+ write(TPasType(lpv.VarType).Name);
+ end;
+ end;
+ end;
+ if lpv.Value <> '' then write('=',lpv.Value);
+ if assigned(lpv.Expr) then // var ?, const AnArrayConst : Array[1..3] of Integer = (1,2,3);
+ begin
+ write('=');
+ GetTPasExpr(lpv.Expr);
+ end;
+
+ if lpv.Modifiers <>'' then //Modifiers starts with ;
+ begin
+ write(' ',lpv.Modifiers,';');
+ if GetTPasMemberHints(lpv.Hints) then write(';');
+ end
+ else
+ begin
+ GetTPasMemberHints(lpv.Hints);
+ if (v < vl.Count-1) then write(';')
+ else if (not NoSEM) then write(';');
+ end;
+ //if not NoLF then writeln;
+ end;
+ end;
+ if not NoLF then writeln;
+ end;
+
+
+procedure GetTypes(pe:TPasElement; lindent:integer);
+ var i,j,k:integer;
+ s,s1,s2:string;
+ pet:TPasEnumType;
+ pev:TPasEnumValue;
+
+ prt:TPasRangeType;
+ prct:TPasRecordType;
+ pv:TPasVariant;
+ pst:TPasSetType;
+
+
+ function GetVariantRecord(pe:TPasElement; lindent:integer):boolean;
+ var i,j,k:integer;
+ prct:TPasRecordType;
+ pv:TPasVariant;
+ s,s1:string;
+
+ begin
+ Result:=false;
+ j:=lindent+Length(pe.Name)+2;
+ s:=GetIndent(lindent);
+ s1:=GetIndent(lindent+2);
+ prct:=TPasRecordType(pe);
+ {Now i use GetPasVariables for more compact output
+ for i:=0 to prct.Members.Count-1 do
+ begin
+ GetTPasVar(TPasVariable(prct.Members[i]),1,true);
+ end;}
+ if prct.Members.Count > 0 then GetPasVariables(prct.Members,1,true,true);
+ if assigned(prct.Variants) then
+ begin
+ Result:=true;
+ writeln(';');
+ write(s,'case ');
+ if prct.VariantName <>'' then write(prct.VariantName,'=');
+ write(TPasType(prct.VariantType).Name);
+ writeln(' of');
+ if assigned(prct.Variants)then
+ if prct.Variants.Count >0 then
+ begin
+ for i:=0 to prct.Variants.Count-1 do
+ begin
+ pv:=TPasVariant(prct.Variants[i]);
+ write(s1,pv.Name);
+ for k:=0 to pv.Values.Count-1 do write(pv.Values[k]);
+ write(': (');
+ if GetVariantRecord(TPasElement(pv.Members),j+1) then
+ writeln(s1,');')
+ else writeln(');');
+ end;
+ end;
+ end;
+ end;
+
+ begin
+ s:=GetIndent(lindent);
+ write(s,pe.Name,'=');
+ if pe is TPasArrayType then
+ begin
+ GetTPasArrayType(TPasArrayType(pe));
+ writeln(';');
+ end
+ else if pe is TPasEnumType then
+ begin
+ pet:=TPasEnumType(pe);
+ write('(');
+ if pet.Values.Count > 0 then
+ begin
+ for j:=0 to pet.Values.Count-2 do
+ begin
+ pev:=TPasEnumValue(pet.Values[j]);
+ write(pev.name,',');
+ //pev.Value ?
+ //pev.AssignedValue ?
+ //pev.IsValueUsed ?
+ end;
+ pev:=TPasEnumValue(pet.Values[pet.Values.Count-1]);
+ write(pev.name);
+ end;
+ writeln(');');
+ end
+ else if pe is TPasFileType then
+ begin
+ writeln('file of ',TPasFileType(pe).ElType.Name,';');
+ end
+ else if pe is TPasProcedureType then
+ begin
+ writeln('procedure');
+ end
+ else if pe is TPasPointerType then
+ begin
+ //writeln('pointer');
+ writeln('^',TPasPointerType(pe).DestType.Name,';');
+ end
+ else if pe is TPasRangeType then
+ begin
+ prt:=TPasRangeType(pe);
+ writeln(prt.RangeStart,'..',prt.RangeEnd,';');
+ end
+ else if pe is TPasRecordType then
+ begin
+ j:=lindent+Length(pe.Name)+2;
+ s1:=GetIndent(j);
+ s2:=GetIndent(j+1);
+ prct:=TPasRecordType(pe);
+ if prct.IsBitPacked then write('bitpacket ');
+ if prct.IsPacked then write('packet');
+ writeln('record');
+ {Now i use GetPasVariables for more compact output
+ for i:=0 to prct.Members.Count-1 do
+ begin
+ GetTPasVar(TPasVariable(prct.Members[i]),j+1,false);
+ end;}
+ GetPasVariables(prct.Members,j+2,false,false);
+ if assigned(prct.Variants) then
+ begin
+ write(s1,'case ');
+ if prct.VariantName <>'' then write(prct.VariantName,'=');
+ write(TPasType(prct.VariantType).Name);
+ writeln(' of');
+ if assigned(prct.Variants)then
+ if prct.Variants.Count >0 then
+ begin
+ for i:=0 to prct.Variants.Count-1 do
+ begin
+ pv:=TPasVariant(prct.Variants[i]);
+ write(s2,pv.Name);
+ for k:=0 to pv.Values.Count-1 do write(pv.Values[k]);
+ write(': (');
+ if GetVariantRecord(TPasElement(pv.Members),j+2) then
+ writeln(s2,');')
+ else writeln(');');
+ end;
+ end;
+ end;
+ writeln(s1,'end;');
+ end
+ else if pe is TPasSetType then
+ begin
+ pst:=TPasSetType(pe);
+ writeln('set of ',pst.EnumType.Name,';');
+ end
+ else if pe is TPasClassOfType then writeln('Class of ',TPasClassOfType(pe).DestType.Name,';')
+ else
+ begin
+
+ writeln('{ Unknown TYPE(s): ');
+ writeln(s,pe.Name);
+ writeln('}');
+ writeln;
+ end;
+ end;
+
+
+ function GetTPasArgumentAccess(acc:TArgumentAccess):String;
+ begin
+ Result:='';
+ case acc of
+ //argDefault:Result:='default'; //normal proccall is default
+ argConst:Result:='const';
+ argVar:Result:='var';
+ argOut:Result:='out';
+ end;
+ end;
+
+ procedure GetTCallingConvention(cc:TCallingConvention); //TODO: test it
+ begin
+ case cc of
+ //ccDefault:write(' default;'); //normal proccall is default
+ ccRegister:WriteFmt(true,'Register;',false);
+ ccPascal :WriteFmt(true,'Pascal;',false);
+ ccCDecl :WriteFmt(true,'CDecl;',false);
+ ccStdCall :WriteFmt(true,'StdCall;',false);
+ ccOldFPCCall:WriteFmt(true,'OldFPCall;',false);
+ ccSafeCall:WriteFmt(true,'SaveCall;',false);
+ end;
+ end;
+
+ procedure GetHiddenModifiers(Mfs:TProcedureModifiers);
+ begin
+ if pmInline in Mfs then WriteFmt(true,'inline;',false);
+ if pmAssembler in Mfs then WriteFmt(true,'assembler;',false);
+ if pmVarargs in Mfs then WriteFmt(true,'varargs;',false);
+ if pmCompilerProc in Mfs then WriteFmt(true,'compilerproc;',false);
+ if pmExtdecl in Mfs then WriteFmt(true,'extdecl;',false);
+ end;
+
+ procedure GetTPasProcedure(lpp:TPasProcedure; indent:integer);
+ var l:integer;
+ lppt:TPasProcedureType;
+ lpa:TPasArgument;
+ s:String;
+
+ same:boolean;
+ samevar:array of integer;//same index same type
+ aktaa:TArgumentAccess;
+ aktname,tmpname:String;
+ svi:integer;
+
+ begin
+ if not Assigned(lpp) then exit;
+ s:=GetIndent(indent);
+ if lpp is TPasConstructor then write(s,'Constructor ')
+ else if TPasElement(lpp) is TPasConstructorImpl then write(s,'Constructor ')
+ else if lpp is TPasDestructor then write(s,'Destructor ')
+ else if TPasElement(lpp) is TPasDestructorImpl then write(s,'Destructor ')
+ else if lpp is TPasClassProcedure then write(s,'Class Procedure ') //pparser.pp: 3221
+ else if lpp is TPasClassFunction then write(s,'Class Function ')
+ else if lpp is TPasFunction then write(s,'Function ')
+ else write(s,'Procedure ');
+ write(lpp.Name);//,' ',lpp.TypeName);
+ if assigned(lpp.ProcType) then
+ begin
+ lppt:=lpp.ProcType;
+ if assigned(lppt.Args) and (lppt.Args.Count > 0) then
+ begin
+ write('(');
+ if lppt.Args.Count > 0 then
+ begin
+ //produce more compact output than the commented block below
+ //>find same declaration
+ //look ahead what is the same
+ SetLength(samevar,lppt.Args.Count);
+ svi:=0;
+ aktname:='';
+ for l:=0 to lppt.Args.Count-1 do
+ begin
+ same:=true;
+ tmpname:='';
+ lpa:=TPasArgument(lppt.Args.Items[l]);
+ if assigned(lpa.ArgType) then
+ begin
+ if lpa.ArgType is TPasArrayType then
+ begin
+ if assigned(TPasArrayType(lpa.ArgType).ElType) then tmpname:=TPasArrayType(lpa.ArgType).ElType.Name;
+ end
+ else tmpname:=TPasType(lpa.ArgType).Name;
+ end;
+ if l=0 then begin aktaa:=lpa.Access; aktname:=tmpname; end;
+ if lpa.Access <> aktaa then begin same:=false; aktaa:=lpa.Access; end;//access type
+ if (tmpname = '')or(tmpname <> aktname) then begin same:=false; aktname:=tmpname; end;//type name
+ if lpa.Value <> '' then same:=false;//var=value
+ if not same then inc(svi);
+ samevar[l]:=svi;
+ end;
+ //find same declaration<
+ svi:=-1;
+ same:=false;
+ for l:=0 to lppt.Args.Count-1 do
+ begin
+ lpa:=TPasArgument(lppt.Args.Items[l]);
+ if svi <> samevar[l] then
+ begin
+ svi:=samevar[l];
+ if lpa.Access <> argDefault then write(GetTPasArgumentAccess(lpa.Access),' ');
+ write(lpa.Name);//variblenname
+ end
+ else write(lpa.Name);
+ if (l < lppt.Args.Count-1)and(samevar[l+1]=svi) then write(',')
+ else
+ begin
+ if assigned(lpa.ArgType) then
+ begin
+ write(': ');
+ if lpa.ArgType is TPasArrayType then
+ GetTPasArrayType(TPasArrayType(lpa.ArgType))
+ else write(TPasType(lpa.ArgType).Name);
+ end;
+ if lpa.Value <> '' then write('=',lpa.Value);
+ if l< lppt.Args.Count-1 then write('; ');
+ end;
+ end;
+ {//simple version duplicates declarations of same type
+ for l:=0 to lppt.Args.Count-1 do
+ begin
+ lpa:=TPasArgument(lppt.Args.Items[l]);
+ if lpa.Access <> argDefault then write(GetTPasArgumentAccess(lpa.Access),' ');
+ write(lpa.Name);//variblenname
+ if assigned(lpa.ArgType) then
+ begin
+ //if TPasType(lpa.ArgType).ElementTypeName <>'unresolved type reference' then
+ //,TPasType(lpa.ArgType).Name,' ');
+ //,TPasType(lpa.ArgType).FullName,TPasType(lpa.ArgType).ElementTypeName)
+ // PParser 2099: ArgType := nil; if IsUntyped then => Arg.ArgType := ArgType;
+ // else write(':? ');
+ write(': ');
+ if lpa.ArgType is TPasArrayType then
+ begin
+ GetTPasArrayType(TPasArrayType(lpa.ArgType));
+ end
+ else write(TPasType(lpa.ArgType).Name);
+ end;
+ if lpa.Value <> '' then write('=',lpa.Value);
+ if l< lppt.Args.Count-1 then write('; ');
+ end;}
+ end;
+ write(')');
+ end;
+ if lppt.IsOfObject then write(' of Object');
+ if (TPasElement(lpp) is TPasFunction)or(TPasElement(lpp) is TPasClassFunction) then
+ write(': ',TPasFunctionType(lpp.ProcType).ResultEl.ResultType.Name);
+ end;
+ //writeln(';');
+ WriteFmt(false,'',true);
+ if lpp.IsVirtual then WriteFmt(true,'virtual;',false);
+ if lpp.IsOverload then WriteFmt(true,'overload;',false);
+ if lpp.IsAbstract then WriteFmt(true,'abstract;',false);
+ if lpp.IsDynamic then WriteFmt(true,'dynamic;',false);
+ if lpp.IsOverride then WriteFmt(true,'override;',false);
+ if lpp.IsExported then WriteFmt(true,'exported;',false);
+ if lpp.IsExternal then WriteFmt(true,'external;',false);
+ //pparser 2360: everyting behind external is ignored !!!
+ if lpp.IsMessage then
+ begin
+ write('message ');
+ if lpp.MessageType = pmtString then writeln(false,lpp.MessageName,true)
+ else WriteFmt(false,lpp.MessageName,true);//pmtInteger
+ end;
+ if lpp.IsReintroduced then WriteFmt(true,'reintroduce;',false);
+ if lpp.IsStatic then WriteFmt(true,'static;',false);
+ if lpp.IsForward then WriteFmt(true,'forward;',false);
+ GetHiddenModifiers(lpp.Modifiers);
+ GetTCallingConvention(lpp.CallingConvention);
+ if GetTPasMemberHints(TPasElement(lpp).Hints) then WriteFmt(false,'',true); //BUG ? missing hints
+ if not Unformated then writeln;
+ end;
+
+ procedure GetTPasProcedureBody(pb:TProcedureBody; indent:integer);
+ var j:integer;
+ pd:TPasDeclarations;
+ pib:TPasImplBlock;
+ begin
+ if assigned(pb) then
+ begin
+ if assigned(pb.Body)then
+ begin
+ if assigned(TPasDeclarations(pb).Functions)then
+ begin
+ pd:=TPasDeclarations(pb);
+ if isim then
+ begin
+ //writeln;
+ GetDecls(pd,indent+1); //~recursion
+ //PrintDecls(pd,indent+1); //~recursion
+ end
+ else
+ if pd.Functions.Count >0 then //sub-functions
+ begin
+ for j:=0 to pd.Functions.Count-1 do
+ GetTPasProcedure(TPasProcedure(pd.Functions[j]),indent+1);
+ end;
+ end;
+ pib:=TPasImplBlock(pb.Body);
+ if assigned(pib) then
+ begin
+ GetTPasImplBlock(pib,indent,0,false,false); //indent depend on sub function level
+ if not Unformated then writeln; //('//block');
+ end;
+ end;
+ end;
+ end;
+
+ procedure GetTpasOverloadedProc(pop:TPasOverloadedProc; indent:integer);
+ var pp:TPasProcedure;
+ j:integer;
+ begin
+ if assigned(pop) then
+ begin
+ if pop.Overloads.Count >0 then
+ begin
+ for j:=0 to pop.Overloads.Count-1 do
+ begin
+ pp:=TPasProcedure(pop.Overloads[j]);
+ GetTPasProcedure(pp,indent);
+ GetTPasProcedureBody(pp.Body,indent);
+ end;
+ end;
+ end;
+ end;
+
+ function GetVisibility(v:TPasMemberVisibility):String;
+ begin
+ Result:='';
+ case v of
+ //visDefault:Result:='default';
+ visPrivate:Result:='private';
+ visProtected:Result:='protected';
+ visPublic:Result:='public';
+ visPublished:Result:='published';
+ visAutomated:Result:='automated';
+ visStrictPrivate:Result:='strictprivate';
+ visStrictProtected:Result:='strictprotected';
+ end;
+ end;
+
+ procedure GetTPasClass(pc:TPasClassType; indent:integer);
+ var j,l:integer;
+ s,s1,s2:String;
+ lpe:TPasElement;
+ lpp:TPasProperty;
+ lpa:TPasArgument;
+ vis:TPasMemberVisibility;
+ vars:TList;
+ IsVar:boolean;
+
+ procedure PrintVars;
+ begin
+ if vars.Count > 0 then GetPasVariables(vars,indent+1,false,false);
+ IsVar:=False;
+ vars.Clear;
+ end;
+
+ begin
+ if assigned(pc) then
+ begin
+ s:=GetIndent(indent);
+ write(s,pc.Name,'=');
+ if pc.IsPacked then write('packed ');
+ case pc.ObjKind of
+ okObject:write('Object');
+ okClass:write('Class');
+ okInterface:write('Interface');
+ end;
+ if assigned(pc.AncestorType) and (pc.AncestorType.ElementTypeName <> '') then
+ write('(',pc.AncestorType.Name,')');
+
+ if pc.IsForward or pc.IsShortDefinition then //pparser.pp: 3417 :class(anchestor); is allowed !
+ begin
+ writeln(';');
+ exit;
+ end;
+ //Members: TList;
+ //InterfaceGUID: String;
+ //ClassVars: TList; //is this always empty ?
+ //Modifiers: TStringList;
+ //Interfaces: TList;
+ s1:=GetIndent(indent+1);
+ s2:=GetIndent(indent+2);
+ if pc.Members.Count > 0 then
+ begin
+ writeln;
+ vars:=TList.Create;
+ IsVar:=false;
+ for j:=0 to pc.Members.Count-1 do
+ begin
+ lpe:=TPasElement(pc.Members[j]);
+
+ //Class visibility, written on change
+ if j=0 then
+ begin
+ vis:=lpe.Visibility;
+ if GetVisibility(vis) <> '' then writeln(s1,GetVisibility(vis));
+ end
+ else
+ if vis <> lpe.Visibility then
+ begin
+ if IsVar then PrintVars;
+ if lpe.Visibility <> visDefault then //Class Function = visDefault
+ begin
+ vis:=lpe.Visibility;
+ if GetVisibility(vis) <> '' then writeln(s1,GetVisibility(vis));
+ end;
+ end;
+
+ if lpe is TPasOverloadedProc then
+ begin
+ if IsVar then PrintVars;
+ GetTPasOverloadedProc(TPasOverloadedProc(lpe),indent+2);
+ end
+ else if lpe is TPasProcedure then //TPasClassProcedure and
+ begin //TPasClassFunction are both child of TPasProcedure
+ if IsVar then PrintVars;
+ GetTPasProcedure(TPasProcedure(lpe),indent+2);
+ end
+ else if lpe is TPasProperty then
+ begin
+ if IsVar then PrintVars;
+ lpp:=TPasProperty(lpe);
+ write(s2,'property ',lpp.Name);
+ if lpp.Args.Count >0 then
+ begin
+ for l:=0 to lpp.Args.Count-1 do
+ begin
+ lpa:=TPasArgument(lpp.Args.Items[l]);
+ if GetTPasArgumentAccess(lpa.Access) <> '' then
+ write('[',GetTPasArgumentAccess(lpa.Access),' ',lpa.Name)
+ else write('[',lpa.Name); //variblename
+ if assigned(lpa.ArgType) then
+ begin
+ //if TPasType(lpa.ArgType).ElementTypeName <>'unresolved type reference' then
+ //,TPasType(lpa.ArgType).Name,' ');
+ //,TPasType(lpa.ArgType).FullName,TPasType(lpa.ArgType).ElementTypeName)
+ // PParser 2099: ArgType := nil; if IsUntyped then => Arg.ArgType := ArgType;
+ // else write(':? ');
+ write(': ');
+ if lpa.ArgType is TPasArrayType then
+ begin
+ GetTPasArrayType(TPasArrayType(lpa.ArgType));
+ end
+ else write(TPasType(lpa.ArgType).Name);
+ end;
+ if lpa.Value <> '' then write('=',lpa.Value);
+ write(']');
+ end;
+ end;//args
+ if assigned(lpp.VarType) then
+ begin
+ write(': ',TPasType(lpp.VarType).Name);
+ end;
+ if lpp.IndexValue <> '' then write(' Index ',lpp.IndexValue);
+ if lpp.ReadAccessorName <> '' then write(' Read ',lpp.ReadAccessorName);
+ if lpp.WriteAccessorName <> '' then write(' Write ',lpp.WriteAccessorName);
+ if lpp.ImplementsName <> '' then write(' Implements ',lpp.ImplementsName);
+ if lpp.IsDefault then write(' Default ',lpp.DefaultValue);
+ if lpp.IsNodefault then write(' NoDefault');
+ if lpp.StoredAccessorName <> '' then write(' Stored ',lpp.StoredAccessorName);
+ GetTPasMemberHints(lpp.Hints);
+ writeln(';');
+ end
+ else if lpe is TPasVariable then
+ begin
+ //this is done with printvars
+ //GetTPasVar(TPasVariable(lpe),indent+1,false);
+ IsVar:=true;
+ vars.add(lpe);
+ end
+ else
+ begin
+ if IsVar then PrintVars;
+ writeln('{ Unknown Declaration(s) in Class/Object/Interface: ');
+ writeln(s,lpe.Name);
+ writeln('}');
+ end;
+ end;
+ //writeln(s,'end;');//'//class');
+ if IsVar then PrintVars;
+ vars.free;
+ end
+ else writeln;//(';'); //x=class(y);
+ writeln(s,'end;');
+ end;
+ end;
+
+
+procedure GetDecls(Decl:TPasDeclarations; indent:integer);
+ var i,j:integer;
+ pe:TPasElement;
+ pp:TPasProcedure;
+ ps:TPasSection;
+ s:string;
+ x:(None,ResStrings,Types,Consts,Classes,Functions,Variables,Properties);
+ l:TList;
+
+ procedure PrintVars;
+ begin
+ if l.Count > 0 then GetPasVariables(l,indent+1,false,false);
+ end;
+
+begin
+ s:=GetIndent(indent);
+ x:=None;
+ if assigned(Decl)then
+ begin
+ l:=TList.Create;
+ pe:=TPasElement(Decl);
+ if pe is TPasSection then
+ begin
+ {(Decl is TInterfaceSection)or(Decl is TImplementationSection) or
+ (Decl is TProgramSection}
+ ps:=TPasSection(pe);
+ if ps.UsesList.Count >0 then
+ begin
+ write(s,'uses ');
+ ps:=TPasSection(Decl);
+ if not Unformated then begin writeln; write(s,' '); end;
+ for i:=0 to ps.UsesList.Count-2 do
+ if UpCase(TPasElement(ps.UsesList[i]).Name) = 'SYSTEM' then continue //do not print system
+ else write(TPasElement(ps.UsesList[i]).Name,','); //as it is added by parser
+ writeln(TPasElement(ps.UsesList[ps.UsesList.Count-1]).Name,';');
+ if not Unformated then writeln;
+ end;
+ end;
+ if assigned(Decl.Declarations)and(Decl.Declarations.Count > 0) then
+ for j:=0 to Decl.Declarations.Count-1 do
+ begin
+ pe:=TPasElement(Decl.Declarations[j]);
+ if pe is TPasResString then
+ begin
+ if x = Variables then PrintVars;
+ if x <> ResStrings then
+ begin
+ if not Unformated then writeln;
+ writeln(s,'ResourceString');
+ x:=ResStrings;
+ end;
+ writeln(s,pe.Name,'=',DelQuot(TPasResString(pe).Value),';'); //too much '''
+ end
+ else if pe is TPasConst then
+ begin
+ if x = Variables then PrintVars;
+ if x <> Consts then
+ begin
+ if not Unformated then writeln;
+ writeln(s,'const');
+ x:=Consts;
+ end;
+ GetTPasVar(TPasVariable(pe),indent+1,false);
+ end
+ else if pe is TPasVariable then
+ begin
+ if x <> Variables then
+ begin
+ if not Unformated then writeln;
+ writeln(s,'var');
+ x:=Variables;
+ l.Clear;
+ end;
+ l.Add(pe);
+ //this is done with printvars
+ //GetTPasVar(TPasVariable(pe),indent+1,false);
+ end
+ else if pe is TPasClassType then
+ begin
+ if x = Variables then PrintVars;
+ if x <> Types then
+ begin
+ if not Unformated then writeln;
+ writeln(s,'Type');
+ x:=Types;
+ end;
+ GetTPasClass(TPasClassType(pe),indent+1);
+ end
+ else if pe is TPasType then
+ begin
+ if x = Variables then PrintVars;
+ if x <> Types then
+ begin
+ if not Unformated then writeln;
+ writeln(s,'Type');
+ x:=Types;
+ end;
+ GetTypes(TPasElement(pe),indent+1);
+ end
+ else if pe is TPasProcedureBase then
+ begin
+ if x = Variables then PrintVars;
+ if (x <> Functions)and not Unformated then writeln;
+ x:=Functions;
+ if pe is TPasOverloadedProc then
+ begin
+ GetTpasOverloadedProc(TPasOverloadedProc(pe),indent);
+ end
+ else
+ begin
+ pp:=TPasProcedure(pe);
+ GetTPasProcedure(pp,indent);
+ GetTPasProcedureBody(pp.Body,indent);
+ end;
+ end
+ else
+ begin
+ if x = Variables then PrintVars;
+ x:=None;
+ writeln('{ Unknown Declaration: ',pe.Name,' }');
+ end;
+ end;
+ if x = Variables then PrintVars;
+ l.Free;
+ end;
+end;
+
+{replaced by GetDecls
+ this does the same but not in true order
+
+procedure PrintDecls(Decl:TPasDeclarations; indent:integer);
+ var i:integer;
+ pe:TPasElement;
+ pp:TPasProcedure;
+ ps:TPasSection;
+ s:string;
+ istype:boolean;
+
+begin
+ istype:=false;
+ s:=GetIndent(indent);
+ if (Decl is TInterfaceSection)or(Decl is TImplementationSection) or
+ (Decl is TProgramSection) then
+ if TPasSection(Decl).UsesList.Count >0 then
+ begin
+ write(s,'uses ');
+ ps:=TPasSection(Decl);
+ if not Unformated then begin writeln; write(s,' '); end;
+ for i:=0 to ps.UsesList.Count-2 do
+ if UpCase(TPasElement(ps.UsesList[i]).Name) = 'SYSTEM' then continue //do not print system
+ else write(TPasElement(ps.UsesList[i]).Name,','); //as it is added by parser
+ writeln(TPasElement(ps.UsesList[ps.UsesList.Count-1]).Name,';');
+ if not Unformated then writeln;
+ end;
+
+ if assigned(Decl.ResStrings) then
+ if Decl.ResStrings.Count >0 then
+ begin
+ writeln('ResourceString');
+ for i := 0 to Decl.ResStrings.Count - 1 do
+ begin
+ pe:=TPasElement(Decl.ResStrings[i]);
+ writeln(s,pe.Name,'=',DelQuot(TPasResString(pe).Value),';'); //too much '''
+ end;
+ if not Unformated then writeln;
+ end;
+
+ if assigned(Decl.Consts)then
+ if Decl.Consts.Count >0 then
+ begin
+ writeln(s,'const');
+ for i:=0 to Decl.Consts.Count-1 do GetTPasVar(TPasVariable(Decl.Consts[i]),indent+1,false);
+ if not Unformated then writeln;
+ end;
+
+ if assigned(Decl.Types) then
+ if Decl.Types.Count >0 then
+ begin
+ writeln(s,'Type');
+ for i := 0 to Decl.Types.Count - 1 do
+ begin
+ GetTypes(TPasElement(Decl.Types[i]),indent+1);
+ end;
+ if not Unformated then writeln;
+ istype:=true;
+ end;
+
+ if assigned(Decl.Classes) then
+ if Decl.Classes.Count >0 then
+ begin
+ if not istype then writeln('Type');
+ for i := 0 to Decl.Classes.Count - 1 do
+ begin
+ pe:=TPasElement(Decl.Classes[i]);
+ GetTPasClass(TPasClassType(pe),indent+1);
+ if not Unformated then writeln;
+ end;
+ end;
+
+ if assigned(Decl.Variables)then
+ if Decl.Variables.Count >0 then
+ begin
+ writeln(s,'var');
+ //Now i use GetPasVariables for more compact output
+ //for i:=0 to Decl.Variables.Count-1 do GetTPasVar(TPasVariable(Decl.Variables[i]),indent+1,false);
+ GetPasVariables(Decl.Variables,indent+1,false,false);
+ if not Unformated then writeln;
+ end;
+
+ if assigned(Decl.Functions) then
+ begin
+ for i := 0 to Decl.Functions.Count - 1 do
+ begin
+ pe:=TPasElement(Decl.Functions[i]);
+ if pe is TPasOverloadedProc then
+ begin
+ GetTpasOverloadedProc(TPasOverloadedProc(pe),indent);
+ end
+ else
+ begin
+ pp:=TPasProcedure(pe);
+ GetTPasProcedure(pp,indent);
+ GetTPasProcedureBody(pp.Body,indent);
+ end;
+ end;
+ end;
+end; }
+
+//# parameter
+
+ procedure PrintUsage;
+ begin
+ writeln('usage: test_parser1 <Options> <Commandline> File');
+ writeln;
+ writeln(' <Options> : Options for test_parser1');
+ writeln(' -u : Unformated output');
+ writeln(' -OS <os> : <os> = WINDOWS, LINUX (default), FREEBSD, NETBSD,');
+ writeln(' SUNOS, BEOS, QNX, GO32V2');
+ writeln(' -CPU <cpu> : <cpu> = i386 (default), x86_64');
+ writeln(' <Commandline> : is the commandline for the parser');
+ writeln(' -d<define> : <define> = Directive');
+ writeln(' -Fi<include_path> : <include_path> = ?');
+ writeln(' -I<include_path> : <include_path> = ?');
+ writeln(' -Sd : mode delphi');
+ writeln(' File : a pascal source file (Program or Unit)');
+ end;
+
+ procedure GetParam;
+ begin
+ if paramcount>0 then
+ begin
+ cmdl:='';
+ i:=1;
+ repeat
+ if paramstr(i) = '-h' then
+ begin
+ PrintUsage;
+ halt(0);
+ end
+ else if paramstr(i) = '-u' then Unformated:= true
+ else if paramstr(i) = '-OS' then
+ begin
+ if i < paramcount then
+ begin
+ inc(i);
+ TargetOS:=paramstr(i);
+ if (TargetOS = '')or(TargetOS[1] = '-') then halt(1);
+ end
+ else halt(1);
+ end
+ else if paramstr(i) = '-CPU' then
+ begin
+ if i < paramcount then
+ begin
+ inc(i);
+ TargetCPU:=paramstr(i);
+ if (TargetCPU = '')or(TargetCPU[1] = '-') then halt(1);
+ end
+ else halt(1);
+ end
+ else
+ cmdl:=cmdl+' '+paramstr(i);
+ inc(i);
+ until i > paramcount;
+ end;
+ if (Paramcount < 1)or(cmdl = '') then
+ begin
+ // remember to put the whole cmdline in quotes, and
+ // to always add some path options. Even if only -Fu. -Fi.
+ writeln('Error: No file for input given !');
+ PrintUsage;
+ halt(1);
+ end;
+ end;
+
+//# *** main ***
+
+begin
+ isim:=false;
+ Unformated:=false;//false to format output to be human readable
+ TargetOS:='linux';
+ TargetCPU:='i386';
+ GetParam;
+ //writeln(TargetOS,' ',TargetCPU,' ',cmdl);halt;
E := TSimpleEngine.Create;
try
try
- M := ParseSource(E, cmdl , 'linux', 'i386');
+ M := ParseSource(E, cmdl ,TargetOS ,TargetCPU);
except
on excep:EParserError do
begin
- writeln(excep.message,' line:',excep.row,' column:',excep.column,' file:',excep.filename);
+ writeln(excep.message,' line:',excep.row,' column:',excep.column,' file:',excep.filename);
raise;
+ end;
+ end;
+
+ if M is TPasProgram then
+ begin
+ writeln('Program ',M.Name,';');
+ if not Unformated then writeln;
+ if assigned(M.ImplementationSection) then
+ begin
+ isim:=true;
+ if not Unformated then writeln;
+ GetDecls(M.ImplementationSection as TPasDeclarations,0);
+ //PrintDecls(M.ImplementationSection as TPasDeclarations,0);
+ end;
+ if assigned(M.InitializationSection) then // MAIN BLOCK
+ begin
+ isim:=false;
+ if not Unformated then writeln;
+ writeln('begin');//writeln('begin {Begin MAIN Program}')
+ GetTPasImplBlock(M.InitializationSection as TPasImplBlock,1,0,false,false);
end;
- end;
- { Cool, we successfully parsed the unit.
- Now output some info about it. }
- Decls := M.InterfaceSection.Declarations;
- for I := 0 to Decls.Count - 1 do
- Writeln('Interface item ', I, ': ', (TObject(Decls[I]) as TPasElement).Name);
+ end
+ else
+ begin
+ { Cool, we successfully parsed the unit.
+ Now output some info about it. }
+ writeln('Unit ',M.Name,';');
+ if not Unformated then writeln;
+ Writeln('Interface');
+ if not Unformated then writeln;
+ GetDecls(M.InterfaceSection as TPasDeclarations,0);
+ //PrintDecls(M.InterfaceSection as TPasDeclarations,0);
- FreeAndNil(M);
- finally
- FreeAndNil(E)
+ if assigned(M.ImplementationSection) then
+ begin
+ isim:=true;
+ if not Unformated then writeln;
+ Writeln('Implementation');
+ if not Unformated then writeln;
+ GetDecls(M.ImplementationSection as TPasDeclarations,0);
+ //PrintDecls(M.ImplementationSection as TPasDeclarations,0);
+ if TPasElement(M.ImplementationSection) is TPasImplElement then writeln('{MAIN}');
+ end;
+ if assigned(M.InitializationSection) then //is this begin .. end. of a unit too ?
+ begin
+ isim:=true;
+ if not Unformated then writeln;
+ Writeln('Initialization');
+ if not Unformated then writeln;
+ GetTPasImplBlock(M.InitializationSection as TPasImplBlock,1,0,false,false);
+ if assigned(M.FinalizationSection) then
+ begin
+ isim:=true;
+ if not Unformated then writeln;
+ Writeln('Finalization');
+ if not Unformated then writeln;
+ GetTPasImplBlock(M.FinalizationSection as TPasImplBlock,1,0,false,false);
+ end;
+ end;
end;
+ if not Unformated then writeln('end.')
+ else
+ begin
+ writeln('end');
+ writeln('.');
+ end;
+ FreeAndNil(M);
+ finally
+ FreeAndNil(E);
+ end;
end.
diff --git a/packages/fcl-passrc/examples/testunit1.pp b/packages/fcl-passrc/examples/testunit1.pp
new file mode 100644
index 0000000000..263c8c7135
--- /dev/null
+++ b/packages/fcl-passrc/examples/testunit1.pp
@@ -0,0 +1,713 @@
+//This is only for testing the parser, it is not intended to be runable in a real
+//program but for checking the contructs to be parsed well.
+//All statements are written like testparser would print them out to diff the
+//result with this file again to show differences.
+//Based on /utils/fpdoc/testunit.pp
+{$mode objfpc}
+{$h+}
+unit testunit1;
+
+interface
+
+ uses
+ SysUtils,Classes;
+
+ const
+ AnIntegerConst=1;
+ AStringConst='Hello, World!';
+ AFLoatconst=1.23;
+ ABooleanConst=True;
+ ATypedConst: Integer=3;
+ AnArrayConst: Array[1..3] of Integer=(1,2,3);
+ ARecordConst: TMethod=(Code:nil;Data:nil);
+ ASetConst=[true,false];
+ ADeprecatedConst=1 deprecated;
+
+ Type
+ TAnEnumType=(one,two,three);
+ TASetType=set of TAnEnumType;
+ TAnArrayType=Array[1..10] of Integer;
+ TASubRangeType=one..two;
+ TABooleanArrayType=Array[Boolean] of Integer;
+ TARecordType=record
+ X,Y: Integer;
+ Z: String;
+ end;
+ TAVariantRecordType=record
+ A: String;
+ Case Integer of
+ 1: (X,Y : Integer);
+ 2: (phi,Omega : Real);
+ end;
+ TAVariantRecordType2=record
+ A: String;
+ Case Atype : Integer of
+ 1 : (X,Y : Integer);
+ 2 : (phi,Omega : Real);
+ end;
+
+ MyRec = Record
+ X : Longint;
+ Case byte of
+ 2 : (Y : Longint;
+ case byte of
+ 3 : (Z : Longint);
+ );
+ end;
+
+// TADeprecatedType = Integer deprecated;
+
+ { TMyParentClass }
+
+ TMyParentClass=Class(TComponent)
+ Private
+ FI: Integer;
+ Function GetA(AIndex: Integer): String;
+ Function GetIP(AIndex: integer): String;
+ procedure SetA(AIndex: Integer; const AValue: String);
+ procedure SetIP(AIndex: integer; const AValue: String);
+ Procedure WriteI(AI: Integer);
+ Function ReadI: Integer;
+ Protected
+ Procedure AProtectedMethod;
+ Property AProtectedProp: Integer Read FI Write FI;
+ Public
+ Constructor Create(AOwner: TComponent); override;
+ Destructor Destroy; override;
+ Procedure AVirtualProc; virtual;
+ Procedure AnAbstractProc; virtual; abstract;
+ Procedure AMessageProc(var Msg);message 123;
+ Procedure AStringMessageProc(var Msg);message '123';
+ Procedure ADeprecatedProc; deprecated;
+ Procedure APlatformProc; Platform;
+ Property IntProp: Integer Read FI Write Fi;
+ Property IntROProp: Integer Read FI;
+ Property GetIntProp: Integer Read ReadI Write WriteI;
+ Property AnArrayProp[AIndex: Integer]: String Read GetA Write SetA;
+ Property AnIndexProp: String Index 1 Read GetIP Write SetIP;
+ Property AnIndexProp2: String Index 2 Read GetIP Write SetIP;
+ Published
+ Procedure SomePublishedMethod;
+ end;
+
+ { TMyChildClass }
+
+ TMyChildClass=Class(TMyParentClass)
+ Public
+ Procedure AVirtualProc; Override;
+ Procedure AnAbstractProc; Override;
+ Published
+ Property AProtectedProp;
+ end;
+
+ TPasFunctionType=Class(TPasProcedureType)
+ public
+ destructor Destroy; override;
+ Class Function TypeName: string; override;
+ Function ElementTypeName: string; override;
+ Function GetDeclaration(Full: boolean): string; override;
+ public
+ ResultEl: TPasResultElement;
+ end;
+
+ var
+ ASimpleVar: Integer;
+ ATypedVar: TMethod;
+ ARecordVar: Record
+ A,B: Integer;
+ end;
+ AnArrayVar: Array[1..10] of Integer;
+ ATypedArray: Array[TanEnumType] of Integer;
+ AInitVar: Integer=1;
+
+ ADeprecatedVar: Integer deprecated;
+ ACVarVar: Integer ; cvar;
+ AnExternalVar: Integer ;external name 'avar';
+ AnExternalLibVar: Integer ;external 'library' name 'avar';
+
+ Procedure SimpleProc;
+ Procedure OverloadedProc(A: Integer);
+ Procedure OverloadedProc(B: String);
+ Function SimpleFunc: Integer;
+ Function OverloadedFunc(A: Integer): Integer;
+ Function OverloadedFunc(B: String): Integer;
+
+ Procedure ConstArgProc(const A: Integer);
+ Procedure VarArgProc(var A: Integer);
+ Procedure OutArgProc(out A: Integer);
+ Procedure UntypedVarArgProc(var A);
+ Procedure UntypedConstArgProc(const A);
+ Procedure UntypedOutArgProc(out A);
+
+ Procedure ArrayArgProc(A: TAnArrayType);
+ Procedure OpenArrayArgProc(A: Array of string);
+ Procedure ConstArrayArgProc(A: Array of const);
+
+ Procedure externalproc; external;
+ Procedure externalnameProc; external name 'aname';
+ Procedure externallibnameProc; external 'alibrary' name 'aname';
+
+
+Implementation
+
+
+ Procedure SimpleProc;
+
+ procedure SubProc;
+ begin
+ s:= s+'a';
+ end;
+
+ begin
+ a:= 1;
+ c:= a+b;
+ for i:= 1 to 10 do
+ write(a);
+ end;
+
+ Procedure OverloadedProc(A: Integer);
+ begin
+ if i=1 then ;
+ end;
+
+ Procedure OverloadedProc(B: String);
+ begin
+ end;
+
+ Function SimpleFunc: Integer;
+ begin
+ end;
+
+ Function OverloadedFunc(A: Integer): Integer;
+ begin
+ end;
+
+ Function OverloadedFunc(B: String): Integer;
+ begin
+ end;
+
+ Procedure ArrayArgProc(A: TAnArrayType);
+ begin
+ end;
+
+ Procedure OpenArrayArgProc(A: Array of String);
+ begin
+ end;
+
+ Procedure ConstArrayArgProc(A: Array of const);
+ begin
+ end;
+
+ Procedure ConstArgProc(const A: Integer);
+ begin
+ end;
+
+ Procedure VarArgProc(var A: Integer);
+ begin
+ end;
+
+ Procedure OutArgProc(out A: Integer);
+ begin
+ end;
+
+ Procedure UntypedVarArgProc(var A);
+ begin
+ end;
+
+ Procedure UntypedConstArgProc(const A);
+ begin
+ end;
+
+ Procedure UntypedOutArgProc(out A);
+ begin
+ end;
+
+{ TMyChildClass }
+ procedure TMyChildClass.AVirtualProc;
+ begin
+ inherited AVirtualProc;
+ end;
+
+ procedure TMyChildClass.AnAbstractProc;
+ procedure SubCProc;
+ begin
+ sc:= sc+'ac';
+ end;
+
+ begin
+ // Cannot call ancestor
+ end;
+
+{ TMyParentClass }
+ procedure TMyParentClass.WriteI(AI: Integer);
+ begin
+ end;
+
+ Function TMyParentClass.GetA(AIndex: Integer): String;
+ begin
+ end;
+
+ Function TMyParentClass.GetIP(AIndex: integer): String;
+ begin
+ end;
+
+ procedure TMyParentClass.SetA(AIndex: Integer; const AValue: String);
+ begin
+ end;
+
+ procedure TMyParentClass.SetIP(AIndex: integer; const AValue: String);
+ begin
+ end;
+
+ Function TMyParentClass.ReadI: Integer;
+ begin
+ end;
+
+ procedure TMyParentClass.AProtectedMethod;
+ begin
+ end;
+
+ constructor TMyParentClass.Create(AOwner: TComponent);
+ begin
+ inherited Create(AOwner);
+ end;
+
+ destructor TMyParentClass.Destroy;
+ begin
+ inherited Destroy;
+ end;
+
+ procedure TMyParentClass.AVirtualProc;
+ begin
+ end;
+
+ procedure TMyParentClass.AMessageProc(var Msg);
+ begin
+ end;
+
+ procedure TMyParentClass.AStringMessageProc(var Msg);
+ begin
+ end;
+
+ procedure TMyParentClass.ADeprecatedProc;
+ begin
+ end;
+
+ procedure TMyParentClass.APlatformProc;
+ begin
+ end;
+
+ procedure TMyParentClass.SomePublishedMethod;
+ begin
+ end;
+
+ Class Function TPasFunctionType.TypeName: String;
+ begin
+ Result:= 'Function';
+ end;
+
+ procedure Statements;
+ const
+ cint=1;
+ cint1=-1;
+ creal=3.1415;
+ Addi=1+2;
+ Subs=2-3;
+ Muti=3*3;
+ Divi=3/5;
+ //Powe=2^3;
+ Modu=5 mod 3;
+ IDiv=5 div 3;
+ fals= not TRUE;
+ cand=true and false;
+ cor=true or false;
+ cxor=true xor false;
+ lt=2<3;
+ gt=3>2;
+ let=2<=3;
+ get=3>=2;
+ LeftShift=2 shl 3;
+ RightShift=2 shr 3;
+ ConstString='01'+'ab';
+
+ Type
+ Passenger=Record
+ Name: String[30];
+ Flight: String[10];
+ end;
+
+ Type
+ AR=record
+ X,Y: LongInt;
+ end;
+ //PAR = Record;
+ var
+ TheCustomer: Passenger;
+ L: ^LongInt;
+ P: PPChar;
+ S,T: Ar;
+
+ begin
+ X:= X+Y;
+ //EparserError on C++ style
+ //X+=Y; { Same as X := X+Y, needs -Sc command line switch}
+ //x-=y;
+ //X/=2; { Same as X := X/2, needs -Sc command line switch}
+ //x*=y;
+ Done:= False;
+ Weather:= Good;
+ //MyPi := 4* Tan(1); warum * ?
+ L^:= 3;
+ P^^:= 'A';
+ Usage;
+ WriteLn('Pascal is an easy language !');
+ Doit();
+ //label jumpto;
+ //Jumpto :
+ // Statement;
+ //Goto jumpto;
+
+ Case i of
+ 3: DoSomething;
+ 1..5: DoSomethingElse;
+ end;
+
+ Case C of
+ 'a': WriteLn('A pressed');
+ 'b': WriteLn('B pressed');
+ 'c': WriteLn('C pressed');
+ else
+ WriteLn('unknown letter pressed : ',C);
+ end;
+
+ Case C of
+ 'a','e','i','o','u': WriteLn('vowel pressed');
+ 'y': WriteLn('This one depends on the language');
+ else
+ WriteLn('Consonant pressed');
+ end;
+
+ Case Number of
+ 1..10: WriteLn('Small number');
+ 11..100: WriteLn('Normal, medium number');
+ else
+ WriteLn('HUGE number');
+ end;
+
+ case block of
+ 1: begin
+ writeln('1');
+ end;
+ 2: writeln('2');
+ else
+ writeln('3');
+ writeln('4');
+ end;
+
+ If exp1 Then
+ If exp2 then
+ Stat1
+ else
+ stat2;
+
+ If exp3 Then
+ begin
+ If exp4 then
+ Stat5
+ else
+ stat6
+ end;
+
+ If exp7 Then
+ begin
+ If exp8 then
+ Stat9
+ end
+ else
+ stat2;
+
+ if i is integer then
+ begin
+ write('integer');
+ end
+ else
+ if i is real then
+ begin
+ write('real');
+ end
+ else
+ write('0');
+
+ if Today in[Monday..Friday] then
+ WriteLn('Must work harder')
+ else
+ WriteLn('Take a day off.');
+
+ for Day:= Monday to Friday do
+ Work;
+ for I:= 100 downto 1 do
+ WriteLn('Counting down : ',i);
+ for I:= 1 to 7*dwarfs do
+ KissDwarf(i);
+
+ for i:= 0 to 10 do
+ begin
+ j:= 2+1;
+ write(i,j);
+ end;
+
+ repeat
+ WriteLn('I =',i);
+ I:= I+2;
+ until I>100;
+
+ repeat
+ X:= X/2;
+ until x<10e-3;
+
+ I:= I+2;
+ while i<=100 do
+ begin
+ WriteLn('I =',i);
+ I:= I+2;
+ end;
+ X:= X/2;
+ while x>=10e-3 do
+ dec(x);
+
+ while x>0 do
+ while y>0 do
+ begin
+ dec(x);
+ dec(y);
+ end;
+
+ while x>0 do
+ if x>2 then
+ dec(x)
+ else
+ dec(x,2);
+
+ X:= 2+3;
+
+ TheCustomer.Name:= 'Michael';
+ TheCustomer.Flight:= 'PS901';
+
+ With TheCustomer do
+ begin
+ Name:= 'Michael';
+ Flight:= 'PS901';
+ end;
+
+ With A,B,C,D do
+ Statement;
+
+ With A do
+ With B do
+ With C do
+ With D do
+ Statement;
+
+ S.X:= 1;S.Y:= 1;
+ T.X:= 2;T.Y:= 2;
+ With S,T do
+ WriteLn(X,' ',Y);
+
+ {asm
+ Movl $1,%ebx
+ Movl $0,%eax
+ addl %eax,%ebx
+ end; ['EAX','EBX'];}
+
+ try
+ try
+ M:= ParseSource(E,cmdl,'linux','i386');
+ except
+ on excep: EParserError do
+ begin
+ writeln(excep.message,' line:',excep.row,' column:',excep.column,' file:',excep.filename);
+ raise ;
+ end;
+ end;
+ Decls:= M.InterfaceSection.Declarations;
+ for I:= 0 to Decls.Count-1 do
+ Writeln('Interface item ',I,': ');
+
+ FreeAndNil(M);
+ finally
+ FreeAndNil(E)
+ end;
+
+ raise EParserError.Create(Format(SParserErrorAtToken, [Msg, CurTokenName]) {$ifdef addlocation}+' ('+inttostr(scanner.currow)+' '+inttostr(scanner.curcolumn)+')'{$endif},Scanner.CurFilename, Scanner.CurRow, Scanner.CurColumn);
+
+ // try else
+ end;
+
+ procedure Expression;
+ begin
+ A:= a+b *c /(-e+f)*3 div 2 + 4 mod 5 - 2 shl 3 + 3 shr 1 ;
+ b:= (a and not b) or c xor d;
+ u:= i<=2 or a<>b or j>=3;
+ u:= i=1 or a>b or b<a or i<>2;
+ u:= i in [1..2];
+
+ If F=@AddOne Then
+ WriteLn('Functions are equal');
+
+ If F()=Addone then
+ WriteLn('Functions return same values ');
+
+ z:= [today,tomorrow];
+ z:= [Monday..Friday,Sunday];
+ z:= [2,3*2,6*2,9*2];
+ z:= ['A'..'Z','a'..'z','0'..'9'];
+
+ x:= Byte('A');
+ x:= Char(48);
+ x:= boolean(1);
+ x:= longint(@Buffer);
+ x:= Integer('A');
+ x:= Char(4875);
+ x:= Word(@Buffer);
+
+ B:= Byte(C);
+ Char(B):= C;
+
+ TWordRec(W).L:= $FF;
+ TWordRec(W).H:= 0;
+ S:= TObject(P).ClassName;
+
+ P:= @MyProc; //warum @ ? fix pparser 769 ?
+
+ Dirname:= Dirname+'\';
+
+ W:= [mon,tue]+[wed,thu,fri]; // equals [mon,tue,wed,thu,fri]
+ W:= [mon,tue,wed]-[wed]; // equals [mon,tue]
+ W:= [mon,tue,wed]*[wed,thu,fri]; // equals [wed] warum * ?
+
+ (C as TEdit).Text:= 'Some text';
+ C:= O as TComponent;
+
+ if A is TComponent then ;
+ If A is B then ;
+
+ Inherited ;
+ Inherited Test;
+
+ if true then
+ Inherited
+ else
+ DoNothing;
+
+ if true then
+ Inherited Test
+ else
+ DoNothing;
+
+ Inherited P:= 3;
+ Inherited SetP1(3);
+ Result:= Char(P and $FF);
+ Result:= Char((Inherited P) and $FF);
+ Inherited P:= Ord(AValue);
+ Result:= Inherited InterPretOption(Cmd,Arg);
+
+ raise Exception.Create(SErrMultipleSourceFiles);
+
+ if Filename<>'' then
+ raise Exception.Create(SErrMultipleSourceFiles);
+
+ if Filename<>'' then
+ raise Exception.Create(SErrMultipleSourceFiles)
+ else
+ Filename:= s;
+
+ Self.Write(EscapeText(AText));
+ TObject.Create(Self);
+ end;
+
+ constructor TPasPackage.Create(const AName: String; AParent: TPasElement);
+ begin
+ if (Length(AName)>0)and(AName[1]<>'#') then
+ Inherited Create('#'+AName,AParent)
+ else
+ Inherited Create(AName,AParent);
+ Modules:= TList.Create;
+ end;
+
+ Function TPascalScanner.FetchToken: TToken;
+ var
+ IncludeStackItem: TIncludeStackItem;
+
+ begin
+ while true do
+ begin
+ Result:= DoFetchToken;
+ if FCurToken=tkEOF then
+ if FIncludeStack.Count>0 then
+ begin
+ CurSourceFile.Free;
+ IncludeStackItem:= TIncludeStackItem(FIncludeStack[FIncludeStack.Count-1]);
+ FIncludeStack.Delete(FIncludeStack.Count-1);
+ FCurSourceFile:= IncludeStackItem.SourceFile;
+ FCurFilename:= IncludeStackItem.Filename;
+ FCurToken:= IncludeStackItem.Token;
+ FCurTokenString:= IncludeStackItem.TokenString;
+ FCurLine:= IncludeStackItem.Line;
+ FCurRow:= IncludeStackItem.Row;
+ TokenStr:= IncludeStackItem.TokenStr;
+ IncludeStackItem.Free;
+ Result:= FCurToken;
+ end
+ else
+ break
+ else
+ if not PPIsSkipping then
+ break;
+ end;
+ end;
+
+ Procedure IFS;
+ begin
+ if true then
+ repeat
+ until false
+ else
+ Noting;
+ end;
+
+
+ Procedure IFS(x: integer); overload;
+ begin
+ if true then
+ case x of
+ 1: writeln;
+ 2: write;
+ else
+ writeln('#');
+ end
+ else
+ Noting;
+ end;
+
+ Procedure IFS1;
+ begin
+ if true then
+ while true do
+ Something
+ else
+ Noting;
+ end;
+
+ Procedure IFS3;
+ begin
+ if true then
+ if true then
+ write
+ else
+ writeln;
+ end;
+
+Initialization
+
+ hallo:= valid;
+end.
diff --git a/packages/fcl-passrc/src/pastree.pp b/packages/fcl-passrc/src/pastree.pp
index 027047e825..57e2d887dd 100644
--- a/packages/fcl-passrc/src/pastree.pp
+++ b/packages/fcl-passrc/src/pastree.pp
@@ -121,7 +121,7 @@ type
end;
TPasExprKind = (pekIdent, pekNumber, pekString, pekSet, pekNil, pekBoolConst, pekRange,
- pekUnary, pekBinary, pekFuncParams, pekArrayParams, pekListOfExp);
+ pekUnary, pekBinary, pekFuncParams, pekArrayParams, pekListOfExp, pekInherited, pekSelf);
TExprOpCode = (eopNone,
eopAdd,eopSubtract,eopMultiply,eopDivide, eopDiv,eopMod, eopPower,// arithmetic
@@ -178,6 +178,20 @@ type
function GetDeclaration(full : Boolean) : string; override;
end;
+ { TInheritedExpr }
+
+ TInheritedExpr = class(TPasExpr)
+ constructor Create(AParent : TPasElement); overload;
+ function GetDeclaration(full : Boolean) : string; override;
+ end;
+
+ { TSelfExpr }
+
+ TSelfExpr = class(TPasExpr)
+ constructor Create(AParent : TPasElement); overload;
+ function GetDeclaration(full : Boolean) : string; override;
+ end;
+
{ TParamsExpr }
TParamsExpr = class(TPasExpr)
@@ -454,6 +468,7 @@ type
AncestorType: TPasType; // TPasClassType or TPasUnresolvedTypeRef
IsPacked: Boolean; // 12/04/04 - Dave - Added
IsForward : Boolean;
+ IsShortDefinition: Boolean;//class(anchestor); without end
Members: TList; // array of TPasElement objects
InterfaceGUID : string; // 15/06/07 - Inoussa
@@ -1346,6 +1361,7 @@ constructor TPasClassType.Create(const AName: string; AParent: TPasElement);
begin
inherited Create(AName, AParent);
IsPacked := False; // 12/04/04 - Dave - Added
+ IsShortDefinition := False;
Members := TList.Create;
Modifiers := TStringList.Create;
ClassVars := TList.Create;
@@ -1388,7 +1404,7 @@ var
begin
for i := 0 to Args.Count - 1 do
TPasArgument(Args[i]).Release;
- Args.Free;
+ FreeAndNil(Args);
inherited Destroy;
end;
@@ -1726,12 +1742,14 @@ begin
Result:=TPasImplAssign.Create('', Self);
Result.left:=left;
Result.right:=right;
+ AddElement(Result);
end;
function TPasImplBlock.AddSimple(exp:TPasExpr):TPasImplSimple;
begin
Result:=TPasImplSimple.Create('', Self);
Result.expr:=exp;
+ AddElement(Result);
end;
function TPasImplBlock.CloseOnSemicolon: boolean;
@@ -2591,7 +2609,7 @@ Var
I : Integer;
begin
- For I:=0 to Length(Params) do
+ For I:=0 to High(Params) do
begin
If (Result<>'') then
Result:=Result+', ';
@@ -2629,7 +2647,7 @@ Function TRecordValues.GetDeclaration(Full : Boolean):AnsiString;
Var
I : Integer;
begin
- For I:=0 to Length(Fields) do
+ For I:=0 to High(Fields) do
begin
If Result='' then
Result:=Result+'; ';
@@ -2661,20 +2679,36 @@ begin
Fields[i].ValueExp:=Value;
end;
-{ TArrayValues }
+{ TNilExpr }
Function TNilExpr.GetDeclaration(Full :Boolean):AnsiString;
begin
Result:='Nil';
end;
+{ TInheritedExpr }
+
+Function TInheritedExpr.GetDeclaration(Full :Boolean):AnsiString;
+begin
+ Result:='Inherited';
+end;
+
+{ TSelfExpr }
+
+Function TSelfExpr.GetDeclaration(Full :Boolean):AnsiString;
+begin
+ Result:='Self';
+end;
+
+{ TArrayValues }
+
Function TArrayValues.GetDeclaration(Full: Boolean):AnsiString;
Var
I : Integer;
begin
- For I:=0 to Length(Values) do
+ For I:=0 to High(Values) do
begin
If Result='' then
Result:=Result+', ';
@@ -2712,6 +2746,20 @@ begin
inherited Create(AParent,pekNil, eopNone);
end;
+{ TInheritedExpr }
+
+constructor TInheritedExpr.Create(AParent : TPasElement);
+begin
+ inherited Create(AParent,pekInherited, eopNone);
+end;
+
+{ TSelfExpr }
+
+constructor TSelfExpr.Create(AParent : TPasElement);
+begin
+ inherited Create(AParent,pekSelf, eopNone);
+end;
+
{ TPasLabels }
constructor TPasLabels.Create(const AName:string;AParent:TPasElement);
diff --git a/packages/fcl-passrc/src/pparser.pp b/packages/fcl-passrc/src/pparser.pp
index 1490282ce1..6d2bb965c8 100644
--- a/packages/fcl-passrc/src/pparser.pp
+++ b/packages/fcl-passrc/src/pparser.pp
@@ -766,6 +766,40 @@ begin
tkfalse, tktrue: x:=TBoolConstExpr.Create(Aparent,pekBoolConst, CurToken=tktrue);
tknil: x:=TNilExpr.Create(Aparent);
tkSquaredBraceOpen: x:=ParseParams(AParent,pekSet);
+ tkinherited: begin
+ //inherited; inherited function
+ x:=TInheritedExpr.Create(AParent);
+ NextToken;
+ if (length(CurTokenText)>0) and (CurTokenText[1] in ['A'..'_']) then begin
+ b:=TBinaryExpr.Create(AParent,x, DoParseExpression(AParent), eopNone);
+ if not Assigned(b.right) then Exit; // error
+ x:=b;
+ UngetToken;
+ end
+ else UngetToken;
+ end;
+ tkself: begin
+ x:=TPrimitiveExpr.Create(AParent,pekString, CurTokenText); //function(self);
+ x:=TSelfExpr.Create(AParent);
+ NextToken;
+ if CurToken = tkDot then begin // self.Write(EscapeText(AText));
+ optk:=CurToken;
+ NextToken;
+ b:=TBinaryExpr.Create(AParent,x, ParseExpIdent(AParent), TokenToExprOp(optk));
+ if not Assigned(b.right) then Exit; // error
+ x:=b;
+ end
+ else UngetToken;
+ end;
+ tkAt: begin
+ // P:=@function;
+ NextToken;
+ if (length(CurTokenText)=0) or not (CurTokenText[1] in ['A'..'_']) then begin
+ UngetToken;
+ ParseExc(SParserExpectedIdentifier);
+ end;
+ x:=TPrimitiveExpr.Create(AParent,pekString, '@'+CurTokenText);
+ end;
tkCaret: begin
// ^A..^_ characters. See #16341
NextToken;
@@ -2714,6 +2748,27 @@ begin
// empty then => add dummy command
CurBlock.AddCommand('');
end;
+ if TPasImplIfElse(CurBlock).ElseBranch<>nil then
+ begin
+ // this and the following 3 may solve TPasImplIfElse.AddElement BUG
+ // ifs without begin end
+ // if .. then
+ // if .. then
+ // else
+ // else
+ CloseBlock;
+ CloseStatement(false);
+ end;
+ end else if (CurBlock is TPasImplWhileDo) then
+ begin
+ //if .. then while .. do smt else ..
+ CloseBlock;
+ UngetToken;
+ end else if (CurBlock is TPasImplRaise) then
+ begin
+ //if .. then Raise Exception else ..
+ CloseBlock;
+ UngetToken;
end else if (CurBlock is TPasImplTryExcept) then
begin
CloseBlock;
@@ -2795,16 +2850,17 @@ begin
repeat
Expr:=ParseExpression(Parent);
//writeln(i,'CASE value="',Expr,'" Token=',CurTokenText);
- if CurBlock is TPasImplCaseStatement then
- TPasImplCaseStatement(CurBlock).Expressions.Add(Expr)
- else
- CurBlock:=TPasImplCaseOf(CurBlock).AddCase(Expr);
NextToken;
if CurToken=tkDotDot then
begin
Expr:=Expr+'..'+ParseExpression(Parent);
NextToken;
end;
+ // do not miss '..'
+ if CurBlock is TPasImplCaseStatement then
+ TPasImplCaseStatement(CurBlock).Expressions.Add(Expr)
+ else
+ CurBlock:=TPasImplCaseOf(CurBlock).AddCase(Expr);
//writeln(i,'CASE after value Token=',CurTokenText);
if CurToken=tkColon then break;
if CurToken<>tkComma then
@@ -2932,7 +2988,7 @@ begin
begin
// assign statement
NextToken;
- right:=ParseExpIdent(Parent);
+ right:=DoParseExpression(nil); // this may solve TPasImplWhileDo.AddElement BUG
CmdElem:=CurBlock.AddAssign(left, right);
UngetToken;
end;
@@ -2943,7 +2999,7 @@ begin
// label mark. todo: check mark identifier in the list of labels
CmdElem:=CurBlock.AddLabelMark(TPrimitiveExpr(left).Value);
left.Free;
- end
+ end;
else
// simple statement (function call)
CmdElem:=CurBlock.AddSimple(left);
@@ -3130,36 +3186,62 @@ function TPasParser.ParseClassDecl(Parent: TPasElement;
var
CurVisibility: TPasMemberVisibility;
- procedure ProcessMethod(const MethodTypeName: String; HasReturnValue: Boolean);
+ procedure ProcessMethod(ProcType: TProcType);
var
Owner: TPasElement;
Proc: TPasProcedure;
- s: String;
+ s,Name: String;
pt: TProcType;
+ HasReturnValue: Boolean;
+
begin
+ HasReturnValue:=false;
ExpectIdentifier;
- Owner := CheckIfOverloaded(TPasClassType(Result), CurTokenString);
- if HasReturnValue then
+ Name := CurTokenString;
+ Owner := CheckIfOverloaded(TPasClassType(Result), Name);
+ case ProcType of
+ ptFunction:
begin
- Proc := TPasFunction(CreateElement(TPasFunction, CurTokenString, Owner,
+ Proc := TPasFunction(CreateElement(TPasFunction, Name, Owner,
CurVisibility));
Proc.ProcType := Engine.CreateFunctionType('', 'Result', Proc, True,
Scanner.CurFilename, Scanner.CurRow);
- end else
+ HasReturnValue:=true;
+ end;
+ ptClassFunction:
begin
- // !!!: The following is more than ugly
- if MethodTypeName = 'constructor' then
- Proc := TPasConstructor(CreateElement(TPasConstructor, CurTokenString,
- Owner, CurVisibility))
- else if MethodTypeName = 'destructor' then
- Proc := TPasDestructor(CreateElement(TPasDestructor, CurTokenString,
- Owner, CurVisibility))
+ Proc := TPasClassFunction(CreateElement(TPasClassFunction, Name, Owner));
+ Proc.ProcType := Engine.CreateFunctionType('', 'Result', Proc, True,
+ Scanner.CurFilename, Scanner.CurRow);
+ HasReturnValue:=true;
+ end;
+ ptClassProcedure:
+ begin
+ Proc := TPasClassProcedure(CreateElement(TPasClassProcedure, Name, Owner));
+ Proc.ProcType := TPasProcedureType(CreateElement(TPasProcedureType, '',
+ Proc, CurVisibility));
+ end;
+ ptConstructor:
+ begin
+ Proc := TPasConstructor(CreateElement(TPasConstructor, Name,
+ Owner, CurVisibility));
+ Proc.ProcType := TPasProcedureType(CreateElement(TPasProcedureType, '',
+ Proc, CurVisibility));
+ end;
+ ptDestructor:
+ begin
+ Proc := TPasDestructor(CreateElement(TPasDestructor, Name,
+ Owner, CurVisibility));
+ Proc.ProcType := TPasProcedureType(CreateElement(TPasProcedureType, '',
+ Proc, CurVisibility));
+ end;
else
- Proc := TPasProcedure(CreateElement(TPasProcedure, CurTokenString,
+ Proc := TPasProcedure(CreateElement(TPasProcedure, Name,
Owner, CurVisibility));
Proc.ProcType := TPasProcedureType(CreateElement(TPasProcedureType, '',
Proc, CurVisibility));
end;
+
if Owner.ClassType = TPasOverloadedProc then
TPasOverloadedProc(Owner).Overloads.Add(Proc)
else
@@ -3302,6 +3384,8 @@ begin
end
else
TPasClassType(Result).isForward:=CurToken=tkSemicolon;
+ if CurToken = tkSemicolon then
+ TPasClassType(Result).IsShortDefinition:=true;
if CurToken <> tkSemicolon then
begin
@@ -3364,13 +3448,19 @@ begin
end;
tkProcedure:
- ProcessMethod('procedure', False);
+ ProcessMethod(ptProcedure);
tkFunction:
- ProcessMethod('function', True);
+ ProcessMethod(ptFunction);
tkConstructor:
- ProcessMethod('constructor', False);
+ ProcessMethod(ptConstructor);
tkDestructor:
- ProcessMethod('destructor', False);
+ ProcessMethod(ptDestructor);
+ tkclass:
+ begin
+ NextToken;
+ if CurToken = tkprocedure then ProcessMethod(ptClassProcedure)
+ else ProcessMethod(ptClassFunction);
+ end;
tkProperty:
begin
ExpectIdentifier;
diff --git a/packages/fcl-process/Makefile b/packages/fcl-process/Makefile
index 899cdd1708..98e126ea6b 100644
--- a/packages/fcl-process/Makefile
+++ b/packages/fcl-process/Makefile
@@ -1,8 +1,8 @@
#
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2010/05/05]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2010/10/20]
#
default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim 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-solaris 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 mipsel-linux
BSDs = freebsd netbsd openbsd darwin
UNIXs = linux $(BSDs) solaris qnx haiku
LIMIT83fs = go32v2 os2 emx watcom
@@ -245,7 +245,7 @@ endif
ifndef CROSSBINDIR
CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
endif
-ifeq ($(OS_TARGET),darwin)
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
ifeq ($(OS_SOURCE),darwin)
DARWIN2DARWIN=1
endif
@@ -326,6 +326,12 @@ endif
ifeq ($(FULL_TARGET),i386-symbian)
override TARGET_UNITS+=pipes process
endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override TARGET_UNITS+=pipes process
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override TARGET_UNITS+=pipes process simpleipc dbugmsg dbugintf
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override TARGET_UNITS+=pipes process simpleipc dbugmsg dbugintf
endif
@@ -389,6 +395,9 @@ endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override TARGET_UNITS+=pipes process simpleipc dbugmsg dbugintf
endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override TARGET_UNITS+=pipes process simpleipc dbugmsg dbugintf
+endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override TARGET_UNITS+=pipes process simpleipc dbugmsg dbugintf
endif
@@ -440,6 +449,9 @@ endif
ifeq ($(FULL_TARGET),armeb-embedded)
override TARGET_UNITS+=pipes process
endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override TARGET_UNITS+=pipes process simpleipc dbugmsg dbugintf
+endif
ifeq ($(FULL_TARGET),i386-linux)
override TARGET_RSTS+=process simpleipc
endif
@@ -500,6 +512,12 @@ endif
ifeq ($(FULL_TARGET),i386-symbian)
override TARGET_RSTS+=process simpleipc
endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override TARGET_RSTS+=process simpleipc
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override TARGET_RSTS+=process simpleipc
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override TARGET_RSTS+=process simpleipc
endif
@@ -563,6 +581,9 @@ endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override TARGET_RSTS+=process simpleipc
endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override TARGET_RSTS+=process simpleipc
+endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override TARGET_RSTS+=process simpleipc
endif
@@ -614,6 +635,9 @@ endif
ifeq ($(FULL_TARGET),armeb-embedded)
override TARGET_RSTS+=process simpleipc
endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override TARGET_RSTS+=process simpleipc
+endif
override INSTALL_FPCPACKAGE=y
ifeq ($(FULL_TARGET),i386-linux)
override COMPILER_OPTIONS+=-S2h
@@ -675,6 +699,12 @@ endif
ifeq ($(FULL_TARGET),i386-symbian)
override COMPILER_OPTIONS+=-S2h
endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_OPTIONS+=-S2h
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override COMPILER_OPTIONS+=-S2h
endif
@@ -738,6 +768,9 @@ endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override COMPILER_OPTIONS+=-S2h
endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override COMPILER_OPTIONS+=-S2h
endif
@@ -789,6 +822,9 @@ endif
ifeq ($(FULL_TARGET),armeb-embedded)
override COMPILER_OPTIONS+=-S2h
endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
ifeq ($(FULL_TARGET),i386-linux)
override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src src/unix src/dummy
endif
@@ -849,6 +885,12 @@ endif
ifeq ($(FULL_TARGET),i386-symbian)
override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src
endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src src/unix src/dummy
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src src/unix src/dummy
endif
@@ -912,6 +954,9 @@ endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src src/unix src/dummy
endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src src/unix src/dummy
+endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src src/unix src/dummy
endif
@@ -963,6 +1008,9 @@ endif
ifeq ($(FULL_TARGET),armeb-embedded)
override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src
endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_INCLUDEDIR+=src/$(OS_TARGET) src src/unix src/dummy
+endif
ifeq ($(FULL_TARGET),i386-linux)
override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
endif
@@ -1023,6 +1071,12 @@ endif
ifeq ($(FULL_TARGET),i386-symbian)
override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
+endif
ifeq ($(FULL_TARGET),m68k-linux)
override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
endif
@@ -1086,6 +1140,9 @@ endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
+endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
endif
@@ -1137,6 +1194,9 @@ endif
ifeq ($(FULL_TARGET),armeb-embedded)
override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_SOURCEDIR+=src/$(OS_TARGET) src
+endif
ifdef REQUIRE_UNITSDIR
override UNITSDIR+=$(REQUIRE_UNITSDIR)
endif
@@ -1464,7 +1524,7 @@ DEBUGSYMEXT=.xcoff
SHORTSUFFIX=mac
IMPORTLIBPREFIX=imp
endif
-ifeq ($(OS_TARGET),darwin)
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
BATCHEXT=.sh
EXEEXT=
HASSHAREDLIB=1
@@ -1479,6 +1539,10 @@ ifeq ($(OS_TARGET),symbian)
SHAREDLIBEXT=.dll
SHORTSUFFIX=symbian
endif
+ifeq ($(OS_TARGET),NativeNT)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=nativent
+endif
else
ifeq ($(OS_TARGET),go32v1)
PPUEXT=.pp1
@@ -1964,6 +2028,12 @@ endif
ifeq ($(FULL_TARGET),i386-symbian)
REQUIRE_PACKAGES_RTL=1
endif
+ifeq ($(FULL_TARGET),i386-nativent)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+REQUIRE_PACKAGES_RTL=1
+endif
ifeq ($(FULL_TARGET),m68k-linux)
REQUIRE_PACKAGES_RTL=1
endif
@@ -2027,6 +2097,9 @@ endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
REQUIRE_PACKAGES_RTL=1
endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
ifeq ($(FULL_TARGET),x86_64-darwin)
REQUIRE_PACKAGES_RTL=1
endif
@@ -2078,6 +2151,9 @@ endif
ifeq ($(FULL_TARGET),armeb-embedded)
REQUIRE_PACKAGES_RTL=1
endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
ifdef REQUIRE_PACKAGES_RTL
PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
ifneq ($(PACKAGEDIR_RTL),)
@@ -2087,9 +2163,9 @@ else
UNITDIR_RTL=$(PACKAGEDIR_RTL)
endif
ifdef CHECKDEPEND
-$(PACKAGEDIR_RTL)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_RTL)/$(OS_TARGET) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE)
endif
else
PACKAGEDIR_RTL=
@@ -2459,7 +2535,7 @@ ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
ifdef USETAR
ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
-ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
+ZIPCMD_ZIP:=$(TARPROG) c$(TAROPT)f $(ZIPDESTFILE) *
else
ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
@@ -2504,6 +2580,9 @@ fpc_zipdistinstall:
ifdef EXEFILES
override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
endif
+ifdef CLEAN_PROGRAMS
+override CLEANEXEFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEEXT), $(CLEAN_PROGRAMS)))
+endif
ifdef CLEAN_UNITS
override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
endif
@@ -2551,6 +2630,9 @@ ifdef CLEANRSTFILES
-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
endif
endif
+ifdef CLEAN_FILES
+ -$(DEL) $(CLEAN_FILES)
+endif
-$(DELTREE) units
-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
ifneq ($(PPUEXT),.ppu)
diff --git a/packages/fcl-registry/src/regini.inc b/packages/fcl-registry/src/regini.inc
index 78e525cbe5..227405619e 100644
--- a/packages/fcl-registry/src/regini.inc
+++ b/packages/fcl-registry/src/regini.inc
@@ -83,30 +83,44 @@ procedure TRegIniFile.WriteBool(const Section, Ident: string; Value: Boolean);
begin
if not OpenKey(fPath+Section,true) then Exit;
try
- inherited WriteBool(Ident,Value);
- finally
- CloseKey;
+ if not fPreferStringValues then
+ inherited WriteBool(Ident,Value)
+ else begin
+ if ValueExists(Ident) and (GetDataType(Ident)=rdInteger) then
+ inherited WriteBool(Ident,Value)
+ else
+ inherited WriteString(Ident,BoolToStr(Value));
+ end;
+ finally
+ CloseKey;
end;
end;
procedure TRegIniFile.WriteInteger(const Section, Ident: string; Value: LongInt);
begin
if not OpenKey(fPath+Section,true) then Exit;
- try
- inherited WriteInteger(Ident,Value);
- finally
- CloseKey;
- end;
+ try
+ if not fPreferStringValues then
+ inherited WriteInteger(Ident,Value)
+ else begin
+ if ValueExists(Ident) and (GetDataType(Ident)=rdInteger) then
+ inherited WriteInteger(Ident,Value)
+ else
+ inherited WriteString(Ident,IntToStr(Value));
+ end;
+ finally
+ CloseKey;
+ end;
end;
procedure TRegIniFile.WriteString(const Section, Ident, Value: String);
begin
- if not OpenKey(fPath+Section,true) then Exit;
- try
+ if not OpenKey(fPath+Section,true) then Exit;
+ try
inherited WriteString(Ident,Value);
- finally
+ finally
CloseKey;
- end;
+ end;
end;
function TRegIniFile.ReadBool(const Section, Ident: string; Default: Boolean): Boolean;
@@ -115,7 +129,10 @@ begin
if not OpenKey(fPath+Section,false) then Exit;
try
if ValueExists(Ident) then
- Result := inherited ReadBool(Ident);
+ if (not fPreferStringValues) or (GetDataType(Ident)=rdInteger) then
+ Result := inherited ReadBool(Ident)
+ else
+ Result := StrToBool(inherited ReadString(Ident));
finally
CloseKey;
end;
@@ -127,7 +144,10 @@ begin
if not OpenKey(fPath+Section,false) then Exit;
try
if ValueExists(Ident) then
- Result := inherited ReadInteger(Ident);
+ if (not fPreferStringValues) or (GetDataType(Ident)=rdInteger) then
+ Result := inherited ReadInteger(Ident)
+ else
+ Result := StrToInt(inherited ReadString(Ident));
finally
CloseKey;
end;
diff --git a/packages/fcl-registry/src/registry.pp b/packages/fcl-registry/src/registry.pp
index 8a3ea3f6c1..5bce60501c 100644
--- a/packages/fcl-registry/src/registry.pp
+++ b/packages/fcl-registry/src/registry.pp
@@ -130,8 +130,9 @@ type
---------------------------------------------------------------------}
TRegIniFile = class(TRegistry)
private
- fFileName: String;
- fPath : String;
+ fFileName : String;
+ fPath : String;
+ fPreferStringValues: Boolean;
public
constructor Create(const FN: string); overload;
constructor Create(const FN: string;aaccess:longword); overload;
@@ -150,6 +151,8 @@ type
procedure DeleteKey(const Section, Ident: String);
property FileName: String read fFileName;
+ property PreferStringValues: Boolean read fPreferStringValues
+ write fPreferStringValues;
end;
{ ---------------------------------------------------------------------
diff --git a/packages/fcl-registry/src/xmlreg.pp b/packages/fcl-registry/src/xmlreg.pp
index ef0274340b..1fca47aae2 100644
--- a/packages/fcl-registry/src/xmlreg.pp
+++ b/packages/fcl-registry/src/xmlreg.pp
@@ -352,22 +352,24 @@ begin
begin
Node[SType]:=IntToStr(Ord(DataType));
DataNode:=Node.FirstChild;
- Result:=DataNode<>Nil; // Bug 9879. Create child here?
- If Result Then
- begin
- Case DataType of
- dtDWORD : DataNode.NodeValue:=IntToStr(PCardinal(@Data)^);
- dtString : begin
- SetLength(S,DataSize);
- If (DataSize>0) then
- Move(Data,S[1],DataSize);
- DataNode.NodeValue:=S;
- end;
- dtBinary : begin
- S:=BufToHex(Data,DataSize);
- DataNode.NodeValue:=S;
- end;
- end;
+ // Reading <value></value> results in <value/>, i.e. no subkey exists any more. Create textnode.
+ if (DataNode=nil) then
+ begin
+ DataNode:=FDocument.CreateTextNode('');
+ Node.AppendChild(DataNode);
+ end;
+ Case DataType of
+ dtDWORD : DataNode.NodeValue:=IntToStr(PCardinal(@Data)^);
+ dtString : begin
+ SetLength(S,DataSize);
+ If (DataSize>0) then
+ Move(Data,S[1],DataSize);
+ DataNode.NodeValue:=S;
+ end;
+ dtBinary : begin
+ S:=BufToHex(Data,DataSize);
+ DataNode.NodeValue:=S;
+ end;
end;
end;
If Result then
diff --git a/packages/fcl-registry/tests/testbasics.pp b/packages/fcl-registry/tests/testbasics.pp
index 9248555ebb..6de7106e84 100644
--- a/packages/fcl-registry/tests/testbasics.pp
+++ b/packages/fcl-registry/tests/testbasics.pp
@@ -19,6 +19,7 @@ type
protected
published
procedure TestSimpleWinRegistry;
+ procedure TestDoubleWrite;
end;
implementation
@@ -37,15 +38,49 @@ begin
// use a hopefully non existing key
AssertFalse(Registry.KeyExists('FPC1234'));
-
+{$ifdef windows}
AssertTrue(Registry.KeyExists('SOFTWARE'));
-
- // Registry.OpenKey('FPC', False);
- // Result:=Registry.ReadString('VALUE1');
+{$endif}
Registry.Free;
end;
+procedure TTestBasics.TestDoubleWrite;
+
+{$ifndef windows}
+Var
+ FN : String;
+{$endif}
+
+begin
+{$ifndef windows}
+ FN:=includetrailingpathdelimiter(GetAppConfigDir(False))+'reg.xml';
+ if FileExists(FN) then
+ AssertTrue(DeleteFile(FN));
+{$endif}
+ with TRegistry.Create do
+ try
+ OpenKey('test', true);
+ WriteString('LAYOUT', '');
+ CloseKey;
+ finally
+ Free;
+ end;
+ with TRegistry.Create do
+ try
+ OpenKey('test', true);
+ WriteString('LAYOUT', '');
+ CloseKey;
+ finally
+ Free;
+ end;
+{$ifndef windows}
+ FN:=includetrailingpathdelimiter(GetAppConfigDir(False))+'reg.xml';
+ if FileExists(FN) then
+ AssertTrue(DeleteFile(FN));
+{$endif}
+end;
+
initialization
RegisterTest(TTestBasics);
end.
diff --git a/packages/fcl-stl/Makefile b/packages/fcl-stl/Makefile
new file mode 100644
index 0000000000..c94d564fd7
--- /dev/null
+++ b/packages/fcl-stl/Makefile
@@ -0,0 +1,2427 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/03/21]
+#
+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 i386-nativent i386-iphonesim 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 powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris 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 mipsel-linux
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx haiku
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+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 cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+ifndef RUNBATCH
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+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))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+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)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+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
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifeq ($(CPU_TARGET),armeb)
+ARCH=arm
+override FPCOPT+=-Cb
+else
+ifeq ($(CPU_TARGET),armel)
+ARCH=arm
+override FPCOPT+=-CaEABI
+else
+ARCH=$(CPU_TARGET)
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX 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:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
+ifeq ($(OS_SOURCE),darwin)
+DARWIN2DARWIN=1
+endif
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+ifndef DARWIN2DARWIN
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=fcl-stl
+override PACKAGE_VERSION=2.5.1
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override TARGET_UNITS+=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+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 COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+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 UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+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 UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+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 UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+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
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),haiku)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=hai
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+ifeq ($(OS_TARGET),NativeNT)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=nativent
+endif
+ifeq ($(OS_TARGET),wii)
+EXEEXT=.dol
+SHAREDLIBEXT=.so
+SHORTSUFFIX=wii
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_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= __missing_command_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= __missing_command_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= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+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= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+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$(SRCBATCHEXT)
+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=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_RTL)/$(OS_TARGET) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(ARCH)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(ARCH)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+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
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+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 CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+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 AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS)$(TARGET_IMPLICITUNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(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 .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+ $(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+ $(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(PPUEXT): %.pas
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(EXEEXT): %.pp
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(EXEEXT): %.pas
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(EXEEXT): %.lpr
+ $(COMPILER) $<
+ $(EXECPPAS)
+%$(EXEEXT): %.dpr
+ $(COMPILER) $<
+ $(EXECPPAS)
+%.res: %.rc
+ windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+ $(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+ $(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+ @$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+ $(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.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))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+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$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+ $(MKDIR) $(INSTALL_UNITDIR)
+ $(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+ $(MKDIR) $(INSTALL_UNITDIR)
+ $(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+ $(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+ $(MKDIR) $(INSTALL_LIBDIR)
+ $(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+ ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+ $(MKDIR) $(INSTALL_DATADIR)
+ $(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+ $(MKDIR) $(INSTALL_SOURCEDIR)
+ $(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+ $(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+ $(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+ $(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) c$(TAROPT)f $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+ $(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+ $(MKDIR) $(DIST_DESTDIR)
+ $(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+ $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+ $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+ $(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+ echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+ echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+ echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+ /bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+ $(RUNBATCH) $(ZIPWRAPPER)
+else
+ $(ZIPWRAPPER)
+endif
+endif
+ $(DEL) $(ZIPWRAPPER)
+else
+ $(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+ $(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+ $(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+ $(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+ $(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_PROGRAMS
+override CLEANEXEFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEEXT), $(CLEAN_PROGRAMS)))
+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))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+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)
+ -$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+ -$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+ -$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+ -$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+ -$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+ifdef CLEAN_FILES
+ -$(DEL) $(CLEAN_FILES)
+endif
+ -$(DELTREE) units
+ -$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+ -$(DEL) *.o *.ppu *.a
+endif
+ -$(DELTREE) *$(SMARTEXT)
+ -$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+ -$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+ -$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+ -$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.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) SourceSuffix. $(SOURCESUFFIX)
+ @$(ECHO) TargetSuffix. $(TARGETSUFFIX)
+ @$(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) ZipName.............. $(ZIPNAME)
+ @$(ECHO) ZipPrefix............ $(ZIPPREFIX)
+ @$(ECHO) ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+ @$(ECHO) ZipSuffix............ $(ZIPSUFFIX)
+ @$(ECHO) FullZipName.......... $(FULLZIPNAME)
+ @$(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
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:
diff --git a/packages/fcl-stl/Makefile.fpc b/packages/fcl-stl/Makefile.fpc
new file mode 100644
index 0000000000..59ec0f3c9d
--- /dev/null
+++ b/packages/fcl-stl/Makefile.fpc
@@ -0,0 +1,23 @@
+#
+# Makefile.fpc for Free Component Library
+#
+
+[package]
+name=fcl-stl
+version=2.5.1
+
+[target]
+units=garrayutils gdeque gmap gpriorityqueue gqueue gset gstack gutil gvector
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../..
+
+[compiler]
+options=-S2h
+sourcedir=src
+
+[rules]
+.NOTPARALLEL:
diff --git a/packages/fcl-stl/doc/arrayutils.tex b/packages/fcl-stl/doc/arrayutils.tex
new file mode 100644
index 0000000000..b53f8bbf4c
--- /dev/null
+++ b/packages/fcl-stl/doc/arrayutils.tex
@@ -0,0 +1,47 @@
+\chapter{TArrayUtils}
+
+Set of utilities for manipulating arrays data.
+
+Takes 3 arguements for specialization. First one is type of array (can be anything, which is
+accesible by [] operator, e. g. ordinary array, vector, ...), second one is type of array element.
+
+%Usage example for sorting:
+
+%\lstinputlisting[language=Pascal]{sortingexample.pp}
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!procedure RandomShuffle(arr: TArr, size:SizeUint)! &
+O(N)\\ \hline
+\multicolumn{2}{|m{15cm}|}{Shuffles elements in array in random way} \\\hline\hline
+
+\end{longtable}\chapter{TOrderingArrayUtils}
+
+Set of utilities for manipulating arrays data.
+
+Takes 3 arguements for specialization. First one is type of array (can be anything, which is
+accesible by [] operator, e. g. ordinary array, vector, ...), second one is type of array element,
+third one is comparator class (see TPriorityQueue for definition of comparator class).
+
+Usage example for sorting:
+
+\lstinputlisting[language=Pascal]{sortingexample.pp}
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!procedure Sort(arr: TArr, size:SizeUint)! &
+O(N log N) average and worst case. Uses QuickSort, backed up by HeapSort, when QuickSort ends up in
+using too much recursion.\\ \hline
+\multicolumn{2}{|m{15cm}|}{Sort array arr, with specified size. Array indexing should be 0 based.} \\\hline\hline
+
+\end{longtable}
diff --git a/packages/fcl-stl/doc/deque.tex b/packages/fcl-stl/doc/deque.tex
new file mode 100644
index 0000000000..d3b85045bd
--- /dev/null
+++ b/packages/fcl-stl/doc/deque.tex
@@ -0,0 +1,81 @@
+\chapter{TDeque}
+
+Implements selfresizing array. Indexing is 0-based.
+Also implement constant time insertion from front.
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{dequeexample.pp}
+
+Memory complexity:
+Uses at most 3times bigger memory than maximal array size (this is only case during reallocation).
+Normal consumption is at most twice as maximal array size.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty array.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns size of array.} \\\hline\hline
+
+\verb!procedure PushBack(value: T)! & Amortized
+O(1), some operations might take O(N) time, when array needs to be reallocated, but sequence of N
+operations takes O(N) time. \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts at the end of array (increases size by 1)} \\\hline\hline
+
+\verb!procedure PopBack()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the end of array (decreases size by 1). When array
+is empty, does nothing.} \\\hline\hline
+
+\verb!procedure PushFront(value: T)! & Same as PushBack. \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts at the beginning of array (increases size by 1)} \\\hline\hline
+
+\verb!procedure PopFront()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the beginning of array (decreases size by 1). When array
+is empty, does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when array is empty} \\\hline\hline
+
+\verb!procedure Insert(position: SizeUInt; value: T)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Inserts value at position. When position is greater than size, puts value
+at the end of array.} \\\hline\hline
+
+\verb!procedure Erase(positine: SizeUInt; value: T)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Erases element from position. When position is outside of array does
+nothing.} \\\hline\hline
+
+\verb!procedure Clear! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Clears array (set size to zero). But doesn't free memory used by array.}
+\\\hline\hline
+
+\verb!function Front: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns first element from array.} \\\hline\hline
+
+\verb!function Back: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns last element from array.} \\\hline\hline
+
+\verb!procedure Resize(num: SizeUInt)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Changes size of array to num. Doesn't guarantte anything about value of
+newly alocated elements.} \\\hline\hline
+
+\verb!procedure Reserve(num: SizeUInt)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Alocates at least num elements for array. Usefull when you want to
+pushback big number of elements and want to avoid frequent reallocation.} \\\hline\hline
+
+\verb!property item[i: SizeUInt]: T; default;! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Property for accessing i-th element in array. Can be used just by square
+brackets (its default property).} \\\hline\hline
+
+\verb!property mutable[i: SizeUInt]: T;! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns pointer to i-th element in array. Usefull when you store records.} \\\hline
+
+
+
+\end{longtable}
diff --git a/packages/fcl-stl/doc/dequeexample.pp b/packages/fcl-stl/doc/dequeexample.pp
new file mode 100644
index 0000000000..f24a54111a
--- /dev/null
+++ b/packages/fcl-stl/doc/dequeexample.pp
@@ -0,0 +1,24 @@
+uses gdeque;
+
+type TDequelli = specialize TDeque<longint>;
+
+var Buffer:TDequelli; i:longint;
+
+begin
+ Buffer := TDequelli.Create;
+ {Push 5 elements at the end of array}
+ for i:=1 to 5 do
+ Buffer.PushBack(i);
+ {change 3rd element to 47}
+ Buffer[2] := 47;
+ {pop last element}
+ Buffer.PopBack;
+ {push 3 element to front}
+ for i:=1 to 3 do
+ Buffer.PushFront(i*10);
+ {print all elements}
+ for i:=0 to Buffer.Size-1 do
+ writeln(Buffer[i]);
+
+ Buffer.Destroy;
+end.
diff --git a/packages/fcl-stl/doc/main.tex b/packages/fcl-stl/doc/main.tex
new file mode 100644
index 0000000000..454306a4ee
--- /dev/null
+++ b/packages/fcl-stl/doc/main.tex
@@ -0,0 +1,63 @@
+
+%% Template by Michal Forisek
+
+
+\documentclass[a4paper]{report}
+\usepackage[utf8]{inputenc}
+\usepackage{a4wide}
+\usepackage{tabularx}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+\usepackage{amsmath}
+\usepackage{epsfig}
+\usepackage{color}
+\usepackage{mathrsfs}
+\usepackage{verbatim}
+\usepackage{hyperref}
+\usepackage{subfigure}
+\usepackage{float}
+\usepackage{listings}
+\usepackage{longtable}
+\input{makra.tex}
+
+\renewcommand{\chaptername}{}
+\renewcommand{\thechapter}{}
+
+\begin{document}
+
+\thispagestyle{empty}
+\vfill
+\vfill
+\begin{center}
+\begin{minipage}{0.8\textwidth}
+\hrule
+\bigskip\bigskip
+\centerline{\LARGE\sc FreePascal generic container library}
+\smallskip
+\centerline{(manual)}
+\smallskip
+\centerline{\url{http://code.google.com/p/stlpascal}}
+\bigskip
+\bigskip
+\bigskip\bigskip
+\hrule
+\end{minipage}
+\end{center}
+\vfill
+{~}
+\hfill version 1.0
+\eject % EOP i
+
+\tableofcontents
+
+\input{vector.tex}
+\input{stack.tex}
+\input{deque.tex}
+\input{queue.tex}
+\input{util.tex}
+\input{priorityqueue.tex}
+\input{arrayutils.tex}
+\input{set.tex}
+\input{map.tex}
+
+\end{document}
diff --git a/packages/fcl-stl/doc/makra.tex b/packages/fcl-stl/doc/makra.tex
new file mode 100644
index 0000000000..c1e3419d7d
--- /dev/null
+++ b/packages/fcl-stl/doc/makra.tex
@@ -0,0 +1,263 @@
+% vim: set fdm=marker:
+%% Original by Michal Forisek
+
+
+%% zakladne definicie
+\newcommand{\quoteme}[1]{\clqq#1\crqq}
+\def\todo#1{[{\color{red} TODO:} {\bf #1}]}
+\def\fixme#1{[{\color{red} FIXME:} {\bf #1}]}
+\def\verify#1{\todo{verify: #1}}
+
+\def\xor{\oplus}
+\def\concat{\|}
+%\def\inr{\in_{R}}
+\def\toa #1 {\overset{#1}{\rightarrow}}
+\def\inr{\overset{\$}{\leftarrow}}
+\def\assign{\leftarrow}
+\def\send{\rightarrow}
+\def\isomorph{\cong}
+\def\nsd{NSD}
+\def\union{\cup}
+\newcommand{\unit}[1]{\ensuremath{\, \mathrm{#1}}}
+\DeclareMathOperator{\dlog}{dlog}
+
+\def\compactlist{
+ \setlength{\itemsep}{1pt}
+ \setlength{\parskip}{0pt}
+ \setlength{\parsep}{0pt}
+}
+\def\mod{\,{\rm mod}\,}
+
+%%% original od Misofa:
+%% {{{
+
+\catcode`\@=11
+
+\def\R{{\cal R}}
+\def\cent{{c\kern-0.3em|\kern0.1em}}
+\def\N{{N}} % FIXME FIXME
+
+\let\eps=\varepsilon
+
+\def\relupdown#1#2#3{\mathrel{\mathop{#1}\limits^{#2}_{#3}} }
+
+\let\then=\Rightarrow
+\let\neht=\Leftarrow
+
+\def\krok#1{\relupdown{\Longrightarrow}{}{#1}}
+\def\thenrm{\relupdown{\Longrightarrow}{}{rm}}
+
+\def\bicik{\upharpoonright}
+\def\B{{\mathbf B}}
+\def\kodTS#1{{\tt <}#1{\tt >}}
+
+\newtheorem{definicia}{Definícia}[section]
+\newtheorem{HLPpoznamka}{Poznámka}[section]
+\newtheorem{HLPpriklad}{Príklad}[section]
+\newtheorem{HLPcvicenie}[HLPpriklad]{Cvičenie}
+\newtheorem{zadanie}{Úloha}[section]
+\newenvironment{poznamka}{\begin{HLPpoznamka}\rm}{\end{HLPpoznamka}}
+\newenvironment{priklad}{\begin{HLPpriklad}\rm}{\end{HLPpriklad}}
+\newenvironment{cvicenie}{\begin{HLPcvicenie}\rm}{\end{HLPcvicenie}}
+\newtheorem{veta}{Veta}[section]
+\newtheorem{lema}[veta]{Lema}
+\newtheorem{dosledok}[veta]{Dôsledok}
+\newtheorem{teza}[veta]{Téza}
+% \newtheorem{dokaz}{Dôkaz}[section]
+
+\long\def\odsadene#1{
+\leftskip=\parindent
+\parindent=0pt
+\vskip-5pt
+
+\parskip=5pt
+#1
+\parskip=0pt
+
+\parindent=\leftskip
+\leftskip=0pt
+
+} % end \odsadene
+
+
+
+
+%%%%%%%%%%% PROSTREDIE PRE PISANIE KOMENTAROV
+
+%\newenvironment{komentar}{%
+%\vskip\baselineskip
+%\tabularx{0.95\textwidth}{|X|}
+%\sl
+%}
+%{\endtabularx
+%\vskip\baselineskip
+%}
+
+\newenvironment{komentar}{%
+\vskip\baselineskip\noindent
+\tabularx{\textwidth}{>{\hsize=.2\hsize}X>{\hsize=1.8\hsize}X}
+\sl ~ & \sl
+}
+{\endtabularx
+\vskip\baselineskip
+}
+
+%\newenvironment{komentar}{%
+%\vskip\baselineskip
+%\trivlist\vspace{-4pt}\raggedleft\item\relax\tabularx{0.9\textwidth}{X}\sl}
+%{\endtabularx\vspace{-4pt}\endtrivlist
+%\vskip\baselineskip
+%}
+
+\newenvironment{dokaz}{\trivlist
+ \item[\hskip \labelsep{\bfseries Dôkaz.}]}{\endtrivlist}
+
+%\newenvironment{dokaz}{%
+%\vskip\baselineskip\noindent
+%\tabularx{\textwidth}{||X||}
+%\sl
+%}
+%{\endtabularx
+%\vskip\baselineskip
+%}
+
+%%%%%%%%%%% PROSTREDIE PRE MOJE ITEMIZE
+
+\newenvironment{myitemize}{%
+\begin{itemize}
+\itemsep-3pt
+}
+{\end{itemize}
+}
+
+%%%%%%%%%%% MATICKE MAKRA
+
+\font\tenrm=csr10
+
+\def\eps{\varepsilon}
+% \def\R{{\mathbb R}}
+\def\lvec#1{\overrightarrow{#1}}
+\def\uhol{{\measuredangle}}
+\def\then{\Rightarrow}
+% \def\lg{{\rm lg}}
+\def\lg{\log_2}
+%\def\div{\mathbin{\rm div}}
+\def\div{{\rm div}}
+
+%%%%%%%%%%% PDF
+
+\newif\ifpdf
+\ifx\pdfoutput\undefined
+ \pdffalse
+\else
+ \pdfoutput=1 \pdftrue
+\fi
+
+%%%%%%%%%%% OBRAZKY
+
+\newcommand{\myincludegraphics}[2][]{\includegraphics[#1]{images/#2}}
+
+%%%%%%%%%%% SLOVNICEK
+
+\openout2=\jobname.slo
+
+\newcommand{\definuj}[3][]{%
+\def\tmpvoid{}\def\tmpfirst{#1}%
+\ifx\tmpvoid\tmpfirst%
+ {\sl #2}\label{definicia:#2}\write2{#2 & #3 & \pageref{definicia:#2} \cr}%
+\else%
+ {\sl #2}\label{definicia:#2}\write2{#1 & #3 & \pageref{definicia:#2} \cr}%
+\fi}
+
+\newcommand{\definujsilent}[2]{%
+\label{definicia:#1}\write2{#1 & #2 & \pageref{definicia:#1} \cr}%
+}
+
+\newcommand\myglossary{
+ \immediate\closeout2
+ %\if@twocolumn\@restonecoltrue\onecolumn\else\@restonecolfalse\fi
+ \chapter{Slovníček pojmov}
+ \begin{tabular}{|l|l|r|}
+ \hline
+ {\bfseries slovenský pojem} & {\bfseries anglický preklad} & {\bfseries str.} \\
+ \hline
+ \InputIfFileExists{\jobname.srs}{}{~ & ~ & ~ \\}
+ \hline
+ \end{tabular}
+ %\if@restonecol\twocolumn\fi
+}
+
+%%%%%%%%%%% UVODZOVKY
+
+\catcode`\"=13
+\def "{\begingroup\clqq\def "{\endgroup\crqq}}
+\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~\do\"}
+
+%%%%%%%%%%% DANGER BENDS
+
+\font\manual=manfnt % font used for the METAFONT logo, etc.
+\def\dbend{{\manual\char127}} % dangerous bend sign
+
+\newlength{\bendwidth} \settowidth{\bendwidth}{\dbend} \newlength{\hangwidth}
+
+\def\hangone{%
+ \hangwidth=\bendwidth%
+ \advance\hangwidth 5pt%
+ \hangindent\hangwidth%
+}
+\def\hangtwo{%
+ \hangwidth=\bendwidth%
+ \multiply\hangwidth 2%
+ \advance\hangwidth 6pt%
+ \hangindent\hangwidth%
+}
+
+\def\medbreak{\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi}
+\let\endgraf=\par
+
+\def\d@nger{\medbreak\begingroup\clubpenalty=10000
+%\def\d@nger{\begingroup\clubpenalty=10000
+% \def\par{\endgraf\endgroup\medbreak} \noindent\hangone\hangafter=-2
+ \def\par{\endgraf\endgroup} \noindent\hangone\hangafter=-2
+ \hbox to0pt{\hskip-\hangindent\dbend\hfill}}
+\outer\def\danger{\d@nger}
+
+\def\dd@nger{\medbreak\begingroup\clubpenalty=10000
+% \def\par{\endgraf\endgroup\medbreak} \noindent\hangtwo\hangafter=-2
+ \def\par{\endgraf\endgroup} \noindent\hangtwo\hangafter=-2
+ \hbox to0pt{\hskip-\hangindent\dbend\kern1pt\dbend\hfill}}
+\outer\def\ddanger{\dd@nger}
+
+\def\enddanger{\endgraf\endgroup} % omits the \medbreak
+\def\enddangerhop{\endgraf\endgroup\medbreak}
+
+
+
+
+\def\@nakedcite#1#2{{#1\if@tempswa , #2\fi}}
+\DeclareRobustCommand\nakedcite{%
+ \@ifnextchar [{\@tempswatrue\@nakedcitex}{\@tempswafalse\@nakedcitex[]}}
+\def\@nakedcitex[#1]#2{%
+ \let\@citea\@empty
+ \@nakedcite{\@for\@citeb:=#2\do
+ {\@citea\def\@citea{,\penalty\@m\ }%
+ \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
+ \@ifundefined{b@\@citeb}{\mbox{\reset@font\bfseries ?}%
+ \G@refundefinedtrue
+ \@latex@warning
+ {Citation `\@citeb' on page \thepage \space undefined}}%
+ {\hbox{\csname b@\@citeb\endcsname}} }}{#1}}
+
+\long\def\FIXME#1{
+ \begin{center}
+ \begin{minipage}{0.8\textwidth}
+ {\bf FIXME:~}\sl #1
+ \end{minipage}
+ \end{center}
+}
+
+
+\catcode`\@=12
+%% }}}
diff --git a/packages/fcl-stl/doc/map.tex b/packages/fcl-stl/doc/map.tex
new file mode 100644
index 0000000000..72edbb0e3d
--- /dev/null
+++ b/packages/fcl-stl/doc/map.tex
@@ -0,0 +1,87 @@
+\chapter{TMap}
+
+Implements container for ordered associative array with unique keys.
+Takes 3 arguments for specialization, first one is type of keys, second one is type of values, third
+one is comparator class for keys.
+Usage example:
+
+\lstinputlisting[language=Pascal]{mapexample.pp}
+
+Some methods return type TMSet.PNode. Usefull fields are Data.Key, Data.Value, for retrieving
+actual Key and Value from node. This node can be also used for navigation between elements by methods of set class.
+You can also change value in node (but not key).
+(But don't do anything else with it, you can lose data integrity.)
+
+Memory complexity:
+Size of stored base + constant overhead for each stored element (3 pointers + one boolean).
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty map.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in map.} \\\hline\hline
+
+\verb!procedure Insert(key: TKey; value: TValue)! &
+O(lg N), N is number of elements in map \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts key value pair into map. If key was already there, it will have
+new value assigned.} \\\hline\hline
+
+\verb!procedure Delete(key: TKey)! &
+O(lg N) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Deletes key (and associated value) from map. If element is not in map, nothing happens.} \\\hline\hline
+
+\verb!function Find(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for key in map. If value is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function FindLess(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for greatest element less than key in map. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function FindLessEqual(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for greatest element less or equal than key in map. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function FindGreater(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for smallest element greater than key in map. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function FindGreaterEqual(key: T):TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for smallest element greater or equal than key in map. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type TMSet.PNode), which can be used for retrieving data from map.} \\\hline\hline
+
+\verb!function Min:TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns node containing smallest key of map. If map is empty returns
+nil.} \\\hline\hline
+
+\verb!function Max:TMSet.PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns node containing largest key of map. If map is empty returns
+nil.} \\\hline\hline
+
+\verb!function Next(x:TMSet.PNode):TMSet.PNode! & O(lg N) worst case, but traversal from smallest element to
+largest takes O(N) time \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns successor of x. If x is largest key of map, returns nil.} \\\hline\hline
+
+\verb!function Prev(x:TMSet.PNode):TMSet.PNode! & O(lg N) worst case, but traversal from largest element to
+smallest takes O(N) time \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns predecessor of x. If x is smallest key of map, returns nil.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when map is empty.} \\\hline
+
+\verb!function GetValue(key:TKey):TValue! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns value associated with key. Is key isn't in map crashes.} \\\hline
+
+\verb!property item[i: Key]: TValue; default;! & O(ln N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Property for accessing key i in map. Can be used just by square
+brackets (its default property).} \\\hline\hline
+
+
+\end{longtable}
diff --git a/packages/fcl-stl/doc/mapexample.pp b/packages/fcl-stl/doc/mapexample.pp
new file mode 100644
index 0000000000..679c73b03f
--- /dev/null
+++ b/packages/fcl-stl/doc/mapexample.pp
@@ -0,0 +1,24 @@
+uses gmap, gutil;
+
+type lesslli=specialize TLess<longint>;
+ maplli=specialize TMap<longint, longint, lesslli>;
+
+var data:maplli; i:longint; iterator:maplli.TMSet.PNode;
+
+begin
+ data:=maplli.Create;
+
+ for i:=0 to 10 do
+ data[i]:=10*i;
+
+ {Iteration through elements}
+ iterator:=data.Min;
+ while iterator<>nil do begin
+ writeln(iterator^.Data.Key, ' ', iterator^.Data.Value);
+ iterator:=data.next(iterator);
+ end;
+
+ writeln(data.FindLess(7)^.Data.Value);
+
+ data.Destroy;
+end.
diff --git a/packages/fcl-stl/doc/priorityqueue.tex b/packages/fcl-stl/doc/priorityqueue.tex
new file mode 100644
index 0000000000..192010c030
--- /dev/null
+++ b/packages/fcl-stl/doc/priorityqueue.tex
@@ -0,0 +1,44 @@
+\chapter{TPriorityQueue}
+
+Implements priority queue. It's container which allow insertions of elements and then retrieval of
+the biggest one.
+
+For specialization it needs two arguements. First is the type T of stored element. Second one is type
+comparator class, which should have class function \verb!c(a,b: T):boolean! which return true, when
+a is stricly less then b (or in other words, a should be poped out after b).
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{priorityqueueexample.pp}
+
+Memory complexity:
+Since underlaying structure is TVector, memory complexity is same.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty priority queue.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in priority queue.} \\\hline\hline
+
+\verb!procedure Push(value: T)! & Amortized
+O(lg N), some operations might take O(N) time, when underlaying array needs to be reallocated, but sequence of N
+operations takes O(N lg N) time. \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts element at the back of queue.} \\\hline\hline
+
+\verb!procedure Pop()! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes the biggest element from queue. If queue is empty does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when queue is empty.} \\\hline\hline
+
+\verb!function Top: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns the biggest element from queue.} \\\hline
+
+\end{longtable}
diff --git a/packages/fcl-stl/doc/priorityqueueexample.pp b/packages/fcl-stl/doc/priorityqueueexample.pp
new file mode 100644
index 0000000000..32756bc2d4
--- /dev/null
+++ b/packages/fcl-stl/doc/priorityqueueexample.pp
@@ -0,0 +1,30 @@
+{$mode objfpc}
+
+uses gpriorityqueue;
+
+type
+ lesslli = class
+ public
+ class function c(a,b: longint):boolean;inline;
+ end;
+
+class function lesslli.c(a,b: longint):boolean;inline;
+begin
+ c:=a<b;
+end;
+
+type priorityqueuelli = specialize TPriorityQueue<longint, lesslli>;
+
+var data:priorityqueuelli; i:longint;
+
+begin
+ data:=priorityqueuelli.Create;
+ for i:=1 to 10 do
+ data.Push(random(1000));
+ while not data.IsEmpty do begin
+ writeln(data.Top);
+ data.Pop;
+ end;
+
+ data.Destroy;
+end.
diff --git a/packages/fcl-stl/doc/queue.tex b/packages/fcl-stl/doc/queue.tex
new file mode 100644
index 0000000000..0105a6c1b3
--- /dev/null
+++ b/packages/fcl-stl/doc/queue.tex
@@ -0,0 +1,39 @@
+\chapter{TQueue}
+
+Implements queue.
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{queueexample.pp}
+
+Memory complexity:
+Since underlaying structure is TDeque, memory complexity is same.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty queue.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in queue.} \\\hline\hline
+
+\verb!procedure Push(value: T)! & Amortized
+O(1), some operations might take O(N) time, when array needs to be reallocated, but sequence of N
+operations takes O(N) time \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts element at the back of queue.} \\\hline\hline
+
+\verb!procedure Pop()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the beginning of queue. If queue is empty does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when queue is empty.} \\\hline\hline
+
+\verb!function Front: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns the first element from queue.} \\\hline
+
+\end{longtable}
diff --git a/packages/fcl-stl/doc/queueexample.pp b/packages/fcl-stl/doc/queueexample.pp
new file mode 100644
index 0000000000..1206c9f660
--- /dev/null
+++ b/packages/fcl-stl/doc/queueexample.pp
@@ -0,0 +1,17 @@
+uses gqueue;
+
+type queuelli = specialize TQueue<longint>;
+
+var data:queuelli; i:longint;
+
+begin
+ data:=queuelli.Create;
+ for i:=1 to 10 do
+ data.Push(10*i);
+ while not data.IsEmpty do begin
+ writeln(data.Front);
+ data.Pop;
+ end;
+
+ data.Destroy;
+end.
diff --git a/packages/fcl-stl/doc/set.tex b/packages/fcl-stl/doc/set.tex
new file mode 100644
index 0000000000..2dc006573b
--- /dev/null
+++ b/packages/fcl-stl/doc/set.tex
@@ -0,0 +1,76 @@
+\chapter{TSet}
+
+Implements container for storing ordered set of unique elements.
+Takes 2 arguments for specialization, first one is type of elements, second one is comparator class.
+Usage example:
+
+\lstinputlisting[language=Pascal]{setexample.pp}
+
+Some methods return type of PNode. It has field Data, which can be used for retrieving data from
+that node. This node can be also used for navigation between elements by methods of set class.
+(But don't do anything else with it, you can lose data integrity.)
+
+Memory complexity:
+Size of stored elements + constant overhead for each stored element (3 pointers + one boolean).
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty set.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in set.} \\\hline\hline
+
+\verb!procedure Insert(value: T)! &
+O(lg N), N is number of elements in set \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts element into set.} \\\hline\hline
+
+\verb!procedure Delete(value: T)! &
+O(lg N), N is number of elements in set \\ \hline
+\multicolumn{2}{|m{15cm}|}{Deletes value from set. If element is not in set, nothing happens.} \\\hline\hline
+
+\verb!function Find(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for value in set. If value is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function FindLess(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for greatest element less than value in set. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function FindLessEqual(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for greatest element less or equal than value in set. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function FindGreater(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for smallest element greater than value in set. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function FindGreaterEqual(value: T):PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Searches for smallest element greater or equal than value in set. If such element is not there returns nil. Otherwise
+returns pointer to tree node (type PNode), which can be used for retrieving data from set.} \\\hline\hline
+
+\verb!function Min:PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns node containing smallest element of set. If set is empty returns
+nil.} \\\hline\hline
+
+\verb!function Max:PNode! & O(lg N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns node containing largest element of set. If set is empty returns
+nil.} \\\hline\hline
+
+\verb!function Next(x:PNode):PNode! & O(lg N) worst case, but traversal from smallest element to
+largest takes O(N) time \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns successor of x. If x is largest element of set, returns nil.} \\\hline\hline
+
+\verb!function Prev(x:PNode):PNode! & O(lg N) worst case, but traversal from largest element to
+smallest takes O(N) time \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns predecessor of x. If x is smallest element of set, returns nil.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when set is empty.} \\\hline
+
+\end{longtable}
diff --git a/packages/fcl-stl/doc/setexample.pp b/packages/fcl-stl/doc/setexample.pp
new file mode 100644
index 0000000000..758b1a5245
--- /dev/null
+++ b/packages/fcl-stl/doc/setexample.pp
@@ -0,0 +1,24 @@
+uses gset, gutil;
+
+type lesslli=specialize TLess<longint>;
+ setlli=specialize TSet<longint, lesslli>;
+
+var data:setlli; i:longint; iterator:setlli.PNode;
+
+begin
+ data:=setlli.Create;
+
+ for i:=0 to 10 do
+ data.insert(i);
+
+ {Iteration through elements}
+ iterator:=data.Min;
+ while iterator<>nil do begin
+ writeln(iterator^.Data);
+ iterator:=data.next(iterator);
+ end;
+
+ writeln(data.FindLess(7)^.Data);
+
+ data.Destroy;
+end.
diff --git a/packages/fcl-stl/doc/sortingexample.pp b/packages/fcl-stl/doc/sortingexample.pp
new file mode 100644
index 0000000000..4aa155909d
--- /dev/null
+++ b/packages/fcl-stl/doc/sortingexample.pp
@@ -0,0 +1,20 @@
+uses garrayutils, gutil, gvector;
+
+type vectorlli = specialize TVector<longint>;
+ lesslli = specialize TLess<longint>;
+ sortlli = specialize TOrderingArrayUtils<vectorlli, longint, lesslli>;
+
+var data:vectorlli; n,i:longint;
+
+begin
+ randomize;
+ data:=vectorlli.Create;
+ read(n);
+ for i:=1 to n do
+ data.pushback(random(1000000000));
+ sortlli.sort(data, data.size());
+ for i:=1 to n do
+ writeln(data[i-1]);
+
+ data.Destroy;
+end.
diff --git a/packages/fcl-stl/doc/stack.tex b/packages/fcl-stl/doc/stack.tex
new file mode 100644
index 0000000000..64d11f594c
--- /dev/null
+++ b/packages/fcl-stl/doc/stack.tex
@@ -0,0 +1,39 @@
+\chapter{TStack}
+
+Implements stack.
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{stackexample.pp}
+
+Memory complexity:
+Since underlaying structure is TVector, memory complexity is same.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty stack.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns number of elements in stack.} \\\hline\hline
+
+\verb!procedure Push(value: T)! & Amortized
+O(1), some operations might take O(N) time, when array needs to be reallocated, but sequence of N
+operations takes O(N) time \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts element on the top of stack.} \\\hline\hline
+
+\verb!procedure Pop()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the top of stack. If stack is empty does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when stack is empty} \\\hline\hline
+
+\verb!function Top: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns top element from stack.} \\\hline
+
+\end{longtable}
diff --git a/packages/fcl-stl/doc/stackexample.pp b/packages/fcl-stl/doc/stackexample.pp
new file mode 100644
index 0000000000..31d3bb57e0
--- /dev/null
+++ b/packages/fcl-stl/doc/stackexample.pp
@@ -0,0 +1,17 @@
+uses gstack;
+
+type stacklli = specialize TStack<longint>;
+
+var data:stacklli; i:longint;
+
+begin
+ data:=stacklli.Create;
+ for i:=1 to 10 do
+ data.Push(10*i);
+ while not data.IsEmpty do begin
+ writeln(data.Top);
+ data.Pop;
+ end;
+
+ data.Destroy;
+end.
diff --git a/packages/fcl-stl/doc/util.tex b/packages/fcl-stl/doc/util.tex
new file mode 100644
index 0000000000..7a02f8ac0a
--- /dev/null
+++ b/packages/fcl-stl/doc/util.tex
@@ -0,0 +1,9 @@
+\chapter{TLess, TGreater}
+
+Comparators classes. Can be used in PriorityQueue and Sorting as comparator functions.
+TLess is used for ordering from smallest element to largest, TGreater is used for oposite ordering.
+
+%Usage example:
+
+%\lstinputlisting[language=Pascal]{queueexample.pp}
+
diff --git a/packages/fcl-stl/doc/vector.tex b/packages/fcl-stl/doc/vector.tex
new file mode 100644
index 0000000000..c0097262d3
--- /dev/null
+++ b/packages/fcl-stl/doc/vector.tex
@@ -0,0 +1,73 @@
+\chapter{TVector}
+
+Implements selfresizing array. Indexing is 0-based.
+
+Usage example:
+
+\lstinputlisting[language=Pascal]{vectorexample.pp}
+
+Memory complexity:
+Uses at most 3times bigger memory than maximal array size (this is only case during reallocation).
+Normal consumption is at most twice as maximal array size.
+
+Members list:
+
+\begin{longtable}{|m{10cm}|m{5cm}|}
+\hline
+Method & Complexity guarantees \\ \hline
+\multicolumn{2}{|m{15cm}|}{Description} \\ \hline\hline
+
+\verb!Create! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Constructor. Creates empty array.} \\ \hline\hline
+
+\verb!function Size(): SizeUInt! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns size of array.} \\\hline\hline
+
+\verb!procedure PushBack(value: T)! & Amortized
+O(1), some operations might take O(N) time, when array needs to be reallocated, but sequence of N
+operations takes O(N) time \\ \hline
+\multicolumn{2}{|m{15cm}|}{Inserts at the end of array (increases size by 1)} \\\hline\hline
+
+\verb!procedure PopBack()! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Removes element from the end of array (decreases size by 1). When array
+is empty, does nothing.} \\\hline\hline
+
+\verb!function IsEmpty(): boolean! & O(1) \\ \hline
+\multicolumn{2}{|m{15cm}|}{Returns true when array is empty} \\\hline\hline
+
+\verb!procedure Insert(position: SizeUInt; value: T)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Inserts value at position. When position is greater than size, puts value
+at the end of array.} \\\hline\hline
+
+\verb!procedure Erase(positine: SizeUInt; value: T)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Erases element from position. When position is outside of array does
+nothing.} \\\hline\hline
+
+\verb!procedure Clear! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Clears array (set size to zero). But doesn't free memory used by array.}
+\\\hline\hline
+
+\verb!function Front: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns first element from array.} \\\hline\hline
+
+\verb!function Back: T! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns last element from array.} \\\hline\hline
+
+\verb!procedure Resize(num: SizeUInt)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Changes size of array to num. Doesn't guarantte anything about value of
+newly alocated elements.} \\\hline\hline
+
+\verb!procedure Reserve(num: SizeUInt)! & O(N) \\\hline
+\multicolumn{2}{|m{15cm}|}{Alocates at least num elements for array. Usefull when you want to
+pushback big number of elements and want to avoid frequent reallocation.} \\\hline\hline
+
+\verb!property item[i: SizeUInt]: T; default;! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Property for accessing i-th element in array. Can be used just by square
+brackets (its default property).} \\\hline\hline
+
+\verb!property mutable[i: SizeUInt]: T;! & O(1) \\\hline
+\multicolumn{2}{|m{15cm}|}{Returns pointer to i-th element in array. Usefull when you store records.} \\\hline
+
+
+
+\end{longtable}
diff --git a/packages/fcl-stl/doc/vectorexample.pp b/packages/fcl-stl/doc/vectorexample.pp
new file mode 100644
index 0000000000..5b0e4eba0f
--- /dev/null
+++ b/packages/fcl-stl/doc/vectorexample.pp
@@ -0,0 +1,21 @@
+uses gvector;
+
+type TVectorlli = specialize TVector<longint>;
+
+var Buffer:TVectorlli; i:longint;
+
+begin
+ Buffer := TVectorlli.Create;
+ {Push 5 elements at the end of array}
+ for i:=1 to 5 do
+ Buffer.PushBack(i);
+ {change 3rd element to 47}
+ Buffer[2] := 47;
+ {pop last element}
+ Buffer.PopBack;
+ {print all elements}
+ for i:=0 to Buffer.Size-1 do
+ writeln(Buffer[i]);
+
+ Buffer.Destroy;
+end.
diff --git a/packages/fcl-stl/src/garrayutils.pp b/packages/fcl-stl/src/garrayutils.pp
new file mode 100644
index 0000000000..f9773b63db
--- /dev/null
+++ b/packages/fcl-stl/src/garrayutils.pp
@@ -0,0 +1,254 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit garrayutils;
+
+interface
+
+const MaxDepth=60;
+const InsertSortThreshold=16;
+
+{TCompare is comparing class, which should have class method c(a,b:TValue):boolean, which returns true if a is less than b}
+type
+ generic TOrderingArrayUtils<TArr, Tvalue, TCompare>=class
+ private
+ class procedure Sortrange(var Arr:TArr; Start,Fin,d:SizeUInt);
+ class procedure HeapSort(var Arr:TArr; Start,Fin:SizeUInt);
+ class procedure InsertSort(var Arr:TArr; Start,Fin:SizeUInt);
+ class function Left(a:SizeUInt):SizeUInt;inline;
+ class function Right(a:SizeUInt):SizeUInt;inline;
+ class procedure Heapify(var Arr: TArr; Position:SizeUInt; Start,Fin:SizeUInt);
+ class function Parent(a:SizeUInt):SizeUInt;inline;
+ public
+ class procedure Sort(var Arr: TArr; size:SizeUInt);
+ class function NextPermutation(var Arr: TArr; size:SizeUInt):boolean;
+ end;
+
+ generic TArrayUtils<TArr, Tvalue>=class
+ public
+ class procedure RandomShuffle(Arr: TArr; size: SizeUInt);
+ end;
+
+implementation
+
+class function TOrderingArrayUtils.Left(a:SizeUInt):SizeUInt;inline;
+begin
+ Left:=((a+1)shl 1)-1;
+end;
+
+class function TOrderingArrayUtils.Right(a:SizeUInt):SizeUInt;inline;
+begin
+ Right:=(a+1) shl 1;
+end;
+
+class function TOrderingArrayUtils.Parent(a:SizeUInt):SizeUInt;inline;
+begin
+ Parent:=(a-1)shr 1;
+end;
+
+class procedure TOrderingArrayUtils.Heapify(var Arr: TArr; Position:SizeUInt; Start,Fin:SizeUInt);
+var mpos,l,r:SizeUInt; temp:TValue;
+begin
+ while(true) do
+ begin
+ mpos:=Position;
+ l:=Left(Position-Start)+Start;
+ r:=Right(Position-Start)+Start;
+ if (l<Fin) AND (TCompare.c(Arr[mpos],Arr[l])) then
+ mpos:=l;
+ if (r<Fin) AND (TCompare.c(Arr[mpos],Arr[r])) then
+ mpos:=r;
+ if mpos = Position then break;
+
+ temp:=Arr[Position];
+ Arr[Position]:=Arr[mpos];
+ Arr[mpos]:=temp;
+ Position:=mpos;
+ end;
+end;
+
+class procedure TOrderingArrayUtils.Sort(var Arr:TArr; size:SizeUInt);inline;
+begin
+ Sortrange(Arr,0,size,0);
+ InsertSort(Arr,0,size);
+end;
+
+class procedure TOrderingArrayUtils.Sortrange(var Arr:TArr; Start,Fin,d:SizeUInt);
+var pivot,temp:Tvalue; i,j,k,l:SizeUInt;
+begin
+ if (Fin-Start) <= InsertSortThreshold then
+ begin
+ InsertSort(Arr,Start,Fin);
+ exit;
+ end;
+ if d>=maxdepth then
+ begin
+ HeapSort(Arr, Start, Fin);
+ exit;
+ end;
+{median of 3}
+ j:=Start;
+ k:=Fin-1;
+ l:=(Start+Fin)div 2;
+ if(TCompare.c(Arr[j],Arr[k])) and (TCompare.c(Arr[j],Arr[l])) then
+ begin
+ if(TCompare.c(Arr[k],Arr[l])) then
+ begin
+ temp:=Arr[k];
+ Arr[k]:=Arr[j];
+ Arr[j]:=temp;
+ end else
+ begin
+ temp:=Arr[l];
+ Arr[l]:=Arr[j];
+ Arr[j]:=temp;
+ end;
+ end
+ else if(TCompare.c(Arr[k],Arr[j])) and (TCompare.c(Arr[l],Arr[j])) then
+ begin
+ if(TCompare.c(Arr[l],Arr[k])) then
+ begin
+ temp:=Arr[k];
+ Arr[k]:=Arr[j];
+ Arr[j]:=temp;
+ end else
+ begin
+ temp:=Arr[l];
+ Arr[l]:=Arr[j];
+ Arr[j]:=temp;
+ end;
+ end;
+
+{partition}
+ pivot:=Arr[Start];
+
+ i:=Start-1;
+ j:=Fin;
+ repeat
+ repeat
+ dec(j);
+ until (not (TCompare.c(pivot,Arr[j])));
+
+
+ repeat
+ inc(i);
+ until (not (TCompare.c(Arr[i],pivot)));
+ if(i < j) then
+ begin
+ temp:=Arr[i];
+ Arr[i]:=Arr[j];
+ Arr[j]:=temp;
+ end;
+ until (i>=j);
+
+ Sortrange(Arr, Start, j+1, d+1);
+ Sortrange(Arr, j+1, Fin, d+1);
+end;
+
+class procedure TOrderingArrayUtils.InsertSort(var Arr:TArr; Start,Fin:SizeUInt);inline;
+var i,j:SizeUInt; temp:Tvalue;
+begin
+ for i:=Start+1 to Fin-1 do
+ begin
+ j:=i;
+ temp:=Arr[i];
+ while (j>0) and (TCompare.c(temp,Arr[j-1])) do
+ begin
+ Arr[j]:=Arr[j-1];
+ dec(j);
+ end;
+ Arr[j]:=temp;
+ end;
+end;
+
+class procedure TOrderingArrayUtils.HeapSort(var Arr: TArr; Start,Fin:SizeUInt);
+var i,cur,next,l,r,size:SizeUInt; temp:Tvalue;
+begin
+{buildHeap}
+ size:=Fin-Start;
+ for i:=((size div 2)-1) downto 0 do
+ Heapify(Arr, i+Start, Start, Fin);
+{bottomup HeapSort}
+ for i:=size-1 downto 1 do
+ begin
+ Fin:=Fin-1;
+ cur:=Start;
+ temp:=Arr[Start];
+ while(true) do
+ begin
+ l:=Left(cur-Start)+Start;
+ if l>=Fin then
+ break;
+ next:=l;
+ r:=Right(cur-Start)+Start;
+ if (r<Fin) AND (TCompare.c(Arr[l],Arr[r])) then
+ next:=r;
+ Arr[cur]:=Arr[next];
+ cur:=next;
+ end;
+ Arr[cur]:=temp;
+ temp:=Arr[i+Start];
+ Arr[i+Start]:=Arr[cur];
+ Arr[cur]:=temp;
+ l:=Parent(cur-Start)+Start;
+ while (cur <> 0) AND (TCompare.c(Arr[l],Arr[cur])) do
+ begin
+ temp:=Arr[cur];
+ Arr[cur]:=Arr[l];
+ Arr[l]:=temp;
+ cur:=l;
+ l:=Parent(cur-Start)+Start;
+ end;
+ end;
+end;
+
+class function TOrderingArrayUtils.NextPermutation(var Arr: TArr; size: SizeUInt):boolean;
+var i,f:SizeUInt; temp:TValue;
+begin
+ f := -1;
+ for i:=size-1 downto 1 do begin
+ if (TCompare.c(arr[i-1], arr[i])) then begin
+ f := i-1;
+ break;
+ end;
+ end;
+ if f = -1 then exit(false);
+ for i:=size-1 downto 1 do begin
+ if (TCompare.c(arr[f], arr[i])) then begin
+ temp:=arr[f]; arr[f] := arr[i]; arr[i] := temp;
+ break;
+ end;
+ end;
+ i:= size-1;
+ inc(f);
+ while (i > f) do begin
+ temp:=arr[f]; arr[f] := arr[i]; arr[i] := temp;
+ dec(i); inc(f);
+ end;
+ NextPermutation := true;
+end;
+
+class procedure TArrayUtils.RandomShuffle(Arr: TArr; size: SizeUInt);
+var i,r:SizeUInt; temp:Tvalue;
+begin
+ for i:=size-1 downto 1 do begin
+ r:=random(Int64(i));
+ temp:=Arr[r];
+ Arr[r]:=Arr[i];
+ Arr[i]:=temp;
+ end;
+end;
+
+
+end.
diff --git a/packages/fcl-stl/src/gdeque.pp b/packages/fcl-stl/src/gdeque.pp
new file mode 100644
index 0000000000..f83956f3c5
--- /dev/null
+++ b/packages/fcl-stl/src/gdeque.pp
@@ -0,0 +1,204 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit gdeque;
+
+interface
+
+type
+ generic TDeque<T>=class
+ private
+ type
+ PT=^T;
+ TArr=array of T;
+ var
+ FData:TArr;
+ FDataSize:SizeUInt;
+ FCapacity:SizeUInt;
+ FStart:SizeUInt;
+ procedure SetValue(position:SizeUInt; value:T);inline;
+ function GetValue(position:SizeUInt):T;inline;
+ function GetMutable(position:SizeUInt):PT;inline;
+ procedure IncreaseCapacity();inline;
+ public
+ function Size():SizeUInt;inline;
+ constructor Create();
+ procedure PushBack(value:T);inline;
+ procedure PushFront(value:T);inline;
+ procedure PopBack();inline;
+ procedure PopFront();inline;
+ function Front():T;inline;
+ function Back():T;inline;
+ function IsEmpty():boolean;inline;
+ procedure Reserve(cap:SizeUInt);inline;
+ procedure Resize(cap:SizeUInt);inline;
+ procedure Insert(Position:SizeUInt; Value:T);inline;
+ procedure Erase(Position:SIzeUInt);inline;
+ property Items[i : SizeUInt]: T read GetValue write SetValue; default;
+ property Mutable[i : SizeUInt]:PT read GetMutable;
+end;
+
+implementation
+
+constructor TDeque.Create();
+begin
+ FDataSize:=0;
+ FCapacity:=0;
+ FStart:=0;
+end;
+
+function TDeque.Size():SizeUInt;inline;
+begin
+ Size:=FDataSize;
+end;
+
+function TDeque.IsEmpty():boolean;inline;
+begin
+ if Size()=0 then
+ IsEmpty:=true
+ else
+ IsEmpty:=false;
+end;
+
+procedure TDeque.PushBack(value:T);inline;
+begin
+ if(FDataSize=FCapacity) then
+ IncreaseCapacity;
+ FData[(FStart+FDataSize)mod FCapacity]:=value;
+ inc(FDataSize);
+end;
+
+procedure TDeque.PopFront();inline;
+begin
+ if(FDataSize>0) then
+ begin
+ inc(FStart);
+ dec(FDataSize);
+ if(FStart=FCapacity) then
+ FStart:=0;
+ end;
+end;
+
+procedure TDeque.PopBack();inline;
+begin
+ if(FDataSize>0) then
+ dec(FDataSize);
+end;
+
+procedure TDeque.PushFront(value:T);inline;
+begin
+ if(FDataSize=FCapacity) then
+ IncreaseCapacity;
+ if(FStart=0) then
+ FStart:=FCapacity-1
+ else
+ dec(FStart);
+ FData[FStart]:=value;
+ inc(FDataSize);
+end;
+
+function TDeque.Front():T;inline;
+begin
+ Assert(size > 0, 'Accessing empty deque');
+ Front:=FData[FStart];
+end;
+
+function TDeque.Back():T;inline;
+begin
+ Assert(size > 0, 'Accessing empty deque');
+ Back:=FData[(FStart+FDataSize-1)mod FCapacity];
+end;
+
+procedure TDeque.SetValue(position:SizeUInt; value:T);inline;
+begin
+ Assert(position < size, 'Deque access out of range');
+ FData[(FStart+position)mod FCapacity]:=value;
+end;
+
+function TDeque.GetValue(position:SizeUInt):T;inline;
+begin
+ Assert(position < size, 'Deque access out of range');
+ GetValue:=FData[(FStart+position) mod FCapacity];
+end;
+
+function TDeque.GetMutable(position:SizeUInt):PT;inline;
+begin
+ Assert(position < size, 'Deque access out of range');
+ GetMutable:=@FData[(FStart+position) mod FCapacity];
+end;
+
+procedure TDeque.IncreaseCapacity;inline;
+var i,OldEnd:SizeUInt;
+begin
+ OldEnd:=FCapacity;
+ if(FCapacity=0) then
+ FCapacity:=1
+ else
+ FCapacity:=FCapacity*2;
+ SetLength(FData, FCapacity);
+ if (FStart>0) then
+ for i:=0 to FStart-1 do
+ FData[OldEnd+i]:=FData[i];
+end;
+
+procedure TDeque.Reserve(cap:SizeUInt);inline;
+var i,OldEnd:SizeUInt;
+begin
+ if(cap<FCapacity) then
+ exit
+ else if(cap<=2*FCapacity) then
+ IncreaseCapacity
+ else
+ begin
+ OldEnd:=FCapacity;
+ FCapacity:=cap;
+ SetLength(FData, FCapacity);
+ if FStart > 0 then
+ for i:=0 to FStart-1 do
+ FData[OldEnd+i]:=FData[i];
+ end;
+end;
+
+procedure TDeque.Resize(cap:SizeUInt);inline;
+begin
+ Reserve(cap);
+ FDataSize:=cap;
+end;
+
+procedure TDeque.Insert(Position:SizeUInt; Value: T);inline;
+var i:SizeUInt;
+begin
+ pushBack(Value);
+ for i:=Size-1 downto Position+1 do
+ begin
+ Items[i]:=Items[i-1];
+ end;
+ Items[Position]:=Value;
+end;
+
+procedure TDeque.Erase(Position:SizeUInt);inline;
+var i:SizeUInt;
+begin
+ if Position <= Size then
+ begin
+ for i:=Position to Size-2 do
+ begin
+ Items[i]:=Items[i+1];
+ end;
+ popBack();
+ end;
+end;
+
+
+end.
diff --git a/packages/fcl-stl/src/gmap.pp b/packages/fcl-stl/src/gmap.pp
new file mode 100644
index 0000000000..fb64db26b5
--- /dev/null
+++ b/packages/fcl-stl/src/gmap.pp
@@ -0,0 +1,163 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit gmap;
+
+interface
+
+uses gset;
+
+type
+ generic TMapCompare<TPair, TKeyCompare>=class
+ class function c(a,b :TPair):boolean;
+ end;
+
+ generic TMap<TKey, TValue, TCompare>=class
+ public
+ type
+ TPair=record
+ Value:TValue;
+ Key:TKey;
+ end;
+ TMCompare = specialize TMapCompare<TPair, TCompare>;
+ TMSet = specialize TSet<TPair, TMCompare>;
+ PTValue = ^TValue;
+ PTPair = ^TPair;
+ var
+ private
+ FSet:TMSet;
+ public
+ function Find(key:TKey):TMSet.PNode;inline;
+ function FindLess(key:TKey):TMSet.PNode;inline;
+ function FindLessEqual(key:TKey):TMSet.PNode;inline;
+ function FindGreater(key:TKey):TMSet.PNode;inline;
+ function FindGreaterEqual(key:TKey):TMSet.PNode;inline;
+ function GetValue(key:TKey):TValue;inline;
+ procedure Insert(key:TKey; value:TValue);inline;
+ function Min:TMSet.PNode;inline;
+ function Max:TMSet.PNode;inline;
+ function Next(x:TMSet.PNode):TMSet.PNode;inline;
+ function Prev(x:TMSet.PNode):TMSet.PNode;inline;
+ procedure Delete(key:TKey);inline;
+ function Size:SizeUInt;inline;
+ function IsEmpty:boolean;inline;
+ constructor Create;
+ destructor Destroy;override;
+ property Items[i : TKey]: TValue read GetValue write Insert; default;
+ end;
+
+implementation
+
+class function TMapCompare.c(a,b: TPair):boolean;
+begin
+ c:= TKeyCompare.c(a.Key, b.Key);
+end;
+
+constructor TMap.Create;
+begin
+ FSet:=TMSet.Create;
+end;
+
+destructor TMap.Destroy;
+begin
+ FSet.Destroy;
+end;
+
+procedure TMap.Delete(key:TKey);inline;
+var Pair:TPair;
+begin
+ Pair.Key:=key;
+ FSet.Delete(Pair);
+end;
+
+function TMap.Find(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+ Pair.Key:=key;
+ Find:=FSet.Find(Pair);
+end;
+
+function TMap.FindLess(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+ Pair.Key:=key;
+ FindLess:=FSet.FindLess(Pair);
+end;
+
+function TMap.FindLessEqual(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+ Pair.Key:=key;
+ FindLessEqual:=FSet.FindLessEqual(Pair);
+end;
+
+function TMap.FindGreater(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+ Pair.Key:=key;
+ FindGreater:=FSet.FindGreater(Pair);
+end;
+
+function TMap.FindGreaterEqual(key:TKey):TMSet.PNode;inline;
+var Pair:TPair;
+begin
+ Pair.Key:=key;
+ FindGreaterEqual:=FSet.FindGreaterEqual(Pair);
+end;
+
+function TMap.GetValue(key:TKey):TValue;inline;
+var Pair:TPair;
+begin
+ Pair.Key:=key;
+ GetValue:=FSet.Find(Pair)^.Data.Value;
+end;
+
+procedure TMap.Insert(key:TKey; value:TValue);inline;
+var Pair:TPair;
+begin
+ Pair.Key:=key;
+ FSet.Insert(Pair)^.Data.Value := value;
+end;
+
+function TMap.Min:TMSet.PNode;inline;
+begin
+ Min:=FSet.Min;
+end;
+
+function TMap.Max:TMSet.PNode;inline;
+begin
+ Max:=FSet.Max;
+end;
+
+function TMap.Next(x:TMSet.PNode):TMSet.PNode;inline;
+begin
+ Next:=FSet.Next(x);
+end;
+
+function TMap.Prev(x:TMSet.PNode):TMSet.PNode;inline;
+begin
+ Prev:=FSet.Prev(x);
+end;
+
+function TMap.Size:SizeUInt;inline;
+begin
+ Size:=FSet.Size;
+end;
+
+function TMap.IsEmpty:boolean;inline;
+begin
+ IsEmpty:=FSet.IsEmpty;
+end;
+
+end.
diff --git a/packages/fcl-stl/src/gpriorityqueue.pp b/packages/fcl-stl/src/gpriorityqueue.pp
new file mode 100644
index 0000000000..7aa3d32cbc
--- /dev/null
+++ b/packages/fcl-stl/src/gpriorityqueue.pp
@@ -0,0 +1,141 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit gpriorityqueue;
+
+interface
+
+uses gvector;
+
+{TCompare is comparing class, which should have class method c(a,b:T):boolean, which returns true is a is less than b}
+
+type
+ generic TPriorityQueue<T, TCompare>=class
+ private
+ type
+ TContainer=specialize TVector<T>;
+ var
+ FData:TContainer;
+
+ procedure PushUp(position:SizeUInt);
+ function Left(a:SizeUInt):SizeUInt;inline;
+ function Right(a:SizeUInt):SizeUInt;inline;
+ procedure Heapify(position:SizeUInt);
+ function Parent(a:SizeUInt):SizeUInt;inline;
+ public
+ constructor Create;
+ destructor Destroy;override;
+ function Top:T;inline;
+ procedure Pop;inline;
+ procedure Push(value:T);inline;
+ function Size:SizeUInt;inline;
+ function IsEmpty:boolean;inline;
+ end;
+
+implementation
+
+constructor TPriorityQueue.Create;
+begin
+ FData:=TContainer.Create;
+end;
+
+destructor TPriorityQueue.Destroy;
+begin;
+ FData.Destroy;
+end;
+
+function TPriorityQueue.Size:SizeUInt;inline;
+begin
+ Size:=FData.Size;
+end;
+
+function TPriorityQueue.IsEmpty:boolean;inline;
+begin
+ IsEmpty:=FData.Size=0;
+end;
+
+function TPriorityQueue.Top:T;inline;
+begin
+ Top:=FData[0];
+end;
+
+procedure TPriorityQueue.Pop;inline;
+begin
+ if not IsEmpty then begin
+ FData[0]:=FData.back;
+ FData.PopBack;
+ Heapify(0);
+ end;
+end;
+
+procedure TPriorityQueue.PushUp(position:SizeUInt);
+var np:SizeUInt; temp:T;
+begin
+ while(position>0) do
+ begin
+ np := Parent(position);
+ if(TCompare.c(FData[np],FData[position])) then
+ begin
+ temp:=FData[np];
+ FData[np]:=FData[position];
+ FData[position]:=temp;
+ position:=np;
+ end else
+ break;
+ end;
+end;
+
+procedure TPriorityQueue.Push(value:T);inline;
+begin
+ FData.PushBack(value);
+ PushUp(FData.Size-1);
+end;
+
+function TPriorityQueue.Left(a:SizeUInt):SizeUInt;inline;
+begin
+ Left:=((a+1)shl 1)-1;
+end;
+
+function TPriorityQueue.Right(a:SizeUInt):SizeUInt;inline;
+begin
+ Right:=(a+1) shl 1;
+end;
+
+function TPriorityQueue.Parent(a:SizeUInt):SizeUInt;inline;
+begin
+ Parent:=(a-1)shr 1;
+end;
+
+procedure TPriorityQueue.Heapify(position:SizeUInt);
+var mpos,l,r:SizeUInt; temp:T;
+begin
+ while(true) do
+ begin
+ mpos:=position;
+ l:=Left(position);
+ r:=Right(position);
+ if (l<FData.Size) AND (TCompare.c(FData[mpos],FData[l])) then
+ mpos:=l;
+ if (r<FData.Size) AND (TCompare.c(FData[mpos],FData[r])) then
+ mpos:=r;
+ if mpos = position then break;
+
+ temp:=FData[position];
+ FData[position]:=FData[mpos];
+ FData[mpos]:=temp;
+ position:=mpos;
+ end;
+end;
+
+end.
diff --git a/packages/fcl-stl/src/gqueue.pp b/packages/fcl-stl/src/gqueue.pp
new file mode 100644
index 0000000000..a56aef4e47
--- /dev/null
+++ b/packages/fcl-stl/src/gqueue.pp
@@ -0,0 +1,75 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit gqueue;
+
+interface
+
+uses gdeque;
+
+type
+ generic TQueue<T>=class
+ private
+ type
+ TContainer = specialize TDeque<T>;
+ var
+ FData:TContainer;
+ public
+ procedure Push(value:T);inline;
+ procedure Pop();inline;
+ function Front():T;inline;
+ function Size():SizeUInt;inline;
+ function IsEmpty():boolean;inline;
+ constructor Create;
+ destructor Destroy;override;
+end;
+
+implementation
+
+constructor TQueue.Create;
+begin
+ FData:=TContainer.Create;
+end;
+
+destructor TQueue.Destroy;
+begin
+ FData.Destroy;
+end;
+
+procedure TQueue.Push(value:T);inline;
+begin
+ FData.PushBack(value);
+end;
+
+procedure TQueue.Pop();inline;
+begin
+ FData.PopFront;
+end;
+
+function TQueue.Front:T;inline;
+begin
+ Front:=FData.Front;
+end;
+
+function TQueue.Size:SizeUInt;inline;
+begin
+ Size:=FData.Size;
+end;
+
+function TQueue.IsEmpty:boolean;inline;
+begin
+ IsEmpty:=FData.IsEmpty;
+end;
+
+end.
diff --git a/packages/fcl-stl/src/gset.pp b/packages/fcl-stl/src/gset.pp
new file mode 100644
index 0000000000..01f2937644
--- /dev/null
+++ b/packages/fcl-stl/src/gset.pp
@@ -0,0 +1,423 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit gset;
+
+interface
+
+const RED=true;
+const BLACK=false;
+
+type
+ generic TSet<T, TCompare>=class
+ public
+ type
+ PNode=^Node;
+ Node=record
+ Data:T;
+ Left,Right:PNode;
+ Parent:PNode;
+ Color:boolean;
+ end;
+ var
+ private
+ FBase:PNode;
+ FSize:SizeUInt;
+
+ function CreateNode(Data:T):PNode;inline;
+ procedure DestroyNodeAndChilds(nod:PNode);
+ procedure DestroyNode(nod:PNode);
+ function RotateRight(nod:PNode):PNode;inline;
+ function RotateLeft(nod:PNode):PNode;inline;
+ procedure FlipColors(nod:PNode);inline;
+ function IsRed(nod:PNode):boolean;inline;
+ function Insert(value:T; nod:PNode; var position:PNode):PNode;
+ function FixUp(nod:PNode):PNode;inline;
+ function MoveRedLeft(nod:PNode):PNode;inline;
+ function MoveRedRight(nod:PNode):PNode;inline;
+ function DeleteMin(nod:PNode):PNode;
+ function Delete(value:T; nod:PNode):PNode;
+ function Min(nod:PNode):PNode;inline;
+
+ public
+ function Find(value:T):PNode;inline;
+ function FindLess(value:T):PNode;inline;
+ function FindLessEqual(value:T):PNode;inline;
+ function FindGreater(value:T):PNode;inline;
+ function FindGreaterEqual(value:T):PNode;inline;
+ function Insert(value:T):PNode;inline;
+ function Min:PNode;inline;
+ function Max:PNode;inline;
+ function Next(x:PNode):PNode;inline;
+ function Prev(x:PNode):PNode;inline;
+ procedure Delete(value:T);inline;
+ public constructor Create;
+ public destructor Destroy;override;
+ function Size:SizeUInt;
+ function IsEmpty:boolean;
+ end;
+
+implementation
+
+constructor TSet.Create;
+begin
+ FBase:=nil;
+ FSize:=0;
+end;
+
+destructor TSet.Destroy;
+begin
+ DestroyNodeAndChilds(FBase);
+end;
+
+function TSet.Size:SizeUInt;
+begin
+ Size:=FSize;
+end;
+
+function TSet.IsEmpty:boolean;
+begin
+ IsEmpty := FSize=0;
+end;
+
+procedure TSet.DestroyNodeAndChilds(nod:PNode);
+begin
+ if nod = nil then exit;
+ DestroyNodeAndChilds(nod^.left);
+ DestroyNodeAndChilds(nod^.right);
+ DestroyNode(nod);
+end;
+
+procedure TSet.DestroyNode(nod:PNode);
+begin
+ Finalize(nod^.Data);
+ dispose(nod);
+ dec(FSize);
+end;
+
+function TSet.CreateNode(Data:T):PNode;inline;
+var temp:PNode;
+begin
+ temp:=new(PNode);
+ Initialize(temp^.Data);
+ temp^.Data:=Data;
+ temp^.Left:=nil;
+ temp^.Right:=nil;
+ temp^.Parent:=nil;
+ temp^.Color:=RED;
+ inc(FSize);
+ CreateNode:=temp;
+end;
+
+function TSet.RotateRight(nod:PNode):PNode;inline;
+var temp:PNode;
+begin
+ temp:=nod^.Left;
+
+ temp^.Parent:=nod^.Parent;
+ nod^.Parent:=temp;
+
+ nod^.Left:=temp^.Right;
+ temp^.Right:=nod;
+
+ if(nod^.Left<>nil) then nod^.Left^.Parent:=nod;
+
+ temp^.Color:=nod^.Color;
+ nod^.Color:=RED;
+ exit(temp);
+end;
+
+function TSet.RotateLeft(nod:PNode):PNode;inline;
+var temp:PNode;
+begin
+ temp:=nod^.Right;
+
+ temp^.Parent:=nod^.Parent;
+ nod^.Parent:=temp;
+
+ nod^.Right:=temp^.Left;
+ temp^.Left:=nod;
+
+ if(nod^.Right<>nil) then nod^.Right^.Parent:=nod;
+
+ temp^.Color:=nod^.Color;
+ nod^.Color:=RED;
+ exit(temp);
+end;
+
+procedure TSet.FlipColors(nod:PNode);inline;
+begin
+ nod^.Color:= not nod^.Color;
+ nod^.Left^.Color := not nod^.Left^.Color;
+ nod^.Right^.Color := not nod^.Right^.Color;
+end;
+
+
+function TSet.FixUp(nod:PNode):PNode;inline;
+begin
+ if(IsRed(nod^.Right)) and (not IsRed(nod^.Left)) then nod := rotateLeft(nod);
+ if(IsRed(nod^.Left)) and (IsRed(nod^.Left^.Left)) then nod := rotateRight(nod);
+ if(IsRed(nod^.Right)) and (IsRed(nod^.Left)) then flipColors(nod);
+ FixUp:=nod;
+end;
+
+function TSet.MoveRedLeft(nod:PNode):PNode;inline;
+begin
+ flipColors(nod);
+ if (IsRed(nod^.Right^.Left)) then begin
+ nod^.Right := rotateRight(nod^.Right);
+ nod := rotateLeft(nod);
+ flipColors(nod);
+ end;
+ MoveRedLeft:=nod;
+end;
+
+function TSet.MoveRedRight(nod:PNode):PNode;inline;
+begin
+ flipColors(nod);
+ if (IsRed(nod^.Left^.Left)) then begin
+ nod := rotateRight(nod);
+ flipColors(nod);
+ end;
+ MoveRedRight:=nod;
+end;
+
+function TSet.DeleteMin(nod:PNode):PNode;
+begin
+ if (nod^.Left = nil) then begin
+ DestroyNode(nod);
+ exit(nil);
+ end;
+
+ if ((not IsRed(nod^.Left)) and (not IsRed(nod^.Left^.Left))) then nod := MoveRedLeft(nod);
+
+ nod^.Left := DeleteMin(nod^.Left);
+
+ exit(FixUp(nod));
+end;
+
+function TSet.Delete(value:T; nod:PNode):PNode;
+begin
+ if (TCompare.c(value, nod^.Data)) then begin
+ if (nod^.Left=nil) then exit(nod);
+ if ((not IsRed(nod^.Left)) and ( not IsRed(nod^.Left^.Left))) then
+ nod := MoveRedLeft(nod);
+ nod^.Left := Delete(value, nod^.Left);
+ end
+ else begin
+ if (IsRed(nod^.Left)) then begin
+ nod := rotateRight(nod);
+ end;
+ if ((not TCompare.c(value,nod^.Data)) and (not TCompare.c(nod^.Data,value)) and (nod^.Right = nil)) then
+ begin
+ DestroyNode(nod);
+ exit(nil);
+ end;
+ if (nod^.Right=nil) then exit(nod);
+ if ((not IsRed(nod^.Right)) and (not IsRed(nod^.Right^.Left))) then nod := MoveRedRight(nod);
+ if ((not TCompare.c(value,nod^.Data)) and (not TCompare.c(nod^.Data,value))) then begin
+ nod^.Data := Min(nod^.Right)^.Data;
+ nod^.Right := DeleteMin(nod^.Right);
+ end
+ else nod^.Right := Delete(value, nod^.Right);
+ end;
+ exit(FixUp(nod));
+end;
+
+procedure TSet.Delete(value:T);inline;
+begin
+ if(FBase<>nil) then FBase:=Delete(value, FBase);
+ if(FBase<>nil) then FBase^.Color:=BLACK;
+end;
+
+
+function TSet.Find(value:T):PNode;inline;
+var x:PNode;
+begin
+ x:=FBase;
+ while(x <> nil) do begin
+ if(TCompare.c(value,x^.Data)) then x:=x^.Left
+ else if(TCompare.c(x^.Data,value)) then x:=x^.Right
+ else exit(x);
+ end;
+ exit(nil);
+end;
+
+function TSet.FindLess(value:T):PNode;inline;
+var x,cur:PNode;
+begin
+ x:=nil;
+ cur:=FBase;
+ while (cur <> nil) do begin
+ if (TCompare.c(cur^.Data, value)) then
+ begin
+ x:=cur;
+ cur:=cur^.right;
+ end else
+ cur:=cur^.left;
+ end;
+ FindLess:=x;
+end;
+
+function TSet.FindLessEqual(value:T):PNode;inline;
+var x,cur:PNode;
+begin
+ x:=nil;
+ cur:=FBase;
+ while (cur <> nil) do begin
+ if (not TCompare.c(value, cur^.data)) then
+ begin
+ x:=cur;
+ cur:=cur^.right;
+ end else
+ cur:=cur^.left;
+ end;
+ FindLessEqual:=x;
+end;
+
+function TSet.FindGreater(value:T):PNode;inline;
+var x,cur:PNode;
+begin
+ x:=nil;
+ cur:=FBase;
+ while (cur <> nil) do begin
+ if (TCompare.c(value, cur^.Data)) then
+ begin
+ x:=cur;
+ cur:=cur^.left;
+ end else
+ cur:=cur^.right;
+ end;
+ FindGreater:=x;
+end;
+
+function TSet.FindGreaterEqual(value:T):PNode;inline;
+var x,cur:PNode;
+begin
+ x:=nil;
+ cur:=FBase;
+ while (cur <> nil) do begin
+ if (not TCompare.c(cur^.Data, value)) then
+ begin
+ x:=cur;
+ cur:=cur^.left;
+ end else
+ cur:=cur^.right;
+ end;
+ FindGreaterEqual:=x;
+end;
+
+function TSet.Insert(value:T):PNode;inline;
+var position:PNode;
+begin
+ FBase:=Insert(value, FBase, position);
+ FBase^.Color:=BLACK;
+ Insert:=position;
+end;
+
+function TSet.Insert(value:T; nod:PNode; var position:PNode):PNode;
+begin
+ if(nod=nil) then begin
+ nod:=CreateNode(value);
+ position:=nod;
+ exit(nod);
+ end;
+ if(TCompare.c(value,nod^.Data)) then begin
+ nod^.Left:=Insert(value, nod^.Left, position);
+ nod^.Left^.Parent:=nod;
+ end
+ else if TCompare.c(nod^.Data,value) then begin
+ nod^.Right:=Insert(value, nod^.Right, position);
+ nod^.Right^.Parent:=nod;
+ end
+ else begin
+ position:=nod;
+ exit(nod);
+ end;
+
+ if(IsRed(nod^.Right)) and (not IsRed(nod^.Left)) then nod := rotateLeft(nod);
+ if(IsRed(nod^.Left)) and (IsRed(nod^.Left^.Left)) then nod := rotateRight(nod);
+ if(IsRed(nod^.Right)) and (IsRed(nod^.Left)) then flipColors(nod);
+
+ Insert:=nod;
+end;
+
+function TSet.IsRed(nod:PNode):boolean;inline;
+begin
+ if(nod=nil) then exit(false);
+ exit(nod^.Color);
+end;
+
+function TSet.Min(nod:PNode):PNode;inline;
+var temp:PNode;
+begin
+ temp:=nod;
+ while(temp^.Left<>nil) do temp:=temp^.Left;
+ exit(temp);
+end;
+
+function TSet.Min:PNode;inline;
+begin
+ if FBase=nil then exit(nil);
+ Min:=Min(FBase);
+end;
+
+function TSet.Max:PNode;inline;
+var temp:PNode;
+begin
+ if FBase=nil then exit(nil);
+ temp:=FBase;
+ while(temp^.Right<>nil) do temp:=temp^.Right;
+ exit(temp);
+end;
+
+function TSet.Next(x:PNode):PNode;inline;
+var temp:PNode;
+begin
+ if(x=nil) then exit(nil);
+ if(x^.Right<>nil) then begin
+ temp:=x^.Right;
+ while(temp^.Left<>nil) do temp:=temp^.Left;
+ end
+ else begin
+ temp:=x;
+ while(true) do begin
+ if(temp^.Parent=nil) then begin temp:=temp^.Parent; break; end;
+ if(temp^.Parent^.Left=temp) then begin temp:=temp^.Parent; break; end;
+ temp:=temp^.Parent;
+ end;
+ end;
+ exit(temp);
+end;
+
+function TSet.Prev(x:PNode):PNode;inline;
+var temp:PNode;
+begin
+ if(x=nil) then exit(nil);
+ if(x^.Left<>nil) then begin
+ temp:=x^.Left;
+ while(temp^.Right<>nil) do temp:=temp^.Right;
+ end
+ else begin
+ temp:=x;
+ while(true) do begin
+ if(temp^.Parent=nil) then begin temp:=temp^.Parent; break; end;
+ if(temp^.Parent^.Right=temp) then begin temp:=temp^.Parent; break; end;
+ temp:=temp^.Parent;
+ end;
+ end;
+ exit(temp);
+end;
+
+end.
diff --git a/packages/fcl-stl/src/gstack.pp b/packages/fcl-stl/src/gstack.pp
new file mode 100644
index 0000000000..2d5cfe4020
--- /dev/null
+++ b/packages/fcl-stl/src/gstack.pp
@@ -0,0 +1,73 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit gstack;
+
+interface
+
+uses gvector;
+
+type
+ generic TStack<T>=class
+ private
+ type TContainer= specialize TVector<T>;
+ var FData:TContainer;
+ public
+ procedure Push(x:T);inline;
+ procedure Pop();inline;
+ function Top():T;inline;
+ function Size():longint;inline;
+ function IsEmpty():boolean;inline;
+ constructor Create;
+ destructor Destroy;override;
+end;
+
+implementation
+
+constructor TStack.Create;
+begin
+ FData:=TContainer.Create;
+end;
+
+destructor TStack.Destroy;
+begin
+ FData.Destroy;
+end;
+
+procedure TStack.Push(x:T);inline;
+begin
+ FData.PushBack(x);
+end;
+
+procedure TStack.Pop;inline;
+begin
+ FData.PopBack;
+end;
+
+function TStack.Top:T;inline;
+begin
+ Top:=FData.Back;
+end;
+
+function TStack.Size:longint;inline;
+begin
+ Size:=FData.Size;
+end;
+
+function TStack.IsEmpty:boolean;inline;
+begin
+ IsEmpty:=FData.IsEmpty;
+end;
+
+end.
diff --git a/packages/fcl-stl/src/gutil.pp b/packages/fcl-stl/src/gutil.pp
new file mode 100644
index 0000000000..f653940f2b
--- /dev/null
+++ b/packages/fcl-stl/src/gutil.pp
@@ -0,0 +1,39 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit gutil;
+
+interface
+
+type generic TLess<T>=class
+ class function c(a,b:T):boolean;inline;
+end;
+
+type generic TGreater<T>=class
+ class function c(a,b:T):boolean;inline;
+end;
+
+implementation
+
+class function TLess.c(a,b:T):boolean;inline;
+begin
+ c:=a<b;
+end;
+
+class function TGreater.c(a,b:T):boolean;inline;
+begin
+ c:=b<a;
+end;
+
+end.
diff --git a/packages/fcl-stl/src/gvector.pp b/packages/fcl-stl/src/gvector.pp
new file mode 100644
index 0000000000..96fb6bce76
--- /dev/null
+++ b/packages/fcl-stl/src/gvector.pp
@@ -0,0 +1,173 @@
+{
+ This file is part of the Free Pascal FCL library.
+ BSD parts (c) 2011 Vlado Boza
+
+ 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}
+
+unit gvector;
+
+interface
+
+type
+ generic TVector<T>=class
+ private
+ type
+ PT=^ T;
+ TArr=array of T;
+ var
+ FCapacity:SizeUInt;
+ FDataSize:SizeUInt;
+ FData:TArr;
+
+ procedure SetValue(Position:SizeUInt; Value:T);inline;
+ function GetValue(Position:SizeUInt):T;inline;
+ function GetMutable(Position:SizeUInt):PT;inline;
+ procedure IncreaseCapacity;inline;
+ public
+ constructor Create;
+ function Size:SizeUInt;inline;
+ procedure PushBack(Value:T);inline;
+ procedure PopBack;inline;
+ function IsEmpty:boolean;inline;
+ procedure Insert(Position:SizeUInt; Value:T);inline;
+ procedure Erase(Position:SizeUInt);inline;
+ procedure Clear;inline;
+ function Front:T;inline;
+ function Back:T;inline;
+ procedure Reserve(Num:SizeUInt);inline;
+ procedure Resize(Num:SizeUInt);inline;
+
+ property Items[i : SizeUInt]: T read getValue write setValue; default;
+ property Mutable[i : SizeUInt]: PT read getMutable;
+end;
+
+implementation
+
+constructor TVector.Create();
+begin
+ FCapacity:=0;
+ FDataSize:=0;
+end;
+
+procedure TVector.SetValue(Position:SizeUInt; Value:T);inline;
+begin
+ Assert(position < size, 'Vector position out of range');
+ FData[Position]:=Value;
+end;
+
+function TVector.GetValue(Position:SizeUInt):T;inline;
+begin
+ Assert(position < size, 'Vector position out of range');
+ GetValue:=FData[Position];
+end;
+
+function TVector.GetMutable(Position:SizeUInt):PT;inline;
+begin
+ Assert(position < size, 'Vector position out of range');
+ GetMutable:=@FData[Position];
+end;
+
+function TVector.Front():T;inline;
+begin
+ Assert(size > 0, 'Accessing element of empty vector');
+ Front:=FData[0];
+end;
+
+function TVector.Back():T;inline;
+begin
+ Assert(size > 0, 'Accessing element of empty vector');
+ Back:=FData[FDataSize-1];
+end;
+
+function TVector.Size():SizeUInt;inline;
+begin
+ Size:=FDataSize;
+end;
+
+function TVector.IsEmpty():boolean;inline;
+begin
+ if Size()=0 then
+ IsEmpty:=true
+ else
+ IsEmpty:=false;
+end;
+
+procedure TVector.PushBack(Value:T);inline;
+begin
+ if FDataSize=FCapacity then
+ IncreaseCapacity;
+ FData[FDataSize]:=Value;
+ inc(FDataSize);
+end;
+
+procedure TVector.IncreaseCapacity();inline;
+begin
+ if FCapacity=0 then
+ FCapacity:=1
+ else
+ FCapacity:=FCapacity*2;
+ SetLength(FData, FCapacity);
+end;
+
+procedure TVector.PopBack();inline;
+begin
+ if FDataSize>0 then
+ FDataSize:=FDataSize-1;
+end;
+
+procedure TVector.Insert(Position:SizeUInt; Value: T);inline;
+var i:SizeUInt;
+begin
+ pushBack(Value);
+ for i:=Size-1 downto Position+1 do
+ begin
+ FData[i]:=FData[i-1];
+ end;
+ FData[Position]:=Value;
+end;
+
+procedure TVector.Erase(Position:SizeUInt);inline;
+var i:SizeUInt;
+begin
+ if Position <= Size then
+ begin
+ for i:=Position to Size-2 do
+ begin
+ FData[i]:=FData[i+1];
+ end;
+ popBack();
+ end;
+end;
+
+procedure TVector.Clear;inline;
+begin
+ FDataSize:=0;
+end;
+
+procedure TVector.Reserve(Num:SizeUInt);inline;
+begin
+ if(Num < FCapacity) then
+ exit
+ else if(Num <= 2*FCapacity) then
+ IncreaseCapacity
+ else begin
+ SetLength(FData, Num);
+ FCapacity:=Num;
+ end;
+end;
+
+procedure TVector.Resize(Num:SizeUInt);inline;
+begin
+ Reserve(Num);
+ FDataSize:=Num;
+end;
+
+end.
diff --git a/packages/fcl-stl/tests/clean b/packages/fcl-stl/tests/clean
new file mode 100755
index 0000000000..e58cd16dae
--- /dev/null
+++ b/packages/fcl-stl/tests/clean
@@ -0,0 +1,2 @@
+#!/bin/bash
+rm *.o *.ppu ../*.o ../*.ppu
diff --git a/packages/fcl-stl/tests/garrayutilstest.pp b/packages/fcl-stl/tests/garrayutilstest.pp
new file mode 100644
index 0000000000..3a1bb20605
--- /dev/null
+++ b/packages/fcl-stl/tests/garrayutilstest.pp
@@ -0,0 +1,116 @@
+{$mode objfpc}
+
+unit garrayutilstest;
+
+interface
+
+uses fpcunit, testregistry, gvector, garrayutils, gutil;
+
+type vectorlli=specialize TVector<longint>;
+ lesslli=specialize TLess<longint>;
+ sortlli=specialize TOrderingArrayUtils<vectorlli, longint, lesslli>;
+
+type TGArrayUtilsTest = class(TTestCase)
+ Published
+ procedure SortRandomTest;
+ procedure SortZeroOneTest;
+ procedure NextPermutationTest1;
+ procedure NextPermutationTest2;
+ procedure NextPermutationTest3;
+ procedure NextPermutationTest4;
+ public
+ procedure Setup;override;
+ private
+ data:vectorlli;
+ end;
+
+implementation
+
+procedure TGArrayUtilsTest.SortRandomTest;
+var i:longint;
+begin
+ for i:=0 to 5000 do
+ data.pushBack(random(10000));
+ sortlli.sort(data, 5001);
+ for i:=0 to 4999 do
+ AssertEquals('Wrong order', false, data[i+1]<data[i]);
+end;
+
+procedure TGArrayUtilsTest.SortZeroOneTest;
+var i:longint;
+begin
+ for i:=0 to 5000 do
+ data.pushBack(random(2));
+ sortlli.sort(data, 5001);
+ for i:=0 to 4999 do
+ AssertEquals('Wrong order', false, data[i+1]<data[i]);
+end;
+
+procedure TGArrayUtilsTest.NextPermutationTest1;
+begin
+ data.pushBack(1);
+ data.pushBack(2);
+ data.pushBack(3);
+ data.pushBack(4);
+ AssertEquals('Wrong ret', true, sortlli.NextPermutation(data, 4));
+ AssertEquals('Wrong perm 1', 1, data[0]);
+ AssertEquals('Wrong perm 2', 2, data[1]);
+ AssertEquals('Wrong perm 3', 4, data[2]);
+ AssertEquals('Wrong perm 4', 3, data[3]);
+end;
+
+procedure TGArrayUtilsTest.NextPermutationTest2;
+begin
+ data.pushBack(4);
+ data.pushBack(3);
+ data.pushBack(2);
+ data.pushBack(1);
+ AssertEquals('Wrong ret', false, sortlli.NextPermutation(data, 4));
+ AssertEquals('Wrong perm 1', 4, data[0]);
+ AssertEquals('Wrong perm 2', 3, data[1]);
+ AssertEquals('Wrong perm 3', 2, data[2]);
+ AssertEquals('Wrong perm 4', 1, data[3]);
+end;
+
+procedure TGArrayUtilsTest.NextPermutationTest3;
+begin
+ data.pushBack(5);
+ data.pushBack(10);
+ data.pushBack(9);
+ data.pushBack(8);
+ data.pushBack(7);
+ data.pushBack(3);
+ AssertEquals('Wrong ret', true, sortlli.NextPermutation(data, 6));
+ AssertEquals('Wrong perm 1', 7, data[0]);
+ AssertEquals('Wrong perm 2', 3, data[1]);
+ AssertEquals('Wrong perm 3', 5, data[2]);
+ AssertEquals('Wrong perm 4', 8, data[3]);
+ AssertEquals('Wrong perm 5', 9, data[4]);
+ AssertEquals('Wrong perm 6', 10, data[5]);
+end;
+
+procedure TGArrayUtilsTest.NextPermutationTest4;
+begin
+ data.pushBack(0);
+ data.pushBack(1);
+ data.pushBack(0);
+ data.pushBack(1);
+ data.pushBack(1);
+ data.pushBack(0);
+ AssertEquals('Wrong ret', true, sortlli.NextPermutation(data, 6));
+ AssertEquals('Wrong perm 1', 0, data[0]);
+ AssertEquals('Wrong perm 2', 1, data[1]);
+ AssertEquals('Wrong perm 3', 1, data[2]);
+ AssertEquals('Wrong perm 4', 0, data[3]);
+ AssertEquals('Wrong perm 5', 0, data[4]);
+ AssertEquals('Wrong perm 6', 1, data[5]);
+end;
+
+procedure TGArrayUtilsTest.Setup;
+begin
+ data:=vectorlli.create;
+end;
+
+initialization
+ RegisterTest(TGArrayUtilsTest);
+end.
diff --git a/packages/fcl-stl/tests/gdequetest.pp b/packages/fcl-stl/tests/gdequetest.pp
new file mode 100644
index 0000000000..9dfb8a0e9a
--- /dev/null
+++ b/packages/fcl-stl/tests/gdequetest.pp
@@ -0,0 +1,55 @@
+{$mode objfpc}
+
+unit gdequetest;
+
+interface
+
+uses fpcunit, testregistry, gdeque;
+
+type dequelli=specialize TDeque<longint>;
+
+type TGDequeTest = class(TTestCase)
+ Published
+ procedure BackTest;
+ procedure PushTest;
+ public
+ procedure Setup;override;
+ private
+ data:dequelli;
+ end;
+
+implementation
+
+procedure TGDequeTest.BackTest;
+var i:longint;
+begin
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+ for i:=0 to 10 do
+ data.pushback(i);
+ for i:=0 to 10 do begin
+ AssertEquals('Wrong data', 10-i, data.back);
+ AssertEquals('Wrong size', 11-i, data.size);
+ data.popback;
+ end;
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+end;
+
+procedure TGDequeTest.PushTest;
+var i:longint;
+begin
+ for i:=6 to 10 do
+ data.pushBack(i);
+ for i:=5 downto 0 do
+ data.pushFront(i);
+ for i:=0 to 10 do
+ AssertEquals('Wrong data', i, data[i]);
+end;
+
+procedure TGDequeTest.Setup;
+begin
+ data:=dequelli.create;
+end;
+
+initialization
+ RegisterTest(TGDequeTest);
+end.
diff --git a/packages/fcl-stl/tests/gmaptest.pp b/packages/fcl-stl/tests/gmaptest.pp
new file mode 100644
index 0000000000..6d5325b26f
--- /dev/null
+++ b/packages/fcl-stl/tests/gmaptest.pp
@@ -0,0 +1,84 @@
+{$mode objfpc}
+
+unit gmaptest;
+
+interface
+
+uses fpcunit, testregistry, gmap, gutil;
+
+type lesslli=specialize TLess<longint>;
+ maplli=specialize TMap<longint,longint, lesslli>;
+
+type TGMapTest = class(TTestCase)
+ Published
+ procedure MapTest;
+ public
+ procedure Setup;override;
+ private
+ data:maplli;
+ end;
+
+implementation
+
+procedure TGMapTest.MapTest;
+var it:maplli.TMSet.pnode;
+begin
+ data[3]:=3;
+ data[5]:=5;
+ data[7]:=7;
+ AssertEquals('Wrong min key', 3, data.min()^.data.key);
+ AssertEquals('Wrong max key', 7, data.max()^.data.key);
+ AssertEquals('Wrong min val', 3, data.min()^.data.value);
+ AssertEquals('Wrong max val', 7, data.max()^.data.value);
+
+ AssertEquals('Wrong val', 5, data[5]);
+
+ data.delete(3);
+ AssertEquals('Wrong min key', 5, data.min()^.data.key);
+ AssertEquals('Wrong max key', 7, data.max()^.data.key);
+ AssertEquals('Wrong min val', 5, data.min()^.data.value);
+ AssertEquals('Wrong max val', 7, data.max()^.data.value);
+
+
+ data[3]:=3;
+ data[3]:=47;
+ AssertEquals('Wrong val 2', 47, data[3]);
+
+ if(data.find(4)<>nil) then
+ AssertEquals('Found key which not there', 0, 1);
+
+ data[17]:=42;
+
+ it:=data.min;
+ AssertEquals('Wrong min', 3, it^.Data.key);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 5, it^.Data.key);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 7, it^.Data.key);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 17, it^.Data.key);
+ it:=data.next(it);
+ if(it<>nil) then
+ AssertEquals('Last not nil', 0, 1);
+
+ it:=data.max;
+ AssertEquals('Wrong max', 17, it^.Data.key);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 7, it^.Data.key);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 5, it^.Data.key);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 3, it^.Data.key);
+ it:=data.prev(it);
+ if(it<>nil) then
+ AssertEquals('First not nil', 0, 1);
+end;
+
+procedure TGMapTest.Setup;
+begin
+ data:=maplli.create;
+end;
+
+initialization
+ RegisterTest(TGMapTest);
+end.
diff --git a/packages/fcl-stl/tests/gmaptestzal.pp b/packages/fcl-stl/tests/gmaptestzal.pp
new file mode 100644
index 0000000000..ce8b05b860
--- /dev/null
+++ b/packages/fcl-stl/tests/gmaptestzal.pp
@@ -0,0 +1,84 @@
+{$mode objfpc}
+
+unit gmaptest;
+
+interface
+
+uses fpcunit, testregistry, gmap, gutil;
+
+type lesslli=specialize TLess<longint>;
+ maplli=specialize TMap<longint,longint, lesslli>;
+
+type TGMapTest = class(TTestCase)
+ Published
+ procedure MapTest;
+ public
+ procedure Setup;override;
+ private
+ data:maplli;
+ end;
+
+implementation
+
+procedure TGMapTest.MapTest;
+var it:maplli.TMSet.pnode;
+begin
+ data[3]:=3;
+ data[5]:=5;
+ data[7]:=7;
+ AssertEquals('Wrong min key', 3, data.min()^.key);
+ AssertEquals('Wrong max key', 7, data.max()^.key);
+ AssertEquals('Wrong min val', 3, data.min()^.value);
+ AssertEquals('Wrong max val', 7, data.max()^.value);
+
+ AssertEquals('Wrong val', 5, data[5]);
+
+ data.delete(3);
+ AssertEquals('Wrong min key', 5, data.min()^.key);
+ AssertEquals('Wrong max key', 7, data.max()^.key);
+ AssertEquals('Wrong min val', 5, data.min()^.value);
+ AssertEquals('Wrong max val', 7, data.max()^.value);
+
+
+ data[3]:=3;
+ data[3]:=47;
+ AssertEquals('Wrong val 2', 47, data[3]);
+
+ if(data.find(4)<>nil) then
+ AssertEquals('Found key which not there', 0, 1);
+
+ data[17]:=42;
+
+ it:=data.min;
+ AssertEquals('Wrong min', 3, it^.key);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 5, it^.key);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 7, it^.key);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 17, it^.key);
+ it:=data.next(it);
+ if(it<>nil) then
+ AssertEquals('Last not nil', 0, 1);
+
+ it:=data.max;
+ AssertEquals('Wrong max', 17, it^.key);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 7, it^.key);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 5, it^.key);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 3, it^.key);
+ it:=data.prev(it);
+ if(it<>nil) then
+ AssertEquals('First not nil', 0, 1);
+end;
+
+procedure TGMapTest.Setup;
+begin
+ data:=maplli.create;
+end;
+
+initialization
+ RegisterTest(TGMapTest);
+end.
diff --git a/packages/fcl-stl/tests/gpriorityqueuetest.pp b/packages/fcl-stl/tests/gpriorityqueuetest.pp
new file mode 100644
index 0000000000..63af405bdf
--- /dev/null
+++ b/packages/fcl-stl/tests/gpriorityqueuetest.pp
@@ -0,0 +1,47 @@
+{$mode objfpc}
+
+unit gpriorityqueuetest;
+
+interface
+
+uses fpcunit, testregistry, gpriorityqueue, gutil;
+
+{type lesslli=specialize TLess<longint>;
+ queuelli=specialize TPriorityQueue<longint,lesslli>;}
+
+type TGPQueueTest = class(TTestCase)
+ Published
+ procedure QueueTest;
+ public
+ procedure Setup;override;
+ private
+ { data:queuelli;}
+ end;
+
+implementation
+
+procedure TGPQueueTest.QueueTest;
+var i,last:longint;
+begin
+{ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+ for i:=0 to 10 do
+ data.push(random(10000));
+ last:=data.top;
+ data.pop;
+ for i:=0 to 9 do begin
+ AssertEquals('Wrong order', true, data.top<last);
+ AssertEquals('Wrong size', 10-i, data.size);
+ last:=data.top;
+ data.pop;
+ end;
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);}
+end;
+
+procedure TGPQueueTest.Setup;
+begin
+{ data:=queuelli.create;}
+end;
+
+initialization
+ RegisterTest(TGPQueueTest);
+end.
diff --git a/packages/fcl-stl/tests/gqueuetest.pp b/packages/fcl-stl/tests/gqueuetest.pp
new file mode 100644
index 0000000000..ca4a2a16e4
--- /dev/null
+++ b/packages/fcl-stl/tests/gqueuetest.pp
@@ -0,0 +1,43 @@
+{$mode objfpc}
+
+unit gqueuetest;
+
+interface
+
+uses fpcunit, testregistry, gqueue;
+
+type TQueuelli=specialize TQueue<longint>;
+
+type TGTQueueTest = class(TTestCase)
+ Published
+ procedure TQueueTest;
+ public
+ procedure Setup;override;
+ private
+ data:TQueuelli;
+ end;
+
+implementation
+
+procedure TGTQueueTest.TQueueTest;
+var i:longint;
+begin
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+ for i:=0 to 10 do
+ data.push(i);
+ for i:=0 to 10 do begin
+ AssertEquals('Wrong data', i, data.front);
+ AssertEquals('Wrong size', 11-i, data.size);
+ data.pop;
+ end;
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+end;
+
+procedure TGTQueueTest.Setup;
+begin
+ data:=TQueuelli.create;
+end;
+
+initialization
+ RegisterTest(TGTQueueTest);
+end.
diff --git a/packages/fcl-stl/tests/gsetrefcounttest.pp b/packages/fcl-stl/tests/gsetrefcounttest.pp
new file mode 100644
index 0000000000..c381367fc1
--- /dev/null
+++ b/packages/fcl-stl/tests/gsetrefcounttest.pp
@@ -0,0 +1,59 @@
+{$mode objfpc}
+
+unit gsetrefcounttest;
+
+interface
+
+uses fpcunit, testregistry, gset, gutil;
+
+type
+ arr = class
+ a:longint;
+ end;
+ lll=class
+ class function c(a,b: arr):boolean;
+ end;
+
+type setlli=specialize RBSet<arr,lll>;
+
+type TGSetRefCountTest = class(TTestCase)
+ Published
+ procedure SetTest;
+ public
+ procedure Setup;override;
+ private
+ data:setlli;
+ end;
+
+implementation
+
+class function lll.c(a,b: arr):boolean;
+begin
+ c:=a.a<b.a;
+end;
+
+procedure TGSetRefCountTest.SetTest;
+var x:arr; i:longint;
+ it:setlli.pnode;
+begin
+ for i:=0 to 20000 do begin
+ x:=arr.create;
+ x.a:=i;
+ {code should crash on this insert}
+ data.insert(x);
+ end;
+ it:=data.min;
+ while it<>nil do begin
+ writeln(it^.data.a);
+ it:=data.next(it);
+ end;
+end;
+
+procedure TGSetRefCountTest.Setup;
+begin
+ data:=setlli.create;
+end;
+
+initialization
+ RegisterTest(TGSetRefCountTest);
+end.
diff --git a/packages/fcl-stl/tests/gsettest.pp b/packages/fcl-stl/tests/gsettest.pp
new file mode 100644
index 0000000000..e828236e90
--- /dev/null
+++ b/packages/fcl-stl/tests/gsettest.pp
@@ -0,0 +1,110 @@
+{$mode objfpc}
+
+unit gsettest;
+
+interface
+
+uses fpcunit, testregistry, gset, gutil;
+
+type lesslli=specialize TLess<longint>;
+ setlli=specialize TSet<longint,lesslli>;
+
+type TGSetTest = class(TTestCase)
+ Published
+ procedure SetTest;
+ public
+ procedure Setup;override;
+ private
+ data:setlli;
+ end;
+
+implementation
+
+procedure TGSetTest.SetTest;
+var it:setlli.pnode;
+begin
+ data.insert(3);
+ data.insert(5);
+ data.insert(7);
+ AssertEquals('Wrong min', 3, data.min()^.data);
+ AssertEquals('Wrong max', 7, data.max()^.data);
+ data.delete(3);
+ AssertEquals('Wrong size', 2, data.size);
+ AssertEquals('Wrong min', 5, data.min()^.data);
+ data.insert(3);
+ data.insert(3);
+ data.insert(3);
+ AssertEquals('Wrong size', 3, data.size);
+ AssertEquals('Wrong min', 3, data.min()^.data);
+ if(data.find(4)<>nil) then
+ Fail('Found key which not there');
+ if(data.find(5)=nil) then
+ Fail('Not found key which was there');
+
+ if(data.FindLess(8)^.data<>7) then
+ Fail('Wrong less than 8');
+ if(data.FindLess(7)^.data<>5) then
+ Fail('Wrong less than 7');
+ if(data.FindLess(3)<>nil) then
+ Fail('Wrong less than 3');
+
+ if(data.FindLessEqual(8)^.data<>7) then
+ Fail('Wrong less equal than 8');
+ if(data.FindLessEqual(7)^.data<>7) then
+ Fail('Wrong less equal than 7');
+ if(data.FindLessEqual(6)^.data<>5) then
+ Fail('Wrong less equal than 6');
+ if(data.FindLessEqual(2)<>nil) then
+ Fail('Wrong less equal than 2');
+
+ if(data.FindGreater(2)^.data<>3) then
+ Fail('Wrong greater than 2');
+ if(data.Findgreater(3)^.data<>5) then
+ Fail('Wrong greater than 3');
+ if(data.Findgreater(7)<>nil) then
+ Fail('Wrong greater than 7');
+
+ if(data.FindGreaterEqual(2)^.data<>3) then
+ Fail('Wrong greater equal than 2');
+ if(data.FindGreaterEqual(3)^.data<>3) then
+ Fail('Wrong greater equal than 3');
+ if(data.FindGreaterEqual(4)^.data<>5) then
+ Fail('Wrong greater equal than 4');
+ if(data.FindGreaterEqual(8)<>nil) then
+ Fail('Wrong greater equal than 8');
+
+ data.insert(17);
+
+ it:=data.min;
+ AssertEquals('Wrong min', 3, it^.data);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 5, it^.data);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 7, it^.data);
+ it:=data.next(it);
+ AssertEquals('Wrong next', 17, it^.data);
+ it:=data.next(it);
+ if(it<>nil) then
+ AssertEquals('Last not nil', 0, 1);
+
+ it:=data.max;
+ AssertEquals('Wrong max', 17, it^.data);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 7, it^.data);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 5, it^.data);
+ it:=data.prev(it);
+ AssertEquals('Wrong prev', 3, it^.data);
+ it:=data.prev(it);
+ if(it<>nil) then
+ AssertEquals('First not nil', 0, 1);
+end;
+
+procedure TGSetTest.Setup;
+begin
+ data:=setlli.create;
+end;
+
+initialization
+ RegisterTest(TGSetTest);
+end.
diff --git a/packages/fcl-stl/tests/gstacktest.pp b/packages/fcl-stl/tests/gstacktest.pp
new file mode 100644
index 0000000000..397a2b5292
--- /dev/null
+++ b/packages/fcl-stl/tests/gstacktest.pp
@@ -0,0 +1,43 @@
+{$mode objfpc}
+
+unit gstacktest;
+
+interface
+
+uses fpcunit, testregistry, gstack;
+
+type TStacklli=specialize TStack<longint>;
+
+type TGTStackTest = class(TTestCase)
+ Published
+ procedure TStackTest;
+ public
+ procedure Setup;override;
+ private
+ data:TStacklli;
+ end;
+
+implementation
+
+procedure TGTStackTest.TStackTest;
+var i:longint;
+begin
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+ for i:=0 to 10 do
+ data.push(i);
+ for i:=0 to 10 do begin
+ AssertEquals('Wrong data', 10-i, data.top);
+ AssertEquals('Wrong size', 11-i, data.size);
+ data.pop;
+ end;
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+end;
+
+procedure TGTStackTest.Setup;
+begin
+ data:=TStacklli.create;
+end;
+
+initialization
+ RegisterTest(TGTStackTest);
+end.
diff --git a/packages/fcl-stl/tests/gvectortest.pp b/packages/fcl-stl/tests/gvectortest.pp
new file mode 100644
index 0000000000..660f6eead8
--- /dev/null
+++ b/packages/fcl-stl/tests/gvectortest.pp
@@ -0,0 +1,111 @@
+{$mode objfpc}
+
+unit gvectortest;
+
+interface
+
+uses fpcunit, testregistry, gvector;
+
+type vectorlli=specialize TVector<longint>;
+ rec=record
+ a,b:longint;
+ end;
+ vectorrec=specialize TVector<rec>;
+
+type TGVectorTest = class(TTestCase)
+ Published
+ procedure PushBackTest;
+ procedure ResizeTest;
+ procedure PopbackTest;
+ procedure InsertEraseTest;
+ procedure MutableTest;
+ public
+ procedure Setup;override;
+ private
+ data:vectorlli;
+ end;
+
+implementation
+
+procedure TGVectorTest.PushBackTest;
+var i:longint;
+begin
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+ for i:=0 to 10 do
+ data.pushBack(i);
+ for i:=0 to 10 do
+ AssertEquals('Wrong data', i, data[i]);
+
+ AssertEquals('Wrong size', 11, data.size);
+ AssertEquals('IsEmpty', false, data.IsEmpty);
+end;
+
+procedure TGVectorTest.ResizeTest;
+var i:longint;
+begin
+ AssertEquals('Not IsEmpty', true, data.IsEmpty);
+ data.resize(50);
+ AssertEquals('IsEmpty', false, data.IsEmpty);
+ for i:=0 to 49 do
+ data[i]:=3*i;
+ for i:=0 to 49 do
+ AssertEquals('Wrong data', 3*i, data[i]);
+ AssertEquals('Wrong size', 50, data.size);
+end;
+
+procedure TGVectorTest.PopbackTest;
+var i:longint;
+begin
+ for i:=0 to 49 do begin
+ data.pushBack(5*i);
+ AssertEquals('Wrong end', 5*i, data.back);
+ AssertEquals('Wrong front', 0, data.front);
+ end;
+ for i:=1 to 10 do begin
+ data.popBack;
+ AssertEquals('Wrong end after popback', 5*(49-i), data.back);
+ end;
+end;
+
+procedure TGVectorTest.InsertEraseTest;
+var i:longint;
+begin
+ for i:=0 to 9 do
+ data.pushBack(i);
+ data.insert(3,100);
+ for i:=0 to 2 do
+ AssertEquals('Wrong data before insert', i, data[i]);
+ AssertEquals('Wrong data', 100, data[3]);
+ for i:=4 to 10 do
+ AssertEquals('Wrong data after insert', i-1, data[i]);
+ data.erase(4);
+ for i:=4 to 9 do
+ AssertEquals('Wrong data after erase', i, data[i]);
+ AssertEquals('Wrong data before erase', 100, data[3]);
+ for i:=0 to 2 do
+ AssertEquals('Wrong data before erase', i, data[i]);
+end;
+
+procedure TGVectorTest.MutableTest;
+var dat:vectorrec;
+begin
+ dat:=vectorrec.create;
+ dat.resize(2);
+ dat.mutable[0]^.a:=5;
+ dat.mutable[0]^.b:=7;
+ AssertEquals('Wrong data', 5, dat[0].a);
+ AssertEquals('Wrong data', 7, dat[0].b);
+ dat.mutable[0]^.a:=45;
+ dat.mutable[0]^.b:=47;
+ AssertEquals('Wrong data', 45, dat[0].a);
+ AssertEquals('Wrong data', 47, dat[0].b);
+end;
+
+procedure TGVectorTest.Setup;
+begin
+ data:=vectorlli.create;
+end;
+
+initialization
+ RegisterTest(TGVectorTest);
+end.
diff --git a/packages/fcl-stl/tests/run-all-tests b/packages/fcl-stl/tests/run-all-tests
new file mode 100755
index 0000000000..14145b7abb
--- /dev/null
+++ b/packages/fcl-stl/tests/run-all-tests
@@ -0,0 +1,4 @@
+#!/bin/bash
+rm *.o *.ppu testrunner
+fpc -Fu../units/x86_64-linux -gttt testrunner.pp -Sa
+./testrunner --all
diff --git a/packages/fcl-stl/tests/suiteconfig.pp b/packages/fcl-stl/tests/suiteconfig.pp
new file mode 100644
index 0000000000..30ac5b51a0
--- /dev/null
+++ b/packages/fcl-stl/tests/suiteconfig.pp
@@ -0,0 +1,27 @@
+{$mode objfpc}
+{$h+}
+{
+ This file is part of the Free Component Library (FCL)
+ Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+
+ a unit to register the tests to be runned.
+
+ 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 suiteconfig;
+
+interface
+
+uses
+ gvectortest, gstacktest, gqueuetest, gdequetest, garrayutilstest,
+ gsettest, gmaptest;
+
+implementation
+
+end.
diff --git a/packages/fcl-stl/tests/testrunner.pp b/packages/fcl-stl/tests/testrunner.pp
new file mode 100644
index 0000000000..3995c05738
--- /dev/null
+++ b/packages/fcl-stl/tests/testrunner.pp
@@ -0,0 +1,138 @@
+{
+ This file is part of the Free Component Library (FCL)
+ Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+
+ an example of a console test runner of FPCUnit tests.
+
+ 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.
+}
+program testrunner;
+
+{$mode objfpc}
+{$h+}
+
+uses
+ custapp, Classes, SysUtils, fpcunit, suiteconfig, testreport, testregistry;
+
+
+const
+ ShortOpts = 'alh';
+ Longopts: Array[1..5] of String = (
+ 'all','list','format:','suite:','help');
+ Version = 'Version 0.2';
+
+
+type
+ TTestRunner = Class(TCustomApplication)
+ private
+ FXMLResultsWriter: TXMLResultsWriter;
+ protected
+ procedure DoRun ; Override;
+ procedure doTestRun(aTest: TTest); virtual;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ end;
+
+
+constructor TTestRunner.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FXMLResultsWriter := TXMLResultsWriter.Create;
+end;
+
+
+destructor TTestRunner.Destroy;
+begin
+ FXMLResultsWriter.Free;
+end;
+
+
+procedure TTestRunner.doTestRun(aTest: TTest);
+var
+ testResult: TTestResult;
+begin
+ testResult := TTestResult.Create;
+ try
+ testResult.AddListener(FXMLResultsWriter);
+ aTest.Run(testResult);
+ FXMLResultsWriter.WriteResult(testResult);
+ finally
+ testResult.Free;
+ end;
+end;
+
+
+procedure TTestRunner.DoRun;
+var
+ I : Integer;
+ S : String;
+begin
+ S:=CheckOptions(ShortOpts,LongOpts);
+ If (S<>'') then
+ Writeln(S);
+ if HasOption('h', 'help') or (ParamCount = 0) then
+ begin
+ writeln(Title);
+ writeln(Version);
+ writeln('Usage: ');
+ writeln('-l or --list to show a list of registered tests');
+ writeln('default format is xml, add --format=latex to output the list as latex source');
+ writeln('-a or --all to run all the tests and show the results in xml format');
+ writeln('The results can be redirected to an xml file,');
+ writeln('for example: ./testrunner --all > results.xml');
+ writeln('use --suite=MyTestSuiteName to run only the tests in a single test suite class');
+ end
+ else;
+ if HasOption('l', 'list') then
+ begin
+ if HasOption('format') then
+ begin
+ if GetOptionValue('format') = 'latex' then
+ writeln(GetSuiteAsLatex(GetTestRegistry))
+ else
+ writeln(GetSuiteAsXML(GetTestRegistry));
+ end
+ else
+ writeln(GetSuiteAsXML(GetTestRegistry));
+ end;
+ if HasOption('a', 'all') then
+ begin
+ doTestRun(GetTestRegistry)
+ end
+ else
+ if HasOption('suite') then
+ begin
+ S := '';
+ S:=GetOptionValue('suite');
+ if S = '' then
+ for I := 0 to GetTestRegistry.Tests.count - 1 do
+ writeln(GetTestRegistry[i].TestName)
+ else
+ for I := 0 to GetTestRegistry.Tests.count - 1 do
+ if GetTestRegistry[i].TestName = S then
+ begin
+ doTestRun(GetTestRegistry[i]);
+ end;
+ end;
+ Terminate;
+end;
+
+
+var
+ App: TTestRunner;
+
+
+begin
+ App := TTestRunner.Create(nil);
+ App.Initialize;
+ App.Title := 'FPCUnit Console Test Case runner.';
+ App.Run;
+ App.Free;
+end.
+
diff --git a/packages/fcl-web/Makefile b/packages/fcl-web/Makefile
index f634824cce..7761608145 100644
--- a/packages/fcl-web/Makefile
+++ b/packages/fcl-web/Makefile
@@ -1,8 +1,8 @@
#
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2010/09/29]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/04/05]
#
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 i386-nativent i386-iphonesim 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-solaris 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 mipsel-linux
+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 i386-nativent i386-iphonesim 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 powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris 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 mipsel-linux
BSDs = freebsd netbsd openbsd darwin
UNIXs = linux $(BSDs) solaris qnx haiku
LIMIT83fs = go32v2 os2 emx watcom
@@ -266,379 +266,17 @@ endif
PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
override PACKAGE_NAME=fcl-web
override PACKAGE_VERSION=2.5.1
-ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-haiku)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-nativent)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),i386-iphonesim)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),x86_64-solaris)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
+FPMAKE_BIN_CLEAN=$(wildcard ./fpmake$(SRCEXEEXT))
+ifeq ($(FPMAKE_BIN_CLEAN),)
+FPMAKE_BIN_CLEAN=$(ECHO)
endif
-ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
+ifdef OS_TARGET
+FPC_TARGETOPT+=--os=$(OS_TARGET)
endif
-ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),avr-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),armeb-embedded)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-ifeq ($(FULL_TARGET),mipsel-linux)
-override TARGET_DIRS+=src/base src/webdata src/jsonrpc
-endif
-override INSTALL_FPCPACKAGE=y
-ifeq ($(FULL_TARGET),i386-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-go32v2)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-win32)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-os2)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-freebsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-beos)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-haiku)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-netbsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-solaris)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-qnx)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-netware)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-openbsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-wdosx)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-darwin)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-emx)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-watcom)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-netwlibc)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-wince)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-symbian)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-nativent)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),i386-iphonesim)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),m68k-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),m68k-freebsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),m68k-netbsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),m68k-amiga)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),m68k-atari)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),m68k-openbsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),m68k-palmos)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),m68k-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc-netbsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc-amiga)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc-macos)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc-darwin)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc-morphos)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),sparc-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),sparc-netbsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),sparc-solaris)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),sparc-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),x86_64-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),x86_64-freebsd)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),x86_64-solaris)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),x86_64-darwin)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),x86_64-win64)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),x86_64-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),arm-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),arm-palmos)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),arm-darwin)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),arm-wince)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),arm-gba)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),arm-nds)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),arm-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),arm-symbian)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc64-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc64-darwin)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),powerpc64-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),avr-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),armeb-linux)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),armeb-embedded)
-override COMPILER_OPTIONS+=-S2h
-endif
-ifeq ($(FULL_TARGET),mipsel-linux)
-override COMPILER_OPTIONS+=-S2h
+ifdef CPU_TARGET
+FPC_TARGETOPT+=--cpu=$(CPU_TARGET)
endif
+LOCALFPMAKE=.$(PATHSEP)fpmake$(EXEEXT)
ifdef REQUIRE_UNITSDIR
override UNITSDIR+=$(REQUIRE_UNITSDIR)
endif
@@ -835,37 +473,6 @@ endif
else
CROSSBINDIR=
endif
-ifeq ($(OS_SOURCE),linux)
-ifndef GCCLIBDIR
-ifeq ($(CPU_TARGET),i386)
-ifneq ($(findstring x86_64,$(shell uname -a)),)
-ifeq ($(BINUTILSPREFIX),)
-GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
-endif
-endif
-endif
-ifeq ($(CPU_TARGET),powerpc64)
-ifeq ($(BINUTILSPREFIX),)
-GCCLIBDIR:=$(shell dirname `gcc -m64 -print-libgcc-file-name`)
-endif
-endif
-endif
-ifndef GCCLIBDIR
-CROSSGCC=$(strip $(wildcard $(addsuffix /$(BINUTILSPREFIX)gcc$(SRCEXEEXT),$(SEARCHPATH))))
-ifneq ($(CROSSGCC),)
-GCCLIBDIR:=$(shell dirname `$(CROSSGCC) -print-libgcc-file-name`)
-endif
-endif
-ifndef OTHERLIBDIR
-OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
-endif
-endif
-ifdef inUnix
-ifeq ($(OS_SOURCE),netbsd)
-OTHERLIBDIR+=/usr/pkg/lib
-endif
-export GCCLIBDIR OTHERLIB
-endif
BATCHEXT=.bat
LOADEREXT=.as
EXEEXT=.exe
@@ -1016,6 +623,11 @@ ifeq ($(OS_TARGET),NativeNT)
SHAREDLIBEXT=.dll
SHORTSUFFIX=nativent
endif
+ifeq ($(OS_TARGET),wii)
+EXEEXT=.dol
+SHAREDLIBEXT=.so
+SHORTSUFFIX=wii
+endif
else
ifeq ($(OS_TARGET),go32v1)
PPUEXT=.pp1
@@ -1440,1180 +1052,524 @@ else
TAROPT=vz
TAREXT=.tar.gz
endif
-override REQUIRE_PACKAGES=fcl-base fcl-xml fcl-db fcl-json fcl-net fcl-process
+override REQUIRE_PACKAGES=rtl fpmkunit
ifeq ($(FULL_TARGET),i386-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-go32v2)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-win32)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-os2)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-freebsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-beos)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-haiku)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-netbsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-solaris)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-qnx)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-netware)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-openbsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-wdosx)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-darwin)
-REQUIRE_PACKAGES_UNIVINT=1
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-emx)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-watcom)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-netwlibc)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-wince)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-symbian)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-nativent)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),i386-iphonesim)
-REQUIRE_PACKAGES_UNIVINT=1
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),m68k-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),m68k-freebsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),m68k-netbsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),m68k-amiga)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),m68k-atari)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),m68k-openbsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),m68k-palmos)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),m68k-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc-netbsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc-amiga)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc-macos)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc-darwin)
-REQUIRE_PACKAGES_UNIVINT=1
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc-morphos)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),sparc-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),sparc-netbsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),sparc-solaris)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),sparc-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),x86_64-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),x86_64-solaris)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),x86_64-darwin)
-REQUIRE_PACKAGES_UNIVINT=1
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),x86_64-win64)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),x86_64-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),arm-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),arm-palmos)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),arm-darwin)
-REQUIRE_PACKAGES_UNIVINT=1
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),arm-wince)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),arm-gba)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),arm-nds)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),arm-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),arm-symbian)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc64-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc64-darwin)
-REQUIRE_PACKAGES_UNIVINT=1
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),powerpc64-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),avr-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),armeb-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),armeb-embedded)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
+REQUIRE_PACKAGES_FPMKUNIT=1
endif
ifeq ($(FULL_TARGET),mipsel-linux)
-REQUIRE_PACKAGES_FCL-BASE=1
-REQUIRE_PACKAGES_ICONVENC=1
-REQUIRE_PACKAGES_FCL-XML=1
-REQUIRE_PACKAGES_FCL-DB=1
-REQUIRE_PACKAGES_FCL-JSON=1
-REQUIRE_PACKAGES_FCL-PASSRC=1
-REQUIRE_PACKAGES_FCL-ASYNC=1
-REQUIRE_PACKAGES_FCL-NET=1
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
-REQUIRE_PACKAGES_IBASE=1
-REQUIRE_PACKAGES_POSTGRES=1
-REQUIRE_PACKAGES_MYSQL=1
-REQUIRE_PACKAGES_ODBC=1
-REQUIRE_PACKAGES_ORACLE=1
-REQUIRE_PACKAGES_SQLITE=1
-REQUIRE_PACKAGES_PXLIB=1
-REQUIRE_PACKAGES_HTTPD22=1
-REQUIRE_PACKAGES_FASTCGI=1
-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)
+REQUIRE_PACKAGES_FPMKUNIT=1
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_ICONVENC
-PACKAGEDIR_ICONVENC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /iconvenc/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_ICONVENC),)
-ifneq ($(wildcard $(PACKAGEDIR_ICONVENC)/units/$(TARGETSUFFIX)),)
-UNITDIR_ICONVENC=$(PACKAGEDIR_ICONVENC)/units/$(TARGETSUFFIX)
-else
-UNITDIR_ICONVENC=$(PACKAGEDIR_ICONVENC)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_ICONVENC)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_ICONVENC) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_ICONVENC)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_ICONVENC=
-UNITDIR_ICONVENC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /iconvenc/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_ICONVENC),)
-UNITDIR_ICONVENC:=$(firstword $(UNITDIR_ICONVENC))
-else
-UNITDIR_ICONVENC=
-endif
-endif
-ifdef UNITDIR_ICONVENC
-override COMPILER_UNITDIR+=$(UNITDIR_ICONVENC)
-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_FCL-DB
-PACKAGEDIR_FCL-DB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-db/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_FCL-DB),)
-ifneq ($(wildcard $(PACKAGEDIR_FCL-DB)/units/$(TARGETSUFFIX)),)
-UNITDIR_FCL-DB=$(PACKAGEDIR_FCL-DB)/units/$(TARGETSUFFIX)
-else
-UNITDIR_FCL-DB=$(PACKAGEDIR_FCL-DB)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_FCL-DB)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_FCL-DB) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-DB)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_FCL-DB=
-UNITDIR_FCL-DB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-db/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_FCL-DB),)
-UNITDIR_FCL-DB:=$(firstword $(UNITDIR_FCL-DB))
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
else
-UNITDIR_FCL-DB=
-endif
-endif
-ifdef UNITDIR_FCL-DB
-override COMPILER_UNITDIR+=$(UNITDIR_FCL-DB)
-endif
-endif
-ifdef REQUIRE_PACKAGES_FCL-JSON
-PACKAGEDIR_FCL-JSON:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-json/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_FCL-JSON),)
-ifneq ($(wildcard $(PACKAGEDIR_FCL-JSON)/units/$(TARGETSUFFIX)),)
-UNITDIR_FCL-JSON=$(PACKAGEDIR_FCL-JSON)/units/$(TARGETSUFFIX)
-else
-UNITDIR_FCL-JSON=$(PACKAGEDIR_FCL-JSON)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
endif
ifdef CHECKDEPEND
-$(PACKAGEDIR_FCL-JSON)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_FCL-JSON) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-JSON)/$(FPCMADE)
+$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_RTL)/$(OS_TARGET) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE)
endif
else
-PACKAGEDIR_FCL-JSON=
-UNITDIR_FCL-JSON:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-json/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_FCL-JSON),)
-UNITDIR_FCL-JSON:=$(firstword $(UNITDIR_FCL-JSON))
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
else
-UNITDIR_FCL-JSON=
+UNITDIR_RTL=
endif
endif
-ifdef UNITDIR_FCL-JSON
-override COMPILER_UNITDIR+=$(UNITDIR_FCL-JSON)
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
endif
endif
-ifdef REQUIRE_PACKAGES_FCL-PASSRC
-PACKAGEDIR_FCL-PASSRC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-passrc/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_FCL-PASSRC),)
-ifneq ($(wildcard $(PACKAGEDIR_FCL-PASSRC)/units/$(TARGETSUFFIX)),)
-UNITDIR_FCL-PASSRC=$(PACKAGEDIR_FCL-PASSRC)/units/$(TARGETSUFFIX)
+ifdef REQUIRE_PACKAGES_HASH
+PACKAGEDIR_HASH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /hash/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_HASH),)
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)),)
+UNITDIR_HASH=$(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)
else
-UNITDIR_FCL-PASSRC=$(PACKAGEDIR_FCL-PASSRC)
+UNITDIR_HASH=$(PACKAGEDIR_HASH)
endif
ifdef CHECKDEPEND
-$(PACKAGEDIR_FCL-PASSRC)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_FCL-PASSRC) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-PASSRC)/$(FPCMADE)
+$(PACKAGEDIR_HASH)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_HASH) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_HASH)/$(FPCMADE)
endif
else
-PACKAGEDIR_FCL-PASSRC=
-UNITDIR_FCL-PASSRC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-passrc/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_FCL-PASSRC),)
-UNITDIR_FCL-PASSRC:=$(firstword $(UNITDIR_FCL-PASSRC))
+PACKAGEDIR_HASH=
+UNITDIR_HASH:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /hash/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_HASH),)
+UNITDIR_HASH:=$(firstword $(UNITDIR_HASH))
else
-UNITDIR_FCL-PASSRC=
+UNITDIR_HASH=
endif
endif
-ifdef UNITDIR_FCL-PASSRC
-override COMPILER_UNITDIR+=$(UNITDIR_FCL-PASSRC)
+ifdef UNITDIR_HASH
+override COMPILER_UNITDIR+=$(UNITDIR_HASH)
endif
endif
-ifdef REQUIRE_PACKAGES_FCL-ASYNC
-PACKAGEDIR_FCL-ASYNC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-async/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_FCL-ASYNC),)
-ifneq ($(wildcard $(PACKAGEDIR_FCL-ASYNC)/units/$(TARGETSUFFIX)),)
-UNITDIR_FCL-ASYNC=$(PACKAGEDIR_FCL-ASYNC)/units/$(TARGETSUFFIX)
+ifdef REQUIRE_PACKAGES_PASZLIB
+PACKAGEDIR_PASZLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_PASZLIB),)
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)),)
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)
else
-UNITDIR_FCL-ASYNC=$(PACKAGEDIR_FCL-ASYNC)
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)
endif
ifdef CHECKDEPEND
-$(PACKAGEDIR_FCL-ASYNC)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_FCL-ASYNC) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-ASYNC)/$(FPCMADE)
+$(PACKAGEDIR_PASZLIB)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_PASZLIB) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_PASZLIB)/$(FPCMADE)
endif
else
-PACKAGEDIR_FCL-ASYNC=
-UNITDIR_FCL-ASYNC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-async/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_FCL-ASYNC),)
-UNITDIR_FCL-ASYNC:=$(firstword $(UNITDIR_FCL-ASYNC))
+PACKAGEDIR_PASZLIB=
+UNITDIR_PASZLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_PASZLIB),)
+UNITDIR_PASZLIB:=$(firstword $(UNITDIR_PASZLIB))
else
-UNITDIR_FCL-ASYNC=
+UNITDIR_PASZLIB=
endif
endif
-ifdef UNITDIR_FCL-ASYNC
-override COMPILER_UNITDIR+=$(UNITDIR_FCL-ASYNC)
-endif
-endif
-ifdef REQUIRE_PACKAGES_FCL-NET
-PACKAGEDIR_FCL-NET:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-net/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_FCL-NET),)
-ifneq ($(wildcard $(PACKAGEDIR_FCL-NET)/units/$(TARGETSUFFIX)),)
-UNITDIR_FCL-NET=$(PACKAGEDIR_FCL-NET)/units/$(TARGETSUFFIX)
-else
-UNITDIR_FCL-NET=$(PACKAGEDIR_FCL-NET)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_FCL-NET)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_FCL-NET) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-NET)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_FCL-NET=
-UNITDIR_FCL-NET:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-net/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_FCL-NET),)
-UNITDIR_FCL-NET:=$(firstword $(UNITDIR_FCL-NET))
-else
-UNITDIR_FCL-NET=
-endif
-endif
-ifdef UNITDIR_FCL-NET
-override COMPILER_UNITDIR+=$(UNITDIR_FCL-NET)
+ifdef UNITDIR_PASZLIB
+override COMPILER_UNITDIR+=$(UNITDIR_PASZLIB)
endif
endif
ifdef REQUIRE_PACKAGES_FCL-PROCESS
@@ -2642,264 +1598,30 @@ ifdef UNITDIR_FCL-PROCESS
override COMPILER_UNITDIR+=$(UNITDIR_FCL-PROCESS)
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)/units/$(TARGETSUFFIX)),)
-UNITDIR_IBASE=$(PACKAGEDIR_IBASE)/units/$(TARGETSUFFIX)
-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
-ifdef REQUIRE_PACKAGES_POSTGRES
-PACKAGEDIR_POSTGRES:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /postgres/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_POSTGRES),)
-ifneq ($(wildcard $(PACKAGEDIR_POSTGRES)/units/$(TARGETSUFFIX)),)
-UNITDIR_POSTGRES=$(PACKAGEDIR_POSTGRES)/units/$(TARGETSUFFIX)
-else
-UNITDIR_POSTGRES=$(PACKAGEDIR_POSTGRES)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_POSTGRES)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_POSTGRES) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_POSTGRES)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_POSTGRES=
-UNITDIR_POSTGRES:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /postgres/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_POSTGRES),)
-UNITDIR_POSTGRES:=$(firstword $(UNITDIR_POSTGRES))
-else
-UNITDIR_POSTGRES=
-endif
-endif
-ifdef UNITDIR_POSTGRES
-override COMPILER_UNITDIR+=$(UNITDIR_POSTGRES)
-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)/units/$(TARGETSUFFIX)),)
-UNITDIR_MYSQL=$(PACKAGEDIR_MYSQL)/units/$(TARGETSUFFIX)
-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_ODBC
-PACKAGEDIR_ODBC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /odbc/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_ODBC),)
-ifneq ($(wildcard $(PACKAGEDIR_ODBC)/units/$(TARGETSUFFIX)),)
-UNITDIR_ODBC=$(PACKAGEDIR_ODBC)/units/$(TARGETSUFFIX)
-else
-UNITDIR_ODBC=$(PACKAGEDIR_ODBC)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_ODBC)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_ODBC) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_ODBC)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_ODBC=
-UNITDIR_ODBC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /odbc/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_ODBC),)
-UNITDIR_ODBC:=$(firstword $(UNITDIR_ODBC))
-else
-UNITDIR_ODBC=
-endif
-endif
-ifdef UNITDIR_ODBC
-override COMPILER_UNITDIR+=$(UNITDIR_ODBC)
-endif
-endif
-ifdef REQUIRE_PACKAGES_ORACLE
-PACKAGEDIR_ORACLE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /oracle/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_ORACLE),)
-ifneq ($(wildcard $(PACKAGEDIR_ORACLE)/units/$(TARGETSUFFIX)),)
-UNITDIR_ORACLE=$(PACKAGEDIR_ORACLE)/units/$(TARGETSUFFIX)
-else
-UNITDIR_ORACLE=$(PACKAGEDIR_ORACLE)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_ORACLE)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_ORACLE) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_ORACLE)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_ORACLE=
-UNITDIR_ORACLE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /oracle/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_ORACLE),)
-UNITDIR_ORACLE:=$(firstword $(UNITDIR_ORACLE))
-else
-UNITDIR_ORACLE=
-endif
-endif
-ifdef UNITDIR_ORACLE
-override COMPILER_UNITDIR+=$(UNITDIR_ORACLE)
-endif
-endif
-ifdef REQUIRE_PACKAGES_SQLITE
-PACKAGEDIR_SQLITE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /sqlite/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_SQLITE),)
-ifneq ($(wildcard $(PACKAGEDIR_SQLITE)/units/$(TARGETSUFFIX)),)
-UNITDIR_SQLITE=$(PACKAGEDIR_SQLITE)/units/$(TARGETSUFFIX)
-else
-UNITDIR_SQLITE=$(PACKAGEDIR_SQLITE)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_SQLITE)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_SQLITE) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_SQLITE)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_SQLITE=
-UNITDIR_SQLITE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /sqlite/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_SQLITE),)
-UNITDIR_SQLITE:=$(firstword $(UNITDIR_SQLITE))
-else
-UNITDIR_SQLITE=
-endif
-endif
-ifdef UNITDIR_SQLITE
-override COMPILER_UNITDIR+=$(UNITDIR_SQLITE)
-endif
-endif
-ifdef REQUIRE_PACKAGES_PXLIB
-PACKAGEDIR_PXLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /pxlib/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_PXLIB),)
-ifneq ($(wildcard $(PACKAGEDIR_PXLIB)/units/$(TARGETSUFFIX)),)
-UNITDIR_PXLIB=$(PACKAGEDIR_PXLIB)/units/$(TARGETSUFFIX)
+ifdef REQUIRE_PACKAGES_FPMKUNIT
+PACKAGEDIR_FPMKUNIT:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fpmkunit/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FPMKUNIT),)
+ifneq ($(wildcard $(PACKAGEDIR_FPMKUNIT)/units/$(TARGETSUFFIX)),)
+UNITDIR_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)/units/$(TARGETSUFFIX)
else
-UNITDIR_PXLIB=$(PACKAGEDIR_PXLIB)
+UNITDIR_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)
endif
ifdef CHECKDEPEND
-$(PACKAGEDIR_PXLIB)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_PXLIB) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_PXLIB)/$(FPCMADE)
+$(PACKAGEDIR_FPMKUNIT)/$(FPCMADE):
+ $(MAKE) -C $(PACKAGEDIR_FPMKUNIT) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FPMKUNIT)/$(FPCMADE)
endif
else
-PACKAGEDIR_PXLIB=
-UNITDIR_PXLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /pxlib/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_PXLIB),)
-UNITDIR_PXLIB:=$(firstword $(UNITDIR_PXLIB))
+PACKAGEDIR_FPMKUNIT=
+UNITDIR_FPMKUNIT:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fpmkunit/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FPMKUNIT),)
+UNITDIR_FPMKUNIT:=$(firstword $(UNITDIR_FPMKUNIT))
else
-UNITDIR_PXLIB=
+UNITDIR_FPMKUNIT=
endif
endif
-ifdef UNITDIR_PXLIB
-override COMPILER_UNITDIR+=$(UNITDIR_PXLIB)
-endif
-endif
-ifdef REQUIRE_PACKAGES_HTTPD22
-PACKAGEDIR_HTTPD22:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /httpd22/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_HTTPD22),)
-ifneq ($(wildcard $(PACKAGEDIR_HTTPD22)/units/$(TARGETSUFFIX)),)
-UNITDIR_HTTPD22=$(PACKAGEDIR_HTTPD22)/units/$(TARGETSUFFIX)
-else
-UNITDIR_HTTPD22=$(PACKAGEDIR_HTTPD22)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_HTTPD22)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_HTTPD22) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_HTTPD22)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_HTTPD22=
-UNITDIR_HTTPD22:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /httpd22/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_HTTPD22),)
-UNITDIR_HTTPD22:=$(firstword $(UNITDIR_HTTPD22))
-else
-UNITDIR_HTTPD22=
-endif
-endif
-ifdef UNITDIR_HTTPD22
-override COMPILER_UNITDIR+=$(UNITDIR_HTTPD22)
-endif
-endif
-ifdef REQUIRE_PACKAGES_FASTCGI
-PACKAGEDIR_FASTCGI:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fastcgi/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_FASTCGI),)
-ifneq ($(wildcard $(PACKAGEDIR_FASTCGI)/units/$(TARGETSUFFIX)),)
-UNITDIR_FASTCGI=$(PACKAGEDIR_FASTCGI)/units/$(TARGETSUFFIX)
-else
-UNITDIR_FASTCGI=$(PACKAGEDIR_FASTCGI)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_FASTCGI)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_FASTCGI) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_FASTCGI)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_FASTCGI=
-UNITDIR_FASTCGI:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fastcgi/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_FASTCGI),)
-UNITDIR_FASTCGI:=$(firstword $(UNITDIR_FASTCGI))
-else
-UNITDIR_FASTCGI=
-endif
-endif
-ifdef UNITDIR_FASTCGI
-override COMPILER_UNITDIR+=$(UNITDIR_FASTCGI)
-endif
-endif
-ifdef REQUIRE_PACKAGES_UNIVINT
-PACKAGEDIR_UNIVINT:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /univint/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_UNIVINT),)
-ifneq ($(wildcard $(PACKAGEDIR_UNIVINT)/units/$(TARGETSUFFIX)),)
-UNITDIR_UNIVINT=$(PACKAGEDIR_UNIVINT)/units/$(TARGETSUFFIX)
-else
-UNITDIR_UNIVINT=$(PACKAGEDIR_UNIVINT)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_UNIVINT)/$(FPCMADE):
- $(MAKE) -C $(PACKAGEDIR_UNIVINT) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_UNIVINT)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_UNIVINT=
-UNITDIR_UNIVINT:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /univint/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_UNIVINT),)
-UNITDIR_UNIVINT:=$(firstword $(UNITDIR_UNIVINT))
-else
-UNITDIR_UNIVINT=
-endif
-endif
-ifdef UNITDIR_UNIVINT
-override COMPILER_UNITDIR+=$(UNITDIR_UNIVINT)
+ifdef UNITDIR_FPMKUNIT
+override COMPILER_UNITDIR+=$(UNITDIR_FPMKUNIT)
endif
endif
ifndef NOCPUDEF
@@ -3021,12 +1743,6 @@ endif
endif
ifdef LINKSHARED
endif
-ifdef GCCLIBDIR
-override FPCOPT+=-Fl$(GCCLIBDIR)
-endif
-ifdef OTHERLIBDIR
-override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
-endif
ifdef OPT
override FPCOPT+=$(OPT)
endif
@@ -3400,473 +2116,37 @@ 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
-ifeq ($(FULL_TARGET),i386-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-go32v2)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-win32)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-os2)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-freebsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-beos)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-haiku)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-netbsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-solaris)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-qnx)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-netware)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-openbsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-wdosx)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-darwin)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-emx)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-watcom)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-netwlibc)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-wince)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-symbian)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-nativent)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),i386-iphonesim)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),m68k-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),m68k-freebsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),m68k-netbsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),m68k-amiga)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),m68k-atari)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),m68k-openbsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),m68k-palmos)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),m68k-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc-netbsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc-amiga)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc-macos)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc-darwin)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc-morphos)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),sparc-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),sparc-netbsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),sparc-solaris)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),sparc-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),x86_64-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),x86_64-freebsd)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),x86_64-solaris)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),x86_64-darwin)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),x86_64-win64)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),x86_64-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),arm-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),arm-palmos)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),arm-darwin)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),arm-wince)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),arm-gba)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),arm-nds)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),arm-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),arm-symbian)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc64-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc64-darwin)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),powerpc64-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),avr-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),armeb-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),armeb-embedded)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifeq ($(FULL_TARGET),mipsel-linux)
-TARGET_DIRS_SRC/BASE=1
-TARGET_DIRS_SRC/WEBDATA=1
-TARGET_DIRS_SRC/JSONRPC=1
-endif
-ifdef TARGET_DIRS_SRC/BASE
-src/base_all:
- $(MAKE) -C src/base all
-src/base_debug:
- $(MAKE) -C src/base debug
-src/base_smart:
- $(MAKE) -C src/base smart
-src/base_release:
- $(MAKE) -C src/base release
-src/base_units:
- $(MAKE) -C src/base units
-src/base_examples:
- $(MAKE) -C src/base examples
-src/base_shared:
- $(MAKE) -C src/base shared
-src/base_install:
- $(MAKE) -C src/base install
-src/base_sourceinstall:
- $(MAKE) -C src/base sourceinstall
-src/base_exampleinstall:
- $(MAKE) -C src/base exampleinstall
-src/base_distinstall:
- $(MAKE) -C src/base distinstall
-src/base_zipinstall:
- $(MAKE) -C src/base zipinstall
-src/base_zipsourceinstall:
- $(MAKE) -C src/base zipsourceinstall
-src/base_zipexampleinstall:
- $(MAKE) -C src/base zipexampleinstall
-src/base_zipdistinstall:
- $(MAKE) -C src/base zipdistinstall
-src/base_clean:
- $(MAKE) -C src/base clean
-src/base_distclean:
- $(MAKE) -C src/base distclean
-src/base_cleanall:
- $(MAKE) -C src/base cleanall
-src/base_info:
- $(MAKE) -C src/base info
-src/base_makefiles:
- $(MAKE) -C src/base makefiles
-src/base:
- $(MAKE) -C src/base all
-.PHONY: src/base_all src/base_debug src/base_smart src/base_release src/base_units src/base_examples src/base_shared src/base_install src/base_sourceinstall src/base_exampleinstall src/base_distinstall src/base_zipinstall src/base_zipsourceinstall src/base_zipexampleinstall src/base_zipdistinstall src/base_clean src/base_distclean src/base_cleanall src/base_info src/base_makefiles src/base
-endif
-ifdef TARGET_DIRS_SRC/WEBDATA
-src/webdata_all:
- $(MAKE) -C src/webdata all
-src/webdata_debug:
- $(MAKE) -C src/webdata debug
-src/webdata_smart:
- $(MAKE) -C src/webdata smart
-src/webdata_release:
- $(MAKE) -C src/webdata release
-src/webdata_units:
- $(MAKE) -C src/webdata units
-src/webdata_examples:
- $(MAKE) -C src/webdata examples
-src/webdata_shared:
- $(MAKE) -C src/webdata shared
-src/webdata_install:
- $(MAKE) -C src/webdata install
-src/webdata_sourceinstall:
- $(MAKE) -C src/webdata sourceinstall
-src/webdata_exampleinstall:
- $(MAKE) -C src/webdata exampleinstall
-src/webdata_distinstall:
- $(MAKE) -C src/webdata distinstall
-src/webdata_zipinstall:
- $(MAKE) -C src/webdata zipinstall
-src/webdata_zipsourceinstall:
- $(MAKE) -C src/webdata zipsourceinstall
-src/webdata_zipexampleinstall:
- $(MAKE) -C src/webdata zipexampleinstall
-src/webdata_zipdistinstall:
- $(MAKE) -C src/webdata zipdistinstall
-src/webdata_clean:
- $(MAKE) -C src/webdata clean
-src/webdata_distclean:
- $(MAKE) -C src/webdata distclean
-src/webdata_cleanall:
- $(MAKE) -C src/webdata cleanall
-src/webdata_info:
- $(MAKE) -C src/webdata info
-src/webdata_makefiles:
- $(MAKE) -C src/webdata makefiles
-src/webdata:
- $(MAKE) -C src/webdata all
-.PHONY: src/webdata_all src/webdata_debug src/webdata_smart src/webdata_release src/webdata_units src/webdata_examples src/webdata_shared src/webdata_install src/webdata_sourceinstall src/webdata_exampleinstall src/webdata_distinstall src/webdata_zipinstall src/webdata_zipsourceinstall src/webdata_zipexampleinstall src/webdata_zipdistinstall src/webdata_clean src/webdata_distclean src/webdata_cleanall src/webdata_info src/webdata_makefiles src/webdata
-endif
-ifdef TARGET_DIRS_SRC/JSONRPC
-src/jsonrpc_all:
- $(MAKE) -C src/jsonrpc all
-src/jsonrpc_debug:
- $(MAKE) -C src/jsonrpc debug
-src/jsonrpc_smart:
- $(MAKE) -C src/jsonrpc smart
-src/jsonrpc_release:
- $(MAKE) -C src/jsonrpc release
-src/jsonrpc_units:
- $(MAKE) -C src/jsonrpc units
-src/jsonrpc_examples:
- $(MAKE) -C src/jsonrpc examples
-src/jsonrpc_shared:
- $(MAKE) -C src/jsonrpc shared
-src/jsonrpc_install:
- $(MAKE) -C src/jsonrpc install
-src/jsonrpc_sourceinstall:
- $(MAKE) -C src/jsonrpc sourceinstall
-src/jsonrpc_exampleinstall:
- $(MAKE) -C src/jsonrpc exampleinstall
-src/jsonrpc_distinstall:
- $(MAKE) -C src/jsonrpc distinstall
-src/jsonrpc_zipinstall:
- $(MAKE) -C src/jsonrpc zipinstall
-src/jsonrpc_zipsourceinstall:
- $(MAKE) -C src/jsonrpc zipsourceinstall
-src/jsonrpc_zipexampleinstall:
- $(MAKE) -C src/jsonrpc zipexampleinstall
-src/jsonrpc_zipdistinstall:
- $(MAKE) -C src/jsonrpc zipdistinstall
-src/jsonrpc_clean:
- $(MAKE) -C src/jsonrpc clean
-src/jsonrpc_distclean:
- $(MAKE) -C src/jsonrpc distclean
-src/jsonrpc_cleanall:
- $(MAKE) -C src/jsonrpc cleanall
-src/jsonrpc_info:
- $(MAKE) -C src/jsonrpc info
-src/jsonrpc_makefiles:
- $(MAKE) -C src/jsonrpc makefiles
-src/jsonrpc:
- $(MAKE) -C src/jsonrpc all
-.PHONY: src/jsonrpc_all src/jsonrpc_debug src/jsonrpc_smart src/jsonrpc_release src/jsonrpc_units src/jsonrpc_examples src/jsonrpc_shared src/jsonrpc_install src/jsonrpc_sourceinstall src/jsonrpc_exampleinstall src/jsonrpc_distinstall src/jsonrpc_zipinstall src/jsonrpc_zipsourceinstall src/jsonrpc_zipexampleinstall src/jsonrpc_zipdistinstall src/jsonrpc_clean src/jsonrpc_distclean src/jsonrpc_cleanall src/jsonrpc_info src/jsonrpc_makefiles src/jsonrpc
-endif
-all: $(addsuffix _all,$(TARGET_DIRS))
-debug: $(addsuffix _debug,$(TARGET_DIRS))
-smart: $(addsuffix _smart,$(TARGET_DIRS))
-release: $(addsuffix _release,$(TARGET_DIRS))
-units: $(addsuffix _units,$(TARGET_DIRS))
-examples: $(addsuffix _examples,$(TARGET_DIRS))
-shared: $(addsuffix _shared,$(TARGET_DIRS))
-install: fpc_install $(addsuffix _install,$(TARGET_DIRS))
+units:
+examples:
+shared:
sourceinstall: fpc_sourceinstall
-exampleinstall: fpc_exampleinstall $(addsuffix _exampleinstall,$(TARGET_DIRS))
+exampleinstall: fpc_exampleinstall
distinstall: fpc_distinstall
zipinstall: fpc_zipinstall
zipsourceinstall: fpc_zipsourceinstall
-zipexampleinstall: fpc_zipexampleinstall $(addsuffix _zipexampleinstall,$(TARGET_DIRS))
+zipexampleinstall: fpc_zipexampleinstall
zipdistinstall: fpc_zipdistinstall
+distclean:
+cleanall:
info: fpc_info
makefiles: fpc_makefiles
-.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall info makefiles
+.PHONY: units examples shared sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall distclean cleanall info makefiles
ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
-.NOTPARALLEL:
-distclean: $(addsuffix _distclean,$(TARGET_DIRS)) fpc_distclean
-clean: $(addsuffix _clean,$(TARGET_DIRS)) fpc_clean
-cleanall: $(addsuffix _cleanall,$(TARGET_DIRS)) fpc_cleanall
+$(COMPILER_UNITTARGETDIR):
+ $(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+fpmake: $(COMPILER_UNITTARGETDIR) fpmake.pp
+ $(FPC) fpmake.pp $(FPCOPT)
+all: fpmake
+ $(LOCALFPMAKE) build --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC)
+smart: fpmake
+ $(LOCALFPMAKE) build --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC) -o "-XX -CX"
+release: fpmake
+ $(LOCALFPMAKE) build --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC) -o "-dRELEASE"
+debug: fpmake
+ $(LOCALFPMAKE) build --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC) -o "-dDEBUG"
+clean:
+ $(FPMAKE_BIN_CLEAN) clean --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC)
+install: fpmake
+ $(LOCALFPMAKE) install --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC) --prefix=$(INSTALL_PREFIX)
diff --git a/packages/fcl-web/Makefile.fpc b/packages/fcl-web/Makefile.fpc
index 8325fa92ad..d99a1e9fc2 100644
--- a/packages/fcl-web/Makefile.fpc
+++ b/packages/fcl-web/Makefile.fpc
@@ -6,25 +6,43 @@
name=fcl-web
version=2.5.1
-[target]
-dirs=src/base src/webdata src/jsonrpc
-
[require]
-packages=fcl-base fcl-xml fcl-db fcl-json fcl-net fcl-process
-
-[compiler]
-options=-S2h
-
-[install]
-fpcpackage=y
+packages=rtl fpmkunit
[default]
fpcdir=../..
-[rules]
-.NOTPARALLEL:
-distclean: $(addsuffix _distclean,$(TARGET_DIRS)) fpc_distclean
-clean: $(addsuffix _clean,$(TARGET_DIRS)) fpc_clean
-cleanall: $(addsuffix _cleanall,$(TARGET_DIRS)) fpc_cleanall
+[prerules]
+# If no fpmake exists and clean is called, do not try to build fpmake, it will
+# most often fail because the dependencies are cleared. So simply skip the
+# clean by replacing the command with 'echo'
+FPMAKE_BIN_CLEAN=$(wildcard ./fpmake$(SRCEXEEXT))
+ifeq ($(FPMAKE_BIN_CLEAN),)
+FPMAKE_BIN_CLEAN=$(ECHO)
+endif
+ifdef OS_TARGET
+FPC_TARGETOPT+=--os=$(OS_TARGET)
+endif
+ifdef CPU_TARGET
+FPC_TARGETOPT+=--cpu=$(CPU_TARGET)
+endif
+LOCALFPMAKE=.$(PATHSEP)fpmake$(EXEEXT)
+[rules]
+$(COMPILER_UNITTARGETDIR):
+ $(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+fpmake: $(COMPILER_UNITTARGETDIR) fpmake.pp
+ $(FPC) fpmake.pp $(FPCOPT)
+all: fpmake
+ $(LOCALFPMAKE) build --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC)
+smart: fpmake
+ $(LOCALFPMAKE) build --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC) -o "-XX -CX"
+release: fpmake
+ $(LOCALFPMAKE) build --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC) -o "-dRELEASE"
+debug: fpmake
+ $(LOCALFPMAKE) build --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC) -o "-dDEBUG"
+clean:
+ $(FPMAKE_BIN_CLEAN) clean --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC)
+install: fpmake
+ $(LOCALFPMAKE) install --localunitdir=../.. --globalunitdir=.. $(FPC_TARGETOPT) $(addprefix -o ,$(FPCOPT)) --compiler=$(FPC) --prefix=$(INSTALL_PREFIX)
diff --git a/packages/fcl-web/Makefile.org b/packages/fcl-web/Makefile.org
new file mode 100644
index 0000000000..8325fa92ad
--- /dev/null
+++ b/packages/fcl-web/Makefile.org
@@ -0,0 +1,30 @@
+#
+# Makefile.fpc for TDataSet for FCL
+#
+
+[package]
+name=fcl-web
+version=2.5.1
+
+[target]
+dirs=src/base src/webdata src/jsonrpc
+
+[require]
+packages=fcl-base fcl-xml fcl-db fcl-json fcl-net fcl-process
+
+[compiler]
+options=-S2h
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../..
+
+[rules]
+.NOTPARALLEL:
+distclean: $(addsuffix _distclean,$(TARGET_DIRS)) fpc_distclean
+clean: $(addsuffix _clean,$(TARGET_DIRS)) fpc_clean
+cleanall: $(addsuffix _cleanall,$(TARGET_DIRS)) fpc_cleanall
+
+
diff --git a/packages/fcl-web/examples/combined/combined.html b/packages/fcl-web/examples/combined/combined.html
new file mode 100644
index 0000000000..377a592a90
--- /dev/null
+++ b/packages/fcl-web/examples/combined/combined.html
@@ -0,0 +1,20 @@
+<html>
+<head>
+<title>ExtJS application demo</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="combined.cgi/Login/API"></script>
+<script src="login.js"></script>
+<script>
+Ext.onReady(function() {
+ // API is registered under FPWeb by default.
+ Ext.Direct.addProvider(FPWeb);
+ fpWeb.login=new fpWeb.LoginForm({});
+ fpWeb.login.show();
+});
+</script>
+</head>
+<body>
+</body>
+</html> \ No newline at end of file
diff --git a/packages/fcl-web/examples/combined/combined.ico b/packages/fcl-web/examples/combined/combined.ico
new file mode 100644
index 0000000000..0341321b5d
--- /dev/null
+++ b/packages/fcl-web/examples/combined/combined.ico
Binary files differ
diff --git a/packages/fcl-web/examples/combined/combined.ini b/packages/fcl-web/examples/combined/combined.ini
new file mode 100644
index 0000000000..4220bcf27d
--- /dev/null
+++ b/packages/fcl-web/examples/combined/combined.ini
@@ -0,0 +1,4 @@
+[Database]
+Path=/home/firebird/combined.fb
+UserName=WISASOFT
+Password=SysteemD
diff --git a/packages/fcl-web/examples/combined/combined.lpi b/packages/fcl-web/examples/combined/combined.lpi
new file mode 100644
index 0000000000..beb1bbc61e
--- /dev/null
+++ b/packages/fcl-web/examples/combined/combined.lpi
@@ -0,0 +1,116 @@
+<?xml version="1.0"?>
+<CONFIG>
+ <ProjectOptions>
+ <Version Value="9"/>
+ <General>
+ <Flags>
+ <SaveOnlyProjectUnits Value="True"/>
+ <MainUnitHasCreateFormStatements Value="False"/>
+ <Runnable Value="False"/>
+ </Flags>
+ <SessionStorage Value="InProjectDir"/>
+ <MainUnit Value="0"/>
+ <Title Value="Combined RPC/Webdata example"/>
+ <ResourceType Value="res"/>
+ <UseXPManifest Value="True"/>
+ <Icon Value="0"/>
+ </General>
+ <i18n>
+ <EnableI18N LFM="False"/>
+ </i18n>
+ <VersionInfo>
+ <StringTable ProductVersion=""/>
+ </VersionInfo>
+ <BuildModes Count="1">
+ <Item1 Name="Default" Default="True"/>
+ </BuildModes>
+ <PublishOptions>
+ <Version Value="2"/>
+ <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+ <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
+ </PublishOptions>
+ <RunParams>
+ <local>
+ <FormatVersion Value="1"/>
+ <LaunchingApplication PathPlusParams="/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+ </local>
+ </RunParams>
+ <RequiredPackages Count="5">
+ <Item1>
+ <PackageName Value="SQLDBLaz"/>
+ <MinVersion Major="1" Release="1" Valid="True"/>
+ </Item1>
+ <Item2>
+ <PackageName Value="lazwebextra"/>
+ <MinVersion Minor="9" Valid="True"/>
+ </Item2>
+ <Item3>
+ <PackageName Value="WebLaz"/>
+ </Item3>
+ <Item4>
+ <PackageName Value="LCL"/>
+ </Item4>
+ <Item5>
+ <PackageName Value="FCL"/>
+ </Item5>
+ </RequiredPackages>
+ <Units Count="5">
+ <Unit0>
+ <Filename Value="combined.lpr"/>
+ <IsPartOfProject Value="True"/>
+ <UnitName Value="combined"/>
+ </Unit0>
+ <Unit1>
+ <Filename Value="wmlogin.pp"/>
+ <IsPartOfProject Value="True"/>
+ <ComponentName Value="SessionManagement"/>
+ <ResourceBaseClass Value="DataModule"/>
+ <UnitName Value="wmlogin"/>
+ </Unit1>
+ <Unit2>
+ <Filename Value="wmusers.pp"/>
+ <IsPartOfProject Value="True"/>
+ <ComponentName Value="CombinedModule"/>
+ <HasResources Value="True"/>
+ <ResourceBaseClass Value="DataModule"/>
+ <UnitName Value="wmusers"/>
+ </Unit2>
+ <Unit3>
+ <Filename Value="login.js"/>
+ <IsPartOfProject Value="True"/>
+ </Unit3>
+ <Unit4>
+ <Filename Value="users.js"/>
+ <IsPartOfProject Value="True"/>
+ </Unit4>
+ </Units>
+ </ProjectOptions>
+ <CompilerOptions>
+ <Version Value="10"/>
+ <Target>
+ <Filename Value="combined.cgi"/>
+ </Target>
+ <SearchPaths>
+ <IncludeFiles Value="$(ProjOutDir)"/>
+ </SearchPaths>
+ <Other>
+ <CompilerMessages>
+ <UseMsgFile Value="True"/>
+ </CompilerMessages>
+ <CompilerPath Value="$(CompPath)"/>
+ </Other>
+ </CompilerOptions>
+ <Debugging>
+ <Exceptions Count="3">
+ <Item1>
+ <Name Value="EAbort"/>
+ </Item1>
+ <Item2>
+ <Name Value="ECodetoolError"/>
+ </Item2>
+ <Item3>
+ <Name Value="EFOpenError"/>
+ </Item3>
+ </Exceptions>
+ </Debugging>
+</CONFIG>
diff --git a/packages/fcl-web/examples/combined/combined.lpr b/packages/fcl-web/examples/combined/combined.lpr
new file mode 100644
index 0000000000..a1450e60c6
--- /dev/null
+++ b/packages/fcl-web/examples/combined/combined.lpr
@@ -0,0 +1,15 @@
+program combined;
+
+{$mode objfpc}{$H+}
+
+uses
+ fpCGI, wmusers, httpdefs, websession,wmlogin;
+
+{$R *.res}
+
+begin
+ Application.Title:='Combined RPC/Webdata example';
+ Application.Initialize;
+ Application.Run;
+end.
+
diff --git a/packages/fcl-web/examples/combined/combined.res b/packages/fcl-web/examples/combined/combined.res
new file mode 100644
index 0000000000..7c6cf3e4be
--- /dev/null
+++ b/packages/fcl-web/examples/combined/combined.res
Binary files differ
diff --git a/packages/fcl-web/examples/combined/combined.sql b/packages/fcl-web/examples/combined/combined.sql
new file mode 100644
index 0000000000..e5b4c595aa
--- /dev/null
+++ b/packages/fcl-web/examples/combined/combined.sql
@@ -0,0 +1,11 @@
+CREATE TABLE USERS (
+ U_ID BIGINT NOT NULL,
+ U_LOGIN VARCHAR(40) NOT NULL,
+ U_NAME VARCHAR(30) NOT NULL,
+ U_EMAIL VARCHAR(100),
+ U_PASSWORD VARCHAR(100) NOT NULL,
+ CONSTRAINT PK_FPCUSERS PRIMARY KEY (U_ID),
+ CONSTRAINT U_USERNAME UNIQUE (U_LOGIN)
+);
+
+ \ No newline at end of file
diff --git a/packages/fcl-web/examples/combined/login.js b/packages/fcl-web/examples/combined/login.js
new file mode 100644
index 0000000000..8d78375d30
--- /dev/null
+++ b/packages/fcl-web/examples/combined/login.js
@@ -0,0 +1,105 @@
+Ext.ns("fpWeb");
+fpWeb.LoginForm = Ext.extend (Ext.Window, {
+ /* Control references */
+ blogin : null,
+ eusername : null,
+ epassword : null,
+ plock : null,
+ fform : null,
+ /* Callbacks */
+ OnLogin : function (Provider,Response) {
+ if (!Ext.isEmpty(Response.error)) {
+ Ext.Msg.show({
+ title : 'Login failed',
+ msg : 'An error occurred during login: '+Response.error.message+'. Please try again.',
+ icon : Ext.Msg.ERROR,
+ buttons : Ext.Msg.OK
+ });
+ } else if (Response.result > 0) {
+ // here code to switch to data editing
+ window.location='users.html';
+/*
+ Ext.Msg.show({
+ title : 'Login OK',
+ msg : 'Your username/pasword was accepted. We will now proceed to the editing form',
+ icon : Ext.Msg.ERROR,
+ buttons : Ext.Msg.OK
+ });
+*/
+ } else {
+ Ext.Msg.show({
+ title : 'Login failed',
+ msg : 'Your username/pasword is incorrect. Please try again.',
+ icon : Ext.Msg.ERROR,
+ buttons : Ext.Msg.OK
+ });
+ }
+ },
+ loginbuttonclick : function (sender) {
+ SessionManagement.Login(this.eusername.getValue(), this.epassword.getValue(),this.OnLogin.createDelegate(this));
+ },
+ focususer : function () {
+ this.eusername.focus();
+ },
+ /* Build the actual form */
+ constructor : function (config) {
+ this.eusername = new Ext.form.TextField({
+ name:"user",
+ fieldLabel:"Login",
+ inputType:"text"
+ });
+ this.epassword = new Ext.form.TextField({
+ name:"pass",
+ fieldLabel:"Password",
+ inputType:"password"
+ });
+ this.blogin = new Ext.Button({
+ text:"Login",
+ handler : this.loginbuttonclick,
+ scope : this
+ });
+ this.fform = new Ext.form.FormPanel({
+ width: 350,
+ labelWidth:150,
+ border:false,
+ xtype: "form",
+ buttonAlign: "right",
+ bodyStyle: "padding: 10px 15px",
+ defaultType: "textfield",
+ defaults: {width: 150},
+ items: [this.eusername,this.epassword],
+ buttons:[this.blogin],
+ keys: {key: Ext.EventObject.ENTER,
+ handler: function(){
+ this.blogin.focus();
+ },
+ scope: this
+ }
+ });
+ this.plock = new Ext.Panel({
+ border:false,
+ html:"<img src='login.png' width=114 height=128/>",
+ width:114,
+ height:128
+ });
+ Ext.apply(config, {
+ title: "Login",
+ width: 500,
+ height: 200,
+ plain: true,
+ layout: "hbox",
+ defaultButton: this.eusername,
+ layoutConfig: {
+ align : "middle",
+ pack: "center"
+ },
+ closable: false,
+ listeners: {
+ 'show' : { fn: this.focususer.createDelegate(this) }
+ },
+ items: [ this.fform, this.plock ]
+ });
+ fpWeb.LoginForm.superclass.constructor.call(this,config);
+ } /* constructor*/
+});
+
diff --git a/packages/fcl-web/examples/combined/login.png b/packages/fcl-web/examples/combined/login.png
new file mode 100644
index 0000000000..e1a2633df2
--- /dev/null
+++ b/packages/fcl-web/examples/combined/login.png
Binary files differ
diff --git a/packages/fcl-web/examples/combined/users.html b/packages/fcl-web/examples/combined/users.html
new file mode 100644
index 0000000000..ea47d6f45d
--- /dev/null
+++ b/packages/fcl-web/examples/combined/users.html
@@ -0,0 +1,18 @@
+<html>
+<head>
+<title>Edit users in database</title>
+<link rel="stylesheet" type="text/css" href="/ext/resources/css/ext-all.css"/>
+<script src="/ext/adapter/ext/ext-base.js"></script>
+<script src="/ext/ext-all-debug.js"></script>
+<script src="combined.cgi/Login/API"></script>
+<script src="users.js"></script>
+<script>
+Ext.onReady(function() {
+ // API is registered under FPWeb by default.
+ Ext.Direct.addProvider(FPWeb);
+});
+</script>
+</head>
+<body>
+</body>
+</html> \ No newline at end of file
diff --git a/packages/fcl-web/examples/combined/users.js b/packages/fcl-web/examples/combined/users.js
new file mode 100644
index 0000000000..063c2dca6f
--- /dev/null
+++ b/packages/fcl-web/examples/combined/users.js
@@ -0,0 +1,108 @@
+Ext.ns('fpWeb');
+
+fpWeb.ShowPage = function () {
+ var myproxy = new Ext.data.HttpProxy ( {
+ api : {
+ read: "combined.cgi/Provider/Users/Read/",
+ update: "combined.cgi/Provider/Users/Update/",
+ create: "combined.cgi/Provider/Users/Insert/",
+ destroy: "combined.cgi/Provider/Users/Delete/"
+ }
+ });
+ var myreader = new Ext.data.JsonReader ({
+ root: "rows",
+ successProperty : 'success',
+ idProperty: "U_ID",
+ messageProperty: 'message', // Must be specified here
+ fields: ["U_ID","U_LOGIN","U_NAME","U_EMAIL", "U_PASSWORD"]
+ });
+ var mywriter = new Ext.data.JsonWriter({
+ encode: true,
+ writeAllFields: true,
+ idProperty: "U_ID"
+ });
+ var data = new Ext.data.Store({
+ proxy: myproxy,
+ reader: myreader,
+ writer: mywriter,
+ autoSave: false,
+ idProperty: "U_ID",
+ });
+ // Listen to errors.
+ data.addListener('exception', function(proxy, type, action, options, res) {
+ if (type === 'remote') {
+ Ext.Msg.show({
+ title: 'REMOTE EXCEPTION',
+ msg: res.message,
+ icon: Ext.MessageBox.ERROR,
+ buttons: Ext.Msg.OK
+ });
+ }
+ });
+ data.load({ params:{start: 0, limit: 30}});
+ var grid = new Ext.grid.EditorGridPanel({
+ renderTo: Ext.getBody(),
+ frame: true,
+ title: "Known users",
+ height: 600,
+ width: 800,
+ store: data,
+ columns: [
+ {header: 'ID', dataIndex: "U_ID", sortable: true, hidden: true},
+ {header: 'Login', dataIndex: "U_LOGIN", sortable: true, editor: new Ext.form.TextField({allowBlank: false})},
+ {header: 'Name', dataIndex: "U_NAME", sortable: true, editor: new Ext.form.TextField({allowBlank: false}), width : 200},
+ {header: 'Email', dataIndex: "U_EMAIL", sortable: true, editor: new Ext.form.TextField({allowBlank: false}), width : 200},
+ {header: 'Password', dataIndex: "U_PASSWORD", sortable: true, editor: new Ext.form.TextField()},
+ ],
+ bbar: new Ext.PagingToolbar({
+ pageSize: 30,
+ store: data,
+ displayInfo: true
+ }),
+ tbar : [{
+ text: 'Add',
+ iconCls: 'icon-add',
+ handler: function(btn, ev) {
+ var u = new grid.store.recordType();
+ grid.stopEditing();
+ grid.store.insert(0, u);
+ grid.startEditing(0, 1);
+ },
+ scope: grid
+ }, '-', {
+ text: 'Delete',
+ iconCls: 'icon-delete',
+ handler: function(btn, ev) {
+ var index = grid.getSelectionModel().getSelectedCell();
+ if (!index) {
+ return false;
+ }
+ var rec = grid.store.getAt(index[0]);
+ grid.store.remove(rec);
+ },
+ scope: grid
+ }, '-', {
+ text: 'Save',
+ iconCls: 'icon-save',
+ handler: function(btn, ev) {
+ grid.store.save();
+ },
+ scope: grid
+ },'->', {
+ text: 'Log out',
+ iconCls: 'logout',
+ handler: function () {
+ SessionManagement.Logout(function (provider,response) {
+ if (response.result=='Bye') {
+ window.location='combined.html';
+ }
+ });
+ }
+ }
+ ]
+ // F.ContentToStream(M);
+
+ });
+ grid.show();
+}
+Ext.onReady(fpWeb.ShowPage);
diff --git a/packages/fcl-web/examples/combined/users.sql b/packages/fcl-web/examples/combined/users.sql
new file mode 100644
index 0000000000..daec6fb64d
--- /dev/null
+++ b/packages/fcl-web/examples/combined/users.sql
@@ -0,0 +1,15 @@
+CREATE TABLE USERS (
+U_ID BIGINT Not Null ,
+U_LOGIN VARCHAR(40) Not Null,
+U_NAME VARCHAR(30) Not Null,
+U_EMAIL VARCHAR(100),
+U_PASSWORD VARCHAR(100) Not Null,
+CONSTRAINT PK_FPCUSERS Primary key (U_ID),
+CONSTRAINT U_USERNAME Unique key (U_LOGIN)
+);
+
+COMMIT;
+
+CREATE GENERATOR GEN_USERS;
+
+COMMIT;
diff --git a/packages/fcl-web/examples/combined/wmlogin.lfm b/packages/fcl-web/examples/combined/wmlogin.lfm
new file mode 100644
index 0000000000..e41c9d2bc0
--- /dev/null
+++ b/packages/fcl-web/examples/combined/wmlogin.lfm
@@ -0,0 +1,76 @@
+object SessionManagement: TSessionManagement
+ OnCreate = DataModuleCreate
+ OldCreateOrder = False
+ DispatchOptions = [jdoSearchRegistry, jdoSearchOwner, jdoJSONRPC1, jdoJSONRPC2, jdoNotifications]
+ APIPath = 'API'
+ RouterPath = 'router'
+ Height = 200
+ HorizontalOffset = 582
+ VerticalOffset = 455
+ Width = 295
+ object Login: TJSONRPCHandler
+ OnExecute = LoginExecute
+ Options = []
+ ParamDefs = <
+ item
+ Name = 'UserName'
+ end
+ item
+ Name = 'Password'
+ end>
+ left = 24
+ top = 24
+ end
+ object IBConnection1: TIBConnection
+ Connected = False
+ LoginPrompt = False
+ KeepConnection = False
+ Transaction = SQLTransaction1
+ LogEvents = []
+ left = 24
+ top = 117
+ end
+ object SQLTransaction1: TSQLTransaction
+ Active = False
+ Action = caNone
+ Database = IBConnection1
+ left = 26
+ top = 72
+ end
+ object QAuthenticate: TSQLQuery
+ AutoCalcFields = False
+ Database = IBConnection1
+ Transaction = SQLTransaction1
+ ReadOnly = False
+ SQL.Strings = (
+ 'SELECT'
+ ' U_ID, U_NAME'
+ 'From'
+ ' USERS'
+ 'WHERE'
+ ' (U_LOGIN = :LOGIN)'
+ ' AND (U_PASSWORD=:PASSWORD);'
+ ''
+ )
+ Params = <
+ item
+ DataType = ftUnknown
+ Name = 'LOGIN'
+ ParamType = ptUnknown
+ end
+ item
+ DataType = ftUnknown
+ Name = 'PASSWORD'
+ ParamType = ptUnknown
+ end>
+ left = 128
+ top = 117
+ end
+ object Logout: TJSONRPCHandler
+ OnExecute = LogoutExecute
+ Options = []
+ ParamDefs = <>
+ left = 120
+ top = 16
+ end
+end
diff --git a/packages/fcl-web/examples/combined/wmlogin.pp b/packages/fcl-web/examples/combined/wmlogin.pp
new file mode 100644
index 0000000000..671dedcd27
--- /dev/null
+++ b/packages/fcl-web/examples/combined/wmlogin.pp
@@ -0,0 +1,129 @@
+unit wmlogin;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, HTTPDefs, websession, fpHTTP, fpWeb, fpjsonrpc,
+ fpjson, IBConnection, sqldb, webjsonrpc, fpextdirect, sqldbwebdata;
+
+type
+
+ { TSessionManagement }
+
+ TSessionManagement = class(TExtDirectModule)
+ IBConnection1: TIBConnection;
+ Logout: TJSONRPCHandler;
+ Login: TJSONRPCHandler;
+ SessionManagement: TJSONRPCHandler;
+ QAuthenticate: TSQLQuery;
+ SQLTransaction1: TSQLTransaction;
+ procedure DataModuleCreate(Sender: TObject);
+ procedure LoginExecute(Sender: TObject; const Params: TJSONData;
+ out Res: TJSONData);
+ procedure LogoutExecute(Sender: TObject; const Params: TJSONData;
+ out Res: TJSONData);
+ private
+ function AuthenticateUser(AUsername, APassword: String): Integer;
+ procedure DoOnNewSession(Sender: TObject);
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ SessionManagement: TSessionManagement;
+
+implementation
+
+uses inifiles;
+
+{$R *.lfm}
+
+{ TSessionManagement }
+
+function TSessionManagement.AuthenticateUser(AUsername,APassword : String) : Integer;
+
+begin
+ With QAuthenticate do
+ begin
+ ParamByName('Login').AsString:=AUserName;
+ ParamByName('Password').AsString:=APassword;
+ Open;
+ try
+ if (EOF and BOF) then
+ Result:=-1
+ else
+ begin
+ Result:=FieldByName('U_ID').AsInteger;
+ Session.Variables['UserName']:=FieldByName('U_NAME').AsString;
+ end;
+ Session.Variables['UserID']:=IntToStr(Result);
+ finally
+ Close;
+ end;
+ end;
+end;
+
+procedure TSessionManagement.LoginExecute(Sender: TObject;
+ const Params: TJSONData; out Res: TJSONData);
+
+Var
+ A : TJSONArray ;
+ AUserName,APassword : String;
+begin
+ A:=Params as TJSONArray;
+ AUserName:=A.Strings[0];
+ APassword:=A.Strings[1];
+ Res:=TJSONIntegerNumber.Create(AuthenticateUser(AUsername,APassword));
+end;
+
+procedure TSessionManagement.LogoutExecute(Sender: TObject;
+ const Params: TJSONData; out Res: TJSONData);
+begin
+ // To be sure
+ Session.Variables['UserID']:='-1';
+ Session.Terminate;
+ // A result must always be sent back.
+ Res:=TJSONString.Create('Bye');
+end;
+
+procedure TSessionManagement.DoOnNewSession(Sender : TObject);
+
+begin
+ // The cookies must all originate from the same path, otherwise the 2 datamodules will use a different session.
+ (Sender as TFPWebSession).SessionCookiePath:='/';
+end;
+
+procedure TSessionManagement.DataModuleCreate(Sender: TObject);
+Var
+ FN : String;
+ Ini : TMemIniFile;
+
+begin
+ // The following 2 statements are needed because the 2 properties are (currently) not published.
+ OnNewSession:=@DoOnNewSession;
+ CreateSession:=True;
+ FN:=ChangeFileExt(Paramstr(0),'.ini');
+ If FileExists(FN) then
+ begin
+ Ini:=TMemIniFile.Create(FN);
+ try
+ With IBConnection1 do
+ begin
+ DatabaseName:=Ini.ReadString('Database','Path',DatabaseName);
+ UserName:=Ini.ReadString('Database','UserName',UserName);
+ Password:=Ini.ReadString('Database','Password',Password);
+ end;
+ finally
+ Ini.Free;
+ end;
+ end;
+ IBConnection1.Connected:=True;
+end;
+
+initialization
+ RegisterHTTPModule('Login', TSessionManagement);
+end.
+
diff --git a/packages/fcl-web/examples/combined/wmusers.lfm b/packages/fcl-web/examples/combined/wmusers.lfm
new file mode 100644
index 0000000000..15f6dcad02
--- /dev/null
+++ b/packages/fcl-web/examples/combined/wmusers.lfm
@@ -0,0 +1,94 @@
+object CombinedModule: TCombinedModule
+ OnCreate = DataModuleCreate
+ OldCreateOrder = False
+ InputAdaptor = ProviderInputAdaptor
+ ContentProducer = ProviderFormatter
+ OnGetContentProducer = DataModuleGetContentProducer
+ OnGetInputAdaptor = DataModuleGetInputAdaptor
+ OnNewSession = DataModuleNewSession
+ Height = 300
+ HorizontalOffset = 635
+ VerticalOffset = 230
+ Width = 400
+ object ProviderFormatter: TExtJSJSONDataFormatter
+ AllowPageSize = False
+ BeforeDataToJSON = ProviderFormatterBeforeDataToJSON
+ BeforeUpdate = ProviderFormatterBeforeUpdate
+ BeforeInsert = ProviderFormatterBeforeInsert
+ BeforeDelete = ProviderFormatterBeforeDelete
+ left = 272
+ top = 72
+ end
+ object Users: TSQLDBWebDataProvider
+ SelectSQL.Strings = (
+ 'SELECT FIRST :limit SKIP :start U_ID, U_NAME, U_LOGIN, U_PASSWORD, U_EMAIL FROM USERS'
+ )
+ UpdateSQL.Strings = (
+ 'UPDATE USERS SET'
+ ' U_NAME=:U_NAME,'
+ ' U_LOGIN=:U_LOGIN,'
+ ' U_EMAIL=:U_EMAIL,'
+ ' U_PASSWORD=:U_PASSWORD'
+ 'WHERE'
+ ' (U_ID=:U_ID)'
+ )
+ DeleteSQL.Strings = (
+ 'DELETE FROM USERS WHERE (U_ID=:ID)'
+ )
+ InsertSQL.Strings = (
+ 'INSERT INTO USERS'
+ '(U_ID, U_LOGIN, U_NAME, U_EMAIL, U_PASSWORD)'
+ 'VALUES'
+ '(:U_ID, :U_LOGIN, :U_NAME, :U_EMAIL, :U_PASSWORD)'
+ )
+ Connection = IBConnection1
+ IDFieldName = 'U_ID'
+ OnGetNewID = UsersGetNewID
+ Options = []
+ Params = <
+ item
+ DataType = ftUnknown
+ Name = 'limit'
+ ParamType = ptUnknown
+ end
+ item
+ DataType = ftUnknown
+ Name = 'start'
+ ParamType = ptUnknown
+ end>
+ left = 32
+ top = 72
+ end
+ object IBConnection1: TIBConnection
+ Connected = False
+ LoginPrompt = False
+ KeepConnection = False
+ Transaction = SQLTransaction1
+ LogEvents = []
+ left = 32
+ top = 16
+ end
+ object QGetID: TSQLQuery
+ AutoCalcFields = False
+ Database = IBConnection1
+ Transaction = SQLTransaction1
+ ReadOnly = False
+ SQL.Strings = (
+ 'SELECT GEN_ID(GEN_USERS,1) AS THEID FROM RDB$DATABASE'
+ )
+ Params = <>
+ left = 32
+ top = 128
+ end
+ object SQLTransaction1: TSQLTransaction
+ Active = False
+ Action = caNone
+ Database = IBConnection1
+ left = 144
+ top = 16
+ end
+ object ProviderInputAdaptor: TExtJSJSonWebdataInputAdaptor
+ left = 272
+ top = 16
+ end
+end
diff --git a/packages/fcl-web/examples/combined/wmusers.lrs b/packages/fcl-web/examples/combined/wmusers.lrs
new file mode 100644
index 0000000000..7d7cb7082d
--- /dev/null
+++ b/packages/fcl-web/examples/combined/wmusers.lrs
@@ -0,0 +1,35 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TCombinedModule','FORMDATA',[
+ 'TPF0'#15'TCombinedModule'#14'CombinedModule'#8'OnCreate'#7#16'DataModuleCrea'
+ +'te'#14'OldCreateOrder'#8#12'InputAdaptor'#7#20'ProviderInputAdaptor'#15'Con'
+ +'tentProducer'#7#17'ProviderFormatter'#20'OnGetContentProducer'#7#28'DataMod'
+ +'uleGetContentProducer'#17'OnGetInputAdaptor'#7#25'DataModuleGetInputAdaptor'
+ +#12'OnNewSession'#7#20'DataModuleNewSession'#6'Height'#3','#1#16'HorizontalO'
+ +'ffset'#3'{'#2#14'VerticalOffset'#3#230#0#5'Width'#3#144#1#0#23'TExtJSJSONDa'
+ +'taFormatter'#17'ProviderFormatter'#13'AllowPageSize'#8#16'BeforeDataToJSON'
+ +#7'!ProviderFormatterBeforeDataToJSON'#12'BeforeUpdate'#7#29'ProviderFormatt'
+ +'erBeforeUpdate'#12'BeforeInsert'#7#29'ProviderFormatterBeforeInsert'#12'Bef'
+ +'oreDelete'#7#29'ProviderFormatterBeforeDelete'#4'left'#3#16#1#3'top'#2'H'#0
+ +#0#21'TSQLDBWebDataProvider'#5'Users'#17'SelectSQL.Strings'#1#6'USELECT FIRS'
+ +'T :limit SKIP :start U_ID, U_NAME, U_LOGIN, U_PASSWORD, U_EMAIL FROM USERS'
+ +#0#17'UpdateSQL.Strings'#1#6#16'UPDATE USERS SET'#6#17' U_NAME=:U_NAME,'#6
+ +#19' U_LOGIN=:U_LOGIN,'#6#19' U_EMAIL=:U_EMAIL,'#6#24' U_PASSWORD=:U_PASS'
+ +'WORD'#6#5'WHERE'#6#14' (U_ID=:U_ID)'#0#17'DeleteSQL.Strings'#1#6'"DELETE F'
+ +'ROM USERS WHERE (U_ID=:ID)'#0#17'InsertSQL.Strings'#1#6#17'INSERT INTO USER'
+ +'S'#6',(U_ID, U_LOGIN, U_NAME, U_EMAIL, U_PASSWORD)'#6#6'VALUES'#6'1(:U_ID, '
+ +':U_LOGIN, :U_NAME, :U_EMAIL, :U_PASSWORD)'#0#10'Connection'#7#13'IBConnecti'
+ +'on1'#11'IDFieldName'#6#4'U_ID'#10'OnGetNewID'#7#13'UsersGetNewID'#7'Options'
+ +#11#0#6'Params'#14#1#8'DataType'#7#9'ftUnknown'#4'Name'#6#5'limit'#9'ParamTy'
+ +'pe'#7#9'ptUnknown'#0#1#8'DataType'#7#9'ftUnknown'#4'Name'#6#5'start'#9'Para'
+ +'mType'#7#9'ptUnknown'#0#0#4'left'#2' '#3'top'#2'H'#0#0#13'TIBConnection'#13
+ +'IBConnection1'#9'Connected'#8#11'LoginPrompt'#8#14'KeepConnection'#8#11'Tra'
+ +'nsaction'#7#15'SQLTransaction1'#9'LogEvents'#11#0#4'left'#2' '#3'top'#2#16#0
+ +#0#9'TSQLQuery'#6'QGetID'#14'AutoCalcFields'#8#8'Database'#7#13'IBConnection'
+ +'1'#11'Transaction'#7#15'SQLTransaction1'#8'ReadOnly'#8#11'SQL.Strings'#1#6
+ +'6SELECT GEN_ID(GEN_USERS,1) AS THEID FROM RDB$DATABASE'#0#6'Params'#14#0#4
+ +'left'#2' '#3'top'#3#128#0#0#0#15'TSQLTransaction'#15'SQLTransaction1'#6'Act'
+ +'ive'#8#6'Action'#7#6'caNone'#8'Database'#7#13'IBConnection1'#4'left'#3#144#0
+ +#3'top'#2#16#0#0#29'TExtJSJSonWebdataInputAdaptor'#20'ProviderInputAdaptor'#4
+ +'left'#3#16#1#3'top'#2#16#0#0#0
+]);
diff --git a/packages/fcl-web/examples/combined/wmusers.pp b/packages/fcl-web/examples/combined/wmusers.pp
new file mode 100644
index 0000000000..752b03af52
--- /dev/null
+++ b/packages/fcl-web/examples/combined/wmusers.pp
@@ -0,0 +1,145 @@
+unit wmusers;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb,
+ IBConnection, sqldb, fpwebdata, fpjson, extjsjson, extjsxml, sqldbwebdata;
+
+type
+
+ { TCombinedModule }
+
+ TCombinedModule = class(TFPWebProviderDataModule)
+ ProviderFormatter: TExtJSJSONDataFormatter;
+ ProviderInputAdaptor: TExtJSJSonWebdataInputAdaptor;
+ IBConnection1: TIBConnection;
+ Users: TSQLDBWebDataProvider;
+ QGetID: TSQLQuery;
+ SQLTransaction1: TSQLTransaction;
+ procedure DataModuleNewSession(Sender: TObject);
+ procedure ProviderFormatterBeforeDataToJSON(Sender: TObject;
+ AObject: TJSONObject);
+ procedure ProviderFormatterBeforeDelete(Sender: TObject);
+ procedure ProviderFormatterBeforeInsert(Sender: TObject);
+ procedure ProviderFormatterBeforeUpdate(Sender: TObject);
+ procedure UsersGetNewID(Sender: TObject; out AID: String);
+ procedure DataModuleCreate(Sender: TObject);
+ procedure DataModuleGetContentProducer(Sender: TObject;
+ var AContentProducer: TCustomHTTPDataContentProducer);
+ procedure DataModuleGetInputAdaptor(Sender: TObject;
+ var AInputAdaptor: TCustomWebdataInputAdaptor);
+ private
+ procedure CheckLoggedIn;
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ CombinedModule: TCombinedModule;
+
+implementation
+
+uses inifiles;
+
+{ TCombinedModule }
+
+procedure TCombinedModule.DataModuleGetContentProducer(
+ Sender: TObject; var AContentProducer: TCustomHTTPDataContentProducer);
+begin
+end;
+
+procedure TCombinedModule.DataModuleCreate(Sender: TObject);
+
+Var
+ FN : String;
+ Ini : TMemIniFile;
+
+begin
+ // Not yet published.
+ CreateSession:=True;
+ FN:=ChangeFileExt(Paramstr(0),'.ini');
+ If FileExists(FN) then
+ begin
+ Ini:=TMemIniFile.Create(FN);
+ try
+ With IBConnection1 do
+ begin
+ DatabaseName:=Ini.ReadString('Database','Path',DatabaseName);
+ UserName:=Ini.ReadString('Database','UserName',UserName);
+ Password:=Ini.ReadString('Database','Password',Password);
+ end;
+ finally
+ Ini.Free;
+ end;
+ end;
+ IBConnection1.Connected:=True;
+end;
+
+procedure TCombinedModule.UsersGetNewID(Sender: TObject; out
+ AID: String);
+begin
+ With QGetID Do
+ begin
+ Close;
+ Open;
+ try
+ if (EOF and BOF) then
+ Raise Exception.Create('No ID generated');
+ AID:=Fields[0].AsString;
+ finally
+ Close;
+ end;
+ end;
+end;
+
+procedure TCombinedModule.CheckLoggedIn;
+
+begin
+ If StrToIntDef(Session.Variables['UserID'],-1)=-1 then
+ Raise Exception.Create('You must be logged in to see or modify data');
+end;
+procedure TCombinedModule.ProviderFormatterBeforeDataToJSON(
+ Sender: TObject; AObject: TJSONObject);
+begin
+ CheckLoggedIn;
+end;
+
+procedure TCombinedModule.DataModuleNewSession(Sender: TObject);
+begin
+ // The cookies must all originate from the same path, otherwise the 2 datamodules will use a different session.
+ (Sender as TFPWebSession).SessionCookiePath:='/';
+end;
+
+procedure TCombinedModule.ProviderFormatterBeforeDelete(
+ Sender: TObject);
+begin
+ CheckLoggedIn;
+end;
+
+procedure TCombinedModule.ProviderFormatterBeforeInsert(
+ Sender: TObject);
+begin
+ CheckLoggedIn;
+end;
+
+procedure TCombinedModule.ProviderFormatterBeforeUpdate(
+ Sender: TObject);
+begin
+ CheckLoggedIn;
+end;
+
+procedure TCombinedModule.DataModuleGetInputAdaptor(Sender: TObject;
+ var AInputAdaptor: TCustomWebdataInputAdaptor);
+begin
+end;
+
+initialization
+ {$I wmusers.lrs}
+
+ RegisterHTTPModule('Provider', TCombinedModule);
+end.
+
diff --git a/packages/fcl-web/fpmake.pp b/packages/fcl-web/fpmake.pp
index 6920f54124..7d3de265ed 100644
--- a/packages/fcl-web/fpmake.pp
+++ b/packages/fcl-web/fpmake.pp
@@ -25,6 +25,8 @@ begin
P.Dependencies.Add('fcl-process');
P.Dependencies.Add('fastcgi');
P.Dependencies.Add('httpd22');
+ // (Temporary) indirect dependencies, not detected by fpcmake:
+ P.Dependencies.Add('univint',[MacOSX]);
P.Author := 'FreePascal development team';
P.License := 'LGPL with modification, ';
diff --git a/packages/fcl-web/src/base/custfcgi.pp b/packages/fcl-web/src/base/custfcgi.pp
index 65660994fd..4be71d53f1 100644
--- a/packages/fcl-web/src/base/custfcgi.pp
+++ b/packages/fcl-web/src/base/custfcgi.pp
@@ -21,7 +21,13 @@ unit custfcgi;
Interface
uses
- Classes,SysUtils, httpdefs,custweb, custcgi, fastcgi;
+ Classes,SysUtils, httpdefs,
+{$ifdef unix}
+ BaseUnix, TermIO,
+{$else}
+ winsock2,
+{$endif}
+ Sockets, custweb, custcgi, fastcgi;
Type
{ TFCGIRequest }
@@ -29,7 +35,8 @@ Type
TFCGIRequest = Class;
TFCGIResponse = Class;
- TProtocolOption = (poNoPadding,poStripContentLength, poFailonUnknownRecord );
+ TProtocolOption = (poNoPadding,poStripContentLength, poFailonUnknownRecord,
+ poReuseAddress, poUseSelect );
TProtocolOptions = Set of TProtocolOption;
TUnknownRecordEvent = Procedure (ARequest : TFCGIRequest; AFCGIRecord: PFCGI_Header) Of Object;
@@ -60,9 +67,7 @@ Type
TFCGIResponse = Class(TCGIResponse)
private
- FNoPadding: Boolean;
FPO: TProtoColOptions;
- FStripCL: Boolean;
procedure Write_FCGIRecord(ARecord : PFCGI_Header);
Protected
Procedure DoSendHeaders(Headers : TStrings); override;
@@ -75,6 +80,8 @@ Type
Response : TFCgiResponse;
end;
+ { TFCgiHandler }
+
TFCgiHandler = class(TWebHandler)
Private
FOnUnknownRecord: TUnknownRecordEvent;
@@ -84,10 +91,14 @@ Type
FHandle : THandle;
Socket: longint;
FAddress: string;
+ FTimeOut,
FPort: integer;
function Read_FCGIRecord : PFCGI_Header;
+ function DataAvailable : Boolean;
protected
- function WaitForRequest(out ARequest : TRequest; out AResponse : TResponse) : boolean; override;
+ function ProcessRecord(AFCGI_Record: PFCGI_Header; out ARequest: TRequest; out AResponse: TResponse): boolean; virtual;
+ procedure SetupSocket(var IAddress: TInetSockAddr; var AddressLength: tsocklen); virtual;
+ function WaitForRequest(out ARequest : TRequest; out AResponse : TResponse) : boolean; override;
procedure EndRequest(ARequest : TRequest;AResponse : TResponse); override;
Public
constructor Create(AOwner: TComponent); override;
@@ -96,6 +107,7 @@ Type
property Address: string read FAddress write FAddress;
Property ProtocolOptions : TProtoColOptions Read FPO Write FPO;
Property OnUnknownRecord : TUnknownRecordEvent Read FOnUnknownRecord Write FOnUnknownRecord;
+ Property TimeOut : Integer Read FTimeOut Write FTimeOut;
end;
{ TCustomFCgiApplication }
@@ -126,14 +138,16 @@ ResourceString
SListenFailed = 'Failed to listen to port %d. Socket Error: %d';
SErrReadingSocket = 'Failed to read data from socket. Error: %d';
SErrReadingHeader = 'Failed to read FastCGI header. Read only %d bytes';
+ SErrWritingSocket = 'Failed to write data to socket. Error: %d';
Implementation
-uses
{$ifdef CGIDEBUG}
- dbugintf,
+uses
+ dbugintf;
{$endif}
- Sockets;
+
+
{$undef nosignal}
@@ -315,9 +329,13 @@ begin
P:=PByte(Arecord);
Repeat
BytesWritten := sockets.fpsend(TFCGIRequest(Request).Handle, P, BytesToWrite, NoSignalAttr);
+ If (BytesWritten<0) then
+ begin
+ // TODO : Better checking for closed connection, EINTR
+ Raise HTTPError.CreateFmt(SErrWritingSocket,[BytesWritten]);
+ end;
Inc(P,BytesWritten);
Dec(BytesToWrite,BytesWritten);
-// Assert(BytesWritten=BytesToWrite);
until (BytesToWrite=0) or (BytesWritten=0);
end;
@@ -346,15 +364,18 @@ begin
pl := 8-(cl mod 8);
ARespRecord:=nil;
Getmem(ARespRecord,8+cl+pl);
- FillChar(ARespRecord^,8+cl+pl,0);
- ARespRecord^.header.version:=FCGI_VERSION_1;
- ARespRecord^.header.reqtype:=FCGI_STDOUT;
- ARespRecord^.header.paddingLength:=pl;
- ARespRecord^.header.contentLength:=NtoBE(cl);
- ARespRecord^.header.requestId:=NToBE(TFCGIRequest(Request).RequestID);
- move(str[1],ARespRecord^.ContentData,cl);
- Write_FCGIRecord(PFCGI_Header(ARespRecord));
- Freemem(ARespRecord);
+ try
+ FillChar(ARespRecord^,8+cl+pl,0);
+ ARespRecord^.header.version:=FCGI_VERSION_1;
+ ARespRecord^.header.reqtype:=FCGI_STDOUT;
+ ARespRecord^.header.paddingLength:=pl;
+ ARespRecord^.header.contentLength:=NtoBE(cl);
+ ARespRecord^.header.requestId:=NToBE(TFCGIRequest(Request).RequestID);
+ move(str[1],ARespRecord^.ContentData,cl);
+ Write_FCGIRecord(PFCGI_Header(ARespRecord));
+ finally
+ Freemem(ARespRecord);
+ end;
end;
procedure TFCGIResponse.DoSendContent;
@@ -392,14 +413,17 @@ begin
pl := 8-(cl mod 8);
ARespRecord:=Nil;
Getmem(ARespRecord,8+cl+pl);
- ARespRecord^.header.version:=FCGI_VERSION_1;
- ARespRecord^.header.reqtype:=FCGI_STDOUT;
- ARespRecord^.header.paddingLength:=pl;
- ARespRecord^.header.contentLength:=NtoBE(cl);
- ARespRecord^.header.requestId:=NToBE(TFCGIRequest(Request).RequestID);
- move(Str[BS+1],ARespRecord^.ContentData,cl);
- Write_FCGIRecord(PFCGI_Header(ARespRecord));
- Freemem(ARespRecord);
+ try
+ ARespRecord^.header.version:=FCGI_VERSION_1;
+ ARespRecord^.header.reqtype:=FCGI_STDOUT;
+ ARespRecord^.header.paddingLength:=pl;
+ ARespRecord^.header.contentLength:=NtoBE(cl);
+ ARespRecord^.header.requestId:=NToBE(TFCGIRequest(Request).RequestID);
+ move(Str[BS+1],ARespRecord^.ContentData,cl);
+ Write_FCGIRecord(PFCGI_Header(ARespRecord));
+ finally
+ Freemem(ARespRecord);
+ end;
Inc(BS,cl);
Until (BS=L);
FillChar(EndRequest,SizeOf(FCGI_EndRequestRecord),0);
@@ -420,6 +444,7 @@ begin
FRequestsAvail:=5;
SetLength(FRequestsArray,FRequestsAvail);
FHandle := THandle(-1);
+ FTimeOut:=50;
end;
destructor TFCgiHandler.Destroy;
@@ -452,6 +477,30 @@ begin
end;
function TFCgiHandler.Read_FCGIRecord : PFCGI_Header;
+{ $DEFINE DUMPRECORD}
+{$IFDEF DUMPRECORD}
+ Procedure DumpFCGIRecord (Var Header :FCGI_Header; ContentLength : word; PaddingLength : byte; ResRecord : Pointer);
+
+ Var
+ s : string;
+ I : Integer;
+
+ begin
+ Writeln('Dumping record ', Sizeof(Header),',',Contentlength,',',PaddingLength);
+ For I:=0 to Sizeof(Header)+ContentLength+PaddingLength-1 do
+ begin
+ Write(Format('%:3d ',[PByte(ResRecord)[i]]));
+ If PByte(ResRecord)[i]>30 then
+ S:=S+char(PByte(ResRecord)[i]);
+ if (I mod 16) = 0 then
+ begin
+ writeln(' ',S);
+ S:='';
+ end;
+ end;
+ Writeln(' ',S)
+ end;
+{$ENDIF DUMPRECORD}
function ReadBytes(ReadBuf: Pointer; ByteAmount : Word) : Integer;
@@ -477,12 +526,11 @@ function TFCgiHandler.Read_FCGIRecord : PFCGI_Header;
end;
var Header : FCGI_Header;
- {I,}BytesRead : integer;
+ BytesRead : integer;
ContentLength : word;
PaddingLength : byte;
ResRecord : pointer;
ReadBuf : pointer;
- s : string;
begin
@@ -490,119 +538,183 @@ begin
ResRecord:=Nil;
ReadBuf:=@Header;
BytesRead:=ReadBytes(ReadBuf,Sizeof(Header));
- If (BytesRead<>Sizeof(Header)) then
+ If (BytesRead=0) then
+ Exit // Connection closed gracefully.
+ // TODO : if connection closed gracefully, the request should no longer be handled.
+ // Need to discard request/response
+ else If (BytesRead<>Sizeof(Header)) then
Raise HTTPError.CreateFmt(SErrReadingHeader,[BytesRead]);
ContentLength:=BetoN(Header.contentLength);
PaddingLength:=Header.paddingLength;
Getmem(ResRecord,BytesRead+ContentLength+PaddingLength);
- PFCGI_Header(ResRecord)^:=Header;
- ReadBuf:=ResRecord+BytesRead;
- BytesRead:=ReadBytes(ReadBuf,ContentLength);
- ReadBuf:=ReadBuf+BytesRead;
- BytesRead:=ReadBytes(ReadBuf,PaddingLength);
- Result := ResRecord;
-{
- Writeln('Dumping record ', Sizeof(Header),',',Contentlength,',',PaddingLength);
- For I:=0 to Sizeof(Header)+ContentLength+PaddingLength-1 do
+ try
+ PFCGI_Header(ResRecord)^:=Header;
+ ReadBuf:=ResRecord+BytesRead;
+ BytesRead:=ReadBytes(ReadBuf,ContentLength);
+ If (BytesRead=0) and (ContentLength>0) then
+ begin
+ FreeMem(resRecord);
+ Exit // Connection closed gracefully.
+ // TODO : properly handle connection close
+ end;
+ ReadBuf:=ReadBuf+BytesRead;
+ BytesRead:=ReadBytes(ReadBuf,PaddingLength);
+ If (BytesRead=0) and (PaddingLength>0) then
+ begin
+ FreeMem(resRecord);
+ Exit // Connection closed gracefully.
+ // TODO : properly handle connection close
+ end;
+ Result := ResRecord;
+ except
+ FreeMem(resRecord);
+ Raise;
+ end;
+end;
+
+procedure TFCgiHandler.SetupSocket(var IAddress : TInetSockAddr; Var AddressLength : tsocklen);
+
+begin
+ AddressLength:=Sizeof(IAddress);
+ Socket := fpsocket(AF_INET,SOCK_STREAM,0);
+ if Socket=-1 then
+ raise EFPWebError.CreateFmt(SNoSocket,[socketerror]);
+ IAddress.sin_family:=AF_INET;
+ IAddress.sin_port:=htons(Port);
+ if FAddress<>'' then
+ Iaddress.sin_addr := StrToHostAddr(FAddress)
+ else
+ IAddress.sin_addr.s_addr:=0;
+ {$IFDEF Unix}
+ // remedy socket port locking on Posix platforms
+ If (poReuseAddress in ProtocolOptions) then
+ fpSetSockOpt(Socket, SOL_SOCKET, SO_REUSEADDR, @IAddress, SizeOf(IAddress));
+ {$ENDIF}
+ if fpbind(Socket,@IAddress,AddressLength)=-1 then
+ begin
+ CloseSocket(socket);
+ Socket:=0;
+ Terminate;
+ raise Exception.CreateFmt(SBindFailed,[port,socketerror]);
+ end;
+ if fplisten(Socket,1)=-1 then
begin
- Write(Format('%:3d ',[PByte(ResRecord)[i]]));
- If PByte(ResRecord)[i]>30 then
- S:=S+char(PByte(ResRecord)[i]);
- if (I mod 16) = 0 then
- begin
- writeln(' ',S);
- S:='';
- end;
+ CloseSocket(socket);
+ Socket:=0;
+ Terminate;
+ raise Exception.CreateFmt(SListenFailed,[port,socketerror]);
+ end;
+end;
+
+{$ifdef unix}
+function TFCgiHandler.DataAvailable: Boolean;
+
+var
+ FDS: TFDSet;
+ TimeV: TTimeVal;
+
+begin
+ fpFD_Zero(FDS);
+ fpFD_Set(FHandle, FDS);
+ TimeV.tv_usec := (Timeout mod 1000) * 1000;
+ TimeV.tv_sec := Timeout div 1000;
+ Result := fpSelect(FHandle + 1, @FDS, @FDS, @FDS, @TimeV) > 0;
+end;
+{$else}
+function TFCgiHandler.DataAvailable: Boolean;
+
+var
+ FDS: TFDSet;
+ TimeV: TTimeVal;
+
+begin
+ FD_Zero(FDS);
+ FD_Set(FHandle, FDS);
+ TimeV.tv_usec := (Timeout mod 1000) * 1000;
+ TimeV.tv_sec := Timeout div 1000;
+ Result := Select(FHandle + 1, @FDS, @FDS, @FDS, @TimeV) <> 0;
+end;
+{$endif}
+
+function TFCgiHandler.ProcessRecord(AFCGI_Record : PFCGI_Header; out ARequest: TRequest; out AResponse: TResponse): boolean;
+
+var
+ ARequestID : word;
+ ATempRequest : TFCGIRequest;
+begin
+ Result:=False;
+ ARequestID:=BEtoN(AFCGI_Record^.requestID);
+ if AFCGI_Record^.reqtype = FCGI_BEGIN_REQUEST then
+ begin
+ if ARequestID>FRequestsAvail then
+ begin
+ inc(FRequestsAvail,10);
+ SetLength(FRequestsArray,FRequestsAvail);
+ end;
+ assert(not assigned(FRequestsArray[ARequestID].Request));
+ assert(not assigned(FRequestsArray[ARequestID].Response));
+ ATempRequest:=TFCGIRequest.Create;
+ ATempRequest.RequestID:=ARequestID;
+ ATempRequest.Handle:=FHandle;
+ ATempRequest.ProtocolOptions:=Self.Protocoloptions;
+ ATempRequest.OnUnknownRecord:=Self.OnUnknownRecord;
+ FRequestsArray[ARequestID].Request := ATempRequest;
+ end;
+ if (ARequestID>FRequestsAvail) then
+ begin
+ // TODO : ARequestID can be invalid. What to do ?
+ // in each case not try to access the array with requests.
+ end
+ else if FRequestsArray[ARequestID].Request.ProcessFCGIRecord(AFCGI_Record) then
+ begin
+ ARequest:=FRequestsArray[ARequestID].Request;
+ FRequestsArray[ARequestID].Response := TFCGIResponse.Create(ARequest);
+ FRequestsArray[ARequestID].Response.ProtocolOptions:=Self.ProtocolOptions;
+ AResponse:=FRequestsArray[ARequestID].Response;
+ Result := True;
end;
- Writeln(' ',S)
-}
end;
function TFCgiHandler.WaitForRequest(out ARequest: TRequest; out AResponse: TResponse): boolean;
+
var
IAddress : TInetSockAddr;
AddressLength : tsocklen;
- ARequestID : word;
AFCGI_Record : PFCGI_Header;
- ATempRequest : TFCGIRequest;
begin
Result := False;
- AddressLength:=Sizeof(IAddress);
-
if Socket=0 then
- begin
if Port<>0 then
- begin
- Socket := fpsocket(AF_INET,SOCK_STREAM,0);
- if Socket=-1 then
- raise EFPWebError.CreateFmt(SNoSocket,[socketerror]);
- IAddress.sin_family:=AF_INET;
- IAddress.sin_port:=htons(Port);
- if FAddress<>'' then
- Iaddress.sin_addr := StrToHostAddr(FAddress)
- else
- IAddress.sin_addr.s_addr:=0;
- if fpbind(Socket,@IAddress,AddressLength)=-1 then
- begin
- CloseSocket(socket);
- Socket:=0;
- raise Exception.CreateFmt(SBindFailed,[port,socketerror]);
- end;
- if fplisten(Socket,1)=-1 then
- begin
- CloseSocket(socket);
- Socket:=0;
- raise Exception.CreateFmt(SListenFailed,[port,socketerror]);
- end;
- end
+ SetupSocket(IAddress,AddressLength)
else
Socket:=StdInputHandle;
- end;
-
if FHandle=THandle(-1) then
begin
FHandle:=fpaccept(Socket,psockaddr(@IAddress),@AddressLength);
if FHandle=THandle(-1) then
+ begin
+ Terminate;
raise Exception.CreateFmt(SNoInputHandle,[socketerror]);
+ end;
end;
-
repeat
- AFCGI_Record:=Read_FCGIRecord;
- if assigned(AFCGI_Record) then
+ If (poUseSelect in ProtocolOptions) then
+ begin
+ While Not DataAvailable do
+ If (OnIdle<>Nil) then
+ OnIdle(Self);
+ end;
+ AFCGI_Record:=Read_FCGIRecord;
+
+ if assigned(AFCGI_Record) then
try
- ARequestID:=BEtoN(AFCGI_Record^.requestID);
- if AFCGI_Record^.reqtype = FCGI_BEGIN_REQUEST then
- begin
- if ARequestID>FRequestsAvail then
- begin
- inc(FRequestsAvail,10);
- SetLength(FRequestsArray,FRequestsAvail);
- end;
- assert(not assigned(FRequestsArray[ARequestID].Request));
- assert(not assigned(FRequestsArray[ARequestID].Response));
-
- ATempRequest:=TFCGIRequest.Create;
- ATempRequest.RequestID:=ARequestID;
- ATempRequest.Handle:=FHandle;
- ATempRequest.ProtocolOptions:=Self.Protocoloptions;
- ATempRequest.OnUnknownRecord:=Self.OnUnknownRecord;
- FRequestsArray[ARequestID].Request := ATempRequest;
- end;
- if FRequestsArray[ARequestID].Request.ProcessFCGIRecord(AFCGI_Record) then
- begin
- ARequest:=FRequestsArray[ARequestID].Request;
- FRequestsArray[ARequestID].Response := TFCGIResponse.Create(ARequest);
- FRequestsArray[ARequestID].Response.ProtocolOptions:=Self.ProtocolOptions;
- AResponse:=FRequestsArray[ARequestID].Response;
- Result := True;
- Break;
- end;
+ Result:=ProcessRecord(AFCGI_Record,ARequest,AResponse);
Finally
FreeMem(AFCGI_Record);
AFCGI_Record:=Nil;
end;
- until (1<>1);
+ until Result;
end;
{ TCustomFCgiApplication }
diff --git a/packages/fcl-web/src/base/custweb.pp b/packages/fcl-web/src/base/custweb.pp
index 20b35f60f8..f0820619dd 100644
--- a/packages/fcl-web/src/base/custweb.pp
+++ b/packages/fcl-web/src/base/custweb.pp
@@ -557,6 +557,7 @@ end;
constructor TCustomWebApplication.Create(AOwner: TComponent);
begin
+ Inherited Create(AOwner);
FWebHandler := InitializeWebHandler;
FWebHandler.FOnTerminate:=@DoOnTerminate;
end;
diff --git a/packages/fcl-web/src/base/fphtml.pp b/packages/fcl-web/src/base/fphtml.pp
index 6c5bdb96d5..a6645732c1 100644
--- a/packages/fcl-web/src/base/fphtml.pp
+++ b/packages/fcl-web/src/base/fphtml.pp
@@ -42,15 +42,18 @@ type
TWebController = class;
THTMLContentProducer = class;
+ TJavaType = (jtOther, jtClientSideEvent);
+
TJavaScriptStack = class(TObject)
private
+ FJavaType: TJavaType;
FMessageBoxHandler: TMessageBoxHandler;
FScript: TStrings;
FWebController: TWebController;
protected
function GetWebController: TWebController;
public
- constructor Create(const AWebController: TWebController); virtual;
+ constructor Create(const AWebController: TWebController; const AJavaType: TJavaType); virtual;
destructor Destroy; override;
procedure AddScriptLine(ALine: String); virtual;
procedure MessageBox(AText: String; Buttons: TWebButtons; Loaded: string = ''); virtual;
@@ -61,6 +64,7 @@ type
function ScriptIsEmpty: Boolean; virtual;
function GetScript: String; virtual;
property WebController: TWebController read GetWebController;
+ property JavaType: TJavaType read FJavaType;
end;
{ TContainerStylesheet }
@@ -85,6 +89,35 @@ type
property Items[Index: integer]: TContainerStylesheet read GetItem write SetItem;
end;
+ { TJavaVariable }
+
+ TJavaVariable = class(TCollectionItem)
+ private
+ FBelongsTo: string;
+ FGetValueFunc: string;
+ FID: string;
+ FIDSuffix: string;
+ FName: string;
+ public
+ property BelongsTo: string read FBelongsTo write FBelongsTo;
+ property GetValueFunc: string read FGetValueFunc write FGetValueFunc;
+ property Name: string read FName write FName;
+ property ID: string read FID write FID;
+ property IDSuffix: string read FIDSuffix write FIDSuffix;
+ end;
+
+ { TJavaVariables }
+
+ TJavaVariables = class(TCollection)
+ private
+ function GetItem(Index: integer): TJavaVariable;
+ procedure SetItem(Index: integer; const AValue: TJavaVariable);
+ public
+ function Add: TJavaVariable;
+ property Items[Index: integer]: TJavaVariable read GetItem write SetItem;
+ end;
+
+
{ TWebController }
TWebController = class(TComponent)
@@ -94,9 +127,13 @@ type
FMessageBoxHandler: TMessageBoxHandler;
FScriptName: string;
FScriptStack: TFPObjectList;
+ FIterationIDs: array of string;
+ FJavaVariables: TJavaVariables;
procedure SetBaseURL(const AValue: string);
procedure SetScriptName(const AValue: string);
protected
+ function GetJavaVariables: TJavaVariables;
+ function GetJavaVariablesCount: integer;
function GetScriptFileReferences: TStringList; virtual; abstract;
function GetCurrentJavaScriptStack: TJavaScriptStack; virtual;
function GetStyleSheetReferences: TContainerStylesheets; virtual; abstract;
@@ -107,8 +144,8 @@ type
destructor Destroy; override;
procedure AddScriptFileReference(AScriptFile: String); virtual; abstract;
procedure AddStylesheetReference(Ahref, Amedia: String); virtual; abstract;
- function CreateNewJavascriptStack: TJavaScriptStack; virtual; abstract;
- function InitializeJavaScriptStack: TJavaScriptStack;
+ function CreateNewJavascriptStack(AJavaType: TJavaType): TJavaScriptStack; virtual; abstract;
+ function InitializeJavaScriptStack(AJavaType: TJavaType): TJavaScriptStack;
procedure FreeJavascriptStack; virtual;
function HasJavascriptStack: boolean; virtual; abstract;
function GetUrl(ParamNames, ParamValues, KeepParams: array of string; Action: string = ''): string; virtual; abstract;
@@ -117,12 +154,20 @@ type
procedure CleanupShowRequest; virtual;
procedure CleanupAfterRequest; virtual;
procedure BeforeGenerateHead; virtual;
+ function AddJavaVariable(AName, ABelongsTo, AGetValueFunc, AID, AIDSuffix: string): TJavaVariable;
procedure BindJavascriptCallstackToElement(AComponent: TComponent; AnElement: THtmlCustomElement; AnEvent: string); virtual; abstract;
function MessageBox(AText: String; Buttons: TWebButtons; ALoaded: string = ''): string; virtual;
function DefaultMessageBoxHandler(Sender: TObject; AText: String; Buttons: TWebButtons; ALoaded: string = ''): string; virtual; abstract;
function CreateNewScript: TStringList; virtual; abstract;
function AddrelativeLinkPrefix(AnURL: string): string;
procedure FreeScript(var AScript: TStringList); virtual; abstract;
+ procedure ShowRegisteredScript(ScriptID: integer); virtual; abstract;
+
+ function IncrementIterationLevel: integer; virtual;
+ procedure SetIterationIDSuffix(AIterationLevel: integer; IDSuffix: string); virtual;
+ function GetIterationIDSuffix: string; virtual;
+ procedure DecrementIterationLevel; virtual;
+
property ScriptFileReferences: TStringList read GetScriptFileReferences;
property StyleSheetReferences: TContainerStylesheets read GetStyleSheetReferences;
property Scripts: TFPObjectList read GetScripts;
@@ -190,6 +235,7 @@ type
FDocument: THTMLDocument;
FElement: THTMLCustomElement;
FWriter: THTMLWriter;
+ FIDSuffix: string;
procedure SetDocument(const AValue: THTMLDocument);
procedure SetWriter(const AValue: THTMLWriter);
private
@@ -201,6 +247,8 @@ type
procedure SetParent(const AValue: TComponent);
Protected
function CreateWriter (Doc : THTMLDocument) : THTMLWriter; virtual;
+ function GetIDSuffix: string; virtual;
+ procedure SetIDSuffix(const AValue: string); virtual;
protected
// Methods for streaming
FAcceptChildsAtDesignTime: boolean;
@@ -211,6 +259,7 @@ type
procedure AddEvent(var Events: TEventRecords; AServerEventID: integer; AServerEvent: THandleAjaxEvent; AJavaEventName: string; AcsCallBack: TCSAjaxEvent); virtual;
procedure DoOnEventCS(AnEvent: TEventRecord; AJavascriptStack: TJavaScriptStack; var Handled: boolean); virtual;
procedure SetupEvents(AHtmlElement: THtmlCustomElement); virtual;
+ function GetWebPage: TDataModule;
function GetWebController(const ExceptIfNotAvailable: boolean = true): TWebController;
property ContentProducerList: TFPList read GetContentProducerList;
public
@@ -221,6 +270,7 @@ type
property ParentElement : THTMLCustomElement read FElement write FElement;
property Writer : THTMLWriter read FWriter write SetWriter;
Property HTMLDocument : THTMLDocument read FDocument write SetDocument;
+ Property IDSuffix : string read GetIDSuffix write SetIDSuffix;
public
// for streaming
constructor Create(AOwner: TComponent); override;
@@ -480,6 +530,23 @@ resourcestring
SErrRequestNotHandled = 'Web request was not handled by actions.';
SErrNoContentProduced = 'The content producer "%s" didn''t produce any content.';
+{ TJavaVariables }
+
+function TJavaVariables.GetItem(Index: integer): TJavaVariable;
+begin
+ result := TJavaVariable(Inherited GetItem(Index));
+end;
+
+procedure TJavaVariables.SetItem(Index: integer; const AValue: TJavaVariable);
+begin
+ inherited SetItem(Index, AValue);
+end;
+
+function TJavaVariables.Add: TJavaVariable;
+begin
+ result := inherited Add as TJavaVariable;
+end;
+
{ TcontainerStylesheets }
function TcontainerStylesheets.GetItem(Index: integer): TContainerStylesheet;
@@ -505,10 +572,11 @@ begin
result := FWebController;
end;
-constructor TJavaScriptStack.Create(const AWebController: TWebController);
+constructor TJavaScriptStack.Create(const AWebController: TWebController; const AJavaType: TJavaType);
begin
FWebController := AWebController;
FScript := TStringList.Create;
+ FJavaType := AJavaType;
end;
destructor TJavaScriptStack.Destroy;
@@ -591,6 +659,16 @@ begin
Result:=THTMLContentProducer(ContentProducerList[Index]);
end;
+function THTMLContentProducer.GetIDSuffix: string;
+begin
+ result := FIDSuffix;
+end;
+
+procedure THTMLContentProducer.SetIDSuffix(const AValue: string);
+begin
+ FIDSuffix := AValue;
+end;
+
function THTMLContentProducer.GetContentProducerList: TFPList;
begin
if not assigned(FChilds) then
@@ -679,7 +757,7 @@ begin
wc := GetWebController(false);
if assigned(wc) then
begin
- AJSClass := wc.InitializeJavaScriptStack;
+ AJSClass := wc.InitializeJavaScriptStack(jtClientSideEvent);
try
for i := 0 to high(Events) do
begin
@@ -702,24 +780,44 @@ begin
end;
end;
+function THTMLContentProducer.GetWebPage: TDataModule;
+var
+ aowner: TComponent;
+begin
+ result := nil;
+ aowner := Owner;
+ while assigned(aowner) do
+ begin
+ if aowner.InheritsFrom(TWebPage) then
+ begin
+ result := TWebPage(aowner);
+ break;
+ end;
+ aowner:=aowner.Owner;
+ end;
+end;
+
function THTMLContentProducer.GetWebController(const ExceptIfNotAvailable: boolean): TWebController;
-var i : integer;
+var
+ i : integer;
+ wp: TWebPage;
begin
result := nil;
- if assigned(owner) then
+ wp := TWebPage(GetWebPage);
+ if assigned(wp) then
begin
- if (owner is TWebPage) and TWebPage(owner).HasWebController then
+ if wp.HasWebController then
begin
- result := TWebPage(owner).WebController;
+ result := wp.WebController;
exit;
- end
- else //if (owner is TDataModule) then
+ end;
+ end
+ else if assigned(Owner) then //if (owner is TDataModule) then
+ begin
+ for i := 0 to owner.ComponentCount-1 do if owner.Components[i] is TWebController then
begin
- for i := 0 to owner.ComponentCount-1 do if owner.Components[i] is TWebController then
- begin
- result := TWebController(Owner.Components[i]);
- Exit;
- end;
+ result := TWebController(Owner.Components[i]);
+ Exit;
end;
end;
if ExceptIfNotAvailable then
@@ -1199,7 +1297,7 @@ begin
FSendXMLAnswer:=true;
FResponse:=AResponse;
FWebController := AWebController;
- FJavascriptCallStack:=FWebController.InitializeJavaScriptStack;
+ FJavascriptCallStack:=FWebController.InitializeJavaScriptStack(jtOther);
end;
destructor TAjaxResponse.Destroy;
@@ -1248,6 +1346,21 @@ end;
{ TWebController }
+function TWebController.GetJavaVariables: TJavaVariables;
+begin
+ if not assigned(FJavaVariables) then
+ FJavaVariables := TJavaVariables.Create(TJavaVariable);
+ Result := FJavaVariables;
+end;
+
+function TWebController.GetJavaVariablesCount: integer;
+begin
+ if assigned(FJavaVariables) then
+ result := FJavaVariables.Count
+ else
+ result := 0;
+end;
+
procedure TWebController.SetBaseURL(const AValue: string);
begin
if FBaseURL=AValue then exit;
@@ -1262,7 +1375,10 @@ end;
function TWebController.GetCurrentJavaScriptStack: TJavaScriptStack;
begin
- result := TJavaScriptStack(FScriptStack.Items[FScriptStack.Count-1]);
+ if FScriptStack.Count>0 then
+ result := TJavaScriptStack(FScriptStack.Items[FScriptStack.Count-1])
+ else
+ result := nil;
end;
procedure TWebController.InitializeAjaxRequest;
@@ -1290,6 +1406,16 @@ begin
// do nothing
end;
+function TWebController.AddJavaVariable(AName, ABelongsTo, AGetValueFunc, AID, AIDSuffix: string): TJavaVariable;
+begin
+ result := GetJavaVariables.Add;
+ result.BelongsTo := ABelongsTo;
+ result.GetValueFunc := AGetValueFunc;
+ result.Name := AName;
+ result.IDSuffix := AIDSuffix;
+ result.ID := AID;
+end;
+
function TWebController.MessageBox(AText: String; Buttons: TWebButtons; ALoaded: string = ''): string;
begin
if assigned(MessageBoxHandler) then
@@ -1308,6 +1434,36 @@ begin
result := AnURL;
end;
+function TWebController.IncrementIterationLevel: integer;
+begin
+ result := Length(FIterationIDs)+1;
+ SetLength(FIterationIDs,Result);
+end;
+
+procedure TWebController.SetIterationIDSuffix(AIterationLevel: integer; IDSuffix: string);
+begin
+ FIterationIDs[AIterationLevel-1]:=IDSuffix;
+end;
+
+function TWebController.GetIterationIDSuffix: string;
+var
+ i: integer;
+begin
+ result := '';
+ for i := 0 to length(FIterationIDs)-1 do
+ result := result + '_' + FIterationIDs[i];
+end;
+
+procedure TWebController.DecrementIterationLevel;
+var
+ i: integer;
+begin
+ i := length(FIterationIDs);
+ if i=0 then
+ raise Exception.Create('DecrementIterationLevel can not be called more times then IncrementIterationLevel');
+ SetLength(FIterationIDs,i-1);
+end;
+
function TWebController.GetRequest: TRequest;
begin
if assigned(Owner) and (owner is TWebPage) then
@@ -1329,12 +1485,13 @@ begin
if (Owner is TWebPage) and (TWebPage(Owner).WebController=self) then
TWebPage(Owner).WebController := nil;
FScriptStack.Free;
+ if assigned(FJavaVariables) then FJavaVariables.Free;
inherited Destroy;
end;
-function TWebController.InitializeJavaScriptStack: TJavaScriptStack;
+function TWebController.InitializeJavaScriptStack(AJavaType: TJavaType): TJavaScriptStack;
begin
- result := CreateNewJavascriptStack;
+ result := CreateNewJavascriptStack(AJavaType);
FScriptStack.Add(result);
end;
diff --git a/packages/fcl-web/src/base/webpage.pp b/packages/fcl-web/src/base/webpage.pp
index 21911f1e29..c644c57bf8 100644
--- a/packages/fcl-web/src/base/webpage.pp
+++ b/packages/fcl-web/src/base/webpage.pp
@@ -31,6 +31,13 @@ type
property Designer: IWebPageDesigner read GetDesigner write SetDesigner;
end;
+ IHTMLIterationGroup = interface(IUnknown)
+ ['{95575CB6-7D96-4F72-AF72-D2EAF0BECE71}']
+ procedure SetIDSuffix(const AHTMLContentProducer: THTMLContentProducer);
+ procedure SetAjaxIterationID(AValue: String);
+ end;
+
+
{ TStandardWebController }
TStandardWebController = class(TWebController)
@@ -45,13 +52,14 @@ type
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
- function CreateNewJavascriptStack: TJavaScriptStack; override;
+ function CreateNewJavascriptStack(AJavaType: TJavaType): TJavaScriptStack; override;
function GetUrl(ParamNames, ParamValues, KeepParams: array of string; Action: string = ''): string; override;
procedure BindJavascriptCallstackToElement(AComponent: TComponent; AnElement: THtmlCustomElement; AnEvent: string); override;
procedure AddScriptFileReference(AScriptFile: String); override;
procedure AddStylesheetReference(Ahref, Amedia: String); override;
function DefaultMessageBoxHandler(Sender: TObject; AText: String; Buttons: TWebButtons; ALoaded: string = ''): string; override;
function CreateNewScript: TStringList; override;
+ procedure ShowRegisteredScript(ScriptID: integer); override;
procedure FreeScript(var AScript: TStringList); override;
end;
@@ -114,9 +122,22 @@ type
property BaseURL: string read FBaseURL write FBaseURL;
end;
+ function RegisterScript(AScript: string) : integer;
+
implementation
-uses rtlconsts, typinfo, XMLWrite;
+uses rtlconsts, typinfo, XMLWrite, strutils;
+
+var RegisteredScriptList : TStrings;
+
+function RegisterScript(AScript: string) : integer;
+begin
+ if not Assigned(RegisteredScriptList) then
+ begin
+ RegisteredScriptList := TStringList.Create;
+ end;
+ result := RegisteredScriptList.Add(AScript);
+end;
{ TWebPage }
@@ -184,6 +205,40 @@ var Handled: boolean;
CompName: string;
AComponent: TComponent;
AnAjaxResponse: TAjaxResponse;
+ i: integer;
+ ASuffixID: string;
+ AIterationGroup: IHTMLIterationGroup;
+ AIterComp: TComponent;
+ wc: TWebController;
+ Iterationlevel: integer;
+
+ procedure SetIdSuffixes(AComp: THTMLContentProducer);
+ var
+ i: integer;
+ s: string;
+ begin
+ if assigned(AComp.parent) and (acomp.parent is THTMLContentProducer) then
+ SetIdSuffixes(THTMLContentProducer(AComp.parent));
+ if supports(AComp,IHTMLIterationGroup,AIterationGroup) then
+ begin
+ if assigned(FWebController) then
+ begin
+ iterationlevel := FWebController.IncrementIterationLevel;
+ assert(length(ASuffixID)>0);
+ i := PosEx('_',ASuffixID,2);
+ if i > 0 then
+ s := copy(ASuffixID,2,i-2)
+ else
+ s := copy(ASuffixID,2,length(ASuffixID)-1);
+
+ acomp.IDSuffix := s;
+ AIterationGroup.SetAjaxIterationID(s);
+ FWebController.SetIterationIDSuffix(iterationlevel,s);
+ acomp.ForeachContentProducer(@AIterationGroup.SetIDSuffix,true);
+ ASuffixID := copy(ASuffixID,i,length(ASuffixID)-i+1);
+ end;
+ end;
+ end;
begin
SetRequest(ARequest);
FWebModule := AWebModule;
@@ -203,9 +258,28 @@ begin
begin
CompName := Request.QueryFields.Values['AjaxID'];
if CompName='' then CompName := Request.GetNextPathInfo;
- AComponent := FindComponent(CompName);
+
+ i := pos('$',CompName);
+ AComponent:=self;
+ while (i > 0) and (assigned(AComponent)) do
+ begin
+ AComponent := FindComponent(copy(CompName,1,i-1));
+ CompName := copy(compname,i+1,length(compname)-i);
+ i := pos('$',CompName);
+ end;
+ if assigned(AComponent) then
+ AComponent := AComponent.FindComponent(CompName);
+
if assigned(AComponent) and (AComponent is THTMLContentProducer) then
+ begin
+ // Handle the SuffixID, search for iteration-groups and set their iteration-id-values
+ ASuffixID := ARequest.QueryFields.Values['IterationID'];
+ if ASuffixID<>'' then
+ begin
+ SetIdSuffixes(THTMLContentProducer(AComponent));
+ end;
THTMLContentProducer(AComponent).HandleAjaxRequest(ARequest, AnAjaxResponse);
+ end;
end;
DoAfterAjaxRequest(ARequest, AnAjaxResponse);
except on E: Exception do
@@ -346,8 +420,13 @@ end;
function TWebPage.IsAjaxCall: boolean;
var s : string;
begin
- s := Request.HTTPXRequestedWith;
- result := sametext(s,'XmlHttpRequest');
+ if assigned(request) then
+ begin
+ s := Request.HTTPXRequestedWith;
+ result := sametext(s,'XmlHttpRequest');
+ end
+ else
+ result := false;
end;
{ TStandardWebController }
@@ -378,6 +457,22 @@ begin
GetScripts.Add(result);
end;
+procedure TStandardWebController.ShowRegisteredScript(ScriptID: integer);
+var
+ i: Integer;
+ s: string;
+begin
+ s := '// ' + inttostr(ScriptID);
+ for i := 0 to GetScripts.Count -1 do
+ if tstrings(GetScripts.Items[i]).Strings[0]=s then
+ Exit;
+ with CreateNewScript do
+ begin
+ Append(s);
+ Append(RegisteredScriptList.Strings[ScriptID]);
+ end;
+end;
+
procedure TStandardWebController.FreeScript(var AScript: TStringList);
begin
with GetScripts do
@@ -431,9 +526,9 @@ begin
inherited Destroy;
end;
-function TStandardWebController.CreateNewJavascriptStack: TJavaScriptStack;
+function TStandardWebController.CreateNewJavascriptStack(AJavaType: TJavaType): TJavaScriptStack;
begin
- Result:=TJavaScriptStack.Create(self);
+ Result:=TJavaScriptStack.Create(self, AJavaType);
end;
function TStandardWebController.GetUrl(ParamNames, ParamValues,
@@ -542,5 +637,10 @@ begin
end;
end;
+initialization
+ RegisteredScriptList := nil;
+finalization
+ if assigned(RegisteredScriptList) then
+ RegisteredScriptList.Free;
end.
diff --git a/packages/fcl-web/src/base/websession.pp b/packages/fcl-web/src/base/websession.pp
index e4bb54c2cd..4a607db441 100644
--- a/packages/fcl-web/src/base/websession.pp
+++ b/packages/fcl-web/src/base/websession.pp
@@ -332,6 +332,7 @@ begin
begin
{$ifdef cgidebug}SendDebug('Getting default session');{$endif}
FSession:=GetDefaultSession;
+ FSession.FreeNotification(Self);
end;
Result:=FSession
end;
diff --git a/packages/fcl-web/src/jsonrpc/fpextdirect.pp b/packages/fcl-web/src/jsonrpc/fpextdirect.pp
index 645042ed26..c8fde13c81 100644
--- a/packages/fcl-web/src/jsonrpc/fpextdirect.pp
+++ b/packages/fcl-web/src/jsonrpc/fpextdirect.pp
@@ -130,6 +130,7 @@ Type
Property DispatchOptions;
Property APIPath;
Property RouterPath;
+ Property CreateSession;
Property NameSpace;
end;
diff --git a/packages/fcl-web/src/jsonrpc/fpjsonrpc.pp b/packages/fcl-web/src/jsonrpc/fpjsonrpc.pp
index 8bb8676813..6fe9ba9d50 100644
--- a/packages/fcl-web/src/jsonrpc/fpjsonrpc.pp
+++ b/packages/fcl-web/src/jsonrpc/fpjsonrpc.pp
@@ -357,6 +357,10 @@ resourcestring
implementation
+{$IFDEF WMDEBUG}
+uses dbugintf;
+{$ENDIF}
+
function CreateJSONErrorObject(Const AMessage : String; Const ACode : Integer) : TJSONObject;
begin
@@ -1014,7 +1018,7 @@ Var
begin
Result:=Nil;
- {$ifdef wmdebug}SendDebug(Format('Creating instance for %s',[Self.ProviderName]));{$endif}
+ {$ifdef wmdebug}SendDebug(Format('Creating instance for %s',[Self.HandlerMethodName]));{$endif}
If Assigned(FDataModuleClass) then
begin
{$ifdef wmdebug}SendDebug(Format('Creating datamodule from class %d ',[Ord(Assigned(FDataModuleClass))]));{$endif}
diff --git a/packages/fcl-web/src/webdata/extjsjson.pp b/packages/fcl-web/src/webdata/extjsjson.pp
index 447a223580..01595bdc74 100644
--- a/packages/fcl-web/src/webdata/extjsjson.pp
+++ b/packages/fcl-web/src/webdata/extjsjson.pp
@@ -28,6 +28,8 @@ type
{ TExtJSJSONDataFormatter }
TJSONObjectEvent = Procedure(Sender : TObject; AObject : TJSONObject) of Object;
TJSONExceptionObjectEvent = Procedure(Sender : TObject; E : Exception; AResponse : TJSONObject) of Object;
+ TJSONObjectAllowRowEvent = Procedure(Sender : TObject; Dataset : TDataset; Var Allow : Boolean) of Object;
+ TJSONObjectAllowEvent = Procedure(Sender : TObject; AObject : TJSONObject; Var Allow : Boolean) of Object;
TExtJSJSONDataFormatter = Class(TExtJSDataFormatter)
private
@@ -37,13 +39,18 @@ type
FAfterRowToJSON: TJSONObjectEvent;
FAfterUpdate: TJSONObjectEvent;
FBeforeDataToJSON: TJSONObjectEvent;
+ FBeforeDelete: TNotifyEvent;
+ FBeforeInsert: TNotifyEvent;
FBeforeRowToJSON: TJSONObjectEvent;
+ FBeforeUpdate: TNotifyEvent;
+ FOnAllowRow: TJSONObjectAllowRowEvent;
FOnErrorResponse: TJSONExceptionObjectEvent;
FOnMetaDataToJSON: TJSONObjectEvent;
FBatchResult : TJSONArray;
Function AddIdToBatch : TJSONObject;
procedure SendSuccess(ResponseContent: TStream; AddIDValue : Boolean = False);
protected
+ function AllowRow(ADataset : TDataset) : Boolean; virtual;
Procedure StartBatch(ResponseContent : TStream); override;
Procedure NextBatchItem(ResponseContent : TStream); override;
Procedure EndBatch(ResponseContent : TStream); override;
@@ -77,12 +84,18 @@ type
Property BeforeDataToJSON : TJSONObjectEvent Read FBeforeDataToJSON Write FBeforeDataToJSON;
// Called when an exception is caught and formatted.
Property OnErrorResponse : TJSONExceptionObjectEvent Read FOnErrorResponse Write FOnErrorResponse;
+ // Called to decide whether a record is sent to the client;
+ Property OnAllowRow : TJSONObjectAllowRowEvent Read FOnAllowRow Write FOnAllowRow;
// After a record was succesfully updated
Property AfterUpdate : TJSONObjectEvent Read FAfterUpdate Write FAfterUpdate;
// After a record was succesfully inserted.
Property AfterInsert : TJSONObjectEvent Read FAfterInsert Write FAfterInsert;
// After a record was succesfully inserted.
Property AfterDelete : TJSONObjectEvent Read FAfterDelete Write FAfterDelete;
+ // From TCustomHTTPDataContentProducer
+ Property BeforeUpdate;
+ Property BeforeInsert;
+ Property BeforeDelete;
end;
implementation
@@ -337,9 +350,12 @@ begin
ACount:=PageSize;
While (not DS.EOF) and ((PageSize=0) or (ACount>0)) do
begin
- Inc(RCount);
- Dec(ACount);
- Rows.Add(RowToJSON);
+ If AllowRow(DS) then
+ begin
+ Inc(RCount);
+ Dec(ACount);
+ Rows.Add(RowToJSON);
+ end;
DS.Next;
end;
If (PageSize>0) then
@@ -411,6 +427,13 @@ begin
end;
end;
+function TExtJSJSONDataFormatter.AllowRow(ADataset: TDataset): Boolean;
+begin
+ Result:=True;
+ If Assigned(FOnAllowRow) then
+ FOnAllowRow(Self,Dataset,Result);
+end;
+
procedure TExtJSJSONDataFormatter.StartBatch(ResponseContent: TStream);
begin
If Assigned(FBatchResult) then
diff --git a/packages/fcl-web/src/webdata/fpwebdata.pp b/packages/fcl-web/src/webdata/fpwebdata.pp
index ea47199a9a..68c3591e61 100644
--- a/packages/fcl-web/src/webdata/fpwebdata.pp
+++ b/packages/fcl-web/src/webdata/fpwebdata.pp
@@ -132,6 +132,9 @@ type
TCustomHTTPDataContentProducer = Class(THTTPContentProducer)
Private
FAllowPageSize: Boolean;
+ FBeforeDelete: TNotifyEvent;
+ FBeforeInsert: TNotifyEvent;
+ FBeforeUpdate: TNotifyEvent;
FDataProvider: TFPCustomWebDataProvider;
FMetadata: Boolean;
FOnTranscode: TOnTranscodeEvent;
@@ -159,6 +162,12 @@ type
Procedure DoExceptionToStream(E : Exception; ResponseContent : TStream); virtual; abstract;
procedure Notification(AComponent: TComponent; Operation: TOperation);override;
Property Dataset: TDataset Read GetDataSet;
+ // Before a record is about to be updated
+ Property BeforeUpdate : TNotifyEvent Read FBeforeUpdate Write FBeforeUpdate;
+ // Before a record is about to be inserted
+ Property BeforeInsert : TNotifyEvent Read FBeforeInsert Write FBeforeInsert;
+ // Before a record is about to be deleted
+ Property BeforeDelete : TNotifyEvent Read FBeforeDelete Write FBeforeDelete;
Public
Constructor Create(AOwner : TComponent); override;
Property Adaptor : TCustomWebDataInputAdaptor Read FAdaptor Write SetAdaptor;
@@ -464,6 +473,7 @@ type
TFPWebProviderDataModule = Class(TFPCustomWebProviderDataModule)
Published
+ Property CreateSession;
Property InputAdaptor;
Property ContentProducer;
Property UseProviderManager;
@@ -975,17 +985,23 @@ end;
procedure TCustomHTTPDataContentProducer.DoUpdateRecord(ResponseContent: TStream);
begin
{$ifdef wmdebug}SendDebug('DoUpdateRecord: Updating record');{$endif}
+ If Assigned(FBeforeUpdate) then
+ FBeforeUpdate(Self);
Provider.Update;
{$ifdef wmdebug}SendDebug('DoUpdateRecord: Updated record');{$endif}
end;
procedure TCustomHTTPDataContentProducer.DoInsertRecord(ResponseContent: TStream);
begin
+ If Assigned(FBeforeInsert) then
+ FBeforeInsert(Self);
Provider.Insert;
end;
procedure TCustomHTTPDataContentProducer.DoDeleteRecord(ResponseContent: TStream);
begin
+ If Assigned(FBeforeDelete) then
+ FBeforeDelete(Self);
Provider.Delete;
end;
@@ -1663,6 +1679,7 @@ begin
Exit;
end;
end;
+ P:=Nil;
C:=FindComponent(AProviderName);
{$ifdef wmdebug}SendDebug(Format('Searching provider "%s" 1 : %d ',[AProvidername,Ord(Assigned(C))]));{$endif}
If (C<>Nil) and (C is TFPCustomWebDataProvider) then
@@ -1675,7 +1692,9 @@ begin
begin
{$ifdef wmdebug}SendDebug(Format('Found providerdef "%s" 1 : %d ',[AProvidername,Ord(Assigned(C))]));{$endif}
P:=WebDataProviderManager.GetProvider(ADef,Self,AContainer);
- end;
+ end
+ else
+ P:=Nil;
end;
{$ifdef wmdebug}SendDebug(Format('Searching provider "%s" 2 : %d ',[AProvidername,Ord(Assigned(C))]));{$endif}
Result:=P;
diff --git a/packages/fcl-web/src/webdata/sqldbwebdata.pp b/packages/fcl-web/src/webdata/sqldbwebdata.pp
index 33b1d7f8e1..28b5356045 100644
--- a/packages/fcl-web/src/webdata/sqldbwebdata.pp
+++ b/packages/fcl-web/src/webdata/sqldbwebdata.pp
@@ -17,6 +17,7 @@ Type
TCustomSQLDBWebDataProvider = Class(TFPCustomWebDataProvider)
private
FIDFieldName: String;
+ FONGetDataset: TNotifyEvent;
FOnGetNewID: TNewIDEvent;
FOnGetParamValue: TGetParamValueEvent;
FParams: TParams;
@@ -44,6 +45,7 @@ Type
Procedure DoApplyParams; override;
Function SQLQuery : TSQLQuery;
Function GetDataset : TDataset; override;
+ Function DoGetNewID : String; virtual;
Function GetNewID : String;
Function IDFieldValue : String; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
@@ -55,6 +57,7 @@ Type
Property OnGetNewID : TNewIDEvent Read FOnGetNewID Write FOnGetNewID;
property OnGetParameterType : TGetParamTypeEvent Read FOnGetParamType Write FOnGetParamType;
property OnGetParameterValue : TGetParamValueEvent Read FOnGetParamValue Write FOnGetParamValue;
+ Property OnGetDataset : TNotifyEvent Read FONGetDataset Write FOnGetDataset;
Property Params : TParams Read FParams Write SetParams;
Public
Constructor Create(AOwner : TComponent); override;
@@ -72,6 +75,7 @@ Type
Property OnGetNewID;
property OnGetParameterType;
property OnGetParameterValue;
+ Property OnGetDataset;
Property Options;
Property Params;
end;
@@ -273,7 +277,12 @@ Var
begin
ft:=GetParamtype(P,AValue);
- If ft<>ftUnknown then
+ If (AValue='') and (not (ft in [ftString,ftFixedChar,ftWideString,ftFixedWideChar])) then
+ begin
+ P.Clear;
+ exit;
+ end;
+ If (ft<>ftUnknown) then
begin
try
case ft of
@@ -358,7 +367,10 @@ begin
if not B then
begin
If (P.Name=IDFieldName) and DoNewID then
- SetTypedParam(P,GetNewID)
+ begin
+ GetNewID;
+ SetTypedParam(P,FLastNewID)
+ end
else If Adaptor.TryFieldValue(P.Name,S) then
SetTypedParam(P,S)
else If Adaptor.TryParamValue(P.Name,S) then
@@ -385,6 +397,8 @@ end;
function TCustomSQLDBWebDataProvider.GetDataset: TDataset;
begin
{$ifdef wmdebug}SendDebug('Get dataset: checking dataset');{$endif}
+ If Assigned(FonGetDataset) then
+ FOnGetDataset(Self);
CheckDataset;
FLastNewID:='';
Result:=FQuery;
@@ -394,12 +408,17 @@ begin
{$ifdef wmdebug}SendDebug('Get dataset: done');{$endif}
end;
-function TCustomSQLDBWebDataProvider.GetNewID: String;
-
+function TCustomSQLDBWebDataProvider.DoGetNewID: String;
begin
If Not Assigned(FOnGetNewID) then
Raise EFPHTTPError.CreateFmt(SErrNoNewIDEvent,[Self.Name]);
FOnGetNewID(Self,Result);
+end;
+
+function TCustomSQLDBWebDataProvider.GetNewID: String;
+
+begin
+ Result:=DoGetNewID;
FLastNewID:=Result;
end;
diff --git a/packages/fcl-xml/src/dom.pp b/packages/fcl-xml/src/dom.pp
index 30370455e7..2524784fee 100644
--- a/packages/fcl-xml/src/dom.pp
+++ b/packages/fcl-xml/src/dom.pp
@@ -2484,7 +2484,7 @@ end;
}
procedure TDOMDocument.NodeListDestroyed(aList: TDOMNodeList);
begin
- if not (nfDestroying in FFlags) then
+ if (not (nfDestroying in FFlags)) and (FNodeLists <> nil) then
FNodeLists.RemoveData(aList);
end;
diff --git a/packages/fpmkunit/src/fpmkunit.pp b/packages/fpmkunit/src/fpmkunit.pp
index 6586444eeb..78ac12c3b3 100644
--- a/packages/fpmkunit/src/fpmkunit.pp
+++ b/packages/fpmkunit/src/fpmkunit.pp
@@ -69,7 +69,7 @@ Type
linux,go32v2,win32,os2,freebsd,beos,netbsd,
amiga,atari, solaris, qnx, netware, openbsd,wdosx,
palmos,macos,darwin,emx,watcom,morphos,netwlibc,
- win64,wince,gba,nds,embedded,symbian
+ win64,wince,gba,nds,embedded,symbian,haiku
);
TOSes = Set of TOS;
@@ -114,7 +114,7 @@ Const
AllOSes = [Low(TOS)..High(TOS)];
AllCPUs = [Low(TCPU)..High(TCPU)];
- AllUnixOSes = [Linux,FreeBSD,NetBSD,OpenBSD,Darwin,QNX,BeOS,Solaris];
+ AllUnixOSes = [Linux,FreeBSD,NetBSD,OpenBSD,Darwin,QNX,BeOS,Solaris,Haiku];
AllBSDOSes = [FreeBSD,NetBSD,OpenBSD,Darwin];
AllWindowsOSes = [Win32,Win64,WinCE];
@@ -148,7 +148,8 @@ Const
{ gba } ( false, false, false, false, false, false, true, false, false, false),
{ nds } ( false, false, false, false, false, false, true, false, false, false),
{ embedded }( false, true, true, true, true, true, true, true, true, true ),
- { symbian } ( false, true, false, false, false, false, true, false, false, false)
+ { symbian } ( false, true, false, false, false, false, true, false, false, false),
+ { haiku } ( false, true, false, false, false, false, false, false, false, false)
);
// Useful
@@ -4462,6 +4463,7 @@ end;
function TBuildEngine.CheckExternalPackage(Const APackageName : String):TPackage;
var
S : String;
+ F : String;
I : Integer;
begin
// Already checked?
@@ -4481,11 +4483,25 @@ begin
Log(vldebug, SDbgExternalDependency, [APackageName,S]);
Result.FTargetState:=tsInstalled;
// Load unit config if it exists
- S:=IncludeTrailingPathDelimiter(S)+UnitConfigFile;
- if FileExists(S) then
+ F:=IncludeTrailingPathDelimiter(S)+UnitConfigFile;
+ if FileExists(F) then
begin
- Log(vlDebug, Format(SDbgLoading, [S]));
- Result.LoadUnitConfigFromFile(S);
+ Log(vlDebug, Format(SDbgLoading, [F]));
+ Result.LoadUnitConfigFromFile(F);
+ end
+ else if FileExists(IncludeTrailingPathDelimiter(S)+FPMakePPFile) then
+ begin
+ // The package is not installed, but the source-path is given.
+ // It is an external package so it is impossible to compile it, so
+ // assume that it has been compiled earlier.
+ F := IncludeTrailingPathDelimiter(Result.UnitDir) + Result.GetUnitsOutputDir(Defaults.CPU,Defaults.OS);
+ // If the unit-directory does not exist, you know for sure that
+ // the package is not compiled
+ if DirectoryExists(F) then
+ begin
+ Result.UnitDir := F;
+ Result.FTargetState:=tsCompiled;
+ end;
end;
// Check recursive implicit dependencies
CompileDependencies(Result);
diff --git a/packages/fpvectorial/src/avisocncgcodewriter.pas b/packages/fpvectorial/src/avisocncgcodewriter.pas
index cc31e608a1..eddb18cad9 100644
--- a/packages/fpvectorial/src/avisocncgcodewriter.pas
+++ b/packages/fpvectorial/src/avisocncgcodewriter.pas
@@ -36,6 +36,10 @@ var
i, j: Integer;
Str: string;
APath: TPath;
+ CurSegment: T2DSegment;
+ Cur3DSegment: T3DSegment;
+ Cur2DBezierSegment: T2DBezierSegment;
+ Cur3DBezierSegment: T3DBezierSegment;
begin
AStrings.Clear;
@@ -51,25 +55,39 @@ begin
// levanta a broca
AStrings.Add('P01 // Sobe a cabeça de gravação');
// vai para o ponto inicial
+ CurSegment := T2DSegment(APath.Points);
AStrings.Add(Format('G01 X%f Y%f',
- [APath.Points[0].X, APath.Points[0].Y]));
+ [CurSegment.X, CurSegment.Y]));
AStrings.Add('P02 // Abaixa a cabeça de gravação');
for j := 1 to APath.Len - 1 do
begin
- case APath.Points[j].SegmentType of
+ CurSegment := T2DSegment(CurSegment.Next);
+ case CurSegment.SegmentType of
st2DLine: AStrings.Add(Format('G01 X%f Y%f',
- [APath.Points[j].X, APath.Points[j].Y]));
- st3DLine: AStrings.Add(Format('G01 X%f Y%f Z%f',
- [APath.Points[j].X, APath.Points[j].Y, APath.Points[j].Z]));
- st2DBezier: AStrings.Add(Format('B02 X%f Y%f X%f Y%f X%f Y%f',
- [APath.Points[j].X2, APath.Points[j].Y2,
- APath.Points[j].X3, APath.Points[j].Y3,
- APath.Points[j].X, APath.Points[j].Y]));
- st3DBezier: AStrings.Add(Format('B03 X%f Y%f Z%f X%f Y%f Z%f X%f Y%f Z%f',
- [APath.Points[j].X2, APath.Points[j].Y2, APath.Points[j].Z2,
- APath.Points[j].X3, APath.Points[j].Y3, APath.Points[j].Z3,
- APath.Points[j].X, APath.Points[j].Y, APath.Points[j].Z]));
+ [CurSegment.X, CurSegment.Y]));
+ st3DLine:
+ begin
+ Cur3DSegment := T3DSegment(CurSegment);
+ AStrings.Add(Format('G01 X%f Y%f Z%f',
+ [Cur3DSegment.X, Cur3DSegment.Y, Cur3DSegment.Z]));
+ end;
+ st2DBezier:
+ begin
+ Cur2DBezierSegment := T2DBezierSegment(CurSegment);
+ AStrings.Add(Format('B02 X%f Y%f X%f Y%f X%f Y%f',
+ [Cur2DBezierSegment.X2, Cur2DBezierSegment.Y2,
+ Cur2DBezierSegment.X3, Cur2DBezierSegment.Y3,
+ Cur2DBezierSegment.X, Cur2DBezierSegment.Y]));
+ end;
+ st3DBezier:
+ begin
+ Cur3DBezierSegment := T3DBezierSegment(CurSegment);
+ AStrings.Add(Format('B03 X%f Y%f Z%f X%f Y%f Z%f X%f Y%f Z%f',
+ [Cur3DBezierSegment.X2, Cur3DBezierSegment.Y2, Cur3DBezierSegment.Z2,
+ Cur3DBezierSegment.X3, Cur3DBezierSegment.Y3, Cur3DBezierSegment.Z3,
+ Cur3DBezierSegment.X, Cur3DBezierSegment.Y, Cur3DBezierSegment.Z]));
+ end;
end;
end;
end;
diff --git a/packages/fpvectorial/src/dxfvectorialreader.pas b/packages/fpvectorial/src/dxfvectorialreader.pas
index 02f5ab7dac..f185084947 100644
--- a/packages/fpvectorial/src/dxfvectorialreader.pas
+++ b/packages/fpvectorial/src/dxfvectorialreader.pas
@@ -29,11 +29,10 @@ unit dxfvectorialreader;
interface
uses
- Classes, SysUtils,
+ Classes, SysUtils, Math,
fpvectorial;
type
-
{ Used by tcutils.SeparateString }
T10Strings = array[0..9] of shortstring;
@@ -70,6 +69,9 @@ type
// HEADER data
ANGBASE: Double;
ANGDIR: Integer;
+ INSBASE, EXTMIN, EXTMAX, LIMMIN, LIMMAX: T3DPoint;
+ // Calculated HEADER data
+ DOC_OFFSET: T3DPoint;
//
function SeparateString(AString: string; ASeparator: Char): T10Strings;
procedure ReadHEADER(ATokens: TDXFTokens; AData: TvVectorialDocument);
@@ -77,6 +79,7 @@ type
procedure ReadENTITIES_LINE(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_ARC(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_CIRCLE(ATokens: TDXFTokens; AData: TvVectorialDocument);
+ procedure ReadENTITIES_DIMENSION(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_ELLIPSE(ATokens: TDXFTokens; AData: TvVectorialDocument);
procedure ReadENTITIES_TEXT(ATokens: TDXFTokens; AData: TvVectorialDocument);
function GetCoordinateValue(AStr: shortstring): Double;
@@ -326,8 +329,9 @@ end;
procedure TvDXFVectorialReader.ReadHEADER(ATokens: TDXFTokens;
AData: TvVectorialDocument);
var
- i: Integer;
+ i, j: Integer;
CurToken: TDXFToken;
+ CurField: P3DPoint;
begin
i := 0;
while i < ATokens.Count do
@@ -344,10 +348,71 @@ begin
CurToken := TDXFToken(ATokens.Items[i+1]);
ANGDIR := StrToInt(CurToken.StrValue);
Inc(i);
+ end
+ // This indicates the size of the document
+ else if (CurToken.StrValue = '$INSBASE') or
+ (CurToken.StrValue = '$EXTMIN') or (CurToken.StrValue = '$EXTMAX') or
+ (CurToken.StrValue = '$LIMMIN') or (CurToken.StrValue = '$LIMMAX') then
+ begin
+ if (CurToken.StrValue = '$INSBASE') then CurField := @INSBASE
+ else if (CurToken.StrValue = '$EXTMIN') then CurField := @EXTMIN
+ else if (CurToken.StrValue = '$EXTMAX') then CurField := @EXTMAX
+ else if (CurToken.StrValue = '$LIMMIN') then CurField := @LIMMIN
+ else if (CurToken.StrValue = '$LIMMAX') then CurField := @LIMMAX;
+
+ // Check the next 2 items and verify if they are the values of the size of the document
+ for j := 0 to 1 do
+ begin
+ CurToken := TDXFToken(ATokens.Items[i+1]);
+ case CurToken.GroupCode of
+ 10:
+ begin;
+ CurField^.X := StrToFloat(CurToken.StrValue, FPointSeparator);
+ Inc(i);
+ end;
+ 20:
+ begin
+ CurField^.Y := StrToFloat(CurToken.StrValue, FPointSeparator);
+ Inc(i);
+ end;
+ end;
+ end;
end;
Inc(i);
end;
+
+ // After getting all the data, we can try to make some sense out of it
+
+ // Sometimes EXTMIN comes as 10^20 and EXTMAX as -10^20, which makes no sence
+ // In these cases we need to ignore them.
+ if (EXTMIN.X > 10000000000) or (EXTMIN.X < -10000000000)
+ or (EXTMAX.X > 10000000000) or (EXTMAX.X < -10000000000) then
+ begin
+ DOC_OFFSET.X := 0;
+ DOC_OFFSET.Y := 0;
+
+ AData.Width := LIMMAX.X;
+ AData.Height := LIMMAX.Y;
+ end
+ else
+ begin
+ // The size of the document seams to be given by:
+ // DOC_SIZE = min(EXTMAX, LIMMAX) - DOC_OFFSET;
+ // if EXTMIN is <> -infinite then DOC_OFFSET = EXTMIN else DOC_OFFSET = (0, 0)
+ // We will shift the whole document so that it has only positive coordinates and
+ // DOC_OFFSET will be utilized for that
+
+ if EXTMIN.X > -100 then
+ begin
+ DOC_OFFSET.X := EXTMIN.X;
+ DOC_OFFSET.Y := EXTMIN.Y;
+ end
+ else FillChar(DOC_OFFSET, sizeof(T3DPoint), #0);
+
+ AData.Width := min(EXTMAX.X, LIMMAX.X) - DOC_OFFSET.X;
+ AData.Height := min(EXTMAX.Y, LIMMAX.Y) - DOC_OFFSET.Y;
+ end;
end;
procedure TvDXFVectorialReader.ReadENTITIES(ATokens: TDXFTokens; AData: TvVectorialDocument);
@@ -360,9 +425,11 @@ begin
CurToken := TDXFToken(ATokens.Items[i]);
if CurToken.StrValue = 'ARC' then ReadENTITIES_ARC(CurToken.Childs, AData)
else if CurToken.StrValue = 'CIRCLE' then ReadENTITIES_CIRCLE(CurToken.Childs, AData)
+ else if CurToken.StrValue = 'DIMENSION' then ReadENTITIES_DIMENSION(CurToken.Childs, AData)
else if CurToken.StrValue = 'ELLIPSE' then ReadENTITIES_ELLIPSE(CurToken.Childs, AData)
else if CurToken.StrValue = 'LINE' then ReadENTITIES_LINE(CurToken.Childs, AData)
- else if CurToken.StrValue = 'TEXT' then
+ else if CurToken.StrValue = 'TEXT' then ReadENTITIES_TEXT(CurToken.Childs, AData)
+ else
begin
// ...
end;
@@ -406,9 +473,15 @@ begin
end;
end;
+ // Position fixing for documents with negative coordinates
+ LineStartX := LineStartX - DOC_OFFSET.X;
+ LineStartY := LineStartY - DOC_OFFSET.Y;
+ LineEndX := LineEndX - DOC_OFFSET.X;
+ LineEndY := LineEndY - DOC_OFFSET.Y;
+
// And now write it
{$ifdef FPVECTORIALDEBUG}
- WriteLn(Format('Adding Line from %f,%f to %f,%f', [LineStartX, LineStartY, LineEndX, LineEndY]));
+ // WriteLn(Format('Adding Line from %f,%f to %f,%f', [LineStartX, LineStartY, LineEndX, LineEndY]));
{$endif}
AData.StartPath(LineStartX, LineStartY);
AData.AddLineToPath(LineEndX, LineEndY);
@@ -416,6 +489,8 @@ begin
end;
{
+Arcs are always counter-clockwise in DXF
+
100 Subclass marker (AcDbCircle)
39 Thickness (optional; default = 0)
10 Center point (in OCS) DXF: X value; APP: 3D point
@@ -462,6 +537,18 @@ begin
end;
end;
+ // In DXF the EndAngle is always greater then the StartAngle.
+ // If it isn't then sum 360 to it to make sure we don't get wrong results
+ if EndAngle < StartAngle then EndAngle := EndAngle + 360;
+
+ // Position fixing for documents with negative coordinates
+ CenterX := CenterX - DOC_OFFSET.X;
+ CenterY := CenterY - DOC_OFFSET.Y;
+
+ {$ifdef FPVECTORIALDEBUG}
+ WriteLn(Format('Adding Arc Center=%f,%f Radius=%f StartAngle=%f EndAngle=%f',
+ [CenterX, CenterY, Radius, StartAngle, EndAngle]));
+ {$endif}
AData.AddCircularArc(CenterX, CenterY, CenterZ, Radius, StartAngle, EndAngle);
end;
@@ -506,11 +593,176 @@ begin
end;
end;
+ // Position fixing for documents with negative coordinates
+ CircleCenterX := CircleCenterX - DOC_OFFSET.X;
+ CircleCenterY := CircleCenterY - DOC_OFFSET.Y;
+
AData.AddCircle(CircleCenterX, CircleCenterY,
CircleCenterZ, CircleRadius);
end;
{
+Group codes Description
+100 Subclass marker (AcDbDimension)
+2 Name of the block that contains the entities that make up the dimension picture
+10 Definition point (in WCS) DXF: X value; APP: 3D point
+20, 30 DXF: Y and Z values of definition point (in WCS)
+11 Middle point of dimension text (in OCS) DXF: X value; APP: 3D point
+21, 31 DXF: Y and Z values of middle point of dimension text (in OCS)
+70 Dimension type.
+ Values 0-6 are integer values that represent the dimension type.
+ Values 32, 64, and 128 are bit values, which are added to the integer values
+ (value 32 is always set in R13 and later releases).
+ 0 = Rotated, horizontal, or vertical; 1 = Aligned;
+ 2 = Angular; 3 = Diameter; 4 = Radius;
+ 5 = Angular 3 point; 6 = Ordinate;
+ 32 = Indicates that the block reference (group code 2) is referenced by this dimension only.
+ 64 = Ordinate type. This is a bit value (bit 7) used only with integer value 6.
+ If set, ordinate is X-type; if not set, ordinate is Y-type.
+ 128 = This is a bit value (bit 8) added to the other group 70 values
+ if the dimension text has been positioned at a user-defined location
+ rather than at the default location.
+71 Attachment point:
+ 1 = Top left; 2 = Top center; 3 = Top right;
+ 4 = Middle left; 5 = Middle center; 6 = Middle right;
+ 7 = Bottom left; 8 = Bottom center; 9 = Bottom right
+72 Dimension text line spacing style (optional):
+ 1(or missing) = At least (taller characters will override)
+ 2 = Exact (taller characters will not override)
+41 Dimension text line spacing factor (optional):
+ Percentage of default (3-on-5) line spacing to be applied. Valid values range from 0.25 to 4.00.
+42 Actual measurement (optional; read-only value)
+1 Dimension text explicitly entered by the user. Optional; default is the measurement.
+ If null or "<>", the dimension measurement is drawn as the text,
+ if " " (one blank space), the text is suppressed. Anything else is drawn as the text.
+53 The optional group code 53 is the rotation angle of the dimension
+ text away from its default orientation (the direction of the dimension line) (optional).
+51 All dimension types have an optional 51 group code, which indicates the
+ horizontal direction for the dimension entity. The dimension entity determines
+ the orientation of dimension text and lines for horizontal, vertical, and
+ rotated linear dimensions.
+ This group value is the negative of the angle between the OCS X axis
+ and the UCS X axis. It is always in the XY plane of the OCS.
+210 Extrusion direction (optional; default = 0, 0, 1) DXF: X value; APP: 3D vector
+220, 230 DXF: Y and Z values of extrusion direction (optional)
+3 Dimension style name
+
+Aligned Dimension Group Codes
+
+100 Subclass marker (AcDbAlignedDimension)
+12 Insertion point for clones of a dimension-Baseline and Continue (in OCS) DXF: X value; APP: 3D point
+22, 32 DXF: Y and Z values of insertion point for clones of a dimension-Baseline and Continue (in OCS)
+13 Definition point for linear and angular dimensions (in WCS) DXF: X value; APP: 3D point
+23, 33 DXF: Y and Z values of definition point for linear and angular dimensions (in WCS)
+14 Definition point for linear and angular dimensions (in WCS) DXF: X value; APP: 3D point
+24, 34 DXF: Y and Z values of definition point for linear and angular dimensions (in WCS)
+
+ |--text--|->10,20
+ | |
+ | |
+ X->14,24 X->13,23
+}
+procedure TvDXFVectorialReader.ReadENTITIES_DIMENSION(ATokens: TDXFTokens;
+ AData: TvVectorialDocument);
+var
+ CurToken: TDXFToken;
+ i: Integer;
+ // DIMENSION
+ BaseLeft, BaseRight, DimensionRight, DimensionLeft, TmpPoint: T3DPoint;
+ IsAlignedDimension: Boolean = False;
+begin
+ // Initial values
+ BaseLeft.X := 0;
+ BaseLeft.Y := 0;
+ BaseRight.X := 0;
+ BaseRight.X := 0;
+ DimensionRight.X := 0;
+ DimensionRight.Y := 0;
+ DimensionLeft.X := 0;
+ DimensionLeft.Y := 0;
+
+ for i := 0 to ATokens.Count - 1 do
+ begin
+ // Now read and process the item name
+ CurToken := TDXFToken(ATokens.Items[i]);
+
+ // Avoid an exception by previously checking if the conversion can be made
+ if CurToken.GroupCode in [10, 20, 30, 11, 21, 31, 13, 23, 33, 14, 24, 34] then
+ begin
+ CurToken.FloatValue := StrToFloat(Trim(CurToken.StrValue), FPointSeparator);
+ end;
+
+ case CurToken.GroupCode of
+ 10: DimensionRight.X := CurToken.FloatValue;
+ 20: DimensionRight.Y := CurToken.FloatValue;
+ 30: DimensionRight.Z := CurToken.FloatValue;
+ 13: BaseRight.X := CurToken.FloatValue;
+ 23: BaseRight.Y := CurToken.FloatValue;
+ 33: BaseRight.Z := CurToken.FloatValue;
+ 14: BaseLeft.X := CurToken.FloatValue;
+ 24: BaseLeft.Y := CurToken.FloatValue;
+ 34: BaseLeft.Z := CurToken.FloatValue;
+ 100:
+ begin
+ if CurToken.StrValue = 'AcDbAlignedDimension' then IsAlignedDimension := True;
+ end;
+ end;
+ end;
+
+ // And now write it
+ {$ifdef FPVECTORIALDEBUG}
+// WriteLn(Format('Adding Line from %f,%f to %f,%f', [LineStartX, LineStartY, LineEndX, LineEndY]));
+ {$endif}
+ if IsAlignedDimension then
+ begin
+ // Now make sure that we actually that BaseLeft is to the left of BaseRight
+ if BaseRight.X < BaseLeft.X then
+ begin
+ TmpPoint := BaseRight;
+ BaseRight := BaseLeft;
+ BaseLeft := TmpPoint;
+ end;
+
+ // Now check if we are a horizontal or vertical dimension
+
+ // horizontal
+ //
+ //DL____ DR
+ // | |
+ // | |
+ // BL BR
+ if DimensionRight.X = BaseRight.X then
+ begin
+ DimensionLeft.X := BaseLeft.X;
+ DimensionLeft.Y := DimensionRight.Y;
+ end
+ // vertical
+ //
+ // BL ----|DR
+ // BR --|DL
+ //
+ // In this case we invert then DR and DL
+ else if DimensionRight.Y = BaseLeft.Y then
+ begin
+ DimensionLeft := DimensionRight;
+ DimensionRight.Y := BaseRight.Y;
+ end
+ // vertical
+ //
+ // BL ----|DL
+ // BR --|DR
+ //
+ else if DimensionRight.Y = BaseRight.Y then
+ begin
+ DimensionLeft.X := DimensionRight.X;
+ DimensionLeft.Y := BaseLeft.Y;
+ end;
+
+ AData.AddAlignedDimension(BaseLeft, BaseRight, DimensionLeft, DimensionRight);
+ end;
+end;
+
+{
100 Subclass marker (AcDbEllipse)
10 Center point (in WCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of center point (in WCS)
@@ -547,6 +799,10 @@ begin
end;
end;
+ // Position fixing for documents with negative coordinates
+ CenterX := CenterX - DOC_OFFSET.X;
+ CenterY := CenterY - DOC_OFFSET.Y;
+
//
AData.AddEllipse(CenterX, CenterY, CenterZ, MajorHalfAxis, MinorHalfAxis, Angle);
end;
@@ -614,6 +870,10 @@ begin
end;
end;
+ // Position fixing for documents with negative coordinates
+ PosX := PosX - DOC_OFFSET.X;
+ PosY := PosY - DOC_OFFSET.Y;
+
//
AData.AddText(PosX, PosY, PosZ, '', Round(FontSize), Str);
end;
diff --git a/packages/fpvectorial/src/fpvectorial.pas b/packages/fpvectorial/src/fpvectorial.pas
index af0feaa868..928b001d11 100644
--- a/packages/fpvectorial/src/fpvectorial.pas
+++ b/packages/fpvectorial/src/fpvectorial.pas
@@ -39,6 +39,12 @@ const
STR_WINMETAFILE_EXTENSION = '.wmf';
type
+ T3DPoint = record
+ X, Y, Z: Double;
+ end;
+
+ P3DPoint = ^T3DPoint;
+
TSegmentType = (
st2DLine, st2DBezier,
st3DLine, st3DBezier, stMoveTo);
@@ -159,6 +165,17 @@ type
procedure CalculateBoundingRectangle;
end;
+ {@@
+ }
+
+ { TvAlignedDimension }
+
+ TvAlignedDimension = class(TvEntity)
+ public
+ // Mandatory fields
+ BaseLeft, BaseRight, DimensionLeft, DimensionRight: T3DPoint;
+ end;
+
type
TvCustomVectorialWriter = class;
@@ -216,6 +233,8 @@ type
procedure AddCircle(ACenterX, ACenterY, ACenterZ, ARadius: Double);
procedure AddCircularArc(ACenterX, ACenterY, ACenterZ, ARadius, AStartAngle, AEndAngle: Double);
procedure AddEllipse(CenterX, CenterY, CenterZ, MajorHalfAxis, MinorHalfAxis, Angle: Double);
+ // Dimensions
+ procedure AddAlignedDimension(BaseLeft, BaseRight, DimLeft, DimRight: T3DPoint);
{ properties }
property PathCount: Integer read GetPathCount;
property Paths[Index: Cardinal]: TPath read GetPath;
@@ -642,6 +661,19 @@ begin
FEntities.Add(lEllipse);
end;
+procedure TvVectorialDocument.AddAlignedDimension(BaseLeft, BaseRight,
+ DimLeft, DimRight: T3DPoint);
+var
+ lDim: TvAlignedDimension;
+begin
+ lDim := TvAlignedDimension.Create;
+ lDim.BaseLeft := BaseLeft;
+ lDim.BaseRight := BaseRight;
+ lDim.DimensionLeft := DimLeft;
+ lDim.DimensionRight := DimRight;
+ FEntities.Add(lDim);
+end;
+
{@@
Convenience method which creates the correct
writer object for a given vector graphics document format.
diff --git a/packages/fpvectorial/src/fpvtocanvas.pas b/packages/fpvectorial/src/fpvtocanvas.pas
index 6893c3b115..456a656382 100644
--- a/packages/fpvectorial/src/fpvtocanvas.pas
+++ b/packages/fpvectorial/src/fpvtocanvas.pas
@@ -11,7 +11,7 @@ uses
{$ifdef USE_LCL_CANVAS}
Graphics, LCLIntf,
{$else}
- fpcanvas,
+ fpcanvas, fpimage,
{$endif}
fpvectorial;
@@ -25,6 +25,10 @@ procedure DrawFPVectorialToCanvas(ASource: TvVectorialDocument;
implementation
+{$ifndef Windows}
+{$define FPVECTORIALDEBUG}
+{$endif}
+
function Rotate2DPoint(P,Fix :TPoint; alpha:double): TPoint;
var
sinus, cosinus : Extended;
@@ -97,6 +101,17 @@ procedure DrawFPVectorialToCanvas(ASource: TvVectorialDocument;
ADest: TFPCustomCanvas;
{$endif}
ADestX: Integer = 0; ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0);
+
+ function CoordToCanvasX(ACoord: Double): Integer;
+ begin
+ Result := Round(ADestX + AmulX * ACoord);
+ end;
+
+ function CoordToCanvasY(ACoord: Double): Integer;
+ begin
+ Result := Round(ADestY + AmulY * ACoord);
+ end;
+
var
i, j, k: Integer;
PosX, PosY: Integer; // Not modified by ADestX, etc
@@ -113,7 +128,15 @@ var
CurEntity: TvEntity;
CurCircle: TvCircle;
CurEllipse: TvEllipse;
+ //
CurArc: TvCircularArc;
+ FinalStartAngle, FinalEndAngle, tmpAngle: double;
+ BoundsLeft, BoundsTop, BoundsRight, BoundsBottom,
+ IntStartAngle, IntAngleLength, IntTmp: Integer;
+ //
+ CurDim: TvAlignedDimension;
+ Points: array of TPoint;
+ UpperDim, LowerDim: T3DPoint;
begin
{$ifdef FPVECTORIALDEBUG}
WriteLn(':>DrawFPVectorialToCanvas');
@@ -121,6 +144,7 @@ begin
PosX := 0;
PosY := 0;
+ ADest.Brush.Style := bsClear;
ADest.MoveTo(ADestX, ADestY);
@@ -138,17 +162,11 @@ begin
case CurSegment.SegmentType of
stMoveTo:
begin
- ADest.MoveTo(
- Round(ADestX + AMulX * Cur2DSegment.X),
- Round(ADestY + AMulY * Cur2DSegment.Y)
- );
+ ADest.MoveTo(CoordToCanvasX(Cur2DSegment.X), CoordToCanvasY(Cur2DSegment.Y));
end;
st2DLine, st3DLine:
begin
- ADest.LineTo(
- Round(ADestX + AMulX * Cur2DSegment.X),
- Round(ADestY + AMulY * Cur2DSegment.Y)
- );
+ ADest.LineTo(CoordToCanvasX(Cur2DSegment.X), CoordToCanvasY(Cur2DSegment.Y));
end;
{ To draw a bezier we need to divide the interval in parts and make
lines between this parts }
@@ -164,9 +182,7 @@ begin
t := k / CurveLength;
CurX := Round(sqr(1 - t) * (1 - t) * PosX + 3 * t * sqr(1 - t) * Cur2DBSegment.X2 + 3 * t * t * (1 - t) * Cur2DBSegment.X3 + t * t * t * Cur2DBSegment.X);
CurY := Round(sqr(1 - t) * (1 - t) * PosY + 3 * t * sqr(1 - t) * Cur2DBSegment.Y2 + 3 * t * t * (1 - t) * Cur2DBSegment.Y3 + t * t * t * Cur2DBSegment.Y);
- ADest.LineTo(
- Round(ADestX + AMulX * CurX),
- Round(ADestY + AMulY * CurY));
+ ADest.LineTo(CoordToCanvasX(CurX), CoordToCanvasY(CurY));
end;
PosX := Round(Cur2DBSegment.X);
PosY := Round(Cur2DBSegment.Y);
@@ -183,10 +199,10 @@ begin
begin
CurCircle := CurEntity as TvCircle;
ADest.Ellipse(
- Round(ADestX + AmulX * (CurCircle.CenterX - CurCircle.Radius)),
- Round(ADestY + AMulY * (CurCircle.CenterY - CurCircle.Radius)),
- Round(ADestX + AmulX * (CurCircle.CenterX + CurCircle.Radius)),
- Round(ADestY + AMulY * (CurCircle.CenterY + CurCircle.Radius))
+ CoordToCanvasX(CurCircle.CenterX - CurCircle.Radius),
+ CoordToCanvasY(CurCircle.CenterY - CurCircle.Radius),
+ CoordToCanvasX(CurCircle.CenterX + CurCircle.Radius),
+ CoordToCanvasY(CurCircle.CenterY + CurCircle.Radius)
);
end
else if CurEntity is TvEllipse then
@@ -198,16 +214,155 @@ begin
begin
CurArc := CurEntity as TvCircularArc;
{$ifdef USE_LCL_CANVAS}
+ // ToDo: Consider a X axis inversion
+ // If the Y axis is inverted, then we need to mirror our angles as well
+ BoundsLeft := CoordToCanvasX(CurArc.CenterX - CurArc.Radius);
+ BoundsTop := CoordToCanvasY(CurArc.CenterY - CurArc.Radius);
+ BoundsRight := CoordToCanvasX(CurArc.CenterX + CurArc.Radius);
+ BoundsBottom := CoordToCanvasY(CurArc.CenterY + CurArc.Radius);
+ {if AMulY > 0 then
+ begin}
+ FinalStartAngle := CurArc.StartAngle;
+ FinalEndAngle := CurArc.EndAngle;
+ {end
+ else // AMulY is negative
+ begin
+ // Inverting the angles generates the correct result for Y axis inversion
+ if CurArc.EndAngle = 0 then FinalStartAngle := 0
+ else FinalStartAngle := 360 - 1* CurArc.EndAngle;
+ if CurArc.StartAngle = 0 then FinalEndAngle := 0
+ else FinalEndAngle := 360 - 1* CurArc.StartAngle;
+ end;}
+ IntStartAngle := Round(16*FinalStartAngle);
+ IntAngleLength := Round(16*(FinalEndAngle - FinalStartAngle));
+ // On Gtk2 and Carbon, the Left really needs to be to the Left of the Right position
+ // The same for the Top and Bottom
+ // On Windows it works fine either way
+ // On Gtk2 if the positions are inverted then the arcs are screwed up
+ // In Carbon if the positions are inverted, then the arc is inverted
+ if BoundsLeft > BoundsRight then
+ begin
+ IntTmp := BoundsLeft;
+ BoundsLeft := BoundsRight;
+ BoundsRight := IntTmp;
+ end;
+ if BoundsTop > BoundsBottom then
+ begin
+ IntTmp := BoundsTop;
+ BoundsTop := BoundsBottom;
+ BoundsBottom := IntTmp;
+ end;
// Arc(ALeft, ATop, ARight, ABottom, Angle16Deg, Angle16DegLength: Integer);
+ {$ifdef FPVECTORIALDEBUG}
+ WriteLn(Format('Drawing Arc Center=%f,%f Radius=%f StartAngle=%f AngleLength=%f',
+ [CurArc.CenterX, CurArc.CenterY, CurArc.Radius, IntStartAngle/16, IntAngleLength/16]));
+ {$endif}
ADest.Arc(
- Round(ADestX + AmulX * (CurArc.CenterX - CurArc.Radius)),
- Round(ADestY + AmulY * (CurArc.CenterY - CurArc.Radius)),
- Round(ADestX + AmulX * (CurArc.CenterX + CurArc.Radius)),
- Round(ADestY + AmulY * (CurArc.CenterY + CurArc.Radius)),
- Round(16*CurArc.StartAngle),
- Round(16*CurArc.EndAngle - CurArc.StartAngle)
+ BoundsLeft, BoundsTop, BoundsRight, BoundsBottom,
+ IntStartAngle, IntAngleLength
);
+ // Debug info
+// {$define FPVECTORIALDEBUG}
+// {$ifdef FPVECTORIALDEBUG}
+// WriteLn(Format('Drawing Arc x1y1=%d,%d x2y2=%d,%d start=%d end=%d',
+// [BoundsLeft, BoundsTop, BoundsRight, BoundsBottom, IntStartAngle, IntAngleLength]));
+// {$endif}
+{ ADest.TextOut(CoordToCanvasX(CurArc.CenterX), CoordToCanvasY(CurArc.CenterY),
+ Format('R=%d S=%d L=%d', [Round(CurArc.Radius*AMulX), Round(FinalStartAngle),
+ Abs(Round((FinalEndAngle - FinalStartAngle)))]));
+ ADest.Pen.Color := TColor($DDDDDD);
+ ADest.Rectangle(
+ BoundsLeft, BoundsTop, BoundsRight, BoundsBottom);
+ ADest.Pen.Color := clBlack;}
{$endif}
+ end
+ else if CurEntity is TvAlignedDimension then
+ begin
+ CurDim := CurEntity as TvAlignedDimension;
+ //
+ // Draws this shape:
+ // vertical horizontal
+ // ___
+ // | | or ---| X cm
+ // | --|
+ // Which marks the dimension
+ ADest.MoveTo(CoordToCanvasX(CurDim.BaseRight.X), CoordToCanvasY(CurDim.BaseRight.Y));
+ ADest.LineTo(CoordToCanvasX(CurDim.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.Y));
+ ADest.LineTo(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y));
+ ADest.LineTo(CoordToCanvasX(CurDim.BaseLeft.X), CoordToCanvasY(CurDim.BaseLeft.Y));
+ // Now the arrows
+ // horizontal
+ SetLength(Points, 3);
+ if CurDim.DimensionRight.Y = CurDim.DimensionLeft.Y then
+ begin
+ {$ifdef USE_LCL_CANVAS}
+ ADest.Brush.Color := clBlack;
+ {$else}
+ ADest.Brush.FPColor := colBlack;
+ {$endif}
+ ADest.Brush.Style := bsSolid;
+ // Left arrow
+ Points[0] := Point(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y));
+ Points[1] := Point(Points[0].X + 7, Points[0].Y - 3);
+ Points[2] := Point(Points[0].X + 7, Points[0].Y + 3);
+ ADest.Polygon(Points);
+ // Right arrow
+ Points[0] := Point(CoordToCanvasX(CurDim.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.Y));
+ Points[1] := Point(Points[0].X - 7, Points[0].Y - 3);
+ Points[2] := Point(Points[0].X - 7, Points[0].Y + 3);
+ ADest.Polygon(Points);
+ ADest.Brush.Style := bsClear;
+ // Dimension text
+ Points[0].X := CoordToCanvasX((CurDim.DimensionLeft.X+CurDim.DimensionRight.X)/2);
+ Points[0].Y := CoordToCanvasY(CurDim.DimensionLeft.Y);
+ LowerDim.X := CurDim.DimensionRight.X-CurDim.DimensionLeft.X;
+ ADest.Font.Size := 10;
+ ADest.TextOut(Points[0].X, Points[0].Y, Format('%.1f', [LowerDim.X]));
+ end
+ else
+ begin
+ {$ifdef USE_LCL_CANVAS}
+ ADest.Brush.Color := clBlack;
+ {$else}
+ ADest.Brush.FPColor := colBlack;
+ {$endif}
+ ADest.Brush.Style := bsSolid;
+ // There is no upper/lower preference for DimensionLeft/Right, so we need to check
+ if CurDim.DimensionLeft.Y > CurDim.DimensionRight.Y then
+ begin
+ UpperDim := CurDim.DimensionLeft;
+ LowerDim := CurDim.DimensionRight;
+ end
+ else
+ begin
+ UpperDim := CurDim.DimensionRight;
+ LowerDim := CurDim.DimensionLeft;
+ end;
+ // Upper arrow
+ Points[0] := Point(CoordToCanvasX(UpperDim.X), CoordToCanvasY(UpperDim.Y));
+ Points[1] := Point(Points[0].X + Round(AMulX), Points[0].Y - Round(AMulY*3));
+ Points[2] := Point(Points[0].X - Round(AMulX), Points[0].Y - Round(AMulY*3));
+ ADest.Polygon(Points);
+ // Lower arrow
+ Points[0] := Point(CoordToCanvasX(LowerDim.X), CoordToCanvasY(LowerDim.Y));
+ Points[1] := Point(Points[0].X + Round(AMulX), Points[0].Y + Round(AMulY*3));
+ Points[2] := Point(Points[0].X - Round(AMulX), Points[0].Y + Round(AMulY*3));
+ ADest.Polygon(Points);
+ ADest.Brush.Style := bsClear;
+ // Dimension text
+ Points[0].X := CoordToCanvasX(CurDim.DimensionLeft.X);
+ Points[0].Y := CoordToCanvasY((CurDim.DimensionLeft.Y+CurDim.DimensionRight.Y)/2);
+ LowerDim.Y := CurDim.DimensionRight.Y-CurDim.DimensionLeft.Y;
+ if LowerDim.Y < 0 then LowerDim.Y := -1 * LowerDim.Y;
+ ADest.Font.Size := 10;
+ ADest.TextOut(Points[0].X, Points[0].Y, Format('%.1f', [LowerDim.Y]));
+ end;
+ SetLength(Points, 0);
+{ // Debug info
+ ADest.TextOut(CoordToCanvasX(CurDim.BaseRight.X), CoordToCanvasY(CurDim.BaseRight.Y), 'BR');
+ ADest.TextOut(CoordToCanvasX(CurDim.DimensionRight.X), CoordToCanvasY(CurDim.DimensionRight.Y), 'DR');
+ ADest.TextOut(CoordToCanvasX(CurDim.DimensionLeft.X), CoordToCanvasY(CurDim.DimensionLeft.Y), 'DL');
+ ADest.TextOut(CoordToCanvasX(CurDim.BaseLeft.X), CoordToCanvasY(CurDim.BaseLeft.Y), 'BL');}
end;
end;
@@ -215,10 +370,16 @@ begin
for i := 0 to ASource.GetTextCount - 1 do
begin
CurText := ASource.GetText(i);
- ADest.Font.Height := Round(AmulY * CurText.FontSize);
+ ADest.Font.Size := Round(AmulX * CurText.FontSize);
ADest.Pen.Style := psSolid;
+ {$ifdef USE_LCL_CANVAS}
ADest.Pen.Color := clBlack;
- ADest.TextOut(Round(CurText.X), Round(CurText.Y), CurText.Value);
+ {$else}
+ ADest.Pen.FPColor := colBlack;
+ {$endif}
+ ADest.Brush.Style := bsClear;
+ LowerDim.Y := CurText.Y + CurText.FontSize;
+ ADest.TextOut(CoordToCanvasX(CurText.X), CoordToCanvasY(LowerDim.Y), CurText.Value);
end;
{$ifdef FPVECTORIALDEBUG}
diff --git a/packages/gdbint/src/gdbint.pp b/packages/gdbint/src/gdbint.pp
index 60d651e4b5..ab2bc6911d 100644
--- a/packages/gdbint/src/gdbint.pp
+++ b/packages/gdbint/src/gdbint.pp
@@ -120,16 +120,28 @@ interface
{$define GDB_HAS_BP_NONE}
{$endif def GDB_V608}
+{ 7.3.x }
+{$ifdef GDB_V703}
+ {$info using gdb 7.3.x}
+ {$define GDB_V7}
+ {$define GDB_BP_LOCATION_HAS_GDBARCH}
+ {$define GDB_HAS_PROGRAM_SPACE}
+{$endif def GDB_V702}
+
{ 7.2.x }
{$ifdef GDB_V702}
{$info using gdb 7.2.x}
{$define GDB_V7}
+ {$define GDB_BP_LOCATION_HAS_GDBARCH}
+ {$define GDB_HAS_PROGRAM_SPACE}
{$endif def GDB_V702}
{ 7.1.x }
{$ifdef GDB_V701}
{$info using gdb 7.1.x}
{$define GDB_V7}
+ {$define GDB_BP_LOCATION_HAS_GDBARCH}
+ {$define GDB_HAS_PROGRAM_SPACE}
{$endif def GDB_V701}
@@ -138,6 +150,10 @@ interface
{$ifdef GDB_V700}
{$info using gdb 7.0.x}
{$define GDB_V7}
+ {$ifdef GDB_CVS}
+ {$define GDB_BP_LOCATION_HAS_GDBARCH}
+ {$define GDB_HAS_PROGRAM_SPACE}
+ {$endif GDB_CVS}
{$endif def GDB_V700}
{$ifdef GDB_V7}
@@ -157,11 +173,6 @@ interface
{$define GDB_HAS_OBSERVER_NOTIFY_BREAKPOINT_CREATED}
{$define GDB_TARGET_CLOSE_HAS_PTARGET_ARG}
{$define GDB_HAS_BP_NONE}
-
- {$ifdef GDB_CVS}
- {$define GDB_BP_LOCATION_HAS_GDBARCH}
- {$define GDB_HAS_PROGRAM_SPACE}
- {$endif GDB_CVS}
{$endif def GDB_V7}
@@ -2762,7 +2773,11 @@ var
begin
for i:=0 to frame_size-1 do
dispose(frames[i],done);
- freemem(frames,sizeof(pointer)*Frame_size);
+ if assigned(frames) then
+ begin
+ freemem(frames,sizeof(pointer)*Frame_size);
+ frames:=nil;
+ end;
frame_count:=0;
frame_size:=0;
end;
diff --git a/packages/libogcfpc/Makefile.fpc b/packages/libogcfpc/Makefile.fpc
index 59572ce330..e22673f440 100644
--- a/packages/libogcfpc/Makefile.fpc
+++ b/packages/libogcfpc/Makefile.fpc
@@ -27,7 +27,7 @@ cpu=powerpc
target=wii
fpcdir=../..
-[require]
+[require]
nortl=y
[shared]
diff --git a/packages/libogcfpc/examples/devices/Makefile b/packages/libogcfpc/examples/devices/Makefile
index 3fbde4960e..a5def5a6d0 100644
--- a/packages/libogcfpc/examples/devices/Makefile
+++ b/packages/libogcfpc/examples/devices/Makefile
@@ -265,7 +265,7 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
endif
PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_DIRS+=network usbgecko usbkeyboard
+override TARGET_DIRS+=network usbkeyboard usbgecko
endif
override INSTALL_FPCPACKAGE=y
ifdef REQUIRE_UNITSDIR
@@ -1417,8 +1417,8 @@ fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
fpc_makefiles: fpc_makefile fpc_makefile_dirs
ifeq ($(FULL_TARGET),powerpc-wii)
TARGET_DIRS_NETWORK=1
-TARGET_DIRS_USBGECKO=1
TARGET_DIRS_USBKEYBOARD=1
+TARGET_DIRS_USBGECKO=1
endif
ifdef TARGET_DIRS_NETWORK
network_all:
@@ -1465,51 +1465,6 @@ network:
$(MAKE) -C network all
.PHONY: network_all network_debug network_smart network_release network_units network_examples network_shared network_install network_sourceinstall network_exampleinstall network_distinstall network_zipinstall network_zipsourceinstall network_zipexampleinstall network_zipdistinstall network_clean network_distclean network_cleanall network_info network_makefiles network
endif
-ifdef TARGET_DIRS_USBGECKO
-usbgecko_all:
- $(MAKE) -C usbgecko all
-usbgecko_debug:
- $(MAKE) -C usbgecko debug
-usbgecko_smart:
- $(MAKE) -C usbgecko smart
-usbgecko_release:
- $(MAKE) -C usbgecko release
-usbgecko_units:
- $(MAKE) -C usbgecko units
-usbgecko_examples:
- $(MAKE) -C usbgecko examples
-usbgecko_shared:
- $(MAKE) -C usbgecko shared
-usbgecko_install:
- $(MAKE) -C usbgecko install
-usbgecko_sourceinstall:
- $(MAKE) -C usbgecko sourceinstall
-usbgecko_exampleinstall:
- $(MAKE) -C usbgecko exampleinstall
-usbgecko_distinstall:
- $(MAKE) -C usbgecko distinstall
-usbgecko_zipinstall:
- $(MAKE) -C usbgecko zipinstall
-usbgecko_zipsourceinstall:
- $(MAKE) -C usbgecko zipsourceinstall
-usbgecko_zipexampleinstall:
- $(MAKE) -C usbgecko zipexampleinstall
-usbgecko_zipdistinstall:
- $(MAKE) -C usbgecko zipdistinstall
-usbgecko_clean:
- $(MAKE) -C usbgecko clean
-usbgecko_distclean:
- $(MAKE) -C usbgecko distclean
-usbgecko_cleanall:
- $(MAKE) -C usbgecko cleanall
-usbgecko_info:
- $(MAKE) -C usbgecko info
-usbgecko_makefiles:
- $(MAKE) -C usbgecko makefiles
-usbgecko:
- $(MAKE) -C usbgecko all
-.PHONY: usbgecko_all usbgecko_debug usbgecko_smart usbgecko_release usbgecko_units usbgecko_examples usbgecko_shared usbgecko_install usbgecko_sourceinstall usbgecko_exampleinstall usbgecko_distinstall usbgecko_zipinstall usbgecko_zipsourceinstall usbgecko_zipexampleinstall usbgecko_zipdistinstall usbgecko_clean usbgecko_distclean usbgecko_cleanall usbgecko_info usbgecko_makefiles usbgecko
-endif
ifdef TARGET_DIRS_USBKEYBOARD
usbkeyboard_all:
$(MAKE) -C usbkeyboard all
@@ -1555,6 +1510,51 @@ usbkeyboard:
$(MAKE) -C usbkeyboard all
.PHONY: usbkeyboard_all usbkeyboard_debug usbkeyboard_smart usbkeyboard_release usbkeyboard_units usbkeyboard_examples usbkeyboard_shared usbkeyboard_install usbkeyboard_sourceinstall usbkeyboard_exampleinstall usbkeyboard_distinstall usbkeyboard_zipinstall usbkeyboard_zipsourceinstall usbkeyboard_zipexampleinstall usbkeyboard_zipdistinstall usbkeyboard_clean usbkeyboard_distclean usbkeyboard_cleanall usbkeyboard_info usbkeyboard_makefiles usbkeyboard
endif
+ifdef TARGET_DIRS_USBGECKO
+usbgecko_all:
+ $(MAKE) -C usbgecko all
+usbgecko_debug:
+ $(MAKE) -C usbgecko debug
+usbgecko_smart:
+ $(MAKE) -C usbgecko smart
+usbgecko_release:
+ $(MAKE) -C usbgecko release
+usbgecko_units:
+ $(MAKE) -C usbgecko units
+usbgecko_examples:
+ $(MAKE) -C usbgecko examples
+usbgecko_shared:
+ $(MAKE) -C usbgecko shared
+usbgecko_install:
+ $(MAKE) -C usbgecko install
+usbgecko_sourceinstall:
+ $(MAKE) -C usbgecko sourceinstall
+usbgecko_exampleinstall:
+ $(MAKE) -C usbgecko exampleinstall
+usbgecko_distinstall:
+ $(MAKE) -C usbgecko distinstall
+usbgecko_zipinstall:
+ $(MAKE) -C usbgecko zipinstall
+usbgecko_zipsourceinstall:
+ $(MAKE) -C usbgecko zipsourceinstall
+usbgecko_zipexampleinstall:
+ $(MAKE) -C usbgecko zipexampleinstall
+usbgecko_zipdistinstall:
+ $(MAKE) -C usbgecko zipdistinstall
+usbgecko_clean:
+ $(MAKE) -C usbgecko clean
+usbgecko_distclean:
+ $(MAKE) -C usbgecko distclean
+usbgecko_cleanall:
+ $(MAKE) -C usbgecko cleanall
+usbgecko_info:
+ $(MAKE) -C usbgecko info
+usbgecko_makefiles:
+ $(MAKE) -C usbgecko makefiles
+usbgecko:
+ $(MAKE) -C usbgecko all
+.PHONY: usbgecko_all usbgecko_debug usbgecko_smart usbgecko_release usbgecko_units usbgecko_examples usbgecko_shared usbgecko_install usbgecko_sourceinstall usbgecko_exampleinstall usbgecko_distinstall usbgecko_zipinstall usbgecko_zipsourceinstall usbgecko_zipexampleinstall usbgecko_zipdistinstall usbgecko_clean usbgecko_distclean usbgecko_cleanall usbgecko_info usbgecko_makefiles usbgecko
+endif
all: $(addsuffix _all,$(TARGET_DIRS))
debug: $(addsuffix _debug,$(TARGET_DIRS))
smart: $(addsuffix _smart,$(TARGET_DIRS))
diff --git a/packages/libogcfpc/examples/devices/Makefile.fpc b/packages/libogcfpc/examples/devices/Makefile.fpc
index 34b9e012ff..79c7e6ca90 100644
--- a/packages/libogcfpc/examples/devices/Makefile.fpc
+++ b/packages/libogcfpc/examples/devices/Makefile.fpc
@@ -3,7 +3,7 @@
#
[target]
-dirs=network usbgecko usbkeyboard
+dirs=network usbkeyboard usbgecko
[require]
packages=libogcfpc
diff --git a/packages/libogcfpc/examples/devices/network/Makefile b/packages/libogcfpc/examples/devices/network/Makefile
index ce39ce525b..49b8b2df9a 100644
--- a/packages/libogcfpc/examples/devices/network/Makefile
+++ b/packages/libogcfpc/examples/devices/network/Makefile
@@ -100,8 +100,6 @@ endif
endif
export ECHO
endif
-override OS_TARGET_DEFAULT=wii
-override CPU_TARGET_DEFAULT=powerpc
override DEFAULT_FPCDIR=../../../../..
ifndef FPC
ifdef PP
@@ -266,25 +264,10 @@ ifeq ($(UNITSDIR),)
UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
endif
PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
-BUILD = build
-INC = inc
-DATA = data
-TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_PROGRAMS+=sockettest
-endif
-ifeq ($(FULL_TARGET),powerpc-wii)
-override CLEAN_UNITS+=*
-endif
-ifeq ($(FULL_TARGET),powerpc-wii)
-override CLEAN_FILES+=*.elf *.o *.s *.h *.bin *.map $(BUILD)/* $(INC)/*
+override TARGET_DIRS+=sockettest
endif
override INSTALL_FPCPACKAGE=y
-ifeq ($(FULL_TARGET),powerpc-wii)
-override COMPILER_OPTIONS+=-g -Xm
-endif
ifdef REQUIRE_UNITSDIR
override UNITSDIR+=$(REQUIRE_UNITSDIR)
endif
@@ -1249,171 +1232,10 @@ EXECPPAS:=@$(PPAS)
endif
endif
endif
-.PHONY: fpc_exes
-ifndef CROSSINSTALL
-ifneq ($(TARGET_PROGRAMS),)
-override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
-override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))) $(addprefix $(IMPORTLIBPREFIX),$(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
-ifeq ($(OS_TARGET),emx)
-override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
-endif
-endif
-endif
-fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
ifdef TARGET_RSTS
override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
override CLEANRSTFILES+=$(RSTFILES)
endif
-.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
-$(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 .lpr .dpr .pp .rc .res
-$(COMPILER_UNITTARGETDIR):
- $(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
-$(COMPILER_TARGETDIR):
- $(MKDIRTREE) $(COMPILER_TARGETDIR)
-%$(PPUEXT): %.pp
- $(COMPILER) $<
- $(EXECPPAS)
-%$(PPUEXT): %.pas
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.pp
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.pas
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.lpr
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.dpr
- $(COMPILER) $<
- $(EXECPPAS)
-%.res: %.rc
- windres -i $< -o $@
-vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.inc $(COMPILER_INCLUDEDIR)
-vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
-vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
-.PHONY: fpc_shared
-override INSTALLTARGET+=fpc_shared_install
-ifndef SHARED_LIBVERSION
-SHARED_LIBVERSION=$(FPC_VERSION)
-endif
-ifndef SHARED_LIBNAME
-SHARED_LIBNAME=$(PACKAGE_NAME)
-endif
-ifndef SHARED_FULLNAME
-SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
-endif
-ifndef SHARED_LIBUNITS
-SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
-override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
-endif
-fpc_shared:
-ifdef HASSHAREDLIB
- $(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
-ifneq ($(SHARED_BUILD),n)
- $(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
-endif
-else
- @$(ECHO) Shared Libraries not supported
-endif
-fpc_shared_install:
-ifneq ($(SHARED_BUILD),n)
-ifneq ($(SHARED_LIBUNITS),)
-ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
- $(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
-endif
-endif
-endif
-.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))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
-ifneq ($(UNITTARGETDIRPREFIX),)
-override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
-override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
-endif
-override INSTALL_CREATEPACKAGEFPC=1
-endif
-ifdef INSTALLEXEFILES
-ifneq ($(TARGETDIRPREFIX),)
-override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
-endif
-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$(CPU_TARGET)-$(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))
@@ -1593,82 +1415,76 @@ 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
-ifndef BIN2S
-BIN2S:=$(strip $(wildcard $(addsuffix /bin2s$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(BIN2S),)
-BIN2S= __missing_command_BIN2S
-else
-BIN2S:=$(firstword $(BIN2S))
-endif
-endif
-export BIN2S
-ifndef RMDIR
-RMDIR:=$(strip $(wildcard $(addsuffix /rmdir$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(RMDIR),)
-RMDIR= __missing_command_RMDIR
-else
-RMDIR:=$(firstword $(RMDIR))
-endif
-endif
-export RMDIR
-ifndef GXTEXCONV
-GXTEXCONV:=$(strip $(wildcard $(addsuffix /gxtexconv$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(GXTEXCONV),)
-GXTEXCONV= __missing_command_GXTEXCONV
-else
-GXTEXCONV:=$(firstword $(GXTEXCONV))
-endif
-endif
-export GXTEXCONV
-debug: fpc_debug
-smart: fpc_smart
-release: fpc_release
-units: fpc_units
-examples:
-shared: fpc_shared
-install: fpc_install
-sourceinstall: fpc_sourceinstall
-exampleinstall: fpc_exampleinstall
-distinstall:
-zipinstall:
-zipsourceinstall:
-zipexampleinstall:
-zipdistinstall:
-distclean: fpc_distclean
-cleanall: fpc_cleanall
+ifeq ($(FULL_TARGET),powerpc-wii)
+TARGET_DIRS_SOCKETTEST=1
+endif
+ifdef TARGET_DIRS_SOCKETTEST
+sockettest_all:
+ $(MAKE) -C sockettest all
+sockettest_debug:
+ $(MAKE) -C sockettest debug
+sockettest_smart:
+ $(MAKE) -C sockettest smart
+sockettest_release:
+ $(MAKE) -C sockettest release
+sockettest_units:
+ $(MAKE) -C sockettest units
+sockettest_examples:
+ $(MAKE) -C sockettest examples
+sockettest_shared:
+ $(MAKE) -C sockettest shared
+sockettest_install:
+ $(MAKE) -C sockettest install
+sockettest_sourceinstall:
+ $(MAKE) -C sockettest sourceinstall
+sockettest_exampleinstall:
+ $(MAKE) -C sockettest exampleinstall
+sockettest_distinstall:
+ $(MAKE) -C sockettest distinstall
+sockettest_zipinstall:
+ $(MAKE) -C sockettest zipinstall
+sockettest_zipsourceinstall:
+ $(MAKE) -C sockettest zipsourceinstall
+sockettest_zipexampleinstall:
+ $(MAKE) -C sockettest zipexampleinstall
+sockettest_zipdistinstall:
+ $(MAKE) -C sockettest zipdistinstall
+sockettest_clean:
+ $(MAKE) -C sockettest clean
+sockettest_distclean:
+ $(MAKE) -C sockettest distclean
+sockettest_cleanall:
+ $(MAKE) -C sockettest cleanall
+sockettest_info:
+ $(MAKE) -C sockettest info
+sockettest_makefiles:
+ $(MAKE) -C sockettest makefiles
+sockettest:
+ $(MAKE) -C sockettest all
+.PHONY: sockettest_all sockettest_debug sockettest_smart sockettest_release sockettest_units sockettest_examples sockettest_shared sockettest_install sockettest_sourceinstall sockettest_exampleinstall sockettest_distinstall sockettest_zipinstall sockettest_zipsourceinstall sockettest_zipexampleinstall sockettest_zipdistinstall sockettest_clean sockettest_distclean sockettest_cleanall sockettest_info sockettest_makefiles sockettest
+endif
+all: $(addsuffix _all,$(TARGET_DIRS))
+debug: $(addsuffix _debug,$(TARGET_DIRS))
+smart: $(addsuffix _smart,$(TARGET_DIRS))
+release: $(addsuffix _release,$(TARGET_DIRS))
+units: $(addsuffix _units,$(TARGET_DIRS))
+examples: $(addsuffix _examples,$(TARGET_DIRS))
+shared: $(addsuffix _shared,$(TARGET_DIRS))
+install: $(addsuffix _install,$(TARGET_DIRS))
+sourceinstall: $(addsuffix _sourceinstall,$(TARGET_DIRS))
+exampleinstall: $(addsuffix _exampleinstall,$(TARGET_DIRS))
+distinstall: $(addsuffix _distinstall,$(TARGET_DIRS))
+zipinstall: $(addsuffix _zipinstall,$(TARGET_DIRS))
+zipsourceinstall: $(addsuffix _zipsourceinstall,$(TARGET_DIRS))
+zipexampleinstall: $(addsuffix _zipexampleinstall,$(TARGET_DIRS))
+zipdistinstall: $(addsuffix _zipdistinstall,$(TARGET_DIRS))
+clean: $(addsuffix _clean,$(TARGET_DIRS))
+distclean: $(addsuffix _distclean,$(TARGET_DIRS))
+cleanall: $(addsuffix _cleanall,$(TARGET_DIRS))
info: fpc_info
-makefiles: fpc_makefiles
-.PHONY: debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall distclean cleanall info makefiles
+makefiles: fpc_makefiles $(addsuffix _makefiles,$(TARGET_DIRS))
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
-dir_delete:
- @$(DELTREE) $(CURDIR)/$(BUILD)
- @$(DELTREE) $(CURDIR)/$(INC)
-dir_make:
-ifneq ($(BUILD), $(CURDIR))
- @$(MKDIR) $(BUILD)
-endif
-ifneq ($(INC), $(CURDIR))
- @$(MKDIR) $(INC)
-endif
-ifneq ($(DATA), $(CURDIR))
- @$(MKDIR) $(DATA)
-endif
-$(TPL_FILES): $(wildcard %.scf)
- @echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
- @$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
diff --git a/packages/libogcfpc/examples/devices/network/Makefile.fpc b/packages/libogcfpc/examples/devices/network/Makefile.fpc
index 4efa10a9ce..638eb95cc6 100644
--- a/packages/libogcfpc/examples/devices/network/Makefile.fpc
+++ b/packages/libogcfpc/examples/devices/network/Makefile.fpc
@@ -12,7 +12,7 @@ packages=libogcfpc
fpcpackage=y
[default]
-fpcdir=../../../..
+fpcdir=../../../../..
[rules]
.NOTPARALLEL:
diff --git a/packages/libogcfpc/examples/devices/usbgecko/Makefile b/packages/libogcfpc/examples/devices/usbgecko/Makefile
index 78568ff95a..00745f8599 100644
--- a/packages/libogcfpc/examples/devices/usbgecko/Makefile
+++ b/packages/libogcfpc/examples/devices/usbgecko/Makefile
@@ -100,8 +100,6 @@ endif
endif
export ECHO
endif
-override OS_TARGET_DEFAULT=wii
-override CPU_TARGET_DEFAULT=powerpc
override DEFAULT_FPCDIR=../../../../..
ifndef FPC
ifdef PP
@@ -266,25 +264,10 @@ ifeq ($(UNITSDIR),)
UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
endif
PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
-BUILD = build
-INC = inc
-DATA = data
-TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_PROGRAMS+=gdbstub
-endif
-ifeq ($(FULL_TARGET),powerpc-wii)
-override CLEAN_UNITS+=*
-endif
-ifeq ($(FULL_TARGET),powerpc-wii)
-override CLEAN_FILES+=*.elf *.o *.s *.h *.bin *.map $(BUILD)/* $(INC)/*
+override TARGET_DIRS+=gdbstub
endif
override INSTALL_FPCPACKAGE=y
-ifeq ($(FULL_TARGET),powerpc-wii)
-override COMPILER_OPTIONS+=-g -Xm
-endif
ifdef REQUIRE_UNITSDIR
override UNITSDIR+=$(REQUIRE_UNITSDIR)
endif
@@ -1249,171 +1232,10 @@ EXECPPAS:=@$(PPAS)
endif
endif
endif
-.PHONY: fpc_exes
-ifndef CROSSINSTALL
-ifneq ($(TARGET_PROGRAMS),)
-override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
-override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))) $(addprefix $(IMPORTLIBPREFIX),$(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
-ifeq ($(OS_TARGET),emx)
-override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
-endif
-endif
-endif
-fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
ifdef TARGET_RSTS
override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
override CLEANRSTFILES+=$(RSTFILES)
endif
-.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
-$(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 .lpr .dpr .pp .rc .res
-$(COMPILER_UNITTARGETDIR):
- $(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
-$(COMPILER_TARGETDIR):
- $(MKDIRTREE) $(COMPILER_TARGETDIR)
-%$(PPUEXT): %.pp
- $(COMPILER) $<
- $(EXECPPAS)
-%$(PPUEXT): %.pas
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.pp
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.pas
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.lpr
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.dpr
- $(COMPILER) $<
- $(EXECPPAS)
-%.res: %.rc
- windres -i $< -o $@
-vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.inc $(COMPILER_INCLUDEDIR)
-vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
-vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
-.PHONY: fpc_shared
-override INSTALLTARGET+=fpc_shared_install
-ifndef SHARED_LIBVERSION
-SHARED_LIBVERSION=$(FPC_VERSION)
-endif
-ifndef SHARED_LIBNAME
-SHARED_LIBNAME=$(PACKAGE_NAME)
-endif
-ifndef SHARED_FULLNAME
-SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
-endif
-ifndef SHARED_LIBUNITS
-SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
-override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
-endif
-fpc_shared:
-ifdef HASSHAREDLIB
- $(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
-ifneq ($(SHARED_BUILD),n)
- $(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
-endif
-else
- @$(ECHO) Shared Libraries not supported
-endif
-fpc_shared_install:
-ifneq ($(SHARED_BUILD),n)
-ifneq ($(SHARED_LIBUNITS),)
-ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
- $(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
-endif
-endif
-endif
-.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))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
-ifneq ($(UNITTARGETDIRPREFIX),)
-override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
-override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
-endif
-override INSTALL_CREATEPACKAGEFPC=1
-endif
-ifdef INSTALLEXEFILES
-ifneq ($(TARGETDIRPREFIX),)
-override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
-endif
-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$(CPU_TARGET)-$(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))
@@ -1593,82 +1415,76 @@ 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
-ifndef BIN2S
-BIN2S:=$(strip $(wildcard $(addsuffix /bin2s$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(BIN2S),)
-BIN2S= __missing_command_BIN2S
-else
-BIN2S:=$(firstword $(BIN2S))
-endif
-endif
-export BIN2S
-ifndef RMDIR
-RMDIR:=$(strip $(wildcard $(addsuffix /rmdir$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(RMDIR),)
-RMDIR= __missing_command_RMDIR
-else
-RMDIR:=$(firstword $(RMDIR))
-endif
-endif
-export RMDIR
-ifndef GXTEXCONV
-GXTEXCONV:=$(strip $(wildcard $(addsuffix /gxtexconv$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(GXTEXCONV),)
-GXTEXCONV= __missing_command_GXTEXCONV
-else
-GXTEXCONV:=$(firstword $(GXTEXCONV))
-endif
-endif
-export GXTEXCONV
-debug: fpc_debug
-smart: fpc_smart
-release: fpc_release
-units: fpc_units
-examples:
-shared: fpc_shared
-install: fpc_install
-sourceinstall: fpc_sourceinstall
-exampleinstall: fpc_exampleinstall
-distinstall:
-zipinstall:
-zipsourceinstall:
-zipexampleinstall:
-zipdistinstall:
-distclean: fpc_distclean
-cleanall: fpc_cleanall
+ifeq ($(FULL_TARGET),powerpc-wii)
+TARGET_DIRS_GDBSTUB=1
+endif
+ifdef TARGET_DIRS_GDBSTUB
+gdbstub_all:
+ $(MAKE) -C gdbstub all
+gdbstub_debug:
+ $(MAKE) -C gdbstub debug
+gdbstub_smart:
+ $(MAKE) -C gdbstub smart
+gdbstub_release:
+ $(MAKE) -C gdbstub release
+gdbstub_units:
+ $(MAKE) -C gdbstub units
+gdbstub_examples:
+ $(MAKE) -C gdbstub examples
+gdbstub_shared:
+ $(MAKE) -C gdbstub shared
+gdbstub_install:
+ $(MAKE) -C gdbstub install
+gdbstub_sourceinstall:
+ $(MAKE) -C gdbstub sourceinstall
+gdbstub_exampleinstall:
+ $(MAKE) -C gdbstub exampleinstall
+gdbstub_distinstall:
+ $(MAKE) -C gdbstub distinstall
+gdbstub_zipinstall:
+ $(MAKE) -C gdbstub zipinstall
+gdbstub_zipsourceinstall:
+ $(MAKE) -C gdbstub zipsourceinstall
+gdbstub_zipexampleinstall:
+ $(MAKE) -C gdbstub zipexampleinstall
+gdbstub_zipdistinstall:
+ $(MAKE) -C gdbstub zipdistinstall
+gdbstub_clean:
+ $(MAKE) -C gdbstub clean
+gdbstub_distclean:
+ $(MAKE) -C gdbstub distclean
+gdbstub_cleanall:
+ $(MAKE) -C gdbstub cleanall
+gdbstub_info:
+ $(MAKE) -C gdbstub info
+gdbstub_makefiles:
+ $(MAKE) -C gdbstub makefiles
+gdbstub:
+ $(MAKE) -C gdbstub all
+.PHONY: gdbstub_all gdbstub_debug gdbstub_smart gdbstub_release gdbstub_units gdbstub_examples gdbstub_shared gdbstub_install gdbstub_sourceinstall gdbstub_exampleinstall gdbstub_distinstall gdbstub_zipinstall gdbstub_zipsourceinstall gdbstub_zipexampleinstall gdbstub_zipdistinstall gdbstub_clean gdbstub_distclean gdbstub_cleanall gdbstub_info gdbstub_makefiles gdbstub
+endif
+all: $(addsuffix _all,$(TARGET_DIRS))
+debug: $(addsuffix _debug,$(TARGET_DIRS))
+smart: $(addsuffix _smart,$(TARGET_DIRS))
+release: $(addsuffix _release,$(TARGET_DIRS))
+units: $(addsuffix _units,$(TARGET_DIRS))
+examples: $(addsuffix _examples,$(TARGET_DIRS))
+shared: $(addsuffix _shared,$(TARGET_DIRS))
+install: $(addsuffix _install,$(TARGET_DIRS))
+sourceinstall: $(addsuffix _sourceinstall,$(TARGET_DIRS))
+exampleinstall: $(addsuffix _exampleinstall,$(TARGET_DIRS))
+distinstall: $(addsuffix _distinstall,$(TARGET_DIRS))
+zipinstall: $(addsuffix _zipinstall,$(TARGET_DIRS))
+zipsourceinstall: $(addsuffix _zipsourceinstall,$(TARGET_DIRS))
+zipexampleinstall: $(addsuffix _zipexampleinstall,$(TARGET_DIRS))
+zipdistinstall: $(addsuffix _zipdistinstall,$(TARGET_DIRS))
+clean: $(addsuffix _clean,$(TARGET_DIRS))
+distclean: $(addsuffix _distclean,$(TARGET_DIRS))
+cleanall: $(addsuffix _cleanall,$(TARGET_DIRS))
info: fpc_info
-makefiles: fpc_makefiles
-.PHONY: debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall distclean cleanall info makefiles
+makefiles: fpc_makefiles $(addsuffix _makefiles,$(TARGET_DIRS))
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
-dir_delete:
- @$(DELTREE) $(CURDIR)/$(BUILD)
- @$(DELTREE) $(CURDIR)/$(INC)
-dir_make:
-ifneq ($(BUILD), $(CURDIR))
- @$(MKDIR) $(BUILD)
-endif
-ifneq ($(INC), $(CURDIR))
- @$(MKDIR) $(INC)
-endif
-ifneq ($(DATA), $(CURDIR))
- @$(MKDIR) $(DATA)
-endif
-$(TPL_FILES): $(wildcard %.scf)
- @echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
- @$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
diff --git a/packages/libogcfpc/examples/devices/usbgecko/Makefile.fpc b/packages/libogcfpc/examples/devices/usbgecko/Makefile.fpc
index e2fab919b0..cb03ed235d 100644
--- a/packages/libogcfpc/examples/devices/usbgecko/Makefile.fpc
+++ b/packages/libogcfpc/examples/devices/usbgecko/Makefile.fpc
@@ -12,7 +12,7 @@ packages=libogcfpc
fpcpackage=y
[default]
-fpcdir=../../../..
+fpcdir=../../../../..
[rules]
.NOTPARALLEL:
diff --git a/packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile b/packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile
index 5dc815f6a8..f4c0130786 100644
--- a/packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile
+++ b/packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile
@@ -283,7 +283,7 @@ override CLEAN_FILES+=*.elf *.o *.s *.h *.bin *.map $(BUILD)/* $(INC)/*
endif
override INSTALL_FPCPACKAGE=y
ifeq ($(FULL_TARGET),powerpc-wii)
-override COMPILER_OPTIONS+=-g -Xm
+override COMPILER_OPTIONS+=-g -Xm -k--gc-sections
endif
ifdef REQUIRE_UNITSDIR
override UNITSDIR+=$(REQUIRE_UNITSDIR)
diff --git a/packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile.fpc b/packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile.fpc
index 663e5ecc99..271ccac6fa 100644
--- a/packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile.fpc
+++ b/packages/libogcfpc/examples/devices/usbgecko/gdbstub/Makefile.fpc
@@ -20,7 +20,7 @@ target=wii
fpcdir=../../../../../..
[compiler]
-options=-g -Xm
+options=-g -Xm -k--gc-sections
[clean]
files=*.elf *.o *.s *.h *.bin *.map \
diff --git a/packages/libogcfpc/examples/devices/usbkeyboard/Makefile b/packages/libogcfpc/examples/devices/usbkeyboard/Makefile
index 03533187c9..f65f03b190 100644
--- a/packages/libogcfpc/examples/devices/usbkeyboard/Makefile
+++ b/packages/libogcfpc/examples/devices/usbkeyboard/Makefile
@@ -100,8 +100,6 @@ endif
endif
export ECHO
endif
-override OS_TARGET_DEFAULT=wii
-override CPU_TARGET_DEFAULT=powerpc
override DEFAULT_FPCDIR=../../../../..
ifndef FPC
ifdef PP
@@ -266,25 +264,10 @@ ifeq ($(UNITSDIR),)
UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
endif
PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
-BUILD = build
-INC = inc
-DATA = data
-TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_PROGRAMS+=basic_stdin
-endif
-ifeq ($(FULL_TARGET),powerpc-wii)
-override CLEAN_UNITS+=*
-endif
-ifeq ($(FULL_TARGET),powerpc-wii)
-override CLEAN_FILES+=*.elf *.o *.s *.h *.bin *.map $(BUILD)/* $(INC)/*
+override TARGET_DIRS+=basic_stdin
endif
override INSTALL_FPCPACKAGE=y
-ifeq ($(FULL_TARGET),powerpc-wii)
-override COMPILER_OPTIONS+=-g -Xm
-endif
ifdef REQUIRE_UNITSDIR
override UNITSDIR+=$(REQUIRE_UNITSDIR)
endif
@@ -1249,171 +1232,10 @@ EXECPPAS:=@$(PPAS)
endif
endif
endif
-.PHONY: fpc_exes
-ifndef CROSSINSTALL
-ifneq ($(TARGET_PROGRAMS),)
-override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
-override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))) $(addprefix $(IMPORTLIBPREFIX),$(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
-ifeq ($(OS_TARGET),emx)
-override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
-endif
-endif
-endif
-fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
ifdef TARGET_RSTS
override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
override CLEANRSTFILES+=$(RSTFILES)
endif
-.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
-$(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 .lpr .dpr .pp .rc .res
-$(COMPILER_UNITTARGETDIR):
- $(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
-$(COMPILER_TARGETDIR):
- $(MKDIRTREE) $(COMPILER_TARGETDIR)
-%$(PPUEXT): %.pp
- $(COMPILER) $<
- $(EXECPPAS)
-%$(PPUEXT): %.pas
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.pp
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.pas
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.lpr
- $(COMPILER) $<
- $(EXECPPAS)
-%$(EXEEXT): %.dpr
- $(COMPILER) $<
- $(EXECPPAS)
-%.res: %.rc
- windres -i $< -o $@
-vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
-vpath %.inc $(COMPILER_INCLUDEDIR)
-vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
-vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
-.PHONY: fpc_shared
-override INSTALLTARGET+=fpc_shared_install
-ifndef SHARED_LIBVERSION
-SHARED_LIBVERSION=$(FPC_VERSION)
-endif
-ifndef SHARED_LIBNAME
-SHARED_LIBNAME=$(PACKAGE_NAME)
-endif
-ifndef SHARED_FULLNAME
-SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
-endif
-ifndef SHARED_LIBUNITS
-SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
-override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
-endif
-fpc_shared:
-ifdef HASSHAREDLIB
- $(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
-ifneq ($(SHARED_BUILD),n)
- $(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
-endif
-else
- @$(ECHO) Shared Libraries not supported
-endif
-fpc_shared_install:
-ifneq ($(SHARED_BUILD),n)
-ifneq ($(SHARED_LIBUNITS),)
-ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
- $(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
-endif
-endif
-endif
-.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))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
-ifneq ($(UNITTARGETDIRPREFIX),)
-override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
-override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
-endif
-override INSTALL_CREATEPACKAGEFPC=1
-endif
-ifdef INSTALLEXEFILES
-ifneq ($(TARGETDIRPREFIX),)
-override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
-endif
-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$(CPU_TARGET)-$(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))
@@ -1593,82 +1415,76 @@ 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
-ifndef BIN2S
-BIN2S:=$(strip $(wildcard $(addsuffix /bin2s$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(BIN2S),)
-BIN2S= __missing_command_BIN2S
-else
-BIN2S:=$(firstword $(BIN2S))
-endif
-endif
-export BIN2S
-ifndef RMDIR
-RMDIR:=$(strip $(wildcard $(addsuffix /rmdir$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(RMDIR),)
-RMDIR= __missing_command_RMDIR
-else
-RMDIR:=$(firstword $(RMDIR))
-endif
-endif
-export RMDIR
-ifndef GXTEXCONV
-GXTEXCONV:=$(strip $(wildcard $(addsuffix /gxtexconv$(SRCEXEEXT),$(SEARCHPATH))))
-ifeq ($(GXTEXCONV),)
-GXTEXCONV= __missing_command_GXTEXCONV
-else
-GXTEXCONV:=$(firstword $(GXTEXCONV))
-endif
-endif
-export GXTEXCONV
-debug: fpc_debug
-smart: fpc_smart
-release: fpc_release
-units: fpc_units
-examples:
-shared: fpc_shared
-install: fpc_install
-sourceinstall: fpc_sourceinstall
-exampleinstall: fpc_exampleinstall
-distinstall:
-zipinstall:
-zipsourceinstall:
-zipexampleinstall:
-zipdistinstall:
-distclean: fpc_distclean
-cleanall: fpc_cleanall
+ifeq ($(FULL_TARGET),powerpc-wii)
+TARGET_DIRS_BASIC_STDIN=1
+endif
+ifdef TARGET_DIRS_BASIC_STDIN
+basic_stdin_all:
+ $(MAKE) -C basic_stdin all
+basic_stdin_debug:
+ $(MAKE) -C basic_stdin debug
+basic_stdin_smart:
+ $(MAKE) -C basic_stdin smart
+basic_stdin_release:
+ $(MAKE) -C basic_stdin release
+basic_stdin_units:
+ $(MAKE) -C basic_stdin units
+basic_stdin_examples:
+ $(MAKE) -C basic_stdin examples
+basic_stdin_shared:
+ $(MAKE) -C basic_stdin shared
+basic_stdin_install:
+ $(MAKE) -C basic_stdin install
+basic_stdin_sourceinstall:
+ $(MAKE) -C basic_stdin sourceinstall
+basic_stdin_exampleinstall:
+ $(MAKE) -C basic_stdin exampleinstall
+basic_stdin_distinstall:
+ $(MAKE) -C basic_stdin distinstall
+basic_stdin_zipinstall:
+ $(MAKE) -C basic_stdin zipinstall
+basic_stdin_zipsourceinstall:
+ $(MAKE) -C basic_stdin zipsourceinstall
+basic_stdin_zipexampleinstall:
+ $(MAKE) -C basic_stdin zipexampleinstall
+basic_stdin_zipdistinstall:
+ $(MAKE) -C basic_stdin zipdistinstall
+basic_stdin_clean:
+ $(MAKE) -C basic_stdin clean
+basic_stdin_distclean:
+ $(MAKE) -C basic_stdin distclean
+basic_stdin_cleanall:
+ $(MAKE) -C basic_stdin cleanall
+basic_stdin_info:
+ $(MAKE) -C basic_stdin info
+basic_stdin_makefiles:
+ $(MAKE) -C basic_stdin makefiles
+basic_stdin:
+ $(MAKE) -C basic_stdin all
+.PHONY: basic_stdin_all basic_stdin_debug basic_stdin_smart basic_stdin_release basic_stdin_units basic_stdin_examples basic_stdin_shared basic_stdin_install basic_stdin_sourceinstall basic_stdin_exampleinstall basic_stdin_distinstall basic_stdin_zipinstall basic_stdin_zipsourceinstall basic_stdin_zipexampleinstall basic_stdin_zipdistinstall basic_stdin_clean basic_stdin_distclean basic_stdin_cleanall basic_stdin_info basic_stdin_makefiles basic_stdin
+endif
+all: $(addsuffix _all,$(TARGET_DIRS))
+debug: $(addsuffix _debug,$(TARGET_DIRS))
+smart: $(addsuffix _smart,$(TARGET_DIRS))
+release: $(addsuffix _release,$(TARGET_DIRS))
+units: $(addsuffix _units,$(TARGET_DIRS))
+examples: $(addsuffix _examples,$(TARGET_DIRS))
+shared: $(addsuffix _shared,$(TARGET_DIRS))
+install: $(addsuffix _install,$(TARGET_DIRS))
+sourceinstall: $(addsuffix _sourceinstall,$(TARGET_DIRS))
+exampleinstall: $(addsuffix _exampleinstall,$(TARGET_DIRS))
+distinstall: $(addsuffix _distinstall,$(TARGET_DIRS))
+zipinstall: $(addsuffix _zipinstall,$(TARGET_DIRS))
+zipsourceinstall: $(addsuffix _zipsourceinstall,$(TARGET_DIRS))
+zipexampleinstall: $(addsuffix _zipexampleinstall,$(TARGET_DIRS))
+zipdistinstall: $(addsuffix _zipdistinstall,$(TARGET_DIRS))
+clean: $(addsuffix _clean,$(TARGET_DIRS))
+distclean: $(addsuffix _distclean,$(TARGET_DIRS))
+cleanall: $(addsuffix _cleanall,$(TARGET_DIRS))
info: fpc_info
-makefiles: fpc_makefiles
-.PHONY: debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall distclean cleanall info makefiles
+makefiles: fpc_makefiles $(addsuffix _makefiles,$(TARGET_DIRS))
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
-dir_delete:
- @$(DELTREE) $(CURDIR)/$(BUILD)
- @$(DELTREE) $(CURDIR)/$(INC)
-dir_make:
-ifneq ($(BUILD), $(CURDIR))
- @$(MKDIR) $(BUILD)
-endif
-ifneq ($(INC), $(CURDIR))
- @$(MKDIR) $(INC)
-endif
-ifneq ($(DATA), $(CURDIR))
- @$(MKDIR) $(DATA)
-endif
-$(TPL_FILES): $(wildcard %.scf)
- @echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
- @$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
diff --git a/packages/libogcfpc/examples/devices/usbkeyboard/Makefile.fpc b/packages/libogcfpc/examples/devices/usbkeyboard/Makefile.fpc
index 0790db9766..257dd468e4 100644
--- a/packages/libogcfpc/examples/devices/usbkeyboard/Makefile.fpc
+++ b/packages/libogcfpc/examples/devices/usbkeyboard/Makefile.fpc
@@ -12,7 +12,7 @@ packages=libogcfpc
fpcpackage=y
[default]
-fpcdir=../../../..
+fpcdir=../../../../..
[rules]
.NOTPARALLEL:
diff --git a/packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile b/packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile
index 4dbac1a020..fe85b79baf 100644
--- a/packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile
+++ b/packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile
@@ -270,8 +270,8 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
ifeq ($(FULL_TARGET),powerpc-wii)
override TARGET_PROGRAMS+=gxsprites
endif
@@ -1643,10 +1643,12 @@ ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
dir_make:
ifneq ($(BUILD), $(CURDIR))
@@ -1658,17 +1660,16 @@ endif
ifneq ($(DATA), $(CURDIR))
@$(MKDIR) $(DATA)
endif
-$(TPL_FILES): $(wildcard %.scf)
+$(TPL_FILES):
@echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
@$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef
diff --git a/packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile.fpc b/packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile.fpc
index 49e1be6c9c..011ae4086f 100644
--- a/packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile.fpc
+++ b/packages/libogcfpc/examples/graphics/gx/gxSprites/Makefile.fpc
@@ -3,7 +3,7 @@
#
[target]
-loaders=
+loaders=
programs=gxsprites
[require]
@@ -33,19 +33,21 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
[rules]
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
#
# Delete temp directories
#
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
#
@@ -65,22 +67,21 @@ endif
#
# Textures processing rule
#
-$(TPL_FILES): $(wildcard %.scf)
+$(TPL_FILES):
@echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+
-
#
# Binary files processing rule
#
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
@$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef \ No newline at end of file
diff --git a/packages/libogcfpc/examples/graphics/gx/gxSprites/gxsprites.pp b/packages/libogcfpc/examples/graphics/gx/gxSprites/gxsprites.pp
index 64c35c9095..013a3ae6d0 100644
--- a/packages/libogcfpc/examples/graphics/gx/gxSprites/gxsprites.pp
+++ b/packages/libogcfpc/examples/graphics/gx/gxSprites/gxsprites.pp
@@ -5,7 +5,7 @@ program gxsprites;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
{$include inc/textures.tpl.inc}
{$link build/textures.tpl.o}
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson1/lesson1.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson1/lesson1.pp
index f18cb4df9b..1169a3b22d 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson1/lesson1.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson1/lesson1.pp
@@ -4,7 +4,7 @@ program lesson1;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
const
DEFAULT_FIFO_SIZE = (256*1024);
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson2/lesson2.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson2/lesson2.pp
index fcc7bd712e..b171f550ff 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson2/lesson2.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson2/lesson2.pp
@@ -4,7 +4,7 @@ program lesson2;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
const
DEFAULT_FIFO_SIZE = (256*1024);
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson3/lesson3.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson3/lesson3.pp
index ece9cfa5c1..a369133316 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson3/lesson3.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson3/lesson3.pp
@@ -4,7 +4,7 @@ program lesson3;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
const
DEFAULT_FIFO_SIZE = (256*1024);
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson4/lesson4.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson4/lesson4.pp
index f3094bdc84..b66a00f197 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson4/lesson4.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson4/lesson4.pp
@@ -5,7 +5,7 @@ program lesson4;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
const
DEFAULT_FIFO_SIZE = (256 * 1024);
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson5/lesson5.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson5/lesson5.pp
index 5c1264becd..0affebedce 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson5/lesson5.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson5/lesson5.pp
@@ -5,7 +5,7 @@ program lesson5;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
const
DEFAULT_FIFO_SIZE = (256 * 1024);
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile
index 2109732b40..a76476280b 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile
@@ -270,8 +270,8 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
ifeq ($(FULL_TARGET),powerpc-wii)
override TARGET_PROGRAMS+=lesson6
endif
@@ -1643,10 +1643,12 @@ ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
dir_make:
ifneq ($(BUILD), $(CURDIR))
@@ -1658,17 +1660,16 @@ endif
ifneq ($(DATA), $(CURDIR))
@$(MKDIR) $(DATA)
endif
-$(TPL_FILES): $(wildcard %.scf)
+$(TPL_FILES):
@echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
@$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile.fpc b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile.fpc
index 69cd9ed05c..8ccdc2fdee 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile.fpc
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/Makefile.fpc
@@ -33,19 +33,21 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
[rules]
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
#
# Delete temp directories
#
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
#
@@ -65,22 +67,21 @@ endif
#
# Textures processing rule
#
-$(TPL_FILES): $(wildcard %.scf)
+$(TPL_FILES):
@echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+
-
#
# Binary files processing rule
#
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
@$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef \ No newline at end of file
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/lesson6.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/lesson6.pp
index d173dd6523..6bbb38c43d 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/lesson6.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson6/lesson6.pp
@@ -5,7 +5,7 @@ program lesson6;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
{$include inc/NeHe.tpl.inc}
{$link build/NeHe.tpl.o}
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile
index 4a96e70452..97a1d91878 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile
@@ -270,8 +270,8 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
ifeq ($(FULL_TARGET),powerpc-wii)
override TARGET_PROGRAMS+=lesson7
endif
@@ -1643,10 +1643,12 @@ ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
dir_make:
ifneq ($(BUILD), $(CURDIR))
@@ -1658,17 +1660,16 @@ endif
ifneq ($(DATA), $(CURDIR))
@$(MKDIR) $(DATA)
endif
-$(TPL_FILES): $(wildcard %.scf)
+$(TPL_FILES):
@echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
@$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile.fpc b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile.fpc
index bd84d8ff82..020677d8dc 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile.fpc
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/Makefile.fpc
@@ -33,19 +33,21 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
[rules]
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
#
# Delete temp directories
#
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
#
@@ -65,22 +67,21 @@ endif
#
# Textures processing rule
#
-$(TPL_FILES): $(wildcard %.scf)
+$(TPL_FILES):
@echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+
-
#
# Binary files processing rule
#
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
@$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef \ No newline at end of file
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/lesson7.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/lesson7.pp
index 91a467637b..c242d98a39 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/lesson7.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson7/lesson7.pp
@@ -5,7 +5,7 @@ program lesson7;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
{$include inc/crate.tpl.inc}
{$link build/crate.tpl.o}
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile
index 29e5c3138d..db45651d12 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile
@@ -270,8 +270,8 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
ifeq ($(FULL_TARGET),powerpc-wii)
override TARGET_PROGRAMS+=lesson8
endif
@@ -1643,10 +1643,12 @@ ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
dir_make:
ifneq ($(BUILD), $(CURDIR))
@@ -1658,17 +1660,16 @@ endif
ifneq ($(DATA), $(CURDIR))
@$(MKDIR) $(DATA)
endif
-$(TPL_FILES): $(wildcard %.scf)
+$(TPL_FILES):
@echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
@$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile.fpc b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile.fpc
index db4dd3d865..d79da2de96 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile.fpc
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/Makefile.fpc
@@ -33,19 +33,21 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
[rules]
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
#
# Delete temp directories
#
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
#
@@ -65,22 +67,21 @@ endif
#
# Textures processing rule
#
-$(TPL_FILES): $(wildcard %.scf)
+$(TPL_FILES):
@echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+
-
#
# Binary files processing rule
#
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
@$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef \ No newline at end of file
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/lesson8.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/lesson8.pp
index b593823b2e..54092eb946 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/lesson8.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson8/lesson8.pp
@@ -5,7 +5,7 @@ program lesson8;
{$mode objfpc}
uses
- cmem, ctypes, gccore, math;
+ cmem, ctypes, gctypes, gccore, math;
{$include inc/glass.tpl.inc}
{$link build/glass.tpl.o}
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile
index a0a16c774c..3b3dcdb190 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile
@@ -270,8 +270,8 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
ifeq ($(FULL_TARGET),powerpc-wii)
override TARGET_PROGRAMS+=lesson9
endif
@@ -1643,10 +1643,12 @@ ifneq ($(wildcard fpcmake.loc),)
include fpcmake.loc
endif
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
dir_make:
ifneq ($(BUILD), $(CURDIR))
@@ -1658,17 +1660,16 @@ endif
ifneq ($(DATA), $(CURDIR))
@$(MKDIR) $(DATA)
endif
-$(TPL_FILES): $(wildcard %.scf)
- @echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
- @$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+$(TPL_FILES):
+ @echo 'Creating tpl file...'
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
+ @$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile.fpc b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile.fpc
index 01a9f2992b..99d0c55c90 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile.fpc
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/Makefile.fpc
@@ -33,19 +33,21 @@ BUILD = build
INC = inc
DATA = data
TEXTURES = textures
-TPL_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
-BIN_FILES = $(foreach dir,data,$(notdir $(wildcard $(dir)/*)))
+SCF_FILES = $(foreach dir,textures,$(notdir $(wildcard $(dir)/*.scf)))
+TPL_FILES = $(basename $(SCF_FILES)).tpl
[rules]
.NOTPARALLEL:
-clean: dir_delete fpc_clean fpc_cleanall
-all: dir_make $(TPL_FILES) $(BIN_FILES) fpc_all
+.PHONY: clean all
+clean: dir_delete fpc_clean fpc_cleanall
+all: dir_make $(TPL_FILES) fpc_all
#
# Delete temp directories
#
dir_delete:
@$(DELTREE) $(CURDIR)/$(BUILD)
+ @$(DELTREE) $(CURDIR)/$(DATA)
@$(DELTREE) $(CURDIR)/$(INC)
#
@@ -65,22 +67,21 @@ endif
#
# Textures processing rule
#
-$(TPL_FILES): $(wildcard %.scf)
- @echo 'Creating tpl file...'
- $(GXTEXCONV) -s textures/$(@) -o $(DATA)/$(basename $(@)).tpl
+$(TPL_FILES):
+ @echo 'Creating tpl file...'
+ $(GXTEXCONV) -s textures/$(SCF_FILES) -o $(DATA)/$(TPL_FILES)
+ @echo $(DATA)/$(TPL_FILES)
+ @$(bin2o)
+
-
#
# Binary files processing rule
#
-$(BIN_FILES): $(wildcard %.*)
- @echo 'Converting $(@) file to asm...'
- @$(BIN2S) -a 32 data/$(@) > $(BUILD)/$(@).s
- @echo 'Creating $(@).inc include file...'
- @echo "var" > `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo "inc/"$(@F) | tr . .)`.inc
- @echo 'Assembling $(@).s file...'
- @$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
- @echo 'Done!'
+define bin2o
+ @$(BIN2S) -a 32 $(DATA)/$(@) > $(BUILD)/$(@).s
+ @$(AS) -o $(BUILD)/$(@).o $(BUILD)/$(@).s
+ @echo "var" > `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end: array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`": array [0..0] of cuint8; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+ @echo " " `(echo $(@F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size": cuint32; cvar; external;" >> `(echo $(INC)"/"$(@F) | tr . .)`.inc
+endef \ No newline at end of file
diff --git a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/lesson9.pp b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/lesson9.pp
index 4f2dd62ab6..eb81a15e14 100644
--- a/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/lesson9.pp
+++ b/packages/libogcfpc/examples/graphics/gx/neheGX/lesson9/lesson9.pp
@@ -5,7 +5,7 @@ program lesson9;
{$mode objfpc}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
{$include inc/startex.tpl.inc}
{$link build/startex.tpl.o}
diff --git a/packages/libogcfpc/examples/graphics/gx/triangle/triangle.pp b/packages/libogcfpc/examples/graphics/gx/triangle/triangle.pp
index e833a1874e..8c7b004930 100644
--- a/packages/libogcfpc/examples/graphics/gx/triangle/triangle.pp
+++ b/packages/libogcfpc/examples/graphics/gx/triangle/triangle.pp
@@ -6,7 +6,7 @@ program triangle;
{$inline on}
uses
- cmem, ctypes, gccore;
+ cmem, ctypes, gctypes, gccore;
var
framebuffer: pcuint32;
diff --git a/packages/libogcfpc/fpmake.pp b/packages/libogcfpc/fpmake.pp
index ab3e55980c..d147c23d06 100644
--- a/packages/libogcfpc/fpmake.pp
+++ b/packages/libogcfpc/fpmake.pp
@@ -18,7 +18,7 @@ begin
{$endif ALLPACKAGES}
P.Version:='2.5.1';
P.SourcePath.Add('src');
-// P.Dependencies.Add('x11');
+ P.Dependencies.Add('mad');
// not linux compilable, skip
diff --git a/packages/libogcfpc/src/gccore.inc b/packages/libogcfpc/src/gccore.inc
index 551de3e633..82160a0776 100644
--- a/packages/libogcfpc/src/gccore.inc
+++ b/packages/libogcfpc/src/gccore.inc
@@ -25,23 +25,23 @@
{$include ogc/gx_struct.inc}
{$include ogc/lwp.inc}
-{$include ogc/lwp_config.inc}
-{$include ogc/lwp_heap.inc}
-
-{$include ogc/lwp_tqdata.inc}
-{$include ogc/lwp_objmgr.inc}
-{$include ogc/lwp_priority.inc}
-{$include ogc/lwp_watchdog.inc}
-{$include ogc/lwp_threads.inc}
-
-
-{$include ogc/lwp_messages.inc}
-{$include ogc/lwp_mutex.inc}
-{$include ogc/lwp_sema.inc}
-{$include ogc/lwp_stack.inc}
-{$include ogc/lwp_states.inc}
-{$include ogc/lwp_threadq.inc}
-{$include ogc/lwp_wkspace.inc}
+ {$include ogc/lwp_config.inc}
+ {$include ogc/lwp_heap.inc}
+
+ {$include ogc/lwp_tqdata.inc}
+ {$include ogc/lwp_objmgr.inc}
+ {$include ogc/lwp_priority.inc}
+ {$include ogc/lwp_watchdog.inc}
+ {$include ogc/lwp_threads.inc} // tradurre lwp_threads.inl
+
+
+ {$include ogc/lwp_messages.inc}
+ {$include ogc/lwp_mutex.inc}
+ {$include ogc/lwp_sema.inc}
+ {$include ogc/lwp_stack.inc}
+ {$include ogc/lwp_states.inc}
+ {$include ogc/lwp_threadq.inc}
+ {$include ogc/lwp_wkspace.inc}
{$include ogc/gu.inc}
diff --git a/packages/libogcfpc/src/ogc/lwp_heap.inc b/packages/libogcfpc/src/ogc/lwp_heap.inc
index 6b5c405c04..3fb2468771 100644
--- a/packages/libogcfpc/src/ogc/lwp_heap.inc
+++ b/packages/libogcfpc/src/ogc/lwp_heap.inc
@@ -44,16 +44,10 @@ type
pheap_cntrl = ^heap_cntrl;
-function __lwp_heap_init(theheap: Pheap_cntrl; start_addr: pointer;
- size, pg_size: cuint32): cuint32; cdecl; external;
-
+function __lwp_heap_init(theheap: Pheap_cntrl; start_addr: pointer; size, pg_size: cuint32): cuint32; cdecl; external;
function __lwp_heap_allocate(theheap: Pheap_cntrl; size: cuint32): pointer; cdecl; external;
-
function __lwp_heap_free(theheap: Pheap_cntrl; ptr: pointer): cbool; cdecl; external;
-
-function __lwp_heap_getinfo(theheap: Pheap_cntrl; theinfo: Pheap_iblock)
- : cuint32; cdecl; external;
-
+function __lwp_heap_getinfo(theheap: Pheap_cntrl; theinfo: Pheap_iblock): cuint32; cdecl; external;
//{$ifdef LIBOGC_INTERNAL}
//{$include libogc/lwp_heap.inl}
@@ -61,3 +55,78 @@ function __lwp_heap_getinfo(theheap: Pheap_cntrl; theinfo: Pheap_iblock)
{$ENDIF}
+{$IFDEF OGC_IMPLEMENTATION}
+function __lwp_heap_head(theheap: pheap_cntrl): pheap_block;
+begin
+ result := theheap^.start;
+end;
+
+function __lwp_heap_tail(heap: pheap_cntrl): pheap_block;
+begin
+ result := heap^.final;
+end;
+
+function __lwp_heap_prevblock(block: pheap_block): pheap_block;
+begin
+ result := pheap_block (pcchar(block)^ - (block^.back_flag and not HEAP_BLOCK_USED));
+end;
+
+function __lwp_heap_nextblock(block: pheap_block): pheap_block;
+begin
+ result := pheap_block(pcchar(block)^ + (block^.front_flag and not HEAP_BLOCK_USED));
+end;
+
+function __lwp_heap_blockat(block: pheap_block; offset: cuint32): pheap_block;
+begin
+ result := pheap_block(pcchar(block) + offset);
+end;
+
+function __lwp_heap_usrblockat(ptr: pointer): pheap_block;
+var
+ offset: cuint32;
+begin
+ offset := (pcuint32(ptr)^ - 1);
+ result := __lwp_heap_blockat(ptr, -offset + (-HEAP_BLOCK_USED_OVERHEAD));
+end;
+
+function __lwp_heap_prev_blockfree(block: pheap_block): boolean;
+begin
+ result := (block^.back_flag and HEAP_BLOCK_USED) = 0;
+end;
+
+function __lwp_heap_blockfree(block: pheap_block): boolean;
+begin
+ result := (block^.front_flag and HEAP_BLOCK_USED) = 0;
+end;
+
+function __lwp_heap_blockused(block: pheap_block): boolean;
+begin
+ result := (block^.front_flag and HEAP_BLOCK_USED) <> 0;
+end;
+
+function __lwp_heap_blocksize(block: pheap_block): cuint32;
+begin
+ result := (block^.front_flag and not HEAP_BLOCK_USED);
+end;
+
+function __lwp_heap_startuser(block: pheap_block): pointer;
+begin
+ result := pointer(block^.next);
+end;
+
+function __lwp_heap_blockin(heap: pheap_cntrl; block: pheap_block): boolean;
+begin
+ result := ((cuint32(block) >= cuint32(heap^.start)) and (cuint32(block) <= cuint32(heap^.final)));
+end;
+
+function __lwp_heap_pgsize_valid(pgsize: cuint32): boolean;
+begin
+ result := (pgsize <> 0) and ((pgsize mod PPC_ALIGNMENT) = 0);
+end;
+
+function __lwp_heap_buildflag(size, flag: cuint32): cuint32;
+begin
+ result := (size or flag);
+end;
+{$ENDIF}
+
diff --git a/packages/libogcfpc/src/ogc/lwp_mutex.inc b/packages/libogcfpc/src/ogc/lwp_mutex.inc
index be01108f58..00277c38e3 100644
--- a/packages/libogcfpc/src/ogc/lwp_mutex.inc
+++ b/packages/libogcfpc/src/ogc/lwp_mutex.inc
@@ -49,8 +49,7 @@ procedure __lwp_mutex_seize_irq_blocking(mutex: Plwp_mutex; timeout: cuint64); c
procedure __lwp_mutex_flush(mutex: Plwp_mutex; status: cuint32); cdecl; external;
-
-function __lwp_mutex_seize_irq_trylock(mutex: plwp_mutex; isr_level: pcuint32): cuint32; cdecl; external;
+function __lwp_mutex_seize_irq_trylock(mutex: plwp_mutex; isr_level: pcuint32): cuint32; inline;
procedure __lwp_mutex_seize(_mutex_t: plwp_mutex; _id: cuint32; _wait: cuint8; _timeout, _level: cuint32); inline;
@@ -58,6 +57,32 @@ procedure __lwp_mutex_seize(_mutex_t: plwp_mutex; _id: cuint32; _wait: cuint8; _
{$IFDEF OGC_IMPLEMENTATION}
+
+function __lwp_mutex_locked(mutex: plwp_mutex): boolean;
+begin
+ result := (mutex^.lock = LWP_MUTEX_LOCKED);
+end;
+
+function __lwp_mutex_isinheritprio(attrs: plwp_mutex_attr): boolean;
+begin
+ result := (attrs^.mode = LWP_MUTEX_INHERITPRIO);
+end;
+
+function __lwp_mutex_isprioceiling(attrs: plwp_mutex_attr): boolean;
+begin
+ result := (attrs^.mode = LWP_MUTEX_PRIORITYCEIL);
+end;
+
+function __lwp_mutex_ispriority(attrs: plwp_mutex_attr): boolean;
+begin
+ result := (attrs^.mode = LWP_MUTEX_PRIORITY);
+end;
+
+function __lwp_mutex_isfifo(attrs: plwp_mutex_attr): boolean;
+begin
+ result := (attrs^.mode = LWP_MUTEX_FIFO);
+end;
+
procedure __lwp_mutex_seize(_mutex_t: plwp_mutex; _id: cuint32; _wait: cuint8; _timeout, _level: cuint32); inline;
begin
repeat
@@ -79,6 +104,76 @@ begin
end;
until false;
end;
+
+function __lwp_mutex_seize_irq_trylock(mutex: plwp_mutex; isr_level: pcuint32): cuint32; inline;
+var
+ exec: plwp_cntrl;
+ level: cuint32;
+ prioceiling, priocurr: cuint32;
+begin
+ level := isr_level^;
+ exec := _thr_executing;
+ exec^.wait.ret_code := LWP_MUTEX_SUCCESSFUL;
+ if not __lwp_mutex_locked(mutex) then
+ begin
+ mutex^.lock := LWP_MUTEX_LOCKED;
+ mutex^.holder := exec;
+ mutex^.nest_cnt := 1;
+ if __lwp_mutex_isinheritprio(@(mutex^.atrrs)) or __lwp_mutex_isprioceiling(@(mutex^.atrrs)) then
+ inc(exec^.res_cnt);
+ if not __lwp_mutex_isprioceiling(@(mutex^.atrrs)) then
+ begin
+ _CPU_ISR_Restore(level);
+ result := 0;
+ end;
+ begin
+ prioceiling := mutex^.atrrs.prioceil;
+ priocurr := exec^.cur_prio;
+ if (priocurr = prioceiling) then
+ begin
+ _CPU_ISR_Restore(level);
+ result := 0;
+ end;
+ if (priocurr > prioceiling) then
+ begin
+ __lwp_thread_dispatchdisable();
+ _CPU_ISR_Restore(level);
+ __lwp_thread_changepriority(mutex^.holder, mutex^.atrrs.prioceil, 0);
+ __lwp_thread_dispatchenable();
+ result := 0;
+ end;
+ exec^.wait.ret_code := LWP_MUTEX_CEILINGVIOL;
+ mutex^.nest_cnt := 0;
+ dec(exec^.res_cnt);
+ _CPU_ISR_Restore(level);
+ result := 0;
+ end;
+ result := 0;
+ end;
+
+ if (__lwp_thread_isexec(mutex^.holder)) <> 0 then
+ begin
+ case mutex^.atrrs.nest_behavior of
+ LWP_MUTEX_NEST_ACQUIRE:
+ begin
+ inc(mutex^.nest_cnt);
+ _CPU_ISR_Restore(level);
+ result := 0;
+ end;
+ LWP_MUTEX_NEST_ERROR:
+ begin
+ exec^.wait.ret_code := LWP_MUTEX_NEST_NOTALLOWED;
+ _CPU_ISR_Restore(level);
+ result := 0;
+ end;
+ LWP_MUTEX_NEST_BLOCK:
+ begin
+ end;
+ end;
+ end;
+ result := 1;
+end;
+
//{$ifdef LIBOGC_INTERNAL}
//{$include libogc/lwp_mutex.inl}
//{$endif}
diff --git a/packages/libogcfpc/src/ogc/lwp_priority.inc b/packages/libogcfpc/src/ogc/lwp_priority.inc
index ef8fcab64f..ed6b776698 100644
--- a/packages/libogcfpc/src/ogc/lwp_priority.inc
+++ b/packages/libogcfpc/src/ogc/lwp_priority.inc
@@ -29,3 +29,52 @@ procedure __lwp_priority_init; cdecl; external;
//{$endif}
{$ENDIF}
+
+{$IFDEF OGC_IMPLEMENTATION}
+procedure __lwp_priomap_init(theprio: pprio_cntrl; prio: cuint32);
+var
+ major,minor,mask: cuint32;
+begin
+ major := prio div 16;
+ minor := prio mod 16;
+
+ theprio^.minor := @(_prio_bitmap[major]);
+
+ mask := $80000000 shr major;
+ theprio^.ready_major := mask;
+ theprio^.block_major := not mask;
+
+ mask := $80000000 shr minor;
+ theprio^.ready_minor := mask;
+ theprio^.block_minor := not mask;
+//#ifdef _LWPPRIO_DEBUG
+// printf("__lwp_priomap_init(%p,%d,%p,%d,%d,%d,%d)\n",theprio,prio,theprio->minor,theprio->ready_major,theprio->ready_minor,theprio->block_major,theprio->block_minor);
+//#endif
+end;
+
+procedure __lwp_priomap_addto(theprio: pprio_cntrl);
+begin
+ theprio^.minor^ := theprio^.minor^ or theprio^.ready_minor;
+ _prio_major_bitmap := _prio_major_bitmap or theprio^.ready_major;
+end;
+
+procedure __lwp_priomap_removefrom(theprio: pprio_cntrl);
+begin
+ theprio^.minor^ := theprio^.minor^ and theprio^.block_minor;
+ if theprio^.minor^ = 0 then
+ _prio_major_bitmap := _prio_major_bitmap and theprio^.block_major;
+end;
+
+function __lwp_priomap_highest(): cuint32;
+var
+ major, minor: cuint32;
+begin
+ major := cntlzw(_prio_major_bitmap);
+ minor := cntlzw(_prio_bitmap[major]);
+//#ifdef _LWPPRIO_DEBUG
+// printf("__lwp_priomap_highest(%d)\n",((major<<4)+minor));
+//#endif
+ result := ((major shl 4) + minor);
+end;
+{$ENDIF}
+
diff --git a/packages/libogcfpc/src/ogc/lwp_threads.inc b/packages/libogcfpc/src/ogc/lwp_threads.inc
index bbdb739b2b..485d7464a5 100644
--- a/packages/libogcfpc/src/ogc/lwp_threads.inc
+++ b/packages/libogcfpc/src/ogc/lwp_threads.inc
@@ -133,9 +133,102 @@ procedure __lwp_thread_dispatchdisable(); inline;
{$ENDIF}
{$IFDEF OGC_IMPLEMENTATION}
-procedure __lwp_thread_dispatchdisable(); inline;
+function __lwp_thread_isexec(thethread: plwp_cntrl): cuint32;
+begin
+ result := 0;
+ if (thethread = _thr_executing) then result := 1;
+end;
+
+function __lwp_thread_isheir(thethread: plwp_cntrl): cuint32;
+begin
+ result := 0;
+ if (thethread = _thr_heir) then result := 1;
+end;
+
+procedure __lwp_thread_calcheir();
+begin
+ _thr_heir := plwp_cntrl(_lwp_thr_ready[__lwp_priomap_highest()].first);
+//#ifdef _LWPTHREADS_DEBUG
+// printf("__lwp_thread_calcheir(%p)\n",_thr_heir);
+//#endif
+end;
+
+function __lwp_thread_isallocatedfp(thethread: plwp_cntrl): cuint32;
+begin
+ result := 0;
+ if (thethread = _thr_allocated_fp) then result := 1;
+end;
+
+procedure __lwp_thread_deallocatefp();
+begin
+ _thr_allocated_fp := nil;
+end;
+
+procedure __lwp_thread_dispatchinitialize();
+begin
+ _thread_dispatch_disable_level := 1;
+end;
+
+procedure __lwp_thread_dispatchenable();
+begin
+ dec(_thread_dispatch_disable_level);
+ if (_thread_dispatch_disable_level = 0) then
+ __thread_dispatch();
+end;
+
+procedure __lwp_thread_dispatchdisable();
+begin
+ inc(_thread_dispatch_disable_level);
+end;
+
+procedure __lwp_thread_dispatchunnest();
begin
- inc(_thread_dispatch_disable_level);
+ dec(_thread_dispatch_disable_level);
end;
+
+procedure __lwp_thread_unblock(thethread: plwp_cntrl);
+begin
+ __lwp_thread_clearstate(thethread, LWP_STATES_BLOCKED);
+end;
+
+function __lwp_thread_getlibcreent(): pointer;
+begin
+ result := __lwp_thr_libc_reent;
+end;
+
+procedure __lwp_thread_setlibcreent(libc_reent: pointer);
+begin
+ __lwp_thr_libc_reent := libc_reent;
+end;
+
+function __lwp_thread_isswitchwant(): cbool;
+begin
+ result := cbool(_context_switch_want);
+end;
+
+function __lwp_thread_isdispatchenabled(): cbool;
+begin
+ result := (_thread_dispatch_disable_level = 0);
+end;
+
+procedure __lwp_thread_inittimeslice();
+begin
+ __lwp_wd_initialize(@_lwp_wd_timeslice, @__lwp_thread_tickle_timeslice, LWP_TIMESLICE_TIMER_ID, nil);
+end;
+
+procedure __lwp_thread_starttimeslice();
+begin
+ __lwp_wd_insert_ticks(@_lwp_wd_timeslice, millisecs_to_ticks(1));
+end;
+
+procedure __lwp_thread_stoptimeslice();
+begin
+ __lwp_wd_remove_ticks(@_lwp_wd_timeslice);
+end;
+
+//procedure __lwp_thread_dispatchdisable(); inline;
+//begin
+// inc(_thread_dispatch_disable_level);
+//end;
{$ENDIF}
diff --git a/packages/libogcfpc/src/ogc/lwp_watchdog.inc b/packages/libogcfpc/src/ogc/lwp_watchdog.inc
index 3482ab39aa..354a7d0694 100644
--- a/packages/libogcfpc/src/ogc/lwp_watchdog.inc
+++ b/packages/libogcfpc/src/ogc/lwp_watchdog.inc
@@ -173,4 +173,87 @@ begin
result := -x;
end;
+
+procedure __lwp_wd_initialize(wd: pwd_cntrl; routine: wd_service_routine; id: cuint32; usr_data: pointer);
+begin
+ wd^.state := LWP_WD_INACTIVE;
+ wd^.id := id;
+ wd^.routine := routine;
+ wd^.usr_data := usr_data;
+end;
+
+function __lwp_wd_first(queue: plwp_queue): pwd_cntrl;
+begin
+ result := pwd_cntrl(@(queue^.first));
+end;
+
+function __lwp_wd_last(queue: plwp_queue): pwd_cntrl;
+begin
+ result := pwd_cntrl(@(queue^.last));
+end;
+
+function __lwp_wd_next(wd: pwd_cntrl): pwd_cntrl;
+begin
+ result := pwd_cntrl(@(wd^.node.next));
+end;
+
+function __lwp_wd_prev(wd: pwd_cntrl): pwd_cntrl;
+begin
+ result := pwd_cntrl(@(wd^.node.prev));
+end;
+
+procedure __lwp_wd_activate(wd: pwd_cntrl);
+begin
+ wd^.state := LWP_WD_ACTIVE;
+end;
+
+procedure __lwp_wd_deactivate(wd: pwd_cntrl);
+begin
+ wd^.state := LWP_WD_REMOVE;
+end;
+
+function __lwp_wd_isactive(wd: pwd_cntrl): cuint32;
+begin
+ result := 0;
+ if (wd^.state = LWP_WD_ACTIVE) then result := 1;
+end;
+
+function __lwp_wd_calc_ticks(const time: ptimespec): cuint64;
+var
+ ticks: cuint64;
+begin
+ ticks := secs_to_ticks(time^.tv_sec);
+ ticks := ticks + nanosecs_to_ticks(time^.tv_nsec);
+ result := ticks;
+end;
+
+procedure __lwp_wd_tickle_ticks();
+begin
+ __lwp_wd_tickle(@_wd_ticks_queue);
+end;
+
+procedure __lwp_wd_insert_ticks(wd: pwd_cntrl; interval: cint64);
+begin
+ wd^.start := gettime();
+ wd^.fire := (wd^.start + LWP_WD_ABS(interval));
+ __lwp_wd_insert(@_wd_ticks_queue, wd);
+end;
+
+procedure __lwp_wd_adjust_ticks(dir: cuint32; interval: cint64);
+begin
+ __lwp_wd_adjust(@_wd_ticks_queue,dir,interval);
+end;
+
+procedure __lwp_wd_remove_ticks(wd: pwd_cntrl);
+begin
+ __lwp_wd_remove(@_wd_ticks_queue,wd);
+end;
+
+procedure __lwp_wd_reset(wd: pwd_cntrl);
+begin
+ __lwp_wd_remove(@_wd_ticks_queue,wd);
+ __lwp_wd_insert(@_wd_ticks_queue,wd);
+end;
+
+
{$ENDIF}
diff --git a/packages/libogcfpc/src/ogc/machine/processor.inc b/packages/libogcfpc/src/ogc/machine/processor.inc
index f6ba329b56..48e32b368d 100644
--- a/packages/libogcfpc/src/ogc/machine/processor.inc
+++ b/packages/libogcfpc/src/ogc/machine/processor.inc
@@ -11,13 +11,13 @@ procedure ppchalt(); inline;
//procedure mfpvr(); inline;
function mfpvr(): cint32; inline;
-procedure mfdcr(_rn: cuint); inline;
+function mfdcr(_rn: cuint): cuint32; inline;
procedure mtdcr(rn, val: cuint); inline;
-procedure mfmsr(); inline;
+function mfmsr(): cuint32; inline;
procedure mtmsr(val: cuint); inline;
-procedure mfdec(); inline;
+function mfdec(): cuint32; inline;
procedure mtdec(_val: cuint); inline;
-procedure mfspr(_rn: cuint); inline;
+function mfspr(_rn: cuint): cuint32; inline;
procedure mtspr(_rn, _val: cuint); inline;
{$define mfwpar() := mfspr(WPAR)}
@@ -46,12 +46,12 @@ procedure mtspr(_rn, _val: cuint); inline;
{$define mfhid4() := mfspr(HID4)}
{$define mthid4(_val) := mtspr(HID4,_val)}
-procedure __lhbrx(base, index: cuint32); inline;
+function __lhbrx(base, index: cuint32): cuint16; inline;
//procedure __lwbrx(base,index: cuint32); inline;
function __lwbrx(base,index: cuint32): cuint32; inline;
procedure __sthbrx(base,index,value: cuint32); inline;
procedure __stwbrx(base,index,value: cuint32); inline;
-procedure cntlzw(_val: cuint32); inline;
+function cntlzw(_val: cuint32): cuint32; inline;
procedure _CPU_MSR_GET( _msr_value: cuint32 ); inline;
procedure _CPU_MSR_SET( _msr_value: cuint32 ); inline;
procedure _CPU_ISR_Enable(); inline;
@@ -118,13 +118,14 @@ begin
result := _rval;
end;
-procedure mfdcr(_rn: cuint); inline;
+function mfdcr(_rn: cuint): cuint32; inline;
var
_rval: cuint32;
begin
asm
// mfdcr r3,_rn // unrecognized opcode?
end;
+ result := _rval;
end;
procedure mtdcr(rn, val: cuint); inline;
@@ -134,13 +135,14 @@ begin
end;
end;
-procedure mfmsr(); inline;
+function mfmsr(): cuint32; inline;
var
_rval: cuint32;
begin
asm
mfmsr r3
end;
+ result := _rval;
end;
procedure mtmsr(val: cuint); inline;
@@ -150,7 +152,7 @@ begin
end;
end;
-procedure mfdec(); inline;
+function mfdec(): cuint32; inline;
var
_rval: cuint32;
begin
@@ -158,6 +160,7 @@ begin
// mfdec r3 // unrecognized opcode?
mfspr r3,22 // unrecognized opcode?
end;
+ result := _rval;
end;
procedure mtdec(_val: cuint); inline;
@@ -168,13 +171,14 @@ begin
end;
end;
-procedure mfspr(_rn: cuint); inline;
+function mfspr(_rn: cuint): cuint32; inline;
var
_rval: cuint32 = 0;
begin
asm
mfspr r3,r4
end;
+ result := _rval;
end;
procedure mtspr(_rn, _val: cuint); inline;
@@ -184,13 +188,14 @@ begin
end;
end;
-procedure __lhbrx(base, index: cuint32); inline;
+function __lhbrx(base, index: cuint32): cuint16; inline;
var
res: cuint16;
begin
asm
lhbrx r3,r4,r5
end;
+ result := res;
end;
//procedure __lwbrx(base,index: cuint32); inline;
@@ -218,13 +223,14 @@ begin
end;
end;
-procedure cntlzw(_val: cuint32); inline;
+function cntlzw(_val: cuint32): cuint32; inline;
var
_rval: cuint32;
begin
asm
cntlzw r3, r4
end;
+ result := _rval;
end;
procedure _CPU_MSR_GET( _msr_value: cuint32 ); inline;
@@ -327,7 +333,7 @@ var
tmp: cuint16;
begin
tmp := val;
- __lhbrx(tmp,0); //??
+ result := __lhbrx(tmp,0); //??
end;
function bswap32(val: cuint32): cuint32; inline;
diff --git a/packages/odbc/src/odbcsql.inc b/packages/odbc/src/odbcsql.inc
index 49a15b66b1..0d0ec1a0a2 100644
--- a/packages/odbc/src/odbcsql.inc
+++ b/packages/odbc/src/odbcsql.inc
@@ -20,7 +20,11 @@
{$endif fpc}
{$ifndef DYNLOADINGODBC}
+{$IFDEF WINDOWS}
+ {$linklib odbc32}
+{$ELSE}
{$linklib odbc}
+{$endif}
{$endif}
interface
diff --git a/packages/opencl/src/cl.pp b/packages/opencl/src/cl.pp
index 3bf88db6f6..d6a8eaa91d 100644
--- a/packages/opencl/src/cl.pp
+++ b/packages/opencl/src/cl.pp
@@ -385,6 +385,7 @@ const
CL_DEVICE_MEM_BASE_ADDR_ALIGN = $1019;
CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE = $101A;
CL_DEVICE_SINGLE_FP_CONFIG = $101B;
+ CL_DEVICE_DOUBLE_FP_CONFIG = $1032;
CL_DEVICE_GLOBAL_MEM_CACHE_TYPE = $101C;
CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE = $101D;
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE = $101E;
@@ -440,9 +441,9 @@ const
// cl_context_info
CL_CONTEXT_REFERENCE_COUNT = $1080;
- CL_CONTEXT_NUM_DEVICES = $1081;
- CL_CONTEXT_DEVICES = $1082;
- CL_CONTEXT_PROPERTIES_INFO = $1083; // CL_CONTEXT_PROPERTIES
+ CL_CONTEXT_DEVICES = $1081;
+ CL_CONTEXT_PROPERTIES_INFO = $1082; // CL_CONTEXT_PROPERTIES
+ CL_CONTEXT_NUM_DEVICES = $1083;
CL_CONTEXT_PLATFORM_INFO = $1084; // CL_CONTEXT_PLATFORM
// cl_command_queue_info
diff --git a/packages/opencl/src/cl_gl.pp b/packages/opencl/src/cl_gl.pp
index b967f70f77..f1056fffe8 100644
--- a/packages/opencl/src/cl_gl.pp
+++ b/packages/opencl/src/cl_gl.pp
@@ -48,6 +48,13 @@ const
CL_GL_TEXTURE_TARGET = $2004;
CL_GL_MIPMAP_LEVEL = $2005;
+ CL_GL_CONTEXT_KHR = $2008;
+ CL_EGL_DISPLAY_KHR = $2009;
+ CL_GLX_DISPLAY_KHR = $200A;
+ CL_WGL_HDC_KHR = $200B;
+ CL_CGL_SHAREGROUP_KHR = $200C;
+
+
function clCreateFromGLBuffer(context: cl_context; falgs: cl_mem_flags;
bufobj: GLuint; var errcode_ret: cl_int
): cl_mem; cdecl; external name 'clCreateFromGLBuffer';
diff --git a/packages/winunits-base/src/activex.pp b/packages/winunits-base/src/activex.pp
index 49e623ac40..8795612592 100644
--- a/packages/winunits-base/src/activex.pp
+++ b/packages/winunits-base/src/activex.pp
@@ -31,6 +31,9 @@ type
TBStr = POleStr;
TBStrList = array[0..(high(integer) div sizeof(TBSTR))-1] of TBstr;
PBStrList = ^TBStrList;
+ POleStrList = ^TOleStrList;
+ TOleStrList = array[0..(high(integer) div sizeof(POleStr))-1] of POleStr;
+
PBStr = ^TBStr;
TOleEnum = type LongWord;
LargeInt = Types.LargeInt;
@@ -3393,7 +3396,7 @@ Type
ICatInformation = interface(IUnknown)
['{0002E013-0000-0000-C000-000000000046}']
- function EnumCategories(lcid:lcid;out ppenumCategoryInfo : ICatInformation):HResult; StdCall;
+ function EnumCategories(lcid:lcid;out ppenumCategoryInfo : IEnumCategoryInfo):HResult; StdCall;
function GetCategoryDesc(rcatid:PCATID;lcid:LCID;out pszdesc:lpwstr):HResult; StdCall;
function EnumClassesOfCategories(cImplemented : ULong; rgcatidImpl:PCATID;cRequired:ULong; rgcatidreq:PCATID; out ppenumclsid : IEnumClsID):HResult; StdCall;
function ISClassOfCategories(rclsid:pclsid;cImplemented:ULong;rgcatidimpl:PCATID;CRequired:ULONG;rgcatidreq : pcatid):HResult; StdCall;
diff --git a/packages/winunits-base/src/uxtheme.pp b/packages/winunits-base/src/uxtheme.pp
index 1e836d0928..c752b9db3c 100644
--- a/packages/winunits-base/src/uxtheme.pp
+++ b/packages/winunits-base/src/uxtheme.pp
@@ -782,7 +782,7 @@ var
var
GetThemeFont: function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId, iPropId: Integer;
- var pFont: LOGFONT): HRESULT; stdcall;
+ var pFont: LOGFONTW): HRESULT; stdcall;
{$EXTERNALSYM GetThemeFont}
//----------------------------------------------------------------------------------------------------------------------
@@ -1039,7 +1039,7 @@ var
//----------------------------------------------------------------------------------------------------------------------
var
- GetThemeSysFont: function(hTheme: HTHEME; iFontId: Integer; var plf: LOGFONT): HRESULT; stdcall;
+ GetThemeSysFont: function(hTheme: HTHEME; iFontId: Integer; var plf: LOGFONTW): HRESULT; stdcall;
{$EXTERNALSYM GetThemeSysFont}
//----------------------------------------------------------------------------------------------------------------------
@@ -1445,7 +1445,7 @@ type
{$EXTERNALSYM DTTOPTS}
PDTTOPTS = ^_DTTOPTS;
{$EXTERNALSYM PDTTOPTS}
- TDTOpts = DTTOPTS;
+ TDTTOpts = DTTOPTS;
// if (_WIN32_WINNT >= 0x0600)
@@ -1736,7 +1736,7 @@ var
implementation
{$ifdef USE_SYNCOBJS}
-// we can't do this due to a circular dependancy between winunits-base and fcl-base
+// we can't do this due to a circular dependency between winunits-base and fcl-base
uses
SyncObjs;
{$endif}
diff --git a/packages/zlib/src/zlib.pp b/packages/zlib/src/zlib.pp
index 15e5c2dae1..1846dbf008 100644
--- a/packages/zlib/src/zlib.pp
+++ b/packages/zlib/src/zlib.pp
@@ -1212,7 +1212,7 @@ function zError(err: cint): pchar; cdecl; external libz name 'zError';
function inflateSyncPoint(var z: z_stream): cint; cdecl; external libz name 'inflateSyncPoint';
function get_crc_table: pointer; cdecl; external libz name 'get_crc_table';
-function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
+function zlibAllocMem(AppData: Pointer; Items, Size: UInt): Pointer; cdecl;
procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
implementation
@@ -1242,7 +1242,7 @@ begin
Result := inflateBackInit_(strm, windowBits, window, ZLIB_VERSION, sizeof(z_stream));
end;
-function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
+function zlibAllocMem(AppData: Pointer; Items, Size: UInt): Pointer; cdecl;
begin
Result := AllocMem(Items * Size);