aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/variable.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2022-09-22 11:30:34 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2022-09-22 11:52:39 +0200
commit7b9c113d52bbcecf45c9407e4ee30ee559418cb2 (patch)
treed3a63b9c8723e18a5586a8cb41a0eaf2a7fcac44 /libbuild2/variable.cxx
parent4accc73d03dfa223db2e373475a1cdf9fea6d38b (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.cxx42
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.
}