Skip to content

Commit b021572

Browse files
committed
Dropped templates and defined the functions explicitly
1 parent bf637fa commit b021572

File tree

1 file changed

+129
-69
lines changed

1 file changed

+129
-69
lines changed

Core/Libraries/Source/WWVegas/WWLib/stringex.h

Lines changed: 129 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -24,48 +24,48 @@
2424

2525
// Declaration
2626

27-
template<typename T> size_t strlen_t(const T *str);
28-
template<typename T> size_t strnlen_t(const T *str, size_t maxlen);
27+
template<typename T> size_t strlen_t(const T* str);
28+
template<typename T> size_t strnlen_t(const T* str, size_t maxlen);
2929

3030
#if defined(_MSC_VER) && _MSC_VER < 1300
31-
size_t strnlen(const char *str, size_t maxlen);
32-
size_t wcsnlen(const wchar_t *str, size_t maxlen);
31+
size_t strnlen(const char* str, size_t maxlen);
32+
size_t wcsnlen(const wchar_t* str, size_t maxlen);
3333
#endif
3434

35-
template<typename T> size_t strlcpy_t(T *dst, const T *src, size_t dstsize);
36-
template<typename T> size_t strlcat_t(T *dst, const T *src, size_t dstsize);
35+
template<typename T> size_t strlcpy_t(T* dst, const T* src, size_t dstsize);
36+
template<typename T> size_t strlcat_t(T* dst, const T* src, size_t dstsize);
3737

38-
size_t strlcpy(char *dst, const char *src, size_t dstsize);
39-
size_t strlcat(char *dst, const char *src, size_t dstsize);
40-
size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t dstsize);
41-
size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t dstsize);
38+
size_t strlcpy(char* dst, const char* src, size_t dstsize);
39+
size_t strlcat(char* dst, const char* src, size_t dstsize);
40+
size_t wcslcpy(wchar_t* dst, const wchar_t* src, size_t dstsize);
41+
size_t wcslcat(wchar_t* dst, const wchar_t* src, size_t dstsize);
4242

43-
template<typename T> size_t strlmove_t(T *dst, const T *src, size_t dstsize);
44-
template<typename T> size_t strlmcat_t(T *dst, const T *src, size_t dstsize);
43+
template<typename T> size_t strlmove_t(T* dst, const T* src, size_t dstsize);
44+
template<typename T> size_t strlmcat_t(T* dst, const T* src, size_t dstsize);
4545

46-
size_t strlmove(char *dst, const char *src, size_t dstsize);
47-
size_t strlmcat(char *dst, const char *src, size_t dstsize);
48-
size_t wcslmove(wchar_t *dst, const wchar_t *src, size_t dstsize);
49-
size_t wcslmcat(wchar_t *dst, const wchar_t *src, size_t dstsize);
46+
size_t strlmove(char* dst, const char* src, size_t dstsize);
47+
size_t strlmcat(char* dst, const char* src, size_t dstsize);
48+
size_t wcslmove(wchar_t* dst, const wchar_t* src, size_t dstsize);
49+
size_t wcslmcat(wchar_t* dst, const wchar_t* src, size_t dstsize);
5050

5151
#if !(defined(_MSC_VER) && _MSC_VER < 1300)
52-
template<size_t Size> size_t strlcpy_t(char (&dst)[Size], const char *src);
53-
template<size_t Size> size_t strlcat_t(char (&dst)[Size], const char *src);
54-
template<size_t Size> size_t strlmove_t(char (&dst)[Size], const char *src);
55-
template<size_t Size> size_t strlmcat_t(char (&dst)[Size], const char *src);
52+
template<size_t Size> size_t strlcpy_t(char(&dst)[Size], const char* src);
53+
template<size_t Size> size_t strlcat_t(char(&dst)[Size], const char* src);
54+
template<size_t Size> size_t strlmove_t(char(&dst)[Size], const char* src);
55+
template<size_t Size> size_t strlmcat_t(char(&dst)[Size], const char* src);
5656
#endif
5757

58-
template<typename T> bool startsWith(const T *str, const T *prefix);
59-
template<typename T> bool startsWithNoCase(const T *str, const T *prefix);
60-
template<typename T> bool endsWith(const T *str, const T *suffix);
61-
template<typename T> bool endsWithNoCase(const T *str, const T *suffix);
58+
template<typename T> bool startsWith(const T* str, const T* prefix);
59+
template<typename T> bool startsWithNoCase(const T* str, const T* prefix);
60+
template<typename T> bool endsWith(const T* str, const T* suffix);
61+
template<typename T> bool endsWithNoCase(const T* str, const T* suffix);
6262

6363

6464
// Implementation
6565

6666
// Templated strlen.
6767
// Returns the number of characters until the first zero character.
68-
template<typename T> size_t strlen_t(const T *str)
68+
template<typename T> size_t strlen_t(const T* str)
6969
{
7070
const T* begin = str;
7171
while (*str)
@@ -75,7 +75,7 @@ template<typename T> size_t strlen_t(const T *str)
7575

7676
// Templated strlen.
7777
// Returns the number of characters until the first zero character or when maxlen is reached.
78-
template<typename T> size_t strnlen_t(const T *str, size_t maxlen)
78+
template<typename T> size_t strnlen_t(const T* str, size_t maxlen)
7979
{
8080
const T* begin = str;
8181
const T* end = str + maxlen;
@@ -85,14 +85,14 @@ template<typename T> size_t strnlen_t(const T *str, size_t maxlen)
8585
}
8686

8787
#if defined(_MSC_VER) && _MSC_VER < 1300
88-
inline size_t strnlen(const char *str, size_t maxlen) { return strnlen_t(str, maxlen); }
89-
inline size_t wcsnlen(const wchar_t *str, size_t maxlen) { return strnlen_t(str, maxlen); }
88+
inline size_t strnlen(const char* str, size_t maxlen) { return strnlen_t(str, maxlen); }
89+
inline size_t wcsnlen(const wchar_t* str, size_t maxlen) { return strnlen_t(str, maxlen); }
9090
#endif
9191

9292
// Templated strlcpy. Prefer using this over strncpy.
9393
// Copies src into dst until dstsize minus one. Always null terminates.
9494
// Returns the length of src, excluding the null terminator.
95-
template<typename T> size_t strlcpy_t(T *dst, const T *src, size_t dstsize)
95+
template<typename T> size_t strlcpy_t(T* dst, const T* src, size_t dstsize)
9696
{
9797
const size_t srclen = strlen_t(src);
9898
if (dstsize != 0)
@@ -107,7 +107,7 @@ template<typename T> size_t strlcpy_t(T *dst, const T *src, size_t dstsize)
107107
// Templated strlcat. Prefer using this over strncpy.
108108
// Appends src into dst until dstsize minus one. Always null terminates.
109109
// Returns the length of dst + src, excluding the null terminator.
110-
template<typename T> size_t strlcat_t(T *dst, const T *src, size_t dstsize)
110+
template<typename T> size_t strlcat_t(T* dst, const T* src, size_t dstsize)
111111
{
112112
const size_t dstlen = strnlen_t(dst, dstsize);
113113
const size_t srclen = strlen_t(src);
@@ -129,18 +129,18 @@ template<typename T> size_t strlcat_t(T *dst, const T *src, size_t dstsize)
129129
}
130130

131131
#ifndef HAVE_STRLCPY
132-
inline size_t strlcpy(char *dst, const char *src, size_t dstsize) { return strlcpy_t(dst, src, dstsize); }
132+
inline size_t strlcpy(char* dst, const char* src, size_t dstsize) { return strlcpy_t(dst, src, dstsize); }
133133
#endif
134134
#ifndef HAVE_STRLCAT
135-
inline size_t strlcat(char *dst, const char *src, size_t dstsize) { return strlcat_t(dst, src, dstsize); }
135+
inline size_t strlcat(char* dst, const char* src, size_t dstsize) { return strlcat_t(dst, src, dstsize); }
136136
#endif
137-
inline size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t dstsize) { return strlcpy_t(dst, src, dstsize); }
138-
inline size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t dstsize) { return strlcat_t(dst, src, dstsize); }
137+
inline size_t wcslcpy(wchar_t* dst, const wchar_t* src, size_t dstsize) { return strlcpy_t(dst, src, dstsize); }
138+
inline size_t wcslcat(wchar_t* dst, const wchar_t* src, size_t dstsize) { return strlcat_t(dst, src, dstsize); }
139139

140140
// Templated strlmove. Prefer using this over strlcpy if dst and src overlap.
141141
// Moves src into dst until dstsize minus one. Always null terminates.
142142
// Returns the length of src, excluding the null terminator.
143-
template<typename T> size_t strlmove_t(T *dst, const T *src, size_t dstsize)
143+
template<typename T> size_t strlmove_t(T* dst, const T* src, size_t dstsize)
144144
{
145145
const size_t srclen = strlen_t(src);
146146
if (dstsize > 0)
@@ -155,7 +155,7 @@ template<typename T> size_t strlmove_t(T *dst, const T *src, size_t dstsize)
155155
// Templated strlmcat. Prefer using this over strlcat if dst and src overlap.
156156
// Appends src into dst until dstsize minus one. Always null terminates.
157157
// Returns the length of dst + src, excluding the null terminator.
158-
template<typename T> size_t strlmcat_t(T *dst, const T *src, size_t dstsize)
158+
template<typename T> size_t strlmcat_t(T* dst, const T* src, size_t dstsize)
159159
{
160160
const size_t dstlen = strnlen_t(dst, dstsize);
161161
const size_t srclen = strlen_t(src);
@@ -176,58 +176,118 @@ template<typename T> size_t strlmcat_t(T *dst, const T *src, size_t dstsize)
176176
return dstlen + srclen; // length tried to create
177177
}
178178

179-
inline size_t strlmove(char *dst, const char *src, size_t dstsize) { return strlmove_t(dst, src, dstsize); }
180-
inline size_t strlmcat(char *dst, const char *src, size_t dstsize) { return strlmcat_t(dst, src, dstsize); }
181-
inline size_t wcslmove(wchar_t *dst, const wchar_t *src, size_t dstsize) { return strlmove_t(dst, src, dstsize); }
182-
inline size_t wcslmcat(wchar_t *dst, const wchar_t *src, size_t dstsize) { return strlmcat_t(dst, src, dstsize); }
179+
inline size_t strlmove(char* dst, const char* src, size_t dstsize) { return strlmove_t(dst, src, dstsize); }
180+
inline size_t strlmcat(char* dst, const char* src, size_t dstsize) { return strlmcat_t(dst, src, dstsize); }
181+
inline size_t wcslmove(wchar_t* dst, const wchar_t* src, size_t dstsize) { return strlmove_t(dst, src, dstsize); }
182+
inline size_t wcslmcat(wchar_t* dst, const wchar_t* src, size_t dstsize) { return strlmcat_t(dst, src, dstsize); }
183183

184184
#if !(defined(_MSC_VER) && _MSC_VER < 1300)
185-
template<size_t Size> size_t strlcpy_t(char (&dst)[Size], const char *src) { return strlcpy_t(dst, src, Size); }
186-
template<size_t Size> size_t strlcat_t(char (&dst)[Size], const char *src) { return strlcat_t(dst, src, Size); }
187-
template<size_t Size> size_t strlmove_t(char (&dst)[Size], const char *src) { return strlmove_t(dst, src, Size); }
188-
template<size_t Size> size_t strlmcat_t(char (&dst)[Size], const char *src) { return strlmcat_t(dst, src, Size); }
185+
template<size_t Size> size_t strlcpy_t(char(&dst)[Size], const char* src) { return strlcpy_t(dst, src, Size); }
186+
template<size_t Size> size_t strlcat_t(char(&dst)[Size], const char* src) { return strlcat_t(dst, src, Size); }
187+
template<size_t Size> size_t strlmove_t(char(&dst)[Size], const char* src) { return strlmove_t(dst, src, Size); }
188+
template<size_t Size> size_t strlmcat_t(char(&dst)[Size], const char* src) { return strlmcat_t(dst, src, Size); }
189189
#endif
190190

191-
inline int compare_string(const char *a, const char *b, const size_t maxCount, const bool caseSensitive = true)
191+
inline bool startsWith(const char* str, const char* prefix)
192192
{
193-
return caseSensitive ? strncmp(a, b, maxCount) : _strnicmp(a, b, maxCount);
193+
if (*prefix == char(0))
194+
return true; // everything starts with the empty string
195+
196+
const size_t strlen = ::strlen(str);
197+
const size_t prefixlen = ::strlen(prefix);
198+
if (strlen < prefixlen)
199+
return false; // prefix must be as long or shorter than str
200+
201+
return ::strncmp(str, prefix, prefixlen) == 0;
194202
}
195203

196-
inline int compare_string(const wchar_t *a, const wchar_t *b, const size_t maxCount, const bool caseSensitive = true)
204+
inline bool startsWith(const wchar_t* str, const wchar_t* prefix)
197205
{
198-
return caseSensitive ? wcsncmp(a, b, maxCount) : _wcsnicmp(a, b, maxCount);
206+
if (*prefix == wchar_t(0))
207+
return true; // everything starts with the empty string
208+
209+
const size_t strlen = ::wcslen(str);
210+
const size_t prefixlen = ::wcslen(prefix);
211+
if (strlen < prefixlen)
212+
return false; // prefix must be as long or shorter than str
213+
214+
return ::wcsncmp(str, prefix, prefixlen) == 0;
199215
}
200216

201-
template<typename T> bool string_edge_equals(const T *str, const T *smaller, const bool endEdge, const bool case_sensitive = true)
217+
inline bool startsWithNoCase(const char* str, const char* prefix)
202218
{
203-
if (*smaller == T(0))
204-
return true; // everything starts or ends with the empty string
219+
if (*prefix == char(0))
220+
return true; // everything starts with the empty string
205221

206-
const size_t strlen = strlen_t(str);
207-
const size_t smallen = strlen_t(smaller);
208-
if (strlen < smallen)
209-
return false; // smaller must be smaller than str
222+
const size_t strlen = ::strlen(str);
223+
const size_t prefixlen = ::strlen(prefix);
224+
if (strlen < prefixlen)
225+
return false; // prefix must be as long or shorter than str
210226

211-
const T* strStart = endEdge ? str + strlen - smallen : str;
227+
return ::strnicmp(str, prefix, prefixlen) == 0;
228+
}
212229

213-
return compare_string(strStart, smaller, smallen, case_sensitive) == 0;
230+
inline bool startsWithNoCase(const wchar_t* str, const wchar_t* prefix)
231+
{
232+
if (*prefix == wchar_t(0))
233+
return true; // everything starts with the empty string
234+
235+
const size_t strlen = ::wcslen(str);
236+
const size_t prefixlen = ::wcslen(prefix);
237+
if (strlen < prefixlen)
238+
return false; // prefix must be as long or shorter than str
239+
240+
return ::wcsnicmp(str, prefix, prefixlen) == 0;
214241
}
215242

216-
template<typename T> bool startsWith(const T *str, const T *prefix)
243+
inline bool endsWith(const char* str, const char* suffix)
217244
{
218-
return string_edge_equals(str, prefix, false);
219-
};
220-
template<typename T> bool startsWithNoCase(const T *str, const T *prefix)
245+
if (*suffix == char(0))
246+
return true; // everything ends with the empty string
247+
248+
const size_t strlen = ::strlen(str);
249+
const size_t suffixlen = ::strlen(suffix);
250+
if (strlen < suffixlen)
251+
return false; // suffix must be as long or shorter than str
252+
253+
return ::strncmp(str + strlen - suffixlen, suffix, suffixlen) == 0;
254+
}
255+
256+
inline bool endsWith(const wchar_t* str, const wchar_t* suffix)
221257
{
222-
return string_edge_equals(str, prefix, false, false);
223-
};
258+
if (*suffix == wchar_t(0))
259+
return true; // everything ends with the empty string
260+
261+
const size_t strlen = ::wcslen(str);
262+
const size_t suffixlen = ::wcslen(suffix);
263+
if (strlen < suffixlen)
264+
return false; // suffix must be as long or shorter than str
224265

225-
template<typename T> bool endsWith(const T *str, const T *suffix)
266+
return ::wcsncmp(str + strlen - suffixlen, suffix, suffixlen) == 0;
267+
}
268+
269+
inline bool endsWithNoCase(const char* str, const char* suffix)
226270
{
227-
return string_edge_equals(str, suffix, true);
228-
};
271+
if (*suffix == char(0))
272+
return true; // everything ends with the empty string
273+
274+
const size_t strlen = ::strlen(str);
275+
const size_t suffixlen = ::strlen(suffix);
276+
if (strlen < suffixlen)
277+
return false; // suffix must be as long or shorter than str
229278

230-
template<typename T> bool endsWithNoCase(const T *str, const T *suffix)
279+
return ::strnicmp(str + strlen - suffixlen, suffix, suffixlen) == 0;
280+
}
281+
282+
inline bool endsWithNoCase(const wchar_t* str, const wchar_t* suffix)
231283
{
232-
return string_edge_equals(str, suffix, true, false);
233-
};
284+
if (*suffix == wchar_t(0))
285+
return true; // everything ends with the empty string
286+
287+
const size_t strlen = ::wcslen(str);
288+
const size_t suffixlen = ::wcslen(suffix);
289+
if (strlen < suffixlen)
290+
return false; // suffix must be as long or shorter than str
291+
292+
return ::wcsnicmp(str + strlen - suffixlen, suffix, suffixlen) == 0;
293+
}

0 commit comments

Comments
 (0)