From 109c7768eb46ccbb45adc1c409fe8f6b7d799e2f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 14 Jul 2002 19:55:08 +0000 Subject: [PATCH] fixed wxStrrchr(s, '\0') bug, added const and non const versions of wxStrchr, wxStrrchr, wxStrstr, ... git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16175 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/wxchar.h | 16 +++++++++++---- src/common/wxchar.cpp | 47 +++++++++++++++++++++++++++---------------- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index 23a1c0a52a..b2ded4870d 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -606,7 +606,9 @@ WXDLLEXPORT int wxToupper(wxChar ch); #ifdef wxNEED_WX_STRING_H WXDLLEXPORT wxChar * wxStrcat(wxChar *dest, const wxChar *src); -WXDLLEXPORT wxChar * wxStrchr(const wxChar *s, wxChar c); +WXDLLEXPORT const wxChar * wxStrchr(const wxChar *s, wxChar c); +WXDLLEXPORT wxChar * wxStrchr(wxChar *s, wxChar c) + { return (wxChar *)wxStrchr((const wxChar *)s, c); } WXDLLEXPORT int wxStrcmp(const wxChar *s1, const wxChar *s2); WXDLLEXPORT int wxStrcoll(const wxChar *s1, const wxChar *s2); WXDLLEXPORT wxChar * wxStrcpy(wxChar *dest, const wxChar *src); @@ -615,10 +617,16 @@ WXDLLEXPORT size_t wxStrlen(const wxChar *s); WXDLLEXPORT wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n); WXDLLEXPORT int wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n); WXDLLEXPORT wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n); -WXDLLEXPORT wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept); -WXDLLEXPORT wxChar * wxStrrchr(const wxChar *s, wxChar c); +WXDLLEXPORT const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept); +WXDLLEXPORT wxChar * wxStrpbrk(wxChar *s, const wxChar *accept) + { return (wxChar *)wxStrpbrk((const wxChar *)s, accept); } +WXDLLEXPORT const wxChar * wxStrrchr(const wxChar *s, wxChar c); +WXDLLEXPORT wxChar * wxStrrchr(wxChar *s, wxChar c) + { return (wxChar *)wxStrrchr((const wxChar *)s, c); } WXDLLEXPORT size_t wxStrspn(const wxChar *s, const wxChar *accept); -WXDLLEXPORT wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle); +WXDLLEXPORT const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle); +WXDLLEXPORT wxChar *wxStrstr(wxChar *haystack, const wxChar *needle) + { return (wxChar *)wxStrstr((const wxChar *)haystack, needle); } WXDLLEXPORT double wxStrtod(const wxChar *nptr, wxChar **endptr); WXDLLEXPORT long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base); WXDLLEXPORT unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base); diff --git a/src/common/wxchar.cpp b/src/common/wxchar.cpp index 25adbfad8d..8faa0c6eab 100644 --- a/src/common/wxchar.cpp +++ b/src/common/wxchar.cpp @@ -213,10 +213,16 @@ WXDLLEXPORT wxChar * wxStrcat(wxChar *dest, const wxChar *src) return ret; } -WXDLLEXPORT wxChar * wxStrchr(const wxChar *s, wxChar c) +WXDLLEXPORT const wxChar * wxStrchr(const wxChar *s, wxChar c) { - while (*s && *s != c) s++; - return (*s) ? (wxChar *)s : (wxChar *)NULL; + // be careful here as the terminating NUL makes part of the string + while ( *s != c ) + { + if ( !*s++ ) + return NULL; + } + + return s; } WXDLLEXPORT int wxStrcmp(const wxChar *s1, const wxChar *s2) @@ -260,20 +266,26 @@ WXDLLEXPORT wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n) return ret; } -WXDLLEXPORT wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept) +WXDLLEXPORT const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept) { - while (*s && !wxStrchr(accept, *s)) s++; - return (*s) ? (wxChar *)s : (wxChar *)NULL; + while (*s && !wxStrchr(accept, *s)) + s++; + + return *s ? s : NULL; } -WXDLLEXPORT wxChar * wxStrrchr(const wxChar *s, wxChar c) +WXDLLEXPORT const wxChar * wxStrrchr(const wxChar *s, wxChar c) { - wxChar *ret = (wxChar *)NULL; - while (*s) { - if (*s == c) ret = (wxChar *)s; - s++; - } - return ret; + const wxChar *ret = NULL; + do + { + if ( *s == c ) + ret = s; + s++; + } + while ( *s ); + + return ret; } WXDLLEXPORT size_t wxStrspn(const wxChar *s, const wxChar *accept) @@ -283,14 +295,15 @@ WXDLLEXPORT size_t wxStrspn(const wxChar *s, const wxChar *accept) return len; } -WXDLLEXPORT wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle) +WXDLLEXPORT const wxChar *wxStrstr(const wxChar *haystack, const wxChar *needle) { wxCHECK_RET( needle, NULL, _T("NULL argument in wxStrstr") ); + // VZ: this is not exactly the most efficient string search algorithm... + const size_t len = wxStrlen(needle); - wxChar *fnd; - while ( (fnd = wxStrchr(haystack, *needle)) ) + while ( const wxChar *fnd = wxStrchr(haystack, *needle) ) { if ( !wxStrncmp(fnd, needle, len) ) return fnd; @@ -298,7 +311,7 @@ WXDLLEXPORT wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle) haystack = fnd + 1; } - return (wxChar *)NULL; + return NULL; } WXDLLEXPORT double wxStrtod(const wxChar *nptr, wxChar **endptr) -- 2.45.2