[FFmpeg-devel] [PATCH 4/6] lavu/avstring: add av_append_path_component() funcion
Lukasz Marek
lukasz.m.luki2 at gmail.com
Sat Jul 5 18:12:02 CEST 2014
TODO: bump minor, update doc/APIchanges
Convinient function to build paths.
Signed-off-by: Lukasz Marek <lukasz.m.luki2 at gmail.com>
---
libavutil/avstring.c | 43 +++++++++++++++++++++++++++++++++++++++++++
libavutil/avstring.h | 10 ++++++++++
2 files changed, 53 insertions(+)
diff --git a/libavutil/avstring.c b/libavutil/avstring.c
index e75cdc6..d7060ab 100644
--- a/libavutil/avstring.c
+++ b/libavutil/avstring.c
@@ -268,6 +268,35 @@ 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 component ? av_strdup(component) : NULL;
+ if (!component)
+ return av_strdup(path);
+
+ p_len = strlen(path);
+ c_len = strlen(component);
+ fullpath = malloc(p_len + c_len + 2);
+ if (fullpath) {
+ if (p_len) {
+ strcpy(fullpath, path);
+ if (c_len) {
+ if (fullpath[p_len - 1] != '/' && component[0] != '/')
+ fullpath[p_len++] = '/';
+ else if (fullpath[p_len - 1] == '/' && component[0] == '/')
+ p_len--;
+ }
+ }
+ strcpy(&fullpath[p_len], component);
+ 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)
{
@@ -376,6 +405,7 @@ end:
int main(void)
{
int i;
+ char *fullpath;
static const char * const strings[] = {
"''",
"",
@@ -416,6 +446,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 de2f71d..0a91dbf 100644
--- a/libavutil/avstring.h
+++ b/libavutil/avstring.h
@@ -268,6 +268,16 @@ const char *av_basename(const char *path);
*/
const char *av_dirname(char *path);
+/**
+ * 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.
--
1.9.1
More information about the ffmpeg-devel
mailing list