
* Maxon C++ Library:
* Modul "formclass"
* Jens Gelhar 27.01.92, 08.04.94, 01.09.94

	xref	form__out,op__new__Ui,free__Pv
	xref	op__leftshift__ostream__TPCc

	xdef	_0ct__form__TPCce,_0dt__form__T
	xdef	op__leftshift__ostream__TR04form

_0ct__form__TPCce:	; Parameter: "this", Formatstring, Argumente
	movem.l	d0-d7/a0-a6,-(a7)
	move.l	15*4+8(a7),a0		; Formatstring
	lea	15*4+12(a7),a1		; Argumente
	moveq	#0,d1
	bsr.b	formRek
	move.l	15*4+4(a7),a0
	move.l	d0,(a0)
	movem.l (a7)+,d0-d7/a0-a6
	rts

formRek:
	; Format a0, Argumente ab a1: Liste erzeugen, nach d0, Anzahl in d1 weiterzählen
	tst.b	(a0)
	beq	formEnd
	; ein Argument putten:
	move.l	d1,-(a7)
	lea	-84(a7),a7
	move.l	a7,a2
	jsr	form__out

	btst	#29,d0
	bne.b	fr4
	; String allozieren:
	move.l	d0,-(a7)
	ext.l	d0
	add.l	d3,d0
	add.l	d0,84+4(a7)	; Länge inkrementieren
	addq.l	#1,d0
	movem.l	d0/a0/a1,-(a7)
	jsr	op__new__Ui
	addq.l	#4,a7
	movem.l	(a7)+,a0/a1
	move.l	d0,a3		; Text-Adresse
	move.l	d0,a4		; Kopie davon
	move.l	(a7)+,d0
	move.l	a4,d1
	beq.b	fr5
	tst.w	d0
	beq.b	fr1
	btst	#30,d0		; Bit 30: Spaces nachher ausgeben!
	bne.b	fr1
	bsr.b	FillOut
fr1	; d3 Zeichen von d2 nach a3 kopieren:
	tst.l	d3
	beq.b	fr3
	exg	d2,a2
fr2	move.b	(a2)+,(a3)+
	subq.l	#1,d3
	bne.b	fr2
	exg	d2,a2
fr3	btst	#30,d0		; Bit 30: Spaces nachher ausgeben!
	beq.b	fr5
	bsr.b	FillOut
fr5:	lea	84(a7),a7
	move.l	(a7)+,d1
	clr.b	(a3)
	; Cat-Record für "a4" allozieren:
	moveq	#8,d0
	movem.l	d0/d1/a0/a1,-(a7)
	jsr	op__new__Ui
	addq.l	#4,a7
	movem.l	(a7)+,d1/a0/a1
	tst.l	d0
	beq.b	formEnd
	exg	d0,a4
	move.l	d0,4(a4)
	move.l	a4,-(a7)
	bsr	formRek
	move.l	(a7)+,a4
	move.l	d0,(a4)
	move.l	a4,d0
	rts
formEnd	moveq #0,d0
	rts

fr4	; Zeichen-Anzahl nach (a2):
	move.l	84(a7),(a2)
	lea	84(a7),a7
	move.l	(a7)+,d1
	bra	formRek

FillOut:
	; d0.w Füllzeichen ausgeben, Anzahl zurückgeben
	move.w	d0,-(a7)
	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,(a3)+
	dbra	d0,foLoop
fo2	move.w	(a7)+,d0
	rts

_0dt__form__T: ; dynamische Strings löschen
	movem.l	a0/d0,-(a7)
	move.l	8+4(a7),a0
	move.l	(a0),a0
dtLoop	move.l	a0,d0
	beq.b	dtEnd
	move.l	(a0),-(a7)
	move.l	4(a0),-(a7)
	jsr	free__Pv	; String löschen
	move.l	a0,(a7)
	jsr	free__Pv	; Cat-Record löschen
	addq.l	#4,a7
	move.l	(a7)+,a0
	bra.b	dtLoop
dtEnd	movem.l (a7)+,d0/a0
	rts

op__leftshift__ostream__TR04form:
	movem.l	d2-d3/a2,-(a7)
	move.l	3*4+4(a7),a1		; Stream
	move.l	3*4+4+4(a7),a0		; Form
	move.l	(a0),a0
.loop	move.l	a0,d0
	beq.b	.end
	move.l	(a0),-(a7)
	move.l	4(a0),-(a7)
	move.l	a1,-(a7)
	jsr	op__leftshift__ostream__TPCc
	addq.l	#8,a7
	move.l	(a7)+,a0
	bra.b	.loop
.end	movem.l	(a7)+,d2-d3/a2
	move.l	4(a7),d0
	rts

	end

