// test_string.cpp #include #include #include #include #include #include #ifdef __MINGW32__ # define _GLIBCXX_USE_C99_DYNAMIC 1 #endif #ifdef U_STDCPP_ENABLE # undef min using std::min; # include # include # if defined(HAVE_CXX11) # include # endif #endif #define TEST_MEMMOVE #define TEST_ASSIGN #define TEST_CAPACITY #define TEST_COMPARE #define TEST_CONSTRUCTORS #define TEST_ACCESS #define TEST_FIND #define TEST_INSERT #define TEST_REPLACE #define TEST_NOT_MEMBER #define TEST_OPERATIONS #define TEST_SUBSTR #define TEST_CLASS #define TEST_STREAM #ifdef TEST_MEMMOVE // memmove requirements static void test_memmove_01() { U_TRACE(5, "test_memmove_01()") const UString str_01("zuma beach"); const UString str_02("montara and ocean beach"); char array1[] = {'z', 'u', 'm', 'a', ' ', 'b', 'e', 'a', 'c', 'h', 0}; const char str_lit1[] = "montara and ocean beach"; char array2[sizeof(str_lit1) + sizeof(array1) - 1] = { '\0', '\0' }; U_ASSERT( str_lit1[0] == 'm' ) char c1 = array2[0]; char c2 = str_lit1[0]; char c3 = array2[1]; char c4 = str_lit1[1]; U_ASSERT( array2[0] == c1 ) U_ASSERT( str_lit1[0] == c2 ) apex_memmove(array2, str_lit1, 1); U_ASSERT( array2[0] == c2 ) U_ASSERT( str_lit1[0] == c2 ) U_ASSERT( array2[1] == c3 ) U_ASSERT( str_lit1[1] == c4 ) apex_memmove(array2, str_lit1, 2); U_ASSERT( array2[0] == c2 ) U_ASSERT( str_lit1[0] == c2 ) U_ASSERT( array2[1] == c4 ) U_ASSERT( str_lit1[1] == c4 ) char* pc1 = array1 + 1; c1 = pc1[0]; c2 = array1[0]; U_ASSERT( c1 != c2 ) char* pc2 = (char*)apex_memmove(array1, pc1, 0); c3 = pc1[0]; c4 = array1[0]; U_ASSERT( c1 == c3 ) U_ASSERT( c2 == c4 ) U_ASSERT( pc2 == array1 ) c1 = pc1[0]; c2 = array1[0]; char* pc3 = pc1; pc2 = (char*)apex_memmove(array1, pc1, 10); c3 = pc1[0]; c4 = array1[0]; U_ASSERT( c1 != c3 ) // underlying char array changed. U_ASSERT( c4 != c3 ) U_ASSERT( pc2 == array1 ) U_ASSERT( pc3 == pc1 ) // but pointers o-tay c1 = *(str_01.data()); c2 = array1[0]; U_ASSERT( c1 != c2 ) } #endif static unsigned csz01, csz02; static unsigned npos = unsigned(-1); #ifdef TEST_ASSIGN // UString assign static void test_assign_01() { U_TRACE(5, "test_assign_01()") const char str_lit01[] = "point bolivar, texas"; const UString str01(str_lit01); const UString str02("corpus, "); const UString str03; UString str05; // UString& append(const UString&) str05 = str02; str05.append(str05); U_ASSERT( str05 == "corpus, corpus, " ) str05.append(str01); U_ASSERT( str05 == "corpus, corpus, point bolivar, texas" ) str05.append(str03); U_ASSERT( str05 == "corpus, corpus, point bolivar, texas" ) UString str06; str06.append(str05); U_ASSERT( str06 == str05 ) // UString& append(const UString&, unsigned pos, unsigned n) str05.erase(); str06.erase(); str05 = str02; str05.append(str01, 0, npos); U_ASSERT( str05 == "corpus, point bolivar, texas" ); U_ASSERT( str05 != str02 ) str06 = str02; str06.append(str01, 15, npos); U_ASSERT( str06 == "corpus, texas" ) U_ASSERT( str02 != str06 ) // UString& append(const char* s) str05.erase(); str06.erase(); str05.append(""); U_ASSERT( str05 == str03 ) str05.append(str_lit01); U_ASSERT( str05 == str01 ) str06 = str02; str06.append("corpus, "); U_ASSERT( str06 == "corpus, corpus, " ) // UString& append(const char* s, unsigned n) str05.erase(); str06.erase(); str05.append("", 0); U_ASSERT( str05.size() == 0 ) U_ASSERT( str05 == str03 ) str05.append(str_lit01, sizeof(str_lit01) - 1); U_ASSERT( str05 == str01 ) str06 = str02; str06.append("corpus, ", 6); U_ASSERT( str06 == "corpus, corpus" ) str06 = str02; str06.append(U_CONSTANT_TO_PARAM("corpus, ")); U_ASSERT( str06 == "corpus, corpus, " ) // UString& append(unsigned n, char c) str05.erase(); str06.erase(); str05.append(0, 'a'); U_ASSERT( str05 == str03 ) str06.append(8, '.'); U_ASSERT( str06 == "........" ) str05.erase(); str06.erase(); str05.append(str03); U_ASSERT( str05 == str03 ) str06 = str02; str06.append(str01.data(), str01.find('r')); U_ASSERT( str06 == "corpus, point boliva" ) U_ASSERT( str06 != str01 ) U_ASSERT( str06 != str02 ) str05 = str01; str05.append(str05.data(), str05.find('r')); U_ASSERT( str05 == "point bolivar, texaspoint boliva" ) U_ASSERT( str05 != str01 ) } #endif #ifdef TEST_CAPACITY // UString capacity static void test_capacity_01() { U_TRACE(5, "test_capacity_01()") // 1 POD types : resize, capacity, reserve UString str01; unsigned sz01 = str01.capacity(); str01.reserve(100); unsigned sz02 = str01.capacity(); U_ASSERT( sz02 >= sz01 ) U_ASSERT( sz02 >= 100 ) str01.reserve(1); sz01 = str01.capacity(); U_ASSERT( sz01 > 0 ) sz01 = str01.size() + 5; str01.resize(sz01, '\0'); sz02 = str01.size(); U_ASSERT( sz01 == sz02 ) sz01 = str01.size() - 5; str01.resize(sz01, '\0'); sz02 = str01.size(); U_ASSERT( sz01 == sz02 ) UString str05(30, 'q'); UString str06 = str05; str05 = str06 + str05; U_ASSERT( str05.capacity() >= str05.size() ) U_ASSERT( str06.capacity() >= str06.size() ) UString str02; unsigned sz03; unsigned sz04; sz03 = str02.capacity(); str02.reserve(100); sz04 = str02.capacity(); U_ASSERT( sz04 >= sz03 ) U_ASSERT( sz04 >= 100 ) str02.reserve(1); sz03 = str02.capacity(); U_ASSERT( sz03 > 0 ) sz03 = str02.size() + 5; str02.resize(sz03, '\0'); sz04 = str02.size(); U_ASSERT( sz03 == sz04 ) sz03 = str02.size() - 5; str02.resize(sz03, '\0'); sz04 = str02.size(); U_ASSERT( sz03 == sz04 ) char inst_obj = '\0'; UString str07(30, inst_obj); UString str08 = str07; str07 = str08 + str07; U_ASSERT( str07.capacity() >= str07.size() ) U_ASSERT( str08.capacity() >= str08.size() ) // 3 POD types: size, length, max_size, clear(), empty() bool b01; UString str011; b01 = str01.empty(); U_ASSERT( b01 ) sz01 = str01.size(); sz02 = str01.length(); U_ASSERT( sz01 == sz02 ) str01.c_str(); sz01 = str01.size(); sz02 = str01.length(); U_ASSERT( sz01 == sz02 ) sz01 = str01.length(); str01.c_str(); U_INTERNAL_DUMP("_LINE_ = %u __PRETTY_FUNCTION__ = %S", __LINE__, __PRETTY_FUNCTION__) str011 = str01 + "_addendum_"; str01.c_str(); sz02 = str01.length(); U_ASSERT( sz01 == sz02 ) sz02 = str011.length(); U_ASSERT( sz02 > sz01 ) UString str3 = U_STRING_FROM_CONSTANT("8-chars_8-chars_"); (void) str3.c_str(); UString str4 = str3 + U_STRING_FROM_CONSTANT("7-chars"); (void) str3.c_str(); sz01 = str01.size(); sz02 = str01.max_size(); U_ASSERT( sz02 >= sz01 ) sz01 = str01.size(); str01.clear(); b01 = str01.empty(); U_ASSERT( b01 ) sz02 = str01.size(); U_ASSERT( sz01 >= sz02 ) b01 = str02.empty(); U_ASSERT( b01 ) sz03 = str02.size(); sz04 = str02.length(); U_ASSERT( sz03 == sz04 ) str02.c_str(); sz03 = str02.size(); sz04 = str02.length(); U_ASSERT( sz03 == sz04 ) sz03 = str02.max_size(); U_ASSERT( sz03 >= sz04 ) sz03 = str02.size(); str02.clear(); b01 = str02.empty(); U_ASSERT( b01 ) sz04 = str02.size(); U_ASSERT( sz03 >= sz04 ) } static void test_capacity_02() { U_TRACE(5, "test_capacity_02()") UString str01 = U_STRING_FROM_CONSTANT("twelve chars"); // str01 becomes shared UString str02 = str01; str01.reserve(1); U_ASSERT( str01.capacity() >= 12 ) } #endif #ifdef TEST_COMPARE // UString compare // NB compare should be thought of as a lexographical compare, ie how // things would be sorted in a dictionary. enum want_value { lt = 0, z = 1, gt = 2 }; static void test_value(int result, want_value expected) { U_TRACE(5, "test_value(%d,%d)", result, (int)expected) bool pass = false; switch (expected) { case lt: if (result < 0) pass = true; break; case z: if (!result) pass = true; break; case gt: if (result > 0) pass = true; break; default: pass = false; // should not get here } U_ASSERT( pass ) } static void test_compare_01() { U_TRACE(5, "test_compare_01()") UString str_0("costa rica"); UString str_1("costa marbella"); UString str_2; //sanity check test_value(strcmp("costa marbella", "costa rica"), lt); test_value(strcmp("costa rica", "costa rica"), z); test_value(strcmp(str_1.data(), str_0.data()), lt); test_value(strcmp(str_0.data(), str_1.data()), gt); test_value(strncmp(str_1.data(), str_0.data(), 6), z); test_value(strncmp(str_1.data(), str_0.data(), 14), lt); test_value(memcmp(str_1.data(), str_0.data(), 6), z); test_value(memcmp(str_1.data(), str_0.data(), 10), lt); test_value(memcmp("costa marbella", "costa rica", 10), lt); // int compare(const UString& str) const; test_value(str_0.compare(str_1), gt); // because r>m test_value(str_1.compare(str_0), lt); // because m size() || p2 > str.size() // 2) (length_error) if size() >= npos - rlen // effects: // replaces *this with new UString of length size() + rlen such that // nstr[0] to nstr[p1] == thisstr[0] to thisstr[p1] // nstr[p1 + 1] to nstr[p1 + rlen] == str[p2] to str[p2 + rlen] // nstr[p1 + 1 + rlen] to nstr[...] == thisstr[p1 + 1] to thisstr[...] str03 = str01; csz01 = str03.size(); csz02 = str02.size(); str03.insert(13, str02, 0, 12); U_ASSERT( str03 == "rodeo beach, baker beach,marin" ) str03 = str01; csz01 = str03.size(); csz02 = str02.size(); str03.insert(0, str02, 0, 12); U_ASSERT( str03 == "baker beach,rodeo beach, marin" ) str03 = str01; csz01 = str03.size(); csz02 = str02.size(); str03.insert(csz01, str02, 0, csz02); U_ASSERT( str03 == "rodeo beach, marinbaker beach, san francisco" ) // UString& insert(unsigned p, const UString& str); // insert(p1, str, 0, npos) str03 = str01; csz01 = str03.size(); csz02 = str02.size(); str03.insert(csz01, str02); U_ASSERT( str03 == "rodeo beach, marinbaker beach, san francisco" ) str03 = str01; csz01 = str03.size(); csz02 = str02.size(); str03.insert(0, str02); U_ASSERT( str03 == "baker beach, san franciscorodeo beach, marin" ) // UString& insert(unsigned p, const char* s, unsigned n); // insert(p1, UString(s,n)) str03 = str02; csz01 = str03.size(); str03.insert(0, "-break at the bridge", 20); U_ASSERT( str03 == "-break at the bridgebaker beach, san francisco" ) // UString& insert(unsigned p, const char* s); // insert(p1, UString(s)) str03 = str02; str03.insert(0, "-break at the bridge"); U_ASSERT( str03 == "-break at the bridgebaker beach, san francisco" ) // UString& insert(unsigned p, unsigned n, char c) // insert(p1, UString(n,c)) str03 = str02; csz01 = str03.size(); str03.insert(csz01, 5, 'z'); U_ASSERT( str03 == "baker beach, san franciscozzzzz" ) // iterator insert(unsigned p, unsigned n, char c) // inserts n copies of c before the character referred to by p str03 = str02; str03.insert(0, 1, 'u'); U_ASSERT( str03 == "ubaker beach, san francisco" ) str03 = str02; str03.insert(0, 5, 'u'); U_ASSERT( str03 == "uuuuubaker beach, san francisco" ) str03 = str02; csz01 = str03.size(); str03.insert(0, str01); U_ASSERT( str03 == "rodeo beach, marinbaker beach, san francisco" ) str03 = str02; csz01 = str03.size(); str03.insert(str03.size(), str01); U_ASSERT( str03 == "baker beach, san franciscorodeo beach, marin" ) } #endif #ifdef TEST_REPLACE // UString replace static void test_replace_01() { U_TRACE(5, "test_replace_01()") const char str_lit01[] = "ventura, california"; const UString str01(str_lit01); UString str02("del mar, california"); UString str03(" and "); UString str05; // UString& replace(unsigned pos, unsigned n, const UString& UString) // UString& replace(unsigned pos1, unsigned n1, const UString& UString, // unsigned pos2, unsigned n2) // UString& replace(unsigned pos, unsigned n1, const char* s, unsigned n2) // UString& replace(unsigned pos, unsigned n1, const char* s) // UString& replace(unsigned pos, unsigned n1, unsigned n2, char c) UString X = U_STRING_FROM_CONSTANT("Hello"); UString x = X; char ch = x[0]; U_ASSERT( ch == 'H' ) UString z = x.substr(2U, 3U); U_ASSERT( z == U_STRING_FROM_CONSTANT("llo") ) x.replace(2, 2, "r"); U_ASSERT( x == U_STRING_FROM_CONSTANT("Hero") ) x = X; x.replace(0, 1, "j"); U_ASSERT( x == U_STRING_FROM_CONSTANT("jello") ) const char ar[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; x.replace(x.find('l'), 2, ar, (sizeof(ar) / sizeof(ar[0])) - 1); U_ASSERT( x == U_STRING_FROM_CONSTANT("jeHelloo") ) } #endif #ifdef TEST_NOT_MEMBER // UString not_member functions static void test_not_member_01() { U_TRACE(5, "test_not_member_01()") UString str_0("costa rica"); UString str_1("costa marbella"); UString str_2("cost"); UString str_3("costa ricans"); UString str_4; str_4 = str_0; //comparisons between UString objects U_ASSERT( !(str_0 == str_1) ) U_ASSERT( !(str_0 == str_2) ) U_ASSERT( !(str_0 == str_3) ) U_ASSERT( !(str_1 == str_0) ) U_ASSERT( !(str_2 == str_0) ) U_ASSERT( !(str_3 == str_0) ) U_ASSERT( str_4 == str_0 ) U_ASSERT( str_0 == str_4 ) U_ASSERT( str_0 != str_1 ) U_ASSERT( str_0 != str_2 ) U_ASSERT( str_0 != str_3 ) U_ASSERT( str_1 != str_0 ) U_ASSERT( str_2 != str_0 ) U_ASSERT( str_3 != str_0 ) U_ASSERT( !(str_0 != str_4) ) U_ASSERT( !(str_4 != str_0) ) U_ASSERT( str_0 > str_1 ) //true cuz r>m U_ASSERT( str_0 > str_2 ) U_ASSERT( !(str_0 > str_3) ) U_ASSERT( !(str_1 > str_0) ) //false cuz m str_0) ) U_ASSERT( str_3 > str_0 ) U_ASSERT( !(str_0 > str_4) ) U_ASSERT( !(str_4 > str_0) ) U_ASSERT( !(str_0 < str_1) ) //false cuz r>m U_ASSERT( !(str_0 < str_2) ) U_ASSERT( str_0 < str_3 ) U_ASSERT( str_1 < str_0 ) //true cuz m= str_1 ) //true cuz r>m U_ASSERT( str_0 >= str_2 ) U_ASSERT( !(str_0 >= str_3) ) U_ASSERT( !(str_1 >= str_0) ) //false cuz m= str_0) ) U_ASSERT( str_3 >= str_0 ) U_ASSERT( str_0 >= str_4 ) U_ASSERT( str_4 >= str_0 ) U_ASSERT( !(str_0 <= str_1) ) //false cuz r>m U_ASSERT( !(str_0 <= str_2) ) U_ASSERT( str_0 <= str_3 ) U_ASSERT( str_1 <= str_0 ) //true cuz m "costa marbella" ) //true cuz r>m U_ASSERT( str_0 > "cost" ) U_ASSERT( !(str_0 > "costa ricans") ) U_ASSERT( !("costa marbella" > str_0) ) //false cuz m str_0) ) U_ASSERT( "costa ricans" > str_0 ) U_ASSERT( !("costa rica" > str_0) ) U_ASSERT( !(str_0 > "costa rica") ) U_ASSERT( !(str_0 < "costa marbella") ) //false cuz r>m U_ASSERT( !(str_0 < "cost") ) U_ASSERT( str_0 < "costa ricans" ) U_ASSERT( "costa marbella" < str_0 ) //true cuz m= "costa marbella" )//true cuz r>m U_ASSERT( str_0 >= "cost" ) U_ASSERT( !(str_0 >= "costa ricans") ) U_ASSERT( !("costa marbella" >= str_0) )//false cuz m= str_0) ) U_ASSERT( "costa ricans" >= str_0 ) U_ASSERT( "costa rica" >= str_0 ) U_ASSERT( str_0 >= "costa rica" ) U_ASSERT( !(str_0 <= "costa marbella") )//false cuz r>m U_ASSERT( !(str_0 <= "cost") ) U_ASSERT( str_0 <= "costa ricans" ) U_ASSERT( "costa marbella" <= str_0 )//true cuz m>(istream&, UString&) istrstream istrs01(U_STRING_TO_PARAM(str01)); istrs01 >> str10; U_ASSERT( str10 == str02 ) int i01 = istrs01.peek(); //a-boo U_ASSERT( i01 == ' ' ) istrs01 >> str10; U_ASSERT( str10 == str03 ) istrs01 >> str10; U_ASSERT( str10 == str04 ) // sentry picks out the white spaces. . #if __GNUC__ >= 3 istrstream istrs02(U_STRING_TO_PARAM(str05)); // empty istrs02 >> str10; // U_ASSERT( str10 == str04 ) #endif // istream& getline(istream&, UString&, char) // istream& getline(istream&, UString&) #ifndef U_STD_STRING # define getline(is, str, c) str.getline(is, c) #endif getline(istrs01, str10, '\n'); U_ASSERT( !istrs01.fail() ) U_ASSERT( !istrs01.eof() ) U_ASSERT( istrs01.good() ) U_ASSERT( str10 == " bay" ) istrs01.clear(); getline(istrs01, str10, '\t'); U_ASSERT( !istrs01.fail() ) U_ASSERT( !istrs01.eof() ) U_ASSERT( istrs01.good() ) U_ASSERT( str10 == str05 ) istrs01.clear(); getline(istrs01, str10, '\t'); U_ASSERT( !istrs01.fail() ) U_ASSERT( !istrs01.eof() ) U_ASSERT( istrs01.good() ) U_ASSERT( str10 == str05 ) istrs01.clear(); getline(istrs01, str10, '.'); U_ASSERT( !istrs01.fail() ) U_ASSERT( istrs01.eof() ) U_ASSERT( !istrs01.good() ) U_ASSERT( str10 == "\t from Elk Rapids to the point reminds me of miles" ) #if __GNUC__ >= 3 getline(istrs02, str10, '\n'); U_ASSERT( istrs02.fail() ) U_ASSERT( istrs02.eof() ) U_ASSERT( str10 == "\t from Elk Rapids to the point reminds me of miles" ) #endif // ostream& operator<<(ostream&, const UString&) char buffer[1024]; ostrstream ostrs01(buffer, sizeof(buffer)); ostrs01 << str01 << '\0'; U_ASSERT( str01 == ostrs01.str() ) #endif } // testing UStringbuf::xsputn via stress testing with large UStrings // based on a bug report libstdc++ 9 static void test_stream_04(unsigned size) { U_TRACE(5, "test_stream_04(%d)", size) UString str(size, 's'); unsigned expected_size = (2 * (size + sizeof(char))); char buffer[expected_size+1]; #ifdef U_STDCPP_ENABLE ostrstream oss(buffer, sizeof(buffer)); // sanity checks U_ASSERT( str.size() == size ) U_ASSERT( oss.good() ) // stress test oss << str << std::endl; U_ASSERT( oss.good() ) oss << str << std::endl << '\0'; U_ASSERT( oss.good() ) U_ASSERT( str.size() == size ) U_ASSERT( oss.good() ) UString str_tmp = UString(oss.str()); U_ASSERT( str_tmp.size() == expected_size ) #endif } // testing filebuf::xsputn via stress testing with large UStrings // based on a bug report libstdc++ 9 mode == out static void test_stream_05(unsigned size) { U_TRACE(5, "test_stream_05(%d)", size) const char* filename = "inserters_extractors-1.txt"; const char fillc = 'f'; #ifdef U_STDCPP_ENABLE ofstream ofs(filename); UString str(size, fillc); // sanity checks U_ASSERT( str.size() == size ) U_ASSERT( ofs.good() ) // stress test ofs << str << std::endl; U_ASSERT( ofs.good() ) ofs << str << std::endl; U_ASSERT( ofs.good() ) U_ASSERT( str.size() == size ) ofs.close(); // sanity check on the written file ifstream ifs(filename); unsigned count = 0; char c; while (count <= (2 * size) + 4) { ifs >> c; if (ifs.good() && c == fillc) { ++count; c = '0'; } else break; } U_ASSERT( count == (2 * size) ) unlink(filename); #endif } // istrstream extractor properly size buffer based on // actual, not allocated contents (UString.size() vs. UString.capacity()). static void test_stream_06() { U_TRACE(5, "test_stream_06()") UString str01("@silent"); unsigned i01 = str01.size(); str01.erase(0, 1); unsigned i03 = str01.size(); U_ASSERT( i01 - 1 == i03 ) #ifdef U_STDCPP_ENABLE istrstream is(U_STRING_TO_PARAM(str01)); UString str02; is >> str02; unsigned i05 = str02.size(); U_ASSERT( i05 == i03 ) #endif } // istream::operator>>(UString) // sets failbit // NB: this is a defect in the standard. static void test_stream_07() { U_TRACE(5, "test_stream_07()") const UString name("z6.cc"); #ifdef U_STDCPP_ENABLE istrstream iss(U_STRING_TO_PARAM(name)); int i = 0; UString s; while (iss >> s) ++i; U_ASSERT( i < 3 ) U_ASSERT( static_cast(iss.rdstate() & ios::failbit) ) #endif } static void test_stream_08() { U_TRACE(5, "test_stream_08()") #ifdef U_STDCPP_ENABLE istrstream istrm(U_CONSTANT_TO_PARAM("enero :2001")); int year = 0; char sep = 0; UString month; istrm >> month >> sep >> year; U_ASSERT( month.size() == 5 ) U_ASSERT( sep == ':' ) U_ASSERT( year == 2001 ) #endif } static void test_stream_09() { U_TRACE(5, "test_stream_09()") UString blanks( 3, '0'); UString foo = U_STRING_FROM_CONSTANT("peace"); foo += blanks; foo += "& love"; char buffer[1024]; #ifdef U_STDCPP_ENABLE ostrstream oss1(buffer, sizeof(buffer)); oss1 << foo << '\0'; U_ASSERT( foo == oss1.str() ) ostrstream oss2(buffer, sizeof(buffer)); oss2.width(20); oss2 << foo; oss2.put('\0'); U_ASSERT( foo != oss2.str() ) U_ASSERT( strlen(oss2.str()) == 20 ) #endif } #endif static void check_HugeTLB(char* ptr, uint32_t size) { U_TRACE(5, "check_HugeTLB(%p,%u)", ptr, size) for (uint32_t j = 0; j < size; ++j) ptr[j] = 'A'; for (uint32_t k = 0; k < size; ++k) if (ptr[k] != 'A') U_ERROR("HugeTLB read failed :-( at index %u", k); } void U_EXPORT check_mmap(uint32_t map_size) { U_TRACE(5, "check_mmap(%u)", map_size) for (uint32_t i = 0; i < 1; ++i) { UString buffer(map_size); buffer.size_adjust(U_2M); check_HugeTLB(buffer.data(), U_2M); } char* place = UFile::mmap(&map_size); check_HugeTLB(place, U_2M); for (uint32_t i = 0; i < 21; ++i) { UMemoryPool::deallocate(place + i * U_2M, U_2M); } UFile::munmap(place, map_size); map_size = U_1G; place = UFile::mmap(&map_size); check_HugeTLB(place, U_2M); UFile::munmap(place, map_size); } #define U_STR0 "\026\003\001" #define U_STR1 "The string \xC3\xBC@foo-bar" // "The string ü@foo-bar" #define U_STR2 "binary: \xC3\xBC\x88\x01\x0B" #define U_STR3 "ã~C~Uã~C¬ã~C¼ã~C| ã~C¯ã~C¼ã~B¯ã~A®ã~C~Yã~C³ã~C~Aã~C~^ã~C¼ã~B¯" // "\343~C~U\343~C\254\343~C\274\343~C| \343~C\257\343~C\274\343~B\257\343~A\256\343~C~Y\343~C\263\343~C~A\343~C~^\343~C\274\343~B\257" //#define U_USE_STRTOD // Parse number in full precision (but slower) int U_EXPORT main(int argc, char* argv[]) { U_ULIB_INIT(argv); U_TRACE(5, "main(%d)", argc) #if defined(U_STDCPP_ENABLE) && defined(HAVE_CXX11) std::unordered_map arounds; #endif const char* ptr = ".banner.swpx" + U_CONSTANT_SIZE(".banner.swpx") - sizeof(".swp"); U_INTERNAL_DUMP("u_isSuffixSwap(%S)", ptr) U_INTERNAL_ASSERT(u_isSuffixSwap(ptr)) /* double val1 = U_STRING_FROM_CONSTANT("0").strtod(); u__printf(1, U_CONSTANT_TO_PARAM("0 = %lf %g"), val1, val1); UString data = U_STRING_FROM_CONSTANT("0$&$&$&$&$&$&$&$&$&$&fileName"); UVector vec(data, "$&$&$"); for (auto part : vec) cout << "part = " << part << '\n'; exit(0); */ U_ASSERT( U_STRING_FROM_CONSTANT("0.0").strtod() == 0.0 ) U_ASSERT( U_STRING_FROM_CONSTANT("1.0").strtod() == 1.0 ) U_ASSERT( U_STRING_FROM_CONSTANT("-1.0").strtod() == -1.0 ) U_ASSERT( U_STRING_FROM_CONSTANT("-0.0").strtod() == -0.0 ) U_ASSERT( U_STRING_FROM_CONSTANT("1.89").strtod() == 1.89 ) U_ASSERT( U_STRING_FROM_CONSTANT("1e30").strtod() == 1e30 ) U_ASSERT( U_STRING_FROM_CONSTANT("1000").strtod() == 1000.0 ) U_ASSERT( U_STRING_FROM_CONSTANT("1.2345").strtod() == 1.2345 ) U_ASSERT( U_STRING_FROM_CONSTANT("5e-324").strtod() == 5e-324 ) // Min subnormal positive double U_ASSERT( U_STRING_FROM_CONSTANT("-1E-10").strtod() == -1e-10 ) U_ASSERT( U_STRING_FROM_CONSTANT("0.9199").strtod() == 0.9199 ) U_ASSERT( U_STRING_FROM_CONSTANT("0.0000001").strtod() == 1e-7 ) U_ASSERT( U_STRING_FROM_CONSTANT("0.000001").strtod() == 0.000001 ) U_ASSERT( U_STRING_FROM_CONSTANT("-1E10").strtod() == -10000000000 ) U_ASSERT( U_STRING_FROM_CONSTANT("-1E10").strtod() == -10000000000 ) U_ASSERT( U_STRING_FROM_CONSTANT("-1e10").strtod() == -10000000000 ) U_ASSERT( U_STRING_FROM_CONSTANT("-1E+10").strtod() == -10000000000 ) U_ASSERT( U_STRING_FROM_CONSTANT("1.2345678").strtod() == 1.2345678 ) U_ASSERT( U_STRING_FROM_CONSTANT("1234567.8").strtod() == 1234567.8 ) U_ASSERT( U_STRING_FROM_CONSTANT(".123456789").strtod() == 0.123456789 ) U_ASSERT( U_STRING_FROM_CONSTANT("0.123456789012").strtod() == 0.123456789012 ) U_ASSERT( U_STRING_FROM_CONSTANT("3.50582559e-71").strtod() == 3.50582559e-71 ) U_ASSERT( U_STRING_FROM_CONSTANT("-79.39773355813419").strtod() == -79.39773355813419 ) U_ASSERT( U_STRING_FROM_CONSTANT("-1.79769e+308").strtod() == -1.7976900000000001e+308 ) U_ASSERT( U_STRING_FROM_CONSTANT("18014398509481993.0").strtod() == 18014398509481993.0 ) U_ASSERT( U_STRING_FROM_CONSTANT("1.234567890123456e30").strtod() == 1.234567890123456e30 ) U_ASSERT( U_STRING_FROM_CONSTANT("-9223372036854775807").strtod() == -9223372036854775807 ) U_ASSERT( U_STRING_FROM_CONSTANT("1.234567890123456e30").strtod() == 1.234567890123456e30 ) U_ASSERT( U_STRING_FROM_CONSTANT("18446744073709551616").strtod() == 1.8446744073709552e+19 ) U_ASSERT( U_STRING_FROM_CONSTANT("45913141877270640000.0").strtod() == 4.5913141877270643e+19 ) U_ASSERT( U_STRING_FROM_CONSTANT("-9223372036854775809").strtod() == -9.223372036854775809e+18 ) U_ASSERT( U_STRING_FROM_CONSTANT("2.2250738585072014e-308").strtod() == 2.2250738585072014e-308 ) // Min normal positive double U_ASSERT( U_STRING_FROM_CONSTANT("10141204801825834086073718800384").strtod() == 1.0141204801825834e+31 ) U_ASSERT( U_STRING_FROM_CONSTANT("10141204801825835211973625643008").strtod() == 1.0141204801825835e+31 ) U_ASSERT( U_STRING_FROM_CONSTANT("10141204801825834649023672221696").strtod() == 1.0141204801825835e+31 ) U_ASSERT( U_STRING_FROM_CONSTANT("5708990770823838890407843763683279797179383808").strtod() == 5.7089907708238389e+45 ) U_ASSERT( U_STRING_FROM_CONSTANT("5708990770823839524233143877797980545530986496").strtod() == 5.7089907708238395e+45 ) U_ASSERT( U_STRING_FROM_CONSTANT("5708990770823839207320493820740630171355185152").strtod() == 5.7089907708238395e+45 ) U_ASSERT( U_STRING_FROM_CONSTANT("100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").strtod() == 1e+308 ) U_ASSERT( U_STRING_FROM_CONSTANT("-2.22507e-308").strtod() == -2.2250699999999998e-308 ) U_ASSERT( U_STRING_FROM_CONSTANT("7.8459735791271921E65").strtod() == 7.8459735791271921E65 ) U_ASSERT( U_STRING_FROM_CONSTANT("2.225073858507201e-308").strtod() == 2.225073858507201e-308 ) // Max subnormal positive double U_ASSERT( U_STRING_FROM_CONSTANT("1.7976931348623157e308").strtod() == 1.7976931348623157e308 ) // Max double #ifdef U_USE_STRTOD U_ASSERT( U_STRING_FROM_CONSTANT("0.999999999999999944488848768742172978818416595458984375").strtod() == 1 ) U_ASSERT( U_STRING_FROM_CONSTANT("0.999999999999999944488848768742172978818416595458984376").strtod() == 1 ) U_ASSERT( U_STRING_FROM_CONSTANT("1.00000000000000011102230246251565404236316680908203126").strtod() == 1.0000000000000002 ) U_ASSERT( U_STRING_FROM_CONSTANT("0.999999999999999944488848768742172978818416595458984374").strtod() == 0.99999999999999989 ) #endif #ifndef __INTEL_COMPILER U_ASSERT( U_STRING_FROM_CONSTANT("3.08984926168550152811E-32").strtod() == 3.08984926168550152811E-32 ) #endif int i; UString x(100U), y, z; for (i = -310; i < 310; ++i) { x.snprintf(U_CONSTANT_TO_PARAM("23456789012E%d"), i); x.strtod(); } #ifdef U_STDCPP_ENABLE UString expressions; expressions = U_STRING_FROM_CONSTANT("2 + 3 + 5"); // = 10 cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("2 * 3 + 5"); // = 11 cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("2 * (3 + 5)"); // = 16 cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("2 * (2*(2*(2+1)))"); // = 24 cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("10 % 3"); // = 1 cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("true || false"); // = true cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("false || ! (false && 1)"); // = true cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("3 > 2 && 1 <= (3-2)"); // = true cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("false"); // = false cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; expressions = U_STRING_FROM_CONSTANT("rand() == 0"); // = false cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; // expressions = U_STRING_FROM_CONSTANT("/pippo/pluto == UStringExt::expandEnvironmentVar('$HOME', 5, 0)/pluto"); // = false // cout << UStringExt::evalExpression(expressions, UString::getStringNull()) << "\n"; int year = 0; char sep = 0; UString month(U_CAPACITY); istrstream istrm(U_CONSTANT_TO_PARAM("enero :2001")); istrm >> month >> sep >> year; U_ASSERT( sep == ':' ) U_ASSERT( year == 2001 ) U_ASSERT( month.shrink() == false ) U_ASSERT( month.size() == 5 ) U_ASSERT( month.capacity() == (U_STACK_TYPE_4 - (1 + sizeof(UStringRep))) ) istrstream istrs02(U_CONSTANT_TO_PARAM("\"DEBUG=1 \\\n" " FW_CONF=etc/nodog_fw.conf \\\n" " AllowedWebHosts=159.213.0.0/16 \\\n" " InternalDevice=ath0 ath0 \\\n" " LocalNetwork=10.30.1.0/24 10.1.0.1/16 \\\n" " AuthServiceAddr=http://www.auth-firenze.com/login http://localhost\"")); z.get(istrs02); z = UStringExt::prepareForEnvironmentVar(z); U_ASSERT( z == U_STRING_FROM_CONSTANT("DEBUG=1\n" "FW_CONF=etc/nodog_fw.conf\n" "AllowedWebHosts=159.213.0.0/16\n" "'InternalDevice=ath0 ath0'\n" "'LocalNetwork=10.30.1.0/24 10.1.0.1/16'\n" "'AuthServiceAddr=http://www.auth-firenze.com/login http://localhost'\n") ) y = UStringExt::getEnvironmentVar(U_CONSTANT_TO_PARAM("LocalNetwork"), &z); U_ASSERT( y == U_STRING_FROM_CONSTANT("10.30.1.0/24 10.1.0.1/16") ) #endif UCrono crono; UString z1, value = U_STRING_FROM_CONSTANT("0.0"); y = U_STRING_FROM_CONSTANT("0.0000001"); UString new_value(U_CAPACITY, U_CONSTANT_TO_PARAM("%.*s; %v"), U_STRING_TO_TRACE(y), value.rep); value = new_value; U_INTERNAL_DUMP("value(%u): = %.*S", value.size(), U_STRING_TO_TRACE(value)) U_ASSERT( value == U_STRING_FROM_CONSTANT("0.0000001; 0.0") ) bool ok = u_isUTF8((const unsigned char*)U_CONSTANT_TO_PARAM("..M-^X@M-/..M-^X@1M-/..\xC3\xBC\x88\x01\x0BM-^X@M-/..M-^X@M-/..M-^X@M-/../winnt/system32/cmd.exe")); U_INTERNAL_ASSERT_EQUALS(ok, false) UString buffer(U_CAPACITY), encoded(U_CAPACITY); z1 = UStringExt::prepareForEnvironmentVar(U_STRING_FROM_CONSTANT("MasqueradeDevice=eth0 'AuthServiceAddr=http://wifi-aaa2.comune.fi.it' FullPrivateNetwork=172.16.0.0/12 " "'LocalNetwork=172.16.13.0/24 172.17.13.0/24' 'InternalDevice=br-lan br-wds' 'ExternalDevice=eth0 tun0 tun2'")); ok = ( z1 == U_STRING_FROM_CONSTANT("MasqueradeDevice=eth0\n" "'AuthServiceAddr=http://wifi-aaa2.comune.fi.it'\n" "FullPrivateNetwork=172.16.0.0/12\n" "'LocalNetwork=172.16.13.0/24 172.17.13.0/24'\n" "'InternalDevice=br-lan br-wds'\n" "'ExternalDevice=eth0 tun0 tun2'\n") ); U_INTERNAL_ASSERT( ok ) buffer.setFromNumber64s(-34LL); U_ASSERT_EQUALS( buffer, U_STRING_FROM_CONSTANT("-34") ) UString db_anagrafica = U_STRING_FROM_CONSTANT("10.8.0.93 172.16.93.0/24 91\n" "10.20.0.4 172.23.0.0/20 47\n" "10.20.0.7 \"172.22.0.0/20 172.22.16.0/20 172.22.32.0/20 172.22.48.0/20 172.22.128.0/20\" \"60 61 78 83 90\"\n"); uint32_t pos = U_STRING_FIND(db_anagrafica, 0, "10.8.0.93"); U_INTERNAL_DUMP("pos = %d", pos) U_INTERNAL_ASSERT_DIFFERS( pos, U_NOT_FOUND ) UXMLEscape::encode(U_CONSTANT_TO_PARAM(" It's a good day!")); U_ASSERT( z == U_STRING_FROM_CONSTANT("Hi! It's a good day!") ) */ #endif U_ASSERT( u_isName( U_CONSTANT_TO_PARAM("QUESTO_E_UN_NOME")) ) U_ASSERT( u_isText((const unsigned char*)U_CONSTANT_TO_PARAM("QUESTO_E_UN_NOME")) ) U_ASSERT( u_isText((const unsigned char*)U_CONSTANT_TO_PARAM("QUESTO-NON-E_UN_NOME")) ) U_ASSERT( u_isName( U_CONSTANT_TO_PARAM("QUESTO-NON-E_UN_NOME")) == false ) z = UStringExt::prepareForEnvironmentVar(U_STRING_FROM_CONSTANT("foo=bar \n\n" "#pippo=pluto \n\n" "#pippo pluto \n\n" "UTRACE=0 5M 0 \n\n")); U_ASSERT( z == U_STRING_FROM_CONSTANT("foo=bar\n'UTRACE=0 5M 0'\n") ) z = UStringExt::prepareForEnvironmentVar(U_STRING_FROM_CONSTANT("#pippo=pluto\n\n" "foo=bar\n\n" "WIAUTH_CARD_BASEDN=ou=cards,o=unwired-portal\n\n" "#WIAUTH_CARD_BASEDN=ou=cards,o=unwired-portal\n\n" "'UTRACE=0 5M 0' \n\n")); U_ASSERT( z == U_STRING_FROM_CONSTANT("foo=bar\nWIAUTH_CARD_BASEDN=ou=cards,o=unwired-portal\n'UTRACE=0 5M 0'\n") ) z = UStringExt::prepareForEnvironmentVar(U_STRING_FROM_CONSTANT("HOME=TSA " " OPENSSL=bin/openssl " " OPENSSL_CNF=CA/openssl.cnf " " #OPENSSL_CNF=CA/openssl.cnf " " #OPENSSL_CNF=CA/openssl.cnf " " 'UTRACE=0 5M 0' " " TSA_CACERT=CA/cacert.pem " " #WIAUTH_CARD_BASEDN=ou=cards,o=unwired-portal " " TSA_CERT=CA/server.crt " " TSA_KEY=CA/server.key ")); U_ASSERT( z == U_STRING_FROM_CONSTANT("HOME=TSA\nOPENSSL=bin/openssl\nOPENSSL_CNF=CA/openssl.cnf\n'UTRACE=0 5M 0'\n" "TSA_CACERT=CA/cacert.pem\nTSA_CERT=CA/server.crt\nTSA_KEY=CA/server.key\n") ) z = UStringExt::prepareForEnvironmentVar(UFile::contentOf(U_STRING_FROM_CONSTANT("inp/environment.conf"))); y = U_STRING_FROM_CONSTANT("DIR_WEB=$HOME/www\n" "DIR_POLICY=$HOME/policy\n" "DIR_AP=$HOME/ap/$VIRTUAL_HOST\n" "DIR_CTX=$HOME/login/$VIRTUAL_HOST\n" "DIR_CNT=$HOME/counter/$VIRTUAL_HOST\n" "DIR_REQ=$HOME/request/$VIRTUAL_HOST\n" "DIR_CLIENT=$HOME/client/$VIRTUAL_HOST\n" "DIR_REG=$HOME/registration/$VIRTUAL_HOST\n" "DIR_TEMPLATE=$HOME/template/$VIRTUAL_HOST\n" "DIR_SSI=$DIR_CLIENT/$REMOTE_ADDR/$REQUEST_URI\n" "FILE_HEAD_HTML=$DIR_SSI/head.html\n" "FILE_BODY_SHTML=$DIR_SSI/body.shtml\n" "ACCESS_POINT_LIST=$DIR_AP/ACCESS_POINT\n" "WIAUTH_CARD_LDAP_PWD=programmer\n" "WIAUTH_USER_LDAP_PWD=programmer\n" "WIAUTH_CARD_BASEDN=ou=cards,o=unwired-portal\n" "WIAUTH_USER_BASEDN=ou=users,o=unwired-portal\n" "WIAUTH_CARD_LDAP_URL=ldaps://94.138.39.149:636\n" "WIAUTH_USER_LDAP_URL=ldaps://94.138.39.149:636\n" "WIAUTH_CARD_LDAP_BINDDN=cn=admin,o=unwired-portal\n" "WIAUTH_USER_LDAP_BINDDN=cn=admin,o=unwired-portal\n" "'LDAP_USER_PARAM=-x -D $WIAUTH_USER_LDAP_BINDDN -w $WIAUTH_USER_LDAP_PWD -H $WIAUTH_USER_LDAP_URL'\n" "'LDAP_CARD_PARAM=-x -D $WIAUTH_CARD_LDAP_BINDDN -w $WIAUTH_CARD_LDAP_PWD -H $WIAUTH_CARD_LDAP_URL'\n" "TIMEOUT=0\n" "TRAFFIC=0\n" "POLICY=DAILY\n" "EXIT_VALUE=0\n" "'CLIENT_HTTP=/srv/userver/bin/uclient -c /srv/userver/etc/uclient-firenze.cfg'\n" "LOGIN_URL=http://$HTTP_HOST/login\n" "REDIRECT_DEFAULT=http://www.google.it\n" "REGISTRAZIONE_URL=http://$HTTP_HOST/registrazione\n" "FILE_LOG=/var/log/LOG-firenze\n" "LOCAL_SYSLOG_SELECTOR=user.alert\n" "REMOTE_SYSLOG_SELECTOR=user.info\n" "UNCOMPRESS_COMMAND_HISTORICAL_LOGS=zcat\n" "REGEX_HISTORICAL_LOGS=LOG-firenze-*.gz\n" "HISTORICAL_LOG_DIR=/var/log/wi-auth-logs-archives\n" "'HEAD_HTML='\n" "'BACK_TAG=INDIETRO'\n" "TELEFONO=055-055\n" "PORTAL_NAME=wi-auth\n" "'SERVICE=Servizio non disponibile'\n" "'MANUTENZIONE=dalle 9 alle 10 di domani'\n" "'LOGOUT_HTML=La pagina di uscita (logout):
http://$HTTP_HOST/logout_page'\n" "'MSG_ANOMALIA=Problema in autenticazione (anomalia %s). Si prega di riprovare, se il problema persiste contattare: $TELEFONO'\n" "'LOGOUT_NOTE=della pagina di uscita (logout),
magari inserendola tra i tuoi segnalibri (bookmarks).
Se utilizzerai questa pagina, quando hai finito di navigare,
il tempo e traffico della tua navigazione, e quindi quanto
ti rimane, saranno corrispondenti a quelli effettivi.'\n"); U_ASSERT( z == y ) /* y = z = UFile::contentOf(U_STRING_FROM_CONSTANT("inp/livevalidation_standalone.compressed.js")); z = UStringExt::minifyCssJs(z); U_ASSERT( z == y ) */ crono.stop(); printf("Time Consumed for (%d) iteration = %ld ms\n", n, crono.getTimeElapsed()); /* check DEAD OF SOURCE STRING WITH CHILD ALIVE... y = U_STRING_FROM_CONSTANT("I am the source string"); z = y.substr(17U); y.clear(); */ }