Change semantic of the *_list_append() functions.
authorMatthias Bolte <matthias.bolte@googlemail.com>
Sat, 9 May 2009 13:34:34 +0000 (15:34 +0200)
committerMatthias Bolte <matthias.bolte@googlemail.com>
Sat, 9 May 2009 13:34:34 +0000 (15:34 +0200)
  * The *_list_append() functions now just appends the item.
  * Add new *_list_append_clone() functions append a clone of the item.

Signed-off-by: Matthias Bolte <matthias.bolte@googlemail.com>

cli/command.c
cli/command.h
cli/core.c
cli/option.c
cli/option.h
cli/token.c
include/libvscmisc/list.h
include/libvscmisc/types.h
misc/list.c

index e14f5a3..eefd7de 100644 (file)
@@ -67,55 +67,52 @@ _command_free (struct VscCliCommand **command)
 }
 
 static struct VscCliCommand *
-_command_duplicate (struct VscError *error,
-                    const struct VscCliCommand *command)
+_command_clone (struct VscError *error, const struct VscCliCommand *command)
 {
-       struct VscCliCommand *command_duplicate = NULL;
+       struct VscCliCommand *command_clone = NULL;
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
        VSC__ASSERT (command != NULL);
 
-       command_duplicate = vsc_memdup (error, command,
-                                       sizeof (struct VscCliCommand));
+       command_clone = vsc_memdup (error, command, sizeof (struct VscCliCommand));
 
        if (error->occured) {
                VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
                goto failure;
        }
 
-       command_duplicate->option_list =
-          _vsc_cli_option_list_duplicate (error, command->option_list);
+       command_clone->next = NULL;
+
+       command_clone->option_list =
+          _vsc_cli_option_list_clone (error, command->option_list);
 
        if (error->occured) {
                VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
                goto failure;
        }
 
-       command_duplicate->next = NULL;
-
-       return command_duplicate;
+       return command_clone;
 
 failure:
-       _command_free (&command_duplicate);
+       _command_free (&command_clone);
 
        return NULL;
 }
 
 void
-_vsc_cli_command_list_append (struct VscError *error,
-                              struct VscCliCommand **command_list,
-                              const struct VscCliCommand *command)
+_vsc_cli_command_list_append_clone (struct VscError *error,
+                                    struct VscCliCommand **command_list,
+                                    const struct VscCliCommand *command)
 {
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
        VSC__ASSERT (command_list != NULL);
        VSC__ASSERT (command != NULL);
 
-       vsc_list_append
+       vsc_list_append_clone
           (error, (struct VscList **) command_list,
-           (struct VscList *) command,
-           (VscList_DuplicateFunction) _command_duplicate);
+           (struct VscList *) command, (VscList_CloneFunction) _command_clone);
 
        if (error->occured) {
                VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
@@ -207,8 +204,8 @@ vsc_cli_command_parse (struct VscError *error,
                                ++untagged_option_index;
                        }
 
-                       _vsc_cli_option_list_append (error, &command->option_list,
-                                                    &option);
+                       _vsc_cli_option_list_append_clone (error, &command->option_list,
+                                                          &option);
                        vsc_free (&option.string);
 
                        if (error->occured) {
index d4aa272..06ce157 100644 (file)
@@ -31,8 +31,8 @@ const struct VscCliCommandInfo *
 _vsc_cli_command_info_lookup (const char *command_name);
 
 void
-_vsc_cli_command_list_append (struct VscError *error,
-                              struct VscCliCommand **command_list,
-                              const struct VscCliCommand *command);
+_vsc_cli_command_list_append_clone (struct VscError *error,
+                                    struct VscCliCommand **command_list,
+                                    const struct VscCliCommand *command);
 
 #endif /* __VSC_CLI__COMMAND__PRIVATE_H__ */
index aa29081..1031dd8 100644 (file)
@@ -377,7 +377,7 @@ vsc_cli_parse_option_list (struct VscError *error, const char *input,
                                _vsc_cli_output_coloring = FALSE;
                        }
 
-                       _vsc_cli_option_list_append (error, &option_list, &option);
+                       _vsc_cli_option_list_append_clone (error, &option_list, &option);
                        vsc_free (&option.string);
 
                        if (error->occured) {
@@ -422,7 +422,7 @@ vsc_cli_parse_command_list (struct VscError *error, const char *input,
                }
 
                if (command_parsed) {
-                       _vsc_cli_command_list_append (error, &command_list, &command);
+                       _vsc_cli_command_list_append_clone (error, &command_list, &command);
                        vsc_cli_option_list_free (&command.option_list);
 
                        if (error->occured) {
index d063277..b1bf171 100644 (file)
@@ -437,24 +437,26 @@ _option_free (struct VscCliOption **option)
        vsc_free (option);
 }
 
-static struct VscCliOption * /* option_duplicate */
-_option_duplicate (struct VscError *error, const struct VscCliOption *option)
+static struct VscCliOption * /* option_clone */
+_option_clone (struct VscError *error, const struct VscCliOption *option)
 {
-       struct VscCliOption *option_duplicate = NULL;
+       struct VscCliOption *option_clone = NULL;
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
        VSC__ASSERT (option != NULL);
 
-       option_duplicate = vsc_memdup (error, option, sizeof (struct VscCliOption));
+       option_clone = vsc_memdup (error, option, sizeof (struct VscCliOption));
 
        if (error->occured) {
                VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
                goto failure;
        }
 
+       option_clone->next = NULL;
+
        if (option->string != NULL) {
-               option_duplicate->string = vsc_strdup (error, option->string);
+               option_clone->string = vsc_strdup (error, option->string);
        }
 
        if (error->occured) {
@@ -462,12 +464,10 @@ _option_duplicate (struct VscError *error, const struct VscCliOption *option)
                goto failure;
        }
 
-       option_duplicate->next = NULL;
-
-       return option_duplicate;
+       return option_clone;
 
 failure:
-       _option_free (&option_duplicate);
+       _option_free (&option_clone);
 
        return NULL;
 }
@@ -484,19 +484,18 @@ _option_match (struct VscList *item, void *match_data)
 }
 
 void
-_vsc_cli_option_list_append (struct VscError *error,
-                             struct VscCliOption **option_list,
-                             const struct VscCliOption *option)
+_vsc_cli_option_list_append_clone (struct VscError *error,
+                                   struct VscCliOption **option_list,
+                                   const struct VscCliOption *option)
 {
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
        VSC__ASSERT (option_list != NULL);
        VSC__ASSERT (option != NULL);
 
-       vsc_list_append
+       vsc_list_append_clone
           (error, (struct VscList **) option_list,
-           (struct VscList *) option,
-           (VscList_DuplicateFunction) _option_duplicate);
+           (struct VscList *) option, (VscList_CloneFunction) _option_clone);
 
        if (error->occured) {
                VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
@@ -513,19 +512,19 @@ vsc_cli_option_list_free (struct VscCliOption **option_list)
                       (VscList_FreeFunction) _option_free);
 }
 
-struct VscCliOption * /* option_list_duplicate */
-_vsc_cli_option_list_duplicate (struct VscError *error,
-                                const struct VscCliOption *option_list)
+struct VscCliOption * /* option_list_clone */
+_vsc_cli_option_list_clone (struct VscError *error,
+                            const struct VscCliOption *option_list)
 {
-       struct VscCliOption *option_list_duplicate = NULL;
+       struct VscCliOption *option_list_clone = NULL;
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
 
-       option_list_duplicate = (struct VscCliOption *)
-          vsc_list_duplicate
+       option_list_clone = (struct VscCliOption *)
+          vsc_list_clone
              (error, (struct VscList *) option_list,
-              (VscList_DuplicateFunction) _option_duplicate,
+              (VscList_CloneFunction) _option_clone,
               (VscList_FreeFunction) _option_free);
 
        if (error->occured) {
@@ -533,7 +532,7 @@ _vsc_cli_option_list_duplicate (struct VscError *error,
                return NULL;
        }
 
-       return option_list_duplicate;
+       return option_list_clone;
 }
 
 struct VscCliOption *
index 50806db..56116e0 100644 (file)
@@ -47,14 +47,14 @@ const struct VscCliOptionInfo *
 _vsc_cli_option_infos_lookup_untagged
    (const struct VscCliOptionInfo *option_infos, int position);
 
-struct VscCliOption * /* option_list_duplicate */
-_vsc_cli_option_list_duplicate (struct VscError *error,
-                                const struct VscCliOption *option_list);
+struct VscCliOption * /* option_list_clone */
+_vsc_cli_option_list_clone (struct VscError *error,
+                            const struct VscCliOption *option_list);
 
 void
-_vsc_cli_option_list_append (struct VscError *error,
-                             struct VscCliOption **option_list,
-                             const struct VscCliOption *option);
+_vsc_cli_option_list_append_clone (struct VscError *error,
+                                   struct VscCliOption **option_list,
+                                   const struct VscCliOption *option);
 
 struct VscCliOption *
 _vsc_cli_option_list_lookup (const struct VscCliOption *option_list,
index 98e68a4..ac0de43 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "token.h"
 
+// FIXME: remove char **token and return it instead
 void
 _vsc_cli_token_parse (struct VscError *error, const char *input, char **token,
                       const char **input_tail)
@@ -102,6 +103,7 @@ _vsc_cli_token_parse (struct VscError *error, const char *input, char **token,
                return;
        }
 
+       // FIXME: use strncpy?
        memcpy (*token, start, length);
        (*token)[length] = '\0';
 }
index 8a03e3a..f07b751 100644 (file)
@@ -35,14 +35,17 @@ struct VscList * /* last_item */
 vsc_list_get_last (struct VscList *list);
 
 void
-vsc_list_append (struct VscError *error, struct VscList **list,
-                 struct VscList *item,
-                 VscList_DuplicateFunction duplicate_function);
-
-struct VscList * /* list_duplicate */
-vsc_list_duplicate (struct VscError *error, const struct VscList *list,
-                    VscList_DuplicateFunction duplicate_function,
-                    VscList_FreeFunction free_function);
+vsc_list_append (struct VscList **list, struct VscList *item);
+
+void
+vsc_list_append_clone (struct VscError *error, struct VscList **list,
+                       struct VscList *item,
+                       VscList_CloneFunction clone_function);
+
+struct VscList * /* list_clone */
+vsc_list_clone (struct VscError *error, const struct VscList *list,
+                VscList_CloneFunction clone_function,
+                VscList_FreeFunction free_function);
 
 struct VscList * /* item */
 vsc_list_lookup (const struct VscList *list,
index 91f28ad..d890fd0 100644 (file)
@@ -78,8 +78,8 @@ struct VscList {
        struct VscList *next;
 };
 
-typedef struct VscList * (*VscList_DuplicateFunction) (struct VscError *error,
-                                                       struct VscList *item);
+typedef struct VscList * (*VscList_CloneFunction) (struct VscError *error,
+                                                   struct VscList *item);
 typedef int (*VscList_MatchFunction) (struct VscList *item, void *match_data);
 typedef int (*VscList_FreeFunction) (struct VscList **item);
 
index 48514c0..a1ea04e 100644 (file)
@@ -46,23 +46,45 @@ vsc_list_get_last (struct VscList *list)
 }
 
 /*!
- * @brief Appends a duplicate of the item to the list.
+ * @brief Appends the item to the list.
+ *
+ * The list takes ownership of the appended item.
+ */
+void
+vsc_list_append (struct VscList **list, struct VscList *item)
+{
+       VSC__ASSERT (list != NULL);
+       VSC__ASSERT (item != NULL);
+
+       if (*list == NULL) {
+               *list = item;
+               return;
+       }
+
+       vsc_list_get_last (*list)->next = item;
+}
+
+/*!
+ * @brief Appends a clone of the item to the list.
+ *
+ * The list takes ownership of the appended clone.
  *
  * If an error occurs then the list is untouched.
  */
 void
-vsc_list_append (struct VscError *error, struct VscList **list,
-                 struct VscList *item,
-                 VscList_DuplicateFunction duplicate_function)
+vsc_list_append_clone (struct VscError *error, struct VscList **list,
+                       struct VscList *item,
+                       VscList_CloneFunction clone_function)
 {
-       struct VscList *duplicate = NULL;
+       struct VscList *clone = NULL;
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (list != NULL);
        VSC__ASSERT (item != NULL);
-       VSC__ASSERT (duplicate_function != NULL);
+       VSC__ASSERT (clone_function != NULL);
 
-       duplicate = duplicate_function (error, item);
+       clone = clone_function (error, item);
 
        if (error->occured) {
                VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
@@ -70,39 +92,39 @@ vsc_list_append (struct VscError *error, struct VscList **list,
        }
 
        if (*list == NULL) {
-               *list = duplicate;
+               *list = clone;
                return;
        }
 
-       vsc_list_get_last (*list)->next = duplicate;
+       vsc_list_get_last (*list)->next = clone;
 }
 
-struct VscList * /* list_duplicate */
-vsc_list_duplicate (struct VscError *error, const struct VscList *list,
-                    VscList_DuplicateFunction duplicate_function,
-                    VscList_FreeFunction free_function)
+struct VscList * /* list_clone */
+vsc_list_clone (struct VscError *error, const struct VscList *list,
+                VscList_CloneFunction clone_function,
+                VscList_FreeFunction free_function)
 {
        struct VscList *item = NULL;
-       struct VscList *list_duplicate = NULL;
+       struct VscList *list_clone = NULL;
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
-       VSC__ASSERT (duplicate_function != NULL);
+       VSC__ASSERT (clone_function != NULL);
        VSC__ASSERT (free_function != NULL);
 
        for (item = (struct VscList *) list; item != NULL; item = item->next) {
-               vsc_list_append (error, &list_duplicate, item, duplicate_function);
+               vsc_list_append_clone (error, &list_clone, item, clone_function);
 
                if (error->occured) {
                        VSC__APPEND_ERROR0 (error, VSC__ERROR_CODE__TRACE);
 
-                       vsc_list_free (&list_duplicate, free_function);
+                       vsc_list_free (&list_clone, free_function);
 
                        return NULL;
                }
        }
 
-       return list_duplicate;
+       return list_clone;
 }
 
 /*!
@@ -171,7 +193,7 @@ vsc_list_remove (struct VscList **list, struct VscList *item,
 }
 
 /*!
- * @brief Recursively frees the list and set the list pointer to NULL.
+ * @brief Frees all items of the list and set the list pointer to NULL.
  */
 void
 vsc_list_free (struct VscList **list, VscList_FreeFunction free_function)