diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2009-08-23 16:41:29 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2009-08-23 16:41:29 +0200 |
commit | d4bc6fa954f11b1da0c8881c2826ac4a60f8c41e (patch) | |
tree | c24b7b1ec877a102b86a3af47e01bf40e04cb4ac /libssh/misc.c | |
parent | 8bae43876fff891e33d48b177778ee4cb882c45a (diff) | |
parent | fbfea94559aa776bca7983ef989d024c2d3b72fe (diff) | |
download | libssh-d4bc6fa954f11b1da0c8881c2826ac4a60f8c41e.tar.gz libssh-d4bc6fa954f11b1da0c8881c2826ac4a60f8c41e.tar.xz libssh-d4bc6fa954f11b1da0c8881c2826ac4a60f8c41e.zip |
Merge branch 'master' of git://git.libssh.org/projects/libssh/libssh
Conflicts:
include/libssh/priv.h
Diffstat (limited to 'libssh/misc.c')
-rw-r--r-- | libssh/misc.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/libssh/misc.c b/libssh/misc.c index 03fd3c3..5fbd28e 100644 --- a/libssh/misc.c +++ b/libssh/misc.c @@ -238,6 +238,114 @@ const void *_ssh_list_get_head(struct ssh_list *list){ return data; } +/** + * @brief Parse directory component. + * + * dirname breaks a null-terminated pathname string into a directory component. + * In the usual case, ssh_dirname() returns the string up to, but not including, + * the final '/'. Trailing '/' characters are not counted as part of the + * pathname. The caller must free the memory. + * + * @param path The path to parse. + * + * @return The dirname of path or NULL if we can't allocate memory. If path + * does not contain a slash, c_dirname() returns the string ".". If + * path is the string "/", it returns the string "/". If path is + * NULL or an empty string, "." is returned. + */ +char *ssh_dirname (const char *path) { + char *new = NULL; + unsigned int len; + + if (path == NULL || *path == '\0') { + return strdup("."); + } + + len = strlen(path); + + /* Remove trailing slashes */ + while(len > 0 && path[len - 1] == '/') --len; + + /* We have only slashes */ + if (len == 0) { + return strdup("/"); + } + + /* goto next slash */ + while(len > 0 && path[len - 1] != '/') --len; + + if (len == 0) { + return strdup("."); + } else if (len == 1) { + return strdup("/"); + } + + /* Remove slashes again */ + while(len > 0 && path[len - 1] == '/') --len; + + new = malloc(len + 1); + if (new == NULL) { + return NULL; + } + + strncpy(new, path, len); + new[len] = '\0'; + + return new; +} + +/** + * @brief basename - parse filename component. + * + * basename breaks a null-terminated pathname string into a filename component. + * ssh_basename() returns the component following the final '/'. Trailing '/' + * characters are not counted as part of the pathname. + * + * @param path The path to parse. + * + * @return The filename of path or NULL if we can't allocate memory. If path + * is a the string "/", basename returns the string "/". If path is + * NULL or an empty string, "." is returned. + */ +char *ssh_basename (const char *path) { + char *new = NULL; + const char *s; + unsigned int len; + + if (path == NULL || *path == '\0') { + return strdup("."); + } + + len = strlen(path); + /* Remove trailing slashes */ + while(len > 0 && path[len - 1] == '/') --len; + + /* We have only slashes */ + if (len == 0) { + return strdup("/"); + } + + while(len > 0 && path[len - 1] != '/') --len; + + if (len > 0) { + s = path + len; + len = strlen(s); + + while(len > 0 && s[len - 1] == '/') --len; + } else { + return strdup(path); + } + + new = malloc(len + 1); + if (new == NULL) { + return NULL; + } + + strncpy(new, s, len); + new[len] = '\0'; + + return new; +} /** @} */ /* vim: set ts=2 sw=2 et cindent: */ |