Update of /cvsroot/fink/dists/10.4/unstable/main/finkinfo/languages
In directory sc8-pr-cvs17:/tmp/cvs-serv5078
Modified Files:
fpc.info
Added Files:
fpc.patch
Log Message:
update from tracker
--- NEW FILE: fpc.patch ---
--- fpcsrc/compiler/cfileutils.pas 2007-05-27 12:52:15.000000000 +0200
+++ fpcsrc/compiler/cfileutils.pas 2007-10-04 14:13:49.000000000 +0200
@@ -50,11 +50,14 @@
TCachedDirectory = class(TFPHashObject)
private
FDirectoryEntries : TFPHashList;
+ procedure FreeDirectoryEntries;
+ function GetItemAttr(const AName: TCmdStr): byte;
public
constructor Create(AList:TFPHashObjectList;const AName:TCmdStr);
destructor destroy;override;
procedure Reload;
function FileExists(const AName:TCmdStr):boolean;
+ function FileExistsCaseAware(const AName:TCmdStr; out FoundName:
TCmdStr):boolean;
function DirectoryExists(const AName:TCmdStr):boolean;
property DirectoryEntries:TFPHashList read FDirectoryEntries;
end;
@@ -67,6 +70,12 @@
EntryIndex : longint;
end;
+ PCachedDirectoryEntry = ^TCachedDirectoryEntry;
+ TCachedDirectoryEntry = record
+ RealName: TCmdStr;
+ Attr : byte;
+ end;
+
TDirectoryCache = class
private
FDirectories : TFPHashObjectList;
@@ -75,6 +84,7 @@
constructor Create;
destructor destroy;override;
function FileExists(const AName:TCmdStr):boolean;
+ function FileExistsCaseAware(const AName:TCmdStr; out FoundName:
TCmdStr):boolean;
function DirectoryExists(const AName:TCmdStr):boolean;
function FindFirst(const APattern:TCmdStr;var
Res:TCachedSearchRec):boolean;
function FindNext(var Res:TCachedSearchRec):boolean;
@@ -136,29 +146,67 @@
destructor TCachedDirectory.destroy;
begin
+ FreeDirectoryEntries;
FDirectoryEntries.Free;
inherited destroy;
end;
+ procedure TCachedDirectory.FreeDirectoryEntries;
+ var
+ i: Integer;
+ begin
+ if not(tf_files_case_aware in source_info.flags) then
+ exit;
+ for i := 0 to DirectoryEntries.Count-1 do
+ dispose(PCachedDirectoryEntry(DirectoryEntries[i]));
+ end;
+
+
+ function TCachedDirectory.GetItemAttr(const AName: TCmdStr): byte;
+ var
+ entry: PCachedDirectoryEntry;
+ begin
+ if not(tf_files_case_sensitive in source_info.flags) then
+ if (tf_files_case_aware in source_info.flags) then
+ begin
+
entry:=PCachedDirectoryEntry(DirectoryEntries.Find(Lower(AName)));
+ if assigned(entry) then
+ Result:=entry^.Attr
+ else
+ Result:=0;
+ end
+ else
+ Result:=PtrUInt(DirectoryEntries.Find(Lower(AName)))
+ else
+ Result:=PtrUInt(DirectoryEntries.Find(AName));
+ end;
+
+
procedure TCachedDirectory.Reload;
var
- dir : TSearchRec;
+ dir : TSearchRec;
+ entry : PCachedDirectoryEntry;
begin
+ FreeDirectoryEntries;
DirectoryEntries.Clear;
if findfirst(IncludeTrailingPathDelimiter(Name)+'*',faAnyFile or
faDirectory,dir) = 0 then
begin
repeat
if ((dir.attr and faDirectory)<>faDirectory) or
- (dir.Name<>'.') or
- (dir.Name<>'..') then
+ ((dir.Name<>'.') and
+ (dir.Name<>'..')) then
begin
- { Force Archive bit so the attribute always has a value.
This is needed
- to be able to see the difference in the directoryentries
lookup if a file
- exists or not }
- Dir.Attr:=Dir.Attr or faArchive;
if not(tf_files_case_sensitive in source_info.flags) then
-
DirectoryEntries.Add(Lower(Dir.Name),Pointer(Ptrint(Dir.Attr)))
+ if (tf_files_case_aware in source_info.flags) then
+ begin
+ new(entry);
+ entry^.RealName:=Dir.Name;
+ entry^.Attr:=Dir.Attr;
+ DirectoryEntries.Add(Lower(Dir.Name),entry)
+ end
+ else
+
DirectoryEntries.Add(Lower(Dir.Name),Pointer(Ptrint(Dir.Attr)))
else
DirectoryEntries.Add(Dir.Name,Pointer(Ptrint(Dir.Attr)));
end;
@@ -172,10 +220,7 @@
var
Attr : Longint;
begin
- if not(tf_files_case_sensitive in source_info.flags) then
- Attr:=PtrInt(DirectoryEntries.Find(Lower(AName)))
- else
- Attr:=PtrInt(DirectoryEntries.Find(AName));
+ Attr:=GetItemAttr(AName);
if Attr<>0 then
Result:=((Attr and faDirectory)=0)
else
@@ -183,14 +228,37 @@
end;
+ function TCachedDirectory.FileExistsCaseAware(const AName:TCmdStr; out
FoundName: TCmdStr):boolean;
+ var
+ entry : PCachedDirectoryEntry;
+ Attr : Longint;
+ begin
+ if (tf_files_case_aware in source_info.flags) then
+ begin
+ entry:=PCachedDirectoryEntry(DirectoryEntries.Find(Lower(AName)));
+ if assigned(entry) then
+ begin
+ Attr:=entry^.Attr;
+ FoundName:=entry^.RealName
+ end
+ else
+ Attr:=0;
+ if Attr<>0 then
+ Result:=((Attr and faDirectory)=0)
+ else
+ Result:=false
+ end
+ else
+ { should not be called in this case, use plain FileExists }
+ Result:=False;
+ end;
+
+
function TCachedDirectory.DirectoryExists(const AName:TCmdStr):boolean;
var
Attr : Longint;
begin
- if not(tf_files_case_sensitive in source_info.flags) then
- Attr:=PtrInt(DirectoryEntries.Find(Lower(AName)))
- else
- Attr:=PtrInt(DirectoryEntries.Find(AName));
+ Attr:=GetItemAttr(AName);
if Attr<>0 then
Result:=((Attr and faDirectory)=faDirectory)
else
@@ -246,6 +314,21 @@
end;
+ function TDirectoryCache.FileExistsCaseAware(const AName:TCmdStr; out
FoundName:TCmdStr):boolean;
+ var
+ CachedDir : TCachedDirectory;
+ begin
+ Result:=false;
+ CachedDir:=GetDirectory(ExtractFileDir(AName));
+ if assigned(CachedDir) then
+ begin
+
Result:=CachedDir.FileExistsCaseAware(ExtractFileName(AName),FoundName);
+ if Result then
+ FoundName:=ExtractFilePath(AName)+FoundName;
+ end;
+ end;
+
+
function TDirectoryCache.DirectoryExists(const AName:TCmdStr):boolean;
var
CachedDir : TCachedDirectory;
@@ -270,11 +353,22 @@
function TDirectoryCache.FindNext(var Res:TCachedSearchRec):boolean;
+ var
+ entry: PCachedDirectoryEntry;
begin
if Res.EntryIndex<Res.CachedDir.DirectoryEntries.Count then
begin
-
Res.Name:=Res.CachedDir.DirectoryEntries.NameOfIndex(Res.EntryIndex);
- Res.Attr:=PtrInt(Res.CachedDir.DirectoryEntries[Res.EntryIndex]);
+ if (tf_files_case_aware in source_info.flags) then
+ begin
+ entry:=Res.CachedDir.DirectoryEntries[Res.EntryIndex];
+ Res.Name:=entry^.RealName;
+ Res.Attr:=entry^.Attr;
+ end
+ else
+ begin
+
Res.Name:=Res.CachedDir.DirectoryEntries.NameOfIndex(Res.EntryIndex);
+
Res.Attr:=PtrUInt(Res.CachedDir.DirectoryEntries[Res.EntryIndex]);
+ end;
inc(Res.EntryIndex);
Result:=true;
end
@@ -422,11 +516,24 @@
1. NormalCase
}
FoundFile:=path+fn;
- If FileExists(FoundFile,allowcache) then
- begin
- result:=true;
- exit;
- end;
+{$ifdef usedircache}
+ if allowcache then
+ begin
+ result:=DirCache.FileExistsCaseAware(FoundFile,fn2);
+ if result then
+ begin
+ FoundFile:=fn2;
+ exit;
+ end;
+ end
+ else
+{$endif usedircache}
+ If FileExists(FoundFile,allowcache) then
+ begin
+ { don't know the real name in this case }
+ result:=true;
+ exit;
+ end;
end
else
begin
@@ -1007,7 +1114,7 @@
while (pc^<>sepch) and (pc^<>';') and (pc^<>#0) do
inc(pc);
SetLength(singlepathstring, pc-startpc);
- move(startpc^,singlepathstring[1],pc-startpc);
+ move(startpc^,singlepathstring[1],pc-startpc);
singlepathstring:=FixPath(ExpandFileName(singlepathstring),false);
result:=FileExistsNonCase(singlepathstring,f,allowcache,FoundFile);
if result then
Index: fpc.info
===================================================================
RCS file: /cvsroot/fink/dists/10.4/unstable/main/finkinfo/languages/fpc.info,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- fpc.info 17 Oct 2007 22:42:11 -0000 1.5
+++ fpc.info 6 Nov 2007 18:52:05 -0000 1.6
@@ -1,8 +1,9 @@
Package: fpc
Version: 2.2.0
-Revision: 2
+Revision: 3
Architecture: powerpc, i386
-Distribution: 10.4
+BuildDepends: fink (>= 0.24.12)
+# Reason for fink (>= 0.24.12): Use of PatchFile: field
Recommends: fpc-doc
CustomMirror: <<
aus-AU: http://fpc.planetmirror.com/pub/fpc/
@@ -17,9 +18,11 @@
<<
Source: mirror:custom:dist/%v/source/fpcbuild-%v.tar.gz
Source-MD5: 0869cfd07d012b702ff08c0a4196624b
-Source2: mirror:custom:dist/%v/source/fpc-%v.universal-darwin.bootstrap.tar.bz2
-Source2-MD5: a1bec63825522d1f7a5af80f4fa102a4
+Source2:
mirror:custom:dist/%v/source/fpc-%v-2.universal-darwin.bootstrap.tar.bz2
+Source2-MD5: aad6102fe1a773ea1d0b8e7c1b05f828
SourceDirectory: fpcbuild-%v/fpcsrc
+PatchFile: %n.patch
+PatchFile-MD5: 08facd944cdf940250e8d987bf6af682
Patchscript: <<
#!/bin/sh -ev
# The patch resolves a bug, when ginstall is used instead of install
@@ -33,6 +36,9 @@
# So, any higher version than 2.2.0 should not need this patch script.
sed -i.bak 's|variants types sysctl dateutils|variants dateutils|g'
rtl/darwin/Makefile.fpc
sed -i.bak 's|variants types sysctl dateutils|variants dateutils|g'
rtl/darwin/Makefile
+# mv compiler/cfileutils.pas compiler/cfileutils.orig.pas
+# sed 's|@PREFIX@|%p|g' < %{PatchFile} | patch -p1
+ patch -p1 < %{PatchFile}
<<
CompileScript: <<
#!/bin/sh -ev
@@ -82,10 +88,7 @@
This Pascal compiler produces PowerPC and x86 executables, which run natively
on PowerPC and x86 Macs. PowerPC executables also runs in Rosetta emulation
on x86 Macs.
- BEWARE: On case sensitive file systems, fpc does not work, yet.
- Until the next revision, please use a svn version from
http://www.freepascal.org/
- Universal Binaries:
- Use lipo to combine PowerPC and x86 binaries.
+ Use lipo to combine PowerPC and x86 binaries to universal binaries.
get help with: fpc -?
compile and link a Pascal file with: fpc FILENAME
For setting up the Free Pascal IDE see:
@@ -95,7 +98,6 @@
For more documentation about Free Pascal in HTML and pdf, install fpc-doc
<<
DescPort: <<
- The bug with case sensitive file systems needs to be fixed (cfileutils.pas).
Nothing special, yet. ToDo: lazarus, universal binaries and extra package
with dependent C libraries (gtk ...) .
<<
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Fink-commits mailing list
[email protected]
http://news.gmane.org/gmane.os.apple.fink.cvs