DIRECTORY FS USING [Error, StreamOpen], GvNsMap, IO USING [Close, EndOf, EndOfStream, Error, GetChar, GetLineRope, GetTokenRope, IDProc, PeekChar, STREAM], MessageWindow USING [Append], Rope USING [Cat, Equal, Fetch, Find, Length, ROPE, Substr]; GvNsMapImpl: CEDAR PROGRAM IMPORTS FS, IO, MessageWindow, Rope EXPORTS GvNsMap = { ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; fileName: ROPE _ "[Indigo]GV>GV-NS-Mapping.txt"; MapRec: TYPE = RECORD[ gvReg: Rope.ROPE, nsDomain: Rope.ROPE]; MapEntry: TYPE = REF MapRec; map: LIST OF MapEntry _ NIL; GetNsDomain: PUBLIC PROC[gvReg: Rope.ROPE] RETURNS[nsDomain: Rope.ROPE] = { entry: MapEntry; FOR list: LIST OF MapEntry _ map, list.rest UNTIL list = NIL DO entry _ list.first; IF Rope.Equal[entry.gvReg, gvReg, FALSE] THEN RETURN[entry.nsDomain]; ENDLOOP; RETURN[NIL]; }; GetNsName: PUBLIC PROC[gvName: Rope.ROPE] RETURNS[nsName: Rope.ROPE] = { sn, reg, domain: Rope.ROPE; [sn, reg] _ BreakName[gvName]; IF sn = NIL THEN RETURN[NIL]; domain _ GetNsDomain[reg]; IF domain = NIL THEN RETURN[NIL]; RETURN[Rope.Cat[sn, ":", domain]]; }; BreakName: PROC[name: Rope.ROPE] RETURNS[sn, reg: Rope.ROPE] = BEGIN length: INT = name.Length[]; FOR i: INT DECREASING IN [0..length) DO IF name.Fetch[i] = '. THEN RETURN[ sn: name.Substr[start: 0, len: i], reg: name.Substr[start: i+1, len: length-(i+1)] ]; ENDLOOP; RETURN[sn: NIL, reg: name]; END; ReadGvNsMappingFile: PROC ~ { ENABLE { IO.EndOfStream => GO TO GiveUp; IO.Error => { MessageWindow.Append[message: Rope.Cat["Format problem in ", fileName], clearFirst: TRUE]; GO TO GiveUp; }; }; f: IO.STREAM; t: Rope.ROPE; SkipWhite: PROC [s: IO.STREAM] ~ { WHILE s.PeekChar[] = ' OR s.PeekChar[] = '\t DO [] _ s.GetChar[]; ENDLOOP; }; SkipCRs: PROC [s: IO.STREAM] ~ { WHILE s.PeekChar[] = '\n DO [] _ s.GetChar[]; ENDLOOP; }; f _ FS.StreamOpen[fileName ! FS.Error => { MessageWindow.Append[message: error.explanation, clearFirst: TRUE]; GO TO GiveUp}]; WHILE NOT f.EndOf[] DO t _ f.GetLineRope[]; IF Rope.Find[t, "GV-to-NS Mappings:"] # -1 THEN EXIT; ENDLOOP; SkipCRs[f]; -- Crunch out beginning CRs WHILE NOT f.EndOf[] DO mapItem: MapEntry _ NEW[MapRec]; IF f.PeekChar[] = '\n THEN EXIT; SkipWhite[f]; IF f.PeekChar[] # '. THEN { MessageWindow.Append[message: Rope.Cat["Format problem in ", fileName], clearFirst: TRUE]; GO TO GiveUp}; [] _ f.GetChar[]; -- get rid of "." [token: mapItem.gvReg] _ f.GetTokenRope[IO.IDProc]; SkipWhite[f]; [token: t] _ f.GetTokenRope[IO.IDProc]; SkipWhite[f]; mapItem.nsDomain _ f.GetLineRope[]; IF ~Rope.Equal[t, "->"] THEN { MessageWindow.Append[message: Rope.Cat["Format problem in ", fileName], clearFirst: TRUE]; GO TO GiveUp}; map _ CONS[mapItem, map]; ENDLOOP; IO.Close[f]; EXITS GiveUp => NULL; }; ReadGvNsMappingFile[]; }. ˜GvNsMapImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. John Larson, May 26, 1986 5:23:35 pm PDT Crunch out leading lines Κ˜šœ™Icodešœ Οmœ1™Jšž˜Jšœžœ˜š žœžœž œžœ ž˜'šžœžœžœ˜"Jšœ"˜"Jšœ2˜2—Jšžœ˜—Jšžœžœ ˜Jšžœ˜—K˜code2š œžœ˜šžœ˜Lšžœžœžœ˜šžœ ˜ LšŸ(œŸœŸΠkrŸ˜ZLšžœžœ˜ L˜—L˜—Lšœžœžœ˜ Lšœžœ˜ L˜š  œžœžœžœ˜"šžœžœž˜0L˜Lšžœ˜—L˜L˜—š œžœžœžœ˜ šžœž˜L˜Lšžœ˜—L˜L˜—L˜šœžœžœ ˜*LšŸœžœ˜CLšžœžœ ˜L˜—Lšœ™šžœžœ žœ˜Lšœ˜Lšžœ)žœžœ˜5Lšžœ˜L˜—Lšœ Οc˜(L˜šžœžœ ž˜Lšœžœ ˜!Lšžœžœžœ˜ L˜ šžœžœ˜LšŸœŸ œ6žœ˜ZLšžœžœ ˜—šœ’˜$L˜—Lšœ(žœ ˜3L˜ Lšœžœ ˜'L˜ Lšœ$˜$šžœžœ˜LšŸœŸ œ6žœ˜ZLšžœžœ ˜—Lšœžœ˜Lšžœ˜šžœ ˜ L˜——šž˜Lšœ žœ˜L˜——K˜K˜Kšœ˜K˜—Kšœ˜K˜K˜—…— ξ₯