Pārlūkot izejas kodu

Return original URI when normalizing if prefix is not found.

scossu 1 nedēļu atpakaļ
vecāks
revīzija
a10c27fedc
4 mainītis faili ar 30 papildinājumiem un 10 dzēšanām
  1. 1 1
      include/namespace.h
  2. 7 6
      src/namespace.c
  3. 1 1
      src/store_mdb.c
  4. 21 2
      test/test_namespace.c

+ 1 - 1
include/namespace.h

@@ -27,7 +27,7 @@ typedef struct hashmap LSUP_NSMap;
 
 /** @brief Namespace prefix type.
  */
-typedef char ns_pfx[PFX_LEN];
+typedef char LSUP_ns_pfx[PFX_LEN];
 
 
 /** @brief Create a new namespace map.

+ 7 - 6
src/namespace.c

@@ -5,7 +5,7 @@
 /** @brief Prefix / Namespace pair.
  */
 typedef struct ns_entry_t {
-    ns_pfx              pfx;        // Namespace prefix.
+    LSUP_ns_pfx         pfx;        // Namespace prefix.
     char *              ns;         // Fully qualified NS.
 } NSEntry;
 
@@ -149,14 +149,14 @@ LSUP_nsmap_normalize_uri (
     char *fq_uri = NULL;
 
     size_t pfx_len = strcspn (pfx_uri, ":");
-    if (pfx_len >= PFX_LEN) {
+    if (pfx_len >= PFX_LEN || pfx_len == strlen (pfx_uri)) {
         log_warn (
-                "Prefix in `%s` is longer than the maximum allowed size "
-                "(%d characters). Truncating.", pfx_uri, PFX_LEN - 1);
-        pfx_len = PFX_LEN - 1;
+                "No prefix separator detected in URI `%s` within maximum "
+                "prefix length (%d characters).", pfx_uri, PFX_LEN - 1);
+        goto no_prefix;
     }
 
-    ns_pfx pfx;
+    LSUP_ns_pfx pfx;
     strncpy (pfx, pfx_uri, pfx_len);
     pfx[pfx_len] = '\0';
 
@@ -175,6 +175,7 @@ LSUP_nsmap_normalize_uri (
     } else {
         log_warn ("No NS prefix found in map to normalize %s", pfx_uri);
 
+no_prefix:
         fq_uri = malloc (strlen(pfx_uri) + 1);
         if (UNLIKELY (! (fq_uri))) return LSUP_MEM_ERR;
         strcpy (fq_uri, pfx_uri);

+ 1 - 1
src/store_mdb.c

@@ -237,7 +237,7 @@ mdbstore_nsm_get (void *h)
         goto finally;
 
     do {
-        ns_pfx pfx;
+        LSUP_ns_pfx pfx;
         char *ns = malloc (ns_v.mv_size);
 
         strncpy (pfx, pfx_v.mv_data, pfx_v.mv_size);

+ 21 - 2
test/test_namespace.c

@@ -17,7 +17,8 @@ test_namespace()
     EXPECT_STR_EQ (
             LSUP_nsmap_get_ns (nsm, "dcterms"), "http://purl.org/dc/terms/");
     // Prefixes longer than 7 chars are truncated.
-    ASSERT (LSUP_nsmap_get_ns (nsm, "dctermsxx"), "http://purl.org/dc/terms/");
+    EXPECT_STR_EQ (
+            LSUP_nsmap_get_ns (nsm, "dctermsxx"), "http://purl.org/dc/terms/");
     ASSERT (LSUP_nsmap_get_ns (nsm, "none") == NULL, "Non-existent NS found!");
 
     // Lookup NS.
@@ -36,6 +37,25 @@ test_namespace()
     fq_uri = NULL;
     EXPECT_PASS (LSUP_nsmap_normalize_uri (nsm, pfx_uri, &fq_uri));
     EXPECT_STR_EQ (fq_uri, "http://purl.org/dc/elements/1.1/title");
+    free (fq_uri);
+
+    ASSERT (
+            LSUP_nsmap_normalize_uri (nsm, "dctermsxxtitle", &fq_uri)
+            == LSUP_NORESULT, "Wrong RC for normalizing long ns!");
+    EXPECT_STR_EQ (fq_uri, "dctermsxxtitle");
+    free (fq_uri);
+
+    ASSERT (
+            LSUP_nsmap_normalize_uri (nsm, "bogus:ns:123", &fq_uri)
+            == LSUP_NORESULT, "Wrong RC for normalizing non-existent ns!");
+    EXPECT_STR_EQ (fq_uri, "bogus:ns:123");
+    free (fq_uri);
+
+    ASSERT (
+            LSUP_nsmap_normalize_uri (nsm, "bogus", &fq_uri)
+            == LSUP_NORESULT, "Wrong RC for normalizing non-prefixed URI!");
+    EXPECT_STR_EQ (fq_uri, "bogus");
+    free (fq_uri);
 
     EXPECT_PASS (LSUP_nsmap_remove (nsm, "dc"));
     ASSERT (
@@ -44,7 +64,6 @@ test_namespace()
     ASSERT (LSUP_nsmap_get_ns (nsm, "dc") == NULL, "Deleted NS found!");
 
     LSUP_nsmap_free (nsm);
-    free (fq_uri);
     free (pfx_uri);
 
     return 0;