home *** CD-ROM | disk | FTP | other *** search
-
- * 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
-
-