Browse Source

+ initial implementation of path dependent IsFileNameCaseSensitive/IsFileNameCasePreserving functions for darwin

git-svn-id: trunk@49164 -
(cherry picked from commit c1f85ac3a11e6fd2ed02371d17ab3c0a1522493a)
florian 4 years ago
parent
commit
117dce6e78

+ 25 - 0
rtl/objpas/sysutils/filutil.inc

@@ -895,3 +895,28 @@ Function FileSetDateUTC (Const FileName : RawByteString;const FileDateTimeUTC :
 begin
   Result:=FileSetDateUTC(UnicodeString(FileName),FileDateTimeUTC);
 end;
+
+{$IFNDEF HAS_ISFILENAMECASESENSITIVE}
+Function IsFileNameCaseSensitive(Const aFileName : RawByteString) : Boolean;
+begin
+  Result:=FileNameCaseSensitive;
+end;
+
+Function IsFileNameCaseSensitive(Const aFileName : UnicodeString) : Boolean;
+begin
+  Result:=FileNameCaseSensitive;
+end;
+{$ENDIF HAS_ISFILENAMECASESENSITIVE}
+
+{$IFNDEF HAS_ISFILENAMECASEPRESERVING}
+Function IsFileNameCasePreserving(Const aFileName : RawByteString) : Boolean;
+begin
+  Result:=FileNameCasePreserving;
+end;
+
+Function IsFileNameCasePreserving(Const aFileName : UnicodeString) : Boolean;
+begin
+  Result:=FileNameCasePreserving;
+end;
+{$ENDIF HAS_ISFILENAMECASEPRESERVING}
+

+ 6 - 0
rtl/objpas/sysutils/filutilh.inc

@@ -261,3 +261,9 @@ Function GetFileAsString(Const aFileName : RawByteString; aEncoding : TEncoding)
 Function GetFileAsString(Const aFileName : UnicodeString) : UnicodeString;
 Function GetFileAsString(Const aFileName : UnicodeString; aEncoding : TEncoding) : UnicodeString;
 
+Function IsFileNameCaseSensitive(Const aFileName : RawByteString) : Boolean;
+Function IsFileNameCaseSensitive(Const aFileName : UnicodeString) : Boolean;
+
+Function IsFileNameCasePreserving(Const aFileName : RawByteString) : Boolean;
+Function IsFileNameCasePreserving(Const aFileName : UnicodeString) : Boolean;
+

+ 4 - 0
rtl/unix/oscdeclh.inc

@@ -180,4 +180,8 @@ const
 {$endif}
     function  FpTime       (tloc:ptime_t): time_t; cdecl; external clib name 'time';
 
+{$if defined(linux)}
+    function  FpSchedGetAffinity(pid : pid_t;cpusetsize : size_t;mask : pcpu_set_t) : cint; cdecl; external clib name 'sched_getaffinity';
+{$endif}
+    Function FpPathconf(path : pchar;name : cint) : clong; cdecl; external clib name 'pathconf';
 

+ 41 - 0
rtl/unix/sysutils.pp

@@ -55,6 +55,11 @@ uses
 {$DEFINE HAVECLOCKGETTIME}
 {$ENDIF}
 
+{$IF defined(DARWIN)}
+{$DEFINE HAS_ISFILENAMECASEPRESERVING}
+{$DEFINE HAS_ISFILENAMECASESENSITIVE}
+{$ENDIF}
+
 {$if defined(LINUX)}
   {$if sizeof(clong)<8}
     {$DEFINE USE_STATX}
@@ -1196,6 +1201,42 @@ begin
     end
 end;
 
+{$IF defined(DARWIN)}
+Function IsFileNameCaseSensitive(Const aFileName : RawByteString) : Boolean;
+var
+  res : clong;
+begin
+  res:=FpPathconf(PChar(aFileName),11 {_PC_CASE_SENSITIVE });
+  { fall back to default if path is not found }
+  if res<0 then
+    Result:=FileNameCaseSensitive
+  else
+     Result:=res<>0;
+end;
+
+Function IsFileNameCaseSensitive(Const aFileName : UnicodeString) : Boolean;
+begin
+  Result:=IsFileNameCaseSensitive(RawByteString(aFileName));
+end;
+
+Function IsFileNameCasePreserving(Const aFileName : RawByteString) : Boolean;
+var
+  res : clong;
+begin
+  res:=FpPathconf(PChar(aFileName),12 { _PC_CASE_PRESERVING });
+  if res<0 then
+    { fall back to default if path is not found }
+    Result:=FileNameCasePreserving
+  else
+     Result:=res<>0;
+end;
+
+Function IsFileNameCasePreserving(Const aFileName : UnicodeString) : Boolean;
+begin
+  Result:=IsFileNameCasePreserving(RawByteString(aFileName));
+end;
+{$ENDIF defined(DARWIN)}
+
 {****************************************************************************
                               Disk Functions
 ****************************************************************************}

+ 3 - 0
tests/test/units/sysutils/texpfncase.pp

@@ -116,6 +116,9 @@ begin
 {$IFDEF DEBUG}
  {$IFDEF FPC}
   WriteLn ('FileNameCaseSensitive = ', FileNameCaseSensitive);
+  WriteLn ('IsFileNameCaseSensitive('''+TempDir+''') = ', IsFileNameCaseSensitive(TempDir));
+  Writeln('Setting FileNameCaseSensitive to result of IsFileNameCaseSensitive('''+TempDir+''');');
+  FileNameCaseSensitive:=IsFileNameCaseSensitive(TempDir);
  {$ENDIF FPC}
   WriteLn ('TempDir = ', TempDir);
   WriteLn ('SetCurrentDir result = ', SetCurrentDir (TempDir));

+ 29 - 0
tests/test/units/sysutils/tfilenamecase1.pp

@@ -0,0 +1,29 @@
+uses
+  Sysutils;
+var
+  f : file;  
+Begin
+  Writeln('IsFileNameCaseSensitive: ',IsFileNameCaseSensitive('tfilenamecase1.dat'));
+  Writeln('IsFileNameCasePreserving ',IsFileNameCasePreserving('tfilenamecase1.dat'));
+  Assign(f,'tfilenamecase1.dat');
+  Rewrite(f);
+  Close(f);
+  if IsFileNameCaseSensitive('tfilenamecase1.dat') then
+    begin
+      if FileExists('Tfilenamecase1.dat') then
+        halt(1);
+    end
+  else
+    begin
+      if not(FileExists('Tfilenamecase1.dat')) then
+        halt(2);
+    end;
+  if IsFileNameCasePreserving('tfilenamecase1.dat') then
+    begin
+      if not(FileExists('Tfilenamecase1.dat')) then
+        halt(1);
+    end;
+End.
+
+  
+