-- File: PtMisc.mesa, Last Edit:
-- MAS April 21, 1980 6:36 PM
-- HGM November 8, 1979 11:02 PM

DIRECTORY
DisplayDefs: FROM "DisplayDefs" USING [SetSystemDisplaySize],
IODefs
: FROM "IODefs" USING [
CR, Rubout, ReadID, ReadNumber, WriteChar, WriteDecimal, WriteLine, WriteString],
KeyDefs
: FROM "KeyDefs" USING [Keys],
OsStaticDefs: FROM "OsStaticDefs" USING [OsStatics],
ProcessDefs: FROM "ProcessDefs" USING [Yield],
StringDefs: FROM "StringDefs" USING [InvalidNumber],
PupStream: FROM "PupStream" USING [
SetMaxAllocation],
StatsDefs: FROM "StatsDefs" USING [StatReady, StatSince],
PupDefs: FROM "PupDefs" USING [
AppendPupAddress, PupNameTrouble, GetLocalPupAddress,
GetPupAddress, ParsePupAddressConstant,
PupAddressLookup, PupNameLookup, EnumeratePupAddresses,
PupPackageDestroy, PupPackageMake, AdjustBufferParms,
defaultPupsToAllocate,
PupAddress, PrintPupAddress, SetLocalOnly],
BufferDefs: FROM "BufferDefs" USING [defaultBufferPoolSize],
PtDefs: FROM "PtDefs" USING [
clock, msPerTick, PtInterface, UnListen,
PtEchoOff, PtEchoOn, PtStatsOff, PtStatsOn];

PtMisc: PROGRAM [
pt: PtDefs.PtInterface]
IMPORTS DisplayDefs, IODefs, ProcessDefs, StringDefs,
StatsDefs, PupStream, PupDefs, PtDefs
EXPORTS PtDefs = BEGIN
OPEN
pt, IODefs, StatsDefs, PupDefs, PtDefs;

bufferPoolSize: CARDINAL ← BufferDefs.defaultBufferPoolSize;
pupsToAllocate: CARDINAL ← defaultPupsToAllocate;


PtBuffers: PUBLIC PROCEDURE =
BEGIN
bps: CARDINAL ← bufferPoolSize;
dwpp: CARDINAL ← dataWordsPerPup;
pta: CARDINAL ← pupsToAllocate;
WriteString["bufferPoolSize: "L];
bps ← ReadNumber[bps,10 ! StringDefs.InvalidNumber, Rubout => GOTO Reject];
WriteChar[CR];
WriteString["dataWordsPerPup: "L];
dwpp ← ReadNumber[dwpp,10 ! StringDefs.InvalidNumber, Rubout => GOTO Reject];
WriteChar[CR];
WriteString["maxAllocate: "L];
pta ← ReadNumber[pta,10 ! StringDefs.InvalidNumber, Rubout => GOTO Reject];
WriteChar[CR];
bufferPoolSize ← bps;
dataWordsPerPup ← dwpp;
pupsToAllocate ← pta;
UnListen[];
PtStatsOff[];
PtEchoOff[];
PupPackageDestroy[];
AdjustBufferParms[bufferPoolSize,dataWordsPerPup];
PupStream.
SetMaxAllocation[pupsToAllocate];
PupPackageMake[];
PtStatsOn[];
PtEchoOn[];
EXITS Reject => WriteLine["xxx"L];
END;

PtHost: PUBLIC PROCEDURE =
BEGIN
name: STRING ← [50];
address: PupAddress ← [myNet,myHost,[0,0]];
AppendPupAddress[name,address];
ReadID[name ! Rubout => GOTO Reject];
GetPupAddress[@address,name !
PupNameTrouble => BEGIN WriteLine[e]; GOTO Error; END];
IF address.net=0 THEN address.net←myNet;
WriteString["="L];
PrintPupAddress[address];
pullHim.host ← pushHim.host←address.host;
pullHim.net ← pushHim.net←address.net;
IF address.socket#[0,0] THEN pullHim.socket←pushMe.socket←address.socket;
WriteLine["."L];
EXITS
Error => NULL;
Reject => WriteLine["xxx"L];
END;

PtNames: PUBLIC PROCEDURE =
BEGIN
PtLookerReady[];
NameTester["3#200#"L];
NameTester["MAXC"L];
NameTester["Maxc"L];
NameTester["Maxc+FTP"L];
NameTester["Portola"L];
NameTester[" P o r t o l a "L];
NameTester["UnknownName"L];
NameTester["illegal**character"L];
NameTester["200"L];
NameTester["200#"L];
NameTester["3#200"L];
NameTester["3#200#"L];
NameTester["3#200#7"L];
NameTester["3#200#0|6"L];
NameTester["3#200#12|34"L];
NameTester["3#200#1234567"L];
NameTester["Portcullis"L];
NameTester["ADL-Gateway"L];
NameTester[""L];
-- NameTester[NIL ! ANY => BEGIN WriteLine["Rejected."L]; CONTINUE END ];
NameTester["ME"L];
NameTester["IFS"L];
AddressTester[[[3],[200B],[0,0]]];
AddressTester[[[3],[200B],[0,3]]];
AddressTester[[[3],[200B],[0,12345]]];
AddressTester[[[3],[200B],[123,123]]];
AddressTester[pullMe];
AddressTester[[[0],[0],[0,3]]];
AddressTester[[[0],[0],[0,0]]];
ListNames["WikiWiki"];
ListNames["Twinkle"];
ListNames["PA"];
ListNames["Foo"];
PtLookerSince[];
END;

NameTester: PROCEDURE [s: STRING] =
BEGIN
t: INTEGER;
locally: BOOLEAN;
a1, a2: PupAddress ← [[7B],[77B],[777B,7777B]];
SELECT TRUE FROM
(s=NIL) => WriteString["**NIL**"L];
(s.length=0) => WriteString["**EMPTY**"L];
ENDCASE => WriteString[s];
WriteString[" => "L];
IF (locally←ParsePupAddressConstant[@a1,s])
THEN PrintPupAddress[a1]
ELSE WriteString["--"L];
WriteString[" "L];
t ← clock↑;
PupNameLookup[@a2,s ! PupNameTrouble => BEGIN WriteLine[e]; GOTO Error; END];
t ← clock↑-t;
PrintPupAddress[a2];
WriteString[" "L];
IF locally AND a1#a2 THEN WriteString[" ***** "L];
WriteDecimal[msPerTick*t];
WriteLine["ms."L];
EXITS Error => NULL;
END;

AddressTester: PROCEDURE [a: PupAddress] =
BEGIN
t: INTEGER;
s: STRING = [100];
PrintPupAddress[a];
WriteString[" => "L];
t ← clock↑;
PupAddressLookup[s,a ! PupNameTrouble => BEGIN WriteLine[e]; GOTO Error; END];
t ← clock↑-t;
WriteString[s];
WriteString[" "L];
WriteDecimal[msPerTick*t];
WriteLine["ms."L];
EXITS Error => NULL;
END;

ListNames: PROCEDURE [name: STRING] =
BEGIN
n: CARDINAL ← 0;
PrintOne: PROCEDURE [a: PupAddress] RETURNS [BOOLEAN] =
BEGIN
IF n#0 THEN WriteString[", "L];
WriteDecimal[n←n+1];
WriteString[") "L];
PrintPupAddress[a];
RETURN[FALSE];
END;
WriteString[name];
WriteString[" => "L];
[] ← EnumeratePupAddresses[name,PrintOne !
PupNameTrouble => BEGIN WriteLine[e]; GOTO Error; END];
WriteLine["."L];
EXITS Error => NULL;
END;

PtOnOff: PUBLIC PROCEDURE =
BEGIN
i: CARDINAL ← 0;
UnListen[];
PtLookerReady[];
UNTIL KeyDefs.Keys.Space=down DO
PtStatsOff[];
PtEchoOff[];
PupPackageDestroy[];
SetLocalOnly[localOnly←~localOnly];
PupPackageMake[];
PtFixHostAndNet[];
IF myHost#OsStaticDefs.OsStatics↑.SerialNumber THEN WriteString["Bad myHost"L];
IF localOnly
THEN BEGIN IF myNet#0 THEN WriteChar[’?] END
ELSE IF myNet ~IN[1..25) THEN WriteChar[’?];
PtStatsOn[];
PtEchoOn[];
IF (i←i+1)=1--00-- THEN BEGIN i←0; WriteChar[’!]; END;
ENDLOOP;
PtLookerSince[];
END;

PtFixHostAndNet: PUBLIC PROCEDURE =
BEGIN
me: PupAddress ←
GetLocalPupAddress[socNum,NIL];
myHost ← me.host;
myNet ← me.net;
pullMe.host ← pushMe.host ← pullHim.host ← pushHim.host ← myHost;
pullMe.net ← pushMe.net ← pullHim.net ← pushHim.net ← myNet;
END;

pages: CARDINAL ← 0;

PtDisplay: PUBLIC PROCEDURE =
BEGIN
WriteString["pagesForBitmap: "L];
pages ← ReadNumber[pages,10 ! StringDefs.InvalidNumber, Rubout => GOTO Reject];
WriteChar[CR];
DisplayDefs.SetSystemDisplaySize[2*pages,pages]; -- two lines/page seems ok
EXITS Reject => WriteLine["xxx"L];
END;

PtSched: PUBLIC PROCEDURE =
BEGIN
WriteLine["Timing StatSince"L];
THROUGH [0..10) DO
StatSince[];
ENDLOOP;
WriteLine["Timing 10,000 Yields and StatSince"L];
THROUGH [0..10) DO
THROUGH [0..10000) DO
ProcessDefs.Yield[];
ENDLOOP;
StatSince[];
ENDLOOP;
END;

PtLookerStart: PUBLIC PROCEDURE =
BEGIN
END;

PtLookerReady: PUBLIC PROCEDURE =
BEGIN
StatReady[];
END;

PtLookerSince: PUBLIC PROCEDURE =
BEGIN
StatSince[];
END;

PtLookerStop: PUBLIC PROCEDURE =
BEGIN
END;

-- initialization
END.