ulocale.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // © 2023 and later: Unicode, Inc. and others.
  2. // License & terms of use: http://www.unicode.org/copyright.html
  3. //
  4. #include "unicode/bytestream.h"
  5. #include "unicode/errorcode.h"
  6. #include "unicode/stringpiece.h"
  7. #include "unicode/utypes.h"
  8. #include "unicode/ustring.h"
  9. #include "unicode/ulocale.h"
  10. #include "unicode/locid.h"
  11. #include "bytesinkutil.h"
  12. #include "charstr.h"
  13. #include "cmemory.h"
  14. U_NAMESPACE_USE
  15. #define EXTERNAL(i) (reinterpret_cast<ULocale*>(i))
  16. #define CONST_INTERNAL(e) (reinterpret_cast<const icu::Locale*>(e))
  17. #define INTERNAL(e) (reinterpret_cast<icu::Locale*>(e))
  18. ULocale*
  19. ulocale_openForLocaleID(const char* localeID, int32_t length, UErrorCode* err) {
  20. if (U_FAILURE(*err)) { return nullptr; }
  21. if (length < 0) {
  22. return EXTERNAL(icu::Locale::createFromName(localeID).clone());
  23. }
  24. CharString str(localeID, length, *err); // Make a NUL terminated copy.
  25. if (U_FAILURE(*err)) { return nullptr; }
  26. return EXTERNAL(icu::Locale::createFromName(str.data()).clone());
  27. }
  28. ULocale*
  29. ulocale_openForLanguageTag(const char* tag, int32_t length, UErrorCode* err) {
  30. if (U_FAILURE(*err)) { return nullptr; }
  31. Locale l = icu::Locale::forLanguageTag(length < 0 ? StringPiece(tag) : StringPiece(tag, length), *err);
  32. if (U_FAILURE(*err)) { return nullptr; }
  33. return EXTERNAL(l.clone());
  34. }
  35. void
  36. ulocale_close(ULocale* locale) {
  37. delete INTERNAL(locale);
  38. }
  39. #define IMPL_ULOCALE_STRING_GETTER(N1, N2) \
  40. const char* ulocale_get ## N1(const ULocale* locale) { \
  41. if (locale == nullptr) return nullptr; \
  42. return CONST_INTERNAL(locale)->get ## N2(); \
  43. }
  44. #define IMPL_ULOCALE_STRING_IDENTICAL_GETTER(N) IMPL_ULOCALE_STRING_GETTER(N, N)
  45. #define IMPL_ULOCALE_GET_KEYWORD_VALUE(N) \
  46. int32_t ulocale_get ##N ( \
  47. const ULocale* locale, const char* keyword, int32_t keywordLength, \
  48. char* valueBuffer, int32_t bufferCapacity, UErrorCode *err) { \
  49. if (U_FAILURE(*err)) return 0; \
  50. if (locale == nullptr) { \
  51. *err = U_ILLEGAL_ARGUMENT_ERROR; \
  52. return 0; \
  53. } \
  54. return ByteSinkUtil::viaByteSinkToTerminatedChars( \
  55. valueBuffer, bufferCapacity, \
  56. [&](ByteSink& sink, UErrorCode& status) { \
  57. CONST_INTERNAL(locale)->get ## N( \
  58. keywordLength < 0 ? StringPiece(keyword) : StringPiece(keyword, keywordLength), \
  59. sink, status); \
  60. }, \
  61. *err); \
  62. }
  63. #define IMPL_ULOCALE_GET_KEYWORDS(N) \
  64. UEnumeration* ulocale_get ## N(const ULocale* locale, UErrorCode *err) { \
  65. if (U_FAILURE(*err)) return nullptr; \
  66. if (locale == nullptr) { \
  67. *err = U_ILLEGAL_ARGUMENT_ERROR; \
  68. return nullptr; \
  69. } \
  70. return uenum_openFromStringEnumeration( \
  71. CONST_INTERNAL(locale)->create ## N(*err), err); \
  72. }
  73. IMPL_ULOCALE_STRING_IDENTICAL_GETTER(Language)
  74. IMPL_ULOCALE_STRING_IDENTICAL_GETTER(Script)
  75. IMPL_ULOCALE_STRING_GETTER(Region, Country)
  76. IMPL_ULOCALE_STRING_IDENTICAL_GETTER(Variant)
  77. IMPL_ULOCALE_STRING_GETTER(LocaleID, Name)
  78. IMPL_ULOCALE_STRING_IDENTICAL_GETTER(BaseName)
  79. IMPL_ULOCALE_GET_KEYWORD_VALUE(KeywordValue)
  80. IMPL_ULOCALE_GET_KEYWORD_VALUE(UnicodeKeywordValue)
  81. IMPL_ULOCALE_GET_KEYWORDS(Keywords)
  82. IMPL_ULOCALE_GET_KEYWORDS(UnicodeKeywords)
  83. bool ulocale_isBogus(const ULocale* locale) {
  84. if (locale == nullptr) return false;
  85. return CONST_INTERNAL(locale)->isBogus();
  86. }
  87. /*eof*/