
* Maxon C++ Library:
* Modul "istream_float"
* Jens Gelhar 16.04.92, 15.04.94

	xdef	op__rightshift__istream__TRd,op__rightshift__istream__TRf
	xdef	op__rightshift__istream__TRD
	xdef	_fgetdouble

	xref	fgetc__P06stream,ungetc__iP06stream,strtod__PCcPPc
	xref	lib_double2float,_errno

op__rightshift__istream__TRD
op__rightshift__istream__TRd:	; (istream&, double &)
	move.l	4(a7),a0
	move.l	(a0),a0
	move.l	(a0),-(a7)
	bsr.b	_fgetdouble
	addq.l	#4,a7
	move.l	8(a7),a0
	movem.l	d0/d1,(a0)
	move.l	4(a7),d0
	rts

op__rightshift__istream__TRf:	; (istream*, float&)
	move.l	4(a7),a0
	move.l	(a0),a0
	move.l	(a0),-(a7)
	bsr.b	_fgetdouble
	jsr	lib_double2float
	addq.l	#4,a7
	move.l	8(a7),a0
	move.l	d0,(a0)
	move.l	4(a7),d0
	rts

_fgetdouble:	; Stackparameter: stream*
	move.l	a2,-(a7)
	lea	-80(a7),a7
	move.l	84+4(a7),-(a7)   ; stream
	lea	4(a7),a2
glOverrd
	jsr	fgetc__P06stream
	cmp.l	#' ',d0
	bls.b	glOverrd
	cmp.b	#'+',d0
	beq.b	glPlus
	cmp.b	#'-',d0
	bne.b	glNoSign
	move.b	d0,(a2)+
glPlus	jsr	fgetc__P06stream
glNoSign
	cmp.b	#'.',d0
	beq.b	glKomma
	cmp.b	#'9',d0
	bhi	glErr
	cmp.b	#'0',d0
	blo	glErr
	move.b	d0,(a2)+
	jsr	fgetc__P06stream
glLoop	; Vorkommastellen:
	cmp.b	#'0',d0
	blo.b	glKomma
	cmp.b	#'9',d0
	bhi.b	glKomma
	move.b	d0,(a2)+
	moveq	#80,d0
	add.l	a7,d0
	cmp.l	d0,a2
	bhs.b	glEnd
	jsr	fgetc__P06stream
	bra.b	glLoop
glKomma	cmp.b	#'.',d0
	bne.b	glExpo
glNachK	move.b	d0,(a2)+
	moveq	#80,d0
	add.l	a7,d0
	cmp.l	d0,a2
	bhs.b	glEnd
	jsr	fgetc__P06stream
	cmp.b	#'0',d0
	blo.b	glExpo
	cmp.b	#'9',d0
	bls.b	glNachK
glExpo	cmp.b	#'e',d0
	beq.b	glexp
	cmp.b	#'E',d0
	bne.b	glEnd
glexp	move.b	d0,(a2)+
	jsr	fgetc__P06stream
	cmp.b	#'+',d0
	beq.b	glsigExp
	cmp.b	#'-',d0
	bne.b	glexpDig
glsigExp
	move.b	d0,(a2)+
	jsr fgetc__P06stream
glexpDig
	cmp.b	#'0',d0
	blo.b	glEnd
	cmp.b	#'9',d0
	bhi.b	glEnd
	move.b	d0,(a2)+
	moveq	#80,d0
	add.l	a7,d0
	cmp.l	d0,a2
	bhs.b	glEnd
	jsr	fgetc__P06stream
	bra.b	glexpDig
glEnd	clr.b	(a2)
	move.l	d0,-(a7)
	jsr	ungetc__iP06stream
	addq.l	#4,a7
	; Zahl gelesen, liegt bei 4(a7) auf dem Stack
	clr.l	-(a7)     ; unser Ende-Pointer
	move.l	a7,-(a7) ; Endzeiger
	pea	12(a7)      ; String
	jsr	strtod__PCcPPc
	addq.l	#8,a7
	move.l	(a7)+,a0
	tst.b	(a0)		; Bis ans Ende ausgewertet?
	beq.b	glRet
glErr	move.l	#$7FFFFFFF,d0
	moveq	#$FFFFFFFF,d1
	move.l	#1001,_errno	; ENONUM
glRet	addq.l	#4,a7		; stream* vom Stack nehmen
	lea	80(a7),a7
	move.l	(a7)+,a2
	rts

	end

