From 5e0a163886f825983c5bfcd4181e6498b0f3e0f2 Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Wed, 23 Feb 2011 17:57:08 +0200 Subject: tl_matroska.c: move the find_files() function here Move the find_files() function from findfiles.c to tl_matroska.c. Delete the findfiles.c file. Add a check against opendir() failure in find_files(). --- timeline/tl_matroska.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) (limited to 'timeline') diff --git a/timeline/tl_matroska.c b/timeline/tl_matroska.c index 3c4b34d19d..46d0e33a45 100644 --- a/timeline/tl_matroska.c +++ b/timeline/tl_matroska.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include #include "talloc.h" @@ -26,7 +28,60 @@ #include "mp_core.h" #include "mp_msg.h" #include "libmpdemux/demuxer.h" -#include "osdep/findfiles.h" +#include "path.h" +#include "bstr.h" +#include "mpcommon.h" + +static char **find_files(const char *original_file, const char *suffix) +{ + void *tmpmem = talloc_new(NULL); + char *basename = mp_basename(original_file); + struct bstr directory = mp_dirname(original_file); + char **results = talloc_size(NULL, 0); + char *dir_zero = bstrdup0(tmpmem, directory); + DIR *dp = opendir(dir_zero); + if (!dp) { + talloc_free(tmpmem); + return results; + } + struct dirent *ep; + char ***names_by_matchlen = talloc_zero_array(tmpmem, char **, + strlen(basename) + 1); + int num_results = 0; + while ((ep = readdir(dp))) { + int suffix_offset = strlen(ep->d_name) - strlen(suffix); + // name must end with suffix + if (suffix_offset < 0 || strcmp(ep->d_name + suffix_offset, suffix)) + continue; + // don't list the original name + if (!strcmp(ep->d_name, basename)) + continue; + + char *name = mp_path_join(results, directory, BSTR(ep->d_name)); + char *s1 = ep->d_name; + char *s2 = basename; + int matchlen = 0; + while (*s1 && *s1++ == *s2++) + matchlen++; + int oldcount = MP_TALLOC_ELEMS(names_by_matchlen[matchlen]); + names_by_matchlen[matchlen] = talloc_realloc(names_by_matchlen, + names_by_matchlen[matchlen], + char *, oldcount + 1); + names_by_matchlen[matchlen][oldcount] = name; + num_results++; + } + closedir(dp); + results = talloc_realloc(NULL, results, char *, num_results); + char **resptr = results; + for (int i = strlen(basename); i >= 0; i--) { + char **p = names_by_matchlen[i]; + for (int j = 0; j < talloc_get_size(p) / sizeof(char *); j++) + *resptr++ = p[j]; + } + assert(resptr == results + num_results); + talloc_free(tmpmem); + return results; +} static int find_ordered_chapter_sources(struct MPContext *mpctx, struct content_source *sources, @@ -44,8 +99,8 @@ static int find_ordered_chapter_sources(struct MPContext *mpctx, } else { mp_msg(MSGT_CPLAYER, MSGL_INFO, "Will scan other files in the " "same directory to find referenced sources.\n"); - filenames = find_files(mpctx->demuxer->filename, ".mkv", - &num_filenames); + filenames = find_files(mpctx->demuxer->filename, ".mkv"); + num_filenames = MP_TALLOC_ELEMS(filenames); } } -- cgit v1.2.3