<> <> DIRECTORY FS, IO, Rope, RoseCreate, RoseTranslateTypes, RoseTranslateInsides, RoseTypes; RopePorts: CEDAR PROGRAM IMPORTS FS, IO, Rope, RoseTranslateInsides EXPORTS RoseCreate = BEGIN OPEN RoseTypes, RoseTranslateTypes, RoseTranslateInsides; PortsFromROPE: PUBLIC PROC [asRope: ROPE] RETURNS [ports: Ports] = {ports _ PortsFromStream[IO.RIS[asRope]]}; PortsFromFile: PUBLIC PROC [fileName: ROPE] RETURNS [ports: Ports] = {ports _ PortsFromStream[FS.StreamOpen[fileName]]}; PortsFromStream: PUBLIC PROC [stream: STREAM] RETURNS [ports: Ports] = BEGIN length: CARDINAL _ stream.GetCard[]; ports _ NEW [PortsRep[length]]; FOR portIndex: CARDINAL IN [0 .. length) DO job: Job _ NEW [JobRep _ [ exec: NIL, rootName: NIL, from: stream, log: viewerLog, type: Other]]; any: REF ANY; bits: [0 .. 16); terminator: ROPE; ports[portIndex].firstWord _ stream.GetCard[]; ports[portIndex].wordCount _ stream.GetCard[]; ports[portIndex].name _ stream.GetRopeLiteral[]; [any, terminator] _ ParseExpression[job, TRUE]; IF NOT terminator.Equal["!!"] THEN ERROR; WITH any SELECT FROM sti: SignalTypeInvocation => ports[portIndex].type _ sti.st; rope: ROPE => {sti: SignalTypeInvocation _ InstantiateSignalType[job, rope, NIL]; ports[portIndex].type _ sti.st}; ENDCASE => ERROR; bits _ stream.GetCard[]; ports[portIndex].input _ (bits MOD 2) >= 1; ports[portIndex].output _ (bits MOD 4) >= 2; ports[portIndex].XPhobic _ (bits MOD 8) >= 4; ports[portIndex].special _ (bits MOD 16) >= 8; ENDLOOP; [] _ stream.SkipWhitespace[flushComments: FALSE]; IF NOT stream.EndOf[] THEN ERROR; END; END.