diff options
author | tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c> | 2008-06-09 10:22:14 +0000 |
---|---|---|
committer | tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c> | 2008-06-09 10:22:14 +0000 |
commit | 3158ee2b850ce0311d8cb8f03cbe6b1681a1f48f (patch) | |
tree | 2ad9f8a8ed8b7ac82525f94af6db09b1d3e35032 /Game/Code/Classes | |
parent | 46bb010ca7c5eb04551c030105f9999ca80e472f (diff) | |
download | usdx-3158ee2b850ce0311d8cb8f03cbe6b1681a1f48f.tar.gz usdx-3158ee2b850ce0311d8cb8f03cbe6b1681a1f48f.tar.xz usdx-3158ee2b850ce0311d8cb8f03cbe6b1681a1f48f.zip |
- all references to the libc unit removed. The Libc unit (not the library) was for kylix compatibility and should not be used anymore. In addition it seems the libc unit is not available on 64bit systems.
- added some functions that will be introduced with FPC 2.2.2
git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@1145 b956fd51-792f-4845-bead-9b4dfca2ff2c
Diffstat (limited to '')
-rw-r--r-- | Game/Code/Classes/UCommon.pas | 24 | ||||
-rw-r--r-- | Game/Code/Classes/ULight.pas | 29 | ||||
-rw-r--r-- | Game/Code/Classes/UPlatformLinux.pas | 101 |
3 files changed, 83 insertions, 71 deletions
diff --git a/Game/Code/Classes/UCommon.pas b/Game/Code/Classes/UCommon.pas index 418c0c1a..768abe89 100644 --- a/Game/Code/Classes/UCommon.pas +++ b/Game/Code/Classes/UCommon.pas @@ -88,15 +88,26 @@ uses {$IFDEF Delphi} Dialogs, {$ENDIF} - {$IFDEF LINUX} - libc, + {$IFDEF FPC_VERSION_2_2_2_PLUS} + clocale, {$ENDIF} UMain, UConfig; + +// data used by the ...Locale() functions +{$IFDEF LINUX} var PrevNumLocale: string; +{$IFNDEF FPC_VERSION_2_2_2_PLUS} +const + __LC_NUMERIC = 1; + +function setlocale(category: integer; locale: pchar): pchar; cdecl; external 'c' name 'setlocale'; +{$ENDIF} +{$ENDIF} + // In Linux and maybe MacOSX some units (like cwstring) call setlocale(LC_ALL, '') // to set the language/country specific locale (e.g. charset) for this application. // Unfortunately, LC_NUMERIC is set by this call too. @@ -116,15 +127,15 @@ var procedure SetDefaultNumericLocale(); begin {$ifdef LINUX} - PrevNumLocale := setlocale(LC_NUMERIC, nil); - setlocale(LC_NUMERIC, 'C'); + PrevNumLocale := setlocale(__LC_NUMERIC, nil); + setlocale(__LC_NUMERIC, 'C'); {$endif} end; procedure RestoreNumericLocale(); begin {$ifdef LINUX} - setlocale(LC_NUMERIC, PChar(PrevNumLocale)); + setlocale(__LC_NUMERIC, PChar(PrevNumLocale)); {$endif} end; @@ -258,13 +269,14 @@ function QueryPerformanceCounter(lpPerformanceCount:TLARGEINTEGER):Bool; end; begin - // Use clock_gettime here maybe ... from libc + // Use clock_gettime(CLOCK_REALTIME, ...) here (but not from the libc unit) lpPerformanceCount := RDTSC(); result := true; end; function QueryPerformanceFrequency(lpFrequency:TLARGEINTEGER):Bool; begin + // clock_getres(CLOCK_REALTIME, ...) lpFrequency := 0; result := true; end; diff --git a/Game/Code/Classes/ULight.pas b/Game/Code/Classes/ULight.pas index f91d614c..a4bebfd2 100644 --- a/Game/Code/Classes/ULight.pas +++ b/Game/Code/Classes/ULight.pas @@ -41,42 +41,25 @@ uses {$IFDEF UseSerialPort} zlportio, {$ENDIF} - {$IFNDEF win32} - libc, - {$ENDIF} UTime; {$IFDEF FPC} function GetTime: TDateTime; - {$IFDEF win32} var SystemTime: TSystemTime; begin GetLocalTime(SystemTime); with SystemTime do -{$IFDEF DARWIN} + begin + {$IFDEF UNIX} Result := EncodeTime(Hour, Minute, Second, MilliSecond); -{$ELSE} + {$ELSE} Result := EncodeTime(wHour, wMinute, wSecond, wMilliSeconds); -{$ENDIF} - end; - {$ELSE} - Type - Time_t = longint; - TTime_T = Time_t; - var - T : TTime_T; - TV: TTimeVal; - UT: TUnixTime; - begin - gettimeofday(TV, nil); - T := TV.tv_sec; - localtime_r(@T, @UT); - Result := EncodeTime(UT.tm_hour, UT.tm_min, UT.tm_sec, TV.tv_usec div 1000); + {$ENDIF} + end; end; - {$ENDIF} - + {$ENDIF} diff --git a/Game/Code/Classes/UPlatformLinux.pas b/Game/Code/Classes/UPlatformLinux.pas index 985f9db1..fabca659 100644 --- a/Game/Code/Classes/UPlatformLinux.pas +++ b/Game/Code/Classes/UPlatformLinux.pas @@ -8,13 +8,15 @@ interface {$I switches.inc} -uses Classes, UPlatform; +uses + Classes, + UPlatform; type TPlatformLinux = class(TInterfacedObject, IPlatform) private - function GetHomedir(): string; + function GetHomeDir(): string; public function DirectoryFindFiles(Dir, Filter : WideString; ReturnAllSubDirs : Boolean) : TDirectoryEntryArray; function TerminateIfAlreadyRunning(var WndTitle : String) : Boolean; @@ -29,28 +31,23 @@ type implementation -// check for version of FPC >= 2.2.0 -{$IFDEF FPC} - {$IF (FPC_VERSION > 2) or ((FPC_VERSION = 2) and (FPC_RELEASE >= 2))} - {$DEFINE FPC_VERSION_2_2_0_PLUS} - {$IFEND} -{$ENDIF} - -uses - libc, +uses UCommandLine, BaseUnix, + {$IFDEF FPC_VERSION_2_2_2_PLUS} + pwd, + {$ENDIF} SysUtils, ULog, UConfig; function TPlatformLinux.DirectoryFindFiles(Dir, Filter : WideString; ReturnAllSubDirs : Boolean) : TDirectoryEntryArray; var - i : Integer; - TheDir : pDir; - ADirent : pDirent; - Entry : Longint; - lAttrib : integer; + i : Integer; + TheDir : pDir; + ADirent : pDirent; + Entry : Longint; + lAttrib : integer; begin i := 0; Filter := LowerCase(Filter); @@ -61,7 +58,7 @@ begin repeat ADirent := FpReadDir(TheDir^); - If Assigned(ADirent) and (ADirent^.d_name <> '.') and (ADirent^.d_name <> '..') then + if Assigned(ADirent) and (ADirent^.d_name <> '.') and (ADirent^.d_name <> '..') then begin lAttrib := FileGetAttr(Dir + ADirent^.d_name); if ReturnAllSubDirs and ((lAttrib and faDirectory) <> 0) then @@ -91,14 +88,14 @@ function TPlatformLinux.GetLogPath : WideString; begin if FindCmdLineSwitch( cUseLocalPaths ) then begin - result := ExtractFilePath(ParamStr(0)); + Result := ExtractFilePath(ParamStr(0)); end else begin {$IFDEF UseLocalDirs} - result := ExtractFilePath(ParamStr(0)); + Result := ExtractFilePath(ParamStr(0)); {$ELSE} - result := LogPath+'/'; + Result := LogPath + PathDelim; {$ENDIF} end; @@ -108,43 +105,63 @@ end; function TPlatformLinux.GetGameSharedPath : WideString; begin if FindCmdLineSwitch( cUseLocalPaths ) then - result := ExtractFilePath(ParamStr(0)) + Result := ExtractFilePath(ParamStr(0)) else begin -{$IFDEF UseLocalDirs} - result := ExtractFilePath(ParamStr(0)); -{$ELSE} - result := SharedPath+'/'; -{$ENDIF} + {$IFDEF UseLocalDirs} + Result := ExtractFilePath(ParamStr(0)); + {$ELSE} + Result := SharedPath + PathDelim; + {$ENDIF} end; end; -function TPlatformLinux.GetGameUserPath : WideString; +function TPlatformLinux.GetGameUserPath: WideString; begin if FindCmdLineSwitch( cUseLocalPaths ) then - result := ExtractFilePath(ParamStr(0)) + Result := ExtractFilePath(ParamStr(0)) else begin -{$IFDEF UseLocalDirs} - result := ExtractFilePath(ParamStr(0)); -{$ELSE} - result := get_homedir()+'/.'+PathSuffix+'/'; -{$ENDIF} + {$IFDEF UseLocalDirs} + Result := ExtractFilePath(ParamStr(0)); + {$ELSE} + Result := GetHomeDir() + '.'+PathSuffix + PathDelim; + {$ENDIF} end; end; -function TPlatformLinux.GetHomedir(): string; +(** + * Returns the user's home directory terminated by a path delimiter + *) +function TPlatformLinux.GetHomeDir(): string; +{$IFDEF FPC_VERSION_2_2_2_PLUS} var - pPasswdEntry : Ppasswd; - lUserName : String; + PasswdEntry: PPasswd; +{$ENDIF} begin - pPasswdEntry := getpwuid( getuid() ); - result := pPasswdEntry^.pw_dir; + Result := ''; + + {$IFDEF FPC_VERSION_2_2_2_PLUS} + // try to retrieve the info from passwd + PasswdEntry := FpGetpwuid(FpGetuid()); + if (PasswdEntry <> nil) then + Result := PasswdEntry.pw_dir; + {$ENDIF} + // fallback if passwd does not contain the path + if (Result = '') then + Result := GetEnvironmentVariable('HOME'); + // add trailing path delimiter (normally '/') + if (Result <> '') then + Result := IncludeTrailingPathDelimiter(Result); + + {$IFDEF FPC_VERSION_2_2_2_PLUS} + // GetUserDir() is another function that returns a user path. + // It uses env-var HOME or a fallback to a temp-dir. + //Result := GetUserDir(); + {$ENDIF} end; -// FIXME: just a dirty-fix to make the linux build work again. -// This i the same as the corresponding function for MacOSX. -// Maybe this should be TPlatformBase.Halt() +// FIXME: Maybe this should be TPlatformBase.Halt() for all platforms procedure TPlatformLinux.Halt; begin System.Halt; @@ -152,7 +169,7 @@ end; function TPlatformLinux.TerminateIfAlreadyRunning(var WndTitle : String) : Boolean; begin - // Linux and Mac don't check for running apps at the moment + // Linux does not check for running apps at the moment Result := false; end; |