(*
    Title: 	StringF - Implementation
    LastEdit:	"Tue Sep 11 16:20:46 1984"
    Author: 	Mick Jordan
		Acorn Research Centre

    Clean version, creates a new stream per call
*)
IMPLEMENTATION MODULE StringF;

FROM SYSTEM IMPORT WORD;
FROM Streams IMPORT Stream, Delete, Tell;
FROM StringStream IMPORT CreateInOutChars;
FROM WriteF IMPORT WriteF0, WriteF1, WriteF2, WriteF3, WriteF4;
    
PROCEDURE StringF (VAR buffer: ARRAY OF CHAR; format: ARRAY OF CHAR;
                   x: ARRAY OF WORD; nargs: CARDINAL);

VAR
    s: Stream;
    finalIndex: CARDINAL;
BEGIN
    s := CreateInOutChars(buffer);
    CASE nargs OF
      0: WriteF0(s, format);
    | 1: WriteF1(s, format, x[0]);
    | 2: WriteF2(s, format, x[0], x[1]);
    | 3: WriteF3(s, format, x[0], x[1], x[2]);
    | 4: WriteF4(s, format, x[0], x[1], x[2], x[3]);
    END (* case *);
    Tell(s, finalIndex);
    IF finalIndex <= HIGH(buffer) THEN
        buffer[finalIndex] := 0C;
    END (* if *);
    Delete(s);
END StringF;


PROCEDURE StringF0(VAR buffer: ARRAY OF CHAR; format: ARRAY OF CHAR);
VAR
    x: ARRAY [0..0] OF WORD;
BEGIN
    StringF(buffer, format, x, 0);
END StringF0;

PROCEDURE StringF1 (VAR buffer: ARRAY OF CHAR; format: ARRAY OF CHAR;
                    x1: WORD);
VAR
    x: ARRAY [0 .. 0] OF WORD;
BEGIN
    x [0] := x1;
    StringF (buffer, format, x, 1);
END StringF1;


PROCEDURE StringF2 (VAR buffer: ARRAY OF CHAR; format: ARRAY OF CHAR;
x1, x2: WORD);
VAR
    x: ARRAY [0 .. 1] OF WORD;
BEGIN
    x[0] := x1; x[1] := x2;
    StringF (buffer, format, x, 2);
END StringF2;

PROCEDURE StringF3(VAR buffer: ARRAY OF CHAR; format: ARRAY OF CHAR;
                   x1, x2, x3: WORD);

VAR
    x: ARRAY [0..2] OF WORD;
BEGIN
    x[0] := x1; x[1] := x2; x[2] := x3;
    StringF(buffer, format, x, 3);
END StringF3;

PROCEDURE StringF4(VAR buffer: ARRAY OF CHAR; format: ARRAY OF CHAR;
                   x1, x2, x3, x4: WORD);

VAR
    x: ARRAY [0..3] OF WORD;
BEGIN
    x[0] := x1; x[1] := x2; x[2] := x3; x[3] := x4;
    StringF(buffer, format, x, 4);
END StringF4;

END StringF.
