| 1 | // pylib.cc
 | 
| 2 | 
 | 
| 3 | #include "pylib.h"
 | 
| 4 | 
 | 
| 5 | #include <sys/stat.h>
 | 
| 6 | 
 | 
| 7 | namespace os_path {
 | 
| 8 | 
 | 
| 9 | BigStr* rstrip_slashes(BigStr* s) {
 | 
| 10 |   // Strip all the rightmost slashes, but not if it's ALL slashes
 | 
| 11 |   int n = len(s);
 | 
| 12 |   if (n == 0) {
 | 
| 13 |     return s;
 | 
| 14 |   }
 | 
| 15 | 
 | 
| 16 |   int new_len = n;
 | 
| 17 |   for (int i = n - 1; i >= 0; i--) {
 | 
| 18 |     char c = s->data_[i];
 | 
| 19 |     if (c == '/') {
 | 
| 20 |       new_len--;
 | 
| 21 |     } else {
 | 
| 22 |       break;
 | 
| 23 |     }
 | 
| 24 |   }
 | 
| 25 | 
 | 
| 26 |   if (new_len == 0) {  // it was all slashes, don't strip
 | 
| 27 |     return s;
 | 
| 28 |   }
 | 
| 29 | 
 | 
| 30 |   // Truncate to new_len
 | 
| 31 |   BigStr* result = NewStr(new_len);
 | 
| 32 |   memcpy(result->data_, s->data_, new_len);
 | 
| 33 |   result->data_[new_len] = '\0';
 | 
| 34 |   return result;
 | 
| 35 | }
 | 
| 36 | 
 | 
| 37 | }  // namespace os_path
 | 
| 38 | 
 | 
| 39 | namespace path_stat {
 | 
| 40 | 
 | 
| 41 | bool exists(BigStr* path) {
 | 
| 42 |   struct stat st;
 | 
| 43 |   if (::stat(path->data_, &st) < 0) {
 | 
| 44 |     return false;
 | 
| 45 |   } else {
 | 
| 46 |     return true;
 | 
| 47 |   }
 | 
| 48 | }
 | 
| 49 | 
 | 
| 50 | bool isdir(BigStr* path) {
 | 
| 51 |   struct stat st;
 | 
| 52 |   if (::stat(path->data_, &st) < 0) {
 | 
| 53 |     return false;
 | 
| 54 |   }
 | 
| 55 |   return S_ISDIR(st.st_mode);
 | 
| 56 | }
 | 
| 57 | 
 | 
| 58 | }  // namespace path_stat
 |