int Bcanonicalisefilename(char *filename, int removefn) { char cwd[BMAX_PATH], fn[BMAX_PATH], *p; char *fnp = filename; #ifdef _WIN32 int drv = 0; #endif #ifdef _WIN32 { if (filename[0] && filename[1] == ':') { // filename is prefixed with a drive drv = toupper(filename[0])-'A' + 1; fnp += 2; } if (!_getdcwd(drv, cwd, sizeof(cwd))) return -1; for (p=cwd; *p; p++) if (*p == '\\') *p = '/'; } #else if (!getcwd(cwd,sizeof(cwd))) return -1; #endif p = strrchr(cwd,'/'); if (!p || p[1]) strcat(cwd, "/"); strcpy(fn, fnp); #ifdef _WIN32 for (p=fn; *p; p++) if (*p == '\\') *p = '/'; #endif if (fn[0] != '/') { // we are dealing with a path relative to the current directory strcpy(filename, cwd); strcat(filename, fn); } else { #ifdef _WIN32 filename[0] = cwd[0]; filename[1] = ':'; filename[2] = 0; #else filename[0] = 0; #endif strcat(filename, fn); } fnp = filename; #ifdef _WIN32 fnp += 2; // skip the drive #endif return Bcorrectfilename(fnp,1); }
int32_t Bcanonicalisefilename(char *filename, int32_t removefn) { char cwd[BMAX_PATH]; char *fnp = filename; #ifdef _WIN32 int drv = 0; if (filename[0] && filename[1] == ':') { // filename is prefixed with a drive drv = toupper(filename[0]) - 'A' + 1; fnp += 2; } if (!_getdcwd(drv, cwd, sizeof(cwd))) return -1; for (char *p = cwd; *p; p++) if (*p == '\\') *p = '/'; #else if (!getcwd(cwd, sizeof(cwd))) return -1; #endif char *p = Bstrrchr(cwd, '/'); if (!p || p[1]) Bstrcat(cwd, "/"); char fn[BMAX_PATH]; Bstrcpy(fn, fnp); #ifdef _WIN32 for (p = fn; *p; p++) if (*p == '\\') *p = '/'; #endif if (fn[0] != '/') { // we are dealing with a path relative to the current directory Bstrcpy(filename, cwd); Bstrcat(filename, fn); } else { #ifdef _WIN32 filename[0] = cwd[0]; filename[1] = ':'; filename[2] = 0; Bstrcat(filename, fn); #else Bstrcpy(filename, fn); #endif } fnp = filename; #ifdef _WIN32 fnp += 2; // skip the drive #endif UNREFERENCED_PARAMETER(removefn); // change the call below to use removefn instead of 1? return Bcorrectfilename(fnp, 1); }