sysutils.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  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 OS/2
  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. doscalls,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. {This is the correct way to call external assembler procedures.}
  29. procedure syscall;external name '___SYSCALL';
  30. const
  31. ofRead = $0000; {Open for reading}
  32. ofWrite = $0001; {Open for writing}
  33. ofReadWrite = $0002; {Open for reading/writing}
  34. doDenyRW = $0010; {DenyAll (no sharing)}
  35. faCreateNew = $00010000; {Create if file does not exist}
  36. faOpenReplace = $00040000; {Truncate if file exists}
  37. faCreate = $00050000; {Create if file does not exist, truncate otherwise}
  38. {$ASMMODE INTEL}
  39. function FileOpen (const FileName: string; Mode: integer): longint;
  40. {$IFOPT H+}
  41. assembler;
  42. {$ELSE}
  43. var FN: string;
  44. begin
  45. FN := FileName + #0;
  46. {$ENDIF}
  47. asm
  48. mov eax, Mode
  49. (* DenyAll if sharing not specified. *)
  50. test eax, 112
  51. jnz @FOpen1
  52. or eax, 16
  53. @FOpen1:
  54. mov ecx, eax
  55. mov eax, 7F2Bh
  56. {$IFOPT H+}
  57. mov edx, FileName
  58. {$ELSE}
  59. lea edx, FN
  60. inc edx
  61. {$ENDIF}
  62. call syscall
  63. {$IFOPT H-}
  64. mov [ebp - 4], eax
  65. end;
  66. {$ENDIF}
  67. end;
  68. function FileCreate (const FileName: string): longint;
  69. {$IFOPT H+}
  70. assembler;
  71. {$ELSE}
  72. var FN: string;
  73. begin
  74. FN := FileName + #0;
  75. {$ENDIF}
  76. asm
  77. mov eax, 7F2Bh
  78. mov ecx, ofReadWrite or faCreate or doDenyRW (* Sharing to DenyAll *)
  79. {$IFOPT H+}
  80. mov edx, FileName
  81. {$ELSE}
  82. lea edx, FN
  83. inc edx
  84. {$ENDIF}
  85. call syscall
  86. {$IFOPT H-}
  87. mov [ebp - 4], eax
  88. end;
  89. {$ENDIF}
  90. end;
  91. function FileRead (Handle: longint; var Buffer; Count: longint): longint;
  92. assembler;
  93. asm
  94. mov eax, 3F00h
  95. mov ebx, Handle
  96. mov ecx, Count
  97. mov edx, Buffer
  98. call syscall
  99. jnc @FReadEnd
  100. mov eax, -1
  101. @FReadEnd:
  102. end;
  103. function FileWrite (Handle: longint; const Buffer; Count: longint): longint;
  104. assembler;
  105. asm
  106. mov eax, 4000h
  107. mov ebx, Handle
  108. mov ecx, Count
  109. mov edx, Buffer
  110. call syscall
  111. jnc @FWriteEnd
  112. mov eax, -1
  113. @FWriteEnd:
  114. end;
  115. function FileSeek (Handle, FOffset, Origin: longint): longint; assembler;
  116. asm
  117. mov eax, Origin
  118. mov ah, 42h
  119. mov ebx, Handle
  120. mov edx, FOffset
  121. call syscall
  122. jnc @FSeekEnd
  123. mov eax, -1
  124. @FSeekEnd:
  125. end;
  126. Function FileSeek (Handle : Longint; FOffset,Origin : Int64) : Int64;
  127. begin
  128. {$warning need to add 64bit call }
  129. Result:=FileSeek(Handle,Longint(Foffset),Longint(Origin));
  130. end;
  131. procedure FileClose (Handle: longint);
  132. begin
  133. if (Handle <= 4) or (os_mode = osOS2) and (Handle <= 2) then
  134. asm
  135. mov eax, 3E00h
  136. mov ebx, Handle
  137. call syscall
  138. end;
  139. end;
  140. function FileTruncate (Handle, Size: longint): boolean; assembler;
  141. asm
  142. mov eax, 7F25h
  143. mov ebx, Handle
  144. mov edx, Size
  145. call syscall
  146. jc @FTruncEnd
  147. mov eax, 4202h
  148. mov ebx, Handle
  149. mov edx, 0
  150. call syscall
  151. mov eax, 0
  152. jnc @FTruncEnd
  153. dec eax
  154. @FTruncEnd:
  155. end;
  156. function FileAge (const FileName: string): longint;
  157. var Handle: longint;
  158. begin
  159. Handle := FileOpen (FileName, 0);
  160. if Handle <> -1 then
  161. begin
  162. Result := FileGetDate (Handle);
  163. FileClose (Handle);
  164. end
  165. else
  166. Result := -1;
  167. end;
  168. function FileExists (const FileName: string): boolean;
  169. {$IFOPT H+}
  170. assembler;
  171. {$ELSE}
  172. var FN: string;
  173. begin
  174. FN := FileName + #0;
  175. {$ENDIF}
  176. asm
  177. mov ax, 4300h
  178. {$IFOPT H+}
  179. mov edx, FileName
  180. {$ELSE}
  181. lea edx, FN
  182. inc edx
  183. {$ENDIF}
  184. call syscall
  185. mov eax, 0
  186. jc @FExistsEnd
  187. test cx, 18h
  188. jnz @FExistsEnd
  189. inc eax
  190. @FExistsEnd:
  191. {$IFOPT H-}
  192. end;
  193. {$ENDIF}
  194. end;
  195. type TRec = record
  196. T, D: word;
  197. end;
  198. PSearchRec = ^SearchRec;
  199. function FindFirst (const Path: string; Attr: longint; var Rslt: TSearchRec): longint;
  200. var SR: PSearchRec;
  201. FStat: PFileFindBuf3;
  202. Count: longint;
  203. Err: longint;
  204. begin
  205. if os_mode = osOS2 then
  206. begin
  207. New (FStat);
  208. Rslt.FindHandle := $FFFFFFFF;
  209. Count := 1;
  210. Err := DosFindFirst (Path, Rslt.FindHandle, Attr, FStat,
  211. SizeOf (FStat^), Count, ilStandard);
  212. if (Err = 0) and (Count = 0) then Err := 18;
  213. FindFirst := -Err;
  214. if Err = 0 then
  215. begin
  216. Rslt.Name := FStat^.Name;
  217. Rslt.Size := FStat^.FileSize;
  218. Rslt.Attr := FStat^.AttrFile;
  219. Rslt.ExcludeAttr := 0;
  220. TRec (Rslt.Time).T := FStat^.TimeLastWrite;
  221. TRec (Rslt.Time).D := FStat^.DateLastWrite;
  222. end;
  223. Dispose (FStat);
  224. end
  225. else
  226. begin
  227. GetMem (SR, SizeOf (SearchRec));
  228. Rslt.FindHandle := longint(SR);
  229. DOS.FindFirst (Path, Attr, SR^);
  230. FindFirst := -DosError;
  231. if DosError = 0 then
  232. begin
  233. Rslt.Time := SR^.Time;
  234. Rslt.Size := SR^.Size;
  235. Rslt.Attr := SR^.Attr;
  236. Rslt.ExcludeAttr := 0;
  237. Rslt.Name := SR^.Name;
  238. end;
  239. end;
  240. end;
  241. function FindNext (var Rslt: TSearchRec): longint;
  242. var SR: PSearchRec;
  243. FStat: PFileFindBuf3;
  244. Count: longint;
  245. Err: longint;
  246. begin
  247. if os_mode = osOS2 then
  248. begin
  249. New (FStat);
  250. Count := 1;
  251. Err := DosFindNext (Rslt.FindHandle, FStat, SizeOf (FStat), Count);
  252. if (Err = 0) and (Count = 0) then Err := 18;
  253. FindNext := -Err;
  254. if Err = 0 then
  255. begin
  256. Rslt.Name := FStat^.Name;
  257. Rslt.Size := FStat^.FileSize;
  258. Rslt.Attr := FStat^.AttrFile;
  259. Rslt.ExcludeAttr := 0;
  260. TRec (Rslt.Time).T := FStat^.TimeLastWrite;
  261. TRec (Rslt.Time).D := FStat^.DateLastWrite;
  262. end;
  263. Dispose (FStat);
  264. end
  265. else
  266. begin
  267. SR := PSearchRec (Rslt.FindHandle);
  268. if SR <> nil then
  269. begin
  270. DOS.FindNext (SR^);
  271. FindNext := -DosError;
  272. if DosError = 0 then
  273. begin
  274. Rslt.Time := SR^.Time;
  275. Rslt.Size := SR^.Size;
  276. Rslt.Attr := SR^.Attr;
  277. Rslt.ExcludeAttr := 0;
  278. Rslt.Name := SR^.Name;
  279. end;
  280. end;
  281. end;
  282. end;
  283. procedure FindClose (var F: TSearchrec);
  284. var SR: PSearchRec;
  285. begin
  286. if os_mode = osOS2 then
  287. begin
  288. DosFindClose (F.FindHandle);
  289. end
  290. else
  291. begin
  292. SR := PSearchRec (F.FindHandle);
  293. DOS.FindClose (SR^);
  294. FreeMem (SR, SizeOf (SearchRec));
  295. end;
  296. F.FindHandle := 0;
  297. end;
  298. function FileGetDate (Handle: longint): longint; assembler;
  299. asm
  300. mov ax, 5700h
  301. mov ebx, Handle
  302. call syscall
  303. mov eax, -1
  304. jc @FGetDateEnd
  305. mov ax, dx
  306. shld eax, ecx, 16
  307. @FGetDateEnd:
  308. end;
  309. function FileSetDate (Handle, Age: longint): longint;
  310. var FStat: PFileStatus0;
  311. RC: longint;
  312. begin
  313. if os_mode = osOS2 then
  314. begin
  315. New (FStat);
  316. RC := DosQueryFileInfo (Handle, ilStandard, FStat,
  317. SizeOf (FStat^));
  318. if RC <> 0 then
  319. FileSetDate := -1
  320. else
  321. begin
  322. FStat^.DateLastAccess := Hi (Age);
  323. FStat^.DateLastWrite := Hi (Age);
  324. FStat^.TimeLastAccess := Lo (Age);
  325. FStat^.TimeLastWrite := Lo (Age);
  326. RC := DosSetFileInfo (Handle, ilStandard, FStat,
  327. SizeOf (FStat^));
  328. if RC <> 0 then
  329. FileSetDate := -1
  330. else
  331. FileSetDate := 0;
  332. end;
  333. Dispose (FStat);
  334. end
  335. else
  336. asm
  337. mov ax, 5701h
  338. mov ebx, Handle
  339. mov cx, word ptr [Age]
  340. mov dx, word ptr [Age + 2]
  341. call syscall
  342. jnc @FSetDateEnd
  343. mov eax, -1
  344. @FSetDateEnd:
  345. mov [ebp - 4], eax
  346. end;
  347. end;
  348. function FileGetAttr (const FileName: string): longint;
  349. {$IFOPT H+}
  350. assembler;
  351. {$ELSE}
  352. var FN: string;
  353. begin
  354. FN := FileName + #0;
  355. {$ENDIF}
  356. asm
  357. mov ax, 4300h
  358. {$IFOPT H+}
  359. mov edx, FileName
  360. {$ELSE}
  361. lea edx, FN
  362. inc edx
  363. {$ENDIF}
  364. call syscall
  365. jnc @FGetAttrEnd
  366. mov eax, -1
  367. @FGetAttrEnd:
  368. {$IFOPT H-}
  369. mov [ebp - 4], eax
  370. end;
  371. {$ENDIF}
  372. end;
  373. function FileSetAttr (const Filename: string; Attr: longint): longint;
  374. {$IFOPT H+}
  375. assembler;
  376. {$ELSE}
  377. var FN: string;
  378. begin
  379. FN := FileName + #0;
  380. {$ENDIF}
  381. asm
  382. mov ax, 4301h
  383. mov ecx, Attr
  384. {$IFOPT H+}
  385. mov edx, FileName
  386. {$ELSE}
  387. lea edx, FN
  388. inc edx
  389. {$ENDIF}
  390. call syscall
  391. mov eax, 0
  392. jnc @FSetAttrEnd
  393. mov eax, -1
  394. @FSetAttrEnd:
  395. {$IFOPT H-}
  396. mov [ebp - 4], eax
  397. end;
  398. {$ENDIF}
  399. end;
  400. function DeleteFile (const FileName: string): boolean;
  401. {$IFOPT H+}
  402. assembler;
  403. {$ELSE}
  404. var FN: string;
  405. begin
  406. FN := FileName + #0;
  407. {$ENDIF}
  408. asm
  409. mov ax, 4100h
  410. {$IFOPT H+}
  411. mov edx, FileName
  412. {$ELSE}
  413. lea edx, FN
  414. inc edx
  415. {$ENDIF}
  416. call syscall
  417. mov eax, 0
  418. jc @FDeleteEnd
  419. inc eax
  420. @FDeleteEnd:
  421. {$IFOPT H-}
  422. mov [ebp - 4], eax
  423. end;
  424. {$ENDIF}
  425. end;
  426. function RenameFile (const OldName, NewName: string): boolean;
  427. {$IFOPT H+}
  428. assembler;
  429. {$ELSE}
  430. var FN1, FN2: string;
  431. begin
  432. FN1 := OldName + #0;
  433. FN2 := NewName + #0;
  434. {$ENDIF}
  435. asm
  436. mov ax, 5600h
  437. {$IFOPT H+}
  438. mov edx, OldName
  439. mov edi, NewName
  440. {$ELSE}
  441. lea edx, FN1
  442. inc edx
  443. lea edi, FN2
  444. inc edi
  445. {$ENDIF}
  446. call syscall
  447. mov eax, 0
  448. jc @FRenameEnd
  449. inc eax
  450. @FRenameEnd:
  451. {$IFOPT H-}
  452. mov [ebp - 4], eax
  453. end;
  454. {$ENDIF}
  455. end;
  456. function FileSearch (const Name, DirList: string): string;
  457. begin
  458. Result := Dos.FSearch (Name, DirList);
  459. end;
  460. {****************************************************************************
  461. Disk Functions
  462. ****************************************************************************}
  463. {$ASMMODE ATT}
  464. function DiskFree (Drive: byte): int64;
  465. var FI: TFSinfo;
  466. RC: longint;
  467. begin
  468. if (os_mode = osDOS) or (os_mode = osDPMI) then
  469. {Function 36 is not supported in OS/2.}
  470. asm
  471. movb Drive,%dl
  472. movb $0x36,%ah
  473. call syscall
  474. cmpw $-1,%ax
  475. je .LDISKFREE1
  476. mulw %cx
  477. mulw %bx
  478. shll $16,%edx
  479. movw %ax,%dx
  480. movl $0,%eax
  481. xchgl %edx,%eax
  482. leave
  483. ret
  484. .LDISKFREE1:
  485. cltd
  486. leave
  487. ret
  488. end
  489. else
  490. {In OS/2, we use the filesystem information.}
  491. begin
  492. RC := DosQueryFSInfo (Drive, 1, FI, SizeOf (FI));
  493. if RC = 0 then
  494. DiskFree := int64 (FI.Free_Clusters) *
  495. int64 (FI.Sectors_Per_Cluster) * int64 (FI.Bytes_Per_Sector)
  496. else
  497. DiskFree := -1;
  498. end;
  499. end;
  500. function DiskSize (Drive: byte): int64;
  501. var FI: TFSinfo;
  502. RC: longint;
  503. begin
  504. if (os_mode = osDOS) or (os_mode = osDPMI) then
  505. {Function 36 is not supported in OS/2.}
  506. asm
  507. movb Drive,%dl
  508. movb $0x36,%ah
  509. call syscall
  510. movw %dx,%bx
  511. cmpw $-1,%ax
  512. je .LDISKSIZE1
  513. mulw %cx
  514. mulw %bx
  515. shll $16,%edx
  516. movw %ax,%dx
  517. movl $0,%eax
  518. xchgl %edx,%eax
  519. leave
  520. ret
  521. .LDISKSIZE1:
  522. cltd
  523. leave
  524. ret
  525. end
  526. else
  527. {In OS/2, we use the filesystem information.}
  528. begin
  529. RC := DosQueryFSinfo (Drive, 1, FI, SizeOf (FI));
  530. if RC = 0 then
  531. DiskSize := int64 (FI.Total_Clusters) *
  532. int64 (FI.Sectors_Per_Cluster) * int64 (FI.Bytes_Per_Sector)
  533. else
  534. DiskSize := -1;
  535. end;
  536. end;
  537. function GetCurrentDir: string;
  538. begin
  539. GetDir (0, Result);
  540. end;
  541. function SetCurrentDir (const NewDir: string): boolean;
  542. begin
  543. {$I-}
  544. ChDir (NewDir);
  545. Result := (IOResult = 0);
  546. {$I+}
  547. end;
  548. function CreateDir (const NewDir: string): boolean;
  549. begin
  550. {$I-}
  551. MkDir (NewDir);
  552. Result := (IOResult = 0);
  553. {$I+}
  554. end;
  555. function RemoveDir (const Dir: string): boolean;
  556. begin
  557. {$I-}
  558. RmDir (Dir);
  559. Result := (IOResult = 0);
  560. {$I+}
  561. end;
  562. {****************************************************************************
  563. Time Functions
  564. ****************************************************************************}
  565. {$asmmode intel}
  566. procedure GetLocalTime (var SystemTime: TSystemTime); assembler;
  567. asm
  568. (* Expects the default record alignment (word)!!! *)
  569. mov ah, 2Ah
  570. call syscall
  571. mov edi, SystemTime
  572. mov ax, cx
  573. stosw
  574. xor eax, eax
  575. mov al, dl
  576. shl eax, 16
  577. mov al, dh
  578. stosd
  579. push edi
  580. mov ah, 2Ch
  581. call syscall
  582. pop edi
  583. xor eax, eax
  584. mov al, cl
  585. shl eax, 16
  586. mov al, ch
  587. stosd
  588. mov al, dl
  589. shl eax, 16
  590. mov al, dh
  591. stosd
  592. end;
  593. {$asmmode default}
  594. {****************************************************************************
  595. Misc Functions
  596. ****************************************************************************}
  597. procedure Beep;
  598. begin
  599. end;
  600. {****************************************************************************
  601. Locale Functions
  602. ****************************************************************************}
  603. procedure InitAnsi;
  604. var I: byte;
  605. Country: TCountryCode;
  606. begin
  607. for I := 0 to 255 do
  608. UpperCaseTable [I] := Chr (I);
  609. Move (UpperCaseTable, LowerCaseTable, SizeOf (UpperCaseTable));
  610. if os_mode = osOS2 then
  611. begin
  612. FillChar (Country, SizeOf (Country), 0);
  613. DosMapCase (SizeOf (UpperCaseTable), Country, @UpperCaseTable);
  614. end
  615. else
  616. begin
  617. (* !!! TODO: DOS/DPMI mode support!!! *)
  618. end;
  619. for I := 0 to 255 do
  620. if UpperCaseTable [I] <> Chr (I) then
  621. LowerCaseTable [Ord (UpperCaseTable [I])] := Chr (I);
  622. end;
  623. procedure InitInternational;
  624. var Country: TCountryCode;
  625. CtryInfo: TCountryInfo;
  626. Size: longint;
  627. RC: longint;
  628. begin
  629. Size := 0;
  630. FillChar (Country, SizeOf (Country), 0);
  631. FillChar (CtryInfo, SizeOf (CtryInfo), 0);
  632. RC := DosQueryCtryInfo (SizeOf (CtryInfo), Country, CtryInfo, Size);
  633. if RC = 0 then
  634. begin
  635. DateSeparator := CtryInfo.DateSeparator;
  636. case CtryInfo.DateFormat of
  637. 1: begin
  638. ShortDateFormat := 'd/m/y';
  639. LongDateFormat := 'dd" "mmmm" "yyyy';
  640. end;
  641. 2: begin
  642. ShortDateFormat := 'y/m/d';
  643. LongDateFormat := 'yyyy" "mmmm" "dd';
  644. end;
  645. 3: begin
  646. ShortDateFormat := 'm/d/y';
  647. LongDateFormat := 'mmmm" "dd" "yyyy';
  648. end;
  649. end;
  650. TimeSeparator := CtryInfo.TimeSeparator;
  651. DecimalSeparator := CtryInfo.DecimalSeparator;
  652. ThousandSeparator := CtryInfo.ThousandSeparator;
  653. CurrencyFormat := CtryInfo.CurrencyFormat;
  654. CurrencyString := PChar (CtryInfo.CurrencyUnit);
  655. end;
  656. InitAnsi;
  657. end;
  658. function SysErrorMessage(ErrorCode: Integer): String;
  659. begin
  660. Result:=Format(SUnknownErrorCode,[ErrorCode]);
  661. end;
  662. {****************************************************************************
  663. OS Utils
  664. ****************************************************************************}
  665. Function GetEnvironmentVariable(Const EnvVar : String) : String;
  666. var P: PChar;
  667. begin
  668. if DosScanEnv (PChar (EnvVar), P) = 0
  669. then GetEnvironmentVariable := StrPas (P)
  670. else GetEnvironmentVariable := '';
  671. end;
  672. {****************************************************************************
  673. Initialization code
  674. ****************************************************************************}
  675. Initialization
  676. InitExceptions; { Initialize exceptions. OS independent }
  677. InitInternational; { Initialize internationalization settings }
  678. Finalization
  679. DoneExceptions;
  680. end.
  681. {
  682. $Log$
  683. Revision 1.13 2001-10-25 21:23:49 peter
  684. * added 64bit fileseek
  685. Revision 1.12 2001/06/03 15:18:01 peter
  686. * eoutofmemory and einvalidpointer fix
  687. Revision 1.11 2001/05/21 20:50:19 hajny
  688. * silly mistyping corrected
  689. Revision 1.10 2001/05/20 18:40:33 hajny
  690. * merging Carl's fixes from the fixes branch
  691. Revision 1.9 2001/02/21 21:23:38 hajny
  692. * GetEnvironmentVariable now really merged
  693. Revision 1.8 2001/02/20 22:14:19 peter
  694. * merged getenvironmentvariable
  695. Revision 1.7 2001/01/13 11:10:59 hajny
  696. * FileCreate and GetLocalTime fixed
  697. Revision 1.6 2000/10/15 20:44:18 hajny
  698. * FindClose correction
  699. Revision 1.5 2000/09/29 21:49:41 jonas
  700. * removed warnings
  701. Revision 1.4 2000/08/30 06:30:55 michael
  702. + Merged syserrormsg fix
  703. Revision 1.3 2000/08/25 17:23:56 hajny
  704. * Sharing mode error fixed
  705. Revision 1.2 2000/08/20 15:46:46 peter
  706. * sysutils.pp moved to target and merged with disk.inc, filutil.inc
  707. Revision 1.1.2.3 2000/08/25 17:20:57 hajny
  708. * Sharing mode error fixed
  709. Revision 1.1.2.2 2000/08/22 19:21:48 michael
  710. + Implemented syserrormessage. Made dummies for go32v2 and OS/2
  711. * Changed linux/errors.pp so it uses pchars for storage.
  712. Revision 1.1.2.1 2000/08/20 15:08:32 peter
  713. * forgot the add command :(
  714. }