diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2022-09-22 11:30:34 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2022-09-22 11:52:39 +0200 |
commit | 7b9c113d52bbcecf45c9407e4ee30ee559418cb2 (patch) | |
tree | d3a63b9c8723e18a5586a8cb41a0eaf2a7fcac44 /libbuild2/variable.cxx | |
parent | 4accc73d03dfa223db2e373475a1cdf9fea6d38b (diff) |
Add support for hex notation for uint64 type
Specifically, now we can do:
x = [uint64] 0x0000ffff
cxx.poptions += "-DOFFSET=$x" # -DOFFSET=65535
cxx.poptions += "-DOFFSET=$string($x, 16)" # -DOFFSET=0xffff
cxx.poptions += "-DOFFSET=$string($x, 16, 8)" # -DOFFSET=0x0000ffff
Note that there is no hex notation support for the int64 (signed) type.
Diffstat (limited to 'libbuild2/variable.cxx')
-rw-r--r-- | libbuild2/variable.cxx | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/libbuild2/variable.cxx b/libbuild2/variable.cxx index 4bd01dc..9cdad0b 100644 --- a/libbuild2/variable.cxx +++ b/libbuild2/variable.cxx @@ -515,13 +515,22 @@ namespace build2 { try { - // May throw invalid_argument or out_of_range. - // - size_t i; - int64_t r (stoll (n.value, &i)); + const string& v (n.value); + + if (!wspace (v[0])) + { + // Note that unlike uint64, we don't support hex notation for int64. + + // May throw invalid_argument or out_of_range. + // + size_t i; + int64_t r (stoll (v, &i)); + + if (i == v.size ()) + return r; - if (i == n.value.size ()) - return r; + // Fall through. + } // Fall through. } @@ -563,13 +572,22 @@ namespace build2 { try { - // May throw invalid_argument or out_of_range. - // - size_t i; - uint64_t r (stoull (n.value, &i)); + const string& v (n.value); + + if (!wspace (v[0])) + { + int b (v[0] == '0' && (v[1] == 'x' || v[1] == 'X') ? 16 : 10); + + // May throw invalid_argument or out_of_range. + // + size_t i; + uint64_t r (stoull (v, &i, b)); + + if (i == v.size ()) + return r; - if (i == n.value.size ()) - return r; + // Fall through. + } // Fall through. } |