summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2023-06-11 14:03:16 +0200
committerTyge Løvset <[email protected]>2023-06-11 14:59:06 +0200
commitb564ef6bdfcd2437f1b4997f42054c45ccdedbb1 (patch)
treeb6c5458b8bc47279d18408f25e79eb6118808d78 /include
parentf3529a2600141dc7f84c734ea3bf5db8f7090e56 (diff)
downloadSTC-modified-b564ef6bdfcd2437f1b4997f42054c45ccdedbb1.tar.gz
STC-modified-b564ef6bdfcd2437f1b4997f42054c45ccdedbb1.zip
Added priv/linkage.h and renamed priv/template2.h => priv/template_undef.h.
Make all examples c++ compatible, except those using cspan.h Removed: crange_obj() Renamed: crange_make() => crange_init() Renamed: cspan_make() => cspan_init() Renamed: cstr_NULL => cstr_null Renamed: csview_NULL => csview_null
Diffstat (limited to 'include')
-rw-r--r--include/stc/algo/coroutine.h2
-rw-r--r--include/stc/algo/crange.h18
-rw-r--r--include/stc/algo/filter.h2
-rw-r--r--include/stc/algo/sort.h1
-rw-r--r--include/stc/carc.h5
-rw-r--r--include/stc/cbox.h5
-rw-r--r--include/stc/ccommon.h51
-rw-r--r--include/stc/clist.h3
-rw-r--r--include/stc/cmap.h3
-rw-r--r--include/stc/cpque.h3
-rw-r--r--include/stc/cqueue.h3
-rw-r--r--include/stc/crand.h3
-rw-r--r--include/stc/cregex.h4
-rw-r--r--include/stc/csmap.h3
-rw-r--r--include/stc/cspan.h9
-rw-r--r--include/stc/cstack.h3
-rw-r--r--include/stc/cstr.h20
-rw-r--r--include/stc/csview.h18
-rw-r--r--include/stc/cvec.h3
-rw-r--r--include/stc/priv/linkage.h40
-rw-r--r--include/stc/utf8.h34
21 files changed, 148 insertions, 85 deletions
diff --git a/include/stc/algo/coroutine.h b/include/stc/algo/coroutine.h
index 67ea5a40..5cd6d68f 100644
--- a/include/stc/algo/coroutine.h
+++ b/include/stc/algo/coroutine.h
@@ -56,7 +56,7 @@ int main(void) {
return 0;
}
*/
-#include <stc/ccommon.h>
+#include "../ccommon.h"
enum {
cco_state_final = -1,
diff --git a/include/stc/algo/crange.h b/include/stc/algo/crange.h
index 56c317da..34ed541b 100644
--- a/include/stc/algo/crange.h
+++ b/include/stc/algo/crange.h
@@ -27,14 +27,15 @@
int main()
{
- crange r1 = crange_make(80, 90);
+ crange r1 = crange_init(80, 90);
c_foreach (i, crange, r1)
printf(" %lld", *i.ref);
puts("");
// use a temporary crange object.
int a = 100, b = INT32_MAX;
- c_forfilter (i, crange, crange_obj(a, b, 8),
+ crange r2 = crange_init(a, b, 8);
+ c_forfilter (i, crange, r2,
c_flt_skip(i, 10) &&
c_flt_take(i, 3))
printf(" %lld", *i.ref);
@@ -44,20 +45,17 @@ int main()
#ifndef STC_CRANGE_H_INCLUDED
#define STC_CRANGE_H_INCLUDED
-#include <stc/ccommon.h>
-
-#define crange_obj(...) \
- (*(crange[]){crange_make(__VA_ARGS__)})
+#include "../ccommon.h"
typedef long long crange_value;
typedef struct { crange_value start, end, step, value; } crange;
typedef struct { crange_value *ref, end, step; } crange_iter;
-#define crange_make(...) c_MACRO_OVERLOAD(crange_make, __VA_ARGS__)
-#define crange_make_1(stop) crange_make_3(0, stop, 1)
-#define crange_make_2(start, stop) crange_make_3(start, stop, 1)
+#define crange_init(...) c_MACRO_OVERLOAD(crange_init, __VA_ARGS__)
+#define crange_init_1(stop) crange_init_3(0, stop, 1)
+#define crange_init_2(start, stop) crange_init_3(start, stop, 1)
-STC_INLINE crange crange_make_3(crange_value start, crange_value stop, crange_value step)
+STC_INLINE crange crange_init_3(crange_value start, crange_value stop, crange_value step)
{ crange r = {start, stop - (step > 0), step}; return r; }
STC_INLINE crange_iter crange_begin(crange* self)
diff --git a/include/stc/algo/filter.h b/include/stc/algo/filter.h
index 8dc1ad74..f5de1811 100644
--- a/include/stc/algo/filter.h
+++ b/include/stc/algo/filter.h
@@ -47,7 +47,7 @@ int main()
#ifndef STC_FILTER_H_INCLUDED
#define STC_FILTER_H_INCLUDED
-#include <stc/ccommon.h>
+#include "../ccommon.h"
// c_forfilter:
diff --git a/include/stc/algo/sort.h b/include/stc/algo/sort.h
index bbd58427..2e73b0fb 100644
--- a/include/stc/algo/sort.h
+++ b/include/stc/algo/sort.h
@@ -42,6 +42,7 @@ int main() {
}
*/
#include "../ccommon.h"
+
#ifndef i_type
#define i_at(arr, idx) (&arr[idx])
#ifndef i_tag
diff --git a/include/stc/carc.h b/include/stc/carc.h
index 756b604f..749b1fc1 100644
--- a/include/stc/carc.h
+++ b/include/stc/carc.h
@@ -49,10 +49,11 @@ int main() {
c_drop(ArcPers, &p, &q);
}
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CARC_H_INCLUDED
#define CARC_H_INCLUDED
+#include "ccommon.h"
#include "forward.h"
#include <stdlib.h>
@@ -72,7 +73,7 @@ int main() {
#define c_atomic_dec_and_test(v) (atomic_fetch_sub(v, 1) == 1)
#endif
-#define carc_NULL {NULL, NULL}
+#define carc_null {0}
#endif // CARC_H_INCLUDED
#define _i_prefix carc_
diff --git a/include/stc/cbox.h b/include/stc/cbox.h
index 699b32ac..d7f6246d 100644
--- a/include/stc/cbox.h
+++ b/include/stc/cbox.h
@@ -57,15 +57,16 @@ int main() {
}
}
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CBOX_H_INCLUDED
#define CBOX_H_INCLUDED
+#include "ccommon.h"
#include "forward.h"
#include <stdlib.h>
#include <string.h>
-#define cbox_NULL {NULL}
+#define cbox_null {0}
#endif // CBOX_H_INCLUDED
#define _i_prefix cbox_
diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h
index e491a567..5f280218 100644
--- a/include/stc/ccommon.h
+++ b/include/stc/ccommon.h
@@ -117,10 +117,6 @@
/* Function macros and others */
-#define c_init(C, ...) \
- C##_from_n((C##_raw[])__VA_ARGS__, c_sizeof((C##_raw[])__VA_ARGS__)/c_sizeof(C##_raw))
-#define c_make(C, ...) c_init(C, __VA_ARGS__) // [deprecated]
-
#define c_litstrlen(literal) (c_sizeof("" literal) - 1)
#define c_arraylen(a) (intptr_t)(sizeof(a)/sizeof 0[a])
@@ -210,16 +206,23 @@ STC_INLINE intptr_t cnextpow2(intptr_t n) {
; (_inc > 0) ^ (i > _end); i += _inc)
#ifndef __cplusplus
+ #define c_init(C, ...) \
+ C##_from_n((C##_raw[])__VA_ARGS__, c_sizeof((C##_raw[])__VA_ARGS__)/c_sizeof(C##_raw))
#define c_forlist(it, T, ...) \
- for (struct {T* ref; int size, index;} \
- it = {.ref=(T[])__VA_ARGS__, .size=(int)(sizeof((T[])__VA_ARGS__)/sizeof(T))} \
- ; it.index < it.size; ++it.ref, ++it.index)
+ for (struct {T* ref; int size, index;} \
+ it = {.ref=(T[])__VA_ARGS__, .size=(int)(sizeof((T[])__VA_ARGS__)/sizeof(T))} \
+ ; it.index < it.size; ++it.ref, ++it.index)
#else
- #include <initializer_list>
- #define c_forlist(it, T, ...) \
- for (struct {std::initializer_list<T> _il; std::initializer_list<T>::iterator ref; size_t size, index;} \
- it = {._il=__VA_ARGS__, .ref=it._il.begin(), .size=it._il.size()} \
- ; it.index < it.size; ++it.ref, ++it.index)
+ #include <initializer_list>
+ template <class C, class T>
+ inline C _from_n(C (*func)(const T[], intptr_t), std::initializer_list<T> il)
+ { return func(&*il.begin(), il.size()); }
+
+ #define c_init(C, ...) _from_n<C,C##_raw>(C##_from_n, __VA_ARGS__)
+ #define c_forlist(it, T, ...) \
+ for (struct {std::initializer_list<T> _il; std::initializer_list<T>::iterator ref; size_t size, index;} \
+ it = {._il=__VA_ARGS__, .ref=it._il.begin(), .size=it._il.size()} \
+ ; it.index < it.size; ++it.ref, ++it.index)
#endif
#define c_drop(C, ...) \
@@ -236,23 +239,9 @@ STC_INLINE intptr_t cnextpow2(intptr_t n) {
#define c_umul128(a, b, lo, hi) \
asm("mulq %3" : "=a"(*(lo)), "=d"(*(hi)) : "a"(a), "rm"(b))
#endif
-#endif // CCOMMON_H_INCLUDED
-#undef STC_API
-#undef STC_DEF
-
-#ifdef i_extern
-# define i_import
-#endif
-#if !defined(i_static) && !defined(STC_STATIC) && (defined(i_header) || defined(STC_HEADER) || \
- defined(i_implement) || defined(STC_IMPLEMENT))
- #define STC_API extern
- #define STC_DEF
-#else
- #define i_static
- #define STC_API static inline
- #define STC_DEF static inline
-#endif
-#if defined(STC_IMPLEMENT) || defined(i_import)
- #define i_implement
-#endif
+// [deprecated]:
+#define c_make(...) c_init(__VA_ARGS__)
+#define cspan_make(...) cspan_init(__VA_ARGS__)
+#define crange_make(...) crange_init(__VA_ARGS__)
+#endif // CCOMMON_H_INCLUDED
diff --git a/include/stc/clist.h b/include/stc/clist.h
index 310db204..4d05a3d1 100644
--- a/include/stc/clist.h
+++ b/include/stc/clist.h
@@ -51,9 +51,10 @@
}
}
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CLIST_H_INCLUDED
+#include "ccommon.h"
#include "forward.h"
#include <stdlib.h>
#include <string.h>
diff --git a/include/stc/cmap.h b/include/stc/cmap.h
index f6c3eb07..2e234fb5 100644
--- a/include/stc/cmap.h
+++ b/include/stc/cmap.h
@@ -47,9 +47,10 @@ int main(void) {
cmap_ichar_drop(&m);
}
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CMAP_H_INCLUDED
+#include "ccommon.h"
#include "forward.h"
#include <stdlib.h>
#include <string.h>
diff --git a/include/stc/cpque.h b/include/stc/cpque.h
index 31a53ece..b66c7735 100644
--- a/include/stc/cpque.h
+++ b/include/stc/cpque.h
@@ -20,9 +20,10 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CPQUE_H_INCLUDED
+#include "ccommon.h"
#include <stdlib.h>
#include "forward.h"
#endif
diff --git a/include/stc/cqueue.h b/include/stc/cqueue.h
index 28515877..3adc1bcb 100644
--- a/include/stc/cqueue.h
+++ b/include/stc/cqueue.h
@@ -20,9 +20,10 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CQUEUE_H_INCLUDED
+#include "ccommon.h"
#include "forward.h"
#include <stdlib.h>
#include <string.h>
diff --git a/include/stc/crand.h b/include/stc/crand.h
index 95a65fb0..89b681cd 100644
--- a/include/stc/crand.h
+++ b/include/stc/crand.h
@@ -20,10 +20,11 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CRAND_H_INCLUDED
#define CRAND_H_INCLUDED
+#include "ccommon.h"
/*
// crand: Pseudo-random number generator
#include "stc/crand.h"
diff --git a/include/stc/cregex.h b/include/stc/cregex.h
index 43a7fcbf..1d1d441f 100644
--- a/include/stc/cregex.h
+++ b/include/stc/cregex.h
@@ -22,6 +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.
*/
+#include "priv/linkage.h"
+
#ifndef CREGEX_H_INCLUDED
#define CREGEX_H_INCLUDED
/*
@@ -157,6 +159,7 @@ cstr cregex_replace_pattern_6(const char* pattern, const char* input, const char
/* destroy regex */
void cregex_drop(cregex* re);
+#endif // CREGEX_H_INCLUDED
#if defined i_implement
# include "../../src/cregex.c"
@@ -164,7 +167,6 @@ void cregex_drop(cregex* re);
#if defined i_import
# include "../../src/utf8code.c"
#endif
-#endif // CREGEX_H_INCLUDED
#undef i_opt
#undef i_header
#undef i_static
diff --git a/include/stc/csmap.h b/include/stc/csmap.h
index 7638b8f2..28598f0a 100644
--- a/include/stc/csmap.h
+++ b/include/stc/csmap.h
@@ -49,9 +49,10 @@ int main(void) {
csmap_sx_drop(&m);
}
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CSMAP_H_INCLUDED
+#include "ccommon.h"
#include "forward.h"
#include <stdlib.h>
#include <string.h>
diff --git a/include/stc/cspan.h b/include/stc/cspan.h
index dd6cb1c0..d7a72267 100644
--- a/include/stc/cspan.h
+++ b/include/stc/cspan.h
@@ -60,6 +60,7 @@ int demo2() {
#ifndef STC_CSPAN_H_INCLUDED
#define STC_CSPAN_H_INCLUDED
+#include "priv/linkage.h"
#include "ccommon.h"
#define using_cspan(...) c_MACRO_OVERLOAD(using_cspan, __VA_ARGS__)
@@ -80,7 +81,7 @@ int demo2() {
return (Self){.data=raw, .shape={(int32_t)n}}; \
} \
STC_INLINE Self Self##_slice_(Self##_value* v, const int32_t shape[], const int32_t stri[], \
- const int rank, const int32_t a[][2]) { \
+ const int rank, const int32_t a[][2]) { \
Self s = {.data=v}; int outrank; \
s.data += _cspan_slice(s.shape, s.stride.d, &outrank, shape, stri, rank, a); \
c_ASSERT(outrank == RANK); \
@@ -115,8 +116,8 @@ typedef struct { int32_t d[6]; } cspan_idx6;
#define cspan_md(array, ...) \
{.data=array, .shape={__VA_ARGS__}, .stride={.d={__VA_ARGS__}}}
-/* For static initialization, use cspan_make(). c_init() for non-static only. */
-#define cspan_make(SpanType, ...) \
+/* For static initialization, use cspan_init(). c_init() for non-static only. */
+#define cspan_init(SpanType, ...) \
{.data=(SpanType##_value[])__VA_ARGS__, .shape={sizeof((SpanType##_value[])__VA_ARGS__)/sizeof(SpanType##_value)}}
#define cspan_slice(OutSpan, parent, ...) \
@@ -210,6 +211,7 @@ STC_API intptr_t _cspan_next2(int rank, int32_t pos[], const int32_t shape[], co
STC_API intptr_t _cspan_slice(int32_t odim[], int32_t ostri[], int* orank,
const int32_t shape[], const int32_t stri[],
int rank, const int32_t a[][2]);
+#endif // STC_CSPAN_H_INCLUDED
/* -------------------------- IMPLEMENTATION ------------------------- */
#if defined(i_implement) || defined(i_static)
@@ -260,7 +262,6 @@ STC_DEF intptr_t _cspan_slice(int32_t odim[], int32_t ostri[], int* orank,
return off;
}
#endif
-#endif
#undef i_opt
#undef i_header
#undef i_implement
diff --git a/include/stc/cstack.h b/include/stc/cstack.h
index fa0fab2b..fb4eae4b 100644
--- a/include/stc/cstack.h
+++ b/include/stc/cstack.h
@@ -20,10 +20,11 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CSTACK_H_INCLUDED
#define CSTACK_H_INCLUDED
+#include "ccommon.h"
#include <stdlib.h>
#include "forward.h"
#endif // CSTACK_H_INCLUDED
diff --git a/include/stc/cstr.h b/include/stc/cstr.h
index 0c5b67d8..bdfee39b 100644
--- a/include/stc/cstr.h
+++ b/include/stc/cstr.h
@@ -24,7 +24,7 @@
/* A string type with short string optimization in C99 with good small-string
* optimization (22 characters with 24 bytes string).
*/
-#define _i_no_undef
+#define _i_nested
#include "utf8.h"
#ifndef CSTR_H_INCLUDED
@@ -67,7 +67,7 @@ extern char* _cstr_internal_move(cstr* self, intptr_t pos1, intptr_t pos2);
/**************************** PUBLIC API **********************************/
#define cstr_lit(literal) cstr_from_n(literal, c_litstrlen(literal))
-#define cstr_NULL (c_LITERAL(cstr){{{0}, 0}})
+#define cstr_null (c_LITERAL(cstr){0})
#define cstr_toraw(self) cstr_str(self)
extern char* cstr_reserve(cstr* self, intptr_t cap);
@@ -97,7 +97,7 @@ STC_INLINE csview cstr_sv(const cstr* s) {
}
STC_INLINE cstr cstr_init(void)
- { return cstr_NULL; }
+ { return cstr_null; }
STC_INLINE cstr cstr_from_n(const char* str, const intptr_t len) {
cstr s;
@@ -132,7 +132,7 @@ STC_INLINE cstr* cstr_take(cstr* self, const cstr s) {
STC_INLINE cstr cstr_move(cstr* self) {
cstr tmp = *self;
- *self = cstr_NULL;
+ *self = cstr_null;
return tmp;
}
@@ -440,8 +440,8 @@ cstr cstr_tocase(csview sv, int k) {
#endif // i_import
/* -------------------------- IMPLEMENTATION ------------------------- */
+#if defined i_import || (defined i_implement && !defined _i_nested)
#ifndef CSTR_C_INCLUDED
-#if defined i_import || (defined i_implement && !defined _i_no_undef)
#define CSTR_C_INCLUDED
uint64_t cstr_hash(const cstr *self) {
@@ -573,7 +573,7 @@ bool cstr_getdelim(cstr *self, const int delim, FILE *fp) {
cstr
cstr_replace_sv(csview in, csview search, csview repl, int32_t count) {
- cstr out = cstr_NULL;
+ cstr out = cstr_null;
intptr_t from = 0; char* res;
if (!count) count = INT32_MAX;
if (search.size)
@@ -625,7 +625,7 @@ intptr_t cstr_vfmt(cstr* self, intptr_t start, const char* fmt, va_list args) {
#endif
cstr cstr_from_fmt(const char* fmt, ...) {
- cstr s = cstr_NULL;
+ cstr s = cstr_null;
va_list args;
va_start(args, fmt);
cstr_vfmt(&s, 0, fmt, args);
@@ -649,17 +649,17 @@ intptr_t cstr_printf(cstr* self, const char* fmt, ...) {
va_end(args);
return n;
}
-#endif // i_implement
#endif // CSTR_C_INCLUDED
+#endif // i_implement
#if defined __GNUC__ && !defined __clang__
# pragma GCC diagnostic pop
#endif
-#ifndef _i_no_undef
+#ifndef _i_nested
#undef i_opt
#undef i_header
#undef i_static
#undef i_implement
#undef i_import
#endif
-#undef _i_no_undef
+#undef _i_nested
diff --git a/include/stc/csview.h b/include/stc/csview.h
index a1893063..c16f58bc 100644
--- a/include/stc/csview.h
+++ b/include/stc/csview.h
@@ -20,14 +20,14 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#define _i_no_undef
+#define _i_nested
#include "utf8.h"
#ifndef CSVIEW_H_INCLUDED
#define CSVIEW_H_INCLUDED
-#define csview_NULL c_sv_1("")
-#define csview_init() csview_NULL
+#define csview_null c_sv_1("")
+#define csview_init() csview_null
#define csview_drop(p) c_default_drop(p)
#define csview_clone(sv) c_default_clone(sv)
#define csview_lit(literal) c_sv_1(literal)
@@ -42,7 +42,7 @@ extern csview csview_token(csview sv, const char* sep, intptr_t* start);
STC_INLINE csview csview_from(const char* str)
{ return c_LITERAL(csview){str, c_strlen(str)}; }
-STC_INLINE void csview_clear(csview* self) { *self = csview_NULL; }
+STC_INLINE void csview_clear(csview* self) { *self = csview_null; }
STC_INLINE intptr_t csview_size(csview sv) { return sv.size; }
STC_INLINE bool csview_empty(csview sv) { return sv.size == 0; }
@@ -150,8 +150,8 @@ STC_INLINE csview cstr_u8_substr(const cstr* self , intptr_t bytepos, intptr_t u
#endif
/* -------------------------- IMPLEMENTATION ------------------------- */
+#if defined i_import || (defined i_implement && !defined _i_nested)
#ifndef CSVIEW_C_INCLUDED
-#if defined i_import || (defined i_implement && !defined _i_no_undef)
#define CSVIEW_C_INCLUDED
csview_iter csview_advance(csview_iter it, intptr_t pos) {
@@ -201,13 +201,13 @@ csview csview_token(csview sv, const char* sep, intptr_t* start) {
*start += tok.size + sep_size;
return tok;
}
-#endif
-#endif
-#ifndef _i_no_undef
+#endif // CSVIEW_C_INCLUDED
+#endif // i_implement
+#ifndef _i_nested
#undef i_static
#undef i_header
#undef i_implement
#undef i_import
#undef i_opt
#endif
-#undef _i_no_undef
+#undef _i_nested
diff --git a/include/stc/cvec.h b/include/stc/cvec.h
index 747c654d..874f4f47 100644
--- a/include/stc/cvec.h
+++ b/include/stc/cvec.h
@@ -58,9 +58,10 @@ int main() {
cvec_str_drop(&svec);
}
*/
-#include "ccommon.h"
+#include "priv/linkage.h"
#ifndef CVEC_H_INCLUDED
+#include "ccommon.h"
#include "forward.h"
#include <stdlib.h>
#include <string.h>
diff --git a/include/stc/priv/linkage.h b/include/stc/priv/linkage.h
new file mode 100644
index 00000000..7f63f5f1
--- /dev/null
+++ b/include/stc/priv/linkage.h
@@ -0,0 +1,40 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Tyge Løvset
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * 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.
+ */
+#undef STC_API
+#undef STC_DEF
+
+#ifdef i_extern // [deprecated]
+# define i_import
+#endif
+#if !defined(i_static) && !defined(STC_STATIC) && (defined(i_header) || defined(STC_HEADER) || \
+ defined(i_implement) || defined(STC_IMPLEMENT))
+ #define STC_API extern
+ #define STC_DEF
+#else
+ #define i_static
+ #define STC_API static inline
+ #define STC_DEF static inline
+#endif
+#if defined(STC_IMPLEMENT) || defined(i_import)
+ #define i_implement
+#endif
diff --git a/include/stc/utf8.h b/include/stc/utf8.h
index d6c759eb..190cc7f3 100644
--- a/include/stc/utf8.h
+++ b/include/stc/utf8.h
@@ -1,9 +1,31 @@
-
-#include "ccommon.h"
+/* MIT License
+ *
+ * Copyright (c) 2023 Tyge Løvset
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * 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.
+ */
+#include "priv/linkage.h"
#ifndef UTF8_H_INCLUDED
#define UTF8_H_INCLUDED
+#include "ccommon.h"
#include <ctype.h>
#include "forward.h"
@@ -53,9 +75,9 @@ STC_INLINE bool utf8_isspace(uint32_t c) {
/* decode next utf8 codepoint. https://bjoern.hoehrmann.de/utf-8/decoder/dfa */
typedef struct { uint32_t state, codep; } utf8_decode_t;
+extern const uint8_t utf8_dtab[]; /* utf8code.c */
STC_INLINE uint32_t utf8_decode(utf8_decode_t* d, const uint32_t byte) {
- extern const uint8_t utf8_dtab[]; /* utf8code.c */
const uint32_t type = utf8_dtab[byte];
d->codep = d->state ? (byte & 0x3fu) | (d->codep << 6)
: (0xffU >> type) & byte;
@@ -116,14 +138,14 @@ STC_INLINE intptr_t utf8_pos(const char* s, intptr_t index)
{ return (intptr_t)(utf8_at(s, index) - s); }
#endif // UTF8_H_INCLUDED
-#if defined i_import || (defined i_implement && !defined _i_no_undef)
+#if defined i_import || (defined i_implement && !defined _i_nested)
# include "../../src/utf8code.c"
#endif
-#ifndef _i_no_undef
+#ifndef _i_nested
#undef i_static
#undef i_header
#undef i_implement
#undef i_import
#undef i_opt
#endif
-#undef _i_no_undef
+#undef _i_nested