
* Maxon C++:
* Library-Modul "istream_int"
* Jens Gelhar 08.05.92, 07.04.94

	xdef	op__rightshift__istream__TRi,op__rightshift__istream__TRUi
	xdef	op__rightshift__istream__TRj,op__rightshift__istream__TRUj
	xdef	_fgetlong

	xref	fgetc__P06stream,ungetc__iP06stream,strtovl__PCcPPci
	xref	_errno

op__rightshift__istream__TRi:
op__rightshift__istream__TRj:
	movem.l	a0/d1,-(a7)
	move.l	8+4(a7),a0
	move.l	(a0),a0
	move.l	(a0),-(a7)
	bsr.b	_fgetlong
	addq.l	#4,a7
	move.l	8+8(a7),a0
	tst.l	d1
	beq.b	.plus
	addq.l	#1,d1
	beq.b	.minus
	; Zahl liegt nicht im Bereich: entweder Minint oder Maxint
	tst.l	d1
	bmi.b	.MinInt
	bra.b	.MaxInt
.plus	tst.l	d0
	bpl.b	.ok
.MaxInt	move.l	#$7FFFFFFF,d0
	bra.b	.err
.minus	tst.l	d0
	bmi.b	.ok
.MinInt	move.l	#-$80000000,d0
.err	move.l	#1000,_errno     ; ERANGE
.ok	move.l	d0,(a0)
	movem.l	(a7)+,a0/d1
	move.l	4(a7),d0
	rts

op__rightshift__istream__TRUi:	; (istream*, int&)
op__rightshift__istream__TRUj:
	movem.l a0/d1,-(a7)
	move.l 8+4(a7),a0
	move.l (a0),a0
	move.l (a0),-(a7)
	bsr.b	_fgetlong
	addq.l #4,a7
	move.l 8+8(a7),a0
	tst.l d1
	beq.b	cinuOK
	moveq #-1,d0
	move.l #1000,_errno     ; ERANGE
cinuOK:	move.l d0,(a0)
	movem.l (a7)+,a0/d1
	move.l 4(a7),d0
	rts

_fgetlong:
	; 64Bit-Zahl lesen
	; Stackparameter: stream*
	move.l a0,-(a7)
	lea -80(a7),a7
	move.l 84+4(a7),-(a7)   ; stream
	lea 4(a7),a0
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,(a0)+
glPlus:	jsr fgetc__P06stream
glNoSign:
	cmp.b #'9',d0
	bhi glErr
	cmp.b #'0',d0
	blo.b	glErr
	bne.b	glDec
	; erste Ziffer ist 0:
	move.b	d0,(a0)+
	jsr	fgetc__P06stream
	cmp.b	#'X',d0
	beq.b	glHex
	cmp.b	#'x',d0
	bne.b	glLoop
glHex:
glDec:	move.b	d0,(a0)+
	jsr	fgetc__P06stream
glLoop:	cmp.b	#'0',d0
	blo.b	glEnd
	cmp.b	#'9',d0
	bls.b	glDig
	cmp.b	#'A',d0
	blo.b	glEnd
	cmp.b	#'F',d0
	bls.b	glDig
	cmp.b	#'a',d0
	blo.b	glEnd
	cmp.b	#'f',d0
	bhi.b	glEnd
glDig:	; gültige Ziffer
	move.b d0,(a0)+
	moveq	#80,d0
	add.l	a7,d0
	cmp.l	d0,a0
	bhs.b	glEnd
	jsr	fgetc__P06stream
	bra.b	glLoop
glEnd:	clr.b	(a0)
	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
	clr.l	-(a7)		; Basis: unbekannt
	pea	4(a7)		; Endzeiger
	pea	16(a7)		; String
	jsr	strtovl__PCcPPci
	lea	12(a7),a7
	move.l	(a7)+,a0
	tst.b	(a0)      ; Bis ans Ende ausgewertet?
	beq.b	glRet
glErr:	moveq	#0,d0
	move.l	#$80000000,d1
	move.l	#1001,_errno     ; ENONUM
glRet:	addq.l	#4,a7            ; stream* vom Stack nehmen
	lea	80(a7),a7
	move.l	(a7)+,a0
	rts

	end

