src/cx/string.h

changeset 1671
cf19b7820ff0
parent 1668
3ffdfe1776b4
--- a/src/cx/string.h	Thu Dec 25 11:48:25 2025 +0100
+++ b/src/cx/string.h	Thu Dec 25 12:07:37 2025 +0100
@@ -1189,24 +1189,35 @@
  * has been reached
  */
 cx_attr_nonnull  cx_attr_nodiscard  cx_attr_access_w(2)
-CX_EXPORT bool cx_strtok_next(CxStrtokCtx *ctx, cxstring *token);
+CX_EXPORT bool cx_strtok_next_(CxStrtokCtx *ctx, cxstring *token);
 
+#ifdef __cplusplus
+} // extern "C"
+CX_CPPDECL cx_strtok_next(CxStrtokCtx *ctx, cxstring *token) {
+    return cx_strtok_next_(ctx, token);
+}
+CX_CPPDECL cx_strtok_next(CxStrtokCtx *ctx, cxmutstr *token) {
+    // Note: this is actually UB - fixed with start_lifetime_as() in C++23
+    //       but it works on all supported platforms
+    return cx_strtok_next_(ctx, reinterpret_cast<cxstring*>(token));
+}
+extern "C" {
+#else // ! __cplusplus
 /**
- * Returns the next token of a mutable string.
+ * Returns the next token.
  *
  * The token will point to the source string.
  *
- * @attention
- * If the context was not initialized over a mutable string, modifying
- * the data of the returned token is undefined behavior.
- *
- * @param ctx the tokenization context
- * @param token a pointer to memory where the next token shall be stored
+ * @param ctx (@c CxStrtokCtx*) the tokenization context
+ * @param token a pointer to either a @c cxstring or @c cxmutstr
+ * where the next token shall be stored
  * @return true if successful, false if the limit or the end of the string
  * has been reached
  */
-cx_attr_nonnull  cx_attr_nodiscard  cx_attr_access_w(2)
-CX_EXPORT bool cx_strtok_next_m(CxStrtokCtx *ctx, cxmutstr *token);
+#define cx_strtok_next(ctx, token) _Generic((token), \
+        cxstring*: cx_strtok_next_, \
+        cxmutstr*: cx_strtok_next_)(ctx, (cxstring*)token)
+#endif
 
 /**
  * Defines an array of more delimiters for the specified tokenization context.

mercurial