5#include <unicode/uchar.h>
6#include <unicode/utf8.h>
10#define IC_METHOD(mname) PHP_METHOD(IntlChar, mname)
12static inline int convert_cp(UChar32* pcp,
zend_string *string_codepoint,
zend_long int_codepoint) {
13 if (string_codepoint !=
NULL) {
15 size_t string_codepoint_length =
ZSTR_LEN(string_codepoint);
23 U8_NEXT(
ZSTR_VAL(string_codepoint), i, string_codepoint_length, int_codepoint);
24 if ((
size_t)i != string_codepoint_length) {
31 if ((int_codepoint < UCHAR_MIN_VALUE) || (int_codepoint > UCHAR_MAX_VALUE)) {
36 *pcp = (UChar32)int_codepoint;
46 return convert_cp(
cp, string_codepoint, int_codepoint);
64 U8_APPEND_UNSAFE(
buffer, buffer_len,
cp);
96 if (convert_cp(&
cp, string_codepoint, int_codepoint) ==
FAILURE) {
116 if (convert_cp(&
cp, string_codepoint, int_codepoint) ==
FAILURE) {
132 RETURN_LONG(u_getIntPropertyMinValue((UProperty)prop));
144 RETURN_LONG(u_getIntPropertyMaxValue((UProperty)prop));
166 UChar32
start, UChar32 limit, UCharCategory
type) {
197 u_enumCharTypes((UCharEnumTypeRange*)enumCharType_callback, &
context);
219 zend_long nameChoice = U_UNICODE_CHAR_NAME;
229 if (convert_cp(&
cp, string_codepoint, int_codepoint) ==
FAILURE) {
233 buffer_len = u_charName(
cp, (UCharNameChoice)nameChoice,
NULL, 0, &
error);
234 buffer = zend_string_alloc(buffer_len, 0);
237 if (U_FAILURE(
error)) {
238 zend_string_efree(
buffer);
249 zend_long nameChoice = U_UNICODE_CHAR_NAME;
259 ret = u_charFromName((UCharNameChoice)nameChoice,
name, &
error);
271 UChar32 code, UCharNameChoice nameChoice,
272 const char *
name, int32_t length) {
289 zval_ptr_dtor_str(&
args[2]);
293 zval_ptr_dtor_str(&
args[2]);
297 UChar32
start, limit;
301 zend_long nameChoice = U_UNICODE_CHAR_NAME;
313 if (convert_cp(&
start, string_start, int_start) ==
FAILURE || convert_cp(&limit, string_limit, int_limit) ==
FAILURE) {
317 u_enumCharNames(
start, limit, (UEnumCharNamesFn*)enumCharNames_callback, &
context, nameChoice, &
error);
326 zend_long nameChoice = U_LONG_PROPERTY_NAME;
335 ret = u_getPropertyName((UProperty)
property, (UPropertyNameChoice)nameChoice);
371 ret = u_getPropertyValueName((UProperty)
property,
value, (UPropertyNameChoice)nameChoice);
410 if (convert_cp(&
cp, string_codepoint, int_codepoint) ==
FAILURE) {
415 if (string_codepoint !=
NULL) {
418 U8_APPEND_UNSAFE(
buffer, buffer_len,
ret);
441 if (convert_cp(&
cp, string_codepoint, int_codepoint) ==
FAILURE) {
445 ret = u_digit(
cp, radix);
472 UVersionInfo version;
479 u_charAge(
cp, version);
481 for(i = 0; i < U_MAX_VERSION_LENGTH; ++i) {
489 UVersionInfo version;
494 u_getUnicodeVersion(version);
496 for(i = 0; i < U_MAX_VERSION_LENGTH; ++i) {
514 closure_len = u_getFC_NFKC_Closure(
cp,
NULL, 0, &
error);
515 if (closure_len == 0) {
518 closure =
safe_emalloc(
sizeof(UChar), closure_len + 1, 0);
520 closure_len = u_getFC_NFKC_Closure(
cp, closure, closure_len, &
error);
521 if (U_FAILURE(
error)) {
535#define IC_BOOL_METHOD_CHAR(name) \
538 if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) { \
541 RETURN_BOOL(u_##name(cp)); \
571#undef IC_BOOL_METHOD_CHAR
575#define IC_INT_METHOD_CHAR(name) \
578 if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) { \
581 RETURN_LONG(u_##name(cp)); \
587#undef IC_INT_METHOD_CHAR
593#define IC_CHAR_METHOD_CHAR(name) \
596 zend_string *string_codepoint; \
597 zend_long int_codepoint = -1; \
598 ZEND_PARSE_PARAMETERS_START(1, 1) \
599 Z_PARAM_STR_OR_LONG(string_codepoint, int_codepoint) \
600 ZEND_PARSE_PARAMETERS_END(); \
601 if (convert_cp(&cp, string_codepoint, int_codepoint) == FAILURE) { \
604 ret = u_##name(cp); \
605 if (string_codepoint != NULL) { \
607 int buffer_len = 0; \
608 U8_APPEND_UNSAFE(buffer, buffer_len, ret); \
609 buffer[buffer_len] = 0; \
610 RETURN_STRINGL(buffer, buffer_len); \
619#if U_ICU_VERSION_MAJOR_NUM >= 52
622#undef IC_CHAR_METHOD_CHAR
626 register_class_IntlChar();
const U_INTERNAL_PROGRAM_ERROR
const U_ILLEGAL_ARGUMENT_ERROR
zend_string * intl_convert_utf16_to_utf8(const UChar *src, int32_t src_len, UErrorCode *status)
#define INTL_CHECK_STATUS(err, msg)
#define INTL_CHECK_STATUS_OR_NULL(err, msg)
void intl_errors_set_custom_msg(intl_error *err, const char *msg, int copyMsg)
void intl_error_set_code(intl_error *err, UErrorCode err_code)
void intl_error_set_custom_msg(intl_error *err, const char *msg, int copyMsg)
PHP_JSON_API size_t int options
zend_fcall_info_cache fci_cache
zend_fcall_info_cache fci_cache
#define IC_INT_METHOD_CHAR(name)
int php_uchar_minit(INIT_FUNC_ARGS)
struct _enumCharNames_data enumCharNames_data
struct _enumCharType_data enumCharType_data
#define IC_BOOL_METHOD_CHAR(name)
#define IC_CHAR_METHOD_CHAR(name)
#define INTERNAL_FUNCTION_PARAMETERS
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
ZEND_API zend_result add_next_index_long(zval *arg, zend_long n)
#define Z_PARAM_FUNC(dest_fci, dest_fcc)
struct _zend_fcall_info_cache zend_fcall_info_cache
#define RETURN_STRINGL(s, l)
#define ZEND_PARSE_PARAMETERS_END()
#define ZEND_PARSE_PARAMETERS_NONE()
#define RETVAL_NEW_STR(s)
#define Z_PARAM_STRING(dest, dest_len)
#define ZEND_PARSE_PARAMETERS_END_EX(failure)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_LONG(dest)
#define RETURN_NEW_STR(s)
struct _zend_fcall_info zend_fcall_info
#define Z_PARAM_STR_OR_LONG(dest_str, dest_long)
#define RETURN_EMPTY_STRING()
#define ZVAL_STRINGL(z, s, l)
ZEND_API zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
#define safe_emalloc(nmemb, size, offset)
struct _zend_string zend_string
#define zend_never_inline
#define ZEND_SIZE_T_INT_OVFL(size)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)