R_API int r_sys_rmkdir(const char *dir) { int ret = R_TRUE; const char slash = R_SYS_DIR[0]; char *path = strdup (dir), *ptr = path; if (*ptr==slash) ptr++; #if __WINDOWS__ { char *p = strstr (ptr, ":\\"); if (p) { ptr = p + 2; } } #endif while ((ptr = strchr (ptr, slash))) { *ptr = 0; if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) { eprintf ("r_sys_rmkdir: fail '%s' of '%s'\n", path, dir); free (path); return R_FALSE; } *ptr = slash; ptr++; } if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) ret = R_FALSE; free (path); return ret; }
R_API bool r_sys_mkdirp(const char *dir) { bool ret = true; char slash = R_SYS_DIR[0]; char *path = strdup (dir), *ptr = path; if (*ptr == slash) ptr++; #if __WINDOWS__ && !defined(__CYGWIN__) { char *p = strstr (ptr, ":\\"); if (p) ptr = p + 2; } #endif for (;;) { // find next slash for (; *ptr; ptr++) { if (*ptr == '/' || *ptr == '\\') { slash = *ptr; break; } } if (!*ptr) break; *ptr = 0; if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) { eprintf ("r_sys_mkdirp: fail '%s' of '%s'\n", path, dir); free (path); return false; } *ptr = slash; ptr++; } if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) ret = false; free (path); return ret; }
static inline int r_sys_mkdirp(char *dir) { int ret = 1; const char slash = DIRSEP; char *path = dir; char *ptr = path; if (*ptr == slash) { ptr++; } #if __WINDOWS__ char *p = strstr (ptr, ":\\"); if (p) { ptr = p + 2; } #endif while ((ptr = strchr (ptr, slash))) { *ptr = 0; if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) { eprintf ("r_sys_mkdirp: fail '%s' of '%s'\n", path, dir); *ptr = slash; return 0; } *ptr = slash; ptr++; } return ret; }
R_API int r_sys_rmkdir(const char *dir) { int ret = R_TRUE; char *path = strdup (dir), *ptr = path; // XXX: Wrong for w32 (/).. and no errno ? if (*ptr=='/') ptr++; while ((ptr = strchr (ptr, '/'))) { *ptr = 0; if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) { eprintf ("r_sys_rmkdir: fail %s\n", dir); free (path); return R_FALSE; } *ptr = '/'; ptr++; } if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) ret = R_FALSE; free (path); return ret; }
R_API int r_sys_mkdirp(const char *dir) { int ret = R_TRUE; char slash = R_SYS_DIR[0]; char *path = strdup (dir), *ptr = path; if (*ptr==slash) ptr++; #if __WINDOWS__ { char *p = strstr (ptr, ":\\"); if (p) { ptr = p + 2; } } #endif for (;;) { // find next slash for (; *ptr; ptr++) { if (*ptr == '/' || *ptr == '\\') { slash = *ptr; break; } } if (!*ptr) break; *ptr = 0; if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) { eprintf ("r_sys_mkdirp: fail '%s' of '%s'\n", path, dir); free (path); return R_FALSE; } *ptr = slash; ptr++; } if (!r_sys_mkdir (path) && r_sys_mkdir_failed ()) ret = R_FALSE; free (path); return ret; }
// TODO: move into util.c ? static inline int r_sys_rmkdir(char *dir) { char *ptr = dir; if (*ptr==DIRSEP) ptr++; while ((ptr = strchr (ptr, DIRSEP))) { *ptr = 0; if (!r_sys_mkdir (dir) && r_sys_mkdir_failed ()) { eprintf ("r_sys_rmkdir: fail %s\n", dir); *ptr = DIRSEP; return 0; } *ptr = DIRSEP; ptr++; } return 1; }