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 standard library.
std › unicode › utf8EncodeImpl Private Function utf8EncodeImpl Doc Source Private Function std.unicode.utf8EncodeImpl
fn utf8EncodeImpl (c : u21 , out : []u8 , comptime surrogates : Surrogates ) !u3 Params File unicode.zig: 53
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 fn utf8EncodeImpl (c : u21 , out : []u8 , comptime surrogates : Surrogates ) !u3 {
const length = try utf8CodepointSequenceLength (c );
assert (out .len >= length );
switch (length ) {
// The pattern for each is the same
// - Increasing the initial shift by 6 each time
// - Each time after the first shorten the shifted
// value to a max of 0b111111 (63)
1 => out [0 ] = @as (u8 , @intCast (c )), // Can just do 0 + codepoint for initial range
2 => {
out [0 ] = @as (u8 , @intCast (0b11000000 | (c >> 6 )));
out [1 ] = @as (u8 , @intCast (0b10000000 | (c & 0b111111 )));
},
3 => {
if (surrogates == .cannot_encode_surrogate_half and isSurrogateCodepoint (c )) {
return error .Utf8CannotEncodeSurrogateHalf ;
}
out [0 ] = @as (u8 , @intCast (0b11100000 | (c >> 12 )));
out [1 ] = @as (u8 , @intCast (0b10000000 | ((c >> 6 ) & 0b111111 )));
out [2 ] = @as (u8 , @intCast (0b10000000 | (c & 0b111111 )));
},
4 => {
out [0 ] = @as (u8 , @intCast (0b11110000 | (c >> 18 )));
out [1 ] = @as (u8 , @intCast (0b10000000 | ((c >> 12 ) & 0b111111 )));
out [2 ] = @as (u8 , @intCast (0b10000000 | ((c >> 6 ) & 0b111111 )));
out [3 ] = @as (u8 , @intCast (0b10000000 | (c & 0b111111 )));
},
else => unreachable ,
}
return length ;
}