Jelajahi Sumber

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

git-svn-id: trunk@49164 -
florian 4 tahun lalu
induk
melakukan
c1f85ac3a1

+ 1 - 0
.gitattributes

@@ -16346,6 +16346,7 @@ tests/test/units/sysutils/tfile1.pp svneol=native#text/plain
 tests/test/units/sysutils/tfile2.pp svneol=native#text/plain
 tests/test/units/sysutils/tfileage.pp svneol=native#text/pascal
 tests/test/units/sysutils/tfilename.pp svneol=native#text/plain
+tests/test/units/sysutils/tfilenamecase1.pp svneol=native#text/pascal
 tests/test/units/sysutils/tfloattostr.pp svneol=native#text/plain
 tests/test/units/sysutils/tformat.pp svneol=native#text/plain
 tests/test/units/sysutils/tinttohex.pp svneol=native#text/pascal

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

@@ -875,3 +875,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

@@ -252,3 +252,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;
+

+ 2 - 0
rtl/unix/oscdeclh.inc

@@ -183,3 +183,5 @@ const
 {$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.
+
+  
+