diff options
| author | Vicent Marti <tanoku@gmail.com> | 2011-02-05 12:42:41 +0200 |
|---|---|---|
| committer | Vicent Marti <tanoku@gmail.com> | 2011-02-05 12:42:41 +0200 |
| commit | f725931b4865317b58c1f1600724cb36e586c332 (patch) | |
| tree | 571497dd0b831f683ffa6326014db2549e5a9a21 /src/util.h | |
| parent | c836c332f17ff2da8bdf6d18fb3d59eac2586ca9 (diff) | |
| download | libgit2-f725931b4865317b58c1f1600724cb36e586c332.tar.gz | |
Fix directory/path manipulation methods
The `dirname` and `dirbase` methods have been replaced with the Android
implementation, which is actually compilant to some kind of standard.
A new method `topdir` has been added, which returns the topmost
directory in a path.
These changes fix issue #49:
`gitfo_prettify_dir_path` converts "./.git/" to ".git/", so
the code at src/repository.c:190 goes out of bounds when
trying to find the topmost directory.
The new `git__topdir` method handles this gracefully, and the
fixed `git__dirname` now returns the proper value for the
repository's working dir.
E.g.
/repo/.git/ ==> working dir '/repo/'
.git/ ==> working dir '.'
Signed-off-by: Vicent Marti <tanoku@gmail.com>
Diffstat (limited to 'src/util.h')
| -rw-r--r-- | src/util.h | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/src/util.h b/src/util.h index 99c4f5a84..67ff4aec1 100644 --- a/src/util.h +++ b/src/util.h @@ -19,8 +19,44 @@ extern int git__fmt(char *, size_t, const char *, ...) extern int git__prefixcmp(const char *str, const char *prefix); extern int git__suffixcmp(const char *str, const char *suffix); -extern int git__dirname(char *dir, size_t n, char *path); -extern int git__basename(char *base, size_t n, char *path); +/* + * The dirname() function shall take a pointer to a character string + * that contains a pathname, and return a pointer to a string that is a + * pathname of the parent directory of that file. Trailing '/' characters + * in the path are not counted as part of the path. + * + * If path does not contain a '/', then dirname() shall return a pointer to + * the string ".". If path is a null pointer or points to an empty string, + * dirname() shall return a pointer to the string "." . + * + * The `git__dirname` implementation is thread safe. The returned + * string must be manually free'd. + * + * The `git__dirname_r` implementation expects a string allocated + * by the user with big enough size. + */ +extern char *git__dirname(const char *path); +extern int git__dirname_r(char *buffer, size_t bufflen, const char *path); + +/* + * This function returns the basename of the file, which is the last + * part of its full name given by fname, with the drive letter and + * leading directories stripped off. For example, the basename of + * c:/foo/bar/file.ext is file.ext, and the basename of a:foo is foo. + * + * Trailing slashes and backslashes are significant: the basename of + * c:/foo/bar/ is an empty string after the rightmost slash. + * + * The `git__basename` implementation is thread safe. The returned + * string must be manually free'd. + * + * The `git__basename_r` implementation expects a string allocated + * by the user with big enough size. + */ +extern char *git__basename(const char *path); +extern int git__basename_r(char *buffer, size_t bufflen, const char *path); + +extern const char *git__topdir(const char *path); extern void git__hexdump(const char *buffer, size_t n); extern uint32_t git__hash(const void *key, int len, uint32_t seed); @@ -40,6 +76,21 @@ GIT_INLINE(int) git__is_sizet(git_off_t p) # define git__rotl(v, s) (uint32_t)(((uint32_t)(v) << (s)) | ((uint32_t)(v) >> (32 - (s)))) #endif +enum git_splitpath_flags +{ + GIT_SPL_PATH = 1, + GIT_SPL_FILE = 2, + GIT_SPL_EXT = 4, + GIT_SPL_PATH_FILE = GIT_SPL_PATH + GIT_SPL_FILE, + GIT_SPL_FILE_EXT = GIT_SPL_FILE + GIT_SPL_EXT, + GIT_SPL_EXT_NO_PERIOD = 8, +}; + + +extern char *git__splitpath(char *path, int flag); +extern char *git__strtok(char *output, char *src, char *delimit); +extern char *git__strtok_keep(char *output, char *src, char *delimit); + /* * Realloc the buffer pointed at by variable 'x' so that it can hold * at least 'nr' entries; the number of entries currently allocated |
