mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-01-20 00:51:28 +01:00
198 lines
4.7 KiB
ObjectPascal
198 lines
4.7 KiB
ObjectPascal
{
|
|
This file is part of the Free Pascal run time library.
|
|
|
|
A file in Amiga system run time library.
|
|
Copyright (c) 1998-2003 by Nils Sjoholm
|
|
member of the Amiga RTL development team.
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
for details about the copyright.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
**********************************************************************}
|
|
|
|
{
|
|
This is just a temporary unit I made for some of
|
|
my demos. I hope it will vanish in time.
|
|
|
|
|
|
Added the define use_amiga_smartlink.
|
|
13 Jan 2003.
|
|
nils.sjoholm@mailbox.swipnet.se
|
|
}
|
|
|
|
{$I useamigasmartlink.inc}
|
|
{$ifdef use_amiga_smartlink}
|
|
{$smartlink on}
|
|
{$endif use_amiga_smartlink}
|
|
|
|
unit amigautils;
|
|
|
|
interface
|
|
|
|
uses strings;
|
|
|
|
function ExtractFilePath(FileName: PChar): PChar;
|
|
function FileType(thefile : PChar): Longint;
|
|
Function PathAndFile(Path,FName : PChar): PChar;
|
|
FUNCTION PathOf(Name : PChar): PChar;
|
|
|
|
Function LongToStr (I : Longint) : String;
|
|
|
|
implementation
|
|
|
|
type
|
|
pDateStamp = ^tDateStamp;
|
|
tDateStamp = record
|
|
ds_Days : Longint; { Number of days since Jan. 1, 1978 }
|
|
ds_Minute : Longint; { Number of minutes past midnight }
|
|
ds_Tick : Longint; { Number of ticks past minute }
|
|
end;
|
|
|
|
{$PACKRECORDS 4}
|
|
Type
|
|
|
|
{ Returned by Examine() and ExInfo(), must be on a 4 byte boundary }
|
|
|
|
pFileInfoBlock = ^tFileInfoBlock;
|
|
tFileInfoBlock = record
|
|
fib_DiskKey : Longint;
|
|
fib_DirEntryType : Longint;
|
|
{ Type of Directory. If < 0, then a plain file.
|
|
If > 0 a directory }
|
|
fib_FileName : Array [0..107] of Char;
|
|
{ Null terminated. Max 30 chars used for now }
|
|
fib_Protection : Longint;
|
|
{ bit mask of protection, rwxd are 3-0. }
|
|
fib_EntryType : Longint;
|
|
fib_Size : Longint; { Number of bytes in file }
|
|
fib_NumBlocks : Longint; { Number of blocks in file }
|
|
fib_Date : tDateStamp; { Date file last changed }
|
|
fib_Comment : Array [0..79] of Char;
|
|
{ Null terminated comment associated with file }
|
|
fib_OwnerUID : Word;
|
|
fib_OwnerGID : Word;
|
|
fib_Reserved : Array [0..31] of Char;
|
|
end;
|
|
|
|
{$PACKRECORDS NORMAL}
|
|
|
|
FUNCTION Examine(lock : LONGINT; fileInfoBlock : pFileInfoBlock) : BOOLEAN;
|
|
BEGIN
|
|
ASM
|
|
MOVE.L A6,-(A7)
|
|
MOVE.L lock,D1
|
|
MOVE.L fileInfoBlock,D2
|
|
MOVEA.L _DOSBase,A6
|
|
JSR -102(A6)
|
|
MOVEA.L (A7)+,A6
|
|
TST.L D0
|
|
BEQ.B @end
|
|
MOVEQ #1,D0
|
|
@end: MOVE.B D0,@RESULT
|
|
END;
|
|
END;
|
|
|
|
FUNCTION Lock(name : pCHAR; type_ : LONGINT) : LONGINT;
|
|
BEGIN
|
|
ASM
|
|
MOVE.L A6,-(A7)
|
|
MOVE.L name,D1
|
|
MOVE.L type_,D2
|
|
MOVEA.L _DOSBase,A6
|
|
JSR -084(A6)
|
|
MOVEA.L (A7)+,A6
|
|
MOVE.L D0,@RESULT
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE UnLock(lock : LONGINT);
|
|
BEGIN
|
|
ASM
|
|
MOVE.L A6,-(A7)
|
|
MOVE.L lock,D1
|
|
MOVEA.L _DOSBase,A6
|
|
JSR -090(A6)
|
|
MOVEA.L (A7)+,A6
|
|
END;
|
|
END;
|
|
|
|
FUNCTION PCharCopy(s: PChar; thepos , len : Longint): PChar;
|
|
VAR
|
|
dummy : PChar;
|
|
BEGIN
|
|
getmem(dummy,len+1);
|
|
dummy := strlcopy(dummy,@s[thepos],len);
|
|
PCharCopy := dummy;
|
|
END;
|
|
|
|
|
|
function ExtractFilePath(FileName: PChar): PChar;
|
|
var
|
|
I: Longint;
|
|
begin
|
|
I := strlen(FileName);
|
|
while (I > 0) and not ((FileName[I] = '/') or (FileName[I] = ':')) do Dec(I);
|
|
ExtractFilePath := PCharCopy(FileName, 0, I+1);
|
|
end;
|
|
|
|
function FileType(thefile : PChar): Longint;
|
|
VAR
|
|
fib : pFileInfoBlock;
|
|
mylock : Longint;
|
|
mytype : Longint;
|
|
begin
|
|
mytype := 0;
|
|
new(fib);
|
|
mylock := Lock(thefile, -2);
|
|
IF mylock <> 0 THEN begin
|
|
IF Examine(mylock, fib) THEN begin
|
|
mytype := fib^.fib_DirEntryType;
|
|
UnLock(mylock);
|
|
END;
|
|
END;
|
|
dispose(fib);
|
|
FileType := mytype
|
|
END;
|
|
|
|
Function PathAndFile(Path,FName : PChar): PChar;
|
|
var
|
|
LastChar : CHAR;
|
|
Temparray : ARRAY [0..255] OF CHAR;
|
|
Temp : PChar;
|
|
BEGIN
|
|
Temp := @Temparray;
|
|
if strlen(Path) > 0 then begin
|
|
strcopy(Temp, Path);
|
|
LastChar := Temp[Pred(strlen(Temp))];
|
|
if (LastChar <> '/') and (LastChar <> ':') then
|
|
strcat(Temp, PChar('/'#0));
|
|
if strlen(FName) > 0 then
|
|
strcat(Temp,FName);
|
|
end;
|
|
if strlen(Temp) > 0 then begin
|
|
PathAndFile := PCharCopy(Temp,0,Strlen(Temp));
|
|
end else begin
|
|
PathAndFile := nil;
|
|
end;
|
|
end;
|
|
|
|
FUNCTION PathOf(Name : PChar): PChar;
|
|
begin
|
|
PathOf := ExtractFilePath(Name);
|
|
end;
|
|
|
|
Function LongToStr (I : Longint) : String;
|
|
Var
|
|
S : String;
|
|
begin
|
|
Str (I,S);
|
|
LongToStr:=S;
|
|
end;
|
|
|
|
|
|
end.
|