00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <stdlib.h>
00040
00041 #include "StringBuffer.h"
00042 #include "StringUtils.h"
00043
00044 #include "ExpandableBuffer.h"
00045 #include "io/IOClient.h"
00046
00047 namespace oasys {
00048
00049 StringBuffer::StringBuffer(size_t initsz, const char* initstr)
00050 : buf_(0), own_buf_(true)
00051 {
00052 buf_ = new ExpandableBuffer();
00053 ASSERT(buf_ != 0);
00054
00055 ASSERT(initsz != 0);
00056 buf_->reserve(initsz);
00057
00058 if (initstr) {
00059 append(initstr);
00060 }
00061 }
00062
00063 StringBuffer::StringBuffer(const char* fmt, ...)
00064 : buf_(0), own_buf_(true)
00065 {
00066 buf_ = new ExpandableBuffer();
00067 ASSERT(buf_);
00068 buf_->reserve(256);
00069
00070 if (fmt != 0)
00071 {
00072 va_list ap;
00073 va_start(ap, fmt);
00074 vappendf(fmt, ap);
00075 va_end(ap);
00076 }
00077 }
00078
00079 StringBuffer::StringBuffer(ExpandableBuffer* buffer, bool own_buf)
00080 : buf_(buffer), own_buf_(own_buf)
00081 {
00082 ASSERT(buf_ != 0);
00083 buf_->reserve(256);
00084 }
00085
00086 StringBuffer::~StringBuffer()
00087 {
00088 if (own_buf_)
00089 delete_z(buf_);
00090 }
00091
00092 const char*
00093 StringBuffer::c_str() const
00094 {
00095
00096
00097 if (buf_->len() == 0 || (*buf_->at(buf_->len() - 1) != '\0'))
00098 {
00099 if (buf_->nfree() == 0) {
00100 buf_->reserve(buf_->len() + 1);
00101 }
00102
00103 *buf_->end() = '\0';
00104 }
00105
00106 return data();
00107 }
00108
00109 size_t
00110 StringBuffer::append(const char* str, size_t len)
00111 {
00112 if (len == 0) {
00113 len = strlen(str);
00114 }
00115
00116
00117 ASSERT(len <= strlen(str));
00118
00119 buf_->reserve(buf_->len() + len);
00120 memcpy(buf_->end(), str, len);
00121 buf_->set_len(buf_->len() + len);
00122
00123 return len;
00124 }
00125
00126 size_t
00127 StringBuffer::append(char c)
00128 {
00129 buf_->reserve(buf_->len() + 1);
00130 *buf_->end() = c;
00131 buf_->set_len(buf_->len() + 1);
00132
00133 return 1;
00134 }
00135
00136 size_t
00137 StringBuffer::append_int(u_int32_t val, int base)
00138 {
00139 char tmp[16];
00140 size_t len = fast_ultoa(val, base, &tmp[15]);
00141
00142 ASSERT(len < 16);
00143
00144 buf_->reserve(buf_->len() + len);
00145 memcpy(buf_->end(), &tmp[16 - len], len);
00146 buf_->set_len(buf_->len() + len);
00147
00148 return len;
00149 }
00150
00151 size_t
00152 StringBuffer::vappendf(const char* fmt, va_list ap)
00153 {
00154 if (buf_->nfree() == 0) {
00155 ASSERT(buf_->buf_len() != 0);
00156 buf_->reserve(buf_->buf_len() * 2);
00157 }
00158
00159 int ret = vsnprintf(buf_->end(), buf_->nfree(), fmt, ap);
00160
00161 if (ret == -1)
00162 {
00163
00164
00165
00166
00167
00168
00169
00170 do {
00171 buf_->reserve(buf_->buf_len() * 2);
00172 ret = vsnprintf(buf_->end(), buf_->nfree(), fmt, ap);
00173 } while(ret == -1);
00174
00175
00176
00177 }
00178
00179 if (ret >= buf_->nfree())
00180 {
00181 buf_->reserve(std::max(buf_->len() + ret + 1,
00182 buf_->buf_len() * 2));
00183 buf_->reserve(buf_->len() + ret + 1);
00184 ret = vsnprintf(buf_->end(), buf_->nfree(), fmt, ap);
00185 ASSERT(ret > 0);
00186 ASSERT(ret < buf_->nfree());
00187 }
00188
00189 ASSERT(ret >= 0);
00190 buf_->set_len(buf_->len() + ret);
00191 ASSERT(*buf_->end() == '\0');
00192
00193 return ret;
00194 }
00195
00196 size_t
00197 StringBuffer::appendf(const char* fmt, ...)
00198 {
00199 va_list ap;
00200 va_start(ap, fmt);
00201 size_t ret = vappendf(fmt, ap);
00202 va_end(ap);
00203 return ret;
00204 }
00205
00206 }