Diff
Not logged in

Differences From Artifact [aa796ca523]:

To Artifact [fc6d7ce227]:


355
356
357
358
359
360
361
362
363


364
365
366
367
368
369
370
355
356
357
358
359
360
361


362
363
364
365
366
367
368
369
370







-
-
+
+







 *	None.
 *
 *---------------------------------------------------------------------------
 */

int
Tcl_UtfToUniChar(
    register const char *src,	/* The UTF-8 string. */
    register Tcl_UniChar *chPtr)/* Filled with the Tcl_UniChar represented by
    const char *src,	/* The UTF-8 string. */
    Tcl_UniChar *chPtr)/* Filled with the Tcl_UniChar represented by
				 * the UTF-8 string. */
{
    Tcl_UniChar byte;

    /*
     * Unroll 1 to 3 (or 4) byte UTF-8 sequences.
     */
576
577
578
579
580
581
582
583

584
585
586
587
588

589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604

605
606

607
608
609
610
611
612



613
614
615
616
617

618
619
620
621
622
623



624
625
626
627
628
629
630
631
576
577
578
579
580
581
582

583
584
585
586
587

588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603

604
605
606
607
608
609
610
611


612
613
614

615
616
617
618
619
620
621
622
623


624
625
626

627
628
629
630
631
632
633







-
+




-
+















-
+


+




-
-
+
+
+
-




+




-
-
+
+
+
-







 *	None.
 *
 *---------------------------------------------------------------------------
 */

int
Tcl_NumUtfChars(
    register const char *src,	/* The UTF-8 string to measure. */
    const char *src,	/* The UTF-8 string to measure. */
    int length)			/* The length of the string in bytes, or -1
				 * for strlen(string). */
{
    Tcl_UniChar ch = 0;
    register int i = 0;
    int i = 0;

    /*
     * The separate implementations are faster.
     *
     * Since this is a time-sensitive function, we also do the check for the
     * single-byte char case specially.
     */

    if (length < 0) {
	while (*src != '\0') {
	    src += TclUtfToUniChar(src, &ch);
	    i++;
	}
	if (i < 0) i = INT_MAX; /* Bug [2738427] */
    } else {
	register const char *endPtr = src + length - TCL_UTF_MAX;
	const char *endPtr = src + length - TCL_UTF_MAX;

	while (src < endPtr) {
#if TCL_UTF_MAX < 4
	    if (((unsigned)UCHAR(*src) - 0xF0) < 5) {
		/* treat F0 - F4 as single character */
		ch = 0;
		src++;
	    } else {
		src += TclUtfToUniChar(src, &ch);
	    } else
#endif
	    src += TclUtfToUniChar(src, &ch);
	    }
	    i++;
	}
	endPtr += TCL_UTF_MAX;
	while ((src < endPtr) && Tcl_UtfCharComplete(src, endPtr - src)) {
#if TCL_UTF_MAX < 4
	    if (((unsigned)UCHAR(*src) - 0xF0) < 5) {
		/* treat F0 - F4 as single character */
		ch = 0;
		src++;
	    } else {
		src += TclUtfToUniChar(src, &ch);
	    } else
#endif
	    src += TclUtfToUniChar(src, &ch);
	    }
	    i++;
	}
	if (src < endPtr) {
	    i += endPtr - src;
	}
    }
    return i;
886
887
888
889
890
891
892
893
894


895
896
897
898
899
900
901
888
889
890
891
892
893
894


895
896
897
898
899
900
901
902
903







-
-
+
+







 *	None.
 *
 *---------------------------------------------------------------------------
 */

Tcl_UniChar
Tcl_UniCharAtIndex(
    register const char *src,	/* The UTF-8 string to dereference. */
    register int index)		/* The position of the desired character. */
    const char *src,	/* The UTF-8 string to dereference. */
    int index)		/* The position of the desired character. */
{
    Tcl_UniChar ch = 0;

    TclUtfToUniChar(Tcl_UtfAtIndex(src, index), &ch);
    return ch;
}

914
915
916
917
918
919
920
921
922


923
924
925
926
927
928
929
916
917
918
919
920
921
922


923
924
925
926
927
928
929
930
931







-
-
+
+







 *	None.
 *
 *---------------------------------------------------------------------------
 */

const char *
Tcl_UtfAtIndex(
    register const char *src,	/* The UTF-8 string. */
    register int index)		/* The position of the desired character. */
    const char *src,	/* The UTF-8 string. */
    int index)		/* The position of the desired character. */
{
    Tcl_UniChar ch = 0;
    int len = 0;

    while (index-- > 0) {
	len = TclUtfToUniChar(src, &ch);
	src += len;
1187
1188
1189
1190
1191
1192
1193
1194

1195
1196
1197
1198
1199
1200
1201
1189
1190
1191
1192
1193
1194
1195

1196
1197
1198
1199
1200
1201
1202
1203







-
+







{
    /*
     * We can't simply call 'memcmp(cs, ct, numBytes);' because we need to
     * check for Tcl's \xC0\x80 non-utf-8 null encoding. Otherwise utf-8 lexes
     * fine in the strcmp manner.
     */

    register int result = 0;
    int result = 0;

    for ( ; numBytes != 0; numBytes--, cs++, ct++) {
	if (*cs != *ct) {
	    result = UCHAR(*cs) - UCHAR(*ct);
	    break;
	}
    }