file: TangleExternalsImpl.mesa
Edited by Lyle Ramshaw: October 27, 1983 5:24 pm
implements those procedures called by Tangle as externals.
DIRECTORY
FS USING [StreamOpen],
IO USING [BreakProc, Error, GetIndex, GetTokenRope, RIS, STREAM],
PascalBasic,
PascalWizardFiles,
Rope USING [Cat, Concat, FromChar],
TanglePrivate;
TangleExternalsImpl: PROGRAM IMPORTS
PascalBasic, FS, IO, PascalWizardFiles, Rope EXPORTS TanglePrivate =
BEGIN OPEN PascalBasic, PascalWizardFiles, TanglePrivate;
TtyReset: PUBLIC PROC [F: PascalTextFilePtr] =
BEGIN
PascalOpenTextFileTTYInput[F];
END;
TtyRewrite: PUBLIC PROC [F: PascalTextFilePtr] =
BEGIN
PascalOpenTextFileTTYOutput[F];
END;
FileReset: PUBLIC PROC [F: PascalTextFilePtr, Ext: Alfa] =
BEGIN
inStream: IO.STREAM;
inStream ← FS.StreamOpen[Rope.Cat[FileNameRoot[], ".", RopeFromAlfa[Ext]]];
PascalOpenTextFileWithStream[F, inStream];
PascalTextRESET[F];
END;
FileRewrite: PUBLIC PROC [F: PascalTextFilePtr, Ext: Alfa] =
BEGIN
outStream: IO.STREAM;
outStream ← FS.StreamOpen[Rope.Cat[FileNameRoot[], ".", RopeFromAlfa[Ext]], $create];
PascalOpenTextFileWithStream[F, outStream];
PascalTextREWRITE[F];
END;
FileClose: PUBLIC PROC [F: PascalTextFilePtr] =
BEGIN
PascalCloseTextFile[F];
END;
FileGetPos: PUBLIC PROC [F: PascalTextFilePtr] RETURNS [FileGetPosResult: PascalInteger] =
BEGIN
FileGetPosResult ← 0; -- in case of error below
FileGetPosResult ← F.baseFile.str.GetIndex[ ! IO.Error =>
IF ec = NotImplementedForThisStream THEN CONTINUE];
END;
fileNameRootBreak: PRIVATE IO.BreakProc = CHECKED
BEGIN
RETURN[SELECT char FROM
IN ['0..'9], IN ['A..'Z], IN ['a..'z], '-, '+, '# => other,
ENDCASE => sepr];
END;
FileNameRoot: PROC RETURNS [ROPE] =
BEGIN
RETURN[IO.RIS[commandLineTail].GetTokenRope[breakProc: fileNameRootBreak].token];
END;
RopeFromAlfa: PROC [a: Alfa] RETURNS [r: ROPE] =
BEGIN
r ← NIL;
FOR i:AlfaIndex IN AlfaIndex DO
IF a[i] = ' THEN EXIT;
r ← Rope.Concat[r, Rope.FromChar[a[i]]];
ENDLOOP;
END;
END.