Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1251BOOST_CHECK(success);1252BOOST_CHECK_EQUAL(SpanToStr(sp), "xy,z()");1254success = Func("xy", sp);1255BOOST_CHECK(!success);1257// Expr(...): return expression that span begins with, update span to skip it1258std::span<const char> result;1260input = "(n*(n-1))/2";1261sp = input;1262result = Expr(sp);1263BOOST_CHECK_EQUAL(SpanToStr(result), "(n*(n-1))/2");1264BOOST_CHECK_EQUAL(SpanToStr(sp), "");1266input = "foo,bar";1267sp = input;1268result = Expr(sp);1269BOOST_CHECK_EQUAL(SpanToStr(result), "foo");1270BOOST_CHECK_EQUAL(SpanToStr(sp), ",bar");1272input = "(aaaaa,bbbbb()),c";1273sp = input;1274result = Expr(sp);1275BOOST_CHECK_EQUAL(SpanToStr(result), "(aaaaa,bbbbb())");1276BOOST_CHECK_EQUAL(SpanToStr(sp), ",c");1278input = "xyz)foo";1279sp = input;1280result = Expr(sp);1281BOOST_CHECK_EQUAL(SpanToStr(result), "xyz");1282BOOST_CHECK_EQUAL(SpanToStr(sp), ")foo");1284input = "((a),(b),(c)),xxx";1285sp = input;1286result = Expr(sp);1287BOOST_CHECK_EQUAL(SpanToStr(result), "((a),(b),(c))");1288BOOST_CHECK_EQUAL(SpanToStr(sp), ",xxx");1290// Split(...): split a string on every instance of sep, return vector1291std::vector<std::span<const char>> results;1293input = "xxx";1294results = Split(input, 'x');1295BOOST_CHECK_EQUAL(results.size(), 4U);1296BOOST_CHECK_EQUAL(SpanToStr(results[0]), "");1297BOOST_CHECK_EQUAL(SpanToStr(results[1]), "");1298BOOST_CHECK_EQUAL(SpanToStr(results[2]), "");1299BOOST_CHECK_EQUAL(SpanToStr(results[3]), "");1301input = "one#two#three";1302results = Split(input, '-');1303BOOST_CHECK_EQUAL(results.size(), 1U);1304BOOST_CHECK_EQUAL(SpanToStr(results[0]), "one#two#three");1306input = "one#two#three";1307results = Split(input, '#');1308BOOST_CHECK_EQUAL(results.size(), 3U);1309BOOST_CHECK_EQUAL(SpanToStr(results[0]), "one");1310BOOST_CHECK_EQUAL(SpanToStr(results[1]), "two");1311BOOST_CHECK_EQUAL(SpanToStr(results[2]), "three");1313results = Split(input, '#', /*include_sep=*/true);1314BOOST_CHECK_EQUAL(results.size(), 3U);1315BOOST_CHECK_EQUAL(SpanToStr(results[0]), "one#");1316BOOST_CHECK_EQUAL(SpanToStr(results[1]), "two#");1317BOOST_CHECK_EQUAL(SpanToStr(results[2]), "three");1319input = "*foo*bar*";1320results = Split(input, '*');1321BOOST_CHECK_EQUAL(results.size(), 4U);1322BOOST_CHECK_EQUAL(SpanToStr(results[0]), "");1323BOOST_CHECK_EQUAL(SpanToStr(results[1]), "foo");1324BOOST_CHECK_EQUAL(SpanToStr(results[2]), "bar");1325BOOST_CHECK_EQUAL(SpanToStr(results[3]), "");1327results = Split(input, '*', /*include_sep=*/true);1328BOOST_CHECK_EQUAL(results.size(), 4U);1329BOOST_CHECK_EQUAL(SpanToStr(results[0]), "*");1330BOOST_CHECK_EQUAL(SpanToStr(results[1]), "foo*");1331BOOST_CHECK_EQUAL(SpanToStr(results[2]), "bar*");1332BOOST_CHECK_EQUAL(SpanToStr(results[3]), "");1333}1335BOOST_AUTO_TEST_CASE(test_SplitString)1336{1337// Empty string.1338{1339std::vector<std::string> result = SplitString("", '-');1340BOOST_CHECK_EQUAL(result.size(), 1);1341BOOST_CHECK_EQUAL(result[0], "");1342}1344// Empty items.1345{1346std::vector<std::string> result = SplitString("-", '-');1347BOOST_CHECK_EQUAL(result.size(), 2);1348BOOST_CHECK_EQUAL(result[0], "");1349BOOST_CHECK_EQUAL(result[1], "");1350}1352// More empty items.1353{1354std::vector<std::string> result = SplitString("--", '-');1355BOOST_CHECK_EQUAL(result.size(), 3);1356BOOST_CHECK_EQUAL(result[0], "");1357BOOST_CHECK_EQUAL(result[1], "");1358BOOST_CHECK_EQUAL(result[2], "");1359}1361// Separator is not present.1362{1363std::vector<std::string> result = SplitString("abc", '-');1364BOOST_CHECK_EQUAL(result.size(), 1);1365BOOST_CHECK_EQUAL(result[0], "abc");1366}1368// Basic behavior.1369{1370std::vector<std::string> result = SplitString("a-b", '-');1371BOOST_CHECK_EQUAL(result.size(), 2);1372BOOST_CHECK_EQUAL(result[0], "a");1373BOOST_CHECK_EQUAL(result[1], "b");1374}1376// Case-sensitivity of the separator.1377{1378std::vector<std::string> result = SplitString("AAA", 'a');1379BOOST_CHECK_EQUAL(result.size(), 1);1380BOOST_CHECK_EQUAL(result[0], "AAA");1381}1383// multiple split characters1384{1385using V = std::vector<std::string>;1386BOOST_TEST(SplitString("a,b.c:d;e", ",;") == V({"a", "b.c:d", "e"}));1387BOOST_TEST(SplitString("a,b.c:d;e", ",;:.") == V({"a", "b", "c", "d", "e"}));1388BOOST_TEST(SplitString("a,b.c:d;e", "") == V({"a,b.c:d;e"}));1389BOOST_TEST(SplitString("aaa", "bcdefg") == V({"aaa"}));1390BOOST_TEST(SplitString("x\0a,b"s, "\0"s) == V({"x", "a,b"}));1391BOOST_TEST(SplitString("x\0a,b"s, '\0') == V({"x", "a,b"}));1392BOOST_TEST(SplitString("x\0a,b"s, "\0,"s) == V({"x", "a", "b"}));1393BOOST_TEST(SplitString("abcdefg", "bcd") == V({"a", "", "", "efg"}));1394}1395}1397BOOST_AUTO_TEST_CASE(test_LogEscapeMessage)1398{1399// ASCII and UTF-8 must pass through unaltered.1400BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("Valid log message貓"), "Valid log message貓");1401// Newlines must pass through unaltered.1402BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("Message\n with newlines\n"), "Message\n with newlines\n");1403// Other control characters are escaped in C syntax.1404BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage("\x01\x7f Corrupted log message\x0d"), R"(\x01\x7f Corrupted log message\x0d)");1405// Embedded NULL characters are escaped too.1406const std::string NUL("O\x00O", 3);1407BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage(NUL), R"(O\x00O)");1408}1410namespace {1412struct Tracker1413{1414//! Points to the original object (possibly itself) we moved/copied from1415const Tracker* origin;1416//! How many copies where involved between the original object and this one (moves are not counted)1417int copies{0};1419Tracker() noexcept : origin(this) {}1420Tracker(const Tracker& t) noexcept : origin(t.origin), copies(t.copies + 1) {}1421Tracker(Tracker&& t) noexcept : origin(t.origin), copies(t.copies) {}1422Tracker& operator=(const Tracker& t) noexcept1423{1424if (this != &t) {1425origin = t.origin;1426copies = t.copies + 1;1427}1428return *this;1429}1430};1432}1434BOOST_AUTO_TEST_CASE(test_tracked_vector)1435{1436Tracker t1;1437Tracker t2;1438Tracker t3;1440BOOST_CHECK(t1.origin == &t1);1441BOOST_CHECK(t2.origin == &t2);1442BOOST_CHECK(t3.origin == &t3);1444auto v1 = Vector(t1);1445BOOST_CHECK_EQUAL(v1.size(), 1U);1446BOOST_CHECK(v1[0].origin == &t1);1447BOOST_CHECK_EQUAL(v1[0].copies, 1);1449auto v2 = Vector(std::move(t2));1450BOOST_CHECK_EQUAL(v2.size(), 1U);1451BOOST_CHECK(v2[0].origin == &t2); // NOLINT(*-use-after-move)1452BOOST_CHECK_EQUAL(v2[0].copies, 0);1454auto v3 = Vector(t1, std::move(t2));1455BOOST_CHECK_EQUAL(v3.size(), 2U);1456BOOST_CHECK(v3[0].origin == &t1);1457BOOST_CHECK(v3[1].origin == &t2); // NOLINT(*-use-after-move)1458BOOST_CHECK_EQUAL(v3[0].copies, 1);1459BOOST_CHECK_EQUAL(v3[1].copies, 0);1461auto v4 = Vector(std::move(v3[0]), v3[1], std::move(t3));1462BOOST_CHECK_EQUAL(v4.size(), 3U);1463BOOST_CHECK(v4[0].origin == &t1);1464BOOST_CHECK(v4[1].origin == &t2);1465BOOST_CHECK(v4[2].origin == &t3); // NOLINT(*-use-after-move)1466BOOST_CHECK_EQUAL(v4[0].copies, 1);1467BOOST_CHECK_EQUAL(v4[1].copies, 1);1468BOOST_CHECK_EQUAL(v4[2].copies, 0);1470auto v5 = Cat(v1, v4);1471BOOST_CHECK_EQUAL(v5.size(), 4U);1472BOOST_CHECK(v5[0].origin == &t1);1473BOOST_CHECK(v5[1].origin == &t1);1474BOOST_CHECK(v5[2].origin == &t2);1475BOOST_CHECK(v5[3].origin == &t3);1476BOOST_CHECK_EQUAL(v5[0].copies, 2);1477BOOST_CHECK_EQUAL(v5[1].copies, 2);1478BOOST_CHECK_EQUAL(v5[2].copies, 2);1479BOOST_CHECK_EQUAL(v5[3].copies, 1);1481auto v6 = Cat(std::move(v1), v3);1482BOOST_CHECK_EQUAL(v6.size(), 3U);1483BOOST_CHECK(v6[0].origin == &t1);1484BOOST_CHECK(v6[1].origin == &t1);1485BOOST_CHECK(v6[2].origin == &t2);1486BOOST_CHECK_EQUAL(v6[0].copies, 1);1487BOOST_CHECK_EQUAL(v6[1].copies, 2);1488BOOST_CHECK_EQUAL(v6[2].copies, 1);1490auto v7 = Cat(v2, std::move(v4));1491BOOST_CHECK_EQUAL(v7.size(), 4U);1492BOOST_CHECK(v7[0].origin == &t2);1493BOOST_CHECK(v7[1].origin == &t1);1494BOOST_CHECK(v7[2].origin == &t2);1495BOOST_CHECK(v7[3].origin == &t3);1496BOOST_CHECK_EQUAL(v7[0].copies, 1);1497BOOST_CHECK_EQUAL(v7[1].copies, 1);1498BOOST_CHECK_EQUAL(v7[2].copies, 1);1499BOOST_CHECK_EQUAL(v7[3].copies, 0);
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.