File: ReadAISImpl.mesa
Author: Eric Bier on June 17, 1983 10:40 am
Last edited by Bier on January 28, 1987 2:19:21 pm PST
DIRECTORY
AIS, IO, ReadAIS, Rope, Feedback;
ReadAISImpl:
CEDAR PROGRAM
IMPORTS AIS, IO, Rope
EXPORTS ReadAIS =
BEGIN
Raster: TYPE = AIS.Raster;
FilenameMinusExtension:
PUBLIC
PROC [wholeName: Rope.
ROPE]
RETURNS [firstPart: Rope.
ROPE] = {
wholeStream: IO.STREAM ← IO.RIS[wholeName];
[firstPart, ----] ← IO.GetTokenRope[wholeStream, PeriodBreakProc];
};
PeriodBreakProc:
SAFE
PROC [char:
CHAR]
RETURNS [
IO.CharClass] = {
SELECT char
FROM
'. => RETURN[sepr];
ENDCASE => RETURN[other];
};
CreateFile:
PUBLIC
PROC [filename: Rope.
ROPE, raster: Raster, overwrite:
BOOLEAN ←
FALSE, attributeLength:
CARDINAL ← 0]
RETURNS[f:
AIS.FRef] = {
f ← AIS.CreateFile[filename, raster];
};
OpenFile: PUBLIC PROC [name: Rope.ROPE, write: BOOLEAN ← FALSE] RETURNS [f: AIS.FRef, resolution: REAL] = {
comment: Rope.ROPE;
commentStream: IO.STREAM;
f ← AIS.OpenFile[name, write];
comment ← AIS.ReadComment[f];
IF comment = NIL THEN {
Feedback.Append["72 dots/in assumed. AIS file has no res. comment.", TRUE];
Feedback.Blink[];
resolution ← 72.0;
RETURN};
commentStream ← IO.RIS[comment];
ReadRope[commentStream, "res: "];
resolution ← ReadReal[commentStream];
}; -- bier March 26, 1986. commented out to see if it is used.
Resolution: PUBLIC PROC [filename: Rope.ROPE] RETURNS [resolution: REAL] = {
f: AIS.FRef;
comment: Rope.ROPE;
commentStream: IO.STREAM;
f ← AIS.OpenFile[filename, FALSE];
comment ← AIS.ReadComment[f];
IF comment = NIL THEN {
resolution ← 72.0;
AIS.CloseFile[f];
RETURN};
commentStream ← IO.RIS[comment];
ReadRope[commentStream, "res: "];
resolution ← ReadReal[commentStream];
AIS.CloseFile[f];
}; -- bier March 26, 1986. commented out to see if it is used.
ReadRope:
PUBLIC
PROC [f:
IO.
STREAM, rope: Rope.
ROPE] = {
Removes the given rope from the top of the stream. Used to remove formatting words and phrases from 3d files. We are not interested in these strings but only in the data in between them.
Signals RopeNotOnTop if some other rope is on top.
c: CHAR;
FOR i:
INT
IN[1..Rope.Length[rope]]
DO
c ← IO.GetChar[f];
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;
ReadReal:
PUBLIC
PROC [f:
IO.
STREAM]
RETURNS [r:
REAL] = {
Reads digits up to the next ], <CR>, <SPACE> or <COMMA>. Leaves these terminators on the stream.
realRope: Rope.ROPE;
[realRope, ----] ← IO.GetTokenRope[f, RealBreakProc];
IF Rope.Find[realRope, ".", 0, FALSE] = -1 THEN realRope ← Rope.Concat[realRope, ".0"];
r ← IO.GetReal[IO.RIS[realRope]];
};
RealBreakProc:
SAFE
PROC [char:
CHAR]
RETURNS [
IO.CharClass] = {
SELECT char
FROM
'], ', => RETURN [break];
IO.CR =>RETURN [break];
IO.SP => RETURN [break];
ENDCASE => RETURN [other];
};
CloseFile:
PUBLIC
PROC [f:
AIS.FRef, comment: Rope.
ROPE] = {
AIS.WriteComment[f, comment];
AIS.CloseFile[f];
};
END.