IMPLEMENTATION MODULE Cio;
(*$ LargeVars:=FALSE StackParms:=FALSE Volatile:=FALSE
    StackChk:=FALSE RangeChk:=FALSE OverflowChk:=FALSE *)

(* bp 18.11.89 revised 8.10.90 *)


FROM SYSTEM	IMPORT	ADR,ADDRESS,ASSEMBLE;
FROM Arts	IMPORT	Assert;
FROM DosD	IMPORT	FileHandlePtr;
FROM DosL	IMPORT	Write;
IMPORT	ExecL;
IMPORT	String;

(* Dies ergibt ein absolut sicheres RawDoFmt, weil der Puffer immer im
 * letzten Byte eine 0 hat und dann nicht mehr abgelegt wird!
 *)
PROCEDURE PutCh; (*$ EntryExitCode:=FALSE *)
BEGIN
  ASSEMBLE(
	TST.B	(A3)
	BEQ.S	nixMehr
	MOVE.B	D0,(A3)+
nixMehr:
	RTS
  END);
END PutCh;

(*-------------------------------------------------------------------------*)
(*$ CopyDyn:=FALSE *)
PROCEDURE sprintf(VAR res:ARRAY OF CHAR; s:ARRAY OF CHAR; data:ADDRESS);
BEGIN
  ASSEMBLE( (* string mit was füllen, letzter=0C *)
	MOVE.L	res(A5),A0
	MOVE.L	res+4(A5),D0
	MOVEQ	#10,D1 (* irgendwas#0 *)
    Lp:	MOVE.B	D1,(A0)+
    	DBRA	D0,Lp
    	CLR.B	-(A0)
  END);
  ExecL.RawDoFmt(ADR(s),data,ADR(PutCh),ADR(res));
END sprintf;

(*$ CopyDyn:=FALSE *)
PROCEDURE fprintf(f:FileHandlePtr; s:ARRAY OF CHAR; data:ADDRESS);
VAR len:LONGINT;
    ftemp: ARRAY [0..127] OF CHAR; (* schön lang! *)
BEGIN
  ASSEMBLE( (* string mit was füllen, letzter=0C *)
	LEA	ftemp(A5),A0
	MOVEQ	#127,D0
    Lp:	MOVE.B	D0,(A0)+ (* Begrenzt aber auf 127 Zeichen! *)
    	DBRA	D0,Lp
  END);
  ExecL.RawDoFmt(ADR(s),data,ADR(PutCh),ADR(ftemp));
  len:=String.Length(ftemp);
  Assert(Write(f,ADR(ftemp),len)=len,ADR('printf: File write error'));;
END fprintf;

END Cio.mod
