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.

Usage example (Cross-references)

Usage examples (Cross-references)
                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);
        }
        // No digits consumed (cursor at entry) or trailing junk after digits.
        if (StrIterRemainingLength(&si) == StrIterLength(&si) || StrIterRemainingLength(&si) != 0)
            return false;
        if (v > hi)
    
        // perms: 4 chars
        if (StrIterRemainingLength(si) < 4)
            return false;
        u32  perms = 0;
        // so path 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);
                }
            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')) {
    
    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;
        }
                                // JSON like `"\u"` / `"\u12"` would DoS the
                                // process otherwise.
                                if (StrIterRemainingLength(&si) < 5) {
                                    LOG_ERROR("Truncated \\uXXXX escape in JSON string.");
                                    StrClear(str);
    
    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;
        }
                // Trailing dot at the end is valid (means root); leading or
                // middle empty labels are not.
                if (StrIterRemainingLength(&si) == 0) {
                    break;
                }
    #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;
        }
    #define JR_ARR(si, reader)                                                                                             \
        do {                                                                                                               \
            if (!StrIterRemainingLength(&si)) {                                                                            \
                break;                                                                                                     \
            }                                                                                                              \
    #define JR_OBJ(si, reader)                                                                                             \
        do {                                                                                                               \
            if (!StrIterRemainingLength(&si)) {                                                                            \
                break;                                                                                                     \
            }                                                                                                              \
Last updated on