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