DoxigAlpha

format

Function parameters

Parameters

#
w:*Io.Writer

Type definitions in this namespace

Types

#

Functions in this namespace

Functions

#
tcpConnectToHost
All memory allocated with `allocator` will be freed before this function returns.
getAddressList
Call `AddressList.deinit` on the result.

Error sets in this namespace

Error Sets

#

= switch (native_os) { .windows => builtin.os.version_range.windows.isAtLeast(.win10_rs4) orelse false, .wasi => false, else => true, }

Values

#
has_unix_sockets
= switch (native_os) { .windows => builtin.os.version_range.windows.isAtLeast(.win10_rs4) orelse false, .wasi => false, else => true, }

Source

Implementation

#
pub fn format(self: Ip6Address, w: *Io.Writer) Io.Writer.Error!void {
    const port = mem.bigToNative(u16, self.sa.port);
    if (mem.eql(u8, self.sa.addr[0..12], &[_]u8{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff })) {
        try w.print("[::ffff:{d}.{d}.{d}.{d}]:{d}", .{
            self.sa.addr[12],
            self.sa.addr[13],
            self.sa.addr[14],
            self.sa.addr[15],
            port,
        });
        return;
    }
    const big_endian_parts = @as(*align(1) const [8]u16, @ptrCast(&self.sa.addr));
    const native_endian_parts = switch (native_endian) {
        .big => big_endian_parts.*,
        .little => blk: {
            var buf: [8]u16 = undefined;
            for (big_endian_parts, 0..) |part, i| {
                buf[i] = mem.bigToNative(u16, part);
            }
            break :blk buf;
        },
    };

    // Find the longest zero run
    var longest_start: usize = 8;
    var longest_len: usize = 0;
    var current_start: usize = 0;
    var current_len: usize = 0;

    for (native_endian_parts, 0..) |part, i| {
        if (part == 0) {
            if (current_len == 0) {
                current_start = i;
            }
            current_len += 1;
            if (current_len > longest_len) {
                longest_start = current_start;
                longest_len = current_len;
            }
        } else {
            current_len = 0;
        }
    }

    // Only compress if the longest zero run is 2 or more
    if (longest_len < 2) {
        longest_start = 8;
        longest_len = 0;
    }

    try w.writeAll("[");
    var i: usize = 0;
    var abbrv = false;
    while (i < native_endian_parts.len) : (i += 1) {
        if (i == longest_start) {
            // Emit "::" for the longest zero run
            if (!abbrv) {
                try w.writeAll(if (i == 0) "::" else ":");
                abbrv = true;
            }
            i += longest_len - 1; // Skip the compressed range
            continue;
        }
        if (abbrv) {
            abbrv = false;
        }
        try w.print("{x}", .{native_endian_parts[i]});
        if (i != native_endian_parts.len - 1) {
            try w.writeAll(":");
        }
    }
    try w.print("]:{}", .{port});
}