<> <> DIRECTORY Curve USING [StartSamples, defaultHandle, AddSample], JaM USING [ExecuteRope, PopInt, PopRope, PushRope,PushBool, State, Register], FitJaM USING [RegisterInit, InitProc], IO USING [STREAM, SetIndex, GetTokenRope, GetReal, EndOfStream, Close, Error], FS USING [Error, StreamOpen], Rope USING [ROPE, Equal, Length]; ReadContourImpl: CEDAR PROGRAM IMPORTS JaM, Rope, Curve, FS, IO, FitJaM EXPORTS = BEGIN stream: IO.STREAM; Done: SIGNAL = CODE; ROPE: TYPE = Rope.ROPE; State: TYPE = JaM.State; contourNumber: INTEGER _ 0; OpenInputFile: PROC[state: State] = { ENABLE FS.Error => IF error.group=user THEN { JaM.PushRope[state,error.explanation]; JaM.ExecuteRope[state, ".print"]; CONTINUE}; rope: ROPE _ JaM.PopRope[state]; IF stream # NIL THEN IO.Close[stream]; stream _ NIL; IF rope.Length[] > 0 THEN stream _ FS.StreamOpen[rope, $read]; FindNextContour[]; --reads past any junk at the front contourNumber _ 0; }; CloseInputFile: PROC[state: State] = { IF stream # NIL THEN IO.Close[stream]; stream _ NIL; }; JFindContour: PROCEDURE [state: State] = { ENABLE IO.EndOfStream =>{JaM.ExecuteRope[state, "(not found \n) .print"]; CONTINUE}; cn: INTEGER _ JaM.PopInt[state]; FindContour[cn]; }; FindContour: PUBLIC PROCEDURE [cn: NAT] = { count: NAT _ 0; IO.SetIndex[stream,0]; FindNextContour[]; --reads past any junk at the front contourNumber _ 0; UNTIL count=cn DO FindNextContour[]; count _ count+1; ENDLOOP; }; FindNextContour: PUBLIC PROC = { rope: ROPE; UNTIL Rope.Equal[rope,"beginoutline",FALSE] DO [rope,] _ IO.GetTokenRope[stream]; contourNumber _ contourNumber+1; ENDLOOP; }; JInputSamples: PROC[state: State] = { JaM.PushBool[state, InputSamples[]]; }; InputSamples: PUBLIC PROCEDURE RETURNS[endOfFile: BOOLEAN] = { x,y: REAL; nSamples: INTEGER; endOfFile _ FALSE; DO [x,y] _ GetFirst[! Done, IO.EndOfStream => ERROR]; Curve.StartSamples[Curve.defaultHandle, x,y]; nSamples _ 1; DO [x,y] _ GetNext[! Done => EXIT; IO.EndOfStream => {endOfFile _ TRUE; EXIT}]; Curve.AddSample[Curve.defaultHandle, x, y]; nSamples _ nSamples+1; ENDLOOP; contourNumber _ contourNumber+1; IF nSamples>6 OR endOfFile THEN EXIT; ENDLOOP; }; GetFirst: PROC RETURNS[x,y: REAL] = { r: ROPE; x _ IO.GetReal[stream ! IO.Error => IF ec=SyntaxError THEN SIGNAL Done]; y _ IO.GetReal[stream]; [r,] _ IO.GetTokenRope[stream]; IF ~Rope.Equal[r,"setcp",FALSE] THEN ERROR; }; GetNext: PROC RETURNS[x,y: REAL] = { r: ROPE; x _ IO.GetReal[stream ! IO.Error => IF ec=SyntaxError THEN SIGNAL Done]; y _ IO.GetReal[stream]; [r,] _ IO.GetTokenRope[stream]; IF ~Rope.Equal[r,"drawto",FALSE] THEN ERROR; }; ReadContourInit: FitJaM.InitProc = {OPEN JaM; --to make the comments line up Register[state,".openInput",OpenInputFile]; --open the input file (will close current file) Register[state,".closeInput",CloseInputFile]; --close the input file Register[state,".findContour",JFindContour]; --contour number .findContour Register[state,".inputSamples",JInputSamples]; --inputs current contour. returns endOfFile }; FitJaM.RegisterInit[$ReadContourInit,ReadContourInit]; END.