20#if U_ICU_VERSION_MAJOR_NUM < 56
21#include "unicode/unorm.h"
23#include <unicode/unorm2.h>
28#include <unicode/utf8.h>
31#if U_ICU_VERSION_MAJOR_NUM >= 56
32static const UNormalizer2 *intl_get_normalizer(
zend_long form, UErrorCode *
err)
37 return unorm2_getNFCInstance(
err);
40 return unorm2_getNFDInstance(
err);
43 return unorm2_getNFKCInstance(
err);
46 return unorm2_getNFKDInstance(
err);
48 case NORMALIZER_FORM_KC_CF:
49 return unorm2_getNFKCCasefoldInstance(
err);
57static int32_t intl_normalize(
zend_long form,
const UChar *src, int32_t src_len, UChar *dst, int32_t dst_len, UErrorCode *
err)
59 const UNormalizer2 *norm = intl_get_normalizer(form,
err);
60 if (U_FAILURE(*
err)) {
64 return unorm2_normalize(norm, src, src_len, dst, dst_len,
err);
67static UBool intl_is_normalized(
zend_long form,
const UChar *uinput, int32_t uinput_len, UErrorCode *
err)
69 const UNormalizer2 *norm = intl_get_normalizer(form,
err);
75 return unorm2_isNormalized(norm, uinput, uinput_len,
err);
88 int32_t uinput_len = 0;
89 int expansion_factor = 1;
92 UChar* uret_buf =
NULL;
103 &input, &input_len, &form ) ==
FAILURE )
108 expansion_factor = 1;
112 expansion_factor = 3;
115 expansion_factor = 3;
119#if U_ICU_VERSION_MAJOR_NUM >= 56
120 case NORMALIZER_FORM_KC_CF:
150 uret_len = uinput_len * expansion_factor;
151 uret_buf =
eumalloc( uret_len + 1 );
154#if U_ICU_VERSION_MAJOR_NUM < 56
155 size_needed = unorm_normalize( uinput, uinput_len, form, (int32_t) 0 , uret_buf, uret_len, &
status);
157 size_needed = intl_normalize(form, uinput, uinput_len, uret_buf, uret_len, &
status);
171 if ( size_needed > uret_len ) {
176 uret_buf =
eumalloc( size_needed + 1 );
177 uret_len = size_needed;
182#if U_ICU_VERSION_MAJOR_NUM < 56
183 size_needed = unorm_normalize( uinput, uinput_len, form, (int32_t) 0 , uret_buf, uret_len, &
status);
185 size_needed = intl_normalize(form, uinput, uinput_len, uret_buf, uret_len, &
status);
201 uret_len = size_needed;
209 "normalizer_normalize: error converting normalized text UTF-8", 0 );
224 size_t input_len = 0;
226 UChar* uinput =
NULL;
236 &input, &input_len, &form) ==
FAILURE )
246#if U_ICU_VERSION_MAJOR_NUM >= 56
247 case NORMALIZER_FORM_KC_CF:
278#if U_ICU_VERSION_MAJOR_NUM < 56
279 uret = unorm_isNormalizedWithOptions( uinput, uinput_len, form, (int32_t) 0 , &
status);
281 uret = intl_is_normalized(form, uinput, uinput_len, &
status);
301#if U_ICU_VERSION_MAJOR_NUM >= 56
305 size_t input_length = 0;
307 UChar32 codepoint = -1;
311 const UNormalizer2 *norm;
312 UChar decomposition[32];
313 int32_t decomposition_length;
325 norm = intl_get_normalizer(form, &
status);
327 U8_NEXT(input,
offset, input_length, codepoint);
328 if ((
size_t)
offset != input_length) {
334 if ((codepoint < UCHAR_MIN_VALUE) || (codepoint > UCHAR_MAX_VALUE)) {
340 decomposition_length = unorm2_getRawDecomposition(norm, codepoint, decomposition, 32, &
status);
341 if (decomposition_length == -1) {
const U_BUFFER_OVERFLOW_ERROR
const U_STRING_NOT_TERMINATED_WARNING
const U_ILLEGAL_ARGUMENT_ERROR
foreach($dp as $el) foreach( $dp as $el) if( $pass2< 2) echo ""
void intl_convert_utf8_to_utf16(UChar **target, int32_t *target_len, const char *src, size_t src_len, UErrorCode *status)
zend_string * intl_convert_utf16_to_utf8(const UChar *src, int32_t src_len, UErrorCode *status)
void intl_error_set(intl_error *err, UErrorCode code, const char *msg, int copyMsg)
void intl_error_reset(intl_error *err)
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)
#define NORMALIZER_FORM_C
#define NORMALIZER_FORM_D
#define NORMALIZER_DEFAULT
#define NORMALIZER_FORM_KC
#define NORMALIZER_FORM_KD
normalizer_get_raw_decomposition(string $string, int $form=Normalizer::FORM_C)
normalizer_normalize(string $string, int $form=Normalizer::FORM_C)
normalizer_is_normalized(string $string, int $form=Normalizer::FORM_C)
ZEND_API zend_result zend_parse_method_parameters(uint32_t num_args, zval *this_ptr, const char *type_spec,...)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
#define ZEND_PARSE_PARAMETERS_END()
#define RETVAL_NEW_STR(s)
#define Z_PARAM_STRING(dest, dest_len)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_LONG(dest)
struct _zend_string zend_string