1 /* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/base/checks.h" 12 #include "webrtc/base/stringutils.h" 13 14 namespace rtc { 15 16 bool memory_check(const void* memory, int c, size_t count) { 17 const char* char_memory = static_cast<const char*>(memory); 18 char char_c = static_cast<char>(c); 19 for (size_t i = 0; i < count; ++i) { 20 if (char_memory[i] != char_c) { 21 return false; 22 } 23 } 24 return true; 25 } 26 27 bool string_match(const char* target, const char* pattern) { 28 while (*pattern) { 29 if (*pattern == '*') { 30 if (!*++pattern) { 31 return true; 32 } 33 while (*target) { 34 if ((toupper(*pattern) == toupper(*target)) 35 && string_match(target + 1, pattern + 1)) { 36 return true; 37 } 38 ++target; 39 } 40 return false; 41 } else { 42 if (toupper(*pattern) != toupper(*target)) { 43 return false; 44 } 45 ++target; 46 ++pattern; 47 } 48 } 49 return !*target; 50 } 51 52 #if defined(WEBRTC_WIN) 53 int ascii_string_compare(const wchar_t* s1, const char* s2, size_t n, 54 CharacterTransformation transformation) { 55 wchar_t c1, c2; 56 while (true) { 57 if (n-- == 0) return 0; 58 c1 = transformation(*s1); 59 // Double check that characters are not UTF-8 60 DCHECK_LT(static_cast<unsigned char>(*s2), 128); 61 // Note: *s2 gets implicitly promoted to wchar_t 62 c2 = transformation(*s2); 63 if (c1 != c2) return (c1 < c2) ? -1 : 1; 64 if (!c1) return 0; 65 ++s1; 66 ++s2; 67 } 68 } 69 70 size_t asccpyn(wchar_t* buffer, size_t buflen, 71 const char* source, size_t srclen) { 72 if (buflen <= 0) 73 return 0; 74 75 if (srclen == SIZE_UNKNOWN) { 76 srclen = strlenn(source, buflen - 1); 77 } else if (srclen >= buflen) { 78 srclen = buflen - 1; 79 } 80 #if _DEBUG 81 // Double check that characters are not UTF-8 82 for (size_t pos = 0; pos < srclen; ++pos) 83 DCHECK_LT(static_cast<unsigned char>(source[pos]), 128); 84 #endif // _DEBUG 85 std::copy(source, source + srclen, buffer); 86 buffer[srclen] = 0; 87 return srclen; 88 } 89 90 #endif // WEBRTC_WIN 91 92 void replace_substrs(const char *search, 93 size_t search_len, 94 const char *replace, 95 size_t replace_len, 96 std::string *s) { 97 size_t pos = 0; 98 while ((pos = s->find(search, pos, search_len)) != std::string::npos) { 99 s->replace(pos, search_len, replace, replace_len); 100 pos += replace_len; 101 } 102 } 103 104 bool starts_with(const char *s1, const char *s2) { 105 return strncmp(s1, s2, strlen(s2)) == 0; 106 } 107 108 bool ends_with(const char *s1, const char *s2) { 109 size_t s1_length = strlen(s1); 110 size_t s2_length = strlen(s2); 111 112 if (s2_length > s1_length) { 113 return false; 114 } 115 116 const char* start = s1 + (s1_length - s2_length); 117 return strncmp(start, s2, s2_length) == 0; 118 } 119 120 static const char kWhitespace[] = " \n\r\t"; 121 122 std::string string_trim(const std::string& s) { 123 std::string::size_type first = s.find_first_not_of(kWhitespace); 124 std::string::size_type last = s.find_last_not_of(kWhitespace); 125 126 if (first == std::string::npos || last == std::string::npos) { 127 return std::string(""); 128 } 129 130 return s.substr(first, last - first + 1); 131 } 132 133 } // namespace rtc 134