Commit 4cfd356e authored by Max Kellermann's avatar Max Kellermann

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.
parent b42974ee
...@@ -132,6 +132,7 @@ mpd_SOURCES = \ ...@@ -132,6 +132,7 @@ mpd_SOURCES = \
decoder_control.c \ decoder_control.c \
decoder_api.c \ decoder_api.c \
directory.c \ directory.c \
dirvec.c \
decoder_list.c \ decoder_list.c \
inputStream.c \ inputStream.c \
inputStream_file.c \ inputStream_file.c \
......
#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;
}
...@@ -2,72 +2,15 @@ ...@@ -2,72 +2,15 @@
#define DIRVEC_H #define DIRVEC_H
#include "directory.h" #include "directory.h"
#include "os_compat.h"
#include "utils.h"
static size_t dv_size(struct dirvec *dv) void dirvec_sort(struct dirvec *dv);
{
return dv->nr * sizeof(Directory *);
}
/* Only used for sorting/searching a dirvec, not general purpose compares */ Directory *dirvec_find(struct dirvec *dv, const char *path);
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);
}
static void dirvec_sort(struct dirvec *dv) int dirvec_delete(struct dirvec *dv, Directory *del);
{
qsort(dv->base, dv->nr, sizeof(Directory *), dirvec_cmp);
}
static Directory *dirvec_find(struct dirvec *dv, const char *path) void dirvec_add(struct dirvec *dv, Directory *add);
{
int i;
for (i = dv->nr; --i >= 0; ) void dirvec_destroy(struct dirvec *dv);
if (!strcmp(dv->base[i]->path, path))
return dv->base[i];
return NULL;
}
static 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 */
}
static void dirvec_add(struct dirvec *dv, Directory *add)
{
++dv->nr;
dv->base = xrealloc(dv->base, dv_size(dv));
dv->base[dv->nr - 1] = add;
}
static void dirvec_destroy(struct dirvec *dv)
{
if (dv->base) {
free(dv->base);
dv->base = NULL;
}
dv->nr = 0;
}
#endif /* DIRVEC_H */ #endif /* DIRVEC_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment