From 0b4c78339608179841838798517485208cee08a2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 8 Oct 2008 06:55:10 +0200 Subject: dirvec: moved code to dirvec.c Having all functions as static (non-inline) functions generates GCC warnings, and duplicates binary code across several object files. Most of dirvec's methods are too complex for becoming inline functions. Move them all to dirvec.c and publish the prototypes in dirvec.h. --- src/dirvec.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/dirvec.c (limited to 'src/dirvec.c') diff --git a/src/dirvec.c b/src/dirvec.c new file mode 100644 index 000000000..f84aa37fc --- /dev/null +++ b/src/dirvec.c @@ -0,0 +1,69 @@ +#include "dirvec.h" +#include "os_compat.h" +#include "utils.h" + +static size_t dv_size(struct dirvec *dv) +{ + return dv->nr * sizeof(Directory *); +} + +/* Only used for sorting/searching a dirvec, not general purpose compares */ +static int dirvec_cmp(const void *d1, const void *d2) +{ + const Directory *a = ((const Directory * const *)d1)[0]; + const Directory *b = ((const Directory * const *)d2)[0]; + return strcmp(a->path, b->path); +} + +void dirvec_sort(struct dirvec *dv) +{ + qsort(dv->base, dv->nr, sizeof(Directory *), dirvec_cmp); +} + +Directory *dirvec_find(struct dirvec *dv, const char *path) +{ + int i; + + for (i = dv->nr; --i >= 0; ) + if (!strcmp(dv->base[i]->path, path)) + return dv->base[i]; + return NULL; +} + +int dirvec_delete(struct dirvec *dv, Directory *del) +{ + int i; + + for (i = dv->nr; --i >= 0; ) { + if (dv->base[i] != del) + continue; + /* we _don't_ call freeDirectory() here */ + if (!--dv->nr) { + free(dv->base); + dv->base = NULL; + } else { + memmove(&dv->base[i], &dv->base[i + 1], + (dv->nr - i + 1) * sizeof(Directory *)); + dv->base = xrealloc(dv->base, dv_size(dv)); + } + return i; + } + + return -1; /* not found */ +} + +void dirvec_add(struct dirvec *dv, Directory *add) +{ + ++dv->nr; + dv->base = xrealloc(dv->base, dv_size(dv)); + dv->base[dv->nr - 1] = add; +} + +void dirvec_destroy(struct dirvec *dv) +{ + if (dv->base) { + free(dv->base); + dv->base = NULL; + } + dv->nr = 0; +} -- cgit v1.2.3 From c84c73df00e5e1710d84fdb4be6352d849da8f2b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 8 Oct 2008 10:49:05 +0200 Subject: directory: converted typedef Directory to struct directory The struct can be forward-declared by other headers, which relaxes the header dependencies. --- src/dirvec.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'src/dirvec.c') diff --git a/src/dirvec.c b/src/dirvec.c index f84aa37fc..9226fca74 100644 --- a/src/dirvec.c +++ b/src/dirvec.c @@ -1,26 +1,27 @@ #include "dirvec.h" +#include "directory.h" #include "os_compat.h" #include "utils.h" static size_t dv_size(struct dirvec *dv) { - return dv->nr * sizeof(Directory *); + return dv->nr * sizeof(struct directory *); } /* Only used for sorting/searching a dirvec, not general purpose compares */ static int dirvec_cmp(const void *d1, const void *d2) { - const Directory *a = ((const Directory * const *)d1)[0]; - const Directory *b = ((const Directory * const *)d2)[0]; + const struct directory *a = ((const struct directory * const *)d1)[0]; + const struct directory *b = ((const struct directory * const *)d2)[0]; return strcmp(a->path, b->path); } void dirvec_sort(struct dirvec *dv) { - qsort(dv->base, dv->nr, sizeof(Directory *), dirvec_cmp); + qsort(dv->base, dv->nr, sizeof(struct directory *), dirvec_cmp); } -Directory *dirvec_find(struct dirvec *dv, const char *path) +struct directory *dirvec_find(struct dirvec *dv, const char *path) { int i; @@ -30,7 +31,7 @@ Directory *dirvec_find(struct dirvec *dv, const char *path) return NULL; } -int dirvec_delete(struct dirvec *dv, Directory *del) +int dirvec_delete(struct dirvec *dv, struct directory *del) { int i; @@ -43,7 +44,7 @@ int dirvec_delete(struct dirvec *dv, Directory *del) dv->base = NULL; } else { memmove(&dv->base[i], &dv->base[i + 1], - (dv->nr - i + 1) * sizeof(Directory *)); + (dv->nr - i + 1) * sizeof(struct directory *)); dv->base = xrealloc(dv->base, dv_size(dv)); } return i; @@ -52,7 +53,7 @@ int dirvec_delete(struct dirvec *dv, Directory *del) return -1; /* not found */ } -void dirvec_add(struct dirvec *dv, Directory *add) +void dirvec_add(struct dirvec *dv, struct directory *add) { ++dv->nr; dv->base = xrealloc(dv->base, dv_size(dv)); -- cgit v1.2.3 From a76121ea81f452c0d5e21d6a2fb6f200a80faf7b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 8 Oct 2008 11:07:58 +0200 Subject: directory: eliminate CamelCase CamelCase is ugly, rename the functions. [ew: "directory_get_directory" was too confusing, using "directory_get_subdir" instead (old function was named "getSubDirectory")] --- src/dirvec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/dirvec.c') diff --git a/src/dirvec.c b/src/dirvec.c index 9226fca74..3ec5b7af1 100644 --- a/src/dirvec.c +++ b/src/dirvec.c @@ -38,7 +38,7 @@ int dirvec_delete(struct dirvec *dv, struct directory *del) for (i = dv->nr; --i >= 0; ) { if (dv->base[i] != del) continue; - /* we _don't_ call freeDirectory() here */ + /* we _don't_ call directory_free() here */ if (!--dv->nr) { free(dv->base); dv->base = NULL; -- cgit v1.2.3 From f2052e7e2ffb5b8ecd15d96a766b5a162a39b2af Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 9 Oct 2008 15:24:34 +0200 Subject: dirvec: constant pointers in dirvec_find() dirvec_find() does not modify the object, thus it should get a const pointer. --- src/dirvec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/dirvec.c') diff --git a/src/dirvec.c b/src/dirvec.c index 3ec5b7af1..fdfbb3434 100644 --- a/src/dirvec.c +++ b/src/dirvec.c @@ -21,7 +21,7 @@ void dirvec_sort(struct dirvec *dv) qsort(dv->base, dv->nr, sizeof(struct directory *), dirvec_cmp); } -struct directory *dirvec_find(struct dirvec *dv, const char *path) +struct directory *dirvec_find(const struct dirvec *dv, const char *path) { int i; -- cgit v1.2.3