1/* 2 * Copyright (c) 2011 The Chromium Authors. All rights reserved. 3 * Use of this source code is governed by a BSD-style license that can be 4 * found in the LICENSE file. 5 */ 6 7#include <stdarg.h> 8 9#include "ppapi/native_client/src/untrusted/nacl_ppapi_util/string_buffer.h" 10 11namespace nacl { 12 13StringBuffer::StringBuffer() { 14 nbytes_ = 1024; 15 insert_ = 0; 16 buffer_ = reinterpret_cast<char *>(malloc(nbytes_)); 17 if (NULL == buffer_) { 18 perror("StringBuffer Ctor malloc"); 19 abort(); 20 } 21 buffer_[0] = '\0'; 22} 23 24void StringBuffer::DiscardOutput() { 25 insert_ = 0; 26 buffer_[0] = '\0'; 27} 28 29StringBuffer::~StringBuffer() { 30 nbytes_ = 0; 31 insert_ = 0; 32 free(buffer_); 33 buffer_ = NULL; 34} 35 36void StringBuffer::Printf(char const *fmt, ...) { 37 size_t space; 38 char *insert_pt; 39 va_list ap; 40 size_t written = 0; 41 char *new_buffer; 42 43 for (;;) { 44 space = nbytes_ - insert_; 45 insert_pt = buffer_ + insert_; 46 va_start(ap, fmt); 47 written = vsnprintf(insert_pt, space, fmt, ap); 48 va_end(ap); 49 if (written < space) { 50 insert_ += written; 51 break; 52 } 53 // insufficient space -- grow the buffer 54 new_buffer = reinterpret_cast<char *>(realloc(buffer_, 2 * nbytes_)); 55 if (NULL == new_buffer) { 56 // give up 57 fprintf(stderr, "StringBufferPrintf: no memory\n"); 58 break; 59 } 60 nbytes_ *= 2; 61 buffer_ = new_buffer; 62 } 63} 64 65} // namespace nacl 66