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
22U_NAMESPACE_USE
23
24
25BStringFormat::BStringFormat(const BLanguage& language, const BString pattern)
26	: BFormat(language, BFormattingConventions())
27{
28	_Initialize(UnicodeString::fromUTF8(pattern.String()));
29}
30
31
32BStringFormat::BStringFormat(const BString pattern)
33	: BFormat()
34{
35	_Initialize(UnicodeString::fromUTF8(pattern.String()));
36}
37
38
39BStringFormat::~BStringFormat()
40{
41	delete fFormatter;
42}
43
44
45status_t
46BStringFormat::InitCheck()
47{
48	return fInitStatus;
49}
50
51
52status_t
53BStringFormat::Format(BString& output, const int64 arg) const
54{
55	if (fInitStatus != B_OK)
56		return fInitStatus;
57
58	UnicodeString buffer;
59	UErrorCode error = U_ZERO_ERROR;
60
61	Formattable arguments[] = {
62		(int64)arg
63	};
64
65	FieldPosition pos;
66	buffer = fFormatter->format(arguments, 1, buffer, pos, error);
67	if (!U_SUCCESS(error))
68		return B_ERROR;
69
70	BStringByteSink byteSink(&output);
71	buffer.toUTF8(byteSink);
72
73	return B_OK;
74}
75
76
77status_t
78BStringFormat::_Initialize(const UnicodeString& pattern)
79{
80	fInitStatus = B_OK;
81	UErrorCode error = U_ZERO_ERROR;
82	Locale* icuLocale
83		= BLanguage::Private(&fLanguage).ICULocale();
84
85	fFormatter = new MessageFormat(pattern, *icuLocale, error);
86
87	if (fFormatter == NULL)
88		fInitStatus = B_NO_MEMORY;
89
90	if (!U_SUCCESS(error)) {
91		delete fFormatter;
92		fInitStatus = B_ERROR;
93		fFormatter = NULL;
94	}
95
96	return fInitStatus;
97}
98