[arch-commits] Commit in icu/trunk (4 files)

Andreas Radke andyrtr at archlinux.org
Mon Apr 24 11:46:53 UTC 2017


    Date: Monday, April 24, 2017 @ 11:46:52
  Author: andyrtr
Revision: 294284

upgpkg: icu 59.1-1

upstream update 59.1

Modified:
  icu/trunk/PKGBUILD
Deleted:
  icu/trunk/changeset-39671-CVE-2017-7867+7868.patch
  icu/trunk/icu-58.1-iterator-reset.patch
  icu/trunk/icu.8198.revert.icu5431.patch

------------------------------------------+
 PKGBUILD                                 |   26 +---
 changeset-39671-CVE-2017-7867+7868.patch |  155 -----------------------------
 icu-58.1-iterator-reset.patch            |  124 -----------------------
 icu.8198.revert.icu5431.patch            |  129 ------------------------
 4 files changed, 6 insertions(+), 428 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2017-04-24 11:37:14 UTC (rev 294283)
+++ PKGBUILD	2017-04-24 11:46:52 UTC (rev 294284)
@@ -3,35 +3,21 @@
 # Contributor: Art Gramlich <art at gramlich-net.com>
 
 pkgname=icu
-pkgver=58.2
-pkgrel=2
+pkgver=59.1
+pkgrel=1
 pkgdesc="International Components for Unicode library"
 arch=(i686 x86_64)
 url="http://www.icu-project.org/"
 license=('custom:icu')
-depends=('gcc-libs>=4.7.1-5' 'sh')
+depends=('gcc-libs' 'sh')
 #makedepends=('clang')
 # no https available
 source=(#http://download.icu-project.org/files/${pkgname}4c/${pkgver}/${pkgname}4c-${pkgver/./_}-src.tgz
-	http://download.icu-project.org/files/${pkgname}4c/${pkgver}/${pkgname}4c-${pkgver//./_}-src.tgz
-	icu-58.1-iterator-reset.patch
-        changeset-39671-CVE-2017-7867+7868.patch)
+	http://download.icu-project.org/files/${pkgname}4c/${pkgver}/${pkgname}4c-${pkgver//./_}-src.tgz)
 # upstream offers md5sum checks, only asc file for md5sum check
-md5sums=('fac212b32b7ec7ab007a12dff1f3aea1'
-         '8c09ae284967def053e9579d64d0f83c'
-         'cea722333992ad6ede88ebd0bd21cfcd')
-sha256sums=('2b0a4410153a9b20de0e20c7d8b66049a72aef244b53683d0d7521371683da0c'
-            '8034928bcff89eca84d8d0f22fa9b6bdba5e0608a984f64fe7afe41b91bbea97'
-            'cf0c6f946d7336bd46857c52308fd67171918f24fcf19015b5a47a8d2fb8ca0c')
+md5sums=('54923fa9fab5b2b83f235fb72523de37')
+sha256sums=('7132fdaf9379429d004005217f10e00b7d2319d0fea22bdfddef8991c45b75fe')
 
-prepare() {
-  cd icu/source
-  # http://bugs.icu-project.org/trac/ticket/12827
-  patch -Np4 -i "${srcdir}"/icu-58.1-iterator-reset.patch
-
-  patch -Np4 -i "${srcdir}"/changeset-39671-CVE-2017-7867+7868.patch
-}
-
 build() {
   cd icu/source
   ./configure --prefix=/usr \

Deleted: changeset-39671-CVE-2017-7867+7868.patch
===================================================================
--- changeset-39671-CVE-2017-7867+7868.patch	2017-04-24 11:37:14 UTC (rev 294283)
+++ changeset-39671-CVE-2017-7867+7868.patch	2017-04-24 11:46:52 UTC (rev 294284)
@@ -1,155 +0,0 @@
-Index: /trunk/icu4c/source/common/utext.cpp
-===================================================================
---- /trunk/icu4c/source/common/utext.cpp	(revision 39670)
-+++ /trunk/icu4c/source/common/utext.cpp	(revision 39671)
-@@ -848,7 +848,13 @@
- 
- // 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 };
-@@ -890,5 +896,5 @@
-                                                      //    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;
-@@ -1033,4 +1039,5 @@
-             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;
-@@ -1299,4 +1306,8 @@
-         //   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);
-         }
-@@ -1312,5 +1323,8 @@
-         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
-@@ -1339,4 +1353,5 @@
-                 // 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);
-@@ -1368,4 +1383,5 @@
-                     mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx;
-                 } while (sIx >= srcIx);
-+                U_ASSERT(toUCharsMapStart <= (srcIx+1));
- 
-                 // Set native indexing limit to be the current position.
-@@ -1542,4 +1558,5 @@
-     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);
-Index: /trunk/icu4c/source/test/intltest/utxttest.cpp
-===================================================================
---- /trunk/icu4c/source/test/intltest/utxttest.cpp	(revision 39670)
-+++ /trunk/icu4c/source/test/intltest/utxttest.cpp	(revision 39671)
-@@ -68,4 +68,6 @@
-         case 7: name = "Ticket12130";
-             if (exec) Ticket12130(); break;
-+        case 8: name = "Ticket12888";
-+            if (exec) Ticket12888(); break;
-         default: name = "";          break;
-     }
-@@ -1584,2 +1586,62 @@
-     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: /trunk/icu4c/source/test/intltest/utxttest.h
-===================================================================
---- /trunk/icu4c/source/test/intltest/utxttest.h	(revision 39670)
-+++ /trunk/icu4c/source/test/intltest/utxttest.h	(revision 39671)
-@@ -39,4 +39,5 @@
-     void Ticket10983();
-     void Ticket12130();
-+    void Ticket12888();
- 
- private:

Deleted: icu-58.1-iterator-reset.patch
===================================================================
--- icu-58.1-iterator-reset.patch	2017-04-24 11:37:14 UTC (rev 294283)
+++ icu-58.1-iterator-reset.patch	2017-04-24 11:46:52 UTC (rev 294284)
@@ -1,124 +0,0 @@
-Index: /icu/trunk/source/common/ulist.c
-===================================================================
---- /icu/trunk/source/common/ulist.c	(revision 39483)
-+++ /icu/trunk/source/common/ulist.c	(revision 39484)
-@@ -30,5 +30,4 @@
-     
-     int32_t size;
--    int32_t currentIndex;
- };
- 
-@@ -52,5 +51,4 @@
-     newList->tail = NULL;
-     newList->size = 0;
--    newList->currentIndex = -1;
-     
-     return newList;
-@@ -81,6 +79,7 @@
-         p->next->previous = p->previous;
-     }
--    list->curr = NULL;
--    list->currentIndex = 0;
-+    if (p == list->curr) {
-+        list->curr = p->next;
-+    }
-     --list->size;
-     if (p->forceDelete) {
-@@ -151,5 +150,4 @@
-         list->head->previous = newItem;
-         list->head = newItem;
--        list->currentIndex++;
-     }
-     
-@@ -194,5 +192,4 @@
-     curr = list->curr;
-     list->curr = curr->next;
--    list->currentIndex++;
-     
-     return curr->data;
-@@ -210,5 +207,4 @@
-     if (list != NULL) {
-         list->curr = list->head;
--        list->currentIndex = 0;
-     }
- }
-@@ -273,3 +269,2 @@
-     return (UList *)(en->context);
- }
--
-Index: /icu/trunk/source/i18n/ucol_res.cpp
-===================================================================
---- /icu/trunk/source/i18n/ucol_res.cpp	(revision 39483)
-+++ /icu/trunk/source/i18n/ucol_res.cpp	(revision 39484)
-@@ -681,4 +681,5 @@
-     }
-     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.
-Index: /icu/trunk/source/test/intltest/apicoll.cpp
-===================================================================
---- /icu/trunk/source/test/intltest/apicoll.cpp	(revision 39483)
-+++ /icu/trunk/source/test/intltest/apicoll.cpp	(revision 39484)
-@@ -82,14 +82,7 @@
-     col = Collator::createInstance(Locale::getEnglish(), success);
-     if (U_FAILURE(success)){
--        errcheckln(success, "Default 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;
-+        errcheckln(success, "English Collator creation failed. - %s", u_errorName(success));
-+        return;
-+    }
- 
-     col->getVersion(versionArray);
-@@ -230,4 +223,27 @@
-     delete aFrCol;
-     delete junk;
-+}
-+
-+void CollationAPITest::TestKeywordValues() {
-+    IcuTestErrorCode errorCode(*this, "TestKeywordValues");
-+    LocalPointer<Collator> col(Collator::createInstance(Locale::getEnglish(), errorCode));
-+    if (errorCode.logIfFailureAndReset("English Collator creation failed")) {
-+        return;
-+    }
-+
-+    LocalPointer<StringEnumeration> 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);
- }
- 
-@@ -2467,4 +2483,5 @@
-     TESTCASE_AUTO_BEGIN;
-     TESTCASE_AUTO(TestProperty);
-+    TESTCASE_AUTO(TestKeywordValues);
-     TESTCASE_AUTO(TestOperators);
-     TESTCASE_AUTO(TestDuplicate);
-Index: /icu/trunk/source/test/intltest/apicoll.h
-===================================================================
---- /icu/trunk/source/test/intltest/apicoll.h	(revision 39483)
-+++ /icu/trunk/source/test/intltest/apicoll.h	(revision 39484)
-@@ -36,4 +36,5 @@
-      */
-     void TestProperty(/* char* par */);
-+    void TestKeywordValues();
- 
-     /**

Deleted: icu.8198.revert.icu5431.patch
===================================================================
--- icu.8198.revert.icu5431.patch	2017-04-24 11:37:14 UTC (rev 294283)
+++ icu.8198.revert.icu5431.patch	2017-04-24 11:46:52 UTC (rev 294284)
@@ -1,129 +0,0 @@
-Index: icu/trunk/source/layout/IndicReordering.cpp
-===================================================================
---- icu/trunk/source/layout/IndicReordering.cpp	(revision 25772)
-+++ icu/trunk/source/layout/IndicReordering.cpp	(revision 26090)
-@@ -126,4 +126,8 @@
-     FeatureMask fSMFeatures;
- 
-+    LEUnicode   fPreBaseConsonant;
-+    LEUnicode   fPreBaseVirama;
-+    le_int32    fPBCIndex;
-+    FeatureMask fPBCFeatures;
- 
-     void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass)
-@@ -172,5 +176,6 @@
-           fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups),
-           fVMabove(0), fVMpost(0), fVMIndex(0), fVMFeatures(0),
--          fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0)
-+          fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0),
-+          fPreBaseConsonant(0), fPreBaseVirama(0), fPBCIndex(0), fPBCFeatures(0)
-     {
-         // nothing else to do...
-@@ -191,4 +196,6 @@
-         fVMabove = fVMpost  = 0;
-         fSMabove = fSMbelow = 0;
-+
-+        fPreBaseConsonant = fPreBaseVirama = 0;
-     }
- 
-@@ -386,4 +393,12 @@
-     }
- 
-+    void notePreBaseConsonant(le_uint32 index,LEUnicode PBConsonant, LEUnicode PBVirama, FeatureMask features)
-+    {
-+        fPBCIndex = index;
-+        fPreBaseConsonant = PBConsonant;
-+        fPreBaseVirama = PBVirama;
-+        fPBCFeatures = features;
-+    }
-+
-     void noteBaseConsonant()
-     {
-@@ -465,4 +480,20 @@
-     }
-     
-+    void writePreBaseConsonant()
-+    {
-+        // The TDIL spec says that consonant + virama + RRA should produce a rakar in Malayalam.  However,
-+        // it seems that almost none of the fonts for Malayalam are set up to handle this.
-+        // So, we're going to force the issue here by using the rakar as defined with RA in most fonts.
-+
-+        if (fPreBaseConsonant == 0x0d31) { // RRA
-+            fPreBaseConsonant = 0x0d30; // RA
-+        }
-+        
-+        if (fPreBaseConsonant != 0) {
-+            writeChar(fPreBaseConsonant, fPBCIndex, fPBCFeatures);
-+            writeChar(fPreBaseVirama,fPBCIndex-1,fPBCFeatures);
-+        }
-+    }
-+
-     le_int32 getOutputIndex()
-     {
-@@ -723,4 +754,5 @@
-             }
- 
-+            
-             IndicClassTable::CharClass charClass = CC_RESERVED;
-             IndicClassTable::CharClass nextClass = CC_RESERVED;
-@@ -730,7 +762,9 @@
-             le_bool  seenVattu = FALSE;
-             le_bool  seenBelowBaseForm = FALSE;
-+            le_bool  seenPreBaseForm = FALSE;
-             le_bool  hasNukta = FALSE;
-             le_bool  hasBelowBaseForm = FALSE;
-             le_bool  hasPostBaseForm = FALSE;
-+            le_bool  hasPreBaseForm = FALSE;
- 
-             if (postBase < markStart && classTable->isNukta(chars[postBase])) {
-@@ -746,12 +780,20 @@
-                 hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta;
-                 hasPostBaseForm  = IndicClassTable::hasPostBaseForm(charClass)  && !hasNukta;
-+                hasPreBaseForm = IndicClassTable::hasPreBaseForm(charClass) && !hasNukta;
- 
-                 if (IndicClassTable::isConsonant(charClass)) {
-                     if (postBaseLimit == 0 || seenVattu ||
-                         (baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) ||
--                        !(hasBelowBaseForm || hasPostBaseForm)) {
-+                        !(hasBelowBaseForm || hasPostBaseForm || hasPreBaseForm)) {
-                         break;
-                     }
- 
-+                    // Note any pre-base consonants
-+                    if ( baseConsonant == lastConsonant && lastConsonant > 0 && 
-+                         hasPreBaseForm && classTable->isVirama(chars[baseConsonant - 1])) {
-+                        output.notePreBaseConsonant(lastConsonant,chars[lastConsonant],chars[lastConsonant-1],tagArray2);
-+                        seenPreBaseForm = TRUE;
-+   
-+                    }
-                     // consonants with nuktas are never vattus
-                     seenVattu = IndicClassTable::isVattu(charClass) && !hasNukta;
-@@ -786,10 +828,12 @@
- 
-             // write any pre-base consonants
-+            output.writePreBaseConsonant();
-+
-             le_bool supressVattu = TRUE;
- 
-             for (i = baseLimit; i < baseConsonant; i += 1) {
-                 LEUnicode ch = chars[i];
--                // Don't put 'blwf' on first consonant.
--                FeatureMask features = (i == baseLimit? tagArray2 : tagArray1);
-+                // Don't put 'pstf' or 'blwf' on anything before the base consonant.
-+                FeatureMask features = tagArray1 & ~( pstfFeatureMask | blwfFeatureMask );
- 
-                 charClass = classTable->getCharClass(ch);
-@@ -842,5 +886,5 @@
- 
-             // write below-base consonants
--            if (baseConsonant != lastConsonant) {
-+            if (baseConsonant != lastConsonant && !seenPreBaseForm) {
-                 for (i = bcSpan + 1; i < postBase; i += 1) {
-                     output.writeChar(chars[i], i, tagArray1);
-@@ -872,5 +916,5 @@
-             // write post-base consonants
-             // FIXME: does this put the right tags on post-base consonants?
--            if (baseConsonant != lastConsonant) {
-+            if (baseConsonant != lastConsonant && !seenPreBaseForm) {
-                 if (postBase <= lastConsonant) {
-                     for (i = postBase; i <= lastConsonant; i += 1) {



More information about the arch-commits mailing list