//===- 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 #include 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