Coverage Report

Created: 2025-06-24 06:43

/src/icu/source/i18n/format.cpp
Line
Count
Source (jump to first uncovered line)
1
// © 2016 and later: Unicode, Inc. and others.
2
// License & terms of use: http://www.unicode.org/copyright.html
3
/*
4
*******************************************************************************
5
* Copyright (C) 1997-2012, International Business Machines Corporation and    *
6
* others. All Rights Reserved.                                                *
7
*******************************************************************************
8
*
9
* File FORMAT.CPP
10
*
11
* Modification History:
12
*
13
*   Date        Name        Description
14
*   02/19/97    aliu        Converted from java.
15
*   03/17/97    clhuang     Implemented with new APIs.
16
*   03/27/97    helena      Updated to pass the simple test after code review.
17
*   07/20/98    stephen        Added explicit init values for Field/ParsePosition
18
********************************************************************************
19
*/
20
// *****************************************************************************
21
// This file was generated from the java source file Format.java
22
// *****************************************************************************
23
24
#include "utypeinfo.h"  // for 'typeid' to work
25
26
#include "unicode/utypes.h"
27
28
#ifndef U_I18N_IMPLEMENTATION
29
#error U_I18N_IMPLEMENTATION not set - must be set for all ICU source files in i18n/ - see https://unicode-org.github.io/icu/userguide/howtouseicu
30
#endif
31
32
/*
33
 * Dummy code:
34
 * If all modules in the I18N library are switched off, then there are no
35
 * library exports and MSVC 6 writes a .dll but not a .lib file.
36
 * Unless we export _something_ in that case...
37
 */
38
#if UCONFIG_NO_COLLATION && UCONFIG_NO_FORMATTING && UCONFIG_NO_TRANSLITERATION
39
U_CAPI int32_t U_EXPORT2
40
uprv_icuin_lib_dummy(int32_t i) {
41
    return -i;
42
}
43
#endif
44
45
/* Format class implementation ---------------------------------------------- */
46
47
#if !UCONFIG_NO_FORMATTING
48
49
#include "unicode/format.h"
50
#include "unicode/ures.h"
51
#include "cstring.h"
52
#include "locbased.h"
53
54
// *****************************************************************************
55
// class Format
56
// *****************************************************************************
57
58
U_NAMESPACE_BEGIN
59
60
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FieldPosition)
61
62
0
FieldPosition::~FieldPosition() {}
63
64
FieldPosition *
65
0
FieldPosition::clone() const {
66
0
    return new FieldPosition(*this);
67
0
}
68
69
// -------------------------------------
70
// default constructor
71
72
Format::Format()
73
0
    : UObject()
74
0
{
75
0
    *validLocale = *actualLocale = 0;
76
0
}
77
78
// -------------------------------------
79
80
Format::~Format()
81
0
{
82
0
}
83
84
// -------------------------------------
85
// copy constructor
86
87
Format::Format(const Format &that)
88
0
    : UObject(that)
89
0
{
90
0
    *this = that;
91
0
}
92
93
// -------------------------------------
94
// assignment operator
95
96
Format&
97
Format::operator=(const Format& that)
98
0
{
99
0
    if (this != &that) {
100
0
        uprv_strcpy(validLocale, that.validLocale);
101
0
        uprv_strcpy(actualLocale, that.actualLocale);
102
0
    }
103
0
    return *this;
104
0
}
105
106
// -------------------------------------
107
// Formats the obj and append the result in the buffer, toAppendTo.
108
// This calls the actual implementation in the concrete subclasses.
109
110
UnicodeString&
111
Format::format(const Formattable& obj,
112
               UnicodeString& toAppendTo,
113
               UErrorCode& status) const
114
0
{
115
0
    if (U_FAILURE(status)) return toAppendTo;
116
117
0
    FieldPosition pos(FieldPosition::DONT_CARE);
118
119
0
    return format(obj, toAppendTo, pos, status);
120
0
}
121
122
// -------------------------------------
123
// Default implementation sets unsupported error; subclasses should
124
// override.
125
126
UnicodeString&
127
Format::format(const Formattable& /* unused obj */,
128
               UnicodeString& toAppendTo,
129
               FieldPositionIterator* /* unused posIter */,
130
               UErrorCode& status) const
131
0
{
132
0
    if (!U_FAILURE(status)) {
133
0
      status = U_UNSUPPORTED_ERROR;
134
0
    }
135
0
    return toAppendTo;
136
0
}
137
138
// -------------------------------------
139
// Parses the source string and create the corresponding
140
// result object.  Checks the parse position for errors.
141
142
void
143
Format::parseObject(const UnicodeString& source,
144
                    Formattable& result,
145
                    UErrorCode& status) const
146
0
{
147
0
    if (U_FAILURE(status)) return;
148
149
0
    ParsePosition parsePosition(0);
150
0
    parseObject(source, result, parsePosition);
151
0
    if (parsePosition.getIndex() == 0) {
152
0
        status = U_INVALID_FORMAT_ERROR;
153
0
    }
154
0
}
155
156
// -------------------------------------
157
158
bool
159
Format::operator==(const Format& that) const
160
0
{
161
    // Subclasses: Call this method and then add more specific checks.
162
0
    return typeid(*this) == typeid(that);
163
0
}
164
//---------------------------------------
165
166
/**
167
 * Simple function for initializing a UParseError from a UnicodeString.
168
 *
169
 * @param pattern The pattern to copy into the parseError
170
 * @param pos The position in pattern where the error occurred
171
 * @param parseError The UParseError object to fill in
172
 * @draft ICU 2.4
173
 */
174
void Format::syntaxError(const UnicodeString& pattern,
175
                         int32_t pos,
176
0
                         UParseError& parseError) {
177
0
    parseError.offset = pos;
178
0
    parseError.line=0;  // we are not using line number
179
180
    // for pre-context
181
0
    int32_t start = (pos < U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1
182
0
                                                             /* subtract 1 so that we have room for null*/));
183
0
    int32_t stop  = pos;
184
0
    pattern.extract(start,stop-start,parseError.preContext,0);
185
    //null terminate the buffer
186
0
    parseError.preContext[stop-start] = 0;
187
188
    //for post-context
189
0
    start = pos+1;
190
0
    stop  = ((pos+U_PARSE_CONTEXT_LEN)<=pattern.length()) ? (pos+(U_PARSE_CONTEXT_LEN-1)) :
191
0
        pattern.length();
192
0
    pattern.extract(start,stop-start,parseError.postContext,0);
193
    //null terminate the buffer
194
0
    parseError.postContext[stop-start]= 0;
195
0
}
196
197
Locale
198
0
Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
199
0
    U_LOCALE_BASED(locBased, *this);
200
0
    return locBased.getLocale(type, status);
201
0
}
202
203
const char *
204
0
Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
205
0
    U_LOCALE_BASED(locBased, *this);
206
0
    return locBased.getLocaleID(type, status);
207
0
}
208
209
void
210
0
Format::setLocaleIDs(const char* valid, const char* actual) {
211
0
    U_LOCALE_BASED(locBased, *this);
212
0
    locBased.setLocaleIDs(valid, actual);
213
0
}
214
215
U_NAMESPACE_END
216
217
#endif /* #if !UCONFIG_NO_FORMATTING */
218
219
//eof