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
diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp
new file mode 100644
index 0000000..9253f8c
--- /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