tlx
Loading...
Searching...
No Matches
parse_si_iec_units.cpp
Go to the documentation of this file.
1/*******************************************************************************
2 * tlx/string/parse_si_iec_units.cpp
3 *
4 * Part of tlx - http://panthema.net/tlx
5 *
6 * Copyright (C) 2016-2017 Timo Bingmann <tb@panthema.net>
7 *
8 * All rights reserved. Published under the Boost Software License, Version 1.0
9 ******************************************************************************/
10
12
13#include <cstdint>
14#include <cstdlib>
15
16namespace tlx {
17
19 const char* str, std::uint64_t* out_size, char default_unit) {
20
21 char* endptr;
22 *out_size = strtoul(str, &endptr, 10);
23 if (endptr == nullptr) return false; // parse failed, no number
24
25 while (*endptr == ' ') ++endptr; // skip over spaces
26
27 // multiply with base ^ power
28 unsigned int base = 1000;
29 unsigned int power = 0;
30
31 if (*endptr == 'k' || *endptr == 'K')
32 power = 1, ++endptr;
33 else if (*endptr == 'm' || *endptr == 'M')
34 power = 2, ++endptr;
35 else if (*endptr == 'g' || *endptr == 'G')
36 power = 3, ++endptr;
37 else if (*endptr == 't' || *endptr == 'T')
38 power = 4, ++endptr;
39 else if (*endptr == 'p' || *endptr == 'P')
40 power = 5, ++endptr;
41
42 // switch to power of two (only if power was set above)
43 if ((*endptr == 'i' || *endptr == 'I') && power != 0)
44 base = 1024, ++endptr;
45
46 // byte indicator
47 if (*endptr == 'b' || *endptr == 'B') {
48 ++endptr;
49 }
50 else if (power == 0)
51 {
52 // no explicit power indicator, and no 'b' or 'B' -> apply default unit
53 switch (default_unit)
54 {
55 default: break;
56 case 'k': power = 1, base = 1000;
57 break;
58 case 'm': power = 2, base = 1000;
59 break;
60 case 'g': power = 3, base = 1000;
61 break;
62 case 't': power = 4, base = 1000;
63 break;
64 case 'p': power = 5, base = 1000;
65 break;
66 case 'K': power = 1, base = 1024;
67 break;
68 case 'M': power = 2, base = 1024;
69 break;
70 case 'G': power = 3, base = 1024;
71 break;
72 case 'T': power = 4, base = 1024;
73 break;
74 case 'P': power = 5, base = 1024;
75 break;
76 }
77 }
78
79 // skip over spaces
80 while (*endptr == ' ') ++endptr;
81
82 // multiply size
83 for (unsigned int p = 0; p < power; ++p)
84 *out_size *= base;
85
86 return (*endptr == 0);
87}
88
90 const std::string& str, std::uint64_t* out_size, char default_unit) {
91 return parse_si_iec_units(str.c_str(), out_size, default_unit);
92}
93
94} // namespace tlx
95
96/******************************************************************************/
bool parse_si_iec_units(const char *str, std::uint64_t *out_size, char default_unit)
Parse a string like "343KB" or "44 GiB" into the corresponding size in bytes.