]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/ucnvscsu.c
ICU-461.18.tar.gz
[apple/icu.git] / icuSources / common / ucnvscsu.c
index 1211da7a9b3f3af401cac3c1d007fb311ed93513..76e973d0598aa5dd563fd06bd4c53e11dbd94b6a 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ******************************************************************************
 *
-*   Copyright (C) 2000-2004, International Business Machines
+*   Copyright (C) 2000-2009, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 ******************************************************************************
@@ -190,10 +190,12 @@ _SCSUReset(UConverter *cnv, UConverterResetChoice choice) {
 
 static void
 _SCSUOpen(UConverter *cnv,
-          const char *name,
-          const char *locale,
-          uint32_t options,
+          UConverterLoadArgs *pArgs,
           UErrorCode *pErrorCode) {
+    const char *locale=pArgs->locale;
+    if(pArgs->onlyTestIsLoadable) {
+        return;
+    }
     cnv->extraInfo=uprv_malloc(sizeof(SCSUData));
     if(cnv->extraInfo!=NULL) {
         if(locale!=NULL && locale[0]=='j' && locale[1]=='a' && (locale[2]==0 || locale[2]=='_')) {
@@ -205,6 +207,10 @@ _SCSUOpen(UConverter *cnv,
     } else {
         *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
     }
+
+    /* Set the substitution character U+fffd as a Unicode string. */
+    cnv->subUChars[0]=0xfffd;
+    cnv->subCharLen=-1;
 }
 
 static void
@@ -1433,11 +1439,14 @@ outputBytes:
          * first to the overflow buffer what does not fit into the
          * regular target.
          */
-        /* we know that 1<=targetCapacity<length<=4 */
+        /* we know that 0<=targetCapacity<length<=4 */
+        /* targetCapacity==0 when SCU+supplementary where SCU used up targetCapacity==1 */
         length-=targetCapacity;
         p=(uint8_t *)cnv->charErrorBuffer;
         switch(length) {
             /* each branch falls through to the next one */
+        case 4:
+            *p++=(uint8_t)(c>>24);
         case 3:
             *p++=(uint8_t)(c>>16);
         case 2:
@@ -1470,7 +1479,6 @@ outputBytes:
                 *offsets++=sourceIndex;
             }
         default:
-            /* will never occur */
             break;
         }
 
@@ -1868,11 +1876,14 @@ outputBytes:
          * first to the overflow buffer what does not fit into the
          * regular target.
          */
-        /* we know that 1<=targetCapacity<length<=4 */
+        /* we know that 0<=targetCapacity<length<=4 */
+        /* targetCapacity==0 when SCU+supplementary where SCU used up targetCapacity==1 */
         length-=targetCapacity;
         p=(uint8_t *)cnv->charErrorBuffer;
         switch(length) {
             /* each branch falls through to the next one */
+        case 4:
+            *p++=(uint8_t)(c>>24);
         case 3:
             *p++=(uint8_t)(c>>16);
         case 2:
@@ -1896,7 +1907,6 @@ outputBytes:
         case 1:
             *target++=(uint8_t)c;
         default:
-            /* will never occur */
             break;
         }
 
@@ -1922,30 +1932,6 @@ _SCSUGetName(const UConverter *cnv) {
     }
 }
 
-static void
-_SCSUWriteSub(UConverterFromUnicodeArgs *pArgs,
-               int32_t offsetIndex,
-               UErrorCode *pErrorCode) {
-    static const char squ_fffd[]={ (char)SQU, (char)0xffu, (char)0xfdu };
-
-    /*
-     * The substitution character is U+fffd={ ff, fd }.
-     * If the SCSU converter is in Unicode mode, then these two bytes just need to
-     * be written. Otherwise, this character is quoted.
-     */
-    if(((SCSUData *)pArgs->converter->extraInfo)->fromUIsSingleByteMode) {
-        /* single-byte mode: quote Unicode */
-        ucnv_cbFromUWriteBytes(pArgs,
-                               squ_fffd, 3,
-                               offsetIndex, pErrorCode);
-    } else {
-        /* Unicode mode: just write U+fffd */
-        ucnv_cbFromUWriteBytes(pArgs,
-                               squ_fffd+1, 2,
-                               offsetIndex, pErrorCode);
-    }
-}
-
 /* structure for SafeClone calculations */
 struct cloneSCSUStruct
 {
@@ -2000,7 +1986,7 @@ static const UConverterImpl _SCSUImpl={
 
     NULL,
     _SCSUGetName,
-    _SCSUWriteSub,
+    NULL,
     _SCSUSafeClone,
     ucnv_getCompleteUnicodeSet
 };
@@ -2008,14 +1994,12 @@ static const UConverterImpl _SCSUImpl={
 static const UConverterStaticData _SCSUStaticData={
     sizeof(UConverterStaticData),
     "SCSU",
-    0, /* CCSID for SCSU */
+    1212, /* CCSID for SCSU */
     UCNV_IBM, UCNV_SCSU,
     1, 3, /* one UChar generates at least 1 byte and at most 3 bytes */
     /*
-     * ### TODO the subchar really must be written by an SCSU function
-     * however, currently SCSU's fromUnicode() never causes errors, therefore
-     * no callbacks will be called and no subchars written
-     * See Jitterbug 2837 - RFE: forbid converting surrogate code points in all charsets
+     * The subchar here is ignored because _SCSUOpen() sets U+fffd as a Unicode
+     * substitution string.
      */
     { 0x0e, 0xff, 0xfd, 0 }, 3,
     FALSE, FALSE,