22 |
#include "encoding.h" |
#include "encoding.h" |
23 |
|
|
24 |
#include <assert.h> |
#include <assert.h> |
25 |
|
#include <limits.h> |
26 |
#include <string.h> |
#include <string.h> |
27 |
|
|
28 |
#ifdef HAVE_ICONV_H |
#ifdef HAVE_ICONV_H |
61 |
#ifdef HAVE_ICONV |
#ifdef HAVE_ICONV |
62 |
|
|
63 |
#ifdef WORDS_BIGENDIAN |
#ifdef WORDS_BIGENDIAN |
64 |
#define UCS_2_INTERNAL "UCS-2BE" |
#define UTF_16_INTERNAL "UTF-16BE" |
65 |
#else |
#else |
66 |
#define UCS_2_INTERNAL "UCS-2LE" |
#define UTF_16_INTERNAL "UTF-16LE" |
67 |
#endif |
#endif |
68 |
|
|
69 |
int jscoverage_bytes_to_characters(const char * encoding, const uint8_t * bytes, size_t num_bytes, jschar ** characters, size_t * num_characters) { |
int jscoverage_bytes_to_characters(const char * encoding, const uint8_t * bytes, size_t num_bytes, jschar ** characters, size_t * num_characters) { |
70 |
assert(encoding != NULL); |
assert(encoding != NULL); |
71 |
|
|
72 |
iconv_t state = iconv_open(UCS_2_INTERNAL, encoding); |
iconv_t state = iconv_open(UTF_16_INTERNAL, encoding); |
73 |
if (state == (iconv_t) -1) { |
if (state == (iconv_t) -1) { |
74 |
return JSCOVERAGE_ERROR_ENCODING_NOT_SUPPORTED; |
return JSCOVERAGE_ERROR_ENCODING_NOT_SUPPORTED; |
75 |
} |
} |
82 |
size_t output_bytes_left = sizeof(jschar) * num_bytes; |
size_t output_bytes_left = sizeof(jschar) * num_bytes; |
83 |
|
|
84 |
size_t result = iconv(state, &input, &input_bytes_left, &output, &output_bytes_left); |
size_t result = iconv(state, &input, &input_bytes_left, &output, &output_bytes_left); |
85 |
|
iconv_close(state); |
86 |
if (result == (size_t) -1) { |
if (result == (size_t) -1) { |
87 |
free(c); |
free(c); |
88 |
return JSCOVERAGE_ERROR_INVALID_BYTE_SEQUENCE; |
return JSCOVERAGE_ERROR_INVALID_BYTE_SEQUENCE; |