The fact that you consider it worth enclosing this block in braces, to limit the scope of its locals, argues equally for making this block a little static function above, so that you can initialize `char *tags = PersistentTagString(ctx, pp);` and avoid making this (already rather long) function any longer.  It only refers to ctx and pp from outside the block, so is nicely self-contained (and the compiler shall almost certainly inline it, so there's no cost at run-time, only a benefit for readers).