home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MCD.DMS / in.adf / libsrc / strftime.asm < prev   
Encoding:
Assembly Source File  |  1995-04-20  |  4.6 KB  |  280 lines

  1.  
  2. * Maxon C++
  3. * Library-Modul "strftime"
  4. * Jens Gelhar 09.02.92, 16.04.94
  5.  
  6.     xdef    strftime__PcUiPCcPC02tm
  7.     xdef    _strftime
  8.  
  9. strftime__PcUiPCcPC02tm:
  10. _strftime:
  11.     ; 0: target, 4: len, 8: fmt, 12: tm
  12.     movem.l d1/a0-a4,-(a7)
  13.     movem.l 6*4+4(a7),a0-a3; a0: target, a1: end, a2: fmt, a3: tm
  14.     add.l a0,a1
  15. Loop    move.b (a2)+,d0
  16.     beq End
  17.     cmp.b #'%',d0
  18.     beq.b Protz
  19. lput    bsr put
  20.     cmp.l a1,a0
  21.     blo.b Loop
  22.     bra End
  23. Protz    move.b (a2)+,d0
  24.     beq End
  25.     cmp.b #'%',d0
  26.     beq.b lput
  27.     cmp.b #'a',d0
  28.     bne.b A
  29.     move.l 24(a3),d0
  30.     lea astr(pc),a4
  31.     bra sd0
  32. A
  33.     cmp.b #'A',d0
  34.     bne.b b
  35.     move.l 24(a3),d0
  36.     lea Astr(pc),a4
  37.     bra sd0
  38. b
  39.     cmp.b #'b',d0
  40.     bne.b B
  41.     move.l 16(a3),d0
  42.     lea bstr(pc),a4
  43.     bra sd0
  44. B
  45.     cmp.b #'B',d0
  46.     bne.b c
  47.     lea Bstr(pc),a4
  48.     move.l 16(a3),d0
  49.     bra sd0
  50. c
  51.     cmp.b #'c',d0
  52.     bne.b d
  53.     move.l 16(a3),d0
  54.     lea bstr(pc),a4
  55.     bsr sd0Sub
  56.     moveq #' ',d0
  57.     bsr put
  58.     move.l 12(a3),d0
  59.     bsr Number2Sub                  ; Monatstag
  60.     moveq #' ',d0
  61.     bsr put
  62.     move.l 8(a3),d0                 ; Stunde (24)
  63.     bsr Number2Sub
  64.     moveq #':',d0
  65.     bsr put
  66.     move.l 4(a3),d0                 ; Minute
  67.     bsr Number2Sub
  68.     moveq #':',d0
  69.     bsr put
  70.     move.l (a3),d0                  ; Sekunde
  71.     bsr Number2Sub
  72.     moveq #' ',d0
  73.     bsr put
  74.     move.l 20(a3),d0                ; Jahr
  75.     add.w #1900,d0
  76.     bsr NumberSub
  77.     bra Loop
  78. d
  79.     cmp.b #'d',d0
  80.     bne.b H
  81.     move.l 12(a3),d0                ; Tag im Monat
  82.     bra Number2
  83. H
  84.     cmp.b #'I',d0
  85.     bne.b I
  86.     move.l 8(a3),d0                 ; Stunde (24)
  87.     bra Number2
  88. I
  89.     cmp.b #'H',d0
  90.     bne.b j
  91.     move.l 8(a3),d0
  92.     cmp.w #12,d0                    ; Stunde (12)
  93.     bls.b .1
  94.     sub.w #12,d0
  95. .1    tst.w d0
  96.     bne Number2
  97.     moveq #12,d0
  98.     bra Number2
  99. j
  100.     cmp.b #'j',d0
  101.     bne.b m
  102.     move.l 28(a3),d0                ; yday
  103.     addq.l #1,d0
  104.     bsr NumberSub
  105.     bra Loop
  106. m
  107.     cmp.b #'m',d0
  108.     bne.b M
  109.     move.l 16(a3),d0                ; Monat
  110.     addq.l #1,d0
  111.     bra Number2
  112. M
  113.     cmp.b #'M',d0
  114.     bne.b p
  115.     move.l 4(a3),d0                 ; Minute
  116.     bra Number2
  117. p
  118.     cmp.b #'p',d0
  119.     bne.b S
  120.     moveq #'A',d0                   ; AM
  121.     cmp.w #12,8+2(a3)
  122.     bls.b .1
  123.     moveq #'P',d0                   ; PM
  124. .1    bsr put
  125.     moveq #'M',d0
  126.     bsr put
  127.     bra Loop
  128. S
  129.     cmp.b #'S',d0
  130.     bne.b U
  131.     move.l (a3),d0                  ; Sekunde
  132.     bra Number2
  133. U
  134.     cmp.b #'U',d0
  135.     bne.b w
  136.     move.l 28(a3),d0
  137.     add.l 24(a3),d0
  138. u1    divu #7,d0                      ; Woche bzgl. Sonntag
  139. Number    bsr NumberSub
  140.     bra Loop
  141. w
  142.     cmp.b #'w',d0
  143.     bne.b W
  144.     move.l 24(a3),d0                ; Wochentag numerisch
  145.     bra.b Number
  146. W
  147.     cmp.b #'W',d0
  148.     bne.b x
  149.     move.l 24(a3),d0
  150.     subq.w #1,d0
  151.     bhs.b .1
  152.     moveq #6,d0
  153. .1    add.l 28(a3),d0                 ; Woche bzgl. Montag
  154.     bra.b u1
  155. x
  156.     cmp.b #'x',d0
  157.     bne.b X
  158.     move.l 16(a3),d0
  159.     lea bstr(pc),a4                 ; Monat
  160.     bsr.b sd0Sub
  161.     moveq #' ',d0
  162.     bsr put
  163.     move.l 12(a3),d0
  164.     bsr Number2Sub                  ; Monatstag
  165.     moveq #' ',d0
  166.     bsr put
  167.     move.l 20(a3),d0                ; Jahr
  168.     add.w #1900,d0
  169.     bra.b Number
  170. X
  171.     cmp.b #'X',d0
  172.     bne.b y
  173.     move.l 8(a3),d0                 ; Stunde (24)
  174.     bsr Number2Sub
  175.     moveq #':',d0
  176.     bsr put
  177.     move.l 4(a3),d0                 ; Minute
  178.     bsr Number2Sub
  179.     moveq #':',d0
  180.     bsr put
  181.     move.l (a3),d0                  ; Sekunde
  182.     bra Number2
  183. y
  184.     cmp.b #'y',d0
  185.     bne.b Y
  186.     move.l 20(a3),d0                ; Jahr
  187.     bra Number
  188. Y
  189.     cmp.b #'Y',d0
  190.     bne Loop
  191.     move.l 20(a3),d0                ; Jahr
  192.     add.w #1900,d0
  193.     bra Number
  194.  
  195. sd0:    ; d0-ten String aus d4 coden
  196.     bsr.b sd0Sub
  197.     bra Loop
  198. sd0Sub:    tst.w d0
  199.     beq.b sd0copy
  200. sd0find:    cmp.l #out,a4
  201.     bhi.b sd0Ret
  202.     tst.b (a4)+
  203.     bne.b sd0find
  204.     subq.w #1,d0
  205.     bgt.b sd0find
  206. sd0copy:    move.b (a4)+,d0
  207.     beq.b sd0Ret
  208.     bsr put
  209.     bra.b sd0copy
  210. sd0Ret:    rts
  211.  
  212. End    ; Ende:
  213.     moveq #0,d0
  214.     bsr put
  215.     move.l a0,d0
  216.     sub.l 6*4+4(a7),d0
  217.     subq.l #1,d0
  218.     cmp.l a1,a0
  219.     blo.b .pop
  220.     ; Überlauf:
  221.     moveq #0,d0             ; Ergebnis 0
  222.     tst.l 6*4+8(a7)
  223.     beq.b .pop               ; Stringlänge > 0?
  224.     clr.b -(a1)             ; dann trotzdem Nullbyte
  225. .pop    movem.l (a7)+,d1/a0-a4
  226.     rts
  227.  
  228. NumberSub:    ; d0 bis zu vierstellig
  229.     and.l #$3FFF,d0
  230.     divu #1000,d0
  231.     tst.w d0
  232.     beq.b .0
  233.     add.b #'0',d0
  234.     bsr.b put
  235.     clr.w d0
  236. .0    swap d0
  237.     divu #100,d0
  238.     tst.w d0
  239.     beq.b .1
  240.     add.b #'0',d0
  241.     bsr.b put
  242.     clr.w d0
  243. .1    swap d0
  244.     divu #10,d0
  245.     tst.w d0
  246.     beq.b .2
  247.     add.b #'0',d0
  248.     bsr.b put
  249.     clr.w d0
  250. .2    swap d0
  251.     add.b #'0',d0
  252.     bra.b put
  253.  
  254. Number2:    ; d0 zweistellig putten
  255.     bsr.b Number2Sub
  256.     bra Loop
  257. Number2Sub:    and.l #$7F,d0
  258.     divu #10,d0
  259.     add.b #'0',d0
  260.     bsr.b put
  261.     swap d0
  262.     add.b #'0',d0
  263.     ; *
  264. put    cmp.l a1,a0
  265.     bhs.b pt1
  266.     move.b d0,(a0)+
  267. pt1    rts
  268.  
  269. astr    dc.b 'Sun',0,'Mon',0,'Tue',0,'Wed',0,'Thu',0,'Fri',0,'Sat',0
  270. Astr    dc.b 'Sunday',0,'Monday',0,'Tuesday',0,'Wednesday',0,'Thursday',0,'Friday',0,'Saturday',0
  271.  
  272. bstr:    dc.b 'Jan',0,'Feb',0,'Mar',0,'Apr',0,'May',0,'Jun',0
  273.     dc.b 'Jul',0,'Aug',0,'Sep',0,'Oct',0,'Nov',0,'Dec',0
  274.  
  275. Bstr:    dc.b 'January',0,'February',0,'March',0,'April',0,'May',0,'June',0
  276.     dc.b 'July',0,'August',0,'September',0,'October',0,'November',0,'December',0
  277. out:
  278.  
  279.     end
  280.