Function removeDotDirsSanitized [src]

Removes '.' and '..' path components from a "sanitized relative path". A "sanitized path" is one where: all forward slashes have been replaced with back slashes all repeating back slashes have been collapsed the path is a relative one (does not start with a back slash)

Prototype

pub fn removeDotDirsSanitized(comptime T: type, path: []T) RemoveDotDirsError!usize

Parameters

T: typepath: []T

Possible Errors

TooManyParentDirs

Source

pub fn removeDotDirsSanitized(comptime T: type, path: []T) RemoveDotDirsError!usize { std.debug.assert(path.len == 0 or path[0] != '\\'); var write_idx: usize = 0; var read_idx: usize = 0; while (read_idx < path.len) { if (path[read_idx] == '.') { if (read_idx + 1 == path.len) return write_idx; const after_dot = path[read_idx + 1]; if (after_dot == '\\') { read_idx += 2; continue; } if (after_dot == '.' and (read_idx + 2 == path.len or path[read_idx + 2] == '\\')) { if (write_idx == 0) return error.TooManyParentDirs; std.debug.assert(write_idx >= 2); write_idx -= 1; while (true) { write_idx -= 1; if (write_idx == 0) break; if (path[write_idx] == '\\') { write_idx += 1; break; } } if (read_idx + 2 == path.len) return write_idx; read_idx += 3; continue; } } // skip to the next path separator while (true) : (read_idx += 1) { if (read_idx == path.len) return write_idx; path[write_idx] = path[read_idx]; write_idx += 1; if (path[read_idx] == '\\') break; } read_idx += 1; } return write_idx; }