parent
c4aecc414b
commit
604c1a78bc
1 changed files with 47 additions and 0 deletions
@ -0,0 +1,47 @@ |
||||
/*
|
||||
* upb - a minimalist implementation of protocol buffers. |
||||
* |
||||
* Copyright (c) 2010 Joshua Haberman. See LICENSE for details. |
||||
*/ |
||||
|
||||
#include "upb_string.h" |
||||
|
||||
#include <stdlib.h> |
||||
|
||||
#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; |
||||
} |
Loading…
Reference in new issue