xref: /aosp_15_r20/tools/netsim/src/util/string_utils.cc (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2022 The Android Open Source Project
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker 
15*cf78ab8cSAndroid Build Coastguard Worker #include "util/string_utils.h"
16*cf78ab8cSAndroid Build Coastguard Worker 
17*cf78ab8cSAndroid Build Coastguard Worker #include <iostream>
18*cf78ab8cSAndroid Build Coastguard Worker #include <sstream>
19*cf78ab8cSAndroid Build Coastguard Worker #include <string>
20*cf78ab8cSAndroid Build Coastguard Worker #include <string_view>
21*cf78ab8cSAndroid Build Coastguard Worker #include <vector>
22*cf78ab8cSAndroid Build Coastguard Worker 
23*cf78ab8cSAndroid Build Coastguard Worker namespace netsim {
24*cf78ab8cSAndroid Build Coastguard Worker namespace stringutils {
25*cf78ab8cSAndroid Build Coastguard Worker namespace {
26*cf78ab8cSAndroid Build Coastguard Worker 
27*cf78ab8cSAndroid Build Coastguard Worker const std::string WHITESPACE = " \n\r\t\f\v";
28*cf78ab8cSAndroid Build Coastguard Worker const char hex_digits[] = "0123456789ABCDEF";
29*cf78ab8cSAndroid Build Coastguard Worker 
30*cf78ab8cSAndroid Build Coastguard Worker }  // namespace
31*cf78ab8cSAndroid Build Coastguard Worker 
LTrim(const std::string_view s)32*cf78ab8cSAndroid Build Coastguard Worker std::string_view LTrim(const std::string_view s) {
33*cf78ab8cSAndroid Build Coastguard Worker   auto start = s.find_first_not_of(WHITESPACE);
34*cf78ab8cSAndroid Build Coastguard Worker   return (start == std::string::npos) ? "" : s.substr(start);
35*cf78ab8cSAndroid Build Coastguard Worker }
36*cf78ab8cSAndroid Build Coastguard Worker 
RTrim(const std::string_view s)37*cf78ab8cSAndroid Build Coastguard Worker std::string_view RTrim(const std::string_view s) {
38*cf78ab8cSAndroid Build Coastguard Worker   size_t end = s.find_last_not_of(WHITESPACE);
39*cf78ab8cSAndroid Build Coastguard Worker   return (end == std::string::npos) ? "" : s.substr(0, end + 1);
40*cf78ab8cSAndroid Build Coastguard Worker }
41*cf78ab8cSAndroid Build Coastguard Worker 
Trim(const std::string_view s)42*cf78ab8cSAndroid Build Coastguard Worker std::string_view Trim(const std::string_view s) { return RTrim(LTrim(s)); }
43*cf78ab8cSAndroid Build Coastguard Worker 
Split(const std::string_view s,const std::string_view & delimiters)44*cf78ab8cSAndroid Build Coastguard Worker std::vector<std::string_view> Split(const std::string_view s,
45*cf78ab8cSAndroid Build Coastguard Worker                                     const std::string_view &delimiters) {
46*cf78ab8cSAndroid Build Coastguard Worker   std::vector<std::string_view> result;
47*cf78ab8cSAndroid Build Coastguard Worker   size_t start, end = 0;
48*cf78ab8cSAndroid Build Coastguard Worker   while ((start = s.find_first_not_of(delimiters, end)) != std::string::npos) {
49*cf78ab8cSAndroid Build Coastguard Worker     end = s.find(delimiters, start);
50*cf78ab8cSAndroid Build Coastguard Worker     result.emplace_back(s.substr(start, end - start));
51*cf78ab8cSAndroid Build Coastguard Worker   }
52*cf78ab8cSAndroid Build Coastguard Worker   return result;
53*cf78ab8cSAndroid Build Coastguard Worker }
54*cf78ab8cSAndroid Build Coastguard Worker 
Split(const std::string s,const std::string & delimiters)55*cf78ab8cSAndroid Build Coastguard Worker std::vector<std::string> Split(const std::string s,
56*cf78ab8cSAndroid Build Coastguard Worker                                const std::string &delimiters) {
57*cf78ab8cSAndroid Build Coastguard Worker   std::vector<std::string> result;
58*cf78ab8cSAndroid Build Coastguard Worker   size_t start, end = 0;
59*cf78ab8cSAndroid Build Coastguard Worker   while ((start = s.find_first_not_of(delimiters, end)) != std::string::npos) {
60*cf78ab8cSAndroid Build Coastguard Worker     end = s.find(delimiters, start);
61*cf78ab8cSAndroid Build Coastguard Worker     result.emplace_back(s.substr(start, end - start));
62*cf78ab8cSAndroid Build Coastguard Worker   }
63*cf78ab8cSAndroid Build Coastguard Worker   return result;
64*cf78ab8cSAndroid Build Coastguard Worker }
65*cf78ab8cSAndroid Build Coastguard Worker 
ToHexString(uint8_t x,uint8_t y)66*cf78ab8cSAndroid Build Coastguard Worker std::string ToHexString(uint8_t x, uint8_t y) {
67*cf78ab8cSAndroid Build Coastguard Worker   return {'0',
68*cf78ab8cSAndroid Build Coastguard Worker           'x',
69*cf78ab8cSAndroid Build Coastguard Worker           hex_digits[x >> 4],
70*cf78ab8cSAndroid Build Coastguard Worker           hex_digits[x & 0x0f],
71*cf78ab8cSAndroid Build Coastguard Worker           hex_digits[y >> 4],
72*cf78ab8cSAndroid Build Coastguard Worker           hex_digits[y & 0x0f]};
73*cf78ab8cSAndroid Build Coastguard Worker }
74*cf78ab8cSAndroid Build Coastguard Worker 
ToHexString(uint8_t x)75*cf78ab8cSAndroid Build Coastguard Worker std::string ToHexString(uint8_t x) {
76*cf78ab8cSAndroid Build Coastguard Worker   return {'0', 'x', hex_digits[x >> 4], hex_digits[x & 0x0f]};
77*cf78ab8cSAndroid Build Coastguard Worker }
78*cf78ab8cSAndroid Build Coastguard Worker 
ToHexString(const uint8_t * buf,size_t len)79*cf78ab8cSAndroid Build Coastguard Worker std::string ToHexString(const uint8_t *buf, size_t len) {
80*cf78ab8cSAndroid Build Coastguard Worker   std::stringstream ss;
81*cf78ab8cSAndroid Build Coastguard Worker   for (int i = 0; i < len; i++) {
82*cf78ab8cSAndroid Build Coastguard Worker     ss << hex_digits[buf[i] >> 4] << hex_digits[buf[i] & 0x0f];
83*cf78ab8cSAndroid Build Coastguard Worker     if (i < len - 1) {
84*cf78ab8cSAndroid Build Coastguard Worker       ss << " ";
85*cf78ab8cSAndroid Build Coastguard Worker     }
86*cf78ab8cSAndroid Build Coastguard Worker   }
87*cf78ab8cSAndroid Build Coastguard Worker   return ss.str();
88*cf78ab8cSAndroid Build Coastguard Worker }
89*cf78ab8cSAndroid Build Coastguard Worker 
ToHexString(const std::vector<uint8_t> & data,int max_length)90*cf78ab8cSAndroid Build Coastguard Worker std::string ToHexString(const std::vector<uint8_t> &data, int max_length) {
91*cf78ab8cSAndroid Build Coastguard Worker   std::string result;
92*cf78ab8cSAndroid Build Coastguard Worker   auto length = max_length > data.size() ? data.size() : max_length;
93*cf78ab8cSAndroid Build Coastguard Worker   result.reserve(3 * length + 1);
94*cf78ab8cSAndroid Build Coastguard Worker   for (auto iter = data.begin(); iter < data.begin() + length; iter++) {
95*cf78ab8cSAndroid Build Coastguard Worker     result.push_back(hex_digits[*iter >> 4]);
96*cf78ab8cSAndroid Build Coastguard Worker     result.push_back(hex_digits[*iter & 0x0f]);
97*cf78ab8cSAndroid Build Coastguard Worker     result.push_back(' ');
98*cf78ab8cSAndroid Build Coastguard Worker   }
99*cf78ab8cSAndroid Build Coastguard Worker   if (result.length() > 0) {
100*cf78ab8cSAndroid Build Coastguard Worker     result.pop_back();
101*cf78ab8cSAndroid Build Coastguard Worker   }
102*cf78ab8cSAndroid Build Coastguard Worker   return result;
103*cf78ab8cSAndroid Build Coastguard Worker }
104*cf78ab8cSAndroid Build Coastguard Worker 
105*cf78ab8cSAndroid Build Coastguard Worker }  // namespace stringutils
106*cf78ab8cSAndroid Build Coastguard Worker }  // namespace netsim
107