DIRECTORY FakeCirio, TargetArchitecture, BreakWorldArchitecture, IncrementalLoad, Rope, UXStrings; FakeCirioImpl: CEDAR PROGRAM IMPORTS FakeCirio, TargetArchitecture, BreakWorldArchitecture, IncrementalLoad, Rope, UXStrings EXPORTS FakeCirio ~ { PeekContents: PUBLIC BreakWorldArchitecture.PeekContentsProc ~ TRUSTED { contents: TargetArchitecture.Contents ¬ TargetArchitecture.nullContents; IF address.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "PeekContents[nullAddress]"]; }; { targetAddress: TargetArchitecture.Address ~ BreakWorldArchitecture.TargetAddressFromBreakWorldAddress[address: address]; IF targetAddress.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "PeekContents[nullTargetAddress]"]; }; { contentsAddress: POINTER TO TargetArchitecture.Contents ~ LOOPHOLE[targetAddress]; contents ¬ contentsAddress­; }; }; RETURN [contents]; }; PokeContents: PUBLIC BreakWorldArchitecture.PokeContentsProc ~ TRUSTED { IF address.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "PokeContents[nullAddress]"]; }; { targetAddress: TargetArchitecture.Address ~ BreakWorldArchitecture.TargetAddressFromBreakWorldAddress[address: address]; IF targetAddress.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "PokeContents[nullTargetAddress]"]; }; { contentsAddress: POINTER TO TargetArchitecture.Contents ~ LOOPHOLE[targetAddress]; contentsAddress­ ¬ contents; }; }; RETURN; }; GetProcAddress: PUBLIC BreakWorldArchitecture.GetProcAddressProc ~ TRUSTED { procAddress: BreakWorldArchitecture.Address ¬ BreakWorldArchitecture.nullAddress; IF breakWorld.IsNullBreakWorld[] THEN { ERROR FakeCirio.Cant[message: "GetProcAddress[nullBreakWorld]"]; }; IF procName.IsEmpty[] THEN { ERROR FakeCirio.Cant[message: "GetProcAddress[nullProcName]"]; }; { procString: UXStrings.CString ~ UXStrings.Create[from: procName]; symEntry: IncrementalLoad.SymEntry ~ IncrementalLoad.LookupSymEntry[ sym: procString, externOnly: FALSE]; IF symEntry = NIL THEN { ERROR FakeCirio.Cant[message: "GetProcAddress[nullSymEntry]"]; }; { procTargetAddress: TargetArchitecture.Address ~ LOOPHOLE[symEntry.value]; IF procTargetAddress.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "GetProcAddress[nullProcTargetAddress]"]; }; procAddress ¬ BreakWorldArchitecture.NewAddress[ breakWorld: breakWorld, address: procTargetAddress]; }; }; RETURN [procAddress]; }; GetProcDataSegment: PUBLIC BreakWorldArchitecture.GetProcDataSegmentProc ~ TRUSTED { procDataSegment: BreakWorldArchitecture.Address ¬ BreakWorldArchitecture.nullAddress; symEntry: IncrementalLoad.SymEntry; IF breakWorld.IsNullBreakWorld[] THEN { ERROR FakeCirio.Cant[message: "GetProcDataSegment[nullBreakWorld]"]; }; IF address.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "GetProcDataSegment[nullAddress]"]; }; symEntry ¬ IncrementalLoad.LookupSymEntryByValue[val: LOOPHOLE[address.address]]; IF symEntry = NIL THEN { ERROR FakeCirio.Cant[message: "GetProcDataSegment[nullSymEntry]"]; }; RETURN [BreakWorldArchitecture.NewAddress[breakWorld, LOOPHOLE[symEntry.fe.data.s]]]; }; GetPatchArea: PUBLIC BreakWorldArchitecture.GetPatchAreaProc ~ TRUSTED { patchAreaRep: BreakWorldArchitecture.PatchAreaRep ¬ BreakWorldArchitecture.nullPatchAreaRep; IF address.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "GetPatchArea[nullAddress]"]; }; { breakWorld: BreakWorldArchitecture.BreakWorld ~ BreakWorldArchitecture.BreakWorldFromBreakWorldAddress[address: address]; targetAddress: TargetArchitecture.Address ~ BreakWorldArchitecture.TargetAddressFromBreakWorldAddress[address: address]; IF breakWorld.IsNullBreakWorld[] THEN { ERROR FakeCirio.Cant[message: "GetPatchArea[nullBreakWorld]"]; }; IF targetAddress.IsNullAddress[] THEN { ERROR FakeCirio.Cant[message: "GetPatchArea[nullTargetAddress]"]; }; { symEntry: IncrementalLoad.SymEntry ~ IncrementalLoad.LookupSymEntryByValue[val: LOOPHOLE[targetAddress]]; IF symEntry = NIL THEN { ERROR FakeCirio.Cant[message: "GetProcAddress[nullSymEntry]"]; }; { fileEntry: IncrementalLoad.FileEntry ~ symEntry.fe; IF fileEntry = NIL THEN { ERROR FakeCirio.Cant[message: "GetPatchArea[nullFileEntry]"]; }; patchAreaRep.address ¬ BreakWorldArchitecture.NewAddress[ breakWorld: breakWorld, address: LOOPHOLE[fileEntry.patch.s]]; patchAreaRep.byteSize ¬ fileEntry.patch.len; }; }; }; RETURN [patchAreaRep]; }; Cant: PUBLIC ERROR [message: Rope.ROPE] ~ CODE; }. Ά FakeCirioImpl.mesa Copyright Σ 1989, 1990, 1991, 1993 by Xerox Corporation. All rights reserved. Peter B. Kessler, April 18, 1990 5:17 pm PDT Michael Plass, November 26, 1991 5:17 pm PST Willie-s, May 21, 1992 5:31 pm PDT PROCEDURE [address: BreakWorldArchitecture.Address] RETURNS [TargetArchitecture.Contents] PROCEDURE [address: BreakWorldArchitecture.Address, contents: TargetArchitecture.Contents] RETURNS [] PROCEDURE [breakWorld: breakWorld, procName: Rope.ROPE] RETURNS [BreakWorldArchitecture.Address] PROCEDURE [breakWorld: BreakWorld, address: Address] RETURNS [Address]; PROCEDURE [address: BreakWorldArchitecture.Address] RETURNS [BreakWorldArchitecture.PatchAreaRep] ΚI–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ ΠerœC™NK™,K™,K™"K™šΟk ˜ K˜ Kšœ˜Kšœ˜Kšœ˜K˜Kšœ ˜ —K˜—unitšΠln œžœž˜šžœ˜KšœW˜W—Kšžœ ˜Kšœ˜K˜šΟn œžœ+žœ˜HKšž œ+žœ™ZKšœH˜HK˜šžœžœ˜!Kšžœ6˜;Kšœ˜—˜šœ,˜,KšœL˜L—K˜šžœžœ˜'Kšžœ<˜AKšœ˜—˜Kšœžœžœžœ˜RK˜Kšœ˜K˜—K˜—K˜Kšžœ ˜Kšœ˜K˜—š  œžœ+žœ˜HKšž œRžœ™ešžœžœ˜!Kšžœ6˜;Kšœ˜—˜šœ,˜,KšœL˜L—K˜šžœžœ˜'Kšžœ<˜AKšœ˜—˜Kšœžœžœžœ˜RK˜Kšœ˜K˜—K˜—Kšžœ˜Kšœ˜K˜—š œžœ-žœ˜LKšž œ)žœžœ!™aKšœQ˜QK˜šžœžœ˜'Kšžœ;˜@Kšœ˜—šžœžœ˜Kšžœ9˜>Kšœ˜—˜KšœA˜AšœD˜DKšœžœ˜$—K˜šžœžœ˜Kšžœ9˜>Kšœ˜—˜Kšœ0žœ˜IK˜šžœ#žœ˜+KšžœB˜GKšœ˜—šœ0˜0Kšœ4˜4—K˜—K˜—Kšžœ˜Kšœ˜K˜—š œžœ1žœ˜TKšž œ,žœ ™GK˜UK˜#K˜šžœžœ˜'Kšžœ?˜DKšœ˜—šžœžœ˜!Kšžœ<˜AKšœ˜—šœ6žœ˜QK˜—šžœ žœžœ˜Kšžœ=˜BKšœ˜—Kšžœ0žœ˜UKšœ˜K˜—š  œžœ+žœ˜HKšž œ+žœ&™bKšœ\˜\K˜šžœžœ˜!Kšžœ6˜;Kšœ˜—˜šœ0˜0KšœI˜I—šœ,˜,KšœL˜L—K˜šžœžœ˜'Kšžœ9˜>Kšœ˜—šžœžœ˜'Kšžœ<˜AKšœ˜—šœ˜šœ%˜%Kšœ+žœ˜D—K˜šžœžœ˜Kšžœ9˜>Kšœ˜—˜Kšœ3˜3K˜šžœžœ˜Kšžœ8˜=Kšœ˜—šœ9˜9Kšœ!žœ˜>—Kšœ,˜,K˜—Kšœ˜—K˜—Kšžœ˜Kšœ˜K˜—Kš  œžœžœžœžœ˜/L˜—K˜—…—$#