@@ -25,29 +25,30 @@ _strlcpy:
2525 sbc hl, bc ; always sets carry flag
2626 ; now hl = strlen(src)
2727
28- push hl ; save this for after dsize check
29-
3028 ld bc, (iy + 9) ; bc = dsize
3129 ex de, hl ; de = strlen(src)
3230
3331 ; check if dsize is zero
3432 sbc hl, hl ; set hl to -1, carry was already set
3533 add hl, bc ; hl = -1 + dsize
36- jr nc, .strlcpy_done ; do nothing if dsize is zero
34+ ex de, hl ; hl = strlen(src), de = dsize - 1
35+ ret nc ; do nothing and return strlen(src) if dsize is zero
36+
37+ push hl ; save strlen(src) for after copy
3738
3839 ; dsize is not zero, compare them
39- ; hl = dsize - 1
40- ; de = strlen(src)
40+ ; hl = strlen(src)
41+ ; de = dsize - 1
4142
4243 ; carry flag is set, so calculate hl - (de + 1)
4344 sbc hl, de
4445
45- ; if hl <= de, ( dsize - 1) <= strlen(src); keep bc as dsize
46- jr c , .ready_for_ldir
46+ ; if hl > de, strlen(src) > ( dsize - 1); string is truncated, keep bc as dsize
47+ jr nc , .ready_for_ldir
4748
48- ; hl > de, so (dsize - 1) > strlen(src); set bc to strlen(src) + 1
49- push de
49+ ; hl <= de, so strlen(src) <= (dsize - 1); string is not truncated, set bc to strlen(src) + 1
5050 pop bc
51+ push bc
5152 inc bc
5253
5354.ready_for_ldir:
@@ -61,14 +62,13 @@ _strlcpy:
6162 ; bc has the length (including space for null terminator)
6263 ldir
6364
64- ; replace final byte with NUL, in case src null terminator wasn't reached
65+ pop hl ; get the result of strlen(src) from earlier and put into hl
66+
67+ ret c ; return strlen(src) if string was not truncated
68+
69+ ; string was truncated, so replace final byte with NUL
6570 dec de
6671 ; a is already 0
6772 ld (de), a ; store null terminator at the address pointed to by de
6873
69- .strlcpy_done:
70- ; return strlen(src)
71-
72- pop hl ; get the result of strlen(src) from earlier and put into hl
73-
74- ret
74+ ret ; return strlen(src)
0 commit comments