2 *******************************************************************************
4 * Copyright (C) 1998-2012, International Business Machines
5 * Corporation and others. All Rights Reserved.
7 *******************************************************************************
11 * Modification History:
13 * Date Name Description
14 * 05/28/99 stephen Creation.
15 *******************************************************************************
21 #include "unicode/ustring.h"
22 #include "unicode/putil.h"
23 #include "unicode/utf16.h"
26 static void ustr_resize(struct UString
*s
, int32_t len
, UErrorCode
*status
);
29 #define ALLOCATION(minSize) (minSize < 0x80 ? 0x80 : (2 * minSize + 0x80) & ~(0x80 - 1))
32 ustr_init(struct UString
*s
)
35 s
->fLength
= s
->fCapacity
= 0;
39 ustr_initChars(struct UString
*s
, const char* source
, int32_t length
, UErrorCode
*status
)
42 if (U_FAILURE(*status
)) return;
44 s
->fLength
= s
->fCapacity
= 0;
46 length
= (int32_t)uprv_strlen(source
);
48 if(s
->fCapacity
< length
) {
49 ustr_resize(s
, ALLOCATION(length
), status
);
50 if(U_FAILURE(*status
)) return;
52 for (; i
< length
; i
++)
55 u_charsToUChars(source
+i
, &charToAppend
, 1);
56 ustr_ucat(s
, charToAppend
, status
);
58 #if U_CHARSET_FAMILY==U_ASCII_FAMILY
59 ustr_ucat(s, (UChar)(uint8_t)(source[i]), status);
60 #elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
61 ustr_ucat(s, (UChar)asciiFromEbcdic[(uint8_t)(*cs++)], status);
63 # error U_CHARSET_FAMILY is not valid
70 ustr_deinit(struct UString
*s
)
75 s
->fLength
= s
->fCapacity
= 0;
80 ustr_cpy(struct UString
*dst
,
81 const struct UString
*src
,
84 if(U_FAILURE(*status
) || dst
== src
)
87 if(dst
->fCapacity
< src
->fLength
) {
88 ustr_resize(dst
, ALLOCATION(src
->fLength
), status
);
89 if(U_FAILURE(*status
))
92 if(src
->fChars
== NULL
|| dst
->fChars
== NULL
){
95 u_memcpy(dst
->fChars
, src
->fChars
, src
->fLength
);
96 dst
->fLength
= src
->fLength
;
97 dst
->fChars
[dst
->fLength
] = 0x0000;
101 ustr_setlen(struct UString
*s
,
105 if(U_FAILURE(*status
))
108 if(s
->fCapacity
< (len
+ 1)) {
109 ustr_resize(s
, ALLOCATION(len
), status
);
110 if(U_FAILURE(*status
))
115 s
->fChars
[len
] = 0x0000;
119 ustr_cat(struct UString
*dst
,
120 const struct UString
*src
,
123 ustr_ncat(dst
, src
, src
->fLength
, status
);
127 ustr_ncat(struct UString
*dst
,
128 const struct UString
*src
,
132 if(U_FAILURE(*status
) || dst
== src
)
135 if(dst
->fCapacity
< (dst
->fLength
+ n
)) {
136 ustr_resize(dst
, ALLOCATION(dst
->fLength
+ n
), status
);
137 if(U_FAILURE(*status
))
141 uprv_memcpy(dst
->fChars
+ dst
->fLength
, src
->fChars
,
143 dst
->fLength
+= src
->fLength
;
144 dst
->fChars
[dst
->fLength
] = 0x0000;
148 ustr_ucat(struct UString
*dst
,
152 if(U_FAILURE(*status
))
155 if(dst
->fCapacity
< (dst
->fLength
+ 1)) {
156 ustr_resize(dst
, ALLOCATION(dst
->fLength
+ 1), status
);
157 if(U_FAILURE(*status
))
161 uprv_memcpy(dst
->fChars
+ dst
->fLength
, &c
,
164 dst
->fChars
[dst
->fLength
] = 0x0000;
167 ustr_u32cat(struct UString
*dst
, UChar32 c
, UErrorCode
*status
){
169 *status
= U_ILLEGAL_CHAR_FOUND
;
173 ustr_ucat(dst
, U16_LEAD(c
), status
);
174 ustr_ucat(dst
, U16_TRAIL(c
), status
);
176 ustr_ucat(dst
, (UChar
) c
, status
);
180 ustr_uscat(struct UString
*dst
,
181 const UChar
* src
,int len
,
184 if(U_FAILURE(*status
))
187 if(dst
->fCapacity
< (dst
->fLength
+ len
)) {
188 ustr_resize(dst
, ALLOCATION(dst
->fLength
+ len
), status
);
189 if(U_FAILURE(*status
))
193 uprv_memcpy(dst
->fChars
+ dst
->fLength
, src
,
194 sizeof(UChar
) * len
);
196 dst
->fChars
[dst
->fLength
] = 0x0000;
199 /* Destroys data in the string */
201 ustr_resize(struct UString
*s
,
205 if(U_FAILURE(*status
))
208 /* +1 for trailing 0x0000 */
209 s
->fChars
= (UChar
*) uprv_realloc(s
->fChars
, sizeof(UChar
) * (len
+ 1));
211 *status
= U_MEMORY_ALLOCATION_ERROR
;
212 s
->fLength
= s
->fCapacity
= 0;