27 return c>=
'A' && c<=
'Z' ? c|0x20 : c;
33 va_start( ap, format );
34 const size_t minlen=256;
36 if (l<minlen) {
resize(minlen+1); l=minlen; }
37 int n=vsnprintf(
rawData(), l+1, format, ap);
38 if (n<0) n=
static_cast<int>(l);
46 const char *b =
data();
47 const char *pos =
nullptr;
49 if (len==0)
return -1;
71 else if (index+slen>len) index = len-slen;
72 const char *pos =
data()+index;
73 for (
size_t i=index+1; i>0; )
85 const char *pos =
data();
88 while (*pos)
if (*pos++ == c) count++;
104 if (
str==
nullptr ||
length()==0)
return 0;
106 const char *pos =
data();
129 const char *from =
data();
143 if ( to > first && *(to-1) == 0x20 )
146 result.
resize(
static_cast<int>(to - result.
data()) );
160 return c>=
'0' && c<=
'9' && (c-
'0') < base;
162 return (c>=
'0' && c<=
'9') ||
163 (c >=
'a' && c < char(
'a'+base-10)) ||
164 (c >=
'A' && c <
char(
'A'+base-10));
169 long v =
toLong( ok, base );
170 if ( ok && *ok && (v < -32768 || v > 32767) ) {
174 return static_cast<short>(v);
179 unsigned long v =
toULong( ok, base );
180 if ( ok && *ok && (v > 65535) ) {
184 return static_cast<uint16_t
>(v);
189 return static_cast<int>(
toLong( ok, base ));
194 return static_cast<uint32_t
>(
toULong( ok, base ));
200 const char *p =
data();
202 int l =
static_cast<int>(
length());
203 const long max_mult = INT_MAX / base;
213 if ( l && *p ==
'-' )
218 }
else if ( *p ==
'+' )
233 if ( *p>=
'0' && *p<=
'9' )
239 if ( *p >=
'a' && *p <=
'z' )
248 if ( val > max_mult || (val == max_mult && dv > (INT_MAX%base)+neg) )
273 return is_ok ? val : 0;
278 const char *p =
data();
280 int l =
static_cast<int>(
length());
281 const unsigned long max_mult = 429496729;
307 if ( *p>=
'0' && *p<=
'9' )
313 if ( *p >=
'a' && *p <=
'z' )
322 if ( val > max_mult || (val == max_mult && dv > (UINT_MAX%base)) )
344 return is_ok ? val : 0;
349 const char *p =
data();
351 int l =
static_cast<int>(
length());
352 const uint64_t max_mult = 1844674407370955161ULL;
378 if ( *p>=
'0' && *p<=
'9' )
384 if ( *p >=
'a' && *p <=
'z' )
393 if ( val > max_mult || (val == max_mult && dv > (ULLONG_MAX%base)) )
415 return is_ok ? val : 0;
422 if ( !str )
return nullptr;
423 char *dst =
new char[
dstrlen(str)+1];
424 return strcpy( dst, str );
432char *
dstrncpy(
char *dst,
const char *src,
size_t len )
434 if ( !src )
return nullptr;
435 strncpy( dst, src, len );
436 if ( len > 0 ) dst[len-1] =
'\0';
444 return s1 == s2 ? 0 :
static_cast<int>(s2 - s1);
458int dstrnicmp(
const char *s1,
const char *s2,
size_t len )
462 return static_cast<int>(s2 - s1);
464 for ( ; len--; s1++, s2++ )
484 const char *q =
nullptr, *p =
nullptr;
485 size_t srcLen = src.
length();
486 size_t dstLen = dst.
length();
491 for (p = s.
data(); (q=strstr(p,src.
data()))!=
nullptr; p=q+srcLen) count++;
492 resLen = s.
length()+count*(dstLen-srcLen);
500 for (p = s.
data(); (q=strstr(p,src.
data()))!=
nullptr; p=q+srcLen)
502 int l =
static_cast<int>(q-p);
506 if (dstLen>0) memcpy(r,dst.
data(),dstLen);
525 const char *p =
nullptr, *q =
nullptr;
526 size_t srcLen = src.
length();
527 size_t dstLen = dst.
length();
532 for (p=s.
data(); (q=strstr(p,src.
data()))!=
nullptr; p=q+srcLen) count++;
533 resLen = s.
length()+count*(dstLen-srcLen);
541 for (p = s.
data(); (q=strstr(p,src.
data()))!=
nullptr; p=q+srcLen)
544 int seq = 0, skip = 0;
547 for (
const char *n=q+srcLen;
dstrncmp(n,src.
data(),srcLen)==0; seq=1+skip, n+=srcLen)
551 if (skip_seq > 0 && skip_seq != seq)
556 int l =
static_cast<int>((q + seq * srcLen)-p);
568 if (dstLen>0) memcpy(r,dst.
data(),dstLen);
580 const std::string &s =
m_rep;
581 int end=
static_cast<int>(s.length());
587 while ((c=s[p]) && (c==
' ' || c==
'\t')) p++;
599 if (p>=start && s.at(p)==
'\n') p--;
603 while ((c=s[p]) && (c==
' ' || c==
'\t')) p--;
615 return s.substr(start,
end-start);
627 modVal[0] = (
upper ?
'A':
'a') + (residual-1)%26;
628 result = modVal + result;
629 residual = (residual-1) / 26;
636 static const char *str_romans_upper[] = {
"M",
"CM",
"D",
"CD",
"C",
"XC",
"L",
"XL",
"X",
"IX",
"V",
"IV",
"I" };
637 static const char *str_romans_lower[] = {
"m",
"cm",
"d",
"cd",
"c",
"xc",
"l",
"xl",
"x",
"ix",
"v",
"iv",
"i" };
638 static const int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
639 static const char **str_romans =
upper ? str_romans_upper : str_romans_lower;
644 for (
int i = 0; i < 13; ++i)
646 while (residual - values[i] >= 0)
648 result += str_romans[i];
649 residual -= values[i];
658 static reg::Ex re(R
"(\s*(<\a+>)\s*)");
659 std::string s = m_rep;
665 for ( ; it!=
end ; ++it)
667 const auto &match = *it;
668 std::string part = match[1].str();
671 size_t i = match.position();
672 size_t l = match.length();
673 result+=s.substr(p,i-p);
680 size_t i = match[1].position();
681 size_t l = match[1].length();
682 result+=s.substr(p,i-p);
693 if (
m_rep.empty() || word==
nullptr)
return false;
694 static const reg::Ex re(R
"(\a+)");
697 if (it->str()==word)
return true;
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
static DString integerToAlpha(int n, bool upper=true)
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 internal white...
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
bool containsWord(const char *word) const
returns true if this string contains word as a whole word, false otherwise.
static DString integerToRoman(int n, bool upper=true)
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
bool findAndRemoveWord(const char *word)
removes occurrences of whole word from this string, while keeping internal spaces and reducing multip...
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.
Class representing a regular expression.
Class to iterate through matches.
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.