blob: f8ad1262f83574a0a4262ce08e429422241de690 [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) {
50 int len16 = ::MultiByteToWideChar(CP_UTF8, 0, utf8, static_cast<int>(len),
51 nullptr, 0);
Niels Möllerf25df352019-05-24 09:14:13 +020052 std::wstring ws(len16, 0);
53 ::MultiByteToWideChar(CP_UTF8, 0, utf8, static_cast<int>(len), &*ws.begin(),
54 len16);
55 return ws;
Patrik Höglunda8005cf2017-12-13 16:05:42 +010056}
57
58inline std::wstring ToUtf16(const std::string& str) {
59 return ToUtf16(str.data(), str.length());
60}
61
62inline std::string ToUtf8(const wchar_t* wide, size_t len) {
63 int len8 = ::WideCharToMultiByte(CP_UTF8, 0, wide, static_cast<int>(len),
64 nullptr, 0, nullptr, nullptr);
Niels Möllerf25df352019-05-24 09:14:13 +020065 std::string ns(len8, 0);
66 ::WideCharToMultiByte(CP_UTF8, 0, wide, static_cast<int>(len), &*ns.begin(),
67 len8, nullptr, nullptr);
68 return ns;
Patrik Höglunda8005cf2017-12-13 16:05:42 +010069}
70
71inline std::string ToUtf8(const wchar_t* wide) {
72 return ToUtf8(wide, wcslen(wide));
73}
74
75inline std::string ToUtf8(const std::wstring& wstr) {
76 return ToUtf8(wstr.data(), wstr.length());
77}
78
79#endif // WEBRTC_WIN
80
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020081// Remove leading and trailing whitespaces.
82std::string string_trim(const std::string& s);
83
Jonas Olssonabbe8412018-04-03 13:40:05 +020084// TODO(jonasolsson): replace with absl::Hex when that becomes available.
Jonas Olsson74395342018-04-03 12:22:07 +020085std::string ToHex(const int i);
Jonas Olssond8c50782018-09-07 11:21:28 +020086
87std::string LeftPad(char padding, unsigned length, std::string s);
88
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020089} // namespace rtc
90
Steve Anton10542f22019-01-11 09:11:00 -080091#endif // RTC_BASE_STRING_UTILS_H_