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:
Uoti Urpala 2011-02-23 17:57:08 +02:00
parent 962eec0440
commit 5e0a163886
5 changed files with 60 additions and 83 deletions

View File

@ -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) \

View File

@ -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 */

View File

@ -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;
}

View File

@ -1,2 +0,0 @@
char **find_files(const char *original_file, const char *suffix,
int *num_results_ptr);

View File

@ -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);
} }
} }