aboutsummaryrefslogtreecommitdiffstats
path: root/src/statement.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-06-03 19:24:59 +0200
committerDavid Robillard <d@drobilla.net>2022-01-13 23:03:54 -0500
commitdd02840dcb298a63a7fadd5817a71d020786e95e (patch)
treec29261ceff41601d84dc65fd8015951b726faed3 /src/statement.c
parentbf72cc408db5244881143619236aee20156f4ffd (diff)
downloadserd-dd02840dcb298a63a7fadd5817a71d020786e95e.tar.gz
serd-dd02840dcb298a63a7fadd5817a71d020786e95e.tar.bz2
serd-dd02840dcb298a63a7fadd5817a71d020786e95e.zip
Add SerdStatement
Diffstat (limited to 'src/statement.c')
-rw-r--r--src/statement.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/statement.c b/src/statement.c
new file mode 100644
index 00000000..51788e05
--- /dev/null
+++ b/src/statement.c
@@ -0,0 +1,134 @@
+/*
+ Copyright 2011-2020 David Robillard <d@drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#include "statement.h"
+
+#include "caret.h"
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+static bool
+is_resource(const SerdNode* const node)
+{
+ const SerdNodeType type = serd_node_type(node);
+
+ return type == SERD_URI || type == SERD_CURIE || type == SERD_BLANK;
+}
+
+bool
+serd_statement_is_valid(const SerdNode* const subject,
+ const SerdNode* const predicate,
+ const SerdNode* const object,
+ const SerdNode* const graph)
+{
+ return subject && predicate && object && is_resource(subject) &&
+ is_resource(predicate) && serd_node_type(predicate) != SERD_BLANK &&
+ (!graph || is_resource(graph));
+}
+
+SerdStatement*
+serd_statement_new(const SerdNode* const s,
+ const SerdNode* const p,
+ const SerdNode* const o,
+ const SerdNode* const g,
+ const SerdCaret* const caret)
+{
+ assert(serd_statement_is_valid(s, p, o, g));
+
+ SerdStatement* statement = (SerdStatement*)malloc(sizeof(SerdStatement));
+ if (statement) {
+ statement->nodes[0] = s;
+ statement->nodes[1] = p;
+ statement->nodes[2] = o;
+ statement->nodes[3] = g;
+ statement->caret = serd_caret_copy(caret);
+ }
+ return statement;
+}
+
+SerdStatement*
+serd_statement_copy(const SerdStatement* const statement)
+{
+ if (!statement) {
+ return NULL;
+ }
+
+ SerdStatement* copy = (SerdStatement*)malloc(sizeof(SerdStatement));
+ memcpy(copy, statement, sizeof(SerdStatement));
+ if (statement->caret) {
+ copy->caret = (SerdCaret*)malloc(sizeof(SerdCaret));
+ memcpy(copy->caret, statement->caret, sizeof(SerdCaret));
+ }
+ return copy;
+}
+
+void
+serd_statement_free(SerdStatement* const statement)
+{
+ if (statement) {
+ free(statement->caret);
+ free(statement);
+ }
+}
+
+const SerdNode*
+serd_statement_node(const SerdStatement* const statement, const SerdField field)
+{
+ return statement->nodes[field];
+}
+
+const SerdNode*
+serd_statement_subject(const SerdStatement* const statement)
+{
+ return statement->nodes[SERD_SUBJECT];
+}
+
+const SerdNode*
+serd_statement_predicate(const SerdStatement* const statement)
+{
+ return statement->nodes[SERD_PREDICATE];
+}
+
+const SerdNode*
+serd_statement_object(const SerdStatement* const statement)
+{
+ return statement->nodes[SERD_OBJECT];
+}
+
+const SerdNode*
+serd_statement_graph(const SerdStatement* const statement)
+{
+ return statement->nodes[SERD_GRAPH];
+}
+
+const SerdCaret*
+serd_statement_caret(const SerdStatement* const statement)
+{
+ return statement->caret;
+}
+
+bool
+serd_statement_equals(const SerdStatement* const a,
+ const SerdStatement* const b)
+{
+ return (a == b || (a && b && serd_node_equals(a->nodes[0], b->nodes[0]) &&
+ serd_node_equals(a->nodes[1], b->nodes[1]) &&
+ serd_node_equals(a->nodes[2], b->nodes[2]) &&
+ serd_node_equals(a->nodes[3], b->nodes[3])));
+}