mirror of
https://github.com/red0124/ssp.git
synced 2025-01-23 04:55:20 +01:00
Merge pull request #33 from red0124/improvement/getline_update
Improvement/getline update
This commit is contained in:
commit
f8fdb97151
@ -1,7 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <cerrno>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace ss {
|
namespace ss {
|
||||||
@ -12,6 +14,7 @@ using string_range = std::pair<const char*, const char*>;
|
|||||||
using split_data = std::vector<string_range>;
|
using split_data = std::vector<string_range>;
|
||||||
|
|
||||||
constexpr inline auto default_delimiter = ",";
|
constexpr inline auto default_delimiter = ",";
|
||||||
|
constexpr inline auto get_line_initial_buffer_size = 128;
|
||||||
|
|
||||||
template <bool StringError>
|
template <bool StringError>
|
||||||
inline void assert_string_error_defined() {
|
inline void assert_string_error_defined() {
|
||||||
@ -30,55 +33,60 @@ inline ssize_t get_line(char** lineptr, size_t* n, FILE* stream) {
|
|||||||
return getline(lineptr, n, stream);
|
return getline(lineptr, n, stream);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
using ssize_t = int64_t;
|
|
||||||
inline ssize_t get_line(char** lineptr, size_t* n, FILE* stream) {
|
|
||||||
size_t pos;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
if (lineptr == nullptr || stream == nullptr || n == nullptr) {
|
using ssize_t = int64_t;
|
||||||
|
|
||||||
|
ssize_t get_line(char** lineptr, size_t* n, FILE* fp) {
|
||||||
|
if (lineptr == nullptr || n == nullptr || fp == nullptr) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = getc(stream);
|
char buff[get_line_initial_buffer_size];
|
||||||
if (c == EOF) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*lineptr == nullptr) {
|
if (*lineptr == nullptr || *n < sizeof(buff)) {
|
||||||
*lineptr = static_cast<char*>(malloc(128));
|
size_t new_n = sizeof(buff);
|
||||||
if (*lineptr == nullptr) {
|
auto new_lineptr = static_cast<char*>(realloc(*lineptr, new_n));
|
||||||
|
if (new_lineptr == nullptr) {
|
||||||
|
errno = ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*n = 128;
|
|
||||||
|
*lineptr = new_lineptr;
|
||||||
|
*n = new_n;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = 0;
|
(*lineptr)[0] = '\0';
|
||||||
while (c != EOF) {
|
|
||||||
if (pos + 1 >= *n) {
|
while (fgets(buff, sizeof(buff), fp) != nullptr) {
|
||||||
size_t new_size = *n + (*n >> 2);
|
size_t line_used = strlen(*lineptr);
|
||||||
if (new_size < 128) {
|
size_t buff_used = strlen(buff);
|
||||||
new_size = 128;
|
|
||||||
}
|
if (*n < buff_used + line_used) {
|
||||||
char* new_ptr = static_cast<char*>(
|
size_t new_n = *n * 2;
|
||||||
realloc(static_cast<void*>(*lineptr), new_size));
|
|
||||||
if (new_ptr == nullptr) {
|
auto new_lineptr = static_cast<char*>(realloc(*lineptr, *n));
|
||||||
|
if (new_lineptr == nullptr) {
|
||||||
|
errno = ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*n = new_size;
|
|
||||||
*lineptr = new_ptr;
|
*lineptr = new_lineptr;
|
||||||
|
*n = new_n;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*lineptr)[pos++] = c;
|
memcpy(*lineptr + line_used, buff, buff_used);
|
||||||
if (c == '\n') {
|
line_used += buff_used;
|
||||||
break;
|
(*lineptr)[line_used] = '\0';
|
||||||
|
|
||||||
|
if ((*lineptr)[line_used - 1] == '\n') {
|
||||||
|
return line_used;
|
||||||
}
|
}
|
||||||
c = getc(stream);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(*lineptr)[pos] = '\0';
|
return -1;
|
||||||
return pos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} /* ss */
|
} /* ss */
|
||||||
|
69
ssp.hpp
69
ssp.hpp
@ -1,5 +1,6 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <cerrno>
|
||||||
#include <charconv>
|
#include <charconv>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
@ -625,6 +626,7 @@ using string_range = std::pair<const char*, const char*>;
|
|||||||
using split_data = std::vector<string_range>;
|
using split_data = std::vector<string_range>;
|
||||||
|
|
||||||
constexpr inline auto default_delimiter = ",";
|
constexpr inline auto default_delimiter = ",";
|
||||||
|
constexpr inline auto get_line_initial_buffer_size = 128;
|
||||||
|
|
||||||
template <bool StringError>
|
template <bool StringError>
|
||||||
inline void assert_string_error_defined() {
|
inline void assert_string_error_defined() {
|
||||||
@ -643,55 +645,60 @@ inline ssize_t get_line(char** lineptr, size_t* n, FILE* stream) {
|
|||||||
return getline(lineptr, n, stream);
|
return getline(lineptr, n, stream);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
using ssize_t = int64_t;
|
|
||||||
inline ssize_t get_line(char** lineptr, size_t* n, FILE* stream) {
|
|
||||||
size_t pos;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
if (lineptr == nullptr || stream == nullptr || n == nullptr) {
|
using ssize_t = int64_t;
|
||||||
|
|
||||||
|
ssize_t get_line(char** lineptr, size_t* n, FILE* fp) {
|
||||||
|
if (lineptr == nullptr || n == nullptr || fp == nullptr) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = getc(stream);
|
char buff[get_line_initial_buffer_size];
|
||||||
if (c == EOF) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*lineptr == nullptr) {
|
if (*lineptr == nullptr || *n < sizeof(buff)) {
|
||||||
*lineptr = static_cast<char*>(malloc(128));
|
size_t new_n = sizeof(buff);
|
||||||
if (*lineptr == nullptr) {
|
auto new_lineptr = static_cast<char*>(realloc(*lineptr, new_n));
|
||||||
|
if (new_lineptr == nullptr) {
|
||||||
|
errno = ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*n = 128;
|
|
||||||
|
*lineptr = new_lineptr;
|
||||||
|
*n = new_n;
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = 0;
|
(*lineptr)[0] = '\0';
|
||||||
while (c != EOF) {
|
|
||||||
if (pos + 1 >= *n) {
|
while (fgets(buff, sizeof(buff), fp) != nullptr) {
|
||||||
size_t new_size = *n + (*n >> 2);
|
size_t line_used = strlen(*lineptr);
|
||||||
if (new_size < 128) {
|
size_t buff_used = strlen(buff);
|
||||||
new_size = 128;
|
|
||||||
}
|
if (*n < buff_used + line_used) {
|
||||||
char* new_ptr = static_cast<char*>(
|
size_t new_n = *n * 2;
|
||||||
realloc(static_cast<void*>(*lineptr), new_size));
|
|
||||||
if (new_ptr == nullptr) {
|
auto new_lineptr = static_cast<char*>(realloc(*lineptr, *n));
|
||||||
|
if (new_lineptr == nullptr) {
|
||||||
|
errno = ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*n = new_size;
|
|
||||||
*lineptr = new_ptr;
|
*lineptr = new_lineptr;
|
||||||
|
*n = new_n;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*lineptr)[pos++] = c;
|
memcpy(*lineptr + line_used, buff, buff_used);
|
||||||
if (c == '\n') {
|
line_used += buff_used;
|
||||||
break;
|
(*lineptr)[line_used] = '\0';
|
||||||
|
|
||||||
|
if ((*lineptr)[line_used - 1] == '\n') {
|
||||||
|
return line_used;
|
||||||
}
|
}
|
||||||
c = getc(stream);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(*lineptr)[pos] = '\0';
|
return -1;
|
||||||
return pos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} /* ss */
|
} /* ss */
|
||||||
|
Loading…
Reference in New Issue
Block a user