|
@@ -111,6 +111,66 @@ finally:
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+LSUP_Term *
|
|
|
|
+LSUP_iriref_absolute (const LSUP_Term *root, const LSUP_Term *iri)
|
|
|
|
+{
|
|
|
|
+ if (! LSUP_IS_IRI (iri)) {
|
|
|
|
+ log_error ("Provided path is not an IRI.");
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+ if (! LSUP_IS_IRI (root)) {
|
|
|
|
+ log_error ("Provided root is not an IRI.");
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ char *data, *pfx = LSUP_iriref_prefix (iri);
|
|
|
|
+
|
|
|
|
+ if (pfx) data = iri->data;
|
|
|
|
+
|
|
|
|
+ else if (iri->data[0] == '/') {
|
|
|
|
+ free (pfx);
|
|
|
|
+
|
|
|
|
+ pfx = LSUP_iriref_prefix (root);
|
|
|
|
+ data = malloc (strlen (iri->data) + strlen (pfx) + 1);
|
|
|
|
+ if (!data) return NULL;
|
|
|
|
+
|
|
|
|
+ sprintf (data, "%s%s", pfx, iri->data);
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+ data = malloc (strlen (iri->data) + strlen (root->data) + 1);
|
|
|
|
+ if (!data) return NULL;
|
|
|
|
+
|
|
|
|
+ sprintf (data, "%s%s", root->data, iri->data);
|
|
|
|
+ }
|
|
|
|
+ free (pfx);
|
|
|
|
+
|
|
|
|
+ LSUP_Term *ret = LSUP_iriref_new (data, NULL);
|
|
|
|
+ if (data != iri->data) free (data);
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+LSUP_Term *
|
|
|
|
+LSUP_iriref_relative (const LSUP_Term *root, const LSUP_Term *iri)
|
|
|
|
+{
|
|
|
|
+ if (! LSUP_IS_IRI (iri)) {
|
|
|
|
+ log_error ("Provided path is not an IRI.");
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+ if (! LSUP_IS_IRI (root)) {
|
|
|
|
+ log_error ("Provided root is not an IRI.");
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ size_t offset = (
|
|
|
|
+ strstr (iri->data, root->data) == iri->data ?
|
|
|
|
+ strlen (root->data) : 0);
|
|
|
|
+
|
|
|
|
+ return LSUP_iriref_new (iri->data + offset, LSUP_iriref_nsm (iri));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
LSUP_Buffer *
|
|
LSUP_Buffer *
|
|
LSUP_term_serialize (const LSUP_Term *term)
|
|
LSUP_term_serialize (const LSUP_Term *term)
|
|
{
|
|
{
|
|
@@ -344,7 +404,7 @@ void LSUP_term_free (LSUP_Term *term)
|
|
|
|
|
|
|
|
|
|
LSUP_NSMap *
|
|
LSUP_NSMap *
|
|
-LSUP_iriref_nsm (LSUP_Term *iri)
|
|
|
|
|
|
+LSUP_iriref_nsm (const LSUP_Term *iri)
|
|
{
|
|
{
|
|
if (iri->type != LSUP_TERM_IRIREF && iri->type != LSUP_TERM_NS_IRIREF) {
|
|
if (iri->type != LSUP_TERM_IRIREF && iri->type != LSUP_TERM_NS_IRIREF) {
|
|
log_error ("Term is not a IRI ref type.");
|
|
log_error ("Term is not a IRI ref type.");
|
|
@@ -356,7 +416,7 @@ LSUP_iriref_nsm (LSUP_Term *iri)
|
|
|
|
|
|
|
|
|
|
char *
|
|
char *
|
|
-LSUP_iriref_prefix (LSUP_Term *iri)
|
|
|
|
|
|
+LSUP_iriref_prefix (const LSUP_Term *iri)
|
|
{
|
|
{
|
|
if (iri->type != LSUP_TERM_IRIREF && iri->type != LSUP_TERM_NS_IRIREF) {
|
|
if (iri->type != LSUP_TERM_IRIREF && iri->type != LSUP_TERM_NS_IRIREF) {
|
|
log_error ("Term is not a IRI ref type.");
|
|
log_error ("Term is not a IRI ref type.");
|
|
@@ -366,13 +426,14 @@ LSUP_iriref_prefix (LSUP_Term *iri)
|
|
if (iri->iri_info->prefix.rm_so == -1) return NULL;
|
|
if (iri->iri_info->prefix.rm_so == -1) return NULL;
|
|
|
|
|
|
size_t len = iri->iri_info->prefix.rm_eo - iri->iri_info->prefix.rm_so;
|
|
size_t len = iri->iri_info->prefix.rm_eo - iri->iri_info->prefix.rm_so;
|
|
|
|
+ if (len == 0) return NULL;
|
|
|
|
|
|
return strndup (iri->data + iri->iri_info->prefix.rm_so, len);
|
|
return strndup (iri->data + iri->iri_info->prefix.rm_so, len);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
char *
|
|
char *
|
|
-LSUP_iriref_path (LSUP_Term *iri)
|
|
|
|
|
|
+LSUP_iriref_path (const LSUP_Term *iri)
|
|
{
|
|
{
|
|
if (iri->type != LSUP_TERM_IRIREF && iri->type != LSUP_TERM_NS_IRIREF) {
|
|
if (iri->type != LSUP_TERM_IRIREF && iri->type != LSUP_TERM_NS_IRIREF) {
|
|
log_error ("Term is not a IRI ref type.");
|
|
log_error ("Term is not a IRI ref type.");
|
|
@@ -382,13 +443,14 @@ LSUP_iriref_path (LSUP_Term *iri)
|
|
if (iri->iri_info->path.rm_so == -1) return NULL;
|
|
if (iri->iri_info->path.rm_so == -1) return NULL;
|
|
|
|
|
|
size_t len = iri->iri_info->path.rm_eo - iri->iri_info->path.rm_so;
|
|
size_t len = iri->iri_info->path.rm_eo - iri->iri_info->path.rm_so;
|
|
|
|
+ if (len == 0) return NULL;
|
|
|
|
|
|
return strndup (iri->data + iri->iri_info->path.rm_so, len);
|
|
return strndup (iri->data + iri->iri_info->path.rm_so, len);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
char *
|
|
char *
|
|
-LSUP_iriref_frag (LSUP_Term *iri)
|
|
|
|
|
|
+LSUP_iriref_frag (const LSUP_Term *iri)
|
|
{
|
|
{
|
|
if (iri->type != LSUP_TERM_IRIREF && iri->type != LSUP_TERM_NS_IRIREF) {
|
|
if (iri->type != LSUP_TERM_IRIREF && iri->type != LSUP_TERM_NS_IRIREF) {
|
|
log_error ("Term is not a IRI ref type.");
|
|
log_error ("Term is not a IRI ref type.");
|