| // Copyright 2022 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "errors.h" |
| |
| #include <algorithm> |
| #include <cstdint> |
| #include <limits> |
| #include <string> |
| #include <vector> |
| |
| namespace ipp { |
| |
| namespace { |
| |
| std::string UnsignedToString(size_t x) { |
| std::string s; |
| do { |
| s.push_back('0' + (x % 10)); |
| x /= 10; |
| } while (x > 0); |
| std::reverse(s.begin(), s.end()); |
| return s; |
| } |
| |
| // Converts the least significant 4 bits to hexadecimal digit (ASCII char). |
| char ToHexDigit(uint8_t v) { |
| v &= 0x0f; |
| if (v < 10) |
| return ('0' + v); |
| return ('a' + (v - 10)); |
| } |
| |
| // Converts byte to 2-digit hexadecimal representation. |
| std::string ToHexByte(uint8_t v) { |
| std::string s(2, '0'); |
| s[0] = ToHexDigit(v >> 4); |
| s[1] = ToHexDigit(v); |
| return s; |
| } |
| |
| std::string ToJsonString(const std::string& str, std::string special_chars) { |
| std::string out; |
| for (char c : str) { |
| if (c < 0x20 || c > 0x7e || c == '\\' || c == '"' || |
| special_chars.find(c) != std::string::npos) { |
| out.push_back('\\'); |
| switch (c) { |
| case '\\': |
| case '"': |
| out.push_back(c); |
| break; |
| case '\n': |
| out.push_back('n'); |
| break; |
| case '\t': |
| out.push_back('t'); |
| break; |
| default: |
| out += "u00"; |
| out += ToHexByte(c); |
| break; |
| } |
| } else { |
| out.push_back(c); |
| } |
| } |
| return out; |
| } |
| |
| } // namespace |
| |
| std::string AttrPath::AsString() const { |
| std::string out = (group_ == kHeader) ? "header" : ToString(group_); |
| for (const Segment& segment : path_) { |
| out += "["; |
| out += UnsignedToString(segment.collection_index); |
| out += "]>"; |
| out += ToJsonString(segment.attribute_name, "[]>"); |
| } |
| return out; |
| } |
| |
| } // namespace ipp |