common.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. { $Id$ }
  2. {********************[ COMMON UNIT ]***********************}
  3. { }
  4. { System independent COMMON TYPES & DEFINITIONS }
  5. { }
  6. { Parts Copyright (c) 1997 by Balazs Scheidler }
  7. { [email protected] }
  8. { }
  9. { Parts Copyright (c) 1999 by Leon de Boer }
  10. { [email protected] - primary e-mail address }
  11. { [email protected] - backup e-mail address }
  12. { }
  13. {****************[ THIS CODE IS FREEWARE ]*****************}
  14. { }
  15. { This sourcecode is released for the purpose to }
  16. { promote the pascal language on all platforms. You may }
  17. { redistribute it and/or modify with the following }
  18. { DISCLAIMER. }
  19. { }
  20. { This SOURCE CODE is distributed "AS IS" WITHOUT }
  21. { WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR }
  22. { ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED. }
  23. { }
  24. {*****************[ SUPPORTED PLATFORMS ]******************}
  25. { 16 and 32 Bit compilers }
  26. { DOS - Turbo Pascal 7.0 + (16 Bit) }
  27. { DPMI - Turbo Pascal 7.0 + (16 Bit) }
  28. { - FPC 0.9912+ (GO32V2) (32 Bit) }
  29. { WINDOWS - Turbo Pascal 7.0 + (16 Bit) }
  30. { - Delphi 1.0+ (16 Bit) }
  31. { WIN95/NT - Delphi 2.0+ (32 Bit) }
  32. { - Virtual Pascal 2.0+ (32 Bit) }
  33. { - Speedsoft Sybil 2.0+ (32 Bit) }
  34. { - FPC 0.9912+ (32 Bit) }
  35. { OS2 - Virtual Pascal 1.0+ (32 Bit) }
  36. { - Speed Pascal 1.0+ (32 Bit) }
  37. { - C'T patch to BP (16 Bit) }
  38. { }
  39. {******************[ REVISION HISTORY ]********************}
  40. { Version Date Who Fix }
  41. { ------- -------- --- ---------------------------- }
  42. { 0.1 12 Jul 97 Bazsi Initial implementation }
  43. { 0.2 18 Jul 97 Bazsi Linux specific error codes }
  44. { 0.2.2 28 Jul 97 Bazsi Base error code for Video }
  45. { 0.2.3 29 Jul 97 Bazsi Basic types added (PByte etc) }
  46. { 0.2.5 08 Aug 97 Bazsi Error handling code added }
  47. { 0.2.6 06 Sep 97 Bazsi Base code for keyboard }
  48. { 0.2.7 06 Nov 97 Bazsi Base error code for filectrl }
  49. { 0.2.8 21 Jan 99 LdB Max data sizes added. }
  50. { 0.2.9 22 Jan 99 LdB General array types added. }
  51. { 0.3.0 27 Oct 99 LdB Delphi3+ MaxAvail, MemAvail }
  52. {**********************************************************}
  53. UNIT Common;
  54. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  55. INTERFACE
  56. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  57. {====Include file to sort compiler platform out =====================}
  58. {$I Platform.inc}
  59. {====================================================================}
  60. {***************************************************************************}
  61. { PUBLIC CONSTANTS }
  62. {***************************************************************************}
  63. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  64. { SYSTEM ERROR BASE CONSTANTS }
  65. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  66. {---------------------------------------------------------------------------}
  67. { The following ranges have been defined for error codes: }
  68. {---------------------------------------------------------------------------}
  69. { 0 - 1000 OS dependant error codes }
  70. { 1000 - 10000 API reserved error codes }
  71. { 10000 - Add-On unit error codes }
  72. {---------------------------------------------------------------------------}
  73. { Before anyone adding a unit, contact [email protected] to assign a base }
  74. { error code, to avoid collisions. }
  75. {---------------------------------------------------------------------------}
  76. {---------------------------------------------------------------------------}
  77. { DEFINED BASE ERROR CONSTANTS }
  78. {---------------------------------------------------------------------------}
  79. CONST
  80. errOk = 0; { No error }
  81. errVioBase = 1000; { Video base offset }
  82. errKbdBase = 1010; { Keyboard base offset }
  83. errFileCtrlBase = 1020; { File IO base offset }
  84. errMouseBase = 1030; { Mouse base offset }
  85. {---------------------------------------------------------------------------}
  86. { MAXIUM DATA SIZES }
  87. {---------------------------------------------------------------------------}
  88. CONST
  89. {$IFDEF BIT_16} { 16 BIT DEFINITION }
  90. MaxBytes = 65520; { Maximum data size }
  91. {$ENDIF}
  92. {$IFDEF BIT_32} { 32 BIT DEFINITION }
  93. MaxBytes = 128*1024*1024; { Maximum data size }
  94. {$ENDIF}
  95. MaxWords = MaxBytes DIV SizeOf(Word); { Max words }
  96. MaxInts = MaxBytes DIV SizeOf(Integer); { Max integers }
  97. MaxLongs = MaxBytes DIV SizeOf(LongInt); { Max longints }
  98. MaxPtrs = MaxBytes DIV SizeOf(Pointer); { Max pointers }
  99. MaxReals = MaxBytes DIV SizeOf(Real); { Max reals }
  100. MaxStr = MaxBytes DIV SizeOf(String); { Max strings }
  101. {***************************************************************************}
  102. { PUBLIC TYPE DEFINITIONS }
  103. {***************************************************************************}
  104. {---------------------------------------------------------------------------}
  105. { CPU TYPE DEFINITIONS }
  106. {---------------------------------------------------------------------------}
  107. TYPE
  108. {$IFDEF BIT_32} { 32 BIT CODE }
  109. CPUWord = Longint; { CPUWord is 32 bit }
  110. CPUInt = Longint; { CPUInt is 32 bit }
  111. {$ELSE} { 16 BIT CODE }
  112. CPUWord = Word; { CPUWord is 16 bit }
  113. CPUInt = Integer; { CPUInt is 16 bit }
  114. {$ENDIF}
  115. {---------------------------------------------------------------------------}
  116. { 16/32 BIT SWITCHED TYPE CONSTANTS }
  117. {---------------------------------------------------------------------------}
  118. TYPE
  119. {$IFDEF BIT_16} { 16 BIT DEFINITIONS }
  120. Sw_Word = Word; { Standard word }
  121. Sw_Integer = Integer; { Standard integer }
  122. {$ENDIF}
  123. {$IFDEF BIT_32} { 32 BIT DEFINITIONS }
  124. Sw_Word = LongInt; { Long integer now }
  125. Sw_Integer = LongInt; { Long integer now }
  126. {$ENDIF}
  127. {---------------------------------------------------------------------------}
  128. { POINTERS TO STANDARD DATA TYPES }
  129. {---------------------------------------------------------------------------}
  130. TYPE
  131. PByte = ^Byte; { Pointer to byte }
  132. PWord = ^Word; { Pointer to word }
  133. PLongint = ^Longint; { Pointer to longint }
  134. {---------------------------------------------------------------------------}
  135. { GENERAL ARRAYS }
  136. {---------------------------------------------------------------------------}
  137. TYPE
  138. TByteArray = ARRAY [0..MaxBytes-1] Of Byte; { Byte array }
  139. PByteArray = ^TByteArray; { Byte array pointer }
  140. TWordArray = ARRAY [0..MaxWords-1] Of Word; { Word array }
  141. PWordArray = ^TWordArray; { Word array pointer }
  142. TIntegerArray = ARRAY [0..MaxInts-1] Of Integer; { Integer array }
  143. PIntegerArray = ^TIntegerArray; { Integer array pointer }
  144. TLongIntArray = ARRAY [0..MaxLongs-1] Of LongInt; { LongInt array }
  145. PLongIntArray = ^TLongIntArray; { LongInt array pointer }
  146. TRealArray = Array [0..MaxReals-1] Of Real; { Real array }
  147. PRealarray = ^TRealArray; { Real array pointer }
  148. TPointerArray = Array [0..MaxPtrs-1] Of Pointer; { Pointer array }
  149. PPointerArray = ^TPointerArray; { Pointer array ptr }
  150. TStrArray = Array [0..MaxStr-1] Of String; { String array }
  151. PStrArray = ^TStrArray; { String array ptr }
  152. {***************************************************************************}
  153. { INTERFACE ROUTINES }
  154. {***************************************************************************}
  155. {-GetErrorCode-------------------------------------------------------
  156. Returns the last error code and resets ErrorCode to errOk.
  157. 07/12/97 Bazsi
  158. ---------------------------------------------------------------------}
  159. FUNCTION GetErrorCode: LongInt;
  160. {-GetErrorInfo-------------------------------------------------------
  161. Returns the info assigned to the previous error, doesn't reset the
  162. value to nil. Would usually only be called if ErrorCode <> errOk.
  163. 07/12/97 Bazsi
  164. ---------------------------------------------------------------------}
  165. FUNCTION GetErrorInfo: Pointer;
  166. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  167. { MASK CONTROL ROUTINES }
  168. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  169. {-SetWordMask--------------------------------------------------------
  170. Sets the bits provided in the mask word in the passed word variable.
  171. 20Sep99 LdB
  172. ---------------------------------------------------------------------}
  173. PROCEDURE SetWordMask (Var WordVar: Word; Mask: Word);
  174. {-SetWordMask--------------------------------------------------------
  175. Clears the bits provided in the mask word in the passed word variable.
  176. 20Sep99 LdB
  177. ---------------------------------------------------------------------}
  178. PROCEDURE ClrWordMask (Var WordVar: Word; Mask: Word);
  179. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  180. { MINIMUM AND MAXIMUM ROUTINES }
  181. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  182. {-MinimumOf----------------------------------------------------------
  183. Given two real numbers returns the minimum real of the two.
  184. 04Oct99 LdB
  185. ---------------------------------------------------------------------}
  186. FUNCTION MinimumOf (A, B: Real): Real;
  187. {-MaximumOf----------------------------------------------------------
  188. Given two real numbers returns the maximum real of the two.
  189. 04Oct99 LdB
  190. ---------------------------------------------------------------------}
  191. FUNCTION MaximumOf (A, B: Real): Real;
  192. {-MinIntegerOf-------------------------------------------------------
  193. Given two integer values returns the lowest integer of the two.
  194. 04Oct99 LdB
  195. ---------------------------------------------------------------------}
  196. FUNCTION MinIntegerOf (A, B: Integer): Integer;
  197. {-MaxIntegerof-------------------------------------------------------
  198. Given two integer values returns the biggest integer of the two.
  199. 04Oct99 LdB
  200. ---------------------------------------------------------------------}
  201. FUNCTION MaxIntegerOf (A, B: Integer): Integer;
  202. {-MinLongIntOf-------------------------------------------------------
  203. Given two long integers returns the minimum longint of the two.
  204. 04Oct99 LdB
  205. ---------------------------------------------------------------------}
  206. FUNCTION MinLongIntOf (A, B: LongInt): LongInt;
  207. {-MaxLongIntOf-------------------------------------------------------
  208. Given two long integers returns the maximum longint of the two.
  209. 04Oct99 LdB
  210. ---------------------------------------------------------------------}
  211. FUNCTION MaxLongIntOf (A, B: LongInt): LongInt;
  212. {$IFDEF PPC_DELPHI3} { DELPHI 3+ CODE }
  213. { ******************************* REMARK ****************************** }
  214. { Delphi 3+ does not define these standard routines so I have made }
  215. { some private functions here to complete compatability. }
  216. { ****************************** END REMARK *** Leon de Boer, 14Aug98 * }
  217. {-MemAvail-----------------------------------------------------------
  218. Returns the free memory available under Delphi 3+.
  219. 14Aug98 LdB
  220. ---------------------------------------------------------------------}
  221. FUNCTION MemAvail: LongInt;
  222. {-MaxAvail-----------------------------------------------------------
  223. Returns the max free memory block size available under Delphi 3+.
  224. 14Aug98 LdB
  225. ---------------------------------------------------------------------}
  226. FUNCTION MaxAvail: LongInt;
  227. {$ENDIF}
  228. {***************************************************************************}
  229. { INITIALIZED PUBLIC VARIABLES }
  230. {***************************************************************************}
  231. {---------------------------------------------------------------------------}
  232. { INITIALIZED DOS/DPMI/WIN/NT/OS2 VARIABLES }
  233. {---------------------------------------------------------------------------}
  234. CONST
  235. ErrorCode: Longint = errOk; { Last error code }
  236. ErrorInfo: Pointer = Nil; { Last error info }
  237. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  238. IMPLEMENTATION
  239. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  240. {$IFDEF PPC_DELPHI3} { DELPHI 3+ COMPILER }
  241. USES WinTypes, WinProcs; { Stardard units }
  242. {$ENDIF}
  243. {***************************************************************************}
  244. { INTERFACE ROUTINES }
  245. {***************************************************************************}
  246. {---------------------------------------------------------------------------}
  247. { GetErrorCode -> Platforms ALL - Updated 12Jul97 Bazsi }
  248. {---------------------------------------------------------------------------}
  249. FUNCTION GetErrorCode: LongInt;
  250. BEGIN
  251. GetErrorCode := ErrorCode; { Return last error }
  252. ErrorCode := 0; { Now clear errorcode }
  253. END;
  254. {---------------------------------------------------------------------------}
  255. { GetErrorInfo -> Platforms ALL - Updated 12Jul97 Bazsi }
  256. {---------------------------------------------------------------------------}
  257. FUNCTION GetErrorInfo: Pointer;
  258. BEGIN
  259. GetErrorInfo := ErrorInfo; { Return errorinfo ptr }
  260. END;
  261. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  262. { MASK CONTROL ROUTINES }
  263. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  264. {---------------------------------------------------------------------------}
  265. { SetWordMask -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Sep99 LdB }
  266. {---------------------------------------------------------------------------}
  267. PROCEDURE SetWordMask (Var WordVar: Word; Mask: Word);
  268. BEGIN
  269. WordVar := WordVar OR Mask; { Set the mask bits }
  270. END;
  271. {---------------------------------------------------------------------------}
  272. { ClrWordMask -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Sep99 LdB }
  273. {---------------------------------------------------------------------------}
  274. PROCEDURE ClrWordMask (Var WordVar: Word; Mask: Word);
  275. BEGIN
  276. WordVar := WordVar AND NOT Mask; { Clr the mask bits }
  277. END;
  278. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  279. { MINIMUM AND MAXIMUM ROUTINES }
  280. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  281. {---------------------------------------------------------------------------}
  282. { MinimumOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 04Oct99 LdB }
  283. {---------------------------------------------------------------------------}
  284. FUNCTION MinimumOf (A, B: Real): Real;
  285. BEGIN
  286. If (B < A) Then MinimumOf := B { B smaller take it }
  287. Else MinimumOf := A; { Else take A }
  288. END;
  289. {---------------------------------------------------------------------------}
  290. { MaximumOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 04Oct99 LdB }
  291. {---------------------------------------------------------------------------}
  292. FUNCTION MaximumOf (A, B: Real): Real;
  293. BEGIN
  294. If (B > A) Then MaximumOf := B { B bigger take it }
  295. Else MaximumOf := A; { Else take A }
  296. END;
  297. {---------------------------------------------------------------------------}
  298. { MinIntegerOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 04Oct99 LdB }
  299. {---------------------------------------------------------------------------}
  300. FUNCTION MinIntegerOf (A, B: Integer): Integer;
  301. BEGIN
  302. If (B < A) Then MinIntegerOf := B { B smaller take it }
  303. Else MinIntegerOf := A; { Else take A }
  304. END;
  305. {---------------------------------------------------------------------------}
  306. { MaxIntegerOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 04Oct99 LdB }
  307. {---------------------------------------------------------------------------}
  308. FUNCTION MaxIntegerOf (A, B: Integer): Integer;
  309. BEGIN
  310. If (B > A) Then MaxIntegerOf := B { B bigger take it }
  311. Else MaxIntegerOf := A; { Else take A }
  312. END;
  313. {---------------------------------------------------------------------------}
  314. { MinLongIntOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 04Oct99 LdB }
  315. {---------------------------------------------------------------------------}
  316. FUNCTION MinLongIntOf (A, B: LongInt): LongInt;
  317. BEGIN
  318. If (B < A) Then MinLongIntOf := B { B smaller take it }
  319. Else MinLongIntOf := A; { Else take A }
  320. END;
  321. {---------------------------------------------------------------------------}
  322. { MaxLongIntOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 04Oct99 LdB }
  323. {---------------------------------------------------------------------------}
  324. FUNCTION MaxLongIntOf (A, B: LongInt): LongInt;
  325. BEGIN
  326. If (B > A) Then MaxLongIntOf := B { B bigger take it }
  327. Else MaxLongIntOf := A; { Else take A }
  328. END;
  329. {$IFDEF PPC_DELPHI3} { DELPHI 3+ CODE }
  330. {---------------------------------------------------------------------------}
  331. { MemAvail -> Platforms WIN/NT - Updated 14Aug98 LdB }
  332. {---------------------------------------------------------------------------}
  333. FUNCTION MemAvail: LongInt;
  334. VAR Ms: TMemoryStatus;
  335. BEGIN
  336. GlobalMemoryStatus(Ms); { Get memory status }
  337. MemAvail := Ms.dwAvailPhys; { Avail physical memory }
  338. END;
  339. {---------------------------------------------------------------------------}
  340. { MaxAvail -> Platforms WIN/NT - Updated 14Aug98 LdB }
  341. {---------------------------------------------------------------------------}
  342. FUNCTION MaxAvail: LongInt;
  343. VAR Ms: TMemoryStatus;
  344. BEGIN
  345. GlobalMemoryStatus(Ms); { Get memory status }
  346. MaxAvail := Ms.dwTotalPhys; { Max physical memory }
  347. END;
  348. {$ENDIF}
  349. END.
  350. {
  351. $Log$
  352. Revision 1.2 2000-08-24 12:00:20 marco
  353. * CVS log and ID tags
  354. }