diff -ruN icu.orig/Makefile icu/Makefile --- icu.orig/Makefile 2017-05-05 22:35:43.069193000 -0500 +++ icu/Makefile 2017-05-05 22:35:57.165133000 -0500 @@ -2,7 +2,7 @@ # $FreeBSD: head/devel/icu/Makefile 440117 2017-05-04 21:44:57Z jkim $ PORTNAME= icu -DISTVERSION= 58_2 +DISTVERSION= 59_1 PORTREVISION?= 2 # keep for icu-lx PORTEPOCH?= 1 CATEGORIES?= devel diff -ruN icu.orig/distinfo icu/distinfo --- icu.orig/distinfo 2017-05-05 22:35:43.069242000 -0500 +++ icu/distinfo 2017-05-05 22:36:04.915501000 -0500 @@ -1,3 +1,3 @@ -TIMESTAMP = 1481218489 -SHA256 (icu4c-58_2-src.tgz) = 2b0a4410153a9b20de0e20c7d8b66049a72aef244b53683d0d7521371683da0c -SIZE (icu4c-58_2-src.tgz) = 23369902 +TIMESTAMP = 1494041764 +SHA256 (icu4c-59_1-src.tgz) = 7132fdaf9379429d004005217f10e00b7d2319d0fea22bdfddef8991c45b75fe +SIZE (icu4c-59_1-src.tgz) = 22706578 diff -ruN icu.orig/files/patch-r39484 icu/files/patch-r39484 --- icu.orig/files/patch-r39484 2017-05-05 22:35:43.069821000 -0500 +++ icu/files/patch-r39484 1969-12-31 18:00:00.000000000 -0600 @@ -1,148 +0,0 @@ -https://ssl.icu-project.org/trac/ticket/12827 - -Index: test/intltest/apicoll.h -=================================================================== ---- test/intltest/apicoll.h (revision 39483) -+++ test/intltest/apicoll.h (revision 39484) -@@ -35,6 +35,7 @@ class CollationAPITest: public IntlTestCollator { - * - displayable name in the desired locale - */ - void TestProperty(/* char* par */); -+ void TestKeywordValues(); - - /** - * This tests the RuleBasedCollator -Index: test/intltest/apicoll.cpp -=================================================================== ---- test/intltest/apicoll.cpp (revision 39483) -+++ test/intltest/apicoll.cpp (revision 39484) -@@ -81,17 +81,10 @@ CollationAPITest::TestProperty(/* char* par */) - logln("Test ctors : "); - col = Collator::createInstance(Locale::getEnglish(), success); - if (U_FAILURE(success)){ -- errcheckln(success, "Default Collator creation failed. - %s", u_errorName(success)); -+ errcheckln(success, "English Collator creation failed. - %s", u_errorName(success)); - return; - } - -- StringEnumeration* kwEnum = col->getKeywordValuesForLocale("", Locale::getEnglish(),true,success); -- if (U_FAILURE(success)){ -- errcheckln(success, "Get Keyword Values for Locale failed. - %s", u_errorName(success)); -- return; -- } -- delete kwEnum; -- - col->getVersion(versionArray); - // Check for a version greater than some value rather than equality - // so that we need not update the expected version each time. -@@ -231,6 +224,29 @@ CollationAPITest::TestProperty(/* char* par */) - delete junk; - } - -+void CollationAPITest::TestKeywordValues() { -+ IcuTestErrorCode errorCode(*this, "TestKeywordValues"); -+ LocalPointer col(Collator::createInstance(Locale::getEnglish(), errorCode)); -+ if (errorCode.logIfFailureAndReset("English Collator creation failed")) { -+ return; -+ } -+ -+ LocalPointer kwEnum( -+ col->getKeywordValuesForLocale("collation", Locale::getEnglish(), TRUE, errorCode)); -+ if (errorCode.logIfFailureAndReset("Get Keyword Values for English Collator failed")) { -+ return; -+ } -+ assertTrue("expect at least one collation tailoring for English", kwEnum->count(errorCode) > 0); -+ const char *kw; -+ UBool hasStandard = FALSE; -+ while ((kw = kwEnum->next(NULL, errorCode)) != NULL) { -+ if (strcmp(kw, "standard") == 0) { -+ hasStandard = TRUE; -+ } -+ } -+ assertTrue("expect at least the 'standard' collation tailoring for English", hasStandard); -+} -+ - void - CollationAPITest::TestRuleBasedColl() - { -@@ -2466,6 +2482,7 @@ void CollationAPITest::runIndexedTest( int32_t ind - if (exec) logln("TestSuite CollationAPITest: "); - TESTCASE_AUTO_BEGIN; - TESTCASE_AUTO(TestProperty); -+ TESTCASE_AUTO(TestKeywordValues); - TESTCASE_AUTO(TestOperators); - TESTCASE_AUTO(TestDuplicate); - TESTCASE_AUTO(TestCompare); -Index: i18n/ucol_res.cpp -=================================================================== ---- i18n/ucol_res.cpp (revision 39483) -+++ i18n/ucol_res.cpp (revision 39484) -@@ -680,6 +680,7 @@ ucol_getKeywordValuesForLocale(const char* /*key*/ - return NULL; - } - memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); -+ ulist_resetList(sink.values); // Initialize the iterator. - en->context = sink.values; - sink.values = NULL; // Avoid deletion in the sink destructor. - return en; -Index: common/ulist.c -=================================================================== ---- common/ulist.c (revision 39483) -+++ common/ulist.c (revision 39484) -@@ -29,7 +29,6 @@ struct UList { - UListNode *tail; - - int32_t size; -- int32_t currentIndex; - }; - - static void ulist_addFirstItem(UList *list, UListNode *newItem); -@@ -51,7 +50,6 @@ U_CAPI UList *U_EXPORT2 ulist_createEmptyList(UErr - newList->head = NULL; - newList->tail = NULL; - newList->size = 0; -- newList->currentIndex = -1; - - return newList; - } -@@ -80,8 +78,9 @@ static void ulist_removeItem(UList *list, UListNod - } else { - p->next->previous = p->previous; - } -- list->curr = NULL; -- list->currentIndex = 0; -+ if (p == list->curr) { -+ list->curr = p->next; -+ } - --list->size; - if (p->forceDelete) { - uprv_free(p->data); -@@ -150,7 +149,6 @@ U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList - newItem->next = list->head; - list->head->previous = newItem; - list->head = newItem; -- list->currentIndex++; - } - - list->size++; -@@ -193,7 +191,6 @@ U_CAPI void *U_EXPORT2 ulist_getNext(UList *list) - - curr = list->curr; - list->curr = curr->next; -- list->currentIndex++; - - return curr->data; - } -@@ -209,7 +206,6 @@ U_CAPI int32_t U_EXPORT2 ulist_getListSize(const U - U_CAPI void U_EXPORT2 ulist_resetList(UList *list) { - if (list != NULL) { - list->curr = list->head; -- list->currentIndex = 0; - } - } - -@@ -272,4 +268,3 @@ U_CAPI void U_EXPORT2 ulist_reset_keyword_values_i - U_CAPI UList * U_EXPORT2 ulist_getListFromEnum(UEnumeration *en) { - return (UList *)(en->context); - } -- diff -ruN icu.orig/files/patch-r39671 icu/files/patch-r39671 --- icu.orig/files/patch-r39671 2017-05-05 22:35:43.069885000 -0500 +++ icu/files/patch-r39671 1969-12-31 18:00:00.000000000 -0600 @@ -1,176 +0,0 @@ -Index: test/intltest/utxttest.h -=================================================================== ---- test/intltest/utxttest.h (revision 39670) -+++ test/intltest/utxttest.h (revision 39671) -@@ -38,6 +38,7 @@ class UTextTest : public IntlTest { - void Ticket10562(); - void Ticket10983(); - void Ticket12130(); -+ void Ticket12888(); - - private: - struct m { // Map between native indices & code points. -Index: test/intltest/utxttest.cpp -=================================================================== ---- test/intltest/utxttest.cpp (revision 39670) -+++ test/intltest/utxttest.cpp (revision 39671) -@@ -67,6 +67,8 @@ UTextTest::runIndexedTest(int32_t index, UBool exe - if (exec) Ticket10983(); break; - case 7: name = "Ticket12130"; - if (exec) Ticket12130(); break; -+ case 8: name = "Ticket12888"; -+ if (exec) Ticket12888(); break; - default: name = ""; break; - } - } -@@ -1583,3 +1585,63 @@ void UTextTest::Ticket12130() { - } - utext_close(&ut); - } -+ -+// Ticket 12888: bad handling of illegal utf-8 containing many instances of the archaic, now illegal, -+// six byte utf-8 forms. Original implementation had an assumption that -+// there would be at most three utf-8 bytes per UTF-16 code unit. -+// The five and six byte sequences map to a single replacement character. -+ -+void UTextTest::Ticket12888() { -+ const char *badString = -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80" -+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"; -+ -+ UErrorCode status = U_ZERO_ERROR; -+ LocalUTextPointer ut(utext_openUTF8(NULL, badString, -1, &status)); -+ TEST_SUCCESS(status); -+ for (;;) { -+ UChar32 c = utext_next32(ut.getAlias()); -+ if (c == U_SENTINEL) { -+ break; -+ } -+ } -+ int32_t endIdx = utext_getNativeIndex(ut.getAlias()); -+ if (endIdx != (int32_t)strlen(badString)) { -+ errln("%s:%d expected=%d, actual=%d", __FILE__, __LINE__, strlen(badString), endIdx); -+ return; -+ } -+ -+ for (int32_t prevIndex = endIdx; prevIndex>0;) { -+ UChar32 c = utext_previous32(ut.getAlias()); -+ int32_t currentIndex = utext_getNativeIndex(ut.getAlias()); -+ if (c != 0xfffd) { -+ errln("%s:%d (expected, actual, index) = (%d, %d, %d)\n", -+ __FILE__, __LINE__, 0xfffd, c, currentIndex); -+ break; -+ } -+ if (currentIndex != prevIndex - 6) { -+ errln("%s:%d: wrong index. Expected, actual = %d, %d", -+ __FILE__, __LINE__, prevIndex - 6, currentIndex); -+ break; -+ } -+ prevIndex = currentIndex; -+ } -+} -Index: common/utext.cpp -=================================================================== ---- common/utext.cpp (revision 39670) -+++ common/utext.cpp (revision 39671) -@@ -847,9 +847,15 @@ U_CDECL_END - //------------------------------------------------------------------------------ - - // Chunk size. --// Must be less than 85, because of byte mapping from UChar indexes to native indexes. --// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes --// to two UChars.) -+// Must be less than 42 (256/6), because of byte mapping from UChar indexes to native indexes. -+// Worst case there are six UTF-8 bytes per UChar. -+// obsolete 6 byte form fd + 5 trails maps to fffd -+// obsolete 5 byte form fc + 4 trails maps to fffd -+// non-shortest 4 byte forms maps to fffd -+// normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit -+// mapToUChars array size must allow for the worst case, 6. -+// This could be brought down to 4, by treating fd and fc as pure illegal, -+// rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros. - // - enum { UTF8_TEXT_CHUNK_SIZE=32 }; - -@@ -889,7 +895,7 @@ struct UTF8Buf { - // Requires two extra slots, - // one for a supplementary starting in the last normal position, - // and one for an entry for the buffer limit position. -- uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to -+ uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*6+6]; // Map native offset from bufNativeStart to - // correspoding offset in filled part of buf. - int32_t align; - }; -@@ -1032,6 +1038,7 @@ utf8TextAccess(UText *ut, int64_t index, UBool for - // Requested index is in this buffer. - u8b = (UTF8Buf *)ut->p; // the current buffer - mapIndex = ix - u8b->toUCharsMapStart; -+ U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars)); - ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; - return TRUE; - -@@ -1298,6 +1305,10 @@ fillReverse: - // Can only do this if the incoming index is somewhere in the interior of the string. - // If index is at the end, there is no character there to look at. - if (ix != ut->b) { -+ // Note: this function will only move the index back if it is on a trail byte -+ // and there is a preceding lead byte and the sequence from the lead -+ // through this trail could be part of a valid UTF-8 sequence -+ // Otherwise the index remains unchanged. - U8_SET_CP_START(s8, 0, ix); - } - -@@ -1311,7 +1322,10 @@ fillReverse: - UChar *buf = u8b->buf; - uint8_t *mapToNative = u8b->mapToNative; - uint8_t *mapToUChars = u8b->mapToUChars; -- int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1); -+ int32_t toUCharsMapStart = ix - sizeof(UTF8Buf::mapToUChars) + 1; -+ // Note that toUCharsMapStart can be negative. Happens when the remaining -+ // text from current position to the beginning is less than the buffer size. -+ // + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry. - int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region - // at end of buffer to leave room - // for a surrogate pair at the -@@ -1338,6 +1352,7 @@ fillReverse: - if (c<0x80) { - // Special case ASCII range for speed. - buf[destIx] = (UChar)c; -+ U_ASSERT(toUCharsMapStart <= srcIx); - mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx; - mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart); - } else { -@@ -1367,6 +1382,7 @@ fillReverse: - do { - mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx; - } while (sIx >= srcIx); -+ U_ASSERT(toUCharsMapStart <= (srcIx+1)); - - // Set native indexing limit to be the current position. - // We are processing a non-ascii, non-native-indexing char now; -@@ -1541,6 +1557,7 @@ utf8TextMapIndexToUTF16(const UText *ut, int64_t i - U_ASSERT(index>=ut->chunkNativeStart+ut->nativeIndexingLimit); - U_ASSERT(index<=ut->chunkNativeLimit); - int32_t mapIndex = index - u8b->toUCharsMapStart; -+ U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars)); - int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; - U_ASSERT(offset>=0 && offset<=ut->chunkLength); - return offset; diff -ruN icu.orig/pkg-plist icu/pkg-plist --- icu.orig/pkg-plist 2017-05-05 22:35:43.070153000 -0500 +++ icu/pkg-plist 2017-05-06 02:54:02.735741000 -0500 @@ -1,40 +1,14 @@ -sbin/icupkg -sbin/gensprep -sbin/gennorm2 -sbin/gencmn -sbin/genccode -lib/libicudata.a -lib/libicudata.so -lib/libicudata.so.%%ICUMAJOR%% -lib/libicudata.so.%%ICUVER%% -lib/libicui18n.a -lib/libicui18n.so -lib/libicui18n.so.%%ICUMAJOR%% -lib/libicui18n.so.%%ICUVER%% -lib/libicuio.a -lib/libicuio.so -lib/libicuio.so.%%ICUMAJOR%% -lib/libicuio.so.%%ICUVER%% -lib/libicutest.a -lib/libicutest.so -lib/libicutest.so.%%ICUMAJOR%% -lib/libicutest.so.%%ICUVER%% -lib/libicutu.a -lib/libicutu.so -lib/libicutu.so.%%ICUMAJOR%% -lib/libicutu.so.%%ICUVER%% -lib/libicuuc.a -lib/libicuuc.so -lib/libicuuc.so.%%ICUMAJOR%% -lib/libicuuc.so.%%ICUVER%% -lib/icu/pkgdata.inc -lib/icu/current -lib/icu/Makefile.inc -lib/icu/%%ICUVER%%/pkgdata.inc -lib/icu/%%ICUVER%%/Makefile.inc -libdata/pkgconfig/icu-io.pc -libdata/pkgconfig/icu-i18n.pc -libdata/pkgconfig/icu-uc.pc +bin/derb +bin/genbrk +bin/gencfu +bin/gencnval +bin/gendict +bin/genrb +bin/icu-config +bin/icuinfo +bin/makeconv +bin/pkgdata +bin/uconv include/unicode/alphaindex.h include/unicode/appendable.h include/unicode/basictz.h @@ -44,6 +18,8 @@ include/unicode/bytestriebuilder.h include/unicode/calendar.h include/unicode/caniter.h +include/unicode/casemap.h +include/unicode/char16ptr.h include/unicode/chariter.h include/unicode/choicfmt.h include/unicode/coleitr.h @@ -63,6 +39,7 @@ include/unicode/dtitvinf.h include/unicode/dtptngen.h include/unicode/dtrule.h +include/unicode/edits.h include/unicode/enumset.h include/unicode/errorcode.h include/unicode/fieldpos.h @@ -207,17 +184,38 @@ include/unicode/uvernum.h include/unicode/uversion.h include/unicode/vtzone.h -bin/uconv -bin/pkgdata -bin/makeconv -bin/icuinfo -bin/icu-config -bin/genrb -bin/gendict -bin/gencnval -bin/gencfu -bin/genbrk -bin/derb +lib/icu/%%ICUVER%%/Makefile.inc +lib/icu/%%ICUVER%%/pkgdata.inc +lib/icu/Makefile.inc +lib/icu/current +lib/icu/pkgdata.inc +lib/libicudata.a +lib/libicudata.so +lib/libicudata.so.59 +lib/libicudata.so.%%ICUVER%% +lib/libicui18n.a +lib/libicui18n.so +lib/libicui18n.so.59 +lib/libicui18n.so.%%ICUVER%% +lib/libicuio.a +lib/libicuio.so +lib/libicuio.so.59 +lib/libicuio.so.%%ICUVER%% +lib/libicutest.a +lib/libicutest.so +lib/libicutest.so.59 +lib/libicutest.so.%%ICUVER%% +lib/libicutu.a +lib/libicutu.so +lib/libicutu.so.59 +lib/libicutu.so.%%ICUVER%% +lib/libicuuc.a +lib/libicuuc.so +lib/libicuuc.so.59 +lib/libicuuc.so.%%ICUVER%% +libdata/pkgconfig/icu-i18n.pc +libdata/pkgconfig/icu-io.pc +libdata/pkgconfig/icu-uc.pc man/man1/derb.1.gz man/man1/genbrk.1.gz man/man1/gencfu.1.gz @@ -232,7 +230,13 @@ man/man8/gencmn.8.gz man/man8/gensprep.8.gz man/man8/icupkg.8.gz -%%DATADIR%%/%%ICUVER%%/install-sh -%%DATADIR%%/%%ICUVER%%/mkinstalldirs +sbin/escapesrc +sbin/genccode +sbin/gencmn +sbin/gennorm2 +sbin/gensprep +sbin/icupkg %%DATADIR%%/%%ICUVER%%/LICENSE %%DATADIR%%/%%ICUVER%%/config/mh-bsd-gcc +%%DATADIR%%/%%ICUVER%%/install-sh +%%DATADIR%%/%%ICUVER%%/mkinstalldirs