StringAppender.cc

Go to the documentation of this file.
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 } // namespace oasys

Generated on Thu Jun 7 12:54:29 2007 for DTN Reference Implementation by  doxygen 1.5.1