зеркало из https://github.com/microsoft/git.git
string_list: add function string_list_append_nodup()
Add a new function that appends a string to a string_list without copying it. This can be used to pass ownership of an already-copied string to a string_list that has strdup_strings set. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
0ce9864461
Коммит
e448fed8e6
|
@ -20,8 +20,8 @@ If you need something advanced, you can manually malloc() the `items`
|
||||||
member (you need this if you add things later) and you should set the
|
member (you need this if you add things later) and you should set the
|
||||||
`nr` and `alloc` members in that case, too.
|
`nr` and `alloc` members in that case, too.
|
||||||
|
|
||||||
. Adds new items to the list, using `string_list_append` or
|
. Adds new items to the list, using `string_list_append`,
|
||||||
`string_list_insert`.
|
`string_list_append_nodup`, or `string_list_insert`.
|
||||||
|
|
||||||
. Can check if a string is in the list using `string_list_has_string` or
|
. Can check if a string is in the list using `string_list_has_string` or
|
||||||
`unsorted_string_list_has_string` and get it from the list using
|
`unsorted_string_list_has_string` and get it from the list using
|
||||||
|
@ -100,7 +100,18 @@ write `string_list_insert(...)->util = ...;`.
|
||||||
|
|
||||||
`string_list_append`::
|
`string_list_append`::
|
||||||
|
|
||||||
Append a new string to the end of the string_list.
|
Append a new string to the end of the string_list. If
|
||||||
|
`strdup_string` is set, then the string argument is copied;
|
||||||
|
otherwise the new `string_list_entry` refers to the input
|
||||||
|
string.
|
||||||
|
|
||||||
|
`string_list_append_nodup`::
|
||||||
|
|
||||||
|
Append a new string to the end of the string_list. The new
|
||||||
|
`string_list_entry` always refers to the input string, even if
|
||||||
|
`strdup_string` is set. This function can be used to hand
|
||||||
|
ownership of a malloc()ed string to a `string_list` that has
|
||||||
|
`strdup_string` set.
|
||||||
|
|
||||||
`sort_string_list`::
|
`sort_string_list`::
|
||||||
|
|
||||||
|
|
|
@ -148,13 +148,23 @@ void print_string_list(const struct string_list *p, const char *text)
|
||||||
printf("%s:%p\n", p->items[i].string, p->items[i].util);
|
printf("%s:%p\n", p->items[i].string, p->items[i].util);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct string_list_item *string_list_append(struct string_list *list, const char *string)
|
struct string_list_item *string_list_append_nodup(struct string_list *list,
|
||||||
|
char *string)
|
||||||
{
|
{
|
||||||
|
struct string_list_item *retval;
|
||||||
ALLOC_GROW(list->items, list->nr + 1, list->alloc);
|
ALLOC_GROW(list->items, list->nr + 1, list->alloc);
|
||||||
list->items[list->nr].string =
|
retval = &list->items[list->nr++];
|
||||||
list->strdup_strings ? xstrdup(string) : (char *)string;
|
retval->string = string;
|
||||||
list->items[list->nr].util = NULL;
|
retval->util = NULL;
|
||||||
return list->items + list->nr++;
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct string_list_item *string_list_append(struct string_list *list,
|
||||||
|
const char *string)
|
||||||
|
{
|
||||||
|
return string_list_append_nodup(
|
||||||
|
list,
|
||||||
|
list->strdup_strings ? xstrdup(string) : (char *)string);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmp_items(const void *a, const void *b)
|
static int cmp_items(const void *a, const void *b)
|
||||||
|
|
|
@ -29,6 +29,7 @@ int for_each_string_list(struct string_list *list,
|
||||||
#define for_each_string_list_item(item,list) \
|
#define for_each_string_list_item(item,list) \
|
||||||
for (item = (list)->items; item < (list)->items + (list)->nr; ++item)
|
for (item = (list)->items; item < (list)->items + (list)->nr; ++item)
|
||||||
|
|
||||||
|
|
||||||
/* Use these functions only on sorted lists: */
|
/* Use these functions only on sorted lists: */
|
||||||
int string_list_has_string(const struct string_list *list, const char *string);
|
int string_list_has_string(const struct string_list *list, const char *string);
|
||||||
int string_list_find_insert_index(const struct string_list *list, const char *string,
|
int string_list_find_insert_index(const struct string_list *list, const char *string,
|
||||||
|
@ -38,11 +39,28 @@ struct string_list_item *string_list_insert_at_index(struct string_list *list,
|
||||||
int insert_at, const char *string);
|
int insert_at, const char *string);
|
||||||
struct string_list_item *string_list_lookup(struct string_list *list, const char *string);
|
struct string_list_item *string_list_lookup(struct string_list *list, const char *string);
|
||||||
|
|
||||||
|
|
||||||
/* Use these functions only on unsorted lists: */
|
/* Use these functions only on unsorted lists: */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add string to the end of list. If list->strdup_string is set, then
|
||||||
|
* string is copied; otherwise the new string_list_entry refers to the
|
||||||
|
* input string.
|
||||||
|
*/
|
||||||
struct string_list_item *string_list_append(struct string_list *list, const char *string);
|
struct string_list_item *string_list_append(struct string_list *list, const char *string);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Like string_list_append(), except string is never copied. When
|
||||||
|
* list->strdup_strings is set, this function can be used to hand
|
||||||
|
* ownership of a malloc()ed string to list without making an extra
|
||||||
|
* copy.
|
||||||
|
*/
|
||||||
|
struct string_list_item *string_list_append_nodup(struct string_list *list, char *string);
|
||||||
|
|
||||||
void sort_string_list(struct string_list *list);
|
void sort_string_list(struct string_list *list);
|
||||||
int unsorted_string_list_has_string(struct string_list *list, const char *string);
|
int unsorted_string_list_has_string(struct string_list *list, const char *string);
|
||||||
struct string_list_item *unsorted_string_list_lookup(struct string_list *list,
|
struct string_list_item *unsorted_string_list_lookup(struct string_list *list,
|
||||||
const char *string);
|
const char *string);
|
||||||
|
|
||||||
void unsorted_string_list_delete_item(struct string_list *list, int i, int free_util);
|
void unsorted_string_list_delete_item(struct string_list *list, int i, int free_util);
|
||||||
#endif /* STRING_LIST_H */
|
#endif /* STRING_LIST_H */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче