- add sources.
[platform/framework/web/crosswalk.git] / src / ppapi / native_client / src / untrusted / nacl_ppapi_util / string_buffer.cc
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
11 namespace nacl {
12
13 StringBuffer::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
24 void StringBuffer::DiscardOutput() {
25   insert_ = 0;
26   buffer_[0] = '\0';
27 }
28
29 StringBuffer::~StringBuffer() {
30   nbytes_ = 0;
31   insert_ = 0;
32   free(buffer_);
33   buffer_ = NULL;
34 }
35
36 void 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