DIRECTORY Convert USING [NetFormat, RopeFromXNSHost], ProcessorFace USING [processorID], Rope, ThisMachine USING [], ThisMachineRegistry; MiscRegistryImpl: CEDAR MONITOR IMPORTS Convert, ProcessorFace, Rope EXPORTS ThisMachine, ThisMachineRegistry ~ BEGIN ROPE: TYPE = Rope.ROPE; ThisMachineRef: TYPE = ThisMachineRegistry.ThisMachineRef; registeredTMProcs: LIST OF ThisMachineRef ¬ NIL; Name: PUBLIC PROC [which: ATOM] RETURNS [rope: ROPE ¬ NIL] = { thisProcs: ThisMachineRef ¬ FindProcs[which]; IF thisProcs # NIL THEN rope ¬ thisProcs.Name[]; }; Address: PUBLIC PROC [which: ATOM] RETURNS [rope: ROPE ¬ NIL] = { thisProcs: ThisMachineRef ¬ FindProcs[which]; IF thisProcs # NIL THEN rope ¬ thisProcs.Address[]; }; ProcessorID: PUBLIC PROC [which: ATOM] RETURNS [rope: ROPE ¬ NIL] ~ { format: Convert.NetFormat ¬ SELECT which FROM NIL, $Octal => octal, $Decimal, $ProductSoftware => productSoftware, $Hex => hex, ENDCASE => ERROR; rope ¬ Convert.RopeFromXNSHost[LOOPHOLE[ProcessorFace.processorID], format]; IF (format = octal) THEN { length: INT ¬ Rope.Length[rope]; IF (length > 0) AND (Rope.Fetch[rope, length-1] = 'B) THEN rope ¬ Rope.Substr[rope, 0, length-1]; }; }; RegisterThisMachineProcs: PUBLIC ENTRY PROC[newProcs: ThisMachineRef] = { ENABLE UNWIND => NULL; registeredTMProcs ¬ CONS[newProcs, registeredTMProcs]; }; GetThisMachineProcs: PUBLIC ENTRY PROC RETURNS[LIST OF ThisMachineRef] = { ENABLE UNWIND => NULL; RETURN[registeredTMProcs] }; FindProcs: ENTRY PROC[which: ATOM] RETURNS[ThisMachineRef] = { ENABLE UNWIND => NULL; reallyUse: ATOM ¬ which; this: ThisMachineRef; Try: PROC RETURNS[ThisMachineRef] = { FOR tmL: LIST OF ThisMachineRef ¬ registeredTMProcs, tmL.rest UNTIL tmL=NIL DO IF reallyUse = tmL.first.which THEN RETURN[tmL.first]; ENDLOOP; RETURN[NIL]; }; SELECT which FROM $Pup => reallyUse ¬ $pup; $XNS => reallyUse ¬ $xns; NIL, $Arpa => reallyUse ¬ $ip; ENDCASE => NULL; IF reallyUse = NIL THEN RETURN[NIL]; IF ( this ¬ Try[] ) # NIL THEN RETURN[this]; IF ( which = NIL ) THEN reallyUse ¬ $ip; RETURN[ Try[] ]; }; END. }. ¦ MiscRegistryImpl.mesa Copyright Σ 1988, 1990, 1991 by Xerox Corporation. All rights reserved. Willie-sue, December 3, 1990 11:37 am PST Exported to ThisMachine this is done here for now, but we can change it if we want to later Processor ID and XNS Host number are the same. Perhaps this is a crock, but it sure makes the code shorter!  ajd Ugh. Convert adds the trailing 'B, and ThisMachine doesn't. Exported to ThisMachineRegistry Utilities Here's some old code that works, in case we ever need to separate ProcessorID and XNSHost. ProcessorID: PUBLIC PROC [which: ATOM] RETURNS [rope: ROPE _ NIL] = { text: REF TEXT _ RefText.ObtainScratch[maxDigits]; me: ProcessorFace.ProcessorID _ ProcessorFace.processorID; words: Words; format: Format; TRUSTED { words _ LOOPHOLE[@me]; }; SELECT which FROM NIL, $Octal => format _ octal; $Decimal, $ProductSoftware => format _ productSoftware; $Hex => format _ hex; ENDCASE => RETURN; text _ AppendField[text, words, SIZE[ProcessorFace.ProcessorID], format]; rope _ Rope.FromRefText[text]; RefText.ReleaseScratch[text]; }; maxDigits: NAT = MAX[16]; Digits: TYPE = ARRAY [0..maxDigits) OF NAT; Format: TYPE = {octal, productSoftware, hex}; Words: TYPE = POINTER TO ARRAY [0..3) OF WORD; UnrecognizedFormatOption: ERROR = CODE; This will break on a 32 bit machine. AppendField: PROC [text: REF TEXT, words: Words, count: NAT, format: Format] RETURNS [REF TEXT] = { digits: Digits; base: NAT; SELECT format FROM octal => base _ 8; productSoftware => base _ 10; hex => base _ 16; ENDCASE => ERROR UnrecognizedFormatOption; TRUSTED { ConvertToDigits[words, count, base, @digits]; text _ AppendDigits[text, @digits, base = 10]; }; IF base = 16 THEN text _ RefText.AppendChar[text, 'H]; RETURN[text]; }; ConvertToDigits: PROC [words: Words, size, base: NAT, digits: POINTER TO Digits] = TRUSTED { digits^ _ ALL[0]; FOR i: NAT IN [0..size*Basics.bitsPerWord) DO bit: CARDINAL _ ShiftFieldLeft[words, size, 1]; FOR j: NAT DECREASING IN [0..maxDigits) DO digits[j] _ digits[j]*2 + bit; IF digits[j] >= base THEN { digits[j] _ digits[j] - base; bit _ 1; } ELSE bit _ 0; ENDLOOP; ENDLOOP; }; ShiftFieldLeft: PROC [words: Words, count: NAT, shift: INTEGER] RETURNS [left: NAT] = TRUSTED { right: WORD _ 0; FOR i: NAT DECREASING IN [0..count) DO left _ Basics.BITSHIFT[words[i], shift - 16]; words[i] _ Basics.BITOR[Basics.BITSHIFT[words[i], shift], right]; right _ left; ENDLOOP; }; AppendDigits: PROC [text: REF TEXT, digits: POINTER TO Digits, dashes: BOOL] RETURNS [REF TEXT] = TRUSTED { something: BOOL _ FALSE; FOR i: NAT IN [0..maxDigits) DO v: NAT _ digits[i]; IF dashes AND something AND (maxDigits - i) MOD 3 = 0 THEN text _ RefText.AppendChar[text, '-]; IF v # 0 AND ~something THEN { IF dashes THEN { SELECT maxDigits - i FROM 1 => text _ RefText.AppendRope[text, "0-00"]; 2 => text _ RefText.AppendRope[text, "0-0"]; 3 => text _ RefText.AppendRope[text, "0-"]; ENDCASE => NULL; }; IF v > 9 THEN text _ RefText.AppendChar[text, '0]; -- Leading digit for Hex case something _ TRUE; }; IF something THEN { c: CHAR _ IF v > 9 THEN v - 10 + 'A ELSE v + '0; text _ RefText.AppendChar[text, c]; }; ENDLOOP; IF ~something THEN text _ RefText.AppendChar[text, '0]; RETURN[text]; }; ΚΞ–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ Οeœ=™HK™)K™—šΟk ˜ Kšœžœ˜+Kšœžœ˜"Kšœ˜Kšœ žœ˜Kšœ˜K˜—šΟnœžœž˜Kšžœ˜$Kšžœ$ž˜0K˜Kšžœžœžœ˜Kšœžœ&˜:K˜Kšœžœžœžœ˜0K˜—™Kšœ˜šŸœžœžœ žœžœžœžœ˜>Kšœ-˜-Kšžœ žœžœ˜0K˜K™—šŸœžœžœ žœžœžœžœ˜AKšœ-˜-Kšžœ žœžœ˜3K˜K™—šŸ œžœžœ žœžœžœžœ˜AKšœ˜K™CKšœ žœžœ^™ršœžœž˜-Kšžœ˜Kšœ.˜.Kšœ ˜ Kšžœžœ˜—Kšœžœ%˜Lšžœžœ˜K™Kšžœžœžœ˜Kšœ žœ ˜Kšœ˜šŸœžœžœ˜%š žœžœžœ.žœžœž˜NKšžœžœžœ ˜7Kšžœ˜—Kšžœžœ˜ K˜—šžœž˜Kšœ˜Kšœ˜Kšžœ˜Kšžœžœ˜—Kš žœžœžœžœžœ˜%Kšžœžœžœžœ˜,Kšžœ žœžœ˜(Kšžœžœ˜K˜—K˜šžœ˜K˜—K™ZK™šŸ œžœžœ žœžœžœžœ™EKšœžœžœ$™2Kšœ:™:K™ Kšœ™Kšžœ žœ ™#šžœž™Kšžœ™Kšœ7™7Kšœ™Kšžœžœ™—Kšœ žœ%™IKšœ™K™K™K™—Kšœ žœžœ™Kš œžœžœžœžœ™+Kšœžœ!™-Kš œžœžœžœžœžœžœ™.K™KšŸœžœžœ™'K™Kšœ$™$K™šŸ œžœžœžœžœžœžœžœ™cK™Kšœžœ™ šžœž™K™K™K™Kšžœžœ™*—šžœ™ Kšœ-™-Kšœ1™1—Kšžœ žœ%™6Kšžœ™ K™K™—š Ÿœžœžœ žœžœ žœ™\Kšœ žœ™šžœžœžœž™-Kšœžœ"™/š žœžœž œžœž™*K™Kšžœžœ+™DKšžœ ™ Kšžœ™—Kšžœ™—Kšœ™K™—šŸœžœžœ žœ™?Kšžœžœžœ™Kšœžœ™š žœžœž œžœ ž™&Kšœžœ™-Kšœžœžœ™AK™ Kšžœ™—K™K™—šŸ œžœžœžœ žœžœžœžœžœžœžœ™kKšœ žœžœ™šžœžœžœž™Kšœžœ ™š žœžœ žœžœž™:Kšœ$™$—Kšžœžœ žœ™šžœžœ™Kšžœž™šœ-™-Kšœ,™,Kšœ+™+Kšžœžœ™—Kšžœžœ'Οc™QKšœ žœ™—šžœ žœ™Kš œžœžœžœ žœ™0Kšœ&™&—Kšžœ™—Kšžœ žœ%™7Kšžœ™ K™—K˜Kšœ˜K˜—K˜—…—Œ