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)
- In
JSON.h:453:
break; \
} \
StrIterMustNext(&si); \
si = JSkipWhitespace(si); \
\
- In
JSON.h:505:
} \
\
StrIterMustNext(&si); \
} \
} while (0)- In
JSON.h:549:
break; \
} \
StrIterMustNext(&si); \
si = JSkipWhitespace(si); \
\
- In
JSON.h:593:
break; \
} \
StrIterMustNext(&si); \
si = JSkipWhitespace(si); \
\
- In
JSON.h:635:
} \
\
StrIterMustNext(&si); \
} \
} while (0)- In
ArgParse.c:90:
// 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.
- In
Io.c:832:
}
IterMustMove(iter, 1);
StrIterMustNext(&fsi);
continue;
}- In
Io.c:835:
continue;
}
StrIterMustNext(&fsi); // step over '{'
// `{{` escapes to a single literal '{' byte.
char esc = 0;- In
Io.c:844:
}
IterMustMove(iter, 1);
StrIterMustNext(&fsi); // step over second '{'
continue;
}- In
Io.c:851:
char sc = 0;
while (StrIterPeek(&fsi, &sc) && sc != '}') {
StrIterMustNext(&fsi);
}
if (sc != '}') {- In
Io.c:958:
}
StrIterMustNext(&fsi); // step over '}'
}- In
Io.c:1031:
return false;
}
StrIterMustNext(&fsi);
continue;
}- In
Io.c:1034:
continue;
}
StrIterMustNext(&fsi); // step over '{'
// `{{` escapes to a single literal '{' byte.
char esc = 0;- In
Io.c:1041:
return false;
}
StrIterMustNext(&fsi); // step over second '{'
continue;
}- In
Io.c:1048:
char sc = 0;
while (StrIterPeek(&fsi, &sc) && sc != '}') {
StrIterMustNext(&fsi);
}
if (sc != '}') {- In
Io.c:1072:
return false;
}
StrIterMustNext(&fsi); // step over '}'
}
if (arg_index != argc) {- In
Io.c:2659:
while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
StrIterMustNext(&si);
}- In
Io.c:2677:
Zstr start = StrIterDataAt(&si, StrIterIndex(&si));
while (StrIterPeek(&si, &c) && !IS_SPACE(c)) {
StrIterMustNext(&si);
}- In
Io.c:2712:
// 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 == '-')) {- In
Io.c:2715:
if (StrIterPeek(&si, &c) && (c == '+' || c == '-')) {
StrIterMustNext(&si);
}- In
Io.c:2724:
while (StrIterPeek(&si, &c) && IS_DIGIT(c)) {
StrIterMustNext(&si);
}
break;- In
Io.c:2733:
}
StrIterMustNext(&si);
}- In
Io.c:2772:
while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
StrIterMustNext(&si);
}- In
Io.c:2794:
}
StrIterMustNext(&si);
}- In
Io.c:2891:
\
while (StrIterPeek(&si, &c) && IS_SPACE(c)) { \
StrIterMustNext(&si); \
} \
\
- In
Io.c:2905:
break; \
} \
StrIterMustNext(&si); \
} \
\
- In
Io.c:3189:
while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
StrIterMustNext(&si);
}- In
Io.c:3212:
while (StrIterPeek(&si, &c) && IS_XDIGIT(c)) {
StrIterMustNext(&si);
}- In
Io.c:3253:
while (StrIterPeek(&si, &c) && c >= '0' && c <= '7') {
StrIterMustNext(&si);
}- In
Io.c:3287:
while (StrIterPeek(&si, &c) && (c == '0' || c == '1')) {
StrIterMustNext(&si);
}- In
Io.c:3325:
while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
StrIterMustNext(&si);
}- In
Io.c:3341:
(void)StrIterPeek(&si, &d0);
if (d0 == '+') {
StrIterMustNext(&si);
digits_saved = si;
}- In
Io.c:3364:
while (StrIterPeek(&si, &c) && int_fmt_digit_matches_radix(c, radix)) {
StrIterMustNext(&si);
}- In
Io.c:3422:
while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
StrIterMustNext(&si);
}- In
Io.c:3478:
while (StrIterPeek(&si, &c) && IS_SPACE(c)) {
StrIterMustNext(&si);
}- In
Io.c:3496:
Zstr start = StrIterDataAt(&si, StrIterIndex(&si));
while (StrIterPeek(&si, &c) && !IS_SPACE(c)) {
StrIterMustNext(&si);
}- In
Io.c:3530:
// caller's tail.
if ((c == 'e' || c == 'E') && StrIterIndex(&si) > StrIterIndex(&saved)) {
StrIterMustNext(&si);
if (StrIterPeek(&si, &c) && (c == '+' || c == '-')) {- In
Io.c:3533:
if (StrIterPeek(&si, &c) && (c == '+' || c == '-')) {
StrIterMustNext(&si);
}- In
Io.c:3542:
while (StrIterPeek(&si, &c) && IS_DIGIT(c)) {
StrIterMustNext(&si);
}
break;- In
Io.c:3551:
}
StrIterMustNext(&si);
}- In
Dns.c:138:
char c;
while (StrIterPeek(si, &c) && is_hspace(c)) {
StrIterMustNext(si);
}
}- In
Dns.c:147:
char c;
while (StrIterPeek(si, &c) && c != '\n') {
StrIterMustNext(si);
}
if (StrIterRemainingLength(si) > 0) {- In
Dns.c:150:
}
if (StrIterRemainingLength(si) > 0) {
StrIterMustNext(si);
}
}- In
Dns.c:175:
size ip_start = StrIterIndex(&si);
while (StrIterPeek(&si, &c) && !is_hspace(c) && c != '\n') {
StrIterMustNext(&si);
}
u64 ip_len = (u64)(StrIterIndex(&si) - ip_start);- In
Dns.c:209:
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);- In
Dns.c:281:
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);- In
Dns.c:33:
size seg_start = StrIterIndex(&si);
while (StrIterPeek(&si, &c) && c != '.') {
StrIterMustNext(&si);
}
u64 seg_len = (u64)(StrIterIndex(&si) - seg_start);- In
Dns.c:58:
}
if (StrIterPeek(&si, &c) && c == '.') {
StrIterMustNext(&si);
}
}- In
KvConfig.c:82:
char c;
if (StrIterPeek(&si, &c) && c == '\r') {
StrIterMustNext(&si);
}
if (StrIterPeek(&si, &c) && c == '\n') {- In
KvConfig.c:85:
}
if (StrIterPeek(&si, &c) && c == '\n') {
StrIterMustNext(&si);
}
return si;- In
KvConfig.c:93:
char c;
while (StrIterPeek(&si, &c) && kvconfig_is_space(c)) {
StrIterMustNext(&si);
}
return si;- In
KvConfig.c:101:
char c;
while (StrIterPeek(&si, &c) && c != '\n') {
StrIterMustNext(&si);
}
return kvconfig_consume_line_end(si);- In
KvConfig.c:122:
StrPushBackR(key, c);
StrIterMustNext(&si);
}- In
KvConfig.c:150:
char quote = c;
if (quote == '"' || quote == '\'') {
StrIterMustNext(&si);
while (StrIterPeek(&si, &c)) {- In
KvConfig.c:154:
while (StrIterPeek(&si, &c)) {
if (c == quote) {
StrIterMustNext(&si);
return si;
}- In
KvConfig.c:159:
if (c == '\\') {
StrIterMustNext(&si);
if (!StrIterPeek(&si, &c)) {
LOG_ERROR("Unexpected end of quoted config value");- In
KvConfig.c:182:
}
StrIterMustNext(&si);
continue;
}- In
KvConfig.c:187:
StrPushBackR(value, c);
StrIterMustNext(&si);
}- In
KvConfig.c:210:
StrPushBackR(value, c);
StrIterMustNext(&si);
}- In
KvConfig.c:244:
}
StrIterMustNext(&si);
si = KvConfigReadValue(si, value);- In
KvConfig.c:289:
while (StrIterPeek(&si, &c)) {
if (c == '\n') {
StrIterMustNext(&si);
continue;
}- In
ProcMaps.c:55:
break;
v = (v << 4) | (u64)d;
StrIterMustNext(si);
++consumed;
}- In
ProcMaps.c:68:
if (!StrIterPeek(si, &c) || c != want)
return false;
StrIterMustNext(si);
return true;
}- In
ProcMaps.c:75:
char c;
while (StrIterPeek(si, &c) && (c == ' ' || c == '\t')) {
StrIterMustNext(si);
}
}- In
ProcMaps.c:83:
char c;
while (StrIterPeek(si, &c) && c != ' ' && c != '\t' && c != '\n') {
StrIterMustNext(si);
}
}- In
ProcMaps.c:144:
char c;
while (StrIterPeek(si, &c) && c != '\n') {
StrIterMustNext(si);
}
size line_terminator_pos = StrIterIndex(si);- In
ProcMaps.c:160:
// covers single-byte writes to the underlying storage.
*StrIterDataAt(si, line_terminator_pos) = '\0';
StrIterMustNext(si);
}
return true;- In
ProcMaps.c:181:
char c;
while (StrIterPeek(&si, &c) && c != '\n') {
StrIterMustNext(&si);
}
if (StrIterRemainingLength(&si)) {- In
ProcMaps.c:184:
}
if (StrIterRemainingLength(&si)) {
StrIterMustNext(&si);
}
continue;- In
JSON.c:26:
return saved_si;
}
StrIterMustNext(&si);
si = JSkipWhitespace(si);- In
JSON.c:50:
return saved_si;
}
StrIterMustNext(&si); // skip comma
si = JSkipWhitespace(si);
}- In
JSON.c:73:
return saved_si;
}
StrIterMustNext(&si);
si = JSkipWhitespace(si);- In
JSON.c:103:
}
StrIterMustNext(&si);
DefaultAllocatorDeinit(&scratch);
return si;- In
JSON.c:121:
return saved_si;
}
StrIterMustNext(&si);
si = JSkipWhitespace(si);- In
JSON.c:134:
return saved_si;
}
StrIterMustNext(&si); // skip comma
si = JSkipWhitespace(si);
}- In
JSON.c:160:
}
StrIterMustNext(&si);
return si;
}- In
JSON.c:172:
case '\r' :
case '\n' :
StrIterMustNext(&si);
break;
default :- In
JSON.c:196:
char c;
if (StrIterPeek(&si, &c) && c == '"') {
StrIterMustNext(&si);
// while a printable character
- In
JSON.c:207:
// end of string
case '"' :
StrIterMustNext(&si);
return si;- In
JSON.c:212:
// starting of an escape sequence
case '\\' :
StrIterMustNext(&si);
if (!StrIterPeek(&si, &c)) {
LOG_ERROR("Unexpected end of string.");- In
JSON.c:223:
case '\\' :
StrPushBackR(str, '\\');
StrIterMustNext(&si);
break;- In
JSON.c:228:
case '"' :
StrPushBackR(str, '"');
StrIterMustNext(&si);
break;- In
JSON.c:233:
case '/' :
StrPushBackR(str, '/');
StrIterMustNext(&si);
break;- In
JSON.c:238:
case 'b' :
StrPushBackR(str, '\b');
StrIterMustNext(&si);
break;- In
JSON.c:243:
case 'f' :
StrPushBackR(str, '\f');
StrIterMustNext(&si);
break;- In
JSON.c:248:
case 'n' :
StrPushBackR(str, '\n');
StrIterMustNext(&si);
break;- In
JSON.c:253:
case 'r' :
StrPushBackR(str, '\r');
StrIterMustNext(&si);
break;- In
JSON.c:258:
case 't' :
StrPushBackR(str, '\t');
StrIterMustNext(&si);
break;- In
JSON.c:287:
default :
StrPushBackR(str, c);
StrIterMustNext(&si);
break;
}- In
JSON.c:317:
if (StrIterPeek(&si, &c) && c == '-') {
is_neg = true;
StrIterMustNext(&si);
}- In
JSON.c:338:
is_flt = true;
StrPushBackR(&ns, c);
StrIterMustNext(&si);
break;- In
JSON.c:350:
is_flt = true;
StrPushBackR(&ns, c);
StrIterMustNext(&si);
break;- In
JSON.c:364:
case '9' :
StrPushBackR(&ns, c);
StrIterMustNext(&si);
break;- In
JSON.c:390:
has_exp_plus_minus = true;
StrPushBackR(&ns, c);
StrIterMustNext(&si);
break;- In
StrIter.c:70:
bool test_striter_peek_prev_forward(void) {
StrIter si = StrIterFromZstr("abc");
StrIterMustNext(&si); // -> 'b'
char c = 0;
if (!StrIterPeekPrev(&si, &c) || c != 'a') {- In
StrIter.c:82:
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