[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libguestfs] [PATCH 2/9] utils: Add guestfs_int_drive_index and unit test.



Add guestfs_int_drive_index which does basically the opposite of
guestfs_int_drive_name.  This commit also includes a unit test.
---
 src/guestfs-internal-frontend.h |  1 +
 src/test-utils.c                | 22 ++++++++++++++++++++++
 src/utils.c                     | 21 +++++++++++++++++++++
 3 files changed, 44 insertions(+)

diff --git a/src/guestfs-internal-frontend.h b/src/guestfs-internal-frontend.h
index 9322201..e3f0db6 100644
--- a/src/guestfs-internal-frontend.h
+++ b/src/guestfs-internal-frontend.h
@@ -105,6 +105,7 @@ extern char **guestfs_int_split_string (char sep, const char *);
 extern char *guestfs_int_exit_status_to_string (int status, const char *cmd_name, char *buffer, size_t buflen);
 extern int guestfs_int_random_string (char *ret, size_t len);
 extern char *guestfs_int_drive_name (size_t index, char *ret);
+extern ssize_t guestfs_int_drive_index (const char *);
 extern int guestfs_int_is_true (const char *str);
 
 /* These functions are used internally by the CLEANUP_* macros.
diff --git a/src/test-utils.c b/src/test-utils.c
index c5e2f08..0b7714a 100644
--- a/src/test-utils.c
+++ b/src/test-utils.c
@@ -188,6 +188,27 @@ test_drive_name (void)
   assert (STREQ (s, "zzz"));
 }
 
+/* Test guestfs_int_drive_index. */
+static void
+test_drive_index (void)
+{
+  assert (guestfs_int_drive_index ("a") == 0);
+  assert (guestfs_int_drive_index ("z") == 25);
+  assert (guestfs_int_drive_index ("aa") == 26);
+  assert (guestfs_int_drive_index ("ab") == 27);
+  assert (guestfs_int_drive_index ("az") == 51);
+  assert (guestfs_int_drive_index ("ba") == 52);
+  assert (guestfs_int_drive_index ("zz") == 701);
+  assert (guestfs_int_drive_index ("aaa") == 702);
+  assert (guestfs_int_drive_index ("zzz") == 18277);
+
+  assert (guestfs_int_drive_index ("") == -1);
+  assert (guestfs_int_drive_index ("abc123") == -1);
+  assert (guestfs_int_drive_index ("123") == -1);
+  assert (guestfs_int_drive_index ("Z") == -1);
+  assert (guestfs_int_drive_index ("aB") == -1);
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -196,6 +217,7 @@ main (int argc, char *argv[])
   test_join ();
   test_validate_guid ();
   test_drive_name ();
+  test_drive_index ();
 
   exit (EXIT_SUCCESS);
 }
diff --git a/src/utils.c b/src/utils.c
index 7cee16e..e9ec38e 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -271,6 +271,27 @@ guestfs_int_drive_name (size_t index, char *ret)
   return ret;
 }
 
+/* The opposite of guestfs_int_drive_name.  Take a string like "ab"
+ * and return the index (eg 27).  Note that you must remove any prefix
+ * such as "hd", "sd" etc, or any partition number before calling the
+ * function.
+ */
+ssize_t
+guestfs_int_drive_index (const char *name)
+{
+  ssize_t r = 0;
+
+  while (*name) {
+    if (*name >= 'a' && *name <= 'z')
+      r = 26*r + (*name - 'a' + 1);
+    else
+      return -1;
+    name++;
+  }
+
+  return r-1;
+}
+
 /* Similar to Tcl_GetBoolean. */
 int
 guestfs_int_is_true (const char *str)
-- 
2.3.1


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]