home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC6.DMS / in.adf / libsrc.lha / LIBSRC / istream_int.asm < prev    next >
Encoding:
Assembly Source File  |  1994-04-15  |  2.5 KB  |  138 lines

  1.  
  2. * Maxon C++:
  3. * Library-Modul "istream_int"
  4. * Jens Gelhar 08.05.92, 07.04.94
  5.  
  6.     xdef    op__rightshift__istream__TRi,op__rightshift__istream__TRUi
  7.     xdef    op__rightshift__istream__TRj,op__rightshift__istream__TRUj
  8.     xdef    _fgetlong
  9.  
  10.     xref    fgetc__P06stream,ungetc__iP06stream,strtovl__PCcPPci
  11.     xref    _errno
  12.  
  13. op__rightshift__istream__TRi:
  14. op__rightshift__istream__TRj:
  15.     movem.l    a0/d1,-(a7)
  16.     move.l    8+4(a7),a0
  17.     move.l    (a0),a0
  18.     move.l    (a0),-(a7)
  19.     bsr.b    _fgetlong
  20.     addq.l    #4,a7
  21.     move.l    8+8(a7),a0
  22.     tst.l    d1
  23.     beq.b    .plus
  24.     addq.l    #1,d1
  25.     beq.b    .minus
  26.     ; Zahl liegt nicht im Bereich: entweder Minint oder Maxint
  27.     tst.l    d1
  28.     bmi.b    .MinInt
  29.     bra.b    .MaxInt
  30. .plus    tst.l    d0
  31.     bpl.b    .ok
  32. .MaxInt    move.l    #$7FFFFFFF,d0
  33.     bra.b    .err
  34. .minus    tst.l    d0
  35.     bmi.b    .ok
  36. .MinInt    move.l    #-$80000000,d0
  37. .err    move.l    #1000,_errno     ; ERANGE
  38. .ok    move.l    d0,(a0)
  39.     movem.l    (a7)+,a0/d1
  40.     move.l    4(a7),d0
  41.     rts
  42.  
  43. op__rightshift__istream__TRUi:    ; (istream*, int&)
  44. op__rightshift__istream__TRUj:
  45.     movem.l a0/d1,-(a7)
  46.     move.l 8+4(a7),a0
  47.     move.l (a0),a0
  48.     move.l (a0),-(a7)
  49.     bsr.b    _fgetlong
  50.     addq.l #4,a7
  51.     move.l 8+8(a7),a0
  52.     tst.l d1
  53.     beq.b    cinuOK
  54.     moveq #-1,d0
  55.     move.l #1000,_errno     ; ERANGE
  56. cinuOK:    move.l d0,(a0)
  57.     movem.l (a7)+,a0/d1
  58.     move.l 4(a7),d0
  59.     rts
  60.  
  61. _fgetlong:
  62.     ; 64Bit-Zahl lesen
  63.     ; Stackparameter: stream*
  64.     move.l a0,-(a7)
  65.     lea -80(a7),a7
  66.     move.l 84+4(a7),-(a7)   ; stream
  67.     lea 4(a7),a0
  68. glOverrd:
  69.     jsr fgetc__P06stream
  70.     cmp.l #' ',d0
  71.     bls.b    glOverrd
  72.     cmp.b #'+',d0
  73.     beq.b    glPlus
  74.     cmp.b #'-',d0
  75.     bne.b    glNoSign
  76.     move.b d0,(a0)+
  77. glPlus:    jsr fgetc__P06stream
  78. glNoSign:
  79.     cmp.b #'9',d0
  80.     bhi glErr
  81.     cmp.b #'0',d0
  82.     blo.b    glErr
  83.     bne.b    glDec
  84.     ; erste Ziffer ist 0:
  85.     move.b    d0,(a0)+
  86.     jsr    fgetc__P06stream
  87.     cmp.b    #'X',d0
  88.     beq.b    glHex
  89.     cmp.b    #'x',d0
  90.     bne.b    glLoop
  91. glHex:
  92. glDec:    move.b    d0,(a0)+
  93.     jsr    fgetc__P06stream
  94. glLoop:    cmp.b    #'0',d0
  95.     blo.b    glEnd
  96.     cmp.b    #'9',d0
  97.     bls.b    glDig
  98.     cmp.b    #'A',d0
  99.     blo.b    glEnd
  100.     cmp.b    #'F',d0
  101.     bls.b    glDig
  102.     cmp.b    #'a',d0
  103.     blo.b    glEnd
  104.     cmp.b    #'f',d0
  105.     bhi.b    glEnd
  106. glDig:    ; gültige Ziffer
  107.     move.b d0,(a0)+
  108.     moveq    #80,d0
  109.     add.l    a7,d0
  110.     cmp.l    d0,a0
  111.     bhs.b    glEnd
  112.     jsr    fgetc__P06stream
  113.     bra.b    glLoop
  114. glEnd:    clr.b    (a0)
  115.     move.l    d0,-(a7)
  116.     jsr    ungetc__iP06stream
  117.     addq.l    #4,a7
  118.     ; Zahl gelesen, liegt bei 4(a7) auf dem Stack
  119.     clr.l    -(a7)        ; unser Ende-Pointer
  120.     clr.l    -(a7)        ; Basis: unbekannt
  121.     pea    4(a7)        ; Endzeiger
  122.     pea    16(a7)        ; String
  123.     jsr    strtovl__PCcPPci
  124.     lea    12(a7),a7
  125.     move.l    (a7)+,a0
  126.     tst.b    (a0)      ; Bis ans Ende ausgewertet?
  127.     beq.b    glRet
  128. glErr:    moveq    #0,d0
  129.     move.l    #$80000000,d1
  130.     move.l    #1001,_errno     ; ENONUM
  131. glRet:    addq.l    #4,a7            ; stream* vom Stack nehmen
  132.     lea    80(a7),a7
  133.     move.l    (a7)+,a0
  134.     rts
  135.  
  136.     end
  137.  
  138.