| OLD | NEW |
| 1 /* | 1 /* |
| 2 ******************************************************************************* | 2 ******************************************************************************* |
| 3 * | 3 * |
| 4 * Copyright (C) 2005-2012, International Business Machines | 4 * Copyright (C) 2005-2014, International Business Machines |
| 5 * Corporation and others. All Rights Reserved. | 5 * Corporation and others. All Rights Reserved. |
| 6 * | 6 * |
| 7 ******************************************************************************* | 7 ******************************************************************************* |
| 8 * file name: utext.cpp | 8 * file name: utext.cpp |
| 9 * encoding: US-ASCII | 9 * encoding: US-ASCII |
| 10 * tab size: 8 (not used) | 10 * tab size: 8 (not used) |
| 11 * indentation:4 | 11 * indentation:4 |
| 12 * | 12 * |
| 13 * created on: 2005apr12 | 13 * created on: 2005apr12 |
| 14 * created by: Markus W. Scherer | 14 * created by: Markus W. Scherer |
| (...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 *status = U_NO_WRITE_PERMISSION; | 509 *status = U_NO_WRITE_PERMISSION; |
| 510 return; | 510 return; |
| 511 } | 511 } |
| 512 ut->pFuncs->copy(ut, nativeStart, nativeLimit, destIndex, move, status); | 512 ut->pFuncs->copy(ut, nativeStart, nativeLimit, destIndex, move, status); |
| 513 } | 513 } |
| 514 | 514 |
| 515 | 515 |
| 516 | 516 |
| 517 U_CAPI UText * U_EXPORT2 | 517 U_CAPI UText * U_EXPORT2 |
| 518 utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCod
e *status) { | 518 utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCod
e *status) { |
| 519 UText *result; | 519 if (U_FAILURE(*status)) { |
| 520 result = src->pFuncs->clone(dest, src, deep, status); | 520 return dest; |
| 521 } |
| 522 UText *result = src->pFuncs->clone(dest, src, deep, status); |
| 523 if (U_FAILURE(*status)) { |
| 524 return result; |
| 525 } |
| 526 if (result == NULL) { |
| 527 *status = U_MEMORY_ALLOCATION_ERROR; |
| 528 return result; |
| 529 } |
| 521 if (readOnly) { | 530 if (readOnly) { |
| 522 utext_freeze(result); | 531 utext_freeze(result); |
| 523 } | 532 } |
| 524 return result; | 533 return result; |
| 525 } | 534 } |
| 526 | 535 |
| 527 | 536 |
| 528 | 537 |
| 529 //------------------------------------------------------------------------------ | 538 //------------------------------------------------------------------------------ |
| 530 // | 539 // |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 // | 808 // |
| 800 // Relocate any pointers in the target that refer to the UText itself | 809 // Relocate any pointers in the target that refer to the UText itself |
| 801 // to point to the cloned copy rather than the original source. | 810 // to point to the cloned copy rather than the original source. |
| 802 // | 811 // |
| 803 adjustPointer(dest, &dest->context, src); | 812 adjustPointer(dest, &dest->context, src); |
| 804 adjustPointer(dest, &dest->p, src); | 813 adjustPointer(dest, &dest->p, src); |
| 805 adjustPointer(dest, &dest->q, src); | 814 adjustPointer(dest, &dest->q, src); |
| 806 adjustPointer(dest, &dest->r, src); | 815 adjustPointer(dest, &dest->r, src); |
| 807 adjustPointer(dest, (const void **)&dest->chunkContents, src); | 816 adjustPointer(dest, (const void **)&dest->chunkContents, src); |
| 808 | 817 |
| 818 // The newly shallow-cloned UText does _not_ own the underlying storage for
the text. |
| 819 // (The source for the clone may or may not have owned the text.) |
| 820 |
| 821 dest->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT); |
| 822 |
| 809 return dest; | 823 return dest; |
| 810 } | 824 } |
| 811 | 825 |
| 812 | 826 |
| 813 U_CDECL_END | 827 U_CDECL_END |
| 814 | 828 |
| 815 | 829 |
| 816 | 830 |
| 817 //------------------------------------------------------------------------------ | 831 //------------------------------------------------------------------------------ |
| 818 // | 832 // |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1568 if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) { | 1582 if (ut->providerProperties & I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT)) { |
| 1569 char *s = (char *)ut->context; | 1583 char *s = (char *)ut->context; |
| 1570 uprv_free(s); | 1584 uprv_free(s); |
| 1571 ut->context = NULL; | 1585 ut->context = NULL; |
| 1572 } | 1586 } |
| 1573 } | 1587 } |
| 1574 | 1588 |
| 1575 U_CDECL_END | 1589 U_CDECL_END |
| 1576 | 1590 |
| 1577 | 1591 |
| 1578 static const struct UTextFuncs utf8Funcs = | 1592 static const struct UTextFuncs utf8Funcs = |
| 1579 { | 1593 { |
| 1580 sizeof(UTextFuncs), | 1594 sizeof(UTextFuncs), |
| 1581 0, 0, 0, // Reserved alignment padding | 1595 0, 0, 0, // Reserved alignment padding |
| 1582 utf8TextClone, | 1596 utf8TextClone, |
| 1583 utf8TextLength, | 1597 utf8TextLength, |
| 1584 utf8TextAccess, | 1598 utf8TextAccess, |
| 1585 utf8TextExtract, | 1599 utf8TextExtract, |
| 1586 NULL, /* replace*/ | 1600 NULL, /* replace*/ |
| 1587 NULL, /* copy */ | 1601 NULL, /* copy */ |
| 1588 utf8TextMapOffsetToNative, | 1602 utf8TextMapOffsetToNative, |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1855 limit32--; | 1869 limit32--; |
| 1856 } | 1870 } |
| 1857 | 1871 |
| 1858 length=limit32-start32; | 1872 length=limit32-start32; |
| 1859 if(length>destCapacity) { | 1873 if(length>destCapacity) { |
| 1860 limit32 = start32 + destCapacity; | 1874 limit32 = start32 + destCapacity; |
| 1861 } | 1875 } |
| 1862 UnicodeString buffer(dest, 0, destCapacity); // writable alias | 1876 UnicodeString buffer(dest, 0, destCapacity); // writable alias |
| 1863 rep->extractBetween(start32, limit32, buffer); | 1877 rep->extractBetween(start32, limit32, buffer); |
| 1864 repTextAccess(ut, limit32, TRUE); | 1878 repTextAccess(ut, limit32, TRUE); |
| 1865 | 1879 |
| 1866 return u_terminateUChars(dest, destCapacity, length, status); | 1880 return u_terminateUChars(dest, destCapacity, length, status); |
| 1867 } | 1881 } |
| 1868 | 1882 |
| 1869 static int32_t U_CALLCONV | 1883 static int32_t U_CALLCONV |
| 1870 repTextReplace(UText *ut, | 1884 repTextReplace(UText *ut, |
| 1871 int64_t start, int64_t limit, | 1885 int64_t start, int64_t limit, |
| 1872 const UChar *src, int32_t length, | 1886 const UChar *src, int32_t length, |
| 1873 UErrorCode *status) { | 1887 UErrorCode *status) { |
| 1874 Replaceable *rep=(Replaceable *)ut->context; | 1888 Replaceable *rep=(Replaceable *)ut->context; |
| 1875 int32_t oldLength; | 1889 int32_t oldLength; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1977 int32_t nativeIterIndex = destIndex32 + limit32 - start32; | 1991 int32_t nativeIterIndex = destIndex32 + limit32 - start32; |
| 1978 if (move && destIndex32>start32) { | 1992 if (move && destIndex32>start32) { |
| 1979 // moved a block of text towards the end of the string. | 1993 // moved a block of text towards the end of the string. |
| 1980 nativeIterIndex = destIndex32; | 1994 nativeIterIndex = destIndex32; |
| 1981 } | 1995 } |
| 1982 | 1996 |
| 1983 // Set position, reload chunk if needed. | 1997 // Set position, reload chunk if needed. |
| 1984 repTextAccess(ut, nativeIterIndex, TRUE); | 1998 repTextAccess(ut, nativeIterIndex, TRUE); |
| 1985 } | 1999 } |
| 1986 | 2000 |
| 1987 static const struct UTextFuncs repFuncs = | 2001 static const struct UTextFuncs repFuncs = |
| 1988 { | 2002 { |
| 1989 sizeof(UTextFuncs), | 2003 sizeof(UTextFuncs), |
| 1990 0, 0, 0, // Reserved alignment padding | 2004 0, 0, 0, // Reserved alignment padding |
| 1991 repTextClone, | 2005 repTextClone, |
| 1992 repTextLength, | 2006 repTextLength, |
| 1993 repTextAccess, | 2007 repTextAccess, |
| 1994 repTextExtract, | 2008 repTextExtract, |
| 1995 repTextReplace, | 2009 repTextReplace, |
| 1996 repTextCopy, | 2010 repTextCopy, |
| 1997 NULL, // MapOffsetToNative, | 2011 NULL, // MapOffsetToNative, |
| 1998 NULL, // MapIndexToUTF16, | 2012 NULL, // MapIndexToUTF16, |
| 1999 repTextClose, | 2013 repTextClose, |
| 2000 NULL, // spare 1 | 2014 NULL, // spare 1 |
| 2001 NULL, // spare 2 | 2015 NULL, // spare 2 |
| 2002 NULL // spare 3 | 2016 NULL // spare 3 |
| 2003 }; | 2017 }; |
| 2004 | 2018 |
| 2005 | 2019 |
| 2006 U_CAPI UText * U_EXPORT2 | 2020 U_CAPI UText * U_EXPORT2 |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2228 } | 2242 } |
| 2229 | 2243 |
| 2230 // Iteration position to end of the newly inserted text. | 2244 // Iteration position to end of the newly inserted text. |
| 2231 ut->chunkOffset = destIndex32+limit32-start32; | 2245 ut->chunkOffset = destIndex32+limit32-start32; |
| 2232 if (move && destIndex32>start32) { | 2246 if (move && destIndex32>start32) { |
| 2233 ut->chunkOffset = destIndex32; | 2247 ut->chunkOffset = destIndex32; |
| 2234 } | 2248 } |
| 2235 | 2249 |
| 2236 } | 2250 } |
| 2237 | 2251 |
| 2238 static const struct UTextFuncs unistrFuncs = | 2252 static const struct UTextFuncs unistrFuncs = |
| 2239 { | 2253 { |
| 2240 sizeof(UTextFuncs), | 2254 sizeof(UTextFuncs), |
| 2241 0, 0, 0, // Reserved alignment padding | 2255 0, 0, 0, // Reserved alignment padding |
| 2242 unistrTextClone, | 2256 unistrTextClone, |
| 2243 unistrTextLength, | 2257 unistrTextLength, |
| 2244 unistrTextAccess, | 2258 unistrTextAccess, |
| 2245 unistrTextExtract, | 2259 unistrTextExtract, |
| 2246 unistrTextReplace, | 2260 unistrTextReplace, |
| 2247 unistrTextCopy, | 2261 unistrTextCopy, |
| 2248 NULL, // MapOffsetToNative, | 2262 NULL, // MapOffsetToNative, |
| 2249 NULL, // MapIndexToUTF16, | 2263 NULL, // MapIndexToUTF16, |
| 2250 unistrTextClose, | 2264 unistrTextClose, |
| 2251 NULL, // spare 1 | 2265 NULL, // spare 1 |
| 2252 NULL, // spare 2 | 2266 NULL, // spare 2 |
| 2253 NULL // spare 3 | 2267 NULL // spare 3 |
| 2254 }; | 2268 }; |
| 2255 | 2269 |
| 2256 | 2270 |
| 2257 | 2271 |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2541 | 2555 |
| 2542 // Put iteration position at the point just following the extracted text | 2556 // Put iteration position at the point just following the extracted text |
| 2543 ut->chunkOffset = uprv_min(strLength, start32 + destCapacity); | 2557 ut->chunkOffset = uprv_min(strLength, start32 + destCapacity); |
| 2544 | 2558 |
| 2545 // Add a terminating NUL if space in the buffer permits, | 2559 // Add a terminating NUL if space in the buffer permits, |
| 2546 // and set the error status as required. | 2560 // and set the error status as required. |
| 2547 u_terminateUChars(dest, destCapacity, di, pErrorCode); | 2561 u_terminateUChars(dest, destCapacity, di, pErrorCode); |
| 2548 return di; | 2562 return di; |
| 2549 } | 2563 } |
| 2550 | 2564 |
| 2551 static const struct UTextFuncs ucstrFuncs = | 2565 static const struct UTextFuncs ucstrFuncs = |
| 2552 { | 2566 { |
| 2553 sizeof(UTextFuncs), | 2567 sizeof(UTextFuncs), |
| 2554 0, 0, 0, // Reserved alignment padding | 2568 0, 0, 0, // Reserved alignment padding |
| 2555 ucstrTextClone, | 2569 ucstrTextClone, |
| 2556 ucstrTextLength, | 2570 ucstrTextLength, |
| 2557 ucstrTextAccess, | 2571 ucstrTextAccess, |
| 2558 ucstrTextExtract, | 2572 ucstrTextExtract, |
| 2559 NULL, // Replace | 2573 NULL, // Replace |
| 2560 NULL, // Copy | 2574 NULL, // Copy |
| 2561 NULL, // MapOffsetToNative, | 2575 NULL, // MapOffsetToNative, |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2758 U_ASSERT(desti+len>0); /* to ensure desti+len never exceeds MAX_INT32, w
hich must not happen logically */ | 2772 U_ASSERT(desti+len>0); /* to ensure desti+len never exceeds MAX_INT32, w
hich must not happen logically */ |
| 2759 if (desti+len <= destCapacity) { | 2773 if (desti+len <= destCapacity) { |
| 2760 U16_APPEND_UNSAFE(dest, desti, c); | 2774 U16_APPEND_UNSAFE(dest, desti, c); |
| 2761 copyLimit = srci+len; | 2775 copyLimit = srci+len; |
| 2762 } else { | 2776 } else { |
| 2763 desti += len; | 2777 desti += len; |
| 2764 *status = U_BUFFER_OVERFLOW_ERROR; | 2778 *status = U_BUFFER_OVERFLOW_ERROR; |
| 2765 } | 2779 } |
| 2766 srci += len; | 2780 srci += len; |
| 2767 } | 2781 } |
| 2768 | 2782 |
| 2769 charIterTextAccess(ut, copyLimit, TRUE); | 2783 charIterTextAccess(ut, copyLimit, TRUE); |
| 2770 | 2784 |
| 2771 u_terminateUChars(dest, destCapacity, desti, status); | 2785 u_terminateUChars(dest, destCapacity, desti, status); |
| 2772 return desti; | 2786 return desti; |
| 2773 } | 2787 } |
| 2774 | 2788 |
| 2775 static const struct UTextFuncs charIterFuncs = | 2789 static const struct UTextFuncs charIterFuncs = |
| 2776 { | 2790 { |
| 2777 sizeof(UTextFuncs), | 2791 sizeof(UTextFuncs), |
| 2778 0, 0, 0, // Reserved alignment padding | 2792 0, 0, 0, // Reserved alignment padding |
| 2779 charIterTextClone, | 2793 charIterTextClone, |
| 2780 charIterTextLength, | 2794 charIterTextLength, |
| 2781 charIterTextAccess, | 2795 charIterTextAccess, |
| 2782 charIterTextExtract, | 2796 charIterTextExtract, |
| 2783 NULL, // Replace | 2797 NULL, // Replace |
| 2784 NULL, // Copy | 2798 NULL, // Copy |
| 2785 NULL, // MapOffsetToNative, | 2799 NULL, // MapOffsetToNative, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2825 // zero without Access() thinking that the chunk is valid. | 2839 // zero without Access() thinking that the chunk is valid. |
| 2826 ut->chunkContents = (UChar *)ut->p; | 2840 ut->chunkContents = (UChar *)ut->p; |
| 2827 ut->chunkNativeStart = -1; | 2841 ut->chunkNativeStart = -1; |
| 2828 ut->chunkOffset = 1; | 2842 ut->chunkOffset = 1; |
| 2829 ut->chunkNativeLimit = 0; | 2843 ut->chunkNativeLimit = 0; |
| 2830 ut->chunkLength = 0; | 2844 ut->chunkLength = 0; |
| 2831 ut->nativeIndexingLimit = ut->chunkOffset; // enables native indexing | 2845 ut->nativeIndexingLimit = ut->chunkOffset; // enables native indexing |
| 2832 } | 2846 } |
| 2833 return ut; | 2847 return ut; |
| 2834 } | 2848 } |
| 2835 | |
| 2836 | |
| 2837 | |
| OLD | NEW |