Skip to content
StrIterMustNext

StrIterMustNext

Description

Aborting variant of StrIterNext. Alias for IterMustNext; see IterMustNext for the full contract.

Parameters

Name Direction Description
si in Pointer to the StrIter cursor to advance.

Success

Cursor advances one character; returns to the caller.

Failure

Does not return – aborts via LOG_FATAL when the iterator is already exhausted.

Usage example (Cross-references)

Usage examples (Cross-references)
                break;                                                                                                     \
            }                                                                                                              \
            StrIterMustNext(&si);                                                                                          \
            si = JSkipWhitespace(si);                                                                                      \
                                                                                                                           \
                }                                                                                                          \
                                                                                                                           \
                StrIterMustNext(&si);                                                                                      \
            }                                                                                                              \
        } while (0)
                break;                                                                                                     \
            }                                                                                                              \
            StrIterMustNext(&si);                                                                                          \
            si = JSkipWhitespace(si);                                                                                      \
                                                                                                                           \
                    break;                                                                                                 \
                }                                                                                                          \
                StrIterMustNext(&si);                                                                                      \
                si = JSkipWhitespace(si);                                                                                  \
                                                                                                                           \
                }                                                                                                          \
                                                                                                                           \
                StrIterMustNext(&si);                                                                                      \
            }                                                                                                              \
        } while (0)
            // Audit: precondition is the loop-head StrIterPeek above; a successful
            // peek proves >=1 byte remains, which is exactly what MustNext consumes.
            StrIterMustNext(&si);
        }
        // No digits consumed (cursor at entry) or trailing junk after digits.
                }
                IterMustMove(iter, 1);
                StrIterMustNext(&fsi);
                continue;
            }
                continue;
            }
            StrIterMustNext(&fsi); // step over '{'
            // `{​{` escapes to a single literal '{' byte.
            char esc = 0;
                }
                IterMustMove(iter, 1);
                StrIterMustNext(&fsi); // step over second '{'
                continue;
            }
            char    sc             = 0;
            while (StrIterPeek(&fsi, &sc) && sc != '}') {
                StrIterMustNext(&fsi);
            }
            if (sc != '}') {
            }
    
            StrIterMustNext(&fsi); // step over '}'
        }
                    return false;
                }
                StrIterMustNext(&fsi);
                continue;
            }
                continue;
            }
            StrIterMustNext(&fsi); // step over '{'
            // `{​{` escapes to a single literal '{' byte.
            char esc = 0;
                    return false;
                }
                StrIterMustNext(&fsi); // step over second '{'
                continue;
            }
            char    sc             = 0;
            while (StrIterPeek(&fsi, &sc) && sc != '}') {
                StrIterMustNext(&fsi);
            }
            if (sc != '}') {
                return false;
            }
            StrIterMustNext(&fsi); // step over '}'
        }
        if (arg_index != argc) {
    
        while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
            StrIterMustNext(&si);
        }
            Zstr    start = StrIterDataAt(&si, StrIterIndex(&si));
            while (StrIterPeek(&si, &c) && !IS_SPACE(c)) {
                StrIterMustNext(&si);
            }
            // caller's tail (e.g. a unit suffix).
            if ((c == 'e' || c == 'E') && StrIterIndex(&si) > StrIterIndex(&saved)) {
                StrIterMustNext(&si);
    
                if (StrIterPeek(&si, &c) && (c == '+' || c == '-')) {
    
                if (StrIterPeek(&si, &c) && (c == '+' || c == '-')) {
                    StrIterMustNext(&si);
                }
    
                while (StrIterPeek(&si, &c) && IS_DIGIT(c)) {
                    StrIterMustNext(&si);
                }
                break;
            }
    
            StrIterMustNext(&si);
        }
    
        while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
            StrIterMustNext(&si);
        }
            }
    
            StrIterMustNext(&si);
        }
                                                                                                                           \
            while (StrIterPeek(&si, &c) && IS_SPACE(c)) {                                                                  \
                StrIterMustNext(&si);                                                                                      \
            }                                                                                                              \
                                                                                                                           \
                    break;                                                                                                 \
                }                                                                                                          \
                StrIterMustNext(&si);                                                                                      \
            }                                                                                                              \
                                                                                                                           \
    
        while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
            StrIterMustNext(&si);
        }
    
            while (StrIterPeek(&si, &c) && IS_XDIGIT(c)) {
                StrIterMustNext(&si);
            }
    
            while (StrIterPeek(&si, &c) && c >= '0' && c <= '7') {
                StrIterMustNext(&si);
            }
    
        while (StrIterPeek(&si, &c) && (c == '0' || c == '1')) {
            StrIterMustNext(&si);
        }
    
        while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
            StrIterMustNext(&si);
        }
        (void)StrIterPeek(&si, &d0);
        if (d0 == '+') {
            StrIterMustNext(&si);
            digits_saved = si;
        }
    
        while (StrIterPeek(&si, &c) && int_fmt_digit_matches_radix(c, radix)) {
            StrIterMustNext(&si);
        }
    
        while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
            StrIterMustNext(&si);
        }
    
        while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
            StrIterMustNext(&si);
        }
            Zstr    start = StrIterDataAt(&si, StrIterIndex(&si));
            while (StrIterPeek(&si, &c) && !IS_SPACE(c)) {
                StrIterMustNext(&si);
            }
            // caller's tail.
            if ((c == 'e' || c == 'E') && StrIterIndex(&si) > StrIterIndex(&saved)) {
                StrIterMustNext(&si);
    
                if (StrIterPeek(&si, &c) && (c == '+' || c == '-')) {
    
                if (StrIterPeek(&si, &c) && (c == '+' || c == '-')) {
                    StrIterMustNext(&si);
                }
    
                while (StrIterPeek(&si, &c) && IS_DIGIT(c)) {
                    StrIterMustNext(&si);
                }
                break;
            }
    
            StrIterMustNext(&si);
        }
        char c;
        while (StrIterPeek(si, &c) && is_hspace(c)) {
            StrIterMustNext(si);
        }
    }
        char c;
        while (StrIterPeek(si, &c) && c != '\n') {
            StrIterMustNext(si);
        }
        if (StrIterRemainingLength(si) > 0) {
        }
        if (StrIterRemainingLength(si) > 0) {
            StrIterMustNext(si);
        }
    }
            size ip_start = StrIterIndex(&si);
            while (StrIterPeek(&si, &c) && !is_hspace(c) && c != '\n') {
                StrIterMustNext(&si);
            }
            u64 ip_len = (u64)(StrIterIndex(&si) - ip_start);
                size nm_start = StrIterIndex(&si);
                while (StrIterPeek(&si, &c) && !is_hspace(c) && c != '\n' && c != '#') {
                    StrIterMustNext(&si);
                }
                u64 nm_len = (u64)(StrIterIndex(&si) - nm_start);
                size ip_start = StrIterIndex(&si);
                while (StrIterPeek(&si, &c) && !is_hspace(c) && c != '\n' && c != '#') {
                    StrIterMustNext(&si);
                }
                u64 ip_len = (u64)(StrIterIndex(&si) - ip_start);
            size seg_start = StrIterIndex(&si);
            while (StrIterPeek(&si, &c) && c != '.') {
                StrIterMustNext(&si);
            }
            u64 seg_len = (u64)(StrIterIndex(&si) - seg_start);
            }
            if (StrIterPeek(&si, &c) && c == '.') {
                StrIterMustNext(&si);
            }
        }
        char c;
        if (StrIterPeek(&si, &c) && c == '\r') {
            StrIterMustNext(&si);
        }
        if (StrIterPeek(&si, &c) && c == '\n') {
        }
        if (StrIterPeek(&si, &c) && c == '\n') {
            StrIterMustNext(&si);
        }
        return si;
        char c;
        while (StrIterPeek(&si, &c) && kvconfig_is_space(c)) {
            StrIterMustNext(&si);
        }
        return si;
        char c;
        while (StrIterPeek(&si, &c) && c != '\n') {
            StrIterMustNext(&si);
        }
        return kvconfig_consume_line_end(si);
    
            StrPushBackR(key, c);
            StrIterMustNext(&si);
        }
        char quote = c;
        if (quote == '"' || quote == '\'') {
            StrIterMustNext(&si);
    
            while (StrIterPeek(&si, &c)) {
            while (StrIterPeek(&si, &c)) {
                if (c == quote) {
                    StrIterMustNext(&si);
                    return si;
                }
    
                if (c == '\\') {
                    StrIterMustNext(&si);
                    if (!StrIterPeek(&si, &c)) {
                        LOG_ERROR("Unexpected end of quoted config value");
                    }
    
                    StrIterMustNext(&si);
                    continue;
                }
    
                StrPushBackR(value, c);
                StrIterMustNext(&si);
            }
    
            StrPushBackR(value, c);
            StrIterMustNext(&si);
        }
        }
    
        StrIterMustNext(&si);
        si = KvConfigReadValue(si, value);
            while (StrIterPeek(&si, &c)) {
                if (c == '\n') {
                    StrIterMustNext(&si);
                    continue;
                }
                break;
            v = (v << 4) | (u64)d;
            StrIterMustNext(si);
            ++consumed;
        }
        if (!StrIterPeek(si, &c) || c != want)
            return false;
        StrIterMustNext(si);
        return true;
    }
        char c;
        while (StrIterPeek(si, &c) && (c == ' ' || c == '\t')) {
            StrIterMustNext(si);
        }
    }
        char c;
        while (StrIterPeek(si, &c) && c != ' ' && c != '\t' && c != '\n') {
            StrIterMustNext(si);
        }
    }
        char c;
        while (StrIterPeek(si, &c) && c != '\n') {
            StrIterMustNext(si);
        }
        size line_terminator_pos = StrIterIndex(si);
            // covers single-byte writes to the underlying storage.
            *StrIterDataAt(si, line_terminator_pos) = '\0';
            StrIterMustNext(si);
        }
        return true;
                char c;
                while (StrIterPeek(&si, &c) && c != '\n') {
                    StrIterMustNext(&si);
                }
                if (StrIterRemainingLength(&si)) {
                }
                if (StrIterRemainingLength(&si)) {
                    StrIterMustNext(&si);
                }
                continue;
            return saved_si;
        }
        StrIterMustNext(&si);
        si = JSkipWhitespace(si);
                    return saved_si;
                }
                StrIterMustNext(&si); // skip comma
                si = JSkipWhitespace(si);
            }
                return saved_si;
            }
            StrIterMustNext(&si);
            si = JSkipWhitespace(si);
        }
    
        StrIterMustNext(&si);
        DefaultAllocatorDeinit(&scratch);
        return si;
            return saved_si;
        }
        StrIterMustNext(&si);
        si = JSkipWhitespace(si);
                    return saved_si;
                }
                StrIterMustNext(&si); // skip comma
                si = JSkipWhitespace(si);
            }
        }
    
        StrIterMustNext(&si);
        return si;
    }
                case '\r' :
                case '\n' :
                    StrIterMustNext(&si);
                    break;
                default :
        char c;
        if (StrIterPeek(&si, &c) && c == '"') {
            StrIterMustNext(&si);
    
            // while a printable character
                    // end of string
                    case '"' :
                        StrIterMustNext(&si);
                        return si;
                    // starting of an escape sequence
                    case '\\' :
                        StrIterMustNext(&si);
                        if (!StrIterPeek(&si, &c)) {
                            LOG_ERROR("Unexpected end of string.");
                            case '\\' :
                                StrPushBackR(str, '\\');
                                StrIterMustNext(&si);
                                break;
                            case '"' :
                                StrPushBackR(str, '"');
                                StrIterMustNext(&si);
                                break;
                            case '/' :
                                StrPushBackR(str, '/');
                                StrIterMustNext(&si);
                                break;
                            case 'b' :
                                StrPushBackR(str, '\b');
                                StrIterMustNext(&si);
                                break;
                            case 'f' :
                                StrPushBackR(str, '\f');
                                StrIterMustNext(&si);
                                break;
                            case 'n' :
                                StrPushBackR(str, '\n');
                                StrIterMustNext(&si);
                                break;
                            case 'r' :
                                StrPushBackR(str, '\r');
                                StrIterMustNext(&si);
                                break;
                            case 't' :
                                StrPushBackR(str, '\t');
                                StrIterMustNext(&si);
                                break;
                    default :
                        StrPushBackR(str, c);
                        StrIterMustNext(&si);
                        break;
                }
        if (StrIterPeek(&si, &c) && c == '-') {
            is_neg = true;
            StrIterMustNext(&si);
        }
                    is_flt  = true;
                    StrPushBackR(&ns, c);
                    StrIterMustNext(&si);
                    break;
                    is_flt = true;
                    StrPushBackR(&ns, c);
                    StrIterMustNext(&si);
                    break;
                case '9' :
                    StrPushBackR(&ns, c);
                    StrIterMustNext(&si);
                    break;
                    has_exp_plus_minus = true;
                    StrPushBackR(&ns, c);
                    StrIterMustNext(&si);
                    break;
    bool test_striter_peek_prev_forward(void) {
        StrIter si = StrIterFromZstr("abc");
        StrIterMustNext(&si); // -> 'b'
        char c = 0;
        if (!StrIterPeekPrev(&si, &c) || c != 'a') {
    bool test_striter_peek_next_at_last_fails(void) {
        StrIter si = StrIterFromZstr("ab");
        StrIterMustNext(&si); // -> 'b' (last)
        char c = 0x7F;
        if (StrIterPeekNext(&si, &c)) {
                break;                                                                                                     \
            }                                                                                                              \
            StrIterMustNext(&si);                                                                                          \
            si = JSkipWhitespace(si);                                                                                      \
            StrIter UNPL(read_si);                                                                                         \
                        break;                                                                                             \
                    }                                                                                                      \
                    StrIterMustNext(&si);                                                                                  \
                    si = JSkipWhitespace(si);                                                                              \
                }                                                                                                          \
                    break;                                                                                                 \
                }                                                                                                          \
                StrIterMustNext(&si);                                                                                      \
                si                           = JSkipWhitespace(si);                                                        \
                StrIter UNPL(si_before_read) = si;                                                                         \
                    break;                                                                                                 \
                }                                                                                                          \
                StrIterMustNext(&si);                                                                                      \
            }                                                                                                              \
        } while (0)
Last updated on