From 10bd8ec8e6daf98b86df0e6de176cd1bc98caecb Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sat, 10 Oct 2020 15:53:26 +0200 Subject: Added cstr_getdelim() / getline() functions. --- stc/cstr.h | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/stc/cstr.h b/stc/cstr.h index b227e55f..2bee77f5 100644 --- a/stc/cstr.h +++ b/stc/cstr.h @@ -45,7 +45,7 @@ STC_API cstr_t cstr_n(const char* str, size_t len); STC_API cstr_t cstr_from(const char* fmt, ...); -STC_API void +STC_API size_t cstr_reserve(cstr_t* self, size_t cap); STC_API void cstr_resize(cstr_t* self, size_t len, char fill); @@ -57,6 +57,8 @@ STC_API void cstr_replace_n(cstr_t* self, size_t pos, size_t len, const char* str, size_t n); STC_API void cstr_erase(cstr_t* self, size_t pos, size_t n); +STC_API bool +cstr_getdelim(cstr_t *self, int delim, FILE *stream); STC_API char* c_strnstr(const char* s, const char* needle, size_t n); @@ -163,6 +165,11 @@ cstr_replace(cstr_t* self, size_t pos, size_t len, const char* str) { cstr_replace_n(self, pos, len, str, strlen(str)); } +STC_INLINE bool +cstr_getline(cstr_t *self, FILE *stream) { + return cstr_getdelim(self, '\n', stream); +} + /* readonly */ STC_INLINE bool @@ -208,15 +215,16 @@ STC_INLINE uint32_t cstr_hash_raw(const char* const* spp, size_t ignored) { #if !defined(STC_HEADER) || defined(STC_IMPLEMENTATION) -STC_API void +STC_API size_t cstr_reserve(cstr_t* self, size_t cap) { size_t len = cstr_size(*self), oldcap = cstr_capacity(*self); if (cap > oldcap) { size_t* rep = (size_t *) c_realloc(oldcap ? _cstr_rep(self) : NULL, _cstr_mem(cap)); self->str = (char *) (rep + 2); self->str[rep[0] = len] = '\0'; - rep[1] = _cstr_cap(cap); + return rep[1] = _cstr_cap(cap); } + return oldcap; } STC_API void @@ -320,6 +328,25 @@ cstr_erase(cstr_t* self, size_t pos, size_t n) { } } +STC_API bool +cstr_getdelim(cstr_t *self, int delim, FILE *stream) { + size_t pos = 0, cap = cstr_capacity(*self); + for (;;) { + int c = fgetc(stream); + if (c == EOF) return false; + if (cap - pos < 2) cap = cstr_reserve(self, cap * 3 / 2 + 34); + char *cur = self->str + pos; + do { + *cur++ = (char) c; + if (c == delim || (c = fgetc(stream)) == EOF) { + *cur = '\0'; + _cstr_size(*self) = pos + 1; + return errno == 0; + } + } while (++pos != cap - 1); + } +} + STC_API char* c_strnstr(const char* x, const char* needle, size_t n) { ptrdiff_t sum = 0; -- cgit v1.2.3