diff options
author | Andrew Bartlett <abartlet@samba.org> | 2011-04-08 13:04:26 +1000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2011-04-13 14:47:07 +1000 |
commit | 17ccff973a4136c6bffa2fce68eeb1be53add447 (patch) | |
tree | 17bedd41f68431afc7a12397766b19fe5033a5f1 | |
parent | b2e37d9ce12627883ff18ab22ed9d3b6233f6baf (diff) | |
download | samba-17ccff973a4136c6bffa2fce68eeb1be53add447.tar.gz samba-17ccff973a4136c6bffa2fce68eeb1be53add447.tar.bz2 samba-17ccff973a4136c6bffa2fce68eeb1be53add447.zip |
lib/util: Make string_replace from s3 common
The s4 implementation didn't do multibyte strings, so was only good
for '/' which is known to be safe in all multibyte charsets.
Andrew Bartlett
Signed-off-by: Andrew Tridgell <tridge@samba.org>
-rw-r--r-- | lib/util/util_str.c | 10 | ||||
-rw-r--r-- | lib/util/util_str_common.c | 43 | ||||
-rw-r--r-- | source3/lib/util_str.c | 43 |
3 files changed, 43 insertions, 53 deletions
diff --git a/lib/util/util_str.c b/lib/util/util_str.c index 7fa531f0e4..cf1b07ff0f 100644 --- a/lib/util/util_str.c +++ b/lib/util/util_str.c @@ -249,13 +249,3 @@ _PUBLIC_ bool strequal(const char *s1, const char *s2) return strcasecmp(s1,s2) == 0; } -/** - String replace. -**/ -_PUBLIC_ void string_replace(char *s, char oldc, char newc) -{ - while (*s) { - if (*s == oldc) *s = newc; - s++; - } -} diff --git a/lib/util/util_str_common.c b/lib/util/util_str_common.c index 9999ee440e..e6671be8ad 100644 --- a/lib/util/util_str_common.c +++ b/lib/util/util_str_common.c @@ -59,3 +59,46 @@ _PUBLIC_ size_t ucs2_align(const void *base_ptr, const void *p, int flags) return 0; return PTR_DIFF(p, base_ptr) & 1; } + +/** + String replace. + NOTE: oldc and newc must be 7 bit characters +**/ +void string_replace( char *s, char oldc, char newc ) +{ + char *p; + + /* this is quite a common operation, so we want it to be + fast. We optimise for the ascii case, knowing that all our + supported multi-byte character sets are ascii-compatible + (ie. they match for the first 128 chars) */ + + for (p = s; *p; p++) { + if (*p & 0x80) /* mb string - slow path. */ + break; + if (*p == oldc) { + *p = newc; + } + } + + if (!*p) + return; + + /* Slow (mb) path. */ +#ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS + /* With compose characters we must restart from the beginning. JRA. */ + p = s; +#endif + + while (*p) { + size_t c_size; + next_codepoint(p, &c_size); + + if (c_size == 1) { + if (*p == oldc) { + *p = newc; + } + } + p += c_size; + } +} diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index a710fcc35b..13aa78cc91 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -234,49 +234,6 @@ bool strisnormal(const char *s, int case_default) /** - String replace. - NOTE: oldc and newc must be 7 bit characters -**/ -void string_replace( char *s, char oldc, char newc ) -{ - char *p; - - /* this is quite a common operation, so we want it to be - fast. We optimise for the ascii case, knowing that all our - supported multi-byte character sets are ascii-compatible - (ie. they match for the first 128 chars) */ - - for (p = s; *p; p++) { - if (*p & 0x80) /* mb string - slow path. */ - break; - if (*p == oldc) { - *p = newc; - } - } - - if (!*p) - return; - - /* Slow (mb) path. */ -#ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS - /* With compose characters we must restart from the beginning. JRA. */ - p = s; -#endif - - while (*p) { - size_t c_size; - next_codepoint(p, &c_size); - - if (c_size == 1) { - if (*p == oldc) { - *p = newc; - } - } - p += c_size; - } -} - -/** * Skip past some strings in a buffer - old version - no checks. * **/ |