From 814ba578ba3d8669ea9e18f11db82af978744b2c Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Wed, 25 Aug 2004 06:20:07 +0000 Subject: Initial implementation of the Path operating system concept. llvm-svn: 16048 --- llvm/lib/System/Linux/Path.cpp | 20 ++++++ llvm/lib/System/Makefile | 13 ++++ llvm/lib/System/Path.cpp | 60 ++++++++++++++++++ llvm/lib/System/Unix/Path.cpp | 138 +++++++++++++++++++++++++++++++++++++++++ llvm/lib/System/Unix/Unix.h | 34 ++++++++++ 5 files changed, 265 insertions(+) create mode 100644 llvm/lib/System/Linux/Path.cpp create mode 100644 llvm/lib/System/Makefile create mode 100644 llvm/lib/System/Path.cpp create mode 100644 llvm/lib/System/Unix/Path.cpp create mode 100644 llvm/lib/System/Unix/Unix.h (limited to 'llvm/lib/System') diff --git a/llvm/lib/System/Linux/Path.cpp b/llvm/lib/System/Linux/Path.cpp new file mode 100644 index 00000000000..5c73d0176a1 --- /dev/null +++ b/llvm/lib/System/Linux/Path.cpp @@ -0,0 +1,20 @@ +//===- llvm/System/Linux/Path.cpp - Linux 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 provides the Linux specific implementation of the Path class. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +//=== WARNING: Implementation here must contain only Linux specific code +//=== and must not be generic UNIX code (see ../Unix) +//===----------------------------------------------------------------------===// + +// Th..Th..Th..Tha's All Folks! +#include "../Unix/Path.cpp" diff --git a/llvm/lib/System/Makefile b/llvm/lib/System/Makefile new file mode 100644 index 00000000000..b4493ecf0a1 --- /dev/null +++ b/llvm/lib/System/Makefile @@ -0,0 +1,13 @@ +##===- lib/Bytecode/Reader/Makefile ------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file was developed by the LLVM research group and is distributed under +# the University of Illinois Open Source License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## +LEVEL = ../.. +LIBRARYNAME = system +BUILD_ARCHIVE = 1 + +include $(LEVEL)/Makefile.common diff --git a/llvm/lib/System/Path.cpp b/llvm/lib/System/Path.cpp new file mode 100644 index 00000000000..e32842dd188 --- /dev/null +++ b/llvm/lib/System/Path.cpp @@ -0,0 +1,60 @@ +//===-- Path.cpp - Implement OS Path Concept --------------------*- 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 header file implements the operating system Path concept. +// +//===----------------------------------------------------------------------===// +#include "llvm/System/Path.h" + +namespace llvm { +namespace sys { + +//===----------------------------------------------------------------------===// +//=== WARNING: Implementation here must contain only TRULY operating system +//=== independent code. +//===----------------------------------------------------------------------===// + +bool +Path::is_valid() const { + if ( empty() ) return false; + return true; +} + +void +Path::fill( char* buffer, unsigned bufflen ) const { + unsigned pathlen = length(); + assert( bufflen > pathlen && "Insufficient buffer size" ); + unsigned copylen = pathlen copy(buffer, copylen, 0 ); + buffer[ copylen ] = 0; +} + +void +Path::make_directory() { + char end[2]; + end[0] = '/'; + end[1] = 0; + if ( empty() ) + this->assign( end ); + else if ( (*this)[length()-1] != '/') + this->append( end ); +} + +void +Path::make_file() { + if ( (*this)[length()-1] == '/') + this->erase( this->length()-1, 1 ); +} + +// Include the truly platform-specific parts of this class. +#include "platform/Path.cpp" +} +} + +// vim: sw=2 diff --git a/llvm/lib/System/Unix/Path.cpp b/llvm/lib/System/Unix/Path.cpp new file mode 100644 index 00000000000..9253f8c9f75 --- /dev/null +++ b/llvm/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 +#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 diff --git a/llvm/lib/System/Unix/Unix.h b/llvm/lib/System/Unix/Unix.h new file mode 100644 index 00000000000..83d2865a11f --- /dev/null +++ b/llvm/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 +#include +#include +#include +#include +#include + +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 +} -- cgit v1.2.3