File: | root/firefox-clang/intl/icu/source/i18n/number_simple.cpp |
Warning: | line 252, column 5 Value stored to 'length' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | // © 2017 and later: Unicode, Inc. and others. |
2 | // License & terms of use: http://www.unicode.org/copyright.html |
3 | |
4 | #include "unicode/utypes.h" |
5 | |
6 | #if !UCONFIG_NO_FORMATTING0 |
7 | |
8 | #include "unicode/numberformatter.h" |
9 | #include "unicode/simplenumberformatter.h" |
10 | #include "number_formatimpl.h" |
11 | #include "number_utils.h" |
12 | #include "number_patternmodifier.h" |
13 | #include "number_utypes.h" |
14 | |
15 | using namespace icu; |
16 | using namespace icu::number; |
17 | using namespace icu::number::impl; |
18 | |
19 | |
20 | SimpleNumber |
21 | SimpleNumber::forInt64(int64_t value, UErrorCode& status) { |
22 | if (U_FAILURE(status)) { |
23 | return {}; |
24 | } |
25 | auto* results = new UFormattedNumberData(); |
26 | if (results == nullptr) { |
27 | status = U_MEMORY_ALLOCATION_ERROR; |
28 | return {}; |
29 | } |
30 | results->quantity.setToLong(value); |
31 | return SimpleNumber(results, status); |
32 | } |
33 | |
34 | SimpleNumber::SimpleNumber(UFormattedNumberData* data, UErrorCode& status) : fData(data) { |
35 | if (U_FAILURE(status)) { |
36 | return; |
37 | } |
38 | if (fData == nullptr) { |
39 | status = U_ILLEGAL_ARGUMENT_ERROR; |
40 | return; |
41 | } |
42 | if (fData->quantity.isNegative()) { |
43 | fSign = UNUM_SIMPLE_NUMBER_MINUS_SIGN; |
44 | } else { |
45 | fSign = UNUM_SIMPLE_NUMBER_NO_SIGN; |
46 | } |
47 | } |
48 | |
49 | void SimpleNumber::cleanup() { |
50 | delete fData; |
51 | fData = nullptr; |
52 | } |
53 | |
54 | void SimpleNumber::multiplyByPowerOfTen(int32_t power, UErrorCode& status) { |
55 | if (U_FAILURE(status)) { |
56 | return; |
57 | } |
58 | if (fData == nullptr) { |
59 | status = U_INVALID_STATE_ERROR; |
60 | return; |
61 | } |
62 | fData->quantity.adjustMagnitude(power); |
63 | } |
64 | |
65 | void SimpleNumber::roundTo(int32_t position, UNumberFormatRoundingMode roundingMode, UErrorCode& status) { |
66 | if (U_FAILURE(status)) { |
67 | return; |
68 | } |
69 | if (fData == nullptr) { |
70 | status = U_INVALID_STATE_ERROR; |
71 | return; |
72 | } |
73 | fData->quantity.roundToMagnitude(position, roundingMode, status); |
74 | } |
75 | |
76 | void SimpleNumber::setMinimumIntegerDigits(uint32_t position, UErrorCode& status) { |
77 | if (U_FAILURE(status)) { |
78 | return; |
79 | } |
80 | if (fData == nullptr) { |
81 | status = U_INVALID_STATE_ERROR; |
82 | return; |
83 | } |
84 | fData->quantity.decreaseMinIntegerTo(position); |
85 | fData->quantity.increaseMinIntegerTo(position); |
86 | } |
87 | |
88 | void SimpleNumber::setMinimumFractionDigits(uint32_t position, UErrorCode& status) { |
89 | if (U_FAILURE(status)) { |
90 | return; |
91 | } |
92 | if (fData == nullptr) { |
93 | status = U_INVALID_STATE_ERROR; |
94 | return; |
95 | } |
96 | fData->quantity.setMinFraction(position); |
97 | } |
98 | |
99 | void SimpleNumber::setMaximumIntegerDigits(uint32_t position, UErrorCode& status) { |
100 | if (U_FAILURE(status)) { |
101 | return; |
102 | } |
103 | if (fData == nullptr) { |
104 | status = U_INVALID_STATE_ERROR; |
105 | return; |
106 | } |
107 | fData->quantity.decreaseMinIntegerTo(position); |
108 | fData->quantity.applyMaxInteger(position); |
109 | } |
110 | |
111 | void SimpleNumber::setSign(USimpleNumberSign sign, UErrorCode& status) { |
112 | if (U_FAILURE(status)) { |
113 | return; |
114 | } |
115 | if (fData == nullptr) { |
116 | status = U_INVALID_STATE_ERROR; |
117 | return; |
118 | } |
119 | fSign = sign; |
120 | } |
121 | |
122 | |
123 | void SimpleNumberFormatter::cleanup() { |
124 | delete fOwnedSymbols; |
125 | delete fMicros; |
126 | delete fPatternModifier; |
127 | fOwnedSymbols = nullptr; |
128 | fMicros = nullptr; |
129 | fPatternModifier = nullptr; |
130 | } |
131 | |
132 | SimpleNumberFormatter SimpleNumberFormatter::forLocale(const icu::Locale &locale, UErrorCode &status) { |
133 | return SimpleNumberFormatter::forLocaleAndGroupingStrategy(locale, UNUM_GROUPING_AUTO, status); |
134 | } |
135 | |
136 | SimpleNumberFormatter SimpleNumberFormatter::forLocaleAndGroupingStrategy( |
137 | const icu::Locale &locale, |
138 | UNumberGroupingStrategy groupingStrategy, |
139 | UErrorCode &status) { |
140 | SimpleNumberFormatter retval; |
141 | retval.fOwnedSymbols = new DecimalFormatSymbols(locale, status); |
142 | if (U_FAILURE(status)) { |
143 | return retval; |
144 | } |
145 | if (retval.fOwnedSymbols == nullptr) { |
146 | status = U_MEMORY_ALLOCATION_ERROR; |
147 | return retval; |
148 | } |
149 | retval.initialize(locale, *retval.fOwnedSymbols, groupingStrategy, status); |
150 | return retval; |
151 | } |
152 | |
153 | |
154 | SimpleNumberFormatter SimpleNumberFormatter::forLocaleAndSymbolsAndGroupingStrategy( |
155 | const icu::Locale &locale, |
156 | const DecimalFormatSymbols &symbols, |
157 | UNumberGroupingStrategy groupingStrategy, |
158 | UErrorCode &status) { |
159 | SimpleNumberFormatter retval; |
160 | retval.initialize(locale, symbols, groupingStrategy, status); |
161 | return retval; |
162 | } |
163 | |
164 | |
165 | void SimpleNumberFormatter::initialize( |
166 | const icu::Locale &locale, |
167 | const DecimalFormatSymbols &symbols, |
168 | UNumberGroupingStrategy groupingStrategy, |
169 | UErrorCode &status) { |
170 | if (U_FAILURE(status)) { |
171 | return; |
172 | } |
173 | |
174 | fMicros = new SimpleMicroProps(); |
175 | if (fMicros == nullptr) { |
176 | status = U_MEMORY_ALLOCATION_ERROR; |
177 | return; |
178 | } |
179 | fMicros->symbols = &symbols; |
180 | |
181 | const auto* pattern = utils::getPatternForStyle( |
182 | locale, |
183 | symbols.getNumberingSystemName(), |
184 | CLDR_PATTERN_STYLE_DECIMAL, |
185 | status); |
186 | if (U_FAILURE(status)) { |
187 | return; |
188 | } |
189 | |
190 | ParsedPatternInfo patternInfo; |
191 | PatternParser::parseToPatternInfo(UnicodeString(pattern), patternInfo, status); |
192 | if (U_FAILURE(status)) { |
193 | return; |
194 | } |
195 | |
196 | auto grouper = Grouper::forStrategy(groupingStrategy); |
197 | grouper.setLocaleData(patternInfo, locale); |
198 | fMicros->grouping = grouper; |
199 | |
200 | MutablePatternModifier patternModifier(false); |
201 | patternModifier.setPatternInfo(&patternInfo, kUndefinedField); |
202 | patternModifier.setPatternAttributes(UNUM_SIGN_EXCEPT_ZERO, false, false); |
203 | patternModifier.setSymbols(fMicros->symbols, {}, UNUM_UNIT_WIDTH_SHORT, nullptr, status); |
204 | |
205 | fPatternModifier = new AdoptingSignumModifierStore(patternModifier.createImmutableForPlural(StandardPlural::COUNT, status)); |
206 | |
207 | fGroupingStrategy = groupingStrategy; |
208 | } |
209 | |
210 | FormattedNumber SimpleNumberFormatter::format(SimpleNumber value, UErrorCode &status) const { |
211 | formatImpl(value.fData, value.fSign, status); |
212 | |
213 | // Do not save the results object if we encountered a failure. |
214 | if (U_SUCCESS(status)) { |
215 | auto* temp = value.fData; |
216 | value.fData = nullptr; |
217 | return FormattedNumber(temp); |
218 | } else { |
219 | return FormattedNumber(status); |
220 | } |
221 | } |
222 | |
223 | void SimpleNumberFormatter::formatImpl(UFormattedNumberData* data, USimpleNumberSign sign, UErrorCode &status) const { |
224 | if (U_FAILURE(status)) { |
225 | return; |
226 | } |
227 | if (data == nullptr) { |
228 | status = U_ILLEGAL_ARGUMENT_ERROR; |
229 | return; |
230 | } |
231 | if (fPatternModifier == nullptr || fMicros == nullptr) { |
232 | status = U_INVALID_STATE_ERROR; |
233 | return; |
234 | } |
235 | |
236 | Signum signum; |
237 | if (sign == UNUM_SIMPLE_NUMBER_MINUS_SIGN) { |
238 | signum = SIGNUM_NEG; |
239 | } else if (sign == UNUM_SIMPLE_NUMBER_PLUS_SIGN) { |
240 | signum = SIGNUM_POS; |
241 | } else { |
242 | signum = SIGNUM_POS_ZERO; |
243 | } |
244 | |
245 | const Modifier* modifier = (*fPatternModifier)[signum]; |
246 | auto length = NumberFormatterImpl::writeNumber( |
247 | *fMicros, |
248 | data->quantity, |
249 | data->getStringRef(), |
250 | 0, |
251 | status); |
252 | length += modifier->apply(data->getStringRef(), 0, length, status); |
Value stored to 'length' is never read | |
253 | data->getStringRef().writeTerminator(status); |
254 | } |
255 | |
256 | #endif /* #if !UCONFIG_NO_FORMATTING */ |