2
2
3
3
#include < zstd.h>
4
4
5
- #include " error.hpp"
5
+ #include < cstdarg>
6
+ #include < cstdio>
7
+ #include < iomanip>
8
+ #include < iostream>
6
9
7
10
using namespace rlib ;
8
11
9
- auto rlib::progress (char const * banner, std::uint32_t index, std::uint64_t done, std::uint64_t total) noexcept
10
- -> std::string {
11
- constexpr auto MB = 1024.0 * 1024.0 ;
12
+ void rlib::throw_error (char const * from, char const * msg) {
13
+ // break point goes here
14
+ throw std::runtime_error (std::string (from) + msg);
15
+ }
16
+
17
+ error_stack_t & rlib::error_stack () noexcept {
18
+ thread_local error_stack_t instance = {};
19
+ return instance;
20
+ }
21
+
22
+ void rlib::push_error_msg (char const * fmt, ...) noexcept {
23
+ va_list args;
24
+ char buffer[4096 ];
25
+ int result;
26
+ va_start (args, fmt);
27
+ result = vsnprintf (buffer, 4096 , fmt, args);
28
+ va_end (args);
29
+ if (result >= 0 ) {
30
+ error_stack ().push_back ({buffer, buffer + result});
31
+ }
32
+ }
33
+
34
+ rlib::progress_bar::progress_bar (char const * banner,
35
+ bool disabled,
36
+ std::uint32_t index,
37
+ std::uint64_t done,
38
+ std::uint64_t total) noexcept
39
+ : banner_(banner), disabled_(disabled), index_(index), done_(done), total_(total), percent_(done_ * 100 / total_) {
40
+ this ->render ();
41
+ }
42
+
43
+ rlib::progress_bar::~progress_bar () noexcept {
44
+ this ->render ();
45
+ std::cerr << std::endl;
46
+ }
47
+
48
+ auto rlib::progress_bar::render () const noexcept -> void {
12
49
char buffer[128 ];
13
- sprintf (buffer, " %s #%u: %4.3f / %4.3f" , banner, index , done / MB, total / MB);
14
- return buffer;
50
+ sprintf (buffer, " \r %s #%u: %.02fMB %u%%" , banner_, index_, total_ / MB, (std::uint32_t )percent_);
51
+ std::cerr << buffer;
52
+ }
53
+
54
+ auto rlib::progress_bar::update (std::uint64_t done) noexcept -> void {
55
+ done_ = done;
56
+ auto percent = std::exchange (percent_, done_ * 100 / total_);
57
+ if (!disabled_ && percent != percent_) {
58
+ this ->render ();
59
+ }
15
60
}
16
61
17
62
auto rlib::to_hex (std::uint64_t id, std::size_t s) noexcept -> std::string {
@@ -36,25 +81,19 @@ auto rlib::clean_path(std::string path) noexcept -> std::string {
36
81
37
82
auto rlib::zstd_decompress (std::span<char const > src, std::size_t count) -> std::span<char const > {
38
83
thread_local static std::vector<char > buffer = {};
84
+ std::size_t size_decompressed = rlib_assert_zstd (ZSTD_findDecompressedSize (src.data (), src.size ()));
85
+ rlib_assert (size_decompressed == count);
39
86
if (buffer.size () < count) {
87
+ buffer.clear ();
40
88
buffer.resize (count);
41
89
}
42
- auto result = ZSTD_decompress (buffer.data (), count, src.data (), src.size ());
43
- if (ZSTD_isError (result)) {
44
- rlib_error (ZSTD_getErrorName (result));
45
- }
46
- rlib_assert (result == count);
90
+ std::size_t result = rlib_assert_zstd (ZSTD_decompress (buffer.data (), count, src.data (), src.size ()));
91
+ rlib_assert (result == size_decompressed);
47
92
return {buffer.data (), count};
48
93
}
49
94
50
- auto rlib::try_zstd_decompress (std::span<char const > src, std::size_t count) -> std::span<char const > {
51
- thread_local static std::vector<char > buffer = {};
52
- if (buffer.size () < count) {
53
- buffer.resize (count);
54
- }
55
- auto result = ZSTD_decompress (buffer.data (), count, src.data (), src.size ());
56
- if (ZSTD_isError (result)) {
57
- return {};
58
- }
59
- return {buffer.data (), result};
95
+ auto rlib::zstd_frame_decompress_size (std::span<char const > src) -> std::size_t {
96
+ ZSTD_frameHeader header = {};
97
+ rlib_assert_zstd (ZSTD_getFrameHeader (&header, src.data (), src.size ()));
98
+ return header.frameContentSize ;
60
99
}
0 commit comments