]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/ucasemap_titlecase_brkiter.cpp
ICU-62135.0.1.tar.gz
[apple/icu.git] / icuSources / common / ucasemap_titlecase_brkiter.cpp
index 1698c8eb752dd7c51a07f6d40712030b26aae085..c21dfb7698a8adfd2b80c69ac05291b28bb96c93 100644 (file)
@@ -1,10 +1,12 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 *   Copyright (C) 2011, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  ucasemap_titlecase_brkiter.cpp
-*   encoding:   US-ASCII
+*   encoding:   UTF-8
 *   tab size:   8 (not used)
 *   indentation:4
 *
 
 #include "unicode/brkiter.h"
 #include "unicode/ubrk.h"
+#include "unicode/casemap.h"
 #include "unicode/ucasemap.h"
 #include "cmemory.h"
 #include "ucase.h"
-#include "ustr_imp.h"
+#include "ucasemap_imp.h"
+
+U_NAMESPACE_BEGIN
+
+void CaseMap::utf8ToTitle(
+        const char *locale, uint32_t options, BreakIterator *iter,
+        StringPiece src, ByteSink &sink, Edits *edits,
+        UErrorCode &errorCode) {
+    if (U_FAILURE(errorCode)) {
+        return;
+    }
+    UText utext = UTEXT_INITIALIZER;
+    utext_openUTF8(&utext, src.data(), src.length(), &errorCode);
+    LocalPointer<BreakIterator> ownedIter;
+    iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode);
+    if (iter == nullptr) {
+        utext_close(&utext);
+        return;
+    }
+    iter->setText(&utext, errorCode);
+    ucasemap_mapUTF8(
+        ustrcase_getCaseLocale(locale), options, iter,
+        src.data(), src.length(),
+        ucasemap_internalUTF8ToTitle, sink, edits, errorCode);
+    utext_close(&utext);
+}
+
+int32_t CaseMap::utf8ToTitle(
+        const char *locale, uint32_t options, BreakIterator *iter,
+        const char *src, int32_t srcLength,
+        char *dest, int32_t destCapacity, Edits *edits,
+        UErrorCode &errorCode) {
+    if (U_FAILURE(errorCode)) {
+        return 0;
+    }
+    UText utext=UTEXT_INITIALIZER;
+    utext_openUTF8(&utext, src, srcLength, &errorCode);
+    LocalPointer<BreakIterator> ownedIter;
+    iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode);
+    if(iter==NULL) {
+        utext_close(&utext);
+        return 0;
+    }
+    iter->setText(&utext, errorCode);
+    int32_t length=ucasemap_mapUTF8(
+        ustrcase_getCaseLocale(locale), options, iter,
+        dest, destCapacity,
+        src, srcLength,
+        ucasemap_internalUTF8ToTitle, edits, errorCode);
+    utext_close(&utext);
+    return length;
+}
+
+U_NAMESPACE_END
 
 U_NAMESPACE_USE
 
 U_CAPI const UBreakIterator * U_EXPORT2
 ucasemap_getBreakIterator(const UCaseMap *csm) {
-    return csm->iter;
+    return reinterpret_cast<UBreakIterator *>(csm->iter);
 }
 
 U_CAPI void U_EXPORT2
-ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * /*pErrorCode*/) {
-    // Do not call ubrk_close() so that we do not depend on all of the BreakIterator code.
-    delete reinterpret_cast<BreakIterator *>(csm->iter);
-    csm->iter=iterToAdopt;
+ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode *pErrorCode) {
+    if(U_FAILURE(*pErrorCode)) {
+        return;
+    }
+    delete csm->iter;
+    csm->iter=reinterpret_cast<BreakIterator *>(iterToAdopt);
 }
 
 U_CAPI int32_t U_EXPORT2
@@ -45,21 +103,30 @@ ucasemap_utf8ToTitle(UCaseMap *csm,
                      char *dest, int32_t destCapacity,
                      const char *src, int32_t srcLength,
                      UErrorCode *pErrorCode) {
+    if (U_FAILURE(*pErrorCode)) {
+        return 0;
+    }
     UText utext=UTEXT_INITIALIZER;
     utext_openUTF8(&utext, (const char *)src, srcLength, pErrorCode);
-    if(U_FAILURE(*pErrorCode)) {
+    if (U_FAILURE(*pErrorCode)) {
         return 0;
     }
     if(csm->iter==NULL) {
-        csm->iter=ubrk_open(UBRK_WORD, csm->locale,
-                            NULL, 0,
-                            pErrorCode);
+        LocalPointer<BreakIterator> ownedIter;
+        BreakIterator *iter = ustrcase_getTitleBreakIterator(
+            nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode);
+        if (iter == nullptr) {
+            utext_close(&utext);
+            return 0;
+        }
+        csm->iter = ownedIter.orphan();
     }
-    ubrk_setUText(csm->iter, &utext, pErrorCode);
-    int32_t length=ucasemap_mapUTF8(csm,
-                   (uint8_t *)dest, destCapacity,
-                   (const uint8_t *)src, srcLength,
-                   ucasemap_internalUTF8ToTitle, pErrorCode);
+    csm->iter->setText(&utext, *pErrorCode);
+    int32_t length=ucasemap_mapUTF8(
+            csm->caseLocale, csm->options, csm->iter,
+            dest, destCapacity,
+            src, srcLength,
+            ucasemap_internalUTF8ToTitle, NULL, *pErrorCode);
     utext_close(&utext);
     return length;
 }