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