CFTypeRef CFNumberFormatterCopyProperty()

in Frameworks/CoreFoundation/Locale.subproj/CFNumberFormatter.c [1002:1223]


CFTypeRef CFNumberFormatterCopyProperty(CFNumberFormatterRef formatter, CFStringRef key) {
    int32_t n;
    double d;
    UErrorCode status = U_ZERO_ERROR;
    UChar ubuffer[BUFFER_SIZE];
    CFIndex cnt;
    __CFGenericValidateType(formatter, CFNumberFormatterGetTypeID());
    __CFGenericValidateType(key, CFStringGetTypeID());
    // rule-based formatters don't do attributes and symbols, except for one
    if (CFEqual(kCFNumberFormatterFormattingContextKey, key)) {
#if U_ICU_VERSION_MAJOR_NUM >= 55
        n = __cficu_unum_getContext(formatter->_nf, UDISPCTX_TYPE_CAPITALIZATION, &status);
        if (1) {
            return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
        }
#endif
    }
    if (kCFNumberFormatterSpellOutStyle == formatter->_style && kCFNumberFormatterIsLenientKey != key) return NULL;
    if (kCFNumberFormatterOrdinalStyle == formatter->_style && kCFNumberFormatterIsLenientKey != key) return NULL;
    if (kCFNumberFormatterDurationStyle == formatter->_style && kCFNumberFormatterIsLenientKey != key) return NULL;
    if (kCFNumberFormatterCurrencyPluralStyle == formatter->_style && kCFNumberFormatterIsLenientKey != key) return NULL;
    if (kCFNumberFormatterCurrencyCodeKey == key) {
    cnt = __cficu_unum_getTextAttribute(formatter->_nf, UNUM_CURRENCY_CODE, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt == 0) {
        CFStringRef localeName = CFLocaleGetIdentifier(formatter->_locale);
        char buffer[BUFFER_SIZE];
        const char *cstr = CFStringGetCStringPtr(localeName, kCFStringEncodingASCII);
        if (NULL == cstr) {
        if (CFStringGetCString(localeName, buffer, BUFFER_SIZE, kCFStringEncodingASCII)) cstr = buffer;
        }
        if (NULL == cstr) {
            return NULL;
        }
        UErrorCode status = U_ZERO_ERROR;
        UNumberFormat *nf = __cficu_unum_open(UNUM_CURRENCY, NULL, 0, cstr, NULL, &status);
        if (NULL != nf) {
        cnt = __cficu_unum_getTextAttribute(nf, UNUM_CURRENCY_CODE, ubuffer, BUFFER_SIZE, &status);
        __cficu_unum_close(nf);
        }
    }
    if (U_SUCCESS(status) && 0 < cnt && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterDecimalSeparatorKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_DECIMAL_SEPARATOR_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterCurrencyDecimalSeparatorKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_MONETARY_SEPARATOR_SYMBOL, (UChar *)ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterAlwaysShowDecimalSeparatorKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_DECIMAL_ALWAYS_SHOWN);
    if (1) {
        return CFRetain(n ? kCFBooleanTrue : kCFBooleanFalse);
    }
    } else if (kCFNumberFormatterGroupingSeparatorKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_GROUPING_SEPARATOR_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterUseGroupingSeparatorKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_GROUPING_USED);
    if (1) {
        return CFRetain(n ? kCFBooleanTrue : kCFBooleanFalse);
    }
   } else if (kCFNumberFormatterPercentSymbolKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_PERCENT_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterZeroSymbolKey == key) {
        return formatter->_zeroSym ? CFRetain(formatter->_zeroSym) : NULL;
    } else if (kCFNumberFormatterNaNSymbolKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_NAN_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterInfinitySymbolKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_INFINITY_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterMinusSignKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_MINUS_SIGN_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterPlusSignKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_PLUS_SIGN_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterCurrencySymbolKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_CURRENCY_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterExponentSymbolKey == key) {
    cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_EXPONENTIAL_SYMBOL, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterMinIntegerDigitsKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_MIN_INTEGER_DIGITS);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterMaxIntegerDigitsKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_MAX_INTEGER_DIGITS);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterMinFractionDigitsKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_MIN_FRACTION_DIGITS);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterMaxFractionDigitsKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_MAX_FRACTION_DIGITS);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterGroupingSizeKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_GROUPING_SIZE);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterSecondaryGroupingSizeKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_SECONDARY_GROUPING_SIZE);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterRoundingModeKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_ROUNDING_MODE);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterRoundingIncrementKey == key) {
    d = __cficu_unum_getDoubleAttribute(formatter->_nf, UNUM_ROUNDING_INCREMENT);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberDoubleType, &d);
    }
    } else if (kCFNumberFormatterFormatWidthKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_FORMAT_WIDTH);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterPaddingPositionKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_PADDING_POSITION);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterPaddingCharacterKey == key) {
    cnt = __cficu_unum_getTextAttribute(formatter->_nf, UNUM_PADDING_CHARACTER, ubuffer, BUFFER_SIZE, &status);
    if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
        return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
    }
    } else if (kCFNumberFormatterDefaultFormatKey == key) {
    return formatter->_defformat ? CFRetain(formatter->_defformat) : NULL;
    } else if (kCFNumberFormatterMultiplierKey == key) {
        return formatter->_multiplier ? CFRetain(formatter->_multiplier) : NULL;
    } else if (kCFNumberFormatterPositivePrefixKey == key) {
        cnt = __cficu_unum_getTextAttribute(formatter->_nf, UNUM_POSITIVE_PREFIX, ubuffer, BUFFER_SIZE, &status);
        if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
            return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
        }
    } else if (kCFNumberFormatterPositiveSuffixKey == key) {
        cnt = __cficu_unum_getTextAttribute(formatter->_nf, UNUM_POSITIVE_SUFFIX, ubuffer, BUFFER_SIZE, &status);
        if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
            return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
        }
    } else if (kCFNumberFormatterNegativePrefixKey == key) {
        cnt = __cficu_unum_getTextAttribute(formatter->_nf, UNUM_NEGATIVE_PREFIX, ubuffer, BUFFER_SIZE, &status);
        if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
            return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
        }
    } else if (kCFNumberFormatterNegativeSuffixKey == key) {
        cnt = __cficu_unum_getTextAttribute(formatter->_nf, UNUM_NEGATIVE_SUFFIX, ubuffer, BUFFER_SIZE, &status);
        if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
            return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
        }
    } else if (kCFNumberFormatterPerMillSymbolKey == key) {
        cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_PERMILL_SYMBOL, ubuffer, BUFFER_SIZE, &status);
        if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
            return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
        }
    } else if (kCFNumberFormatterInternationalCurrencySymbolKey == key) {
        cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_INTL_CURRENCY_SYMBOL, ubuffer, BUFFER_SIZE, &status);
        if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
            return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
        }
    } else if (kCFNumberFormatterCurrencyGroupingSeparatorKey == key) {
        cnt = __cficu_unum_getSymbol(formatter->_nf, UNUM_MONETARY_GROUPING_SEPARATOR_SYMBOL, ubuffer, BUFFER_SIZE, &status);
        if (U_SUCCESS(status) && cnt <= BUFFER_SIZE) {
            return CFStringCreateWithCharacters(CFGetAllocator(formatter), (const UniChar *)ubuffer, cnt);
        }
    } else if (kCFNumberFormatterIsLenientKey == key) {
    // __cficu_unum_getAttribute(, UNUM_LENIENT_PARSE) is undefined.
    return CFRetain(formatter->_isLenient ? kCFBooleanTrue : kCFBooleanFalse);
    } else if (kCFNumberFormatterUseSignificantDigitsKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_SIGNIFICANT_DIGITS_USED);
    if (1) {
        return CFRetain(n ? kCFBooleanTrue : kCFBooleanFalse);
    }
    } else if (kCFNumberFormatterMinSignificantDigitsKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_MIN_SIGNIFICANT_DIGITS);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else if (kCFNumberFormatterMaxSignificantDigitsKey == key) {
    n = __cficu_unum_getAttribute(formatter->_nf, UNUM_MAX_SIGNIFICANT_DIGITS);
    if (1) {
        return CFNumberCreate(CFGetAllocator(formatter), kCFNumberSInt32Type, &n);
    }
    } else {
    CFAssert3(0, __kCFLogAssertion, "%s(): unknown key %p (%@)", __PRETTY_FUNCTION__, key, key);
    }
    return NULL;
}