-- Copyright (C) 1984 by Xerox Corporation. All rights reserved. -- GateParameterNoDisk.mesa, HGM, 29-Nov-84 19:04:07 -- And various stubs... DIRECTORY CmFile USING [Handle, TableError], Format USING [NetworkNumber], Process USING [Priority, priorityForeground], Put USING [Decimal, NetworkNumber, Octal, Text, Line], StringLookUp USING [noMatch, TableDesc], String USING [ AppendChar, AppendDecimal, AppendNumber, AppendOctal, AppendString, EqualString], System USING [NetworkNumber, nullNetworkNumber], Token USING [Boolean, Decimal, FreeTokenString, Item, NetworkNumber, Octal], BufferOps USING [Defaults, GetDefaults, SetDefaults], DriverTypes USING [DeviceType], Driver USING [GetDeviceChain, GetPupRouter, Network], ForwarderDefs USING [], PupDefs USING [SmashMyHostNumber], Router USING [SetNetworkID], GateDefs USING [], Indirect USING [Close, NextValue, OpenSection], PhoneCreate USING [CreatePhone], RoutingFudges USING [SetNSFudge, SetPupFudge], Trouble USING [Bug]; GateParameterNoDisk: PROGRAM IMPORTS CmFile, Format, Process, Put, String, Token, BufferOps, Driver, Indirect, PupDefs, Router, PhoneCreate, RoutingFudges, Trouble EXPORTS GateDefs = BEGIN SetupWindow: PUBLIC PROCEDURE = BEGIN END; ScanParameterFile: PUBLIC PROCEDURE RETURNS [ priority: Process.Priority ¬ Process.priorityForeground, disableNSRouting: BOOLEAN ¬ FALSE] = BEGIN cmFile: CmFile.Handle; Option: TYPE = MACHINE DEPENDENT{ ethernetOne(0), ethernet, sdlc, pupHostNumber, buffers, priority, disableNSRouting, extraHops, noMatch(StringLookUp.noMatch)}; DefinedOption: TYPE = Option [ethernetOne..extraHops]; CheckType: PROCEDURE [h: CmFile.Handle, table: StringLookUp.TableDesc] RETURNS [index: CARDINAL] = Indirect.NextValue; MyNextValue: PROCEDURE [ h: CmFile.Handle, table: LONG DESCRIPTOR FOR ARRAY DefinedOption OF LONG STRING] RETURNS [index: Option] = LOOPHOLE[CheckType]; optionTable: ARRAY DefinedOption OF LONG STRING ¬ [ ethernetOne: "EthernetOne"L, ethernet: "Ethernet"L, sdlc: "SDLC"L, pupHostNumber: "Pup Host Number"L, buffers: "Buffers"L, priority: "Priority"L, disableNSRouting: "Disable NS Routing"L, extraHops: "Extra Hops"L]; phoneLines: CARDINAL ¬ 0; cmFile ¬ Indirect.OpenSection["Gateway"L]; IF cmFile = NIL THEN BEGIN Message["Can't find [Gateway] section in Parameter file"L]; RETURN; END; DO option: Option; option ¬ MyNextValue[cmFile, DESCRIPTOR[optionTable] ! CmFile.TableError => BEGIN IF name[0] # '; THEN Message["Unrecognized parameter: ", name]; RETRY; END]; SELECT option FROM noMatch => EXIT; ethernetOne => -- (octal) BEGIN board: CARDINAL ¬ Token.Decimal[cmFile]; pupNet: CARDINAL ¬ Token.Octal[cmFile]; nsNet: System.NetworkNumber ¬ Token.NetworkNumber[cmFile, octal]; SetPupNetworkID[board, ethernetOne, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[board, ethernetOne, nsNet]; [] ¬ Router.SetNetworkID[board, ethernetOne, nsNet]; END; PrintHost["EthernetOne"L, board, pupNet, nsNet]; END; ethernet => -- (octal) BEGIN board: CARDINAL ¬ Token.Decimal[cmFile]; pupNet: CARDINAL ¬ Token.Octal[cmFile]; nsNet: System.NetworkNumber ¬ Token.NetworkNumber[cmFile, octal]; SetPupNetworkID[board, ethernet, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[board, ethernet, nsNet]; [] ¬ Router.SetNetworkID[board, ethernet, nsNet]; END; PrintHost["Ethernet"L, board, pupNet, nsNet]; END; sdlc => -- (octal) BEGIN -- Line 0 must come first line: CARDINAL ¬ Token.Octal[cmFile]; pupNet: CARDINAL ¬ Token.Octal[cmFile]; nsNet: System.NetworkNumber ¬ Token.NetworkNumber[cmFile, octal]; pupHost: CARDINAL ¬ Token.Octal[cmFile]; password: LONG STRING ¬ Token.Item[cmFile]; IF String.EqualString[password, "NIL"L] THEN BEGIN [] ¬ Token.FreeTokenString[password]; password ¬ NIL; END; phoneLines ¬ phoneLines + 1; PhoneCreate.CreatePhone[pupHost, pupNet, line, password]; IF password # NIL THEN [] ¬ Token.FreeTokenString[password]; SetPupNetworkID[phoneLines, phonenet, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[phoneLines, phonenet, nsNet]; [] ¬ Router.SetNetworkID[phoneLines, phonenet, nsNet]; END; PrintSdlcInfo[pupHost, pupNet, line, phoneLines]; END; pupHostNumber => BEGIN me: CARDINAL ¬ Token.Octal[cmFile]; PupDefs.SmashMyHostNumber[me]; MessageOctal["Set my Pup Host Number to "L, me]; END; buffers => -- (decimal) BEGIN defaults: ARRAY BufferOps.Defaults OF CARDINAL ¬ BufferOps.GetDefaults[]; buffers: CARDINAL ¬ Token.Decimal[cmFile]; defaults[bias] ¬ defaults[bias] + buffers; BufferOps.SetDefaults[defaults]; MessageDecimal["Added "L, buffers, " buffers to the system pool"L]; END; priority => -- (decimal) BEGIN priority ¬ Token.Decimal[cmFile]; MessageDecimal["Priority will be "L, priority]; END; disableNSRouting => -- BEGIN IF Token.Boolean[cmFile] THEN BEGIN Message["Deactivating NS Router"L]; disableNSRouting ¬ TRUE; END ELSE Message["Didn't deactivate NS Router"L]; END; extraHops => -- BEGIN IF Token.Boolean[cmFile] THEN BEGIN Message["Adding Extra Hops"L]; RoutingFudges.SetPupFudge[1]; RoutingFudges.SetNSFudge[1]; END ELSE Message["Didn't add any Extra Hops"L]; END; ENDCASE => ERROR; ENDLOOP; Indirect.Close[cmFile]; END; SetPupNetworkID: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType, newNetID: CARDINAL] = BEGIN ENABLE UNWIND => NULL; network: Driver.Network ¬ GetNthDevice[physicalOrder, medium]; IF network.pupNetNumber = 0 THEN network.pupNetNumber ¬ newNetID; IF network.pupNetNumber # newNetID THEN BEGIN text: STRING = [200]; String.AppendString[text, "Wrong Pup network number. Expected: "L]; String.AppendNumber[text, newNetID, 8]; String.AppendString[text, ", Found: "L]; String.AppendNumber[text, network.pupNetNumber, 8]; Trouble.Bug[text]; END; Driver.GetPupRouter[].addNetwork[network]; END; CheckNSNetworkID: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType, newNetID: System.NetworkNumber] = BEGIN ENABLE UNWIND => NULL; network: Driver.Network ¬ GetNthDevice[physicalOrder, medium]; IF network.netNumber # System.nullNetworkNumber AND network.netNumber # newNetID THEN BEGIN text: STRING = [200]; String.AppendString[text, "Wrong NS network number. Expected: "L]; AppendNetNumbers[text, newNetID]; String.AppendString[text, ", Found: "L]; AppendNetNumbers[text, network.netNumber]; Trouble.Bug[text]; END; network ¬ NIL; -- Compiler and Debugger don't agree END; GetNthDevice: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType] RETURNS [network: Driver.Network] = BEGIN i: CARDINAL ¬ 0; FOR network ¬ Driver.GetDeviceChain[], network.next UNTIL network = NIL DO IF network.device = medium THEN IF (i ¬ i + 1) = physicalOrder THEN RETURN; ENDLOOP; Trouble.Bug["Driver doesn't exist"L]; network ¬ NIL; -- Compiler and Debugger don't agree END; PrintHost: PROCEDURE [ name: LONG STRING, board, pupNet: CARDINAL, nsNet: System.NetworkNumber] = BEGIN Put.Text[NIL, name]; IF board # LAST[CARDINAL] THEN BEGIN Put.Text[NIL, " number "L]; Put.Octal[NIL, board]; END; Put.Text[NIL, " is Pup network "L]; Put.Octal[NIL, pupNet]; Put.Text[NIL, " and NS network "L]; Put.NetworkNumber[NIL, nsNet, octal]; Put.Text[NIL, " ("L]; Put.NetworkNumber[NIL, nsNet, productSoftware]; Put.Line[NIL, ")."L]; END; PrintSdlcInfo: PROCEDURE [pupHost, pupNet: CARDINAL, line, driver: CARDINAL] = BEGIN Put.Text[NIL, "The "L]; SELECT driver FROM 1 => Put.Text[NIL, "first"L]; 2 => Put.Text[NIL, "second"L]; 3 => Put.Text[NIL, "third"L]; 4 => Put.Text[NIL, "forth"L]; 5 => Put.Text[NIL, "fifth"L]; 6 => Put.Text[NIL, "sixth"L]; 7 => Put.Text[NIL, "seventh"L]; 8 => Put.Text[NIL, "eighth"L]; ENDCASE => {Put.Decimal[NIL, driver]; Put.Text[NIL, "th"L]; }; Put.Text[NIL, " SDLC line "L]; Put.Octal[NIL, line]; Put.Text[NIL, " is Pup "L]; Put.Octal[NIL, pupNet]; Put.Text[NIL, "#"L]; Put.Octal[NIL, pupHost]; Put.Text[NIL, "#"L]; Put.Line[NIL, "."L]; END; MessageDecimal: PROCEDURE [ one: LONG STRING, num: CARDINAL, two, three: LONG STRING ¬ NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; String.AppendDecimal[text, num]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; LogString[text]; END; MessageOctal: PROCEDURE [ one: LONG STRING, num: CARDINAL, two, three: LONG STRING ¬ NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; String.AppendOctal[text, num]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; LogString[text]; END; Message: PROCEDURE [one, two, three: LONG STRING ¬ NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; LogString[text]; END; LogString: PROCEDURE [text: LONG STRING] = BEGIN Put.Line[NIL, text]; END; AppendNetNumbers: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN words: RECORD [a, b: WORD] = LOOPHOLE[net]; AppendNetNumber[string, net]; IF words.b < 256 THEN BEGIN String.AppendString[string, " ("L]; AppendNetNumberOctal[string, net]; String.AppendString[string, ")"L]; END; END; AppendNetNumber: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN Append: PROCEDURE [s: LONG STRING, clientData: LONG POINTER] = BEGIN String.AppendString[string, s]; END; Format.NetworkNumber[Append, net, productSoftware]; END; AppendNetNumberOctal: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN Append: PROCEDURE [s: LONG STRING, clientData: LONG POINTER] = BEGIN String.AppendString[string, s]; END; Format.NetworkNumber[Append, net, octal]; END; END.