Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › tar.zig › sanitizePath
sanitizePath
tar.sanitizePath
fn sanitizePath (buffer : []u8 , path : []const u8 , strip_components : u32 ) error
File
Code
fn sanitizePath (buffer : []u8 , path : []const u8 , strip_components : u32 ) error {Invalid }!usize {
if (path .len == 0 or path [0 ] == '/' ) return error .Invalid ;
var i : usize = 0 ;
var c = strip_components ;
var it = std .mem .tokenizeScalar (u8 , path , '/' );
while (it .next ()) |component | {
if (std .mem .eql (u8 , component , "." )) continue ;
if (std .mem .eql (u8 , component , ".." )) {
if (i == 0 ) return error .Invalid ;
while (true ) {
const ends_with_slash = buffer [i - 1 ] == '/' ;
i -= 1 ;
if (ends_with_slash or i == 0 ) break ;
}
continue ;
}
if (c > 0 ) {
c -= 1 ;
continue ;
}
if (i > 0 ) {
buffer [i ] = '/' ;
i += 1 ;
}
@memcpy (buffer [i ..][0 ..component .len ], component );
i += component .len ;
}
if (c > 0 ) return error .Invalid ;
return i ;
}