mirror of https://github.com/mpv-player/mpv
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().
This commit is contained in:
parent
962eec0440
commit
5e0a163886
1
Makefile
1
Makefile
|
@ -423,7 +423,6 @@ SRCS_COMMON = asxparser.c \
|
||||||
libmpdemux/yuv4mpeg.c \
|
libmpdemux/yuv4mpeg.c \
|
||||||
libmpdemux/yuv4mpeg_ratio.c \
|
libmpdemux/yuv4mpeg_ratio.c \
|
||||||
libvo/osd.c \
|
libvo/osd.c \
|
||||||
osdep/findfiles.c \
|
|
||||||
osdep/numcores.c \
|
osdep/numcores.c \
|
||||||
osdep/$(GETCH) \
|
osdep/$(GETCH) \
|
||||||
osdep/$(TIMER) \
|
osdep/$(TIMER) \
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
#define ROUND(x) ((int)((x) < 0 ? (x) - 0.5 : (x) + 0.5))
|
#define ROUND(x) ((int)((x) < 0 ? (x) - 0.5 : (x) + 0.5))
|
||||||
|
|
||||||
|
#define MP_TALLOC_ELEMS(p) (talloc_get_size(p) / sizeof((p)[0]))
|
||||||
|
|
||||||
extern const char *mplayer_version;
|
extern const char *mplayer_version;
|
||||||
|
|
||||||
#endif /* MPLAYER_MPCOMMON_H */
|
#endif /* MPLAYER_MPCOMMON_H */
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of MPlayer.
|
|
||||||
*
|
|
||||||
* MPlayer is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* MPlayer is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "talloc.h"
|
|
||||||
#include "path.h"
|
|
||||||
#include "bstr.h"
|
|
||||||
|
|
||||||
char **find_files(const char *original_file, const char *suffix,
|
|
||||||
int *num_results_ptr)
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
struct dirent *ep;
|
|
||||||
char ***names_by_matchlen = talloc_array(tmpmem, char **,
|
|
||||||
strlen(basename) + 1);
|
|
||||||
memset(names_by_matchlen, 0, talloc_get_size(names_by_matchlen));
|
|
||||||
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 = talloc_get_size(names_by_matchlen[matchlen]) /
|
|
||||||
sizeof(char **);
|
|
||||||
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);
|
|
||||||
*num_results_ptr = num_results;
|
|
||||||
return results;
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
char **find_files(const char *original_file, const char *suffix,
|
|
||||||
int *num_results_ptr);
|
|
|
@ -19,6 +19,8 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <dirent.h>
|
||||||
#include <libavutil/common.h>
|
#include <libavutil/common.h>
|
||||||
|
|
||||||
#include "talloc.h"
|
#include "talloc.h"
|
||||||
|
@ -26,7 +28,60 @@
|
||||||
#include "mp_core.h"
|
#include "mp_core.h"
|
||||||
#include "mp_msg.h"
|
#include "mp_msg.h"
|
||||||
#include "libmpdemux/demuxer.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,
|
static int find_ordered_chapter_sources(struct MPContext *mpctx,
|
||||||
struct content_source *sources,
|
struct content_source *sources,
|
||||||
|
@ -44,8 +99,8 @@ static int find_ordered_chapter_sources(struct MPContext *mpctx,
|
||||||
} else {
|
} else {
|
||||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, "Will scan other files in the "
|
mp_msg(MSGT_CPLAYER, MSGL_INFO, "Will scan other files in the "
|
||||||
"same directory to find referenced sources.\n");
|
"same directory to find referenced sources.\n");
|
||||||
filenames = find_files(mpctx->demuxer->filename, ".mkv",
|
filenames = find_files(mpctx->demuxer->filename, ".mkv");
|
||||||
&num_filenames);
|
num_filenames = MP_TALLOC_ELEMS(filenames);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue