Kaynağa Gözat

Shorten numeric and boolean types.

Stefano Cossu 2 yıl önce
ebeveyn
işleme
57d1ddc721
1 değiştirilmiş dosya ile 27 ekleme ve 4 silme
  1. 27 4
      src/codec/codec_ttl.c

+ 27 - 4
src/codec/codec_ttl.c

@@ -73,6 +73,8 @@ term_to_ttl (const LSUP_Term *term, const LSUP_NSMap *nsm, char **out_p)
                 return LSUP_ERROR;
             buf_len = strlen (tmp) + 3; // Room for "" and terminator
 
+            // Data type.
+            bool shorten = false;
             if (
                 term->datatype != 0
                 && term->datatype != LSUP_default_datatype
@@ -80,21 +82,42 @@ term_to_ttl (const LSUP_Term *term, const LSUP_NSMap *nsm, char **out_p)
                 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;
+                unsigned padding = 0;
+
+                // Shorten numeric and boolean types.
+                if (strcmp (metadata, "xsd:integer") == 0) {
+                    // TODO check for valid format.
+                    shorten = true;
+                } else if (strcmp (metadata, "xsd:double") == 0) {
+                    // TODO check for valid format.
+                    shorten = true;
+                } else if (strcmp (metadata, "xsd:decimal") == 0) {
+                    // TODO check for valid format.
+                    shorten = true;
+                } else if (strcmp (metadata, "xsd:boolean") == 0) {
+                    // TODO check for valid format.
+                    shorten = true;
+                } else {
+                    // Room for `^^<>` for FQURI, `^^` for NS URI
+                    padding = md_rc == LSUP_NORESULT ? 4 : 2;
+                }
                 buf_len += strlen (metadata) + padding;
             }
 
             out = realloc (*out_p, buf_len);
             if (UNLIKELY (!out)) return LSUP_MEM_ERR;
 
-            if (metadata) {
+            if (shorten) {
+                strcpy (out, tmp);
+            } else if (metadata) {
                 char *fmt = (
                         md_rc == LSUP_NORESULT ? "\"%s\"^^<%s>"
                         : "\"%s\"^^%s");
                 sprintf (out, fmt, tmp, metadata);
             }
-            else sprintf (out, "\"%s\"", tmp);
+            else {
+                sprintf (out, "\"%s\"", tmp);
+            }
             free (tmp);
 
             rc = LSUP_OK;