| 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
|