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. RReadContourImpl.mesa Written by: Maureen Stone May 15, 1984 5:13:50 pm PDT ÊT˜J˜Jšœ™Jšœ5™5šÏk ˜ Jšœœ*˜5JšœœD˜MJšœœ˜&Jšœœœ>˜NJšœœ˜Jšœœœ˜!—J˜Jšœ ˜Jšœ!˜(Jšœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœœ ˜Jšœœ˜J˜šÏn œœ˜%šœœ œœ˜-J˜&Jšœ"œ˜,—Jšœœ˜ Jšœ œœ˜&Jšœ œ˜ Jšœœ%˜>JšœÏc"˜5J˜J˜J˜—šžœœ˜&Jšœ œœ˜&Jšœ œ˜ J˜J˜—šž œ œ˜*JšœDœ˜TJšœœ˜ J˜Jšœ˜J˜—šž œœœ˜+Jšœœ˜Jšœ˜JšœŸ"˜5J˜šœ ˜Jšœ˜J˜Jšœ˜—Jšœ˜—šžœ œ˜ Jšœœ˜ šœ œ˜.Jšœ œ˜"J˜ Jš˜—Jšœ˜—šž œœ˜%Jšœ$˜$Jšœ˜—š ž œœ œœ œ˜>Jšœœ˜ Jšœ œ˜Jšœ œ˜š˜Jšœ+œ˜2Jšœ-˜-J˜ š˜Jš œœœœœ˜LJšœ+˜+J˜Jšœ˜—J˜ Jšœ œ œœ˜%Jšœ˜—Jšœ˜—šžœœœœ˜%Jšœœ˜Jš œœœ œœœ˜HJšœœ˜Jšœœ˜Jšœœœœ˜+J˜—šžœœœœ˜$Jšœœ˜Jš œœœ œ œ˜HJšœœ˜Jšœœ˜Jšœœœœ˜,J˜—J˜šœ$œŸ˜LJšœ,Ÿ/˜[Jšœ.Ÿ˜DJšœ-ŸÐciÏi ˜JJšœ/Ÿ+˜ZJ˜—Jšœ6˜6Jšœ˜J˜J˜—…— ò˜