Patchwork [V5,08/10] Create four opts list related functions

login
register
mail settings
Submitter Robert Wang
Date Nov. 1, 2012, 9:12 a.m.
Message ID <1351761150-20705-9-git-send-email-wdongxu@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/196100/
State New
Headers show

Comments

Robert Wang - Nov. 1, 2012, 9:12 a.m.
This patch will create 4 functions, count_opts_list, append_opts_list,
free_opts_list and print_opts_list, they will used in following commits.

Signed-off-by: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
---
 qemu-option.c |   90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 qemu-option.h |    4 ++
 2 files changed, 94 insertions(+), 0 deletions(-)
Stefan Hajnoczi - Nov. 19, 2012, 5:16 p.m.
On Thu, Nov 01, 2012 at 05:12:28PM +0800, Dong Xu Wang wrote:
> +/* Create a new QemuOptsList and make its desc to the merge of first and second.
> + * It will allocate space for one new QemuOptsList plus enouth space for
> + * QemuOptDesc in first and second QemuOptsList. First argument's QemuOptDesc
> + * members take precedence over second's.
> + */
> +QemuOptsList *append_opts_list(QemuOptsList *first,
> +                               QemuOptsList *second)
> +{
> +    size_t num_first_options, num_second_options;
> +    QemuOptsList *dest = NULL;
> +    int i = 0;
> +    int index = 0;
> +
> +    num_first_options = count_opts_list(first);
> +    num_second_options = count_opts_list(second);
> +    if (num_first_options + num_second_options == 0) {
> +        return NULL;
> +    }
> +
> +    dest = g_malloc0(sizeof(QemuOptsList)
> +        + (num_first_options + num_second_options) * sizeof(QemuOptDesc));

(num_first_options + num_second_options + 1) since we assign
desc[index].name = NULL at the end.
Robert Wang - Nov. 21, 2012, 2:48 a.m.
On Tue, Nov 20, 2012 at 1:16 AM, Stefan Hajnoczi <stefanha@gmail.com> wrote:
>
> On Thu, Nov 01, 2012 at 05:12:28PM +0800, Dong Xu Wang wrote:
> > +/* Create a new QemuOptsList and make its desc to the merge of first and second.
> > + * It will allocate space for one new QemuOptsList plus enouth space for
> > + * QemuOptDesc in first and second QemuOptsList. First argument's QemuOptDesc
> > + * members take precedence over second's.
> > + */
> > +QemuOptsList *append_opts_list(QemuOptsList *first,
> > +                               QemuOptsList *second)
> > +{
> > +    size_t num_first_options, num_second_options;
> > +    QemuOptsList *dest = NULL;
> > +    int i = 0;
> > +    int index = 0;
> > +
> > +    num_first_options = count_opts_list(first);
> > +    num_second_options = count_opts_list(second);
> > +    if (num_first_options + num_second_options == 0) {
> > +        return NULL;
> > +    }
> > +
> > +    dest = g_malloc0(sizeof(QemuOptsList)
> > +        + (num_first_options + num_second_options) * sizeof(QemuOptDesc));
>
> (num_first_options + num_second_options + 1) since we assign
> desc[index].name = NULL at the end.
>
Okay, Thank you Stefan.

Patch

diff --git a/qemu-option.c b/qemu-option.c
index e0628da..5dfbf35 100644
--- a/qemu-option.c
+++ b/qemu-option.c
@@ -1145,3 +1145,93 @@  int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func, void *opaque,
     loc_pop(&loc);
     return rc;
 }
+
+static size_t count_opts_list(QemuOptsList *list)
+{
+    size_t i = 0;
+
+    while (list && list->desc[i].name) {
+        i++;
+    }
+
+    return i;
+}
+
+/* Create a new QemuOptsList and make its desc to the merge of first and second.
+ * It will allocate space for one new QemuOptsList plus enouth space for
+ * QemuOptDesc in first and second QemuOptsList. First argument's QemuOptDesc
+ * members take precedence over second's.
+ */
+QemuOptsList *append_opts_list(QemuOptsList *first,
+                               QemuOptsList *second)
+{
+    size_t num_first_options, num_second_options;
+    QemuOptsList *dest = NULL;
+    int i = 0;
+    int index = 0;
+
+    num_first_options = count_opts_list(first);
+    num_second_options = count_opts_list(second);
+    if (num_first_options + num_second_options == 0) {
+        return NULL;
+    }
+
+    dest = g_malloc0(sizeof(QemuOptsList)
+        + (num_first_options + num_second_options) * sizeof(QemuOptDesc));
+
+    dest->name = "append_opts_list";
+    dest->implied_opt_name = NULL;
+    dest->merge_lists = false;
+    QTAILQ_INIT(&dest->head);
+    while (first && (first->desc[i].name)) {
+        if (!find_desc_by_name(dest->desc, first->desc[i].name)) {
+            dest->desc[index].name = g_strdup(first->desc[i].name);
+            dest->desc[index].help = g_strdup(first->desc[i].help);
+            dest->desc[index].type = first->desc[i].type;
+            dest->desc[index].def_print_str =
+                g_strdup(first->desc[i].def_print_str);
+            ++index;
+       }
+        i++;
+    }
+    i = 0;
+    while (second && (second->desc[i].name)) {
+        if (!find_desc_by_name(dest->desc, second->desc[i].name)) {
+            dest->desc[index].name = g_strdup(first->desc[i].name);
+            dest->desc[index].help = g_strdup(first->desc[i].help);
+            dest->desc[index].type = second->desc[i].type;
+            dest->desc[index].def_print_str =
+                g_strdup(second->desc[i].def_print_str);
+            ++index;
+        }
+        i++;
+    }
+    dest->desc[index].name = NULL;
+    return dest;
+}
+
+void free_opts_list(QemuOptsList *list)
+{
+    int i = 0;
+
+    while (list && list->desc[i].name) {
+        g_free((char *)list->desc[i].name);
+        g_free((char *)list->desc[i].help);
+        g_free((char *)list->desc[i].def_print_str);
+        i++;
+    }
+
+    g_free(list);
+}
+
+void print_opts_list(QemuOptsList *list)
+{
+    int i = 0;
+    printf("Supported options:\n");
+    while (list && list->desc[i].name) {
+        printf("%-16s %s\n", list->desc[i].name,
+            list->desc[i].help ?
+                list->desc[i].help : "No description available");
+        i++;
+    }
+}
diff --git a/qemu-option.h b/qemu-option.h
index ab02023..091a2f2 100644
--- a/qemu-option.h
+++ b/qemu-option.h
@@ -156,4 +156,8 @@  int qemu_opts_print(QemuOpts *opts, void *dummy);
 int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func, void *opaque,
                       int abort_on_failure);
 
+QemuOptsList *append_opts_list(QemuOptsList *dest,
+                               QemuOptsList *list);
+void free_opts_list(QemuOptsList *list);
+void print_opts_list(QemuOptsList *list);
 #endif