String::CPtr resolve(JsArray::CPtr paths) { const Size kMax = 8192; char dir[kMax]; char* r = getcwd(dir, kMax); if (!r) return String::null(); if (!paths) return String::create(dir); StringBuilder::Ptr resolved = StringBuilder::create(); resolved->appendStr(dir); Size len = paths->length(); for (Size i = 0; i < len; i++) { String::CPtr path = paths->getCPtr<String>(i); if (path) { if (isSep(path->charAt(0))) { resolved = StringBuilder::create(); #ifdef LIBJ_PF_WINDOWS // append the drive letter resolved->appendChar(dir[0]); resolved->appendChar(dir[1]); } else if (isAlpha(path->charAt(0)) && path->charAt(1) == ':') { resolved = StringBuilder::create(); #endif } else if (!path->isEmpty()) { resolved->appendChar(SEP); } resolved->appendStr(path); } } return trimSeps(normalize(resolved->toString())); }
static inline Size indexOfSep(String::CPtr str, Size from) { assert(str); Size len = str->length(); for (Size i = from; i < len; i++) { if (isSep(str->charAt(i))) return i; } return NO_POS; }
String::CPtr extname(String::CPtr path) { if (!path) return String::create(); String::CPtr base = basename(path); if (base->charAt(0) == '.') return String::create(); Size lastIndex = base->lastIndexOf('.'); if (lastIndex == NO_POS) { return String::create(); } else { return base->substring(lastIndex); } }
static inline String::CPtr trimSeps(String::CPtr str) { assert(str); Size len = str->length(); if (!len) return str; Size i = len - 1; while (1) { if (!isSep(str->charAt(i))) { return str->substring(0, i + 1); } if (i) { i--; } else { break; } } return str->substring(0, 1); }
static inline Size lastIndexOfSep(String::CPtr str, Size from = NO_POS) { assert(str); Size len = str->length(); if (!len) return NO_POS; if (from >= len) from = len - 1; Size i = from; while (1) { if (isSep(str->charAt(i))) return i; if (i) { i--; } else { break; } } return NO_POS; }
String::CPtr dirname(String::CPtr path) { LIBJ_STATIC_SYMBOL_DEF(symCurrent, "."); if (!path) return symCurrent; path = trimSeps(path); String::CPtr base = basename(path); Size baseLen = base->length(); Size pathLen = path->length(); if (baseLen == pathLen) { return symCurrent; } else { Size sepPos = pathLen - baseLen - 1; assert(isSep(path->charAt(sepPos))); if (sepPos) { return path->substring(0, sepPos); } else { return path->substring(0, 1); } } }