26 return c>=
'A' && c<=
'Z' ? c|0x20 : c;
32 va_start( ap, format );
33 const size_t minlen=256;
35 if (l<minlen) {
resize(minlen+1); l=minlen; }
36 int n=vsnprintf(
rawData(), l+1, format, ap);
37 if (n<0) n=
static_cast<int>(l);
45 const char *b =
data();
46 const char *pos =
nullptr;
48 if (len==0)
return -1;
70 else if (index+slen>len) index = len-slen;
71 const char *pos =
data()+index;
72 for (
int i=index; i>=0; i--)
if (
dstrnicmp(pos--,
str,slen)==0)
return i;
80 const char *pos =
data();
83 while (*pos)
if (*pos++ == c) count++;
99 if (
str==
nullptr ||
length()==0)
return 0;
101 const char *pos =
data();
124 const char *from =
data();
138 if ( to > first && *(to-1) == 0x20 )
141 result.
resize(
static_cast<int>(to - result.
data()) );
155 return c>=
'0' && c<=
'9' && (c-
'0') < base;
157 return (c>=
'0' && c<=
'9') ||
158 (c >=
'a' && c < char(
'a'+base-10)) ||
159 (c >=
'A' && c <
char(
'A'+base-10));
164 long v =
toLong( ok, base );
165 if ( ok && *ok && (v < -32768 || v > 32767) ) {
169 return static_cast<short>(v);
174 unsigned long v =
toULong( ok, base );
175 if ( ok && *ok && (v > 65535) ) {
179 return static_cast<uint16_t
>(v);
184 return static_cast<int>(
toLong( ok, base ));
189 return static_cast<uint32_t
>(
toULong( ok, base ));
195 const char *p =
data();
197 int l =
static_cast<int>(
length());
198 const long max_mult = INT_MAX / base;
208 if ( l && *p ==
'-' )
213 }
else if ( *p ==
'+' )
228 if ( *p>=
'0' && *p<=
'9' )
234 if ( *p >=
'a' && *p <=
'z' )
243 if ( val > max_mult || (val == max_mult && dv > (INT_MAX%base)+neg) )
268 return is_ok ? val : 0;
273 const char *p =
data();
275 int l =
static_cast<int>(
length());
276 const unsigned long max_mult = 429496729;
302 if ( *p>=
'0' && *p<=
'9' )
308 if ( *p >=
'a' && *p <=
'z' )
317 if ( val > max_mult || (val == max_mult && dv > (UINT_MAX%base)) )
339 return is_ok ? val : 0;
344 const char *p =
data();
346 int l =
static_cast<int>(
length());
347 const uint64_t max_mult = 1844674407370955161ULL;
373 if ( *p>=
'0' && *p<=
'9' )
379 if ( *p >=
'a' && *p <=
'z' )
388 if ( val > max_mult || (val == max_mult && dv > (ULLONG_MAX%base)) )
410 return is_ok ? val : 0;
417 if ( !str )
return nullptr;
418 char *dst =
new char[
dstrlen(str)+1];
419 return strcpy( dst, str );
427char *
dstrncpy(
char *dst,
const char *src,
size_t len )
429 if ( !src )
return nullptr;
430 strncpy( dst, src, len );
431 if ( len > 0 ) dst[len-1] =
'\0';
439 return s1 == s2 ? 0 :
static_cast<int>(s2 - s1);
453int dstrnicmp(
const char *s1,
const char *s2,
size_t len )
457 return static_cast<int>(s2 - s1);
459 for ( ; len--; s1++, s2++ )
479 const char *q =
nullptr, *p =
nullptr;
480 size_t srcLen = src.
length();
481 size_t dstLen = dst.
length();
486 for (p = s.
data(); (q=strstr(p,src.
data()))!=
nullptr; p=q+srcLen) count++;
487 resLen = s.
length()+count*(dstLen-srcLen);
495 for (p = s.
data(); (q=strstr(p,src.
data()))!=
nullptr; p=q+srcLen)
497 int l =
static_cast<int>(q-p);
501 if (dstLen>0) memcpy(r,dst.
data(),dstLen);
520 const char *p =
nullptr, *q =
nullptr;
521 size_t srcLen = src.
length();
522 size_t dstLen = dst.
length();
527 for (p=s.
data(); (q=strstr(p,src.
data()))!=
nullptr; p=q+srcLen) count++;
528 resLen = s.
length()+count*(dstLen-srcLen);
536 for (p = s.
data(); (q=strstr(p,src.
data()))!=
nullptr; p=q+srcLen)
539 int seq = 0, skip = 0;
542 for (
const char *n=q+srcLen;
dstrncmp(n,src.
data(),srcLen)==0; seq=1+skip, n+=srcLen)
546 if (skip_seq > 0 && skip_seq != seq)
551 int l =
static_cast<int>((q + seq * srcLen)-p);
563 if (dstLen>0) memcpy(r,dst.
data(),dstLen);
575 const std::string &s =
m_rep;
576 int end=
static_cast<int>(s.length());
582 while ((c=s[p]) && (c==
' ' || c==
'\t')) p++;
594 if (p>=start && s.at(p)==
'\n') p--;
598 while ((c=s[p]) && (c==
' ' || c==
'\t')) p--;
610 return s.substr(start,
end-start);
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
void resize(size_t newlen)
DString stripLeadingAndTrailingEmptyLines() const
unsigned long toULong(bool *ok=nullptr, int base=10) const
uint16_t toUShort(bool *ok=nullptr, int base=10) const
DString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple whitespace cha...
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString & replace(size_t index, size_t len, const char *s)
uint32_t toUInt(bool *ok=nullptr, int base=10) const
uint64_t toUInt64(bool *ok=nullptr, int base=10) const
char * rawData()
Returns a writable pointer to the data.
short toShort(bool *ok=nullptr, int base=10) const
DString & remove(size_t index, size_t len)
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
size_t rfind_insensitive(char c, size_t pos=npos) const
int contains(char c, bool cs=true) const
DString & sprintf(const char *format,...)
int toInt(bool *ok=nullptr, int base=10) const
long toLong(bool *ok=nullptr, int base=10) const
const std::string & str() const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
DString & insert(size_t index, const DString &s)
size_t length() const
Returns the length of the string, not counting the 0-terminator.
void dstrfree(const char *str)
Frees the memory allocated using dstrdup().
char * dstrdup(const char *str)
static bool ok_in_base(char c, int base)
char * dstrncpy(char *dst, const char *src, size_t len)
int dstrnicmp(const char *s1, const char *s2, size_t len)
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
int dstricmp(const char *s1, const char *s2)
int dstrnicmp(const char *str1, const char *str2, size_t len)
char * dstrcpy(char *dst, const char *src)
int dstrncmp(const char *str1, const char *str2, size_t len)
uint32_t dstrlen(const char *str)
Returns the length of string str, or 0 if a null pointer is passed.