diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2011-02-23 17:57:08 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2011-03-03 21:38:52 +0200 |
commit | 5e0a163886f825983c5bfcd4181e6498b0f3e0f2 (patch) | |
tree | a2d6b359dc276c69a1e538ee435f19bd3a768c85 /timeline | |
parent | 962eec0440ad65a71c09a9e206e110c62d9de3c8 (diff) | |
download | mpv-5e0a163886f825983c5bfcd4181e6498b0f3e0f2.tar.bz2 mpv-5e0a163886f825983c5bfcd4181e6498b0f3e0f2.tar.xz |
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().
Diffstat (limited to 'timeline')
-rw-r--r-- | timeline/tl_matroska.c | 61 |
1 files changed, 58 insertions, 3 deletions
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 <stdlib.h> #include <stdbool.h> #include <inttypes.h> +#include <assert.h> +#include <dirent.h> #include <libavutil/common.h> #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); } } |