Path: blob/master/compat/jansson/strbuffer.c
1292 views
/*1* Copyright (c) 2009-2013 Petri Lehtinen <[email protected]>2*3* Jansson is free software; you can redistribute it and/or modify4* it under the terms of the MIT license. See LICENSE for details.5*/67#ifndef _GNU_SOURCE8#define _GNU_SOURCE9#endif1011#include <stdlib.h>12#include <string.h>13#include "jansson_private.h"14#include "strbuffer.h"1516#define STRBUFFER_MIN_SIZE 1617#define STRBUFFER_FACTOR 218#define STRBUFFER_SIZE_MAX ((size_t)-1)1920int strbuffer_init(strbuffer_t *strbuff)21{22strbuff->size = STRBUFFER_MIN_SIZE;23strbuff->length = 0;2425strbuff->value = jsonp_malloc(strbuff->size);26if(!strbuff->value)27return -1;2829/* initialize to empty */30strbuff->value[0] = '\0';31return 0;32}3334void strbuffer_close(strbuffer_t *strbuff)35{36if(strbuff->value)37jsonp_free(strbuff->value);3839strbuff->size = 0;40strbuff->length = 0;41strbuff->value = NULL;42}4344void strbuffer_clear(strbuffer_t *strbuff)45{46strbuff->length = 0;47strbuff->value[0] = '\0';48}4950const char *strbuffer_value(const strbuffer_t *strbuff)51{52return strbuff->value;53}5455char *strbuffer_steal_value(strbuffer_t *strbuff)56{57char *result = strbuff->value;58strbuff->value = NULL;59return result;60}6162int strbuffer_append(strbuffer_t *strbuff, const char *string)63{64return strbuffer_append_bytes(strbuff, string, strlen(string));65}6667int strbuffer_append_byte(strbuffer_t *strbuff, char byte)68{69return strbuffer_append_bytes(strbuff, &byte, 1);70}7172int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, size_t size)73{74if(size >= strbuff->size - strbuff->length)75{76size_t new_size;77char *new_value;7879/* avoid integer overflow */80if (strbuff->size > STRBUFFER_SIZE_MAX / STRBUFFER_FACTOR81|| size > STRBUFFER_SIZE_MAX - 182|| strbuff->length > STRBUFFER_SIZE_MAX - 1 - size)83return -1;8485new_size = max(strbuff->size * STRBUFFER_FACTOR,86strbuff->length + size + 1);8788new_value = jsonp_malloc(new_size);89if(!new_value)90return -1;9192memcpy(new_value, strbuff->value, strbuff->length);9394jsonp_free(strbuff->value);95strbuff->value = new_value;96strbuff->size = new_size;97}9899memcpy(strbuff->value + strbuff->length, data, size);100strbuff->length += size;101strbuff->value[strbuff->length] = '\0';102103return 0;104}105106char strbuffer_pop(strbuffer_t *strbuff)107{108if(strbuff->length > 0) {109char c = strbuff->value[--strbuff->length];110strbuff->value[strbuff->length] = '\0';111return c;112}113else114return '\0';115}116117118