(*
(*
 * $Id: Printf.mod,v 1.3 1993/03/31 19:45:21 mh Exp andre $
 *
 * $Log: Printf.mod,v $
 * Revision 1.3  1993/03/31  19:45:21  mh
 * *** empty log message ***
 *
 * Revision 1.2  1993/03/31  00:13:44  mh
 * wrote RCS header.
 *
 *)
 *)

MODULE Printf; (* $JOIN printf.o *) (* $OddChk- *)

IMPORT Exec, SYSTEM;

TYPE
  FmtBuf*= STRUCT
             buffer*	: SYSTEM.ADDRESS;		(*  + 0  *)
             buflen*	: LONGINT;			(*  + 4  *)
             clrProc*	: PROCEDURE( VAR buf{11}: FmtBuf); (* +8  *)
             saveA5	: SYSTEM.ADDRESS;		(*  +12  *)
           END;

(* universelles printf *)

PROCEDURE FormatA*{"FmtToBuf"}	( VAR buf{11}	: FmtBuf;
                                  format{8} 	: SYSTEM.ADDRESS;
                                  args{9}	: SYSTEM.ADDRESS);

(* einfaches sprintf mit getrennter Längenangabe *)

PROCEDURE LSPrintf * {"Printf.LSPrintfA"}
                        ( VAR str{2}	: ARRAY OF CHAR;
                          len{3}	: LONGINT;
                          format{8}	: ARRAY OF CHAR;
                          args{9}..	: SYSTEM.ADDRESS): LONGINT;
PROCEDURE LSPrintF * {"Printf.LSPrintfA"}
                        ( VAR str{2}	: ARRAY OF CHAR;
                          len{3}	: LONGINT;
                          format{8}	: ARRAY OF CHAR;
                          args{9}..	: SYSTEM.ADDRESS);
PROCEDURE LSPrintfA *	( str{2}	: SYSTEM.ADDRESS;
                          len{3}	: LONGINT;
                          format{8}	: SYSTEM.ADDRESS;
                          args{9}	: SYSTEM.ADDRESS): LONGINT;
  (* $CopyArrays- *)
  VAR
    tmp: FmtBuf; res: LONGINT;
    str2: UNTRACED POINTER TO ARRAY MAX(LONGINT)-1 OF CHAR;
  BEGIN
    tmp.buffer := str;
    tmp.buflen := len;
    FormatA( tmp, format, args);
    res := len-tmp.buflen;
    IF res >= len THEN  str2:=str; str2^[len-1]:=0X  END;
    RETURN res;
  END LSPrintfA;

(* Oberon-sprintf *)

PROCEDURE OSPrintf*	( VAR 	str	: ARRAY OF CHAR;
                          	format	: ARRAY OF CHAR;
                          	args	: ARRAY OF SYSTEM.BYTE):LONGINT;
  (* $CopyArrays- *)
  VAR res:LONGINT;
  BEGIN
    RETURN LSPrintfA( SYSTEM.ADR(str), LEN(str), SYSTEM.ADR(format), SYSTEM.ADR(args));
  END OSPrintf;
PROCEDURE OSPrintF*{"Printf.OSPrintf"}(	VAR str	: ARRAY OF CHAR;
	                          	format	: ARRAY OF CHAR;
        	                  	args	: ARRAY OF SYSTEM.BYTE);

END Printf.
