1 #pragma once
2 
3 #include <ctype.h>
4 #include <stdio.h>
5 #include <string.h>
6 
7 #include <cstdint>
8 #include <fstream>
9 #include <iomanip>
10 #include <iostream>
11 #include <memory>
12 #include <string>
13 #include <vector>
14 
15 namespace openpower
16 {
17 namespace pels
18 {
19 const uint8_t indentLevel = 4;
20 const uint8_t colAlign = 32;
21 /**
22  * @brief escape json - use it for PEL hex dumps.
23  * @param[in] std::string - the unescaped JSON as a string literal
24  * @return std::string - escaped JSON string literal
25  */
26 std::string escapeJSON(const std::string& input);
27 
28 /**
29  * @brief get hex dump for PEL section in json format.
30  * @param[in] const void* data - Raw PEL data
31  * @param[i] size_t size - size of Raw PEL
32  * @param[in] size_t indentCount - The number of indent levels to indent
33  * @param[in] bool toJson - if true, output lines as JSON array, else print
34  *            output as plain text
35  * @return std::unique_ptr<char[]> - the Hex dump
36  */
37 std::unique_ptr<char[]> dumpHex(const void* data, size_t size,
38                                 size_t indentCount, bool toJson = true);
39 
40 /**
41  * @brief Inserts key-value into a JSON string
42  *
43  * @param[in] jsonStr - The JSON string
44  * @param[in] fieldName - The JSON key to insert
45  * @param[in] fieldValue - The JSON value to insert
46  * @param[in] indentCount - Indent count for the line
47  */
48 void jsonInsert(std::string& jsonStr, const std::string& fieldName,
49                 const std::string& fieldValue, uint8_t indentCount);
50 
51 /**
52  * @brief Inserts key-value array into a JSON string
53  *
54  * @param[in] jsonStr - The JSON string
55  * @param[in] fieldName - The JSON key to insert
56  * @param[in] values - The JSON array to insert
57  * @param[in] indentCount - Indent count for the line
58  */
59 void jsonInsertArray(std::string& jsonStr, const std::string& fieldName,
60                      const std::vector<std::string>& values,
61                      uint8_t indentCount);
62 
63 /**
64  * @brief Converts an integer to a formatted string
65  * @param[in] format - the format of output string
66  * @param[in] number - the integer to convert
67  * @return std::string - the formatted string
68  */
69 template <typename T>
getNumberString(const char * format,T number)70 std::string getNumberString(const char* format, T number)
71 {
72     constexpr size_t valueSize = 100;
73     char value[valueSize];
74     std::string numString;
75 
76     static_assert(std::is_integral<T>::value, "Integral required.");
77 
78     int len = snprintf(value, valueSize, format, number);
79     if (len >= 0)
80     {
81         numString = value;
82     }
83     else
84     {
85         throw std::invalid_argument(
86             std::string("getNumberString: invalid format string: ") + format);
87     }
88 
89     return numString;
90 }
91 
92 /**
93  * @brief helper function to trim trailing whitespaces
94  * @return std::string - trimmed string
95  * @param[in] std::string - string to trim
96  */
97 std::string trimEnd(std::string s);
98 
99 /**
100  * @brief Returns the component name for the component ID.
101  *
102  * It will try to look up the name to use in JSON files based on
103  * the creator ID.  If PHYP, will convert the component ID to
104  * two characters.
105  *
106  * If nothing else, it will just return the name as a string like
107  * "0x1234".
108  *
109  * @return std::string - The component name
110  */
111 std::string getComponentName(uint16_t compID, uint8_t creatorID);
112 
113 } // namespace pels
114 } // namespace openpower
115