[] =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
59 static const char kDigitLower[] =
"0123456789abcdefghijklmnopqrstuvwxyz";
70 #if defined(HAVE_WSTRING) 79 #ifdef NCBI_PRODUCTION_VER 80 extern const char*
constkNcbiProductionVersionString;
81 const char*
constkNcbiProductionVersionString
86 #if !defined(NCBI_OS_MSWIN) && \ 87 !(defined(NCBI_OS_LINUX) && \ 88 (defined(NCBI_COMPILER_GCC) || defined(NCBI_COMPILER_ANY_CLANG))) 89 const string* CNcbiEmptyString::m_Str = 0;
90 const string& CNcbiEmptyString::FirstGet(
void) {
91 static const strings_Str =
"";
96 constwstring* CNcbiEmptyWString::m_Str = 0;
97 constwstring& CNcbiEmptyWString::FirstGet(
void) {
98 static constwstring s_Str = L
"";
110 if(!
isspace((
unsigned char)
str[idx])) {
128 if(
intres = memcmp(s1.
data(), s2.
data(),
min(n1, n2))) {
131 return(n1 == n2) ? 0 : (n1 > n2 ? 1 : -1);
147 const char* s = s1.
data() + pos;
148 while(
n&& *s2 && *s == *s2) {
162 returns2.
empty() ? 0 : -1;
171 if(n_cmp > s2.
length()) {
174 const char* s = s1.
data() + pos;
175 const char* p = s2.
data();
176 while(n_cmp && *s == *p) {
183 return n> s2.
length() ? 1 : -1;
202 const char* p1 = s1.
data();
203 const char* p2 = s2.
data();
205 while(
n&& (*p1 == *p2 ||
206 tolower((
unsigned char)(*p1)) ==
tolower((
unsigned char)(*p2))) ) {
210 return(n1 == n2) ? 0 : (n1 > n2 ? 1 : -1);
215 return tolower((
unsigned char)(*p1)) -
tolower((
unsigned char)(*p2));
233 const char* s = s1.
data() + pos;
234 while(
n&& *s2 && (*s == *s2 ||
235 tolower((
unsigned char)(*s)) ==
tolower((
unsigned char)(*s2))) ) {
244 return tolower((
unsigned char)(*s)) -
tolower((
unsigned char)(*s2));
252 returns2.
empty() ? 0 : -1;
262 if(n_cmp > s2.
length()) {
265 const char* s = s1.
data() + pos;
266 const char* p = s2.
data();
267 while(n_cmp && (*s == *p ||
268 tolower((
unsigned char)(*s)) ==
tolower((
unsigned char)(*p))) ) {
277 return tolower((
unsigned char)(*s)) -
tolower((
unsigned char)(*p));
294 size_tstr_pos = 0, mask_pos = 0;
296 for( ; (m =
mask[mask_pos]); ++str_pos, ++mask_pos) {
300 if(!s && m !=
'*') {
310 while( (m =
mask[mask_pos]) ==
'*') mask_pos++;
328 if(!(m =
mask[++mask_pos]))
336s = (char)
tolower((
unsigned char) s);
340 if(!(
a=
mask[mask_pos++]))
342 if(
mask[mask_pos] ==
'-'&&
mask[mask_pos+1] !=
']') {
344 if(!(
b=
mask[mask_pos++]))
350 a= (char)
tolower((
unsigned char)
a);
351 b= (char)
tolower((
unsigned char)
b);
353 if(
a<= s && s <=
b)
356}
while(
mask[mask_pos] !=
']');
362 if(!(m =
mask[++mask_pos]))
370 if(s != m &&
tolower((
unsigned char)s) !=
tolower((
unsigned char)m))
380 if(
str[str_pos] ) {
399*
str= (char)
tolower((
unsigned char)(*str));
408*it = (char)
tolower((
unsigned char)(*it));
418*
str= (char)
toupper((
unsigned char)(*str));
427*it = (char)
toupper((
unsigned char)(*it));
459 int error= 0, ret = -1;
467 if(
str.data()[0] ==
'+'&&
len> 1) {
471 for(;
i<
len; ++
i) {
472 unsignedd =
str.data()[
i] -
'0';
477 unsignednv = v * 10 + d;
478 const unsignedkOverflowLimit = (INT_MAX - 9) / 10 + 1;
479 if(v >= kOverflowLimit) {
481 if(v > kOverflowLimit || nv > INT_MAX) {
489ret =
static_cast<int>(v);
548s.reserve(
str.length() +
msg.length() + 50);
549s +=
"Cannot convert string '";
553 if( !
msg.empty() ) {
561 #define S2N_CONVERT_GUARD(flags) \ 562 CS2N_Guard err_guard(flags, false) 566 #define S2N_CONVERT_GUARD_EX(flags) \ 567 CS2N_Guard err_guard(flags, true) 569 #define S2N_CONVERT_ERROR(to_type, msg, errcode, pos) \ 571 err_guard.Set(errcode); \ 572 if ( !(flags & NStr::fConvErr_NoThrow) ) { \ 574 NCBI_THROW2(CStringException, eConvert, \ 575 err_guard.Message(str, #to_type, msg), pos); \ 583 if (flags & NStr::fConvErr_NoErrMessage) { \ 584 CNcbiError::SetErrno(err_guard.Errno()); \ 586 CNcbiError::SetErrno(err_guard.Errno(), \ 587 err_guard.Message(str, #to_type, msg)); \ 594 #define S2N_CONVERT_ERROR_INVAL(to_type) \ 595 S2N_CONVERT_ERROR(to_type, kEmptyStr, EINVAL, pos) 597 #define S2N_CONVERT_ERROR_RADIX(to_type, msg) \ 598 S2N_CONVERT_ERROR(to_type, msg, EINVAL, pos) 600 #define S2N_CONVERT_ERROR_OVERFLOW(to_type) \ 601 S2N_CONVERT_ERROR(to_type, "overflow", ERANGE, pos)
603 #define CHECK_ENDPTR(to_type) \ 605 S2N_CONVERT_ERROR(to_type, kEmptyStr, EINVAL, pos); \ 608 #define CHECK_ENDPTR_SIZE(to_type) \ 609 if ( pos < size ) { \ 610 S2N_CONVERT_ERROR(to_type, kEmptyStr, EINVAL, pos); \ 613 #define CHECK_COMMAS \ 615 if (flags & NStr::fAllowCommas) { \ 617 if ((numpos == pos) || \ 618 ((comma >= 0) && (comma != 3)) ) { \ 639 if( value < kMin_Int || value >
kMax_Int) {
654 return(
unsigned int)
value;
662 if( value < kMin_Long || value > kMax_Long ) {
674 if(
value> kMax_ULong ) {
677 return(
unsigned long)
value;
688 int delta= ch-
'0';
689 if(
unsigned(
delta) <
unsigned(base) ) {
697 if(!
isalnum((
unsigned char) ch)) {
702 if(
isdigit((
unsigned char) ch)) {
705ch = (char)
tolower((
unsigned char) ch);
706 delta= ch -
'a'+ 10;
726 if( ch !=
'.'&& ch !=
',') {
733 returnch ==
'.'|| ch ==
',';
735 structlconv*
conv= localeconv();
736 returnch == *(
conv->decimal_point);
751 unsigned charch =
str[pos];
768 if( base == 10 || base == 8 ) {
773 if( base < 0 || base == 1 || base > 36 ) {
777 unsigned charch =
str[pos];
778 unsigned char next=
str[pos+1];
782}
else if(
next==
'x'||
next==
'X') {
790 if(ch ==
'0'&& (
next==
'x'||
next==
'X')) {
812 switch(
str[pos]) {
841 while(
charch =
str[pos]) {
851 if(
n>= limdiv && (
n> limdiv ||
delta> limoff) ) {
860 if( pos == pos0 || ((comma >= 0) && (comma != 3)) ) {
877TStringToNumFlags
flags,
intbase)
884 if( base == 10 && (
flags& slow_flags) == 0 ) {
891 if( ptr != end && *ptr ==
'+') {
906 int delta= ch -
'0';
907 if(
unsigned(
delta) >= 10 ) {
911 if(
n>= limdiv && (
n> limdiv ||
delta> limoff) ) {
915}
while( ++ptr != end );
929 if(
str[pos] ==
'+') {
953 while(
charch =
str[pos]) {
963 if(
n>= limdiv && (
n> limdiv ||
delta> limoff) ) {
972 if( pos == pos0 || ((comma >= 0) && (comma != 3)) ) {
989 const char* start = ptr;
993 while(
isspace((
unsigned char)c) ) {
1002 else if( c ==
'+') {
1009*endptr = (
char*)start;
1011err_guard.Set(EINVAL);
1016 if( !*ptr && c >=
'0'&& c <=
'9') {
1018*endptr = (
char*)ptr;
1022 returnsign < 0 ? (c ==
'0'? -0. : -
result) :
result;
1025 booldot =
false, expn =
false, anydigits =
false;
1026 intdigits = 0, dot_position = 0;
1027 unsigned int first=0, second=0, first_mul=1;
1032 for( ; ; c = *ptr++ ) {
1033 if(c >=
'0'&& c <=
'9') {
1035c = (char)(c -
'0');
1047}
else if(digits <= 9) {
1050}
else if(digits <= 18) {
1053second = second*10 + c;
1060 else if(c ==
'.') {
1067dot_position = digits;
1070 else if(c ==
'e'|| c ==
'E') {
1082 if( !dot && (c ==
'n'|| c ==
'N') &&
1085*endptr = (
char*)(ptr+3);
1087 returnHUGE_VAL/HUGE_VAL;
1089 if( (c ==
'i'|| c ==
'I') ) {
1096*endptr = (
char*)ptr;
1098 returnsign < 0 ? -HUGE_VAL : HUGE_VAL;
1108*endptr = (
char*)start;
1110err_guard.Set(EINVAL);
1113 intexponent = dot ? dot_position - digits : 0;
1118 boolexpsign =
false, expnegate=
false;
1123 if(c ==
'-'|| c ==
'+') {
1125 if(expsign || expdigits) {
1129expnegate = c ==
'-';
1132 else if(c >=
'0'&& c <=
'9') {
1134 intnewexpvalue = expvalue*10 + (c-
'0');
1135 if(newexpvalue > expvalue) {
1136expvalue = newexpvalue;
1155exponent = expnegate ? exponent - expvalue : exponent + expvalue;
1159 if( first_mul > 1 ) {
1161ret = ((
longdouble)
first* first_mul + second)* second_mul + third;
1171 if(
first&& exponent ) {
1173 if(exponent > 2*DBL_MAX_10_EXP) {
1175err_guard.Set(ERANGE);
1176}
else if(exponent < 2*DBL_MIN_10_EXP) {
1178err_guard.Set(ERANGE);
1180 if( exponent > 0 ) {
1181 static const doublemul1[16] = {
11821, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7,
11831e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15
1185ret *= mul1[exponent&15];
1186 if( exponent >>= 4 ) {
1187 static const long doublemul2[16] = {
1205ret *= mul2[exponent&15];
1206 for( exponent >>= 4; exponent; --exponent ) {
1210 if(!
finite(
double(ret))) {
1214err_guard.Set(ERANGE);
1218exponent = -exponent;
1219 static const long doublemul1[16] = {
1237ret *= mul1[exponent&15];
1238 if( exponent >>= 4 ) {
1239 static const long doublemul2[16] = {
1257ret *= mul2[exponent&15];
1258 for( exponent >>= 4; exponent; --exponent ) {
1262 if( ret < DBL_MIN ) {
1266err_guard.Set(ERANGE);
1276*endptr = (
char*)ptr;
1278 return(
double)ret;
1289 "NStr::StringToDouble(): mutually exclusive flags specified", 0);
1304 switch(
str[pos]) {
1322 int& errno_ref = errno;
1326 const char* begptr =
str+ pos;
1332 n= strtod(begptr, &endptr);
1337 if(!endptr || (endptr2 && endptr2 > endptr)) {
1342 if( !endptr || endptr == begptr ) {
1347 if( errno_ref && errno_ref != ERANGE ) {
1353 boolis_negative =
n< 0.;
1380TStringToNumFlags
flags)
1389 if(
str.HasZeroAtEnd() ) {
1394 if(
size<
sizeof(
buf) ) {
1413 unsigned charch =
str[pos];
1418ch = (
unsignedchar)
toupper(ch);
1432 if((
kMax_UI8/ 1024 / 1024) < v) {
1439 if((
kMax_UI8/ 1024 / 1024 / 1024) < v) {
1442v *= 1024 * 1024 * 1024;
1453 if( ch &&
toupper(ch) ==
'B') {
1461TStringToNumFlags
flags,
1465 if( base < 2 || base > 16 ) {
1482 if(
str[pos] ==
'+') {
1499 charch =
str[pos];
1509 if(pos-numpos == 0) {
1510pos =
str.length();
1516 if( !
n&& errno ) {
1536TStringToNumFlags
flags)
1552 const char* str_ptr =
str.data();
1553 const char* str_end = str_ptr +
str.size();
1556 for(; str_ptr < str_end; ++str_ptr) {
1563&& str_ptr + 1 < str_end &&
isdigit(*(str_ptr + 1)))
1572 if(str_ptr < str_end && *str_ptr ==
'+') {
1575 else if((str_ptr < str_end && *str_ptr ==
'-')
1581 const char* num_start = str_ptr;
1582 boolhave_dot =
false;
1585 Uint4digs_pre_dot = 0, digs_post_dot = 0;
1587 for(; str_ptr < str_end; ++str_ptr) {
1595 else if(c ==
'.'&& allow_dot) {
1596 if(have_dot || str_ptr == num_start)
1598 if(*(str_ptr - 1) ==
',') {
1604 else if(c ==
','&& allow_commas) {
1605 if(have_dot || str_ptr == num_start)
1607 if(*(str_ptr - 1) ==
',') {
1615 if(have_dot && digs_post_dot == 0)
1617 else if(str_ptr > num_start && *(str_ptr - 1) ==
',')
1620 const char* num_end = str_ptr;
1621 if(num_start == num_end) {
1624 if(str_ptr < str_end && *str_ptr ==
' ' 1630 if(str_ptr < str_end)
1631suff_c = (char)
toupper(*str_ptr);
1633 static const chars_Suffixes[] = {
'K',
'M',
'G',
'T',
'P',
'E'};
1634 static const char*
consts_BinCoefs[] = {
"1024",
"1048576",
"1073741824",
1636 "1125899906842624",
1637 "1152921504606846976"};
1638 static const Uint4s_NumSuffixes = (
Uint4)(
sizeof(s_Suffixes) /
sizeof(s_Suffixes[0]));
1642 for(; suff_idx < s_NumSuffixes; ++suff_idx) {
1643 if(suff_c == s_Suffixes[suff_idx])
1646 if(suff_idx < s_NumSuffixes) {
1648 if(str_ptr + 1 < str_end &&
toupper(*str_ptr) ==
'I' 1649&&
toupper(*(str_ptr + 1)) ==
'B')
1652binary_suff =
true;
1654 else if(str_ptr < str_end &&
toupper(*str_ptr) ==
'B')
1657 else if(suff_c ==
'B') {
1660 else if(*(str_ptr - 1) ==
' ')
1665 for(; str_ptr < str_end; ++str_ptr) {
1673 if(str_ptr != str_end) {
1677 Uint4orig_digs = digs_pre_dot + digs_post_dot;
1679str_ptr = num_start;
1680 for(
Uint4 i= 0; str_ptr < num_end; ++str_ptr) {
1681 if(*str_ptr ==
','|| *str_ptr ==
'.')
1683orig_num[
i++] =
Uint1(*str_ptr -
'0');
1686 Uint1* num_to_conv = orig_num.get();
1687 Uint4digs_to_conv = digs_pre_dot;
1689 if(binary_suff && suff_idx < s_NumSuffixes) {
1690 const char* coef = s_BinCoefs[suff_idx];
1692mul_num =
new Uint1[orig_digs + coef_size];
1693memset(mul_num.
get(), 0, orig_digs + coef_size);
1694 for(
Uint4coef_i = 0; coef_i < coef_size; ++coef_i) {
1697 Uint4res_idx = orig_digs + coef_i;
1698 for(
intorig_i = orig_digs - 1; orig_i >= 0; --orig_i, --res_idx) {
1699 Uint1orig_d = orig_num[orig_i];
1700 Uint1res_d =
Uint1(coef_d * orig_d + carry + mul_num[res_idx]);
1702 while(res_d >= 10) {
1703res_d = (
Uint1)(res_d - 10);
1706mul_num[res_idx] = res_d;
1709 for(; carry != 0; --res_idx) {
1710 Uint1res_d =
Uint1(mul_num[res_idx] + carry);
1712 while(res_d >= 10) {
1713res_d = (
Uint1)(res_d - 10);
1716mul_num[res_idx] = res_d;
1719digs_to_conv = orig_digs + coef_size - digs_post_dot;
1720num_to_conv = mul_num.
get();
1721 while(digs_to_conv > 1 && *num_to_conv == 0) {
1726 else if(suff_idx < s_NumSuffixes) {
1727 Uint4coef_size = (suff_idx + 1) * 3;
1728 if(coef_size <= digs_post_dot) {
1729digs_to_conv += coef_size;
1730digs_post_dot -= coef_size;
1733digs_to_conv += digs_post_dot;
1734coef_size -= digs_post_dot;
1736mul_num =
new Uint1[digs_to_conv + coef_size];
1737 memmove(mul_num.
get(), num_to_conv, digs_to_conv);
1738memset(mul_num.
get() + digs_to_conv, 0, coef_size);
1739num_to_conv = mul_num.
get();
1740digs_to_conv += coef_size;
1747 for(
Uint4 i= 0;
i< digs_to_conv; ++
i) {
1748 Uint1d = num_to_conv[
i];
1749 if(
n>= limdiv && (
n> limdiv || d > limoff)) {
1755 if(digs_post_dot != 0 && num_to_conv[digs_to_conv] >= 5) {
1766TStringToNumFlags
flags,
intbase)
1768 #if (SIZEOF_SIZE_T > 4) 1777 template<
typenameT>
1794out_str.append(
"0x");
1798*--pos = kDigit[
value% 16];
1802 else if( base == 8 ) {
1804out_str.append(
"0");
1811*--pos = kDigit[
value% 8];
1817*--pos = kDigit[
value% base];
1827 unsigned long value,
1839 value=
static_cast<unsigned long>(-svalue);
1848*--pos =
'0'+
value% 10;
1854*--pos =
'0'+
value% 10;
1869TNumToStringFlags
flags,
intbase)
1871 if( base < 2 || base > 36 ) {
1875 unsigned int value=
static_cast<unsigned int>(svalue);
1886TNumToStringFlags
flags,
intbase)
1888 if( base < 2 || base > 36 ) {
1892 unsigned long value=
static_cast<unsigned long>(svalue);
1903 unsigned long value,
1904TNumToStringFlags
flags,
1907 if( base < 2 || base > 36 ) {
1924*--pos =
'0'+
value% 10;
1930*--pos =
'0'+
value% 10;
1952 #define PRINT_INT8_CHUNK 1000000000 1953 #define PRINT_INT8_CHUNK_SIZE 9 1962 #ifdef PRINT_INT8_CHUNK 1975*--pos =
'0'+ chunk % 10;
1977}
while( pos != end );
1986*--pos =
'0'+ chunk % 10;
1995*--pos =
'0'+
value% 10;
2001 #ifdef PRINT_INT8_CHUNK 2010*--pos =
'0'+ chunk % 10;
2012}
while( pos != end );
2017*--pos =
'0'+ chunk % 10;
2022*--pos =
'0'+
value% 10;
2032TNumToStringFlags
flags,
intbase)
2034 if( base < 2 || base > 36 ) {
2043 value=
static_cast<Uint8>(svalue<0?-svalue:svalue);
2059TNumToStringFlags
flags,
intbase)
2061 if( base < 2 || base > 36 ) {
2083TNumToStringFlags
flags,
2084 unsigned intmax_digits
)
2101 static const chars_Suffixes[] = {
'K',
'M',
'G',
'T',
'P',
'E'};
2102 static const Uint4s_NumSuffixes =
Uint4(
sizeof(s_Suffixes) /
sizeof(s_Suffixes[0]));
2109 Uint4digs_pre_dot, suff_idx;
2112 static const Uint8s_Coefs[] = {1000, 1000000, 1000000000,
2117 for(; suff_idx < s_NumSuffixes; ++suff_idx) {
2118 if(
value< s_Coefs[suff_idx])
2122num_start[-1] =
'0';
2124digs_pre_dot =
Uint4(dot_ptr - num_start);
2129 while(suff_idx > 0 && max_digits - digs_pre_dot >= 3) {
2136 char* round_dig = num_end - 1;
2137 if(num_end < buffer + kBufSize && *num_end >=
'5')
2139 while(*round_dig ==
'0'+ 10) {
2144 if(round_dig < num_start) {
2145 _ASSERT(num_start - round_dig == 1);
2146num_start = round_dig;
2149 if(digs_pre_dot > 3) {
2157 if(digs_pre_dot > max_digits) {
2167 static const Uint8s_Coefs[] = {1, 1024, 1048576, 1073741824,
2173 for(; suff_idx < s_NumSuffixes; ++suff_idx) {
2174 if(
value< s_Coefs[suff_idx])
2177 boolcan_try_another =
true;
2179 Uint8mul_coef = s_Coefs[suff_idx - 1];
2181 if(max_digits == 3 && whole_num >= 1000) {
2183 gototry_another_suffix;
2186num_start[-1] =
'0';
2189&& suff_idx != 1 && can_try_another)
2191 Uint4new_suff = suff_idx - 1;
2192try_even_more_suffix:
2193 Uint8new_num =
value/ s_Coefs[new_suff - 1];
2196 if(new_digs <= max_digits) {
2197 if(max_digits - digs_pre_dot >= 3 && new_suff != 1) {
2199 gototry_even_more_suffix;
2201suff_idx = new_suff;
2202can_try_another =
false;
2203 gototry_another_suffix;
2205 if(new_suff != suff_idx - 1) {
2206suff_idx = new_suff + 1;
2207can_try_another =
false;
2208 gototry_another_suffix;
2211memcpy(
buffer, num_start - 1, digs_pre_dot + 1);
2213dot_ptr = num_start + digs_pre_dot;
2214 Uint4cnt_more_digs = 1;
2216cnt_more_digs +=
min(max_digits - digs_pre_dot, 3 * (suff_idx - 1));
2218 Uint8left_val =
value- whole_num * mul_coef;
2222*num_end = char(d +
'0');
2224left_val -= d * mul_coef;
2227 while(cnt_more_digs != 0);
2230 char* round_dig = num_end - 1;
2231 if(*num_end >=
'5')
2233 while(*round_dig ==
'0'+ 10) {
2238 if(round_dig < num_start) {
2240num_start = round_dig;
2242 if(digs_pre_dot > max_digits) {
2244 gototry_another_suffix;
2246 if(num_end != dot_ptr)
2250&& num_start[0] ==
'1'&& num_start[1] ==
'0' 2251&& num_start[2] ==
'2'&& num_start[3] ==
'4')
2254 gototry_another_suffix;
2262out_str.append(1,
'+');
2264out_str.append(num_start, digs_pre_dot);
2267 Uint4digs_first = digs_pre_dot % 3;
2268out_str.append(num_start, digs_first);
2269 char* left_ptr = num_start + digs_first;
2270 Uint4digs_left = digs_pre_dot - digs_first;
2271 while(digs_left != 0) {
2272out_str.append(1,
',');
2273out_str.append(left_ptr, 3);
2278 if(num_end != dot_ptr) {
2279out_str.append(1,
'.');
2280out_str.append(dot_ptr, num_end - dot_ptr);
2283 if(suff_idx == 0) {
2286out_str.append(1,
' ');
2287out_str.append(1,
'B');
2293out_str.append(1,
' ');
2294out_str.append(1, s_Suffixes[suff_idx]);
2297out_str.append(1,
'i');
2298out_str.append(1,
'B');
2306 #if defined(NCBI_OS_MSWIN) 2344 structlconv*
conv= localeconv();
2345 if(
'.'!= *(
conv->decimal_point)) {
2346 char* pos = strchr(
buffer, *(
conv->decimal_point));
2360TNumToStringFlags
flags)
2367 if(memcmp(&
value, &zero,
sizeof(
double)) == 0) {
2375strcpy(
buffer,
"NaN");
2377}
else if(
value> 0.) {
2378strcpy(
buffer,
"INF");
2381strcpy(
buffer,
"-INF");
2406 structlconv*
conv= localeconv();
2407 if(
'.'!= *(
conv->decimal_point)) {
2408 char* pos = strchr(
buffer, *(
conv->decimal_point));
2424 char* buffer_start =
buffer;
2425 char* buffer_end = (
buffer+= digits-1);
2434}
while(
value/= 10);
2436 if(++
buffer!= buffer_start) {
2438buffer_end -=
buffer- buffer_start;
2441 return++buffer_end;
2445 #define __NLG NCBI_CONST_LONGDOUBLE 2449 int* dec,
int* sign)
2461 if(memcmp(&
val, &zero,
sizeof(
double)) == 0) {
2470*sign =
val< 0. ? -1 : 1;
2478 boolexp_positive =
val>= 1.;
2479 unsigned int first, second=0;
2480 long doublemult =
__NLG(1.);
2520 else{mult=
__NLG(1.e-8); exp+=16;}
2557 else{mult=
__NLG(1.e8); }
2561 long doublet1 =
value* mult;
2562 if(t1 >=
__NLG(1.e9)) {
2564}
else if(t1 <
__NLG(1.e8)) {
2570 if(high_precision) {
2571 long doublet2 = (t1-
first) *
__NLG(1.e8);
2572 if(t2 >=
__NLG(1.e8)) {
2575second = (
unsigned int)t2;
2580 booluse_ext_buffer =
bufsize> 20;
2582 char*digits = use_ext_buffer ?
buffer:
tmp;
2584 if(high_precision) {
2587 size_tdigits_len = digits_end - digits;
2588 size_tdigits_got = digits_len;
2589 size_tdigits_expected = high_precision ? 17 : 9;
2599 if(high_precision) {
2600 if(digits[pos] ==
'4') {
2602 while(pt != 0 && digits[--pt] ==
'9')
2606}
else if(digits[pos] ==
'5') {
2608 while(pt != 0 && digits[--pt] ==
'0')
2616 if(digits[pos] >=
'5') {
2618 if(digits[--pos] <
'9') {
2625 if(digits_expected <= digits_got) {
2630exp_positive = --exp == 0;
2640 for(pos = digits_len; pos-- > 0 && digits[pos] ==
'0';)
2643*dec = exp_positive ?
int(exp) : -
int(exp);
2645 if(!use_ext_buffer) {
2647memcpy(
buffer, digits, digits_len);
2650 "Destination buffer too small", 0);
2663 "Destination buffer too small", 0);
2668 val,
precision, digits,
sizeof(digits), &dec, &sign);
2669 if(digits_len == 0) {
2674strncpy(
buffer,digits, digits_len);
2677 if(digits_len == 1 && dec == 0 && sign >=0) {
2682 boolexp_positive = dec >= 0;
2683 unsigned intexp= (
unsigned int)(exp_positive ? dec : (-dec));
2686 char*buffer_pos =
buffer;
2688 char*digits_pos = digits;
2691*buffer_pos++ =
'-';
2695 if((exp_positive && exp >=
precision) || (!exp_positive && exp > 4)) {
2696*buffer_pos++ = *digits_pos++;
2698 if(digits_len != 0) {
2699*buffer_pos++ =
'.';
2700strncpy(buffer_pos,digits_pos,digits_len);
2701buffer_pos += digits_len;
2703*buffer_pos++ =
'e';
2704*buffer_pos++ = exp_positive ?
'+':
'-';
2707 #if NCBI_COMPILER_MSVC && _MSC_VER < 1900 2708 boolneed_zeros =
true;
2709 size_tneed_digits = 3;
2711 boolneed_zeros = exp < 10 ?
true:
false;
2712 size_tneed_digits = exp < 100 ? 2 : 3;
2716}
else if(exp_positive) {
2717*buffer_pos++ = *digits_pos++;
2719 if(digits_len > exp) {
2720strncpy(buffer_pos,digits_pos,exp);
2722*buffer_pos++ =
'.';
2723strncpy(buffer_pos,digits_pos+exp,digits_len-exp);
2724buffer_pos += digits_len-exp;
2726strncpy(buffer_pos,digits_pos,digits_len);
2727buffer_pos += digits_len;
2728exp -= (
unsigned int)digits_len;
2730*buffer_pos++ =
'0';
2734*buffer_pos++ =
'0';
2735*buffer_pos++ =
'.';
2736 for(--exp; exp--;) {
2737*buffer_pos++ =
'0';
2739strncpy(buffer_pos,digits_pos, digits_len);
2740buffer_pos += digits_len;
2743 returnbuffer_pos -
buffer;
2749 #if (SIZEOF_SIZE_T > 4) 2782 if(
str.HasZeroAtEnd() ) {
2783res = ::sscanf(
str.data(),
"%p", &ptr);
2785res = ::sscanf(
string(
str).c_str(),
"%p", &ptr);
2838 "String cannot be converted to bool", 0);
2844 #ifdef HAVE_VASPRINTF 2855 #elif defined(HAVE_VSNPRINTF) 2866 buf.reset(
new char[
size]);
2872 #elif defined(HAVE_VPRINTF) 2874 buf[
sizeof(
buf) - 1] = 0;
2876 if(
buf[
sizeof(
buf) - 1]) {
2882 # error Please port this code to your system. 2890EDirection direction,
2904 if(use_case ==
eCase) {
2908pos =
str.find(pattern, search_pos);
2913search_pos = pos + plen;
2914++current_occurence;
2916 while(current_occurence <= occurence);
2920search_pos = slen - plen;
2922pos =
str.rfind(pattern, search_pos);
2927search_pos = (pos < plen) ? 0 : pos - plen;
2928++current_occurence;
2930 while(current_occurence <= occurence);
2937 stringx_first(pattern, 0, 1);
2938 if(
isupper((
unsigned char)x_first[0])) {
2939x_first += (char)
tolower((
unsigned char)x_first[0]);
2940}
else if(
islower((
unsigned char)x_first[0])) {
2941x_first += (char)
toupper((
unsigned char)x_first[0]);
2946pos =
str.find_first_of(x_first, search_pos);
2947 while(pos !=
NPOS) {
2948 if( (pos + plen) > slen ) {
2954pos =
str.find_first_of(x_first, pos + 1);
2960search_pos = pos + plen;
2961++current_occurence;
2963 while(current_occurence <= occurence);
2967search_pos = slen - plen;
2969pos =
str.find_last_of(x_first, search_pos);
2970 while(pos !=
NPOS&& pos
2975pos =
str.find_last_of(x_first, pos - 1);
2978search_pos = (pos < plen) ? 0 : pos - plen;
2979++current_occurence;
2981 while(current_occurence <= occurence);
2992 stringpat(pattern, 0, 1);
2994 if(
isupper((
unsigned char) pat[0])) {
2995pat += (char)
tolower((
unsigned char) pat[0]);
2996}
else if(
islower((
unsigned char) pat[0])) {
2997pat += (char)
toupper((
unsigned char) pat[0]);
3002 while(pos !=
NPOS&& (pos +
l) <= end
3004pos =
str.find_first_of(pat, pos + 1);
3006 returnpos > end ?
NPOS: pos;
3010 while(pos !=
NPOS&& pos >= start
3015pos =
str.find_last_of(pat, pos - 1);
3025 if(lst.empty())
return NULL;
3026 ITERATE(list<string>, st_itr, lst) {
3027 if(
Equal(*st_itr,
val, use_case)) {
3037 if(vec.empty())
return NULL;
3038 ITERATE(vector<string>, st_itr, vec) {
3039 if(
Equal(*st_itr,
val, use_case)) {
3052 return!(ch ==
'_'||
isalnum((
unsigned char)ch));
3059EDirection direction)
3069 while(pos !=
NPOS) {
3077 if(pos + plen == slen) {
3103 if(len1 == 0 || len2 == 0) {
3118 if(memcmp(t1.
data(), t2.
data(),
len) == 0) {
3135 if(pos == 0 || memcmp(t1.
data() +
len-
n, t2.
data(),
n) == 0) {
3145 template<
classTStr>
3147 constTStr& empty_str)
3156 while(
isspace((
unsigned char)
str[beg]) ) {
3157 if(++beg == length) {
3165 while(
isspace((
unsigned char)
str[--end])) {
3173 _ASSERT(beg < end && end <= length);
3174 if( beg | (end - length) ) {
3175 return str.substr(beg, end - beg);
3208 while(
isspace((
unsigned char)
str.data()[beg]) ) {
3209 if(++beg == length) {
3221 while(
isspace((
unsigned char)
str.data()[--end])) {
3230 _ASSERT(beg < end && end <= length);
3232 if( beg | (end - length) ) {
3233 str.replace(0, length,
str, beg, end - beg);
3241 if(!
str.length() ||
3253 if(!
str.length() ||
3265 if(!
str.length() ||
3277 if(!
str.length() ||
3289 if(!
str.length() ||
3301 if(!
str.length() ||
3311 const string& search,
const string& replace,
3318 "NStr::Replace(): source and destination are the same", 0);
3322 if(start_pos + search.size() > src.size() || search == replace) {
3330 if(replace.size() > search.size() && src.size() > 16*1024) {
3337start_pos = src.find(search, start_pos);
3338 if(start_pos ==
NPOS)
3341start_pos += search.size();
3344dst.resize(src.size() -
n*search.size() +
n*replace.size());
3347start_pos = start_orig;
3348string::const_iterator src_start = src.begin();
3349string::const_iterator src_end = src.begin();
3350string::iterator dst_pos = dst.begin();
3353start_pos = src.find(search, start_pos);
3354 if(start_pos ==
NPOS)
3357src_end = src.begin() + start_pos;
3358 copy(src_start, src_end, dst_pos);
3359dst_pos += (src_end - src_start);
3361 copy(replace.begin(), replace.end(), dst_pos);
3362dst_pos += replace.size();
3363start_pos += search.size();
3364src_start = src.begin() + start_pos;
3367 copy(src_start, src.end(), dst_pos);
3377start_pos = dst.find(search, start_pos);
3378 if(start_pos ==
NPOS)
3380dst.replace(start_pos, search.size(), replace);
3381start_pos += replace.size();
3391 const string& search,
const string& replace,
3396 Replace(src, search, replace, dst, start_pos, max_replace, num_replace);
3402 const string& search,
const string& replace,
3408 if( start_pos + search.size() > src.size() || search == replace )
3411 boolequal_len = (search.size() == replace.size());
3413start_pos = src.find(search, start_pos);
3414 if(start_pos ==
NPOS)
3419 copy(replace.begin(), replace.end(), src.begin() + start_pos);
3421src.replace(start_pos, search.size(), replace);
3423start_pos += replace.size();
3431 template<
typenameTString,
typenameTContainer>
3432TContainer&
s_Split(
constTString&
str,
constTString& delim,
3434vector<SIZE_TYPE>* token_pos,
3442TPosArray token_pos_proxy(token_pos);
3448 #define CHECK_SPLIT_TEMPSTRING_FLAGS(where) \ 3450 if ((flags & (NStr::fSplit_CanEscape | NStr::fSplit_CanQuote)) && !storage) { \ 3451 NCBI_THROW2(CStringException, eBadArgs, \ 3452 "NStr::"#where "(): the selected flags require non-NULL storage", 0); \
3459vector<SIZE_TYPE>* token_pos)
3465vector<string>&
arr, TSplitFlags
flags,
3466vector<SIZE_TYPE>* token_pos)
3472list<CTempString>&
arr, TSplitFlags
flags,
3480vector<CTempString>&
arr, TSplitFlags
flags,
3488list<CTempStringEx>&
arr, TSplitFlags
flags,
3496vector<CTempStringEx>&
arr, TSplitFlags
flags,
3504list<string>&
arr, TSplitFlags
flags,
3505vector<SIZE_TYPE>* token_pos)
3511vector<string>&
arr, TSplitFlags
flags,
3512vector<SIZE_TYPE>* token_pos)
3518list<CTempString>&
arr, TSplitFlags
flags,
3526vector<CTempString>&
arr, TSplitFlags
flags,
3534list<CTempStringEx>&
arr, TSplitFlags
flags,
3542vector<CTempStringEx>&
arr, TSplitFlags
flags,
3551 string& str1,
string& str2, TSplitFlags
flags)
3584TSplitter splitter(
str, delim,
flags, storage);
3588splitter.Advance(&part_collector,
NULL, &delim_pos);
3589part_collector.
Join(&str1);
3590part_collector.
Clear();
3594splitter.Advance(&part_collector);
3595part_collector.
Join(&str2);
3597 returndelim_pos !=
NPOS;
3601 #define SS_ADD_CHAR(c) \ 3609 out.reserve(
str.size());
3613 if( allow_chars.
empty() && reject_chars.
empty() && !have_class ) {
3618 boolhave_allowed =
false;
3621 for(
charc :
str) {
3624 boolallowed =
false;
3651 if(!allowed && !allow_chars.
empty() && allow_chars.
find(c) !=
NPOS) {
3654 if(allowed && !reject_chars.
empty() && reject_chars.
find(c) !=
NPOS) {
3672 if(
last!=
' ') {
3680have_allowed =
true;
3690 if(reject_replacement ==
' ') {
3699have_allowed =
true;
3703 if(
last!= reject_replacement) {
3705have_allowed =
true;
3736unique_ptr<CNcbiOstrstream>
out;
3739 for(
i= 0;
i<
str.size(); ++
i) {
3740 booloctal =
false;
3778 if(
i&&
str[
i- 1] ==
'?')
3780 if(
i<
str.size() - 1 &&
str[
i+ 1] ==
'?')
3785 if(!isascii((
unsigned char) c)) {
3791 if(!
isprint((
unsigned char) c)) {
3801 out->write(
str.data() + j,
i- j);
3805 out->write(
"n\\\n", 3);
3809reduce = (
i==
str.size() - 1 ||
3810 str[
i+ 1] <
'0'||
'7'<
str[
i+ 1] ?
true:
false);
3817v = (
unsignedchar) c >> 6;
3819 val[k++] = char(
'0'+ v);
3822v = ((
unsignedchar) c >> 3) & 7;
3824 val[k++] = char(
'0'+ v);
3826v = (
unsignedchar) c & 7;
3827 val[k++] = char(
'0'+ v);
3836 out->write(
str.data() + j,
i- j);
3851 if(
str.empty() ) {
3854 out.reserve(
str.size() * 2);
3856 for(
charc :
str) {
3857 if(c == escape_char || metacharacters.
find(c) !=
NPOS) {
3869 if(
str.empty() ) {
3872 out.reserve(
str.size());
3873 boolescaped =
false;
3875 for(
charc :
str) {
3881 if(c == escape_char) {
3896 if(
str.empty()) {
3899 out.reserve(
str.size() * 2);
3901 out.push_back(quote_char);
3902 for(
charc :
str) {
3903 if(c == quote_char || c == escape_char) {
3908 out.push_back(quote_char);
3917 if(
str.empty()) {
3920 out.reserve(
str.size());
3921 boolescaped =
false;
3922 charquote_char =
str[0];
3924 if(
str.length() < 2 ||
str[
str.length()-1] != quote_char) {
3926 "The source string must start and finish with the same character", 0);
3937 if(c == escape_char) {
3986 const charquote_char =
'"';
3988 if(
len< 2 ||
str[0] != quote_char ||
str[
len-1] != quote_char) {
3990 "The source string must start and finish with a double quote", 0);
3994 boolescaped =
false;
3996 boolcollect =
true;
4001 out.reserve(
str.size());
4003 for(pos = 1; pos <
len; ++pos) {
4004 unsigned charch =
str[pos];
4005 if(ch == quote_char && !escaped) {
4007 CTempStringsub(
str.data() + last_quote + 1, pos - last_quote - 1);
4013 if(pos != last_quote + 1) {
4015 "Quoted string format error", pos);
4021escaped = ch ==
'\\'? !escaped :
false;
4024 if(escaped || last_quote !=
len-1) {
4026 "Unterminated quoted string",
str.length());
4041 for(
i= 0;
i<
str.size();
i++) {
4045 result.append(
"&");
4048 result.append(
"<");
4051 result.append(
">");
4054 result.append(
"'");
4057 result.append(
""");
4063 if(
i+1 ==
str.size()) {
4064 result.append(
"-");
4066}
else if(
str[
i+1] ==
'-') {
4068 result.append(1, c).append(
"-");
4076 unsigned intuc = (
unsigned int)(c);
4083 if((uc < 0x8) || (uc == 0xB) || (uc == 0xC) ||
4084(uc >= 0x0E && uc <=0x1F) ||
4085(uc >= 0x7F && uc <=0x84) ||
4086(uc >= 0x86 && uc <=0x9F) )
4099 const char* charmap =
"0123456789abcdef";
4102 unsignedhi = ch >> 4;
4103 unsignedlo = ch & 0xF;
4105 result.append(1, charmap[hi]);
4107 result.append(1, charmap[lo]).append(1,
';');
4127 const char* begin =
str.data();
4128 const char* end = begin +
str.size();
4129 for(
const char* curr = begin; curr < end; ++curr ) {
4137 boolis_entity =
false;
4139(
i+2 <
str.size()) && (semicolon !=
NPOS)) {
4141 if(
i>= semicolon ) {
4142semicolon =
str.find(
";",
i+1);
4144 if( semicolon !=
NPOS) {
4147 if(
str[
i+1] ==
'#') {
4152 for(; p < semicolon; ++p) {
4162 for(; p < semicolon; ++p) {
4169is_entity = (p == semicolon);
4175 "\" contains HTML encoded entities");
4178 result.append(
"amp;");
4183 result.append(
"<");
4186 result.append(
">");
4189 result.append(
"'");
4192 result.append(
""");
4195 if((
unsigned int)c < 0x20) {
4196 const char* charmap =
"0123456789abcdef";
4199 unsignedhi = ch >> 4;
4200 unsignedlo = ch & 0xF;
4202 result.append(1, charmap[hi]);
4204 result.append(1, charmap[lo]).append(1,
';');
4205}
else if(c > 0x7F) {
4414{ 977,
"thetasym"},
4448{ 8501,
"alefsym"},
4515 for( ; p->
u!= 0; ++p) {
4516 if(
uch== p->
u) {
4532 "Unable to guess the source string encoding", 0);
4536ustr.reserve(
str.size());
4542 for(
i=
str.begin();
i!= e;) {
4545 if(
i!= e && ch ==
'&') {
4547end_of_entity = itmp =
i;
4548 boolent, dec,
hex, parsed=
false;
4549ent =
isalpha((
unsigned char)(*itmp)) != 0;
4550dec = !ent && *itmp ==
'#'&& ++itmp != e &&
4551 isdigit((
unsigned char)(*itmp)) != 0;
4552 hex= !dec && itmp != e &&
4553(*itmp ==
'x'|| *itmp ==
'X') && ++itmp != e &&
4554 isxdigit((
unsigned char)(*itmp)) != 0;
4555start_of_entity = itmp;
4557 if(itmp != e && (ent || dec ||
hex)) {
4559 for(
int len=0;
len<16 && itmp != e; ++
len, ++itmp) {
4560 if(*itmp ==
'&'|| *itmp ==
'#') {
4563 if(*itmp ==
';') {
4564end_of_entity = itmp;
4567ent = ent &&
isalnum( (
unsigned char)(*itmp)) != 0;
4568dec = dec &&
isdigit( (
unsigned char)(*itmp)) != 0;
4571 if(end_of_entity !=
i&& (ent || dec ||
hex)) {
4574 stringentity(start_of_entity, end_of_entity);
4576 for( ; p->
u!= 0; ++p) {
4577 if(entity.compare(p->
s) == 0) {
4587 for(itmp = start_of_entity; itmp != end_of_entity; ++itmp) {
4592 if(
ud>=
'0'&&
ud<=
'9') {
4594}
else if(
ud>=
'a'&&
ud<=
'f') {
4597}
else if(
ud>=
'A'&&
ud<=
'F') {
4607 i= ++end_of_entity;
4615ustr.append( 1, ch );
4636 autoencode_char = [&](
charc)
4638 static const char* charmap =
"0123456789abcdef";
4639 result.append(
"\\u00");
4641 unsignedhi = ch >> 4;
4642 unsignedlo = ch & 0xF;
4643 result.append(1, charmap[hi]);
4644 result.append(1, charmap[lo]);
4647 for(
autoc :
str) {
4650 result.append(
"\\\"");
4653 result.append(
"\\\\");
4656 if((
unsigned int)c < 0x20) {
4660 if(encoding ==
eJsonEnc_UTF8&& (
unsigned int)c >= 0x80) {
4670 return '"'+
result+
'"';
4711 if(!
str.empty() &&
4712 str.find_first_of(
"!{} \t\r\n[|&;<>()$`\"'*?#~=%\\") ==
NPOS) {
4724 if(
str.find(
'\'') !=
NPOS&&
4725 str.find_first_of(
"\"\\$`") ==
NPOS) {
4726 return "\""+
str+
"\"";
4758 boolavoid_double_quotes = (
str.find(
'"') ==
NPOS||
4761avoid_double_quotes ?
"'\\''":
"'\"'\"'") +
"'";
4772 if(
s.size() > 2) {
4775pos =
s.find(
"''", pos);
4776 if(pos ==
NPOS)
break;
4777 if(pos == 0 ||
s[pos-1] !=
'\\') {
4792 out.reserve(
str.size());
4794 boolis_error =
false;
4796 while(pos <
str.size() || !is_error) {
4798 if(pos2 ==
NPOS) {
4807 if(++pos2 ==
str.size()) {
4809 "Unterminated escape sequence", pos2);
4811 switch(
str[pos2]) {
4812 case 'a':
out+=
'\a';
break;
4813 case 'b':
out+=
'\b';
break;
4814 case 'f':
out+=
'\f';
break;
4815 case 'n':
out+=
'\n';
break;
4816 case 'r':
out+=
'\r';
break;
4817 case 't':
out+=
'\t';
break;
4818 case 'v':
out+=
'\v';
break;
4822 while(pos <
str.size()
4833 unsigned int value=
4844 "' is out of range [0-255]", pos2);
4851 value= (unsigned)user_char;
4857 out+=
static_cast<char>(
value);
4860 "\\x followed by no hexadecimal digits", pos);
4864 case '0':
case '1':
case '2':
case '3':
4865 case '4':
case '5':
case '6':
case '7':
4868 unsigned charc = (
unsignedchar)(
str[pos++] -
'0');
4869 while(pos < pos2 + 3 && pos <
str.size()
4870&&
str[pos] >=
'0'&&
str[pos] <=
'7') {
4871c = (
unsignedchar)((c << 3) | (
str[pos++] -
'0'));
4897 const char* str_pos =
str.data();
4900 if(
str.empty() || ((quote_char = *str_pos) !=
'"'&& quote_char !=
'\'')) {
4902 "The source string must start with a quote", 0);
4905 const char* str_end = str_pos +
str.length();
4906 boolescaped =
false;
4908 while(++str_pos < str_end) {
4909 if(*str_pos == quote_char && !escaped) {
4910 size_tpos = str_pos -
str.data();
4911 if(n_read !=
NULL)
4915escaped = *str_pos ==
'\\'? !escaped :
false;
4919 "Unterminated quoted string",
str.length());
4933 out.reserve(
str.size());
4936 while(pos <
str.size()) {
4938 if(pos2 ==
NPOS) {
4947 if(++pos2 ==
str.size()) {
4949 "Unterminated escape sequence", pos2);
4951 switch(
str[pos2]) {
4954 case '/':
out+=
str[pos2];
break;
4955 case 'b':
out+=
'\b';
break;
4956 case 'f':
out+=
'\f';
break;
4957 case 'n':
out+=
'\n';
break;
4958 case 'r':
out+=
'\r';
break;
4959 case 't':
out+=
'\t';
break;
4962 while(pos <
str.size() &&
isxdigit((
unsigned char)
str[pos])) {
4965 if(
auto len= pos - pos2) {
4968}
else if(
len> 4) {
4973 if(
value> 0xff) {
4975 "Escaped UTF-8 characters after '\\u00ff' are not supported", pos2);
4977 out+=
static_cast<char>(
value);
5002 boolcomments_ok = (start + 1 <
str.size() &&
str[start + 1] ==
'!');
5003 for(
SIZE_TYPEpos = start + 1; pos <
str.size(); ++pos) {
5004 switch(
str[pos]) {
5009pos =
str.find(
'\"', pos + 1);
5012 "Unclosed string in HTML tag", start);
5018 if(comments_ok && pos + 1 <
str.size()
5019&&
str[pos + 1] ==
'-') {
5020pos =
str.find(
"--", pos + 2);
5023 "Unclosed comment in HTML tag", start);
5043(
"#0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
5045 if(pos !=
NPOS&&
str[pos] ==
';') {
5060 if(pos2 ==
NPOS) {
5061width +=
str.size() - pos;
5064width += pos2 - pos;
5065 if(
str[pos2] ==
'&') {
5082 inline bool _isspace(
unsigned charc)
5084 return((c>=0x09 && c<=0x0D) || (c==0x20));
5087 template<
typename_D>
5089_D& dest, TWrapFlags
flags,
5090 const string* prefix,
5091 const string* prefix1)
5104 stringtemp_back; temp_back.reserve(width);
5117 typedefpair<SIZE_TYPE, SIZE_TYPE> TWrapSubstr;
5124TWrapSubstr best_link(0, 0);
5125TWrapSubstr latest_link(0, 0);
5127 while(pos <
len) {
5128 boolhyphen =
false;
5133EScore best_score = eForced;
5137 boolthisPartHasBackspace =
false;
5139temp_back = *prefix1;
5142 if(is_html && best_link.second != 0) {
5144 str.begin() + best_link.first,
5145 str.begin() + best_link.second);
5153 if(nl_pos <= pos) {
5154nl_pos =
str.find(
'\n', pos);
5155 if(nl_pos ==
NPOS) {
5159 if(
column+ (nl_pos - pos) <= width) {
5166EScore score = eForced;
5168 const charc =
str[pos2];
5172best_score = eNewline;
5173best_link = latest_link;
5176 else if(
_isspace((
unsigned char)c)) {
5177 if(!do_flat && pos2 > 0 &&
5179 if(pos2 <
len- 1 &&
str[pos2 + 1] ==
'\b') {
5180thisPartHasBackspace =
true;
5186 else if(is_html && c ==
'<') {
5191 if(pos2 ==
NPOS) {
5195 if((pos2 - start_of_tag) >= 6 &&
5196 str[start_of_tag + 1] ==
'a'&&
5197 str[start_of_tag + 2] ==
' '&&
5198 str[start_of_tag + 3] ==
'h'&&
5199 str[start_of_tag + 4] ==
'r'&&
5200 str[start_of_tag + 5] ==
'e'&&
5201 str[start_of_tag + 6] ==
'f')
5204latest_link.first = start_of_tag;
5205latest_link.second = pos2 + 1;
5207 if((pos2 - start_of_tag) >= 3 &&
5208 str[start_of_tag + 1] ==
'/'&&
5209 str[start_of_tag + 2] ==
'a'&&
5210 str[start_of_tag + 3] ==
'>')
5213latest_link.first = 0;
5214latest_link.second = 0;
5217 else if(is_html && c ==
'&') {
5220 if(pos2 ==
NPOS) {
5224 else if(c ==
','&&
column< width && score_pos <
len- 1) {
5228 else if(do_flat ? c ==
'-':
ispunct((
unsigned char)c)) {
5232 case '(':
case '[':
case '{':
case '<':
case '`':
5236 if(score_pos <
len- 1 &&
column< width) {
5244 if(score >= best_score && score_pos > pos0) {
5245best_pos = score_pos;
5247best_link = latest_link;
5250 while(pos2 <
len- 1 &&
str[pos2 + 1] ==
'\b') {
5256thisPartHasBackspace =
true;
5260 if(best_score != eNewline &&
column<= width) {
5261 if(best_pos !=
len) {
5264best_link = latest_link;
5266thisPartHasBackspace =
true;
5275string::const_iterator begin =
str.begin() + pos;
5276string::const_iterator end =
str.begin() + best_pos;
5277 if(thisPartHasBackspace) {
5280string::const_iterator bs;
5281 while((bs = find(begin, end,
'\b')) != end) {
5284temp_back.append(begin, bs - 1);
5290 if(
size> prefix1->size()) {
5291temp_back.resize(
size- 1);
5300temp_back.append(begin, end);
5306 if(is_html && best_link.second != 0) {
5307temp_back +=
"</a>";
5317 if(best_score ==
eSpace) {
5318 while(
str[pos] ==
' ') {
5321 if(
str[pos] ==
'\n') {
5325 if(best_score == eNewline) {
5330 if(best_score ==
eSpace|| best_score == eNewline) {
5334 while(pos <
len&&
str[pos] ==
'\b') {
5338dest.Append(temp_back);
5344IWrapDest& dest, TWrapFlags
flags,
5345 const string* prefix,
5346 const string* prefix1)
5354 const string* prefix,
const string* prefix1)
5356CWrapDestStringList d(arr2);
5363 const string& delim, list<string>&
arr,
5365 const string* prefix,
5366 const string* prefix1)
5372 const string* pfx = prefix1 ? prefix1 : prefix;
5377 boolat_start =
true;
5382 if(
column+ term_width <= width) {
5394}
else if(
column+ delwidth + term_width <= width) {
5397 column+= delwidth + term_width;
5401 arr.push_back(
s);
5427list<CTempString> words;
5428 unsigned intnw = 0;
5431 while(pos <
str.size()) {
5437 while(pos <
str.size()) {
5445 if(width <
len+ nw + wlen) {
5447 if(width < wlen &&
len< width -
len)
5457 if(
str[pos - 1] ==
'.'||
5458 str[pos - 1] ==
'!'||
5459 str[pos - 1] ==
'?') {
5460 if(
len+ 1 >= width)
5469 if(words.back().empty()) {
5476 if(pos <
str.size() &&
len< width && !big) {
5477space = (width -
len) / (nw - 1);
5478nw = (
unsigned int)((width -
len) % (nw - 1));
5487 ITERATE(list<CTempString>, w, words) {
5489par.back().append(space + (
n<= nw ? 1 : 0) ,
' ');
5490par.back().append(w->data(), w->size());
5501 if(
str.empty()) {
5504 #if !defined(NCBI_OS_MSWIN) 5506vector<CTempString> lines;
5514 auto& line = lines[
i];
5525 while(
isspace((
unsigned char)line[pos])) {
5526 if(++pos ==
len) {
5539 if(prefix.
empty() || prefix.
size() > pos) {
5540prefix.
assign(line, 0, pos);
5550 auto& line = lines[
i];
5552 boollast_line = (
i== lines.size()-1);
5570 while(
isspace((
unsigned char)line[pos])) {
5571 if(++pos ==
len) {
5584 if( prefix.
size() ) {
5597 #if !defined(HAVE_STRDUP) 5598 extern char*
strdup(
const char*
str)
5603 size_t size= strlen(
str) + 1;
5610 static const char s_Encode[256][4] = {
5611 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5612 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5613 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5614 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5615 "+",
"!",
"%22",
"%23",
"$",
"%25",
"%26",
"'",
5616 "(",
")",
"*",
"%2B",
",",
"-",
".",
"%2F",
5617 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5618 "8",
"9",
"%3A",
"%3B",
"%3C",
"%3D",
"%3E",
"%3F",
5619 "%40",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5620 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5621 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5622 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"_",
5623 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5624 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5625 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5626 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"%7E",
"%7F",
5627 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5628 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5629 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5630 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5631 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5632 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5633 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5634 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5635 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5636 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5637 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5638 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5639 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5640 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5641 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5642 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5646 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5647 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5648 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5649 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5650 "+",
"%21",
"%22",
"%23",
"%24",
"%25",
"%26",
"%27",
5651 "%28",
"%29",
"%2A",
"%2B",
"%2C",
"%2D",
"%2E",
"%2F",
5652 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5653 "8",
"9",
"%3A",
"%3B",
"%3C",
"%3D",
"%3E",
"%3F",
5654 "%40",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5655 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5656 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5657 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"%5F",
5658 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5659 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5660 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5661 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"%7E",
"%7F",
5662 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5663 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5664 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5665 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5666 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5667 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5668 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5669 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5670 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5671 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5672 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5673 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5674 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5675 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5676 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5677 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5681 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5682 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5683 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5684 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5685 "%20",
"%21",
"%22",
"%23",
"%24",
"%25",
"%26",
"%27",
5686 "%28",
"%29",
"%2A",
"%2B",
"%2C",
"%2D",
"%2E",
"%2F",
5687 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5688 "8",
"9",
"%3A",
"%3B",
"%3C",
"%3D",
"%3E",
"%3F",
5689 "%40",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5690 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5691 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5692 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"%5F",
5693 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5694 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5695 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5696 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"%7E",
"%7F",
5697 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5698 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5699 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5700 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5701 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5702 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5703 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5704 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5705 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5706 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5707 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5708 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5709 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5710 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5711 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5712 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5716 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5717 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5718 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5719 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5720 "+",
"%21",
"%22",
"%23",
"%24",
"%25",
"%26",
"%27",
5721 "%28",
"%29",
"%2A",
"%2B",
"%2C",
"%2D",
".",
"/",
5722 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5723 "8",
"9",
"%3A",
"%3B",
"%3C",
"%3D",
"%3E",
"%3F",
5724 "%40",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5725 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5726 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5727 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"_",
5728 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5729 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5730 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5731 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"%7E",
"%7F",
5732 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5733 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5734 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5735 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5736 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5737 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5738 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5739 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5740 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5741 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5742 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5743 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5744 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5745 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5746 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5747 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5753 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5754 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5755 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5756 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5757 "%20",
"%21",
"%22",
"%23",
"%24",
"%25",
"%26",
"%27",
5758 "%28",
"%29",
"%2A",
"+",
"%2C",
"-",
".",
"%2F",
5759 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5760 "8",
"9",
"%3A",
"%3B",
"%3C",
"%3D",
"%3E",
"%3F",
5761 "%40",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5762 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5763 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5764 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"%5F",
5765 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5766 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5767 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5768 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"%7E",
"%7F",
5769 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5770 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5771 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5772 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5773 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5774 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5775 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5776 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5777 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5778 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5779 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5780 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5781 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5782 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5783 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5784 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5794 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5795 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5796 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5797 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5798 "%20",
"!",
"%22",
"%23",
"$",
"%25",
"&",
"'",
5799 "(",
")",
"*",
"+",
",",
"-",
".",
"%2F",
5800 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5801 "8",
"9",
"%3A",
";",
"%3C",
"=",
"%3E",
"%3F",
5802 "%40",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5803 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5804 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5805 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"_",
5806 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5807 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5808 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5809 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"~",
"%7F",
5810 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5811 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5812 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5813 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5814 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5815 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5816 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5817 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5818 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5819 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5820 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5821 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5822 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5823 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5824 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5825 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5835 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5836 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5837 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5838 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5839 "%20",
"%21",
"%22",
"%23",
"%24",
"%25",
"%26",
"%27",
5840 "%28",
"%29",
"%2A",
"%2B",
"%2C",
"-",
".",
"%2F",
5841 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5842 "8",
"9",
"%3A",
"%3B",
"%3C",
"%3D",
"%3E",
"%3F",
5843 "%40",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5844 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5845 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5846 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"%5F",
5847 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5848 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5849 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5850 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"%7E",
"%7F",
5851 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5852 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5853 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5854 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5855 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5856 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5857 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5858 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5859 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5860 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5861 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5862 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5863 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5864 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5865 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5866 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5878 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5879 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5880 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5881 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5882 "%20",
"!",
"%22",
"%23",
"$",
"%25",
"&",
"'",
5883 "(",
")",
"*",
"+",
",",
"-",
".",
"/",
5884 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5885 "8",
"9",
":",
";",
"%3C",
"=",
"%3E",
"%3F",
5886 "@",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5887 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5888 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5889 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"_",
5890 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5891 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5892 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5893 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"~",
"%7F",
5894 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5895 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5896 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5897 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5898 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5899 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5900 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5901 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5902 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5903 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5904 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5905 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5906 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5907 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5908 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5909 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5913 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5914 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5915 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5916 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5917 "%20",
"!",
"%22",
"%23",
"$",
"%25",
"%26",
"'",
5918 "(",
")",
"%2A",
"%2B",
"%2C",
"-",
".",
"/",
5919 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5920 "8",
"9",
":",
"%3B",
"%3C",
"%3D",
"%3E",
"?",
5921 "@",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5922 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5923 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5924 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"_",
5925 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5926 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5927 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5928 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"~",
"%7F",
5929 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5930 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5931 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5932 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5933 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5934 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5935 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5936 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5937 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5938 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5939 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5940 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5941 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5942 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5943 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5944 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5948 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5949 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5950 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5951 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5952 "%20",
"!",
"%22",
"%23",
"$",
"%25",
"%26",
"'",
5953 "(",
")",
"%2A",
"%2B",
"%2C",
"-",
".",
"/",
5954 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5955 "8",
"9",
":",
"%3B",
"%3C",
"%3D",
"%3E",
"?",
5956 "@",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5957 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5958 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
5959 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"_",
5960 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
5961 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
5962 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
5963 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"~",
"%7F",
5964 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
5965 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
5966 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
5967 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
5968 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
5969 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
5970 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
5971 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
5972 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
5973 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
5974 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
5975 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
5976 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
5977 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
5978 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
5979 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 5989 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
5990 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
5991 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
5992 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
5993 "%20",
"!",
"%22",
"%23",
"$",
"%25",
"&",
"'",
5994 "(",
")",
"*",
"+",
",",
"-",
".",
"/",
5995 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
5996 "8",
"9",
":",
";",
"%3C",
"=",
"%3E",
"?",
5997 "@",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
5998 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
5999 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
6000 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"_",
6001 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
6002 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
6003 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
6004 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"~",
"%7F",
6005 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
6006 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
6007 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
6008 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
6009 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
6010 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
6011 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
6012 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
6013 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
6014 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
6015 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
6016 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
6017 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
6018 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
6019 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
6020 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 6024 "%00",
"%01",
"%02",
"%03",
"%04",
"%05",
"%06",
"%07",
6025 "%08",
"%09",
"%0A",
"%0B",
"%0C",
"%0D",
"%0E",
"%0F",
6026 "%10",
"%11",
"%12",
"%13",
"%14",
"%15",
"%16",
"%17",
6027 "%18",
"%19",
"%1A",
"%1B",
"%1C",
"%1D",
"%1E",
"%1F",
6028 "+",
"!",
"%22",
"%23",
"$",
"%25",
"%26",
"'",
6029 "(",
")",
"*",
"%2B",
"%2C",
"-",
".",
"%2F",
6030 "0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
6031 "8",
"9",
"%3A",
"%3B",
"%3C",
"%3D",
"%3E",
"%3F",
6032 "%40",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
6033 "H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
6034 "P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
6035 "X",
"Y",
"Z",
"%5B",
"%5C",
"%5D",
"%5E",
"_",
6036 "%60",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
6037 "h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
6038 "p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
6039 "x",
"y",
"z",
"%7B",
"%7C",
"%7D",
"%7E",
"%7F",
6040 "%80",
"%81",
"%82",
"%83",
"%84",
"%85",
"%86",
"%87",
6041 "%88",
"%89",
"%8A",
"%8B",
"%8C",
"%8D",
"%8E",
"%8F",
6042 "%90",
"%91",
"%92",
"%93",
"%94",
"%95",
"%96",
"%97",
6043 "%98",
"%99",
"%9A",
"%9B",
"%9C",
"%9D",
"%9E",
"%9F",
6044 "%A0",
"%A1",
"%A2",
"%A3",
"%A4",
"%A5",
"%A6",
"%A7",
6045 "%A8",
"%A9",
"%AA",
"%AB",
"%AC",
"%AD",
"%AE",
"%AF",
6046 "%B0",
"%B1",
"%B2",
"%B3",
"%B4",
"%B5",
"%B6",
"%B7",
6047 "%B8",
"%B9",
"%BA",
"%BB",
"%BC",
"%BD",
"%BE",
"%BF",
6048 "%C0",
"%C1",
"%C2",
"%C3",
"%C4",
"%C5",
"%C6",
"%C7",
6049 "%C8",
"%C9",
"%CA",
"%CB",
"%CC",
"%CD",
"%CE",
"%CF",
6050 "%D0",
"%D1",
"%D2",
"%D3",
"%D4",
"%D5",
"%D6",
"%D7",
6051 "%D8",
"%D9",
"%DA",
"%DB",
"%DC",
"%DD",
"%DE",
"%DF",
6052 "%E0",
"%E1",
"%E2",
"%E3",
"%E4",
"%E5",
"%E6",
"%E7",
6053 "%E8",
"%E9",
"%EA",
"%EB",
"%EC",
"%ED",
"%EE",
"%EF",
6054 "%F0",
"%F1",
"%F2",
"%F3",
"%F4",
"%F5",
"%F6",
"%F7",
6055 "%F8",
"%F9",
"%FA",
"%FB",
"%FC",
"%FD",
"%FE",
"%FF" 6064 constchar (*encode_table)[4];
6113 const unsigned char* cstr = (
const unsigned char*)
str.data();
6114 for(pos = 0; pos <
len; pos++) {
6115 if(encode_table[cstr[pos]][0] ==
'%')
6118dst.resize(dst_len);
6121 for(pos = 0; pos <
len; pos++, p++) {
6122 const char* subst = encode_table[cstr[pos]];
6123 if(*subst !=
'%') {
6127dst[++p] = *(++subst);
6128dst[++p] = *(++subst);
6141 result.reserve(stringSize + 7);
6146 result.append(1,
'\'');
6150 result.append(1,
'\'');
6151}
else if(
offset> 0 && (c & 0x80) != 0) {
6156 result.append(1,
'\'');
6170 if(dst.length() < src.
length()) {
6176 switch( src[psrc] ) {
6181 if(psrc + 2 >
len) {
6182dst[pdst] = src[psrc++];
6186 if(n1 < 0 || n1 > 15 || n2 < 0 || n2 > 15) {
6187dst[pdst] = src[psrc++];
6189dst[pdst] = char((n1 << 4) | n2);
6201dst[pdst] = src[psrc++];
6230 constchar (*encode_table)[4];
6254 const unsigned char* cstr = (
const unsigned char*)
str.data();
6257 const char* subst = encode_table[cstr[pos]];
6258 if(*subst != cstr[pos]) {
6268 size_t n=
str.size();
6271 size_tpos = 0,
len= 0, n_read, n_written;
6274 static const size_tno_breaks = 0;
6275 const char* ptr = dst_buf;
6277 sizeof(dst_buf), &n_written, &no_breaks));
6278 _ASSERT(n_read && n_written);
6281 if(line_len &&
len+ n_written > line_len) {
6284dst.append(ptr,
len);
6285dst.append(1,
'\n');
6289}
while(
n_written > line_len);
6291dst.append(ptr, n_written);
6300 size_t n=
str.size();
6303 const char*
prev= 0;
6304 size_tpos = 0, n_prev = 0, n_read, n_written;
6307 const char*
next=
str.data() + pos;
6309|| (n_written &&
prev&& memchr(
prev,
'=', n_prev))) {
6319dst.append(dst_buf, n_written);
6332 const char* c =
str;
6335 if( strchr(
str,
':') ) {
6342 boolhave_group =
false;
6343 const char* prev_colon =
NULL;
6346 for(; c && c -
str< (
int)
size&& *c !=
'%'; c++) {
6353 if(prev_colon && c - prev_colon == 1) {
6370 chard = (char)
toupper((
unsigned char)(*c));
6371 if(d < '0' || d >
'F') {
6388 int& errno_ref = errno;
6391 if( !
isdigit((
unsigned char)(*c)) )
6394 val= strtoul(c, &e, 10);
6395 if(c == e || errno_ref)
6409 if((
size_t)(c -
str) !=
size) {
6412 return!*c && dots == 3 &&
val< 256;
6419 if(
str.HasZeroAtEnd() ) {
6424 if(
size<
sizeof(
buf) ) {
6438 template<
typenameTDelimiter>
6445PDelimiter(
constTDelimiter& delim)
6449 booloperator()(
chartested_symbol)
const;
6464 template<
typenameTComparator,
typenameTResult>
6470 const char* current_ptr =
str.data();
6471 const char* end_ptr = current_ptr +
str.length();
6472 size_tcurrent_field = 0;
6475 for( ; current_field != field_no; current_field++) {
6476 while(current_ptr < end_ptr && !
delimiter(*current_ptr))
6480 while(current_ptr < end_ptr &&
delimiter(*current_ptr))
6486 if(current_ptr >= end_ptr)
6490 if(current_field != field_no)
6494 const char* field_start = current_ptr;
6495 while(current_ptr < end_ptr && !
delimiter(*current_ptr))
6498 returnTResult(field_start, current_ptr - field_start);
6504 boolPDelimiter<char>::operator() (
charc)
const 6510 boolPDelimiter<CTempString>::operator() (
charc)
const 6522 returns_GetField<PDelimiter<CTempString>,
string>
6525PDelimiter<CTempString>(delimiters),
6535 returns_GetField<PDelimiter<char>,
string>
6548 returns_GetField<PDelimiter<CTempString>,
CTempString>
6551PDelimiter<CTempString>(delimiters),
6581 "NStr::StringToNumeric overflow", 0);
6589 #if defined(__EXPORT_CTOR_STRINGUTF8__) 6617 #if NCBITOOLKIT_USE_LONG_UCS4 6625 #if defined(HAVE_WSTRING) 6633 #if NCBITOOLKIT_USE_LONG_UCS4 6641 #if defined(HAVE_WSTRING) 6651 #if NCBITOOLKIT_USE_LONG_UCS4 6673 for(; src != to; ++src, ++
count) {
6676 while(more-- && good) {
6690 if(err == src.
end()) {
6702 if(err !=
str.end()) {
6704 string(
"Source string is not in UTF8 format: ") +
6716 boolcp1252, iso1, ascii, utf8, cesu8;
6717 for(cp1252 = iso1 = ascii = utf8 =
true, cesu8=
false;
i!= end; ++
i) {
6740 if(ch == 0x81 || ch == 0x8D || ch == 0x8F ||
6741ch == 0x90 || ch == 0x9D) {
6748 if(utf8 && !cesu8 && ch == 0xED && (end -
i) > 5) {
6752 if( ((c1 & 0xA0) == 0xA0) && (c3 == (
uint8_t)0xED) && ((c4 & 0xB0) == 0xB0) ) {
6765}
else if(cp1252) {
6774 boolmatches =
false;
6776 switch( enc_src ) {
6789matches = (encoding == enc_src);
6808 "Cannot convert encoding to string", 0);
6824 const char* ascii[] = {
6825 "ANSI_X3.4-1968",
"iso-ir-6",
"ANSI_X3.4-1986",
"ISO_646.irv:1991",
6826 "ASCII",
"ISO646-US",
"US-ASCII",
"us",
"IBM367",
"cp367",
"csASCII",
NULL};
6827 for(
i=0; ascii[
i]; ++
i) {
6832 const char* iso8859_1[] = {
6833 "ISO_8859-1:1987",
"iso-ir-100",
"ISO_8859-1",
"ISO-8859-1",
6834 "latin1",
"l1",
"IBM819",
"CP819",
"csISOLatin1",
NULL};
6835 for(
i=0; iso8859_1[
i]; ++
i) {
6840 const char* cesu[] = {
6841 "CESU-8",
"csCESU8",
"csCESU-8",
NULL};
6842 for(
i=0; cesu[
i]; ++
i) {
68530x20AC, 0x003F, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
68540x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x003F, 0x017D, 0x003F,
68550x003F, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
68560x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x003F, 0x017E, 0x0178
6868 "Unacceptable character encoding", 0);
6873 if(ch > 0x7F && ch < 0xA0) {
6879 "Unsupported character encoding", 0);
6888 "Unacceptable character encoding", 0);
6894 for(
Uint1ch = 0x80; ch <= 0x9F; ++ch) {
6902 "Failed to convert symbol to requested encoding", 0);
6925 #if defined(HAVE_WSTRING) 6930,
m_Facet(use_facet< ctype<wchar_t> >(lcl)) {
6933 wchar_tw =
m_Facet.widen(ch);
6934 if(w == (
wchar_t)-1) {
6935 string msg(
"Failed to convert to Unicode char ");
6942 charch =
m_Facet.narrow(sym,0);
6943 if(ch == 0 && sym != 0) {
6944 string msg(
"Failed to convert Unicode symbol ");
6951 constctype<wchar_t>&
m_Facet;
6969 for(
charch : src) {
6972 self.reserve(needed+1);
6973 for(
charch : src) {
6981 const SCharEncoder& enc,
const char* substitute_on_error)
6987 for( ; src != to; ++src ) {
6989 if(substitute_on_error) {
6994 result.append(substitute_on_error);
7014 "Conversion into CESU-8 encoding is not supported", 0);
7019 #if defined(HAVE_WSTRING) 7021 const locale& lcl,
const char* substitute_on_error, EValidate
validate)
7034 string(
"Source string is not in UTF8 format: ") +
7044 self.append(1,
Uint1(ch));
7046 else if(ch < 0x800) {
7047 self.append(1,
Uint1( (ch >> 6) | 0xC0));
7048 self.append(1,
Uint1( (ch & 0x3F) | 0x80));
7049}
else if(ch < 0x10000) {
7050 self.append(1,
Uint1( (ch >> 12) | 0xE0));
7051 self.append(1,
Uint1(((ch >> 6) & 0x3F) | 0x80));
7052 self.append(1,
Uint1(( ch & 0x3F) | 0x80));
7054 self.append(1,
Uint1( (ch >> 18) | 0xF0));
7055 self.append(1,
Uint1(((ch >> 12) & 0x3F) | 0x80));
7056 self.append(1,
Uint1(((ch >> 6) & 0x3F) | 0x80));
7057 self.append(1,
Uint1( (ch & 0x3F) | 0x80));
7069 "Unable to guess the source string encoding", 0);
7074 "Source string does not match the declared encoding", 0);
7082 self.reserve(
max(
self.capacity(),
self.length()+src.
length()));
7083 const char*
i= src.
data();
7084 const char* end =
i+ src.
length();
7085 for(;
i!= end; ++
i) {
7087 if(ch == 0xED && (end -
i) > 5) {
7091 if( ((c1 & 0xA0) == 0xA0) && (c3 == (
uint8_t)0xED) && ((c4 & 0xB0) == 0xB0) ) {
7097 self.append(1, ch);
7105 for(
i= src.
begin();
i!= end; ++
i) {
7111 self.reserve(
max(
self.capacity(),
self.length()+needed+1));
7112 for(
i= src.
begin();
i!= end; ++
i) {
7123}
else if(ch < 0x800) {
7125}
else if(ch < 0x10000) {
7137 while(more-- && good) {
7140 returngood ? (src -
str.begin() + 1) : 0;
7146 if((ch & 0x80) != 0) {
7147 if((ch & 0xE0) == 0xC0) {
7148 if((ch & 0xFE) == 0xC0) {
7153}
else if((ch & 0xF0) == 0xE0) {
7155}
else if((ch & 0xF8) == 0xF0) {
7156 if((
unsigned char)ch > (
unsigned char)0xF4) {
7171 return(ch & 0xC0) == 0x80;
7178 if((ch & 0x80) == 0) {
7180}
else if((ch & 0xE0) == 0xC0) {
7181chRes = (ch & 0x1F);
7183}
else if((ch & 0xF0) == 0xE0) {
7184chRes = (ch & 0x0F);
7186}
else if((ch & 0xF8) == 0xF0) {
7187chRes = (ch & 0x07);
7191 "Source string is not in UTF8 format", 0);
7199 if((ch & 0xC0) == 0x80) {
7200 return(chU << 6) | (ch & 0x3F);
7203 "Source string is not in UTF8 format", 0);
7217 returnchU == 0x85 || chU == 0xA0 || chU == 0x1680 || chU == 0x180E;
7218}
else if(chU >= 0x3000) {
7219 returnchU == 0x3000;
7221 returnchU <=0x200A || chU == 0x2028 || chU == 0x2029 || chU == 0x202F || chU == 0x205F;
7223 returniswspace(chU)!=0;
7228 if(!
str.empty()) {
7233 str.replace(0,
str.length(),
t.data(),
t.length());
7242 if(
str.empty()) {
7255 while(end != beg) {
7256 while(end != beg) {
7258 if((ch & 0x80) == 0 || (ch & 0xC0) == 0xC0) {
7279 case eConvert:
return "eConvert";
7280 case eBadArgs:
return "eBadArgs";
7281 case eFormat:
return "eFormat";
7370node = node->next.get()) {
7371s->append(node->str.data(), node->str.size());
7391 "CTempStringList::Join(): non-NULL storage required", 0);
7397node = node->next.get()) {
7398memcpy(p, node->str.data(), node->str.size());
7399p += node->str.size();
7411node = node->next.get()) {
7412total += node->str.size();
7441 SIZE_TYPEpos, part_start, delim_pos = 0, quote_pos = 0;
7442 boolfound_text =
false,
done;
7443 charactive_quote =
'\0';
7450pos = part_start =
m_Pos;
7453 if(ptr_part_start) {
7454*ptr_part_start = part_start;
7462 if(ptr_delim_pos) {
7463*ptr_delim_pos =
NPOS;
7471 SIZE_TYPEnext_start = pos = delim_pos + 1;
7472 boolhandled =
false;
7473 charc =
m_Str[delim_pos];
7483 if(active_quote !=
'\0') {
7484 if(c == active_quote) {
7489active_quote =
'\0';
7498quote_pos = delim_pos;
7517 if(ptr_delim_pos) {
7518*ptr_delim_pos = delim_pos;
7522 if(delim_pos > part_start) {
7524 if(part_collector !=
NULL) {
7525part_collector->
Add(
m_Str.
substr(part_start, delim_pos - part_start));
7528part_start = next_start;
7531 if(active_quote !=
'\0') {
7535 if(delim_pos ==
NPOS) {
7537 if(part_collector !=
NULL) {
ncbi::TMaskedQueryRegions mask
CNcbiOstrstreamToString class helps convert CNcbiOstrstream to a string Sample usage:
CS2N_Guard(NStr::TStringToNumFlags, bool skip_if_zero)
string Message(const CTempString str, const char *to_type, const CTempString msg)
Adapter for token position container pointer(NULL legal) Makes pointer to a container look as a legal...
Main tokenization algorithm.
@ eCharBuffer
Zeros are part of the data.
CStringUTF8_DEPRECATED(void)
Singly-linked list of substrings that will constitute a single Split/Tokenize piece,...
Helper class to allocate memory for CTempString[Ex] on demand in the functions which need to modify t...
CTempString implements a light-weight string on top of a storage buffer whose lifetime management is ...
The NCBI C++ standard methods for dealing with std::string.
static vector< string > arr
std::ofstream out("events_result.xml")
main entry point for tests
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() last(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() prev(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static const char * str(char *buf, int n)
static const char * column
static const char * validate(DSNINFO *di)
Go looking for trouble.
char * strdup(const char *str)
Supply string duplicate function, if one is not defined.
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
#define NON_CONST_ITERATE(Type, Var, Cont)
Non constant version of ITERATE macro.
element_type * get(void) const
Get pointer.
#define ERR_POST_X_ONCE(err_subcode, message)
Error posting only once during program execution with default error code and given error subcode.
#define ERR_POST_X(err_subcode, message)
Error posting with default error code and given error subcode.
void Warning(CExceptionArgs_Base &args)
#define NCBI_THROW2(exception_class, err_code, message, extra)
Throw exception with extra parameter.
virtual const char * GetErrCodeString(void) const
Get error code interpreted as text.
static void SetErrno(int errno_code)
Set last error using errno code.
void Info(CExceptionArgs_Base &args)
#define finite
Define value of finite (Is Finite).
#define NCBI_CONST_LONGDOUBLE(v)
uint8_t Uint1
1-byte (8-bit) unsigned integer
unsigned char Uchar
Alias for unsigned char.
uint32_t Uint4
4-byte (32-bit) unsigned integer
int64_t Int8
8-byte (64-bit) signed integer
uint64_t Uint8
8-byte (64-bit) unsigned integer
#define NCBI_AS_STRING(value)
Convert some value to string even if this value is macro itself.
char * Allocate(CTempString::size_type len)
static EEncoding StringToEncoding(const CTempString &encoding_name)
Convert encoding name into EEncoding enum, taking into account synonyms as per http://www....
static list< string > & SplitByPattern(const CTempString str, const CTempString delim, list< string > &arr, TSplitFlags flags=0, vector< SIZE_TYPE > *token_pos=NULL)
Variation of Split() with fSplit_ByPattern flag applied by default.
static bool IsWhiteSpace(TUnicodeSymbol sym)
Determines if a symbol is whitespace per http://unicode.org/charts/uca/chart_Whitespace....
static bool StringToBool(const CTempString str)
Convert string to bool.
CTempStringEx m_InternalDelim
static string HtmlDecode(const CTempString str, EEncoding encoding=eEncoding_Unknown, THtmlDecode *result_flags=NULL)
Decode HTML entities and character references.
static void x_Validate(const CTempString &str)
NCBI_NS_STD::string::size_type SIZE_TYPE
static bool x_EvalFirst(char ch, SIZE_TYPE &more)
static string SizetToString(size_t value, TNumToStringFlags flags=0, int base=10)
Convert size_t to string.
virtual string Encode(const CTempString src, EStringType stype) const
const_iterator end() const
Return an iterator to the string's ending position (one past the end of the represented sequence)
static string Int8ToString(Int8 value, TNumToStringFlags flags=0, int base=10)
Convert Int8 to string.
static string PrintableString(const CTempString str, TPrintableMode mode=fNewLine_Quote|fNonAscii_Passthru)
Get a printable version of the specified string.
CStringDecoder_Url(NStr::EUrlDecode flag=NStr::eUrlDec_All)
static CStringUTF8 & x_Append(CStringUTF8 &u8str, const CTempString &src, EEncoding encoding, EValidate validate)
static CTempString TruncateSpaces_Unsafe(const CTempString str, ETrunc where=eTrunc_Both)
Truncate whitespace in a string.
static string DoubleToString(double value, int precision=-1, TNumToStringFlags flags=0)
Convert double to string.
static int StringToNonNegativeInt(const CTempString str, TStringToNumFlags flags=0)
Convert string to non-negative integer value.
~CTempString_Storage(void)
char16_t TCharUCS2
Type for character in UCS-2 encoding.
static CTempString GetField_Unsafe(const CTempString str, size_t field_no, const CTempString delimiters, EMergeDelims merge=eNoMergeDelims)
Search for a field.
static int CompareNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive compare of a substring with another string.
EUrlEncode
URL-encode flags.
EMergeDelims
Whether to merge adjacent delimiters.
static string AsSingleByteString(const CTempString &src, EEncoding encoding, const char *substitute_on_error=0, EValidate validate=eNoValidate)
Convert UTF8 string into a single-byte character representation.
static int StringToInt(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to int.
static SIZE_TYPE CommonOverlapSize(const CTempString s1, const CTempString s2)
Determine if the suffix of one string is the prefix of another.
const CTempString & m_Str
static bool x_EvalNext(char ch)
int TPrintableMode
Bitwise OR of EPrintableMode flags.
static bool MatchEncoding(const CTempString &src, EEncoding encoding)
Check the encoding of the C/C++ string.
static Int8 StringToInt8(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to Int8.
int TNumToStringFlags
Bitwise OR of "ENumToStringFlags".
static list< string > & Split(const CTempString str, const CTempString delim, list< string > &arr, TSplitFlags flags=0, vector< SIZE_TYPE > *token_pos=NULL)
Split a string using specified delimiters.
static string Base64Encode(const CTempString str, size_t line_len=0)
Base64-encode string.
static string GetField(const CTempString str, size_t field_no, const CTempString delimiters, EMergeDelims merge=eNoMergeDelims)
Search for a field.
EUrlDecode
URL decode flags.
static SIZE_TYPE FindNoCase(const CTempString str, const CTempString pattern, SIZE_TYPE start, SIZE_TYPE end, EOccurrence which=eFirst)
Find the pattern in the specified range of a string using a case insensitive search.
static string Escape(const CTempString str, const CTempString metacharacters, char escape_char='\\')
Escape string (generic version).
static bool IsLower(const CTempString str)
Checks if all letters in the given string have a lower case.
static CTempString TruncateSpaces_Unsafe(const CTempString &str, NStr::ETrunc side=NStr::eTrunc_Both)
Truncate whitespace in the string.
static string HtmlEntity(TUnicodeSymbol uch)
Returns HTML entity name for this symbol if one exists (without leading ampersand and trailing semico...
static bool MatchesMask(CTempString str, CTempString mask, ECase use_case=eCase)
Match "str" against the "mask".
virtual const char * GetErrCodeString(void) const override
Translate from the error code value to its string representation.
static SIZE_TYPE x_BytesNeeded(TUnicodeSymbol ch)
static CStringUTF8 SQLEncode(const CStringUTF8 &str, ESqlEncode flag)
SQL-encode string.
static string LongToString(long value, TNumToStringFlags flags=0, int base=10)
Convert Int to string.
unique_ptr< string > m_Encoded
static bool IsBlank(const CTempString str, SIZE_TYPE pos=0)
Check if a string is blank (has no text).
static double StringToDoubleEx(const char *str, size_t size, TStringToNumFlags flags=0)
This version accepts zero-terminated string.
void x_ExtendInternalDelim()
static double StringToDouble(const CTempStringEx str, TStringToNumFlags flags=0)
Convert string to double.
static string HtmlEncode(const CTempString str, THtmlEncode flags=fHtmlEnc_EncodeAll)
Encode a string for HTML.
static Uint8 StringToUInt8_DataSize(const CTempString str, TStringToNumFlags flags=0)
Convert string that can contain "software" qualifiers to Uint8.
static SIZE_TYPE GetSymbolCount(const CTempString &src)
Get the number of symbols (code points) in UTF8 string.
static int strncasecmp(const char *s1, const char *s2, size_t n)
Case-insensitive comparison of two zero-terminated strings, narrowed to the specified number of chara...
static size_t StringToSizet(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to size_t.
CTempString & assign(const char *src_str, size_type len)
Assign new values to the content of the a string.
static CTempString x_GetErrorFragment(const CTempString &src)
static string URLDecode(const CTempString str, EUrlDecode flag=eUrlDec_All)
URL-decode string.
static CTempString TrimSuffix_Unsafe(const CTempString str, const CTempString suffix, ECase use_case=eCase)
Trim suffix from a string.
static const string BoolToString(bool value)
Convert bool to string.
static void TruncateSpacesInPlace(string &str, ETrunc where=eTrunc_Both)
Truncate whitespace in a string (in-place)
static string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
static SIZE_TYPE DoubleToStringPosix(double value, unsigned int precision, char *buf, SIZE_TYPE buf_size)
Convert double to string with specified precision and put the result into a character buffer,...
void x_SkipDelims(bool force_skip)
static EEncoding GuessEncoding(const CTempString &src)
Guess the encoding of the C/C++ string.
static string Dedent(const CTempString str, TDedentFlags flags=0)
Dedent multi-line string, removing common whitespace prefix for each line.
virtual string Decode(const CTempString src, EStringType stype) const
static SIZE_TYPE Find(const CTempString str, const CTempString pattern, ECase use_case=eCase, EDirection direction=eForwardSearch, SIZE_TYPE occurrence=0)
Find the pattern in the string.
PNocase_Generic< string > PNocase
static unsigned long StringToULong(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to unsigned long.
const char * const_iterator
static int HexChar(char ch)
Convert character to integer.
size_t GetSize(void) const
static string EncodingToString(EEncoding encoding)
Give Encoding name as string.
int TSplitFlags
Bitwise OR of ESplitFlags.
ETrunc
Which end to truncate a string.
static string ParseEscapes(const CTempString str, EEscSeqRange mode=eEscSeqRange_Standard, char user_char='?')
Parse C-style escape sequences in the specified string.
static void PtrToString(string &out_str, const void *ptr)
Convert pointer to string.
static string Quote(const CTempString str, char quote_char='"', char escape_char = '\\')
Quote string (generic version).
const char * data(void) const
Return a pointer to the array represented.
static string UInt8ToString_DataSize(Uint8 value, TNumToStringFlags flags=0, unsigned int max_digits=3)
Convert UInt8 to string using "software" qualifiers.
basic_string< TUnicodeSymbol > TStringUnicode
Unicode string.
static double StringToDoublePosix(const char *str, char **endptr=0, TStringToNumFlags flags=0)
Convert string to double-precision value (analog of strtod function)
const wchar_t *const kEmptyWCStr
static SIZE_TYPE FindWord(const CTempString str, const CTempString word, ECase use_case=eCase, EDirection direction=eForwardSearch)
Find given word in the string.
char32_t TUnicodeSymbol
Unicode character.
static TUnicodeSymbol DecodeFirst(char ch, SIZE_TYPE &more)
Begin converting first character of UTF8 sequence into Unicode.
bool empty(void) const
Return true if the represented string is empty (i.e., the length is zero)
static CTempString TrimPrefix_Unsafe(const CTempString str, const CTempString prefix, ECase use_case=eCase)
Trim prefix from a string.
TStringUnicode TStringUCS4
static string JsonDecode(const CTempString str, size_t *n_read=NULL)
Decode a string encoded by JsonEncode.
bool AStrEquiv(const Arg1 &x, const Arg2 &y, Pred pr)
Check equivalence of arguments using predicate.
static SIZE_TYPE EvaluateSymbolLength(const CTempString &src)
Check buffer for presence of UTF-8 byte sequence and return length of first symbol.
static string & Replace(const string &src, const string &search, const string &replace, string &dst, SIZE_TYPE start_pos=0, SIZE_TYPE max_replace=0, SIZE_TYPE *num_replace=0)
Replace occurrences of a substring within a string.
static char SymbolToChar(TUnicodeSymbol sym, EEncoding encoding)
Convert Unicode code point into encoded character.
static CStringUTF8 & x_AppendChar(CStringUTF8 &u8str, TUnicodeSymbol ch)
static long StringToLong(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to long.
static CStringUTF8 AsUTF8(const CTempString &src, EEncoding encoding, EValidate validate=eNoValidate)
Convert into UTF8 from a C/C++ string.
basic_string< TCharUCS2 > TStringUCS2
Type for string in UCS-2 encoding.
static string Unescape(const CTempString str, char escape_char='\\')
Unescape string (generic version).
static list< string > & WrapList(const list< string > &l, SIZE_TYPE width, const string &delim, list< string > &arr, TWrapFlags flags=0, const string *prefix=0, const string *prefix1=0)
Wrap the list using the specified criteria.
static CStringUTF8 & TruncateSpacesInPlace(CStringUTF8 &str, NStr::ETrunc side=NStr::eTrunc_Both)
Truncate whitespace in the string (in-place)
bool Advance(CTempStringList *part_collector)
Return TRUE if it found some text and put it into collector.
static string CParse(const CTempString str, EQuoted quoted=eQuoted)
Discard C-style backslash escapes.
static string XmlEncode(const CTempString str, TXmlEncode flags=eXmlEnc_Contents)
Encode a string for XML.
static string Unquote(const CTempString str, char escape_char='\\')
Unquote string (generic version).
static SIZE_TYPE x_GetValidSymbolCount(const CTempString &src, CTempString::const_iterator &err)
static string UIntToString(unsigned int value, TNumToStringFlags flags=0, int base=10)
Convert UInt to string.
static string JavaScriptEncode(const CTempString str)
Encode a string for JavaScript.
static void WrapIt(const string &str, SIZE_TYPE width, _D &dest, TWrapFlags flags=0, const string *prefix=0, const string *prefix1=0)
Wrap the specified string into lines of a specified width.
static TUnicodeSymbol DecodeNext(TUnicodeSymbol chU, char ch)
Convert next character of UTF8 sequence into Unicode.
void MergeDelims(void)
Assumes that we already have a delimiter on the previous position, so just skip all subsequent,...
static void TrimSuffixInPlace(string &str, const CTempString suffix, ECase use_case=eCase)
Trim suffix from a string (in-place)
static Uint8 StringToUInt8(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to Uint8.
static bool SplitInTwo(const CTempString str, const CTempString delim, string &str1, string &str2, TSplitFlags flags=0)
Split a string into two pieces using the specified delimiters.
size_type length(void) const
Return the length of the represented array.
static bool x_ReportLimitsError(const CTempString str, TStringToNumFlags flags)
static string ULongToString(unsigned long value, TNumToStringFlags flags=0, int base=10)
Convert unsigned long to string.
static unsigned int StringToUInt(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to unsigned int.
int TSS_Flags
Bitwise OR of ESS_Flags.
static TUnicodeSymbol CharToSymbol(char ch, EEncoding encoding)
Convert encoded character into Unicode.
static string Base64Decode(const CTempString str)
Base64-decode string.
static list< string > & Justify(const CTempString str, SIZE_TYPE width, list< string > &par, const CTempString *pfx=0, const CTempString *pfx1=0)
Justify the specified string into a series of lines of the same width.
CTempString_Storage * m_Storage
static const void * StringToPtr(const CTempStringEx str, TStringToNumFlags flags=0)
Convert string to pointer.
void Join(string *s) const
static string Sanitize(CTempString str, TSS_Flags flags=fSS_print)
Sanitize a string, allowing only specified classes of characters.
CTempString substr(size_type pos) const
Obtain a substring from this string, beginning at a given offset.
void Add(const CTempString &s)
static bool NeedsURLEncoding(const CTempString str, EUrlEncode flag=eUrlEnc_SkipMarkChars)
Check if the string needs the requested URL-encoding.
static string JsonEncode(const CTempString str, EJsonEncode encoding=eJsonEnc_UTF8)
Encode a string for JSON.
static bool IsIPAddress(const CTempStringEx str)
Check if the string contains a valid IP address.
static TUnicodeSymbol Decode(const char *&src)
Convert sequence of UTF8 code units into Unicode code point.
size_type find_first_not_of(const CTempString match, size_type pos=0) const
Find the first occurrence of any character not in the matching string within the current string,...
static void TrimPrefixInPlace(string &str, const CTempString prefix, ECase use_case=eCase)
Trim prefix from a string (in-place)
ECase
Which type of string comparison.
TErrCode GetErrCode(void) const
Get error code.
void SetString(const CTempString s, NStr::EUrlEncode flag=NStr::eUrlEnc_SkipMarkChars)
Set new original string.
int TWrapFlags
Bitwise OR of "EWrapFlags".
int TStringToNumFlags
Bitwise OR of "EStringToNumFlags".
CTempString_Storage(void)
static bool IsUpper(const CTempString str)
Checks if all letters in the given string have a upper case.
size_type find_first_of(const CTempString match, size_type pos=0) const
Find the first occurrence of any character in the matching string within the current string,...
static SIZE_TYPE GetValidBytesCount(const CTempString &src)
Get the number of valid UTF-8 bytes (code units) in buffer.
static string FormatVarargs(const char *format, va_list args)
Handle an arbitrary printf-style format string.
static void Wrap(const string &str, SIZE_TYPE width, IWrapDest &dest, TWrapFlags flags, const string *prefix, const string *prefix1)
static enable_if< is_arithmetic< TNumeric >::value||is_convertible< TNumeric, Int8 >::value, string >::type NumericToString(TNumeric value, TNumToStringFlags flags=0, int base=10)
Convert numeric value to string.
size_type find(const CTempString match, size_type pos=0) const
Find the first instance of the entire matching string within the current string, beginning at an opti...
static bool Equal(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2, ECase use_case=eCase)
Test for equality of a substring with another string.
static void URLDecodeInPlace(string &str, EUrlDecode flag=eUrlDec_All)
URL-decode string to itself.
static string CEncode(const CTempString str, EQuoted quoted=eQuoted)
Encode a string for C/C++.
static string & ReplaceInPlace(string &src, const string &search, const string &replace, SIZE_TYPE start_pos=0, SIZE_TYPE max_replace=0, SIZE_TYPE *num_replace=0)
Replace occurrences of a substring within a string.
static string & ToUpper(string &str)
Convert string to upper case â string& version.
void SkipDelims(void)
Skip all delimiters starting from current position.
static string URLEncode(const CTempString str, EUrlEncode flag=eUrlEnc_SkipMarkChars)
URL-encode string.
static enable_if< is_integral< TChar >::value &&(1< sizeof(TChar)), CStringUTF8 & >::type AppendAsUTF8(CStringUTF8 &dest, const basic_string< TChar > &src)
Convert Unicode C++ string into UTF8 and append it to existing string.
static string ShellEncode(const string &str)
Quotes a string in Bourne Again Shell (BASH) syntax, in a way that disallows non-printable characters...
CTempStringEx & assign(const char *str, size_type len)
Assign new values to the content of the a string.
static string TruncateSpaces(const string &str, ETrunc where=eTrunc_Both)
Truncate whitespace in a string.
CTempString_Storage m_DelimStorage
const char *const kEmptyCStr
Empty "C" string (points to a '\0').
CStringEncoder_Url(NStr::EUrlEncode flag=NStr::eUrlEnc_SkipMarkChars)
size_type size(void) const
Return the length of the represented array.
static SIZE_TYPE DoubleToString_Ecvt(double value, unsigned int precision, char *buf, SIZE_TYPE buf_size, int *dec, int *sign)
Convert double to string with specified precision.
static string & ToLower(string &str)
Convert string to lower case â string& version.
static int CompareCase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-sensitive compare of a substring with another string.
static string UInt8ToString(Uint8 value, TNumToStringFlags flags=0, int base=10)
Convert UInt8 to string.
const_iterator begin() const
Return an iterator to the string's starting position.
static string ParseQuoted(const CTempString str, size_t *n_read=NULL)
Discard C-style backslash escapes and extract a quoted string.
@ eJsonEnc_UTF8
Encode all characters above 0x80 to \uXXXX form.
@ eJsonEnc_Quoted
Quote resulting string.
@ eEncoding_ISO8859_1
Note: From the point of view of the C++.
@ fNonAscii_Passthru
Allow non-ASCII but printable characters.
@ fPrintable_Full
Show all octal digits at all times.
@ fNonAscii_Quote
Octal for all non-ASCII characters.
@ fNewLine_Passthru
Break the line at every "\n" occurrence.
@ fNewLine_Quote
Display "\n" instead of actual linebreak.
@ fDedent_NormalizeEmptyLines
Each line containing only whitespace will be normalized to a single newline character in the output.
@ fDedent_SkipEmptyFirstLine
Ignore first line and skip it from the result, if it is empty only.
@ fDedent_SkipFirstLine
Ignore first line and skip it from the result.
@ fSS_NoMerge
Do not merge adjacent spaces (rejected chars)
@ fSS_print
Check on isprint()
@ fSS_NoTruncate_Begin
Do not truncate leading spaces.
@ fSS_NoTruncate_End
Do not truncate trailing spaces.
@ fSS_cntrl
Check on iscntrl()
@ fSS_Reject
Reject specified characters, allow all other.
@ fSS_punct
Check on ispunct()
@ fSS_alpha
Check on isalpha()
@ fSS_digit
Check on isdigit()
@ fSS_alnum
Check on isalnum()
@ fSS_Remove
Remove (rather than replace) rejected chars.
@ fDecimalPosixFinite
StringToDouble*(): Keep result finite and normalized: if DBL_MAX < result < INF, result becomes DBL_M...
@ fAllowTrailingSpaces
Ignore trailing whitespace characters.
@ fDS_ProhibitFractions
StringToUInt8_DataSize(): Ignore any fraction part of a value, "1.2K" ~ "1K".
@ fConvErr_NoErrMessage
Set errno, but do not set CNcbiError message on error.
@ fConvErr_NoThrow
Do not throw an exception on error.
@ fAllowLeadingSymbols
Ignore leading non-numeric characters.
@ fDS_ForceBinary
StringToUInt8_DataSize(): Use 1024 as a kilobyte factor regardless of suffix, like "KB" or "KiB".
@ fAllowCommas
Allow commas. See 'ENumToStringFlags::fWithCommas'.
@ fAllowTrailingSymbols
Ignore trailing non-numerics characters.
@ fDS_ProhibitSpaceBeforeSuffix
StringToUInt8_DataSize(): Do not allow spaces between value and suffix, like "10 K".
@ fMandatorySign
Check on mandatory sign. See 'ENumToStringFlags::fWithSign'.
@ fAllowLeadingSpaces
Ignore leading whitespace characters in converted string.
@ fDecimalPosix
StringToDouble*(): For decimal point, use C locale.
@ fDecimalPosixOrLocal
StringToDouble*(): For decimal point, try both C and current locale.
@ eSqlEnc_TagNonASCII
Produce N'...' when input's not pure ASCII.
@ fSplit_CanEscape
Allow \... escaping.
@ fSplit_MergeDelimiters
Merge adjacent delimiters.
@ fSplit_CanDoubleQuote
Allow "..." quoting.
@ fSplit_Truncate_Begin
Truncate leading delimiters.
@ fSplit_ByPattern
Require full delimiter strings.
@ fSplit_CanSingleQuote
Allow '...' quoting.
@ fWrap_Hyphenate
Add a hyphen when breaking words?
@ fWrap_HTMLPre
Wrap as pre-formatted HTML?
@ fWrap_FlatFile
Wrap for flat file use.
@ eUrlEnc_ProcessMarkChars
Convert all non-alphanumeric chars, spaces are converted to '+'.
@ eUrlEnc_None
Do not encode.
@ eUrlEnc_URIQueryValue
Encode query part of an URI, arg value.
@ eUrlEnc_PercentOnly
Convert all non-alphanumeric chars including space and '' to %## format.
@ eUrlEnc_URIHost
Encode host part of an URI.
@ eUrlEnc_URIQueryName
Encode query part of an URI, arg name.
@ eUrlEnc_URIPath
Encode path part of an URI.
@ eUrlEnc_Path
Same as ProcessMarkChars but preserves valid path characters ('/', '.')
@ eUrlEnc_URIScheme
Encode scheme part of an URI.
@ eUrlEnc_URIUserinfo
Encode userinfo part of an URI.
@ eUrlEnc_SkipMarkChars
Do not convert chars like '!', '(' etc.
@ eUrlEnc_Cookie
Same as SkipMarkChars with encoded ','.
@ eUrlEnc_URIFragment
Encode fragment part of an URI.
@ eFirst
First occurrence.
@ eUrlDec_All
Decode '+' to space.
@ eReverseSearch
Search in a backward direction.
@ eForwardSearch
Search in a forward direction.
@ eXmlEnc_CommentSafe
Encode double hyphen and ending hyphen, making the result safe to put into XML comments.
@ eXmlEnc_Unsafe_Skip
Check each character to conform XML 1.1 standards, skip any not allowed character or throw an CString...
@ fDoubleScientific
DoubleToString*(): Use scientific format for double conversions.
@ fDoublePosix
DoubleToString*(): Use C locale for double conversions.
@ fWithRadix
Prefix the output value with radix for "well-known" bases like 8 ("0") and 16 ("0x")
@ fDoubleFixed
DoubleToString*(): Use n.nnnn format for double conversions.
@ fDS_PutBSuffixToo
UInt8ToString_DataSize(): Use "B" suffix for small bytes values.
@ fWithCommas
Use commas as thousands separator.
@ fUseLowercase
Use lowercase letters for string representation for bases above 10.
@ fDS_ShortSuffix
UInt8ToString_DataSize(): Use short suffix, like "10.0K".
@ fWithSign
Prefix the output value with a sign ('+'/'-')
@ fDS_PutSpaceBeforeSuffix
UInt8ToString_DataSize(): Add space between value and qualifiers, like "10.0 KB".
@ fDS_Binary
UInt8ToString_DataSize(): Use 1024 as a kilobyte factor, not 1000.
@ fDS_NoDecimalPoint
UInt8ToString_DataSize(): Do not add a decimal point ("10KB" vs "10.0KB")
@ eConvert
Failure to convert string.
@ eFormat
Wrong format for any input to string methods.
@ eBadArgs
Bad arguments to string methods.
@ eTrunc_Both
Truncate whitespace at both begin and end of string.
@ eTrunc_End
Truncate trailing whitespace only.
@ eTrunc_Begin
Truncate leading whitespace only.
@ eQuoted
String is quoted.
@ eNotQuoted
String is not quoted.
@ fHtmlEnc_CheckPreencoded
Print warning if some pre-encoded entity found in the string.
@ fHtmlEnc_SkipLiteralEntities
Skip "&entity;".
@ fHtmlEnc_SkipNumericEntities
Skip "&#NNNN;".
@ fHtmlDec_Encoding_Changed
Character encoding changed.
@ fHtmlDec_CharRef_Entity
Character entity reference(s) was found.
@ fHtmlDec_CharRef_Numeric
Numeric character reference(s) was found.
@ eNocase
Case insensitive compare.
@ eCase
Case sensitive compare.
@ eEscSeqRange_User
Set char to the user value passed in another parameter.
@ eEscSeqRange_Standard
Set char to the last (least significant byte) of the escape sequence (default).
@ eEscSeqRange_Throw
Throw an exception.
@ eEscSeqRange_Errno
Set errno to ERANGE, return empty string.
@ eEscSeqRange_FirstByte
Set char to the first byte of the escape sequence.
unsigned int
A callback function used to compare two keys in a database.
#define NCBI_DEVELOPMENT_VER
Definition of all error codes used in corelib (xncbi.lib).
The blob sat and sat key Both must be positive integers</td > n< td > Non empty string The interpretation of the blob id depends on a processor Cassandra n processor expects the following format
static void hex(unsigned char c)
const struct ncbi::grid::netcache::search::fields::SIZE size
pair< CTempString, CTempString > s_GetField(const string &data, size_t &pos)
const GenericPointer< typename T::ValueType > T2 value
static unsigned int ud(time_t one, time_t two)
#define NCBI_CONST_UINT8(v)
Defines NCBI C++ Toolkit portable error codes.
Floating-point support routines.
static const char * s_kFString
static bool _isspace(unsigned char c)
static const char * s_kYString
static const char s_EncodeURIScheme[256][4]
#define CHECK_ENDPTR_SIZE(to_type)
#define S2N_CONVERT_GUARD_EX(flags)
static const char * s_kOnString
static double s_StringToDouble(const char *str, size_t size, NStr::TStringToNumFlags flags)
static void s_UnsignedOtherBaseToString(string &out_str, T value, NStr::TNumToStringFlags flags, int base)
static const char * s_kNoString
static const char s_EncodeURIPath[256][4]
static const char s_EncodePath[256][4]
static const char s_EncodeMarkChars[256][4]
#define CHECK_SPLIT_TEMPSTRING_FLAGS(where)
const int kMaxDoublePrecision
#define PRINT_INT8_CHUNK_SIZE
static const char kDigitUpper[]
string x_AsSingleByteString(const CTempString &str, const SCharEncoder &enc, const char *substitute_on_error)
static const char s_EncodePercentOnly[256][4]
const char *const kNcbiDevelopmentVersionString
static bool s_IsWordBoundaryChar(char ch)
static const char * s_kFalseString
static const char kDigitLower[]
static const char s_EncodeURIQueryValue[256][4]
static const char * s_kOffString
TStr s_TruncateSpaces(const TStr &str, NStr::ETrunc where, const TStr &empty_str)
static SIZE_TYPE s_DiffPtr(const char *end, const char *start)
#define S2N_CONVERT_ERROR(to_type, msg, errcode, pos)
static const TUnicodeSymbol s_cp1252_table[]
#define S2N_CONVERT_ERROR_RADIX(to_type, msg)
static const char * s_kYesString
static const char * s_kNString
static bool s_IsDecimalPoint(unsigned char ch, NStr::TStringToNumFlags flags)
#define S2N_CONVERT_GUARD(flags)
Regular guard.
static struct tag_HtmlEntities s_HtmlEntities[]
static bool s_IsIPAddress(const char *str, size_t size)
static void s_SkipAllowedSymbols(const CTempString str, SIZE_TYPE &pos, ESkipMode skip_mode, NStr::TStringToNumFlags flags)
static const char s_EncodeURIFragment[256][4]
static Uint8 s_DataSizeConvertQual(const CTempString str, SIZE_TYPE &pos, Uint8 value, NStr::TStringToNumFlags flags)
static bool s_IsGoodCharForRadix(char ch, int base, int *value=0)
static const char * s_kTrueString
static bool s_CheckRadix(const CTempString str, SIZE_TYPE &pos, int &base)
static const char s_EncodeURIQueryName[256][4]
static EMatchesMaskResult s_MatchesMask(CTempString str, CTempString mask, bool ignore_case)
string s_ParseJsonEncodeEscapes(const CTempString str)
static const char s_EncodeURIUserinfo[256][4]
static SIZE_TYPE s_VisibleHtmlWidth(const string &str)
static SIZE_TYPE s_EndOfReference(const string &str, SIZE_TYPE start)
static void s_SignedBase10ToString(string &out_str, unsigned long value, long svalue, NStr::TNumToStringFlags flags, int base)
static char * s_ncbi_append_int2str(char *buffer, unsigned int value, size_t digits, bool zeros)
TContainer & s_Split(const TString &str, const TString &delim, TContainer &arr, NStr::TSplitFlags flags, vector< SIZE_TYPE > *token_pos, CTempString_Storage *storage=NULL)
static string s_PrintableString(const CTempString str, NStr::TPrintableMode mode, ELanguage lang)
static const char s_EncodeURIHost[256][4]
CTempString s_Unquote(const CTempString str, size_t *n_read)
static const char s_Encode[256][4]
const int kMaxDoubleStringSize
static const char s_EncodeCookie[256][4]
static char * s_PrintBase10Uint8(char *pos, Uint8 value, NStr::TNumToStringFlags flags)
static void s_URLDecode(const CTempString src, string &dst, NStr::EUrlDecode flag)
static const char * s_kTString
static SIZE_TYPE s_EndOfTag(const string &str, SIZE_TYPE start)
#define S2N_CONVERT_ERROR_INVAL(to_type)
#define CHECK_ENDPTR(to_type)
#define S2N_CONVERT_ERROR_OVERFLOW(to_type)
Algorithms for string processing.
Int4 delta(size_t dimension_, const Int4 *score_)
void copy(Njn::Matrix< S > *matrix_, const Njn::Matrix< T > &matrix0_)
static const char * locale
static PCRE2_SIZE bufsize
static const streamsize kBufSize
static const char delimiter[]
static SLJIT_INLINE sljit_ins l(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
static SLJIT_INLINE sljit_ins msg(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
Do nothing target reservation trait.
Do nothing token counter.
Do-nothing token position container.
virtual char ToChar(TUnicodeSymbol sym) const =0
virtual TUnicodeSymbol ToUnicode(char ch) const =0
virtual TUnicodeSymbol ToUnicode(char ch) const
SEncEncoder(EEncoding encoding)
virtual char ToChar(TUnicodeSymbol sym) const
const ctype< wchar_t > & m_Facet
virtual TUnicodeSymbol ToUnicode(char ch) const
virtual char ToChar(TUnicodeSymbol sym) const
SLocaleEncoder(const locale &lcl)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4