Skip to content

Commit

Permalink
Rename path_list to string_list
Browse files Browse the repository at this point in the history
The name path_list was correct for the first usage of that data structure,
but it really is a general-purpose string list.

$ perl -i -pe 's/path-list/string-list/g' $(git grep -l path-list)
$ perl -i -pe 's/path_list/string_list/g' $(git grep -l path_list)
$ git mv path-list.h string-list.h
$ git mv path-list.c string-list.c
$ perl -i -pe 's/has_path/has_string/g' $(git grep -l has_path)
$ perl -i -pe 's/path/string/g' string-list.[ch]
$ git mv Documentation/technical/api-path-list.txt \
	Documentation/technical/api-string-list.txt
$ perl -i -pe 's/strdup_paths/strdup_strings/g' $(git grep -l strdup_paths)

... and then fix all users of string-list to access the member "string"
instead of "path".

Documentation/technical/api-string-list.txt needed some rewrapping, too.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
dscho authored and gitster committed Jul 22, 2008
1 parent 51ef1da commit c455c87
Show file tree
Hide file tree
Showing 28 changed files with 556 additions and 553 deletions.
2 changes: 1 addition & 1 deletion Documentation/CodingGuidelines
Expand Up @@ -105,7 +105,7 @@ For C programs:


- Use the API. No, really. We have a strbuf (variable length - Use the API. No, really. We have a strbuf (variable length
string), several arrays with the ALLOC_GROW() macro, a string), several arrays with the ALLOC_GROW() macro, a
path_list for sorted string lists, a hash map (mapping struct string_list for sorted string lists, a hash map (mapping struct
objects) named "struct decorate", amongst other things. objects) named "struct decorate", amongst other things.


- When you come up with an API, document it. - When you come up with an API, document it.
Expand Down
126 changes: 0 additions & 126 deletions Documentation/technical/api-path-list.txt

This file was deleted.

128 changes: 128 additions & 0 deletions Documentation/technical/api-string-list.txt
@@ -0,0 +1,128 @@
string-list API
===============

The string_list API offers a data structure and functions to handle sorted
and unsorted string lists.

The 'string_list' struct used to be called 'path_list', but was renamed
because it is not specific to paths.

The caller:

. Allocates and clears a `struct string_list` variable.

. Initializes the members. You might want to set the flag `strdup_strings`
if the strings should be strdup()ed. For example, this is necessary
when you add something like git_path("..."), since that function returns
a static buffer that will change with the next call to git_path().
+
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
`nr` and `alloc` members in that case, too.

. Adds new items to the list, using `string_list_append` or
`string_list_insert`.

. 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
`string_list_lookup` for sorted lists.

. Can sort an unsorted list using `sort_string_list`.

. Finally it should free the list using `string_list_clear`.

Example:

----
struct string_list list;
int i;

memset(&list, 0, sizeof(struct string_list));
string_list_append("foo", &list);
string_list_append("bar", &list);
for (i = 0; i < list.nr; i++)
printf("%s\n", list.items[i].path)
----

NOTE: It is more efficient to build an unsorted list and sort it
afterwards, instead of building a sorted list (`O(n log n)` instead of
`O(n^2)`).
+
However, if you use the list to check if a certain string was added
already, you should not do that (using unsorted_string_list_has_string()),
because the complexity would be quadratic again (but with a worse factor).

Functions
---------

* General ones (works with sorted and unsorted lists as well)

`print_string_list`::

Dump a string_list to stdout, useful mainly for debugging purposes. It
can take an optional header argument and it writes out the
string-pointer pairs of the string_list, each one in its own line.

`string_list_clear`::

Free a string_list. The `string` pointer of the items will be freed in
case the `strdup_strings` member of the string_list is set. The second
parameter controls if the `util` pointer of the items should be freed
or not.

* Functions for sorted lists only

`string_list_has_string`::

Determine if the string_list has a given string or not.

`string_list_insert`::

Insert a new element to the string_list. The returned pointer can be
handy if you want to write something to the `util` pointer of the
string_list_item containing the just added string.
+
Since this function uses xrealloc() (which die()s if it fails) if the
list needs to grow, it is safe not to check the pointer. I.e. you may
write `string_list_insert(...)->util = ...;`.

`string_list_lookup`::

Look up a given string in the string_list, returning the containing
string_list_item. If the string is not found, NULL is returned.

* Functions for unsorted lists only

`string_list_append`::

Append a new string to the end of the string_list.

`sort_string_list`::

Make an unsorted list sorted.

`unsorted_string_list_has_string`::

It's like `string_list_has_string()` but for unsorted lists.
+
This function needs to look through all items, as opposed to its
counterpart for sorted lists, which performs a binary search.

Data structures
---------------

* `struct string_list_item`

Represents an item of the list. The `path` member is a pointer to the
string, and you may use the `util` member for any purpose, if you want.

* `struct string_list`

Represents the list itself.

. The array of items are available via the `items` member.
. The `nr` member contains the number of items stored in the list.
. The `alloc` member is used to avoid reallocating at every insertion.
You should not tamper with it.
. Setting the `strdup_strings` member to 1 will strdup() the strings
before adding them, see above.
4 changes: 2 additions & 2 deletions Makefile
Expand Up @@ -356,7 +356,7 @@ LIB_H += pack-refs.h
LIB_H += pack-revindex.h LIB_H += pack-revindex.h
LIB_H += parse-options.h LIB_H += parse-options.h
LIB_H += patch-ids.h LIB_H += patch-ids.h
LIB_H += path-list.h LIB_H += string-list.h
LIB_H += pkt-line.h LIB_H += pkt-line.h
LIB_H += progress.h LIB_H += progress.h
LIB_H += quote.h LIB_H += quote.h
Expand Down Expand Up @@ -437,7 +437,7 @@ LIB_OBJS += pager.o
LIB_OBJS += parse-options.o LIB_OBJS += parse-options.o
LIB_OBJS += patch-delta.o LIB_OBJS += patch-delta.o
LIB_OBJS += patch-ids.o LIB_OBJS += patch-ids.o
LIB_OBJS += path-list.o LIB_OBJS += string-list.o
LIB_OBJS += path.o LIB_OBJS += path.o
LIB_OBJS += pkt-line.o LIB_OBJS += pkt-line.o
LIB_OBJS += pretty.o LIB_OBJS += pretty.o
Expand Down
16 changes: 8 additions & 8 deletions builtin-apply.c
Expand Up @@ -12,7 +12,7 @@
#include "blob.h" #include "blob.h"
#include "delta.h" #include "delta.h"
#include "builtin.h" #include "builtin.h"
#include "path-list.h" #include "string-list.h"


/* /*
* --check turns on checking that the working tree matches the * --check turns on checking that the working tree matches the
Expand Down Expand Up @@ -194,7 +194,7 @@ struct image {
* the case where more than one patches touch the same file. * the case where more than one patches touch the same file.
*/ */


static struct path_list fn_table; static struct string_list fn_table;


static uint32_t hash_line(const char *cp, size_t len) static uint32_t hash_line(const char *cp, size_t len)
{ {
Expand Down Expand Up @@ -2250,12 +2250,12 @@ static int read_file_or_gitlink(struct cache_entry *ce, struct strbuf *buf)


static struct patch *in_fn_table(const char *name) static struct patch *in_fn_table(const char *name)
{ {
struct path_list_item *item; struct string_list_item *item;


if (name == NULL) if (name == NULL)
return NULL; return NULL;


item = path_list_lookup(name, &fn_table); item = string_list_lookup(name, &fn_table);
if (item != NULL) if (item != NULL)
return (struct patch *)item->util; return (struct patch *)item->util;


Expand All @@ -2264,15 +2264,15 @@ static struct patch *in_fn_table(const char *name)


static void add_to_fn_table(struct patch *patch) static void add_to_fn_table(struct patch *patch)
{ {
struct path_list_item *item; struct string_list_item *item;


/* /*
* Always add new_name unless patch is a deletion * Always add new_name unless patch is a deletion
* This should cover the cases for normal diffs, * This should cover the cases for normal diffs,
* file creations and copies * file creations and copies
*/ */
if (patch->new_name != NULL) { if (patch->new_name != NULL) {
item = path_list_insert(patch->new_name, &fn_table); item = string_list_insert(patch->new_name, &fn_table);
item->util = patch; item->util = patch;
} }


Expand All @@ -2281,7 +2281,7 @@ static void add_to_fn_table(struct patch *patch)
* later chunks shouldn't patch old names * later chunks shouldn't patch old names
*/ */
if ((patch->new_name == NULL) || (patch->is_rename)) { if ((patch->new_name == NULL) || (patch->is_rename)) {
item = path_list_insert(patch->old_name, &fn_table); item = string_list_insert(patch->old_name, &fn_table);
item->util = (struct patch *) -1; item->util = (struct patch *) -1;
} }
} }
Expand Down Expand Up @@ -3051,7 +3051,7 @@ static int apply_patch(int fd, const char *filename, int options)
int skipped_patch = 0; int skipped_patch = 0;


/* FIXME - memory leak when using multiple patch files as inputs */ /* FIXME - memory leak when using multiple patch files as inputs */
memset(&fn_table, 0, sizeof(struct path_list)); memset(&fn_table, 0, sizeof(struct string_list));
strbuf_init(&buf, 0); strbuf_init(&buf, 0);
patch_input_file = filename; patch_input_file = filename;
read_patch_file(&buf, fd); read_patch_file(&buf, fd);
Expand Down
10 changes: 5 additions & 5 deletions builtin-blame.c
Expand Up @@ -16,7 +16,7 @@
#include "quote.h" #include "quote.h"
#include "xdiff-interface.h" #include "xdiff-interface.h"
#include "cache-tree.h" #include "cache-tree.h"
#include "path-list.h" #include "string-list.h"
#include "mailmap.h" #include "mailmap.h"
#include "parse-options.h" #include "parse-options.h"


Expand All @@ -40,7 +40,7 @@ static int blank_boundary;
static int incremental; static int incremental;
static int cmd_is_annotate; static int cmd_is_annotate;
static int xdl_opts = XDF_NEED_MINIMAL; static int xdl_opts = XDF_NEED_MINIMAL;
static struct path_list mailmap; static struct string_list mailmap;


#ifndef DEBUG #ifndef DEBUG
#define DEBUG 0 #define DEBUG 0
Expand Down Expand Up @@ -1926,7 +1926,7 @@ static void sanity_check_refcnt(struct scoreboard *sb)
* Used for the command line parsing; check if the path exists * Used for the command line parsing; check if the path exists
* in the working tree. * in the working tree.
*/ */
static int has_path_in_work_tree(const char *path) static int has_string_in_work_tree(const char *path)
{ {
struct stat st; struct stat st;
return !lstat(path, &st); return !lstat(path, &st);
Expand Down Expand Up @@ -2390,14 +2390,14 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
if (argc < 2) if (argc < 2)
usage_with_options(blame_opt_usage, options); usage_with_options(blame_opt_usage, options);
path = add_prefix(prefix, argv[argc - 1]); path = add_prefix(prefix, argv[argc - 1]);
if (argc == 3 && !has_path_in_work_tree(path)) { /* (2b) */ if (argc == 3 && !has_string_in_work_tree(path)) { /* (2b) */
path = add_prefix(prefix, argv[1]); path = add_prefix(prefix, argv[1]);
argv[1] = argv[2]; argv[1] = argv[2];
} }
argv[argc - 1] = "--"; argv[argc - 1] = "--";


setup_work_tree(); setup_work_tree();
if (!has_path_in_work_tree(path)) if (!has_string_in_work_tree(path))
die("cannot stat path %s: %s", path, strerror(errno)); die("cannot stat path %s: %s", path, strerror(errno));
} }


Expand Down

0 comments on commit c455c87

Please sign in to comment.