1 /* 2 ******************************************************************************* 3 * 4 * Copyright (C) 2007-2009, International Business Machines 5 * Corporation and others. All Rights Reserved. 6 * 7 ******************************************************************************* 8 * file name: udatpg.h 9 * encoding: US-ASCII 10 * tab size: 8 (not used) 11 * indentation:4 12 * 13 * created on: 2007jul30 14 * created by: Markus W. Scherer 15 */ 16 17 #ifndef __UDATPG_H__ 18 #define __UDATPG_H__ 19 20 #include "unicode/utypes.h" 21 #include "unicode/uenum.h" 22 23 /** 24 * \file 25 * \brief C API: Wrapper for DateTimePatternGenerator (unicode/dtptngen.h). 26 * 27 * UDateTimePatternGenerator provides flexible generation of date format patterns, 28 * like "yy-MM-dd". The user can build up the generator by adding successive 29 * patterns. Once that is done, a query can be made using a "skeleton", which is 30 * a pattern which just includes the desired fields and lengths. The generator 31 * will return the "best fit" pattern corresponding to that skeleton. 32 * <p>The main method people will use is udatpg_getBestPattern, since normally 33 * UDateTimePatternGenerator is pre-built with data from a particular locale. 34 * However, generators can be built directly from other data as well. 35 * <p><i>Issue: may be useful to also have a function that returns the list of 36 * fields in a pattern, in order, since we have that internally. 37 * That would be useful for getting the UI order of field elements.</i> 38 */ 39 40 /** 41 * Opaque type for a date/time pattern generator object. 42 * @stable ICU 3.8 43 */ 44 typedef void *UDateTimePatternGenerator; 45 46 /** 47 * Field number constants for udatpg_getAppendItemFormats() and similar functions. 48 * These constants are separate from UDateFormatField despite semantic overlap 49 * because some fields are merged for the date/time pattern generator. 50 * @stable ICU 3.8 51 */ 52 typedef enum UDateTimePatternField { 53 /** @stable ICU 3.8 */ 54 UDATPG_ERA_FIELD, 55 /** @stable ICU 3.8 */ 56 UDATPG_YEAR_FIELD, 57 /** @stable ICU 3.8 */ 58 UDATPG_QUARTER_FIELD, 59 /** @stable ICU 3.8 */ 60 UDATPG_MONTH_FIELD, 61 /** @stable ICU 3.8 */ 62 UDATPG_WEEK_OF_YEAR_FIELD, 63 /** @stable ICU 3.8 */ 64 UDATPG_WEEK_OF_MONTH_FIELD, 65 /** @stable ICU 3.8 */ 66 UDATPG_WEEKDAY_FIELD, 67 /** @stable ICU 3.8 */ 68 UDATPG_DAY_OF_YEAR_FIELD, 69 /** @stable ICU 3.8 */ 70 UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, 71 /** @stable ICU 3.8 */ 72 UDATPG_DAY_FIELD, 73 /** @stable ICU 3.8 */ 74 UDATPG_DAYPERIOD_FIELD, 75 /** @stable ICU 3.8 */ 76 UDATPG_HOUR_FIELD, 77 /** @stable ICU 3.8 */ 78 UDATPG_MINUTE_FIELD, 79 /** @stable ICU 3.8 */ 80 UDATPG_SECOND_FIELD, 81 /** @stable ICU 3.8 */ 82 UDATPG_FRACTIONAL_SECOND_FIELD, 83 /** @stable ICU 3.8 */ 84 UDATPG_ZONE_FIELD, 85 /** @stable ICU 3.8 */ 86 UDATPG_FIELD_COUNT 87 } UDateTimePatternField; 88 89 /** 90 * Status return values from udatpg_addPattern(). 91 * @stable ICU 3.8 92 */ 93 typedef enum UDateTimePatternConflict { 94 /** @stable ICU 3.8 */ 95 UDATPG_NO_CONFLICT, 96 /** @stable ICU 3.8 */ 97 UDATPG_BASE_CONFLICT, 98 /** @stable ICU 3.8 */ 99 UDATPG_CONFLICT, 100 /** @stable ICU 3.8 */ 101 UDATPG_CONFLICT_COUNT 102 } UDateTimePatternConflict; 103 104 /** 105 * Open a generator according to a given locale. 106 * @param locale 107 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 108 * failure before the function call. 109 * @return a pointer to UDateTimePatternGenerator. 110 * @stable ICU 3.8 111 */ 112 U_DRAFT UDateTimePatternGenerator * U_EXPORT2 113 udatpg_open(const char *locale, UErrorCode *pErrorCode); 114 115 /** 116 * Open an empty generator, to be constructed with udatpg_addPattern(...) etc. 117 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 118 * failure before the function call. 119 * @return a pointer to UDateTimePatternGenerator. 120 * @stable ICU 3.8 121 */ 122 U_DRAFT UDateTimePatternGenerator * U_EXPORT2 123 udatpg_openEmpty(UErrorCode *pErrorCode); 124 125 /** 126 * Close a generator. 127 * @param dtpg a pointer to UDateTimePatternGenerator. 128 * @stable ICU 3.8 129 */ 130 U_DRAFT void U_EXPORT2 131 udatpg_close(UDateTimePatternGenerator *dtpg); 132 133 /** 134 * Create a copy pf a generator. 135 * @param dtpg a pointer to UDateTimePatternGenerator to be copied. 136 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 137 * failure before the function call. 138 * @return a pointer to a new UDateTimePatternGenerator. 139 * @stable ICU 3.8 140 */ 141 U_DRAFT UDateTimePatternGenerator * U_EXPORT2 142 udatpg_clone(const UDateTimePatternGenerator *dtpg, UErrorCode *pErrorCode); 143 144 /** 145 * Get the best pattern matching the input skeleton. It is guaranteed to 146 * have all of the fields in the skeleton. 147 * 148 * Note that this function uses a non-const UDateTimePatternGenerator: 149 * It uses a stateful pattern parser which is set up for each generator object, 150 * rather than creating one for each function call. 151 * Consecutive calls to this function do not affect each other, 152 * but this function cannot be used concurrently on a single generator object. 153 * 154 * @param dtpg a pointer to UDateTimePatternGenerator. 155 * @param skeleton 156 * The skeleton is a pattern containing only the variable fields. 157 * For example, "MMMdd" and "mmhh" are skeletons. 158 * @param length the length of skeleton 159 * @param bestPattern 160 * The best pattern found from the given skeleton. 161 * @param capacity the capacity of bestPattern. 162 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 163 * failure before the function call. 164 * @return the length of bestPattern. 165 * @stable ICU 3.8 166 */ 167 U_DRAFT int32_t U_EXPORT2 168 udatpg_getBestPattern(UDateTimePatternGenerator *dtpg, 169 const UChar *skeleton, int32_t length, 170 UChar *bestPattern, int32_t capacity, 171 UErrorCode *pErrorCode); 172 173 /** 174 * Get a unique skeleton from a given pattern. For example, 175 * both "MMM-dd" and "dd/MMM" produce the skeleton "MMMdd". 176 * 177 * Note that this function uses a non-const UDateTimePatternGenerator: 178 * It uses a stateful pattern parser which is set up for each generator object, 179 * rather than creating one for each function call. 180 * Consecutive calls to this function do not affect each other, 181 * but this function cannot be used concurrently on a single generator object. 182 * 183 * @param dtpg a pointer to UDateTimePatternGenerator. 184 * @param pattern input pattern, such as "dd/MMM". 185 * @param length the length of pattern. 186 * @param skeleton such as "MMMdd" 187 * @param capacity the capacity of skeleton. 188 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 189 * failure before the function call. 190 * @return the length of skeleton. 191 * @stable ICU 3.8 192 */ 193 U_DRAFT int32_t U_EXPORT2 194 udatpg_getSkeleton(UDateTimePatternGenerator *dtpg, 195 const UChar *pattern, int32_t length, 196 UChar *skeleton, int32_t capacity, 197 UErrorCode *pErrorCode); 198 199 /** 200 * Get a unique base skeleton from a given pattern. This is the same 201 * as the skeleton, except that differences in length are minimized so 202 * as to only preserve the difference between string and numeric form. So 203 * for example, both "MMM-dd" and "d/MMM" produce the skeleton "MMMd" 204 * (notice the single d). 205 * 206 * Note that this function uses a non-const UDateTimePatternGenerator: 207 * It uses a stateful pattern parser which is set up for each generator object, 208 * rather than creating one for each function call. 209 * Consecutive calls to this function do not affect each other, 210 * but this function cannot be used concurrently on a single generator object. 211 * 212 * @param dtpg a pointer to UDateTimePatternGenerator. 213 * @param pattern input pattern, such as "dd/MMM". 214 * @param length the length of pattern. 215 * @param baseSkeleton such as "Md" 216 * @param capacity the capacity of base skeleton. 217 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 218 * failure before the function call. 219 * @return the length of baseSkeleton. 220 * @stable ICU 3.8 221 */ 222 U_DRAFT int32_t U_EXPORT2 223 udatpg_getBaseSkeleton(UDateTimePatternGenerator *dtpg, 224 const UChar *pattern, int32_t length, 225 UChar *baseSkeleton, int32_t capacity, 226 UErrorCode *pErrorCode); 227 228 /** 229 * Adds a pattern to the generator. If the pattern has the same skeleton as 230 * an existing pattern, and the override parameter is set, then the previous 231 * value is overriden. Otherwise, the previous value is retained. In either 232 * case, the conflicting status is set and previous vale is stored in 233 * conflicting pattern. 234 * <p> 235 * Note that single-field patterns (like "MMM") are automatically added, and 236 * don't need to be added explicitly! 237 * 238 * @param dtpg a pointer to UDateTimePatternGenerator. 239 * @param pattern input pattern, such as "dd/MMM" 240 * @param patternLength the length of pattern. 241 * @param override When existing values are to be overridden use true, 242 * otherwise use false. 243 * @param conflictingPattern Previous pattern with the same skeleton. 244 * @param capacity the capacity of conflictingPattern. 245 * @param pLength a pointer to the length of conflictingPattern. 246 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 247 * failure before the function call. 248 * @return conflicting status. The value could be UDATPG_NO_CONFLICT, 249 * UDATPG_BASE_CONFLICT or UDATPG_CONFLICT. 250 * @stable ICU 3.8 251 */ 252 U_DRAFT UDateTimePatternConflict U_EXPORT2 253 udatpg_addPattern(UDateTimePatternGenerator *dtpg, 254 const UChar *pattern, int32_t patternLength, 255 UBool override, 256 UChar *conflictingPattern, int32_t capacity, int32_t *pLength, 257 UErrorCode *pErrorCode); 258 259 /** 260 * An AppendItem format is a pattern used to append a field if there is no 261 * good match. For example, suppose that the input skeleton is "GyyyyMMMd", 262 * and there is no matching pattern internally, but there is a pattern 263 * matching "yyyyMMMd", say "d-MM-yyyy". Then that pattern is used, plus the 264 * G. The way these two are conjoined is by using the AppendItemFormat for G 265 * (era). So if that value is, say "{0}, {1}" then the final resulting 266 * pattern is "d-MM-yyyy, G". 267 * <p> 268 * There are actually three available variables: {0} is the pattern so far, 269 * {1} is the element we are adding, and {2} is the name of the element. 270 * <p> 271 * This reflects the way that the CLDR data is organized. 272 * 273 * @param dtpg a pointer to UDateTimePatternGenerator. 274 * @param field UDateTimePatternField, such as UDATPG_ERA_FIELD 275 * @param value pattern, such as "{0}, {1}" 276 * @param length the length of value. 277 * @stable ICU 3.8 278 */ 279 U_DRAFT void U_EXPORT2 280 udatpg_setAppendItemFormat(UDateTimePatternGenerator *dtpg, 281 UDateTimePatternField field, 282 const UChar *value, int32_t length); 283 284 /** 285 * Getter corresponding to setAppendItemFormat. Values below 0 or at or 286 * above UDATPG_FIELD_COUNT are illegal arguments. 287 * 288 * @param dtpg A pointer to UDateTimePatternGenerator. 289 * @param field UDateTimePatternField, such as UDATPG_ERA_FIELD 290 * @param pLength A pointer that will receive the length of appendItemFormat. 291 * @return appendItemFormat for field. 292 * @stable ICU 3.8 293 */ 294 U_DRAFT const UChar * U_EXPORT2 295 udatpg_getAppendItemFormat(const UDateTimePatternGenerator *dtpg, 296 UDateTimePatternField field, 297 int32_t *pLength); 298 299 /** 300 * Set the name of field, eg "era" in English for ERA. These are only 301 * used if the corresponding AppendItemFormat is used, and if it contains a 302 * {2} variable. 303 * <p> 304 * This reflects the way that the CLDR data is organized. 305 * 306 * @param dtpg a pointer to UDateTimePatternGenerator. 307 * @param field UDateTimePatternField 308 * @param value name for the field. 309 * @param length the length of value. 310 * @stable ICU 3.8 311 */ 312 U_DRAFT void U_EXPORT2 313 udatpg_setAppendItemName(UDateTimePatternGenerator *dtpg, 314 UDateTimePatternField field, 315 const UChar *value, int32_t length); 316 317 /** 318 * Getter corresponding to setAppendItemNames. Values below 0 or at or above 319 * UDATPG_FIELD_COUNT are illegal arguments. 320 * 321 * @param dtpg a pointer to UDateTimePatternGenerator. 322 * @param field UDateTimePatternField, such as UDATPG_ERA_FIELD 323 * @param pLength A pointer that will receive the length of the name for field. 324 * @return name for field 325 * @stable ICU 3.8 326 */ 327 U_DRAFT const UChar * U_EXPORT2 328 udatpg_getAppendItemName(const UDateTimePatternGenerator *dtpg, 329 UDateTimePatternField field, 330 int32_t *pLength); 331 332 /** 333 * The date time format is a message format pattern used to compose date and 334 * time patterns. The default value is "{0} {1}", where {0} will be replaced 335 * by the date pattern and {1} will be replaced by the time pattern. 336 * <p> 337 * This is used when the input skeleton contains both date and time fields, 338 * but there is not a close match among the added patterns. For example, 339 * suppose that this object was created by adding "dd-MMM" and "hh:mm", and 340 * its datetimeFormat is the default "{0} {1}". Then if the input skeleton 341 * is "MMMdhmm", there is not an exact match, so the input skeleton is 342 * broken up into two components "MMMd" and "hmm". There are close matches 343 * for those two skeletons, so the result is put together with this pattern, 344 * resulting in "d-MMM h:mm". 345 * 346 * @param dtpg a pointer to UDateTimePatternGenerator. 347 * @param dtFormat 348 * message format pattern, here {0} will be replaced by the date 349 * pattern and {1} will be replaced by the time pattern. 350 * @param length the length of dtFormat. 351 * @stable ICU 3.8 352 */ 353 U_DRAFT void U_EXPORT2 354 udatpg_setDateTimeFormat(const UDateTimePatternGenerator *dtpg, 355 const UChar *dtFormat, int32_t length); 356 357 /** 358 * Getter corresponding to setDateTimeFormat. 359 * @param dtpg a pointer to UDateTimePatternGenerator. 360 * @param pLength A pointer that will receive the length of the format 361 * @return dateTimeFormat. 362 * @stable ICU 3.8 363 */ 364 U_DRAFT const UChar * U_EXPORT2 365 udatpg_getDateTimeFormat(const UDateTimePatternGenerator *dtpg, 366 int32_t *pLength); 367 368 /** 369 * The decimal value is used in formatting fractions of seconds. If the 370 * skeleton contains fractional seconds, then this is used with the 371 * fractional seconds. For example, suppose that the input pattern is 372 * "hhmmssSSSS", and the best matching pattern internally is "H:mm:ss", and 373 * the decimal string is ",". Then the resulting pattern is modified to be 374 * "H:mm:ss,SSSS" 375 * 376 * @param dtpg a pointer to UDateTimePatternGenerator. 377 * @param decimal 378 * @param length the length of decimal. 379 * @stable ICU 3.8 380 */ 381 U_DRAFT void U_EXPORT2 382 udatpg_setDecimal(UDateTimePatternGenerator *dtpg, 383 const UChar *decimal, int32_t length); 384 385 /** 386 * Getter corresponding to setDecimal. 387 * 388 * @param dtpg a pointer to UDateTimePatternGenerator. 389 * @param pLength A pointer that will receive the length of the decimal string. 390 * @return corresponding to the decimal point. 391 * @stable ICU 3.8 392 */ 393 U_DRAFT const UChar * U_EXPORT2 394 udatpg_getDecimal(const UDateTimePatternGenerator *dtpg, 395 int32_t *pLength); 396 397 /** 398 * Adjusts the field types (width and subtype) of a pattern to match what is 399 * in a skeleton. That is, if you supply a pattern like "d-M H:m", and a 400 * skeleton of "MMMMddhhmm", then the input pattern is adjusted to be 401 * "dd-MMMM hh:mm". This is used internally to get the best match for the 402 * input skeleton, but can also be used externally. 403 * 404 * Note that this function uses a non-const UDateTimePatternGenerator: 405 * It uses a stateful pattern parser which is set up for each generator object, 406 * rather than creating one for each function call. 407 * Consecutive calls to this function do not affect each other, 408 * but this function cannot be used concurrently on a single generator object. 409 * 410 * @param dtpg a pointer to UDateTimePatternGenerator. 411 * @param pattern Input pattern 412 * @param patternLength the length of input pattern. 413 * @param skeleton 414 * @param skeletonLength the length of input skeleton. 415 * @param dest pattern adjusted to match the skeleton fields widths and subtypes. 416 * @param destCapacity the capacity of dest. 417 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 418 * failure before the function call. 419 * @return the length of dest. 420 * @stable ICU 3.8 421 */ 422 U_DRAFT int32_t U_EXPORT2 423 udatpg_replaceFieldTypes(UDateTimePatternGenerator *dtpg, 424 const UChar *pattern, int32_t patternLength, 425 const UChar *skeleton, int32_t skeletonLength, 426 UChar *dest, int32_t destCapacity, 427 UErrorCode *pErrorCode); 428 429 /** 430 * Return a UEnumeration list of all the skeletons in canonical form. 431 * Call udatpg_getPatternForSkeleton() to get the corresponding pattern. 432 * 433 * @param dtpg a pointer to UDateTimePatternGenerator. 434 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 435 * failure before the function call 436 * @return a UEnumeration list of all the skeletons 437 * The caller must close the object. 438 * @stable ICU 3.8 439 */ 440 U_DRAFT UEnumeration * U_EXPORT2 441 udatpg_openSkeletons(const UDateTimePatternGenerator *dtpg, UErrorCode *pErrorCode); 442 443 /** 444 * Return a UEnumeration list of all the base skeletons in canonical form. 445 * 446 * @param dtpg a pointer to UDateTimePatternGenerator. 447 * @param pErrorCode a pointer to the UErrorCode which must not indicate a 448 * failure before the function call. 449 * @return a UEnumeration list of all the base skeletons 450 * The caller must close the object. 451 * @stable ICU 3.8 452 */ 453 U_DRAFT UEnumeration * U_EXPORT2 454 udatpg_openBaseSkeletons(const UDateTimePatternGenerator *dtpg, UErrorCode *pErrorCode); 455 456 /** 457 * Get the pattern corresponding to a given skeleton. 458 * 459 * @param dtpg a pointer to UDateTimePatternGenerator. 460 * @param skeleton 461 * @param skeletonLength pointer to the length of skeleton. 462 * @param pLength pointer to the length of return pattern. 463 * @return pattern corresponding to a given skeleton. 464 * @stable ICU 3.8 465 */ 466 U_DRAFT const UChar * U_EXPORT2 467 udatpg_getPatternForSkeleton(const UDateTimePatternGenerator *dtpg, 468 const UChar *skeleton, int32_t skeletonLength, 469 int32_t *pLength); 470 471 #endif 472