blob: 35153ab813b7808fc25edfc2540683044493d84b [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
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 */
Yves Gerey2e00abc2018-10-05 15:39:24 +020010
11#include "rtc_base/stringutils.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000012
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "rtc_base/checks.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000014
15namespace rtc {
16
17bool memory_check(const void* memory, int c, size_t count) {
18 const char* char_memory = static_cast<const char*>(memory);
19 char char_c = static_cast<char>(c);
20 for (size_t i = 0; i < count; ++i) {
21 if (char_memory[i] != char_c) {
22 return false;
23 }
24 }
25 return true;
26}
27
28bool string_match(const char* target, const char* pattern) {
29 while (*pattern) {
30 if (*pattern == '*') {
31 if (!*++pattern) {
32 return true;
33 }
34 while (*target) {
Yves Gerey665174f2018-06-19 15:03:05 +020035 if ((toupper(*pattern) == toupper(*target)) &&
36 string_match(target + 1, pattern + 1)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000037 return true;
38 }
39 ++target;
40 }
41 return false;
42 } else {
43 if (toupper(*pattern) != toupper(*target)) {
44 return false;
45 }
46 ++target;
47 ++pattern;
48 }
49 }
50 return !*target;
51}
52
53#if defined(WEBRTC_WIN)
Yves Gerey665174f2018-06-19 15:03:05 +020054int ascii_string_compare(const wchar_t* s1,
55 const char* s2,
56 size_t n,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000057 CharacterTransformation transformation) {
58 wchar_t c1, c2;
59 while (true) {
Yves Gerey665174f2018-06-19 15:03:05 +020060 if (n-- == 0)
61 return 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000062 c1 = transformation(*s1);
63 // Double check that characters are not UTF-8
kwiberg352444f2016-11-28 15:58:53 -080064 RTC_DCHECK_LT(*s2, 128);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000065 // Note: *s2 gets implicitly promoted to wchar_t
66 c2 = transformation(*s2);
Yves Gerey665174f2018-06-19 15:03:05 +020067 if (c1 != c2)
68 return (c1 < c2) ? -1 : 1;
69 if (!c1)
70 return 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000071 ++s1;
72 ++s2;
73 }
74}
75
Yves Gerey665174f2018-06-19 15:03:05 +020076size_t asccpyn(wchar_t* buffer,
77 size_t buflen,
78 const char* source,
79 size_t srclen) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000080 if (buflen <= 0)
81 return 0;
82
83 if (srclen == SIZE_UNKNOWN) {
84 srclen = strlenn(source, buflen - 1);
85 } else if (srclen >= buflen) {
86 srclen = buflen - 1;
87 }
kwiberg5377bc72016-10-04 13:46:56 -070088#if RTC_DCHECK_IS_ON
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089 // Double check that characters are not UTF-8
90 for (size_t pos = 0; pos < srclen; ++pos)
kwiberg352444f2016-11-28 15:58:53 -080091 RTC_DCHECK_LT(source[pos], 128);
tfarinaa41ab932015-10-30 16:08:48 -070092#endif
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000093 std::copy(source, source + srclen, buffer);
94 buffer[srclen] = 0;
95 return srclen;
96}
97
andrew@webrtc.org6ae5a6d2014-09-16 01:03:29 +000098#endif // WEBRTC_WIN
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000099
Yves Gerey665174f2018-06-19 15:03:05 +0200100void replace_substrs(const char* search,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000101 size_t search_len,
Yves Gerey665174f2018-06-19 15:03:05 +0200102 const char* replace,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000103 size_t replace_len,
Yves Gerey665174f2018-06-19 15:03:05 +0200104 std::string* s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105 size_t pos = 0;
106 while ((pos = s->find(search, pos, search_len)) != std::string::npos) {
107 s->replace(pos, search_len, replace, replace_len);
108 pos += replace_len;
109 }
110}
111
Yves Gerey665174f2018-06-19 15:03:05 +0200112bool starts_with(const char* s1, const char* s2) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000113 return strncmp(s1, s2, strlen(s2)) == 0;
114}
115
Yves Gerey665174f2018-06-19 15:03:05 +0200116bool ends_with(const char* s1, const char* s2) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000117 size_t s1_length = strlen(s1);
118 size_t s2_length = strlen(s2);
119
120 if (s2_length > s1_length) {
121 return false;
122 }
123
124 const char* start = s1 + (s1_length - s2_length);
125 return strncmp(start, s2, s2_length) == 0;
126}
127
128static const char kWhitespace[] = " \n\r\t";
129
130std::string string_trim(const std::string& s) {
131 std::string::size_type first = s.find_first_not_of(kWhitespace);
Yves Gerey665174f2018-06-19 15:03:05 +0200132 std::string::size_type last = s.find_last_not_of(kWhitespace);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000133
134 if (first == std::string::npos || last == std::string::npos) {
135 return std::string("");
136 }
137
138 return s.substr(first, last - first + 1);
139}
140
Jonas Olsson74395342018-04-03 12:22:07 +0200141std::string ToHex(const int i) {
142 char buffer[50];
143 snprintf(buffer, sizeof(buffer), "%x", i);
144
145 return std::string(buffer);
146}
147
Jonas Olssond8c50782018-09-07 11:21:28 +0200148std::string LeftPad(char padding, unsigned length, std::string s) {
149 if (s.length() >= length)
150 return s;
151 return std::string(length - s.length(), padding) + s;
152}
153
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154} // namespace rtc