Fossil SCM
implement big-endian unicode decoding for commit message files
Commit
514f71a1cfdcdf439dfabdd69fd6d1500f40d509
Parent
011142060139dff…
1 file changed
+17
-3
+17
-3
| --- src/checkin.c | ||
| +++ src/checkin.c | ||
| @@ -1219,13 +1219,27 @@ | ||
| 1219 | 1219 | zUtf8 = blob_str(&comment) + 2; |
| 1220 | 1220 | zUtf8 = fossil_unicode_to_utf8(zUtf8); |
| 1221 | 1221 | blob_zero(&comment); |
| 1222 | 1222 | blob_append(&comment, zUtf8, -1); |
| 1223 | 1223 | fossil_mbcs_free(zUtf8); |
| 1224 | - }else if( blob_size(&comment)>1 | |
| 1225 | - && memcmp(blob_buffer(&comment), &urbom, 2)==0 ){ | |
| 1226 | - fossil_fatal("unicode bom (be) not (yet) implemented"); | |
| 1224 | + }else if( blob_size(&comment)>1 && (blob_size(&comment)&1)==0 | |
| 1225 | + && memcmp(blob_buffer(&comment), &urbom, 2)==0 ) { | |
| 1226 | + char *zUtf8 = blob_buffer(&comment); | |
| 1227 | + unsigned int i = blob_size(&comment); | |
| 1228 | + while( i > 0 ){ | |
| 1229 | + /* swap bytes of unicode representation */ | |
| 1230 | + char temp = zUtf8[--i]; | |
| 1231 | + zUtf8[i] = zUtf8[i-1]; | |
| 1232 | + zUtf8[--i] = temp; | |
| 1233 | + } | |
| 1234 | + /* Make sure the blob contains two terminating 0-bytes */ | |
| 1235 | + blob_append(&comment, "", 1); | |
| 1236 | + zUtf8 = blob_str(&comment) + 2; | |
| 1237 | + zUtf8 = fossil_unicode_to_utf8(zUtf8); | |
| 1238 | + blob_zero(&comment); | |
| 1239 | + blob_append(&comment, zUtf8, -1); | |
| 1240 | + fossil_mbcs_free(zUtf8); | |
| 1227 | 1241 | }else{ |
| 1228 | 1242 | char *zUtf8 = fossil_mbcs_to_utf8(blob_str(&comment)); |
| 1229 | 1243 | blob_zero(&comment); |
| 1230 | 1244 | blob_append(&comment, zUtf8, -1); |
| 1231 | 1245 | fossil_mbcs_free(zUtf8); |
| 1232 | 1246 |
| --- src/checkin.c | |
| +++ src/checkin.c | |
| @@ -1219,13 +1219,27 @@ | |
| 1219 | zUtf8 = blob_str(&comment) + 2; |
| 1220 | zUtf8 = fossil_unicode_to_utf8(zUtf8); |
| 1221 | blob_zero(&comment); |
| 1222 | blob_append(&comment, zUtf8, -1); |
| 1223 | fossil_mbcs_free(zUtf8); |
| 1224 | }else if( blob_size(&comment)>1 |
| 1225 | && memcmp(blob_buffer(&comment), &urbom, 2)==0 ){ |
| 1226 | fossil_fatal("unicode bom (be) not (yet) implemented"); |
| 1227 | }else{ |
| 1228 | char *zUtf8 = fossil_mbcs_to_utf8(blob_str(&comment)); |
| 1229 | blob_zero(&comment); |
| 1230 | blob_append(&comment, zUtf8, -1); |
| 1231 | fossil_mbcs_free(zUtf8); |
| 1232 |
| --- src/checkin.c | |
| +++ src/checkin.c | |
| @@ -1219,13 +1219,27 @@ | |
| 1219 | zUtf8 = blob_str(&comment) + 2; |
| 1220 | zUtf8 = fossil_unicode_to_utf8(zUtf8); |
| 1221 | blob_zero(&comment); |
| 1222 | blob_append(&comment, zUtf8, -1); |
| 1223 | fossil_mbcs_free(zUtf8); |
| 1224 | }else if( blob_size(&comment)>1 && (blob_size(&comment)&1)==0 |
| 1225 | && memcmp(blob_buffer(&comment), &urbom, 2)==0 ) { |
| 1226 | char *zUtf8 = blob_buffer(&comment); |
| 1227 | unsigned int i = blob_size(&comment); |
| 1228 | while( i > 0 ){ |
| 1229 | /* swap bytes of unicode representation */ |
| 1230 | char temp = zUtf8[--i]; |
| 1231 | zUtf8[i] = zUtf8[i-1]; |
| 1232 | zUtf8[--i] = temp; |
| 1233 | } |
| 1234 | /* Make sure the blob contains two terminating 0-bytes */ |
| 1235 | blob_append(&comment, "", 1); |
| 1236 | zUtf8 = blob_str(&comment) + 2; |
| 1237 | zUtf8 = fossil_unicode_to_utf8(zUtf8); |
| 1238 | blob_zero(&comment); |
| 1239 | blob_append(&comment, zUtf8, -1); |
| 1240 | fossil_mbcs_free(zUtf8); |
| 1241 | }else{ |
| 1242 | char *zUtf8 = fossil_mbcs_to_utf8(blob_str(&comment)); |
| 1243 | blob_zero(&comment); |
| 1244 | blob_append(&comment, zUtf8, -1); |
| 1245 | fossil_mbcs_free(zUtf8); |
| 1246 |