mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-26 05:09:12 +02:00
+ universal FExpand
This commit is contained in:
parent
fb71f8969e
commit
088df8ea90
@ -152,73 +152,18 @@ end;
|
||||
|
||||
|
||||
|
||||
Function FExpand(Const Path:PathStr):PathStr;
|
||||
var
|
||||
temp : pathstr;
|
||||
i,j : longint;
|
||||
p : pchar;
|
||||
Begin
|
||||
{Remove eventual drive - doesn't exist in Linux}
|
||||
if path[2]=':' then
|
||||
i:=3
|
||||
else
|
||||
i:=1;
|
||||
temp:='';
|
||||
{Replace ~/ with $HOME}
|
||||
if (path[i]='~') and ((i+1>length(path)) or (path[i+1]='/')) then
|
||||
begin
|
||||
p:=getenv('HOME');
|
||||
if not (p=nil) then
|
||||
Insert(StrPas(p),temp,i);
|
||||
i:=1;
|
||||
temp:=temp+Copy(Path,2,255);
|
||||
end;
|
||||
{Do we have an absolute path ? No - prefix the current dir}
|
||||
if temp='' then
|
||||
begin
|
||||
if path[i]<>'/' then
|
||||
begin
|
||||
{$I-}
|
||||
getdir(0,temp);
|
||||
{$I+}
|
||||
if ioresult<>0 then;
|
||||
end
|
||||
else
|
||||
inc(i);
|
||||
temp:=temp+'/'+copy(path,i,length(path)-i+1)+'/';
|
||||
end;
|
||||
{First remove all references to '/./'}
|
||||
while pos('/./',temp)<>0 do
|
||||
delete(temp,pos('/./',temp),2);
|
||||
{Now remove also all references to '/../' + of course previous dirs..}
|
||||
repeat
|
||||
i:=pos('/../',temp);
|
||||
{Find the pos of the previous dir}
|
||||
if i>1 then
|
||||
begin
|
||||
j:=i-1;
|
||||
while (j>1) and (temp[j]<>'/') do
|
||||
dec (j);{temp[1] is always '/'}
|
||||
delete(temp,j,i-j+3);
|
||||
end
|
||||
else
|
||||
if i=1 then {i=1, so we have temp='/../something', just delete '/../'}
|
||||
delete(temp,1,3);
|
||||
until i=0;
|
||||
{ Remove ending /.. }
|
||||
i:=pos('/..',temp);
|
||||
if (i<>0) and (i =length(temp)-2) then
|
||||
begin
|
||||
j:=i-1;
|
||||
while (j>1) and (temp[j]<>'/') do
|
||||
dec (j);
|
||||
delete (temp,j,i-j+3);
|
||||
end;
|
||||
{ if last character is / then remove it - dir is also a file :-) }
|
||||
if (length(temp)>0) and (temp[length(temp)]='/') then
|
||||
dec(byte(temp[0]));
|
||||
fexpand:=temp;
|
||||
End;
|
||||
{
|
||||
function FExpand (const Path: PathStr): PathStr;
|
||||
- declared in fexpand.inc
|
||||
}
|
||||
|
||||
{$DEFINE FPC_FEXPAND_TILDE} { Tilde is expanded to home }
|
||||
{$DEFINE FPC_FEXPAND_GETENVPCHAR} { GetEnv result is a PChar }
|
||||
|
||||
{$I fexpand.inc}
|
||||
|
||||
{$UNDEF FPC_FEXPAND_GETENVPCHAR}
|
||||
{$UNDEF FPC_FEXPAND_TILDE}
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user