Skip to content

Commit e066d76

Browse files
committed
Match some string functions
1 parent b638db6 commit e066d76

File tree

2 files changed

+126
-10
lines changed

2 files changed

+126
-10
lines changed

src/segment_5FFE0.c

+120-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,126 @@
11
#include "common.h"
22

3-
#pragma GLOBAL_ASM("asm/nonmatchings/segment_5FFE0/func_8005F3E0.s")
4-
5-
#pragma GLOBAL_ASM("asm/nonmatchings/segment_5FFE0/func_8005F418.s")
6-
7-
#pragma GLOBAL_ASM("asm/nonmatchings/segment_5FFE0/func_8005F46C.s")
8-
9-
#pragma GLOBAL_ASM("asm/nonmatchings/segment_5FFE0/func_8005F518.s")
10-
11-
#pragma GLOBAL_ASM("asm/nonmatchings/segment_5FFE0/func_8005F5D4.s")
12-
3+
char *strcpy_2(char *dest, char *src) {
4+
char *start = dest;
5+
6+
while ((*(dest++) = *(src++)) != '\0') { }
7+
8+
return start;
9+
}
10+
11+
char *strcat(char *dest, const char *src) {
12+
char *start = dest;
13+
14+
while (*dest != '\0') {
15+
dest++;
16+
}
17+
18+
while ((*(dest++) = *(src++)) != '\0') { }
19+
20+
return start;
21+
}
22+
23+
/**
24+
* Case insensitive strcmp.
25+
*/
26+
int strcasecmp(const char *lhs, const char *rhs) {
27+
char c1, c2;
28+
29+
while (*lhs != '\0' || *rhs != '\0') {
30+
// To uppercase
31+
c1 = *lhs;
32+
if (c1 >= 'a' && c1 <= 'z') {
33+
c1 -= 32;
34+
}
35+
36+
c2 = *rhs;
37+
if (c2 >= 'a' && c2 <= 'z') {
38+
c2 -= 32;
39+
}
40+
41+
if (c1 < c2) {
42+
return -1;
43+
}
44+
if (c1 > c2) {
45+
return 1;
46+
}
47+
48+
lhs++;
49+
rhs++;
50+
}
51+
52+
return 0;
53+
}
54+
55+
/**
56+
* Case insensitive strncmp.
57+
*/
58+
int strncasecmp(const char *lhs, const char *rhs, size_t count) {
59+
char c1, c2;
60+
61+
while ((*lhs != '\0' || *rhs != '\0') && count != 0) {
62+
// To uppercase
63+
c1 = *lhs;
64+
if (c1 >= 'a' && c1 <= 'z') {
65+
c1 -= 32;
66+
}
67+
68+
c2 = *rhs;
69+
if (c2 >= 'a' && c2 <= 'z') {
70+
c2 -= 32;
71+
}
72+
73+
if (c1 < c2) {
74+
return -1;
75+
}
76+
if (c1 > c2) {
77+
return 1;
78+
}
79+
80+
lhs++;
81+
rhs++;
82+
count--;
83+
}
84+
85+
return 0;
86+
}
87+
88+
void *memset(void *dest, int ch, size_t count) {
89+
unsigned char *ptr = dest;
90+
91+
while (count-- > 0) {
92+
*(ptr++) = (unsigned char)ch;
93+
}
94+
95+
return dest;
96+
}
97+
98+
#if 1
1399
#pragma GLOBAL_ASM("asm/nonmatchings/segment_5FFE0/func_8005F60C.s")
100+
#else
101+
extern char D_8009ADF0[];
102+
extern char D_8009AE18[];
103+
104+
char *func_8005F60C(u64 param1, char *param3, u32 param4, s32 bUppercase) {
105+
char *chars;
106+
107+
if (bUppercase) {
108+
chars = D_8009AE18;
109+
} else {
110+
chars = D_8009ADF0;
111+
}
112+
113+
if (param1 != 0) {
114+
do {
115+
param3--;
116+
117+
*param3 = chars[param1 % param4];
118+
} while ((param1 / param4) != 0);
119+
}
120+
121+
return param3;
122+
}
123+
#endif
14124

15125
#pragma GLOBAL_ASM("asm/nonmatchings/segment_5FFE0/func_8005F6CC.s")
16126

symbol_addrs.txt

+6
Original file line numberDiff line numberDiff line change
@@ -1313,3 +1313,9 @@ gTempDLLIds = 0x8008CA18; // type:data size:0xc
13131313
gTempDLLInsts = 0x8008CA24; // type:data size:0xc
13141314
create_temp_dll = 0x800149F0; // type:func
13151315
remove_temp_dll = 0x80014A80; // type:func
1316+
1317+
strcpy_2 = 0x8005F3E0; // type:func
1318+
strcat = 0x8005F418; // type:func
1319+
strcasecmp = 0x8005F46C; // type:func
1320+
strncasecmp = 0x8005F518; // type:func
1321+
memset = 0x8005F5D4; // type:func

0 commit comments

Comments
 (0)