[libvirt] [PATCH 12/13] virsh: Implement vshTable API to vol-list

Simon Kobyda skobyda at redhat.com
Tue Sep 18 14:21:36 UTC 2018


Local lengthy unicode-unreliable table formatting was replaced by new
API. Great example of how new API saves space and time.
Removed a lot of string lenght calculation used by the local table.

Signed-off-by: Simon Kobyda <skobyda at redhat.com>
---
 tools/virsh-volume.c | 127 +++++++++----------------------------------
 1 file changed, 27 insertions(+), 100 deletions(-)

diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c
index 42d11701ec..071882c628 100644
--- a/tools/virsh-volume.c
+++ b/tools/virsh-volume.c
@@ -42,6 +42,7 @@
 #include "virsh-pool.h"
 #include "virxml.h"
 #include "virstring.h"
+#include "vsh-table.h"
 
 #define VIRSH_COMMON_OPT_POOL_FULL \
     VIRSH_COMMON_OPT_POOL(N_("pool name or uuid"), \
@@ -1382,16 +1383,11 @@ cmdVolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
 {
     virStorageVolInfo volumeInfo;
     virStoragePoolPtr pool;
-    char *outputStr = NULL;
     const char *unit;
     double val;
     bool details = vshCommandOptBool(cmd, "details");
     size_t i;
     bool ret = false;
-    int stringLength = 0;
-    size_t allocStrLength = 0, capStrLength = 0;
-    size_t nameStrLength = 0, pathStrLength = 0;
-    size_t typeStrLength = 0;
     struct volInfoText {
         char *allocation;
         char *capacity;
@@ -1400,6 +1396,7 @@ cmdVolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
     };
     struct volInfoText *volInfoTexts = NULL;
     virshStorageVolListPtr list = NULL;
+    vshTablePtr table = NULL;
 
     /* Look up the pool information given to us by the user */
     if (!(pool = virshCommandOptPool(ctl, cmd, "pool", NULL)))
@@ -1446,36 +1443,6 @@ cmdVolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
                                 "%.2lf %s", val, unit) < 0)
                     goto cleanup;
             }
-
-            /* Remember the largest length for each output string.
-             * This lets us displaying header and volume information rows
-             * using a single, properly sized, printf style output string.
-             */
-
-            /* Keep the length of name string if longest so far */
-            stringLength = strlen(virStorageVolGetName(list->vols[i]));
-            if (stringLength > nameStrLength)
-                nameStrLength = stringLength;
-
-            /* Keep the length of path string if longest so far */
-            stringLength = strlen(volInfoTexts[i].path);
-            if (stringLength > pathStrLength)
-                pathStrLength = stringLength;
-
-            /* Keep the length of type string if longest so far */
-            stringLength = strlen(volInfoTexts[i].type);
-            if (stringLength > typeStrLength)
-                typeStrLength = stringLength;
-
-            /* Keep the length of capacity string if longest so far */
-            stringLength = strlen(volInfoTexts[i].capacity);
-            if (stringLength > capStrLength)
-                capStrLength = stringLength;
-
-            /* Keep the length of allocation string if longest so far */
-            stringLength = strlen(volInfoTexts[i].allocation);
-            if (stringLength > allocStrLength)
-                allocStrLength = stringLength;
         }
     }
 
@@ -1487,14 +1454,20 @@ cmdVolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
     /* Output basic info then return if --details option not selected */
     if (!details) {
         /* The old output format */
-        vshPrintExtra(ctl, " %-20s %-40s\n", _("Name"), _("Path"));
-        vshPrintExtra(ctl, "---------------------------------------"
-                           "---------------------------------------\n");
+        table = vshTableNew("Name", "Path", NULL);
+        if (!table)
+            goto cleanup;
+
         for (i = 0; i < list->nvols; i++) {
-            vshPrint(ctl, " %-20s %-40s\n", virStorageVolGetName(list->vols[i]),
-                     volInfoTexts[i].path);
+            if (vshTableRowAppend(table,
+                                  virStorageVolGetName(list->vols[i]),
+                                  volInfoTexts[i].path,
+                                  NULL) < 0)
+                goto cleanup;
         }
 
+        vshTablePrintToStdout(table, ctl);
+
         /* Cleanup and return */
         ret = true;
         goto cleanup;
@@ -1502,75 +1475,30 @@ cmdVolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
 
     /* We only get here if the --details option was selected. */
 
-    /* Use the length of name header string if it's longest */
-    stringLength = strlen(_("Name"));
-    if (stringLength > nameStrLength)
-        nameStrLength = stringLength;
-
-    /* Use the length of path header string if it's longest */
-    stringLength = strlen(_("Path"));
-    if (stringLength > pathStrLength)
-        pathStrLength = stringLength;
-
-    /* Use the length of type header string if it's longest */
-    stringLength = strlen(_("Type"));
-    if (stringLength > typeStrLength)
-        typeStrLength = stringLength;
-
-    /* Use the length of capacity header string if it's longest */
-    stringLength = strlen(_("Capacity"));
-    if (stringLength > capStrLength)
-        capStrLength = stringLength;
-
-    /* Use the length of allocation header string if it's longest */
-    stringLength = strlen(_("Allocation"));
-    if (stringLength > allocStrLength)
-        allocStrLength = stringLength;
-
-    /* Display the string lengths for debugging */
-    vshDebug(ctl, VSH_ERR_DEBUG,
-             "Longest name string = %zu chars\n", nameStrLength);
-    vshDebug(ctl, VSH_ERR_DEBUG,
-             "Longest path string = %zu chars\n", pathStrLength);
-    vshDebug(ctl, VSH_ERR_DEBUG,
-             "Longest type string = %zu chars\n", typeStrLength);
-    vshDebug(ctl, VSH_ERR_DEBUG,
-             "Longest capacity string = %zu chars\n", capStrLength);
-    vshDebug(ctl, VSH_ERR_DEBUG,
-             "Longest allocation string = %zu chars\n", allocStrLength);
-
-    if (virAsprintf(&outputStr,
-                    " %%-%lus  %%-%lus  %%-%lus  %%%lus  %%%lus\n",
-                    (unsigned long) nameStrLength,
-                    (unsigned long) pathStrLength,
-                    (unsigned long) typeStrLength,
-                    (unsigned long) capStrLength,
-                    (unsigned long) allocStrLength) < 0)
-        goto cleanup;
-
     /* Display the header */
-    vshPrintExtra(ctl, outputStr, _("Name"), _("Path"), _("Type"),
-                  _("Capacity"), _("Allocation"));
-    for (i = nameStrLength + pathStrLength + typeStrLength
-                           + capStrLength + allocStrLength
-                           + 10; i > 0; i--)
-        vshPrintExtra(ctl, "-");
-    vshPrintExtra(ctl, "\n");
+    table = vshTableNew("Name", "Path", "Type", "Capacity", "Allocation", NULL);
+    if (!table)
+        goto cleanup;
 
     /* Display the volume info rows */
     for (i = 0; i < list->nvols; i++) {
-        vshPrint(ctl, outputStr,
-                 virStorageVolGetName(list->vols[i]),
-                 volInfoTexts[i].path,
-                 volInfoTexts[i].type,
-                 volInfoTexts[i].capacity,
-                 volInfoTexts[i].allocation);
+        if (vshTableRowAppend(table,
+                              virStorageVolGetName(list->vols[i]),
+                              volInfoTexts[i].path,
+                              volInfoTexts[i].type,
+                              volInfoTexts[i].capacity,
+                              volInfoTexts[i].allocation,
+                              NULL) < 0)
+            goto cleanup;
     }
 
+    vshTablePrintToStdout(table, ctl);
+
     /* Cleanup and return */
     ret = true;
 
  cleanup:
+    vshTableFree(table);
 
     /* Safely free the memory allocated in this function */
     if (list && list->nvols) {
@@ -1584,7 +1512,6 @@ cmdVolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
     }
 
     /* Cleanup remaining memory */
-    VIR_FREE(outputStr);
     VIR_FREE(volInfoTexts);
     virStoragePoolFree(pool);
     virshStorageVolListFree(list);
-- 
2.17.1




More information about the libvir-list mailing list