Implement r_file_dirname and support DOS paths in r_file_basename too

This commit is contained in:
pancake 2014-12-12 13:59:39 +01:00
parent 1a65e14627
commit 31d1ec7349
2 changed files with 31 additions and 2 deletions

View File

@ -462,6 +462,7 @@ R_API int r_file_chmod (const char *file, const char *mod, int recursive);
R_API char *r_file_temp (const char *prefix);
R_API char *r_file_path(const char *bin);
R_API const char *r_file_basename (const char *path);
R_API char *r_file_dirname (const char *path);
R_API char *r_file_abspath(const char *file);
R_API ut8 *r_inflate(const ut8 *src, int srcLen, int *dstLen);
R_API ut8 *r_file_gzslurp(const char *str, int *outlen, int origonfail);

View File

@ -39,12 +39,40 @@ R_API boolt r_file_truncate (const char *filename, ut64 newsize) {
return R_TRUE;
}
/*
Example:
str = r_file_basename ("home/inisider/Downloads/user32.dll");
// str == user32.dll
*/
R_API const char *r_file_basename (const char *path) {
const char *ptr = strrchr (path, '/');
if (ptr) path = ptr + 1;
const char *ptr = r_str_rchr (path, NULL, '/');
if (ptr) {
path = ptr + 1;
} else {
ptr = r_str_rchr (path, NULL, '\\');
if (ptr) path = ptr + 1;
}
return path;
}
/*
Example:
str = r_file_basename ("home/inisider/Downloads");
// str == "home/inisider/Downloads"
free (str);
*/
R_API char *r_file_dirname (const char *path) {
char *newpath = strdup (path);
char *ptr = (char*)r_str_rchr (newpath, NULL, '/');
if (ptr) {
*ptr = 0;
} else {
ptr = (char*)r_str_rchr (newpath, NULL, '\\');
if (ptr) *ptr = 0;
}
return newpath;
}
R_API boolt r_file_is_regular(const char *str) {
struct stat buf = {0};
if (!str||!*str)