icu_regex_traits_implementation::string_type icu_regex_traits_implementation::do_transform(const char_type* p1, const char_type* p2, const U_NAMESPACE_QUALIFIER Collator* pcoll) const { // TODO make thread safe!!!! : typedef u32_to_u16_iterator<const char_type*, ::UChar> itt; itt i(p1), j(p2); #ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS std::vector< ::UChar> t(i, j); #else std::vector< ::UChar> t; while(i != j) t.push_back(*i++); #endif ::uint8_t result[100]; ::int32_t len; if(t.size()) len = pcoll->getSortKey(&*t.begin(), static_cast< ::int32_t>(t.size()), result, sizeof(result)); else len = pcoll->getSortKey(static_cast<UChar const*>(0), static_cast< ::int32_t>(0), result, sizeof(result)); if(std::size_t(len) > sizeof(result)) { scoped_array< ::uint8_t> presult(new ::uint8_t[len+1]); if(t.size()) len = pcoll->getSortKey(&*t.begin(), static_cast< ::int32_t>(t.size()), presult.get(), len+1); else len = pcoll->getSortKey(static_cast<UChar const*>(0), static_cast< ::int32_t>(0), presult.get(), len+1); if((0 == presult[len-1]) && (len > 1)) --len; #ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS return string_type(presult.get(), presult.get()+len); #else string_type sresult; ::uint8_t const* ia = presult.get(); ::uint8_t const* ib = presult.get()+len; while(ia != ib) sresult.push_back(*ia++); return sresult; #endif } if((0 == result[len-1]) && (len > 1)) --len; #ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS return string_type(result, result+len); #else string_type sresult; ::uint8_t const* ia = result; ::uint8_t const* ib = result+len; while(ia != ib) sresult.push_back(*ia++); return sresult; #endif }
int main (void) { { char buff[100]; strcpy(buff, "abc"); cj_jail(strcpy, 2, buff, "def"); presult(1, strcmp(buff, "abc") == 0); } { char buff[100]; strcpy(buff, "abc"); cj_jail(strcpy, 2, buff, "def"); cj_recv(buff, sizeof(buff)); presult(2, strcmp(buff, "def") == 0); } cj_jail(set_global, 1, 12345); presult(3, cj_jail(get_global, 0) == 12345); presult(4, *(int *)cj_jail(get_globalref, 0) == 12345); { char buff[100]; strcpy(buff, "Hello World!"); cj_jail(strtoupper, 1, buff); presult(5, strcmp(buff, "Hello World!") == 0); cj_recv(buff, sizeof(buff)); presult(6, strcmp(buff, "HELLO WORLD!") == 0); } { char *buff = malloc(100); write_global("foo7"); presult(7, strcmp(read_globalref(), "foo7") == 0); read_global(buff); presult(8, strcmp(buff, "foo7") == 0); strcpy(buff, "foo8"); cj_jail(read_global, 1, buff); presult(9, strcmp(buff, "foo8") == 0); cj_recv(buff, 100); presult(10, strcmp(buff, "foo7") == 0); } { const int num = 1000; void *arr[num]; int i; srand(1); for (i = 0; i < num; i ++) { arr[i] = malloc(rand() % 500 + 1); if (arr[i] == NULL) break; if (rand() % 2) { int j = rand() % (i + 1); free(arr[j]); arr[j] = malloc(rand() % 500 + 1); if (arr[j] == NULL) break; } } presult(11, i == num); for (i = 0; i < num; i ++) free(arr[i]); for (i = 0; i < num; i ++) { arr[i] = (void *)cj_jail(malloc, 1, rand() % 500 + 1); if (arr[i] == NULL) break; if (rand() % 2) { int j = rand() % (i + 1); if (rand() % 2) free(arr[j]); else cj_jail(free, 1, arr[j]); arr[j] = (void *)cj_jail(malloc, 1, rand() % 500 + 1); if (arr[j] == NULL) break; } } presult(12, i == num); for (i = 0; i < num; i ++) free(arr[i]); } presult(13, call_callback(callback1, 1) == 4); presult(14, cj_jail(call_callback, 2, cj_reg_callback(callback1, NULL, 1), 1) == 4); presult(15, cj_jail(call_callback, 2, cj_reg_callback(callback1, callback1_wrapper, 1), 1) == 14); presult(16, cj_jail(call_callback, 2, cj_reg_callback(callback2, NULL, 1), 1) == 8); return 0; }