summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
authorLukasz Marek <lukasz.m.luki2@gmail.com>2014-07-05 18:12:02 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-03-31 23:50:46 +0200
commit31886968d338e8657f38c0e7c15ac269a8ca0880 (patch)
tree3ca5c0f2ad78bb13e73c8717bec88cf7b4d83e14 /libavutil
parent8b76c0eb561b0313e2a27950fe9d2bc5e4780dd8 (diff)
lavu/avstring: add av_append_path_component() funcion
Convinient function to build paths. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/avstring.c45
-rw-r--r--libavutil/avstring.h10
-rw-r--r--libavutil/version.h2
3 files changed, 56 insertions, 1 deletions
diff --git a/libavutil/avstring.c b/libavutil/avstring.c
index 25c65b4238..670801e83f 100644
--- a/libavutil/avstring.c
+++ b/libavutil/avstring.c
@@ -269,6 +269,37 @@ const char *av_dirname(char *path)
return path;
}
+char *av_append_path_component(const char *path, const char *component)
+{
+ size_t p_len, c_len;
+ char *fullpath;
+
+ if (!path)
+ return av_strdup(component);
+ if (!component)
+ return av_strdup(path);
+
+ p_len = strlen(path);
+ c_len = strlen(component);
+ if (p_len > SIZE_MAX - c_len || p_len + c_len > SIZE_MAX - 2)
+ return NULL;
+ fullpath = av_malloc(p_len + c_len + 2);
+ if (fullpath) {
+ if (p_len) {
+ av_strlcpy(fullpath, path, p_len + 1);
+ if (c_len) {
+ if (fullpath[p_len - 1] != '/' && component[0] != '/')
+ fullpath[p_len++] = '/';
+ else if (fullpath[p_len - 1] == '/' && component[0] == '/')
+ p_len--;
+ }
+ }
+ av_strlcpy(&fullpath[p_len], component, c_len + 1);
+ fullpath[p_len + c_len] = 0;
+ }
+ return fullpath;
+}
+
int av_escape(char **dst, const char *src, const char *special_chars,
enum AVEscapeMode mode, int flags)
{
@@ -427,6 +458,7 @@ int av_match_list(const char *name, const char *list, char separator)
int main(void)
{
int i;
+ char *fullpath;
static const char * const strings[] = {
"''",
"",
@@ -467,6 +499,19 @@ int main(void)
av_free(q);
}
+ printf("Testing av_append_path_component()\n");
+ #define TEST_APPEND_PATH_COMPONENT(path, component, expected) \
+ fullpath = av_append_path_component((path), (component)); \
+ printf("%s = %s\n", fullpath, expected); \
+ av_free(fullpath);
+ TEST_APPEND_PATH_COMPONENT(NULL, NULL, "(null)")
+ TEST_APPEND_PATH_COMPONENT("path", NULL, "path");
+ TEST_APPEND_PATH_COMPONENT(NULL, "comp", "comp");
+ TEST_APPEND_PATH_COMPONENT("path", "comp", "path/comp");
+ TEST_APPEND_PATH_COMPONENT("path/", "comp", "path/comp");
+ TEST_APPEND_PATH_COMPONENT("path", "/comp", "path/comp");
+ TEST_APPEND_PATH_COMPONENT("path/", "/comp", "path/comp");
+ TEST_APPEND_PATH_COMPONENT("path/path2/", "/comp/comp2", "path/path2/comp/comp2");
return 0;
}
diff --git a/libavutil/avstring.h b/libavutil/avstring.h
index ffb7aa6bfa..466edaf968 100644
--- a/libavutil/avstring.h
+++ b/libavutil/avstring.h
@@ -276,6 +276,16 @@ const char *av_dirname(char *path);
*/
int av_match_name(const char *name, const char *names);
+/**
+ * Append path component to the existing path.
+ * Path separator '/' is placed between when needed.
+ * Resulting string have to be freed with av_free().
+ * @param path base path
+ * @param component component to be appended
+ * @return new path or NULL on error.
+ */
+char *av_append_path_component(const char *path, const char *component);
+
enum AVEscapeMode {
AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode.
AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping.
diff --git a/libavutil/version.h b/libavutil/version.h
index 4d710dd4e2..30be0f0f89 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -56,7 +56,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 54
-#define LIBAVUTIL_VERSION_MINOR 21
+#define LIBAVUTIL_VERSION_MINOR 22
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \