|
|
1.1 ! root 1: #include "decl.h" ! 2: ! 3: Path ! 4: mkpath (String st) ! 5: { ! 6: Path p; ! 7: ! 8: p.s = st; ! 9: return p; ! 10: } ! 11: ! 12: Path ! 13: Path::operator & (const Path& sub) const ! 14: { ! 15: String dir = s; ! 16: String subdir = sub.s; ! 17: ! 18: if (subdir.length() == 0) ! 19: return *this; ! 20: ! 21: if (subdir[0] == '/' || dir.length() == 0) ! 22: return sub; ! 23: ! 24: if (dir == "/") ! 25: return mkpath ('/' + subdir); ! 26: ! 27: return mkpath (dir + '/' + subdir); ! 28: } ! 29: ! 30: Path ! 31: Path::first() const ! 32: { ! 33: int n = s.strchr('/'); ! 34: ! 35: if (n < 0) ! 36: return s; ! 37: ! 38: if (n == 0) ! 39: return "/"; ! 40: ! 41: return mkpath (s(0,n)); ! 42: } ! 43: ! 44: Path ! 45: Path::last() const ! 46: { ! 47: int n = s.strrchr('/'); ! 48: ! 49: if (n < 0) ! 50: return mkpath (s); ! 51: ! 52: return mkpath (s(n+1,s.length()-n-1)); ! 53: } ! 54: ! 55: Path ! 56: Path::rmfirst() const ! 57: { ! 58: int n = s.strchr('/'); ! 59: ! 60: if (n < 0) ! 61: return mkpath (""); ! 62: ! 63: return mkpath (s(n+1,s.length()-n-1)); ! 64: } ! 65: ! 66: Path ! 67: Path::rmlast() const ! 68: { ! 69: int n = s.strrchr('/'); ! 70: ! 71: if (n < 0) ! 72: return mkpath (""); ! 73: ! 74: if (n == 0) ! 75: return mkpath ("/"); ! 76: ! 77: return mkpath (s(0,n)); ! 78: } ! 79: ! 80: Path homedir() ! 81: { ! 82: char *p = getenv ("HOME"); ! 83: return p? p: ""; ! 84: } ! 85: ! 86: ostream& operator << (ostream& o, const Path& p) ! 87: { ! 88: o << p.s; ! 89: return o; ! 90: } ! 91: ! 92: // remove multiple or trailing slashes ! 93: String ! 94: pathnorm (String s) ! 95: { ! 96: String r; ! 97: int l = s.length(); ! 98: int state = 0; ! 99: ! 100: for (int i = 0; i < l; i++) { ! 101: char c = s[i]; ! 102: switch (state) { ! 103: case 0: // initial state ! 104: r += c; ! 105: if (c == '/') ! 106: state = 1; ! 107: else ! 108: state = 2; ! 109: break; ! 110: ! 111: case 1: // seen initial slashes only ! 112: if (c != '/') { ! 113: r += c; ! 114: state = 2; ! 115: } ! 116: break; ! 117: ! 118: case 2: // seen a component character ! 119: if (c != '/') ! 120: r += c; ! 121: else ! 122: state = 3; ! 123: break; ! 124: ! 125: case 3: // seen a non-leading slash ! 126: if (c != '/') { ! 127: r += '/'; ! 128: r += c; ! 129: state = 2; ! 130: } ! 131: break; ! 132: } ! 133: } ! 134: ! 135: return r; ! 136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.