sysutils.pp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Florian Klaempfl
  5. member of the Free Pascal development team
  6. Sysutils unit for Go32v2
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit sysutils;
  14. interface
  15. {$MODE objfpc}
  16. { force ansistrings }
  17. {$H+}
  18. uses
  19. go32,dos;
  20. { Include platform independent interface part }
  21. {$i sysutilh.inc}
  22. implementation
  23. { Include platform independent implementation part }
  24. {$i sysutils.inc}
  25. {****************************************************************************
  26. File Functions
  27. ****************************************************************************}
  28. { some internal constants }
  29. const
  30. ofRead = $0000; { Open for reading }
  31. ofWrite = $0001; { Open for writing }
  32. ofReadWrite = $0002; { Open for reading/writing }
  33. faFail = $0000; { Fail if file does not exist }
  34. faCreate = $0010; { Create if file does not exist }
  35. faOpen = $0001; { Open if file exists }
  36. faOpenReplace = $0002; { Clear if file exists }
  37. Type
  38. PSearchrec = ^Searchrec;
  39. { converts S to a pchar and copies it to the transfer-buffer. }
  40. procedure StringToTB(const S: string);
  41. var
  42. P: pchar;
  43. Len: integer;
  44. begin
  45. Len := Length(S) + 1;
  46. P := StrPCopy(StrAlloc(Len), S);
  47. SysCopyToDos(longint(P), Len);
  48. StrDispose(P);
  49. end ;
  50. { Native OpenFile function.
  51. if return value <> 0 call failed. }
  52. function OpenFile(const FileName: string; var Handle: longint; Mode, Action: word): longint;
  53. var
  54. Regs: registers;
  55. begin
  56. result := 0;
  57. Handle := 0;
  58. StringToTB(FileName);
  59. if LFNSupport then Regs.Eax:=$716c
  60. else Regs.Eax:=$6c00;
  61. Regs.Edx := Action; { Action if file exists/not exists }
  62. Regs.Ds := tb_segment;
  63. Regs.Esi := tb_offset;
  64. Regs.Ebx := $2000 + (Mode and $ff); { file open mode }
  65. Regs.Ecx := $20; { Attributes }
  66. RealIntr($21, Regs);
  67. if Regs.Flags and CarryFlag <> 0 then result := Regs.Ax
  68. else Handle := Regs.Ax;
  69. end ;
  70. Function FileOpen (Const FileName : string; Mode : Integer) : Longint;
  71. var
  72. e: integer;
  73. Begin
  74. e := OpenFile(FileName, result, Mode, faOpen);
  75. if e <> 0 then
  76. result := -1;
  77. end;
  78. Function FileCreate (Const FileName : String) : Longint;
  79. var
  80. e: integer;
  81. begin
  82. e := OpenFile(FileName, result, ofReadWrite, faCreate or faOpenReplace);
  83. if e <> 0 then
  84. result := -1;
  85. end;
  86. Function FileCreate (Const FileName : String; Mode:longint) : Longint;
  87. begin
  88. FileCreate:=FileCreate(FileName);
  89. end;
  90. Function FileRead (Handle : Longint; Var Buffer; Count : longint) : Longint;
  91. var
  92. regs : registers;
  93. size,
  94. readsize : longint;
  95. begin
  96. readsize:=0;
  97. while Count > 0 do
  98. begin
  99. if Count>tb_size then
  100. size:=tb_size
  101. else
  102. size:=Count;
  103. regs.realecx:=size;
  104. regs.realedx:=tb_offset;
  105. regs.realds:=tb_segment;
  106. regs.realebx:=Handle;
  107. regs.realeax:=$3f00;
  108. RealIntr($21,regs);
  109. if (regs.realflags and carryflag) <> 0 then
  110. begin
  111. Result:=-1;
  112. exit;
  113. end;
  114. syscopyfromdos(Longint(@Buffer)+readsize,lo(regs.realeax));
  115. inc(readsize,lo(regs.realeax));
  116. dec(Count,lo(regs.realeax));
  117. { stop when not the specified size is read }
  118. if lo(regs.realeax)<size then
  119. break;
  120. end;
  121. Result:=readsize;
  122. end;
  123. Function FileWrite (Handle : Longint; const Buffer; Count : Longint) : Longint;
  124. var
  125. regs : registers;
  126. size,
  127. writesize : longint;
  128. begin
  129. writesize:=0;
  130. while Count > 0 do
  131. begin
  132. if Count>tb_size then
  133. size:=tb_size
  134. else
  135. size:=Count;
  136. syscopytodos(Longint(@Buffer)+writesize,size);
  137. regs.realecx:=size;
  138. regs.realedx:=tb_offset;
  139. regs.realds:=tb_segment;
  140. regs.realebx:=Handle;
  141. regs.realeax:=$4000;
  142. RealIntr($21,regs);
  143. if (regs.realflags and carryflag) <> 0 then
  144. begin
  145. Result:=-1;
  146. exit;
  147. end;
  148. inc(writesize,lo(regs.realeax));
  149. dec(Count,lo(regs.realeax));
  150. { stop when not the specified size is written }
  151. if lo(regs.realeax)<size then
  152. break;
  153. end;
  154. Result:=WriteSize;
  155. end;
  156. Function FileSeek (Handle, FOffset, Origin : Longint) : Longint;
  157. var
  158. Regs: registers;
  159. begin
  160. Regs.Eax := $4200;
  161. Regs.Al := Origin;
  162. Regs.Edx := Lo(FOffset);
  163. Regs.Ecx := Hi(FOffset);
  164. Regs.Ebx := Handle;
  165. RealIntr($21, Regs);
  166. if Regs.Flags and CarryFlag <> 0 then
  167. result := -1
  168. else begin
  169. LongRec(result).Lo := Regs.Ax;
  170. LongRec(result).Hi := Regs.Dx;
  171. end ;
  172. end;
  173. Function FileSeek (Handle : Longint; FOffset,Origin : Int64) : Int64;
  174. begin
  175. {$warning need to add 64bit call }
  176. FileSeek:=FileSeek(Handle,Longint(FOffset),Longint(Origin));
  177. end;
  178. Procedure FileClose (Handle : Longint);
  179. var
  180. Regs: registers;
  181. begin
  182. if Handle<=4 then
  183. exit;
  184. Regs.Eax := $3e00;
  185. Regs.Ebx := Handle;
  186. RealIntr($21, Regs);
  187. end;
  188. Function FileTruncate (Handle,Size: Longint) : boolean;
  189. var
  190. regs : trealregs;
  191. begin
  192. FileSeek(Handle,Size,0);
  193. Regs.realecx := 0;
  194. Regs.realedx := tb_offset;
  195. Regs.ds := tb_segment;
  196. Regs.ebx := Handle;
  197. Regs.eax:=$4000;
  198. RealIntr($21, Regs);
  199. FileTruncate:=(regs.realflags and carryflag)=0;
  200. end;
  201. Function FileAge (Const FileName : String): Longint;
  202. var Handle: longint;
  203. begin
  204. Handle := FileOpen(FileName, 0);
  205. if Handle <> -1 then
  206. begin
  207. result := FileGetDate(Handle);
  208. FileClose(Handle);
  209. end
  210. else
  211. result := -1;
  212. end;
  213. Function FileExists (Const FileName : String) : Boolean;
  214. Var
  215. Sr : Searchrec;
  216. begin
  217. DOS.FindFirst(FileName,$3f,sr);
  218. if DosError = 0 then
  219. begin
  220. { No volumeid,directory }
  221. Result:=(sr.attr and $18)=0;
  222. Dos.FindClose(sr);
  223. end
  224. else
  225. Result:=false;
  226. end;
  227. Function DirectoryExists (Const Directory : String) : Boolean;
  228. Var
  229. Sr : Searchrec;
  230. begin
  231. DOS.FindFirst(Directory,$3f,sr);
  232. if DosError = 0 then
  233. begin
  234. Result:=(sr.attr and $10)=$10;
  235. Dos.FindClose(sr);
  236. end
  237. else
  238. Result:=false;
  239. end;
  240. Function FindFirst (Const Path : String; Attr : Longint; Var Rslt : TSearchRec) : Longint;
  241. Var Sr : PSearchrec;
  242. begin
  243. //!! Sr := New(PSearchRec);
  244. getmem(sr,sizeof(searchrec));
  245. Rslt.FindHandle := longint(Sr);
  246. DOS.FindFirst(Path, Attr, Sr^);
  247. result := -DosError;
  248. if result = 0 then
  249. begin
  250. Rslt.Time := Sr^.Time;
  251. Rslt.Size := Sr^.Size;
  252. Rslt.Attr := Sr^.Attr;
  253. Rslt.ExcludeAttr := 0;
  254. Rslt.Name := Sr^.Name;
  255. end ;
  256. end;
  257. Function FindNext (Var Rslt : TSearchRec) : Longint;
  258. var
  259. Sr: PSearchRec;
  260. begin
  261. Sr := PSearchRec(Rslt.FindHandle);
  262. if Sr <> nil then
  263. begin
  264. DOS.FindNext(Sr^);
  265. result := -DosError;
  266. if result = 0 then
  267. begin
  268. Rslt.Time := Sr^.Time;
  269. Rslt.Size := Sr^.Size;
  270. Rslt.Attr := Sr^.Attr;
  271. Rslt.ExcludeAttr := 0;
  272. Rslt.Name := Sr^.Name;
  273. end;
  274. end;
  275. end;
  276. Procedure FindClose (Var F : TSearchrec);
  277. var
  278. Sr: PSearchRec;
  279. begin
  280. Sr := PSearchRec(F.FindHandle);
  281. if Sr <> nil then
  282. begin
  283. //!! Dispose(Sr);
  284. // This call is non dummy if LFNSupport is true PM
  285. DOS.FindClose(SR^);
  286. freemem(sr,sizeof(searchrec));
  287. end;
  288. F.FindHandle := 0;
  289. end;
  290. Function FileGetDate (Handle : Longint) : Longint;
  291. var
  292. Regs: registers;
  293. begin
  294. //!! for win95 an alternative function is available.
  295. Regs.Ebx := Handle;
  296. Regs.Eax := $5700;
  297. RealIntr($21, Regs);
  298. if Regs.Flags and CarryFlag <> 0 then
  299. result := -1
  300. else
  301. begin
  302. LongRec(result).Lo := Regs.cx;
  303. LongRec(result).Hi := Regs.dx;
  304. end ;
  305. end;
  306. Function FileSetDate (Handle, Age : Longint) : Longint;
  307. var
  308. Regs: registers;
  309. begin
  310. Regs.Ebx := Handle;
  311. Regs.Eax := $5701;
  312. Regs.Ecx := Lo(Age);
  313. Regs.Edx := Hi(Age);
  314. RealIntr($21, Regs);
  315. if Regs.Flags and CarryFlag <> 0 then
  316. result := -Regs.Ax
  317. else
  318. result := 0;
  319. end;
  320. Function FileGetAttr (Const FileName : String) : Longint;
  321. var
  322. Regs: registers;
  323. begin
  324. StringToTB(FileName);
  325. Regs.Edx := tb_offset;
  326. Regs.Ds := tb_segment;
  327. if LFNSupport then
  328. begin
  329. Regs.Ax := $7143;
  330. Regs.Bx := 0;
  331. end
  332. else
  333. Regs.Ax := $4300;
  334. RealIntr($21, Regs);
  335. if Regs.Flags and CarryFlag <> 0 then
  336. result := -1
  337. else
  338. result := Regs.Cx;
  339. end;
  340. Function FileSetAttr (Const Filename : String; Attr: longint) : Longint;
  341. var
  342. Regs: registers;
  343. begin
  344. StringToTB(FileName);
  345. Regs.Edx := tb_offset;
  346. Regs.Ds := tb_segment;
  347. if LFNSupport then
  348. begin
  349. Regs.Ax := $7143;
  350. Regs.Bx := 1;
  351. end
  352. else
  353. Regs.Ax := $4301;
  354. Regs.Cx := Attr;
  355. RealIntr($21, Regs);
  356. if Regs.Flags and CarryFlag <> 0 then
  357. result := -Regs.Ax
  358. else
  359. result := 0;
  360. end;
  361. Function DeleteFile (Const FileName : String) : Boolean;
  362. var
  363. Regs: registers;
  364. begin
  365. StringToTB(FileName);
  366. Regs.Edx := tb_offset;
  367. Regs.Ds := tb_segment;
  368. if LFNSupport then
  369. Regs.Eax := $7141
  370. else
  371. Regs.Eax := $4100;
  372. Regs.Esi := 0;
  373. Regs.Ecx := 0;
  374. RealIntr($21, Regs);
  375. result := (Regs.Flags and CarryFlag = 0);
  376. end;
  377. Function RenameFile (Const OldName, NewName : String) : Boolean;
  378. var
  379. Regs: registers;
  380. begin
  381. StringToTB(OldName + #0 + NewName);
  382. Regs.Edx := tb_offset;
  383. Regs.Ds := tb_segment;
  384. Regs.Edi := tb_offset + Length(OldName) + 1;
  385. Regs.Es := tb_segment;
  386. if LFNSupport then
  387. Regs.Eax := $7156
  388. else
  389. Regs.Eax := $5600;
  390. Regs.Ecx := $ff;
  391. RealIntr($21, Regs);
  392. result := (Regs.Flags and CarryFlag = 0);
  393. end;
  394. {****************************************************************************
  395. Disk Functions
  396. ****************************************************************************}
  397. TYPE ExtendedFat32FreeSpaceRec=packed Record
  398. RetSize : WORD; { (ret) size of returned structure}
  399. Strucversion : WORD; {(call) structure version (0000h)
  400. (ret) actual structure version (0000h)}
  401. SecPerClus, {number of sectors per cluster}
  402. BytePerSec, {number of bytes per sector}
  403. AvailClusters, {number of available clusters}
  404. TotalClusters, {total number of clusters on the drive}
  405. AvailPhysSect, {physical sectors available on the drive}
  406. TotalPhysSect, {total physical sectors on the drive}
  407. AvailAllocUnits, {Available allocation units}
  408. TotalAllocUnits : DWORD; {Total allocation units}
  409. Dummy,Dummy2 : DWORD; {8 bytes reserved}
  410. END;
  411. function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
  412. VAR S : String;
  413. Rec : ExtendedFat32FreeSpaceRec;
  414. regs : registers;
  415. BEGIN
  416. if (swap(dosversion)>=$070A) AND LFNSupport then
  417. begin
  418. DosError:=0;
  419. S:='C:\'#0;
  420. if Drive=0 then
  421. begin
  422. GetDir(Drive,S);
  423. Setlength(S,4);
  424. S[4]:=#0;
  425. end
  426. else
  427. S[1]:=chr(Drive+64);
  428. Rec.Strucversion:=0;
  429. dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
  430. dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
  431. regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
  432. regs.ds:=tb_segment;
  433. regs.di:=tb_offset;
  434. regs.es:=tb_segment;
  435. regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec);
  436. regs.ax:=$7303;
  437. msdos(regs);
  438. if regs.ax<>$ffff then
  439. begin
  440. copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
  441. if Free then
  442. Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
  443. else
  444. Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec;
  445. end
  446. else
  447. Do_DiskData:=-1;
  448. end
  449. else
  450. begin
  451. DosError:=0;
  452. regs.dl:=drive;
  453. regs.ah:=$36;
  454. msdos(regs);
  455. if regs.ax<>$FFFF then
  456. begin
  457. if Free then
  458. Do_DiskData:=int64(regs.ax)*regs.bx*regs.cx
  459. else
  460. Do_DiskData:=int64(regs.ax)*regs.cx*regs.dx;
  461. end
  462. else
  463. do_diskdata:=-1;
  464. end;
  465. end;
  466. function diskfree(drive : byte) : int64;
  467. begin
  468. diskfree:=Do_DiskData(drive,TRUE);
  469. end;
  470. function disksize(drive : byte) : int64;
  471. begin
  472. disksize:=Do_DiskData(drive,false);
  473. end;
  474. Function GetCurrentDir : String;
  475. begin
  476. GetDir(0, result);
  477. end;
  478. Function SetCurrentDir (Const NewDir : String) : Boolean;
  479. begin
  480. {$I-}
  481. ChDir(NewDir);
  482. {$I+}
  483. result := (IOResult = 0);
  484. end;
  485. Function CreateDir (Const NewDir : String) : Boolean;
  486. begin
  487. {$I-}
  488. MkDir(NewDir);
  489. {$I+}
  490. result := (IOResult = 0);
  491. end;
  492. Function RemoveDir (Const Dir : String) : Boolean;
  493. begin
  494. {$I-}
  495. RmDir(Dir);
  496. {$I+}
  497. result := (IOResult = 0);
  498. end;
  499. {****************************************************************************
  500. Time Functions
  501. ****************************************************************************}
  502. Procedure GetLocalTime(var SystemTime: TSystemTime);
  503. var
  504. Regs: Registers;
  505. begin
  506. Regs.ah := $2C;
  507. RealIntr($21, Regs);
  508. SystemTime.Hour := Regs.Ch;
  509. SystemTime.Minute := Regs.Cl;
  510. SystemTime.Second := Regs.Dh;
  511. SystemTime.MilliSecond := Regs.Dl*10;
  512. Regs.ah := $2A;
  513. RealIntr($21, Regs);
  514. SystemTime.Year := Regs.Cx;
  515. SystemTime.Month := Regs.Dh;
  516. SystemTime.Day := Regs.Dl;
  517. end ;
  518. {****************************************************************************
  519. Misc Functions
  520. ****************************************************************************}
  521. procedure Beep;
  522. begin
  523. end;
  524. {****************************************************************************
  525. Locale Functions
  526. ****************************************************************************}
  527. { Codepage constants }
  528. const
  529. CP_US = 437;
  530. CP_MultiLingual = 850;
  531. CP_SlavicLatin2 = 852;
  532. CP_Turkish = 857;
  533. CP_Portugal = 860;
  534. CP_IceLand = 861;
  535. CP_Canada = 863;
  536. CP_NorwayDenmark = 865;
  537. { CountryInfo }
  538. type
  539. TCountryInfo = packed record
  540. InfoId: byte;
  541. case integer of
  542. 1: ( Size: word;
  543. CountryId: word;
  544. CodePage: word;
  545. CountryInfo: array[0..33] of byte );
  546. 2: ( UpperCaseTable: longint );
  547. 4: ( FilenameUpperCaseTable: longint );
  548. 5: ( FilecharacterTable: longint );
  549. 6: ( CollatingTable: longint );
  550. 7: ( DBCSLeadByteTable: longint );
  551. end ;
  552. procedure GetExtendedCountryInfo(InfoId: integer; CodePage, CountryId: word; var CountryInfo: TCountryInfo);
  553. Var Regs: Registers;
  554. begin
  555. Regs.AH := $65;
  556. Regs.AL := InfoId;
  557. Regs.BX := CodePage;
  558. Regs.DX := CountryId;
  559. Regs.ES := transfer_buffer div 16;
  560. Regs.DI := transfer_buffer and 15;
  561. Regs.CX := SizeOf(TCountryInfo);
  562. RealIntr($21, Regs);
  563. DosMemGet(transfer_buffer div 16,
  564. transfer_buffer and 15,
  565. CountryInfo, Regs.CX );
  566. end;
  567. procedure InitAnsi;
  568. var
  569. CountryInfo: TCountryInfo; i: integer;
  570. begin
  571. { Fill table entries 0 to 127 }
  572. for i := 0 to 96 do
  573. UpperCaseTable[i] := chr(i);
  574. for i := 97 to 122 do
  575. UpperCaseTable[i] := chr(i - 32);
  576. for i := 123 to 127 do
  577. UpperCaseTable[i] := chr(i);
  578. for i := 0 to 64 do
  579. LowerCaseTable[i] := chr(i);
  580. for i := 65 to 90 do
  581. LowerCaseTable[i] := chr(i + 32);
  582. for i := 91 to 255 do
  583. LowerCaseTable[i] := chr(i);
  584. { Get country and codepage info }
  585. GetExtendedCountryInfo(1, $FFFF, $FFFF, CountryInfo);
  586. if CountryInfo.CodePage = 850 then
  587. begin
  588. { Special, known case }
  589. Move(CP850UCT, UpperCaseTable[128], 128);
  590. Move(CP850LCT, LowerCaseTable[128], 128);
  591. end
  592. else
  593. begin
  594. { this needs to be checked !!
  595. this is correct only if UpperCaseTable is
  596. and Offset:Segment word record (PM) }
  597. { get the uppercase table from dosmemory }
  598. GetExtendedCountryInfo(2, $FFFF, $FFFF, CountryInfo);
  599. DosMemGet(CountryInfo.UpperCaseTable shr 16, 2 + CountryInfo.UpperCaseTable and 65535, UpperCaseTable[128], 128);
  600. for i := 128 to 255 do
  601. begin
  602. if UpperCaseTable[i] <> chr(i) then
  603. LowerCaseTable[ord(UpperCaseTable[i])] := chr(i);
  604. end;
  605. end;
  606. end;
  607. Procedure InitInternational;
  608. begin
  609. InitAnsi;
  610. end;
  611. function SysErrorMessage(ErrorCode: Integer): String;
  612. begin
  613. Result:=Format(SUnknownErrorCode,[ErrorCode]);
  614. end;
  615. {****************************************************************************
  616. Os utils
  617. ****************************************************************************}
  618. Function GetEnvironmentVariable(Const EnvVar : String) : String;
  619. var
  620. hp : ppchar;
  621. lenvvar,hs : string;
  622. eqpos : longint;
  623. begin
  624. lenvvar:=upcase(envvar);
  625. hp:=envp;
  626. Result:='';
  627. while assigned(hp^) do
  628. begin
  629. hs:=strpas(hp^);
  630. eqpos:=pos('=',hs);
  631. if upcase(copy(hs,1,eqpos-1))=lenvvar then
  632. begin
  633. Result:=copy(hs,eqpos+1,length(hs)-eqpos);
  634. exit;
  635. end;
  636. inc(hp);
  637. end;
  638. end;
  639. {****************************************************************************
  640. Initialization code
  641. ****************************************************************************}
  642. Initialization
  643. InitExceptions; { Initialize exceptions. OS independent }
  644. InitInternational; { Initialize internationalization settings }
  645. Finalization
  646. DoneExceptions;
  647. end.
  648. {
  649. $Log$
  650. Revision 1.17 2003-10-25 23:42:35 hajny
  651. * THandle in sysutils common using System.THandle
  652. Revision 1.16 2003/06/03 07:54:27 michael
  653. + Patch from Peter for millisecond timing
  654. Revision 1.15 2003/04/02 15:18:28 peter
  655. * fix argument names
  656. Revision 1.14 2003/04/01 15:57:41 peter
  657. * made THandle platform dependent and unique type
  658. Revision 1.13 2003/03/29 18:21:42 hajny
  659. * DirectoryExists declaration changed to that one from fixes branch
  660. Revision 1.12 2003/03/28 19:06:59 peter
  661. * directoryexists added
  662. Revision 1.11 2003/01/03 20:41:04 peter
  663. * FileCreate(string,mode) overload added
  664. Revision 1.10 2002/09/07 16:01:19 peter
  665. * old logs removed and tabs fixed
  666. Revision 1.9 2002/05/09 08:42:24 carl
  667. * Merges from Fixes branch
  668. Revision 1.8 2002/01/25 16:23:03 peter
  669. * merged filesearch() fix
  670. Revision 1.7 2002/01/19 11:57:55 peter
  671. * merged fixes
  672. }