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