Changeset 3473 for trunk/libtransmission/metainfo.c
- Timestamp:
- Oct 20, 2007, 3:17:36 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/metainfo.c
r3430 r3473 56 56 benc_val_t * files, benc_val_t * length ); 57 57 58 /*** 59 **** 60 ***/ 61 62 #define WANTBYTES( want, got ) \ 63 if( (want) > (got) ) { return; } else { (got) -= (want); } 64 static void 65 strlcat_utf8( void * dest, const void * src, size_t len, char skip ) 66 { 67 char * s = dest; 68 const char * append = src; 69 const char * p; 70 71 /* don't overwrite the nul at the end */ 72 len--; 73 74 /* Go to the end of the destination string */ 75 while( s[0] ) 76 { 77 s++; 78 len--; 79 } 80 81 /* Now start appending, converting on the fly if necessary */ 82 for( p = append; p[0]; ) 83 { 84 /* skip over the requested character */ 85 if( skip == p[0] ) 86 { 87 p++; 88 continue; 89 } 90 91 if( !( p[0] & 0x80 ) ) 92 { 93 /* ASCII character */ 94 WANTBYTES( 1, len ); 95 *(s++) = *(p++); 96 continue; 97 } 98 99 if( ( p[0] & 0xE0 ) == 0xC0 && ( p[1] & 0xC0 ) == 0x80 ) 100 { 101 /* 2-bytes UTF-8 character */ 102 WANTBYTES( 2, len ); 103 *(s++) = *(p++); *(s++) = *(p++); 104 continue; 105 } 106 107 if( ( p[0] & 0xF0 ) == 0xE0 && ( p[1] & 0xC0 ) == 0x80 && 108 ( p[2] & 0xC0 ) == 0x80 ) 109 { 110 /* 3-bytes UTF-8 character */ 111 WANTBYTES( 3, len ); 112 *(s++) = *(p++); *(s++) = *(p++); 113 *(s++) = *(p++); 114 continue; 115 } 116 117 if( ( p[0] & 0xF8 ) == 0xF0 && ( p[1] & 0xC0 ) == 0x80 && 118 ( p[2] & 0xC0 ) == 0x80 && ( p[3] & 0xC0 ) == 0x80 ) 119 { 120 /* 4-bytes UTF-8 character */ 121 WANTBYTES( 4, len ); 122 *(s++) = *(p++); *(s++) = *(p++); 123 *(s++) = *(p++); *(s++) = *(p++); 124 continue; 125 } 126 127 /* ISO 8859-1 -> UTF-8 conversion */ 128 WANTBYTES( 2, len ); 129 *(s++) = 0xC0 | ( ( *p & 0xFF ) >> 6 ); 130 *(s++) = 0x80 | ( *(p++) & 0x3F ); 131 } 132 } 133 58 134 /*********************************************************************** 59 135 * tr_metainfoParse
Note: See TracChangeset
for help on using the changeset viewer.