Merge pull request #579 from arvidn/fix-warnings-1.1

fix some clang build warnings
This commit is contained in:
Arvid Norberg 2016-04-02 17:07:52 -04:00
commit 0020900a58
3 changed files with 261 additions and 259 deletions

View File

@ -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; }

View File

@ -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.
--------------------------------------------------------------------- */ --------------------------------------------------------------------- */

View File

@ -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
{ {