00001 #include <algorithm>
00002 #include "StringAppender.h"
00003
00004 namespace oasys {
00005
00006
00007 StringAppender::StringAppender(char* buf, size_t size)
00008 : cur_(buf), remaining_(size), len_(0), desired_(0)
00009 {}
00010
00011
00012 size_t
00013 StringAppender::append(const char* str, size_t len)
00014 {
00015 if (len == 0)
00016 {
00017 len = strlen(str);
00018 }
00019
00020 desired_ += len;
00021
00022 if (remaining_ == 0)
00023 {
00024 return 0;
00025 }
00026
00027 len = std::min(len, remaining_ - 1);
00028 memcpy(cur_, str, len);
00029 cur_[len] = '\0';
00030
00031 cur_ += len;
00032 remaining_ -= len;
00033 len_ += len;
00034
00035 ASSERT(*cur_ == '\0');
00036
00037 return len;
00038 }
00039
00040
00041 size_t
00042 StringAppender::append(char c)
00043 {
00044 ++desired_;
00045
00046 if (remaining_ <= 1)
00047 {
00048 return 0;
00049 }
00050
00051 *cur_ = c;
00052 ++cur_;
00053 --remaining_;
00054 ++len_;
00055 *cur_ = '\0';
00056
00057 ASSERT(*cur_ == '\0');
00058
00059 return 1;
00060 }
00061
00062
00063 size_t
00064 StringAppender::appendf(const char* fmt, ...)
00065 {
00066 va_list ap;
00067 va_start(ap, fmt);
00068 size_t ret = vappendf(fmt, ap);
00069 va_end(ap);
00070
00071 return ret;
00072 }
00073
00074
00075 size_t
00076 StringAppender::vappendf(const char* fmt, va_list ap)
00077 {
00078 size_t ret = vsnprintf(cur_, remaining_, fmt, ap);
00079
00080 desired_ += ret;
00081
00082 if (remaining_ == 0)
00083 {
00084 return 0;
00085 }
00086
00087 ret = std::min(ret, remaining_ - 1);
00088
00089 cur_ += ret;
00090 remaining_ -= ret;
00091 len_ += ret;
00092
00093 ASSERT(*cur_ == '\0');
00094
00095 return ret;
00096 }
00097
00098 }