Reproduce the following C code EXACTLY, character for character, inside a single code block and output nothing else:

```c
static uint32_t clamp_u32(uint32_t v, uint32_t lo, uint32_t hi) {
    if (v < lo) return lo;
    if (v > hi) return hi;
    return v;
}

static uint32_t ring_advance(uint32_t pos, uint32_t cap) {
    uint32_t next = pos + 1u;
    return next >= cap ? 0u : next;
}

static int scratch_init(scratch *s, uint32_t ctx_size) {
    if (ctx_size == 0u) ctx_size = 1u;
    s->ctx_size = ctx_size;
    s->comp_cap = ctx_size / 4u + 2u;
    s->rows = clamp_u32(s->comp_cap, 1u, 4096u);
    s->head = 0u;
    return s->rows > 0u ? 0 : -1;
}
```
