/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2010 Joshua Haberman. See LICENSE for details. */ #include "upb_string.h" #include #define UPB_STRING_UNFINALIZED -1 static uint32_t upb_round_up_pow2(uint32_t v) { // http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } upb_string *upb_string_new() { upb_string *str = malloc(sizeof(*str)); str->ptr = NULL; str->size = 0; str->len = UPB_STRING_UNFINALIZED; upb_atomic_refcount_init(&str->refcount, 1); return str; } void _upb_string_free(upb_string *str) { if(str->ptr) free(str->ptr); free(str); } char *upb_string_getrwbuf(upb_string *str, upb_strlen_t len) { assert(str->len == UPB_STRING_UNFINALIZED); if (str->size < len) { str->size = upb_round_up_pow2(len); str->ptr = realloc(str->ptr, str->size); } str->len = len; return str->ptr; }