/* {{{ php_converter_append_toUnicode_target */ static void php_converter_append_toUnicode_target(zval *val, UConverterToUnicodeArgs *args, php_converter_object *objval) { switch (Z_TYPE_P(val)) { case IS_NULL: /* Code unit is being skipped */ return; case IS_LONG: { zend_long lval = Z_LVAL_P(val); if ((lval < 0) || (lval > 0x10FFFF)) { php_converter_throw_failure(objval, U_ILLEGAL_ARGUMENT_ERROR, "Invalid codepoint U+%04lx", lval); return; } if (lval > 0xFFFF) { /* Supplemental planes U+010000 - U+10FFFF */ if (TARGET_CHECK(args, 2)) { /* TODO: Find the ICU call which does this properly */ *(args->target++) = (UChar)(((lval - 0x10000) >> 10) | 0xD800); *(args->target++) = (UChar)(((lval - 0x10000) & 0x3FF) | 0xDC00); } return; } /* Non-suggogate BMP codepoint */ if (TARGET_CHECK(args, 1)) { *(args->target++) = (UChar)lval; } return; } case IS_STRING: { const char *strval = Z_STRVAL_P(val); int i = 0, strlen = Z_STRLEN_P(val); while((i != strlen) && TARGET_CHECK(args, 1)) { UChar c; U8_NEXT(strval, i, strlen, c); *(args->target++) = c; } return; } case IS_ARRAY: { HashTable *ht = Z_ARRVAL_P(val); zval *tmpzval; ZEND_HASH_FOREACH_VAL(ht, tmpzval) { php_converter_append_toUnicode_target(tmpzval, args, objval); } ZEND_HASH_FOREACH_END(); return; }
void c_UConverter::appendToUTarget(Variant val, UConverterToUnicodeArgs *args) { if (val.isNull()) { // Ignore return; } if (val.isInteger()) { int64_t lval = val.toInt64(); if (lval < 0 || lval > 0x10FFFF) { THROW_UFAILURE(appendToUTarget, U_ILLEGAL_ARGUMENT_ERROR, m_error); return; } if (lval > 0xFFFF) { if (TARGET_CHECK(args, 2)) { *(args->target++) = (UChar)(((lval - 0x10000) >> 10) | 0xD800); *(args->target++) = (UChar)(((lval - 0x10000) & 0x3FF) | 0xDC00); } return; }