diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-08-21 10:16:36 +0200 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-08-21 10:16:36 +0200 |
commit | 0b10493e900cca26ee07d68a3c3f35b467364be5 (patch) | |
tree | f2447e032098c2e083bd09903915f93e2f567f30 /libssh | |
parent | d23e64fc5211bc30ca7a34ac8ca98069a838c23f (diff) | |
download | libssh-0b10493e900cca26ee07d68a3c3f35b467364be5.tar.gz libssh-0b10493e900cca26ee07d68a3c3f35b467364be5.tar.xz libssh-0b10493e900cca26ee07d68a3c3f35b467364be5.zip |
Added ssh_basename() and ssh_dirname().
Diffstat (limited to 'libssh')
-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 03fd3c38..5fbd28e2 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: */ |