Skip to content

Commit 0a40e02

Browse files
committed
saved 1 byte in strlcat by inlining strnlen
1 parent be0f1bb commit 0a40e02

File tree

1 file changed

+31
-26
lines changed

1 file changed

+31
-26
lines changed

src/libc/strlcat.src

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,45 @@
55
public _strlcat
66

77
_strlcat:
8-
push ix
9-
ld ix, 0
10-
lea bc, ix
11-
add ix, sp
12-
ld hl, (ix + 9) ; src
8+
ld iy, 0
9+
lea bc, iy
10+
add iy, sp
11+
ld hl, (iy + 6) ; src
1312
xor a, a
1413
cpir
1514
sbc hl, hl
16-
scf
15+
dec hl
1716
sbc hl, bc
18-
push hl ; src_len
17+
; carry is clear
18+
ex de, hl
1919

20-
ld de, (ix + 12) ; max_size
20+
; inlined strnlen
21+
ld bc, (iy + 9) ; max_size
2122
sbc hl, hl
22-
adc hl, de
23+
sbc hl, bc
2324
; Allows dst to be NULL when max_size is zero
24-
jr z, .zero_size
25-
26-
push de
27-
ld hl, (ix + 6) ; dst
28-
push hl
29-
call _strnlen
30-
pop af
31-
pop af
25+
jr z, .zero_size ; return src_len
26+
add hl, bc
27+
push de ; src_len
28+
ld de, (iy + 3) ; dst
29+
sbc hl, de
30+
ex de, hl
31+
cpir
32+
add hl, de
33+
jr z, .finish_strnlen
34+
inc hl
35+
.finish_strnlen:
3236

3337
ex de, hl
34-
ld hl, (ix + 12) ; max_size
38+
ld hl, (iy + 9) ; max_size
3539
; (copy_size + 1) = max_size - dst_len
3640
xor a, a
3741
sbc hl, de
42+
jr z, .no_room
43+
3844
pop bc ; src_len
3945
push bc
40-
jr z, .no_room
46+
4147
; (copy_size + 1) - src_len - 1
4248
scf
4349
sbc hl, bc
@@ -50,22 +56,21 @@ _strlcat:
5056
xor a, a
5157
adc hl, bc
5258
jr z, .zero_copy_size
53-
push de ; dst_len
5459
push hl
5560
pop bc
56-
ld hl, (ix + 6) ; dst
61+
62+
push de ; dst_len
63+
ld hl, (iy + 3) ; dst
5764
add hl, de ; dst + dst_len
5865
ex de, hl
59-
ld hl, (ix + 9) ; src
66+
ld hl, (iy + 6) ; src
6067
ldir
6168
ld (de), a ; null terminate
6269
pop de ; dst_len
6370
.zero_copy_size:
6471
.no_room:
65-
.zero_size:
6672
pop hl ; src_len
73+
.zero_size:
74+
; return src_len + dst_len
6775
add hl, de
68-
pop ix
6976
ret
70-
71-
extern _strnlen

0 commit comments

Comments
 (0)