| 397 | } |
| 398 | |
| 399 | Str *NormalizePath(Str *path) { |
| 400 | bool abs = path->starts_with(PathSeparator); |
| 401 | StrArr *parts = path->split(PathSeparator); |
| 402 | StrArr *result = new StrArr(); |
| 403 | for (Int i = 0; i < parts->len(); i++) { |
| 404 | Str *part = parts->at(i); |
| 405 | if (part->eq("") || part->eq(".")) { |
| 406 | // do nothing |
| 407 | } else if (part->eq("..")) { |
| 408 | if (result->len() > 0) |
| 409 | result->pop(); |
| 410 | else if (!abs) |
| 411 | result->add(part); |
| 412 | } else { |
| 413 | result->add(part); |
| 414 | } |
| 415 | } |
| 416 | if (abs) |
| 417 | return S(PathSeparator)->add(StrJoin(result, PathSeparator)); |
| 418 | else |
| 419 | return StrJoin(result, PathSeparator); |
| 420 | } |
| 421 | |
| 422 | Str *GetEnv(const char *name) { |
| 423 | char *result = getenv(name); |