<> <> <> <> <> <<>> DIRECTORY GGBasicTypes, GGViewerOps, IO, Rope, ViewerClasses, ViewerTools; GGViewerOpsImpl: CEDAR PROGRAM IMPORTS IO, Rope, ViewerTools EXPORTS GGViewerOps = BEGIN Point: TYPE = GGBasicTypes.Point; Viewer: TYPE = ViewerClasses.Viewer; GetReal: PUBLIC PROC [textViewer: Viewer, default: REAL] RETURNS [r: REAL] = { rRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; r _ IF Rope.Size[rRope] = 0 THEN default ELSE IO.GetReal[IO.RIS[rRope] ! IO.EndOfStream, IO.Error => {r _ default; CONTINUE}]; }; GetPositiveReal: PUBLIC PROC [textViewer: Viewer, default: REAL] RETURNS [r: REAL] = { rRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; IF Rope.Size[rRope] = 0 THEN r _ default ELSE { r _ IO.GetReal[IO.RIS[rRope] ! IO.EndOfStream, IO.Error => {r _ default; CONTINUE}]; RETURN[IF r >0 THEN r ELSE default]; }; }; SetReal: PUBLIC PROC [viewer: Viewer, real: REAL] = { realRope: Rope.ROPE; realRope _ IO.PutFR["%g", [real[real]]]; -- changed from %6.3. KAP. August 18, 1986 ViewerTools.SetContents[viewer, realRope]; }; GetPoint: PUBLIC PROC [textViewer: Viewer] RETURNS [point: Point, success: BOOL] = { <,]".>> pointRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; f: IO.STREAM _ IO.RIS[pointRope]; ReadRope[f, "["]; point.x _ ReadBlankAndReal[f]; ReadRope[f, ","]; point.y _ ReadBlankAndReal[f]; ReadRope[f, "]"]; success _ TRUE; }; SetPoint: PUBLIC PROC [viewer: Viewer, point: Point] = { pointRope: Rope.ROPE; pointRope _ IO.PutFR["[%g,%g]", [real[point.x]], [real[point.y]]]; ViewerTools.SetContents[viewer, pointRope]; }; ReadRope: PUBLIC PROC [f: IO.STREAM, rope: Rope.ROPE] = { <> <> c: CHAR; endofstream: BOOL _ FALSE; FOR i: INT IN[1..Rope.Length[rope]] DO c _ IO.GetChar[f ! IO.EndOfStream => {endofstream _ TRUE; CONTINUE}]; IF endofstream THEN SIGNAL RopeNotOnTop [IO.GetIndex[f], NIL, rope]; IF NOT c = Rope.Fetch[rope,i-1] THEN SIGNAL RopeNotOnTop [IO.GetIndex[f], Rope.FromChar[c], rope]; ENDLOOP; }; RopeNotOnTop: PUBLIC SIGNAL [position: NAT, wasThere: Rope.ROPE, notThere: Rope.ROPE] = CODE; ReadBlankAndReal: PROC [f: IO.STREAM] RETURNS [r: REAL] = { <> ReadBlank[f]; r _ ReadReal[f]; }; ReadBlank: PROC [f: IO.STREAM] = { <'s, 's, and 's until something else is encountered. Doesn't mind if no white space characters are found. Treats comments as white space.>> [] _ IO.SkipWhitespace[f, TRUE]; }; ReadReal: PROC [f: IO.STREAM] RETURNS [r: REAL] = { <, or . Leaves these terminators on the stream.>> realRope: Rope.ROPE; end: BOOL _ FALSE; [realRope, ----] _ IO.GetTokenRope[f, RealBreakProc !IO.EndOfStream => {end _ TRUE; CONTINUE}]; IF end THEN {r _ 0.0; RETURN}; IF Rope.Find[realRope, ".", 0, FALSE] = -1 THEN realRope _ Rope.Concat[realRope, ".0"]; r _ IO.GetReal[IO.RIS[realRope]]; }; RealBreakProc: PROC [char: CHAR] RETURNS [IO.CharClass] = { SELECT char FROM '], ', => RETURN [break]; IO.CR =>RETURN [break]; IO.SP => RETURN [break]; ENDCASE => RETURN [other]; }; <<>> END.