| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- (* Release 3.10 *)
- (*-------------------------------------------------------------------------*
- * *
- * WINFIO.MOD - File i/o with far interface for Windows *
- * *
- * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
- * All Rights Reserved *
- * *
- *--------------------------------------------------------------------------*)
- (*# call(seg_name => null) *)
- (*# module(implementation=>off) *)
- (*# data(seg_name => null, near_ptr=>off) *)
- (*# call(o_a_copy => off, ds_eq_ss=>off, near_call=>off) *)
- (*# check(stack=>off,
- index=>off,
- range=>off,
- overflow=>off,
- nil_ptr=>off) *)
- IMPLEMENTATION MODULE WinFIO;
- IMPORT Lib, SYSTEM, CoreIO, CoreFile, CoreSig, CoreMain, Windows;
- VAR
- (* CoreFile.BufInf : ARRAY[0..MaxHandle] OF FileInf; *) (* NB in CoreFile *)
- IOR: CARDINAL;
- TYPE
- Str80 = ARRAY[0..79] OF CHAR;
- PathStr = ARRAY [0..128] OF CHAR;
- PROCEDURE ErrorCheck(Code: CARDINAL; ErrNum: CARDINAL; Msg, Name: ARRAY OF CHAR);
- VAR
- ErrMsg: ARRAY [0..119] OF CHAR;
- NumStr: ARRAY [0..19] OF CHAR;
- OK: BOOLEAN;
- BEGIN
- IF ErrNum = 0 THEN
- ErrNum := Lib.SysErrno();
- END;
- IF IOcheck THEN
- Str.Copy(ErrMsg, Msg);
- Str.Append(ErrMsg, Name);
- Str.Append(ErrMsg, '. Dos Error Code ');
- Str.CardToStr(LONGCARD(ErrNum), NumStr, 10, OK);
- Str.Append(ErrMsg, NumStr);
- (* Lib.WrDosError(SHORTCARD(ErrNum)); *)
- Lib.RunTimeError(CoreSig._FatalErrorPos(), Code+0A0H, ErrMsg);
- END;
- IOR := ErrNum;
- END ErrorCheck;
- PROCEDURE IOresult () : CARDINAL;
- BEGIN
- RETURN IOR;
- END IOresult;
- PROCEDURE WrBin(F: File; Buf: ARRAY OF BYTE; Count: CARDINAL);
- VAR
- NumWrit : CARDINAL;
- BEGIN
- IOR := 0;
- OK := TRUE;
- IF Count = 0 THEN RETURN END;
- NumWrit := Windows._lwrite(F, Buf, Count);
- IF NumWrit # Count THEN
- ErrorCheck(6, 0, 'WrBin : ', Lib.NilStr);
- OK := FALSE;
- END;
- END WrBin;
- PROCEDURE RdBin(F: File; VAR Buf: ARRAY OF BYTE; Count: CARDINAL) : CARDINAL;
- VAR
- NumRead: CARDINAL;
- BEGIN
- IOR := 0;
- OK := TRUE;
- EOF := FALSE;
- IF Count = 0 THEN RETURN 0 END;
- NumRead := Windows._lread(F, Buf, Count);
- IF NumRead # Count THEN
- OK := FALSE;
- IF NumRead < 0 THEN
- ErrorCheck(7, 0, 'RbBin : ', Lib.NilStr);
- ELSE
- EOF := TRUE;
- END;
- END;
- RETURN NumRead;
- END RdBin;
- PROCEDURE GetName(name: ARRAY OF CHAR; VAR fn: PathStr);
- (* Makes Null terminated filename, also sets IOR to 0 *)
- BEGIN
- Str.Copy(fn,name);
- fn[HIGH(fn)] := CHR(0);
- IOR := 0;
- END GetName;
- PROCEDURE Open(Name: ARRAY OF CHAR) : File;
- VAR
- fn: PathStr;
- H: File;
- BEGIN
- GetName(Name,fn);
- H := Windows._lopen(fn, Windows.READ_WRITE + INTEGER(ShareMode));
- IF H <> MAX(CARDINAL) THEN
- CoreFile._openfd[H] := (CoreIO.O_RDWR+CoreIO.O_BINARY);
- IF CoreIO.isatty(H) # 0 THEN
- CoreFile._openfd[H] := CoreFile._openfd[H] + CoreIO.O_DEVICE;
- END;
- ELSE
- ErrorCheck(2, 0, 'Open : ', fn);
- END;
- RETURN H;
- END Open;
- PROCEDURE OpenRead( Name: ARRAY OF CHAR) : File;
- VAR
- fn: PathStr;
- H: File;
- BEGIN
- GetName(Name,fn);
- H := Windows._lopen(fn, Windows.READ + INTEGER(ShareMode));
- IF H <> MAX(CARDINAL) THEN
- CoreFile._openfd[H] := (CoreIO.O_RDONLY+CoreIO.O_BINARY);
- IF CoreIO.isatty(H) # 0 THEN
- CoreFile._openfd[H] := CoreFile._openfd[H] + CoreIO.O_DEVICE;
- END;
- ELSE
- ErrorCheck(3, 0, 'OpenRead : ', fn);
- END;
- RETURN H;
- END OpenRead;
- PROCEDURE Exists(Name: ARRAY OF CHAR) : BOOLEAN;
- VAR
- fn : PathStr ;
- BEGIN
- GetName(Name,fn);
- IF CoreIO._exists(fn) # 0 THEN
- RETURN TRUE;
- END;
- RETURN FALSE;
- END Exists;
- PROCEDURE Create(Name: ARRAY OF CHAR) : File;
- VAR
- fn: PathStr;
- H: File;
- BEGIN
- GetName(Name,fn);
- H := Windows._lcreat(fn, 0);
- IF H <> MAX(CARDINAL) THEN
- CoreFile._openfd[H] := (CoreIO.O_RDWR+CoreIO.O_BINARY);
- ELSE
- ErrorCheck(5, 0, 'Create : ', Name);
- END;
- RETURN H;
- END Create;
- PROCEDURE Close(F: File);
- BEGIN
- IOR := 0;
- IF F < CoreFile._open_max THEN
- CoreFile._openfd[F] := {};
- END;
- IF Windows._lclose(F) = -1 THEN
- ErrorCheck(0, 0, 'Close : ', Lib.NilStr);
- END;
- RETURN;
- END Close;
- BEGIN
- IOR := 0;
- OK := TRUE;
- EOF := FALSE;
- ShareMode := ShareCompat;
- END WinFIO.
|