aboutsummaryrefslogtreecommitdiffstats
path: root/include/serd
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-02-04 15:33:36 +0100
committerDavid Robillard <d@drobilla.net>2023-12-02 16:27:02 -0500
commitc644f404054e6d68f3bb645cf93b8ad1501b8938 (patch)
tree6291623c37dd9ef6be062113bf6ac5afa8115171 /include/serd
parentb0d4ae792c88cc55f9cc9a579530a1a13a158fda (diff)
downloadserd-c644f404054e6d68f3bb645cf93b8ad1501b8938.tar.gz
serd-c644f404054e6d68f3bb645cf93b8ad1501b8938.tar.bz2
serd-c644f404054e6d68f3bb645cf93b8ad1501b8938.zip
Make nodes opaque
Diffstat (limited to 'include/serd')
-rw-r--r--include/serd/env.h20
-rw-r--r--include/serd/node.h133
-rw-r--r--include/serd/reader.h3
-rw-r--r--include/serd/status.h3
-rw-r--r--include/serd/uri.h3
-rw-r--r--include/serd/writer.h16
6 files changed, 87 insertions, 91 deletions
diff --git a/include/serd/env.h b/include/serd/env.h
index 3d4cafd0..7a03e80d 100644
--- a/include/serd/env.h
+++ b/include/serd/env.h
@@ -33,7 +33,7 @@ SERD_API void
serd_env_free(SerdEnv* SERD_NULLABLE env);
/// Get the current base URI
-SERD_API const SerdNode* SERD_NONNULL
+SERD_API const SerdNode* SERD_NULLABLE
serd_env_base_uri(const SerdEnv* SERD_NONNULL env,
SerdURIView* SERD_NULLABLE out);
@@ -62,10 +62,10 @@ serd_env_set_prefix_from_strings(SerdEnv* SERD_NONNULL env,
/// Qualify `uri` into a CURIE if possible
SERD_API bool
-serd_env_qualify(const SerdEnv* SERD_NULLABLE env,
- const SerdNode* SERD_NONNULL uri,
- SerdNode* SERD_NONNULL prefix,
- SerdStringView* SERD_NONNULL suffix);
+serd_env_qualify(const SerdEnv* SERD_NULLABLE env,
+ const SerdNode* SERD_NONNULL uri,
+ const SerdNode* SERD_NULLABLE* SERD_NONNULL prefix,
+ SerdStringView* SERD_NONNULL suffix);
/**
Expand `curie`.
@@ -74,17 +74,17 @@ serd_env_qualify(const SerdEnv* SERD_NULLABLE env,
not defined in `env`.
*/
SERD_API SerdStatus
-serd_env_expand(const SerdEnv* SERD_NULLABLE env,
- const SerdNode* SERD_NONNULL curie,
- SerdStringView* SERD_NONNULL uri_prefix,
- SerdStringView* SERD_NONNULL uri_suffix);
+serd_env_expand(const SerdEnv* SERD_NULLABLE env,
+ const SerdNode* SERD_NULLABLE curie,
+ SerdStringView* SERD_NONNULL uri_prefix,
+ SerdStringView* SERD_NONNULL uri_suffix);
/**
Expand `node`, which must be a CURIE or URI, to a full URI.
Returns null if `node` can not be expanded.
*/
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_env_expand_node(const SerdEnv* SERD_NULLABLE env,
const SerdNode* SERD_NONNULL node);
diff --git a/include/serd/node.h b/include/serd/node.h
index 73be120e..eb4f8c9e 100644
--- a/include/serd/node.h
+++ b/include/serd/node.h
@@ -20,24 +20,26 @@ SERD_BEGIN_DECLS
*/
/**
- Type of a node.
+ @defgroup serd_node_types Types
+ @{
+*/
- An RDF node, in the abstract sense, can be either a resource, literal, or a
- blank. This type is more precise, because syntactically there are two ways
- to refer to a resource (by URI or CURIE).
+/**
+ An RDF node.
- There are also two ways to refer to a blank node in syntax (by ID or
- anonymously), but this is handled by statement flags rather than distinct
- node types.
+ A node in memory is a single contiguous chunk of data, but the
+ representation is opaque and may only be accessed through the API.
*/
-typedef enum {
- /**
- The type of a nonexistent node.
+typedef struct SerdNodeImpl SerdNode;
- This type is useful as a sentinel, but is never emitted by the reader.
- */
- SERD_NOTHING = 0,
+/**
+ Type of a node.
+ An abstract RDF node can be either a resource or a literal. This type is
+ more precise to preserve syntactic differences and support additional
+ features.
+*/
+typedef enum {
/**
Literal value.
@@ -88,39 +90,30 @@ typedef enum {
/// Bitwise OR of #SerdNodeFlag values
typedef uint32_t SerdNodeFlags;
-/// A syntactic RDF node
-typedef struct {
- const char* SERD_NULLABLE buf; ///< Value string
- size_t n_bytes; ///< Size in bytes (excluding null)
- SerdNodeFlags flags; ///< Node flags (string properties)
- SerdNodeType type; ///< Node type
-} SerdNode;
-
-static const SerdNode SERD_NODE_NULL = {NULL, 0, 0, SERD_NOTHING};
-
/**
- Make a (shallow) node from `str`.
-
- This measures, but does not copy, `str`. No memory is allocated.
+ @}
+ @defgroup serd_node_dynamic_allocation Dynamic Allocation
+ @{
*/
-SERD_API SerdNode
-serd_node_from_string(SerdNodeType type, const char* SERD_NULLABLE str);
/**
- Make a (shallow) node from a prefix of `str`.
+ Create a new node from `str`.
+*/
+SERD_API SerdNode* SERD_ALLOCATED
+serd_new_string(SerdNodeType type, const char* SERD_NULLABLE str);
- This measures, but does not copy, `str`. No memory is allocated.
- Note that the returned node may not be null terminated.
+/**
+ Create a new node from a prefix of `str`.
*/
-SERD_API SerdNode
-serd_node_from_substring(SerdNodeType type,
- const char* SERD_NULLABLE str,
- size_t len);
+SERD_API SerdNode* SERD_ALLOCATED
+serd_new_substring(SerdNodeType type,
+ const char* SERD_NULLABLE str,
+ size_t len);
/**
Create a new URI node from a node.
*/
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_new_uri_from_node(const SerdNode* SERD_NONNULL uri_node,
const SerdURIView* SERD_NULLABLE base,
SerdURIView* SERD_NULLABLE out);
@@ -128,7 +121,7 @@ serd_new_uri_from_node(const SerdNode* SERD_NONNULL uri_node,
/**
Create a new URI node from a string.
*/
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_new_uri_from_string(const char* SERD_NULLABLE str,
const SerdURIView* SERD_NULLABLE base,
SerdURIView* SERD_NULLABLE out);
@@ -142,7 +135,7 @@ serd_new_uri_from_string(const char* SERD_NULLABLE str,
If `path` is relative, `hostname` is ignored.
If `out` is not NULL, it will be set to the parsed URI.
*/
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_new_file_uri(const char* SERD_NONNULL path,
const char* SERD_NULLABLE hostname,
SerdURIView* SERD_NULLABLE out);
@@ -157,7 +150,7 @@ serd_new_file_uri(const char* SERD_NONNULL path,
@param out Set to the parsing of the new URI (i.e. points only to
memory owned by the new returned node).
*/
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_new_uri(const SerdURIView* SERD_NONNULL uri,
const SerdURIView* SERD_NULLABLE base,
SerdURIView* SERD_NULLABLE out);
@@ -174,7 +167,7 @@ serd_new_uri(const SerdURIView* SERD_NONNULL uri,
@param out Set to the parsing of the new URI (i.e. points only to
memory owned by the new returned node).
*/
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_new_relative_uri(const SerdURIView* SERD_NONNULL uri,
const SerdURIView* SERD_NULLABLE base,
const SerdURIView* SERD_NULLABLE root,
@@ -195,11 +188,11 @@ serd_new_relative_uri(const SerdURIView* SERD_NONNULL uri,
@param d The value for the new node.
@param frac_digits The maximum number of digits after the decimal place.
*/
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_new_decimal(double d, unsigned frac_digits);
/// Create a new node by serialising `i` into an xsd:integer string
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_new_integer(int64_t i);
/**
@@ -212,54 +205,62 @@ serd_new_integer(int64_t i);
@param size Size of `buf`.
@param wrap_lines Wrap lines at 76 characters to conform to RFC 2045.
*/
-SERD_API SerdNode
+SERD_API SerdNode* SERD_ALLOCATED
serd_new_blob(const void* SERD_NONNULL buf, size_t size, bool wrap_lines);
+/// Return a deep copy of `node`
+SERD_API SerdNode* SERD_ALLOCATED
+serd_node_copy(const SerdNode* SERD_NULLABLE node);
+
/**
- Make a deep copy of `node`.
+ Free any data owned by `node`.
+*/
+SERD_API void
+serd_node_free(SerdNode* SERD_NULLABLE node);
- @return a node that the caller must free with serd_node_free().
+/**
+ @}
+ @defgroup serd_node_accessors Accessors
+ @{
*/
-SERD_API SerdNode
-serd_node_copy(const SerdNode* SERD_NULLABLE node);
/// Return the type of a node
-SERD_PURE_API
-SerdNodeType
+SERD_PURE_API SerdNodeType
serd_node_type(const SerdNode* SERD_NONNULL node);
/// Return the length of a node's string in bytes, excluding the terminator
-SERD_PURE_API
-size_t
-serd_node_length(const SerdNode* SERD_NONNULL node);
+SERD_PURE_API size_t
+serd_node_length(const SerdNode* SERD_NULLABLE node);
/// Return the additional flags of a node
-SERD_PURE_API
-SerdNodeFlags
+SERD_PURE_API SerdNodeFlags
serd_node_flags(const SerdNode* SERD_NONNULL node);
/// Return the string contents of a node
-SERD_PURE_API
-const char* SERD_NONNULL
+SERD_CONST_API const char* SERD_NONNULL
serd_node_string(const SerdNode* SERD_NONNULL node);
-/// Return true iff `a` is equal to `b`
-SERD_PURE_API
-bool
-serd_node_equals(const SerdNode* SERD_NONNULL a,
- const SerdNode* SERD_NONNULL b);
+/**
+ @}
+ @defgroup serd_node_operators Operators
+ @{
+*/
/**
- Free any data owned by `node`.
+ Return true iff `a` is equal to `b`.
- Note that if `node` is itself dynamically allocated (which is not the case
- for nodes created internally by serd), it will not be freed.
+ For convenience, either argument may be null, which isn't considered equal
+ to any node.
+
+ @return True if `a` and `b` point to equal nodes, or are both null.
*/
-SERD_API void
-serd_node_free(SerdNode* SERD_NULLABLE node);
+SERD_PURE_API bool
+serd_node_equals(const SerdNode* SERD_NULLABLE a,
+ const SerdNode* SERD_NULLABLE b);
/**
@}
+ @}
*/
SERD_END_DECLS
diff --git a/include/serd/reader.h b/include/serd/reader.h
index 1d9e9a6b..e4bd9b2f 100644
--- a/include/serd/reader.h
+++ b/include/serd/reader.h
@@ -59,8 +59,7 @@ serd_reader_set_error_sink(SerdReader* SERD_NONNULL reader,
void* SERD_NULLABLE error_handle);
/// Return the `handle` passed to serd_reader_new()
-SERD_PURE_API
-void* SERD_NULLABLE
+SERD_PURE_API void* SERD_NULLABLE
serd_reader_handle(const SerdReader* SERD_NONNULL reader);
/**
diff --git a/include/serd/status.h b/include/serd/status.h
index 5de96d1d..3ebdaf8f 100644
--- a/include/serd/status.h
+++ b/include/serd/status.h
@@ -40,8 +40,7 @@ typedef enum {
} SerdStatus;
/// Return a string describing a status code
-SERD_CONST_API
-const char* SERD_NONNULL
+SERD_CONST_API const char* SERD_NONNULL
serd_strerror(SerdStatus status);
/**
diff --git a/include/serd/uri.h b/include/serd/uri.h
index fc41c0c2..06cb97fb 100644
--- a/include/serd/uri.h
+++ b/include/serd/uri.h
@@ -53,8 +53,7 @@ serd_file_uri_parse(const char* SERD_NONNULL uri,
char* SERD_NONNULL* SERD_NULLABLE hostname);
/// Return true iff `utf8` starts with a valid URI scheme
-SERD_PURE_API
-bool
+SERD_PURE_API bool
serd_uri_string_has_scheme(const char* SERD_NULLABLE utf8);
/// Parse `utf8`, writing result to `out`
diff --git a/include/serd/writer.h b/include/serd/writer.h
index 35f44940..66c3d338 100644
--- a/include/serd/writer.h
+++ b/include/serd/writer.h
@@ -12,7 +12,6 @@
#include "serd/status.h"
#include "serd/stream.h"
#include "serd/syntax.h"
-#include "serd/uri.h"
#include <stddef.h>
#include <stdint.h>
@@ -49,20 +48,19 @@ typedef uint32_t SerdWriterFlags;
/// Create a new RDF writer
SERD_API SerdWriter* SERD_ALLOCATED
-serd_writer_new(SerdSyntax syntax,
- SerdWriterFlags flags,
- SerdEnv* SERD_NONNULL env,
- const SerdURIView* SERD_NULLABLE base_uri,
- SerdSink SERD_NONNULL ssink,
- void* SERD_NULLABLE stream);
+serd_writer_new(SerdSyntax syntax,
+ SerdWriterFlags flags,
+ SerdEnv* SERD_NONNULL env,
+ const SerdNode* SERD_NULLABLE base_uri,
+ SerdSink SERD_NONNULL ssink,
+ void* SERD_NULLABLE stream);
/// Free `writer`
SERD_API void
serd_writer_free(SerdWriter* SERD_NULLABLE writer);
/// Return the env used by `writer`
-SERD_PURE_API
-SerdEnv* SERD_NONNULL
+SERD_PURE_API SerdEnv* SERD_NONNULL
serd_writer_env(SerdWriter* SERD_NONNULL writer);
/**