From d4bdd0473d6f43132257c9fb3848d829755167a3 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 5 Nov 2012 17:02:04 +0100 Subject: Rename directories, move files (step 1 of 2) (does not compile) Tis drops the silly lib prefixes, and attempts to organize the tree in a more logical way. Make the top-level directory less cluttered as well. Renames the following directories: libaf -> audio/filter libao2 -> audio/out libvo -> video/out libmpdemux -> demux Split libmpcodecs: vf* -> video/filter vd*, dec_video.* -> video/decode mp_image*, img_format*, ... -> video/ ad*, dec_audio.* -> audio/decode libaf/format.* is moved to audio/ - this is similar to how mp_image.* is located in video/. Move most top-level .c/.h files to core. (talloc.c/.h is left on top- level, because it's external.) Park some of the more annoying files in compat/. Some of these are relicts from the time mplayer used ffmpeg internals. sub/ is not split, because it's too much of a mess (subtitle code is mixed with OSD display and rendering). Maybe the organization of core is not ideal: it mixes playback core (like mplayer.c) and utility helpers (like bstr.c/h). Should the need arise, the playback core will be moved somewhere else, while core contains all helper and common code. --- core/path.c | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 core/path.c (limited to 'core/path.c') diff --git a/core/path.c b/core/path.c new file mode 100644 index 0000000000..6002189225 --- /dev/null +++ b/core/path.c @@ -0,0 +1,207 @@ +/* + * Get path to config dir/file. + * + * Return Values: + * Returns the pointer to the ALLOCATED buffer containing the + * zero terminated path string. This buffer has to be FREED + * by the caller. + * + * 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 +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "mp_msg.h" +#include "path.h" + +#ifdef CONFIG_MACOSX_BUNDLE +#include +#include +#elif defined(__MINGW32__) +#include +#elif defined(__CYGWIN__) +#include +#include +#endif + +#include "talloc.h" + +#include "osdep/io.h" + +char *get_path(const char *filename){ + char *homedir; + char *buff; +#ifdef __MINGW32__ + static char *config_dir = "/mpv"; +#else + static char *config_dir = "/.mpv"; +#endif +#if defined(__MINGW32__) || defined(__CYGWIN__) + char exedir[260]; +#endif + int len; +#ifdef CONFIG_MACOSX_BUNDLE + struct stat dummy; + CFIndex maxlen=256; + CFURLRef res_url_ref=NULL; + CFURLRef bdl_url_ref=NULL; + char *res_url_path = NULL; + char *bdl_url_path = NULL; +#endif + + if ((homedir = getenv("MPV_HOME")) != NULL) + config_dir = ""; + else if ((homedir = getenv("HOME")) == NULL) +#if defined(__MINGW32__) || defined(__CYGWIN__) + /* Hack to get fonts etc. loaded outside of Cygwin environment. */ + { + int i,imax=0; + len = (int)GetModuleFileNameA(NULL, exedir, 260); + for (i=0; i < len; i++) + if (exedir[i] =='\\') + {exedir[i]='/'; imax=i;} + exedir[imax]='\0'; + homedir = exedir; + } +#else + return NULL; +#endif + len = strlen(homedir) + strlen(config_dir) + 1; + if (filename == NULL) { + if ((buff = malloc(len)) == NULL) + return NULL; + sprintf(buff, "%s%s", homedir, config_dir); + } else { + len += strlen(filename) + 1; + if ((buff = malloc(len)) == NULL) + return NULL; + sprintf(buff, "%s%s/%s", homedir, config_dir, filename); + } + +#ifdef CONFIG_MACOSX_BUNDLE + if (stat(buff, &dummy)) { + + res_url_ref=CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); + bdl_url_ref=CFBundleCopyBundleURL(CFBundleGetMainBundle()); + + if (res_url_ref&&bdl_url_ref) { + + res_url_path=malloc(maxlen); + bdl_url_path=malloc(maxlen); + + while (!CFURLGetFileSystemRepresentation(res_url_ref, true, res_url_path, maxlen)) { + maxlen*=2; + res_url_path=realloc(res_url_path, maxlen); + } + CFRelease(res_url_ref); + + while (!CFURLGetFileSystemRepresentation(bdl_url_ref, true, bdl_url_path, maxlen)) { + maxlen*=2; + bdl_url_path=realloc(bdl_url_path, maxlen); + } + CFRelease(bdl_url_ref); + + if (strcmp(res_url_path, bdl_url_path) == 0) + res_url_path = NULL; + } + + if (res_url_path&&filename) { + if ((strlen(filename)+strlen(res_url_path)+2)>maxlen) { + maxlen=strlen(filename)+strlen(res_url_path)+2; + } + free(buff); + buff = malloc(maxlen); + strcpy(buff, res_url_path); + + strcat(buff,"/"); + strcat(buff, filename); + } + } +#endif + mp_msg(MSGT_GLOBAL,MSGL_V,"get_path('%s') -> '%s'\n",filename,buff); + return buff; +} + +char *mp_basename(const char *path) +{ + char *s; + +#if HAVE_DOS_PATHS + s = strrchr(path, '\\'); + if (s) + path = s + 1; + s = strrchr(path, ':'); + if (s) + path = s + 1; +#endif + s = strrchr(path, '/'); + return s ? s + 1 : (char *)path; +} + +struct bstr mp_dirname(const char *path) +{ + struct bstr ret = {(uint8_t *)path, mp_basename(path) - path}; + if (ret.len == 0) + return bstr0("."); + return ret; +} + +char *mp_path_join(void *talloc_ctx, struct bstr p1, struct bstr p2) +{ + if (p1.len == 0) + return bstrdup0(talloc_ctx, p2); + if (p2.len == 0) + return bstrdup0(talloc_ctx, p1); + +#if HAVE_DOS_PATHS + if (p2.len >= 2 && p2.start[1] == ':' + || p2.start[0] == '\\' || p2.start[0] == '/') +#else + if (p2.start[0] == '/') +#endif + return bstrdup0(talloc_ctx, p2); // absolute path + + bool have_separator; + int endchar1 = p1.start[p1.len - 1]; +#if HAVE_DOS_PATHS + have_separator = endchar1 == '/' || endchar1 == '\\' + || p1.len == 2 && endchar1 == ':'; // "X:" only +#else + have_separator = endchar1 == '/'; +#endif + + return talloc_asprintf(talloc_ctx, "%.*s%s%.*s", BSTR_P(p1), + have_separator ? "" : "/", BSTR_P(p2)); +} + +bool mp_path_exists(const char *path) +{ + struct stat st; + return mp_stat(path, &st) == 0; +} + +bool mp_path_isdir(const char *path) +{ + struct stat st; + return mp_stat(path, &st) == 0 && S_ISDIR(st.st_mode); +} -- cgit v1.2.3