|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 3987 (0xf93)
Types: TextFile
Names: »pxlreader.mod«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
└─⟦this⟧ »./DVIware/crt-viewers/others/dvitovdu/src/pxlreader.mod«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z«
└─⟦ca79c7339⟧
└─⟦this⟧ »DVIware/crt-viewers/others/dvitovdu/src/pxlreader.mod«
IMPLEMENTATION MODULE pxlreader;
(* Author: Andrew Trevorrow
Implementation: Modula-2 under VAX/UNIX 4.2 BSD
Date Started: June, 1986
Description:
All the routines in this module are of course highly SYSDEP!
See pxl.inf for a description of PXL files.
Although a PXL file is considered to be a stream of 32-bit words,
we will be randomly positioning to PXL bytes and then reading
bytes via GetPXLByte, SignedPXLPair etc.
*)
FROM io IMPORT
File, Open, Close;
FROM unix IMPORT
fseek, fgetc;
FROM screenio IMPORT
WriteString, WriteCard, WriteLn, RestoreTerminal;
VAR
PXLfile : File;
(******************************************************************************)
PROCEDURE OpenPXLFile (filename : ARRAY OF CHAR) : BOOLEAN;
(* Return TRUE if given file can be opened. *)
BEGIN
PXLfile := Open(filename,"r");
RETURN PXLfile <> NIL; (* PXLfile open if not NIL *)
END OpenPXLFile;
(******************************************************************************)
PROCEDURE MoveToPXLByte (offset : CARDINAL);
(* Set current position in PXLfile to given byte offset from start of file,
where first byte is at offset 0.
*)
BEGIN
IF fseek(PXLfile,INTEGER(offset),0) < 0 THEN
WriteString('fseek failed in MoveToPXLByte!'); WriteLn;
RestoreTerminal; HALT;
END;
END MoveToPXLByte;
(******************************************************************************)
PROCEDURE MoveToPXLDirectory;
(* The word offset of the font directory is given in the 2nd last word.
The last word should contain 1001 in TeX82 PXL files.
*)
VAR dirptr : CARDINAL;
BEGIN
(* move to byte at start of 2nd last PXL word *)
IF fseek(PXLfile,-8,2) < 0 THEN
WriteString('fseek failed in MoveToPXLDirectory!'); WriteLn;
RestoreTerminal; HALT;
END;
dirptr := 4 * CARDINAL(SignedPXLQuad()); (* byte offset of font directory *)
(* check last word contains 1001 *)
IF SignedPXLQuad() <> 1001 THEN
WriteString('Bad PXL file! id word <> 1001.'); WriteLn;
RestoreTerminal; HALT;
END;
MoveToPXLByte(dirptr); (* move to starting byte of font directory *)
END MoveToPXLDirectory;
(******************************************************************************)
(* Here are the functions used to get byte/s from PXLfile. *)
PROCEDURE GetPXLByte () : INTEGER;
(* Return unsigned value of next byte in PXLfile and advance. *)
BEGIN
RETURN ORD(fgetc(PXLfile));
END GetPXLByte;
(******************************************************************************)
PROCEDURE GetTwoPXLBytes () : INTEGER;
(* Return unsigned value of next 2 bytes and advance. *)
VAR a, b : CARDINAL;
BEGIN
a := ORD(fgetc(PXLfile));
b := ORD(fgetc(PXLfile));
RETURN a * 256 + b;
END GetTwoPXLBytes;
(******************************************************************************)
PROCEDURE SignedPXLPair () : INTEGER;
(* Return the next 2 bytes, possibly signed, and advance. *)
VAR a, b : CARDINAL;
BEGIN
a := ORD(fgetc(PXLfile));
b := ORD(fgetc(PXLfile));
IF a < 128 THEN
RETURN a * 256 + b;
ELSE
RETURN (a - 256) * 256 + b;
END;
END SignedPXLPair;
(******************************************************************************)
PROCEDURE SignedPXLQuad () : INTEGER;
(* Return the value (possibly signed) of the next 4 bytes and advance. *)
VAR overlay : RECORD
CASE BOOLEAN OF
TRUE : i : INTEGER |
FALSE : a,b,c,d : CHAR
END;
END;
BEGIN
WITH overlay DO
d := fgetc(PXLfile);
c := fgetc(PXLfile);
b := fgetc(PXLfile);
a := fgetc(PXLfile);
END;
RETURN overlay.i; (* SYSDEP: compiler did not allow RETURN i in WITH stmt! *)
END SignedPXLQuad;
(******************************************************************************)
PROCEDURE ClosePXLFile;
(* Close the currently open PXL file. *)
BEGIN
Close(PXLfile);
END ClosePXLFile;
(******************************************************************************)
BEGIN
END pxlreader.