DIRECTORY CD, CDDesignCache, CDGenerate, CDGenerateBackdoor, CDGenerateImports, CDImports, CDDirectory, CDProperties, CDGenerateRemote, FileNames, RefTab, Rope, SymTab, TerminalIO, TokenIO; CDGenerateSomeImpl: CEDAR PROGRAM IMPORTS CDDesignCache, CDGenerate, CDGenerateBackdoor, CDDirectory, CDImports, CDProperties, FileNames, RefTab, Rope, SymTab, TerminalIO EXPORTS CDGenerateRemote, CDGenerateImports SHARES CDImports = BEGIN dummy: CDGenerate.Context _ CDGenerate.Create[]; dummy2: CDGenerate.Context _ CDGenerate.Create[]; contextToName: RefTab.Ref _ RefTab.Create[]; nameToImportContext: SymTab.Ref _ SymTab.Create[]; nameToRemoteContext: SymTab.Ref _ SymTab.Create[]; DirectorySelector: CDGenerateBackdoor.SelectorProc = { key _ TerminalIO.RequestRope[" from directory>"]; }; DirectoryIndirector: CDGenerateBackdoor.IGeneratorProc = { IF Rope.IsEmpty[key] THEN key _ TerminalIO.RequestRope["type name >"]; RETURN [CDDirectory.Fetch[design, key].object] }; UnspecImportSelector: CDGenerateBackdoor.SelectorProc = { key _ TerminalIO.RequestRope[" import [design.object] >"]; }; ImportSelector: CDGenerateBackdoor.SelectorProc = { dName: Rope.ROPE = ImporteeName[context]; key _ TerminalIO.RequestRope[Rope.Cat[label, " import object from ", dName, " >"]]; }; ImportIGenerator: CDGenerateBackdoor.IGeneratorProc = { importeeName: Rope.ROPE _ ImporteeName[realContext]; IF Rope.IsEmpty[importeeName] THEN { TerminalIO.PutRope["**generate with bad importee name\n"]; RETURN }; IF Rope.Equal[importeeName, design.name] THEN { ob _ CDDirectory.Fetch[design, key].object; RETURN }; [] _ CDImports.GetCache[design, importeeName, true]; ob _ CDImports.CreateImportFromCache[design, key, importeeName]; }; UnspecImportIGenerator: CDGenerateBackdoor.IGeneratorProc = { dotIndex: INT; importeeName, objectName: Rope.ROPE _ NIL; name: Rope.ROPE _ FileNames.GetShortName[key]; dotIndex _ Rope.Index[name, 0, "."]; --the first dot! multiple dots belong to the object name IF dotIndex r _ n ENDCASE => { context _ CDGenerateBackdoor.Indiretee[context]; IF context#NIL THEN RETURN[ImporteeName[context]] }; }; GetImportContext: PUBLIC PROC [designName: Rope.ROPE] RETURNS [context: CDGenerate.Context_NIL] = { WITH nameToImportContext.Fetch[designName].val SELECT FROM t: CDGenerate.Context => RETURN [t] ENDCASE => NULL; context _ CDGenerateBackdoor.CreateIndirect[onTopOf: dummy, iGenerator: ImportIGenerator, selector: ImportSelector, cache: TRUE, flushThrough: FALSE, clearThrough: FALSE, registerThrough: FALSE]; [] _ contextToName.Insert[context, designName]; IF nameToImportContext.Insert[designName, context] THEN RETURN; RETURN [GetImportContext[designName]] --indirection for concurrency problems }; UnspecRemoteSelector: CDGenerateBackdoor.SelectorProc = { key _ TerminalIO.RequestRope[" include [design.oject] >"]; }; RemoteSelector: CDGenerateBackdoor.SelectorProc = { dName: Rope.ROPE = RemoteDesignName[context]; key _ TerminalIO.RequestRope[Rope.Cat[label, " include oject from ", dName, " >"]]; }; UnspecRemoteIGenerator: CDGenerateBackdoor.IGeneratorProc = { dotIndex: INT; remoteName, objectName: Rope.ROPE _ NIL; name: Rope.ROPE _ FileNames.GetShortName[key]; dotIndex _ Rope.Index[name, 0, "."]; --the first dot! multiple dots belong to the object name IF dotIndex < Rope.Length[name] THEN { objectName _ Rope.Substr[name, dotIndex+1]; remoteName _ Rope.Substr[name, 0, dotIndex] }; IF ~Rope.IsEmpty[remoteName] AND ~Rope.IsEmpty[objectName] THEN { context: CDGenerate.Context _ GetRemoteContext[remoteName]; ob _ CDGenerate.FetchNCall[context, design, objectName]; } ELSE TerminalIO.PutRopes["**tried to access remote with bad syntax; [", key, "]\n"]; }; GetRemoteContext: PUBLIC PROC [remoteDesign: Rope.ROPE] RETURNS [context: CDGenerate.Context_NIL] = { IF Rope.IsEmpty[remoteDesign] THEN ERROR; WITH nameToRemoteContext.Fetch[remoteDesign].val SELECT FROM t: CDGenerate.Context => RETURN [t] ENDCASE => NULL; context _ CDGenerateBackdoor.CreateIndirect[onTopOf: dummy2, iGenerator: RemoteIGenerator, selector: RemoteSelector, cache: TRUE, flushThrough: FALSE, clearThrough: FALSE, registerThrough: FALSE]; [] _ contextToName.Insert[context, remoteDesign]; IF nameToRemoteContext.Insert[remoteDesign, context] THEN RETURN; RETURN [GetRemoteContext[remoteDesign]] --indirection for concurrency problems }; GetRemoteObject: PUBLIC PROC [for: CD.Design, remoteDesign: Rope.ROPE, object: Rope.ROPE] RETURNS [ob: CD.Object] = { context: CDGenerate.Context = GetRemoteContext[remoteDesign]; ob _ CDGenerate.FetchNCall[context, for, object]; }; RemoteDesignName: PUBLIC PROC [context: CDGenerate.Context] RETURNS [r: Rope.ROPE_NIL] = { WITH contextToName.Fetch[context].val SELECT FROM rn: Rope.ROPE => RETURN [rn]; ENDCASE => { context _ CDGenerateBackdoor.Indiretee[context]; IF context#NIL THEN RETURN [RemoteDesignName[context]] }; }; RemoteIGenerator: CDGenerateBackdoor.IGeneratorProc = { GetOver: PROC [into: CD.Design, from: CD.Design, ob: CD.Object, key: REF_NIL] RETURNS [ob1: CD.Object_NIL] = { replaceList: CDDirectory.ReplaceList _ NIL; EachChild: CDDirectory.EachObjectProc = { IF me.class.composed THEN { replaceRec: REF CDDirectory.ReplaceRec; ob1: CD.Object; IF CDDirectory.IsIncluded[from, me] THEN { ob1 _ CDGenerate.FetchNCall[realContext, design, CDDirectory.Name[me, from]]; }; IF ob1=NIL THEN ob1 _ GetOver[into, from, me, NIL]; IF ob1=NIL THEN ERROR; replaceRec _ NEW[CDDirectory.ReplaceRec _ [old: me, new: ob1]]; replaceList _ CONS[replaceRec, replaceList]; } }; ca: BOOL; [ob1, ca] _ CDDirectory.Another1[me: ob, fromOrNil: from, into: into]; IF ob1#NIL THEN { IF ~ca THEN { [] _ CDDirectory.EnumerateChildObjects[me: ob1, proc: EachChild]; IF replaceList#NIL THEN [] _ CDDirectory.ReplaceDirectChild[me: ob1, design: into, replace: replaceList, propagate: FALSE]; }; IF CDDirectory.IsIncluded[from, ob] THEN [] _ CDDirectory.Include[design: into, object: ob1, name: CDDirectory.Name[ob, from]]; CDProperties.PutObjectProp[ob1, $CameFrom, from.name]; IF key=NIL THEN key _ CDDirectory.Name[ob, from]; CDProperties.PutObjectProp[ob1, $OriginalName, key]; }; }; remoteDesign: CD.Design; remoteName: Rope.ROPE _ RemoteDesignName[passContext]; IF Rope.Equal[remoteName, design.name] THEN { ob _ CDDirectory.Fetch[design, key].object; RETURN }; IF Rope.IsEmpty[remoteName] THEN { TerminalIO.PutRope["**generate with bad remote name\n"]; RETURN }; remoteDesign _ CDDesignCache.GetOrRead[for: design, remoteName: remoteName, reload: FALSE, checkFile: TRUE].remote; IF remoteDesign#NIL THEN { rob: CD.Object _ CDDirectory.Fetch[remoteDesign, key].object; IF rob#NIL THEN RETURN [GetOver[into: design, from: remoteDesign, ob: rob, key: key]]; }; }; fromDirectory: CDGenerate.Context _ CDGenerateBackdoor.CreateIndirect[ onTopOf: CDGenerate.Create[], iGenerator: DirectoryIndirector, selector: DirectorySelector ]; unspecImportContext: CDGenerate.Context _ CDGenerateBackdoor.CreateIndirect[ onTopOf: dummy, iGenerator: UnspecImportIGenerator, selector: UnspecImportSelector ]; unspecRemoteContext: CDGenerate.Context _ CDGenerateBackdoor.CreateIndirect[ onTopOf: dummy2, iGenerator: UnspecRemoteIGenerator, selector: UnspecRemoteSelector ]; [] _ SymTab.Insert[CDGenerateBackdoor.publicContexts, "INCLUDE", unspecRemoteContext]; [] _ SymTab.Insert[CDGenerateBackdoor.publicContexts, "IMPORT", unspecImportContext]; [] _ SymTab.Insert[CDGenerateBackdoor.publicContexts, "DIRECTORY", fromDirectory]; [] _ CDProperties.Register[$CameFrom, [autoRem: TRUE, exclusive: TRUE]]; [] _ CDProperties.Register[$OriginalName, [autoRem: TRUE, exclusive: TRUE]]; END. ΒCDGenerateSomeImpl.mesa (part of ChipNDale) Copyright c 1985, 1987 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, June 5, 1985 8:02:35 pm PDT Last edited by: Christian Jacobi, April 9, 1987 5:57:06 pm PDT context ==> remote design name remote design name ==> context --directory --imports --Remote --this one even does not know what design to use --will be cached !! --test for silly case of using same design name Κ€˜codešœ+™+Kšœ Οmœ7™BKšœ5Οk™8Kšœ>™>K˜—šž œ˜ Kšžœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜—K˜šΟnœžœž˜!Kšžœ˜ˆKšžœ%˜,Kšžœ ˜—Kšž˜K˜Kšœ0˜0Kšœ1˜1šœ-˜-Kšœ™—Kšœ2˜2šœ2˜2Kšœ™—K™KšΟb ™ K™šΠbnœ%˜6Kšœ1˜1Kšœ˜K˜—š‘œ'˜:Kšžœžœ-˜FKšžœ)˜/Kšœ˜—K™Kš  ™ K˜š œ%˜9Kšœ:˜:Kšœ˜K˜—š œ%˜3Kšœ žœ˜)KšœS˜SKšœ˜K˜—š‘œ'˜7Kšœžœ˜4šžœžœ˜$Kšœ:˜:Kšž˜Kšœ˜—šžœ'žœ˜/Kšœ+˜+Kšž˜K˜—Kšœ4˜4Kšœ@˜@Kšœ˜—K˜š œ'˜=Kšœ žœ!žœžœ˜9Kšœ žœ˜.Kšœ&Οc8˜^šžœžœ˜$Kšœ+˜+Kšœ-˜-K˜—šžœžœžœ˜CKšœ=˜=Kšœ8˜8K˜—KšžœJ˜NKšœ˜—K˜š Ÿ œžœžœžœ žœžœ˜Všžœ"žœž˜1Kšœžœ ˜šžœ˜ Kšœ0˜0Kšžœ žœžœžœ˜1Kšœ˜——Kšœ˜—K˜š Ÿœž œžœžœžœ˜cšžœ+žœž˜:Kšœžœ˜#Kšžœžœ˜—šœZ˜ZKš œ!žœžœžœžœ˜i—Kšœ/˜/Kšžœ1žœžœ˜?Kšžœ ’&˜LKšœ˜—K˜K˜Kš ™K˜š‘œ%˜9Kšœ:˜:Kšœ˜K˜—š‘œ%˜3Kšœ žœ˜-KšœS˜SKšœ˜K˜—š‘œ'˜=Kš’0™0Kšœ žœžœžœ˜7Kšœ žœ˜.Kšœ&’8˜^šžœžœ˜&Kšœ+˜+Kšœ+˜+K˜—šžœžœžœ˜AKšœ;˜;Kšœ8˜8K˜—KšžœQ˜UKšœ˜—K˜š Ÿœžœžœžœžœžœ˜eKšžœžœžœ˜*šžœ-žœž˜