Function setPath [src]

Prototype

pub fn setPath(w: *Header, prefix: []const u8, sub_path: []const u8) !void

Parameters

w: *Headerprefix: []const u8sub_path: []const u8

Source

pub fn setPath(w: *Header, prefix: []const u8, sub_path: []const u8) !void { const max_prefix = w.prefix.len; const max_name = w.name.len; const sep = std.fs.path.sep_posix; if (prefix.len + sub_path.len > max_name + max_prefix or prefix.len > max_prefix) return error.NameTooLong; // both fit into name if (prefix.len > 0 and prefix.len + sub_path.len < max_name) { @memcpy(w.name[0..prefix.len], prefix); w.name[prefix.len] = sep; @memcpy(w.name[prefix.len + 1 ..][0..sub_path.len], sub_path); return; } // sub_path fits into name // there is no prefix or prefix fits into prefix if (sub_path.len <= max_name) { @memcpy(w.name[0..sub_path.len], sub_path); @memcpy(w.prefix[0..prefix.len], prefix); return; } if (prefix.len > 0) { @memcpy(w.prefix[0..prefix.len], prefix); w.prefix[prefix.len] = sep; } const prefix_pos = if (prefix.len > 0) prefix.len + 1 else 0; // add as much to prefix as you can, must split at / const prefix_remaining = max_prefix - prefix_pos; if (std.mem.lastIndexOf(u8, sub_path[0..@min(prefix_remaining, sub_path.len)], &.{'/'})) |sep_pos| { @memcpy(w.prefix[prefix_pos..][0..sep_pos], sub_path[0..sep_pos]); if ((sub_path.len - sep_pos - 1) > max_name) return error.NameTooLong; @memcpy(w.name[0..][0 .. sub_path.len - sep_pos - 1], sub_path[sep_pos + 1 ..]); return; } return error.NameTooLong; }