dtoc: Tidy up implementation of AddStringList()
authorSimon Glass <sjg@chromium.org>
Sun, 6 Mar 2022 03:18:56 +0000 (20:18 -0700)
committerSimon Glass <sjg@chromium.org>
Sat, 19 Mar 2022 01:24:25 +0000 (19:24 -0600)
Refactor this to avoid a loop. Also add a test for an empty string.

Signed-off-by: Simon Glass <sjg@chromium.org>
Suggested-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Reviewed-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
tools/dtoc/fdt.py
tools/dtoc/fdt_util.py
tools/dtoc/test_fdt.py

index c16909a..d933972 100644 (file)
@@ -516,9 +516,7 @@ class Node:
         Returns:
             Prop added
         """
-        out = b''
-        for string in val:
-            out += bytes(string, 'utf-8') + b'\0'
+        out = b'\0'.join(bytes(s, 'utf-8') for s in val) + b'\0' if val else b''
         return self.AddData(prop_name, out)
 
     def AddInt(self, prop_name, val):
index 5755062..d7c38ad 100644 (file)
@@ -158,6 +158,8 @@ def GetString(node, propname, default=None):
     if not prop:
         return default
     value = prop.value
+    if not prop.bytes:
+        return ''
     if isinstance(value, list):
         raise ValueError("Node '%s' property '%s' has list value: expecting "
                          "a single string" % (node.name, propname))
@@ -179,6 +181,8 @@ def GetStringList(node, propname, default=None):
     if not prop:
         return default
     value = prop.value
+    if not prop.bytes:
+        return []
     if not isinstance(value, list):
         strval = GetString(node, propname)
         return [strval]
index ea707f2..914ed6a 100755 (executable)
@@ -550,6 +550,12 @@ class TestProp(unittest.TestCase):
         data = self.fdt.getprop(self.node.Offset(), 'stringlist')
         self.assertEqual(b'123\x00456\0', data)
 
+        val = []
+        self.node.AddStringList('stringlist', val)
+        self.dtb.Sync(auto_resize=True)
+        data = self.fdt.getprop(self.node.Offset(), 'stringlist')
+        self.assertEqual(b'', data)
+
     def test_delete_node(self):
         """Test deleting a node"""
         old_offset = self.fdt.path_offset('/spl-test')
@@ -637,6 +643,7 @@ class TestFdtUtil(unittest.TestCase):
         self.assertEqual('message', fdt_util.GetString(self.node, 'stringval'))
         self.assertEqual('test', fdt_util.GetString(self.node, 'missing',
                                                     'test'))
+        self.assertEqual('', fdt_util.GetString(self.node, 'boolval'))
 
         with self.assertRaises(ValueError) as e:
             self.assertEqual(3, fdt_util.GetString(self.node, 'stringarray'))
@@ -651,6 +658,7 @@ class TestFdtUtil(unittest.TestCase):
             fdt_util.GetStringList(self.node, 'stringarray'))
         self.assertEqual(['test'],
                          fdt_util.GetStringList(self.node, 'missing', ['test']))
+        self.assertEqual([], fdt_util.GetStringList(self.node, 'boolval'))
 
     def testGetArgs(self):
         node = self.dtb.GetNode('/orig-node')