blob: 3518702ec0d7334a6e02b77b3eb5b3192147ddbe [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 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef RTC_BASE_STRING_UTILS_H_
12#define RTC_BASE_STRING_UTILS_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020014#include <ctype.h>
15#include <stdarg.h>
16#include <stdio.h>
17#include <string.h>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000018
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020019#if defined(WEBRTC_WIN)
20#include <malloc.h>
21#include <wchar.h>
Patrik Höglunda8005cf2017-12-13 16:05:42 +010022#include <windows.h>
Yves Gerey988cc082018-10-23 12:03:01 +020023
Henrik Kjellanderc0362762017-06-29 08:03:04 +020024#endif // WEBRTC_WIN
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000025
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020026#if defined(WEBRTC_POSIX)
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020027#include <stdlib.h>
Yves Gerey988cc082018-10-23 12:03:01 +020028#include <strings.h>
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020029#endif // WEBRTC_POSIX
30
31#include <string>
32
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020033namespace rtc {
34
35const size_t SIZE_UNKNOWN = static_cast<size_t>(-1);
36
Niels Möllerd1892522018-10-17 13:39:01 +020037// Safe version of strncpy that always nul-terminate.
38size_t strcpyn(char* buffer,
Yves Gerey665174f2018-06-19 15:03:05 +020039 size_t buflen,
Niels Möllerd1892522018-10-17 13:39:01 +020040 const char* source,
41 size_t srclen = SIZE_UNKNOWN);
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020042
Patrik Höglunda8005cf2017-12-13 16:05:42 +010043///////////////////////////////////////////////////////////////////////////////
44// UTF helpers (Windows only)
45///////////////////////////////////////////////////////////////////////////////
46
47#if defined(WEBRTC_WIN)
48
49inline std::wstring ToUtf16(const char* utf8, size_t len) {
Noah Richards4ed5b082019-07-30 11:56:08 -070050 if (len == 0)
51 return std::wstring();
Patrik Höglunda8005cf2017-12-13 16:05:42 +010052 int len16 = ::MultiByteToWideChar(CP_UTF8, 0, utf8, static_cast<int>(len),
53 nullptr, 0);
Niels Möllerf25df352019-05-24 09:14:13 +020054 std::wstring ws(len16, 0);
55 ::MultiByteToWideChar(CP_UTF8, 0, utf8, static_cast<int>(len), &*ws.begin(),
56 len16);
57 return ws;
Patrik Höglunda8005cf2017-12-13 16:05:42 +010058}
59
60inline std::wstring ToUtf16(const std::string& str) {
61 return ToUtf16(str.data(), str.length());
62}
63
64inline std::string ToUtf8(const wchar_t* wide, size_t len) {
Noah Richards4ed5b082019-07-30 11:56:08 -070065 if (len == 0)
66 return std::string();
Patrik Höglunda8005cf2017-12-13 16:05:42 +010067 int len8 = ::WideCharToMultiByte(CP_UTF8, 0, wide, static_cast<int>(len),
68 nullptr, 0, nullptr, nullptr);
Niels Möllerf25df352019-05-24 09:14:13 +020069 std::string ns(len8, 0);
70 ::WideCharToMultiByte(CP_UTF8, 0, wide, static_cast<int>(len), &*ns.begin(),
71 len8, nullptr, nullptr);
72 return ns;
Patrik Höglunda8005cf2017-12-13 16:05:42 +010073}
74
75inline std::string ToUtf8(const wchar_t* wide) {
76 return ToUtf8(wide, wcslen(wide));
77}
78
79inline std::string ToUtf8(const std::wstring& wstr) {
80 return ToUtf8(wstr.data(), wstr.length());
81}
82
83#endif // WEBRTC_WIN
84
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020085// Remove leading and trailing whitespaces.
86std::string string_trim(const std::string& s);
87
Jonas Olssonabbe8412018-04-03 13:40:05 +020088// TODO(jonasolsson): replace with absl::Hex when that becomes available.
Jonas Olsson74395342018-04-03 12:22:07 +020089std::string ToHex(const int i);
Jonas Olssond8c50782018-09-07 11:21:28 +020090
91std::string LeftPad(char padding, unsigned length, std::string s);
92
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020093} // namespace rtc
94
Steve Anton10542f22019-01-11 09:11:00 -080095#endif // RTC_BASE_STRING_UTILS_H_