
* Maxon C++ Project:
* Library-Modul "sprintf"
* Jens Gelhar 07.01.93, 15.04.94, 16.04.94

	xdef	_sprintf,sprintf__PcPCce
	xdef	_vsprintf,vsprintf__PcPCcUi

	xref	form__out

_vsprintf:
vsprintf__PcPCcUi:
	movem.l d2-d7/a2-a6,-(a7)
	move.l 11*4+12(a7),a1   ; va_list
	bra.b spIn

_sprintf:
sprintf__PcPCce:
	movem.l d2-d7/a2-a6,-(a7)
	lea 11*4+12(a7),a1      ; Parameter
spIn:
	move.l 11*4+4(a7),d1    ; Zielstring
	move.l 11*4+8(a7),a0    ; Formatstring
	clr.l -(a7)             ; Anzahl Zeichen
spLoop
	tst.b (a0)
	beq.b spEnd
	lea -84(a7),a7
	move.l a7,a2
	move.l d1,-(a7)
	jsr form__out

	move.l (a7)+,d1
	btst #29,d0
	bne.b sp4
	tst.w d0
	beq.b sp1
	btst #30,d0             ; Bit 30: Spaces nachher ausgeben!
	bne.b sp1
	bsr.b FillOut
	add.w d0,84+2(a7)         ; zur Zeichenzahl addieren
sp1	add.l d3,84(a7)         ; zu Zeichenanzahl addieren
	; d3 Zeichen von d2 nach d1 kopieren:
	tst.l d3
	beq.b sp3
	exg d1,a1
	exg d2,a2
sp2	move.b (a2)+,(a1)+
	subq.l #1,d3
	bne.b sp2
	exg d1,a1
	exg d2,a2
sp3	lea 84(a7),a7
	tst.w d0
	beq.b spLoop
	btst #30,d0
	beq.b spLoop
	bsr.b FillOut
	add.w d0,2(a7)
	bra.b spLoop
spEnd	move.l d1,a0
	clr.b (a0)
	movem.l (a7)+,d0/d2-d7/a2-a6
	rts

sp4	; "%n"
	move.l 84(a7),(a2)
	bra.b sp3

FillOut:	; d0.w Füllzeichen ausgeben, Anzahl zurückgeben
	move.l a0,-(a7)
	move.w d0,-(a7)
	move.l d1,a0
	moveq #' ',d1
	tst.l d0
	bpl.b fo1
	moveq #'0',d1           ; Bit 31: mit Nullen füllen
fo1	subq.w #1,d0
	blo.b fo2
foLoop	; d0-mal d1:
	move.b d1,(a0)+
	dbra d0,foLoop
fo2	move.w (a7)+,d0
	move.l a0,d1
	move.l (a7)+,a0
	rts

	end
