Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
format_utils.cxx
1
35#include "utils/macros.h"
37
41static char nibble_to_hex(unsigned nibble)
42{
43 return nibble <= 9 ? '0' + nibble : 'a' + (nibble - 10);
44}
45
46char* unsigned_integer_to_buffer_hex(unsigned int value, char* buffer)
47{
48 int num_digits = 0;
49 unsigned int tmp = value;
50 do
51 {
52 num_digits++;
53 tmp /= 16;
54 } while (tmp > 0);
55 char* ret = buffer + num_digits--;
56 *ret = 0;
57 tmp = value;
58 do
59 {
60 HASSERT(num_digits >= 0);
61 buffer[num_digits--] = nibble_to_hex(tmp & 0xf);
62 tmp >>= 4;
63 } while (tmp);
64 HASSERT(num_digits == -1);
65 return ret;
66}
67
68char* uint64_integer_to_buffer_hex(uint64_t value, char* buffer)
69{
70 int num_digits = 0;
71 uint64_t tmp = value;
72 do
73 {
74 num_digits++;
75 tmp /= 16;
76 } while (tmp > 0);
77 char* ret = buffer + num_digits--;
78 *ret = 0;
79 tmp = value;
80 do
81 {
82 HASSERT(num_digits >= 0);
83 buffer[num_digits--] = nibble_to_hex(tmp & 0xf);
84 tmp >>= 4;
85 } while (tmp);
86 HASSERT(num_digits == -1);
87 return ret;
88}
89
90char* int64_integer_to_buffer_hex(int64_t value, char* buffer)
91{
92 if (value < 0)
93 {
94 *buffer = '-';
95 ++buffer;
96 value = -value;
97 }
98 return uint64_integer_to_buffer_hex(value, buffer);
99}
100
101char* unsigned_integer_to_buffer(int value, char* buffer)
102{
103 int num_digits = 0;
104 int tmp = value;
105 do
106 {
107 num_digits++;
108 tmp /= 10;
109 } while (tmp > 0);
110 char* ret = buffer + num_digits--;
111 *ret = 0;
112 tmp = value;
113 do
114 {
115 HASSERT(num_digits >= 0);
116 buffer[num_digits--] = '0' + (tmp % 10);
117 tmp /= 10;
118 } while (tmp);
119 HASSERT(num_digits == -1);
120 return ret;
121}
122
123char* uint64_integer_to_buffer(uint64_t value, char* buffer)
124{
125 int num_digits = 0;
126 uint64_t tmp = value;
127 do
128 {
129 num_digits++;
130 tmp /= 10;
131 } while (tmp > 0);
132 char* ret = buffer + num_digits--;
133 *ret = 0;
134 tmp = value;
135 do
136 {
137 HASSERT(num_digits >= 0);
138 buffer[num_digits--] = '0' + (tmp % 10);
139 tmp /= 10;
140 } while (tmp);
141 HASSERT(num_digits == -1);
142 return ret;
143}
144
145char* integer_to_buffer(int value, char* buffer)
146{
147 if (value < 0)
148 {
149 *buffer = '-';
150 ++buffer;
151 value = -value;
152 }
153 return unsigned_integer_to_buffer(value, buffer);
154}
155
156char* int64_integer_to_buffer(int64_t value, char* buffer)
157{
158 if (value < 0)
159 {
160 *buffer = '-';
161 ++buffer;
162 value = -value;
163 }
164 return uint64_integer_to_buffer(value, buffer);
165}
166
167string integer_to_string(int value, unsigned padding)
168{
169 string ret;
170 char tmp[12];
171 integer_to_buffer(value, tmp);
172 ret.append(tmp);
173 if (padding > ret.size())
174 {
175 ret.insert(0, padding - ret.size(), ' ');
176 }
177 return ret;
178}
179
180string uint64_to_string(uint64_t value, unsigned padding)
181{
182 string ret;
183 char tmp[21];
184 uint64_integer_to_buffer(value, tmp);
185 ret.append(tmp);
186 if (padding > ret.size())
187 {
188 ret.insert(0, padding - ret.size(), ' ');
189 }
190 return ret;
191}
192
193string int64_to_string(int64_t value, unsigned padding)
194{
195 string ret;
196 char tmp[22];
197 int64_integer_to_buffer(value, tmp);
198 ret.append(tmp);
199 if (padding > ret.size())
200 {
201 ret.insert(0, padding - ret.size(), ' ');
202 }
203 return ret;
204}
205
206string uint64_to_string_hex(uint64_t value, unsigned padding)
207{
208 string ret;
209 char tmp[17];
210 uint64_integer_to_buffer_hex(value, tmp);
211 ret.append(tmp);
212 if (padding > ret.size())
213 {
214 ret.insert(0, padding - ret.size(), ' ');
215 }
216 return ret;
217}
218
219string int64_to_string_hex(int64_t value, unsigned padding)
220{
221 string ret;
222 char tmp[18];
223 int64_integer_to_buffer_hex(value, tmp);
224 ret.append(tmp);
225 if (padding > ret.size())
226 {
227 ret.insert(0, padding - ret.size(), ' ');
228 }
229 return ret;
230}
231
232string string_to_hex(const string &arg)
233{
234 string ret;
235 ret.reserve(arg.size() * 2);
236 for (char c : arg)
237 {
238 uint8_t cc = static_cast<uint8_t>(c);
239 ret.push_back(nibble_to_hex((cc >> 4) & 0xf));
240 ret.push_back(nibble_to_hex(cc & 0xf));
241 }
242 return ret;
243}
244
245static uint8_t get_nibble(char b)
246{
247 if ('0' <= b && b <= '9')
248 {
249 return b - '0';
250 }
251 if ('a' <= b && b <= 'f')
252 {
253 return b - 'a' + 10;
254 }
255 if ('A' <= b && b <= 'F')
256 {
257 return b - 'A' + 10;
258 }
259 return 0xff;
260}
261
262size_t hex_to_string(
263 const char *input, size_t len, string *output, bool ignore_nonhex)
264{
265 uint8_t b = 0; // current byte
266 bool next_high = true; // next nibble is high of the byte
267 for (size_t ofs = 0; ofs < len; ++ofs)
268 {
269 uint8_t nib = get_nibble(input[ofs]);
270 if (nib == 0xff)
271 {
272 if (!ignore_nonhex)
273 {
274 return ofs;
275 }
276 continue;
277 }
278 b |= nib & 0xf;
279 if (next_high)
280 {
281 b <<= 4;
282 next_high = false;
283 continue;
284 }
285 else
286 {
287 output->push_back(b);
288 b = 0;
289 next_high = true;
290 continue;
291 }
292 }
293 return len;
294}
295
296string mac_to_string(uint8_t mac[6], char colon)
297{
298 string ret;
299 ret.reserve(12+6);
300 char tmp[10];
301 for (int i = 0; i < 6; ++i)
302 {
303 unsigned_integer_to_buffer_hex(mac[i], tmp);
304 if (!tmp[1])
305 {
306 ret.push_back('0');
307 }
308 ret += tmp;
309 if (colon)
310 {
311 ret.push_back(colon);
312 }
313 }
314 if (colon)
315 {
316 ret.pop_back();
317 }
318 return ret;
319}
320
321string ipv4_to_string(uint8_t ip[4])
322{
323 string ret;
324 ret.reserve(12+4);
325 char tmp[10];
326 for (int i = 3; i >= 0; --i)
327 {
328 unsigned_integer_to_buffer(ip[i], tmp);
329 ret += tmp;
330 ret.push_back('.');
331 }
332 ret.pop_back();
333
334 return ret;
335}
#define HASSERT(x)
Checks that the value of expression x is true, else terminates the current process.
Definition macros.h:138