diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-08-25 06:20:07 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-08-25 06:20:07 +0000 |
commit | b89a2237ea79e0576fdb426b124f1940f53da159 (patch) | |
tree | bd6277d71a8627ffce532b7e1fefd49d3f310f78 /lib/System/Unix | |
parent | 17f130c61e268b39044870b66b58d7575d7ba784 (diff) |
Initial implementation of the Path operating system concept.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16048 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Unix')
-rw-r--r-- | lib/System/Unix/Path.cpp | 138 | ||||
-rw-r--r-- | lib/System/Unix/Path.inc | 138 | ||||
-rw-r--r-- | lib/System/Unix/Unix.h | 34 |
3 files changed, 310 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 diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc new file mode 100644 index 0000000000..9253f8c9f7 --- /dev/null +++ b/lib/System/Unix/Path.inc @@ -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 diff --git a/lib/System/Unix/Unix.h b/lib/System/Unix/Unix.h new file mode 100644 index 0000000000..83d2865a11 --- /dev/null +++ b/lib/System/Unix/Unix.h @@ -0,0 +1,34 @@ +//===- llvm/System/Unix/Unix.h - Common Unix Include File -----*- 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 defines things specific to Unix implementations. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +//=== WARNING: Implementation here must contain only generic UNIX code that +//=== is guaranteed to work on all UNIX variants. +//===----------------------------------------------------------------------===// + +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/param.h> + +inline void ThrowErrno(const std::string& prefix) { +#if defined __USE_XOPEN2K || defined __USE_MISC + char buffer[MAXPATHLEN]; + strerror_r(errno,buffer, MAXPATHLEN); + throw prefix + ": " + buffer; +#else + throw prefix + ": " + strerror(errno); +#endif +} |