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