Diff
Not logged in

Differences From Artifact [dbf9778521]:

To Artifact [e1dd3d468b]:


394
395
396
397
398
399
400
401

402
403
404
405
406
407
408
394
395
396
397
398
399
400

401
402
403
404
405
406
407
408







-
+







    const char *src,		/* UTF-8 string to convert to Unicode. */
    int length,			/* Length of UTF-8 string in bytes, or -1 for
				 * strlen(). */
    Tcl_DString *dsPtr)		/* Unicode representation of string is
				 * appended to this previously initialized
				 * DString. */
{
    Tcl_UniChar ch, *w, *wString;
    Tcl_UniChar ch = 0, *w, *wString;
    const char *p, *end;
    int oldLength;

    if (length < 0) {
	length = strlen(src);
    }

518
519
520
521
522
523
524
525

526
527
528
529
530

531
532
533
534
535
536
537
538
539
540
541
542

543
544

545
546
547
548







549

550
551
552
553
554
555
556
518
519
520
521
522
523
524

525
526
527
528
529

530
531
532
533
534
535
536
537
538
539
540
541

542
543

544
545
546
547
548
549
550
551
552
553
554
555

556
557
558
559
560
561
562
563







-
+




-
+











-
+

-
+




+
+
+
+
+
+
+
-
+







}

/*
 *---------------------------------------------------------------------------
 *
 * Tcl_UtfFindFirst --
 *
 *	Returns a pointer to the first occurance of the given Tcl_UniChar in
 *	Returns a pointer to the first occurance of the given character in
 *	the NULL-terminated UTF-8 string. The NULL terminator is considered
 *	part of the UTF-8 string. Equivalent to Plan 9 utfrune().
 *
 * Results:
 *	As above. If the Tcl_UniChar does not exist in the given string, the
 *	As above. If the character does not exist in the given string, the
 *	return value is NULL.
 *
 * Side effects:
 *	None.
 *
 *---------------------------------------------------------------------------
 */

const char *
Tcl_UtfFindFirst(
    const char *src,		/* The UTF-8 string to be searched. */
    int ch)			/* The Tcl_UniChar to search for. */
    int ch)			/* The character to search for. */
{
    int len;
    int len, fullchar;
    Tcl_UniChar find = 0;

    while (1) {
	len = TclUtfToUniChar(src, &find);
	fullchar = find;
#if TCL_UTF_MAX == 4
	if (!len) {
	    len += TclUtfToUniChar(stringPtr, &find);
	    fullchar = (((fullchar & 0x3ff) << 10) | (ch & 0x3ff)) + 0x10000;
	}
#endif
	if (find == ch) {
	if (find == fullchar) {
	    return src;
	}
	if (*src == '\0') {
	    return NULL;
	}
	src += len;
    }
574
575
576
577
578
579
580
581

582
583

584
585
586
587
588
589







590

591
592
593
594
595
596
597
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







-
+

-
+






+
+
+
+
+
+
+
-
+







 *
 *---------------------------------------------------------------------------
 */

const char *
Tcl_UtfFindLast(
    const char *src,		/* The UTF-8 string to be searched. */
    int ch)			/* The Tcl_UniChar to search for. */
    int ch)			/* The character to search for. */
{
    int len;
    int len, fullchar;
    Tcl_UniChar find = 0;
    const char *last;

    last = NULL;
    while (1) {
	len = TclUtfToUniChar(src, &find);
	fullchar = find;
#if TCL_UTF_MAX == 4
	if (!len) {
	    len += TclUtfToUniChar(stringPtr, &find);
	    fullchar = (((fullchar & 0x3ff) << 10) | (ch & 0x3ff)) + 0x10000;
	}
#endif
	if (find == ch) {
	if (find == fullchar) {
	    last = src;
	}
	if (*src == '\0') {
	    break;
	}
	src += len;
    }
1154
1155
1156
1157
1158
1159
1160
1161

1162
1163
1164
1165
1166
1167
1168
1168
1169
1170
1171
1172
1173
1174

1175
1176
1177
1178
1179
1180
1181
1182







-
+








int
TclUtfCasecmp(
    const char *cs,		/* UTF string to compare to ct. */
    const char *ct)		/* UTF string cs is compared to. */
{
    while (*cs && *ct) {
	Tcl_UniChar ch1, ch2;
	Tcl_UniChar ch1 = 0, ch2 = 0;

	cs += TclUtfToUniChar(cs, &ch1);
	ct += TclUtfToUniChar(ct, &ch2);
	if (ch1 != ch2) {
	    ch1 = Tcl_UniCharToLower(ch1);
	    ch2 = Tcl_UniCharToLower(ch2);
	    if (ch1 != ch2) {