diff --git a/examples/foo.txt b/examples/foo.txt new file mode 100644 index 0000000..9f26b63 --- /dev/null +++ b/examples/foo.txt @@ -0,0 +1 @@ +Foo \ No newline at end of file diff --git a/examples/foo/art.txt b/examples/foo/art.txt new file mode 100644 index 0000000..42fac9f --- /dev/null +++ b/examples/foo/art.txt @@ -0,0 +1,10 @@ + __ _ + .-.' `; `-._ __ _ + (_, .-:' `; `-._ + ,'o"( (_, ) + (__,-' ,'o"( )> + ( (__,-' ) + `-'._.--._( ) + ||| |||`-'._.--._.-' + ||| ||| + diff --git a/examples/main0.art.c b/examples/main0.art.c new file mode 100644 index 0000000..a440264 --- /dev/null +++ b/examples/main0.art.c @@ -0,0 +1,11 @@ +// :D + +#include + +int main () { + const char str_data[] = +#embed_str "foo/art.txt" + ; + puts(str_data); + return 0; +} diff --git a/examples/main0.c b/examples/main0.c new file mode 100644 index 0000000..56c3783 --- /dev/null +++ b/examples/main0.c @@ -0,0 +1,18 @@ +// :D + +#include + +int main () { + const unsigned char data[] = +#embed __FILE__ + ; + const char str_data[] = +#embed_str __FILE__ + ; + puts(str_data); + return !(str_data[0] == '/' + && str_data[1] == '/' + && str_data[2] == ' ' + && data[3] == ':' + && data[4] == 'D'); +} diff --git a/examples/main1.art.cpp b/examples/main1.art.cpp new file mode 100644 index 0000000..fd565e4 --- /dev/null +++ b/examples/main1.art.cpp @@ -0,0 +1,7 @@ +#include + + +int main () { + constexpr std::span data = std::embed("foo/art.txt"); + return data[0]; +} diff --git a/examples/main1.c b/examples/main1.c new file mode 100644 index 0000000..5cde5c6 --- /dev/null +++ b/examples/main1.c @@ -0,0 +1,19 @@ +// :D + +#include + +int main () { + const unsigned char data[] = +#embed 5 __FILE__ + ; + const char str_data[] = +#embed_str 3 __FILE__ + ; + puts(str_data); + return !(str_data[0] == '/' + && str_data[1] == '/' + && str_data[2] == ' ' + && str_data[3] == '\0' + && data[3] == ':' + && data[4] == 'D'); +} diff --git a/examples/main1.rnd.c b/examples/main1.rnd.c new file mode 100644 index 0000000..09afa55 --- /dev/null +++ b/examples/main1.rnd.c @@ -0,0 +1,13 @@ +// :D + +#include + +int main () { + const unsigned char data[] = +#embed 5 "/dev/urandom" + ; + const char str_data[] = +#embed_str 3 "/dev/urandom" + ; + return str_data[0] + data[0]; +} diff --git a/examples/main2.art.cpp b/examples/main2.art.cpp new file mode 100644 index 0000000..f7fb209 --- /dev/null +++ b/examples/main2.art.cpp @@ -0,0 +1,6 @@ +#include + +int main () { + constexpr std::span data = std::embed("art.txt"); + return data[0]; +} diff --git a/examples/main2.cpp b/examples/main2.cpp new file mode 100644 index 0000000..2c0dc5b --- /dev/null +++ b/examples/main2.cpp @@ -0,0 +1,20 @@ +// >:3 + +#include +#include +#include + +int main () { + const char* data = nullptr; + const char* trunc_data = nullptr; + const size_t data_size = __builtin_embed("foo.txt.txt", 7, &data); + const size_t trunc_data_size = __builtin_embed_n("foo.txt.wdhawdkaw", 7, &trunc_data, 1); + int arr[trunc_data_size]{}; + assert(data_size == 3); + assert(data[0] == 'F'); + assert(data[1] == 'o'); + assert(data[2] == 'o'); + assert(trunc_data_size == 1); + assert(trunc_data[0] == 'F'); + return arr[0]; +} diff --git a/examples/main3.cpp b/examples/main3.cpp new file mode 100644 index 0000000..b5b6ead --- /dev/null +++ b/examples/main3.cpp @@ -0,0 +1,11 @@ +// Nice. + +#include +#include + +int main () { + const char* data = nullptr; + std::size_t data_size = __builtin_embed_n("/dev/urandom", 12, &data, 1); + assert(data_size == 1); + return data[0]; +} diff --git a/examples/main4.cpp b/examples/main4.cpp new file mode 100644 index 0000000..58913e7 --- /dev/null +++ b/examples/main4.cpp @@ -0,0 +1,6 @@ +#include + +int main () { + constexpr std::span data = std::embed("foo.txt"); + return data[0]; +} diff --git a/examples/main5.cpp b/examples/main5.cpp new file mode 100644 index 0000000..06c49a1 --- /dev/null +++ b/examples/main5.cpp @@ -0,0 +1,25 @@ +#include + +#include + +constexpr std::uint64_t val_64_const = 0xcbf29ce484222325; +constexpr std::uint64_t prime_64_const = 0x100000001b3; + +inline constexpr std::uint64_t +hash_64_fnv1a_const(const char* const ptr, std::size_t ptr_size, const std::uint64_t value = val_64_const) noexcept { + return (ptr_size == 1) + ? value : + hash_64_fnv1a_const(&ptr[1], ptr_size - 1, (value ^ static_cast(ptr[0])) * prime_64_const); +} + +#include + +int main () { + constexpr std::span art_data = std::embed("art.txt"); + constexpr std::uint64_t expected = 12781078433878002033; + constexpr std::uint64_t actual = hash_64_fnv1a_const(art_data.data(), art_data.size()); + + static_assert(expected == actual, "🚨 SUSPICIOUS ART SUSPICIOUS ART 🚨"); + + return 0; +} diff --git a/examples/main6.cpp b/examples/main6.cpp new file mode 100644 index 0000000..8d77a56 --- /dev/null +++ b/examples/main6.cpp @@ -0,0 +1,26 @@ +#include + +#include + +inline constexpr std::uint64_t +compute_stuff(const char* const ptr, std::size_t ptr_size, std::uint64_t seed = 0, std::size_t limit = 5) noexcept { + const char* first = ptr; + const char* last = ptr + ptr_size; + for (const char* first = ptr; first != last; ++first) { + const char val = *first; + if (limit > 1 && val > 126) { + std::span more = std::embed("foo.txt"); + seed = compute_stuff(more.data(), more.size(), seed, limit - 1); + } + seed ^= *first; + } + return seed; +} + +int main () { + constexpr std::span art_data = std::embed("foo/art.txt"); + constexpr std::uint64_t actual = compute_stuff(art_data.data(), art_data.size()); + static_assert(actual == 103); + + return static_cast(actual); +}