changed error handling
This commit is contained in:
parent
5cdd4f8835
commit
1d370096d9
1 changed files with 16 additions and 14 deletions
|
@ -4,14 +4,16 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <print>
|
#include <print>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <expected>
|
||||||
|
|
||||||
namespace file_reader
|
namespace file_reader
|
||||||
{
|
{
|
||||||
enum RESULT
|
enum class RESULT
|
||||||
{
|
{
|
||||||
READ_CORRECT, //read was as expected
|
READ_CORRECT, //read was as expected
|
||||||
READ_INCOMPLETE, //read is incomplete (probably because of the file ending)
|
READ_INCOMPLETE, //read is incomplete (probably because of the file ending)
|
||||||
READ_FILE_ENDED //cannot read because there's not more file to read
|
READ_FILE_ENDED, //cannot read because there's not more file to read
|
||||||
|
READ_FAILED
|
||||||
};
|
};
|
||||||
|
|
||||||
class file_reader
|
class file_reader
|
||||||
|
@ -70,11 +72,11 @@ namespace file_reader
|
||||||
}
|
}
|
||||||
int extra_size = 0;
|
int extra_size = 0;
|
||||||
template<typename ...T>
|
template<typename ...T>
|
||||||
std::pair<size_t, RESULT> read_from_tuple(std::tuple<T...> &in)
|
std::expected<size_t, RESULT> read_from_tuple(std::tuple<T...> &in)
|
||||||
{
|
{
|
||||||
RESULT ret = READ_CORRECT;
|
RESULT ret = RESULT::READ_CORRECT;
|
||||||
if (file_size_remaining <= 0 && buf.size <= 0)
|
if (file_size_remaining <= 0 && buf.size <= 0)
|
||||||
return std::make_pair(0, READ_FILE_ENDED);
|
return std::unexpected( RESULT::READ_FILE_ENDED);
|
||||||
constexpr std::size_t size_tuple = sizeof...(T);
|
constexpr std::size_t size_tuple = sizeof...(T);
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
|
||||||
|
@ -97,7 +99,7 @@ namespace file_reader
|
||||||
else if (file_size_remaining + buf.size > file_size_remaining + buf.size)
|
else if (file_size_remaining + buf.size > file_size_remaining + buf.size)
|
||||||
{
|
{
|
||||||
extra_to_read = file_size_remaining + buf.size;
|
extra_to_read = file_size_remaining + buf.size;
|
||||||
ret = READ_INCOMPLETE;
|
ret = RESULT::READ_INCOMPLETE;
|
||||||
}
|
}
|
||||||
char *new_read = (char *)calloc(size + extra_size, sizeof(char));
|
char *new_read = (char *)calloc(size + extra_size, sizeof(char));
|
||||||
total_read_size = extra_to_read + extra_size;
|
total_read_size = extra_to_read + extra_size;
|
||||||
|
@ -116,7 +118,7 @@ namespace file_reader
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
{
|
{
|
||||||
if (read_done != extra_to_read + extra_size)
|
if (read_done != extra_to_read + extra_size)
|
||||||
ret = READ_INCOMPLETE;
|
ret = RESULT::READ_INCOMPLETE;
|
||||||
total_read_size = read_done;
|
total_read_size = read_done;
|
||||||
size = total_read_size;
|
size = total_read_size;
|
||||||
break;
|
break;
|
||||||
|
@ -135,15 +137,15 @@ namespace file_reader
|
||||||
read_comp(size_tuple, par_buf, in);
|
read_comp(size_tuple, par_buf, in);
|
||||||
buf.size = prev_size;
|
buf.size = prev_size;
|
||||||
buf.remove(0, size);
|
buf.remove(0, size);
|
||||||
return std::make_pair(size, ret);
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
std::pair<size_t, RESULT> read_buffer(T *buffer, int size)
|
std::expected<size_t, RESULT> read_buffer(T *buffer, int size)
|
||||||
{
|
{
|
||||||
RESULT ret = READ_CORRECT;
|
RESULT ret = RESULT::READ_CORRECT;
|
||||||
if (file_size_remaining <= 0 && buf.size <= 0)
|
if (file_size_remaining <= 0 && buf.size <= 0)
|
||||||
return std::make_pair(0, READ_FILE_ENDED);
|
return std::unexpected(RESULT::READ_FILE_ENDED);
|
||||||
size_t total_read_size = 0;
|
size_t total_read_size = 0;
|
||||||
if (size > buf.size)
|
if (size > buf.size)
|
||||||
{
|
{
|
||||||
|
@ -156,7 +158,7 @@ namespace file_reader
|
||||||
else if (file_size_remaining + buf.size > file_size_remaining + buf.size)
|
else if (file_size_remaining + buf.size > file_size_remaining + buf.size)
|
||||||
{
|
{
|
||||||
extra_to_read = file_size_remaining + buf.size;
|
extra_to_read = file_size_remaining + buf.size;
|
||||||
ret = READ_INCOMPLETE;
|
ret = RESULT::READ_INCOMPLETE;
|
||||||
}
|
}
|
||||||
char *new_read = (char *)calloc(size + extra_size, sizeof(char));
|
char *new_read = (char *)calloc(size + extra_size, sizeof(char));
|
||||||
total_read_size = extra_to_read + extra_size;
|
total_read_size = extra_to_read + extra_size;
|
||||||
|
@ -175,7 +177,7 @@ namespace file_reader
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
{
|
{
|
||||||
if (read_done != extra_to_read + extra_size)
|
if (read_done != extra_to_read + extra_size)
|
||||||
ret = READ_INCOMPLETE;
|
ret = RESULT::READ_INCOMPLETE;
|
||||||
total_read_size = read_done;
|
total_read_size = read_done;
|
||||||
size = total_read_size;
|
size = total_read_size;
|
||||||
break;
|
break;
|
||||||
|
@ -187,7 +189,7 @@ namespace file_reader
|
||||||
}
|
}
|
||||||
std::memcpy(buffer, buf.data, size);
|
std::memcpy(buffer, buf.data, size);
|
||||||
buf.remove(0, size);
|
buf.remove(0, size);
|
||||||
return std::make_pair(size, ret);
|
return size;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
buffer<char> buf;
|
buffer<char> buf;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue