瀏覽代碼

libraster: fix Rast_legal_bandref() (#1796)

relax Rast_legal_bandref(), adjust tests for band names
Markus Metz 3 年之前
父節點
當前提交
abe194dce7
共有 2 個文件被更改,包括 17 次插入30 次删除
  1. 9 14
      lib/raster/raster_metadata.c
  2. 8 16
      lib/raster/testsuite/test_raster_metadata.py

+ 9 - 14
lib/raster/raster_metadata.c

@@ -135,8 +135,7 @@ void Rast_write_bandref(const char *name, const char *str)
  */
 int Rast_legal_bandref(const char *bandref)
 {
-    char **tokens;
-    int ntok;
+    const char *s;
 
     if (strlen(bandref) >= GNAME_MAX) {
         G_warning(_("Band reference is too long"));
@@ -146,20 +145,16 @@ int Rast_legal_bandref(const char *bandref)
     if (G_legal_filename(bandref) != 1)
         return -1;
 
-    tokens = G_tokenize(bandref, "_");
-    ntok = G_number_of_tokens(tokens);
-    if (ntok < 2) {
-        G_warning(_("Band reference must be in form <shortcut>_<bandname>"));
-        G_free_tokens(tokens);
-        return -1;
-    }
-
-    if (strlen(tokens[1]) < 1) {
-        G_free_tokens(tokens);
-        return -1;
+    s = bandref;
+    while (*s) {
+	if (!((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') ||
+	      (*s >= '0' && *s <= '9') || *s == '_'  || *s == '-')) {
+	    G_warning(_("Character '%c' not allowed in band reference."), *s);
+	    return -1;
+	}
+	s++;
     }
 
-    G_free_tokens(tokens);
     return 1;
 }
 

+ 8 - 16
lib/raster/testsuite/test_raster_metadata.py

@@ -32,28 +32,12 @@ class RastLegalBandIdTestCase(TestCase):
     def test_illegal_name(self):
         ret = Rast_legal_bandref(".a")
         self.assertEqual(ret, -1)
-        ret = Rast_legal_bandref("1")
-        self.assertEqual(ret, -1)
-        ret = Rast_legal_bandref("1a")
-        self.assertEqual(ret, -1)
         ret = Rast_legal_bandref("a/b")
         self.assertEqual(ret, -1)
         ret = Rast_legal_bandref("a@b")
         self.assertEqual(ret, -1)
         ret = Rast_legal_bandref("a#b")
         self.assertEqual(ret, -1)
-        ret = Rast_legal_bandref("GRASS")
-        self.assertEqual(ret, -1)
-        ret = Rast_legal_bandref("USER")
-        self.assertEqual(ret, -1)
-
-    def test_no_second_token(self):
-        ret = Rast_legal_bandref("GRASS_")
-        self.assertEqual(ret, -1)
-        ret = Rast_legal_bandref("USER_")
-        self.assertEqual(ret, -1)
-        ret = Rast_legal_bandref("S2_")
-        self.assertEqual(ret, -1)
 
     def test_too_long(self):
         ret = Rast_legal_bandref(
@@ -66,6 +50,14 @@ class RastLegalBandIdTestCase(TestCase):
         self.assertEqual(ret, -1)
 
     def test_good_name(self):
+        ret = Rast_legal_bandref("1")
+        self.assertEqual(ret, 1)
+        ret = Rast_legal_bandref("1a")
+        self.assertEqual(ret, 1)
+        ret = Rast_legal_bandref("clouds")
+        self.assertEqual(ret, 1)
+        ret = Rast_legal_bandref("rededge1")
+        self.assertEqual(ret, 1)
         ret = Rast_legal_bandref("S2_1")
         self.assertEqual(ret, 1)
         ret = Rast_legal_bandref("GRASS_aspect_deg")