@@ -433,7 +433,7 @@ namespace utf8
433
433
}
434
434
435
435
template <Utf8EncodingKind encoding, bool countBytesOnly = false >
436
- __range (0 , cchSource * 3 )
436
+ __range (0 , cbDest )
437
437
size_t EncodeIntoImpl (
438
438
_When_ (!countBytesOnly, _Out_writes_(cbDest)) utf8char_t *destBuffer,
439
439
__range(0 , cchSource * 3 ) size_t cbDest,
@@ -492,7 +492,7 @@ namespace utf8
492
492
}
493
493
494
494
template <Utf8EncodingKind encoding>
495
- __range (0 , cchSource * 3 )
495
+ __range (0 , cbDest )
496
496
size_t EncodeInto(
497
497
_Out_writes_ (cbDest) utf8char_t *dest,
498
498
__range(0 , cchSource * 3 ) size_t cbDest,
@@ -503,7 +503,7 @@ namespace utf8
503
503
}
504
504
505
505
template <Utf8EncodingKind encoding>
506
- __range (0 , cchSource * 3 )
506
+ __range (0 , cbDest )
507
507
size_t EncodeIntoAndNullTerminate(
508
508
_Out_writes_z_ (cbDest) utf8char_t *dest,
509
509
__range(1 , cchSource * 3 + 1 ) size_t cbDest, // must be at least large enough to write null terminator
@@ -513,45 +513,46 @@ namespace utf8
513
513
size_t destWriteMaxBytes = cbDest - 1 ; // leave room for null terminator
514
514
size_t result = EncodeIntoImpl<encoding>(dest, destWriteMaxBytes, source, cchSource);
515
515
dest[result] = 0 ;
516
- return result;
516
+ return result + 1 ;
517
517
}
518
518
519
519
template
520
- __range (0 , cchSource * 3 )
520
+ __range (0 , cbDest )
521
521
size_t EncodeInto<Utf8EncodingKind::Cesu8>(
522
522
_Out_writes_ (cbDest) utf8char_t *dest,
523
523
__range(0 , cchSource * 3 ) size_t cbDest,
524
524
_In_reads_(cchSource) const char16 *source,
525
525
__range(0 , INT_MAX) charcount_t cchSource);
526
526
527
527
template
528
- __range (0 , cchSource * 3 )
528
+ __range (0 , cbDest )
529
529
size_t EncodeInto<Utf8EncodingKind::TrueUtf8>(
530
530
_Out_writes_ (cbDest) utf8char_t *dest,
531
531
__range(0 , cchSource * 3 ) size_t cbDest,
532
532
_In_reads_(cchSource) const char16 *source,
533
533
__range(0 , INT_MAX) charcount_t cchSource);
534
534
535
535
template
536
- __range (0 , cchSource * 3 )
536
+ __range (0 , cbDest )
537
537
size_t EncodeIntoAndNullTerminate<Utf8EncodingKind::Cesu8>(
538
538
_Out_writes_z_ (cbDest) utf8char_t *dest,
539
539
__range(1 , cchSource * 3 + 1 ) size_t cbDest,
540
540
_In_reads_(cchSource) const char16 *source,
541
541
__range(0 , INT_MAX) charcount_t cchSource);
542
542
543
543
template
544
- __range (0 , cchSource * 3 )
544
+ __range (0 , cbDest )
545
545
size_t EncodeIntoAndNullTerminate<Utf8EncodingKind::TrueUtf8>(
546
546
_Out_writes_z_ (cbDest) utf8char_t *dest,
547
547
__range(1 , cchSource * 3 + 1 ) size_t cbDest,
548
548
_In_reads_(cchSource) const char16 *source,
549
549
__range(0 , INT_MAX) charcount_t cchSource);
550
550
551
+ // Since we are not actually encoding, the return value is bounded on cch
551
552
__range (0 , cch * 3 )
552
553
size_t CountTrueUtf8(__in_ecount(cch) const char16 *source, charcount_t cch)
553
554
{
554
- return EncodeIntoImpl<Utf8EncodingKind::TrueUtf8, true >(nullptr , 0 , source, cch);
555
+ return EncodeIntoImpl<Utf8EncodingKind::TrueUtf8, true /* count only */ >(nullptr , 0 , source, cch);
555
556
}
556
557
557
558
// Convert the character index into a byte index.
0 commit comments