DIRECTORY CCTypes USING[CCError, CCErrorCase], CirioNubAccess USING [Handle, --HandleBody,-- RemoteAddress], CirioTypes USING[CompilerContext], IO USING [PutFR], LoadStateAccess USING [BasicPCInfo, GetLoadedModuleInfoFromStemName, LoadedModuleInfo, LoadStateHandle], NewRMTW USING[CedarModuleSet], ObjectFiles USING [FileSegmentPC, GetLineNumForPC, GetPCForLineNum], PFS USING [nullUniqueID, PATH, PathFromRope, RopeFromPath, UniqueID], RCTW USING [CBreakAddress, RopeList], RMTWPrivate USING [GetNamePartsFromFullPathName, NameParts, SeekCSource], Rope USING[ROPE], SourceFileOpsExtras, SystemInterface; RCTWSchemas: CEDAR PROGRAM IMPORTS CCTypes, IO, LoadStateAccess, ObjectFiles, PFS, RMTWPrivate, SystemInterface EXPORTS RCTW = BEGIN OPEN LSA:LoadStateAccess, ObjF:ObjectFiles; CCError: ERROR[case: CCTypes.CCErrorCase, msg: Rope.ROPE _ NIL] _ CCTypes.CCError; CCE: ERROR[case: CCTypes.CCErrorCase, msg: Rope.ROPE _ NIL] _ CCTypes.CCError; CC: TYPE = CirioTypes.CompilerContext; RemoteAddress: TYPE = CirioNubAccess.RemoteAddress; InvalidRemoteAddress: CirioNubAccess.RemoteAddress _ [NIL, 0, 0, FALSE, FALSE]; GetSourcePosition: PUBLIC PROC [absPC: CARD, cms: NewRMTW.CedarModuleSet, basicInfo: REF LSA.BasicPCInfo, ledo: REF LoadStateAccess.LoadedModuleInfo] RETURNS [SourceFileOpsExtras.Position] ~ { containingDotORelativePC: CARD ~ absPC - ledo.lsi[text].base; cln: CARD ~ ObjF.GetLineNumForPC[ledo.module, [[0, ""], containingDotORelativePC]]; file: SystemInterface.CirioFile ~ RMTWPrivate.SeekCSource[cms, basicInfo, ledo]; RETURN [[ fileName: IF file#NIL THEN file.GetNameOfFile[] ELSE PFS.PathFromRope["I-dont-know-the-filename.c"], uniqueID: IF file#NIL THEN file.GetFileInfo.uniqueID ELSE PFS.nullUniqueID, index: [line: [cln]]]]}; DescribeCBreakAddress: PUBLIC PROC [addr: REF RCTW.CBreakAddress] RETURNS [RCTW.RopeList] ~ { IF addr=NIL THEN RETURN[LIST["failed to set break"]]; {srcName: PFS.PATH ~ SystemInterface.GetNameOfFile[addr.source]; RETURN[LIST[ IO.PutFR["setting break at line %g of %g", [cardinal[addr.givenLineNumber]], [rope[PFS.RopeFromPath[srcName]]] ], IO.PutFR[" module relative pos = %g", [cardinal[addr.moduleRelativePC.relPC]] ], IO.PutFR[" statement begins at line %g", [cardinal[addr.stmtLineNumber]] ], IO.PutFR[" absolute PC = %g", [cardinal[addr.absPC]] ] ]]}}; GetAbsAddressForBreak: PUBLIC PROC [fileSet: SystemInterface.FileSet, src: SystemInterface.CirioFile, loadState: LoadStateAccess.LoadStateHandle, sourceLine: CARD] RETURNS [REF RCTW.CBreakAddress] ~ { lmi: REF LoadStateAccess.LoadedModuleInfo ~ GetLoadedModuleForC[fileSet, src, loadState]; parsedRelativePC: ObjF.FileSegmentPC; IF lmi=NIL THEN RETURN [NIL]; parsedRelativePC _ ObjF.GetPCForLineNum[lmi.module, sourceLine]; RETURN [NEW[RCTW.CBreakAddress _ [ source: src, givenLineNumber: sourceLine, moduleRelativePC: [[0, ""], parsedRelativePC.relPC - lmi.moduleRelativeBaseAddr], absPC: lmi.lsi[text].base+parsedRelativePC.relPC, stmtLineNumber: ObjF.GetLineNumForPC[lmi.module, parsedRelativePC], loadedModule: lmi]] ]}; GetLoadedModuleForC: PROC [fileSet: SystemInterface.FileSet, src: SystemInterface.CirioFile, loadState: LoadStateAccess.LoadStateHandle] RETURNS [lmi: REF LoadStateAccess.LoadedModuleInfo _ NIL] ~ { srcName: PFS.PATH _ SystemInterface.GetNameOfFile[src]; parts: RMTWPrivate.NameParts _ RMTWPrivate.GetNamePartsFromFullPathName[srcName]; stemRope: Rope.ROPE _ parts.nameStem; lmi _ LoadStateAccess.GetLoadedModuleInfoFromStemName[loadState, parts.nameStem, 1]; }; END..  RCTWSchemas.mesa Copyright Σ 1989, 1990, 1991, 1992 by Xerox Corporation. All rights reserved. Hopcroft August 18, 1989 11:46:08 am PDT Last changed by Theimer on October 9, 1989 2:06:55 pm PDT Sturgis, January 2, 1990 12:21:29 pm PST Last tweaked by Mike Spreitzer on April 10, 1992 4:25 pm PDT Philip James, August 27, 1991 3:33 pm PDT Laurie Horton, May 19, 1992 1:26 pm PDT Source mapping This crockaloid construction is copied from RMTWModules on Dec 12, 1991 by MJS, who doesn't know why we're making such a mess. Κ •NewlineDelimiter ™code™K™NK™(K™9K™(K™