Compare commits

...

4 Commits

Author SHA1 Message Date
ado
0ebbee1174 [skip ci] Remove obsolete check from get_line_buffer 2024-02-25 12:10:46 +01:00
ado
b3f3bdf8d1 [skip ci] Update ssp.hpp 2024-02-25 10:54:56 +01:00
ado
f4a06d40e7 Fix non-POSIX get_line 2024-02-25 10:53:21 +01:00
ado
f2ff40a625 Add strict_realloc 2024-02-25 10:42:11 +01:00
3 changed files with 31 additions and 70 deletions

View File

@ -28,6 +28,15 @@ inline void assert_throw_on_error_not_defined() {
"'throw_on_error' is enabled"); "'throw_on_error' is enabled");
} }
inline void* strict_realloc(void* ptr, size_t size) {
ptr = realloc(ptr, size);
if (!ptr) {
throw std::bad_alloc{};
}
return ptr;
}
#if __unix__ #if __unix__
inline ssize_t get_line_file(char** lineptr, size_t* n, FILE* stream) { inline ssize_t get_line_file(char** lineptr, size_t* n, FILE* stream) {
return getline(lineptr, n, stream); return getline(lineptr, n, stream);
@ -46,13 +55,7 @@ ssize_t get_line_file(char** lineptr, size_t* n, FILE* fp) {
if (*lineptr == nullptr || *n < sizeof(buff)) { if (*lineptr == nullptr || *n < sizeof(buff)) {
size_t new_n = sizeof(buff); size_t new_n = sizeof(buff);
auto new_lineptr = static_cast<char*>(realloc(*lineptr, new_n)); *lineptr = static_cast<char*>(strict_realloc(*lineptr, new_n));
if (new_lineptr == nullptr) {
errno = ENOMEM;
return -1;
}
*lineptr = new_lineptr;
*n = new_n; *n = new_n;
} }
@ -66,13 +69,7 @@ ssize_t get_line_file(char** lineptr, size_t* n, FILE* fp) {
if (*n <= buff_used + line_used) { if (*n <= buff_used + line_used) {
size_t new_n = *n * 2; size_t new_n = *n * 2;
auto new_lineptr = static_cast<char*>(realloc(*lineptr, new_n)); *lineptr = static_cast<char*>(strict_realloc(*lineptr, new_n));
if (new_lineptr == nullptr) {
errno = ENOMEM;
return -1;
}
*lineptr = new_lineptr;
*n = new_n; *n = new_n;
} }

View File

@ -752,22 +752,13 @@ private:
ssize_t get_line_buffer(char** lineptr, size_t* n, ssize_t get_line_buffer(char** lineptr, size_t* n,
const char* const csv_data_buffer, const char* const csv_data_buffer,
size_t csv_data_size, size_t& curr_char) { size_t csv_data_size, size_t& curr_char) {
if (lineptr == nullptr || n == nullptr ||
csv_data_buffer == nullptr) {
errno = EINVAL;
return -1;
}
if (curr_char >= csv_data_size) { if (curr_char >= csv_data_size) {
return -1; return -1;
} }
if (*lineptr == nullptr || *n < get_line_initial_buffer_size) { if (*lineptr == nullptr || *n < get_line_initial_buffer_size) {
auto new_lineptr = static_cast<char*>( auto new_lineptr = static_cast<char*>(
realloc(*lineptr, get_line_initial_buffer_size)); strict_realloc(*lineptr, get_line_initial_buffer_size));
if (new_lineptr == nullptr) {
return -1;
}
*lineptr = new_lineptr; *lineptr = new_lineptr;
*n = get_line_initial_buffer_size; *n = get_line_initial_buffer_size;
} }
@ -778,11 +769,7 @@ private:
size_t new_n = *n * 2; size_t new_n = *n * 2;
char* new_lineptr = char* new_lineptr =
static_cast<char*>(realloc(*lineptr, new_n)); static_cast<char*>(strict_realloc(*lineptr, new_n));
if (new_lineptr == nullptr) {
errno = ENOMEM;
return -1;
}
*n = new_n; *n = new_n;
*lineptr = new_lineptr; *lineptr = new_lineptr;
} }
@ -955,10 +942,7 @@ private:
size_t second_size) { size_t second_size) {
buffer_size = first_size + second_size + 3; buffer_size = first_size + second_size + 3;
auto new_first = static_cast<char*>( auto new_first = static_cast<char*>(
realloc(static_cast<void*>(first), buffer_size)); strict_realloc(static_cast<void*>(first), buffer_size));
if (!new_first) {
throw std::bad_alloc{};
}
first = new_first; first = new_first;
std::copy_n(second, second_size + 1, first + first_size); std::copy_n(second, second_size + 1, first + first_size);

54
ssp.hpp
View File

@ -640,6 +640,15 @@ inline void assert_throw_on_error_not_defined() {
"'throw_on_error' is enabled"); "'throw_on_error' is enabled");
} }
inline void* strict_realloc(void* ptr, size_t size) {
ptr = realloc(ptr, size);
if (!ptr) {
throw std::bad_alloc{};
}
return ptr;
}
#if __unix__ #if __unix__
inline ssize_t get_line_file(char** lineptr, size_t* n, FILE* stream) { inline ssize_t get_line_file(char** lineptr, size_t* n, FILE* stream) {
return getline(lineptr, n, stream); return getline(lineptr, n, stream);
@ -658,13 +667,7 @@ ssize_t get_line_file(char** lineptr, size_t* n, FILE* fp) {
if (*lineptr == nullptr || *n < sizeof(buff)) { if (*lineptr == nullptr || *n < sizeof(buff)) {
size_t new_n = sizeof(buff); size_t new_n = sizeof(buff);
auto new_lineptr = static_cast<char*>(realloc(*lineptr, new_n)); *lineptr = static_cast<char*>(strict_realloc(*lineptr, new_n));
if (new_lineptr == nullptr) {
errno = ENOMEM;
return -1;
}
*lineptr = new_lineptr;
*n = new_n; *n = new_n;
} }
@ -678,13 +681,7 @@ ssize_t get_line_file(char** lineptr, size_t* n, FILE* fp) {
if (*n <= buff_used + line_used) { if (*n <= buff_used + line_used) {
size_t new_n = *n * 2; size_t new_n = *n * 2;
auto new_lineptr = static_cast<char*>(realloc(*lineptr, new_n)); *lineptr = static_cast<char*>(strict_realloc(*lineptr, new_n));
if (new_lineptr == nullptr) {
errno = ENOMEM;
return -1;
}
*lineptr = new_lineptr;
*n = new_n; *n = new_n;
} }
@ -2235,7 +2232,7 @@ public:
} }
size_t line() const { size_t line() const {
return reader_.line_number_ > 1 ? reader_.line_number_ - 1 return reader_.line_number_ > 0 ? reader_.line_number_ - 1
: reader_.line_number_; : reader_.line_number_;
} }
@ -2347,7 +2344,7 @@ public:
reader_.next_line_converter_.set_column_mapping(column_mappings, reader_.next_line_converter_.set_column_mapping(column_mappings,
header_.size()); header_.size());
if (line() == 1) { if (line() == 0) {
ignore_next(); ignore_next();
} }
} }
@ -2830,8 +2827,7 @@ private:
csv_data_buffer_{other.csv_data_buffer_}, csv_data_buffer_{other.csv_data_buffer_},
csv_data_size_{other.csv_data_size_}, csv_data_size_{other.csv_data_size_},
curr_char_{other.curr_char_}, crlf_{other.crlf_}, curr_char_{other.curr_char_}, crlf_{other.crlf_},
line_number_{other.line_number_}, line_number_{other.line_number_}, chars_read_{other.chars_read_},
chars_read_{other.chars_read_},
next_line_size_{other.next_line_size_} { next_line_size_{other.next_line_size_} {
other.buffer_ = nullptr; other.buffer_ = nullptr;
other.next_line_buffer_ = nullptr; other.next_line_buffer_ = nullptr;
@ -2886,22 +2882,13 @@ private:
ssize_t get_line_buffer(char** lineptr, size_t* n, ssize_t get_line_buffer(char** lineptr, size_t* n,
const char* const csv_data_buffer, const char* const csv_data_buffer,
size_t csv_data_size, size_t& curr_char) { size_t csv_data_size, size_t& curr_char) {
if (lineptr == nullptr || n == nullptr ||
csv_data_buffer == nullptr) {
errno = EINVAL;
return -1;
}
if (curr_char >= csv_data_size) { if (curr_char >= csv_data_size) {
return -1; return -1;
} }
if (*lineptr == nullptr || *n < get_line_initial_buffer_size) { if (*lineptr == nullptr || *n < get_line_initial_buffer_size) {
auto new_lineptr = static_cast<char*>( auto new_lineptr = static_cast<char*>(
realloc(*lineptr, get_line_initial_buffer_size)); strict_realloc(*lineptr, get_line_initial_buffer_size));
if (new_lineptr == nullptr) {
return -1;
}
*lineptr = new_lineptr; *lineptr = new_lineptr;
*n = get_line_initial_buffer_size; *n = get_line_initial_buffer_size;
} }
@ -2912,11 +2899,7 @@ private:
size_t new_n = *n * 2; size_t new_n = *n * 2;
char* new_lineptr = char* new_lineptr =
static_cast<char*>(realloc(*lineptr, new_n)); static_cast<char*>(strict_realloc(*lineptr, new_n));
if (new_lineptr == nullptr) {
errno = ENOMEM;
return -1;
}
*n = new_n; *n = new_n;
*lineptr = new_lineptr; *lineptr = new_lineptr;
} }
@ -3089,10 +3072,7 @@ private:
size_t second_size) { size_t second_size) {
buffer_size = first_size + second_size + 3; buffer_size = first_size + second_size + 3;
auto new_first = static_cast<char*>( auto new_first = static_cast<char*>(
realloc(static_cast<void*>(first), buffer_size)); strict_realloc(static_cast<void*>(first), buffer_size));
if (!new_first) {
throw std::bad_alloc{};
}
first = new_first; first = new_first;
std::copy_n(second, second_size + 1, first + first_size); std::copy_n(second, second_size + 1, first + first_size);