|
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 s
Length: 7698 (0x1e12) Types: TextFile Names: »sysinterface.mod«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89 └─⟦this⟧ »./DVIware/crt-viewers/others/dvitovdu/src/sysinterface.mod« └─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12 └─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z« └─⟦ca79c7339⟧ └─⟦this⟧ »DVIware/crt-viewers/others/dvitovdu/src/sysinterface.mod«
IMPLEMENTATION MODULE sysinterface; (* Author: Andrew Trevorrow Implementation: Modula-2 under VAX/UNIX 4.2 BSD Date Started: June, 1986 Description: SYSDEP: Implements InitSysInterface, the routine that gets the DVItoVDU command line and extracts the DVI file name and option values. *) FROM parameters IMPORT NumParameters, GetParameter, GetEnvironment; FROM io IMPORT SReadf; FROM screenio IMPORT Write, WriteString, WriteLn, RestoreTerminal; TYPE units = (ic,cm,mm,pc,pt,px); (* SYSDEP: changed in to ic; compiler confused with IN, even with -sk!!! *) VAR option : CHAR; (* current command option *) value : stringvalue; (* current option's value *) length : INTEGER; (* current value's length *) (**********************************************************************) PROCEDURE ExplicitExt (fname : ARRAY OF CHAR; len : INTEGER) : BOOLEAN; (* SYSDEP: Check for an extension of the form ".*" where * is any string. len is length of fname. If "." found then TRUE is returned, otherwise FALSE. *) BEGIN WHILE len > 0 DO (* search backwards looking for . *) DEC(len); IF fname[len] = '.' THEN RETURN TRUE END; END; RETURN FALSE; END ExplicitExt; (**********************************************************************) PROCEDURE GetCardinal (VAR n : CARDINAL); (* If current value represents a positive integer then return via n. *) BEGIN IF (SReadf(value,'%d',n) <> 1) OR (n <= 0) THEN WriteString('Bad -'); Write(option); WriteString(' value: '); WriteString(value); WriteLn; WriteString('Specify a positive integer.'); WriteLn; RestoreTerminal; HALT; END; END GetCardinal; (**********************************************************************) PROCEDURE GetDimension (VAR r : REAL; VAR un : units); (* A valid dimension consists of a positive integer or real number followed by a two-letter unit: IN, CM, MM, PC, PT or PX (or in lowercase). If current value represents a valid dimension, we return number part in r and units part in un. *) VAR i : INTEGER; ch1, ch2 : CHAR; BEGIN (* extract un *) IF length > 1 THEN i := length-1 ELSE i := 1 END; IF (CAP(value[i-1]) = 'I') AND (CAP(value[i]) = 'N') THEN un := ic; ELSIF (CAP(value[i-1]) = 'C') AND (CAP(value[i]) = 'M') THEN un := cm; ELSIF (CAP(value[i-1]) = 'M') AND (CAP(value[i]) = 'M') THEN un := mm; ELSIF (CAP(value[i-1]) = 'P') AND (CAP(value[i]) = 'C') THEN un := pc; ELSIF (CAP(value[i-1]) = 'P') AND (CAP(value[i]) = 'T') THEN un := pt; ELSIF (CAP(value[i-1]) = 'P') AND (CAP(value[i]) = 'X') THEN un := px; ELSE WriteString('Bad units in -'); Write(option); WriteString(' value: '); WriteString(value); WriteLn; WriteString('Last two letters should be IN, CM, MM, PC, PT or PX.'); WriteLn; RestoreTerminal; HALT; END; ch1 := value[i-1]; (* remember letters in units *) ch2 := value[i]; value[i] := 0C; (* remove units *) value[i-1] := 0C; IF (SReadf(value,'%f',r) <> 1) OR (r <= 0.0) THEN value[i-1] := ch1; (* restore units *) value[i] := ch2; WriteString('Bad -'); Write(option); WriteString(' value: '); WriteString(value); WriteLn; WriteString('Specify a positive dimension.'); WriteLn; RestoreTerminal; HALT; END; END GetDimension; (**********************************************************************) PROCEDURE InitSysInterface; (* If an option appears more than once then we return the last value. *) VAR i, num : CARDINAL; unitwd, unitht : units; realwd, realht : REAL; len : INTEGER; BEGIN (* SYSDEP: initialize option values with defaults *) resolution := 300; (* LaserWriter resolution *) unitwd := ic; (* paper dimensions in inches *) unitht := ic; realwd := 8.3; (* A4 paper is 8.3" wide *) realht := 11.7; (* A4 paper is 11.7" high *) mag := 0; (* use DVI mag *) GetEnvironment('TERM',vdu,len); (* set vdu to value of TERM *) IF len < 0 THEN vdu := 'unknown' END; dummyfont := '/usr/lib/tex/fonts/cmr10.1500pxl'; fontdir := '/usr/lib/tex/fonts'; helpname := '/usr/lib/tex/dv/dvitovdu.hlp'; DVIname[0] := 0C; (* SYSDEP: empty string *) num := 1; WHILE num < NumParameters DO GetParameter(num,value,length); INC(num); IF value[0] = '-' THEN IF length > 1 THEN option := value[1] ELSE option := ' ' END; IF (option <> 'r') AND (option <> 'm') AND (option <> 'x') AND (option <> 'y') AND (option <> 'v') AND (option <> 'd') AND (option <> 'h') AND (option <> 'f') THEN WriteString('Unknown option: -'); Write(option); WriteLn; RestoreTerminal; HALT; END; (* allow things like -vvis500 *) IF length > 2 THEN (* shift value left 2 places *) FOR i := 0 TO length - 1 DO value[i] := value[i+2]; END; length := length - 2; value[length] := 0C; (* SYSDEP: terminate with NULL *) ELSE (* value is next parameter *) GetParameter(num,value,length); INC(num); IF length <= 0 THEN WriteString('Missing value after -'); Write(option); WriteLn; RestoreTerminal; HALT; END; END; CASE option OF 'r' : GetCardinal(resolution); | 'm' : GetCardinal(mag); | 'x' : GetDimension(realwd,unitwd); | 'y' : GetDimension(realht,unitht); | 'v' : vdu := value; | 'd' : dummyfont := value; | 'h' : helpname := value; | 'f' : fontdir := value; (* bad string values will be detected in other modules *) END; ELSE DVIname := value; IF NOT ExplicitExt(DVIname,length) THEN (* append .dvi *) IF length + 3 <= HIGH(DVIname) THEN DVIname[length] := '.'; DVIname[length+1] := 'd'; DVIname[length+2] := 'v'; DVIname[length+3] := 'i'; IF length + 4 <= HIGH(DVIname) THEN (* SYSDEP: append NULL *) DVIname[length + 4] := 0C; END; ELSE (* user has given a mighty long file name! *) WriteString('DVI file name too long: '); WriteString(DVIname); WriteLn; RestoreTerminal; HALT; END; END; (* bad DVIname will be detected upon open in main module *) END; END; IF DVIname[0] = 0C THEN (* no file name on command line *) WriteString('Missing DVI file name!'); WriteLn; RestoreTerminal; HALT; END; (* set paperwd and paperht only after resolution has been decided *) CASE unitwd OF ic : paperwd := TRUNC(realwd * FLOAT(resolution) + 0.5) | cm : paperwd := TRUNC((realwd / 2.54) * FLOAT(resolution) + 0.5) | mm : paperwd := TRUNC((realwd / 25.4) * FLOAT(resolution) + 0.5) | pt : paperwd := TRUNC((realwd / 72.27) * FLOAT(resolution) + 0.5) | pc : paperwd := TRUNC((realwd / 72.27) * 12.0 * FLOAT(resolution) + 0.5) | px : paperwd := TRUNC(realwd + 0.5) END; CASE unitht OF ic : paperht := TRUNC(realht * FLOAT(resolution) + 0.5) | cm : paperht := TRUNC((realht / 2.54) * FLOAT(resolution) + 0.5) | mm : paperht := TRUNC((realht / 25.4) * FLOAT(resolution) + 0.5) | pt : paperht := TRUNC((realht / 72.27) * FLOAT(resolution) + 0.5) | pc : paperht := TRUNC((realht / 72.27) * 12.0 * FLOAT(resolution) + 0.5) | px : paperht := TRUNC(realht + 0.5) END; END InitSysInterface; END sysinterface.