]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/tools/genrb/ustr.c
ICU-8.11.1.tar.gz
[apple/icu.git] / icuSources / tools / genrb / ustr.c
index 93c268e5735fde48790463d2ef208441f57a6f0b..aafcec54241b6667351de4ba7bb10e6207e41ad8 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
 /*
 *******************************************************************************
 *
-*   Copyright (C) 1998-2000, International Business Machines
+*   Copyright (C) 1998-2006, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -19,6 +19,7 @@
 #include "cmemory.h"
 #include "cstring.h"
 #include "unicode/ustring.h"
 #include "cmemory.h"
 #include "cstring.h"
 #include "unicode/ustring.h"
+#include "unicode/putil.h"
 
 /* Protos */
 static void ustr_resize(struct UString *s, int32_t len, UErrorCode *status);
 
 /* Protos */
 static void ustr_resize(struct UString *s, int32_t len, UErrorCode *status);
@@ -85,7 +86,9 @@ ustr_cpy(struct UString *dst,
         if(U_FAILURE(*status))
             return;
     }
         if(U_FAILURE(*status))
             return;
     }
-
+    if(src->fChars == NULL || dst->fChars == NULL){
+        return;
+    }
     uprv_memcpy(dst->fChars, src->fChars, sizeof(UChar) * src->fLength);
     dst->fLength = src->fLength;
     dst->fChars[dst->fLength] = 0x0000;
     uprv_memcpy(dst->fChars, src->fChars, sizeof(UChar) * src->fLength);
     dst->fLength = src->fLength;
     dst->fChars[dst->fLength] = 0x0000;
@@ -157,7 +160,19 @@ ustr_ucat(struct UString *dst,
     dst->fLength += 1;
     dst->fChars[dst->fLength] = 0x0000;
 }
     dst->fLength += 1;
     dst->fChars[dst->fLength] = 0x0000;
 }
-
+void 
+ustr_u32cat(struct UString *dst, UChar32 c, UErrorCode *status){
+    if(c > 0x10FFFF){
+        *status = U_ILLEGAL_CHAR_FOUND;
+        return;
+    }
+    if(c >0xFFFF){
+        ustr_ucat(dst, U16_LEAD(c), status);
+        ustr_ucat(dst, U16_TRAIL(c), status);
+    }else{
+        ustr_ucat(dst, (UChar) c, status);
+    }
+}
 void
 ustr_uscat(struct UString *dst,
       const UChar* src,int len,
 void
 ustr_uscat(struct UString *dst,
       const UChar* src,int len,
@@ -191,7 +206,6 @@ ustr_resize(struct UString *s,
     s->fChars = (UChar*) uprv_realloc(s->fChars, sizeof(UChar) * (len + 1));
     if(s->fChars == 0) {
         *status = U_MEMORY_ALLOCATION_ERROR;
     s->fChars = (UChar*) uprv_realloc(s->fChars, sizeof(UChar) * (len + 1));
     if(s->fChars == 0) {
         *status = U_MEMORY_ALLOCATION_ERROR;
-        s->fChars = 0;
         s->fLength = s->fCapacity = 0;
         return;
     }
         s->fLength = s->fCapacity = 0;
         return;
     }