0000: 2f 2a 0a 20 2a 20 74 63 6c 55 74 66 2e 63 20 2d /*. * tclUtf.c -
0010: 2d 0a 20 2a 0a 20 2a 09 52 6f 75 74 69 6e 65 73 -. *. *.Routines
0020: 20 66 6f 72 20 6d 61 6e 69 70 75 6c 61 74 69 6e for manipulatin
0030: 67 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73 2e g UTF-8 strings.
0040: 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 . *. * Copyright
0050: 20 28 63 29 20 31 39 39 37 2d 31 39 39 38 20 53 (c) 1997-1998 S
0060: 75 6e 20 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c un Microsystems,
0070: 20 49 6e 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 Inc.. *. * See
0080: 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 the file "licens
0090: 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 e.terms" for inf
00a0: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 ormation on usag
00b0: 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 e and redistribu
00c0: 74 69 6f 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 tion of. * this
00d0: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 file, and for a
00e0: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c DISCLAIMER OF AL
00f0: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a L WARRANTIES.. *
0100: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c /..#include "tcl
0110: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 49 6e Int.h"../*. * In
0120: 63 6c 75 64 65 20 74 68 65 20 73 74 61 74 69 63 clude the static
0130: 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 character class
0140: 69 66 69 63 61 74 69 6f 6e 20 74 61 62 6c 65 73 ification tables
0150: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 0a 20 2a 2f and macros.. */
0160: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 55 ..#include "tclU
0170: 6e 69 44 61 74 61 2e 63 22 0a 0a 2f 2a 0a 20 2a niData.c"../*. *
0180: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d The following m
0190: 61 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 66 acros are used f
01a0: 6f 72 20 66 61 73 74 20 63 68 61 72 61 63 74 65 or fast characte
01b0: 72 20 63 61 74 65 67 6f 72 79 20 74 65 73 74 73 r category tests
01c0: 2e 20 54 68 65 20 78 5f 42 49 54 53 0a 20 2a 20 . The x_BITS. *
01d0: 76 61 6c 75 65 73 20 61 72 65 20 73 68 69 66 74 values are shift
01e0: 65 64 20 72 69 67 68 74 20 62 79 20 74 68 65 20 ed right by the
01f0: 63 61 74 65 67 6f 72 79 20 76 61 6c 75 65 20 74 category value t
0200: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 o determine whet
0210: 68 65 72 20 74 68 65 0a 20 2a 20 67 69 76 65 6e her the. * given
0220: 20 63 61 74 65 67 6f 72 79 20 69 73 20 69 6e 63 category is inc
0230: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 74 luded in the set
0240: 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 41 .. */..#define A
0250: 4c 50 48 41 5f 42 49 54 53 20 28 28 31 20 3c 3c LPHA_BITS ((1 <<
0260: 20 55 50 50 45 52 43 41 53 45 5f 4c 45 54 54 45 UPPERCASE_LETTE
0270: 52 29 20 7c 20 28 31 20 3c 3c 20 4c 4f 57 45 52 R) | (1 << LOWER
0280: 43 41 53 45 5f 4c 45 54 54 45 52 29 20 5c 0a 09 CASE_LETTER) \..
0290: 7c 20 28 31 20 3c 3c 20 54 49 54 4c 45 43 41 53 | (1 << TITLECAS
02a0: 45 5f 4c 45 54 54 45 52 29 20 7c 20 28 31 20 3c E_LETTER) | (1 <
02b0: 3c 20 4d 4f 44 49 46 49 45 52 5f 4c 45 54 54 45 < MODIFIER_LETTE
02c0: 52 29 20 7c 20 28 31 3c 3c 4f 54 48 45 52 5f 4c R) | (1<<OTHER_L
02d0: 45 54 54 45 52 29 29 0a 0a 23 64 65 66 69 6e 65 ETTER))..#define
02e0: 20 43 4f 4e 54 52 4f 4c 5f 42 49 54 53 20 28 28 CONTROL_BITS ((
02f0: 31 20 3c 3c 20 43 4f 4e 54 52 4f 4c 29 20 7c 20 1 << CONTROL) |
0300: 28 31 20 3c 3c 20 46 4f 52 4d 41 54 29 20 7c 20 (1 << FORMAT) |
0310: 28 31 20 3c 3c 20 50 52 49 56 41 54 45 5f 55 53 (1 << PRIVATE_US
0320: 45 29 29 0a 0a 23 64 65 66 69 6e 65 20 44 49 47 E))..#define DIG
0330: 49 54 5f 42 49 54 53 20 28 31 20 3c 3c 20 44 45 IT_BITS (1 << DE
0340: 43 49 4d 41 4c 5f 44 49 47 49 54 5f 4e 55 4d 42 CIMAL_DIGIT_NUMB
0350: 45 52 29 0a 0a 23 64 65 66 69 6e 65 20 53 50 41 ER)..#define SPA
0360: 43 45 5f 42 49 54 53 20 28 28 31 20 3c 3c 20 53 CE_BITS ((1 << S
0370: 50 41 43 45 5f 53 45 50 41 52 41 54 4f 52 29 20 PACE_SEPARATOR)
0380: 7c 20 28 31 20 3c 3c 20 4c 49 4e 45 5f 53 45 50 | (1 << LINE_SEP
0390: 41 52 41 54 4f 52 29 20 5c 0a 09 7c 20 28 31 20 ARATOR) \..| (1
03a0: 3c 3c 20 50 41 52 41 47 52 41 50 48 5f 53 45 50 << PARAGRAPH_SEP
03b0: 41 52 41 54 4f 52 29 29 0a 0a 23 64 65 66 69 6e ARATOR))..#defin
03c0: 65 20 57 4f 52 44 5f 42 49 54 53 20 28 41 4c 50 e WORD_BITS (ALP
03d0: 48 41 5f 42 49 54 53 20 7c 20 44 49 47 49 54 5f HA_BITS | DIGIT_
03e0: 42 49 54 53 20 7c 20 28 31 20 3c 3c 20 43 4f 4e BITS | (1 << CON
03f0: 4e 45 43 54 4f 52 5f 50 55 4e 43 54 55 41 54 49 NECTOR_PUNCTUATI
0400: 4f 4e 29 29 0a 0a 23 64 65 66 69 6e 65 20 50 55 ON))..#define PU
0410: 4e 43 54 5f 42 49 54 53 20 28 28 31 20 3c 3c 20 NCT_BITS ((1 <<
0420: 43 4f 4e 4e 45 43 54 4f 52 5f 50 55 4e 43 54 55 CONNECTOR_PUNCTU
0430: 41 54 49 4f 4e 29 20 7c 20 5c 0a 09 28 31 20 3c ATION) | \..(1 <
0440: 3c 20 44 41 53 48 5f 50 55 4e 43 54 55 41 54 49 < DASH_PUNCTUATI
0450: 4f 4e 29 20 7c 20 28 31 20 3c 3c 20 4f 50 45 4e ON) | (1 << OPEN
0460: 5f 50 55 4e 43 54 55 41 54 49 4f 4e 29 20 7c 20 _PUNCTUATION) |
0470: 5c 0a 09 28 31 20 3c 3c 20 43 4c 4f 53 45 5f 50 \..(1 << CLOSE_P
0480: 55 4e 43 54 55 41 54 49 4f 4e 29 20 7c 20 28 31 UNCTUATION) | (1
0490: 20 3c 3c 20 49 4e 49 54 49 41 4c 5f 51 55 4f 54 << INITIAL_QUOT
04a0: 45 5f 50 55 4e 43 54 55 41 54 49 4f 4e 29 20 7c E_PUNCTUATION) |
04b0: 20 5c 0a 09 28 31 20 3c 3c 20 46 49 4e 41 4c 5f \..(1 << FINAL_
04c0: 51 55 4f 54 45 5f 50 55 4e 43 54 55 41 54 49 4f QUOTE_PUNCTUATIO
04d0: 4e 29 20 7c 20 28 31 20 3c 3c 20 4f 54 48 45 52 N) | (1 << OTHER
04e0: 5f 50 55 4e 43 54 55 41 54 49 4f 4e 29 29 0a 0a _PUNCTUATION))..
04f0: 23 64 65 66 69 6e 65 20 47 52 41 50 48 5f 42 49 #define GRAPH_BI
0500: 54 53 20 28 57 4f 52 44 5f 42 49 54 53 20 7c 20 TS (WORD_BITS |
0510: 50 55 4e 43 54 5f 42 49 54 53 20 7c 20 5c 0a 09 PUNCT_BITS | \..
0520: 28 31 20 3c 3c 20 4e 4f 4e 5f 53 50 41 43 49 4e (1 << NON_SPACIN
0530: 47 5f 4d 41 52 4b 29 20 7c 20 28 31 20 3c 3c 20 G_MARK) | (1 <<
0540: 45 4e 43 4c 4f 53 49 4e 47 5f 4d 41 52 4b 29 20 ENCLOSING_MARK)
0550: 7c 20 5c 0a 09 28 31 20 3c 3c 20 43 4f 4d 42 49 | \..(1 << COMBI
0560: 4e 49 4e 47 5f 53 50 41 43 49 4e 47 5f 4d 41 52 NING_SPACING_MAR
0570: 4b 29 20 7c 20 28 31 20 3c 3c 20 4c 45 54 54 45 K) | (1 << LETTE
0580: 52 5f 4e 55 4d 42 45 52 29 20 7c 20 5c 0a 09 28 R_NUMBER) | \..(
0590: 31 20 3c 3c 20 4f 54 48 45 52 5f 4e 55 4d 42 45 1 << OTHER_NUMBE
05a0: 52 29 20 7c 20 5c 0a 09 28 31 20 3c 3c 20 4d 41 R) | \..(1 << MA
05b0: 54 48 5f 53 59 4d 42 4f 4c 29 20 7c 20 28 31 20 TH_SYMBOL) | (1
05c0: 3c 3c 20 43 55 52 52 45 4e 43 59 5f 53 59 4d 42 << CURRENCY_SYMB
05d0: 4f 4c 29 20 7c 20 5c 0a 09 28 31 20 3c 3c 20 4d OL) | \..(1 << M
05e0: 4f 44 49 46 49 45 52 5f 53 59 4d 42 4f 4c 29 20 ODIFIER_SYMBOL)
05f0: 7c 20 28 31 20 3c 3c 20 4f 54 48 45 52 5f 53 59 | (1 << OTHER_SY
0600: 4d 42 4f 4c 29 29 0a 0a 2f 2a 0a 20 2a 20 55 6e MBOL))../*. * Un
0610: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 icode characters
0620: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 69 73 20 less than this
0630: 76 61 6c 75 65 20 61 72 65 20 72 65 70 72 65 73 value are repres
0640: 65 6e 74 65 64 20 62 79 20 74 68 65 6d 73 65 6c ented by themsel
0650: 76 65 73 20 69 6e 0a 20 2a 20 55 54 46 2d 38 20 ves in. * UTF-8
0660: 73 74 72 69 6e 67 73 2e 0a 20 2a 2f 0a 0a 23 64 strings.. */..#d
0670: 65 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 45 efine UNICODE_SE
0680: 4c 46 09 30 78 38 30 0a 0a 2f 2a 0a 20 2a 20 54 LF.0x80../*. * T
0690: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 he following str
06a0: 75 63 74 75 72 65 73 20 61 72 65 20 75 73 65 64 uctures are used
06b0: 20 77 68 65 6e 20 6d 61 70 70 69 6e 67 20 62 65 when mapping be
06c0: 74 77 65 65 6e 20 55 6e 69 63 6f 64 65 20 28 55 tween Unicode (U
06d0: 43 53 2d 32 29 20 61 6e 64 0a 20 2a 20 55 54 46 CS-2) and. * UTF
06e0: 2d 38 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 -8.. */..static
06f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
0700: 68 61 72 20 74 6f 74 61 6c 42 79 74 65 73 5b 32 har totalBytes[2
0710: 35 36 5d 20 3d 20 7b 0a 20 20 20 20 31 2c 31 2c 56] = {. 1,1,
0720: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
0730: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
0740: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
0750: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 0a 20 20 20 1,1,1,1,1,1,.
0760: 20 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 1,1,1,1,1,1,1,1
0770: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
0780: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
0790: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
07a0: 2c 0a 20 20 20 20 31 2c 31 2c 31 2c 31 2c 31 2c ,. 1,1,1,1,1,
07b0: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
07c0: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
07d0: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
07e0: 31 2c 31 2c 31 2c 0a 20 20 20 20 31 2c 31 2c 31 1,1,1,. 1,1,1
07f0: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
0800: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
0810: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
0820: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 0a 20 20 20 20 ,1,1,1,1,1,.
0830: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
0840: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
0850: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
0860: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 1,1,1,1,1,1,1,1,
0870: 0a 20 20 20 20 31 2c 31 2c 31 2c 31 2c 31 2c 31 . 1,1,1,1,1,1
0880: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
0890: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
08a0: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 ,1,1,1,1,1,1,1,1
08b0: 2c 31 2c 31 2c 0a 20 20 20 20 32 2c 32 2c 32 2c ,1,1,. 2,2,2,
08c0: 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 2,2,2,2,2,2,2,2,
08d0: 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 2,2,2,2,2,2,2,2,
08e0: 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 2,2,2,2,2,2,2,2,
08f0: 32 2c 32 2c 32 2c 32 2c 32 2c 0a 20 20 20 20 33 2,2,2,2,2,. 3
0900: 2c 33 2c 33 2c 33 2c 33 2c 33 2c 33 2c 33 2c 33 ,3,3,3,3,3,3,3,3
0910: 2c 33 2c 33 2c 33 2c 33 2c 33 2c 33 2c 33 2c 0a ,3,3,3,3,3,3,3,.
0920: 20 20 20 20 34 2c 34 2c 34 2c 34 2c 34 2c 34 2c 4,4,4,4,4,4,
0930: 34 2c 34 2c 0a 20 20 20 20 31 2c 31 2c 31 2c 31 4,4,. 1,1,1,1
0940: 2c 31 2c 31 2c 31 2c 31 0a 7d 3b 0a 0c 0a 2f 2a ,1,1,1,1.};.../*
0950: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
09a0: 2a 0a 20 2a 20 54 63 6c 55 74 66 43 6f 75 6e 74 *. * TclUtfCount
09b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e 64 20 74 --. *. *.Find t
09c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
09d0: 65 73 20 69 6e 20 74 68 65 20 55 74 66 20 63 68 es in the Utf ch
09e0: 61 72 61 63 74 65 72 20 22 63 68 22 2e 0a 20 2a aracter "ch".. *
09f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
0a00: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 The return value
0a10: 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 s is the number
0a20: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 of bytes in the
0a30: 55 74 66 20 63 68 61 72 61 63 74 65 72 20 22 63 Utf character "c
0a40: 68 22 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 h".. *. * Side e
0a50: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
0a60: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ab0: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 55 74 -. */..int.TclUt
0ac0: 66 43 6f 75 6e 74 28 0a 20 20 20 20 69 6e 74 20 fCount(. int
0ad0: 63 68 29 09 09 09 2f 2a 20 54 68 65 20 55 6e 69 ch).../* The Uni
0ae0: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 77 code character w
0af0: 68 6f 73 65 20 73 69 7a 65 20 69 73 20 72 65 74 hose size is ret
0b00: 75 72 6e 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 urned. */.{.
0b10: 69 66 20 28 28 75 6e 73 69 67 6e 65 64 29 28 63 if ((unsigned)(c
0b20: 68 20 2d 20 31 29 20 3c 20 28 55 4e 49 43 4f 44 h - 1) < (UNICOD
0b30: 45 5f 53 45 4c 46 20 2d 20 31 29 29 20 7b 0a 09 E_SELF - 1)) {..
0b40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a return 1;. }.
0b50: 20 20 20 20 69 66 20 28 63 68 20 3c 3d 20 30 78 if (ch <= 0x
0b60: 37 46 46 29 20 7b 0a 09 72 65 74 75 72 6e 20 32 7FF) {..return 2
0b70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
0b80: 28 28 75 6e 73 69 67 6e 65 64 29 28 63 68 20 2d ((unsigned)(ch -
0b90: 20 30 78 31 30 30 30 30 29 20 3c 3d 20 30 78 46 0x10000) <= 0xF
0ba0: 46 46 46 46 29 29 20 7b 0a 09 72 65 74 75 72 6e FFFF)) {..return
0bb0: 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 4;. }. re
0bc0: 74 75 72 6e 20 33 3b 0a 7d 0a 0a 2f 2a 0a 20 2a turn 3;.}../*. *
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0c20: 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 * Tcl_UniCharToU
0c30: 74 66 20 2d 2d 0a 20 2a 0a 20 2a 09 53 74 6f 72 tf --. *. *.Stor
0c40: 65 20 74 68 65 20 67 69 76 65 6e 20 54 63 6c 5f e the given Tcl_
0c50: 55 6e 69 43 68 61 72 20 61 73 20 61 20 73 65 71 UniChar as a seq
0c60: 75 65 6e 63 65 20 6f 66 20 55 54 46 2d 38 20 62 uence of UTF-8 b
0c70: 79 74 65 73 20 69 6e 20 74 68 65 0a 20 2a 09 70 ytes in the. *.p
0c80: 72 6f 76 69 64 65 64 20 62 75 66 66 65 72 2e 20 rovided buffer.
0c90: 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 50 6c Equivalent to Pl
0ca0: 61 6e 20 39 20 72 75 6e 65 74 6f 63 68 61 72 28 an 9 runetochar(
0cb0: 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ).. *. * Results
0cc0: 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 :. *.The return
0cd0: 76 61 6c 75 65 73 20 69 73 20 74 68 65 20 6e 75 values is the nu
0ce0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
0cf0: 20 74 68 65 20 62 75 66 66 65 72 20 74 68 61 74 the buffer that
0d00: 20 77 65 72 65 0a 20 2a 09 63 6f 6e 73 75 6d 65 were. *.consume
0d10: 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 d.. *. * Side ef
0d20: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
0d30: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d80: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e . */..int.Tcl_Un
0d90: 69 43 68 61 72 54 6f 55 74 66 28 0a 20 20 20 20 iCharToUtf(.
0da0: 69 6e 74 20 63 68 2c 09 09 09 2f 2a 20 54 68 65 int ch,.../* The
0db0: 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 74 6f 20 Tcl_UniChar to
0dc0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 be stored in the
0dd0: 0a 09 09 09 09 20 2a 20 62 75 66 66 65 72 2e 20 ..... * buffer.
0de0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 */. char *buf
0df0: 29 09 09 09 2f 2a 20 42 75 66 66 65 72 20 69 6e ).../* Buffer in
0e00: 20 77 68 69 63 68 20 74 68 65 20 55 54 46 2d 38 which the UTF-8
0e10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 representation
0e20: 6f 66 0a 09 09 09 09 20 2a 20 74 68 65 20 54 63 of..... * the Tc
0e30: 6c 5f 55 6e 69 43 68 61 72 20 69 73 20 73 74 6f l_UniChar is sto
0e40: 72 65 64 2e 20 42 75 66 66 65 72 20 6d 75 73 74 red. Buffer must
0e50: 20 62 65 0a 09 09 09 09 20 2a 20 6c 61 72 67 65 be..... * large
0e60: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 enough to hold
0e70: 74 68 65 20 55 54 46 2d 38 20 63 68 61 72 61 63 the UTF-8 charac
0e80: 74 65 72 0a 09 09 09 09 20 2a 20 28 61 74 20 6d ter..... * (at m
0e90: 6f 73 74 20 34 20 62 79 74 65 73 29 2e 20 2a 2f ost 4 bytes). */
0ea0: 0a 7b 0a 20 20 20 20 69 66 20 28 28 75 6e 73 69 .{. if ((unsi
0eb0: 67 6e 65 64 29 28 63 68 20 2d 20 31 29 20 3c 20 gned)(ch - 1) <
0ec0: 28 55 4e 49 43 4f 44 45 5f 53 45 4c 46 20 2d 20 (UNICODE_SELF -
0ed0: 31 29 29 20 7b 0a 09 62 75 66 5b 30 5d 20 3d 20 1)) {..buf[0] =
0ee0: 28 63 68 61 72 29 20 63 68 3b 0a 09 72 65 74 75 (char) ch;..retu
0ef0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 1;. }.
0f00: 69 66 20 28 63 68 20 3e 3d 20 30 29 20 7b 0a 09 if (ch >= 0) {..
0f10: 69 66 20 28 63 68 20 3c 3d 20 30 78 37 46 46 29 if (ch <= 0x7FF)
0f20: 20 7b 0a 09 20 20 20 20 62 75 66 5b 31 5d 20 3d {.. buf[1] =
0f30: 20 28 63 68 61 72 29 20 28 28 63 68 20 7c 20 30 (char) ((ch | 0
0f40: 78 38 30 29 20 26 20 30 78 42 46 29 3b 0a 09 20 x80) & 0xBF);..
0f50: 20 20 20 62 75 66 5b 30 5d 20 3d 20 28 63 68 61 buf[0] = (cha
0f60: 72 29 20 28 28 63 68 20 3e 3e 20 36 29 20 7c 20 r) ((ch >> 6) |
0f70: 30 78 43 30 29 3b 0a 09 20 20 20 20 72 65 74 75 0xC0);.. retu
0f80: 72 6e 20 32 3b 0a 09 7d 0a 09 69 66 20 28 63 68 rn 2;..}..if (ch
0f90: 20 3c 3d 20 30 78 46 46 46 46 29 20 7b 0a 09 20 <= 0xFFFF) {..
0fa0: 20 20 20 69 66 20 28 28 63 68 20 26 20 30 78 46 if ((ch & 0xF
0fb0: 38 30 30 29 20 3d 3d 20 30 78 44 38 30 30 29 20 800) == 0xD800)
0fc0: 7b 0a 09 09 69 66 20 28 63 68 20 26 20 30 78 30 {...if (ch & 0x0
0fd0: 34 30 30 29 20 7b 0a 09 09 20 20 20 20 2f 2a 20 400) {... /*
0fe0: 4c 6f 77 20 73 75 72 72 6f 67 61 74 65 20 2a 2f Low surrogate */
0ff0: 0a 09 09 20 20 20 20 69 66 20 28 28 28 62 75 66 ... if (((buf
1000: 5b 30 5d 20 26 20 30 78 46 38 29 20 3d 3d 20 30 [0] & 0xF8) == 0
1010: 78 46 30 29 20 26 26 20 28 28 62 75 66 5b 31 5d xF0) && ((buf[1]
1020: 20 26 20 30 78 43 30 29 20 3d 3d 20 30 78 38 30 & 0xC0) == 0x80
1030: 29 0a 09 09 09 20 20 20 20 26 26 20 28 28 62 75 ).... && ((bu
1040: 66 5b 32 5d 20 26 20 30 78 43 46 29 20 3d 3d 20 f[2] & 0xCF) ==
1050: 30 29 29 20 7b 0a 09 09 09 2f 2a 20 50 72 65 76 0)) {..../* Prev
1060: 69 6f 75 73 20 54 63 6c 5f 55 6e 69 43 68 61 72 ious Tcl_UniChar
1070: 20 77 61 73 20 61 20 48 69 67 68 20 73 75 72 72 was a High surr
1080: 6f 67 61 74 65 2c 20 73 6f 20 63 6f 6d 62 69 6e ogate, so combin
1090: 65 20 2a 2f 0a 09 09 09 62 75 66 5b 33 5d 20 3d e */....buf[3] =
10a0: 20 28 63 68 61 72 29 20 28 28 63 68 20 26 20 30 (char) ((ch & 0
10b0: 78 33 46 29 20 7c 20 30 78 38 30 29 3b 0a 09 09 x3F) | 0x80);...
10c0: 09 62 75 66 5b 32 5d 20 7c 3d 20 28 63 68 61 72 .buf[2] |= (char
10d0: 29 20 28 28 28 63 68 20 3e 3e 20 36 29 20 26 20 ) (((ch >> 6) &
10e0: 30 78 30 46 29 20 7c 20 30 78 38 30 29 3b 0a 09 0x0F) | 0x80);..
10f0: 09 09 72 65 74 75 72 6e 20 34 3b 0a 09 09 20 20 ..return 4;...
1100: 20 20 7d 0a 09 09 20 20 20 20 2f 2a 20 50 72 65 }... /* Pre
1110: 76 69 6f 75 73 20 54 63 6c 5f 55 6e 69 43 68 61 vious Tcl_UniCha
1120: 72 20 77 61 73 20 6e 6f 74 20 61 20 48 69 67 68 r was not a High
1130: 20 73 75 72 72 6f 67 61 74 65 2c 20 73 6f 20 6a surrogate, so j
1140: 75 73 74 20 6f 75 74 70 75 74 20 2a 2f 0a 09 09 ust output */...
1150: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 2f } else {... /
1160: 2a 20 48 69 67 68 20 73 75 72 72 6f 67 61 74 65 * High surrogate
1170: 20 2a 2f 0a 09 09 20 20 20 20 63 68 20 2b 3d 20 */... ch +=
1180: 30 78 34 30 3b 0a 09 09 20 20 20 20 2f 2a 20 46 0x40;... /* F
1190: 69 6c 6c 20 62 75 66 66 65 72 20 77 69 74 68 20 ill buffer with
11a0: 73 70 65 63 69 66 69 63 20 33 2d 62 79 74 65 20 specific 3-byte
11b0: 28 69 6e 76 61 6c 69 64 29 20 62 79 74 65 20 63 (invalid) byte c
11c0: 6f 6d 62 69 6e 61 74 69 6f 6e 2c 0a 09 09 20 20 ombination,...
11d0: 20 20 20 20 20 73 6f 20 66 6f 6c 6c 6f 77 69 6e so followin
11e0: 67 20 4c 6f 77 20 73 75 72 72 6f 67 61 74 65 20 g Low surrogate
11f0: 63 61 6e 20 72 65 63 6f 67 6e 69 7a 65 20 69 74 can recognize it
1200: 20 61 6e 64 20 63 6f 6d 62 69 6e 65 20 2a 2f 0a and combine */.
1210: 09 09 20 20 20 20 62 75 66 5b 32 5d 20 3d 20 28 .. buf[2] = (
1220: 63 68 61 72 29 20 28 28 63 68 20 3c 3c 20 34 29 char) ((ch << 4)
1230: 20 26 20 30 78 33 30 29 3b 0a 09 09 20 20 20 20 & 0x30);...
1240: 62 75 66 5b 31 5d 20 3d 20 28 63 68 61 72 29 20 buf[1] = (char)
1250: 28 28 28 63 68 20 3e 3e 20 32 29 20 26 20 30 78 (((ch >> 2) & 0x
1260: 33 46 29 20 7c 20 30 78 38 30 29 3b 0a 09 09 20 3F) | 0x80);...
1270: 20 20 20 62 75 66 5b 30 5d 20 3d 20 28 63 68 61 buf[0] = (cha
1280: 72 29 20 28 28 28 63 68 20 3e 3e 20 38 29 20 26 r) (((ch >> 8) &
1290: 20 30 78 30 37 29 20 7c 20 30 78 46 30 29 3b 0a 0x07) | 0xF0);.
12a0: 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a .. return 0;.
12b0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ..}.. }..
12c0: 67 6f 74 6f 20 74 68 72 65 65 3b 0a 09 7d 0a 09 goto three;..}..
12d0: 69 66 20 28 63 68 20 3c 3d 20 30 78 31 30 46 46 if (ch <= 0x10FF
12e0: 46 46 29 20 7b 0a 09 20 20 20 20 62 75 66 5b 33 FF) {.. buf[3
12f0: 5d 20 3d 20 28 63 68 61 72 29 20 28 28 63 68 20 ] = (char) ((ch
1300: 7c 20 30 78 38 30 29 20 26 20 30 78 42 46 29 3b | 0x80) & 0xBF);
1310: 0a 09 20 20 20 20 62 75 66 5b 32 5d 20 3d 20 28 .. buf[2] = (
1320: 63 68 61 72 29 20 28 28 28 63 68 20 3e 3e 20 36 char) (((ch >> 6
1330: 29 20 7c 20 30 78 38 30 29 20 26 20 30 78 42 46 ) | 0x80) & 0xBF
1340: 29 3b 0a 09 20 20 20 20 62 75 66 5b 31 5d 20 3d );.. buf[1] =
1350: 20 28 63 68 61 72 29 20 28 28 28 63 68 20 3e 3e (char) (((ch >>
1360: 20 31 32 29 20 7c 20 30 78 38 30 29 20 26 20 30 12) | 0x80) & 0
1370: 78 42 46 29 3b 0a 09 20 20 20 20 62 75 66 5b 30 xBF);.. buf[0
1380: 5d 20 3d 20 28 63 68 61 72 29 20 28 28 63 68 20 ] = (char) ((ch
1390: 3e 3e 20 31 38 29 20 7c 20 30 78 46 30 29 3b 0a >> 18) | 0xF0);.
13a0: 09 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 09 . return 4;..
13b0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 }. } else if
13c0: 28 63 68 20 3d 3d 20 2d 31 29 20 7b 0a 09 69 66 (ch == -1) {..if
13d0: 20 28 28 28 62 75 66 5b 30 5d 20 26 20 30 78 46 (((buf[0] & 0xF
13e0: 38 29 20 3d 3d 20 30 78 46 30 29 20 26 26 20 28 8) == 0xF0) && (
13f0: 28 62 75 66 5b 31 5d 20 26 20 30 78 43 30 29 20 (buf[1] & 0xC0)
1400: 3d 3d 20 30 78 38 30 29 0a 09 09 26 26 20 28 28 == 0x80)...&& ((
1410: 62 75 66 5b 32 5d 20 26 20 30 78 43 46 29 20 3d buf[2] & 0xCF) =
1420: 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 63 68 20 = 0)) {.. ch
1430: 3d 20 30 78 44 37 43 30 20 2b 20 28 28 62 75 66 = 0xD7C0 + ((buf
1440: 5b 30 5d 20 26 20 30 78 30 37 29 20 3c 3c 20 38 [0] & 0x07) << 8
1450: 29 20 2b 20 28 28 62 75 66 5b 31 5d 20 26 20 30 ) + ((buf[1] & 0
1460: 78 33 46 29 20 3c 3c 20 32 29 0a 09 09 20 20 20 x3F) << 2)...
1470: 20 2b 20 28 28 62 75 66 5b 32 5d 20 26 20 30 78 + ((buf[2] & 0x
1480: 33 30 29 20 3e 3e 20 34 29 3b 0a 09 20 20 20 20 30) >> 4);..
1490: 67 6f 74 6f 20 74 68 72 65 65 3b 0a 09 7d 0a 20 goto three;..}.
14a0: 20 20 20 7d 0a 0a 20 20 20 20 63 68 20 3d 20 30 }.. ch = 0
14b0: 78 46 46 46 44 3b 0a 74 68 72 65 65 3a 0a 20 20 xFFFD;.three:.
14c0: 20 20 62 75 66 5b 32 5d 20 3d 20 28 63 68 61 72 buf[2] = (char
14d0: 29 20 28 28 63 68 20 7c 20 30 78 38 30 29 20 26 ) ((ch | 0x80) &
14e0: 20 30 78 42 46 29 3b 0a 20 20 20 20 62 75 66 5b 0xBF);. buf[
14f0: 31 5d 20 3d 20 28 63 68 61 72 29 20 28 28 28 63 1] = (char) (((c
1500: 68 20 3e 3e 20 36 29 20 7c 20 30 78 38 30 29 20 h >> 6) | 0x80)
1510: 26 20 30 78 42 46 29 3b 0a 20 20 20 20 62 75 66 & 0xBF);. buf
1520: 5b 30 5d 20 3d 20 28 63 68 61 72 29 20 28 28 63 [0] = (char) ((c
1530: 68 20 3e 3e 20 31 32 29 20 7c 20 30 78 45 30 29 h >> 12) | 0xE0)
1540: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a ;. return 3;.
1550: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 ----. *. * Tcl_U
15b0: 6e 69 43 68 61 72 54 6f 55 74 66 44 53 74 72 69 niCharToUtfDStri
15c0: 6e 67 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 ng --. *. *.Conv
15d0: 65 72 74 20 74 68 65 20 67 69 76 65 6e 20 55 6e ert the given Un
15e0: 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20 icode string to
15f0: 55 54 46 2d 38 2e 0a 20 2a 0a 20 2a 20 52 65 73 UTF-8.. *. * Res
1600: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 ults:. *.The ret
1610: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 urn value is a p
1620: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 55 54 ointer to the UT
1630: 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 F-8 representati
1640: 6f 6e 20 6f 66 20 74 68 65 0a 20 2a 09 55 6e 69 on of the. *.Uni
1650: 63 6f 64 65 20 73 74 72 69 6e 67 2e 20 53 74 6f code string. Sto
1660: 72 61 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 rage for the ret
1670: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 70 70 urn value is app
1680: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 ended to the end
1690: 20 6f 66 0a 20 2a 09 64 73 50 74 72 2e 0a 20 2a of. *.dsPtr.. *
16a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
16b0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1710: 0a 63 68 61 72 20 2a 0a 54 63 6c 5f 55 6e 69 43 .char *.Tcl_UniC
1720: 68 61 72 54 6f 55 74 66 44 53 74 72 69 6e 67 28 harToUtfDString(
1730: 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c 5f 55 . const Tcl_U
1740: 6e 69 43 68 61 72 20 2a 75 6e 69 53 74 72 2c 09 niChar *uniStr,.
1750: 2f 2a 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e /* Unicode strin
1760: 67 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 6f 20 g to convert to
1770: 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 20 20 69 6e UTF-8. */. in
1780: 74 20 75 6e 69 4c 65 6e 67 74 68 2c 09 09 2f 2a t uniLength,../*
1790: 20 4c 65 6e 67 74 68 20 6f 66 20 55 6e 69 63 6f Length of Unico
17a0: 64 65 20 73 74 72 69 6e 67 20 69 6e 20 54 63 6c de string in Tcl
17b0: 5f 55 6e 69 43 68 61 72 73 0a 09 09 09 09 20 2a _UniChars..... *
17c0: 20 28 6d 75 73 74 20 62 65 20 3e 3d 20 30 29 2e (must be >= 0).
17d0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
17e0: 69 6e 67 20 2a 64 73 50 74 72 29 09 09 2f 2a 20 ing *dsPtr)../*
17f0: 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 UTF-8 representa
1800: 74 69 6f 6e 20 6f 66 20 73 74 72 69 6e 67 20 69 tion of string i
1810: 73 20 61 70 70 65 6e 64 65 64 0a 09 09 09 09 20 s appended.....
1820: 2a 20 74 6f 20 74 68 69 73 20 70 72 65 76 69 6f * to this previo
1830: 75 73 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 usly initialized
1840: 20 44 53 74 72 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 DString. */.{.
1850: 20 20 20 63 6f 6e 73 74 20 54 63 6c 5f 55 6e 69 const Tcl_Uni
1860: 43 68 61 72 20 2a 77 2c 20 2a 77 45 6e 64 3b 0a Char *w, *wEnd;.
1870: 20 20 20 20 63 68 61 72 20 2a 70 2c 20 2a 73 74 char *p, *st
1880: 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 6f 6c ring;. int ol
1890: 64 4c 65 6e 67 74 68 2c 20 6c 65 6e 20 3d 20 31 dLength, len = 1
18a0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
18b0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 6c 65 UTF-8 string le
18c0: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 77 69 ngth in bytes wi
18d0: 6c 6c 20 62 65 20 3c 3d 20 55 6e 69 63 6f 64 65 ll be <= Unicode
18e0: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 2a string length *
18f0: 20 34 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 4.. */..
1900: 20 6f 6c 64 4c 65 6e 67 74 68 20 3d 20 54 63 6c oldLength = Tcl
1910: 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 64 _DStringLength(d
1920: 73 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 sPtr);. Tcl_D
1930: 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 StringSetLength(
1940: 64 73 50 74 72 2c 20 6f 6c 64 4c 65 6e 67 74 68 dsPtr, oldLength
1950: 20 2b 20 28 75 6e 69 4c 65 6e 67 74 68 20 2b 20 + (uniLength +
1960: 31 29 20 2a 20 34 29 3b 0a 20 20 20 20 73 74 72 1) * 4);. str
1970: 69 6e 67 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e ing = Tcl_DStrin
1980: 67 56 61 6c 75 65 28 64 73 50 74 72 29 20 2b 20 gValue(dsPtr) +
1990: 6f 6c 64 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 oldLength;..
19a0: 70 20 3d 20 73 74 72 69 6e 67 3b 0a 20 20 20 20 p = string;.
19b0: 77 45 6e 64 20 3d 20 75 6e 69 53 74 72 20 2b 20 wEnd = uniStr +
19c0: 75 6e 69 4c 65 6e 67 74 68 3b 0a 20 20 20 20 66 uniLength;. f
19d0: 6f 72 20 28 77 20 3d 20 75 6e 69 53 74 72 3b 20 or (w = uniStr;
19e0: 77 20 3c 20 77 45 6e 64 3b 20 29 20 7b 0a 09 69 w < wEnd; ) {..i
19f0: 66 20 28 21 6c 65 6e 20 26 26 20 28 28 2a 77 20 f (!len && ((*w
1a00: 26 20 30 78 46 43 30 30 29 20 21 3d 20 30 78 44 & 0xFC00) != 0xD
1a10: 43 30 30 29 29 20 7b 0a 09 20 20 20 20 2f 2a 20 C00)) {.. /*
1a20: 53 70 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72 Special case for
1a30: 20 68 61 6e 64 6c 69 6e 67 20 75 70 70 65 72 20 handling upper
1a40: 73 75 72 72 6f 67 61 74 65 73 2e 20 2a 2f 0a 09 surrogates. */..
1a50: 20 20 20 20 70 20 2b 3d 20 54 63 6c 5f 55 6e 69 p += Tcl_Uni
1a60: 43 68 61 72 54 6f 55 74 66 28 2d 31 2c 20 70 29 CharToUtf(-1, p)
1a70: 3b 0a 09 7d 0a 09 6c 65 6e 20 3d 20 54 63 6c 5f ;..}..len = Tcl_
1a80: 55 6e 69 43 68 61 72 54 6f 55 74 66 28 2a 77 2c UniCharToUtf(*w,
1a90: 20 70 29 3b 0a 09 70 20 2b 3d 20 6c 65 6e 3b 0a p);..p += len;.
1aa0: 09 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 .w++;. }.
1ab0: 69 66 20 28 21 6c 65 6e 29 20 7b 0a 09 2f 2a 20 if (!len) {../*
1ac0: 53 70 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72 Special case for
1ad0: 20 68 61 6e 64 6c 69 6e 67 20 75 70 70 65 72 20 handling upper
1ae0: 73 75 72 72 6f 67 61 74 65 73 2e 20 2a 2f 0a 09 surrogates. */..
1af0: 70 20 2b 3d 20 54 63 6c 5f 55 6e 69 43 68 61 72 p += Tcl_UniChar
1b00: 54 6f 55 74 66 28 2d 31 2c 20 70 29 3b 0a 20 20 ToUtf(-1, p);.
1b10: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 }. Tcl_DStr
1b20: 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 64 73 50 ingSetLength(dsP
1b30: 74 72 2c 20 6f 6c 64 4c 65 6e 67 74 68 20 2b 20 tr, oldLength +
1b40: 28 70 20 2d 20 73 74 72 69 6e 67 29 29 3b 0a 0a (p - string));..
1b50: 20 20 20 20 72 65 74 75 72 6e 20 73 74 72 69 6e return strin
1b60: 67 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d g;.}.../*. *----
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
1bc0: 6c 5f 55 74 66 54 6f 55 6e 69 43 68 61 72 20 2d l_UtfToUniChar -
1bd0: 2d 0a 20 2a 0a 20 2a 09 45 78 74 72 61 63 74 20 -. *. *.Extract
1be0: 74 68 65 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 the Tcl_UniChar
1bf0: 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 represented by t
1c00: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e he UTF-8 string.
1c10: 20 42 61 64 20 55 54 46 2d 38 0a 20 2a 09 73 65 Bad UTF-8. *.se
1c20: 71 75 65 6e 63 65 73 20 61 72 65 20 63 6f 6e 76 quences are conv
1c30: 65 72 74 65 64 20 74 6f 20 76 61 6c 69 64 20 54 erted to valid T
1c40: 63 6c 5f 55 6e 69 43 68 61 72 73 20 61 6e 64 20 cl_UniChars and
1c50: 70 72 6f 63 65 73 73 69 6e 67 0a 20 2a 09 63 6f processing. *.co
1c60: 6e 74 69 6e 75 65 73 2e 20 45 71 75 69 76 61 6c ntinues. Equival
1c70: 65 6e 74 20 74 6f 20 50 6c 61 6e 20 39 20 63 68 ent to Plan 9 ch
1c80: 61 72 74 6f 72 75 6e 65 28 29 2e 0a 20 2a 0a 20 artorune().. *.
1c90: 2a 09 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 *.The caller mus
1ca0: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 t ensure that th
1cb0: 65 20 73 6f 75 72 63 65 20 62 75 66 66 65 72 20 e source buffer
1cc0: 69 73 20 6c 6f 6e 67 20 65 6e 6f 75 67 68 20 74 is long enough t
1cd0: 68 61 74 20 74 68 69 73 0a 20 2a 09 72 6f 75 74 hat this. *.rout
1ce0: 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 72 75 6e ine does not run
1cf0: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 61 6e 64 off the end and
1d00: 20 64 65 72 65 66 65 72 65 6e 63 65 20 6e 6f 6e dereference non
1d10: 2d 65 78 69 73 74 65 6e 74 20 6d 65 6d 6f 72 79 -existent memory
1d20: 0a 20 2a 09 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 . *.looking for
1d30: 74 72 61 69 6c 20 62 79 74 65 73 2e 20 49 66 20 trail bytes. If
1d40: 74 68 65 20 73 6f 75 72 63 65 20 62 75 66 66 65 the source buffe
1d50: 72 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 r is known to be
1d60: 20 27 5c 30 27 0a 20 2a 09 74 65 72 6d 69 6e 61 '\0'. *.termina
1d70: 74 65 64 2c 20 74 68 69 73 20 63 61 6e 6e 6f 74 ted, this cannot
1d80: 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 happen. Otherwi
1d90: 73 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 se, the caller s
1da0: 68 6f 75 6c 64 20 63 61 6c 6c 0a 20 2a 09 54 63 hould call. *.Tc
1db0: 6c 5f 55 74 66 43 68 61 72 43 6f 6d 70 6c 65 74 l_UtfCharComplet
1dc0: 65 28 29 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 e() before calli
1dd0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 ng this routine
1de0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 0a 20 to ensure that.
1df0: 2a 09 65 6e 6f 75 67 68 20 62 79 74 65 73 20 72 *.enough bytes r
1e00: 65 6d 61 69 6e 20 69 6e 20 74 68 65 20 73 74 72 emain in the str
1e10: 69 6e 67 2e 0a 20 2a 0a 20 2a 09 49 66 20 54 43 ing.. *. *.If TC
1e20: 4c 5f 55 54 46 5f 4d 41 58 20 3d 3d 20 34 2c 20 L_UTF_MAX == 4,
1e30: 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 special handling
1e40: 20 6f 66 20 53 75 72 72 6f 67 61 74 65 20 70 61 of Surrogate pa
1e50: 69 72 73 20 69 73 20 64 6f 6e 65 3a 0a 20 2a 09 irs is done:. *.
1e60: 46 6f 72 20 61 6e 79 20 55 54 46 2d 38 20 73 74 For any UTF-8 st
1e70: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 ring containing
1e80: 61 20 63 68 61 72 61 63 74 65 72 20 6f 75 74 73 a character outs
1e90: 69 64 65 20 6f 66 20 74 68 65 20 42 4d 50 2c 20 ide of the BMP,
1ea0: 74 68 65 0a 20 2a 09 66 69 72 73 74 20 63 61 6c the. *.first cal
1eb0: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 l to this functi
1ec0: 6f 6e 20 77 69 6c 6c 20 66 69 6c 6c 20 2a 63 68 on will fill *ch
1ed0: 50 74 72 20 77 69 74 68 20 74 68 65 20 68 69 67 Ptr with the hig
1ee0: 68 20 73 75 72 72 6f 67 61 74 65 0a 20 2a 09 61 h surrogate. *.a
1ef0: 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 72 65 nd generate a re
1f00: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 30 2e turn value of 0.
1f10: 20 43 61 6c 6c 69 6e 67 20 54 63 6c 5f 55 74 66 Calling Tcl_Utf
1f20: 54 6f 55 6e 69 43 68 61 72 20 61 67 61 69 6e 0a ToUniChar again.
1f30: 20 2a 09 77 69 6c 6c 20 70 72 6f 64 75 63 65 20 *.will produce
1f40: 74 68 65 20 6c 6f 77 20 73 75 72 72 6f 67 61 74 the low surrogat
1f50: 65 20 61 6e 64 20 61 20 72 65 74 75 72 6e 20 76 e and a return v
1f60: 61 6c 75 65 20 6f 66 20 34 2e 20 42 65 63 61 75 alue of 4. Becau
1f70: 73 65 20 2a 63 68 50 74 72 0a 20 2a 09 69 73 20 se *chPtr. *.is
1f80: 75 73 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 used to remember
1f90: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 69 67 whether the hig
1fa0: 68 20 73 75 72 72 6f 67 61 74 65 20 69 73 20 61 h surrogate is a
1fb0: 6c 72 65 61 64 79 20 70 72 6f 64 75 63 65 64 2c lready produced,
1fc0: 20 69 74 0a 20 2a 09 69 73 20 72 65 63 6f 6d 6d it. *.is recomm
1fd0: 65 6e 64 65 64 20 74 6f 20 69 6e 69 74 69 61 6c ended to initial
1fe0: 69 7a 65 20 74 68 65 20 76 61 72 69 61 62 6c 65 ize the variable
1ff0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 73 it points to as
2000: 20 30 20 62 65 66 6f 72 65 0a 20 2a 09 74 68 65 0 before. *.the
2010: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 54 first call to T
2020: 63 6c 5f 55 74 66 54 6f 55 6e 69 43 68 61 72 20 cl_UtfToUniChar
2030: 69 73 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 52 is done.. *. * R
2040: 65 73 75 6c 74 73 3a 0a 20 2a 09 2a 63 68 50 74 esults:. *.*chPt
2050: 72 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 r is filled with
2060: 20 74 68 65 20 54 63 6c 5f 55 6e 69 43 68 61 72 the Tcl_UniChar
2070: 2c 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e , and the return
2080: 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a 20 2a value is the. *
2090: 09 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 .number of bytes
20a0: 20 66 72 6f 6d 20 74 68 65 20 55 54 46 2d 38 20 from the UTF-8
20b0: 73 74 72 69 6e 67 20 74 68 61 74 20 77 65 72 65 string that were
20c0: 20 63 6f 6e 73 75 6d 65 64 2e 0a 20 2a 0a 20 2a consumed.. *. *
20d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
20e0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
2140: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 atic const unsig
2150: 6e 65 64 20 73 68 6f 72 74 20 63 70 31 32 35 32 ned short cp1252
2160: 5b 33 32 5d 20 3d 20 7b 0a 20 20 30 78 32 30 61 [32] = {. 0x20a
2170: 63 2c 20 20 20 30 78 38 31 2c 20 30 78 32 30 31 c, 0x81, 0x201
2180: 41 2c 20 30 78 30 31 39 32 2c 20 30 78 32 30 31 A, 0x0192, 0x201
2190: 45 2c 20 30 78 32 30 32 36 2c 20 30 78 32 30 32 E, 0x2026, 0x202
21a0: 30 2c 20 30 78 32 30 32 31 2c 0a 20 20 30 78 30 0, 0x2021,. 0x0
21b0: 32 43 36 2c 20 30 78 32 30 33 30 2c 20 30 78 30 2C6, 0x2030, 0x0
21c0: 31 36 30 2c 20 30 78 32 30 33 39 2c 20 30 78 30 160, 0x2039, 0x0
21d0: 31 35 32 2c 20 20 20 30 78 38 44 2c 20 30 78 30 152, 0x8D, 0x0
21e0: 31 37 44 2c 20 20 20 30 78 38 46 2c 0a 20 20 20 17D, 0x8F,.
21f0: 20 30 78 39 30 2c 20 30 78 32 30 31 38 2c 20 30 0x90, 0x2018, 0
2200: 78 32 30 31 39 2c 20 30 78 32 30 31 43 2c 20 30 x2019, 0x201C, 0
2210: 78 32 30 31 44 2c 20 30 78 32 30 32 32 2c 20 30 x201D, 0x2022, 0
2220: 78 32 30 31 33 2c 20 30 78 32 30 31 34 2c 0a 20 x2013, 0x2014,.
2230: 20 20 30 78 32 44 43 2c 20 30 78 32 31 32 32 2c 0x2DC, 0x2122,
2240: 20 30 78 30 31 36 31 2c 20 30 78 32 30 33 41 2c 0x0161, 0x203A,
2250: 20 30 78 30 31 35 33 2c 20 20 20 30 78 39 44 2c 0x0153, 0x9D,
2260: 20 30 78 30 31 37 45 2c 20 30 78 30 31 37 38 0a 0x017E, 0x0178.
2270: 7d 3b 0a 0a 69 6e 74 0a 54 63 6c 5f 55 74 66 54 };..int.Tcl_UtfT
2280: 6f 55 6e 69 43 68 61 72 28 0a 20 20 20 20 72 65 oUniChar(. re
2290: 67 69 73 74 65 72 20 63 6f 6e 73 74 20 63 68 61 gister const cha
22a0: 72 20 2a 73 72 63 2c 09 2f 2a 20 54 68 65 20 55 r *src,./* The U
22b0: 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 2a 2f 0a TF-8 string. */.
22c0: 20 20 20 20 72 65 67 69 73 74 65 72 20 54 63 6c register Tcl
22d0: 5f 55 6e 69 43 68 61 72 20 2a 63 68 50 74 72 29 _UniChar *chPtr)
22e0: 2f 2a 20 46 69 6c 6c 65 64 20 77 69 74 68 20 74 /* Filled with t
22f0: 68 65 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 72 he Tcl_UniChar r
2300: 65 70 72 65 73 65 6e 74 65 64 20 62 79 0a 09 09 epresented by...
2310: 09 09 20 2a 20 74 68 65 20 55 54 46 2d 38 20 73 .. * the UTF-8 s
2320: 74 72 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 20 20 20 tring. */.{.
2330: 72 65 67 69 73 74 65 72 20 69 6e 74 20 62 79 74 register int byt
2340: 65 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 e;.. /*.
2350: 2a 20 55 6e 72 6f 6c 6c 20 31 20 74 6f 20 33 20 * Unroll 1 to 3
2360: 28 6f 72 20 34 29 20 62 79 74 65 20 55 54 46 2d (or 4) byte UTF-
2370: 38 20 73 65 71 75 65 6e 63 65 73 2e 0a 20 20 20 8 sequences..
2380: 20 20 2a 2f 0a 0a 20 20 20 20 62 79 74 65 20 3d */.. byte =
2390: 20 2a 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 *((unsigned cha
23a0: 72 20 2a 29 20 73 72 63 29 3b 0a 20 20 20 20 69 r *) src);. i
23b0: 66 20 28 62 79 74 65 20 3c 20 30 78 43 30 29 20 f (byte < 0xC0)
23c0: 7b 0a 09 2f 2a 0a 09 20 2a 20 48 61 6e 64 6c 65 {../*.. * Handle
23d0: 73 20 70 72 6f 70 65 72 6c 79 20 66 6f 72 6d 65 s properly forme
23e0: 64 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 d UTF-8 characte
23f0: 72 73 20 62 65 74 77 65 65 6e 20 30 78 30 31 20 rs between 0x01
2400: 61 6e 64 20 30 78 37 46 2e 0a 09 20 2a 20 54 72 and 0x7F... * Tr
2410: 65 61 74 73 20 6e 61 6b 65 64 20 74 72 61 69 6c eats naked trail
2420: 20 62 79 74 65 73 20 30 78 38 30 20 74 6f 20 30 bytes 0x80 to 0
2430: 78 39 46 20 61 73 20 76 61 6c 69 64 20 63 68 61 x9F as valid cha
2440: 72 61 63 74 65 72 73 20 66 72 6f 6d 0a 09 20 2a racters from.. *
2450: 20 74 68 65 20 63 70 31 32 35 32 20 74 61 62 6c the cp1252 tabl
2460: 65 2e 20 53 65 65 3a 20 3c 68 74 74 70 73 3a 2f e. See: <https:/
2470: 2f 65 6e 2e 77 69 6b 69 70 65 64 69 61 2e 6f 72 /en.wikipedia.or
2480: 67 2f 77 69 6b 69 2f 55 54 46 2d 38 3e 0a 09 20 g/wiki/UTF-8>..
2490: 2a 20 41 6c 73 6f 20 74 72 65 61 74 73 20 5c 30 * Also treats \0
24a0: 20 61 6e 64 20 6f 74 68 65 72 20 6e 61 6b 65 64 and other naked
24b0: 20 74 72 61 69 6c 20 62 79 74 65 73 20 30 78 41 trail bytes 0xA
24c0: 30 20 74 6f 20 30 78 42 46 20 61 73 20 76 61 6c 0 to 0xBF as val
24d0: 69 64 0a 09 20 2a 20 63 68 61 72 61 63 74 65 72 id.. * character
24e0: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 s representing t
24f0: 68 65 6d 73 65 6c 76 65 73 2e 0a 09 20 2a 2f 0a hemselves... */.
2500: 0a 09 69 66 20 28 28 75 6e 73 69 67 6e 65 64 29 ..if ((unsigned)
2510: 28 62 79 74 65 2d 30 78 38 30 29 20 3c 20 28 75 (byte-0x80) < (u
2520: 6e 73 69 67 6e 65 64 29 20 30 78 32 30 29 20 7b nsigned) 0x20) {
2530: 0a 09 20 20 20 20 2a 63 68 50 74 72 20 3d 20 28 .. *chPtr = (
2540: 54 63 6c 5f 55 6e 69 43 68 61 72 29 20 63 70 31 Tcl_UniChar) cp1
2550: 32 35 32 5b 62 79 74 65 2d 30 78 38 30 5d 3b 0a 252[byte-0x80];.
2560: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a .} else {.. *
2570: 63 68 50 74 72 20 3d 20 28 54 63 6c 5f 55 6e 69 chPtr = (Tcl_Uni
2580: 43 68 61 72 29 20 62 79 74 65 3b 0a 09 7d 0a 09 Char) byte;..}..
2590: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 20 return 1;. }
25a0: 65 6c 73 65 20 69 66 20 28 62 79 74 65 20 3c 20 else if (byte <
25b0: 30 78 45 30 29 20 7b 0a 09 69 66 20 28 28 73 72 0xE0) {..if ((sr
25c0: 63 5b 31 5d 20 26 20 30 78 43 30 29 20 3d 3d 20 c[1] & 0xC0) ==
25d0: 30 78 38 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 0x80) {.. /*.
25e0: 09 20 20 20 20 20 2a 20 54 77 6f 2d 62 79 74 65 . * Two-byte
25f0: 2d 63 68 61 72 61 63 74 65 72 20 6c 65 61 64 2d -character lead-
2600: 62 79 74 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 byte followed by
2610: 20 61 20 74 72 61 69 6c 2d 62 79 74 65 2e 0a 09 a trail-byte...
2620: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 2a 63 */... *c
2630: 68 50 74 72 20 3d 20 28 54 63 6c 5f 55 6e 69 43 hPtr = (Tcl_UniC
2640: 68 61 72 29 20 28 28 28 62 79 74 65 20 26 20 30 har) (((byte & 0
2650: 78 31 46 29 20 3c 3c 20 36 29 20 7c 20 28 73 72 x1F) << 6) | (sr
2660: 63 5b 31 5d 20 26 20 30 78 33 46 29 29 3b 0a 09 c[1] & 0x3F));..
2670: 20 20 20 20 69 66 20 28 28 75 6e 73 69 67 6e 65 if ((unsigne
2680: 64 29 28 2a 63 68 50 74 72 20 2d 20 31 29 20 3e d)(*chPtr - 1) >
2690: 3d 20 28 55 4e 49 43 4f 44 45 5f 53 45 4c 46 20 = (UNICODE_SELF
26a0: 2d 20 31 29 29 20 7b 0a 09 09 72 65 74 75 72 6e - 1)) {...return
26b0: 20 32 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2;.. }..}...
26c0: 2f 2a 0a 09 20 2a 20 41 20 74 77 6f 2d 62 79 74 /*.. * A two-byt
26d0: 65 2d 63 68 61 72 61 63 74 65 72 20 6c 65 61 64 e-character lead
26e0: 2d 62 79 74 65 20 6e 6f 74 20 66 6f 6c 6c 6f 77 -byte not follow
26f0: 65 64 20 62 79 20 74 72 61 69 6c 2d 62 79 74 65 ed by trail-byte
2700: 0a 09 20 2a 20 72 65 70 72 65 73 65 6e 74 73 20 .. * represents
2710: 69 74 73 65 6c 66 2e 0a 09 20 2a 2f 0a 20 20 20 itself... */.
2720: 20 7d 20 65 6c 73 65 20 69 66 20 28 62 79 74 65 } else if (byte
2730: 20 3c 20 30 78 46 30 29 20 7b 0a 09 69 66 20 28 < 0xF0) {..if (
2740: 28 28 73 72 63 5b 31 5d 20 26 20 30 78 43 30 29 ((src[1] & 0xC0)
2750: 20 3d 3d 20 30 78 38 30 29 20 26 26 20 28 28 73 == 0x80) && ((s
2760: 72 63 5b 32 5d 20 26 20 30 78 43 30 29 20 3d 3d rc[2] & 0xC0) ==
2770: 20 30 78 38 30 29 29 20 7b 0a 09 20 20 20 20 2f 0x80)) {.. /
2780: 2a 0a 09 20 20 20 20 20 2a 20 54 68 72 65 65 2d *.. * Three-
2790: 62 79 74 65 2d 63 68 61 72 61 63 74 65 72 20 6c byte-character l
27a0: 65 61 64 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65 ead byte followe
27b0: 64 20 62 79 20 74 77 6f 20 74 72 61 69 6c 20 62 d by two trail b
27c0: 79 74 65 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a ytes... */..
27d0: 09 20 20 20 20 2a 63 68 50 74 72 20 3d 20 28 54 . *chPtr = (T
27e0: 63 6c 5f 55 6e 69 43 68 61 72 29 20 28 28 28 62 cl_UniChar) (((b
27f0: 79 74 65 20 26 20 30 78 30 46 29 20 3c 3c 20 31 yte & 0x0F) << 1
2800: 32 29 0a 09 09 20 20 20 20 7c 20 28 28 73 72 63 2)... | ((src
2810: 5b 31 5d 20 26 20 30 78 33 46 29 20 3c 3c 20 36 [1] & 0x3F) << 6
2820: 29 20 7c 20 28 73 72 63 5b 32 5d 20 26 20 30 78 ) | (src[2] & 0x
2830: 33 46 29 29 3b 0a 09 20 20 20 20 69 66 20 28 2a 3F));.. if (*
2840: 63 68 50 74 72 20 3e 20 30 78 37 46 46 29 20 7b chPtr > 0x7FF) {
2850: 0a 09 09 72 65 74 75 72 6e 20 33 3b 0a 09 20 20 ...return 3;..
2860: 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 }..}.../*.. *
2870: 41 20 74 68 72 65 65 2d 62 79 74 65 2d 63 68 61 A three-byte-cha
2880: 72 61 63 74 65 72 20 6c 65 61 64 2d 62 79 74 65 racter lead-byte
2890: 20 6e 6f 74 20 66 6f 6c 6c 6f 77 65 64 20 62 79 not followed by
28a0: 20 74 77 6f 20 74 72 61 69 6c 2d 62 79 74 65 73 two trail-bytes
28b0: 0a 09 20 2a 20 72 65 70 72 65 73 65 6e 74 73 20 .. * represents
28c0: 69 74 73 65 6c 66 2e 0a 09 20 2a 2f 0a 20 20 20 itself... */.
28d0: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 }. else if (
28e0: 62 79 74 65 20 3c 20 30 78 46 38 29 20 7b 0a 09 byte < 0xF8) {..
28f0: 69 66 20 28 28 28 73 72 63 5b 31 5d 20 26 20 30 if (((src[1] & 0
2900: 78 43 30 29 20 3d 3d 20 30 78 38 30 29 20 26 26 xC0) == 0x80) &&
2910: 20 28 28 73 72 63 5b 32 5d 20 26 20 30 78 43 30 ((src[2] & 0xC0
2920: 29 20 3d 3d 20 30 78 38 30 29 20 26 26 20 28 28 ) == 0x80) && ((
2930: 73 72 63 5b 33 5d 20 26 20 30 78 43 30 29 20 3d src[3] & 0xC0) =
2940: 3d 20 30 78 38 30 29 29 20 7b 0a 09 20 20 20 20 = 0x80)) {..
2950: 2f 2a 0a 09 20 20 20 20 20 2a 20 46 6f 75 72 2d /*.. * Four-
2960: 62 79 74 65 2d 63 68 61 72 61 63 74 65 72 20 6c byte-character l
2970: 65 61 64 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65 ead byte followe
2980: 64 20 62 79 20 74 68 72 65 65 20 74 72 61 69 6c d by three trail
2990: 20 62 79 74 65 73 2e 0a 09 20 20 20 20 20 2a 2f bytes... */
29a0: 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 .#if TCL_UTF_MAX
29b0: 20 3c 3d 20 34 0a 09 20 20 20 20 54 63 6c 5f 55 <= 4.. Tcl_U
29c0: 6e 69 43 68 61 72 20 73 75 72 72 6f 67 61 74 65 niChar surrogate
29d0: 3b 0a 0a 09 20 20 20 20 62 79 74 65 20 3d 20 28 ;... byte = (
29e0: 28 28 62 79 74 65 20 26 20 30 78 30 37 29 20 3c ((byte & 0x07) <
29f0: 3c 20 31 38 29 20 7c 20 28 28 73 72 63 5b 31 5d < 18) | ((src[1]
2a00: 20 26 20 30 78 33 46 29 20 3c 3c 20 31 32 29 0a & 0x3F) << 12).
2a10: 09 09 20 20 20 20 7c 20 28 28 73 72 63 5b 32 5d .. | ((src[2]
2a20: 20 26 20 30 78 33 46 29 20 3c 3c 20 36 29 20 7c & 0x3F) << 6) |
2a30: 20 28 73 72 63 5b 33 5d 20 26 20 30 78 33 46 29 (src[3] & 0x3F)
2a40: 29 20 2d 20 30 78 31 30 30 30 30 3b 0a 09 20 20 ) - 0x10000;..
2a50: 20 20 73 75 72 72 6f 67 61 74 65 20 3d 20 28 54 surrogate = (T
2a60: 63 6c 5f 55 6e 69 43 68 61 72 29 20 28 30 78 44 cl_UniChar) (0xD
2a70: 38 30 30 20 2b 20 28 62 79 74 65 20 3e 3e 20 31 800 + (byte >> 1
2a80: 30 29 29 3b 0a 09 20 20 20 20 69 66 20 28 62 79 0));.. if (by
2a90: 74 65 20 26 20 30 78 31 30 30 30 30 30 29 20 7b te & 0x100000) {
2aa0: 0a 09 09 2f 2a 20 6f 75 74 20 6f 66 20 72 61 6e .../* out of ran
2ab0: 67 65 2c 20 3c 20 30 78 31 30 30 30 30 20 6f 72 ge, < 0x10000 or
2ac0: 20 3e 20 30 78 31 30 66 66 66 66 20 2a 2f 0a 09 > 0x10ffff */..
2ad0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 2a } else if (*
2ae0: 63 68 50 74 72 20 21 3d 20 73 75 72 72 6f 67 61 chPtr != surroga
2af0: 74 65 29 20 7b 0a 09 09 2f 2a 20 70 72 6f 64 75 te) {.../* produ
2b00: 63 65 20 68 69 67 68 20 73 75 72 72 6f 67 61 74 ce high surrogat
2b10: 65 2c 20 62 75 74 20 64 6f 6e 27 74 20 61 64 76 e, but don't adv
2b20: 61 6e 63 65 20 73 6f 75 72 63 65 20 70 6f 69 6e ance source poin
2b30: 74 65 72 20 2a 2f 0a 09 09 2a 63 68 50 74 72 20 ter */...*chPtr
2b40: 3d 20 73 75 72 72 6f 67 61 74 65 3b 0a 09 09 72 = surrogate;...r
2b50: 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 20 eturn 0;.. }
2b60: 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 70 72 6f 64 else {.../* prod
2b70: 75 63 65 20 6c 6f 77 20 73 75 72 72 6f 67 61 74 uce low surrogat
2b80: 65 2c 20 61 6e 64 20 61 64 76 61 6e 63 65 20 73 e, and advance s
2b90: 6f 75 72 63 65 20 70 6f 69 6e 74 65 72 20 2a 2f ource pointer */
2ba0: 0a 09 09 2a 63 68 50 74 72 20 3d 20 28 54 63 6c ...*chPtr = (Tcl
2bb0: 5f 55 6e 69 43 68 61 72 29 20 28 30 78 44 43 30 _UniChar) (0xDC0
2bc0: 30 20 7c 20 28 62 79 74 65 20 26 20 30 78 33 46 0 | (byte & 0x3F
2bd0: 46 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 34 3b F));...return 4;
2be0: 0a 09 20 20 20 20 7d 0a 23 65 6c 73 65 0a 09 20 .. }.#else..
2bf0: 20 20 20 2a 63 68 50 74 72 20 3d 20 28 54 63 6c *chPtr = (Tcl
2c00: 5f 55 6e 69 43 68 61 72 29 20 28 28 28 62 79 74 _UniChar) (((byt
2c10: 65 20 26 20 30 78 30 37 29 20 3c 3c 20 31 38 29 e & 0x07) << 18)
2c20: 20 7c 20 28 28 73 72 63 5b 31 5d 20 26 20 30 78 | ((src[1] & 0x
2c30: 33 46 29 20 3c 3c 20 31 32 29 0a 09 09 20 20 20 3F) << 12)...
2c40: 20 7c 20 28 28 73 72 63 5b 32 5d 20 26 20 30 78 | ((src[2] & 0x
2c50: 33 46 29 20 3c 3c 20 36 29 20 7c 20 28 73 72 63 3F) << 6) | (src
2c60: 5b 33 5d 20 26 20 30 78 33 46 29 29 3b 0a 09 20 [3] & 0x3F));..
2c70: 20 20 20 69 66 20 28 28 75 6e 73 69 67 6e 65 64 if ((unsigned
2c80: 29 28 2a 63 68 50 74 72 20 2d 20 30 78 31 30 30 )(*chPtr - 0x100
2c90: 30 30 29 20 3c 3d 20 30 78 46 46 46 46 46 29 20 00) <= 0xFFFFF)
2ca0: 7b 0a 09 09 72 65 74 75 72 6e 20 34 3b 0a 09 20 {...return 4;..
2cb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a }.#endif..}..
2cc0: 09 2f 2a 0a 09 20 2a 20 41 20 66 6f 75 72 2d 62 ./*.. * A four-b
2cd0: 79 74 65 2d 63 68 61 72 61 63 74 65 72 20 6c 65 yte-character le
2ce0: 61 64 2d 62 79 74 65 20 6e 6f 74 20 66 6f 6c 6c ad-byte not foll
2cf0: 6f 77 65 64 20 62 79 20 74 77 6f 20 74 72 61 69 owed by two trai
2d00: 6c 2d 62 79 74 65 73 0a 09 20 2a 20 72 65 70 72 l-bytes.. * repr
2d10: 65 73 65 6e 74 73 20 69 74 73 65 6c 66 2e 0a 09 esents itself...
2d20: 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a */. }.. *
2d30: 63 68 50 74 72 20 3d 20 28 54 63 6c 5f 55 6e 69 chPtr = (Tcl_Uni
2d40: 43 68 61 72 29 20 62 79 74 65 3b 0a 20 20 20 20 Char) byte;.
2d50: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a return 1;.}.../*
2d60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2db0: 2a 0a 20 2a 20 54 63 6c 5f 55 74 66 54 6f 55 6e *. * Tcl_UtfToUn
2dc0: 69 43 68 61 72 44 53 74 72 69 6e 67 20 2d 2d 0a iCharDString --.
2dd0: 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 74 20 74 68 *. *.Convert th
2de0: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 e UTF-8 string t
2df0: 6f 20 55 6e 69 63 6f 64 65 2e 0a 20 2a 0a 20 2a o Unicode.. *. *
2e00: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 Results:. *.The
2e10: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 return value is
2e20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
2e30: 65 20 55 6e 69 63 6f 64 65 20 72 65 70 72 65 73 e Unicode repres
2e40: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a entation of the.
2e50: 20 2a 09 55 54 46 2d 38 20 73 74 72 69 6e 67 2e *.UTF-8 string.
2e60: 20 53 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 Storage for the
2e70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 return value is
2e80: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 appended to the
2e90: 20 65 6e 64 20 6f 66 0a 20 2a 09 64 73 50 74 72 end of. *.dsPtr
2ea0: 2e 20 54 68 65 20 55 6e 69 63 6f 64 65 20 73 74 . The Unicode st
2eb0: 72 69 6e 67 20 69 73 20 74 65 72 6d 69 6e 61 74 ring is terminat
2ec0: 65 64 20 77 69 74 68 20 61 20 55 6e 69 63 6f 64 ed with a Unicod
2ed0: 65 20 4e 55 4c 4c 20 63 68 61 72 61 63 74 65 72 e NULL character
2ee0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
2ef0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
2f00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2f50: 20 2a 2f 0a 0a 54 63 6c 5f 55 6e 69 43 68 61 72 */..Tcl_UniChar
2f60: 20 2a 0a 54 63 6c 5f 55 74 66 54 6f 55 6e 69 43 *.Tcl_UtfToUniC
2f70: 68 61 72 44 53 74 72 69 6e 67 28 0a 20 20 20 20 harDString(.
2f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 72 63 2c const char *src,
2f90: 09 09 2f 2a 20 55 54 46 2d 38 20 73 74 72 69 6e ../* UTF-8 strin
2fa0: 67 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 6f 20 g to convert to
2fb0: 55 6e 69 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 Unicode. */.
2fc0: 69 6e 74 20 6c 65 6e 67 74 68 2c 09 09 09 2f 2a int length,.../*
2fd0: 20 4c 65 6e 67 74 68 20 6f 66 20 55 54 46 2d 38 Length of UTF-8
2fe0: 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73 string in bytes
2ff0: 2c 20 6f 72 20 2d 31 20 66 6f 72 0a 09 09 09 09 , or -1 for.....
3000: 20 2a 20 73 74 72 6c 65 6e 28 29 2e 20 2a 2f 0a * strlen(). */.
3010: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
3020: 2a 64 73 50 74 72 29 09 09 2f 2a 20 55 6e 69 63 *dsPtr)../* Unic
3030: 6f 64 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 ode representati
3040: 6f 6e 20 6f 66 20 73 74 72 69 6e 67 20 69 73 0a on of string is.
3050: 09 09 09 09 20 2a 20 61 70 70 65 6e 64 65 64 20 .... * appended
3060: 74 6f 20 74 68 69 73 20 70 72 65 76 69 6f 75 73 to this previous
3070: 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 09 ly initialized..
3080: 09 09 09 20 2a 20 44 53 74 72 69 6e 67 2e 20 2a ... * DString. *
3090: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 55 6e 69 43 /.{. Tcl_UniC
30a0: 68 61 72 20 63 68 20 3d 20 30 2c 20 2a 77 2c 20 har ch = 0, *w,
30b0: 2a 77 53 74 72 69 6e 67 3b 0a 20 20 20 20 63 6f *wString;. co
30c0: 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 2a 65 6e nst char *p, *en
30d0: 64 3b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 4c 65 d;. int oldLe
30e0: 6e 67 74 68 3b 0a 0a 20 20 20 20 69 66 20 28 6c ngth;.. if (l
30f0: 65 6e 67 74 68 20 3c 20 30 29 20 7b 0a 09 6c 65 ength < 0) {..le
3100: 6e 67 74 68 20 3d 20 73 74 72 6c 65 6e 28 73 72 ngth = strlen(sr
3110: 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f c);. }.. /
3120: 2a 0a 20 20 20 20 20 2a 20 55 6e 69 63 6f 64 65 *. * Unicode
3130: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 69 string length i
3140: 6e 20 54 63 6c 5f 55 6e 69 43 68 61 72 73 20 77 n Tcl_UniChars w
3150: 69 6c 6c 20 62 65 20 3c 3d 20 55 54 46 2d 38 20 ill be <= UTF-8
3160: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 69 6e string length in
3170: 0a 20 20 20 20 20 2a 20 62 79 74 65 73 2e 0a 20 . * bytes..
3180: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6f 6c 64 4c */.. oldL
3190: 65 6e 67 74 68 20 3d 20 54 63 6c 5f 44 53 74 72 ength = Tcl_DStr
31a0: 69 6e 67 4c 65 6e 67 74 68 28 64 73 50 74 72 29 ingLength(dsPtr)
31b0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
31c0: 6e 67 53 65 74 4c 65 6e 67 74 68 28 64 73 50 74 ngSetLength(dsPt
31d0: 72 2c 0a 09 20 20 20 20 6f 6c 64 4c 65 6e 67 74 r,.. oldLengt
31e0: 68 20 2b 20 28 69 6e 74 29 20 28 28 6c 65 6e 67 h + (int) ((leng
31f0: 74 68 20 2b 20 31 29 20 2a 20 73 69 7a 65 6f 66 th + 1) * sizeof
3200: 28 54 63 6c 5f 55 6e 69 43 68 61 72 29 29 29 3b (Tcl_UniChar)));
3210: 0a 20 20 20 20 77 53 74 72 69 6e 67 20 3d 20 28 . wString = (
3220: 54 63 6c 5f 55 6e 69 43 68 61 72 20 2a 29 20 28 Tcl_UniChar *) (
3230: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
3240: 28 64 73 50 74 72 29 20 2b 20 6f 6c 64 4c 65 6e (dsPtr) + oldLen
3250: 67 74 68 29 3b 0a 0a 20 20 20 20 77 20 3d 20 77 gth);.. w = w
3260: 53 74 72 69 6e 67 3b 0a 20 20 20 20 70 20 3d 20 String;. p =
3270: 73 72 63 3b 0a 20 20 20 20 65 6e 64 20 3d 20 73 src;. end = s
3280: 72 63 20 2b 20 6c 65 6e 67 74 68 20 2d 20 34 3b rc + length - 4;
3290: 0a 20 20 20 20 77 68 69 6c 65 20 28 70 20 3c 20 . while (p <
32a0: 65 6e 64 29 20 7b 0a 09 70 20 2b 3d 20 54 63 6c end) {..p += Tcl
32b0: 55 74 66 54 6f 55 6e 69 43 68 61 72 28 70 2c 20 UtfToUniChar(p,
32c0: 26 63 68 29 3b 0a 09 2a 77 2b 2b 20 3d 20 63 68 &ch);..*w++ = ch
32d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 ;. }. end
32e0: 2b 3d 20 34 3b 0a 20 20 20 20 77 68 69 6c 65 20 += 4;. while
32f0: 28 70 20 3c 20 65 6e 64 29 20 7b 0a 09 69 66 20 (p < end) {..if
3300: 28 54 63 6c 5f 55 74 66 43 68 61 72 43 6f 6d 70 (Tcl_UtfCharComp
3310: 6c 65 74 65 28 70 2c 20 65 6e 64 2d 70 29 29 20 lete(p, end-p))
3320: 7b 0a 09 20 20 20 20 70 20 2b 3d 20 54 63 6c 55 {.. p += TclU
3330: 74 66 54 6f 55 6e 69 43 68 61 72 28 70 2c 20 26 tfToUniChar(p, &
3340: 63 68 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 ch);..} else if
3350: 28 28 75 6e 73 69 67 6e 65 64 29 28 28 55 43 48 ((unsigned)((UCH
3360: 41 52 28 2a 70 29 2d 30 78 38 30 29 29 20 3c 20 AR(*p)-0x80)) <
3370: 28 75 6e 73 69 67 6e 65 64 29 20 30 78 32 30 29 (unsigned) 0x20)
3380: 20 7b 0a 09 20 20 20 20 63 68 20 3d 20 28 54 63 {.. ch = (Tc
3390: 6c 5f 55 6e 69 43 68 61 72 29 20 63 70 31 32 35 l_UniChar) cp125
33a0: 32 5b 55 43 48 41 52 28 2a 70 2b 2b 29 2d 30 78 2[UCHAR(*p++)-0x
33b0: 38 30 5d 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 80];..} else {..
33c0: 20 20 20 20 63 68 20 3d 20 55 43 48 41 52 28 2a ch = UCHAR(*
33d0: 70 2b 2b 29 3b 0a 09 7d 0a 09 2a 77 2b 2b 20 3d p++);..}..*w++ =
33e0: 20 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a ch;. }. *
33f0: 77 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 54 63 w = '\0';. Tc
3400: 6c 5f 44 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 l_DStringSetLeng
3410: 74 68 28 64 73 50 74 72 2c 0a 09 20 20 20 20 6f th(dsPtr,.. o
3420: 6c 64 4c 65 6e 67 74 68 20 2b 20 28 28 63 68 61 ldLength + ((cha
3430: 72 20 2a 29 20 77 20 2d 20 28 63 68 61 72 20 2a r *) w - (char *
3440: 29 20 77 53 74 72 69 6e 67 29 29 3b 0a 0a 20 20 ) wString));..
3450: 20 20 72 65 74 75 72 6e 20 77 53 74 72 69 6e 67 return wString
3460: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
34c0: 5f 55 74 66 43 68 61 72 43 6f 6d 70 6c 65 74 65 _UtfCharComplete
34d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 74 65 72 6d --. *. *.Determ
34e0: 69 6e 65 20 69 66 20 74 68 65 20 55 54 46 2d 38 ine if the UTF-8
34f0: 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 67 string of the g
3500: 69 76 65 6e 20 6c 65 6e 67 74 68 20 69 73 20 6c iven length is l
3510: 6f 6e 67 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 ong enough to be
3520: 0a 20 2a 09 64 65 63 6f 64 65 64 20 62 79 20 54 . *.decoded by T
3530: 63 6c 5f 55 74 66 54 6f 55 6e 69 43 68 61 72 28 cl_UtfToUniChar(
3540: 29 2e 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 ). This does not
3550: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 ensure that the
3560: 20 55 54 46 2d 38 0a 20 2a 09 73 74 72 69 6e 67 UTF-8. *.string
3570: 20 69 73 20 70 72 6f 70 65 72 6c 79 20 66 6f 72 is properly for
3580: 6d 65 64 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 med. Equivalent
3590: 74 6f 20 50 6c 61 6e 20 39 20 66 75 6c 6c 72 75 to Plan 9 fullru
35a0: 6e 65 28 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 ne().. *. * Resu
35b0: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 lts:. *.The retu
35c0: 72 6e 20 76 61 6c 75 65 20 69 73 20 30 20 69 66 rn value is 0 if
35d0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e the string is n
35e0: 6f 74 20 6c 6f 6e 67 20 65 6e 6f 75 67 68 2c 20 ot long enough,
35f0: 6e 6f 6e 2d 7a 65 72 6f 0a 20 2a 09 6f 74 68 65 non-zero. *.othe
3600: 72 77 69 73 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 rwise.. *. * Sid
3610: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
3620: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
3680: 6c 5f 55 74 66 43 68 61 72 43 6f 6d 70 6c 65 74 l_UtfCharComplet
3690: 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 e(. const cha
36a0: 72 20 2a 73 72 63 2c 09 09 2f 2a 20 53 74 72 69 r *src,../* Stri
36b0: 6e 67 20 74 6f 20 63 68 65 63 6b 20 69 66 20 66 ng to check if f
36c0: 69 72 73 74 20 66 65 77 20 62 79 74 65 73 20 63 irst few bytes c
36d0: 6f 6e 74 61 69 6e 0a 09 09 09 09 20 2a 20 61 20 ontain..... * a
36e0: 63 6f 6d 70 6c 65 74 65 20 55 54 46 2d 38 20 63 complete UTF-8 c
36f0: 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 haracter. */.
3700: 20 69 6e 74 20 6c 65 6e 67 74 68 29 09 09 09 2f int length).../
3710: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 62 6f 76 * Length of abov
3720: 65 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 e string in byte
3730: 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 74 75 s. */.{. retu
3740: 72 6e 20 6c 65 6e 67 74 68 20 3e 3d 20 74 6f 74 rn length >= tot
3750: 61 6c 42 79 74 65 73 5b 28 75 6e 73 69 67 6e 65 alBytes[(unsigne
3760: 64 20 63 68 61 72 29 2a 73 72 63 5d 3b 0a 7d 0a d char)*src];.}.
3770: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 4e 75 6d --. *. * Tcl_Num
37d0: 55 74 66 43 68 61 72 73 20 2d 2d 0a 20 2a 0a 20 UtfChars --. *.
37e0: 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 *.Returns the nu
37f0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 mber of characte
3800: 72 73 20 28 6e 6f 74 20 62 79 74 65 73 29 20 69 rs (not bytes) i
3810: 6e 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 n the UTF-8 stri
3820: 6e 67 2c 20 6e 6f 74 0a 20 2a 09 69 6e 63 6c 75 ng, not. *.inclu
3830: 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 ding the termina
3840: 74 69 6e 67 20 4e 55 4c 4c 20 62 79 74 65 2e 20 ting NULL byte.
3850: 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 This is equivale
3860: 6e 74 20 74 6f 20 50 6c 61 6e 20 39 0a 20 2a 09 nt to Plan 9. *.
3870: 75 74 66 6c 65 6e 28 29 20 61 6e 64 20 75 74 66 utflen() and utf
3880: 6e 6c 65 6e 28 29 2e 0a 20 2a 0a 20 2a 20 52 65 nlen().. *. * Re
3890: 73 75 6c 74 73 3a 0a 20 2a 09 41 73 20 61 62 6f sults:. *.As abo
38a0: 76 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ve.. *. * Side e
38b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
38c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4e -. */..int.Tcl_N
3920: 75 6d 55 74 66 43 68 61 72 73 28 0a 20 20 20 20 umUtfChars(.
3930: 72 65 67 69 73 74 65 72 20 63 6f 6e 73 74 20 63 register const c
3940: 68 61 72 20 2a 73 72 63 2c 09 2f 2a 20 54 68 65 har *src,./* The
3950: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f UTF-8 string to
3960: 20 6d 65 61 73 75 72 65 2e 20 2a 2f 0a 20 20 20 measure. */.
3970: 20 69 6e 74 20 6c 65 6e 67 74 68 29 09 09 09 2f int length).../
3980: 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 * The length of
3990: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 62 79 the string in by
39a0: 74 65 73 2c 20 6f 72 20 2d 31 0a 09 09 09 09 20 tes, or -1.....
39b0: 2a 20 66 6f 72 20 73 74 72 6c 65 6e 28 73 74 72 * for strlen(str
39c0: 69 6e 67 29 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 ing). */.{. T
39d0: 63 6c 5f 55 6e 69 43 68 61 72 20 63 68 20 3d 20 cl_UniChar ch =
39e0: 30 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 0;. register
39f0: 69 6e 74 20 69 20 3d 20 30 3b 0a 0a 20 20 20 20 int i = 0;..
3a00: 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 73 65 /*. * The se
3a10: 70 61 72 61 74 65 20 69 6d 70 6c 65 6d 65 6e 74 parate implement
3a20: 61 74 69 6f 6e 73 20 61 72 65 20 66 61 73 74 65 ations are faste
3a30: 72 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a r.. *. *
3a40: 20 53 69 6e 63 65 20 74 68 69 73 20 69 73 20 61 Since this is a
3a50: 20 74 69 6d 65 2d 73 65 6e 73 69 74 69 76 65 20 time-sensitive
3a60: 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 6c 73 function, we als
3a70: 6f 20 64 6f 20 74 68 65 20 63 68 65 63 6b 20 66 o do the check f
3a80: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 73 69 or the. * si
3a90: 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72 20 63 ngle-byte char c
3aa0: 61 73 65 20 73 70 65 63 69 61 6c 6c 79 2e 0a 20 ase specially..
3ab0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
3ac0: 6c 65 6e 67 74 68 20 3c 20 30 29 20 7b 0a 09 77 length < 0) {..w
3ad0: 68 69 6c 65 20 28 2a 73 72 63 20 21 3d 20 27 5c hile (*src != '\
3ae0: 30 27 29 20 7b 0a 09 20 20 20 20 73 72 63 20 2b 0') {.. src +
3af0: 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 = TclUtfToUniCha
3b00: 72 28 73 72 63 2c 20 26 63 68 29 3b 0a 09 20 20 r(src, &ch);..
3b10: 20 20 69 2b 2b 3b 0a 09 7d 0a 09 69 66 20 28 69 i++;..}..if (i
3b20: 20 3c 20 30 29 20 69 20 3d 20 49 4e 54 5f 4d 41 < 0) i = INT_MA
3b30: 58 3b 20 2f 2a 20 42 75 67 20 5b 32 37 33 38 34 X; /* Bug [27384
3b40: 32 37 5d 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 27] */. } els
3b50: 65 20 7b 0a 09 72 65 67 69 73 74 65 72 20 63 6f e {..register co
3b60: 6e 73 74 20 63 68 61 72 20 2a 65 6e 64 50 74 72 nst char *endPtr
3b70: 20 3d 20 73 72 63 20 2b 20 6c 65 6e 67 74 68 20 = src + length
3b80: 2d 20 34 3b 0a 0a 09 77 68 69 6c 65 20 28 73 72 - 4;...while (sr
3b90: 63 20 3c 20 65 6e 64 50 74 72 29 20 7b 0a 09 20 c < endPtr) {..
3ba0: 20 20 20 73 72 63 20 2b 3d 20 54 63 6c 55 74 66 src += TclUtf
3bb0: 54 6f 55 6e 69 43 68 61 72 28 73 72 63 2c 20 26 ToUniChar(src, &
3bc0: 63 68 29 3b 0a 09 20 20 20 20 69 2b 2b 3b 0a 09 ch);.. i++;..
3bd0: 7d 0a 09 65 6e 64 50 74 72 20 2b 3d 20 34 3b 0a }..endPtr += 4;.
3be0: 09 77 68 69 6c 65 20 28 28 73 72 63 20 3c 20 65 .while ((src < e
3bf0: 6e 64 50 74 72 29 20 26 26 20 54 63 6c 5f 55 74 ndPtr) && Tcl_Ut
3c00: 66 43 68 61 72 43 6f 6d 70 6c 65 74 65 28 73 72 fCharComplete(sr
3c10: 63 2c 20 65 6e 64 50 74 72 20 2d 20 73 72 63 29 c, endPtr - src)
3c20: 29 20 7b 0a 09 20 20 20 20 73 72 63 20 2b 3d 20 ) {.. src +=
3c30: 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 TclUtfToUniChar(
3c40: 73 72 63 2c 20 26 63 68 29 3b 0a 09 20 20 20 20 src, &ch);..
3c50: 69 2b 2b 3b 0a 09 7d 0a 09 69 66 20 28 73 72 63 i++;..}..if (src
3c60: 20 3c 20 65 6e 64 50 74 72 29 20 7b 0a 09 20 20 < endPtr) {..
3c70: 20 20 69 20 2b 3d 20 65 6e 64 50 74 72 20 2d 20 i += endPtr -
3c80: 73 72 63 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 src;..}. }.
3c90: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0c 0a return i;.}...
3ca0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cf0: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 66 46 69 . *. * Tcl_UtfFi
3d00: 6e 64 46 69 72 73 74 20 2d 2d 0a 20 2a 0a 20 2a ndFirst --. *. *
3d10: 09 52 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 .Returns a point
3d20: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 er to the first
3d30: 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 74 68 65 occurance of the
3d40: 20 67 69 76 65 6e 20 55 6e 69 63 6f 64 65 20 63 given Unicode c
3d50: 68 61 72 61 63 74 65 72 0a 20 2a 09 69 6e 20 74 haracter. *.in t
3d60: 68 65 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 he NULL-terminat
3d70: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e ed UTF-8 string.
3d80: 20 54 68 65 20 4e 55 4c 4c 20 74 65 72 6d 69 6e The NULL termin
3d90: 61 74 6f 72 20 69 73 20 63 6f 6e 73 69 64 65 72 ator is consider
3da0: 65 64 0a 20 2a 09 70 61 72 74 20 6f 66 20 74 68 ed. *.part of th
3db0: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 e UTF-8 string.
3dc0: 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 50 6c Equivalent to Pl
3dd0: 61 6e 20 39 20 75 74 66 72 75 6e 65 28 29 2e 0a an 9 utfrune()..
3de0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3df0: 2a 09 41 73 20 61 62 6f 76 65 2e 20 49 66 20 74 *.As above. If t
3e00: 68 65 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 he Unicode chara
3e10: 63 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 cter does not ex
3e20: 69 73 74 20 69 6e 20 74 68 65 20 67 69 76 65 6e ist in the given
3e30: 20 73 74 72 69 6e 67 2c 0a 20 2a 09 74 68 65 20 string,. *.the
3e40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 return value is
3e50: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 NULL.. *. * Side
3e60: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
3e70: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 ---. */..const c
3ed0: 68 61 72 20 2a 0a 54 63 6c 5f 55 74 66 46 69 6e har *.Tcl_UtfFin
3ee0: 64 46 69 72 73 74 28 0a 20 20 20 20 63 6f 6e 73 dFirst(. cons
3ef0: 74 20 63 68 61 72 20 2a 73 72 63 2c 09 09 2f 2a t char *src,../*
3f00: 20 54 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e The UTF-8 strin
3f10: 67 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 g to be searched
3f20: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 68 29 . */. int ch)
3f30: 09 09 09 2f 2a 20 54 68 65 20 55 6e 69 63 6f 64 .../* The Unicod
3f40: 65 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 73 e character to s
3f50: 65 61 72 63 68 20 66 6f 72 2e 20 2a 2f 0a 7b 0a earch for. */.{.
3f60: 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 66 75 6c int len, ful
3f70: 6c 63 68 61 72 3b 0a 20 20 20 20 54 63 6c 5f 55 lchar;. Tcl_U
3f80: 6e 69 43 68 61 72 20 66 69 6e 64 20 3d 20 30 3b niChar find = 0;
3f90: 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 20 .. while (1)
3fa0: 7b 0a 09 6c 65 6e 20 3d 20 54 63 6c 55 74 66 54 {..len = TclUtfT
3fb0: 6f 55 6e 69 43 68 61 72 28 73 72 63 2c 20 26 66 oUniChar(src, &f
3fc0: 69 6e 64 29 3b 0a 09 66 75 6c 6c 63 68 61 72 20 ind);..fullchar
3fd0: 3d 20 66 69 6e 64 3b 0a 23 69 66 20 54 43 4c 5f = find;.#if TCL_
3fe0: 55 54 46 5f 4d 41 58 20 3c 3d 20 34 0a 09 69 66 UTF_MAX <= 4..if
3ff0: 20 28 21 6c 65 6e 29 20 7b 0a 09 20 20 20 20 6c (!len) {.. l
4000: 65 6e 20 2b 3d 20 54 63 6c 55 74 66 54 6f 55 6e en += TclUtfToUn
4010: 69 43 68 61 72 28 73 72 63 2c 20 26 66 69 6e 64 iChar(src, &find
4020: 29 3b 0a 09 20 20 20 20 66 75 6c 6c 63 68 61 72 );.. fullchar
4030: 20 3d 20 28 28 28 66 75 6c 6c 63 68 61 72 20 26 = (((fullchar &
4040: 20 30 78 33 66 66 29 20 3c 3c 20 31 30 29 20 7c 0x3ff) << 10) |
4050: 20 28 66 69 6e 64 20 26 20 30 78 33 66 66 29 29 (find & 0x3ff))
4060: 20 2b 20 30 78 31 30 30 30 30 3b 0a 09 7d 0a 23 + 0x10000;..}.#
4070: 65 6e 64 69 66 0a 09 69 66 20 28 66 75 6c 6c 63 endif..if (fullc
4080: 68 61 72 20 3d 3d 20 63 68 29 20 7b 0a 09 20 20 har == ch) {..
4090: 20 20 72 65 74 75 72 6e 20 73 72 63 3b 0a 09 7d return src;..}
40a0: 0a 09 69 66 20 28 2a 73 72 63 20 3d 3d 20 27 5c ..if (*src == '\
40b0: 30 27 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 0') {.. retur
40c0: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 73 72 63 20 n NULL;..}..src
40d0: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 7d 0a += len;. }.}.
40e0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4130: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 66 --. *. * Tcl_Utf
4140: 46 69 6e 64 4c 61 73 74 20 2d 2d 0a 20 2a 0a 20 FindLast --. *.
4150: 2a 09 52 65 74 75 72 6e 73 20 61 20 70 6f 69 6e *.Returns a poin
4160: 74 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 ter to the last
4170: 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 74 68 65 occurance of the
4180: 20 67 69 76 65 6e 20 55 6e 69 63 6f 64 65 20 63 given Unicode c
4190: 68 61 72 61 63 74 65 72 0a 20 2a 09 69 6e 20 74 haracter. *.in t
41a0: 68 65 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 he NULL-terminat
41b0: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e ed UTF-8 string.
41c0: 20 54 68 65 20 4e 55 4c 4c 20 74 65 72 6d 69 6e The NULL termin
41d0: 61 74 6f 72 20 69 73 20 63 6f 6e 73 69 64 65 72 ator is consider
41e0: 65 64 0a 20 2a 09 70 61 72 74 20 6f 66 20 74 68 ed. *.part of th
41f0: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 e UTF-8 string.
4200: 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 50 6c Equivalent to Pl
4210: 61 6e 20 39 20 75 74 66 72 72 75 6e 65 28 29 2e an 9 utfrrune().
4220: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
4230: 20 2a 09 41 73 20 61 62 6f 76 65 2e 20 49 66 20 *.As above. If
4240: 74 68 65 20 55 6e 69 63 6f 64 65 20 63 68 61 72 the Unicode char
4250: 61 63 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 acter does not e
4260: 78 69 73 74 20 69 6e 20 74 68 65 20 67 69 76 65 xist in the give
4270: 6e 20 73 74 72 69 6e 67 2c 20 74 68 65 0a 20 2a n string, the. *
4280: 09 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 .return value is
4290: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 NULL.. *. * Sid
42a0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
42b0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4300: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 ----. */..const
4310: 63 68 61 72 20 2a 0a 54 63 6c 5f 55 74 66 46 69 char *.Tcl_UtfFi
4320: 6e 64 4c 61 73 74 28 0a 20 20 20 20 63 6f 6e 73 ndLast(. cons
4330: 74 20 63 68 61 72 20 2a 73 72 63 2c 09 09 2f 2a t char *src,../*
4340: 20 54 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e The UTF-8 strin
4350: 67 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 g to be searched
4360: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 68 29 . */. int ch)
4370: 09 09 09 2f 2a 20 54 68 65 20 55 6e 69 63 6f 64 .../* The Unicod
4380: 65 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 73 e character to s
4390: 65 61 72 63 68 20 66 6f 72 2e 20 2a 2f 0a 7b 0a earch for. */.{.
43a0: 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 66 75 6c int len, ful
43b0: 6c 63 68 61 72 3b 0a 20 20 20 20 54 63 6c 5f 55 lchar;. Tcl_U
43c0: 6e 69 43 68 61 72 20 66 69 6e 64 20 3d 20 30 3b niChar find = 0;
43d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
43e0: 2a 6c 61 73 74 3b 0a 0a 20 20 20 20 6c 61 73 74 *last;.. last
43f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 = NULL;. whi
4400: 6c 65 20 28 31 29 20 7b 0a 09 6c 65 6e 20 3d 20 le (1) {..len =
4410: 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 TclUtfToUniChar(
4420: 73 72 63 2c 20 26 66 69 6e 64 29 3b 0a 09 66 75 src, &find);..fu
4430: 6c 6c 63 68 61 72 20 3d 20 66 69 6e 64 3b 0a 23 llchar = find;.#
4440: 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3c if TCL_UTF_MAX <
4450: 3d 20 34 0a 09 69 66 20 28 21 6c 65 6e 29 20 7b = 4..if (!len) {
4460: 0a 09 20 20 20 20 6c 65 6e 20 2b 3d 20 54 63 6c .. len += Tcl
4470: 55 74 66 54 6f 55 6e 69 43 68 61 72 28 73 72 63 UtfToUniChar(src
4480: 2c 20 26 66 69 6e 64 29 3b 0a 09 20 20 20 20 66 , &find);.. f
4490: 75 6c 6c 63 68 61 72 20 3d 20 28 28 28 66 75 6c ullchar = (((ful
44a0: 6c 63 68 61 72 20 26 20 30 78 33 66 66 29 20 3c lchar & 0x3ff) <
44b0: 3c 20 31 30 29 20 7c 20 28 66 69 6e 64 20 26 20 < 10) | (find &
44c0: 30 78 33 66 66 29 29 20 2b 20 30 78 31 30 30 30 0x3ff)) + 0x1000
44d0: 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 66 0;..}.#endif..if
44e0: 20 28 66 75 6c 6c 63 68 61 72 20 3d 3d 20 63 68 (fullchar == ch
44f0: 29 20 7b 0a 09 20 20 20 20 6c 61 73 74 20 3d 20 ) {.. last =
4500: 73 72 63 3b 0a 09 7d 0a 09 69 66 20 28 2a 73 72 src;..}..if (*sr
4510: 63 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 20 20 c == '\0') {..
4520: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 73 72 63 break;..}..src
4530: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 += len;. }.
4540: 20 20 20 72 65 74 75 72 6e 20 6c 61 73 74 3b 0a return last;.
4550: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45a0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 ----. *. * Tcl_U
45b0: 74 66 4e 65 78 74 20 2d 2d 0a 20 2a 0a 20 2a 09 tfNext --. *. *.
45c0: 47 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 Given a pointer
45d0: 74 6f 20 73 6f 6d 65 20 63 75 72 72 65 6e 74 20 to some current
45e0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 61 20 55 54 location in a UT
45f0: 46 2d 38 20 73 74 72 69 6e 67 2c 20 6d 6f 76 65 F-8 string, move
4600: 0a 20 2a 09 66 6f 72 77 61 72 64 20 6f 6e 65 20 . *.forward one
4610: 63 68 61 72 61 63 74 65 72 2e 20 54 68 65 20 63 character. The c
4620: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 aller must ensur
4630: 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 e that they are
4640: 6e 6f 74 20 61 73 6b 69 6e 67 0a 20 2a 09 66 6f not asking. *.fo
4650: 72 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61 r the next chara
4660: 63 74 65 72 20 61 66 74 65 72 20 74 68 65 20 6c cter after the l
4670: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e ast character in
4680: 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 20 2a 0a the string.. *.
4690: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
46a0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
46b0: 69 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 is the pointer t
46c0: 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61 o the next chara
46d0: 63 74 65 72 20 69 6e 20 74 68 65 20 55 54 46 2d cter in the UTF-
46e0: 38 0a 20 2a 09 73 74 72 69 6e 67 2e 0a 20 2a 0a 8. *.string.. *.
46f0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4700: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
4760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 0a 54 63 6c const char *.Tcl
4770: 5f 55 74 66 4e 65 78 74 28 0a 20 20 20 20 63 6f _UtfNext(. co
4780: 6e 73 74 20 63 68 61 72 20 2a 73 72 63 29 09 09 nst char *src)..
4790: 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c /* The current l
47a0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 ocation in the s
47b0: 74 72 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 20 20 20 tring. */.{.
47c0: 54 63 6c 5f 55 6e 69 43 68 61 72 20 63 68 20 3d Tcl_UniChar ch =
47d0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 0;. int len
47e0: 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 = TclUtfToUniCha
47f0: 72 28 73 72 63 2c 20 26 63 68 29 3b 0a 0a 23 69 r(src, &ch);..#i
4800: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3c 3d f TCL_UTF_MAX <=
4810: 20 34 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 3d 4. if (len =
4820: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 6c 65 6e = 0) {. len
4830: 20 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 = TclUtfToUniCh
4840: 61 72 28 73 72 63 2c 20 26 63 68 29 3b 0a 20 20 ar(src, &ch);.
4850: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 }.#endif. r
4860: 65 74 75 72 6e 20 73 72 63 20 2b 20 6c 65 6e 3b eturn src + len;
4870: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f -----. *. * Tcl_
48d0: 55 74 66 50 72 65 76 20 2d 2d 0a 20 2a 0a 20 2a UtfPrev --. *. *
48e0: 09 47 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72 .Given a pointer
48f0: 20 74 6f 20 73 6f 6d 65 20 63 75 72 72 65 6e 74 to some current
4900: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 61 20 55 location in a U
4910: 54 46 2d 38 20 73 74 72 69 6e 67 2c 20 6d 6f 76 TF-8 string, mov
4920: 65 0a 20 2a 09 62 61 63 6b 77 61 72 64 73 20 6f e. *.backwards o
4930: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 20 54 68 ne character. Th
4940: 69 73 20 77 6f 72 6b 73 20 63 6f 72 72 65 63 74 is works correct
4950: 6c 79 20 77 68 65 6e 20 74 68 65 20 70 6f 69 6e ly when the poin
4960: 74 65 72 20 69 73 20 69 6e 0a 20 2a 09 74 68 65 ter is in. *.the
4970: 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 55 54 46 middle of a UTF
4980: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a -8 character.. *
4990: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
49a0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 The return value
49b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f is a pointer to
49c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 the previous ch
49d0: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 55 aracter in the U
49e0: 54 46 2d 38 0a 20 2a 09 73 74 72 69 6e 67 2e 20 TF-8. *.string.
49f0: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c If the current l
4a00: 6f 63 61 74 69 6f 6e 20 77 61 73 20 61 6c 72 65 ocation was alre
4a10: 61 64 79 20 61 74 20 74 68 65 20 62 65 67 69 6e ady at the begin
4a20: 6e 69 6e 67 20 6f 66 20 74 68 65 0a 20 2a 09 73 ning of the. *.s
4a30: 74 72 69 6e 67 2c 20 74 68 65 20 72 65 74 75 72 tring, the retur
4a40: 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 61 6c 73 n value will als
4a50: 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 o be a pointer t
4a60: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 o the beginning
4a70: 6f 66 0a 20 2a 09 74 68 65 20 73 74 72 69 6e 67 of. *.the string
4a80: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
4a90: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
4aa0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4af0: 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 */..const char
4b00: 2a 0a 54 63 6c 5f 55 74 66 50 72 65 76 28 0a 20 *.Tcl_UtfPrev(.
4b10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 const char *s
4b20: 72 63 2c 09 09 2f 2a 20 54 68 65 20 63 75 72 72 rc,../* The curr
4b30: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 ent location in
4b40: 74 68 65 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 the string. */.
4b50: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 const char *s
4b60: 74 61 72 74 29 09 09 2f 2a 20 50 6f 69 6e 74 65 tart)../* Pointe
4b70: 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 r to the beginni
4b80: 6e 67 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 ng of the string
4b90: 2c 20 74 6f 0a 09 09 09 09 20 2a 20 61 76 6f 69 , to..... * avoi
4ba0: 64 20 67 6f 69 6e 67 20 62 61 63 6b 77 61 72 64 d going backward
4bb0: 73 20 74 6f 6f 20 66 61 72 2e 20 2a 2f 0a 7b 0a s too far. */.{.
4bc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
4bd0: 6c 6f 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69 2c look;. int i,
4be0: 20 62 79 74 65 3b 0a 0a 20 20 20 20 6c 6f 6f 6b byte;.. look
4bf0: 20 3d 20 2d 2d 73 72 63 3b 0a 20 20 20 20 66 6f = --src;. fo
4c00: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 34 3b r (i = 0; i < 4;
4c10: 20 69 2b 2b 29 20 7b 0a 09 69 66 20 28 6c 6f 6f i++) {..if (loo
4c20: 6b 20 3c 20 73 74 61 72 74 29 20 7b 0a 09 20 20 k < start) {..
4c30: 20 20 69 66 20 28 73 72 63 20 3c 20 73 74 61 72 if (src < star
4c40: 74 29 20 7b 0a 09 09 73 72 63 20 3d 20 73 74 61 t) {...src = sta
4c50: 72 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 rt;.. }..
4c60: 62 72 65 61 6b 3b 0a 09 7d 0a 09 62 79 74 65 20 break;..}..byte
4c70: 3d 20 2a 28 28 75 6e 73 69 67 6e 65 64 20 63 68 = *((unsigned ch
4c80: 61 72 20 2a 29 20 6c 6f 6f 6b 29 3b 0a 09 69 66 ar *) look);..if
4c90: 20 28 62 79 74 65 20 3c 20 30 78 38 30 29 20 7b (byte < 0x80) {
4ca0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a .. break;..}.
4cb0: 09 69 66 20 28 62 79 74 65 20 3e 3d 20 30 78 43 .if (byte >= 0xC
4cc0: 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 0) {.. return
4cd0: 20 6c 6f 6f 6b 3b 0a 09 7d 0a 09 6c 6f 6f 6b 2d look;..}..look-
4ce0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 -;. }. ret
4cf0: 75 72 6e 20 73 72 63 3b 0a 7d 0a 0c 0a 2f 2a 0a urn src;.}.../*.
4d00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4d50: 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 41 . * Tcl_UniCharA
4d60: 74 49 6e 64 65 78 20 2d 2d 0a 20 2a 0a 20 2a 09 tIndex --. *. *.
4d70: 52 65 74 75 72 6e 73 20 74 68 65 20 54 63 6c 5f Returns the Tcl_
4d80: 55 6e 69 43 68 61 72 20 72 65 70 72 65 73 65 6e UniChar represen
4d90: 74 65 64 20 61 74 20 74 68 65 20 73 70 65 63 69 ted at the speci
4da0: 66 69 65 64 20 63 68 61 72 61 63 74 65 72 0a 20 fied character.
4db0: 2a 09 28 6e 6f 74 20 62 79 74 65 29 20 70 6f 73 *.(not byte) pos
4dc0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 55 54 46 ition in the UTF
4dd0: 2d 38 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a -8 string.. *. *
4de0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 73 20 Results:. *.As
4df0: 61 62 6f 76 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 above.. *. * Sid
4e00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
4e10: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e60: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
4e70: 6c 5f 55 6e 69 43 68 61 72 41 74 49 6e 64 65 78 l_UniCharAtIndex
4e80: 28 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 (. register c
4e90: 6f 6e 73 74 20 63 68 61 72 20 2a 73 72 63 2c 09 onst char *src,.
4ea0: 2f 2a 20 54 68 65 20 55 54 46 2d 38 20 73 74 72 /* The UTF-8 str
4eb0: 69 6e 67 20 74 6f 20 64 65 72 65 66 65 72 65 6e ing to dereferen
4ec0: 63 65 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 ce. */. regis
4ed0: 74 65 72 20 69 6e 74 20 69 6e 64 65 78 29 09 09 ter int index)..
4ee0: 2f 2a 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 /* The position
4ef0: 6f 66 20 74 68 65 20 64 65 73 69 72 65 64 20 63 of the desired c
4f00: 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a 7b 0a 20 haracter. */.{.
4f10: 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 63 Tcl_UniChar c
4f20: 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 h = 0;. int f
4f30: 75 6c 6c 63 68 61 72 20 3d 20 30 3b 0a 23 69 66 ullchar = 0;.#if
4f40: 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3c 3d 20 TCL_UTF_MAX <=
4f50: 34 0a 09 69 6e 74 20 6c 65 6e 20 3d 20 31 3b 0a 4..int len = 1;.
4f60: 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c #endif.. whil
4f70: 65 20 28 69 6e 64 65 78 2d 2d 20 3e 3d 20 30 29 e (index-- >= 0)
4f80: 20 7b 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d {.#if TCL_UTF_M
4f90: 41 58 20 3c 3d 20 34 0a 09 73 72 63 20 2b 3d 20 AX <= 4..src +=
4fa0: 28 6c 65 6e 20 3d 20 54 63 6c 55 74 66 54 6f 55 (len = TclUtfToU
4fb0: 6e 69 43 68 61 72 28 73 72 63 2c 20 26 63 68 29 niChar(src, &ch)
4fc0: 29 3b 0a 23 65 6c 73 65 0a 09 73 72 63 20 2b 3d );.#else..src +=
4fd0: 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 TclUtfToUniChar
4fe0: 28 73 72 63 2c 20 26 63 68 29 3b 0a 23 65 6e 64 (src, &ch);.#end
4ff0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 66 75 6c if. }. ful
5000: 6c 63 68 61 72 20 3d 20 63 68 3b 0a 23 69 66 20 lchar = ch;.#if
5010: 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3c 3d 20 34 TCL_UTF_MAX <= 4
5020: 0a 20 20 20 20 20 69 66 20 28 21 6c 65 6e 29 20 . if (!len)
5030: 7b 0a 09 2f 2a 20 49 66 20 6c 61 73 74 20 54 63 {../* If last Tc
5040: 6c 5f 55 6e 69 43 68 61 72 20 77 61 73 20 61 6e l_UniChar was an
5050: 20 75 70 70 65 72 20 73 75 72 72 6f 67 61 74 65 upper surrogate
5060: 2c 20 63 6f 6d 62 69 6e 65 20 77 69 74 68 20 6c , combine with l
5070: 6f 77 65 72 20 73 75 72 72 6f 67 61 74 65 20 2a ower surrogate *
5080: 2f 0a 09 28 76 6f 69 64 29 54 63 6c 55 74 66 54 /..(void)TclUtfT
5090: 6f 55 6e 69 43 68 61 72 28 73 72 63 2c 20 26 63 oUniChar(src, &c
50a0: 68 29 3b 0a 09 66 75 6c 6c 63 68 61 72 20 3d 20 h);..fullchar =
50b0: 28 28 28 66 75 6c 6c 63 68 61 72 20 26 20 30 78 (((fullchar & 0x
50c0: 33 66 66 29 20 3c 3c 20 31 30 29 20 7c 20 28 63 3ff) << 10) | (c
50d0: 68 20 26 20 30 78 33 66 66 29 29 20 2b 20 30 78 h & 0x3ff)) + 0x
50e0: 31 30 30 30 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 10000;. }.#en
50f0: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 66 dif. return f
5100: 75 6c 6c 63 68 61 72 3b 0a 7d 0a 0c 0a 2f 2a 0a ullchar;.}.../*.
5110: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5160: 0a 20 2a 20 54 63 6c 5f 55 74 66 41 74 49 6e 64 . * Tcl_UtfAtInd
5170: 65 78 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 ex --. *. *.Retu
5180: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f rns a pointer to
5190: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 the specified c
51a0: 68 61 72 61 63 74 65 72 20 28 6e 6f 74 20 62 79 haracter (not by
51b0: 74 65 29 20 70 6f 73 69 74 69 6f 6e 20 69 6e 0a te) position in.
51c0: 20 2a 09 74 68 65 20 55 54 46 2d 38 20 73 74 72 *.the UTF-8 str
51d0: 69 6e 67 2e 20 49 66 20 54 43 4c 5f 55 54 46 5f ing. If TCL_UTF_
51e0: 4d 41 58 20 3c 3d 20 34 2c 20 63 68 61 72 61 63 MAX <= 4, charac
51f0: 74 65 72 73 20 3e 20 55 2b 46 46 46 46 20 63 6f ters > U+FFFF co
5200: 75 6e 74 20 61 73 0a 20 2a 09 32 20 70 6f 73 69 unt as. *.2 posi
5210: 74 69 6f 6e 73 2c 20 62 75 74 20 74 68 65 6e 20 tions, but then
5220: 74 68 65 20 70 6f 69 6e 74 65 72 20 73 68 6f 75 the pointer shou
5230: 6c 64 20 6e 65 76 65 72 20 62 65 20 70 6c 61 63 ld never be plac
5240: 65 64 20 62 65 74 77 65 65 6e 0a 20 2a 09 74 68 ed between. *.th
5250: 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 73 2e e two positions.
5260: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5270: 20 2a 09 41 73 20 61 62 6f 76 65 2e 0a 20 2a 0a *.As above.. *.
5280: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5290: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
52f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 0a 54 63 6c const char *.Tcl
5300: 5f 55 74 66 41 74 49 6e 64 65 78 28 0a 20 20 20 _UtfAtIndex(.
5310: 20 72 65 67 69 73 74 65 72 20 63 6f 6e 73 74 20 register const
5320: 63 68 61 72 20 2a 73 72 63 2c 09 2f 2a 20 54 68 char *src,./* Th
5330: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 e UTF-8 string.
5340: 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 */. register
5350: 69 6e 74 20 69 6e 64 65 78 29 09 09 2f 2a 20 54 int index)../* T
5360: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 he position of t
5370: 68 65 20 64 65 73 69 72 65 64 20 63 68 61 72 61 he desired chara
5380: 63 74 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 cter. */.{. T
5390: 63 6c 5f 55 6e 69 43 68 61 72 20 63 68 20 3d 20 cl_UniChar ch =
53a0: 30 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 0;. int len =
53b0: 20 31 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 1;.. while (
53c0: 69 6e 64 65 78 2d 2d 20 3e 20 30 29 20 7b 0a 09 index-- > 0) {..
53d0: 6c 65 6e 20 3d 20 54 63 6c 55 74 66 54 6f 55 6e len = TclUtfToUn
53e0: 69 43 68 61 72 28 73 72 63 2c 20 26 63 68 29 3b iChar(src, &ch);
53f0: 0a 09 73 72 63 20 2b 3d 20 6c 65 6e 3b 0a 20 20 ..src += len;.
5400: 20 20 7d 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f }.#if TCL_UTF_
5410: 4d 41 58 20 3c 3d 20 34 0a 20 20 20 20 20 69 66 MAX <= 4. if
5420: 20 28 21 6c 65 6e 29 20 7b 0a 09 2f 2a 20 49 6e (!len) {../* In
5430: 64 65 78 20 70 6f 69 6e 74 73 20 61 74 20 63 68 dex points at ch
5440: 61 72 61 63 74 65 72 20 66 6f 6c 6c 6f 77 69 6e aracter followin
5450: 67 20 48 69 67 68 20 53 75 72 72 6f 67 61 74 65 g High Surrogate
5460: 20 2a 2f 0a 09 73 72 63 20 2b 3d 20 54 63 6c 55 */..src += TclU
5470: 74 66 54 6f 55 6e 69 43 68 61 72 28 73 72 63 2c tfToUniChar(src,
5480: 20 26 63 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e &ch);. }.#en
5490: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 73 dif. return s
54a0: 72 63 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d rc;.}.../*. *---
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
5500: 63 6c 5f 55 74 66 42 61 63 6b 73 6c 61 73 68 20 cl_UtfBackslash
5510: 2d 2d 0a 20 2a 0a 20 2a 09 46 69 67 75 72 65 20 --. *. *.Figure
5520: 6f 75 74 20 68 6f 77 20 74 6f 20 68 61 6e 64 6c out how to handl
5530: 65 20 61 20 62 61 63 6b 73 6c 61 73 68 20 73 65 e a backslash se
5540: 71 75 65 6e 63 65 2e 0a 20 2a 0a 20 2a 20 52 65 quence.. *. * Re
5550: 73 75 6c 74 73 3a 0a 20 2a 09 53 74 6f 72 65 73 sults:. *.Stores
5560: 20 74 68 65 20 62 79 74 65 73 20 72 65 70 72 65 the bytes repre
5570: 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 62 61 sented by the ba
5580: 63 6b 73 6c 61 73 68 20 73 65 71 75 65 6e 63 65 ckslash sequence
5590: 20 69 6e 20 64 73 74 20 61 6e 64 0a 20 2a 09 72 in dst and. *.r
55a0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 eturns the numbe
55b0: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 r of bytes writt
55c0: 65 6e 20 74 6f 20 64 73 74 2e 20 41 74 20 6d 6f en to dst. At mo
55d0: 73 74 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 62 st TCL_UTF_MAX b
55e0: 79 74 65 73 0a 20 2a 09 61 72 65 20 77 72 69 74 ytes. *.are writ
55f0: 74 65 6e 20 74 6f 20 64 73 74 3b 20 64 73 74 20 ten to dst; dst
5600: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6c must have been l
5610: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 arge enough to a
5620: 63 63 65 70 74 20 74 68 6f 73 65 0a 20 2a 09 62 ccept those. *.b
5630: 79 74 65 73 2e 20 49 66 20 72 65 61 64 50 74 72 ytes. If readPtr
5640: 20 69 73 6e 27 74 20 4e 55 4c 4c 20 74 68 65 6e isn't NULL then
5650: 20 69 74 20 69 73 20 66 69 6c 6c 65 64 20 69 6e it is filled in
5660: 20 77 69 74 68 20 61 20 63 6f 75 6e 74 20 6f 66 with a count of
5670: 20 74 68 65 0a 20 2a 09 6e 75 6d 62 65 72 20 6f the. *.number o
5680: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 62 f bytes in the b
5690: 61 63 6b 73 6c 61 73 68 20 73 65 71 75 65 6e 63 ackslash sequenc
56a0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
56b0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 6d 61 fects:. *.The ma
56c0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 ximum number of
56d0: 62 79 74 65 73 20 69 74 20 74 61 6b 65 73 20 74 bytes it takes t
56e0: 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 55 6e o represent a Un
56f0: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 0a icode character.
5700: 20 2a 09 69 6e 20 55 54 46 2d 38 20 69 73 20 67 *.in UTF-8 is g
5710: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 uaranteed to be
5720: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6e 75 less than the nu
5730: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 75 73 mber of bytes us
5740: 65 64 20 74 6f 0a 20 2a 09 65 78 70 72 65 73 73 ed to. *.express
5750: 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 20 73 the backslash s
5760: 65 71 75 65 6e 63 65 20 74 68 61 74 20 72 65 70 equence that rep
5770: 72 65 73 65 6e 74 73 20 74 68 61 74 20 55 6e 69 resents that Uni
5780: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a code character..
5790: 20 2a 09 49 66 20 74 68 65 20 74 61 72 67 65 74 *.If the target
57a0: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 77 68 69 buffer into whi
57b0: 63 68 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 ch the caller is
57c0: 20 67 6f 69 6e 67 20 74 6f 20 73 74 6f 72 65 20 going to store
57d0: 74 68 65 20 62 79 74 65 73 0a 20 2a 09 74 68 61 the bytes. *.tha
57e0: 74 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 t represent the
57f0: 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 Unicode characte
5800: 72 20 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 r is at least as
5810: 20 6c 61 72 67 65 20 61 73 20 74 68 65 0a 20 2a large as the. *
5820: 09 73 6f 75 72 63 65 20 62 75 66 66 65 72 20 66 .source buffer f
5830: 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20 62 61 rom which the ba
5840: 63 6b 73 6c 61 73 68 65 64 20 73 65 71 75 65 6e ckslashed sequen
5850: 63 65 20 77 61 73 20 65 78 74 72 61 63 74 65 64 ce was extracted
5860: 2c 20 6e 6f 0a 20 2a 09 62 75 66 66 65 72 20 6f , no. *.buffer o
5870: 76 65 72 72 75 6e 73 20 73 68 6f 75 6c 64 20 6f verruns should o
5880: 63 63 75 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ccur.. *. *-----
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
58e0: 54 63 6c 5f 55 74 66 42 61 63 6b 73 6c 61 73 68 Tcl_UtfBackslash
58f0: 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 (. const char
5900: 20 2a 73 72 63 2c 09 09 2f 2a 20 50 6f 69 6e 74 *src,../* Point
5910: 73 20 74 6f 20 74 68 65 20 62 61 63 6b 73 6c 61 s to the backsla
5920: 73 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 sh character of
5930: 61 0a 09 09 09 09 20 2a 20 62 61 63 6b 73 6c 61 a..... * backsla
5940: 73 68 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a sh sequence. */.
5950: 20 20 20 20 69 6e 74 20 2a 72 65 61 64 50 74 72 int *readPtr
5960: 2c 09 09 2f 2a 20 46 69 6c 6c 20 69 6e 20 77 69 ,../* Fill in wi
5970: 74 68 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 th number of cha
5980: 72 61 63 74 65 72 73 20 72 65 61 64 20 66 72 6f racters read fro
5990: 6d 0a 09 09 09 09 20 2a 20 73 72 63 2c 20 75 6e m..... * src, un
59a0: 6c 65 73 73 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 less NULL. */.
59b0: 20 20 63 68 61 72 20 2a 64 73 74 29 09 09 09 2f char *dst).../
59c0: 2a 20 46 69 6c 6c 65 64 20 77 69 74 68 20 74 68 * Filled with th
59d0: 65 20 62 79 74 65 73 20 72 65 70 72 65 73 65 6e e bytes represen
59e0: 74 65 64 20 62 79 20 74 68 65 0a 09 09 09 09 20 ted by the.....
59f0: 2a 20 62 61 63 6b 73 6c 61 73 68 20 73 65 71 75 * backslash sequ
5a00: 65 6e 63 65 2e 20 2a 2f 0a 7b 0a 23 64 65 66 69 ence. */.{.#defi
5a10: 6e 65 20 4c 49 4e 45 5f 4c 45 4e 47 54 48 20 31 ne LINE_LENGTH 1
5a20: 32 38 0a 20 20 20 20 69 6e 74 20 6e 75 6d 52 65 28. int numRe
5a30: 61 64 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 75 ad;. int resu
5a40: 6c 74 3b 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 lt;.. result
5a50: 3d 20 54 63 6c 50 61 72 73 65 42 61 63 6b 73 6c = TclParseBacksl
5a60: 61 73 68 28 73 72 63 2c 20 4c 49 4e 45 5f 4c 45 ash(src, LINE_LE
5a70: 4e 47 54 48 2c 20 26 6e 75 6d 52 65 61 64 2c 20 NGTH, &numRead,
5a80: 64 73 74 29 3b 0a 20 20 20 20 69 66 20 28 6e 75 dst);. if (nu
5a90: 6d 52 65 61 64 20 3d 3d 20 4c 49 4e 45 5f 4c 45 mRead == LINE_LE
5aa0: 4e 47 54 48 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NGTH) {../*.. *
5ab0: 57 65 20 61 74 65 20 61 20 77 68 6f 6c 65 20 6c We ate a whole l
5ac0: 69 6e 65 2e 20 50 61 79 20 74 68 65 20 70 72 69 ine. Pay the pri
5ad0: 63 65 20 6f 66 20 61 20 73 74 72 6c 65 6e 28 29 ce of a strlen()
5ae0: 0a 09 20 2a 2f 0a 0a 09 72 65 73 75 6c 74 20 3d .. */...result =
5af0: 20 54 63 6c 50 61 72 73 65 42 61 63 6b 73 6c 61 TclParseBacksla
5b00: 73 68 28 73 72 63 2c 20 28 69 6e 74 29 73 74 72 sh(src, (int)str
5b10: 6c 65 6e 28 73 72 63 29 2c 20 26 6e 75 6d 52 65 len(src), &numRe
5b20: 61 64 2c 20 64 73 74 29 3b 0a 20 20 20 20 7d 0a ad, dst);. }.
5b30: 20 20 20 20 69 66 20 28 72 65 61 64 50 74 72 20 if (readPtr
5b40: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 72 65 61 != NULL) {..*rea
5b50: 64 50 74 72 20 3d 20 6e 75 6d 52 65 61 64 3b 0a dPtr = numRead;.
5b60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
5b70: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a result;.}.../*.
5b80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
5bd0: 63 6c 5f 55 74 66 54 6f 55 70 70 65 72 20 2d 2d cl_UtfToUpper --
5be0: 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 74 20 6c . *. *.Convert l
5bf0: 6f 77 65 72 63 61 73 65 20 63 68 61 72 61 63 74 owercase charact
5c00: 65 72 73 20 74 6f 20 75 70 70 65 72 63 61 73 65 ers to uppercase
5c10: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 61 characters in a
5c20: 20 55 54 46 20 73 74 72 69 6e 67 0a 20 2a 09 69 UTF string. *.i
5c30: 6e 20 70 6c 61 63 65 2e 20 54 68 65 20 63 6f 6e n place. The con
5c40: 76 65 72 73 69 6f 6e 20 6d 61 79 20 73 68 72 69 version may shri
5c50: 6e 6b 20 74 68 65 20 55 54 46 20 73 74 72 69 6e nk the UTF strin
5c60: 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 g.. *. * Results
5c70: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65 :. *.Returns the
5c80: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
5c90: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e in the resultin
5ca0: 67 20 73 74 72 69 6e 67 20 65 78 63 6c 75 64 69 g string excludi
5cb0: 6e 67 20 74 68 65 0a 20 2a 09 74 72 61 69 6c 69 ng the. *.traili
5cc0: 6e 67 20 6e 75 6c 6c 2e 0a 20 2a 0a 20 2a 20 53 ng null.. *. * S
5cd0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
5ce0: 57 72 69 74 65 73 20 61 20 74 65 72 6d 69 6e 61 Writes a termina
5cf0: 74 69 6e 67 20 6e 75 6c 6c 20 61 66 74 65 72 20 ting null after
5d00: 74 68 65 20 6c 61 73 74 20 63 6f 6e 76 65 72 74 the last convert
5d10: 65 64 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a ed character.. *
5d20: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 ---------. */..i
5d70: 6e 74 0a 54 63 6c 5f 55 74 66 54 6f 55 70 70 65 nt.Tcl_UtfToUppe
5d80: 72 28 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 r(. char *str
5d90: 29 09 09 09 2f 2a 20 53 74 72 69 6e 67 20 74 6f ).../* String to
5da0: 20 63 6f 6e 76 65 72 74 20 69 6e 20 70 6c 61 63 convert in plac
5db0: 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f e. */.{. Tcl_
5dc0: 55 6e 69 43 68 61 72 20 63 68 20 3d 20 30 3b 0a UniChar ch = 0;.
5dd0: 20 20 20 20 69 6e 74 20 75 70 43 68 61 72 3b 0a int upChar;.
5de0: 20 20 20 20 63 68 61 72 20 2a 73 72 63 2c 20 2a char *src, *
5df0: 64 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 dst;. int byt
5e00: 65 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 es;.. /*.
5e10: 20 2a 20 49 74 65 72 61 74 65 20 6f 76 65 72 20 * Iterate over
5e20: 74 68 65 20 73 74 72 69 6e 67 20 75 6e 74 69 6c the string until
5e30: 20 77 65 20 68 69 74 20 74 68 65 20 74 65 72 6d we hit the term
5e40: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 2e 0a 20 20 inating null..
5e50: 20 20 20 2a 2f 0a 0a 20 20 20 20 73 72 63 20 3d */.. src =
5e60: 20 64 73 74 20 3d 20 73 74 72 3b 0a 20 20 20 20 dst = str;.
5e70: 77 68 69 6c 65 20 28 2a 73 72 63 29 20 7b 0a 09 while (*src) {..
5e80: 62 79 74 65 73 20 3d 20 54 63 6c 55 74 66 54 6f bytes = TclUtfTo
5e90: 55 6e 69 43 68 61 72 28 73 72 63 2c 20 26 63 68 UniChar(src, &ch
5ea0: 29 3b 0a 09 75 70 43 68 61 72 20 3d 20 63 68 3b );..upChar = ch;
5eb0: 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 .#if TCL_UTF_MAX
5ec0: 20 3c 3d 20 34 0a 09 69 66 20 28 21 62 79 74 65 <= 4..if (!byte
5ed0: 73 29 20 7b 0a 09 20 20 20 20 2f 2a 20 54 63 6c s) {.. /* Tcl
5ee0: 55 74 66 54 6f 55 6e 69 43 68 61 72 20 6f 6e 6c UtfToUniChar onl
5ef0: 79 20 72 65 74 75 72 6e 73 20 30 20 66 6f 72 20 y returns 0 for
5f00: 63 68 61 72 73 20 3e 20 30 78 66 66 66 66 20 21 chars > 0xffff !
5f10: 20 2a 2f 0a 09 20 20 20 20 62 79 74 65 73 20 3d */.. bytes =
5f20: 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 TclUtfToUniChar
5f30: 28 73 72 63 2c 20 26 63 68 29 3b 0a 09 20 20 20 (src, &ch);..
5f40: 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 73 75 72 72 /* Combine surr
5f50: 6f 67 61 74 65 73 20 2a 2f 0a 09 20 20 20 20 75 ogates */.. u
5f60: 70 43 68 61 72 20 3d 20 28 28 28 75 70 43 68 61 pChar = (((upCha
5f70: 72 20 26 20 30 78 33 66 66 29 20 3c 3c 20 31 30 r & 0x3ff) << 10
5f80: 29 20 7c 20 28 63 68 20 26 20 30 78 33 66 66 29 ) | (ch & 0x3ff)
5f90: 29 20 2b 20 30 78 31 30 30 30 30 3b 0a 09 7d 0a ) + 0x10000;..}.
5fa0: 23 65 6e 64 69 66 0a 09 75 70 43 68 61 72 20 3d #endif..upChar =
5fb0: 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 70 Tcl_UniCharToUp
5fc0: 70 65 72 28 75 70 43 68 61 72 29 3b 0a 0a 09 2f per(upChar);.../
5fd0: 2a 0a 09 20 2a 20 54 6f 20 6b 65 65 70 20 62 61 *.. * To keep ba
5fe0: 64 6c 79 20 66 6f 72 6d 65 64 20 55 74 66 20 73 dly formed Utf s
5ff0: 74 72 69 6e 67 73 20 66 72 6f 6d 20 67 65 74 74 trings from gett
6000: 69 6e 67 20 69 6e 66 6c 61 74 65 64 20 62 79 20 ing inflated by
6010: 74 68 65 0a 09 20 2a 20 63 6f 6e 76 65 72 73 69 the.. * conversi
6020: 6f 6e 20 28 74 68 65 72 65 62 79 20 63 61 75 73 on (thereby caus
6030: 69 6e 67 20 61 20 73 65 67 66 61 75 6c 74 29 2c ing a segfault),
6040: 20 6f 6e 6c 79 20 63 6f 70 79 20 74 68 65 20 75 only copy the u
6050: 70 70 65 72 20 63 61 73 65 0a 09 20 2a 20 63 68 pper case.. * ch
6060: 61 72 20 74 6f 20 64 73 74 20 69 66 20 69 74 73 ar to dst if its
6070: 20 73 69 7a 65 20 69 73 20 3c 3d 20 74 68 65 20 size is <= the
6080: 6f 72 69 67 69 6e 61 6c 20 63 68 61 72 2e 0a 09 original char...
6090: 20 2a 2f 0a 0a 09 69 66 20 28 28 62 79 74 65 73 */...if ((bytes
60a0: 20 3c 20 54 63 6c 55 74 66 43 6f 75 6e 74 28 75 < TclUtfCount(u
60b0: 70 43 68 61 72 29 29 20 7c 7c 20 28 28 75 70 43 pChar)) || ((upC
60c0: 68 61 72 20 26 20 30 78 46 38 30 30 29 20 3d 3d har & 0xF800) ==
60d0: 20 30 78 44 38 30 30 29 29 20 7b 0a 09 20 20 20 0xD800)) {..
60e0: 20 6d 65 6d 63 70 79 28 64 73 74 2c 20 73 72 63 memcpy(dst, src
60f0: 2c 20 28 73 69 7a 65 5f 74 29 20 62 79 74 65 73 , (size_t) bytes
6100: 29 3b 0a 09 20 20 20 20 64 73 74 20 2b 3d 20 62 );.. dst += b
6110: 79 74 65 73 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a ytes;..} else {.
6120: 09 20 20 20 20 64 73 74 20 2b 3d 20 54 63 6c 5f . dst += Tcl_
6130: 55 6e 69 43 68 61 72 54 6f 55 74 66 28 75 70 43 UniCharToUtf(upC
6140: 68 61 72 2c 20 64 73 74 29 3b 0a 09 7d 0a 09 73 har, dst);..}..s
6150: 72 63 20 2b 3d 20 62 79 74 65 73 3b 0a 20 20 20 rc += bytes;.
6160: 20 7d 0a 20 20 20 20 2a 64 73 74 20 3d 20 27 5c }. *dst = '\
6170: 30 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 0';. return (
6180: 64 73 74 20 2d 20 73 74 72 29 3b 0a 7d 0a 0c 0a dst - str);.}...
6190: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
61e0: 2a 20 54 63 6c 5f 55 74 66 54 6f 4c 6f 77 65 72 * Tcl_UtfToLower
61f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 --. *. *.Conver
6200: 74 20 75 70 70 65 72 63 61 73 65 20 63 68 61 72 t uppercase char
6210: 61 63 74 65 72 73 20 74 6f 20 6c 6f 77 65 72 63 acters to lowerc
6220: 61 73 65 20 63 68 61 72 61 63 74 65 72 73 20 69 ase characters i
6230: 6e 20 61 20 55 54 46 20 73 74 72 69 6e 67 0a 20 n a UTF string.
6240: 2a 09 69 6e 20 70 6c 61 63 65 2e 20 54 68 65 20 *.in place. The
6250: 63 6f 6e 76 65 72 73 69 6f 6e 20 6d 61 79 20 73 conversion may s
6260: 68 72 69 6e 6b 20 74 68 65 20 55 54 46 20 73 74 hrink the UTF st
6270: 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 ring.. *. * Resu
6280: 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 lts:. *.Returns
6290: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
62a0: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c tes in the resul
62b0: 74 69 6e 67 20 73 74 72 69 6e 67 20 65 78 63 6c ting string excl
62c0: 75 64 69 6e 67 20 74 68 65 0a 20 2a 09 74 72 61 uding the. *.tra
62d0: 69 6c 69 6e 67 20 6e 75 6c 6c 2e 0a 20 2a 0a 20 iling null.. *.
62e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
62f0: 20 2a 09 57 72 69 74 65 73 20 61 20 74 65 72 6d *.Writes a term
6300: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 61 66 74 inating null aft
6310: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 76 er the last conv
6320: 65 72 74 65 64 20 63 68 61 72 61 63 74 65 72 2e erted character.
6330: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
6380: 0a 0a 69 6e 74 0a 54 63 6c 5f 55 74 66 54 6f 4c ..int.Tcl_UtfToL
6390: 6f 77 65 72 28 0a 20 20 20 20 63 68 61 72 20 2a ower(. char *
63a0: 73 74 72 29 09 09 09 2f 2a 20 53 74 72 69 6e 67 str).../* String
63b0: 20 74 6f 20 63 6f 6e 76 65 72 74 20 69 6e 20 70 to convert in p
63c0: 6c 61 63 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 lace. */.{. T
63d0: 63 6c 5f 55 6e 69 43 68 61 72 20 63 68 20 3d 20 cl_UniChar ch =
63e0: 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 77 43 68 0;. int lowCh
63f0: 61 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 72 ar;. char *sr
6400: 63 2c 20 2a 64 73 74 3b 0a 20 20 20 20 69 6e 74 c, *dst;. int
6410: 20 62 79 74 65 73 3b 0a 0a 20 20 20 20 2f 2a 0a bytes;.. /*.
6420: 20 20 20 20 20 2a 20 49 74 65 72 61 74 65 20 6f * Iterate o
6430: 76 65 72 20 74 68 65 20 73 74 72 69 6e 67 20 75 ver the string u
6440: 6e 74 69 6c 20 77 65 20 68 69 74 20 74 68 65 20 ntil we hit the
6450: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c terminating null
6460: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 .. */.. s
6470: 72 63 20 3d 20 64 73 74 20 3d 20 73 74 72 3b 0a rc = dst = str;.
6480: 20 20 20 20 77 68 69 6c 65 20 28 2a 73 72 63 29 while (*src)
6490: 20 7b 0a 09 62 79 74 65 73 20 3d 20 54 63 6c 55 {..bytes = TclU
64a0: 74 66 54 6f 55 6e 69 43 68 61 72 28 73 72 63 2c tfToUniChar(src,
64b0: 20 26 63 68 29 3b 0a 09 6c 6f 77 43 68 61 72 20 &ch);..lowChar
64c0: 3d 20 63 68 3b 0a 23 69 66 20 54 43 4c 5f 55 54 = ch;.#if TCL_UT
64d0: 46 5f 4d 41 58 20 3c 3d 20 34 0a 09 69 66 20 28 F_MAX <= 4..if (
64e0: 21 62 79 74 65 73 29 20 7b 0a 09 20 20 20 20 2f !bytes) {.. /
64f0: 2a 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 * TclUtfToUniCha
6500: 72 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 30 r only returns 0
6510: 20 66 6f 72 20 63 68 61 72 73 20 3e 20 30 78 66 for chars > 0xf
6520: 66 66 66 20 21 20 2a 2f 0a 09 20 20 20 20 62 79 fff ! */.. by
6530: 74 65 73 20 3d 20 54 63 6c 55 74 66 54 6f 55 6e tes = TclUtfToUn
6540: 69 43 68 61 72 28 73 72 63 2c 20 26 63 68 29 3b iChar(src, &ch);
6550: 0a 09 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 .. /* Combine
6560: 20 73 75 72 72 6f 67 61 74 65 73 20 2a 2f 0a 09 surrogates */..
6570: 20 20 20 20 6c 6f 77 43 68 61 72 20 3d 20 28 28 lowChar = ((
6580: 28 6c 6f 77 43 68 61 72 20 26 20 30 78 33 66 66 (lowChar & 0x3ff
6590: 29 20 3c 3c 20 31 30 29 20 7c 20 28 63 68 20 26 ) << 10) | (ch &
65a0: 20 30 78 33 66 66 29 29 20 2b 20 30 78 31 30 30 0x3ff)) + 0x100
65b0: 30 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 6c 00;..}.#endif..l
65c0: 6f 77 43 68 61 72 20 3d 20 54 63 6c 5f 55 6e 69 owChar = Tcl_Uni
65d0: 43 68 61 72 54 6f 4c 6f 77 65 72 28 6c 6f 77 43 CharToLower(lowC
65e0: 68 61 72 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 54 har);.../*.. * T
65f0: 6f 20 6b 65 65 70 20 62 61 64 6c 79 20 66 6f 72 o keep badly for
6600: 6d 65 64 20 55 74 66 20 73 74 72 69 6e 67 73 20 med Utf strings
6610: 66 72 6f 6d 20 67 65 74 74 69 6e 67 20 69 6e 66 from getting inf
6620: 6c 61 74 65 64 20 62 79 20 74 68 65 0a 09 20 2a lated by the.. *
6630: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 28 74 68 65 conversion (the
6640: 72 65 62 79 20 63 61 75 73 69 6e 67 20 61 20 73 reby causing a s
6650: 65 67 66 61 75 6c 74 29 2c 20 6f 6e 6c 79 20 63 egfault), only c
6660: 6f 70 79 20 74 68 65 20 6c 6f 77 65 72 20 63 61 opy the lower ca
6670: 73 65 0a 09 20 2a 20 63 68 61 72 20 74 6f 20 64 se.. * char to d
6680: 73 74 20 69 66 20 69 74 73 20 73 69 7a 65 20 69 st if its size i
6690: 73 20 3c 3d 20 74 68 65 20 6f 72 69 67 69 6e 61 s <= the origina
66a0: 6c 20 63 68 61 72 2e 0a 09 20 2a 2f 0a 0a 09 69 l char... */...i
66b0: 66 20 28 28 62 79 74 65 73 20 3c 20 54 63 6c 55 f ((bytes < TclU
66c0: 74 66 43 6f 75 6e 74 28 6c 6f 77 43 68 61 72 29 tfCount(lowChar)
66d0: 29 20 7c 7c 20 28 28 6c 6f 77 43 68 61 72 20 26 ) || ((lowChar &
66e0: 20 30 78 46 38 30 30 29 20 3d 3d 20 30 78 44 38 0xF800) == 0xD8
66f0: 30 30 29 29 20 7b 0a 09 20 20 20 20 6d 65 6d 63 00)) {.. memc
6700: 70 79 28 64 73 74 2c 20 73 72 63 2c 20 28 73 69 py(dst, src, (si
6710: 7a 65 5f 74 29 20 62 79 74 65 73 29 3b 0a 09 20 ze_t) bytes);..
6720: 20 20 20 64 73 74 20 2b 3d 20 62 79 74 65 73 3b dst += bytes;
6730: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
6740: 64 73 74 20 2b 3d 20 54 63 6c 5f 55 6e 69 43 68 dst += Tcl_UniCh
6750: 61 72 54 6f 55 74 66 28 6c 6f 77 43 68 61 72 2c arToUtf(lowChar,
6760: 20 64 73 74 29 3b 0a 09 7d 0a 09 73 72 63 20 2b dst);..}..src +
6770: 3d 20 62 79 74 65 73 3b 0a 20 20 20 20 7d 0a 20 = bytes;. }.
6780: 20 20 20 2a 64 73 74 20 3d 20 27 5c 30 27 3b 0a *dst = '\0';.
6790: 20 20 20 20 72 65 74 75 72 6e 20 28 64 73 74 20 return (dst
67a0: 2d 20 73 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 - str);.}.../*.
67b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
6800: 6c 5f 55 74 66 54 6f 54 69 74 6c 65 20 2d 2d 0a l_UtfToTitle --.
6810: 20 2a 0a 20 2a 09 43 68 61 6e 67 65 73 20 74 68 *. *.Changes th
6820: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 e first characte
6830: 72 20 6f 66 20 61 20 55 54 46 20 73 74 72 69 6e r of a UTF strin
6840: 67 20 74 6f 20 74 69 74 6c 65 20 63 61 73 65 20 g to title case
6850: 6f 72 20 75 70 70 65 72 63 61 73 65 0a 20 2a 09 or uppercase. *.
6860: 61 6e 64 20 74 68 65 20 72 65 73 74 20 6f 66 20 and the rest of
6870: 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 6c 6f the string to lo
6880: 77 65 72 63 61 73 65 2e 20 54 68 65 20 63 6f 6e wercase. The con
6890: 76 65 72 73 69 6f 6e 20 68 61 70 70 65 6e 73 20 version happens
68a0: 69 6e 0a 20 2a 09 70 6c 61 63 65 20 61 6e 64 20 in. *.place and
68b0: 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 20 55 may shrink the U
68c0: 54 46 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a TF string.. *. *
68d0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 Results:. *.Ret
68e0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
68f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 of bytes in the
6900: 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 resulting string
6910: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 0a 20 excluding the.
6920: 2a 09 74 72 61 69 6c 69 6e 67 20 6e 75 6c 6c 2e *.trailing null.
6930: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6940: 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 61 cts:. *.Writes a
6950: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c terminating nul
6960: 6c 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 l after the last
6970: 20 63 6f 6e 76 65 72 74 65 64 20 63 68 61 72 61 converted chara
6980: 63 74 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d cter.. *. *-----
6990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69d0: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 -. */..int.Tcl_U
69e0: 74 66 54 6f 54 69 74 6c 65 28 0a 20 20 20 20 63 tfToTitle(. c
69f0: 68 61 72 20 2a 73 74 72 29 09 09 09 2f 2a 20 53 har *str).../* S
6a00: 74 72 69 6e 67 20 74 6f 20 63 6f 6e 76 65 72 74 tring to convert
6a10: 20 69 6e 20 70 6c 61 63 65 2e 20 2a 2f 0a 7b 0a in place. */.{.
6a20: 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 Tcl_UniChar
6a30: 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ch = 0;. int
6a40: 74 69 74 6c 65 43 68 61 72 2c 20 6c 6f 77 43 68 titleChar, lowCh
6a50: 61 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 72 ar;. char *sr
6a60: 63 2c 20 2a 64 73 74 3b 0a 20 20 20 20 69 6e 74 c, *dst;. int
6a70: 20 62 79 74 65 73 3b 0a 0a 20 20 20 20 2f 2a 0a bytes;.. /*.
6a80: 20 20 20 20 20 2a 20 43 61 70 69 74 61 6c 69 7a * Capitaliz
6a90: 65 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 e the first char
6aa0: 61 63 74 65 72 20 61 6e 64 20 74 68 65 6e 20 6c acter and then l
6ab0: 6f 77 65 72 63 61 73 65 20 74 68 65 20 72 65 73 owercase the res
6ac0: 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 2a 20 t of the. *
6ad0: 63 68 61 72 61 63 74 65 72 73 20 75 6e 74 69 6c characters until
6ae0: 20 77 65 20 67 65 74 20 74 6f 20 61 20 6e 75 6c we get to a nul
6af0: 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 l.. */..
6b00: 73 72 63 20 3d 20 64 73 74 20 3d 20 73 74 72 3b src = dst = str;
6b10: 0a 0a 20 20 20 20 69 66 20 28 2a 73 72 63 29 20 .. if (*src)
6b20: 7b 0a 09 62 79 74 65 73 20 3d 20 54 63 6c 55 74 {..bytes = TclUt
6b30: 66 54 6f 55 6e 69 43 68 61 72 28 73 72 63 2c 20 fToUniChar(src,
6b40: 26 63 68 29 3b 0a 09 74 69 74 6c 65 43 68 61 72 &ch);..titleChar
6b50: 20 3d 20 63 68 3b 0a 23 69 66 20 54 43 4c 5f 55 = ch;.#if TCL_U
6b60: 54 46 5f 4d 41 58 20 3c 3d 20 34 0a 09 69 66 20 TF_MAX <= 4..if
6b70: 28 21 62 79 74 65 73 29 20 7b 0a 09 20 20 20 20 (!bytes) {..
6b80: 2f 2a 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 /* TclUtfToUniCh
6b90: 61 72 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 ar only returns
6ba0: 30 20 66 6f 72 20 63 68 61 72 73 20 3e 20 30 78 0 for chars > 0x
6bb0: 66 66 66 66 20 21 20 2a 2f 0a 09 20 20 20 20 62 ffff ! */.. b
6bc0: 79 74 65 73 20 3d 20 54 63 6c 55 74 66 54 6f 55 ytes = TclUtfToU
6bd0: 6e 69 43 68 61 72 28 73 72 63 2c 20 26 63 68 29 niChar(src, &ch)
6be0: 3b 0a 09 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e ;.. /* Combin
6bf0: 65 20 73 75 72 72 6f 67 61 74 65 73 20 2a 2f 0a e surrogates */.
6c00: 09 20 20 20 20 74 69 74 6c 65 43 68 61 72 20 3d . titleChar =
6c10: 20 28 28 28 74 69 74 6c 65 43 68 61 72 20 26 20 (((titleChar &
6c20: 30 78 33 66 66 29 20 3c 3c 20 31 30 29 20 7c 20 0x3ff) << 10) |
6c30: 28 63 68 20 26 20 30 78 33 66 66 29 29 20 2b 20 (ch & 0x3ff)) +
6c40: 30 78 31 30 30 30 30 3b 0a 09 7d 0a 23 65 6e 64 0x10000;..}.#end
6c50: 69 66 0a 09 74 69 74 6c 65 43 68 61 72 20 3d 20 if..titleChar =
6c60: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 54 69 74 Tcl_UniCharToTit
6c70: 6c 65 28 74 69 74 6c 65 43 68 61 72 29 3b 0a 0a le(titleChar);..
6c80: 09 69 66 20 28 28 62 79 74 65 73 20 3c 20 54 63 .if ((bytes < Tc
6c90: 6c 55 74 66 43 6f 75 6e 74 28 74 69 74 6c 65 43 lUtfCount(titleC
6ca0: 68 61 72 29 29 20 7c 7c 20 28 28 74 69 74 6c 65 har)) || ((title
6cb0: 43 68 61 72 20 26 20 30 78 46 38 30 30 29 20 3d Char & 0xF800) =
6cc0: 3d 20 30 78 44 38 30 30 29 29 20 7b 0a 09 20 20 = 0xD800)) {..
6cd0: 20 20 6d 65 6d 63 70 79 28 64 73 74 2c 20 73 72 memcpy(dst, sr
6ce0: 63 2c 20 28 73 69 7a 65 5f 74 29 20 62 79 74 65 c, (size_t) byte
6cf0: 73 29 3b 0a 09 20 20 20 20 64 73 74 20 2b 3d 20 s);.. dst +=
6d00: 62 79 74 65 73 3b 0a 09 7d 20 65 6c 73 65 20 7b bytes;..} else {
6d10: 0a 09 20 20 20 20 64 73 74 20 2b 3d 20 54 63 6c .. dst += Tcl
6d20: 5f 55 6e 69 43 68 61 72 54 6f 55 74 66 28 74 69 _UniCharToUtf(ti
6d30: 74 6c 65 43 68 61 72 2c 20 64 73 74 29 3b 0a 09 tleChar, dst);..
6d40: 7d 0a 09 73 72 63 20 2b 3d 20 62 79 74 65 73 3b }..src += bytes;
6d50: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 . }. while
6d60: 20 28 2a 73 72 63 29 20 7b 0a 09 62 79 74 65 73 (*src) {..bytes
6d70: 20 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 = TclUtfToUniCh
6d80: 61 72 28 73 72 63 2c 20 26 63 68 29 3b 0a 09 6c ar(src, &ch);..l
6d90: 6f 77 43 68 61 72 20 3d 20 63 68 3b 0a 23 69 66 owChar = ch;.#if
6da0: 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3c 3d 20 TCL_UTF_MAX <=
6db0: 34 0a 09 69 66 20 28 21 62 79 74 65 73 29 20 7b 4..if (!bytes) {
6dc0: 0a 09 20 20 20 20 2f 2a 20 54 63 6c 55 74 66 54 .. /* TclUtfT
6dd0: 6f 55 6e 69 43 68 61 72 20 6f 6e 6c 79 20 72 65 oUniChar only re
6de0: 74 75 72 6e 73 20 30 20 66 6f 72 20 63 68 61 72 turns 0 for char
6df0: 73 20 3e 20 30 78 66 66 66 66 20 21 20 2a 2f 0a s > 0xffff ! */.
6e00: 09 20 20 20 20 62 79 74 65 73 20 3d 20 54 63 6c . bytes = Tcl
6e10: 55 74 66 54 6f 55 6e 69 43 68 61 72 28 73 72 63 UtfToUniChar(src
6e20: 2c 20 26 63 68 29 3b 0a 09 20 20 20 20 2f 2a 20 , &ch);.. /*
6e30: 43 6f 6d 62 69 6e 65 20 73 75 72 72 6f 67 61 74 Combine surrogat
6e40: 65 73 20 2a 2f 0a 09 20 20 20 20 6c 6f 77 43 68 es */.. lowCh
6e50: 61 72 20 3d 20 28 28 28 6c 6f 77 43 68 61 72 20 ar = (((lowChar
6e60: 26 20 30 78 33 66 66 29 20 3c 3c 20 31 30 29 20 & 0x3ff) << 10)
6e70: 7c 20 28 63 68 20 26 20 30 78 33 66 66 29 29 20 | (ch & 0x3ff))
6e80: 2b 20 30 78 31 30 30 30 30 3b 0a 09 7d 0a 23 65 + 0x10000;..}.#e
6e90: 6e 64 69 66 0a 09 2f 2a 20 53 70 65 63 69 61 6c ndif../* Special
6ea0: 20 65 78 63 65 70 74 69 6f 6e 20 66 6f 72 20 47 exception for G
6eb0: 65 6f 72 67 69 61 6e 20 41 73 6f 6d 74 61 76 72 eorgian Asomtavr
6ec0: 75 6c 69 20 63 68 61 72 73 2c 20 6e 6f 20 74 69 uli chars, no ti
6ed0: 74 6c 65 63 61 73 65 2e 20 2a 2f 0a 09 69 66 20 tlecase. */..if
6ee0: 28 28 75 6e 73 69 67 6e 65 64 29 28 6c 6f 77 43 ((unsigned)(lowC
6ef0: 68 61 72 20 2d 20 30 78 31 43 39 30 29 20 3e 3d har - 0x1C90) >=
6f00: 20 30 78 33 30 29 20 7b 0a 09 20 20 20 20 6c 6f 0x30) {.. lo
6f10: 77 43 68 61 72 20 3d 20 54 63 6c 5f 55 6e 69 43 wChar = Tcl_UniC
6f20: 68 61 72 54 6f 4c 6f 77 65 72 28 6c 6f 77 43 68 harToLower(lowCh
6f30: 61 72 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 28 62 ar);..}...if ((b
6f40: 79 74 65 73 20 3c 20 54 63 6c 55 74 66 43 6f 75 ytes < TclUtfCou
6f50: 6e 74 28 6c 6f 77 43 68 61 72 29 29 20 7c 7c 20 nt(lowChar)) ||
6f60: 28 28 6c 6f 77 43 68 61 72 20 26 20 30 78 46 38 ((lowChar & 0xF8
6f70: 30 30 29 20 3d 3d 20 30 78 44 38 30 30 29 29 20 00) == 0xD800))
6f80: 7b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 64 73 {.. memcpy(ds
6f90: 74 2c 20 73 72 63 2c 20 28 73 69 7a 65 5f 74 29 t, src, (size_t)
6fa0: 20 62 79 74 65 73 29 3b 0a 09 20 20 20 20 64 73 bytes);.. ds
6fb0: 74 20 2b 3d 20 62 79 74 65 73 3b 0a 09 7d 20 65 t += bytes;..} e
6fc0: 6c 73 65 20 7b 0a 09 20 20 20 20 64 73 74 20 2b lse {.. dst +
6fd0: 3d 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 = Tcl_UniCharToU
6fe0: 74 66 28 6c 6f 77 43 68 61 72 2c 20 64 73 74 29 tf(lowChar, dst)
6ff0: 3b 0a 09 7d 0a 09 73 72 63 20 2b 3d 20 62 79 74 ;..}..src += byt
7000: 65 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 64 es;. }. *d
7010: 73 74 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72 st = '\0';. r
7020: 65 74 75 72 6e 20 28 64 73 74 20 2d 20 73 74 72 eturn (dst - str
7030: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
7040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7080: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 55 74 66 --. *. * TclpUtf
7090: 4e 63 6d 70 32 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Ncmp2 --. *. *.C
70a0: 6f 6d 70 61 72 65 20 61 74 20 6d 6f 73 74 20 6e ompare at most n
70b0: 75 6d 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 umBytes bytes of
70c0: 20 75 74 66 2d 38 20 73 74 72 69 6e 67 73 20 63 utf-8 strings c
70d0: 73 20 61 6e 64 20 63 74 2e 20 42 6f 74 68 20 63 s and ct. Both c
70e0: 73 20 61 6e 64 0a 20 2a 09 63 74 20 61 72 65 20 s and. *.ct are
70f0: 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61 74 assumed to be at
7100: 20 6c 65 61 73 74 20 6e 75 6d 42 79 74 65 73 20 least numBytes
7110: 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 20 2a 0a 20 bytes long.. *.
7120: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 * Results:. *.Re
7130: 74 75 72 6e 20 3c 30 20 69 66 20 63 73 20 3c 20 turn <0 if cs <
7140: 63 74 2c 20 30 20 69 66 20 63 73 20 3d 3d 20 63 ct, 0 if cs == c
7150: 74 2c 20 6f 72 20 3e 30 20 69 66 20 63 73 20 3e t, or >0 if cs >
7160: 20 63 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ct.. *. * Side
7170: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
7180: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
71d0: 2f 0a 0a 69 6e 74 0a 54 63 6c 70 55 74 66 4e 63 /..int.TclpUtfNc
71e0: 6d 70 32 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 mp2(. const c
71f0: 68 61 72 20 2a 63 73 2c 09 09 2f 2a 20 55 54 46 har *cs,../* UTF
7200: 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 string to compa
7210: 72 65 20 74 6f 20 63 74 2e 20 2a 2f 0a 20 20 20 re to ct. */.
7220: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 74 2c const char *ct,
7230: 09 09 2f 2a 20 55 54 46 20 73 74 72 69 6e 67 20 ../* UTF string
7240: 63 73 20 69 73 20 63 6f 6d 70 61 72 65 64 20 74 cs is compared t
7250: 6f 2e 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e o. */. unsign
7260: 65 64 20 6c 6f 6e 67 20 6e 75 6d 42 79 74 65 73 ed long numBytes
7270: 29 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2a )./* Number of *
7280: 62 79 74 65 73 2a 20 74 6f 20 63 6f 6d 70 61 72 bytes* to compar
7290: 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f 2a 0a 20 e. */.{. /*.
72a0: 20 20 20 20 2a 20 57 65 20 63 61 6e 27 74 20 73 * We can't s
72b0: 69 6d 70 6c 79 20 63 61 6c 6c 20 27 6d 65 6d 63 imply call 'memc
72c0: 6d 70 28 63 73 2c 20 63 74 2c 20 6e 75 6d 42 79 mp(cs, ct, numBy
72d0: 74 65 73 29 3b 27 20 62 65 63 61 75 73 65 20 77 tes);' because w
72e0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 2a e need to. *
72f0: 20 63 68 65 63 6b 20 66 6f 72 20 54 63 6c 27 73 check for Tcl's
7300: 20 5c 78 43 30 5c 78 38 30 20 6e 6f 6e 2d 75 74 \xC0\x80 non-ut
7310: 66 2d 38 20 6e 75 6c 6c 20 65 6e 63 6f 64 69 6e f-8 null encodin
7320: 67 2e 20 4f 74 68 65 72 77 69 73 65 20 75 74 66 g. Otherwise utf
7330: 2d 38 20 6c 65 78 65 73 0a 20 20 20 20 20 2a 20 -8 lexes. *
7340: 66 69 6e 65 20 69 6e 20 74 68 65 20 73 74 72 63 fine in the strc
7350: 6d 70 20 6d 61 6e 6e 65 72 2e 0a 20 20 20 20 20 mp manner..
7360: 2a 2f 0a 0a 20 20 20 20 72 65 67 69 73 74 65 72 */.. register
7370: 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 30 3b int result = 0;
7380: 0a 0a 20 20 20 20 66 6f 72 20 28 20 3b 20 6e 75 .. for ( ; nu
7390: 6d 42 79 74 65 73 20 21 3d 20 30 3b 20 6e 75 6d mBytes != 0; num
73a0: 42 79 74 65 73 2d 2d 2c 20 63 73 2b 2b 2c 20 63 Bytes--, cs++, c
73b0: 74 2b 2b 29 20 7b 0a 09 69 66 20 28 2a 63 73 20 t++) {..if (*cs
73c0: 21 3d 20 2a 63 74 29 20 7b 0a 09 20 20 20 20 72 != *ct) {.. r
73d0: 65 73 75 6c 74 20 3d 20 55 43 48 41 52 28 2a 63 esult = UCHAR(*c
73e0: 73 29 20 2d 20 55 43 48 41 52 28 2a 63 74 29 3b s) - UCHAR(*ct);
73f0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a .. break;..}.
7400: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6e 75 }. if (nu
7410: 6d 42 79 74 65 73 20 26 26 20 28 28 55 43 48 41 mBytes && ((UCHA
7420: 52 28 2a 63 73 29 20 3d 3d 20 30 78 43 30 29 20 R(*cs) == 0xC0)
7430: 7c 7c 20 28 55 43 48 41 52 28 2a 63 74 29 20 3d || (UCHAR(*ct) =
7440: 3d 20 30 78 43 30 29 29 29 20 7b 0a 09 75 6e 73 = 0xC0))) {..uns
7450: 69 67 6e 65 64 20 63 68 61 72 20 63 31 2c 20 63 igned char c1, c
7460: 32 3b 0a 0a 09 63 31 20 3d 20 28 28 55 43 48 41 2;...c1 = ((UCHA
7470: 52 28 2a 63 73 29 20 3d 3d 20 30 78 43 30 29 20 R(*cs) == 0xC0)
7480: 26 26 20 28 55 43 48 41 52 28 63 73 5b 31 5d 29 && (UCHAR(cs[1])
7490: 20 3d 3d 20 30 78 38 30 29 29 20 3f 20 30 20 3a == 0x80)) ? 0 :
74a0: 20 55 43 48 41 52 28 2a 63 73 29 3b 0a 09 63 32 UCHAR(*cs);..c2
74b0: 20 3d 20 28 28 55 43 48 41 52 28 2a 63 74 29 20 = ((UCHAR(*ct)
74c0: 3d 3d 20 30 78 43 30 29 20 26 26 20 28 55 43 48 == 0xC0) && (UCH
74d0: 41 52 28 63 74 5b 31 5d 29 20 3d 3d 20 30 78 38 AR(ct[1]) == 0x8
74e0: 30 29 29 20 3f 20 30 20 3a 20 55 43 48 41 52 28 0)) ? 0 : UCHAR(
74f0: 2a 63 74 29 3b 0a 09 72 65 73 75 6c 74 20 3d 20 *ct);..result =
7500: 28 63 31 20 2d 20 63 32 29 3b 0a 20 20 20 20 7d (c1 - c2);. }
7510: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 . return resu
7520: 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d lt;.}.../*. *---
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7570: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 ---. *. * Tcl_Ut
7580: 66 4e 63 6d 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 fNcmp --. *. *.C
7590: 6f 6d 70 61 72 65 20 61 74 20 6d 6f 73 74 20 6e ompare at most n
75a0: 75 6d 43 68 61 72 73 20 55 54 46 20 63 68 61 72 umChars UTF char
75b0: 73 20 6f 66 20 73 74 72 69 6e 67 20 63 73 20 74 s of string cs t
75c0: 6f 20 73 74 72 69 6e 67 20 63 74 2e 20 42 6f 74 o string ct. Bot
75d0: 68 20 63 73 0a 20 2a 09 61 6e 64 20 63 74 20 61 h cs. *.and ct a
75e0: 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 re assumed to be
75f0: 20 61 74 20 6c 65 61 73 74 20 6e 75 6d 43 68 61 at least numCha
7600: 72 73 20 55 54 46 20 63 68 61 72 73 20 6c 6f 6e rs UTF chars lon
7610: 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 g.. *. * Results
7620: 3a 0a 20 2a 09 52 65 74 75 72 6e 20 3c 30 20 69 :. *.Return <0 i
7630: 66 20 63 73 20 3c 20 63 74 2c 20 30 20 69 66 20 f cs < ct, 0 if
7640: 63 73 20 3d 3d 20 63 74 2c 20 6f 72 20 3e 30 20 cs == ct, or >0
7650: 69 66 20 63 73 20 3e 20 63 74 2e 0a 20 2a 0a 20 if cs > ct.. *.
7660: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
7670: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
76d0: 6c 5f 55 74 66 4e 63 6d 70 28 0a 20 20 20 20 63 l_UtfNcmp(. c
76e0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 73 2c 09 09 onst char *cs,..
76f0: 2f 2a 20 55 54 46 20 73 74 72 69 6e 67 20 74 6f /* UTF string to
7700: 20 63 6f 6d 70 61 72 65 20 74 6f 20 63 74 2e 20 compare to ct.
7710: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 */. const cha
7720: 72 20 2a 63 74 2c 09 09 2f 2a 20 55 54 46 20 73 r *ct,../* UTF s
7730: 74 72 69 6e 67 20 63 73 20 69 73 20 63 6f 6d 70 tring cs is comp
7740: 61 72 65 64 20 74 6f 2e 20 2a 2f 0a 20 20 20 20 ared to. */.
7750: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 unsigned long nu
7760: 6d 43 68 61 72 73 29 09 2f 2a 20 4e 75 6d 62 65 mChars)./* Numbe
7770: 72 20 6f 66 20 55 54 46 20 63 68 61 72 73 20 74 r of UTF chars t
7780: 6f 20 63 6f 6d 70 61 72 65 2e 20 2a 2f 0a 7b 0a o compare. */.{.
7790: 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 Tcl_UniChar
77a0: 63 68 31 20 3d 20 30 2c 20 63 68 32 20 3d 20 30 ch1 = 0, ch2 = 0
77b0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
77c0: 20 43 61 6e 6e 6f 74 20 75 73 65 20 27 6d 65 6d Cannot use 'mem
77d0: 63 6d 70 28 63 73 2c 20 63 74 2c 20 6e 29 3b 27 cmp(cs, ct, n);'
77e0: 20 61 73 20 62 79 74 65 20 72 65 70 72 65 73 65 as byte represe
77f0: 6e 74 61 74 69 6f 6e 20 6f 66 20 5c 75 30 30 30 ntation of \u000
7800: 30 20 28 74 68 65 0a 20 20 20 20 20 2a 20 70 61 0 (the. * pa
7810: 69 72 20 6f 66 20 62 79 74 65 73 20 30 78 43 30 ir of bytes 0xC0
7820: 2c 30 78 38 30 29 20 69 73 20 6c 61 72 67 65 72 ,0x80) is larger
7830: 20 74 68 61 6e 20 62 79 74 65 20 72 65 70 72 65 than byte repre
7840: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 5c 75 30 sentation of \u0
7850: 30 30 31 0a 20 20 20 20 20 2a 20 28 74 68 65 20 001. * (the
7860: 62 79 74 65 20 30 78 30 31 2e 29 0a 20 20 20 20 byte 0x01.).
7870: 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 */.. while (
7880: 6e 75 6d 43 68 61 72 73 2d 2d 20 3e 20 30 29 20 numChars-- > 0)
7890: 7b 0a 09 2f 2a 0a 09 20 2a 20 6e 20 6d 75 73 74 {../*.. * n must
78a0: 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 be interpreted
78b0: 61 73 20 63 68 61 72 73 2c 20 6e 6f 74 20 62 79 as chars, not by
78c0: 74 65 73 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 tes. This should
78d0: 20 62 65 20 63 61 6c 6c 65 64 0a 09 20 2a 20 6f be called.. * o
78e0: 6e 6c 79 20 77 68 65 6e 20 62 6f 74 68 20 73 74 nly when both st
78f0: 72 69 6e 67 73 20 61 72 65 20 6f 66 20 61 74 20 rings are of at
7900: 6c 65 61 73 74 20 6e 20 63 68 61 72 73 20 6c 6f least n chars lo
7910: 6e 67 20 28 6e 6f 20 6e 65 65 64 20 66 6f 72 20 ng (no need for
7920: 5c 30 0a 09 20 2a 20 63 68 65 63 6b 29 0a 09 20 \0.. * check)..
7930: 2a 2f 0a 0a 09 63 73 20 2b 3d 20 54 63 6c 55 74 */...cs += TclUt
7940: 66 54 6f 55 6e 69 43 68 61 72 28 63 73 2c 20 26 fToUniChar(cs, &
7950: 63 68 31 29 3b 0a 09 63 74 20 2b 3d 20 54 63 6c ch1);..ct += Tcl
7960: 55 74 66 54 6f 55 6e 69 43 68 61 72 28 63 74 2c UtfToUniChar(ct,
7970: 20 26 63 68 32 29 3b 0a 09 69 66 20 28 63 68 31 &ch2);..if (ch1
7980: 20 21 3d 20 63 68 32 29 20 7b 0a 23 69 66 20 54 != ch2) {.#if T
7990: 43 4c 5f 55 54 46 5f 4d 41 58 20 3c 3d 20 34 0a CL_UTF_MAX <= 4.
79a0: 09 20 20 20 20 2f 2a 20 53 75 72 72 6f 67 61 74 . /* Surrogat
79b0: 65 73 20 61 6c 77 61 79 73 20 72 65 70 6f 72 74 es always report
79c0: 20 68 69 67 68 65 72 20 74 68 61 6e 20 6e 6f 6e higher than non
79d0: 2d 73 75 72 72 6f 67 61 74 65 73 20 2a 2f 0a 09 -surrogates */..
79e0: 20 20 20 20 69 66 20 28 28 28 63 68 31 20 26 20 if (((ch1 &
79f0: 30 78 46 43 30 30 29 20 3d 3d 20 30 78 44 38 30 0xFC00) == 0xD80
7a00: 30 29 29 20 7b 0a 09 20 20 20 20 69 66 20 28 28 0)) {.. if ((
7a10: 63 68 32 20 26 20 30 78 46 43 30 30 29 20 21 3d ch2 & 0xFC00) !=
7a20: 20 30 78 44 38 30 30 29 20 7b 0a 09 09 72 65 74 0xD800) {...ret
7a30: 75 72 6e 20 63 68 31 3b 0a 09 20 20 20 20 7d 0a urn ch1;.. }.
7a40: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
7a50: 28 63 68 32 20 26 20 30 78 46 43 30 30 29 20 3d (ch2 & 0xFC00) =
7a60: 3d 20 30 78 44 38 30 30 29 20 7b 0a 09 09 72 65 = 0xD800) {...re
7a70: 74 75 72 6e 20 2d 63 68 32 3b 0a 09 20 20 20 20 turn -ch2;..
7a80: 7d 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 72 65 }.#endif.. re
7a90: 74 75 72 6e 20 28 63 68 31 20 2d 20 63 68 32 29 turn (ch1 - ch2)
7aa0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 ;..}. }. r
7ab0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 0;.}.../*.
7ac0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
7b10: 63 6c 5f 55 74 66 4e 63 61 73 65 63 6d 70 20 2d cl_UtfNcasecmp -
7b20: 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 61 72 65 20 -. *. *.Compare
7b30: 61 74 20 6d 6f 73 74 20 6e 75 6d 43 68 61 72 73 at most numChars
7b40: 20 55 54 46 20 63 68 61 72 73 20 6f 66 20 73 74 UTF chars of st
7b50: 72 69 6e 67 20 63 73 20 74 6f 20 73 74 72 69 6e ring cs to strin
7b60: 67 20 63 74 20 63 61 73 65 0a 20 2a 09 69 6e 73 g ct case. *.ins
7b70: 65 6e 73 69 74 69 76 65 2e 20 42 6f 74 68 20 63 ensitive. Both c
7b80: 73 20 61 6e 64 20 63 74 20 61 72 65 20 61 73 73 s and ct are ass
7b90: 75 6d 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 umed to be at le
7ba0: 61 73 74 20 6e 75 6d 43 68 61 72 73 20 55 54 46 ast numChars UTF
7bb0: 0a 20 2a 09 63 68 61 72 73 20 6c 6f 6e 67 2e 0a . *.chars long..
7bc0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
7bd0: 2a 09 52 65 74 75 72 6e 20 3c 30 20 69 66 20 63 *.Return <0 if c
7be0: 73 20 3c 20 63 74 2c 20 30 20 69 66 20 63 73 20 s < ct, 0 if cs
7bf0: 3d 3d 20 63 74 2c 20 6f 72 20 3e 30 20 69 66 20 == ct, or >0 if
7c00: 63 73 20 3e 20 63 74 2e 0a 20 2a 0a 20 2a 20 53 cs > ct.. *. * S
7c10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
7c20: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c70: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 -. */..int.Tcl_U
7c80: 74 66 4e 63 61 73 65 63 6d 70 28 0a 20 20 20 20 tfNcasecmp(.
7c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 73 2c 09 const char *cs,.
7ca0: 09 2f 2a 20 55 54 46 20 73 74 72 69 6e 67 20 74 ./* UTF string t
7cb0: 6f 20 63 6f 6d 70 61 72 65 20 74 6f 20 63 74 2e o compare to ct.
7cc0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
7cd0: 61 72 20 2a 63 74 2c 09 09 2f 2a 20 55 54 46 20 ar *ct,../* UTF
7ce0: 73 74 72 69 6e 67 20 63 73 20 69 73 20 63 6f 6d string cs is com
7cf0: 70 61 72 65 64 20 74 6f 2e 20 2a 2f 0a 20 20 20 pared to. */.
7d00: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e unsigned long n
7d10: 75 6d 43 68 61 72 73 29 09 2f 2a 20 4e 75 6d 62 umChars)./* Numb
7d20: 65 72 20 6f 66 20 55 54 46 20 63 68 61 72 73 20 er of UTF chars
7d30: 74 6f 20 63 6f 6d 70 61 72 65 2e 20 2a 2f 0a 7b to compare. */.{
7d40: 0a 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 . Tcl_UniChar
7d50: 20 63 68 31 20 3d 20 30 2c 20 63 68 32 20 3d 20 ch1 = 0, ch2 =
7d60: 30 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 6e 0;.. while (n
7d70: 75 6d 43 68 61 72 73 2d 2d 20 3e 20 30 29 20 7b umChars-- > 0) {
7d80: 0a 09 2f 2a 0a 09 20 2a 20 6e 20 6d 75 73 74 20 ../*.. * n must
7d90: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 be interpreted a
7da0: 73 20 63 68 61 72 73 2c 20 6e 6f 74 20 62 79 74 s chars, not byt
7db0: 65 73 2e 0a 09 20 2a 20 54 68 69 73 20 73 68 6f es... * This sho
7dc0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e uld be called on
7dd0: 6c 79 20 77 68 65 6e 20 62 6f 74 68 20 73 74 72 ly when both str
7de0: 69 6e 67 73 20 61 72 65 20 6f 66 0a 09 20 2a 20 ings are of.. *
7df0: 61 74 20 6c 65 61 73 74 20 6e 20 63 68 61 72 73 at least n chars
7e00: 20 6c 6f 6e 67 20 28 6e 6f 20 6e 65 65 64 20 66 long (no need f
7e10: 6f 72 20 5c 30 20 63 68 65 63 6b 29 0a 09 20 2a or \0 check).. *
7e20: 2f 0a 09 63 73 20 2b 3d 20 54 63 6c 55 74 66 54 /..cs += TclUtfT
7e30: 6f 55 6e 69 43 68 61 72 28 63 73 2c 20 26 63 68 oUniChar(cs, &ch
7e40: 31 29 3b 0a 09 63 74 20 2b 3d 20 54 63 6c 55 74 1);..ct += TclUt
7e50: 66 54 6f 55 6e 69 43 68 61 72 28 63 74 2c 20 26 fToUniChar(ct, &
7e60: 63 68 32 29 3b 0a 09 69 66 20 28 63 68 31 20 21 ch2);..if (ch1 !
7e70: 3d 20 63 68 32 29 20 7b 0a 23 69 66 20 54 43 4c = ch2) {.#if TCL
7e80: 5f 55 54 46 5f 4d 41 58 20 3c 3d 20 34 0a 09 20 _UTF_MAX <= 4..
7e90: 20 20 20 2f 2a 20 53 75 72 72 6f 67 61 74 65 73 /* Surrogates
7ea0: 20 61 6c 77 61 79 73 20 72 65 70 6f 72 74 20 68 always report h
7eb0: 69 67 68 65 72 20 74 68 61 6e 20 6e 6f 6e 2d 73 igher than non-s
7ec0: 75 72 72 6f 67 61 74 65 73 20 2a 2f 0a 09 20 20 urrogates */..
7ed0: 20 20 69 66 20 28 28 28 63 68 31 20 26 20 30 78 if (((ch1 & 0x
7ee0: 46 43 30 30 29 20 3d 3d 20 30 78 44 38 30 30 29 FC00) == 0xD800)
7ef0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 28 63 68 ) {.. if ((ch
7f00: 32 20 26 20 30 78 46 43 30 30 29 20 21 3d 20 30 2 & 0xFC00) != 0
7f10: 78 44 38 30 30 29 20 7b 0a 09 09 72 65 74 75 72 xD800) {...retur
7f20: 6e 20 63 68 31 3b 0a 09 20 20 20 20 7d 0a 09 20 n ch1;.. }..
7f30: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 63 } else if ((c
7f40: 68 32 20 26 20 30 78 46 43 30 30 29 20 3d 3d 20 h2 & 0xFC00) ==
7f50: 30 78 44 38 30 30 29 20 7b 0a 09 09 72 65 74 75 0xD800) {...retu
7f60: 72 6e 20 2d 63 68 32 3b 0a 09 20 20 20 20 7d 0a rn -ch2;.. }.
7f70: 23 65 6e 64 69 66 0a 09 20 20 20 20 63 68 31 20 #endif.. ch1
7f80: 3d 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c = Tcl_UniCharToL
7f90: 6f 77 65 72 28 63 68 31 29 3b 0a 09 20 20 20 20 ower(ch1);..
7fa0: 63 68 32 20 3d 20 54 63 6c 5f 55 6e 69 43 68 61 ch2 = Tcl_UniCha
7fb0: 72 54 6f 4c 6f 77 65 72 28 63 68 32 29 3b 0a 09 rToLower(ch2);..
7fc0: 20 20 20 20 69 66 20 28 63 68 31 20 21 3d 20 63 if (ch1 != c
7fd0: 68 32 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 28 h2) {...return (
7fe0: 63 68 31 20 2d 20 63 68 32 29 3b 0a 09 20 20 20 ch1 - ch2);..
7ff0: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }..}. }.
8000: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
8010: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
8060: 63 6c 5f 55 74 66 43 6d 70 20 2d 2d 0a 20 2a 0a cl_UtfCmp --. *.
8070: 20 2a 09 43 6f 6d 70 61 72 65 20 55 54 46 20 63 *.Compare UTF c
8080: 68 61 72 73 20 6f 66 20 73 74 72 69 6e 67 20 63 hars of string c
8090: 73 20 74 6f 20 73 74 72 69 6e 67 20 63 74 20 63 s to string ct c
80a0: 61 73 65 20 73 65 6e 73 69 74 69 76 65 6c 79 2e ase sensitively.
80b0: 0a 20 2a 09 52 65 70 6c 61 63 65 6d 65 6e 74 20 . *.Replacement
80c0: 66 6f 72 20 73 74 72 63 6d 70 20 69 6e 20 54 63 for strcmp in Tc
80d0: 6c 20 63 6f 72 65 2c 20 69 6e 20 70 6c 61 63 65 l core, in place
80e0: 73 20 77 68 65 72 65 20 55 54 46 2d 38 20 73 68 s where UTF-8 sh
80f0: 6f 75 6c 64 0a 20 2a 09 62 65 20 68 61 6e 64 6c ould. *.be handl
8100: 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ed.. *. * Result
8110: 73 3a 0a 20 2a 09 52 65 74 75 72 6e 20 3c 30 20 s:. *.Return <0
8120: 69 66 20 63 73 20 3c 20 63 74 2c 20 30 20 69 66 if cs < ct, 0 if
8130: 20 63 73 20 3d 3d 20 63 74 2c 20 6f 72 20 3e 30 cs == ct, or >0
8140: 20 69 66 20 63 73 20 3e 20 63 74 2e 0a 20 2a 0a if cs > ct.. *.
8150: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8160: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
81c0: 63 6c 55 74 66 43 6d 70 28 0a 20 20 20 20 63 6f clUtfCmp(. co
81d0: 6e 73 74 20 63 68 61 72 20 2a 63 73 2c 09 09 2f nst char *cs,../
81e0: 2a 20 55 54 46 20 73 74 72 69 6e 67 20 74 6f 20 * UTF string to
81f0: 63 6f 6d 70 61 72 65 20 74 6f 20 63 74 2e 20 2a compare to ct. *
8200: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 /. const char
8210: 20 2a 63 74 29 09 09 2f 2a 20 55 54 46 20 73 74 *ct)../* UTF st
8220: 72 69 6e 67 20 63 73 20 69 73 20 63 6f 6d 70 61 ring cs is compa
8230: 72 65 64 20 74 6f 2e 20 2a 2f 0a 7b 0a 20 20 20 red to. */.{.
8240: 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 63 68 31 Tcl_UniChar ch1
8250: 20 3d 20 30 2c 20 63 68 32 20 3d 20 30 3b 0a 0a = 0, ch2 = 0;..
8260: 20 20 20 20 77 68 69 6c 65 20 28 2a 63 73 20 26 while (*cs &
8270: 26 20 2a 63 74 29 20 7b 0a 09 63 73 20 2b 3d 20 & *ct) {..cs +=
8280: 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 TclUtfToUniChar(
8290: 63 73 2c 20 26 63 68 31 29 3b 0a 09 63 74 20 2b cs, &ch1);..ct +
82a0: 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 = TclUtfToUniCha
82b0: 72 28 63 74 2c 20 26 63 68 32 29 3b 0a 09 69 66 r(ct, &ch2);..if
82c0: 20 28 63 68 31 20 21 3d 20 63 68 32 29 20 7b 0a (ch1 != ch2) {.
82d0: 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 #if TCL_UTF_MAX
82e0: 3c 3d 20 34 0a 09 20 20 20 20 2f 2a 20 53 75 72 <= 4.. /* Sur
82f0: 72 6f 67 61 74 65 73 20 61 6c 77 61 79 73 20 72 rogates always r
8300: 65 70 6f 72 74 20 68 69 67 68 65 72 20 74 68 61 eport higher tha
8310: 6e 20 6e 6f 6e 2d 73 75 72 72 6f 67 61 74 65 73 n non-surrogates
8320: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 28 28 63 */.. if (((c
8330: 68 31 20 26 20 30 78 46 43 30 30 29 20 3d 3d 20 h1 & 0xFC00) ==
8340: 30 78 44 38 30 30 29 29 20 7b 0a 09 20 20 20 20 0xD800)) {..
8350: 69 66 20 28 28 63 68 32 20 26 20 30 78 46 43 30 if ((ch2 & 0xFC0
8360: 30 29 20 21 3d 20 30 78 44 38 30 30 29 20 7b 0a 0) != 0xD800) {.
8370: 09 09 72 65 74 75 72 6e 20 63 68 31 3b 0a 09 20 ..return ch1;..
8380: 20 20 20 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 }.. } else
8390: 20 69 66 20 28 28 63 68 32 20 26 20 30 78 46 43 if ((ch2 & 0xFC
83a0: 30 30 29 20 3d 3d 20 30 78 44 38 30 30 29 20 7b 00) == 0xD800) {
83b0: 0a 09 09 72 65 74 75 72 6e 20 2d 63 68 32 3b 0a ...return -ch2;.
83c0: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 20 . }.#endif..
83d0: 20 20 20 72 65 74 75 72 6e 20 63 68 31 20 2d 20 return ch1 -
83e0: 63 68 32 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 ch2;..}. }.
83f0: 20 20 72 65 74 75 72 6e 20 55 43 48 41 52 28 2a return UCHAR(*
8400: 63 73 29 20 2d 20 55 43 48 41 52 28 2a 63 74 29 cs) - UCHAR(*ct)
8410: 3b 0a 7d 0a 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ;.}..../*. *----
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8460: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 55 74 66 43 --. *. * TclUtfC
8470: 61 73 65 63 6d 70 20 2d 2d 0a 20 2a 0a 20 2a 09 asecmp --. *. *.
8480: 43 6f 6d 70 61 72 65 20 55 54 46 20 63 68 61 72 Compare UTF char
8490: 73 20 6f 66 20 73 74 72 69 6e 67 20 63 73 20 74 s of string cs t
84a0: 6f 20 73 74 72 69 6e 67 20 63 74 20 63 61 73 65 o string ct case
84b0: 20 69 6e 73 65 6e 73 69 74 69 76 65 6c 79 2e 0a insensitively..
84c0: 20 2a 09 52 65 70 6c 61 63 65 6d 65 6e 74 20 66 *.Replacement f
84d0: 6f 72 20 73 74 72 63 61 73 65 63 6d 70 20 69 6e or strcasecmp in
84e0: 20 54 63 6c 20 63 6f 72 65 2c 20 69 6e 20 70 6c Tcl core, in pl
84f0: 61 63 65 73 20 77 68 65 72 65 20 55 54 46 2d 38 aces where UTF-8
8500: 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 68 61 should. *.be ha
8510: 6e 64 6c 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 ndled.. *. * Res
8520: 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 20 ults:. *.Return
8530: 3c 30 20 69 66 20 63 73 20 3c 20 63 74 2c 20 30 <0 if cs < ct, 0
8540: 20 69 66 20 63 73 20 3d 3d 20 63 74 2c 20 6f 72 if cs == ct, or
8550: 20 3e 30 20 69 66 20 63 73 20 3e 20 63 74 2e 0a >0 if cs > ct..
8560: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8570: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
8580: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e --------. */..in
85d0: 74 0a 54 63 6c 55 74 66 43 61 73 65 63 6d 70 28 t.TclUtfCasecmp(
85e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
85f0: 2a 63 73 2c 09 09 2f 2a 20 55 54 46 20 73 74 72 *cs,../* UTF str
8600: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 ing to compare t
8610: 6f 20 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e o ct. */. con
8620: 73 74 20 63 68 61 72 20 2a 63 74 29 09 09 2f 2a st char *ct)../*
8630: 20 55 54 46 20 73 74 72 69 6e 67 20 63 73 20 69 UTF string cs i
8640: 73 20 63 6f 6d 70 61 72 65 64 20 74 6f 2e 20 2a s compared to. *
8650: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 55 6e 69 43 /.{. Tcl_UniC
8660: 68 61 72 20 63 68 31 20 3d 20 30 2c 20 63 68 32 har ch1 = 0, ch2
8670: 20 3d 20 30 3b 0a 0a 20 20 20 20 77 68 69 6c 65 = 0;.. while
8680: 20 28 2a 63 73 20 26 26 20 2a 63 74 29 20 7b 0a (*cs && *ct) {.
8690: 09 63 73 20 2b 3d 20 54 63 6c 55 74 66 54 6f 55 .cs += TclUtfToU
86a0: 6e 69 43 68 61 72 28 63 73 2c 20 26 63 68 31 29 niChar(cs, &ch1)
86b0: 3b 0a 09 63 74 20 2b 3d 20 54 63 6c 55 74 66 54 ;..ct += TclUtfT
86c0: 6f 55 6e 69 43 68 61 72 28 63 74 2c 20 26 63 68 oUniChar(ct, &ch
86d0: 32 29 3b 0a 09 69 66 20 28 63 68 31 20 21 3d 20 2);..if (ch1 !=
86e0: 63 68 32 29 20 7b 0a 23 69 66 20 54 43 4c 5f 55 ch2) {.#if TCL_U
86f0: 54 46 5f 4d 41 58 20 3c 3d 20 34 0a 09 20 20 20 TF_MAX <= 4..
8700: 20 2f 2a 20 53 75 72 72 6f 67 61 74 65 73 20 61 /* Surrogates a
8710: 6c 77 61 79 73 20 72 65 70 6f 72 74 20 68 69 67 lways report hig
8720: 68 65 72 20 74 68 61 6e 20 6e 6f 6e 2d 73 75 72 her than non-sur
8730: 72 6f 67 61 74 65 73 20 2a 2f 0a 09 20 20 20 20 rogates */..
8740: 69 66 20 28 28 28 63 68 31 20 26 20 30 78 46 43 if (((ch1 & 0xFC
8750: 30 30 29 20 3d 3d 20 30 78 44 38 30 30 29 29 20 00) == 0xD800))
8760: 7b 0a 09 20 20 20 20 69 66 20 28 28 63 68 32 20 {.. if ((ch2
8770: 26 20 30 78 46 43 30 30 29 20 21 3d 20 30 78 44 & 0xFC00) != 0xD
8780: 38 30 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 800) {...return
8790: 63 68 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ch1;.. }..
87a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 28 63 68 32 } else if ((ch2
87b0: 20 26 20 30 78 46 43 30 30 29 20 3d 3d 20 30 78 & 0xFC00) == 0x
87c0: 44 38 30 30 29 20 7b 0a 09 09 72 65 74 75 72 6e D800) {...return
87d0: 20 2d 63 68 32 3b 0a 09 20 20 20 20 7d 0a 23 65 -ch2;.. }.#e
87e0: 6e 64 69 66 0a 09 20 20 20 20 63 68 31 20 3d 20 ndif.. ch1 =
87f0: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 Tcl_UniCharToLow
8800: 65 72 28 63 68 31 29 3b 0a 09 20 20 20 20 63 68 er(ch1);.. ch
8810: 32 20 3d 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 2 = Tcl_UniCharT
8820: 6f 4c 6f 77 65 72 28 63 68 32 29 3b 0a 09 20 20 oLower(ch2);..
8830: 20 20 69 66 20 28 63 68 31 20 21 3d 20 63 68 32 if (ch1 != ch2
8840: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 63 68 31 ) {...return ch1
8850: 20 2d 20 63 68 32 3b 0a 09 20 20 20 20 7d 0a 09 - ch2;.. }..
8860: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 }. }. retu
8870: 72 6e 20 55 43 48 41 52 28 2a 63 73 29 20 2d 20 rn UCHAR(*cs) -
8880: 55 43 48 41 52 28 2a 63 74 29 3b 0a 7d 0a 0a 0c UCHAR(*ct);.}...
8890: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
88a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
88e0: 20 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f * Tcl_UniCharTo
88f0: 55 70 70 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Upper --. *. *.C
8900: 6f 6d 70 75 74 65 20 74 68 65 20 75 70 70 65 72 ompute the upper
8910: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 20 case equivalent
8920: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 55 6e 69 of the given Uni
8930: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a code character..
8940: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
8950: 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 75 70 *.Returns the up
8960: 70 65 72 63 61 73 65 20 55 6e 69 63 6f 64 65 20 percase Unicode
8970: 63 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a character.. *. *
8980: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
8990: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
89a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89e0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
89f0: 5f 55 6e 69 43 68 61 72 54 6f 55 70 70 65 72 28 _UniCharToUpper(
8a00: 0a 20 20 20 20 69 6e 74 20 63 68 29 09 09 09 2f . int ch).../
8a10: 2a 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63 * Unicode charac
8a20: 74 65 72 20 74 6f 20 63 6f 6e 76 65 72 74 2e 20 ter to convert.
8a30: 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28 21 55 4e */.{. if (!UN
8a40: 49 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e ICODE_OUT_OF_RAN
8a50: 47 45 28 63 68 29 29 20 7b 0a 09 69 6e 74 20 69 GE(ch)) {..int i
8a60: 6e 66 6f 20 3d 20 47 65 74 55 6e 69 43 68 61 72 nfo = GetUniChar
8a70: 49 6e 66 6f 28 63 68 29 3b 0a 0a 09 69 66 20 28 Info(ch);...if (
8a80: 47 65 74 43 61 73 65 54 79 70 65 28 69 6e 66 6f GetCaseType(info
8a90: 29 20 26 20 30 78 30 34 29 20 7b 0a 09 20 20 20 ) & 0x04) {..
8aa0: 20 63 68 20 2d 3d 20 47 65 74 44 65 6c 74 61 28 ch -= GetDelta(
8ab0: 69 6e 66 6f 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a info);..}. }.
8ac0: 20 20 20 20 72 65 74 75 72 6e 20 63 68 20 26 20 return ch &
8ad0: 30 78 31 46 46 46 46 46 3b 0a 7d 0a 0c 0a 2f 2a 0x1FFFFF;.}.../*
8ae0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
8b30: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 Tcl_UniCharToLow
8b40: 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 er --. *. *.Comp
8b50: 75 74 65 20 74 68 65 20 6c 6f 77 65 72 63 61 73 ute the lowercas
8b60: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 e equivalent of
8b70: 74 68 65 20 67 69 76 65 6e 20 55 6e 69 63 6f 64 the given Unicod
8b80: 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a e character.. *.
8b90: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 * Results:. *.R
8ba0: 65 74 75 72 6e 73 20 74 68 65 20 6c 6f 77 65 72 eturns the lower
8bb0: 63 61 73 65 20 55 6e 69 63 6f 64 65 20 63 68 61 case Unicode cha
8bc0: 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 53 69 racter.. *. * Si
8bd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
8be0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c30: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e . */..int.Tcl_Un
8c40: 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 0a 20 20 iCharToLower(.
8c50: 20 20 69 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 int ch).../* U
8c60: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 nicode character
8c70: 20 74 6f 20 63 6f 6e 76 65 72 74 2e 20 2a 2f 0a to convert. */.
8c80: 7b 0a 20 20 20 20 69 66 20 28 21 55 4e 49 43 4f {. if (!UNICO
8c90: 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 45 28 DE_OUT_OF_RANGE(
8ca0: 63 68 29 29 20 7b 0a 09 69 6e 74 20 69 6e 66 6f ch)) {..int info
8cb0: 20 3d 20 47 65 74 55 6e 69 43 68 61 72 49 6e 66 = GetUniCharInf
8cc0: 6f 28 63 68 29 3b 0a 09 69 6e 74 20 6d 6f 64 65 o(ch);..int mode
8cd0: 20 3d 20 47 65 74 43 61 73 65 54 79 70 65 28 69 = GetCaseType(i
8ce0: 6e 66 6f 29 3b 0a 0a 09 69 66 20 28 28 6d 6f 64 nfo);...if ((mod
8cf0: 65 20 26 20 30 78 30 32 29 20 26 26 20 28 6d 6f e & 0x02) && (mo
8d00: 64 65 20 21 3d 20 30 78 37 29 29 20 7b 0a 09 20 de != 0x7)) {..
8d10: 20 20 20 63 68 20 2b 3d 20 47 65 74 44 65 6c 74 ch += GetDelt
8d20: 61 28 69 6e 66 6f 29 3b 0a 09 7d 0a 20 20 20 20 a(info);..}.
8d30: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63 68 20 }. return ch
8d40: 26 20 30 78 31 46 46 46 46 46 3b 0a 7d 0a 0c 0a & 0x1FFFFF;.}...
8d50: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
8d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
8da0: 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 54 * Tcl_UniCharToT
8db0: 69 74 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f itle --. *. *.Co
8dc0: 6d 70 75 74 65 20 74 68 65 20 74 69 74 6c 65 63 mpute the titlec
8dd0: 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f ase equivalent o
8de0: 66 20 74 68 65 20 67 69 76 65 6e 20 55 6e 69 63 f the given Unic
8df0: 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 ode character..
8e00: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
8e10: 09 52 65 74 75 72 6e 73 20 74 68 65 20 74 69 74 .Returns the tit
8e20: 6c 65 63 61 73 65 20 55 6e 69 63 6f 64 65 20 63 lecase Unicode c
8e30: 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 haracter.. *. *
8e40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8e50: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ea0: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f --. */..int.Tcl_
8eb0: 55 6e 69 43 68 61 72 54 6f 54 69 74 6c 65 28 0a UniCharToTitle(.
8ec0: 20 20 20 20 69 6e 74 20 63 68 29 09 09 09 2f 2a int ch).../*
8ed0: 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 Unicode charact
8ee0: 65 72 20 74 6f 20 63 6f 6e 76 65 72 74 2e 20 2a er to convert. *
8ef0: 2f 0a 7b 0a 20 20 20 20 69 66 20 28 21 55 4e 49 /.{. if (!UNI
8f00: 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 CODE_OUT_OF_RANG
8f10: 45 28 63 68 29 29 20 7b 0a 09 69 6e 74 20 69 6e E(ch)) {..int in
8f20: 66 6f 20 3d 20 47 65 74 55 6e 69 43 68 61 72 49 fo = GetUniCharI
8f30: 6e 66 6f 28 63 68 29 3b 0a 09 69 6e 74 20 6d 6f nfo(ch);..int mo
8f40: 64 65 20 3d 20 47 65 74 43 61 73 65 54 79 70 65 de = GetCaseType
8f50: 28 69 6e 66 6f 29 3b 0a 0a 09 69 66 20 28 6d 6f (info);...if (mo
8f60: 64 65 20 26 20 30 78 31 29 20 7b 0a 09 20 20 20 de & 0x1) {..
8f70: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 53 75 62 74 /*.. * Subt
8f80: 72 61 63 74 20 6f 72 20 61 64 64 20 6f 6e 65 20 ract or add one
8f90: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 depending on the
8fa0: 20 6f 72 69 67 69 6e 61 6c 20 63 61 73 65 2e 0a original case..
8fb0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 . */... i
8fc0: 66 20 28 6d 6f 64 65 20 21 3d 20 30 78 37 29 20 f (mode != 0x7)
8fd0: 7b 0a 09 09 63 68 20 2b 3d 20 28 28 6d 6f 64 65 {...ch += ((mode
8fe0: 20 26 20 30 78 34 29 20 3f 20 2d 31 20 3a 20 31 & 0x4) ? -1 : 1
8ff0: 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 );.. }..} els
9000: 65 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 30 78 e if (mode == 0x
9010: 34 29 20 7b 0a 09 20 20 20 20 63 68 20 2d 3d 20 4) {.. ch -=
9020: 47 65 74 44 65 6c 74 61 28 69 6e 66 6f 29 3b 0a GetDelta(info);.
9030: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 .}. }. ret
9040: 75 72 6e 20 63 68 20 26 20 30 78 31 46 46 46 46 urn ch & 0x1FFFF
9050: 46 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d F;.}.../*. *----
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90a0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 --. *. * Tcl_Uni
90b0: 43 68 61 72 4c 65 6e 20 2d 2d 0a 20 2a 0a 20 2a CharLen --. *. *
90c0: 09 46 69 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 .Find the length
90d0: 20 6f 66 20 61 20 55 6e 69 43 68 61 72 20 73 74 of a UniChar st
90e0: 72 69 6e 67 2e 20 54 68 65 20 73 74 72 20 69 6e ring. The str in
90f0: 70 75 74 20 6d 75 73 74 20 62 65 20 6e 75 6c 6c put must be null
9100: 0a 20 2a 09 74 65 72 6d 69 6e 61 74 65 64 2e 0a . *.terminated..
9110: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
9120: 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 6c 65 *.Returns the le
9130: 6e 67 74 68 20 6f 66 20 73 74 72 20 69 6e 20 55 ngth of str in U
9140: 6e 69 43 68 61 72 73 20 28 6e 6f 74 20 62 79 74 niChars (not byt
9150: 65 73 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 es).. *. * Side
9160: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
9170: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
91c0: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 /..int.Tcl_UniCh
91d0: 61 72 4c 65 6e 28 0a 20 20 20 20 63 6f 6e 73 74 arLen(. const
91e0: 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 2a 75 6e Tcl_UniChar *un
91f0: 69 53 74 72 29 09 2f 2a 20 55 6e 69 63 6f 64 65 iStr)./* Unicode
9200: 20 73 74 72 69 6e 67 20 74 6f 20 66 69 6e 64 20 string to find
9210: 6c 65 6e 67 74 68 20 6f 66 2e 20 2a 2f 0a 7b 0a length of. */.{.
9220: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b int len = 0;
9230: 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 2a 75 6e .. while (*un
9240: 69 53 74 72 20 21 3d 20 27 5c 30 27 29 20 7b 0a iStr != '\0') {.
9250: 09 6c 65 6e 2b 2b 3b 0a 09 75 6e 69 53 74 72 2b .len++;..uniStr+
9260: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 +;. }. ret
9270: 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a urn len;.}.../*.
9280: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
92d0: 63 6c 5f 55 6e 69 43 68 61 72 4e 63 6d 70 20 2d cl_UniCharNcmp -
92e0: 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 61 72 65 20 -. *. *.Compare
92f0: 61 74 20 6d 6f 73 74 20 6e 75 6d 43 68 61 72 73 at most numChars
9300: 20 75 6e 69 63 68 61 72 73 20 6f 66 20 73 74 72 unichars of str
9310: 69 6e 67 20 75 63 73 20 74 6f 20 73 74 72 69 6e ing ucs to strin
9320: 67 20 75 63 74 2e 0a 20 2a 09 42 6f 74 68 20 75 g uct.. *.Both u
9330: 63 73 20 61 6e 64 20 75 63 74 20 61 72 65 20 61 cs and uct are a
9340: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61 74 20 ssumed to be at
9350: 6c 65 61 73 74 20 6e 75 6d 43 68 61 72 73 20 75 least numChars u
9360: 6e 69 63 68 61 72 73 20 6c 6f 6e 67 2e 0a 20 2a nichars long.. *
9370: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
9380: 52 65 74 75 72 6e 20 3c 30 20 69 66 20 75 63 73 Return <0 if ucs
9390: 20 3c 20 75 63 74 2c 20 30 20 69 66 20 75 63 73 < uct, 0 if ucs
93a0: 20 3d 3d 20 75 63 74 2c 20 6f 72 20 3e 30 20 69 == uct, or >0 i
93b0: 66 20 75 63 73 20 3e 20 75 63 74 2e 0a 20 2a 0a f ucs > uct.. *.
93c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
93d0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9420: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
9430: 63 6c 5f 55 6e 69 43 68 61 72 4e 63 6d 70 28 0a cl_UniCharNcmp(.
9440: 20 20 20 20 63 6f 6e 73 74 20 54 63 6c 5f 55 6e const Tcl_Un
9450: 69 43 68 61 72 20 2a 75 63 73 2c 09 2f 2a 20 55 iChar *ucs,./* U
9460: 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f nicode string to
9470: 20 63 6f 6d 70 61 72 65 20 74 6f 20 75 63 74 2e compare to uct.
9480: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 */. const Tc
9490: 6c 5f 55 6e 69 43 68 61 72 20 2a 75 63 74 2c 09 l_UniChar *uct,.
94a0: 2f 2a 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e /* Unicode strin
94b0: 67 20 75 63 73 20 69 73 20 63 6f 6d 70 61 72 65 g ucs is compare
94c0: 64 20 74 6f 2e 20 2a 2f 0a 20 20 20 20 75 6e 73 d to. */. uns
94d0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 43 68 igned long numCh
94e0: 61 72 73 29 09 2f 2a 20 4e 75 6d 62 65 72 20 6f ars)./* Number o
94f0: 66 20 75 6e 69 63 68 61 72 73 20 74 6f 20 63 6f f unichars to co
9500: 6d 70 61 72 65 2e 20 2a 2f 0a 7b 0a 23 69 66 64 mpare. */.{.#ifd
9510: 65 66 20 57 4f 52 44 53 5f 42 49 47 45 4e 44 49 ef WORDS_BIGENDI
9520: 41 4e 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a AN. /*. *
9530: 20 57 65 20 61 72 65 20 64 65 66 69 6e 69 74 65 We are definite
9540: 6c 79 20 6f 6e 20 61 20 62 69 67 2d 65 6e 64 69 ly on a big-endi
9550: 61 6e 20 6d 61 63 68 69 6e 65 3b 20 6d 65 6d 63 an machine; memc
9560: 6d 70 28 29 20 69 73 20 73 61 66 65 0a 20 20 20 mp() is safe.
9570: 20 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e */.. return
9580: 20 6d 65 6d 63 6d 70 28 75 63 73 2c 20 75 63 74 memcmp(ucs, uct
9590: 2c 20 6e 75 6d 43 68 61 72 73 2a 73 69 7a 65 6f , numChars*sizeo
95a0: 66 28 54 63 6c 5f 55 6e 69 43 68 61 72 29 29 3b f(Tcl_UniChar));
95b0: 0a 0a 23 65 6c 73 65 20 2f 2a 20 21 57 4f 52 44 ..#else /* !WORD
95c0: 53 5f 42 49 47 45 4e 44 49 41 4e 20 2a 2f 0a 20 S_BIGENDIAN */.
95d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 /*. * We
95e0: 63 61 6e 27 74 20 73 69 6d 70 6c 79 20 63 61 6c can't simply cal
95f0: 6c 20 6d 65 6d 63 6d 70 28 29 20 62 65 63 61 75 l memcmp() becau
9600: 73 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6c se that is not l
9610: 65 78 69 63 61 6c 6c 79 20 63 6f 72 72 65 63 74 exically correct
9620: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 .. */.. f
9630: 6f 72 20 28 20 3b 20 6e 75 6d 43 68 61 72 73 20 or ( ; numChars
9640: 21 3d 20 30 3b 20 75 63 73 2b 2b 2c 20 75 63 74 != 0; ucs++, uct
9650: 2b 2b 2c 20 6e 75 6d 43 68 61 72 73 2d 2d 29 20 ++, numChars--)
9660: 7b 0a 09 69 66 20 28 2a 75 63 73 20 21 3d 20 2a {..if (*ucs != *
9670: 75 63 74 29 20 7b 0a 09 20 20 20 20 72 65 74 75 uct) {.. retu
9680: 72 6e 20 28 2a 75 63 73 20 2d 20 2a 75 63 74 29 rn (*ucs - *uct)
9690: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 ;..}. }. r
96a0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 20 eturn 0;.#endif
96b0: 2f 2a 20 57 4f 52 44 53 5f 42 49 47 45 4e 44 49 /* WORDS_BIGENDI
96c0: 41 4e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d AN */.}.../*. *-
96d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9710: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f -----. *. * Tcl_
9720: 55 6e 69 43 68 61 72 4e 63 61 73 65 63 6d 70 20 UniCharNcasecmp
9730: 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 61 72 65 --. *. *.Compare
9740: 20 61 74 20 6d 6f 73 74 20 6e 75 6d 43 68 61 72 at most numChar
9750: 73 20 75 6e 69 63 68 61 72 73 20 6f 66 20 73 74 s unichars of st
9760: 72 69 6e 67 20 75 63 73 20 74 6f 20 73 74 72 69 ring ucs to stri
9770: 6e 67 20 75 63 74 20 63 61 73 65 0a 20 2a 09 69 ng uct case. *.i
9780: 6e 73 65 6e 73 69 74 69 76 65 2e 20 42 6f 74 68 nsensitive. Both
9790: 20 75 63 73 20 61 6e 64 20 75 63 74 20 61 72 65 ucs and uct are
97a0: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61 assumed to be a
97b0: 74 20 6c 65 61 73 74 20 6e 75 6d 43 68 61 72 73 t least numChars
97c0: 0a 20 2a 09 75 6e 69 63 68 61 72 73 20 6c 6f 6e . *.unichars lon
97d0: 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 g.. *. * Results
97e0: 3a 0a 20 2a 09 52 65 74 75 72 6e 20 3c 30 20 69 :. *.Return <0 i
97f0: 66 20 75 63 73 20 3c 20 75 63 74 2c 20 30 20 69 f ucs < uct, 0 i
9800: 66 20 75 63 73 20 3d 3d 20 75 63 74 2c 20 6f 72 f ucs == uct, or
9810: 20 3e 30 20 69 66 20 75 63 73 20 3e 20 75 63 74 >0 if ucs > uct
9820: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
9830: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
9840: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
9890: 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 61 72 4e int.Tcl_UniCharN
98a0: 63 61 73 65 63 6d 70 28 0a 20 20 20 20 63 6f 6e casecmp(. con
98b0: 73 74 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 2a st Tcl_UniChar *
98c0: 75 63 73 2c 09 2f 2a 20 55 6e 69 63 6f 64 65 20 ucs,./* Unicode
98d0: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 string to compar
98e0: 65 20 74 6f 20 75 63 74 2e 20 2a 2f 0a 20 20 20 e to uct. */.
98f0: 20 63 6f 6e 73 74 20 54 63 6c 5f 55 6e 69 43 68 const Tcl_UniCh
9900: 61 72 20 2a 75 63 74 2c 09 2f 2a 20 55 6e 69 63 ar *uct,./* Unic
9910: 6f 64 65 20 73 74 72 69 6e 67 20 75 63 73 20 69 ode string ucs i
9920: 73 20 63 6f 6d 70 61 72 65 64 20 74 6f 2e 20 2a s compared to. *
9930: 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c /. unsigned l
9940: 6f 6e 67 20 6e 75 6d 43 68 61 72 73 29 09 2f 2a ong numChars)./*
9950: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 63 68 Number of unich
9960: 61 72 73 20 74 6f 20 63 6f 6d 70 61 72 65 2e 20 ars to compare.
9970: 2a 2f 0a 7b 0a 20 20 20 20 66 6f 72 20 28 20 3b */.{. for ( ;
9980: 20 6e 75 6d 43 68 61 72 73 20 21 3d 20 30 3b 20 numChars != 0;
9990: 6e 75 6d 43 68 61 72 73 2d 2d 2c 20 75 63 73 2b numChars--, ucs+
99a0: 2b 2c 20 75 63 74 2b 2b 29 20 7b 0a 09 69 66 20 +, uct++) {..if
99b0: 28 2a 75 63 73 20 21 3d 20 2a 75 63 74 29 20 7b (*ucs != *uct) {
99c0: 0a 09 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 .. Tcl_UniCha
99d0: 72 20 6c 63 73 20 3d 20 54 63 6c 5f 55 6e 69 43 r lcs = Tcl_UniC
99e0: 68 61 72 54 6f 4c 6f 77 65 72 28 2a 75 63 73 29 harToLower(*ucs)
99f0: 3b 0a 09 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 ;.. Tcl_UniCh
9a00: 61 72 20 6c 63 74 20 3d 20 54 63 6c 5f 55 6e 69 ar lct = Tcl_Uni
9a10: 43 68 61 72 54 6f 4c 6f 77 65 72 28 2a 75 63 74 CharToLower(*uct
9a20: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 6c 63 73 );... if (lcs
9a30: 20 21 3d 20 6c 63 74 29 20 7b 0a 09 09 72 65 74 != lct) {...ret
9a40: 75 72 6e 20 28 6c 63 73 20 2d 20 6c 63 74 29 3b urn (lcs - lct);
9a50: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
9a60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
9a70: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
9a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9ac0: 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 *. * Tcl_UniChar
9ad0: 49 73 41 6c 6e 75 6d 20 2d 2d 0a 20 2a 0a 20 2a IsAlnum --. *. *
9ae0: 09 54 65 73 74 20 69 66 20 61 20 63 68 61 72 61 .Test if a chara
9af0: 63 74 65 72 20 69 73 20 61 6e 20 61 6c 70 68 61 cter is an alpha
9b00: 6e 75 6d 65 72 69 63 20 55 6e 69 63 6f 64 65 20 numeric Unicode
9b10: 63 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a character.. *. *
9b20: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 Results:. *.Ret
9b30: 75 72 6e 73 20 31 20 69 66 20 63 68 61 72 61 63 urns 1 if charac
9b40: 74 65 72 20 69 73 20 61 6c 70 68 61 6e 75 6d 65 ter is alphanume
9b50: 72 69 63 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ric.. *. * Side
9b60: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
9b70: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
9b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
9bc0: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 /..int.Tcl_UniCh
9bd0: 61 72 49 73 41 6c 6e 75 6d 28 0a 20 20 20 20 69 arIsAlnum(. i
9be0: 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 6e 69 63 nt ch).../* Unic
9bf0: 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 74 6f ode character to
9c00: 20 74 65 73 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 test. */.{.
9c10: 69 66 20 28 55 4e 49 43 4f 44 45 5f 4f 55 54 5f if (UNICODE_OUT_
9c20: 4f 46 5f 52 41 4e 47 45 28 63 68 29 29 20 7b 0a OF_RANGE(ch)) {.
9c30: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d .return 0;. }
9c40: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 28 41 . return (((A
9c50: 4c 50 48 41 5f 42 49 54 53 20 7c 20 44 49 47 49 LPHA_BITS | DIGI
9c60: 54 5f 42 49 54 53 29 20 3e 3e 20 47 65 74 43 61 T_BITS) >> GetCa
9c70: 74 65 67 6f 72 79 28 63 68 29 29 20 26 20 31 29 tegory(ch)) & 1)
9c80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
9c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cd0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 -. *. * Tcl_UniC
9ce0: 68 61 72 49 73 41 6c 70 68 61 20 2d 2d 0a 20 2a harIsAlpha --. *
9cf0: 0a 20 2a 09 54 65 73 74 20 69 66 20 61 20 63 68 . *.Test if a ch
9d00: 61 72 61 63 74 65 72 20 69 73 20 61 6e 20 61 6c aracter is an al
9d10: 70 68 61 62 65 74 69 63 20 55 6e 69 63 6f 64 65 phabetic Unicode
9d20: 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 character.. *.
9d30: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 * Results:. *.Re
9d40: 74 75 72 6e 73 20 31 20 69 66 20 63 68 61 72 61 turns 1 if chara
9d50: 63 74 65 72 20 69 73 20 61 6c 70 68 61 62 65 74 cter is alphabet
9d60: 69 63 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ic.. *. * Side e
9d70: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
9d80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
9d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
9dd0: 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 61 ..int.Tcl_UniCha
9de0: 72 49 73 41 6c 70 68 61 28 0a 20 20 20 20 69 6e rIsAlpha(. in
9df0: 74 20 63 68 29 09 09 09 2f 2a 20 55 6e 69 63 6f t ch).../* Unico
9e00: 64 65 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 de character to
9e10: 74 65 73 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 test. */.{. i
9e20: 66 20 28 55 4e 49 43 4f 44 45 5f 4f 55 54 5f 4f f (UNICODE_OUT_O
9e30: 46 5f 52 41 4e 47 45 28 63 68 29 29 20 7b 0a 09 F_RANGE(ch)) {..
9e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
9e50: 20 20 20 20 72 65 74 75 72 6e 20 28 28 41 4c 50 return ((ALP
9e60: 48 41 5f 42 49 54 53 20 3e 3e 20 47 65 74 43 61 HA_BITS >> GetCa
9e70: 74 65 67 6f 72 79 28 63 68 29 29 20 26 20 31 29 tegory(ch)) & 1)
9e80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ed0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 -. *. * Tcl_UniC
9ee0: 68 61 72 49 73 43 6f 6e 74 72 6f 6c 20 2d 2d 0a harIsControl --.
9ef0: 20 2a 0a 20 2a 09 54 65 73 74 20 69 66 20 61 20 *. *.Test if a
9f00: 63 68 61 72 61 63 74 65 72 20 69 73 20 61 20 55 character is a U
9f10: 6e 69 63 6f 64 65 20 63 6f 6e 74 72 6f 6c 20 63 nicode control c
9f20: 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 haracter.. *. *
9f30: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
9f40: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 rns non-zero if
9f50: 63 68 61 72 61 63 74 65 72 20 69 73 20 61 20 63 character is a c
9f60: 6f 6e 74 72 6f 6c 2e 0a 20 2a 0a 20 2a 20 53 69 ontrol.. *. * Si
9f70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
9f80: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
9f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fd0: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e . */..int.Tcl_Un
9fe0: 69 43 68 61 72 49 73 43 6f 6e 74 72 6f 6c 28 0a iCharIsControl(.
9ff0: 20 20 20 20 69 6e 74 20 63 68 29 09 09 09 2f 2a int ch).../*
a000: 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 Unicode charact
a010: 65 72 20 74 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b er to test. */.{
a020: 0a 20 20 20 20 69 66 20 28 55 4e 49 43 4f 44 45 . if (UNICODE
a030: 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 45 28 63 68 _OUT_OF_RANGE(ch
a040: 29 29 20 7b 0a 09 63 68 20 26 3d 20 30 78 31 46 )) {..ch &= 0x1F
a050: 46 46 46 46 3b 0a 09 69 66 20 28 28 63 68 20 3d FFFF;..if ((ch =
a060: 3d 20 30 78 45 30 30 30 31 29 20 7c 7c 20 28 28 = 0xE0001) || ((
a070: 63 68 20 3e 3d 20 30 78 45 30 30 32 30 29 20 26 ch >= 0xE0020) &
a080: 26 20 28 63 68 20 3c 3d 20 30 78 45 30 30 37 66 & (ch <= 0xE007f
a090: 29 29 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 ))) {.. retur
a0a0: 6e 20 31 3b 0a 09 7d 0a 09 69 66 20 28 28 63 68 n 1;..}..if ((ch
a0b0: 20 3e 3d 20 30 78 46 30 30 30 30 29 20 26 26 20 >= 0xF0000) &&
a0c0: 28 28 63 68 20 26 20 30 78 46 46 46 46 29 20 3c ((ch & 0xFFFF) <
a0d0: 3d 20 30 78 46 46 46 44 29 29 20 7b 0a 09 20 20 = 0xFFFD)) {..
a0e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 09 return 1;..}..
a0f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
a100: 20 20 20 20 72 65 74 75 72 6e 20 28 28 43 4f 4e return ((CON
a110: 54 52 4f 4c 5f 42 49 54 53 20 3e 3e 20 47 65 74 TROL_BITS >> Get
a120: 43 61 74 65 67 6f 72 79 28 63 68 29 29 20 26 20 Category(ch)) &
a130: 31 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 1);.}.../*. *---
a140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a180: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e ---. *. * Tcl_Un
a190: 69 43 68 61 72 49 73 44 69 67 69 74 20 2d 2d 0a iCharIsDigit --.
a1a0: 20 2a 0a 20 2a 09 54 65 73 74 20 69 66 20 61 20 *. *.Test if a
a1b0: 63 68 61 72 61 63 74 65 72 20 69 73 20 61 20 6e character is a n
a1c0: 75 6d 65 72 69 63 20 55 6e 69 63 6f 64 65 20 63 umeric Unicode c
a1d0: 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 haracter.. *. *
a1e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
a1f0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 rns non-zero if
a200: 63 68 61 72 61 63 74 65 72 20 69 73 20 61 20 64 character is a d
a210: 69 67 69 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 igit.. *. * Side
a220: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
a230: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
a240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a280: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 */..int.Tcl_UniC
a290: 68 61 72 49 73 44 69 67 69 74 28 0a 20 20 20 20 harIsDigit(.
a2a0: 69 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 6e 69 int ch).../* Uni
a2b0: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 74 code character t
a2c0: 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b 0a 20 20 20 o test. */.{.
a2d0: 20 69 66 20 28 55 4e 49 43 4f 44 45 5f 4f 55 54 if (UNICODE_OUT
a2e0: 5f 4f 46 5f 52 41 4e 47 45 28 63 68 29 29 20 7b _OF_RANGE(ch)) {
a2f0: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
a300: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 28 47 65 }. return (Ge
a310: 74 43 61 74 65 67 6f 72 79 28 63 68 29 20 3d 3d tCategory(ch) ==
a320: 20 44 45 43 49 4d 41 4c 5f 44 49 47 49 54 5f 4e DECIMAL_DIGIT_N
a330: 55 4d 42 45 52 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 UMBER);.}.../*.
a340: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a380: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
a390: 6c 5f 55 6e 69 43 68 61 72 49 73 47 72 61 70 68 l_UniCharIsGraph
a3a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 65 73 74 20 69 --. *. *.Test i
a3b0: 66 20 61 20 63 68 61 72 61 63 74 65 72 20 69 73 f a character is
a3c0: 20 61 6e 79 20 55 6e 69 63 6f 64 65 20 70 72 69 any Unicode pri
a3d0: 6e 74 20 63 68 61 72 61 63 74 65 72 20 65 78 63 nt character exc
a3e0: 65 70 74 20 73 70 61 63 65 2e 0a 20 2a 0a 20 2a ept space.. *. *
a3f0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 Results:. *.Ret
a400: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 urns non-zero if
a410: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 70 72 character is pr
a420: 69 6e 74 61 62 6c 65 2c 20 62 75 74 20 6e 6f 74 intable, but not
a430: 20 73 70 61 63 65 2e 0a 20 2a 0a 20 2a 20 53 69 space.. *. * Si
a440: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
a450: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
a460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4a0: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e . */..int.Tcl_Un
a4b0: 69 43 68 61 72 49 73 47 72 61 70 68 28 0a 20 20 iCharIsGraph(.
a4c0: 20 20 69 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 int ch).../* U
a4d0: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 nicode character
a4e0: 20 74 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b 0a 20 to test. */.{.
a4f0: 20 20 20 69 66 20 28 55 4e 49 43 4f 44 45 5f 4f if (UNICODE_O
a500: 55 54 5f 4f 46 5f 52 41 4e 47 45 28 63 68 29 29 UT_OF_RANGE(ch))
a510: 20 7b 0a 09 63 68 20 26 3d 20 30 78 31 46 46 46 {..ch &= 0x1FFF
a520: 46 46 3b 0a 09 72 65 74 75 72 6e 20 28 63 68 20 FF;..return (ch
a530: 3e 3d 20 30 78 45 30 31 30 30 29 20 26 26 20 28 >= 0xE0100) && (
a540: 63 68 20 3c 3d 20 30 78 45 30 31 45 46 29 3b 0a ch <= 0xE01EF);.
a550: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
a560: 20 28 28 47 52 41 50 48 5f 42 49 54 53 20 3e 3e ((GRAPH_BITS >>
a570: 20 47 65 74 43 61 74 65 67 6f 72 79 28 63 68 29 GetCategory(ch)
a580: 29 20 26 20 31 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ) & 1);.}.../*.
a590: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
a5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
a5e0: 6c 5f 55 6e 69 43 68 61 72 49 73 4c 6f 77 65 72 l_UniCharIsLower
a5f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 65 73 74 20 69 --. *. *.Test i
a600: 66 20 61 20 63 68 61 72 61 63 74 65 72 20 69 73 f a character is
a610: 20 61 20 6c 6f 77 65 72 63 61 73 65 20 55 6e 69 a lowercase Uni
a620: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a code character..
a630: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
a640: 2a 09 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 *.Returns non-ze
a650: 72 6f 20 69 66 20 63 68 61 72 61 63 74 65 72 20 ro if character
a660: 69 73 20 6c 6f 77 65 72 63 61 73 65 2e 0a 20 2a is lowercase.. *
a670: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
a680: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
a690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
a6e0: 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 4c 6f 77 Tcl_UniCharIsLow
a6f0: 65 72 28 0a 20 20 20 20 69 6e 74 20 63 68 29 09 er(. int ch).
a700: 09 09 2f 2a 20 55 6e 69 63 6f 64 65 20 63 68 61 ../* Unicode cha
a710: 72 61 63 74 65 72 20 74 6f 20 74 65 73 74 2e 20 racter to test.
a720: 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28 55 4e 49 */.{. if (UNI
a730: 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 CODE_OUT_OF_RANG
a740: 45 28 63 68 29 29 20 7b 0a 09 72 65 74 75 72 6e E(ch)) {..return
a750: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 0;. }. re
a760: 74 75 72 6e 20 28 47 65 74 43 61 74 65 67 6f 72 turn (GetCategor
a770: 79 28 63 68 29 20 3d 3d 20 4c 4f 57 45 52 43 41 y(ch) == LOWERCA
a780: 53 45 5f 4c 45 54 54 45 52 29 3b 0a 7d 0a 0c 0a SE_LETTER);.}...
a790: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
a7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
a7e0: 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 50 * Tcl_UniCharIsP
a7f0: 72 69 6e 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 65 rint --. *. *.Te
a800: 73 74 20 69 66 20 61 20 63 68 61 72 61 63 74 65 st if a characte
a810: 72 20 69 73 20 61 20 55 6e 69 63 6f 64 65 20 70 r is a Unicode p
a820: 72 69 6e 74 20 63 68 61 72 61 63 74 65 72 2e 0a rint character..
a830: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
a840: 2a 09 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 *.Returns non-ze
a850: 72 6f 20 69 66 20 63 68 61 72 61 63 74 65 72 20 ro if character
a860: 69 73 20 70 72 69 6e 74 61 62 6c 65 2e 0a 20 2a is printable.. *
a870: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
a880: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
a890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a8d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
a8e0: 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 50 72 69 Tcl_UniCharIsPri
a8f0: 6e 74 28 0a 20 20 20 20 69 6e 74 20 63 68 29 09 nt(. int ch).
a900: 09 09 2f 2a 20 55 6e 69 63 6f 64 65 20 63 68 61 ../* Unicode cha
a910: 72 61 63 74 65 72 20 74 6f 20 74 65 73 74 2e 20 racter to test.
a920: 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28 55 4e 49 */.{. if (UNI
a930: 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 CODE_OUT_OF_RANG
a940: 45 28 63 68 29 29 20 7b 0a 09 63 68 20 26 3d 20 E(ch)) {..ch &=
a950: 30 78 31 46 46 46 46 46 3b 0a 09 72 65 74 75 72 0x1FFFFF;..retur
a960: 6e 20 28 63 68 20 3e 3d 20 30 78 45 30 31 30 30 n (ch >= 0xE0100
a970: 29 20 26 26 20 28 63 68 20 3c 3d 20 30 78 45 30 ) && (ch <= 0xE0
a980: 31 45 46 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 1EF);. }.
a990: 72 65 74 75 72 6e 20 28 28 28 47 52 41 50 48 5f return (((GRAPH_
a9a0: 42 49 54 53 7c 53 50 41 43 45 5f 42 49 54 53 29 BITS|SPACE_BITS)
a9b0: 20 3e 3e 20 47 65 74 43 61 74 65 67 6f 72 79 28 >> GetCategory(
a9c0: 63 68 29 29 20 26 20 31 29 3b 0a 7d 0a 0c 0a 2f ch)) & 1);.}.../
a9d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
aa20: 20 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 50 75 Tcl_UniCharIsPu
aa30: 6e 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 65 73 nct --. *. *.Tes
aa40: 74 20 69 66 20 61 20 63 68 61 72 61 63 74 65 72 t if a character
aa50: 20 69 73 20 61 20 55 6e 69 63 6f 64 65 20 70 75 is a Unicode pu
aa60: 6e 63 74 75 61 74 69 6f 6e 20 63 68 61 72 61 63 nctuation charac
aa70: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
aa80: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 6e ts:. *.Returns n
aa90: 6f 6e 2d 7a 65 72 6f 20 69 66 20 63 68 61 72 61 on-zero if chara
aaa0: 63 74 65 72 20 69 73 20 70 75 6e 63 74 2e 0a 20 cter is punct..
aab0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
aac0: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
aad0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
aae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
ab20: 0a 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 50 75 .Tcl_UniCharIsPu
ab30: 6e 63 74 28 0a 20 20 20 20 69 6e 74 20 63 68 29 nct(. int ch)
ab40: 09 09 09 2f 2a 20 55 6e 69 63 6f 64 65 20 63 68 .../* Unicode ch
ab50: 61 72 61 63 74 65 72 20 74 6f 20 74 65 73 74 2e aracter to test.
ab60: 20 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28 55 4e */.{. if (UN
ab70: 49 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e ICODE_OUT_OF_RAN
ab80: 47 45 28 63 68 29 29 20 7b 0a 09 72 65 74 75 72 GE(ch)) {..retur
ab90: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 n 0;. }. r
aba0: 65 74 75 72 6e 20 28 28 50 55 4e 43 54 5f 42 49 eturn ((PUNCT_BI
abb0: 54 53 20 3e 3e 20 47 65 74 43 61 74 65 67 6f 72 TS >> GetCategor
abc0: 79 28 63 68 29 29 20 26 20 31 29 3b 0a 7d 0a 0c y(ch)) & 1);.}..
abd0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
ac20: 20 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 * Tcl_UniCharIs
ac30: 53 70 61 63 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 Space --. *. *.T
ac40: 65 73 74 20 69 66 20 61 20 63 68 61 72 61 63 74 est if a charact
ac50: 65 72 20 69 73 20 61 20 77 68 69 74 65 73 70 61 er is a whitespa
ac60: 63 65 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 ce Unicode chara
ac70: 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 cter.. *. * Resu
ac80: 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 lts:. *.Returns
ac90: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 63 68 61 72 non-zero if char
aca0: 61 63 74 65 72 20 69 73 20 61 20 73 70 61 63 65 acter is a space
acb0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
acc0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
acd0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
ace0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
acf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
ad20: 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 61 72 49 int.Tcl_UniCharI
ad30: 73 53 70 61 63 65 28 0a 20 20 20 20 69 6e 74 20 sSpace(. int
ad40: 63 68 29 09 09 09 2f 2a 20 55 6e 69 63 6f 64 65 ch).../* Unicode
ad50: 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 74 65 character to te
ad60: 73 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f 2a 20 st. */.{. /*
ad70: 49 67 6e 6f 72 65 20 75 70 70 65 72 20 31 31 20 Ignore upper 11
ad80: 62 69 74 73 2e 20 2a 2f 0a 20 20 20 20 63 68 20 bits. */. ch
ad90: 26 3d 20 30 78 31 46 46 46 46 46 3b 0a 0a 20 20 &= 0x1FFFFF;..
ada0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 74 /*. * If t
adb0: 68 65 20 63 68 61 72 61 63 74 65 72 20 69 73 20 he character is
adc0: 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 within the first
add0: 20 31 32 37 20 63 68 61 72 61 63 74 65 72 73 2c 127 characters,
ade0: 20 6a 75 73 74 20 75 73 65 20 74 68 65 0a 20 20 just use the.
adf0: 20 20 20 2a 20 73 74 61 6e 64 61 72 64 20 43 20 * standard C
ae00: 66 75 6e 63 74 69 6f 6e 2c 20 6f 74 68 65 72 77 function, otherw
ae10: 69 73 65 20 63 6f 6e 73 75 6c 74 20 74 68 65 20 ise consult the
ae20: 55 6e 69 63 6f 64 65 20 74 61 62 6c 65 2e 0a 20 Unicode table..
ae30: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
ae40: 63 68 20 3c 20 30 78 38 30 29 20 7b 0a 09 72 65 ch < 0x80) {..re
ae50: 74 75 72 6e 20 54 63 6c 49 73 53 70 61 63 65 50 turn TclIsSpaceP
ae60: 72 6f 63 28 28 63 68 61 72 29 20 63 68 29 3b 0a roc((char) ch);.
ae70: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 55 } else if (U
ae80: 4e 49 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 NICODE_OUT_OF_RA
ae90: 4e 47 45 28 63 68 29 29 20 7b 0a 09 72 65 74 75 NGE(ch)) {..retu
aea0: 72 6e 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 rn 0;. } else
aeb0: 20 69 66 20 28 63 68 20 3d 3d 20 30 78 30 30 38 if (ch == 0x008
aec0: 35 20 7c 7c 20 63 68 20 3d 3d 20 30 78 31 38 30 5 || ch == 0x180
aed0: 45 20 7c 7c 20 63 68 20 3d 3d 20 30 78 32 30 30 E || ch == 0x200
aee0: 42 0a 09 20 20 20 20 7c 7c 20 63 68 20 3d 3d 20 B.. || ch ==
aef0: 30 78 32 30 32 46 20 7c 7c 20 63 68 20 3d 3d 20 0x202F || ch ==
af00: 30 78 32 30 36 30 20 7c 7c 20 63 68 20 3d 3d 20 0x2060 || ch ==
af10: 30 78 46 45 46 46 29 20 7b 0a 09 72 65 74 75 72 0xFEFF) {..retur
af20: 6e 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 n 1;. } else
af30: 7b 0a 09 72 65 74 75 72 6e 20 28 28 53 50 41 43 {..return ((SPAC
af40: 45 5f 42 49 54 53 20 3e 3e 20 47 65 74 43 61 74 E_BITS >> GetCat
af50: 65 67 6f 72 79 28 63 68 29 29 20 26 20 31 29 3b egory(ch)) & 1);
af60: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a . }.}.../*. *
af70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afb0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
afc0: 5f 55 6e 69 43 68 61 72 49 73 55 70 70 65 72 20 _UniCharIsUpper
afd0: 2d 2d 0a 20 2a 0a 20 2a 09 54 65 73 74 20 69 66 --. *. *.Test if
afe0: 20 61 20 63 68 61 72 61 63 74 65 72 20 69 73 20 a character is
aff0: 61 20 75 70 70 65 72 63 61 73 65 20 55 6e 69 63 a uppercase Unic
b000: 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 ode character..
b010: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
b020: 09 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 .Returns non-zer
b030: 6f 20 69 66 20 63 68 61 72 61 63 74 65 72 20 69 o if character i
b040: 73 20 75 70 70 65 72 63 61 73 65 2e 0a 20 2a 0a s uppercase.. *.
b050: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
b060: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
b070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
b0c0: 63 6c 5f 55 6e 69 43 68 61 72 49 73 55 70 70 65 cl_UniCharIsUppe
b0d0: 72 28 0a 20 20 20 20 69 6e 74 20 63 68 29 09 09 r(. int ch)..
b0e0: 09 2f 2a 20 55 6e 69 63 6f 64 65 20 63 68 61 72 ./* Unicode char
b0f0: 61 63 74 65 72 20 74 6f 20 74 65 73 74 2e 20 2a acter to test. *
b100: 2f 0a 7b 0a 20 20 20 20 69 66 20 28 55 4e 49 43 /.{. if (UNIC
b110: 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 45 ODE_OUT_OF_RANGE
b120: 28 63 68 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 (ch)) {..return
b130: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 0;. }. ret
b140: 75 72 6e 20 28 47 65 74 43 61 74 65 67 6f 72 79 urn (GetCategory
b150: 28 63 68 29 20 3d 3d 20 55 50 50 45 52 43 41 53 (ch) == UPPERCAS
b160: 45 5f 4c 45 54 54 45 52 29 3b 0a 7d 0a 0c 0a 2f E_LETTER);.}.../
b170: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
b1c0: 20 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 57 6f Tcl_UniCharIsWo
b1d0: 72 64 43 68 61 72 20 2d 2d 0a 20 2a 0a 20 2a 09 rdChar --. *. *.
b1e0: 54 65 73 74 20 69 66 20 61 20 63 68 61 72 61 63 Test if a charac
b1f0: 74 65 72 20 69 73 20 61 6c 70 68 61 6e 75 6d 65 ter is alphanume
b200: 72 69 63 20 6f 72 20 61 20 63 6f 6e 6e 65 63 74 ric or a connect
b210: 6f 72 20 70 75 6e 63 74 75 61 74 69 6f 6e 20 6d or punctuation m
b220: 61 72 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ark.. *. * Resul
b230: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 31 ts:. *.Returns 1
b240: 20 69 66 20 63 68 61 72 61 63 74 65 72 20 69 73 if character is
b250: 20 61 20 77 6f 72 64 20 63 68 61 72 61 63 74 65 a word characte
b260: 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 r.. *. * Side ef
b270: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
b280: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
b290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
b2d0: 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 61 72 .int.Tcl_UniChar
b2e0: 49 73 57 6f 72 64 43 68 61 72 28 0a 20 20 20 20 IsWordChar(.
b2f0: 69 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 6e 69 int ch).../* Uni
b300: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 74 code character t
b310: 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b 0a 20 20 20 o test. */.{.
b320: 20 69 66 20 28 55 4e 49 43 4f 44 45 5f 4f 55 54 if (UNICODE_OUT
b330: 5f 4f 46 5f 52 41 4e 47 45 28 63 68 29 29 20 7b _OF_RANGE(ch)) {
b340: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
b350: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 57 }. return ((W
b360: 4f 52 44 5f 42 49 54 53 20 3e 3e 20 47 65 74 43 ORD_BITS >> GetC
b370: 61 74 65 67 6f 72 79 28 63 68 29 29 20 26 20 31 ategory(ch)) & 1
b380: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
b390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3d0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 --. *. * Tcl_Uni
b3e0: 43 68 61 72 43 61 73 65 4d 61 74 63 68 20 2d 2d CharCaseMatch --
b3f0: 0a 20 2a 0a 20 2a 09 53 65 65 20 69 66 20 61 20 . *. *.See if a
b400: 70 61 72 74 69 63 75 6c 61 72 20 55 6e 69 63 6f particular Unico
b410: 64 65 20 73 74 72 69 6e 67 20 6d 61 74 63 68 65 de string matche
b420: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 s a particular p
b430: 61 74 74 65 72 6e 2e 0a 20 2a 09 41 6c 6c 6f 77 attern.. *.Allow
b440: 73 20 63 61 73 65 20 69 6e 73 65 6e 73 69 74 69 s case insensiti
b450: 76 69 74 79 2e 20 54 68 69 73 20 69 73 20 74 68 vity. This is th
b460: 65 20 55 6e 69 63 6f 64 65 20 65 71 75 69 76 61 e Unicode equiva
b470: 6c 65 6e 74 20 6f 66 20 74 68 65 20 63 68 61 72 lent of the char
b480: 2a 0a 20 2a 09 54 63 6c 5f 53 74 72 69 6e 67 43 *. *.Tcl_StringC
b490: 61 73 65 4d 61 74 63 68 2e 20 54 68 65 20 55 6e aseMatch. The Un
b4a0: 69 43 68 61 72 20 73 74 72 69 6e 67 73 20 6d 75 iChar strings mu
b4b0: 73 74 20 62 65 20 4e 55 4c 4c 2d 74 65 72 6d 69 st be NULL-termi
b4c0: 6e 61 74 65 64 2e 0a 20 2a 09 54 68 69 73 20 68 nated.. *.This h
b4d0: 61 73 20 6e 6f 20 70 72 6f 76 69 73 69 6f 6e 20 as no provision
b4e0: 66 6f 72 20 63 6f 75 6e 74 65 64 20 55 6e 69 43 for counted UniC
b4f0: 68 61 72 20 73 74 72 69 6e 67 73 2c 20 74 68 75 har strings, thu
b500: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 0a s should not be.
b510: 20 2a 09 75 73 65 64 20 77 68 65 72 65 20 4e 55 *.used where NU
b520: 4c 4c 73 20 61 72 65 20 65 78 70 65 63 74 65 64 LLs are expected
b530: 20 69 6e 20 74 68 65 20 55 6e 69 43 68 61 72 20 in the UniChar
b540: 73 74 72 69 6e 67 2e 20 55 73 65 0a 20 2a 09 54 string. Use. *.T
b550: 63 6c 55 6e 69 43 68 61 72 4d 61 74 63 68 20 77 clUniCharMatch w
b560: 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 here possible..
b570: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
b580: 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 .The return valu
b590: 65 20 69 73 20 31 20 69 66 20 73 74 72 69 6e 67 e is 1 if string
b5a0: 20 6d 61 74 63 68 65 73 20 70 61 74 74 65 72 6e matches pattern
b5b0: 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 , and 0 otherwis
b5c0: 65 2e 20 54 68 65 0a 20 2a 09 6d 61 74 63 68 69 e. The. *.matchi
b5d0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 70 65 72 ng operation per
b5e0: 6d 69 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 mits the followi
b5f0: 6e 67 20 73 70 65 63 69 61 6c 20 63 68 61 72 61 ng special chara
b600: 63 74 65 72 73 20 69 6e 20 74 68 65 0a 20 2a 09 cters in the. *.
b610: 70 61 74 74 65 72 6e 3a 20 2a 3f 5c 5b 5d 20 28 pattern: *?\[] (
b620: 73 65 65 20 74 68 65 20 6d 61 6e 75 61 6c 20 65 see the manual e
b630: 6e 74 72 79 20 66 6f 72 20 64 65 74 61 69 6c 73 ntry for details
b640: 20 6f 6e 20 77 68 61 74 20 74 68 65 73 65 20 6d on what these m
b650: 65 61 6e 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ean).. *. * Side
b660: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
b670: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
b680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b6c0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 */..int.Tcl_UniC
b6d0: 68 61 72 43 61 73 65 4d 61 74 63 68 28 0a 20 20 harCaseMatch(.
b6e0: 20 20 63 6f 6e 73 74 20 54 63 6c 5f 55 6e 69 43 const Tcl_UniC
b6f0: 68 61 72 20 2a 75 6e 69 53 74 72 2c 09 2f 2a 20 har *uniStr,./*
b700: 55 6e 69 63 6f 64 65 20 53 74 72 69 6e 67 2e 20 Unicode String.
b710: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c */. const Tcl
b720: 5f 55 6e 69 43 68 61 72 20 2a 75 6e 69 50 61 74 _UniChar *uniPat
b730: 74 65 72 6e 2c 0a 09 09 09 09 2f 2a 20 50 61 74 tern,...../* Pat
b740: 74 65 72 6e 2c 20 77 68 69 63 68 20 6d 61 79 20 tern, which may
b750: 63 6f 6e 74 61 69 6e 20 73 70 65 63 69 61 6c 0a contain special.
b760: 09 09 09 09 20 2a 20 63 68 61 72 61 63 74 65 72 .... * character
b770: 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f s. */. int no
b780: 63 61 73 65 29 09 09 09 2f 2a 20 30 20 66 6f 72 case).../* 0 for
b790: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2c case sensitive,
b7a0: 20 31 20 66 6f 72 20 69 6e 73 65 6e 73 69 74 69 1 for insensiti
b7b0: 76 65 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f ve */.{. Tcl_
b7c0: 55 6e 69 43 68 61 72 20 63 68 31 20 3d 20 30 2c UniChar ch1 = 0,
b7d0: 20 70 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 p;.. while (
b7e0: 31 29 20 7b 0a 09 70 20 3d 20 2a 75 6e 69 50 61 1) {..p = *uniPa
b7f0: 74 74 65 72 6e 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 ttern;.../*.. *
b800: 53 65 65 20 69 66 20 77 65 27 72 65 20 61 74 20 See if we're at
b810: 74 68 65 20 65 6e 64 20 6f 66 20 62 6f 74 68 20 the end of both
b820: 74 68 65 20 70 61 74 74 65 72 6e 20 61 6e 64 20 the pattern and
b830: 74 68 65 20 73 74 72 69 6e 67 2e 20 49 66 20 73 the string. If s
b840: 6f 2c 0a 09 20 2a 20 77 65 20 73 75 63 63 65 65 o,.. * we succee
b850: 64 65 64 2e 20 49 66 20 77 65 27 72 65 20 61 74 ded. If we're at
b860: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 the end of the
b870: 70 61 74 74 65 72 6e 20 62 75 74 20 6e 6f 74 20 pattern but not
b880: 61 74 20 74 68 65 20 65 6e 64 0a 09 20 2a 20 6f at the end.. * o
b890: 66 20 74 68 65 20 73 74 72 69 6e 67 2c 20 77 65 f the string, we
b8a0: 20 66 61 69 6c 65 64 2e 0a 09 20 2a 2f 0a 0a 09 failed... */...
b8b0: 69 66 20 28 70 20 3d 3d 20 30 29 20 7b 0a 09 20 if (p == 0) {..
b8c0: 20 20 20 72 65 74 75 72 6e 20 28 2a 75 6e 69 53 return (*uniS
b8d0: 74 72 20 3d 3d 20 30 29 3b 0a 09 7d 0a 09 69 66 tr == 0);..}..if
b8e0: 20 28 28 2a 75 6e 69 53 74 72 20 3d 3d 20 30 29 ((*uniStr == 0)
b8f0: 20 26 26 20 28 70 20 21 3d 20 27 2a 27 29 29 20 && (p != '*'))
b900: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b {.. return 0;
b910: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 ..}.../*.. * Che
b920: 63 6b 20 66 6f 72 20 61 20 22 2a 22 20 61 73 20 ck for a "*" as
b930: 74 68 65 20 6e 65 78 74 20 70 61 74 74 65 72 6e the next pattern
b940: 20 63 68 61 72 61 63 74 65 72 2e 20 49 74 20 6d character. It m
b950: 61 74 63 68 65 73 20 61 6e 79 0a 09 20 2a 20 73 atches any.. * s
b960: 75 62 73 74 72 69 6e 67 2e 20 57 65 20 68 61 6e ubstring. We han
b970: 64 6c 65 20 74 68 69 73 20 62 79 20 73 6b 69 70 dle this by skip
b980: 70 69 6e 67 20 61 6c 6c 20 74 68 65 20 63 68 61 ping all the cha
b990: 72 61 63 74 65 72 73 20 75 70 20 74 6f 20 74 68 racters up to th
b9a0: 65 0a 09 20 2a 20 6e 65 78 74 20 6d 61 74 63 68 e.. * next match
b9b0: 69 6e 67 20 6f 6e 65 20 69 6e 20 74 68 65 20 70 ing one in the p
b9c0: 61 74 74 65 72 6e 2c 20 61 6e 64 20 74 68 65 6e attern, and then
b9d0: 20 63 61 6c 6c 69 6e 67 20 6f 75 72 73 65 6c 76 calling ourselv
b9e0: 65 73 0a 09 20 2a 20 72 65 63 75 72 73 69 76 65 es.. * recursive
b9f0: 6c 79 20 66 6f 72 20 65 61 63 68 20 70 6f 73 74 ly for each post
ba00: 66 69 78 20 6f 66 20 73 74 72 69 6e 67 2c 20 75 fix of string, u
ba10: 6e 74 69 6c 20 65 69 74 68 65 72 20 77 65 20 6d ntil either we m
ba20: 61 74 63 68 20 6f 72 20 77 65 0a 09 20 2a 20 72 atch or we.. * r
ba30: 65 61 63 68 20 74 68 65 20 65 6e 64 20 6f 66 20 each the end of
ba40: 74 68 65 20 73 74 72 69 6e 67 2e 0a 09 20 2a 2f the string... */
ba50: 0a 0a 09 69 66 20 28 70 20 3d 3d 20 27 2a 27 29 ...if (p == '*')
ba60: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
ba70: 20 2a 20 53 6b 69 70 20 61 6c 6c 20 73 75 63 63 * Skip all succ
ba80: 65 73 73 69 76 65 20 2a 27 73 20 69 6e 20 74 68 essive *'s in th
ba90: 65 20 70 61 74 74 65 72 6e 0a 09 20 20 20 20 20 e pattern..
baa0: 2a 2f 0a 0a 09 20 20 20 20 77 68 69 6c 65 20 28 */... while (
bab0: 2a 28 2b 2b 75 6e 69 50 61 74 74 65 72 6e 29 20 *(++uniPattern)
bac0: 3d 3d 20 27 2a 27 29 20 7b 0a 09 09 2f 2a 20 65 == '*') {.../* e
bad0: 6d 70 74 79 20 62 6f 64 79 20 2a 2f 0a 09 20 20 mpty body */..
bae0: 20 20 7d 0a 09 20 20 20 20 70 20 3d 20 2a 75 6e }.. p = *un
baf0: 69 50 61 74 74 65 72 6e 3b 0a 09 20 20 20 20 69 iPattern;.. i
bb00: 66 20 28 70 20 3d 3d 20 30 29 20 7b 0a 09 09 72 f (p == 0) {...r
bb10: 65 74 75 72 6e 20 31 3b 0a 09 20 20 20 20 7d 0a eturn 1;.. }.
bb20: 09 20 20 20 20 69 66 20 28 6e 6f 63 61 73 65 29 . if (nocase)
bb30: 20 7b 0a 09 09 70 20 3d 20 54 63 6c 5f 55 6e 69 {...p = Tcl_Uni
bb40: 43 68 61 72 54 6f 4c 6f 77 65 72 28 70 29 3b 0a CharToLower(p);.
bb50: 09 20 20 20 20 7d 0a 09 20 20 20 20 77 68 69 6c . }.. whil
bb60: 65 20 28 31 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 e (1) {.../*...
bb70: 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 * Optimization f
bb80: 6f 72 20 6d 61 74 63 68 69 6e 67 20 2d 20 63 72 or matching - cr
bb90: 75 69 73 65 20 74 68 72 6f 75 67 68 20 74 68 65 uise through the
bba0: 20 73 74 72 69 6e 67 0a 09 09 20 2a 20 71 75 69 string... * qui
bbb0: 63 6b 6c 79 20 69 66 20 74 68 65 20 6e 65 78 74 ckly if the next
bbc0: 20 63 68 61 72 20 69 6e 20 74 68 65 20 70 61 74 char in the pat
bbd0: 74 65 72 6e 20 69 73 6e 27 74 20 61 20 73 70 65 tern isn't a spe
bbe0: 63 69 61 6c 0a 09 09 20 2a 20 63 68 61 72 61 63 cial... * charac
bbf0: 74 65 72 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 ter... */....if
bc00: 28 28 70 20 21 3d 20 27 5b 27 29 20 26 26 20 28 ((p != '[') && (
bc10: 70 20 21 3d 20 27 3f 27 29 20 26 26 20 28 70 20 p != '?') && (p
bc20: 21 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 09 20 20 != '\\')) {...
bc30: 20 20 69 66 20 28 6e 6f 63 61 73 65 29 20 7b 0a if (nocase) {.
bc40: 09 09 09 77 68 69 6c 65 20 28 2a 75 6e 69 53 74 ...while (*uniSt
bc50: 72 20 26 26 20 28 70 20 21 3d 20 2a 75 6e 69 53 r && (p != *uniS
bc60: 74 72 29 0a 09 09 09 09 26 26 20 28 70 20 21 3d tr).....&& (p !=
bc70: 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f Tcl_UniCharToLo
bc80: 77 65 72 28 2a 75 6e 69 53 74 72 29 29 29 20 7b wer(*uniStr))) {
bc90: 0a 09 09 09 20 20 20 20 75 6e 69 53 74 72 2b 2b .... uniStr++
bca0: 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 20 65 ;....}... } e
bcb0: 6c 73 65 20 7b 0a 09 09 09 77 68 69 6c 65 20 28 lse {....while (
bcc0: 2a 75 6e 69 53 74 72 20 26 26 20 28 70 20 21 3d *uniStr && (p !=
bcd0: 20 2a 75 6e 69 53 74 72 29 29 20 7b 0a 09 09 09 *uniStr)) {....
bce0: 20 20 20 20 75 6e 69 53 74 72 2b 2b 3b 0a 09 09 uniStr++;...
bcf0: 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 .}... }...}..
bd00: 09 69 66 20 28 54 63 6c 5f 55 6e 69 43 68 61 72 .if (Tcl_UniChar
bd10: 43 61 73 65 4d 61 74 63 68 28 75 6e 69 53 74 72 CaseMatch(uniStr
bd20: 2c 20 75 6e 69 50 61 74 74 65 72 6e 2c 20 6e 6f , uniPattern, no
bd30: 63 61 73 65 29 29 20 7b 0a 09 09 20 20 20 20 72 case)) {... r
bd40: 65 74 75 72 6e 20 31 3b 0a 09 09 7d 0a 09 09 69 eturn 1;...}...i
bd50: 66 20 28 2a 75 6e 69 53 74 72 20 3d 3d 20 30 29 f (*uniStr == 0)
bd60: 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 {... return
bd70: 30 3b 0a 09 09 7d 0a 09 09 75 6e 69 53 74 72 2b 0;...}...uniStr+
bd80: 2b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f +;.. }..}.../
bd90: 2a 0a 09 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 *.. * Check for
bda0: 61 20 22 3f 22 20 61 73 20 74 68 65 20 6e 65 78 a "?" as the nex
bdb0: 74 20 70 61 74 74 65 72 6e 20 63 68 61 72 61 63 t pattern charac
bdc0: 74 65 72 2e 20 49 74 20 6d 61 74 63 68 65 73 20 ter. It matches
bdd0: 61 6e 79 0a 09 20 2a 20 73 69 6e 67 6c 65 20 63 any.. * single c
bde0: 68 61 72 61 63 74 65 72 2e 0a 09 20 2a 2f 0a 0a haracter... */..
bdf0: 09 69 66 20 28 70 20 3d 3d 20 27 3f 27 29 20 7b .if (p == '?') {
be00: 0a 09 20 20 20 20 75 6e 69 50 61 74 74 65 72 6e .. uniPattern
be10: 2b 2b 3b 0a 09 20 20 20 20 75 6e 69 53 74 72 2b ++;.. uniStr+
be20: 2b 3b 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 +;.. continue
be30: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 ;..}.../*.. * Ch
be40: 65 63 6b 20 66 6f 72 20 61 20 22 5b 22 20 61 73 eck for a "[" as
be50: 20 74 68 65 20 6e 65 78 74 20 70 61 74 74 65 72 the next patter
be60: 6e 20 63 68 61 72 61 63 74 65 72 2e 20 49 74 20 n character. It
be70: 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 is followed by a
be80: 0a 09 20 2a 20 6c 69 73 74 20 6f 66 20 63 68 61 .. * list of cha
be90: 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65 racters that are
bea0: 20 61 63 63 65 70 74 61 62 6c 65 2c 20 6f 72 20 acceptable, or
beb0: 62 79 20 61 20 72 61 6e 67 65 20 28 74 77 6f 0a by a range (two.
bec0: 09 20 2a 20 63 68 61 72 61 63 74 65 72 73 20 73 . * characters s
bed0: 65 70 61 72 61 74 65 64 20 62 79 20 22 2d 22 29 eparated by "-")
bee0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 20 3d ... */...if (p =
bef0: 3d 20 27 5b 27 29 20 7b 0a 09 20 20 20 20 54 63 = '[') {.. Tc
bf00: 6c 5f 55 6e 69 43 68 61 72 20 73 74 61 72 74 43 l_UniChar startC
bf10: 68 61 72 2c 20 65 6e 64 43 68 61 72 3b 0a 0a 09 har, endChar;...
bf20: 20 20 20 20 75 6e 69 50 61 74 74 65 72 6e 2b 2b uniPattern++
bf30: 3b 0a 09 20 20 20 20 63 68 31 20 3d 20 28 6e 6f ;.. ch1 = (no
bf40: 63 61 73 65 20 3f 20 54 63 6c 5f 55 6e 69 43 68 case ? Tcl_UniCh
bf50: 61 72 54 6f 4c 6f 77 65 72 28 2a 75 6e 69 53 74 arToLower(*uniSt
bf60: 72 29 20 3a 20 2a 75 6e 69 53 74 72 29 3b 0a 09 r) : *uniStr);..
bf70: 20 20 20 20 75 6e 69 53 74 72 2b 2b 3b 0a 09 20 uniStr++;..
bf80: 20 20 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 while (1) {..
bf90: 09 69 66 20 28 28 2a 75 6e 69 50 61 74 74 65 72 .if ((*uniPatter
bfa0: 6e 20 3d 3d 20 27 5d 27 29 20 7c 7c 20 28 2a 75 n == ']') || (*u
bfb0: 6e 69 50 61 74 74 65 72 6e 20 3d 3d 20 30 29 29 niPattern == 0))
bfc0: 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 {... return
bfd0: 30 3b 0a 09 09 7d 0a 09 09 73 74 61 72 74 43 68 0;...}...startCh
bfe0: 61 72 20 3d 20 28 6e 6f 63 61 73 65 20 3f 20 54 ar = (nocase ? T
bff0: 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 cl_UniCharToLowe
c000: 72 28 2a 75 6e 69 50 61 74 74 65 72 6e 29 0a 09 r(*uniPattern)..
c010: 09 09 3a 20 2a 75 6e 69 50 61 74 74 65 72 6e 29 ..: *uniPattern)
c020: 3b 0a 09 09 75 6e 69 50 61 74 74 65 72 6e 2b 2b ;...uniPattern++
c030: 3b 0a 09 09 69 66 20 28 2a 75 6e 69 50 61 74 74 ;...if (*uniPatt
c040: 65 72 6e 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 ern == '-') {...
c050: 20 20 20 20 75 6e 69 50 61 74 74 65 72 6e 2b 2b uniPattern++
c060: 3b 0a 09 09 20 20 20 20 69 66 20 28 2a 75 6e 69 ;... if (*uni
c070: 50 61 74 74 65 72 6e 20 3d 3d 20 30 29 20 7b 0a Pattern == 0) {.
c080: 09 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 09 20 ...return 0;...
c090: 20 20 20 7d 0a 09 09 20 20 20 20 65 6e 64 43 68 }... endCh
c0a0: 61 72 20 3d 20 28 6e 6f 63 61 73 65 20 3f 20 54 ar = (nocase ? T
c0b0: 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 cl_UniCharToLowe
c0c0: 72 28 2a 75 6e 69 50 61 74 74 65 72 6e 29 0a 09 r(*uniPattern)..
c0d0: 09 09 20 20 20 20 3a 20 2a 75 6e 69 50 61 74 74 .. : *uniPatt
c0e0: 65 72 6e 29 3b 0a 09 09 20 20 20 20 75 6e 69 50 ern);... uniP
c0f0: 61 74 74 65 72 6e 2b 2b 3b 0a 09 09 20 20 20 20 attern++;...
c100: 69 66 20 28 28 28 73 74 61 72 74 43 68 61 72 20 if (((startChar
c110: 3c 3d 20 63 68 31 29 20 26 26 20 28 63 68 31 20 <= ch1) && (ch1
c120: 3c 3d 20 65 6e 64 43 68 61 72 29 29 0a 09 09 09 <= endChar))....
c130: 20 20 20 20 7c 7c 20 28 28 65 6e 64 43 68 61 72 || ((endChar
c140: 20 3c 3d 20 63 68 31 29 20 26 26 20 28 63 68 31 <= ch1) && (ch1
c150: 20 3c 3d 20 73 74 61 72 74 43 68 61 72 29 29 29 <= startChar)))
c160: 20 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 4d {..../*.... * M
c170: 61 74 63 68 65 73 20 72 61 6e 67 65 73 20 6f 66 atches ranges of
c180: 20 66 6f 72 6d 20 5b 61 2d 7a 5d 20 6f 72 20 5b form [a-z] or [
c190: 7a 2d 61 5d 2e 0a 09 09 09 20 2a 2f 0a 09 09 09 z-a]..... */....
c1a0: 62 72 65 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09 break;... }..
c1b0: 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 72 .} else if (star
c1c0: 74 43 68 61 72 20 3d 3d 20 63 68 31 29 20 7b 0a tChar == ch1) {.
c1d0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d .. break;...}
c1e0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 77 68 69 .. }.. whi
c1f0: 6c 65 20 28 2a 75 6e 69 50 61 74 74 65 72 6e 20 le (*uniPattern
c200: 21 3d 20 27 5d 27 29 20 7b 0a 09 09 69 66 20 28 != ']') {...if (
c210: 2a 75 6e 69 50 61 74 74 65 72 6e 20 3d 3d 20 30 *uniPattern == 0
c220: 29 20 7b 0a 09 09 20 20 20 20 75 6e 69 50 61 74 ) {... uniPat
c230: 74 65 72 6e 2d 2d 3b 0a 09 09 20 20 20 20 62 72 tern--;... br
c240: 65 61 6b 3b 0a 09 09 7d 0a 09 09 75 6e 69 50 61 eak;...}...uniPa
c250: 74 74 65 72 6e 2b 2b 3b 0a 09 20 20 20 20 7d 0a ttern++;.. }.
c260: 09 20 20 20 20 75 6e 69 50 61 74 74 65 72 6e 2b . uniPattern+
c270: 2b 3b 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 +;.. continue
c280: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 ;..}.../*.. * If
c290: 20 74 68 65 20 6e 65 78 74 20 70 61 74 74 65 72 the next patter
c2a0: 6e 20 63 68 61 72 61 63 74 65 72 20 69 73 20 27 n character is '
c2b0: 5c 27 2c 20 6a 75 73 74 20 73 74 72 69 70 20 6f \', just strip o
c2c0: 66 66 20 74 68 65 20 27 5c 27 20 73 6f 20 77 65 ff the '\' so we
c2d0: 0a 09 20 2a 20 64 6f 20 65 78 61 63 74 20 6d 61 .. * do exact ma
c2e0: 74 63 68 69 6e 67 20 6f 6e 20 74 68 65 20 63 68 tching on the ch
c2f0: 61 72 61 63 74 65 72 20 74 68 61 74 20 66 6f 6c aracter that fol
c300: 6c 6f 77 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 lows... */...if
c310: 28 70 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 (p == '\\') {..
c320: 20 20 20 69 66 20 28 2a 28 2b 2b 75 6e 69 50 61 if (*(++uniPa
c330: 74 74 65 72 6e 29 20 3d 3d 20 27 5c 30 27 29 20 ttern) == '\0')
c340: 7b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 {...return 0;..
c350: 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a }..}.../*.. *
c360: 20 54 68 65 72 65 27 73 20 6e 6f 20 73 70 65 63 There's no spec
c370: 69 61 6c 20 63 68 61 72 61 63 74 65 72 2e 20 4a ial character. J
c380: 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 ust make sure th
c390: 61 74 20 74 68 65 20 6e 65 78 74 20 62 79 74 65 at the next byte
c3a0: 73 20 6f 66 0a 09 20 2a 20 65 61 63 68 20 73 74 s of.. * each st
c3b0: 72 69 6e 67 20 6d 61 74 63 68 2e 0a 09 20 2a 2f ring match... */
c3c0: 0a 0a 09 69 66 20 28 6e 6f 63 61 73 65 29 20 7b ...if (nocase) {
c3d0: 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e .. if (Tcl_Un
c3e0: 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 2a 75 6e iCharToLower(*un
c3f0: 69 53 74 72 29 20 21 3d 0a 09 09 20 20 20 20 54 iStr) !=... T
c400: 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 cl_UniCharToLowe
c410: 72 28 2a 75 6e 69 50 61 74 74 65 72 6e 29 29 20 r(*uniPattern))
c420: 7b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 {...return 0;..
c430: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 69 66 20 }..} else if
c440: 28 2a 75 6e 69 53 74 72 20 21 3d 20 2a 75 6e 69 (*uniStr != *uni
c450: 50 61 74 74 65 72 6e 29 20 7b 0a 09 20 20 20 20 Pattern) {..
c460: 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 09 75 6e return 0;..}..un
c470: 69 53 74 72 2b 2b 3b 0a 09 75 6e 69 50 61 74 74 iStr++;..uniPatt
c480: 65 72 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 7d 0a 0c ern++;. }.}..
c490: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
c4e0: 20 2a 20 54 63 6c 55 6e 69 43 68 61 72 4d 61 74 * TclUniCharMat
c4f0: 63 68 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 65 20 ch --. *. *.See
c500: 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 if a particular
c510: 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 6d Unicode string m
c520: 61 74 63 68 65 73 20 61 20 70 61 72 74 69 63 75 atches a particu
c530: 6c 61 72 20 70 61 74 74 65 72 6e 2e 0a 20 2a 09 lar pattern.. *.
c540: 41 6c 6c 6f 77 73 20 63 61 73 65 20 69 6e 73 65 Allows case inse
c550: 6e 73 69 74 69 76 69 74 79 2e 20 54 68 69 73 20 nsitivity. This
c560: 69 73 20 74 68 65 20 55 6e 69 63 6f 64 65 20 65 is the Unicode e
c570: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 quivalent of the
c580: 20 63 68 61 72 2a 0a 20 2a 09 54 63 6c 5f 53 74 char*. *.Tcl_St
c590: 72 69 6e 67 43 61 73 65 4d 61 74 63 68 2e 20 54 ringCaseMatch. T
c5a0: 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 54 his variant of T
c5b0: 63 6c 5f 55 6e 69 43 68 61 72 43 61 73 65 4d 61 cl_UniCharCaseMa
c5c0: 74 63 68 20 75 73 65 73 20 63 6f 75 6e 74 65 64 tch uses counted
c5d0: 0a 20 2a 09 53 74 72 69 6e 67 73 2c 20 73 6f 20 . *.Strings, so
c5e0: 65 6d 62 65 64 64 65 64 20 4e 55 4c 4c 73 20 61 embedded NULLs a
c5f0: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 20 2a 0a 20 re allowed.. *.
c600: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 * Results:. *.Th
c610: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 e return value i
c620: 73 20 31 20 69 66 20 73 74 72 69 6e 67 20 6d 61 s 1 if string ma
c630: 74 63 68 65 73 20 70 61 74 74 65 72 6e 2c 20 61 tches pattern, a
c640: 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 nd 0 otherwise.
c650: 54 68 65 0a 20 2a 09 6d 61 74 63 68 69 6e 67 20 The. *.matching
c660: 6f 70 65 72 61 74 69 6f 6e 20 70 65 72 6d 69 74 operation permit
c670: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 s the following
c680: 73 70 65 63 69 61 6c 20 63 68 61 72 61 63 74 65 special characte
c690: 72 73 20 69 6e 20 74 68 65 0a 20 2a 09 70 61 74 rs in the. *.pat
c6a0: 74 65 72 6e 3a 20 2a 3f 5c 5b 5d 20 28 73 65 65 tern: *?\[] (see
c6b0: 20 74 68 65 20 6d 61 6e 75 61 6c 20 65 6e 74 72 the manual entr
c6c0: 79 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e y for details on
c6d0: 20 77 68 61 74 20 74 68 65 73 65 20 6d 65 61 6e what these mean
c6e0: 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ).. *. * Side ef
c6f0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
c700: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
c710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
c750: 0a 69 6e 74 0a 54 63 6c 55 6e 69 43 68 61 72 4d .int.TclUniCharM
c760: 61 74 63 68 28 0a 20 20 20 20 63 6f 6e 73 74 20 atch(. const
c770: 54 63 6c 5f 55 6e 69 43 68 61 72 20 2a 73 74 72 Tcl_UniChar *str
c780: 69 6e 67 2c 09 2f 2a 20 55 6e 69 63 6f 64 65 20 ing,./* Unicode
c790: 53 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 String. */. i
c7a0: 6e 74 20 73 74 72 4c 65 6e 2c 09 09 09 2f 2a 20 nt strLen,.../*
c7b0: 4c 65 6e 67 74 68 20 6f 66 20 53 74 72 69 6e 67 Length of String
c7c0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 */. const Tc
c7d0: 6c 5f 55 6e 69 43 68 61 72 20 2a 70 61 74 74 65 l_UniChar *patte
c7e0: 72 6e 2c 09 2f 2a 20 50 61 74 74 65 72 6e 2c 20 rn,./* Pattern,
c7f0: 77 68 69 63 68 20 6d 61 79 20 63 6f 6e 74 61 69 which may contai
c800: 6e 20 73 70 65 63 69 61 6c 0a 09 09 09 09 20 2a n special..... *
c810: 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a 2f 0a characters. */.
c820: 20 20 20 20 69 6e 74 20 70 74 6e 4c 65 6e 2c 09 int ptnLen,.
c830: 09 09 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 50 ../* Length of P
c840: 61 74 74 65 72 6e 20 2a 2f 0a 20 20 20 20 69 6e attern */. in
c850: 74 20 6e 6f 63 61 73 65 29 09 09 09 2f 2a 20 30 t nocase).../* 0
c860: 20 66 6f 72 20 63 61 73 65 20 73 65 6e 73 69 74 for case sensit
c870: 69 76 65 2c 20 31 20 66 6f 72 20 69 6e 73 65 6e ive, 1 for insen
c880: 73 69 74 69 76 65 20 2a 2f 0a 7b 0a 20 20 20 20 sitive */.{.
c890: 63 6f 6e 73 74 20 54 63 6c 5f 55 6e 69 43 68 61 const Tcl_UniCha
c8a0: 72 20 2a 73 74 72 69 6e 67 45 6e 64 2c 20 2a 70 r *stringEnd, *p
c8b0: 61 74 74 65 72 6e 45 6e 64 3b 0a 20 20 20 20 54 atternEnd;. T
c8c0: 63 6c 5f 55 6e 69 43 68 61 72 20 70 3b 0a 0a 20 cl_UniChar p;..
c8d0: 20 20 20 73 74 72 69 6e 67 45 6e 64 20 3d 20 73 stringEnd = s
c8e0: 74 72 69 6e 67 20 2b 20 73 74 72 4c 65 6e 3b 0a tring + strLen;.
c8f0: 20 20 20 20 70 61 74 74 65 72 6e 45 6e 64 20 3d patternEnd =
c900: 20 70 61 74 74 65 72 6e 20 2b 20 70 74 6e 4c 65 pattern + ptnLe
c910: 6e 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 n;.. while (1
c920: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 65 65 20 ) {../*.. * See
c930: 69 66 20 77 65 27 72 65 20 61 74 20 74 68 65 20 if we're at the
c940: 65 6e 64 20 6f 66 20 62 6f 74 68 20 74 68 65 20 end of both the
c950: 70 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 pattern and the
c960: 73 74 72 69 6e 67 2e 20 49 66 20 73 6f 2c 0a 09 string. If so,..
c970: 20 2a 20 77 65 20 73 75 63 63 65 65 64 65 64 2e * we succeeded.
c980: 20 49 66 20 77 65 27 72 65 20 61 74 20 74 68 65 If we're at the
c990: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 74 74 end of the patt
c9a0: 65 72 6e 20 62 75 74 20 6e 6f 74 20 61 74 20 74 ern but not at t
c9b0: 68 65 20 65 6e 64 0a 09 20 2a 20 6f 66 20 74 68 he end.. * of th
c9c0: 65 20 73 74 72 69 6e 67 2c 20 77 65 20 66 61 69 e string, we fai
c9d0: 6c 65 64 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 led... */...if (
c9e0: 70 61 74 74 65 72 6e 20 3d 3d 20 70 61 74 74 65 pattern == patte
c9f0: 72 6e 45 6e 64 29 20 7b 0a 09 20 20 20 20 72 65 rnEnd) {.. re
ca00: 74 75 72 6e 20 28 73 74 72 69 6e 67 20 3d 3d 20 turn (string ==
ca10: 73 74 72 69 6e 67 45 6e 64 29 3b 0a 09 7d 0a 09 stringEnd);..}..
ca20: 70 20 3d 20 2a 70 61 74 74 65 72 6e 3b 0a 09 69 p = *pattern;..i
ca30: 66 20 28 28 73 74 72 69 6e 67 20 3d 3d 20 73 74 f ((string == st
ca40: 72 69 6e 67 45 6e 64 29 20 26 26 20 28 70 20 21 ringEnd) && (p !
ca50: 3d 20 27 2a 27 29 29 20 7b 0a 09 20 20 20 20 72 = '*')) {.. r
ca60: 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 2f 2a eturn 0;..}.../*
ca70: 0a 09 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 .. * Check for a
ca80: 20 22 2a 22 20 61 73 20 74 68 65 20 6e 65 78 74 "*" as the next
ca90: 20 70 61 74 74 65 72 6e 20 63 68 61 72 61 63 74 pattern charact
caa0: 65 72 2e 20 49 74 20 6d 61 74 63 68 65 73 20 61 er. It matches a
cab0: 6e 79 0a 09 20 2a 20 73 75 62 73 74 72 69 6e 67 ny.. * substring
cac0: 2e 20 57 65 20 68 61 6e 64 6c 65 20 74 68 69 73 . We handle this
cad0: 20 62 79 20 73 6b 69 70 70 69 6e 67 20 61 6c 6c by skipping all
cae0: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 73 20 the characters
caf0: 75 70 20 74 6f 20 74 68 65 0a 09 20 2a 20 6e 65 up to the.. * ne
cb00: 78 74 20 6d 61 74 63 68 69 6e 67 20 6f 6e 65 20 xt matching one
cb10: 69 6e 20 74 68 65 20 70 61 74 74 65 72 6e 2c 20 in the pattern,
cb20: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 69 6e 67 and then calling
cb30: 20 6f 75 72 73 65 6c 76 65 73 0a 09 20 2a 20 72 ourselves.. * r
cb40: 65 63 75 72 73 69 76 65 6c 79 20 66 6f 72 20 65 ecursively for e
cb50: 61 63 68 20 70 6f 73 74 66 69 78 20 6f 66 20 73 ach postfix of s
cb60: 74 72 69 6e 67 2c 20 75 6e 74 69 6c 20 65 69 74 tring, until eit
cb70: 68 65 72 20 77 65 20 6d 61 74 63 68 20 6f 72 20 her we match or
cb80: 77 65 0a 09 20 2a 20 72 65 61 63 68 20 74 68 65 we.. * reach the
cb90: 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 72 69 end of the stri
cba0: 6e 67 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 ng... */...if (p
cbb0: 20 3d 3d 20 27 2a 27 29 20 7b 0a 09 20 20 20 20 == '*') {..
cbc0: 2f 2a 0a 09 20 20 20 20 20 2a 20 53 6b 69 70 20 /*.. * Skip
cbd0: 61 6c 6c 20 73 75 63 63 65 73 73 69 76 65 20 2a all successive *
cbe0: 27 73 20 69 6e 20 74 68 65 20 70 61 74 74 65 72 's in the patter
cbf0: 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 n... */...
cc00: 20 20 77 68 69 6c 65 20 28 2a 28 2b 2b 70 61 74 while (*(++pat
cc10: 74 65 72 6e 29 20 3d 3d 20 27 2a 27 29 20 7b 0a tern) == '*') {.
cc20: 09 09 2f 2a 20 65 6d 70 74 79 20 62 6f 64 79 20 ../* empty body
cc30: 2a 2f 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 */.. }.. i
cc40: 66 20 28 70 61 74 74 65 72 6e 20 3d 3d 20 70 61 f (pattern == pa
cc50: 74 74 65 72 6e 45 6e 64 29 20 7b 0a 09 09 72 65 tternEnd) {...re
cc60: 74 75 72 6e 20 31 3b 0a 09 20 20 20 20 7d 0a 09 turn 1;.. }..
cc70: 20 20 20 20 70 20 3d 20 2a 70 61 74 74 65 72 6e p = *pattern
cc80: 3b 0a 09 20 20 20 20 69 66 20 28 6e 6f 63 61 73 ;.. if (nocas
cc90: 65 29 20 7b 0a 09 09 70 20 3d 20 54 63 6c 5f 55 e) {...p = Tcl_U
cca0: 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 70 29 niCharToLower(p)
ccb0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 77 68 ;.. }.. wh
ccc0: 69 6c 65 20 28 31 29 20 7b 0a 09 09 2f 2a 0a 09 ile (1) {.../*..
ccd0: 09 20 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e . * Optimization
cce0: 20 66 6f 72 20 6d 61 74 63 68 69 6e 67 20 2d 20 for matching -
ccf0: 63 72 75 69 73 65 20 74 68 72 6f 75 67 68 20 74 cruise through t
cd00: 68 65 20 73 74 72 69 6e 67 0a 09 09 20 2a 20 71 he string... * q
cd10: 75 69 63 6b 6c 79 20 69 66 20 74 68 65 20 6e 65 uickly if the ne
cd20: 78 74 20 63 68 61 72 20 69 6e 20 74 68 65 20 70 xt char in the p
cd30: 61 74 74 65 72 6e 20 69 73 6e 27 74 20 61 20 73 attern isn't a s
cd40: 70 65 63 69 61 6c 0a 09 09 20 2a 20 63 68 61 72 pecial... * char
cd50: 61 63 74 65 72 2e 0a 09 09 20 2a 2f 0a 0a 09 09 acter.... */....
cd60: 69 66 20 28 28 70 20 21 3d 20 27 5b 27 29 20 26 if ((p != '[') &
cd70: 26 20 28 70 20 21 3d 20 27 3f 27 29 20 26 26 20 & (p != '?') &&
cd80: 28 70 20 21 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 (p != '\\')) {..
cd90: 09 20 20 20 20 69 66 20 28 6e 6f 63 61 73 65 29 . if (nocase)
cda0: 20 7b 0a 09 09 09 77 68 69 6c 65 20 28 28 73 74 {....while ((st
cdb0: 72 69 6e 67 20 3c 20 73 74 72 69 6e 67 45 6e 64 ring < stringEnd
cdc0: 29 20 26 26 20 28 70 20 21 3d 20 2a 73 74 72 69 ) && (p != *stri
cdd0: 6e 67 29 0a 09 09 09 09 26 26 20 28 70 20 21 3d ng).....&& (p !=
cde0: 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f Tcl_UniCharToLo
cdf0: 77 65 72 28 2a 73 74 72 69 6e 67 29 29 29 20 7b wer(*string))) {
ce00: 0a 09 09 09 20 20 20 20 73 74 72 69 6e 67 2b 2b .... string++
ce10: 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 20 65 ;....}... } e
ce20: 6c 73 65 20 7b 0a 09 09 09 77 68 69 6c 65 20 28 lse {....while (
ce30: 28 73 74 72 69 6e 67 20 3c 20 73 74 72 69 6e 67 (string < string
ce40: 45 6e 64 29 20 26 26 20 28 70 20 21 3d 20 2a 73 End) && (p != *s
ce50: 74 72 69 6e 67 29 29 20 7b 0a 09 09 09 20 20 20 tring)) {....
ce60: 20 73 74 72 69 6e 67 2b 2b 3b 0a 09 09 09 7d 0a string++;....}.
ce70: 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 69 66 .. }...}...if
ce80: 20 28 54 63 6c 55 6e 69 43 68 61 72 4d 61 74 63 (TclUniCharMatc
ce90: 68 28 73 74 72 69 6e 67 2c 20 73 74 72 69 6e 67 h(string, string
cea0: 45 6e 64 20 2d 20 73 74 72 69 6e 67 2c 0a 09 09 End - string,...
ceb0: 09 70 61 74 74 65 72 6e 2c 20 70 61 74 74 65 72 .pattern, patter
cec0: 6e 45 6e 64 20 2d 20 70 61 74 74 65 72 6e 2c 20 nEnd - pattern,
ced0: 6e 6f 63 61 73 65 29 29 20 7b 0a 09 09 20 20 20 nocase)) {...
cee0: 20 72 65 74 75 72 6e 20 31 3b 0a 09 09 7d 0a 09 return 1;...}..
cef0: 09 69 66 20 28 73 74 72 69 6e 67 20 3d 3d 20 73 .if (string == s
cf00: 74 72 69 6e 67 45 6e 64 29 20 7b 0a 09 09 20 20 tringEnd) {...
cf10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 7d 0a return 0;...}.
cf20: 09 09 73 74 72 69 6e 67 2b 2b 3b 0a 09 20 20 20 ..string++;..
cf30: 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 }..}.../*.. * C
cf40: 68 65 63 6b 20 66 6f 72 20 61 20 22 3f 22 20 61 heck for a "?" a
cf50: 73 20 74 68 65 20 6e 65 78 74 20 70 61 74 74 65 s the next patte
cf60: 72 6e 20 63 68 61 72 61 63 74 65 72 2e 20 49 74 rn character. It
cf70: 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 09 20 2a matches any.. *
cf80: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 single characte
cf90: 72 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 20 r... */...if (p
cfa0: 3d 3d 20 27 3f 27 29 20 7b 0a 09 20 20 20 20 70 == '?') {.. p
cfb0: 61 74 74 65 72 6e 2b 2b 3b 0a 09 20 20 20 20 73 attern++;.. s
cfc0: 74 72 69 6e 67 2b 2b 3b 0a 09 20 20 20 20 63 6f tring++;.. co
cfd0: 6e 74 69 6e 75 65 3b 0a 09 7d 0a 0a 09 2f 2a 0a ntinue;..}.../*.
cfe0: 09 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 . * Check for a
cff0: 22 5b 22 20 61 73 20 74 68 65 20 6e 65 78 74 20 "[" as the next
d000: 70 61 74 74 65 72 6e 20 63 68 61 72 61 63 74 65 pattern characte
d010: 72 2e 20 49 74 20 69 73 20 66 6f 6c 6c 6f 77 65 r. It is followe
d020: 64 20 62 79 20 61 0a 09 20 2a 20 6c 69 73 74 20 d by a.. * list
d030: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74 68 of characters th
d040: 61 74 20 61 72 65 20 61 63 63 65 70 74 61 62 6c at are acceptabl
d050: 65 2c 20 6f 72 20 62 79 20 61 20 72 61 6e 67 65 e, or by a range
d060: 20 28 74 77 6f 0a 09 20 2a 20 63 68 61 72 61 63 (two.. * charac
d070: 74 65 72 73 20 73 65 70 61 72 61 74 65 64 20 62 ters separated b
d080: 79 20 22 2d 22 29 2e 0a 09 20 2a 2f 0a 0a 09 69 y "-")... */...i
d090: 66 20 28 70 20 3d 3d 20 27 5b 27 29 20 7b 0a 09 f (p == '[') {..
d0a0: 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 Tcl_UniChar
d0b0: 63 68 31 2c 20 73 74 61 72 74 43 68 61 72 2c 20 ch1, startChar,
d0c0: 65 6e 64 43 68 61 72 3b 0a 0a 09 20 20 20 20 70 endChar;... p
d0d0: 61 74 74 65 72 6e 2b 2b 3b 0a 09 20 20 20 20 63 attern++;.. c
d0e0: 68 31 20 3d 20 28 6e 6f 63 61 73 65 20 3f 20 54 h1 = (nocase ? T
d0f0: 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 cl_UniCharToLowe
d100: 72 28 2a 73 74 72 69 6e 67 29 20 3a 20 2a 73 74 r(*string) : *st
d110: 72 69 6e 67 29 3b 0a 09 20 20 20 20 73 74 72 69 ring);.. stri
d120: 6e 67 2b 2b 3b 0a 09 20 20 20 20 77 68 69 6c 65 ng++;.. while
d130: 20 28 31 29 20 7b 0a 09 09 69 66 20 28 28 2a 70 (1) {...if ((*p
d140: 61 74 74 65 72 6e 20 3d 3d 20 27 5d 27 29 20 7c attern == ']') |
d150: 7c 20 28 70 61 74 74 65 72 6e 20 3d 3d 20 70 61 | (pattern == pa
d160: 74 74 65 72 6e 45 6e 64 29 29 20 7b 0a 09 09 20 tternEnd)) {...
d170: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 7d return 0;...}
d180: 0a 09 09 73 74 61 72 74 43 68 61 72 20 3d 20 28 ...startChar = (
d190: 6e 6f 63 61 73 65 20 3f 20 54 63 6c 5f 55 6e 69 nocase ? Tcl_Uni
d1a0: 43 68 61 72 54 6f 4c 6f 77 65 72 28 2a 70 61 74 CharToLower(*pat
d1b0: 74 65 72 6e 29 20 3a 20 2a 70 61 74 74 65 72 6e tern) : *pattern
d1c0: 29 3b 0a 09 09 70 61 74 74 65 72 6e 2b 2b 3b 0a );...pattern++;.
d1d0: 09 09 69 66 20 28 2a 70 61 74 74 65 72 6e 20 3d ..if (*pattern =
d1e0: 3d 20 27 2d 27 29 20 7b 0a 09 09 20 20 20 20 70 = '-') {... p
d1f0: 61 74 74 65 72 6e 2b 2b 3b 0a 09 09 20 20 20 20 attern++;...
d200: 69 66 20 28 70 61 74 74 65 72 6e 20 3d 3d 20 70 if (pattern == p
d210: 61 74 74 65 72 6e 45 6e 64 29 20 7b 0a 09 09 09 atternEnd) {....
d220: 72 65 74 75 72 6e 20 30 3b 0a 09 09 20 20 20 20 return 0;...
d230: 7d 0a 09 09 20 20 20 20 65 6e 64 43 68 61 72 20 }... endChar
d240: 3d 20 28 6e 6f 63 61 73 65 20 3f 20 54 63 6c 5f = (nocase ? Tcl_
d250: 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 2a UniCharToLower(*
d260: 70 61 74 74 65 72 6e 29 0a 09 09 09 20 20 20 20 pattern)....
d270: 3a 20 2a 70 61 74 74 65 72 6e 29 3b 0a 09 09 20 : *pattern);...
d280: 20 20 20 70 61 74 74 65 72 6e 2b 2b 3b 0a 09 09 pattern++;...
d290: 20 20 20 20 69 66 20 28 28 28 73 74 61 72 74 43 if (((startC
d2a0: 68 61 72 20 3c 3d 20 63 68 31 29 20 26 26 20 28 har <= ch1) && (
d2b0: 63 68 31 20 3c 3d 20 65 6e 64 43 68 61 72 29 29 ch1 <= endChar))
d2c0: 0a 09 09 09 20 20 20 20 7c 7c 20 28 28 65 6e 64 .... || ((end
d2d0: 43 68 61 72 20 3c 3d 20 63 68 31 29 20 26 26 20 Char <= ch1) &&
d2e0: 28 63 68 31 20 3c 3d 20 73 74 61 72 74 43 68 61 (ch1 <= startCha
d2f0: 72 29 29 29 20 7b 0a 09 09 09 2f 2a 0a 09 09 09 r))) {..../*....
d300: 20 2a 20 4d 61 74 63 68 65 73 20 72 61 6e 67 65 * Matches range
d310: 73 20 6f 66 20 66 6f 72 6d 20 5b 61 2d 7a 5d 20 s of form [a-z]
d320: 6f 72 20 5b 7a 2d 61 5d 2e 0a 09 09 09 20 2a 2f or [z-a]..... */
d330: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 20 20 20 ....break;...
d340: 20 7d 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 }...} else if (
d350: 73 74 61 72 74 43 68 61 72 20 3d 3d 20 63 68 31 startChar == ch1
d360: 29 20 7b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b ) {... break;
d370: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 ...}.. }..
d380: 20 77 68 69 6c 65 20 28 2a 70 61 74 74 65 72 6e while (*pattern
d390: 20 21 3d 20 27 5d 27 29 20 7b 0a 09 09 69 66 20 != ']') {...if
d3a0: 28 70 61 74 74 65 72 6e 20 3d 3d 20 70 61 74 74 (pattern == patt
d3b0: 65 72 6e 45 6e 64 29 20 7b 0a 09 09 20 20 20 20 ernEnd) {...
d3c0: 70 61 74 74 65 72 6e 2d 2d 3b 0a 09 09 20 20 20 pattern--;...
d3d0: 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 70 61 break;...}...pa
d3e0: 74 74 65 72 6e 2b 2b 3b 0a 09 20 20 20 20 7d 0a ttern++;.. }.
d3f0: 09 20 20 20 20 70 61 74 74 65 72 6e 2b 2b 3b 0a . pattern++;.
d400: 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 . continue;..
d410: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 }.../*.. * If th
d420: 65 20 6e 65 78 74 20 70 61 74 74 65 72 6e 20 63 e next pattern c
d430: 68 61 72 61 63 74 65 72 20 69 73 20 27 5c 27 2c haracter is '\',
d440: 20 6a 75 73 74 20 73 74 72 69 70 20 6f 66 66 20 just strip off
d450: 74 68 65 20 27 5c 27 20 73 6f 20 77 65 0a 09 20 the '\' so we..
d460: 2a 20 64 6f 20 65 78 61 63 74 20 6d 61 74 63 68 * do exact match
d470: 69 6e 67 20 6f 6e 20 74 68 65 20 63 68 61 72 61 ing on the chara
d480: 63 74 65 72 20 74 68 61 74 20 66 6f 6c 6c 6f 77 cter that follow
d490: 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 20 s... */...if (p
d4a0: 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20 20 20 == '\\') {..
d4b0: 69 66 20 28 2b 2b 70 61 74 74 65 72 6e 20 3d 3d if (++pattern ==
d4c0: 20 70 61 74 74 65 72 6e 45 6e 64 29 20 7b 0a 09 patternEnd) {..
d4d0: 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 .return 0;..
d4e0: 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 }..}.../*.. * Th
d4f0: 65 72 65 27 73 20 6e 6f 20 73 70 65 63 69 61 6c ere's no special
d500: 20 63 68 61 72 61 63 74 65 72 2e 20 4a 75 73 74 character. Just
d510: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 make sure that
d520: 74 68 65 20 6e 65 78 74 20 62 79 74 65 73 20 6f the next bytes o
d530: 66 0a 09 20 2a 20 65 61 63 68 20 73 74 72 69 6e f.. * each strin
d540: 67 20 6d 61 74 63 68 2e 0a 09 20 2a 2f 0a 0a 09 g match... */...
d550: 69 66 20 28 6e 6f 63 61 73 65 29 20 7b 0a 09 20 if (nocase) {..
d560: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 69 43 68 if (Tcl_UniCh
d570: 61 72 54 6f 4c 6f 77 65 72 28 2a 73 74 72 69 6e arToLower(*strin
d580: 67 29 20 21 3d 20 54 63 6c 5f 55 6e 69 43 68 61 g) != Tcl_UniCha
d590: 72 54 6f 4c 6f 77 65 72 28 2a 70 61 74 74 65 72 rToLower(*patter
d5a0: 6e 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 30 n)) {...return 0
d5b0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 ;.. }..} else
d5c0: 20 69 66 20 28 2a 73 74 72 69 6e 67 20 21 3d 20 if (*string !=
d5d0: 2a 70 61 74 74 65 72 6e 29 20 7b 0a 09 20 20 20 *pattern) {..
d5e0: 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 09 73 return 0;..}..s
d5f0: 74 72 69 6e 67 2b 2b 3b 0a 09 70 61 74 74 65 72 tring++;..patter
d600: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f n++;. }.}.../
d610: 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61 *. * Local Varia
d620: 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63 bles:. * mode: c
d630: 0a 20 2a 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 . * c-basic-offs
d640: 65 74 3a 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f et: 4. * fill-co
d650: 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a lumn: 78. * End:
d660: 0a 20 2a 2f 0a . */.