mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-15 14:19:28 +02:00
* Introduction of unixutil
This commit is contained in:
parent
88af0dddd6
commit
586ad6befb
@ -158,7 +158,7 @@ Procedure SetVerify(verify: boolean);
|
||||
Implementation
|
||||
|
||||
Uses
|
||||
Strings,Unix,BaseUnix;
|
||||
Strings,UnixUtil,Unix,BaseUnix;
|
||||
|
||||
{******************************************************************************
|
||||
--- Link C Lib if set ---
|
||||
@ -664,7 +664,7 @@ End;
|
||||
|
||||
Procedure FSplit(Path: PathStr; Var Dir: DirStr; Var Name: NameStr;Var Ext: ExtStr);
|
||||
Begin
|
||||
Unix.FSplit(Path,Dir,Name,Ext);
|
||||
UnixUtil.FSplit(Path,Dir,Name,Ext);
|
||||
End;
|
||||
|
||||
|
||||
@ -675,7 +675,6 @@ Begin
|
||||
End;
|
||||
|
||||
|
||||
|
||||
Function FSearch(path : pathstr;dirlist : string) : pathstr;
|
||||
Var
|
||||
info : BaseUnix.stat;
|
||||
@ -686,8 +685,6 @@ Begin
|
||||
FSearch:=Unix.FSearch(path,dirlist);
|
||||
End;
|
||||
|
||||
|
||||
|
||||
Procedure GetFAttr(var f; var attr : word);
|
||||
Var
|
||||
info : baseunix.stat;
|
||||
@ -906,7 +903,10 @@ End.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.16 2003-09-14 20:15:01 marco
|
||||
Revision 1.17 2003-09-17 17:30:46 marco
|
||||
* Introduction of unixutil
|
||||
|
||||
Revision 1.16 2003/09/14 20:15:01 marco
|
||||
* Unix reform stage two. Remove all calls from Unix that exist in Baseunix.
|
||||
|
||||
Revision 1.15 2003/05/16 20:56:06 florian
|
||||
|
228
rtl/unix/unix.pp
228
rtl/unix/unix.pp
@ -16,7 +16,7 @@
|
||||
Unit Unix;
|
||||
Interface
|
||||
|
||||
Uses BaseUnix;
|
||||
Uses UnixUtil,BaseUnix;
|
||||
|
||||
{// i ostypes.inc}
|
||||
{ Get Types and Constants }
|
||||
@ -73,12 +73,6 @@ Type
|
||||
next : pglob;
|
||||
end;
|
||||
|
||||
ComStr = String[255];
|
||||
PathStr = String[255];
|
||||
DirStr = String[255];
|
||||
NameStr = String[255];
|
||||
ExtStr = String[255];
|
||||
|
||||
const
|
||||
|
||||
{ For File control mechanism }
|
||||
@ -264,21 +258,10 @@ const
|
||||
Function Octal(l:longint):longint;
|
||||
Function FExpand(Const Path: PathStr):PathStr;
|
||||
Function FSearch(const path:pathstr;dirlist:string):pathstr;
|
||||
Procedure FSplit(const Path:PathStr;Var Dir:DirStr;Var Name:NameStr;Var Ext:ExtStr);
|
||||
Function Dirname(Const path:pathstr):pathstr;
|
||||
Function Basename(Const path:pathstr;Const suf:pathstr):pathstr;
|
||||
Function FNMatch(const Pattern,Name:string):Boolean;
|
||||
Function Glob(Const path:pathstr):pglob;
|
||||
Procedure Globfree(var p:pglob);
|
||||
Function StringToPPChar(Var S:String):ppchar;
|
||||
Function StringToPPChar(Var S:AnsiString):ppchar;
|
||||
Function StringToPPChar(S : Pchar):ppchar;
|
||||
Function GetFS(var T:Text):longint;
|
||||
Function GetFS(Var F:File):longint;
|
||||
{Filedescriptorsets}
|
||||
{Stat.Mode Types}
|
||||
Function S_ISLNK(m:word):boolean;
|
||||
Function S_ISSOCK(m:word):boolean;
|
||||
|
||||
{******************************************************************************
|
||||
Implementation
|
||||
@ -1621,45 +1604,6 @@ begin
|
||||
Octal:=oct;
|
||||
end;
|
||||
|
||||
Function StringToPPChar(S: PChar):ppchar;
|
||||
var
|
||||
nr : longint;
|
||||
Buf : ^char;
|
||||
p : ppchar;
|
||||
|
||||
begin
|
||||
buf:=s;
|
||||
nr:=0;
|
||||
while(buf^<>#0) do
|
||||
begin
|
||||
while (buf^ in [' ',#9,#10]) do
|
||||
inc(buf);
|
||||
inc(nr);
|
||||
while not (buf^ in [' ',#0,#9,#10]) do
|
||||
inc(buf);
|
||||
end;
|
||||
getmem(p,nr*4);
|
||||
StringToPPChar:=p;
|
||||
if p=nil then
|
||||
begin
|
||||
LinuxError:=ESysEnomem;
|
||||
exit;
|
||||
end;
|
||||
buf:=s;
|
||||
while (buf^<>#0) do
|
||||
begin
|
||||
while (buf^ in [' ',#9,#10]) do
|
||||
begin
|
||||
buf^:=#0;
|
||||
inc(buf);
|
||||
end;
|
||||
p^:=buf;
|
||||
inc(p);
|
||||
p^:=nil;
|
||||
while not (buf^ in [' ',#0,#9,#10]) do
|
||||
inc(buf);
|
||||
end;
|
||||
end;
|
||||
|
||||
{$DEFINE FPC_FEXPAND_TILDE} { Tilde is expanded to home }
|
||||
{$DEFINE FPC_FEXPAND_GETENVPCHAR} { GetEnv result is a PChar }
|
||||
@ -1712,156 +1656,6 @@ Begin
|
||||
End;
|
||||
End;
|
||||
|
||||
|
||||
Procedure FSplit(const Path:PathStr;Var Dir:DirStr;Var Name:NameStr;Var Ext:ExtStr);
|
||||
Var
|
||||
DotPos,SlashPos,i : longint;
|
||||
Begin
|
||||
SlashPos:=0;
|
||||
DotPos:=256;
|
||||
i:=Length(Path);
|
||||
While (i>0) and (SlashPos=0) Do
|
||||
Begin
|
||||
If (DotPos=256) and (Path[i]='.') Then
|
||||
begin
|
||||
DotPos:=i;
|
||||
end;
|
||||
If (Path[i]='/') Then
|
||||
SlashPos:=i;
|
||||
Dec(i);
|
||||
End;
|
||||
Ext:=Copy(Path,DotPos,255);
|
||||
Dir:=Copy(Path,1,SlashPos);
|
||||
Name:=Copy(Path,SlashPos + 1,DotPos - SlashPos - 1);
|
||||
End;
|
||||
|
||||
|
||||
Function Dirname(Const path:pathstr):pathstr;
|
||||
{
|
||||
This function returns the directory part of a complete path.
|
||||
Unless the directory is root '/', The last character is not
|
||||
a slash.
|
||||
}
|
||||
var
|
||||
Dir : PathStr;
|
||||
Name : NameStr;
|
||||
Ext : ExtStr;
|
||||
begin
|
||||
FSplit(Path,Dir,Name,Ext);
|
||||
if length(Dir)>1 then
|
||||
Delete(Dir,length(Dir),1);
|
||||
DirName:=Dir;
|
||||
end;
|
||||
|
||||
Function StringToPPChar(Var S:String):ppchar;
|
||||
{
|
||||
Create a PPChar to structure of pchars which are the arguments specified
|
||||
in the string S. Especially usefull for creating an ArgV for Exec-calls
|
||||
Note that the string S is destroyed by this call.
|
||||
}
|
||||
|
||||
begin
|
||||
S:=S+#0;
|
||||
StringToPPChar:=StringToPPChar(@S[1]);
|
||||
end;
|
||||
|
||||
Function StringToPPChar(Var S:AnsiString):ppchar;
|
||||
{
|
||||
Create a PPChar to structure of pchars which are the arguments specified
|
||||
in the string S. Especially usefull for creating an ArgV for Exec-calls
|
||||
}
|
||||
|
||||
begin
|
||||
StringToPPChar:=StringToPPChar(PChar(S));
|
||||
end;
|
||||
|
||||
Function Basename(Const path:pathstr;Const suf:pathstr):pathstr;
|
||||
{
|
||||
This function returns the filename part of a complete path. If suf is
|
||||
supplied, it is cut off the filename.
|
||||
}
|
||||
var
|
||||
Dir : PathStr;
|
||||
Name : NameStr;
|
||||
Ext : ExtStr;
|
||||
begin
|
||||
FSplit(Path,Dir,Name,Ext);
|
||||
if Suf<>Ext then
|
||||
Name:=Name+Ext;
|
||||
BaseName:=Name;
|
||||
end;
|
||||
|
||||
|
||||
Function FNMatch(const Pattern,Name:string):Boolean;
|
||||
Var
|
||||
LenPat,LenName : longint;
|
||||
|
||||
Function DoFNMatch(i,j:longint):Boolean;
|
||||
Var
|
||||
Found : boolean;
|
||||
Begin
|
||||
Found:=true;
|
||||
While Found and (i<=LenPat) Do
|
||||
Begin
|
||||
Case Pattern[i] of
|
||||
'?' : Found:=(j<=LenName);
|
||||
'*' : Begin
|
||||
{find the next character in pattern, different of ? and *}
|
||||
while Found and (i<LenPat) do
|
||||
begin
|
||||
inc(i);
|
||||
case Pattern[i] of
|
||||
'*' : ;
|
||||
'?' : begin
|
||||
inc(j);
|
||||
Found:=(j<=LenName);
|
||||
end;
|
||||
else
|
||||
Found:=false;
|
||||
end;
|
||||
end;
|
||||
{Now, find in name the character which i points to, if the * or ?
|
||||
wasn't the last character in the pattern, else, use up all the
|
||||
chars in name}
|
||||
Found:=true;
|
||||
if (i<=LenPat) then
|
||||
begin
|
||||
repeat
|
||||
{find a letter (not only first !) which maches pattern[i]}
|
||||
while (j<=LenName) and (name[j]<>pattern[i]) do
|
||||
inc (j);
|
||||
if (j<LenName) then
|
||||
begin
|
||||
if DoFnMatch(i+1,j+1) then
|
||||
begin
|
||||
i:=LenPat;
|
||||
j:=LenName;{we can stop}
|
||||
Found:=true;
|
||||
end
|
||||
else
|
||||
inc(j);{We didn't find one, need to look further}
|
||||
end;
|
||||
until (j>=LenName);
|
||||
end
|
||||
else
|
||||
j:=LenName;{we can stop}
|
||||
end;
|
||||
else {not a wildcard character in pattern}
|
||||
Found:=(j<=LenName) and (pattern[i]=name[j]);
|
||||
end;
|
||||
inc(i);
|
||||
inc(j);
|
||||
end;
|
||||
DoFnMatch:=Found and (j>LenName);
|
||||
end;
|
||||
|
||||
Begin {start FNMatch}
|
||||
LenPat:=Length(Pattern);
|
||||
LenName:=Length(Name);
|
||||
FNMatch:=DoFNMatch(1,1);
|
||||
End;
|
||||
|
||||
|
||||
Procedure Globfree(var p : pglob);
|
||||
{
|
||||
Release memory occupied by pglob structure, and names in it.
|
||||
@ -1983,21 +1777,6 @@ end;
|
||||
Stat.Mode Macro's
|
||||
--------------------------------}
|
||||
|
||||
Function S_ISLNK(m:word):boolean;
|
||||
{
|
||||
Check mode field of inode for link.
|
||||
}
|
||||
begin
|
||||
S_ISLNK:=(m and STAT_IFMT)=STAT_IFLNK;
|
||||
end;
|
||||
|
||||
Function S_ISSOCK(m:word):boolean;
|
||||
{
|
||||
Check mode field of inode for socket.
|
||||
}
|
||||
begin
|
||||
S_ISSOCK:=(m and STAT_IFMT)=STAT_IFSOCK;
|
||||
end;
|
||||
|
||||
Initialization
|
||||
InitLocalTime;
|
||||
@ -2008,7 +1787,10 @@ End.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.35 2003-09-16 21:46:27 marco
|
||||
Revision 1.36 2003-09-17 17:30:46 marco
|
||||
* Introduction of unixutil
|
||||
|
||||
Revision 1.35 2003/09/16 21:46:27 marco
|
||||
* small fixes, checking things on linux
|
||||
|
||||
Revision 1.34 2003/09/16 20:52:24 marco
|
||||
|
Loading…
Reference in New Issue
Block a user