xref: /haiku/src/kits/locale/StringFormat.cpp (revision 427edfcf0ddc74fc461c9355484d33fd4b027b70)
1 /*
2  * Copyright 2014-2015 Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Adrien Destugues, pulkomandy@pulkomandy.tk
7  *		John Scipione, jscipione@gmail.com
8  */
9 
10 #include <unicode/uversion.h>
11 #include <StringFormat.h>
12 
13 #include <Autolock.h>
14 #include <FormattingConventionsPrivate.h>
15 #include <LanguagePrivate.h>
16 
17 #include <ICUWrapper.h>
18 
19 #include <unicode/msgfmt.h>
20 
21 
22 BStringFormat::BStringFormat(const BLanguage& language, const BString pattern)
23 	: BFormat(language, BFormattingConventions())
24 {
25 	_Initialize(UnicodeString::fromUTF8(pattern.String()));
26 }
27 
28 
29 BStringFormat::BStringFormat(const BString pattern)
30 	: BFormat()
31 {
32 	_Initialize(UnicodeString::fromUTF8(pattern.String()));
33 }
34 
35 
36 BStringFormat::~BStringFormat()
37 {
38 	delete fFormatter;
39 }
40 
41 
42 status_t
43 BStringFormat::InitCheck()
44 {
45 	return fInitStatus;
46 }
47 
48 
49 status_t
50 BStringFormat::Format(BString& output, const int64 arg) const
51 {
52 	if (fInitStatus != B_OK)
53 		return fInitStatus;
54 
55 	UnicodeString buffer;
56 	UErrorCode error = U_ZERO_ERROR;
57 
58 	Formattable arguments[] = {
59 		(int64)arg
60 	};
61 
62 	FieldPosition pos;
63 	buffer = fFormatter->format(arguments, 1, buffer, pos, error);
64 	if (!U_SUCCESS(error))
65 		return B_ERROR;
66 
67 	BStringByteSink byteSink(&output);
68 	buffer.toUTF8(byteSink);
69 
70 	return B_OK;
71 }
72 
73 
74 status_t
75 BStringFormat::_Initialize(const UnicodeString& pattern)
76 {
77 	fInitStatus = B_OK;
78 	UErrorCode error = U_ZERO_ERROR;
79 	Locale* icuLocale
80 		= BLanguage::Private(&fLanguage).ICULocale();
81 
82 	fFormatter = new MessageFormat(pattern, *icuLocale, error);
83 
84 	if (fFormatter == NULL)
85 		fInitStatus = B_NO_MEMORY;
86 
87 	if (!U_SUCCESS(error)) {
88 		delete fFormatter;
89 		fInitStatus = B_ERROR;
90 		fFormatter = NULL;
91 	}
92 
93 	return fInitStatus;
94 }
95