Skip to content
StrIterRemainingLength

StrIterRemainingLength

Description

Characters remaining to read in the iteration direction. Alias- reframe of IterRemainingLength in string vocabulary. See IterRemainingLength for the full contract.

Parameters

Name Direction Description
mi in Pointer to the StrIter to measure.

Success

Returns the count of characters remaining to read in the iteration direction (0 once past the end/start).

Failure

Macro cannot fail.

Usage example (Cross-references)

Usage examples (Cross-references)
    #define JR_ARR(si, reader)                                                                                             \
        do {                                                                                                               \
            if (!StrIterRemainingLength(&si)) {                                                                            \
                break;                                                                                                     \
            }                                                                                                              \
    #define JR_OBJ(si, reader)                                                                                             \
        do {                                                                                                               \
            if (!StrIterRemainingLength(&si)) {                                                                            \
                break;                                                                                                     \
            }                                                                                                              \
        }
        // No digits consumed (cursor at entry) or trailing junk after digits.
        if (StrIterRemainingLength(&si) == StrIterLength(&si) || StrIterRemainingLength(&si) != 0)
            return false;
        if (v > hi)
                LOG_FATAL("buf_read_fmt: unterminated {​{ in fmt");
            }
            u32 spec_len = (u32)(StrIterRemainingLength(&spec_start_fsi) - StrIterRemainingLength(&fsi));
    
            FmtInfo fmt_info = {0};
                LOG_FATAL("buf_*_fmt: unterminated {​{ in fmt");
            }
            u32 spec_len = (u32)(StrIterRemainingLength(&spec_start_fsi) - StrIterRemainingLength(&fsi));
    
            FmtInfo fmt_info = {0};
        }
    
        if (!StrIterRemainingLength(&si)) {
            LOG_ERROR("Failed to parse f64: empty input");
            DefaultAllocatorDeinit(&scratch);
        }
    
        if (!StrIterRemainingLength(&si)) {
            LOG_ERROR("Failed to parse u8: empty input");
            DefaultAllocatorDeinit(&scratch);
            }                                                                                                              \
                                                                                                                           \
            if (!StrIterRemainingLength(&si)) {                                                                            \
                LOG_ERROR("Failed to parse " #NAME ": empty input");                                                       \
                DefaultAllocatorDeinit(&scratch);                                                                          \
        }
    
        if (!StrIterRemainingLength(&si)) {
            LOG_ERROR("Empty input string");
            return StrIterDataAt(&si, StrIterIndex(&si));
        }
    
        if (!StrIterRemainingLength(&si)) {
            LOG_ERROR("Failed to parse Int: empty input");
            return StrIterDataAt(&si, StrIterIndex(&si));
        }
    
        if (!StrIterRemainingLength(&si)) {
            LOG_ERROR("Failed to parse Float: empty input");
            StrDeinit(&temp);
        }
    
        if (!StrIterRemainingLength(&si)) {
            LOG_ERROR("Failed to parse f32: empty input");
            DefaultAllocatorDeinit(&scratch);
            StrIterMustNext(si);
        }
        if (StrIterRemainingLength(si) > 0) {
            StrIterMustNext(si);
        }
        StrIter si = StrIterFromStr(buf);
        char    c;
        while (StrIterRemainingLength(&si)) {
            skip_hspace_iter(&si);
        StrIter si = StrIterFromStr(buf);
        char    c;
        while (StrIterRemainingLength(&si)) {
            skip_hspace_iter(&si);
            // `kw_len` for the required separator -- both bounds-checked.
            char sep;
            if (StrIterRemainingLength(&si) > kw_len &&
                MemCompare(StrIterDataAt(&si, StrIterIndex(&si)), NS_KEYWORD, kw_len) == 0 &&
                StrIterPeekAt(&si, (i64)kw_len, &sep) && (sep == ' ' || sep == '\t')) {
                // Trailing dot at the end is valid (means root); leading or
                // middle empty labels are not.
                if (StrIterRemainingLength(&si) == 0) {
                    break;
                }
    
        // perms: 4 chars
        if (StrIterRemainingLength(si) < 4)
            return false;
        u32  perms = 0;
        // slices that alias the buffer are usable as `Zstr`.
        StrIter si = StrIterFromStr(out->raw);
        while (StrIterRemainingLength(&si)) {
            ProcMapEntry e = {0};
            if (!parse_one_line(&si, &e)) {
                    StrIterMustNext(&si);
                }
                if (StrIterRemainingLength(&si)) {
                    StrIterMustNext(&si);
                }
    
    static StrIter JSkipObject(StrIter si) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
    
    static StrIter JSkipArray(StrIter si) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
    
    StrIter JReadString(StrIter si, Str *str) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
    
    StrIter JReadNumber(StrIter si, Number *num) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
    
    StrIter JReadInteger(StrIter si, i64 *val) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
    
    StrIter JReadFloat(StrIter si, f64 *val) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
    
    StrIter JReadBool(StrIter si, bool *b) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
    
        char c;
        if (StrIterRemainingLength(&si) >= 4) {
            if (StrIterPeek(&si, &c) && c == 't') {
                Zstr pos = StrIterPos(&si);
            }
    
            if (StrIterRemainingLength(&si) >= 5) {
                if (StrIterPeek(&si, &c) && c == 'f') {
                    Zstr pos = StrIterPos(&si);
    
    StrIter JReadNull(StrIter si, bool *is_null) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
        *is_null = false;
        char c;
        if (StrIterRemainingLength(&si) >= 4) {
            if (StrIterPeek(&si, &c) && c == 'n') {
                Zstr pos = StrIterPos(&si);
    
    StrIter JSkipValue(StrIter si) {
        if (!StrIterRemainingLength(&si)) {
            return si;
        }
    bool test_striter_from_zstr_length_and_read(void) {
        StrIter si = StrIterFromZstr("abc");
        if (StrIterRemainingLength(&si) != 3) {
            return false;
        }
    bool test_striter_from_cstr_caps_length(void) {
        StrIter si = StrIterFromCstr("abcd", 2);
        if (StrIterRemainingLength(&si) != 2) {
            return false;
        }
    #define JR_OBJ(si, reader)                                                                                             \
        do {                                                                                                               \
            if (!StrIterRemainingLength(&si)) {                                                                            \
                break;                                                                                                     \
            }                                                                                                              \
        bool success = true;
    
        if (!StrIterRemainingLength(&si)) {
            WriteFmt("[DEBUG] Remaining length check failed: expected > 0, got {}\n", StrIterRemainingLength(&si));
            success = false;
    
        if (!StrIterRemainingLength(&si)) {
            WriteFmt("[DEBUG] Remaining length check failed: expected > 0, got {}\n", StrIterRemainingLength(&si));
            success = false;
        }
Last updated on