@@ -157,13 +157,18 @@ _isKeywordValue(const char* key, const char* value, int32_t value_len)
157
157
}
158
158
159
159
static void
160
- _copyExtensions (const Locale& from, Locale* to, bool validate, UErrorCode& errorCode)
160
+ _copyExtensions (const Locale& from, icu::StringEnumeration *keywords,
161
+ Locale& to, bool validate, UErrorCode& errorCode)
161
162
{
162
163
if (U_FAILURE (errorCode)) { return ; }
163
- LocalPointer<icu::StringEnumeration> iter (from.createKeywords (errorCode));
164
- if (U_FAILURE (errorCode) || iter.isNull ()) { return ; }
164
+ LocalPointer<icu::StringEnumeration> ownedKeywords;
165
+ if (keywords == nullptr ) {
166
+ ownedKeywords.adoptInstead (from.createKeywords (errorCode));
167
+ if (U_FAILURE (errorCode) || ownedKeywords.isNull ()) { return ; }
168
+ keywords = ownedKeywords.getAlias ();
169
+ }
165
170
const char * key;
166
- while ((key = iter ->next (nullptr , errorCode)) != nullptr ) {
171
+ while ((key = keywords ->next (nullptr , errorCode)) != nullptr ) {
167
172
CharString value;
168
173
CharStringByteSink sink (&value);
169
174
from.getKeywordValue (key, sink, errorCode);
@@ -176,34 +181,34 @@ _copyExtensions(const Locale& from, Locale* to, bool validate, UErrorCode& error
176
181
errorCode = U_ILLEGAL_ARGUMENT_ERROR;
177
182
return ;
178
183
}
179
- to-> setKeywordValue (key, value.data (), errorCode);
184
+ to. setKeywordValue (key, value.data (), errorCode);
180
185
if (U_FAILURE (errorCode)) { return ; }
181
186
}
182
187
}
183
188
184
189
void static
185
- _clearUAttributesAndKeyType (Locale* locale, UErrorCode& errorCode)
190
+ _clearUAttributesAndKeyType (Locale& locale, UErrorCode& errorCode)
186
191
{
187
192
// Clear Unicode attributes
188
- locale-> setKeywordValue (kAttributeKey , " " , errorCode);
193
+ locale. setKeywordValue (kAttributeKey , " " , errorCode);
189
194
190
195
// Clear all Unicode keyword values
191
- LocalPointer<icu::StringEnumeration> iter (locale-> createUnicodeKeywords (errorCode));
196
+ LocalPointer<icu::StringEnumeration> iter (locale. createUnicodeKeywords (errorCode));
192
197
if (U_FAILURE (errorCode) || iter.isNull ()) { return ; }
193
198
const char * key;
194
199
while ((key = iter->next (nullptr , errorCode)) != nullptr ) {
195
- locale-> setUnicodeKeywordValue (key, nullptr , errorCode);
200
+ locale. setUnicodeKeywordValue (key, nullptr , errorCode);
196
201
}
197
202
}
198
203
199
204
static void
200
- _setUnicodeExtensions (Locale* locale, const CharString& value, UErrorCode& errorCode)
205
+ _setUnicodeExtensions (Locale& locale, const CharString& value, UErrorCode& errorCode)
201
206
{
202
207
// Add the unicode extensions to extensions_
203
208
CharString locale_str (" und-u-" , errorCode);
204
209
locale_str.append (value, errorCode);
205
210
_copyExtensions (
206
- Locale::forLanguageTag (locale_str.data (), errorCode),
211
+ Locale::forLanguageTag (locale_str.data (), errorCode), nullptr ,
207
212
locale, false , errorCode);
208
213
}
209
214
@@ -235,10 +240,10 @@ LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value)
235
240
status_);
236
241
return *this ;
237
242
}
238
- _clearUAttributesAndKeyType (extensions_, status_);
243
+ _clearUAttributesAndKeyType (* extensions_, status_);
239
244
if (U_FAILURE (status_)) { return *this ; }
240
245
if (!value.empty ()) {
241
- _setUnicodeExtensions (extensions_, value_str, status_);
246
+ _setUnicodeExtensions (* extensions_, value_str, status_);
242
247
}
243
248
return *this ;
244
249
}
@@ -401,6 +406,24 @@ Locale makeBogusLocale() {
401
406
return bogus;
402
407
}
403
408
409
+ void LocaleBuilder::copyExtensionsFrom (const Locale& src, UErrorCode& errorCode)
410
+ {
411
+ if (U_FAILURE (errorCode)) { return ; }
412
+ LocalPointer<icu::StringEnumeration> keywords (src.createKeywords (errorCode));
413
+ if (U_FAILURE (errorCode) || keywords.isNull () || keywords->count (errorCode) == 0 ) {
414
+ // Error, or no extensions to copy.
415
+ return ;
416
+ }
417
+ if (extensions_ == nullptr ) {
418
+ extensions_ = new Locale ();
419
+ if (extensions_ == nullptr ) {
420
+ status_ = U_MEMORY_ALLOCATION_ERROR;
421
+ return ;
422
+ }
423
+ }
424
+ _copyExtensions (src, keywords.getAlias (), *extensions_, false , errorCode);
425
+ }
426
+
404
427
Locale LocaleBuilder::build (UErrorCode& errorCode)
405
428
{
406
429
if (U_FAILURE (errorCode)) {
@@ -425,12 +448,21 @@ Locale LocaleBuilder::build(UErrorCode& errorCode)
425
448
}
426
449
Locale product (locale_str.data ());
427
450
if (extensions_ != nullptr ) {
428
- _copyExtensions (*extensions_, & product, true , errorCode);
451
+ _copyExtensions (*extensions_, nullptr , product, true , errorCode);
429
452
}
430
453
if (U_FAILURE (errorCode)) {
431
454
return makeBogusLocale ();
432
455
}
433
456
return product;
434
457
}
435
458
459
+ UBool LocaleBuilder::copyErrorTo (UErrorCode &outErrorCode) const {
460
+ if (U_FAILURE (outErrorCode)) {
461
+ // Do not overwrite the older error code
462
+ return TRUE ;
463
+ }
464
+ outErrorCode = status_;
465
+ return U_FAILURE (outErrorCode);
466
+ }
467
+
436
468
U_NAMESPACE_END
0 commit comments