GvNsMapImpl.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
John Larson, May 26, 1986 5:23:35 pm PDT
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]<Registrar>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}];
Crunch out leading lines
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[];
}.