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