// trace wrappers TRACE_WRAPPER char * trace_ppb_char_set_utf16_to_char_set(PP_Instance instance, const uint16_t *utf16, uint32_t utf16_len, const char *output_char_set, enum PP_CharSet_ConversionError on_error, uint32_t *output_length) { trace_info("[PPB] {full} %s instance=%d, utf16=%p, utf16_len=%u, output_char_set=%s, " "on_error=%s\n", __func__+6, instance, utf16, utf16_len, output_char_set, reverse_char_set_conversion_error(on_error)); return ppb_char_set_utf16_to_char_set(instance, utf16, utf16_len, output_char_set, on_error, output_length); }
static void test_from_utf16(void) { char *res; uint32_t res_len; printf("from utf16: all ASCII\n"); { const uint16_t in[] = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21 }; const char *out = "Hello, world!"; res_len = 7777; res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]), "cp1251", PP_CHARSET_CONVERSIONERROR_FAIL, &res_len); assert(res_len == strlen(out)); assert(memcmp(res, out, res_len) == 0); free(res); } printf("to utf16: non-ASCII all correct\n"); { const uint16_t in[] = {0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x2c, 0x20, 0x43c, 0x438, 0x440, 0x21 }; // "Привет, мир!" const char *out = "\xcf\xf0\xe8\xe2\xe5\xf2\x2c\x20\xec\xe8\xf0\x21"; // "Привет, мир!" res_len = 7777; res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]), "cp1251", PP_CHARSET_CONVERSIONERROR_FAIL, &res_len); assert(res_len == strlen(out)); assert(memcmp(res, out, res_len) == 0); free(res); } printf("to utf16: non-ASCII PP_CHARSET_CONVERSIONERROR_FAIL\n"); { const uint16_t in[] = {0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x2c, 0x20, 0x266b, 0x43c, 0x438, 0x440, 0x21 }; // "Привет, ♫мир!" // const char *out = "\xcf\xf0\xe8\xe2\xe5\xf2\x2c\x20\xec\xe8\xf0\x21"; // "Привет, мир!" res_len = 7777; res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]), "cp1251", PP_CHARSET_CONVERSIONERROR_FAIL, &res_len); assert(res_len == 0); assert(res == NULL); free(res); } printf("to utf16: non-ASCII PP_CHARSET_CONVERSIONERROR_SKIP\n"); { const uint16_t in[] = {0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x2c, 0x20, 0x266b, 0x43c, 0x438, 0x440, 0x21 }; // "Привет, ♫мир!" const char *out = "\xcf\xf0\xe8\xe2\xe5\xf2\x2c\x20\xec\xe8\xf0\x21"; // "Привет, мир!" res_len = 7777; res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]), "cp1251", PP_CHARSET_CONVERSIONERROR_SKIP, &res_len); assert(res_len == strlen(out)); assert(memcmp(res, out, res_len) == 0); free(res); } printf("to utf16: non-ASCII PP_CHARSET_CONVERSIONERROR_SUBSTITUTE\n"); { const uint16_t in[] = {0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x2c, 0x20, 0x266b, 0x43c, 0x438, 0x440, 0x21 }; // "Привет, ♫мир!" const char *out = "\xcf\xf0\xe8\xe2\xe5\xf2\x2c\x20\x3f\xec\xe8\xf0\x21";// "Привет, ?мир!" res_len = 7777; res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]), "cp1251", PP_CHARSET_CONVERSIONERROR_SUBSTITUTE, &res_len); assert(res_len == strlen(out)); assert(memcmp(res, out, res_len) == 0); free(res); } }