
* Maxon C++ Library:
* Modul "istream_long"
* Jens Gelhar 08.05.93, 15.04.94

	xdef	op__rightshift__istream__TRl,op__rightshift__istream__TRUl
	xdef	_fgetulong

	xref	fgetc__P06stream,ungetc__iP06stream,strtouvl__PCcPPci
	xref	_fgetlong
	xref	_errno

op__rightshift__istream__TRl:
	move.l	4(a7),a0
	move.l	(a0),a0
	move.l	(a0),-(a7)
	jsr	_fgetlong
	addq.l	#4,a7
	move.l	8(a7),a0
	movem.l	d0/d1,(a0)
	move.l	4(a7),d0
	rts

op__rightshift__istream__TRUl:	; (istream*, unsigned long long&)
	move.l 4(a7),a0
	move.l (a0),a0
	move.l (a0),-(a7)
	bsr.b	_fgetulong
	addq.l	#4,a7
	move.l	8(a7),a0
	movem.l	d0/d1,(a0)
	move.l	4(a7),d0
	rts

_fgetulong:
	; 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
	bra.b	glNoSign
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,(a2)+
	jsr	fgetc__P06stream
	cmp.b	#'X',d0
	beq.b	glHex
	cmp.b	#'x',d0
	bne.b	glLoop
glHex:
glDec:	move.b	d0,(a2)+
	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,(a2)+
	moveq	#80,d0
	add.l	a7,d0
	cmp.l	d0,a2
	bhs.b	glEnd
	jsr	fgetc__P06stream
	bra.b	glLoop
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
	clr.l	-(a7)		; Basis: unbekannt
	pea	4(a7)		; Endzeiger
	pea	16(a7)		; String
	jsr	strtouvl__PCcPPci
	lea	12(a7),a7
	move.l	(a7)+,a0
	tst.b	(a0)		; Bis ans Ende ausgewertet?
	beq.b	glRet
glErr:	moveq	#-1,d0
	moveq	#-1,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

