
*	Maxon C++ Project:
*	Library-Modul "printf"
*	Jens Gelhar 17.10.91, 15.04.94, 15.12.94

	xdef	_printf,printf__PCce
	xdef	_vprintf,vprintf__PCcUi
	xdef	_fprintf,fprintf__P06streamPCce
	xdef	_vfprintf,vfprintf__P06streamPCcUi

	xref	form__out
	xref	_std__out,__Writefile

_vprintf:
vprintf__PCcUi:
	movem.l	d1-d7/a0-a6,-(a7)
	move.l	14*4+8(a7),a1    ; va_list
	bra.b	pfIn
_printf:
printf__PCce:	movem.l d1-d7/a0-a6,-(a7)
	lea	14*4+8(a7),a1       ; Parameter
pfIn	move.l	#_std__out,d1
	move.l	14*4+4(a7),a0    ; String
	bra.b	fpIn

_vfprintf:
vfprintf__P06streamPCcUi:
	movem.l	d1-d7/a0-a6,-(a7)
	move.l	14*4+12(a7),a1      ; va_list
	bra.b	fpIn1

_fprintf:
fprintf__P06streamPCce:
	movem.l	d1-d7/a0-a6,-(a7)
	lea	14*4+12(a7),a1	; Parameter
fpIn1	move.l	14*4+4(a7),d1	; Stream
	move.l	14*4+8(a7),a0	; String
fpIn
	clr.l	-(a7)
fpLoop	tst.b	(a0)
	beq.b	fpEnd
	lea	-84(a7),a7
	move.l	a7,a2
	move.l	d1,-(a7)
	jsr	form__out
	btst	#29,d0
	bne.b	fp3

	tst.w	d0
	beq.b	fp1
	btst	#30,d0		; Bit 30: Spaces nachher ausgeben!
	bne.b	fp1
	move.l	(a7),d1
	movem.l	d1-d3/a0-a1,-(a7)
	bsr.b	FillOut
	movem.l	(a7)+,d1-d3/a0-a1
	add.l	d0,84+4(a7)	; zur Zeichenzahl addieren
fp1	move.l	(a7)+,d1
	add.l	d3,84(a7)	; zu Zeichenanzahl addieren
	movem.l	d0/d1/a0/a1,-(a7)
	move.l	d1,a0
	jsr	__Writefile
	tst.l	d0
	bmi	fperror
	movem.l	(a7)+,d0/d1/a0/a1
	btst	#30,d0
	beq.b	fp2
	tst.w	d0
	beq.b	fp2
	movem.l	d1/a0/a1,-(a7)
	bsr.b	FillOut
	movem.l	(a7)+,d1/a0/a1
	add.l	d0,84(a7)
fp2	lea	84(a7),a7
	bra.b	fpLoop
fperror	; Fehler beim Schreiben aufgetreten:
	add.w	#4*4+84,a7
	move.l	#-1,(a7)		; Ergebnis: -1
fpEnd	movem.l	(a7)+,d0-d7/a0-a6
	rts

fp3	; "%n"
	move.l (a7)+,d1
	move.l 84(a7),(a2)
	bra.b fp2

FillOut:	; d0.w Füllzeichen ausgeben, Anzahl zurückgeben
	move.l d0,-(a7)
	move.l d1,a0
	lea -84(a7),a7          ; Platz für Puffer
	moveq #' ',d1
	tst.l d0
	bpl.b flLoop
	moveq #'0',d1           ; Bit 31: mit Nullen füllen
flLoop	; d0-mal d1:
	moveq #0,d4
	move.w d0,d4
	cmp.w #80,d4
	bls.b fl2
	moveq #80,d4
fl2	sub.w d4,d0
	move.l a7,d2
	move.l d2,a2
	move.l d4,d3
	movem.l d0/d1/a0,-(a7)
fl3	move.b d1,(a2)+
	subq.w #1,d4
	bne.b fl3
	jsr __Writefile
	movem.l (a7)+,d0/d1/a0
	tst.w d0
	bne.b flLoop                    ; noch mehr Zeichen?

	lea 84(a7),a7
	move.l (a7)+,d0
	ext.l d0
	rts

	end
