upb_textprinter *upb_textprinter_create(upb_env *env, const upb_handlers *h, upb_bytessink *output) { upb_textprinter *p = upb_env_malloc(env, sizeof(upb_textprinter)); if (!p) return NULL; p->output_ = output; upb_sink_reset(&p->input_, h, p); textprinter_reset(p, false); return p; }
upb_pb_encoder *upb_pb_encoder_create(upb_env *env, const upb_handlers *h, upb_bytessink *output) { const size_t initial_bufsize = 256; const size_t initial_segbufsize = 16; // TODO(haberman): make this configurable. const size_t stack_size = 64; #ifndef NDEBUG const size_t size_before = upb_env_bytesallocated(env); #endif upb_pb_encoder *e = upb_env_malloc(env, sizeof(upb_pb_encoder)); if (!e) return NULL; e->buf = upb_env_malloc(env, initial_bufsize); e->segbuf = upb_env_malloc(env, initial_segbufsize * sizeof(*e->segbuf)); e->stack = upb_env_malloc(env, stack_size * sizeof(*e->stack)); if (!e->buf || !e->segbuf || !e->stack) { return NULL; } e->limit = e->buf + initial_bufsize; e->seglimit = e->segbuf + initial_segbufsize; e->stacklimit = e->stack + stack_size; upb_pb_encoder_reset(e); upb_sink_reset(&e->input_, h, e); e->env = env; e->output_ = output; e->subc = output->closure; e->ptr = e->buf; // If this fails, increase the value in encoder.h. assert(upb_env_bytesallocated(env) - size_before <= UPB_PB_ENCODER_SIZE); return e; }