#if !defined(__AVR_TINY__)
#if !defined(__DOXYGEN__)
#include "macros.inc"
#define dst_b1 r25
#define dst_b0 r24
#define src_b30 r23
#define src_b20 r22
#define src_b1 r21
#define src_b0 r20
#define siz_b1 r19
#define siz_b0 r18
#define src_b2 r28
#define dlen_b1 src_b30
#define dlen_b0 src_b20
#define rWord_b1 r25
#define rWord_b0 r24
.text
.global _U(strlcat_PF)
.type _U(strlcat_PF),@function
_U(strlcat_PF):
push src_b2
mov src_b2, src_b20
X_movw XL, dst_b0 ; X = dst
X_movw ZL, src_b0 ; Z = src
LPM_R0_ZPLUS_INIT src_b2
.L_strlcat_PF_dlen: ; Find end of dst string
ld r0, X+ ; get next char from dst
cp siz_b0, __zero_reg__ ; and calc dlen = len of dst
cpc siz_b1, __zero_reg__ ; size == 0 ?
breq 1f ; --> done
tst r0 ; end of dst ?
breq 1f ; --> done
subi siz_b0, lo8(1)
sbci siz_b1, hi8(1) ; siz--
rjmp .L_strlcat_PF_dlen ; --> next char
1: sbiw XL, 1 ; undo post increment
X_movw dlen_b0, XL
sub dlen_b0, dst_b0
sbc dlen_b1, dst_b1 ; dlen = X - dst
cp siz_b0, __zero_reg__
cpc siz_b1, __zero_reg__ ; size == 0 ?
breq .L_strlcat_PF_slen ; --> done
subi siz_b0, lo8(1)
sbci siz_b1, hi8(1) ; siz--
.L_strlcat_PF_concat: ; Concatenate
LPM_R0_ZPLUS_NEXT src_b2 ; get next char from src
cp siz_b0, __zero_reg__
cpc siz_b1, __zero_reg__ ; size == 0 ?
breq 1f ; --> done
tst r0 ; end of src ?
breq 1f ; --> done
st X+, r0 ; store in dest
subi siz_b0, lo8(1)
sbci siz_b1, hi8(1) ; siz--
rjmp .L_strlcat_PF_concat ; --> next char
1: st X, __zero_reg__ ; *X = '\0'
sbiw ZL, 1 ; undo post increment
#ifdef RAMPZ
in r0, _SFR_IO_ADDR(RAMPZ)
sbc r0, __zero_reg__
out _SFR_IO_ADDR(RAMPZ), r0
#endif
.L_strlcat_PF_slen:
LPM_R0_ZPLUS_NEXT src_b2 ; get next char from src
tst r0 ; end of src ?
brne .L_strlcat_PF_slen ; --> next char
sbiw ZL, 1 ; undo post increment
#ifdef RAMPZ
in r0, _SFR_IO_ADDR(RAMPZ)
sbc r0, __zero_reg__
out _SFR_IO_ADDR(RAMPZ), r0
#endif
X_movw rWord_b0, dlen_b0
add rWord_b0, ZL
adc rWord_b1, ZH
sub rWord_b0, src_b0
sbc rWord_b1, src_b1 ; return(dlen + (Z - src))
LPM_R0_ZPLUS_FINI src_b2
pop src_b2
ret
.L_strlcat_PF_end:
.size _U(strlcat_PF), .L_strlcat_PF_end - _U(strlcat_PF)
#endif
#endif