--File SegCIF.Mesa
-- Segment .nodes file into separate symbols
-- July 1981 by MN
--
Last changed: July 7, 1981 11:19 PM

DIRECTORY

IODefs: FROM "IODefs" USING [CR, ReadLine, WriteLine, WriteString,
WriteDecimal, GetInputStream, GetOutputStream, SetInputStream,
SetOutputStream],
JaMFnsDefs: FROM "JaMFnsDefs" USING [Register, PopString],
StreamDefs: FROM "StreamDefs" USING [StreamHandle, NewByteStream,
Read, Write, Append],
StringDefs: FROM "StringDefs" USING [AppendString];

SegCIF: PROGRAM-- should add catch for ParserAbort
IMPORTS IODefs, JaMFnsDefs, StreamDefs, StringDefs =

BEGIN OPEN IODefs, JaMFnsDefs, StreamDefs, StringDefs;

LinesPerSymbol: CARDINAL ← 100;

SegmentCIF: PROCEDURE[inStream,outStream: StreamHandle] =
BEGIN
saveIn: StreamHandle ← GetInputStream[];
saveOut: StreamHandle ← GetOutputStream[];
SetInputStream[inStream];
SetOutputStream[outStream];
WriteLine["DD 1;"];
FOR n:CARDINAL ← 1, n+1 UNTIL inStream.endof[inStream] DO
WriteString["DS "]; WriteDecimal[n]; WriteLine[";"];
THROUGH [1..LinesPerSymbol] UNTIL inStream.endof[inStream] DO
line: STRING ← [100];
ReadLine[line]; --this echos everything to outStream
ENDLOOP;
WriteLine["DF;"];
WriteString["C "]; WriteDecimal[n]; WriteLine[";"];
saveOut.put[saveOut,’.];
ENDLOOP;
saveOut.put[saveOut,CR];
SetInputStream[saveIn];
SetOutputStream[saveOut];
END;

CallSegmentCIF: PROCEDURE =
BEGIN --expects <inFile outFile> (STRINGs)
outFile: STRING ← [40];
inFile: STRING ← [40];
inStream,outStream: StreamHandle;
PopString[outFile];
PopString[inFile];
IF ~DotInName[outFile] THEN AppendString[outFile,".cif"];
IF ~DotInName[inFile] THEN AppendString[inFile,".nodes"];
inStream ← NewByteStream[inFile,Read];
outStream ← NewByteStream[outFile,Write+Append];
WriteString["Segmenting "]; WriteString[inFile];
WriteString[" to "]; WriteLine[outFile];
SegmentCIF[inStream,outStream];
inStream.destroy[inStream];
outStream.destroy[outStream];
END;

DotInName: PROCEDURE[name: STRING] RETURNS[BOOLEAN] =
BEGIN
FOR i:CARDINAL IN [0..name.length) DO
IF name[i]=’. THEN RETURN[TRUE];
ENDLOOP;
RETURN[FALSE];
END;

Register["segcif",CallSegmentCIF];

END.