|
@@ -24,16 +24,21 @@ term_to_ttl (const LSUP_Term *term, const LSUP_NSMap *nsm, char **out_p)
|
|
|
{
|
|
|
LSUP_rc rc;
|
|
|
char *out = NULL, *escaped;
|
|
|
- const char *metadata = NULL;
|
|
|
+ char *metadata = NULL;
|
|
|
size_t buf_len;
|
|
|
|
|
|
- // Free previous content if not NULL.
|
|
|
- if (*out_p != NULL) out = realloc (*out_p, 0);
|
|
|
-
|
|
|
+ LSUP_rc md_rc;
|
|
|
switch (term->type) {
|
|
|
case LSUP_TERM_IRIREF:
|
|
|
- LSUP_nsmap_denormalize_uri (nsm, term->data, &out);
|
|
|
- if (UNLIKELY (!out)) return LSUP_MEM_ERR;
|
|
|
+ md_rc = LSUP_nsmap_denormalize_uri (nsm, term->data, &out);
|
|
|
+ PRCCK (md_rc);
|
|
|
+ if (md_rc == LSUP_NORESULT) {
|
|
|
+ // If URI counld not be shortened, add `<>`
|
|
|
+ char *tmp = realloc (out, strlen (out) + 2);
|
|
|
+ if (UNLIKELY (!tmp)) return LSUP_MEM_ERR;
|
|
|
+ out = tmp;
|
|
|
+ out = strcat (strcat (strcat (tmp, "<"), tmp), ">");
|
|
|
+ }
|
|
|
rc = LSUP_OK;
|
|
|
break;
|
|
|
|
|
@@ -53,8 +58,12 @@ term_to_ttl (const LSUP_Term *term, const LSUP_NSMap *nsm, char **out_p)
|
|
|
term->datatype != 0
|
|
|
&& term->datatype != LSUP_default_datatype
|
|
|
) {
|
|
|
- metadata = term->datatype->data;
|
|
|
- buf_len += strlen (metadata) + 4; // Room for ^^<>
|
|
|
+ md_rc = LSUP_nsmap_denormalize_uri (
|
|
|
+ nsm, term->datatype->data, &metadata);
|
|
|
+ PRCCK (md_rc);
|
|
|
+ // Room for `^^<>` for FQURI, `^^` for NS URI
|
|
|
+ unsigned padding = md_rc == LSUP_NORESULT ? 4 : 2;
|
|
|
+ buf_len += strlen (metadata) + padding;
|
|
|
}
|
|
|
|
|
|
out = realloc (out, buf_len);
|
|
@@ -78,7 +87,7 @@ term_to_ttl (const LSUP_Term *term, const LSUP_NSMap *nsm, char **out_p)
|
|
|
buf_len = strlen (escaped) + 3; // Room for "" and terminator
|
|
|
|
|
|
if (term->lang[0] != '\0') {
|
|
|
- metadata = term->lang;
|
|
|
+ metadata = strndup (term->lang, sizeof (LSUP_LangTag));
|
|
|
buf_len += strlen (metadata) + 1; // Room for @
|
|
|
}
|
|
|
|
|
@@ -108,6 +117,7 @@ term_to_ttl (const LSUP_Term *term, const LSUP_NSMap *nsm, char **out_p)
|
|
|
out = NULL;
|
|
|
rc = LSUP_PARSE_ERR;
|
|
|
}
|
|
|
+ free (metadata);
|
|
|
|
|
|
*out_p = out;
|
|
|
return rc;
|