diff options
Diffstat (limited to 'packages')
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 Binary files differnew file mode 100644 index 0000000000..0341321b5d --- /dev/null +++ b/packages/fcl-web/examples/combined/combined.ico 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 Binary files differnew file mode 100644 index 0000000000..7c6cf3e4be --- /dev/null +++ b/packages/fcl-web/examples/combined/combined.res 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 Binary files differnew file mode 100644 index 0000000000..e1a2633df2 --- /dev/null +++ b/packages/fcl-web/examples/combined/login.png 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); |