Skip to content

Commit 9b6ee44

Browse files
calc84maniacmateoconlechuga
authored andcommitted
Avoid redundant null termination when string is not truncated
1 parent f0f8c15 commit 9b6ee44

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

src/libc/strlcpy.src

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)