<> <> <> <<>> 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[]; }.