amigautils.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. {
  2. This file is part of the Free Pascal run time library.
  3. A file in Amiga system run time library.
  4. Copyright (c) 1998-2003 by Nils Sjoholm
  5. member of the Amiga RTL development team.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {
  13. This is just a temporary unit I made for some of
  14. my demos. I hope it will vanish in time.
  15. Added the define use_amiga_smartlink.
  16. 13 Jan 2003.
  17. [email protected]
  18. }
  19. {$I useamigasmartlink.inc}
  20. {$ifdef use_amiga_smartlink}
  21. {$smartlink on}
  22. {$endif use_amiga_smartlink}
  23. unit amigautils;
  24. interface
  25. uses strings;
  26. function ExtractFilePath(FileName: PChar): PChar;
  27. function FileType(thefile : PChar): Longint;
  28. Function PathAndFile(Path,FName : PChar): PChar;
  29. FUNCTION PathOf(Name : PChar): PChar;
  30. Function LongToStr (I : Longint) : String;
  31. implementation
  32. type
  33. pDateStamp = ^tDateStamp;
  34. tDateStamp = record
  35. ds_Days : Longint; { Number of days since Jan. 1, 1978 }
  36. ds_Minute : Longint; { Number of minutes past midnight }
  37. ds_Tick : Longint; { Number of ticks past minute }
  38. end;
  39. {$PACKRECORDS 4}
  40. Type
  41. { Returned by Examine() and ExInfo(), must be on a 4 byte boundary }
  42. pFileInfoBlock = ^tFileInfoBlock;
  43. tFileInfoBlock = record
  44. fib_DiskKey : Longint;
  45. fib_DirEntryType : Longint;
  46. { Type of Directory. If < 0, then a plain file.
  47. If > 0 a directory }
  48. fib_FileName : Array [0..107] of Char;
  49. { Null terminated. Max 30 chars used for now }
  50. fib_Protection : Longint;
  51. { bit mask of protection, rwxd are 3-0. }
  52. fib_EntryType : Longint;
  53. fib_Size : Longint; { Number of bytes in file }
  54. fib_NumBlocks : Longint; { Number of blocks in file }
  55. fib_Date : tDateStamp; { Date file last changed }
  56. fib_Comment : Array [0..79] of Char;
  57. { Null terminated comment associated with file }
  58. fib_OwnerUID : Word;
  59. fib_OwnerGID : Word;
  60. fib_Reserved : Array [0..31] of Char;
  61. end;
  62. {$PACKRECORDS NORMAL}
  63. FUNCTION Examine(lock : LONGINT; fileInfoBlock : pFileInfoBlock) : BOOLEAN;
  64. BEGIN
  65. ASM
  66. MOVE.L A6,-(A7)
  67. MOVE.L lock,D1
  68. MOVE.L fileInfoBlock,D2
  69. MOVEA.L _DOSBase,A6
  70. JSR -102(A6)
  71. MOVEA.L (A7)+,A6
  72. TST.L D0
  73. BEQ.B @end
  74. MOVEQ #1,D0
  75. @end: MOVE.B D0,@RESULT
  76. END;
  77. END;
  78. FUNCTION Lock(name : pCHAR; type_ : LONGINT) : LONGINT;
  79. BEGIN
  80. ASM
  81. MOVE.L A6,-(A7)
  82. MOVE.L name,D1
  83. MOVE.L type_,D2
  84. MOVEA.L _DOSBase,A6
  85. JSR -084(A6)
  86. MOVEA.L (A7)+,A6
  87. MOVE.L D0,@RESULT
  88. END;
  89. END;
  90. PROCEDURE UnLock(lock : LONGINT);
  91. BEGIN
  92. ASM
  93. MOVE.L A6,-(A7)
  94. MOVE.L lock,D1
  95. MOVEA.L _DOSBase,A6
  96. JSR -090(A6)
  97. MOVEA.L (A7)+,A6
  98. END;
  99. END;
  100. FUNCTION PCharCopy(s: PChar; thepos , len : Longint): PChar;
  101. VAR
  102. dummy : PChar;
  103. BEGIN
  104. getmem(dummy,len+1);
  105. dummy := strlcopy(dummy,@s[thepos],len);
  106. PCharCopy := dummy;
  107. END;
  108. function ExtractFilePath(FileName: PChar): PChar;
  109. var
  110. I: Longint;
  111. begin
  112. I := strlen(FileName);
  113. while (I > 0) and not ((FileName[I] = '/') or (FileName[I] = ':')) do Dec(I);
  114. ExtractFilePath := PCharCopy(FileName, 0, I+1);
  115. end;
  116. function FileType(thefile : PChar): Longint;
  117. VAR
  118. fib : pFileInfoBlock;
  119. mylock : Longint;
  120. mytype : Longint;
  121. begin
  122. mytype := 0;
  123. new(fib);
  124. mylock := Lock(thefile, -2);
  125. IF mylock <> 0 THEN begin
  126. IF Examine(mylock, fib) THEN begin
  127. mytype := fib^.fib_DirEntryType;
  128. UnLock(mylock);
  129. END;
  130. END;
  131. dispose(fib);
  132. FileType := mytype
  133. END;
  134. Function PathAndFile(Path,FName : PChar): PChar;
  135. var
  136. LastChar : CHAR;
  137. Temparray : ARRAY [0..255] OF CHAR;
  138. Temp : PChar;
  139. BEGIN
  140. Temp := @Temparray;
  141. if strlen(Path) > 0 then begin
  142. strcopy(Temp, Path);
  143. LastChar := Temp[Pred(strlen(Temp))];
  144. if (LastChar <> '/') and (LastChar <> ':') then
  145. strcat(Temp, PChar('/'#0));
  146. if strlen(FName) > 0 then
  147. strcat(Temp,FName);
  148. end;
  149. if strlen(Temp) > 0 then begin
  150. PathAndFile := PCharCopy(Temp,0,Strlen(Temp));
  151. end else begin
  152. PathAndFile := nil;
  153. end;
  154. end;
  155. FUNCTION PathOf(Name : PChar): PChar;
  156. begin
  157. PathOf := ExtractFilePath(Name);
  158. end;
  159. Function LongToStr (I : Longint) : String;
  160. Var
  161. S : String;
  162. begin
  163. Str (I,S);
  164. LongToStr:=S;
  165. end;
  166. end.
  167. {
  168. $Log$
  169. Revision 1.2 2003-01-13 18:14:56 nils
  170. * added the define use_amiga_smartlink
  171. Revision 1.1 2002/11/22 21:34:59 nils
  172. * initial release
  173. }