SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
StringUtil.cpp
1#include "Game/Util/StringUtil.hpp"
2
3// the linker will fix me when we are linking to the codewarrior libs
4#ifdef __cplusplus
5extern "C" {
6extern int strcasecmp(const char*, const char*);
7};
8#endif
9
10#include <cstdio>
11#include <cstring>
12#include "Game/Util.hpp"
13
14namespace MR {
15 void addPictureFontCode(wchar_t *pStr, int code) {
16 *pStr = code;
17 *++pStr = 0;
18 }
19
20 #ifdef NON_MATCHING
21 void addPictureFontTag(wchar_t *pStr, int tag) {
22 pStr[0] = 0x1A;
23 *(u8*)pStr[1] = 0x6;
24 *(u8*)pStr[2] = 0x3;
25 pStr[3] = tag - 0x30;
26 pStr[4] = 0;
27 }
28 #endif
29
30 void addPictureFontTagPlayerIcon(wchar_t *pMsgStr) {
31 int tag = MR::isPlayerLuigi() ? 0x4C : 0x42;
32 MR::addPictureFontTag(pMsgStr, tag);
33 }
34
35 #ifdef NON_MATCHING
36 // missing branch, and wrong condition (likely because of the branch)
37 const char* getBasename(const char *pString) {
38 const char* str = strrchr(pString, 0x2F); // '/'
39 return str ? str + 1 : pString;
40 }
41 #endif
42
43 void extractString(char *pDest, const char *pSource, u32 num, /* unused */ u32) {
44 strncpy(pDest, pSource, num);
45 pDest[num] = 0;
46 }
47
48 int strcasecmp(const char *pStr1, const char *pStr2) {
49 return strcasecmp(pStr1, pStr2);
50 }
51
52 bool isEqualString(const char *pStr1, const char *pStr2) {
53 return !strcmp(pStr1, pStr2);
54 }
55
56 bool isEqualStringCase(const char *pStr1, const char *pStr2) {
57 return !strcasecmp(pStr1, pStr2);
58 }
59
60 bool isEqualSubString(const char *pStr1, const char *pStr2) {
61 return strstr(pStr1, pStr2) != 0;
62 }
63
64 bool hasStringSpace(const char *pString) {
65 return strchr(pString, ' ') != 0;
66 }
67
68 void scan32(const char *pOut, const char *a2, s32 *pVal) {
69 if (!strstr(pOut, a2)) {
70 return;
71 }
72
73 sscanf(pOut, "\t%d", pVal);
74 }
75
76 void scan16(const char *pOut, const char *a2, u16 *pVal) {
77 if (!strstr(pOut, a2)) {
78 return;
79 }
80
81 u32 out;
82 sscanf(pOut, "\t%d", &out);
83 *pVal = out;
84 }
85
86 void scan8(const char *pOut, const char *a2, u8 *pVal) {
87 if (!strstr(pOut, a2)) {
88 return;
89 }
90
91 u32 out;
92 sscanf(pOut, "\t%d", &out);
93 *pVal = out;
94 }
95
96 void scanf32(const char *pOut, const char *a2, f32 *pVal) {
97 if (!strstr(pOut, a2)) {
98 return;
99 }
100
101 sscanf(pOut, "\t%ff", pVal);
102 }
103
104 void scanu8x4(const char *pStr, const char *a2, u8 *pVal) {
105 if (!strstr(pStr, a2)) {
106 return;
107 }
108
109 u32 vars[4];
110 sscanf(pStr, "\t{%d,%d,%d,%d}", &vars[0], &vars[1], &vars[2], &vars[3]);
111
112 for (int i = 0; i < 4; i++) {
113 pVal[i] = vars[i];
114 }
115 }
116
117 void scans16x4(const char *pStr, const char *a2, s16 *pVal) {
118 if (!strstr(pStr, a2)) {
119 return;
120 }
121
122 u32 vars[4];
123 sscanf(pStr, "\t{%d,%d,%d,%d}", &vars[0], &vars[1], &vars[2], &vars[3]);
124
125 for (int i = 0; i < 4; i++) {
126 pVal[i] = vars[i];
127 }
128 }
129
130 void scanf32x4(const char *pStr, const char *a2, f32 *pVal) {
131 if (!strstr(pStr, a2)) {
132 return;
133 }
134
135 sscanf(pStr, "\t{%ff,%ff,%ff,%ff}", &pVal[0], &pVal[1], &pVal[2], &pVal[3]);
136 }
137};