void get_basename(SkString* basename, const SkString& path) { if (path.size() == 0) { basename->reset(); return; } size_t end = path.size() - 1; // Paths pointing to directories often have a trailing slash, // we remove it so the name is not empty if (is_path_seperator(path[end])) { if (end == 0) { basename->reset(); return; } end -= 1; } size_t i = end; do { --i; if (is_path_seperator(path[i])) { const char* basenameStart = path.c_str() + i + 1; size_t basenameLength = end - i; basename->set(basenameStart, basenameLength); return; } } while (i > 0); basename->set(path.c_str(), end + 1); }
void get_parent_directory(Value* filename, Value* result) { int end = string_length(filename); // Advance past trailing seperators. while (end > 0 && is_path_seperator(string_get(filename, end - 1))) end--; bool foundSep = false; while (end > 0) { while (end > 0 && is_path_seperator(string_get(filename, end - 1))) { foundSep = true; end--; } if (foundSep) break; end--; } if (end == 0) { if (is_absolute_path(filename)) set_string(result, "/"); else set_string(result, "."); } else string_slice(filename, 0, end, result); }
void join_path(Value* left, Value* right) { const char* leftStr = as_cstring(left); const char* rightStr = as_cstring(right); int left_len = (int) strlen(leftStr); int right_len = (int) strlen(leftStr); if (string_equals(left, "") || string_equals(left, ".")) { copy(right, left); return; } if (string_equals(right, "")) return; int seperatorCount = 0; if (left_len > 0 && is_path_seperator(leftStr[left_len-1])) seperatorCount++; if (right_len > 0 && is_path_seperator(rightStr[0])) seperatorCount++; if (seperatorCount == 2) string_resize(left, left_len - 1); else if (seperatorCount == 0) string_append(left, "/"); string_append(left, right); }
void get_just_filename_for_path(Value* path, Value* filenameOut) { int start = string_length(path) - 1; while (start > 0 && !is_path_seperator(string_get(path, start - 1))) start--; string_slice(path, start, -1, filenameOut); }