DIRECTORY Atom, DB, DBDefs, DBNames, Rope; DBNamesImpl: CEDAR PROGRAM IMPORTS Atom, Rope, DB EXPORTS DBNames = BEGIN OPEN Rope, DBDefs; Separator: PUBLIC CHAR _ '#; Sep: ROPE = Rope.FromChar[Separator]; EntityToName: PUBLIC PROC[e: Entity, seg: Segment] RETURNS[ name: ROPE ] = { name _ Rope.Cat[DB.GetSegmentInfo[seg].filePath, Sep, Atom.GetPName[seg], Sep]; name _ Rope.Cat[ name, DB.DomainInfo[DB.EntityInfo[e].domain].name, Sep, DB.EntityInfo[e].name ] }; MakeName: PUBLIC PROC[seg: Segment, domain, eName: ROPE] RETURNS[name: ROPE] = { name _ Rope.Cat[DB.GetSegmentInfo[seg].filePath, Sep, Atom.GetPName[seg], Sep]; name _ Rope.Cat[ name, domain, Sep, eName ] }; NameToEntity: PUBLIC PROC[name: ROPE, create: BOOL _ FALSE] RETURNS[e: Entity] = { segName, domainName, entityName: ROPE; domain: Domain; segment: Segment; [segName, domainName, entityName] _ DecomposeName[name]; segment _ Atom.MakeAtom[segName]; IF NOT Rope.Equal[DB.GetSegmentInfo[segment].filePath, SegmentOf[name].filePath, FALSE] THEN RETURN[NIL]; domain _ DB.LookupDomain[ domainName, segment ! DB.Error => CHECKED { domain _ NIL; CONTINUE } ]; e _ IF domain = NIL THEN NIL ELSE DB.LookupEntity[ domain, entityName ]; IF e = NIL AND domain # NIL AND create THEN e _ DB.DeclareEntity[ domain, entityName ! DB.Error => CONTINUE ] }; SegmentOf: PUBLIC PROC[name: ROPE] RETURNS[segment: Segment, filePath: ROPE] = { segmentName: ROPE; substrLength: INT _ Rope.Find[name, Sep]; -- always has the length to the next separator filePath _ Rope.Substr[name, 0, substrLength]; name _ Rope.Replace[name, 0, substrLength+1]; -- make sure to throw away the separator substrLength _ Rope.Find[name, Sep]; segmentName _ Rope.Substr[name, 0, substrLength]; RETURN[ Atom.MakeAtom[segmentName], filePath ] }; DecomposeName: PUBLIC PROC[name: ROPE] RETURNS[segment, domain, entity: ROPE] = BEGIN substrLength: INT _ Rope.Find[name, Sep]; name _ Rope.Replace[name, 0, substrLength+1]; substrLength _ Rope.Find[name, Sep]; segment _ Rope.Substr[name, 0, substrLength]; name _ Rope.Replace[name, 0, substrLength+1]; substrLength _ Rope.Find[name, Sep]; domain _ Rope.Substr[name, 0, substrLength]; entity _ Rope.Replace[name, 0, substrLength+1] END; END. . . (File: DBNamesImpl.mesa last edited by: Cattell, July 5, 1983 5:00 pm Donahue, March 20, 1986 9:33:00 am PST Willie-sue, March 27, 1986 5:52:18 pm PST check to make sure that this is the right segment for the entity throw away the leading file path information now get the remaining fields ʘ˜Jšœ™šœ™Jšœ™Jšœ&™&Jšœ)™)J˜—šÏk ˜ J˜J˜Jšœ˜J˜J˜J˜—šœ œœœ ˜CJ˜Jšœœ˜J˜Jšœ œœ˜J˜Jšœœ˜%J˜š Ïn œœœœœ˜LJšœœ=˜OJšœc˜cJ˜—Jšžœœœœœœœ˜NJšœQ˜QJšœ0˜0J˜šž œœœœ œœœ˜RJšœ!œ˜&J˜Jšœ˜J˜8J˜!Jšœ@™@šœœ œ=œ˜WJšœœœ˜—˜0Jšœ œ œœ˜1—Jš œœ œœœ'˜Hš œœœ œœ˜+Jšœ+œ œ˜DJ˜——š ž œœœœœœ˜PJšœ œ˜JšœœÏc.˜XJšœ.˜.Jšœ.Ÿ(˜VJ˜$Jšœ1˜1Jšœ+˜1J˜—š ž œœœœœœ˜OJš˜Jšœœ˜)J™,Jšœ-˜-J™J˜$J˜-Jšœ-˜-J˜$J˜,Jšœ.˜.Jšœ˜J˜——Jšœ˜—…—² r