| 253 | |
| 254 | |
| 255 | void WideToUtf(const wchar *Src,char *Dest,size_t DestSize) |
| 256 | { |
| 257 | long dsize=(long)DestSize; |
| 258 | dsize--; |
| 259 | while (*Src!=0 && --dsize>=0) |
| 260 | { |
| 261 | uint c=*(Src++); |
| 262 | if (c<0x80) |
| 263 | *(Dest++)=c; |
| 264 | else |
| 265 | if (c<0x800 && --dsize>=0) |
| 266 | { |
| 267 | *(Dest++)=(0xc0|(c>>6)); |
| 268 | *(Dest++)=(0x80|(c&0x3f)); |
| 269 | } |
| 270 | else |
| 271 | { |
| 272 | if (c>=0xd800 && c<=0xdbff && *Src>=0xdc00 && *Src<=0xdfff) // Surrogate pair. |
| 273 | { |
| 274 | c=((c-0xd800)<<10)+(*Src-0xdc00)+0x10000; |
| 275 | Src++; |
| 276 | } |
| 277 | if (c<0x10000 && (dsize-=2)>=0) |
| 278 | { |
| 279 | *(Dest++)=(0xe0|(c>>12)); |
| 280 | *(Dest++)=(0x80|((c>>6)&0x3f)); |
| 281 | *(Dest++)=(0x80|(c&0x3f)); |
| 282 | } |
| 283 | else |
| 284 | if (c < 0x200000 && (dsize-=3)>=0) |
| 285 | { |
| 286 | *(Dest++)=(0xf0|(c>>18)); |
| 287 | *(Dest++)=(0x80|((c>>12)&0x3f)); |
| 288 | *(Dest++)=(0x80|((c>>6)&0x3f)); |
| 289 | *(Dest++)=(0x80|(c&0x3f)); |
| 290 | } |
| 291 | } |
| 292 | } |
| 293 | *Dest=0; |
| 294 | } |
| 295 | |
| 296 | |
| 297 | size_t WideToUtfSize(const wchar *Src) |
no outgoing calls
no test coverage detected