diff --git a/SystemTools.cxx b/SystemTools.cxx index b6737115b6810f08caba78175a8d222708985ac0..b73d319a12c4cd60dd07b5c457934424193692aa 100644 --- a/SystemTools.cxx +++ b/SystemTools.cxx @@ -1016,6 +1016,29 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination) return true; } +// return size of file; also returns zero if no file exists +unsigned long SystemTools::FileLength(const char* filename) +{ + struct stat fs; + if (stat(filename, &fs) != 0) + { + return 0; + } + else + { + return fs.st_size; + } +} + +int SystemTools::Strucmp(const char *s1, const char *s2) +{ +#ifdef _WIN32 + return _stricmp(s1,s2); +#else + return strcasecmp(s1,s2); +#endif +} + // return true if the file exists long int SystemTools::ModifiedTime(const char* filename) { @@ -1042,6 +1065,45 @@ bool SystemTools::RemoveFile(const char* source) return unlink(source) != 0 ? false : true; } +char *SystemTools +::RealPath(const char *path, char *resolved_path) +{ +#if defined(_WIN32) + char pathpart[itk::IOCommon::ITK_MAXPATHLEN]; + strcpy(pathpart,path); + char fnamepart[itk::IOCommon::ITK_MAXPATHLEN]; + char *slash; + + if((slash = strrchr(pathpart,'/')) == NULL) + { + slash = strrchr(pathpart,'\\'); + } + + if(slash == NULL) // no path part, so just use current dir. + { + Getcwd(pathpart,sizeof(pathpart)); + strcpy(fnamepart,path); + } + else // change directory to path part, getcwd to find OS resolved path + { + *slash = '\0'; + strcpy(fnamepart,slash+1); + + char savedir[itk::IOCommon::ITK_MAXPATHLEN]; + Getcwd(savedir,sizeof(savedir)); + Chdir(pathpart); + Getcwd(pathpart,sizeof(pathpart)); + Chdir(savedir); + } + strcpy(resolved_path,pathpart); + strcat(resolved_path,"/"); + strcat(resolved_path,fnamepart); + return resolved_path; +#else + return realpath(path,resolved_path); +#endif +} + /** * Find the file the given name. Searches the given path and then * the system search path. Returns the full path to the file if it is diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in index 8cf3396c7c103c8469a08adce9b1b35fd2a1f4cd..2f9a618d946ccae9131738f8ea6eff5c8b5cf382 100644 --- a/SystemTools.hxx.in +++ b/SystemTools.hxx.in @@ -100,6 +100,11 @@ public: */ static kwsys_std::string UpperCase(const kwsys_std::string&); + /** + * do a case-independent string comparison + */ + static int Strucmp(const char *s1, const char *s2); + /** * Replace Windows file system slashes with Unix-style slashes. */ @@ -123,6 +128,12 @@ public: /** Return true if a file exists in the current directory. */ static bool FileExists(const char* filename); + static unsigned long FileLength(const char *filename); + /** + * given a (possibly) relative path, return the completely + * qualified path to a file system entity + */ + static char *RealPath(const char *path, char *resolved_path); /** * Add the paths from the environment variable PATH to the * string vector passed in.