147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 114dc8e4e9752f6512961a49a2b6af3b7143adfac2andrew@webrtc.org#include "webrtc/base/checks.h" 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/stringutils.h" 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool memory_check(const void* memory, int c, size_t count) { 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char* char_memory = static_cast<const char*>(memory); 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org char char_c = static_cast<char>(c); 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (size_t i = 0; i < count; ++i) { 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (char_memory[i] != char_c) { 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return true; 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool string_match(const char* target, const char* pattern) { 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org while (*pattern) { 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (*pattern == '*') { 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!*++pattern) { 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return true; 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org while (*target) { 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if ((toupper(*pattern) == toupper(*target)) 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org && string_match(target + 1, pattern + 1)) { 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return true; 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ++target; 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (toupper(*pattern) != toupper(*target)) { 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ++target; 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ++pattern; 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return !*target; 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint ascii_string_compare(const wchar_t* s1, const char* s2, size_t n, 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CharacterTransformation transformation) { 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org wchar_t c1, c2; 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org while (true) { 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (n-- == 0) return 0; 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org c1 = transformation(*s1); 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Double check that characters are not UTF-8 604dc8e4e9752f6512961a49a2b6af3b7143adfac2andrew@webrtc.org DCHECK_LT(static_cast<unsigned char>(*s2), 128); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Note: *s2 gets implicitly promoted to wchar_t 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org c2 = transformation(*s2); 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (c1 != c2) return (c1 < c2) ? -1 : 1; 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!c1) return 0; 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ++s1; 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ++s2; 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgsize_t asccpyn(wchar_t* buffer, size_t buflen, 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char* source, size_t srclen) { 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (buflen <= 0) 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return 0; 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (srclen == SIZE_UNKNOWN) { 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org srclen = strlenn(source, buflen - 1); 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else if (srclen >= buflen) { 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org srclen = buflen - 1; 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if _DEBUG 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Double check that characters are not UTF-8 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (size_t pos = 0; pos < srclen; ++pos) 834dc8e4e9752f6512961a49a2b6af3b7143adfac2andrew@webrtc.org DCHECK_LT(static_cast<unsigned char>(source[pos]), 128); 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // _DEBUG 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::copy(source, source + srclen, buffer); 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org buffer[srclen] = 0; 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return srclen; 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 904dc8e4e9752f6512961a49a2b6af3b7143adfac2andrew@webrtc.org#endif // WEBRTC_WIN 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid replace_substrs(const char *search, 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t search_len, 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char *replace, 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t replace_len, 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string *s) { 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t pos = 0; 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org while ((pos = s->find(search, pos, search_len)) != std::string::npos) { 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org s->replace(pos, search_len, replace, replace_len); 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org pos += replace_len; 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool starts_with(const char *s1, const char *s2) { 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return strncmp(s1, s2, strlen(s2)) == 0; 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool ends_with(const char *s1, const char *s2) { 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t s1_length = strlen(s1); 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t s2_length = strlen(s2); 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (s2_length > s1_length) { 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return false; 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char* start = s1 + (s1_length - s2_length); 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return strncmp(start, s2, s2_length) == 0; 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const char kWhitespace[] = " \n\r\t"; 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::string string_trim(const std::string& s) { 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string::size_type first = s.find_first_not_of(kWhitespace); 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string::size_type last = s.find_last_not_of(kWhitespace); 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (first == std::string::npos || last == std::string::npos) { 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return std::string(""); 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return s.substr(first, last - first + 1); 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 134