common/path.c: fixed is_abspath.
This commit is contained in:
parent
af818017ed
commit
d5d79c77db
2 changed files with 30 additions and 5 deletions
|
|
@ -82,12 +82,22 @@ static char* cpy_path(char *buf, const char *path) {
|
|||
}
|
||||
|
||||
int is_abspath(const char *path) {
|
||||
|
||||
if (*path != '/')
|
||||
|
||||
if (path == NULL || *path != '/')
|
||||
return 0;
|
||||
|
||||
return strstr(path, "/./") == NULL &&
|
||||
strstr(path, "/../") == NULL;
|
||||
|
||||
for(; *path; path++) {
|
||||
|
||||
if (*path == '/' && *(path+1) == '.') {
|
||||
path += 2;
|
||||
if (*path == '.')
|
||||
path++;
|
||||
if (*path == '/' || *path == '\0')
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
size_t pathlen(const char *path) {
|
||||
|
|
|
|||
|
|
@ -37,6 +37,20 @@ void test_pathlen() {
|
|||
assert(pathlen("dir") == 3);
|
||||
}
|
||||
|
||||
void test_isabspath() {
|
||||
|
||||
assert(is_abspath("file") == 0);
|
||||
assert(is_abspath("./file") == 0);
|
||||
assert(is_abspath(".file") == 0);
|
||||
assert(is_abspath("..file") == 0);
|
||||
assert(is_abspath("/../relpath") == 0);
|
||||
assert(is_abspath("/path/to/file") == 1);
|
||||
assert(is_abspath("/ab/xy/.file") == 1);
|
||||
assert(is_abspath("/ab/xy/..file") == 1);
|
||||
assert(is_abspath("/ab/.xy/file") == 1);
|
||||
assert(is_abspath("/ab/..xy/file") ==1);
|
||||
}
|
||||
|
||||
void test_basename() {
|
||||
|
||||
int i;
|
||||
|
|
@ -83,6 +97,7 @@ void test_dirname() {
|
|||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
test_isabspath();
|
||||
test_fmt_path();
|
||||
test_pathlen();
|
||||
test_basename();
|
||||
|
|
|
|||
Reference in a new issue