diff options
| author | Tyge Løvset <[email protected]> | 2022-12-04 20:52:36 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2022-12-04 20:52:36 +0100 |
| commit | 20400977b40599fd1c6637dd659e72b900794d0f (patch) | |
| tree | d4c60a2af4b21d6a6da4e79829254602e5f7c16c /include/stc | |
| parent | 1e0f229b0b044f6df0d0084674f3cf0dc4f4d31d (diff) | |
| download | STC-modified-20400977b40599fd1c6637dd659e72b900794d0f.tar.gz STC-modified-20400977b40599fd1c6637dd659e72b900794d0f.zip | |
Support for linking dependant UTF8 and cstr functions and/or cregex.c by defining i_extern before including <stc/cstr.h> and <stc/cregex.h>. I.e.
#define i_extern
#define i_implement // define cstr functions as shared symbols (static if not defined).
#include <stc/cregex.h> // include cstr.h, utf8code.c, cregex.c, unless already included.
Diffstat (limited to 'include/stc')
| -rw-r--r-- | include/stc/cregex.h | 13 | ||||
| -rw-r--r-- | include/stc/cstr.h | 37 | ||||
| -rw-r--r-- | include/stc/csview.h | 2 | ||||
| -rw-r--r-- | include/stc/utf8.h | 8 |
4 files changed, 53 insertions, 7 deletions
diff --git a/include/stc/cregex.h b/include/stc/cregex.h index 43dc7ac0..877f4052 100644 --- a/include/stc/cregex.h +++ b/include/stc/cregex.h @@ -22,8 +22,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef CREGEX_H_ -#define CREGEX_H_ +#ifndef CREGEX_H_INCLUDED +#define CREGEX_H_INCLUDED /* * cregex.h * @@ -135,4 +135,13 @@ cstr cregex_replace_pattern(const char* pattern, const char* input, const char* /* destroy regex */ void cregex_drop(cregex* self); +#endif // CREGEX_H_INCLUDED +#if defined i_extern || defined STC_EXTERN +# include "../src/cregex.c" +# include "../src/utf8code.c" #endif +#undef i_opt +#undef i_header +#undef i_static +#undef i_implement +#undef i_extern diff --git a/include/stc/cstr.h b/include/stc/cstr.h index bf58444c..8a351d02 100644 --- a/include/stc/cstr.h +++ b/include/stc/cstr.h @@ -27,6 +27,9 @@ #ifndef CSTR_H_INCLUDED #define CSTR_H_INCLUDED +#if defined i_extern || defined STC_EXTERN +# define _i_extern +#endif #include "ccommon.h" #include "forward.h" #include "utf8.h" @@ -405,8 +408,38 @@ STC_INLINE bool cstr_getline(cstr *self, FILE *fp) STC_API uint64_t cstr_hash(const cstr *self); +#ifdef _i_extern +static struct { + int (*conv_asc)(int); + uint32_t (*conv_utf)(uint32_t); +} +fn_tocase[] = {{tolower, utf8_casefold}, + {tolower, utf8_tolower}, + {toupper, utf8_toupper}}; + +cstr cstr_tocase(csview sv, int k) { + cstr out = cstr_init(); + char *buf = cstr_reserve(&out, sv.size*3/2); + uint32_t cp; size_t sz = 0; + utf8_decode_t d = {.state=0}; + + while (*sv.str) { + do { utf8_decode(&d, (uint8_t)*sv.str++); } while (d.state); + if (d.codep < 128) + buf[sz++] = (char)fn_tocase[k].conv_asc((int)d.codep); + else { + cp = fn_tocase[k].conv_utf(d.codep); + sz += utf8_encode(buf + sz, cp); + } + } + _cstr_set_size(&out, sz); + cstr_shrink_to_fit(&out); + return out; +} +#endif + /* -------------------------- IMPLEMENTATION ------------------------- */ -#if defined(i_implement) || defined(i_extern) +#if defined(i_implement) STC_DEF uint64_t cstr_hash(const cstr *self) { csview sv = cstr_sv(self); @@ -627,4 +660,4 @@ STC_DEF size_t cstr_printf(cstr* self, const char* fmt, ...) { #undef i_header #undef i_static #undef i_implement -#undef i_extern +#undef _i_extern diff --git a/include/stc/csview.h b/include/stc/csview.h index 149759ce..4bd37173 100644 --- a/include/stc/csview.h +++ b/include/stc/csview.h @@ -160,7 +160,7 @@ STC_INLINE bool csview_eq(const csview* x, const csview* y) STC_API uint64_t csview_hash(const csview *self); /* -------------------------- IMPLEMENTATION ------------------------- */ -#if defined(i_implement) || defined(i_extern) +#if defined(i_implement) STC_DEF size_t csview_find_sv(csview sv, csview search) { char* res = cstrnstrn(sv.str, search.str, sv.size, search.size); diff --git a/include/stc/utf8.h b/include/stc/utf8.h index 0ff79fb9..ab39f3ba 100644 --- a/include/stc/utf8.h +++ b/include/stc/utf8.h @@ -1,8 +1,8 @@ #ifndef UTF8_H_INCLUDED #define UTF8_H_INCLUDED +#include "forward.h" #include "ccommon.h" -#include <ctype.h> // utf8 methods defined in src/utf8code.c: @@ -88,4 +88,8 @@ STC_INLINE const char* utf8_at(const char *s, size_t index) { STC_INLINE size_t utf8_pos(const char* s, size_t index) { return (size_t)(utf8_at(s, index) - s); } -#endif +#endif // UTF8_H_INCLUDED +#if defined i_extern || defined STC_EXTERN +# include "../src/utf8code.c" +# undef i_extern +#endif
\ No newline at end of file |
