function getDirname(path, pathComponents, dirname) { dirname = "" pathComponents[1] = "" sub("/$", "", path) split(path, pathComponents, "/") if (length(pathComponents) < 2) return "." for (i = 1; i <= length(pathComponents) - 1; i++) dirname = dirname pathComponents[i] "/" return dirname } function resolvePath(path, resolvedPath, pathComponents) { pathComponents[1] = "" resolvedPath = "" sub("/$", "", path) split(path, pathComponents, "/") for (i = 1; i <= length(pathComponents); i++) if (pathComponents[i] == "." || (i > 1 && pathComponents[i] == "")) continue else if (i+1 <= length(pathComponents) && pathComponents[i+1] == "..") i++ else if (i == length(pathComponents)) resolvedPath = resolvedPath pathComponents[i] else resolvedPath = resolvedPath pathComponents[i] "/" return resolvedPath } # relative path # assumes that base and path both start from the same root # for example: # when base = johncon/ # and path = lotus/garbage.txt # the relative path is ../lotus/garbage.txt # steps # 1. normalize and clean the paths (perhaps using resolvePath) # 2. remove the common path components from both the base and path # 3. for the remaining amount of components in the base, add ../ to the resolvedPath # 4. add the remaining components of path to resolvedPath function relpath(base, path, resolvedPath, baseComponents, pathComponents, nbaseComponents, npathComponents) { path = resolvePath(path) base = resolvePath(base) resolvedPath = "" pathComponents[1] = "" baseComponents[1] = "" sub("/$", "", base) sub("/$", "", path) nbaseComponents = split(base, baseComponents, "/") npathComponents = split(path, pathComponents, "/") j = 1 while (baseComponents[j] == pathComponents[j] && j <= nbaseComponents && j <= npathComponents) j++ for (i = j; i <= nbaseComponents; i++) resolvedPath = resolvedPath "../" for (i = j; i <= npathComponents; i++) if (i < npathComponents) resolvedPath = resolvedPath pathComponents[i] "/" else resolvedPath = resolvedPath pathComponents[i] return resolvedPath } function toFilename(string, result) { result = tolower(string) sub("^([ ]*)", "", result) sub("([ ]*)$", "", result) gsub(" ", "_", result) return result } function hashbased_uuidgen(string, namespace, uuid) { sprintf("uuidgen -s -N \"%s\" -n \"%s\"", string, namespace) | getline uuid return uuid }