aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/serd/serd.h70
1 files changed, 69 insertions, 1 deletions
diff --git a/include/serd/serd.h b/include/serd/serd.h
index 3fe49c35..6120df16 100644
--- a/include/serd/serd.h
+++ b/include/serd/serd.h
@@ -21,9 +21,9 @@
#include <stdarg.h>
#include <stdbool.h>
-#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
+#include <string.h> // IWYU pragma: keep
#if defined(_WIN32) && !defined(SERD_STATIC) && defined(SERD_INTERNAL)
# define SERD_API __declspec(dllexport)
@@ -92,6 +92,11 @@ typedef enum {
typedef uint32_t SerdNodeFlags;
/**
+ @defgroup serd_string_view String View
+ @{
+*/
+
+/**
An immutable slice of a string.
This type is used for many string parameters, to allow referring to slices
@@ -102,6 +107,69 @@ typedef struct {
size_t len; ///< Length of string in bytes
} SerdStringView;
+#ifdef __cplusplus
+
+# define SERD_EMPTY_STRING() \
+ SerdStringView { "", 0u }
+
+# define SERD_STRING(str) \
+ SerdStringView { str, strlen(str) }
+
+# define SERD_OPTIONAL_STRING(str) \
+ SerdStringView { (str) ? (str) : "", (str) ? strlen(str) : 0u }
+
+# define SERD_SUBSTRING(str, len) \
+ SerdStringView { (str), (len) }
+
+#else
+
+/// Return a view of an empty string
+# define SERD_EMPTY_STRING() \
+ (SerdStringView) { "", 0u }
+
+/**
+ Return a view of an entire string by measuring it.
+
+ This makes a view of the given string by measuring it with `strlen`.
+
+ @param str Non-null pointer to the start of a null-terminated C string.
+*/
+# define SERD_STRING(str) \
+ (SerdStringView) { (str), strlen(str) }
+
+/**
+ Return a view of an entire string by measuring it, or the empty string.
+
+ This is the same as SERD_STRING(), but tolerates null, in which case an empty
+ string view is returned.
+
+ @param str Pointer to the start of a null-terminated C string, or null.
+*/
+# define SERD_OPTIONAL_STRING(str) \
+ (SerdStringView) { (str) ? (str) : "", (str) ? strlen(str) : 0u }
+
+/**
+ Return a view of a substring, or a premeasured string.
+
+ This makes either a view of a slice of a string (which may not be null
+ terminated), or a view of a string that has already been measured. This is
+ faster than SERD_STRING() for dynamic strings since it does not call
+ `strlen`, so should be used when the length of the string is already known.
+
+ @param str Pointer to the start of the substring.
+
+ @param len Length of the substring in bytes, not including the trailing null
+ terminator if present.
+*/
+# define SERD_SUBSTRING(str, len) \
+ (SerdStringView) { (str), (len) }
+
+#endif
+
+/**
+ @}
+*/
+
/// A mutable buffer in memory
typedef struct {
void* SERD_NULLABLE buf; ///< Buffer