diff options
Diffstat (limited to 'lib/System/Unix/Path.cpp')
-rw-r--r-- | lib/System/Unix/Path.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp new file mode 100644 index 0000000000..9253f8c9f7 --- /dev/null +++ b/lib/System/Unix/Path.cpp @@ -0,0 +1,138 @@ +//===- llvm/System/Unix/Path.cpp - Unix Path Implementation -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by Reid Spencer and is distributed under the +// University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Unix specific portion of the Path class. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +//=== WARNING: Implementation here must contain only generic UNIX code that +//=== is guaranteed to work on all UNIX variants. +//===----------------------------------------------------------------------===// + +#include "Unix.h" +#include <sys/stat.h> +#include <fcntl.h> + +bool +Path::is_file() const { + if (!empty() && ((*this)[length()-1] != '/')) + return true; + return false; +} + +bool +Path::is_directory() const { + if ((!empty()) && ((*this)[length()-1] == '/')) + return true; + return false; +} + +void +Path::create( bool create_parents) { + if ( is_directory() ) { + if ( create_parents ) + this->create_directories( ); + this->create_directory( ); + } else if ( is_file() ) { + if ( create_parents ) + this->create_directories( ); + this->create_file( ); + } +} + +void +Path::remove() { + if ( is_directory() ) { + if ( exists() ) + this->remove_directory( ); + } else if ( is_file() ) + if ( exists() ) + this->remove_file( ); +} + +bool +Path::exists() { + char pathname[MAXPATHLEN]; + this->fill(pathname,MAXPATHLEN); + int lastchar = this->length() - 1 ; + if (pathname[lastchar] == '/') + pathname[lastchar] = 0; + return 0 == access(pathname, F_OK ); +} + +void +Path::create_directory( ) { + char pathname[MAXPATHLEN]; + this->fill(pathname,MAXPATHLEN); + int lastchar = this->length() - 1 ; + if (pathname[lastchar] == '/') + pathname[lastchar] = 0; + if (0 != mkdir(pathname, S_IRWXU | S_IRWXG)) + ThrowErrno(pathname); +} + +void +Path::create_directories() { + char pathname[MAXPATHLEN]; + this->fill(pathname,MAXPATHLEN); + int lastchar = this->length() - 1 ; + if (pathname[lastchar] == '/') + pathname[lastchar] = 0; + + char * next = index(pathname,'/'); + if ( pathname[0] == '/') + next = index(&pathname[1],'/'); + while ( next != 0 ) + { + *next = 0; + if (0 != access(pathname, F_OK | R_OK)) + if (0 != mkdir(pathname, S_IRWXU | S_IRWXG)) + ThrowErrno(pathname); + char* save = next; + next = index(pathname,'/'); + *save = '/'; + } +} + +void +Path::remove_directory() +{ + char pathname[MAXPATHLEN]; + this->fill(pathname,MAXPATHLEN); + int lastchar = this->length() - 1 ; + if (pathname[lastchar] == '/') + pathname[lastchar] = 0; + if ( 0 != rmdir(pathname)) + ThrowErrno(pathname); +} + +void +Path::create_file() { + char pathname[MAXPATHLEN]; + this->fill(pathname,MAXPATHLEN); + int lastchar = this->length() - 1 ; + if (pathname[lastchar] == '/') + pathname[lastchar] = 0; + if (0 != creat(pathname, S_IRUSR | S_IWUSR)) + ThrowErrno(pathname); +} + +void +Path::remove_file() { + char pathname[MAXPATHLEN]; + this->fill(pathname,MAXPATHLEN); + int lastchar = this->length() - 1 ; + if (pathname[lastchar] == '/') + pathname[lastchar] = 0; + if (0 != unlink(pathname)) + ThrowErrno(pathname); +} + +// vim: sw=2 |