
* Maxon C++
* Library-Modul "strftime"
* Jens Gelhar 09.02.92, 16.04.94

	xdef	strftime__PcUiPCcPC02tm
	xdef	_strftime

strftime__PcUiPCcPC02tm:
_strftime:
	; 0: target, 4: len, 8: fmt, 12: tm
	movem.l d1/a0-a4,-(a7)
	movem.l 6*4+4(a7),a0-a3; a0: target, a1: end, a2: fmt, a3: tm
	add.l a0,a1
Loop	move.b (a2)+,d0
	beq End
	cmp.b #'%',d0
	beq.b Protz
lput	bsr put
	cmp.l a1,a0
	blo.b Loop
	bra End
Protz	move.b (a2)+,d0
	beq End
	cmp.b #'%',d0
	beq.b lput
	cmp.b #'a',d0
	bne.b A
	move.l 24(a3),d0
	lea astr(pc),a4
	bra sd0
A
	cmp.b #'A',d0
	bne.b b
	move.l 24(a3),d0
	lea Astr(pc),a4
	bra sd0
b
	cmp.b #'b',d0
	bne.b B
	move.l 16(a3),d0
	lea bstr(pc),a4
	bra sd0
B
	cmp.b #'B',d0
	bne.b c
	lea Bstr(pc),a4
	move.l 16(a3),d0
	bra sd0
c
	cmp.b #'c',d0
	bne.b d
	move.l 16(a3),d0
	lea bstr(pc),a4
	bsr sd0Sub
	moveq #' ',d0
	bsr put
	move.l 12(a3),d0
	bsr Number2Sub                  ; Monatstag
	moveq #' ',d0
	bsr put
	move.l 8(a3),d0                 ; Stunde (24)
	bsr Number2Sub
	moveq #':',d0
	bsr put
	move.l 4(a3),d0                 ; Minute
	bsr Number2Sub
	moveq #':',d0
	bsr put
	move.l (a3),d0                  ; Sekunde
	bsr Number2Sub
	moveq #' ',d0
	bsr put
	move.l 20(a3),d0                ; Jahr
	add.w #1900,d0
	bsr NumberSub
	bra Loop
d
	cmp.b #'d',d0
	bne.b H
	move.l 12(a3),d0                ; Tag im Monat
	bra Number2
H
	cmp.b #'I',d0
	bne.b I
	move.l 8(a3),d0                 ; Stunde (24)
	bra Number2
I
	cmp.b #'H',d0
	bne.b j
	move.l 8(a3),d0
	cmp.w #12,d0                    ; Stunde (12)
	bls.b .1
	sub.w #12,d0
.1	tst.w d0
	bne Number2
	moveq #12,d0
	bra Number2
j
	cmp.b #'j',d0
	bne.b m
	move.l 28(a3),d0                ; yday
	addq.l #1,d0
	bsr NumberSub
	bra Loop
m
	cmp.b #'m',d0
	bne.b M
	move.l 16(a3),d0                ; Monat
	addq.l #1,d0
	bra Number2
M
	cmp.b #'M',d0
	bne.b p
	move.l 4(a3),d0                 ; Minute
	bra Number2
p
	cmp.b #'p',d0
	bne.b S
	moveq #'A',d0                   ; AM
	cmp.w #12,8+2(a3)
	bls.b .1
	moveq #'P',d0                   ; PM
.1	bsr put
	moveq #'M',d0
	bsr put
	bra Loop
S
	cmp.b #'S',d0
	bne.b U
	move.l (a3),d0                  ; Sekunde
	bra Number2
U
	cmp.b #'U',d0
	bne.b w
	move.l 28(a3),d0
	add.l 24(a3),d0
u1	divu #7,d0                      ; Woche bzgl. Sonntag
Number	bsr NumberSub
	bra Loop
w
	cmp.b #'w',d0
	bne.b W
	move.l 24(a3),d0                ; Wochentag numerisch
	bra.b Number
W
	cmp.b #'W',d0
	bne.b x
	move.l 24(a3),d0
	subq.w #1,d0
	bhs.b .1
	moveq #6,d0
.1	add.l 28(a3),d0                 ; Woche bzgl. Montag
	bra.b u1
x
	cmp.b #'x',d0
	bne.b X
	move.l 16(a3),d0
	lea bstr(pc),a4                 ; Monat
	bsr.b sd0Sub
	moveq #' ',d0
	bsr put
	move.l 12(a3),d0
	bsr Number2Sub                  ; Monatstag
	moveq #' ',d0
	bsr put
	move.l 20(a3),d0                ; Jahr
	add.w #1900,d0
	bra.b Number
X
	cmp.b #'X',d0
	bne.b y
	move.l 8(a3),d0                 ; Stunde (24)
	bsr Number2Sub
	moveq #':',d0
	bsr put
	move.l 4(a3),d0                 ; Minute
	bsr Number2Sub
	moveq #':',d0
	bsr put
	move.l (a3),d0                  ; Sekunde
	bra Number2
y
	cmp.b #'y',d0
	bne.b Y
	move.l 20(a3),d0                ; Jahr
	bra Number
Y
	cmp.b #'Y',d0
	bne Loop
	move.l 20(a3),d0                ; Jahr
	add.w #1900,d0
	bra Number

sd0:	; d0-ten String aus d4 coden
	bsr.b sd0Sub
	bra Loop
sd0Sub:	tst.w d0
	beq.b sd0copy
sd0find:	cmp.l #out,a4
	bhi.b sd0Ret
	tst.b (a4)+
	bne.b sd0find
	subq.w #1,d0
	bgt.b sd0find
sd0copy:	move.b (a4)+,d0
	beq.b sd0Ret
	bsr put
	bra.b sd0copy
sd0Ret:	rts

End	; Ende:
	moveq #0,d0
	bsr put
	move.l a0,d0
	sub.l 6*4+4(a7),d0
	subq.l #1,d0
	cmp.l a1,a0
	blo.b .pop
	; Überlauf:
	moveq #0,d0             ; Ergebnis 0
	tst.l 6*4+8(a7)
	beq.b .pop               ; Stringlänge > 0?
	clr.b -(a1)             ; dann trotzdem Nullbyte
.pop	movem.l (a7)+,d1/a0-a4
	rts

NumberSub:	; d0 bis zu vierstellig
	and.l #$3FFF,d0
	divu #1000,d0
	tst.w d0
	beq.b .0
	add.b #'0',d0
	bsr.b put
	clr.w d0
.0	swap d0
	divu #100,d0
	tst.w d0
	beq.b .1
	add.b #'0',d0
	bsr.b put
	clr.w d0
.1	swap d0
	divu #10,d0
	tst.w d0
	beq.b .2
	add.b #'0',d0
	bsr.b put
	clr.w d0
.2	swap d0
	add.b #'0',d0
	bra.b put

Number2:	; d0 zweistellig putten
	bsr.b Number2Sub
	bra Loop
Number2Sub:	and.l #$7F,d0
	divu #10,d0
	add.b #'0',d0
	bsr.b put
	swap d0
	add.b #'0',d0
	; *
put	cmp.l a1,a0
	bhs.b pt1
	move.b d0,(a0)+
pt1	rts

astr	dc.b 'Sun',0,'Mon',0,'Tue',0,'Wed',0,'Thu',0,'Fri',0,'Sat',0
Astr	dc.b 'Sunday',0,'Monday',0,'Tuesday',0,'Wednesday',0,'Thursday',0,'Friday',0,'Saturday',0

bstr:	dc.b 'Jan',0,'Feb',0,'Mar',0,'Apr',0,'May',0,'Jun',0
	dc.b 'Jul',0,'Aug',0,'Sep',0,'Oct',0,'Nov',0,'Dec',0

Bstr:	dc.b 'January',0,'February',0,'March',0,'April',0,'May',0,'June',0
	dc.b 'July',0,'August',0,'September',0,'October',0,'November',0,'December',0
out:

	end
