home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1987-10-05 | 1.9 KB | 61 lines |
- IMPLEMENTATION MODULE Logfile; (* Logitech Modula-2 *)
-
- IMPORT FileSystem;
- FROM Termbase IMPORT AssignWrite, AssignRead;
- FROM Strings IMPORT Pos, Copy;
-
- CONST
- bufsize = 512;
-
- VAR
- f : FileSyste.File;
- c : CHAR;
- buf : ARRAY [0..bufsize-1] OF CHAR;
- indx : CARDINAL;
- logfn : ARRAY [0..11] OF CHAR;
-
-
- PROCEDURE NoOp(ch: CHAR); (* tut schlicht und einfach nichts ! *)
- BEGIN END NoOp;
-
- PROCEDURE WriteChToFile(ch: CHAR);
- VAR rd: CARDINAL;
- BEGIN
- IF indx >= bufsize-1 THEN (* wenn Buffer voll, dann *)
- FileSystem.WriteNBytes(f,ADR(buf),bufsize,rd); (* wegschreiben und wieder*)
- indx := 0 (* aufnahmebereit machen *)
- END;
- buf[indx] := ch; INC(indx)
- END WriteChToFile;
-
- PROCEDURE LogOn(fn: ARRAY OF CHAR);
- BEGIN
- Copy(fn,0,Pos('.',fn)+1,logfn); (* Namen fuer Logfile konstruieren *)
- Concat(logfn,'LOG',logfn);
- FileSystem.Lookup(f,logfn,TRUE); (* jetzt wird`s interessant: *)
- AssignWrite(WriteChToFile,ok) (* ... die Umleitung *)
- END LogOn;
-
- PROCEDURE LogOff;
- BEGIN
- Flush; (* falls noch was im Puffer -> schreiben ! *)
- Termbase.UnAssignWrite(ok);
- FileSystem.Close(f)
- END LogOff;
-
- PROCEDURE Flush;
- VAR i: CARDINAL;
- BEGIN
- FOR i := 0 TO indx -1 DO FileSystem.WriteChar(f,buf[i])
- (* oder auch, je nach Geschmack: *)
- (* FileSystem.WriteNBytes(f,ADR(buf),indx,wr) *)
- (* wobei aber wr: CARDINAL; deklariert sein muss. *)
- (* Ein kleiner, aber grundlegender Unterschied *)
- (* besteht doch: WriteChar interpretiert *)
- (* das Zeichen 0DH zu der Zeichenfolge 0DH 0AH, *)
- (* waehrend mit WriteNBytes praktisch "woertlich" *)
- (* geschrieben wird. *)
- END Flush;
-
- END Logfile.