blob: 6baddd11bdd36d196db9fe31cc294a8fea4ca53e [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 */
Jonas Olsson74395342018-04-03 12:22:07 +020010#include <algorithm>
11#include <cstdio>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000012
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "rtc_base/checks.h"
Yves Gerey665174f2018-06-19 15:03:05 +020014#include "rtc_base/stringutils.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015
16namespace rtc {
17
18bool memory_check(const void* memory, int c, size_t count) {
19 const char* char_memory = static_cast<const char*>(memory);
20 char char_c = static_cast<char>(c);
21 for (size_t i = 0; i < count; ++i) {
22 if (char_memory[i] != char_c) {
23 return false;
24 }
25 }
26 return true;
27}
28
29bool string_match(const char* target, const char* pattern) {
30 while (*pattern) {
31 if (*pattern == '*') {
32 if (!*++pattern) {
33 return true;
34 }
35 while (*target) {
Yves Gerey665174f2018-06-19 15:03:05 +020036 if ((toupper(*pattern) == toupper(*target)) &&
37 string_match(target + 1, pattern + 1)) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000038 return true;
39 }
40 ++target;
41 }
42 return false;
43 } else {
44 if (toupper(*pattern) != toupper(*target)) {
45 return false;
46 }
47 ++target;
48 ++pattern;
49 }
50 }
51 return !*target;
52}
53
54#if defined(WEBRTC_WIN)
Yves Gerey665174f2018-06-19 15:03:05 +020055int ascii_string_compare(const wchar_t* s1,
56 const char* s2,
57 size_t n,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000058 CharacterTransformation transformation) {
59 wchar_t c1, c2;
60 while (true) {
Yves Gerey665174f2018-06-19 15:03:05 +020061 if (n-- == 0)
62 return 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000063 c1 = transformation(*s1);
64 // Double check that characters are not UTF-8
kwiberg352444f2016-11-28 15:58:53 -080065 RTC_DCHECK_LT(*s2, 128);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000066 // Note: *s2 gets implicitly promoted to wchar_t
67 c2 = transformation(*s2);
Yves Gerey665174f2018-06-19 15:03:05 +020068 if (c1 != c2)
69 return (c1 < c2) ? -1 : 1;
70 if (!c1)
71 return 0;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000072 ++s1;
73 ++s2;
74 }
75}
76
Yves Gerey665174f2018-06-19 15:03:05 +020077size_t asccpyn(wchar_t* buffer,
78 size_t buflen,
79 const char* source,
80 size_t srclen) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000081 if (buflen <= 0)
82 return 0;
83
84 if (srclen == SIZE_UNKNOWN) {
85 srclen = strlenn(source, buflen - 1);
86 } else if (srclen >= buflen) {
87 srclen = buflen - 1;
88 }
kwiberg5377bc72016-10-04 13:46:56 -070089#if RTC_DCHECK_IS_ON
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000090 // Double check that characters are not UTF-8
91 for (size_t pos = 0; pos < srclen; ++pos)
kwiberg352444f2016-11-28 15:58:53 -080092 RTC_DCHECK_LT(source[pos], 128);
tfarinaa41ab932015-10-30 16:08:48 -070093#endif
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094 std::copy(source, source + srclen, buffer);
95 buffer[srclen] = 0;
96 return srclen;
97}
98
andrew@webrtc.org6ae5a6d2014-09-16 01:03:29 +000099#endif // WEBRTC_WIN
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000100
Yves Gerey665174f2018-06-19 15:03:05 +0200101void replace_substrs(const char* search,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000102 size_t search_len,
Yves Gerey665174f2018-06-19 15:03:05 +0200103 const char* replace,
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000104 size_t replace_len,
Yves Gerey665174f2018-06-19 15:03:05 +0200105 std::string* s) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000106 size_t pos = 0;
107 while ((pos = s->find(search, pos, search_len)) != std::string::npos) {
108 s->replace(pos, search_len, replace, replace_len);
109 pos += replace_len;
110 }
111}
112
Yves Gerey665174f2018-06-19 15:03:05 +0200113bool starts_with(const char* s1, const char* s2) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114 return strncmp(s1, s2, strlen(s2)) == 0;
115}
116
Yves Gerey665174f2018-06-19 15:03:05 +0200117bool ends_with(const char* s1, const char* s2) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000118 size_t s1_length = strlen(s1);
119 size_t s2_length = strlen(s2);
120
121 if (s2_length > s1_length) {
122 return false;
123 }
124
125 const char* start = s1 + (s1_length - s2_length);
126 return strncmp(start, s2, s2_length) == 0;
127}
128
129static const char kWhitespace[] = " \n\r\t";
130
131std::string string_trim(const std::string& s) {
132 std::string::size_type first = s.find_first_not_of(kWhitespace);
Yves Gerey665174f2018-06-19 15:03:05 +0200133 std::string::size_type last = s.find_last_not_of(kWhitespace);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000134
135 if (first == std::string::npos || last == std::string::npos) {
136 return std::string("");
137 }
138
139 return s.substr(first, last - first + 1);
140}
141
Jonas Olsson74395342018-04-03 12:22:07 +0200142std::string ToHex(const int i) {
143 char buffer[50];
144 snprintf(buffer, sizeof(buffer), "%x", i);
145
146 return std::string(buffer);
147}
148
Jonas Olssond8c50782018-09-07 11:21:28 +0200149std::string LeftPad(char padding, unsigned length, std::string s) {
150 if (s.length() >= length)
151 return s;
152 return std::string(length - s.length(), padding) + s;
153}
154
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000155} // namespace rtc