From c1f85ac3a11e6fd2ed02371d17ab3c0a1522493a Mon Sep 17 00:00:00 2001 From: florian Date: Sat, 10 Apr 2021 13:29:59 +0000 Subject: [PATCH] + initial implementation of path dependent IsFileNameCaseSensitive/IsFileNameCasePreserving functions for darwin git-svn-id: trunk@49164 - --- .gitattributes | 1 + rtl/objpas/sysutils/filutil.inc | 25 +++++++++++++ rtl/objpas/sysutils/filutilh.inc | 6 +++ rtl/unix/oscdeclh.inc | 2 + rtl/unix/sysutils.pp | 41 +++++++++++++++++++++ tests/test/units/sysutils/texpfncase.pp | 3 ++ tests/test/units/sysutils/tfilenamecase1.pp | 29 +++++++++++++++ 7 files changed, 107 insertions(+) create mode 100644 tests/test/units/sysutils/tfilenamecase1.pp diff --git a/.gitattributes b/.gitattributes index 0e54668fb2..920cddbace 100644 --- a/.gitattributes +++ b/.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 diff --git a/rtl/objpas/sysutils/filutil.inc b/rtl/objpas/sysutils/filutil.inc index ec69ccbe8b..256957f146 100644 --- a/rtl/objpas/sysutils/filutil.inc +++ b/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} + diff --git a/rtl/objpas/sysutils/filutilh.inc b/rtl/objpas/sysutils/filutilh.inc index 02f907dea9..8fef58596d 100644 --- a/rtl/objpas/sysutils/filutilh.inc +++ b/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; + diff --git a/rtl/unix/oscdeclh.inc b/rtl/unix/oscdeclh.inc index abfabe073a..363014e31c 100644 --- a/rtl/unix/oscdeclh.inc +++ b/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'; + diff --git a/rtl/unix/sysutils.pp b/rtl/unix/sysutils.pp index c35d28be79..985b6a092d 100644 --- a/rtl/unix/sysutils.pp +++ b/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 ****************************************************************************} diff --git a/tests/test/units/sysutils/texpfncase.pp b/tests/test/units/sysutils/texpfncase.pp index a4adf805e7..1a92839c9c 100644 --- a/tests/test/units/sysutils/texpfncase.pp +++ b/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)); diff --git a/tests/test/units/sysutils/tfilenamecase1.pp b/tests/test/units/sysutils/tfilenamecase1.pp new file mode 100644 index 0000000000..305dcc6c1e --- /dev/null +++ b/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. + + + \ No newline at end of file