BaseString& BaseString::appfmt(const char *fmt, ...) { char buf[1]; va_list ap; int l; /* Figure out how long the formatted string will be. A small temporary * buffer is used, because I don't trust all implementations to work * when called as vsnprintf(NULL, 0, ...). */ va_start(ap, fmt); l = basestring_vsnprintf(buf, sizeof(buf), fmt, ap) + 1; va_end(ap); char *tmp = new char[l]; if (tmp == NULL) { errno = ENOMEM; return *this; } va_start(ap, fmt); basestring_vsnprintf(tmp, l, fmt, ap); va_end(ap); append(tmp); delete[] tmp; return *this; }
BaseString& BaseString::assfmt(const char *fmt, ...) { char buf[1]; va_list ap; int l; /* Figure out how long the formatted string will be. A small temporary * buffer is used, because I don't trust all implementations to work * when called as vsnprintf(NULL, 0, ...). */ va_start(ap, fmt); l = basestring_vsnprintf(buf, sizeof(buf), fmt, ap) + 1; va_end(ap); if(l > (int)m_len) { char *t = new char[l]; if (t == NULL) { errno = ENOMEM; return *this; } delete[] m_chr; m_chr = t; } va_start(ap, fmt); basestring_vsnprintf(m_chr, l, fmt, ap); va_end(ap); m_len = strlen(m_chr); return *this; }
int BaseString::snprintf(char *str, size_t size, const char *format, ...) { va_list ap; va_start(ap, format); int ret= basestring_vsnprintf(str, size, format, ap); va_end(ap); return(ret); }
int basestring_vsnprintf(char *str, size_t size, const char *format, va_list ap) { int ret; if (size == 0) { char buf[1]; return basestring_vsnprintf(buf, 1, format, ap); } ret = IF_WIN(_vsnprintf,vsnprintf)(str, size, format, ap); if (ret >= 0 && ret < (int)size) return ret; #ifdef _WIN32 if (ret < 0 && errno == EINVAL) return ret; // otherwise, more than size chars are needed return _vscprintf(format, ap); #else return ret; #endif }
int BaseString::vsnprintf(char *str, size_t size, const char *format, va_list ap) { return(basestring_vsnprintf(str, size, format, ap)); }