Skip to content
BufIterFromBuf

BufIterFromBuf

Description

Construct a BufIter over the bytes of b_. The iterator borrows b_’s storage and is invalidated by any growth of b_.

Success

Returns a BufIter covering [b_->data, b_->data + b_->length).

Failure

Macro cannot fail.

Usage example (Cross-references)

Usage examples (Cross-references)
        PeContext ctx = {
            .out  = out,
            .file = BufIterFromBuf(&out->data),
        };
            return false;
        }
        BufIter c = BufIterFromBuf(&m->data);
        u32     magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags, reserved;
        if (!BufReadFmt(
            return false;
        }
        BufIter walker = BufIterFromBuf(&ctx->out->data);
        // Must-precondition: the check above proves the file is at least
        // `MH_HEADER_64_SIZE + sizeofcmds` bytes, so the header skip stays
        }
        const u8 *str_base = BufData(&ctx->out->data) + ctx->stroff;
        BufIter   tab      = BufIterFromBuf(&ctx->out->data);
        // Must-precondition: `tab_end > BufLength` was checked above, so
        // `symoff <= tab_end <= BufLength` and the move stays in-bounds.
        self->header.data      = ELF_DATA_LSB;
    
        BufIter iter = BufIterFromBuf(&self->data);
        IterMustMove(&iter, EI_NIDENT);
        u64 shstr_size = 0;
        {
            BufIter iter = BufIterFromBuf(&self->data);
            IterMustMove(&iter, shoff + (u64)self->header.shstrndx * SHDR64_SIZE);
            u32 name = 0, type = 0, link = 0, info = 0;
        }
    
        BufIter iter = BufIterFromBuf(&self->data);
        IterMustMove(&iter, shoff);
        for (u16 i = 0; i < n; ++i) {
        }
    
        BufIter iter = BufIterFromBuf(&self->data);
        IterMustMove(&iter, phoff);
        for (u16 i = 0; i < n; ++i) {
        }
    
        BufIter iter = BufIterFromBuf(&self->data);
        IterMustMove(&iter, symtab->offset);
        for (u64 i = 0; i < count; ++i) {
        BufWriteU64LE(&b, 0xFEEDFACECAFEBEEFull);
    
        BufIter it = BufIterFromBuf(&b);
        u16     v16;
        u32     v32;
        BufWriteSLeb128(&b, -123456);
    
        BufIter it = BufIterFromBuf(&b);
        u64     uv;
        i64     sv;
        BufWriteZstr(&b, "world");
    
        BufIter it = BufIterFromBuf(&b);
        Zstr s1 = BufReadZstr(&it);
        Zstr s2 = BufReadZstr(&it);
        BufAppendFmt(&b, "{<2r}{>4r}{<8r}", (u16)0x1234, (u32)0xDEADBEEF, (u64)0x0102030405060708ull);
    
        BufIter it = BufIterFromBuf(&b);
        u16     v16;
        u32     v32;
        BufAppendFmt(&b, "{<2r}", (u16)0xABCD); // only 2 bytes; reader wants 6
    
        BufIter it    = BufIterFromBuf(&b);
        size    entry = it.pos;
        u16     v16   = 0;
        ok = ok && BufWriteFmt(&b, "{<2r}{>8r}", (u16)0x1234, (u64)0x0102030405060708ULL);
        {
            BufIter it    = BufIterFromBuf(&b);
            u16     v16   = 0;
            u64     v64   = 0;
        // Read back: the literal matches and the version is extracted.
        {
            BufIter it  = BufIterFromBuf(&b);
            u8      ver = 0;
            ok          = ok && BufReadFmt(&it, "TZif{>1r}", ver) && (ver == '2');
        // Wrong magic -> soft false, no abort, cursor rewound, dest untouched.
        {
            BufIter it  = BufIterFromBuf(&b);
            u8      ver = 0xAB;
            bool    rd  = BufReadFmt(&it, "TZig{>1r}", ver);
        ok = ok && (BufLength(&b) == 2) && (BufData(&b)[0] == '{') && (BufData(&b)[1] == 0x41);
    
        BufIter it = BufIterFromBuf(&b);
        u8      v  = 0;
        ok         = ok && BufReadFmt(&it, "{​{{>1r}", v) && (v == 0x41);
        ok = ok && (BufLength(&b) == 2);
        {
            BufIter it = BufIterFromBuf(&b);
            u8      q  = 0;
            ok         = ok && BufReadFmt(&it, "{>1r}Z", q) && (q == 'Q');
        ok = ok && BufWriteFmt(&b, "{>1r}{​{", (u8)'Q');
        {
            BufIter it = BufIterFromBuf(&b);
            u8      q  = 0;
            ok         = ok && BufReadFmt(&it, "{>1r}{​{", q) && (q == 'Q');
        ok = ok && (BufLength(&b) == 1);
    
        BufIter it = BufIterFromBuf(&b);
        u8      v8 = 0;
        bool    rd = BufReadFmt(&it, "{<1r}", v8);
        ok = ok && (BufLength(&b) == 4);
    
        BufIter it  = BufIterFromBuf(&b);
        u32     v32 = 0;
        bool    rd  = BufReadFmt(&it, "{<4r}", v32);
        ok = ok && (BufLength(&b) == 8);
    
        BufIter it  = BufIterFromBuf(&b);
        u64     v64 = 0;
        bool    rd  = BufReadFmt(&it, "{>8r}", v64);
        ok = ok && (BufLength(&b) == 8);
    
        BufIter it  = BufIterFromBuf(&b);
        i64     v64 = 0;
        bool    rd  = BufReadFmt(&it, "{<8r}", v64);
        BufWriteFmt(&b, "{<2r}", (u16)0x1234);
    
        BufIter it  = BufIterFromBuf(&b);
        u16     v16 = 0;
        BufReadFmt(&it, "{2}", v16); // real: LOG_FATAL (non-raw). mutant: returns.
        ok = ok && BufWriteFmt(&b, "{>8r}", (u64)0x0102030405060708ULL);
    
        BufIter it  = BufIterFromBuf(&b);
        u64     v64 = 0;
        ok          = ok && BufReadFmt(&it, "{>8r}", v64);
        ok = ok && (BufLength(&b) == 2);
    
        BufIter it    = BufIterFromBuf(&b);
        u16     v16   = 0;
        bool    rd_ok = BufReadFmt(&it, "{^2r}", v16);
        Buf              b     = BufInit(&alloc);
        BufWriteFmt(&b, "{<1r}{<1r}", (u8)0x11, (u8)0x22); // 2 bytes available
        BufIter it = BufIterFromBuf(&b);
        u8      v8 = 0;
        BufReadFmt(&it, "{<1r}{<1r}", v8);                 // 2 fields, 1 arg -> abort
        bool             ok    = BufWriteFmt(&b, "{<2r}{>4r}", (u16)0x1234, (u32)0xAABBCCDD);
        ok                     = ok && (BufLength(&b) == 6);
        BufIter it             = BufIterFromBuf(&b);
        u16     a              = 0;
        u32     c              = 0;
        ok                = ok && BufPushBytes(&b, bytes, 4);
    
        BufIter it    = BufIterFromBuf(&b);
        u32     v32   = 0;
        bool    rd_ok = BufReadFmt(&it, "{>4r}", v32);
        ok                = ok && BufPushBytes(&b, bytes, 4);
    
        BufIter it    = BufIterFromBuf(&b);
        u32     v32   = 0;
        bool    rd_ok = BufReadFmt(&it, "{<4r}", v32);
        ok                = ok && BufPushBytes(&b, bytes, 4);
    
        BufIter it    = BufIterFromBuf(&b);
        u32     v32   = 0;
        bool    rd_ok = BufReadFmt(&it, "{<4r}", v32);
        ok = ok && (BufLength(&b) == 4);
    
        BufIter it    = BufIterFromBuf(&b);
        u32     v32   = 0;
        bool    rd_ok = BufReadFmt(&it, "{^4r}", v32);
        ok = ok && (BufLength(&b) == 8);
    
        BufIter it    = BufIterFromBuf(&b);
        u64     v64   = 0;
        bool    rd_ok = BufReadFmt(&it, "{<8r}", v64);
        ok = ok && (BufLength(&b) == 8);
    
        BufIter it    = BufIterFromBuf(&b);
        u64     v64   = 0;
        bool    rd_ok = BufReadFmt(&it, "{<8r}", v64);
        ok = ok && (BufLength(&b) == 8);
    
        BufIter it    = BufIterFromBuf(&b);
        u64     v64   = 0;
        bool    rd_ok = BufReadFmt(&it, "{^8r}", v64);
        bool ok = BufAppendFmt(&b, "{<1r}", (u8)0xAB);
    
        BufIter it  = BufIterFromBuf(&b);
        u8      out = 0;
        ok          = ok && BufReadFmt(&it, "{<1r}", out) && (out == 0xAB);
        Buf              b     = BufInit(&alloc);
        bool             ok    = BufWriteFmt(&b, "{<2r}", (u16)0xBEEF);
        BufIter          it    = BufIterFromBuf(&b);
        u16              v     = 0;
        ok                     = ok && BufReadFmt(&it, "{<2r}", v) && (v == 0xBEEF);
        } got      = {0};
        bool    ok = BufWriteFmt(&b, "{<8r}", (u64)0x0102030405060708ULL);
        BufIter it = BufIterFromBuf(&b);
        ok         = ok && BufReadFmt(&it, "{<8r}", got.f) && (got.u == 0x0102030405060708ULL);
        BufDeinit(&b);
Last updated on