static bool srprs_val_name(const char** ptr, cbuf* name) { const char* pos = *ptr; const size_t spos = cbuf_getpos(name); if ( !srprs_skipws(&pos) ) { goto fail; } if ( srprs_char(&pos, '@') ) { cbuf_puts(name, "", -1); } else if (!srprs_quoted_string(&pos, name, NULL)) { goto fail; } if (!srprs_skipws(&pos) || !srprs_char(&pos, '=')) { goto fail; } *ptr = pos; return true; fail: cbuf_setpos(name, spos); return false; }
static bool srprs_key(const char** ptr, cbuf* key, bool* del) { const char* pos = *ptr; const char* closing_bracket_pos = NULL; size_t closing_bracket_idx = 0; if (!srprs_skipws(&pos) || !srprs_char(&pos, '[')) { return false; } *del = srprs_char(&pos, '-'); cbuf_clear(key); while (true) { while (srprs_charsetinv(&pos, "]\\", key)) ; switch (*pos) { case ']': closing_bracket_idx = cbuf_getpos(key); closing_bracket_pos = pos; cbuf_putc(key, ']'); pos++; break; case '\\': cbuf_putc(key, '\\'); /* n++; */ /* cbuf_puts(subkeyidx, cbuf_getpos(key), sizeof(size_t)) */ while (srprs_char(&pos,'\\')) ; break; case '\0': if (closing_bracket_pos == NULL) { return false; } /* remove trailing backslash (if any) */ if (*(closing_bracket_pos-1)=='\\') { closing_bracket_idx--; } cbuf_setpos(key, closing_bracket_idx); *ptr = closing_bracket_pos+1; return true; default: assert(false); } } }
static bool srprs_nl_no_eos(const char** ptr, cbuf* str, bool eof) { const char* pos = *ptr; const size_t spos = cbuf_getpos(str); if( srprs_nl(&pos, str) && (eof || *pos != '\0')) { *ptr = pos; return true; } cbuf_setpos(str, spos); return false; }
cbuf* cbuf_clear(cbuf* b) { cbuf_setpos(b, 0); return b; }