Merge pull request #579 from arvidn/fix-warnings-1.1
fix some clang build warnings
This commit is contained in:
commit
0020900a58
|
@ -299,62 +299,62 @@ namespace libtorrent
|
||||||
|
|
||||||
void async_read(piece_manager* storage, peer_request const& r
|
void async_read(piece_manager* storage, peer_request const& r
|
||||||
, boost::function<void(disk_io_job const*)> const& handler, void* requester
|
, boost::function<void(disk_io_job const*)> const& handler, void* requester
|
||||||
, int flags = 0);
|
, int flags = 0) TORRENT_OVERRIDE;
|
||||||
void async_write(piece_manager* storage, peer_request const& r
|
void async_write(piece_manager* storage, peer_request const& r
|
||||||
, disk_buffer_holder& buffer
|
, disk_buffer_holder& buffer
|
||||||
, boost::function<void(disk_io_job const*)> const& handler
|
, boost::function<void(disk_io_job const*)> const& handler
|
||||||
, int flags = 0);
|
, int flags = 0) TORRENT_OVERRIDE;
|
||||||
void async_hash(piece_manager* storage, int piece, int flags
|
void async_hash(piece_manager* storage, int piece, int flags
|
||||||
, boost::function<void(disk_io_job const*)> const& handler, void* requester);
|
, boost::function<void(disk_io_job const*)> const& handler, void* requester) TORRENT_OVERRIDE;
|
||||||
void async_move_storage(piece_manager* storage, std::string const& p, int flags
|
void async_move_storage(piece_manager* storage, std::string const& p, int flags
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
void async_release_files(piece_manager* storage
|
void async_release_files(piece_manager* storage
|
||||||
, boost::function<void(disk_io_job const*)> const& handler
|
, boost::function<void(disk_io_job const*)> const& handler
|
||||||
= boost::function<void(disk_io_job const*)>());
|
= boost::function<void(disk_io_job const*)>()) TORRENT_OVERRIDE;
|
||||||
void async_delete_files(piece_manager* storage, int options
|
void async_delete_files(piece_manager* storage, int options
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
void async_check_fastresume(piece_manager* storage
|
void async_check_fastresume(piece_manager* storage
|
||||||
, bdecode_node const* resume_data
|
, bdecode_node const* resume_data
|
||||||
, std::vector<std::string>& links
|
, std::vector<std::string>& links
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
void async_save_resume_data(piece_manager* storage
|
void async_save_resume_data(piece_manager* storage
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
void async_rename_file(piece_manager* storage, int index, std::string const& name
|
void async_rename_file(piece_manager* storage, int index, std::string const& name
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
void async_stop_torrent(piece_manager* storage
|
void async_stop_torrent(piece_manager* storage
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
#ifndef TORRENT_NO_DEPRECATE
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
void async_cache_piece(piece_manager* storage, int piece
|
void async_cache_piece(piece_manager* storage, int piece
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
void async_finalize_file(piece_manager* storage, int file
|
void async_finalize_file(piece_manager* storage, int file
|
||||||
, boost::function<void(disk_io_job const*)> const& handler
|
, boost::function<void(disk_io_job const*)> const& handler
|
||||||
= boost::function<void(disk_io_job const*)>());
|
= boost::function<void(disk_io_job const*)>()) TORRENT_OVERRIDE;
|
||||||
#endif
|
#endif
|
||||||
void async_flush_piece(piece_manager* storage, int piece
|
void async_flush_piece(piece_manager* storage, int piece
|
||||||
, boost::function<void(disk_io_job const*)> const& handler
|
, boost::function<void(disk_io_job const*)> const& handler
|
||||||
= boost::function<void(disk_io_job const*)>());
|
= boost::function<void(disk_io_job const*)>()) TORRENT_OVERRIDE;
|
||||||
void async_set_file_priority(piece_manager* storage
|
void async_set_file_priority(piece_manager* storage
|
||||||
, std::vector<boost::uint8_t> const& prio
|
, std::vector<boost::uint8_t> const& prio
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
void async_load_torrent(add_torrent_params* params
|
void async_load_torrent(add_torrent_params* params
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
void async_tick_torrent(piece_manager* storage
|
void async_tick_torrent(piece_manager* storage
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
|
|
||||||
void clear_read_cache(piece_manager* storage);
|
void clear_read_cache(piece_manager* storage) TORRENT_OVERRIDE;
|
||||||
void async_clear_piece(piece_manager* storage, int index
|
void async_clear_piece(piece_manager* storage, int index
|
||||||
, boost::function<void(disk_io_job const*)> const& handler);
|
, boost::function<void(disk_io_job const*)> const& handler) TORRENT_OVERRIDE;
|
||||||
// this is not asynchronous and requires that the piece does not
|
// this is not asynchronous and requires that the piece does not
|
||||||
// have any pending buffers. It's meant to be used for pieces that
|
// have any pending buffers. It's meant to be used for pieces that
|
||||||
// were just read and hashed and failed the hash check.
|
// were just read and hashed and failed the hash check.
|
||||||
// there should be no read-operations left, and all buffers should
|
// there should be no read-operations left, and all buffers should
|
||||||
// be discardable
|
// be discardable
|
||||||
void clear_piece(piece_manager* storage, int index);
|
void clear_piece(piece_manager* storage, int index) TORRENT_OVERRIDE;
|
||||||
|
|
||||||
// implements buffer_allocator_interface
|
// implements buffer_allocator_interface
|
||||||
void reclaim_block(block_cache_reference ref);
|
void reclaim_block(block_cache_reference ref) TORRENT_OVERRIDE;
|
||||||
void free_disk_buffer(char* buf) { m_disk_cache.free_buffer(buf); }
|
void free_disk_buffer(char* buf) TORRENT_OVERRIDE { m_disk_cache.free_buffer(buf); }
|
||||||
char* allocate_disk_buffer(char const* category)
|
char* allocate_disk_buffer(char const* category) TORRENT_OVERRIDE
|
||||||
{
|
{
|
||||||
bool exceed = false;
|
bool exceed = false;
|
||||||
return allocate_disk_buffer(exceed, boost::shared_ptr<disk_observer>(), category);
|
return allocate_disk_buffer(exceed, boost::shared_ptr<disk_observer>(), category);
|
||||||
|
@ -367,9 +367,9 @@ namespace libtorrent
|
||||||
bool exceeded_cache_use() const
|
bool exceeded_cache_use() const
|
||||||
{ return m_disk_cache.exceeded_max_size(); }
|
{ return m_disk_cache.exceeded_max_size(); }
|
||||||
|
|
||||||
void update_stats_counters(counters& c) const;
|
void update_stats_counters(counters& c) const TORRENT_OVERRIDE;
|
||||||
void get_cache_info(cache_status* ret, bool no_pieces = true
|
void get_cache_info(cache_status* ret, bool no_pieces = true
|
||||||
, piece_manager const* storage = 0) const;
|
, piece_manager const* storage = 0) const TORRENT_OVERRIDE;
|
||||||
|
|
||||||
// this submits all queued up jobs to the thread
|
// this submits all queued up jobs to the thread
|
||||||
void submit_jobs();
|
void submit_jobs();
|
||||||
|
@ -377,7 +377,8 @@ namespace libtorrent
|
||||||
block_cache* cache() { return &m_disk_cache; }
|
block_cache* cache() { return &m_disk_cache; }
|
||||||
|
|
||||||
#if TORRENT_USE_ASSERTS
|
#if TORRENT_USE_ASSERTS
|
||||||
bool is_disk_buffer(char* buffer) const { return m_disk_cache.is_disk_buffer(buffer); }
|
bool is_disk_buffer(char* buffer) const TORRENT_OVERRIDE
|
||||||
|
{ return m_disk_cache.is_disk_buffer(buffer); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum thread_type_t {
|
enum thread_type_t {
|
||||||
|
@ -388,7 +389,7 @@ namespace libtorrent
|
||||||
void thread_fun(int thread_id, thread_type_t type
|
void thread_fun(int thread_id, thread_type_t type
|
||||||
, boost::shared_ptr<io_service::work> w);
|
, boost::shared_ptr<io_service::work> w);
|
||||||
|
|
||||||
file_pool& files() { return m_file_pool; }
|
virtual file_pool& files() TORRENT_OVERRIDE { return m_file_pool; }
|
||||||
|
|
||||||
io_service& get_io_service() { return m_ios; }
|
io_service& get_io_service() { return m_ios; }
|
||||||
|
|
||||||
|
|
|
@ -26,10 +26,10 @@
|
||||||
Author: Mark E. Davis, 1994.
|
Author: Mark E. Davis, 1994.
|
||||||
Rev History: Rick McGowan, fixes & updates May 2001.
|
Rev History: Rick McGowan, fixes & updates May 2001.
|
||||||
Sept 2001: fixed const & error conditions per
|
Sept 2001: fixed const & error conditions per
|
||||||
mods suggested by S. Parent & A. Lillich.
|
mods suggested by S. Parent & A. Lillich.
|
||||||
June 2002: Tim Dodd added detection and handling of incomplete
|
June 2002: Tim Dodd added detection and handling of incomplete
|
||||||
source sequences, enhanced error detection, added casts
|
source sequences, enhanced error detection, added casts
|
||||||
to eliminate compiler warnings.
|
to eliminate compiler warnings.
|
||||||
July 2003: slight mods to back out aggressive FFFE detection.
|
July 2003: slight mods to back out aggressive FFFE detection.
|
||||||
Jan 2004: updated switches in from-UTF8 conversions.
|
Jan 2004: updated switches in from-UTF8 conversions.
|
||||||
Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.
|
Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.
|
||||||
|
@ -55,56 +55,54 @@ static const UTF32 halfMask = 0x3FFUL;
|
||||||
#define UNI_SUR_HIGH_END (UTF32)0xDBFF
|
#define UNI_SUR_HIGH_END (UTF32)0xDBFF
|
||||||
#define UNI_SUR_LOW_START (UTF32)0xDC00
|
#define UNI_SUR_LOW_START (UTF32)0xDC00
|
||||||
#define UNI_SUR_LOW_END (UTF32)0xDFFF
|
#define UNI_SUR_LOW_END (UTF32)0xDFFF
|
||||||
#define false 0
|
|
||||||
#define true 1
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
ConversionResult ConvertUTF32toUTF16 (
|
ConversionResult ConvertUTF32toUTF16 (
|
||||||
const UTF32** sourceStart, const UTF32* sourceEnd,
|
const UTF32** sourceStart, const UTF32* sourceEnd,
|
||||||
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
|
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
|
||||||
ConversionResult result = conversionOK;
|
ConversionResult result = conversionOK;
|
||||||
const UTF32* source = *sourceStart;
|
const UTF32* source = *sourceStart;
|
||||||
UTF16* target = *targetStart;
|
UTF16* target = *targetStart;
|
||||||
while (source < sourceEnd) {
|
while (source < sourceEnd) {
|
||||||
UTF32 ch;
|
UTF32 ch;
|
||||||
if (target >= targetEnd) {
|
if (target >= targetEnd) {
|
||||||
result = targetExhausted; break;
|
result = targetExhausted; break;
|
||||||
}
|
}
|
||||||
ch = *source++;
|
ch = *source++;
|
||||||
if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
|
if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */
|
/* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
||||||
if (flags == strictConversion) {
|
if (flags == strictConversion) {
|
||||||
--source; /* return to the illegal value itself */
|
--source; /* return to the illegal value itself */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*target++ = (UTF16)ch; /* normal case */
|
*target++ = (UTF16)ch; /* normal case */
|
||||||
}
|
}
|
||||||
} else if (ch > UNI_MAX_LEGAL_UTF32) {
|
} else if (ch > UNI_MAX_LEGAL_UTF32) {
|
||||||
if (flags == strictConversion) {
|
if (flags == strictConversion) {
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
} else {
|
} else {
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* target is a character in range 0xFFFF - 0x10FFFF. */
|
/* target is a character in range 0xFFFF - 0x10FFFF. */
|
||||||
if (target + 1 >= targetEnd) {
|
if (target + 1 >= targetEnd) {
|
||||||
--source; /* Back up source pointer! */
|
--source; /* Back up source pointer! */
|
||||||
result = targetExhausted; break;
|
result = targetExhausted; break;
|
||||||
}
|
}
|
||||||
ch -= halfBase;
|
ch -= halfBase;
|
||||||
*target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
|
*target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
|
||||||
*target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
|
*target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*sourceStart = source;
|
*sourceStart = source;
|
||||||
*targetStart = target;
|
*targetStart = target;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
@ -112,56 +110,56 @@ ConversionResult ConvertUTF32toUTF16 (
|
||||||
ConversionResult ConvertUTF16toUTF32 (
|
ConversionResult ConvertUTF16toUTF32 (
|
||||||
const UTF16** sourceStart, const UTF16* sourceEnd,
|
const UTF16** sourceStart, const UTF16* sourceEnd,
|
||||||
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
|
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
|
||||||
ConversionResult result = conversionOK;
|
ConversionResult result = conversionOK;
|
||||||
const UTF16* source = *sourceStart;
|
const UTF16* source = *sourceStart;
|
||||||
UTF32* target = *targetStart;
|
UTF32* target = *targetStart;
|
||||||
UTF32 ch, ch2;
|
UTF32 ch, ch2;
|
||||||
while (source < sourceEnd) {
|
while (source < sourceEnd) {
|
||||||
const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */
|
const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */
|
||||||
ch = *source++;
|
ch = *source++;
|
||||||
/* If we have a surrogate pair, convert to UTF32 first. */
|
/* If we have a surrogate pair, convert to UTF32 first. */
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
|
||||||
/* If the 16 bits following the high surrogate are in the source buffer... */
|
/* If the 16 bits following the high surrogate are in the source buffer... */
|
||||||
if (source < sourceEnd) {
|
if (source < sourceEnd) {
|
||||||
ch2 = *source;
|
ch2 = *source;
|
||||||
/* If it's a low surrogate, convert to UTF32. */
|
/* If it's a low surrogate, convert to UTF32. */
|
||||||
if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
|
if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
|
||||||
ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
|
ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
|
||||||
+ (ch2 - UNI_SUR_LOW_START) + halfBase;
|
+ (ch2 - UNI_SUR_LOW_START) + halfBase;
|
||||||
++source;
|
++source;
|
||||||
} else if (flags == strictConversion) { /* it's an unpaired high surrogate */
|
} else if (flags == strictConversion) { /* it's an unpaired high surrogate */
|
||||||
--source; /* return to the illegal value itself */
|
--source; /* return to the illegal value itself */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { /* We don't have the 16 bits following the high surrogate. */
|
} else { /* We don't have the 16 bits following the high surrogate. */
|
||||||
--source; /* return to the high surrogate */
|
--source; /* return to the high surrogate */
|
||||||
result = sourceExhausted;
|
result = sourceExhausted;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (flags == strictConversion) {
|
} else if (flags == strictConversion) {
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32 */
|
/* UTF-16 surrogate values are illegal in UTF-32 */
|
||||||
if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
|
if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
|
||||||
--source; /* return to the illegal value itself */
|
--source; /* return to the illegal value itself */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (target >= targetEnd) {
|
if (target >= targetEnd) {
|
||||||
source = oldSource; /* Back up source pointer! */
|
source = oldSource; /* Back up source pointer! */
|
||||||
result = targetExhausted; break;
|
result = targetExhausted; break;
|
||||||
}
|
}
|
||||||
*target++ = ch;
|
*target++ = ch;
|
||||||
}
|
}
|
||||||
*sourceStart = source;
|
*sourceStart = source;
|
||||||
*targetStart = target;
|
*targetStart = target;
|
||||||
#ifdef CVTUTF_DEBUG
|
#ifdef CVTUTF_DEBUG
|
||||||
if (result == sourceIllegal) {
|
if (result == sourceIllegal) {
|
||||||
fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2);
|
fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
@ -174,14 +172,14 @@ if (result == sourceIllegal) {
|
||||||
* allowed in earlier algorithms.
|
* allowed in earlier algorithms.
|
||||||
*/
|
*/
|
||||||
static const char trailingBytesForUTF8[256] = {
|
static const char trailingBytesForUTF8[256] = {
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
|
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -190,7 +188,7 @@ static const char trailingBytesForUTF8[256] = {
|
||||||
* in a UTF-8 sequence.
|
* in a UTF-8 sequence.
|
||||||
*/
|
*/
|
||||||
static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
|
static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
|
||||||
0x03C82080UL, 0xFA082080UL, 0x82082080UL };
|
0x03C82080UL, 0xFA082080UL, 0x82082080UL };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Once the bits are split out into bytes of UTF-8, this is a mask OR-ed
|
* Once the bits are split out into bytes of UTF-8, this is a mask OR-ed
|
||||||
|
@ -216,10 +214,10 @@ static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
|
||||||
ConversionResult ConvertUTF16toUTF8 (
|
ConversionResult ConvertUTF16toUTF8 (
|
||||||
const UTF16** sourceStart, const UTF16* sourceEnd,
|
const UTF16** sourceStart, const UTF16* sourceEnd,
|
||||||
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
|
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
|
||||||
ConversionResult result = conversionOK;
|
ConversionResult result = conversionOK;
|
||||||
const UTF16* source = *sourceStart;
|
const UTF16* source = *sourceStart;
|
||||||
UTF8* target = *targetStart;
|
UTF8* target = *targetStart;
|
||||||
while (source < sourceEnd) {
|
while (source < sourceEnd) {
|
||||||
UTF32 ch;
|
UTF32 ch;
|
||||||
unsigned short bytesToWrite = 0;
|
unsigned short bytesToWrite = 0;
|
||||||
const UTF32 byteMask = 0xBF;
|
const UTF32 byteMask = 0xBF;
|
||||||
|
@ -228,57 +226,57 @@ ConversionResult ConvertUTF16toUTF8 (
|
||||||
ch = *source++;
|
ch = *source++;
|
||||||
/* If we have a surrogate pair, convert to UTF32 first. */
|
/* If we have a surrogate pair, convert to UTF32 first. */
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
|
||||||
/* If the 16 bits following the high surrogate are in the source buffer... */
|
/* If the 16 bits following the high surrogate are in the source buffer... */
|
||||||
if (source < sourceEnd) {
|
if (source < sourceEnd) {
|
||||||
UTF32 ch2 = *source;
|
UTF32 ch2 = *source;
|
||||||
/* If it's a low surrogate, convert to UTF32. */
|
/* If it's a low surrogate, convert to UTF32. */
|
||||||
if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
|
if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
|
||||||
ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
|
ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
|
||||||
+ (ch2 - UNI_SUR_LOW_START) + halfBase;
|
+ (ch2 - UNI_SUR_LOW_START) + halfBase;
|
||||||
++source;
|
++source;
|
||||||
} else if (flags == strictConversion) { /* it's an unpaired high surrogate */
|
} else if (flags == strictConversion) { /* it's an unpaired high surrogate */
|
||||||
--source; /* return to the illegal value itself */
|
--source; /* return to the illegal value itself */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else { /* We don't have the 16 bits following the high surrogate. */
|
} else { /* We don't have the 16 bits following the high surrogate. */
|
||||||
--source; /* return to the high surrogate */
|
--source; /* return to the high surrogate */
|
||||||
result = sourceExhausted;
|
result = sourceExhausted;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (flags == strictConversion) {
|
} else if (flags == strictConversion) {
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32 */
|
/* UTF-16 surrogate values are illegal in UTF-32 */
|
||||||
if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
|
if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
|
||||||
--source; /* return to the illegal value itself */
|
--source; /* return to the illegal value itself */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Figure out how many bytes the result will require */
|
/* Figure out how many bytes the result will require */
|
||||||
if (ch < (UTF32)0x80) { bytesToWrite = 1;
|
if (ch < (UTF32)0x80) { bytesToWrite = 1;
|
||||||
} else if (ch < (UTF32)0x800) { bytesToWrite = 2;
|
} else if (ch < (UTF32)0x800) { bytesToWrite = 2;
|
||||||
} else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
|
} else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
|
||||||
} else if (ch < (UTF32)0x110000) { bytesToWrite = 4;
|
} else if (ch < (UTF32)0x110000) { bytesToWrite = 4;
|
||||||
} else { bytesToWrite = 3;
|
} else { bytesToWrite = 3;
|
||||||
ch = UNI_REPLACEMENT_CHAR;
|
ch = UNI_REPLACEMENT_CHAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
target += bytesToWrite;
|
target += bytesToWrite;
|
||||||
if (target > targetEnd) {
|
if (target > targetEnd) {
|
||||||
source = oldSource; /* Back up source pointer! */
|
source = oldSource; /* Back up source pointer! */
|
||||||
target -= bytesToWrite; result = targetExhausted; break;
|
target -= bytesToWrite; result = targetExhausted; break;
|
||||||
}
|
}
|
||||||
switch (bytesToWrite) { /* note: everything falls through. */
|
switch (bytesToWrite) { /* note: everything falls through. */
|
||||||
case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]);
|
case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]);
|
||||||
}
|
}
|
||||||
target += bytesToWrite;
|
target += bytesToWrite;
|
||||||
}
|
}
|
||||||
*sourceStart = source;
|
*sourceStart = source;
|
||||||
*targetStart = target;
|
*targetStart = target;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
@ -295,28 +293,28 @@ ConversionResult ConvertUTF16toUTF8 (
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static Boolean isLegalUTF8(const UTF8 *source, int length) {
|
static Boolean isLegalUTF8(const UTF8 *source, int length) {
|
||||||
UTF8 a;
|
UTF8 a;
|
||||||
const UTF8 *srcptr = source+length;
|
const UTF8 *srcptr = source+length;
|
||||||
switch (length) {
|
switch (length) {
|
||||||
default: return false;
|
default: return false;
|
||||||
/* Everything else falls through when "true"... */
|
/* Everything else falls through when "true"... */
|
||||||
case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
|
case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
|
||||||
case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
|
case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
|
||||||
case 2: if ((a = (*--srcptr)) > 0xBF) return false;
|
case 2: if ((a = (*--srcptr)) > 0xBF) return false;
|
||||||
|
|
||||||
switch (*source) {
|
switch (*source) {
|
||||||
/* no fall-through in this inner switch */
|
/* no fall-through in this inner switch */
|
||||||
case 0xE0: if (a < 0xA0) return false; break;
|
case 0xE0: if (a < 0xA0) return false; break;
|
||||||
case 0xED: if (a > 0x9F) return false; break;
|
case 0xED: if (a > 0x9F) return false; break;
|
||||||
case 0xF0: if (a < 0x90) return false; break;
|
case 0xF0: if (a < 0x90) return false; break;
|
||||||
case 0xF4: if (a > 0x8F) return false; break;
|
case 0xF4: if (a > 0x8F) return false; break;
|
||||||
default: if (a < 0x80) return false;
|
default: if (a < 0x80) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 1: if (*source >= 0x80 && *source < 0xC2) return false;
|
case 1: if (*source >= 0x80 && *source < 0xC2) return false;
|
||||||
}
|
}
|
||||||
if (*source > 0xF4) return false;
|
if (*source > 0xF4) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
@ -326,11 +324,11 @@ static Boolean isLegalUTF8(const UTF8 *source, int length) {
|
||||||
* This is not used here; it's just exported.
|
* This is not used here; it's just exported.
|
||||||
*/
|
*/
|
||||||
Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {
|
Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {
|
||||||
int length = trailingBytesForUTF8[*source]+1;
|
int length = trailingBytesForUTF8[*source]+1;
|
||||||
if (source+length > sourceEnd) {
|
if (source+length > sourceEnd) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return isLegalUTF8(source, length);
|
return isLegalUTF8(source, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
@ -338,72 +336,72 @@ Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {
|
||||||
ConversionResult ConvertUTF8toUTF16 (
|
ConversionResult ConvertUTF8toUTF16 (
|
||||||
const UTF8** sourceStart, const UTF8* sourceEnd,
|
const UTF8** sourceStart, const UTF8* sourceEnd,
|
||||||
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
|
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
|
||||||
ConversionResult result = conversionOK;
|
ConversionResult result = conversionOK;
|
||||||
const UTF8* source = *sourceStart;
|
const UTF8* source = *sourceStart;
|
||||||
UTF16* target = *targetStart;
|
UTF16* target = *targetStart;
|
||||||
while (source < sourceEnd) {
|
while (source < sourceEnd) {
|
||||||
UTF32 ch = 0;
|
UTF32 ch = 0;
|
||||||
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
||||||
if (source + extraBytesToRead >= sourceEnd) {
|
if (source + extraBytesToRead >= sourceEnd) {
|
||||||
result = sourceExhausted; break;
|
result = sourceExhausted; break;
|
||||||
}
|
}
|
||||||
/* Do this check whether lenient or strict */
|
/* Do this check whether lenient or strict */
|
||||||
if (! isLegalUTF8(source, extraBytesToRead+1)) {
|
if (! isLegalUTF8(source, extraBytesToRead+1)) {
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* The cases all fall through. See "Note A" below.
|
* The cases all fall through. See "Note A" below.
|
||||||
*/
|
*/
|
||||||
switch (extraBytesToRead) {
|
switch (extraBytesToRead) {
|
||||||
case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
|
case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
|
||||||
case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
|
case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
|
||||||
case 3: ch += *source++; ch <<= 6;
|
case 3: ch += *source++; ch <<= 6;
|
||||||
case 2: ch += *source++; ch <<= 6;
|
case 2: ch += *source++; ch <<= 6;
|
||||||
case 1: ch += *source++; ch <<= 6;
|
case 1: ch += *source++; ch <<= 6;
|
||||||
case 0: ch += *source++;
|
case 0: ch += *source++;
|
||||||
}
|
}
|
||||||
ch -= offsetsFromUTF8[extraBytesToRead];
|
ch -= offsetsFromUTF8[extraBytesToRead];
|
||||||
|
|
||||||
if (target >= targetEnd) {
|
if (target >= targetEnd) {
|
||||||
source -= (extraBytesToRead+1); /* Back up source pointer! */
|
source -= (extraBytesToRead+1); /* Back up source pointer! */
|
||||||
result = targetExhausted; break;
|
result = targetExhausted; break;
|
||||||
}
|
}
|
||||||
if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
|
if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32 */
|
/* UTF-16 surrogate values are illegal in UTF-32 */
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
||||||
if (flags == strictConversion) {
|
if (flags == strictConversion) {
|
||||||
source -= (extraBytesToRead+1); /* return to the illegal value itself */
|
source -= (extraBytesToRead+1); /* return to the illegal value itself */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*target++ = (UTF16)ch; /* normal case */
|
*target++ = (UTF16)ch; /* normal case */
|
||||||
}
|
}
|
||||||
} else if (ch > UNI_MAX_UTF16) {
|
} else if (ch > UNI_MAX_UTF16) {
|
||||||
if (flags == strictConversion) {
|
if (flags == strictConversion) {
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
source -= (extraBytesToRead+1); /* return to the start */
|
source -= (extraBytesToRead+1); /* return to the start */
|
||||||
break; /* Bail out; shouldn't continue */
|
break; /* Bail out; shouldn't continue */
|
||||||
} else {
|
} else {
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* target is a character in range 0xFFFF - 0x10FFFF. */
|
/* target is a character in range 0xFFFF - 0x10FFFF. */
|
||||||
if (target + 1 >= targetEnd) {
|
if (target + 1 >= targetEnd) {
|
||||||
source -= (extraBytesToRead+1); /* Back up source pointer! */
|
source -= (extraBytesToRead+1); /* Back up source pointer! */
|
||||||
result = targetExhausted; break;
|
result = targetExhausted; break;
|
||||||
}
|
}
|
||||||
ch -= halfBase;
|
ch -= halfBase;
|
||||||
*target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
|
*target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
|
||||||
*target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
|
*target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*sourceStart = source;
|
*sourceStart = source;
|
||||||
*targetStart = target;
|
*targetStart = target;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
@ -411,52 +409,52 @@ ConversionResult ConvertUTF8toUTF16 (
|
||||||
ConversionResult ConvertUTF32toUTF8 (
|
ConversionResult ConvertUTF32toUTF8 (
|
||||||
const UTF32** sourceStart, const UTF32* sourceEnd,
|
const UTF32** sourceStart, const UTF32* sourceEnd,
|
||||||
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
|
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
|
||||||
ConversionResult result = conversionOK;
|
ConversionResult result = conversionOK;
|
||||||
const UTF32* source = *sourceStart;
|
const UTF32* source = *sourceStart;
|
||||||
UTF8* target = *targetStart;
|
UTF8* target = *targetStart;
|
||||||
while (source < sourceEnd) {
|
while (source < sourceEnd) {
|
||||||
UTF32 ch;
|
UTF32 ch;
|
||||||
unsigned short bytesToWrite = 0;
|
unsigned short bytesToWrite = 0;
|
||||||
const UTF32 byteMask = 0xBF;
|
const UTF32 byteMask = 0xBF;
|
||||||
const UTF32 byteMark = 0x80;
|
const UTF32 byteMark = 0x80;
|
||||||
ch = *source++;
|
ch = *source++;
|
||||||
if (flags == strictConversion ) {
|
if (flags == strictConversion ) {
|
||||||
/* UTF-16 surrogate values are illegal in UTF-32 */
|
/* UTF-16 surrogate values are illegal in UTF-32 */
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
||||||
--source; /* return to the illegal value itself */
|
--source; /* return to the illegal value itself */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Figure out how many bytes the result will require. Turn any
|
* Figure out how many bytes the result will require. Turn any
|
||||||
* illegally large UTF32 things (> Plane 17) into replacement chars.
|
* illegally large UTF32 things (> Plane 17) into replacement chars.
|
||||||
*/
|
*/
|
||||||
if (ch < (UTF32)0x80) { bytesToWrite = 1;
|
if (ch < (UTF32)0x80) { bytesToWrite = 1;
|
||||||
} else if (ch < (UTF32)0x800) { bytesToWrite = 2;
|
} else if (ch < (UTF32)0x800) { bytesToWrite = 2;
|
||||||
} else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
|
} else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
|
||||||
} else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4;
|
} else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4;
|
||||||
} else { bytesToWrite = 3;
|
} else { bytesToWrite = 3;
|
||||||
ch = UNI_REPLACEMENT_CHAR;
|
ch = UNI_REPLACEMENT_CHAR;
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
}
|
}
|
||||||
|
|
||||||
target += bytesToWrite;
|
target += bytesToWrite;
|
||||||
if (target > targetEnd) {
|
if (target > targetEnd) {
|
||||||
--source; /* Back up source pointer! */
|
--source; /* Back up source pointer! */
|
||||||
target -= bytesToWrite; result = targetExhausted; break;
|
target -= bytesToWrite; result = targetExhausted; break;
|
||||||
}
|
}
|
||||||
switch (bytesToWrite) { /* note: everything falls through. */
|
switch (bytesToWrite) { /* note: everything falls through. */
|
||||||
case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);
|
case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);
|
||||||
}
|
}
|
||||||
target += bytesToWrite;
|
target += bytesToWrite;
|
||||||
}
|
}
|
||||||
*sourceStart = source;
|
*sourceStart = source;
|
||||||
*targetStart = target;
|
*targetStart = target;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
@ -464,78 +462,78 @@ ConversionResult ConvertUTF32toUTF8 (
|
||||||
ConversionResult ConvertUTF8toUTF32 (
|
ConversionResult ConvertUTF8toUTF32 (
|
||||||
const UTF8** sourceStart, const UTF8* sourceEnd,
|
const UTF8** sourceStart, const UTF8* sourceEnd,
|
||||||
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
|
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
|
||||||
ConversionResult result = conversionOK;
|
ConversionResult result = conversionOK;
|
||||||
const UTF8* source = *sourceStart;
|
const UTF8* source = *sourceStart;
|
||||||
UTF32* target = *targetStart;
|
UTF32* target = *targetStart;
|
||||||
while (source < sourceEnd) {
|
while (source < sourceEnd) {
|
||||||
UTF32 ch = 0;
|
UTF32 ch = 0;
|
||||||
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
||||||
if (source + extraBytesToRead >= sourceEnd) {
|
if (source + extraBytesToRead >= sourceEnd) {
|
||||||
result = sourceExhausted; break;
|
result = sourceExhausted; break;
|
||||||
}
|
}
|
||||||
/* Do this check whether lenient or strict */
|
/* Do this check whether lenient or strict */
|
||||||
if (! isLegalUTF8(source, extraBytesToRead+1)) {
|
if (! isLegalUTF8(source, extraBytesToRead+1)) {
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* The cases all fall through. See "Note A" below.
|
* The cases all fall through. See "Note A" below.
|
||||||
*/
|
*/
|
||||||
switch (extraBytesToRead) {
|
switch (extraBytesToRead) {
|
||||||
case 5: ch += *source++; ch <<= 6;
|
case 5: ch += *source++; ch <<= 6;
|
||||||
case 4: ch += *source++; ch <<= 6;
|
case 4: ch += *source++; ch <<= 6;
|
||||||
case 3: ch += *source++; ch <<= 6;
|
case 3: ch += *source++; ch <<= 6;
|
||||||
case 2: ch += *source++; ch <<= 6;
|
case 2: ch += *source++; ch <<= 6;
|
||||||
case 1: ch += *source++; ch <<= 6;
|
case 1: ch += *source++; ch <<= 6;
|
||||||
case 0: ch += *source++;
|
case 0: ch += *source++;
|
||||||
}
|
}
|
||||||
ch -= offsetsFromUTF8[extraBytesToRead];
|
ch -= offsetsFromUTF8[extraBytesToRead];
|
||||||
|
|
||||||
if (target >= targetEnd) {
|
if (target >= targetEnd) {
|
||||||
source -= (extraBytesToRead+1); /* Back up the source pointer! */
|
source -= (extraBytesToRead+1); /* Back up the source pointer! */
|
||||||
result = targetExhausted; break;
|
result = targetExhausted; break;
|
||||||
}
|
}
|
||||||
if (ch <= UNI_MAX_LEGAL_UTF32) {
|
if (ch <= UNI_MAX_LEGAL_UTF32) {
|
||||||
/*
|
/*
|
||||||
* UTF-16 surrogate values are illegal in UTF-32, and anything
|
* UTF-16 surrogate values are illegal in UTF-32, and anything
|
||||||
* over Plane 17 (> 0x10FFFF) is illegal.
|
* over Plane 17 (> 0x10FFFF) is illegal.
|
||||||
*/
|
*/
|
||||||
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
||||||
if (flags == strictConversion) {
|
if (flags == strictConversion) {
|
||||||
source -= (extraBytesToRead+1); /* return to the illegal value itself */
|
source -= (extraBytesToRead+1); /* return to the illegal value itself */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*target++ = ch;
|
*target++ = ch;
|
||||||
}
|
}
|
||||||
} else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */
|
} else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */
|
||||||
result = sourceIllegal;
|
result = sourceIllegal;
|
||||||
*target++ = UNI_REPLACEMENT_CHAR;
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*sourceStart = source;
|
*sourceStart = source;
|
||||||
*targetStart = target;
|
*targetStart = target;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------
|
/* ---------------------------------------------------------------------
|
||||||
|
|
||||||
Note A.
|
Note A.
|
||||||
The fall-through switches in UTF-8 reading code save a
|
The fall-through switches in UTF-8 reading code save a
|
||||||
temp variable, some decrements & conditionals. The switches
|
temp variable, some decrements & conditionals. The switches
|
||||||
are equivalent to the following loop:
|
are equivalent to the following loop:
|
||||||
{
|
{
|
||||||
int tmpBytesToRead = extraBytesToRead+1;
|
int tmpBytesToRead = extraBytesToRead+1;
|
||||||
do {
|
do {
|
||||||
ch += *source++;
|
ch += *source++;
|
||||||
--tmpBytesToRead;
|
--tmpBytesToRead;
|
||||||
if (tmpBytesToRead) ch <<= 6;
|
if (tmpBytesToRead) ch <<= 6;
|
||||||
} while (tmpBytesToRead > 0);
|
} while (tmpBytesToRead > 0);
|
||||||
}
|
}
|
||||||
In UTF-8 writing code, the switches on "bytesToWrite" are
|
In UTF-8 writing code, the switches on "bytesToWrite" are
|
||||||
similarly unrolled loops.
|
similarly unrolled loops.
|
||||||
|
|
||||||
--------------------------------------------------------------------- */
|
--------------------------------------------------------------------- */
|
||||||
|
|
|
@ -33,7 +33,10 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/resolve_links.hpp"
|
#include "libtorrent/resolve_links.hpp"
|
||||||
|
|
||||||
#include "libtorrent/torrent_info.hpp"
|
#include "libtorrent/torrent_info.hpp"
|
||||||
|
|
||||||
|
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue