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: 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 #if TCL_UTF_MAX
0930: 3e 20 33 0a 20 20 20 20 34 2c 34 2c 34 2c 34 2c > 3. 4,4,4,4,
0940: 34 2c 34 2c 34 2c 34 2c 0a 23 65 6c 73 65 0a 20 4,4,4,4,.#else.
0950: 20 20 20 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 1,1,1,1,1,1,1
0960: 2c 31 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 31 ,1,.#endif. 1
0970: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 0a 7d ,1,1,1,1,1,1,1.}
0980: 3b 0a 0a 2f 2a 0a 20 2a 20 46 75 6e 63 74 69 6f ;../*. * Functio
0990: 6e 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 20 ns used only in
09a0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 20 2a 2f this module.. */
09b0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 09 55 74 ..static int..Ut
09c0: 66 43 6f 75 6e 74 28 69 6e 74 20 63 68 29 3b 0a fCount(int ch);.
09d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a20: 2d 2d 0a 20 2a 0a 20 2a 20 55 74 66 43 6f 75 6e --. *. * UtfCoun
0a30: 74 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e 64 20 t --. *. *.Find
0a40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
0a50: 74 65 73 20 69 6e 20 74 68 65 20 55 74 66 20 63 tes in the Utf c
0a60: 68 61 72 61 63 74 65 72 20 22 63 68 22 2e 0a 20 haracter "ch"..
0a70: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
0a80: 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 .The return valu
0a90: 65 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 es is the number
0aa0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 of bytes in the
0ab0: 20 55 74 66 20 63 68 61 72 61 63 74 65 72 20 22 Utf character "
0ac0: 63 68 22 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ch".. *. * Side
0ad0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
0ae0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
0b40: 6e 6c 69 6e 65 20 69 6e 74 0a 55 74 66 43 6f 75 nline int.UtfCou
0b50: 6e 74 28 0a 20 20 20 20 69 6e 74 20 63 68 29 09 nt(. int ch).
0b60: 09 09 2f 2a 20 54 68 65 20 55 6e 69 63 6f 64 65 ../* The Unicode
0b70: 20 63 68 61 72 61 63 74 65 72 20 77 68 6f 73 65 character whose
0b80: 20 73 69 7a 65 20 69 73 20 72 65 74 75 72 6e 65 size is returne
0b90: 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28 d. */.{. if (
0ba0: 28 75 6e 73 69 67 6e 65 64 29 28 63 68 20 2d 20 (unsigned)(ch -
0bb0: 31 29 20 3c 20 28 55 4e 49 43 4f 44 45 5f 53 45 1) < (UNICODE_SE
0bc0: 4c 46 20 2d 20 31 29 29 20 7b 0a 09 72 65 74 75 LF - 1)) {..retu
0bd0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 1;. }.
0be0: 69 66 20 28 63 68 20 3c 3d 20 30 78 37 46 46 29 if (ch <= 0x7FF)
0bf0: 20 7b 0a 09 72 65 74 75 72 6e 20 32 3b 0a 20 20 {..return 2;.
0c00: 20 20 7d 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f }.#if TCL_UTF_
0c10: 4d 41 58 20 3e 20 33 0a 20 20 20 20 69 66 20 28 MAX > 3. if (
0c20: 28 28 75 6e 73 69 67 6e 65 64 29 28 63 68 20 2d ((unsigned)(ch -
0c30: 20 30 78 31 30 30 30 30 29 20 3c 3d 20 30 78 46 0x10000) <= 0xF
0c40: 46 46 46 46 29 29 20 7b 0a 09 72 65 74 75 72 6e FFFF)) {..return
0c50: 20 34 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 4;. }.#endif
0c60: 0a 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 7d . return 3;.}
0c70: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cc0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 --. *. * Tcl_Uni
0cd0: 43 68 61 72 54 6f 55 74 66 20 2d 2d 0a 20 2a 0a CharToUtf --. *.
0ce0: 20 2a 09 53 74 6f 72 65 20 74 68 65 20 67 69 76 *.Store the giv
0cf0: 65 6e 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 61 en Tcl_UniChar a
0d00: 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 s a sequence of
0d10: 55 54 46 2d 38 20 62 79 74 65 73 20 69 6e 20 74 UTF-8 bytes in t
0d20: 68 65 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 he. *.provided b
0d30: 75 66 66 65 72 2e 20 45 71 75 69 76 61 6c 65 6e uffer. Equivalen
0d40: 74 20 74 6f 20 50 6c 61 6e 20 39 20 72 75 6e 65 t to Plan 9 rune
0d50: 74 6f 63 68 61 72 28 29 2e 0a 20 2a 0a 20 2a 20 tochar().. *. *
0d60: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 Results:. *.The
0d70: 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 return values is
0d80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
0d90: 79 74 65 73 20 69 6e 20 74 68 65 20 62 75 66 66 ytes in the buff
0da0: 65 72 20 74 68 61 74 20 77 65 72 65 0a 20 2a 09 er that were. *.
0db0: 63 6f 6e 73 75 6d 65 64 2e 0a 20 2a 0a 20 2a 20 consumed.. *. *
0dc0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
0dd0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
0e30: 0a 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 74 .Tcl_UniCharToUt
0e40: 66 28 0a 20 20 20 20 69 6e 74 20 63 68 2c 09 09 f(. int ch,..
0e50: 09 2f 2a 20 54 68 65 20 54 63 6c 5f 55 6e 69 43 ./* The Tcl_UniC
0e60: 68 61 72 20 74 6f 20 62 65 20 73 74 6f 72 65 64 har to be stored
0e70: 20 69 6e 20 74 68 65 0a 09 09 09 09 20 2a 20 62 in the..... * b
0e80: 75 66 66 65 72 2e 20 2a 2f 0a 20 20 20 20 63 68 uffer. */. ch
0e90: 61 72 20 2a 62 75 66 29 09 09 09 2f 2a 20 42 75 ar *buf).../* Bu
0ea0: 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 ffer in which th
0eb0: 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e e UTF-8 represen
0ec0: 74 61 74 69 6f 6e 20 6f 66 0a 09 09 09 09 20 2a tation of..... *
0ed0: 20 74 68 65 20 54 63 6c 5f 55 6e 69 43 68 61 72 the Tcl_UniChar
0ee0: 20 69 73 20 73 74 6f 72 65 64 2e 20 42 75 66 66 is stored. Buff
0ef0: 65 72 20 6d 75 73 74 20 62 65 0a 09 09 09 09 20 er must be.....
0f00: 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 * large enough t
0f10: 6f 20 68 6f 6c 64 20 74 68 65 20 55 54 46 2d 38 o hold the UTF-8
0f20: 20 63 68 61 72 61 63 74 65 72 0a 09 09 09 09 20 character.....
0f30: 2a 20 28 61 74 20 6d 6f 73 74 20 54 43 4c 5f 55 * (at most TCL_U
0f40: 54 46 5f 4d 41 58 20 62 79 74 65 73 29 2e 20 2a TF_MAX bytes). *
0f50: 2f 0a 7b 0a 20 20 20 20 69 66 20 28 28 75 6e 73 /.{. if ((uns
0f60: 69 67 6e 65 64 29 28 63 68 20 2d 20 31 29 20 3c igned)(ch - 1) <
0f70: 20 28 55 4e 49 43 4f 44 45 5f 53 45 4c 46 20 2d (UNICODE_SELF -
0f80: 20 31 29 29 20 7b 0a 09 62 75 66 5b 30 5d 20 3d 1)) {..buf[0] =
0f90: 20 28 63 68 61 72 29 20 63 68 3b 0a 09 72 65 74 (char) ch;..ret
0fa0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 1;. }.
0fb0: 20 69 66 20 28 63 68 20 3e 3d 20 30 29 20 7b 0a if (ch >= 0) {.
0fc0: 09 69 66 20 28 63 68 20 3c 3d 20 30 78 37 46 46 .if (ch <= 0x7FF
0fd0: 29 20 7b 0a 09 20 20 20 20 62 75 66 5b 31 5d 20 ) {.. buf[1]
0fe0: 3d 20 28 63 68 61 72 29 20 28 28 63 68 20 7c 20 = (char) ((ch |
0ff0: 30 78 38 30 29 20 26 20 30 78 42 46 29 3b 0a 09 0x80) & 0xBF);..
1000: 20 20 20 20 62 75 66 5b 30 5d 20 3d 20 28 63 68 buf[0] = (ch
1010: 61 72 29 20 28 28 63 68 20 3e 3e 20 36 29 20 7c ar) ((ch >> 6) |
1020: 20 30 78 43 30 29 3b 0a 09 20 20 20 20 72 65 74 0xC0);.. ret
1030: 75 72 6e 20 32 3b 0a 09 7d 0a 09 69 66 20 28 63 urn 2;..}..if (c
1040: 68 20 3c 3d 20 30 78 46 46 46 46 29 20 7b 0a 23 h <= 0xFFFF) {.#
1050: 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3e if TCL_UTF_MAX >
1060: 20 33 0a 09 20 20 20 20 69 66 20 28 28 63 68 20 3.. if ((ch
1070: 26 20 30 78 46 38 30 30 29 20 3d 3d 20 30 78 44 & 0xF800) == 0xD
1080: 38 30 30 29 20 7b 0a 09 09 69 66 20 28 63 68 20 800) {...if (ch
1090: 26 20 30 78 30 34 30 30 29 20 7b 0a 09 09 20 20 & 0x0400) {...
10a0: 20 20 2f 2a 20 4c 6f 77 20 73 75 72 72 6f 67 61 /* Low surroga
10b0: 74 65 20 2a 2f 0a 09 09 20 20 20 20 69 66 20 28 te */... if (
10c0: 28 28 62 75 66 5b 30 5d 20 26 20 30 78 46 38 29 ((buf[0] & 0xF8)
10d0: 20 3d 3d 20 30 78 46 30 29 20 26 26 20 28 28 62 == 0xF0) && ((b
10e0: 75 66 5b 31 5d 20 26 20 30 78 43 30 29 20 3d 3d uf[1] & 0xC0) ==
10f0: 20 30 78 38 30 29 0a 09 09 09 20 20 20 20 26 26 0x80).... &&
1100: 20 28 28 62 75 66 5b 32 5d 20 26 20 30 78 43 46 ((buf[2] & 0xCF
1110: 29 20 3d 3d 20 30 29 29 20 7b 0a 09 09 09 2f 2a ) == 0)) {..../*
1120: 20 50 72 65 76 69 6f 75 73 20 54 63 6c 5f 55 6e Previous Tcl_Un
1130: 69 43 68 61 72 20 77 61 73 20 61 20 48 69 67 68 iChar was a High
1140: 20 73 75 72 72 6f 67 61 74 65 2c 20 73 6f 20 63 surrogate, so c
1150: 6f 6d 62 69 6e 65 20 2a 2f 0a 09 09 09 62 75 66 ombine */....buf
1160: 5b 33 5d 20 3d 20 28 63 68 61 72 29 20 28 28 63 [3] = (char) ((c
1170: 68 20 26 20 30 78 33 46 29 20 7c 20 30 78 38 30 h & 0x3F) | 0x80
1180: 29 3b 0a 09 09 09 62 75 66 5b 32 5d 20 7c 3d 20 );....buf[2] |=
1190: 28 63 68 61 72 29 20 28 28 28 63 68 20 3e 3e 20 (char) (((ch >>
11a0: 36 29 20 26 20 30 78 30 46 29 20 7c 20 30 78 38 6) & 0x0F) | 0x8
11b0: 30 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 34 3b 0);....return 4;
11c0: 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20 20 2f ... }... /
11d0: 2a 20 50 72 65 76 69 6f 75 73 20 54 63 6c 5f 55 * Previous Tcl_U
11e0: 6e 69 43 68 61 72 20 77 61 73 20 6e 6f 74 20 61 niChar was not a
11f0: 20 48 69 67 68 20 73 75 72 72 6f 67 61 74 65 2c High surrogate,
1200: 20 73 6f 20 6a 75 73 74 20 6f 75 74 70 75 74 20 so just output
1210: 2a 2f 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 */...} else {...
1220: 20 20 20 20 2f 2a 20 48 69 67 68 20 73 75 72 72 /* High surr
1230: 6f 67 61 74 65 20 2a 2f 0a 09 09 20 20 20 20 63 ogate */... c
1240: 68 20 2b 3d 20 30 78 34 30 3b 0a 09 09 20 20 20 h += 0x40;...
1250: 20 2f 2a 20 46 69 6c 6c 20 62 75 66 66 65 72 20 /* Fill buffer
1260: 77 69 74 68 20 73 70 65 63 69 66 69 63 20 33 2d with specific 3-
1270: 62 79 74 65 20 28 69 6e 76 61 6c 69 64 29 20 62 byte (invalid) b
1280: 79 74 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c yte combination,
1290: 0a 09 09 20 20 20 20 20 20 20 73 6f 20 66 6f 6c ... so fol
12a0: 6c 6f 77 69 6e 67 20 4c 6f 77 20 73 75 72 72 6f lowing Low surro
12b0: 67 61 74 65 20 63 61 6e 20 72 65 63 6f 67 6e 69 gate can recogni
12c0: 7a 65 20 69 74 20 61 6e 64 20 63 6f 6d 62 69 6e ze it and combin
12d0: 65 20 2a 2f 0a 09 09 20 20 20 20 62 75 66 5b 32 e */... buf[2
12e0: 5d 20 3d 20 28 63 68 61 72 29 20 28 28 63 68 20 ] = (char) ((ch
12f0: 3c 3c 20 34 29 20 26 20 30 78 33 30 29 3b 0a 09 << 4) & 0x30);..
1300: 09 20 20 20 20 62 75 66 5b 31 5d 20 3d 20 28 63 . buf[1] = (c
1310: 68 61 72 29 20 28 28 28 63 68 20 3e 3e 20 32 29 har) (((ch >> 2)
1320: 20 26 20 30 78 33 46 29 20 7c 20 30 78 38 30 29 & 0x3F) | 0x80)
1330: 3b 0a 09 09 20 20 20 20 62 75 66 5b 30 5d 20 3d ;... buf[0] =
1340: 20 28 63 68 61 72 29 20 28 28 28 63 68 20 3e 3e (char) (((ch >>
1350: 20 38 29 20 26 20 30 78 30 37 29 20 7c 20 30 78 8) & 0x07) | 0x
1360: 46 30 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 F0);... retur
1370: 6e 20 30 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a n 0;...}.. }.
1380: 23 65 6e 64 69 66 0a 09 20 20 20 20 67 6f 74 6f #endif.. goto
1390: 20 74 68 72 65 65 3b 0a 09 7d 0a 0a 23 69 66 20 three;..}..#if
13a0: 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3e 20 33 0a TCL_UTF_MAX > 3.
13b0: 09 69 66 20 28 63 68 20 3c 3d 20 30 78 31 30 46 .if (ch <= 0x10F
13c0: 46 46 46 29 20 7b 0a 09 20 20 20 20 62 75 66 5b FFF) {.. buf[
13d0: 33 5d 20 3d 20 28 63 68 61 72 29 20 28 28 63 68 3] = (char) ((ch
13e0: 20 7c 20 30 78 38 30 29 20 26 20 30 78 42 46 29 | 0x80) & 0xBF)
13f0: 3b 0a 09 20 20 20 20 62 75 66 5b 32 5d 20 3d 20 ;.. buf[2] =
1400: 28 63 68 61 72 29 20 28 28 28 63 68 20 3e 3e 20 (char) (((ch >>
1410: 36 29 20 7c 20 30 78 38 30 29 20 26 20 30 78 42 6) | 0x80) & 0xB
1420: 46 29 3b 0a 09 20 20 20 20 62 75 66 5b 31 5d 20 F);.. buf[1]
1430: 3d 20 28 63 68 61 72 29 20 28 28 28 63 68 20 3e = (char) (((ch >
1440: 3e 20 31 32 29 20 7c 20 30 78 38 30 29 20 26 20 > 12) | 0x80) &
1450: 30 78 42 46 29 3b 0a 09 20 20 20 20 62 75 66 5b 0xBF);.. buf[
1460: 30 5d 20 3d 20 28 63 68 61 72 29 20 28 28 63 68 0] = (char) ((ch
1470: 20 3e 3e 20 31 38 29 20 7c 20 30 78 46 30 29 3b >> 18) | 0xF0);
1480: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a .. return 4;.
1490: 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a .}.#endif. }.
14a0: 0a 20 20 20 20 63 68 20 3d 20 30 78 46 46 46 44 . ch = 0xFFFD
14b0: 3b 0a 74 68 72 65 65 3a 0a 20 20 20 20 62 75 66 ;.three:. buf
14c0: 5b 32 5d 20 3d 20 28 63 68 61 72 29 20 28 28 63 [2] = (char) ((c
14d0: 68 20 7c 20 30 78 38 30 29 20 26 20 30 78 42 46 h | 0x80) & 0xBF
14e0: 29 3b 0a 20 20 20 20 62 75 66 5b 31 5d 20 3d 20 );. buf[1] =
14f0: 28 63 68 61 72 29 20 28 28 28 63 68 20 3e 3e 20 (char) (((ch >>
1500: 36 29 20 7c 20 30 78 38 30 29 20 26 20 30 78 42 6) | 0x80) & 0xB
1510: 46 29 3b 0a 20 20 20 20 62 75 66 5b 30 5d 20 3d F);. buf[0] =
1520: 20 28 63 68 61 72 29 20 28 28 63 68 20 3e 3e 20 (char) ((ch >>
1530: 31 32 29 20 7c 20 30 78 45 30 29 3b 0a 20 20 20 12) | 0xE0);.
1540: 20 72 65 74 75 72 6e 20 33 3b 0a 7d 0a 0c 0a 2f return 3;.}.../
1550: 2a 0a 20 2a 2d 2d 2d 2d 2d 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 0a ---------------.
15a0: 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 68 61 *. * Tcl_UniCha
15b0: 72 54 6f 55 74 66 44 53 74 72 69 6e 67 20 2d 2d rToUtfDString --
15c0: 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 74 20 74 . *. *.Convert t
15d0: 68 65 20 67 69 76 65 6e 20 55 6e 69 63 6f 64 65 he given Unicode
15e0: 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 string to UTF-8
15f0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
1600: 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 . *.The return v
1610: 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 alue is a pointe
1620: 72 20 74 6f 20 74 68 65 20 55 54 46 2d 38 20 72 r to the UTF-8 r
1630: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 epresentation of
1640: 20 74 68 65 0a 20 2a 09 55 6e 69 63 6f 64 65 20 the. *.Unicode
1650: 73 74 72 69 6e 67 2e 20 53 74 6f 72 61 67 65 20 string. Storage
1660: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 20 76 for the return v
1670: 61 6c 75 65 20 69 73 20 61 70 70 65 6e 64 65 64 alue is appended
1680: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 to the end of.
1690: 2a 09 64 73 50 74 72 2e 0a 20 2a 0a 20 2a 20 53 *.dsPtr.. *. * S
16a0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
16b0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 63 68 61 72 ------. */..char
1710: 20 2a 0a 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f *.Tcl_UniCharTo
1720: 55 74 66 44 53 74 72 69 6e 67 28 0a 20 20 20 20 UtfDString(.
1730: 63 6f 6e 73 74 20 54 63 6c 5f 55 6e 69 43 68 61 const Tcl_UniCha
1740: 72 20 2a 75 6e 69 53 74 72 2c 09 2f 2a 20 55 6e r *uniStr,./* Un
1750: 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20 icode string to
1760: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 2d 38 convert to UTF-8
1770: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 69 . */. int uni
1780: 4c 65 6e 67 74 68 2c 09 09 2f 2a 20 4c 65 6e 67 Length,../* Leng
1790: 74 68 20 6f 66 20 55 6e 69 63 6f 64 65 20 73 74 th of Unicode st
17a0: 72 69 6e 67 20 69 6e 20 54 63 6c 5f 55 6e 69 43 ring in Tcl_UniC
17b0: 68 61 72 73 0a 09 09 09 09 20 2a 20 28 6d 75 73 hars..... * (mus
17c0: 74 20 62 65 20 3e 3d 20 30 29 2e 20 2a 2f 0a 20 t be >= 0). */.
17d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a Tcl_DString *
17e0: 64 73 50 74 72 29 09 09 2f 2a 20 55 54 46 2d 38 dsPtr)../* UTF-8
17f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 representation
1800: 6f 66 20 73 74 72 69 6e 67 20 69 73 20 61 70 70 of string is app
1810: 65 6e 64 65 64 0a 09 09 09 09 20 2a 20 74 6f 20 ended..... * to
1820: 74 68 69 73 20 70 72 65 76 69 6f 75 73 6c 79 20 this previously
1830: 69 6e 69 74 69 61 6c 69 7a 65 64 20 44 53 74 72 initialized DStr
1840: 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f ing. */.{. co
1850: 6e 73 74 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 nst Tcl_UniChar
1860: 2a 77 2c 20 2a 77 45 6e 64 3b 0a 20 20 20 20 63 *w, *wEnd;. c
1870: 68 61 72 20 2a 70 2c 20 2a 73 74 72 69 6e 67 3b har *p, *string;
1880: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 4c 65 6e 67 . int oldLeng
1890: 74 68 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 th;.. /*.
18a0: 20 2a 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 * UTF-8 string
18b0: 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 length in bytes
18c0: 77 69 6c 6c 20 62 65 20 3c 3d 20 55 6e 69 63 6f will be <= Unico
18d0: 64 65 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 de string length
18e0: 20 2a 0a 20 20 20 20 20 2a 20 54 43 4c 5f 55 54 *. * TCL_UT
18f0: 46 5f 4d 41 58 2e 0a 20 20 20 20 20 2a 2f 0a 0a F_MAX.. */..
1900: 20 20 20 20 6f 6c 64 4c 65 6e 67 74 68 20 3d 20 oldLength =
1910: 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 Tcl_DStringLengt
1920: 68 28 64 73 50 74 72 29 3b 0a 20 20 20 20 54 63 h(dsPtr);. Tc
1930: 6c 5f 44 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 l_DStringSetLeng
1940: 74 68 28 64 73 50 74 72 2c 20 28 6f 6c 64 4c 65 th(dsPtr, (oldLe
1950: 6e 67 74 68 20 2b 20 75 6e 69 4c 65 6e 67 74 68 ngth + uniLength
1960: 20 2b 20 31 29 20 2a 20 54 43 4c 5f 55 54 46 5f + 1) * TCL_UTF_
1970: 4d 41 58 29 3b 0a 20 20 20 20 73 74 72 69 6e 67 MAX);. string
1980: 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 = Tcl_DStringVa
1990: 6c 75 65 28 64 73 50 74 72 29 20 2b 20 6f 6c 64 lue(dsPtr) + old
19a0: 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 70 20 3d Length;.. p =
19b0: 20 73 74 72 69 6e 67 3b 0a 20 20 20 20 77 45 6e string;. wEn
19c0: 64 20 3d 20 75 6e 69 53 74 72 20 2b 20 75 6e 69 d = uniStr + uni
19d0: 4c 65 6e 67 74 68 3b 0a 20 20 20 20 66 6f 72 20 Length;. for
19e0: 28 77 20 3d 20 75 6e 69 53 74 72 3b 20 77 20 3c (w = uniStr; w <
19f0: 20 77 45 6e 64 3b 20 29 20 7b 0a 09 70 20 2b 3d wEnd; ) {..p +=
1a00: 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 74 Tcl_UniCharToUt
1a10: 66 28 2a 77 2c 20 70 29 3b 0a 09 77 2b 2b 3b 0a f(*w, p);..w++;.
1a20: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 }. Tcl_DS
1a30: 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 64 tringSetLength(d
1a40: 73 50 74 72 2c 20 6f 6c 64 4c 65 6e 67 74 68 20 sPtr, oldLength
1a50: 2b 20 28 70 20 2d 20 73 74 72 69 6e 67 29 29 3b + (p - string));
1a60: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 72 .. return str
1a70: 69 6e 67 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ing;.}.../*. *--
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1ad0: 54 63 6c 5f 55 74 66 54 6f 55 6e 69 43 68 61 72 Tcl_UtfToUniChar
1ae0: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 78 74 72 61 63 --. *. *.Extrac
1af0: 74 20 74 68 65 20 54 63 6c 5f 55 6e 69 43 68 61 t the Tcl_UniCha
1b00: 72 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 r represented by
1b10: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e the UTF-8 strin
1b20: 67 2e 20 42 61 64 20 55 54 46 2d 38 0a 20 2a 09 g. Bad UTF-8. *.
1b30: 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 63 6f sequences are co
1b40: 6e 76 65 72 74 65 64 20 74 6f 20 76 61 6c 69 64 nverted to valid
1b50: 20 54 63 6c 5f 55 6e 69 43 68 61 72 73 20 61 6e Tcl_UniChars an
1b60: 64 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 2a 09 d processing. *.
1b70: 63 6f 6e 74 69 6e 75 65 73 2e 20 45 71 75 69 76 continues. Equiv
1b80: 61 6c 65 6e 74 20 74 6f 20 50 6c 61 6e 20 39 20 alent to Plan 9
1b90: 63 68 61 72 74 6f 72 75 6e 65 28 29 2e 0a 20 2a chartorune().. *
1ba0: 0a 20 2a 09 54 68 65 20 63 61 6c 6c 65 72 20 6d . *.The caller m
1bb0: 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 ust ensure that
1bc0: 74 68 65 20 73 6f 75 72 63 65 20 62 75 66 66 65 the source buffe
1bd0: 72 20 69 73 20 6c 6f 6e 67 20 65 6e 6f 75 67 68 r is long enough
1be0: 20 74 68 61 74 20 74 68 69 73 0a 20 2a 09 72 6f that this. *.ro
1bf0: 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 72 utine does not r
1c00: 75 6e 20 6f 66 66 20 74 68 65 20 65 6e 64 20 61 un off the end a
1c10: 6e 64 20 64 65 72 65 66 65 72 65 6e 63 65 20 6e nd dereference n
1c20: 6f 6e 2d 65 78 69 73 74 65 6e 74 20 6d 65 6d 6f on-existent memo
1c30: 72 79 0a 20 2a 09 6c 6f 6f 6b 69 6e 67 20 66 6f ry. *.looking fo
1c40: 72 20 74 72 61 69 6c 20 62 79 74 65 73 2e 20 49 r trail bytes. I
1c50: 66 20 74 68 65 20 73 6f 75 72 63 65 20 62 75 66 f the source buf
1c60: 66 65 72 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 fer is known to
1c70: 62 65 20 27 5c 30 27 0a 20 2a 09 74 65 72 6d 69 be '\0'. *.termi
1c80: 6e 61 74 65 64 2c 20 74 68 69 73 20 63 61 6e 6e nated, this cann
1c90: 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 ot happen. Other
1ca0: 77 69 73 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 wise, the caller
1cb0: 20 73 68 6f 75 6c 64 20 63 61 6c 6c 0a 20 2a 09 should call. *.
1cc0: 54 63 6c 5f 55 74 66 43 68 61 72 43 6f 6d 70 6c Tcl_UtfCharCompl
1cd0: 65 74 65 28 29 20 62 65 66 6f 72 65 20 63 61 6c ete() before cal
1ce0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e ling this routin
1cf0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 e to ensure that
1d00: 0a 20 2a 09 65 6e 6f 75 67 68 20 62 79 74 65 73 . *.enough bytes
1d10: 20 72 65 6d 61 69 6e 20 69 6e 20 74 68 65 20 73 remain in the s
1d20: 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 09 49 66 20 tring.. *. *.If
1d30: 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3d 3d 20 34 TCL_UTF_MAX == 4
1d40: 2c 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 , special handli
1d50: 6e 67 20 6f 66 20 53 75 72 72 6f 67 61 74 65 20 ng of Surrogate
1d60: 70 61 69 72 73 20 69 73 20 64 6f 6e 65 3a 0a 20 pairs is done:.
1d70: 2a 09 46 6f 72 20 61 6e 79 20 55 54 46 2d 38 20 *.For any UTF-8
1d80: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e string containin
1d90: 67 20 61 20 63 68 61 72 61 63 74 65 72 20 6f 75 g a character ou
1da0: 74 73 69 64 65 20 6f 66 20 74 68 65 20 42 4d 50 tside of the BMP
1db0: 2c 20 74 68 65 0a 20 2a 09 66 69 72 73 74 20 63 , the. *.first c
1dc0: 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 all to this func
1dd0: 74 69 6f 6e 20 77 69 6c 6c 20 66 69 6c 6c 20 2a tion will fill *
1de0: 63 68 50 74 72 20 77 69 74 68 20 74 68 65 20 68 chPtr with the h
1df0: 69 67 68 20 73 75 72 72 6f 67 61 74 65 0a 20 2a igh surrogate. *
1e00: 09 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 .and generate a
1e10: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 return value of
1e20: 30 2e 20 43 61 6c 6c 69 6e 67 20 54 63 6c 5f 55 0. Calling Tcl_U
1e30: 74 66 54 6f 55 6e 69 43 68 61 72 20 61 67 61 69 tfToUniChar agai
1e40: 6e 0a 20 2a 09 77 69 6c 6c 20 70 72 6f 64 75 63 n. *.will produc
1e50: 65 20 74 68 65 20 6c 6f 77 20 73 75 72 72 6f 67 e the low surrog
1e60: 61 74 65 20 61 6e 64 20 61 20 72 65 74 75 72 6e ate and a return
1e70: 20 76 61 6c 75 65 20 6f 66 20 34 2e 20 42 65 63 value of 4. Bec
1e80: 61 75 73 65 20 2a 63 68 50 74 72 0a 20 2a 09 69 ause *chPtr. *.i
1e90: 73 20 75 73 65 64 20 74 6f 20 72 65 6d 65 6d 62 s used to rememb
1ea0: 65 72 20 77 68 65 74 68 65 72 20 74 68 65 20 68 er whether the h
1eb0: 69 67 68 20 73 75 72 72 6f 67 61 74 65 20 69 73 igh surrogate is
1ec0: 20 61 6c 72 65 61 64 79 20 70 72 6f 64 75 63 65 already produce
1ed0: 64 2c 20 69 74 0a 20 2a 09 69 73 20 72 65 63 6f d, it. *.is reco
1ee0: 6d 6d 65 6e 64 65 64 20 74 6f 20 69 6e 69 74 69 mmended to initi
1ef0: 61 6c 69 7a 65 20 74 68 65 20 76 61 72 69 61 62 alize the variab
1f00: 6c 65 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 le it points to
1f10: 61 73 20 30 20 62 65 66 6f 72 65 0a 20 2a 09 74 as 0 before. *.t
1f20: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f he first call to
1f30: 20 54 63 6c 5f 55 74 66 54 6f 55 6e 69 43 68 61 Tcl_UtfToUniCha
1f40: 72 20 69 73 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a r is done.. *. *
1f50: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 2a 63 68 Results:. *.*ch
1f60: 50 74 72 20 69 73 20 66 69 6c 6c 65 64 20 77 69 Ptr is filled wi
1f70: 74 68 20 74 68 65 20 54 63 6c 5f 55 6e 69 43 68 th the Tcl_UniCh
1f80: 61 72 2c 20 61 6e 64 20 74 68 65 20 72 65 74 75 ar, and the retu
1f90: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a rn value is the.
1fa0: 20 2a 09 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 *.number of byt
1fb0: 65 73 20 66 72 6f 6d 20 74 68 65 20 55 54 46 2d es from the UTF-
1fc0: 38 20 73 74 72 69 6e 67 20 74 68 61 74 20 77 65 8 string that we
1fd0: 72 65 20 63 6f 6e 73 75 6d 65 64 2e 0a 20 2a 0a re consumed.. *.
1fe0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
1ff0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
2050: 69 6e 74 0a 54 63 6c 5f 55 74 66 54 6f 55 6e 69 int.Tcl_UtfToUni
2060: 43 68 61 72 28 0a 20 20 20 20 72 65 67 69 73 74 Char(. regist
2070: 65 72 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 er const char *s
2080: 72 63 2c 09 2f 2a 20 54 68 65 20 55 54 46 2d 38 rc,./* The UTF-8
2090: 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 string. */.
20a0: 72 65 67 69 73 74 65 72 20 54 63 6c 5f 55 6e 69 register Tcl_Uni
20b0: 43 68 61 72 20 2a 63 68 50 74 72 29 2f 2a 20 46 Char *chPtr)/* F
20c0: 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 54 illed with the T
20d0: 63 6c 5f 55 6e 69 43 68 61 72 20 72 65 70 72 65 cl_UniChar repre
20e0: 73 65 6e 74 65 64 20 62 79 0a 09 09 09 09 20 2a sented by..... *
20f0: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e the UTF-8 strin
2100: 67 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 g. */.{. regi
2110: 73 74 65 72 20 69 6e 74 20 62 79 74 65 3b 0a 0a ster int byte;..
2120: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 55 6e /*. * Un
2130: 72 6f 6c 6c 20 31 20 74 6f 20 33 20 28 6f 72 20 roll 1 to 3 (or
2140: 34 29 20 62 79 74 65 20 55 54 46 2d 38 20 73 65 4) byte UTF-8 se
2150: 71 75 65 6e 63 65 73 2e 0a 20 20 20 20 20 2a 2f quences.. */
2160: 0a 0a 20 20 20 20 62 79 74 65 20 3d 20 2a 28 28 .. byte = *((
2170: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
2180: 20 73 72 63 29 3b 0a 20 20 20 20 69 66 20 28 62 src);. if (b
2190: 79 74 65 20 3c 20 30 78 43 30 29 20 7b 0a 09 2f yte < 0xC0) {../
21a0: 2a 0a 09 20 2a 20 48 61 6e 64 6c 65 73 20 70 72 *.. * Handles pr
21b0: 6f 70 65 72 6c 79 20 66 6f 72 6d 65 64 20 55 54 operly formed UT
21c0: 46 2d 38 20 63 68 61 72 61 63 74 65 72 73 20 62 F-8 characters b
21d0: 65 74 77 65 65 6e 20 30 78 30 31 20 61 6e 64 20 etween 0x01 and
21e0: 30 78 37 46 2e 0a 09 20 2a 20 41 6c 73 6f 20 74 0x7F... * Also t
21f0: 72 65 61 74 73 20 5c 30 20 61 6e 64 20 6e 61 6b reats \0 and nak
2200: 65 64 20 74 72 61 69 6c 20 62 79 74 65 73 20 30 ed trail bytes 0
2210: 78 38 30 20 74 6f 20 30 78 42 46 20 61 73 20 76 x80 to 0xBF as v
2220: 61 6c 69 64 0a 09 20 2a 20 63 68 61 72 61 63 74 alid.. * charact
2230: 65 72 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 ers representing
2240: 20 74 68 65 6d 73 65 6c 76 65 73 2e 0a 09 20 2a themselves... *
2250: 2f 0a 0a 09 2a 63 68 50 74 72 20 3d 20 28 54 63 /...*chPtr = (Tc
2260: 6c 5f 55 6e 69 43 68 61 72 29 20 62 79 74 65 3b l_UniChar) byte;
2270: 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 ..return 1;.
2280: 7d 20 65 6c 73 65 20 69 66 20 28 62 79 74 65 20 } else if (byte
2290: 3c 20 30 78 45 30 29 20 7b 0a 09 69 66 20 28 28 < 0xE0) {..if ((
22a0: 73 72 63 5b 31 5d 20 26 20 30 78 43 30 29 20 3d src[1] & 0xC0) =
22b0: 3d 20 30 78 38 30 29 20 7b 0a 09 20 20 20 20 2f = 0x80) {.. /
22c0: 2a 0a 09 20 20 20 20 20 2a 20 54 77 6f 2d 62 79 *.. * Two-by
22d0: 74 65 2d 63 68 61 72 61 63 74 65 72 20 6c 65 61 te-character lea
22e0: 64 2d 62 79 74 65 20 66 6f 6c 6c 6f 77 65 64 20 d-byte followed
22f0: 62 79 20 61 20 74 72 61 69 6c 2d 62 79 74 65 2e by a trail-byte.
2300: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
2310: 2a 63 68 50 74 72 20 3d 20 28 54 63 6c 5f 55 6e *chPtr = (Tcl_Un
2320: 69 43 68 61 72 29 20 28 28 28 62 79 74 65 20 26 iChar) (((byte &
2330: 20 30 78 31 46 29 20 3c 3c 20 36 29 20 7c 20 28 0x1F) << 6) | (
2340: 73 72 63 5b 31 5d 20 26 20 30 78 33 46 29 29 3b src[1] & 0x3F));
2350: 0a 09 20 20 20 20 69 66 20 28 28 75 6e 73 69 67 .. if ((unsig
2360: 6e 65 64 29 28 2a 63 68 50 74 72 20 2d 20 31 29 ned)(*chPtr - 1)
2370: 20 3e 3d 20 28 55 4e 49 43 4f 44 45 5f 53 45 4c >= (UNICODE_SEL
2380: 46 20 2d 20 31 29 29 20 7b 0a 09 09 72 65 74 75 F - 1)) {...retu
2390: 72 6e 20 32 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a rn 2;.. }..}.
23a0: 0a 09 2f 2a 0a 09 20 2a 20 41 20 74 77 6f 2d 62 ../*.. * A two-b
23b0: 79 74 65 2d 63 68 61 72 61 63 74 65 72 20 6c 65 yte-character le
23c0: 61 64 2d 62 79 74 65 20 6e 6f 74 20 66 6f 6c 6c ad-byte not foll
23d0: 6f 77 65 64 20 62 79 20 74 72 61 69 6c 2d 62 79 owed by trail-by
23e0: 74 65 0a 09 20 2a 20 72 65 70 72 65 73 65 6e 74 te.. * represent
23f0: 73 20 69 74 73 65 6c 66 2e 0a 09 20 2a 2f 0a 20 s itself... */.
2400: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 79 } else if (by
2410: 74 65 20 3c 20 30 78 46 30 29 20 7b 0a 09 69 66 te < 0xF0) {..if
2420: 20 28 28 28 73 72 63 5b 31 5d 20 26 20 30 78 43 (((src[1] & 0xC
2430: 30 29 20 3d 3d 20 30 78 38 30 29 20 26 26 20 28 0) == 0x80) && (
2440: 28 73 72 63 5b 32 5d 20 26 20 30 78 43 30 29 20 (src[2] & 0xC0)
2450: 3d 3d 20 30 78 38 30 29 29 20 7b 0a 09 20 20 20 == 0x80)) {..
2460: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 72 65 /*.. * Thre
2470: 65 2d 62 79 74 65 2d 63 68 61 72 61 63 74 65 72 e-byte-character
2480: 20 6c 65 61 64 20 62 79 74 65 20 66 6f 6c 6c 6f lead byte follo
2490: 77 65 64 20 62 79 20 74 77 6f 20 74 72 61 69 6c wed by two trail
24a0: 20 62 79 74 65 73 2e 0a 09 20 20 20 20 20 2a 2f bytes... */
24b0: 0a 0a 09 20 20 20 20 2a 63 68 50 74 72 20 3d 20 ... *chPtr =
24c0: 28 54 63 6c 5f 55 6e 69 43 68 61 72 29 20 28 28 (Tcl_UniChar) ((
24d0: 28 62 79 74 65 20 26 20 30 78 30 46 29 20 3c 3c (byte & 0x0F) <<
24e0: 20 31 32 29 0a 09 09 20 20 20 20 7c 20 28 28 73 12)... | ((s
24f0: 72 63 5b 31 5d 20 26 20 30 78 33 46 29 20 3c 3c rc[1] & 0x3F) <<
2500: 20 36 29 20 7c 20 28 73 72 63 5b 32 5d 20 26 20 6) | (src[2] &
2510: 30 78 33 46 29 29 3b 0a 09 20 20 20 20 69 66 20 0x3F));.. if
2520: 28 2a 63 68 50 74 72 20 3e 20 30 78 37 46 46 29 (*chPtr > 0x7FF)
2530: 20 7b 0a 09 09 72 65 74 75 72 6e 20 33 3b 0a 09 {...return 3;..
2540: 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 }..}.../*..
2550: 2a 20 41 20 74 68 72 65 65 2d 62 79 74 65 2d 63 * A three-byte-c
2560: 68 61 72 61 63 74 65 72 20 6c 65 61 64 2d 62 79 haracter lead-by
2570: 74 65 20 6e 6f 74 20 66 6f 6c 6c 6f 77 65 64 20 te not followed
2580: 62 79 20 74 77 6f 20 74 72 61 69 6c 2d 62 79 74 by two trail-byt
2590: 65 73 0a 09 20 2a 20 72 65 70 72 65 73 65 6e 74 es.. * represent
25a0: 73 20 69 74 73 65 6c 66 2e 0a 09 20 2a 2f 0a 20 s itself... */.
25b0: 20 20 20 7d 0a 23 69 66 20 54 43 4c 5f 55 54 46 }.#if TCL_UTF
25c0: 5f 4d 41 58 20 3e 20 33 0a 20 20 20 20 65 6c 73 _MAX > 3. els
25d0: 65 20 69 66 20 28 62 79 74 65 20 3c 20 30 78 46 e if (byte < 0xF
25e0: 38 29 20 7b 0a 09 69 66 20 28 28 28 73 72 63 5b 8) {..if (((src[
25f0: 31 5d 20 26 20 30 78 43 30 29 20 3d 3d 20 30 78 1] & 0xC0) == 0x
2600: 38 30 29 20 26 26 20 28 28 73 72 63 5b 32 5d 20 80) && ((src[2]
2610: 26 20 30 78 43 30 29 20 3d 3d 20 30 78 38 30 29 & 0xC0) == 0x80)
2620: 20 26 26 20 28 28 73 72 63 5b 33 5d 20 26 20 30 && ((src[3] & 0
2630: 78 43 30 29 20 3d 3d 20 30 78 38 30 29 29 20 7b xC0) == 0x80)) {
2640: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
2650: 20 46 6f 75 72 2d 62 79 74 65 2d 63 68 61 72 61 Four-byte-chara
2660: 63 74 65 72 20 6c 65 61 64 20 62 79 74 65 20 66 cter lead byte f
2670: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 72 65 65 ollowed by three
2680: 20 74 72 61 69 6c 20 62 79 74 65 73 2e 0a 09 20 trail bytes...
2690: 20 20 20 20 2a 2f 0a 23 69 66 20 54 43 4c 5f 55 */.#if TCL_U
26a0: 54 46 5f 4d 41 58 20 3d 3d 20 34 0a 09 20 20 20 TF_MAX == 4..
26b0: 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 73 75 72 Tcl_UniChar sur
26c0: 72 6f 67 61 74 65 3b 0a 0a 09 20 20 20 20 62 79 rogate;... by
26d0: 74 65 20 3d 20 28 28 28 62 79 74 65 20 26 20 30 te = (((byte & 0
26e0: 78 30 37 29 20 3c 3c 20 31 38 29 20 7c 20 28 28 x07) << 18) | ((
26f0: 73 72 63 5b 31 5d 20 26 20 30 78 33 46 29 20 3c src[1] & 0x3F) <
2700: 3c 20 31 32 29 0a 09 09 20 20 20 20 7c 20 28 28 < 12)... | ((
2710: 73 72 63 5b 32 5d 20 26 20 30 78 33 46 29 20 3c src[2] & 0x3F) <
2720: 3c 20 36 29 20 7c 20 28 73 72 63 5b 33 5d 20 26 < 6) | (src[3] &
2730: 20 30 78 33 46 29 29 20 2d 20 30 78 31 30 30 30 0x3F)) - 0x1000
2740: 30 3b 0a 09 20 20 20 20 73 75 72 72 6f 67 61 74 0;.. surrogat
2750: 65 20 3d 20 28 54 63 6c 5f 55 6e 69 43 68 61 72 e = (Tcl_UniChar
2760: 29 20 28 30 78 44 38 30 30 20 2b 20 28 62 79 74 ) (0xD800 + (byt
2770: 65 20 3e 3e 20 31 30 29 29 3b 0a 09 20 20 20 20 e >> 10));..
2780: 69 66 20 28 62 79 74 65 20 26 20 30 78 31 30 30 if (byte & 0x100
2790: 30 30 30 29 20 7b 0a 09 09 2f 2a 20 6f 75 74 20 000) {.../* out
27a0: 6f 66 20 72 61 6e 67 65 2c 20 3c 20 30 78 31 30 of range, < 0x10
27b0: 30 30 30 20 6f 72 20 3e 20 30 78 31 30 66 66 66 000 or > 0x10fff
27c0: 66 20 2a 2f 0a 09 20 20 20 20 7d 20 65 6c 73 65 f */.. } else
27d0: 20 69 66 20 28 2a 63 68 50 74 72 20 21 3d 20 73 if (*chPtr != s
27e0: 75 72 72 6f 67 61 74 65 29 20 7b 0a 09 09 2f 2a urrogate) {.../*
27f0: 20 70 72 6f 64 75 63 65 20 68 69 67 68 20 73 75 produce high su
2800: 72 72 6f 67 61 74 65 2c 20 62 75 74 20 64 6f 6e rrogate, but don
2810: 27 74 20 61 64 76 61 6e 63 65 20 73 6f 75 72 63 't advance sourc
2820: 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 09 09 2a e pointer */...*
2830: 63 68 50 74 72 20 3d 20 73 75 72 72 6f 67 61 74 chPtr = surrogat
2840: 65 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 e;...return 0;..
2850: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 2f } else {.../
2860: 2a 20 70 72 6f 64 75 63 65 20 6c 6f 77 20 73 75 * produce low su
2870: 72 72 6f 67 61 74 65 2c 20 61 6e 64 20 61 64 76 rrogate, and adv
2880: 61 6e 63 65 20 73 6f 75 72 63 65 20 70 6f 69 6e ance source poin
2890: 74 65 72 20 2a 2f 0a 09 09 2a 63 68 50 74 72 20 ter */...*chPtr
28a0: 3d 20 28 54 63 6c 5f 55 6e 69 43 68 61 72 29 20 = (Tcl_UniChar)
28b0: 28 30 78 44 43 30 30 20 7c 20 28 62 79 74 65 20 (0xDC00 | (byte
28c0: 26 20 30 78 33 46 46 29 29 3b 0a 09 09 72 65 74 & 0x3FF));...ret
28d0: 75 72 6e 20 34 3b 0a 09 20 20 20 20 7d 0a 23 65 urn 4;.. }.#e
28e0: 6c 73 65 0a 09 20 20 20 20 2a 63 68 50 74 72 20 lse.. *chPtr
28f0: 3d 20 28 54 63 6c 5f 55 6e 69 43 68 61 72 29 20 = (Tcl_UniChar)
2900: 28 28 28 62 79 74 65 20 26 20 30 78 30 37 29 20 (((byte & 0x07)
2910: 3c 3c 20 31 38 29 20 7c 20 28 28 73 72 63 5b 31 << 18) | ((src[1
2920: 5d 20 26 20 30 78 33 46 29 20 3c 3c 20 31 32 29 ] & 0x3F) << 12)
2930: 0a 09 09 20 20 20 20 7c 20 28 28 73 72 63 5b 32 ... | ((src[2
2940: 5d 20 26 20 30 78 33 46 29 20 3c 3c 20 36 29 20 ] & 0x3F) << 6)
2950: 7c 20 28 73 72 63 5b 33 5d 20 26 20 30 78 33 46 | (src[3] & 0x3F
2960: 29 29 3b 0a 09 20 20 20 20 69 66 20 28 28 75 6e ));.. if ((un
2970: 73 69 67 6e 65 64 29 28 2a 63 68 50 74 72 20 2d signed)(*chPtr -
2980: 20 30 78 31 30 30 30 30 29 20 3c 3d 20 30 78 46 0x10000) <= 0xF
2990: 46 46 46 46 29 20 7b 0a 09 09 72 65 74 75 72 6e FFFF) {...return
29a0: 20 34 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 4;.. }.#endi
29b0: 66 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 41 20 f..}.../*.. * A
29c0: 66 6f 75 72 2d 62 79 74 65 2d 63 68 61 72 61 63 four-byte-charac
29d0: 74 65 72 20 6c 65 61 64 2d 62 79 74 65 20 6e 6f ter lead-byte no
29e0: 74 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77 t followed by tw
29f0: 6f 20 74 72 61 69 6c 2d 62 79 74 65 73 0a 09 20 o trail-bytes..
2a00: 2a 20 72 65 70 72 65 73 65 6e 74 73 20 69 74 73 * represents its
2a10: 65 6c 66 2e 0a 09 20 2a 2f 0a 20 20 20 20 7d 0a elf... */. }.
2a20: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2a 63 68 50 #endif.. *chP
2a30: 74 72 20 3d 20 28 54 63 6c 5f 55 6e 69 43 68 61 tr = (Tcl_UniCha
2a40: 72 29 20 62 79 74 65 3b 0a 20 20 20 20 72 65 74 r) byte;. ret
2a50: 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a urn 1;.}.../*. *
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
2ab0: 2a 20 54 63 6c 5f 55 74 66 54 6f 55 6e 69 43 68 * Tcl_UtfToUniCh
2ac0: 61 72 44 53 74 72 69 6e 67 20 2d 2d 0a 20 2a 0a arDString --. *.
2ad0: 20 2a 09 43 6f 6e 76 65 72 74 20 74 68 65 20 55 *.Convert the U
2ae0: 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 55 TF-8 string to U
2af0: 6e 69 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20 52 65 nicode.. *. * Re
2b00: 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 sults:. *.The re
2b10: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 turn value is a
2b20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 55 pointer to the U
2b30: 6e 69 63 6f 64 65 20 72 65 70 72 65 73 65 6e 74 nicode represent
2b40: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 2a 09 ation of the. *.
2b50: 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 53 74 UTF-8 string. St
2b60: 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 72 65 orage for the re
2b70: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 70 turn value is ap
2b80: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e pended to the en
2b90: 64 20 6f 66 0a 20 2a 09 64 73 50 74 72 2e 20 54 d of. *.dsPtr. T
2ba0: 68 65 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e he Unicode strin
2bb0: 67 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 g is terminated
2bc0: 77 69 74 68 20 61 20 55 6e 69 63 6f 64 65 20 4e with a Unicode N
2bd0: 55 4c 4c 20 63 68 61 72 61 63 74 65 72 2e 0a 20 ULL character..
2be0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
2bf0: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
2c00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2c50: 0a 0a 54 63 6c 5f 55 6e 69 43 68 61 72 20 2a 0a ..Tcl_UniChar *.
2c60: 54 63 6c 5f 55 74 66 54 6f 55 6e 69 43 68 61 72 Tcl_UtfToUniChar
2c70: 44 53 74 72 69 6e 67 28 0a 20 20 20 20 63 6f 6e DString(. con
2c80: 73 74 20 63 68 61 72 20 2a 73 72 63 2c 09 09 2f st char *src,../
2c90: 2a 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 * UTF-8 string t
2ca0: 6f 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 6e 69 o convert to Uni
2cb0: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 code. */. int
2cc0: 20 6c 65 6e 67 74 68 2c 09 09 09 2f 2a 20 4c 65 length,.../* Le
2cd0: 6e 67 74 68 20 6f 66 20 55 54 46 2d 38 20 73 74 ngth of UTF-8 st
2ce0: 72 69 6e 67 20 69 6e 20 62 79 74 65 73 2c 20 6f ring in bytes, o
2cf0: 72 20 2d 31 20 66 6f 72 0a 09 09 09 09 20 2a 20 r -1 for..... *
2d00: 73 74 72 6c 65 6e 28 29 2e 20 2a 2f 0a 20 20 20 strlen(). */.
2d10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 Tcl_DString *ds
2d20: 50 74 72 29 09 09 2f 2a 20 55 6e 69 63 6f 64 65 Ptr)../* Unicode
2d30: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 representation
2d40: 6f 66 20 73 74 72 69 6e 67 20 69 73 0a 09 09 09 of string is....
2d50: 09 20 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 . * appended to
2d60: 74 68 69 73 20 70 72 65 76 69 6f 75 73 6c 79 20 this previously
2d70: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 09 09 09 09 initialized.....
2d80: 20 2a 20 44 53 74 72 69 6e 67 2e 20 2a 2f 0a 7b * DString. */.{
2d90: 0a 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 . Tcl_UniChar
2da0: 20 63 68 20 3d 20 30 2c 20 2a 77 2c 20 2a 77 53 ch = 0, *w, *wS
2db0: 74 72 69 6e 67 3b 0a 20 20 20 20 63 6f 6e 73 74 tring;. const
2dc0: 20 63 68 61 72 20 2a 70 2c 20 2a 65 6e 64 3b 0a char *p, *end;.
2dd0: 20 20 20 20 69 6e 74 20 6f 6c 64 4c 65 6e 67 74 int oldLengt
2de0: 68 3b 0a 0a 20 20 20 20 69 66 20 28 6c 65 6e 67 h;.. if (leng
2df0: 74 68 20 3c 20 30 29 20 7b 0a 09 6c 65 6e 67 74 th < 0) {..lengt
2e00: 68 20 3d 20 73 74 72 6c 65 6e 28 73 72 63 29 3b h = strlen(src);
2e10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
2e20: 20 20 20 20 2a 20 55 6e 69 63 6f 64 65 20 73 74 * Unicode st
2e30: 72 69 6e 67 20 6c 65 6e 67 74 68 20 69 6e 20 54 ring length in T
2e40: 63 6c 5f 55 6e 69 43 68 61 72 73 20 77 69 6c 6c cl_UniChars will
2e50: 20 62 65 20 3c 3d 20 55 54 46 2d 38 20 73 74 72 be <= UTF-8 str
2e60: 69 6e 67 20 6c 65 6e 67 74 68 20 69 6e 0a 20 20 ing length in.
2e70: 20 20 20 2a 20 62 79 74 65 73 2e 0a 20 20 20 20 * bytes..
2e80: 20 2a 2f 0a 0a 20 20 20 20 6f 6c 64 4c 65 6e 67 */.. oldLeng
2e90: 74 68 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 th = Tcl_DString
2ea0: 4c 65 6e 67 74 68 28 64 73 50 74 72 29 3b 0a 2f Length(dsPtr);./
2eb0: 2a 20 54 4f 44 4f 3a 20 66 69 78 20 6f 76 65 72 * TODO: fix over
2ec0: 72 65 61 63 68 21 20 2a 2f 0a 20 20 20 20 54 63 reach! */. Tc
2ed0: 6c 5f 44 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 l_DStringSetLeng
2ee0: 74 68 28 64 73 50 74 72 2c 0a 09 20 20 20 20 28 th(dsPtr,.. (
2ef0: 69 6e 74 29 20 28 28 6f 6c 64 4c 65 6e 67 74 68 int) ((oldLength
2f00: 20 2b 20 6c 65 6e 67 74 68 20 2b 20 31 29 20 2a + length + 1) *
2f10: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 55 6e 69 43 sizeof(Tcl_UniC
2f20: 68 61 72 29 29 29 3b 0a 20 20 20 20 77 53 74 72 har)));. wStr
2f30: 69 6e 67 20 3d 20 28 54 63 6c 5f 55 6e 69 43 68 ing = (Tcl_UniCh
2f40: 61 72 20 2a 29 20 28 54 63 6c 5f 44 53 74 72 69 ar *) (Tcl_DStri
2f50: 6e 67 56 61 6c 75 65 28 64 73 50 74 72 29 20 2b ngValue(dsPtr) +
2f60: 20 6f 6c 64 4c 65 6e 67 74 68 29 3b 0a 0a 20 20 oldLength);..
2f70: 20 20 77 20 3d 20 77 53 74 72 69 6e 67 3b 0a 20 w = wString;.
2f80: 20 20 20 65 6e 64 20 3d 20 73 72 63 20 2b 20 6c end = src + l
2f90: 65 6e 67 74 68 3b 0a 20 20 20 20 66 6f 72 20 28 ength;. for (
2fa0: 70 20 3d 20 73 72 63 3b 20 70 20 3c 20 65 6e 64 p = src; p < end
2fb0: 3b 20 29 20 7b 0a 09 70 20 2b 3d 20 54 63 6c 55 ; ) {..p += TclU
2fc0: 74 66 54 6f 55 6e 69 43 68 61 72 28 70 2c 20 26 tfToUniChar(p, &
2fd0: 63 68 29 3b 0a 09 2a 77 2b 2b 20 3d 20 63 68 3b ch);..*w++ = ch;
2fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 77 20 3d 20 . }. *w =
2ff0: 27 5c 30 27 3b 0a 20 20 20 20 54 63 6c 5f 44 53 '\0';. Tcl_DS
3000: 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 64 tringSetLength(d
3010: 73 50 74 72 2c 0a 09 20 20 20 20 28 6f 6c 64 4c sPtr,.. (oldL
3020: 65 6e 67 74 68 20 2b 20 28 28 63 68 61 72 20 2a ength + ((char *
3030: 29 20 77 20 2d 20 28 63 68 61 72 20 2a 29 20 77 ) w - (char *) w
3040: 53 74 72 69 6e 67 29 29 29 3b 0a 0a 20 20 20 20 String)));..
3050: 72 65 74 75 72 6e 20 77 53 74 72 69 6e 67 3b 0a return wString;.
3060: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 ----. *. * Tcl_U
30c0: 74 66 43 68 61 72 43 6f 6d 70 6c 65 74 65 20 2d tfCharComplete -
30d0: 2d 0a 20 2a 0a 20 2a 09 44 65 74 65 72 6d 69 6e -. *. *.Determin
30e0: 65 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 e if the UTF-8 s
30f0: 74 72 69 6e 67 20 6f 66 20 74 68 65 20 67 69 76 tring of the giv
3100: 65 6e 20 6c 65 6e 67 74 68 20 69 73 20 6c 6f 6e en length is lon
3110: 67 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 0a 20 g enough to be.
3120: 2a 09 64 65 63 6f 64 65 64 20 62 79 20 54 63 6c *.decoded by Tcl
3130: 5f 55 74 66 54 6f 55 6e 69 43 68 61 72 28 29 2e _UtfToUniChar().
3140: 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 65 This does not e
3150: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 55 nsure that the U
3160: 54 46 2d 38 0a 20 2a 09 73 74 72 69 6e 67 20 69 TF-8. *.string i
3170: 73 20 70 72 6f 70 65 72 6c 79 20 66 6f 72 6d 65 s properly forme
3180: 64 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74 6f d. Equivalent to
3190: 20 50 6c 61 6e 20 39 20 66 75 6c 6c 72 75 6e 65 Plan 9 fullrune
31a0: 28 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ().. *. * Result
31b0: 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e s:. *.The return
31c0: 20 76 61 6c 75 65 20 69 73 20 30 20 69 66 20 74 value is 0 if t
31d0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 he string is not
31e0: 20 6c 6f 6e 67 20 65 6e 6f 75 67 68 2c 20 6e 6f long enough, no
31f0: 6e 2d 7a 65 72 6f 0a 20 2a 09 6f 74 68 65 72 77 n-zero. *.otherw
3200: 69 73 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ise.. *. * Side
3210: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
3220: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3270: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f --. */..int.Tcl_
3280: 55 74 66 43 68 61 72 43 6f 6d 70 6c 65 74 65 28 UtfCharComplete(
3290: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
32a0: 2a 73 72 63 2c 09 09 2f 2a 20 53 74 72 69 6e 67 *src,../* String
32b0: 20 74 6f 20 63 68 65 63 6b 20 69 66 20 66 69 72 to check if fir
32c0: 73 74 20 66 65 77 20 62 79 74 65 73 20 63 6f 6e st few bytes con
32d0: 74 61 69 6e 0a 09 09 09 09 20 2a 20 61 20 63 6f tain..... * a co
32e0: 6d 70 6c 65 74 65 20 55 54 46 2d 38 20 63 68 61 mplete UTF-8 cha
32f0: 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 racter. */. i
3300: 6e 74 20 6c 65 6e 67 74 68 29 09 09 09 2f 2a 20 nt length).../*
3310: 4c 65 6e 67 74 68 20 6f 66 20 61 62 6f 76 65 20 Length of above
3320: 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73 2e string in bytes.
3330: 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e */.{. return
3340: 20 6c 65 6e 67 74 68 20 3e 3d 20 74 6f 74 61 6c length >= total
3350: 42 79 74 65 73 5b 28 75 6e 73 69 67 6e 65 64 20 Bytes[(unsigned
3360: 63 68 61 72 29 2a 73 72 63 5d 3b 0a 7d 0a 0c 0a char)*src];.}...
3370: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33c0: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 4e 75 6d 55 74 . *. * Tcl_NumUt
33d0: 66 43 68 61 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 fChars --. *. *.
33e0: 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 Returns the numb
33f0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 er of characters
3400: 20 28 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20 (not bytes) in
3410: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 the UTF-8 string
3420: 2c 20 6e 6f 74 0a 20 2a 09 69 6e 63 6c 75 64 69 , not. *.includi
3430: 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 ng the terminati
3440: 6e 67 20 4e 55 4c 4c 20 62 79 74 65 2e 20 54 68 ng NULL byte. Th
3450: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 is is equivalent
3460: 20 74 6f 20 50 6c 61 6e 20 39 0a 20 2a 09 75 74 to Plan 9. *.ut
3470: 66 6c 65 6e 28 29 20 61 6e 64 20 75 74 66 6e 6c flen() and utfnl
3480: 65 6e 28 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 en().. *. * Resu
3490: 6c 74 73 3a 0a 20 2a 09 41 73 20 61 62 6f 76 65 lts:. *.As above
34a0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
34b0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
34c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3510: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4e 75 6d */..int.Tcl_Num
3520: 55 74 66 43 68 61 72 73 28 0a 20 20 20 20 72 65 UtfChars(. re
3530: 67 69 73 74 65 72 20 63 6f 6e 73 74 20 63 68 61 gister const cha
3540: 72 20 2a 73 72 63 2c 09 2f 2a 20 54 68 65 20 55 r *src,./* The U
3550: 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 6d TF-8 string to m
3560: 65 61 73 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69 easure. */. i
3570: 6e 74 20 6c 65 6e 67 74 68 29 09 09 09 2f 2a 20 nt length).../*
3580: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 The length of th
3590: 65 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 e string in byte
35a0: 73 2c 20 6f 72 20 2d 31 0a 09 09 09 09 20 2a 20 s, or -1..... *
35b0: 66 6f 72 20 73 74 72 6c 65 6e 28 73 74 72 69 6e for strlen(strin
35c0: 67 29 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c g). */.{. Tcl
35d0: 5f 55 6e 69 43 68 61 72 20 63 68 20 3d 20 30 3b _UniChar ch = 0;
35e0: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e . register in
35f0: 74 20 69 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a t i = 0;.. /*
3600: 0a 20 20 20 20 20 2a 20 54 68 65 20 73 65 70 61 . * The sepa
3610: 72 61 74 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 rate implementat
3620: 69 6f 6e 73 20 61 72 65 20 66 61 73 74 65 72 2e ions are faster.
3630: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 53 . *. * S
3640: 69 6e 63 65 20 74 68 69 73 20 69 73 20 61 20 74 ince this is a t
3650: 69 6d 65 2d 73 65 6e 73 69 74 69 76 65 20 66 75 ime-sensitive fu
3660: 6e 63 74 69 6f 6e 2c 20 77 65 20 61 6c 73 6f 20 nction, we also
3670: 64 6f 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 do the check for
3680: 20 74 68 65 0a 20 20 20 20 20 2a 20 73 69 6e 67 the. * sing
3690: 6c 65 2d 62 79 74 65 20 63 68 61 72 20 63 61 73 le-byte char cas
36a0: 65 20 73 70 65 63 69 61 6c 6c 79 2e 0a 20 20 20 e specially..
36b0: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6c 65 */.. if (le
36c0: 6e 67 74 68 20 3c 20 30 29 20 7b 0a 09 77 68 69 ngth < 0) {..whi
36d0: 6c 65 20 28 2a 73 72 63 20 21 3d 20 27 5c 30 27 le (*src != '\0'
36e0: 29 20 7b 0a 09 20 20 20 20 73 72 63 20 2b 3d 20 ) {.. src +=
36f0: 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 TclUtfToUniChar(
3700: 73 72 63 2c 20 26 63 68 29 3b 0a 09 20 20 20 20 src, &ch);..
3710: 69 2b 2b 3b 0a 09 7d 0a 09 69 66 20 28 69 20 3c i++;..}..if (i <
3720: 20 30 29 20 69 20 3d 20 49 4e 54 5f 4d 41 58 3b 0) i = INT_MAX;
3730: 20 2f 2a 20 42 75 67 20 5b 32 37 33 38 34 32 37 /* Bug [2738427
3740: 5d 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 ] */. } else
3750: 7b 0a 09 72 65 67 69 73 74 65 72 20 63 6f 6e 73 {..register cons
3760: 74 20 63 68 61 72 20 2a 65 6e 64 50 74 72 20 3d t char *endPtr =
3770: 20 73 72 63 20 2b 20 6c 65 6e 67 74 68 20 2d 20 src + length -
3780: 54 43 4c 5f 55 54 46 5f 4d 41 58 3b 0a 0a 09 77 TCL_UTF_MAX;...w
3790: 68 69 6c 65 20 28 73 72 63 20 3c 20 65 6e 64 50 hile (src < endP
37a0: 74 72 29 20 7b 0a 09 20 20 20 20 73 72 63 20 2b tr) {.. src +
37b0: 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 = TclUtfToUniCha
37c0: 72 28 73 72 63 2c 20 26 63 68 29 3b 0a 09 20 20 r(src, &ch);..
37d0: 20 20 69 2b 2b 3b 0a 09 7d 0a 09 65 6e 64 50 74 i++;..}..endPt
37e0: 72 20 2b 3d 20 54 43 4c 5f 55 54 46 5f 4d 41 58 r += TCL_UTF_MAX
37f0: 3b 0a 09 77 68 69 6c 65 20 28 28 73 72 63 20 3c ;..while ((src <
3800: 20 65 6e 64 50 74 72 29 20 26 26 20 54 63 6c 5f endPtr) && Tcl_
3810: 55 74 66 43 68 61 72 43 6f 6d 70 6c 65 74 65 28 UtfCharComplete(
3820: 73 72 63 2c 20 65 6e 64 50 74 72 20 2d 20 73 72 src, endPtr - sr
3830: 63 29 29 20 7b 0a 09 20 20 20 20 73 72 63 20 2b c)) {.. src +
3840: 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 = TclUtfToUniCha
3850: 72 28 73 72 63 2c 20 26 63 68 29 3b 0a 09 20 20 r(src, &ch);..
3860: 20 20 69 2b 2b 3b 0a 09 7d 0a 09 69 66 20 28 73 i++;..}..if (s
3870: 72 63 20 3c 20 65 6e 64 50 74 72 29 20 7b 0a 09 rc < endPtr) {..
3880: 20 20 20 20 69 20 2b 3d 20 65 6e 64 50 74 72 20 i += endPtr
3890: 2d 20 73 72 63 3b 0a 09 7d 0a 20 20 20 20 7d 0a - src;..}. }.
38a0: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a return i;.}.
38b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
38c0: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 66 --. *. * Tcl_Utf
3910: 46 69 6e 64 46 69 72 73 74 20 2d 2d 0a 20 2a 0a FindFirst --. *.
3920: 20 2a 09 52 65 74 75 72 6e 73 20 61 20 70 6f 69 *.Returns a poi
3930: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 nter to the firs
3940: 74 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 74 t occurance of t
3950: 68 65 20 67 69 76 65 6e 20 55 6e 69 63 6f 64 65 he given Unicode
3960: 20 63 68 61 72 61 63 74 65 72 0a 20 2a 09 69 6e character. *.in
3970: 20 74 68 65 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e the NULL-termin
3980: 61 74 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e ated UTF-8 strin
3990: 67 2e 20 54 68 65 20 4e 55 4c 4c 20 74 65 72 6d g. The NULL term
39a0: 69 6e 61 74 6f 72 20 69 73 20 63 6f 6e 73 69 64 inator is consid
39b0: 65 72 65 64 0a 20 2a 09 70 61 72 74 20 6f 66 20 ered. *.part of
39c0: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 the UTF-8 string
39d0: 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 . Equivalent to
39e0: 50 6c 61 6e 20 39 20 75 74 66 72 75 6e 65 28 29 Plan 9 utfrune()
39f0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
3a00: 0a 20 2a 09 41 73 20 61 62 6f 76 65 2e 20 49 66 . *.As above. If
3a10: 20 74 68 65 20 55 6e 69 63 6f 64 65 20 63 68 61 the Unicode cha
3a20: 72 61 63 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 racter does not
3a30: 65 78 69 73 74 20 69 6e 20 74 68 65 20 67 69 76 exist in the giv
3a40: 65 6e 20 73 74 72 69 6e 67 2c 0a 20 2a 09 74 68 en string,. *.th
3a50: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 e return value i
3a60: 73 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 s NULL.. *. * Si
3a70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
3a80: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ad0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 -----. */..const
3ae0: 20 63 68 61 72 20 2a 0a 54 63 6c 5f 55 74 66 46 char *.Tcl_UtfF
3af0: 69 6e 64 46 69 72 73 74 28 0a 20 20 20 20 63 6f indFirst(. co
3b00: 6e 73 74 20 63 68 61 72 20 2a 73 72 63 2c 09 09 nst char *src,..
3b10: 2f 2a 20 54 68 65 20 55 54 46 2d 38 20 73 74 72 /* The UTF-8 str
3b20: 69 6e 67 20 74 6f 20 62 65 20 73 65 61 72 63 68 ing to be search
3b30: 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 ed. */. int c
3b40: 68 29 09 09 09 2f 2a 20 54 68 65 20 55 6e 69 63 h).../* The Unic
3b50: 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 74 6f ode character to
3b60: 20 73 65 61 72 63 68 20 66 6f 72 2e 20 2a 2f 0a search for. */.
3b70: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 66 {. int len, f
3b80: 75 6c 6c 63 68 61 72 3b 0a 20 20 20 20 54 63 6c ullchar;. Tcl
3b90: 5f 55 6e 69 43 68 61 72 20 66 69 6e 64 20 3d 20 _UniChar find =
3ba0: 30 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 0;.. while (1
3bb0: 29 20 7b 0a 09 6c 65 6e 20 3d 20 54 63 6c 55 74 ) {..len = TclUt
3bc0: 66 54 6f 55 6e 69 43 68 61 72 28 73 72 63 2c 20 fToUniChar(src,
3bd0: 26 66 69 6e 64 29 3b 0a 09 66 75 6c 6c 63 68 61 &find);..fullcha
3be0: 72 20 3d 20 66 69 6e 64 3b 0a 23 69 66 20 54 43 r = find;.#if TC
3bf0: 4c 5f 55 54 46 5f 4d 41 58 20 3d 3d 20 34 0a 09 L_UTF_MAX == 4..
3c00: 69 66 20 28 21 6c 65 6e 29 20 7b 0a 09 20 20 20 if (!len) {..
3c10: 20 6c 65 6e 20 2b 3d 20 54 63 6c 55 74 66 54 6f len += TclUtfTo
3c20: 55 6e 69 43 68 61 72 28 73 72 63 2c 20 26 66 69 UniChar(src, &fi
3c30: 6e 64 29 3b 0a 09 20 20 20 20 66 75 6c 6c 63 68 nd);.. fullch
3c40: 61 72 20 3d 20 28 28 28 66 75 6c 6c 63 68 61 72 ar = (((fullchar
3c50: 20 26 20 30 78 33 66 66 29 20 3c 3c 20 31 30 29 & 0x3ff) << 10)
3c60: 20 7c 20 28 66 69 6e 64 20 26 20 30 78 33 66 66 | (find & 0x3ff
3c70: 29 29 20 2b 20 30 78 31 30 30 30 30 3b 0a 09 7d )) + 0x10000;..}
3c80: 0a 23 65 6e 64 69 66 0a 09 69 66 20 28 66 75 6c .#endif..if (ful
3c90: 6c 63 68 61 72 20 3d 3d 20 63 68 29 20 7b 0a 09 lchar == ch) {..
3ca0: 20 20 20 20 72 65 74 75 72 6e 20 73 72 63 3b 0a return src;.
3cb0: 09 7d 0a 09 69 66 20 28 2a 73 72 63 20 3d 3d 20 .}..if (*src ==
3cc0: 27 5c 30 27 29 20 7b 0a 09 20 20 20 20 72 65 74 '\0') {.. ret
3cd0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 73 72 urn NULL;..}..sr
3ce0: 63 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a c += len;. }.
3cf0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d40: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 ----. *. * Tcl_U
3d50: 74 66 46 69 6e 64 4c 61 73 74 20 2d 2d 0a 20 2a tfFindLast --. *
3d60: 0a 20 2a 09 52 65 74 75 72 6e 73 20 61 20 70 6f . *.Returns a po
3d70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 61 73 inter to the las
3d80: 74 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 74 t occurance of t
3d90: 68 65 20 67 69 76 65 6e 20 55 6e 69 63 6f 64 65 he given Unicode
3da0: 20 63 68 61 72 61 63 74 65 72 0a 20 2a 09 69 6e character. *.in
3db0: 20 74 68 65 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e the NULL-termin
3dc0: 61 74 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e ated UTF-8 strin
3dd0: 67 2e 20 54 68 65 20 4e 55 4c 4c 20 74 65 72 6d g. The NULL term
3de0: 69 6e 61 74 6f 72 20 69 73 20 63 6f 6e 73 69 64 inator is consid
3df0: 65 72 65 64 0a 20 2a 09 70 61 72 74 20 6f 66 20 ered. *.part of
3e00: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 the UTF-8 string
3e10: 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 . Equivalent to
3e20: 50 6c 61 6e 20 39 20 75 74 66 72 72 75 6e 65 28 Plan 9 utfrrune(
3e30: 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ).. *. * Results
3e40: 3a 0a 20 2a 09 41 73 20 61 62 6f 76 65 2e 20 49 :. *.As above. I
3e50: 66 20 74 68 65 20 55 6e 69 63 6f 64 65 20 63 68 f the Unicode ch
3e60: 61 72 61 63 74 65 72 20 64 6f 65 73 20 6e 6f 74 aracter does not
3e70: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 67 69 exist in the gi
3e80: 76 65 6e 20 73 74 72 69 6e 67 2c 20 74 68 65 0a ven string, the.
3e90: 20 2a 09 72 65 74 75 72 6e 20 76 61 6c 75 65 20 *.return value
3ea0: 69 73 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 is NULL.. *. * S
3eb0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3ec0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f10: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f 6e 73 ------. */..cons
3f20: 74 20 63 68 61 72 20 2a 0a 54 63 6c 5f 55 74 66 t char *.Tcl_Utf
3f30: 46 69 6e 64 4c 61 73 74 28 0a 20 20 20 20 63 6f FindLast(. co
3f40: 6e 73 74 20 63 68 61 72 20 2a 73 72 63 2c 09 09 nst char *src,..
3f50: 2f 2a 20 54 68 65 20 55 54 46 2d 38 20 73 74 72 /* The UTF-8 str
3f60: 69 6e 67 20 74 6f 20 62 65 20 73 65 61 72 63 68 ing to be search
3f70: 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 ed. */. int c
3f80: 68 29 09 09 09 2f 2a 20 54 68 65 20 55 6e 69 63 h).../* The Unic
3f90: 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 74 6f ode character to
3fa0: 20 73 65 61 72 63 68 20 66 6f 72 2e 20 2a 2f 0a search for. */.
3fb0: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 66 {. int len, f
3fc0: 75 6c 6c 63 68 61 72 3b 0a 20 20 20 20 54 63 6c ullchar;. Tcl
3fd0: 5f 55 6e 69 43 68 61 72 20 66 69 6e 64 20 3d 20 _UniChar find =
3fe0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 0;. const cha
3ff0: 72 20 2a 6c 61 73 74 3b 0a 0a 20 20 20 20 6c 61 r *last;.. la
4000: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 st = NULL;. w
4010: 68 69 6c 65 20 28 31 29 20 7b 0a 09 6c 65 6e 20 hile (1) {..len
4020: 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 = TclUtfToUniCha
4030: 72 28 73 72 63 2c 20 26 66 69 6e 64 29 3b 0a 09 r(src, &find);..
4040: 66 75 6c 6c 63 68 61 72 20 3d 20 66 69 6e 64 3b fullchar = find;
4050: 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 .#if TCL_UTF_MAX
4060: 20 3d 3d 20 34 0a 09 69 66 20 28 21 6c 65 6e 29 == 4..if (!len)
4070: 20 7b 0a 09 20 20 20 20 6c 65 6e 20 2b 3d 20 54 {.. len += T
4080: 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 73 clUtfToUniChar(s
4090: 72 63 2c 20 26 66 69 6e 64 29 3b 0a 09 20 20 20 rc, &find);..
40a0: 20 66 75 6c 6c 63 68 61 72 20 3d 20 28 28 28 66 fullchar = (((f
40b0: 75 6c 6c 63 68 61 72 20 26 20 30 78 33 66 66 29 ullchar & 0x3ff)
40c0: 20 3c 3c 20 31 30 29 20 7c 20 28 66 69 6e 64 20 << 10) | (find
40d0: 26 20 30 78 33 66 66 29 29 20 2b 20 30 78 31 30 & 0x3ff)) + 0x10
40e0: 30 30 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 000;..}.#endif..
40f0: 69 66 20 28 66 75 6c 6c 63 68 61 72 20 3d 3d 20 if (fullchar ==
4100: 63 68 29 20 7b 0a 09 20 20 20 20 6c 61 73 74 20 ch) {.. last
4110: 3d 20 73 72 63 3b 0a 09 7d 0a 09 69 66 20 28 2a = src;..}..if (*
4120: 73 72 63 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 src == '\0') {..
4130: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 73 break;..}..s
4140: 72 63 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d rc += len;. }
4150: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 61 73 74 . return last
4160: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
41b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
41c0: 5f 55 74 66 4e 65 78 74 20 2d 2d 0a 20 2a 0a 20 _UtfNext --. *.
41d0: 2a 09 47 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 *.Given a pointe
41e0: 72 20 74 6f 20 73 6f 6d 65 20 63 75 72 72 65 6e r to some curren
41f0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 61 20 t location in a
4200: 55 54 46 2d 38 20 73 74 72 69 6e 67 2c 20 6d 6f UTF-8 string, mo
4210: 76 65 0a 20 2a 09 66 6f 72 77 61 72 64 20 6f 6e ve. *.forward on
4220: 65 20 63 68 61 72 61 63 74 65 72 2e 20 54 68 65 e character. The
4230: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 caller must ens
4240: 75 72 65 20 74 68 61 74 20 74 68 65 79 20 61 72 ure that they ar
4250: 65 20 6e 6f 74 20 61 73 6b 69 6e 67 0a 20 2a 09 e not asking. *.
4260: 66 6f 72 20 74 68 65 20 6e 65 78 74 20 63 68 61 for the next cha
4270: 72 61 63 74 65 72 20 61 66 74 65 72 20 74 68 65 racter after the
4280: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 last character
4290: 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 20 in the string..
42a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
42b0: 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 .The return valu
42c0: 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 65 72 e is the pointer
42d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61 to the next cha
42e0: 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 55 54 racter in the UT
42f0: 46 2d 38 0a 20 2a 09 73 74 72 69 6e 67 2e 0a 20 F-8. *.string..
4300: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4310: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
4320: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
4370: 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 0a 54 ..const char *.T
4380: 63 6c 5f 55 74 66 4e 65 78 74 28 0a 20 20 20 20 cl_UtfNext(.
4390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 72 63 29 const char *src)
43a0: 09 09 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 ../* The current
43b0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 location in the
43c0: 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 20 string. */.{.
43d0: 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 63 68 Tcl_UniChar ch
43e0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 65 = 0;. int le
43f0: 6e 20 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 n = TclUtfToUniC
4400: 68 61 72 28 73 72 63 2c 20 26 63 68 29 3b 0a 0a har(src, &ch);..
4410: 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 #if TCL_UTF_MAX
4420: 3d 3d 20 34 0a 20 20 20 20 69 66 20 28 6c 65 6e == 4. if (len
4430: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 6c == 0) {. l
4440: 65 6e 20 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 en = TclUtfToUni
4450: 43 68 61 72 28 73 72 63 2c 20 26 63 68 29 3b 0a Char(src, &ch);.
4460: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
4470: 20 72 65 74 75 72 6e 20 73 72 63 20 2b 20 6c 65 return src + le
4480: 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d n;.}.../*. *----
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
44e0: 6c 5f 55 74 66 50 72 65 76 20 2d 2d 0a 20 2a 0a l_UtfPrev --. *.
44f0: 20 2a 09 47 69 76 65 6e 20 61 20 70 6f 69 6e 74 *.Given a point
4500: 65 72 20 74 6f 20 73 6f 6d 65 20 63 75 72 72 65 er to some curre
4510: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 61 nt location in a
4520: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2c 20 6d UTF-8 string, m
4530: 6f 76 65 0a 20 2a 09 62 61 63 6b 77 61 72 64 73 ove. *.backwards
4540: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 20 one character.
4550: 54 68 69 73 20 77 6f 72 6b 73 20 63 6f 72 72 65 This works corre
4560: 63 74 6c 79 20 77 68 65 6e 20 74 68 65 20 70 6f ctly when the po
4570: 69 6e 74 65 72 20 69 73 20 69 6e 0a 20 2a 09 74 inter is in. *.t
4580: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 55 he middle of a U
4590: 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e 0a TF-8 character..
45a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
45b0: 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c *.The return val
45c0: 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 ue is a pointer
45d0: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 to the previous
45e0: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 character in the
45f0: 20 55 54 46 2d 38 0a 20 2a 09 73 74 72 69 6e 67 UTF-8. *.string
4600: 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 . If the current
4610: 20 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 61 6c location was al
4620: 72 65 61 64 79 20 61 74 20 74 68 65 20 62 65 67 ready at the beg
4630: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 0a 20 2a inning of the. *
4640: 09 73 74 72 69 6e 67 2c 20 74 68 65 20 72 65 74 .string, the ret
4650: 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 61 urn value will a
4660: 6c 73 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 lso be a pointer
4670: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e to the beginnin
4680: 67 20 6f 66 0a 20 2a 09 74 68 65 20 73 74 72 69 g of. *.the stri
4690: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
46a0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
46b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4700: 2d 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 -. */..const cha
4710: 72 20 2a 0a 54 63 6c 5f 55 74 66 50 72 65 76 28 r *.Tcl_UtfPrev(
4720: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
4730: 2a 73 72 63 2c 09 09 2f 2a 20 54 68 65 20 63 75 *src,../* The cu
4740: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 rrent location i
4750: 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 20 2a 2f n the string. */
4760: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
4770: 2a 73 74 61 72 74 29 09 09 2f 2a 20 50 6f 69 6e *start)../* Poin
4780: 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e ter to the begin
4790: 6e 69 6e 67 20 6f 66 20 74 68 65 20 73 74 72 69 ning of the stri
47a0: 6e 67 2c 20 74 6f 0a 09 09 09 09 20 2a 20 61 76 ng, to..... * av
47b0: 6f 69 64 20 67 6f 69 6e 67 20 62 61 63 6b 77 61 oid going backwa
47c0: 72 64 73 20 74 6f 6f 20 66 61 72 2e 20 2a 2f 0a rds too far. */.
47d0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 {. const char
47e0: 20 2a 6c 6f 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 *look;. int
47f0: 69 2c 20 62 79 74 65 3b 0a 0a 20 20 20 20 6c 6f i, byte;.. lo
4800: 6f 6b 20 3d 20 2d 2d 73 72 63 3b 0a 20 20 20 20 ok = --src;.
4810: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
4820: 54 43 4c 5f 55 54 46 5f 4d 41 58 3b 20 69 2b 2b TCL_UTF_MAX; i++
4830: 29 20 7b 0a 09 69 66 20 28 6c 6f 6f 6b 20 3c 20 ) {..if (look <
4840: 73 74 61 72 74 29 20 7b 0a 09 20 20 20 20 69 66 start) {.. if
4850: 20 28 73 72 63 20 3c 20 73 74 61 72 74 29 20 7b (src < start) {
4860: 0a 09 09 73 72 63 20 3d 20 73 74 61 72 74 3b 0a ...src = start;.
4870: 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 . }.. brea
4880: 6b 3b 0a 09 7d 0a 09 62 79 74 65 20 3d 20 2a 28 k;..}..byte = *(
4890: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a (unsigned char *
48a0: 29 20 6c 6f 6f 6b 29 3b 0a 09 69 66 20 28 62 79 ) look);..if (by
48b0: 74 65 20 3c 20 30 78 38 30 29 20 7b 0a 09 20 20 te < 0x80) {..
48c0: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 69 66 20 break;..}..if
48d0: 28 62 79 74 65 20 3e 3d 20 30 78 43 30 29 20 7b (byte >= 0xC0) {
48e0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f .. return loo
48f0: 6b 3b 0a 09 7d 0a 09 6c 6f 6f 6b 2d 2d 3b 0a 20 k;..}..look--;.
4900: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
4910: 73 72 63 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d src;.}.../*. *--
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4970: 54 63 6c 5f 55 6e 69 43 68 61 72 41 74 49 6e 64 Tcl_UniCharAtInd
4980: 65 78 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 ex --. *. *.Retu
4990: 72 6e 73 20 74 68 65 20 54 63 6c 5f 55 6e 69 43 rns the Tcl_UniC
49a0: 68 61 72 20 72 65 70 72 65 73 65 6e 74 65 64 20 har represented
49b0: 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 at the specified
49c0: 20 63 68 61 72 61 63 74 65 72 0a 20 2a 09 28 6e character. *.(n
49d0: 6f 74 20 62 79 74 65 29 20 70 6f 73 69 74 69 6f ot byte) positio
49e0: 6e 20 69 6e 20 74 68 65 20 55 54 46 2d 38 20 73 n in the UTF-8 s
49f0: 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 tring.. *. * Res
4a00: 75 6c 74 73 3a 0a 20 2a 09 41 73 20 61 62 6f 76 ults:. *.As abov
4a10: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
4a20: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
4a30: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a80: 0a 20 2a 2f 0a 0a 54 63 6c 5f 55 6e 69 43 68 61 . */..Tcl_UniCha
4a90: 72 0a 54 63 6c 5f 55 6e 69 43 68 61 72 41 74 49 r.Tcl_UniCharAtI
4aa0: 6e 64 65 78 28 0a 20 20 20 20 72 65 67 69 73 74 ndex(. regist
4ab0: 65 72 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 er const char *s
4ac0: 72 63 2c 09 2f 2a 20 54 68 65 20 55 54 46 2d 38 rc,./* The UTF-8
4ad0: 20 73 74 72 69 6e 67 20 74 6f 20 64 65 72 65 66 string to deref
4ae0: 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 72 erence. */. r
4af0: 65 67 69 73 74 65 72 20 69 6e 74 20 69 6e 64 65 egister int inde
4b00: 78 29 09 09 2f 2a 20 54 68 65 20 70 6f 73 69 74 x)../* The posit
4b10: 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 73 69 72 ion of the desir
4b20: 65 64 20 63 68 61 72 61 63 74 65 72 2e 20 2a 2f ed character. */
4b30: 0a 7b 0a 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 .{. Tcl_UniCh
4b40: 61 72 20 63 68 20 3d 20 30 3b 0a 0a 20 20 20 20 ar ch = 0;..
4b50: 77 68 69 6c 65 20 28 69 6e 64 65 78 2d 2d 20 3e while (index-- >
4b60: 3d 20 30 29 20 7b 0a 09 73 72 63 20 2b 3d 20 54 = 0) {..src += T
4b70: 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 73 clUtfToUniChar(s
4b80: 72 63 2c 20 26 63 68 29 3b 0a 20 20 20 20 7d 0a rc, &ch);. }.
4b90: 20 20 20 20 72 65 74 75 72 6e 20 63 68 3b 0a 7d return ch;.}
4ba0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bf0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 ---. *. * Tcl_Ut
4c00: 66 41 74 49 6e 64 65 78 20 2d 2d 0a 20 2a 0a 20 fAtIndex --. *.
4c10: 2a 09 52 65 74 75 72 6e 73 20 61 20 70 6f 69 6e *.Returns a poin
4c20: 74 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 ter to the speci
4c30: 66 69 65 64 20 63 68 61 72 61 63 74 65 72 20 28 fied character (
4c40: 6e 6f 74 20 62 79 74 65 29 20 70 6f 73 69 74 69 not byte) positi
4c50: 6f 6e 20 69 6e 0a 20 2a 09 74 68 65 20 55 54 46 on in. *.the UTF
4c60: 2d 38 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a -8 string.. *. *
4c70: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 73 20 Results:. *.As
4c80: 61 62 6f 76 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 above.. *. * Sid
4c90: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
4ca0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 ----. */..const
4d00: 63 68 61 72 20 2a 0a 54 63 6c 5f 55 74 66 41 74 char *.Tcl_UtfAt
4d10: 49 6e 64 65 78 28 0a 20 20 20 20 72 65 67 69 73 Index(. regis
4d20: 74 65 72 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ter const char *
4d30: 73 72 63 2c 09 2f 2a 20 54 68 65 20 55 54 46 2d src,./* The UTF-
4d40: 38 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 8 string. */.
4d50: 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 69 6e register int in
4d60: 64 65 78 29 09 09 2f 2a 20 54 68 65 20 70 6f 73 dex)../* The pos
4d70: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 73 ition of the des
4d80: 69 72 65 64 20 63 68 61 72 61 63 74 65 72 2e 20 ired character.
4d90: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 55 6e 69 */.{. Tcl_Uni
4da0: 43 68 61 72 20 63 68 20 3d 20 30 3b 0a 20 20 20 Char ch = 0;.
4db0: 20 69 6e 74 20 6c 65 6e 20 3d 20 31 3b 0a 0a 20 int len = 1;..
4dc0: 20 20 20 77 68 69 6c 65 20 28 69 6e 64 65 78 2d while (index-
4dd0: 2d 20 3e 20 30 29 20 7b 0a 09 6c 65 6e 20 3d 20 - > 0) {..len =
4de0: 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 TclUtfToUniChar(
4df0: 73 72 63 2c 20 26 63 68 29 3b 0a 09 73 72 63 20 src, &ch);..src
4e00: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 23 69 += len;. }.#i
4e10: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3d 3d f TCL_UTF_MAX ==
4e20: 20 34 0a 20 20 20 20 20 69 66 20 28 21 6c 65 6e 4. if (!len
4e30: 29 20 7b 0a 09 2f 2a 20 49 6e 64 65 78 20 70 6f ) {../* Index po
4e40: 69 6e 74 73 20 61 74 20 63 68 61 72 61 63 74 65 ints at characte
4e50: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 48 69 67 68 r following High
4e60: 20 53 75 72 72 6f 67 61 74 65 20 2a 2f 0a 09 73 Surrogate */..s
4e70: 72 63 20 2b 3d 20 54 63 6c 55 74 66 54 6f 55 6e rc += TclUtfToUn
4e80: 69 43 68 61 72 28 73 72 63 2c 20 26 63 68 29 3b iChar(src, &ch);
4e90: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
4ea0: 20 20 72 65 74 75 72 6e 20 73 72 63 3b 0a 7d 0a return src;.}.
4eb0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
4ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f00: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 66 --. *. * Tcl_Utf
4f10: 42 61 63 6b 73 6c 61 73 68 20 2d 2d 0a 20 2a 0a Backslash --. *.
4f20: 20 2a 09 46 69 67 75 72 65 20 6f 75 74 20 68 6f *.Figure out ho
4f30: 77 20 74 6f 20 68 61 6e 64 6c 65 20 61 20 62 61 w to handle a ba
4f40: 63 6b 73 6c 61 73 68 20 73 65 71 75 65 6e 63 65 ckslash sequence
4f50: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4f60: 0a 20 2a 09 53 74 6f 72 65 73 20 74 68 65 20 62 . *.Stores the b
4f70: 79 74 65 73 20 72 65 70 72 65 73 65 6e 74 65 64 ytes represented
4f80: 20 62 79 20 74 68 65 20 62 61 63 6b 73 6c 61 73 by the backslas
4f90: 68 20 73 65 71 75 65 6e 63 65 20 69 6e 20 64 73 h sequence in ds
4fa0: 74 20 61 6e 64 0a 20 2a 09 72 65 74 75 72 6e 73 t and. *.returns
4fb0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
4fc0: 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 ytes written to
4fd0: 64 73 74 2e 20 41 74 20 6d 6f 73 74 20 54 43 4c dst. At most TCL
4fe0: 5f 55 54 46 5f 4d 41 58 20 62 79 74 65 73 0a 20 _UTF_MAX bytes.
4ff0: 2a 09 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f *.are written to
5000: 20 64 73 74 3b 20 64 73 74 20 6d 75 73 74 20 68 dst; dst must h
5010: 61 76 65 20 62 65 65 6e 20 6c 61 72 67 65 20 65 ave been large e
5020: 6e 6f 75 67 68 20 74 6f 20 61 63 63 65 70 74 20 nough to accept
5030: 74 68 6f 73 65 0a 20 2a 09 62 79 74 65 73 2e 20 those. *.bytes.
5040: 49 66 20 72 65 61 64 50 74 72 20 69 73 6e 27 74 If readPtr isn't
5050: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 NULL then it is
5060: 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 filled in with
5070: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 0a 20 a count of the.
5080: 2a 09 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 *.number of byte
5090: 73 20 69 6e 20 74 68 65 20 62 61 63 6b 73 6c 61 s in the backsla
50a0: 73 68 20 73 65 71 75 65 6e 63 65 2e 0a 20 2a 0a sh sequence.. *.
50b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
50c0: 0a 20 2a 09 54 68 65 20 6d 61 78 69 6d 75 6d 20 . *.The maximum
50d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
50e0: 69 74 20 74 61 6b 65 73 20 74 6f 20 72 65 70 72 it takes to repr
50f0: 65 73 65 6e 74 20 61 20 55 6e 69 63 6f 64 65 20 esent a Unicode
5100: 63 68 61 72 61 63 74 65 72 0a 20 2a 09 69 6e 20 character. *.in
5110: 55 54 46 2d 38 20 69 73 20 67 75 61 72 61 6e 74 UTF-8 is guarant
5120: 65 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 eed to be less t
5130: 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f han the number o
5140: 66 20 62 79 74 65 73 20 75 73 65 64 20 74 6f 0a f bytes used to.
5150: 20 2a 09 65 78 70 72 65 73 73 20 74 68 65 20 62 *.express the b
5160: 61 63 6b 73 6c 61 73 68 20 73 65 71 75 65 6e 63 ackslash sequenc
5170: 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 e that represent
5180: 73 20 74 68 61 74 20 55 6e 69 63 6f 64 65 20 63 s that Unicode c
5190: 68 61 72 61 63 74 65 72 2e 0a 20 2a 09 49 66 20 haracter.. *.If
51a0: 74 68 65 20 74 61 72 67 65 74 20 62 75 66 66 65 the target buffe
51b0: 72 20 69 6e 74 6f 20 77 68 69 63 68 20 74 68 65 r into which the
51c0: 20 63 61 6c 6c 65 72 20 69 73 20 67 6f 69 6e 67 caller is going
51d0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 62 79 to store the by
51e0: 74 65 73 0a 20 2a 09 74 68 61 74 20 72 65 70 72 tes. *.that repr
51f0: 65 73 65 6e 74 20 74 68 65 20 55 6e 69 63 6f 64 esent the Unicod
5200: 65 20 63 68 61 72 61 63 74 65 72 20 69 73 20 61 e character is a
5210: 74 20 6c 65 61 73 74 20 61 73 20 6c 61 72 67 65 t least as large
5220: 20 61 73 20 74 68 65 0a 20 2a 09 73 6f 75 72 63 as the. *.sourc
5230: 65 20 62 75 66 66 65 72 20 66 72 6f 6d 20 77 68 e buffer from wh
5240: 69 63 68 20 74 68 65 20 62 61 63 6b 73 6c 61 73 ich the backslas
5250: 68 65 64 20 73 65 71 75 65 6e 63 65 20 77 61 73 hed sequence was
5260: 20 65 78 74 72 61 63 74 65 64 2c 20 6e 6f 0a 20 extracted, no.
5270: 2a 09 62 75 66 66 65 72 20 6f 76 65 72 72 75 6e *.buffer overrun
5280: 73 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 2e 0a s should occur..
5290: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
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: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 74 . */..int.Tcl_Ut
52f0: 66 42 61 63 6b 73 6c 61 73 68 28 0a 20 20 20 20 fBackslash(.
5300: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 72 63 2c const char *src,
5310: 09 09 2f 2a 20 50 6f 69 6e 74 73 20 74 6f 20 74 ../* Points to t
5320: 68 65 20 62 61 63 6b 73 6c 61 73 68 20 63 68 61 he backslash cha
5330: 72 61 63 74 65 72 20 6f 66 20 61 0a 09 09 09 09 racter of a.....
5340: 20 2a 20 62 61 63 6b 73 6c 61 73 68 20 73 65 71 * backslash seq
5350: 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 69 6e uence. */. in
5360: 74 20 2a 72 65 61 64 50 74 72 2c 09 09 2f 2a 20 t *readPtr,../*
5370: 46 69 6c 6c 20 69 6e 20 77 69 74 68 20 6e 75 6d Fill in with num
5380: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 ber of character
5390: 73 20 72 65 61 64 20 66 72 6f 6d 0a 09 09 09 09 s read from.....
53a0: 20 2a 20 73 72 63 2c 20 75 6e 6c 65 73 73 20 4e * src, unless N
53b0: 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 ULL. */. char
53c0: 20 2a 64 73 74 29 09 09 09 2f 2a 20 46 69 6c 6c *dst).../* Fill
53d0: 65 64 20 77 69 74 68 20 74 68 65 20 62 79 74 65 ed with the byte
53e0: 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 s represented by
53f0: 20 74 68 65 0a 09 09 09 09 20 2a 20 62 61 63 6b the..... * back
5400: 73 6c 61 73 68 20 73 65 71 75 65 6e 63 65 2e 20 slash sequence.
5410: 2a 2f 0a 7b 0a 23 64 65 66 69 6e 65 20 4c 49 4e */.{.#define LIN
5420: 45 5f 4c 45 4e 47 54 48 20 31 32 38 0a 20 20 20 E_LENGTH 128.
5430: 20 69 6e 74 20 6e 75 6d 52 65 61 64 3b 0a 20 20 int numRead;.
5440: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 20 int result;..
5450: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 50 result = TclP
5460: 61 72 73 65 42 61 63 6b 73 6c 61 73 68 28 73 72 arseBackslash(sr
5470: 63 2c 20 4c 49 4e 45 5f 4c 45 4e 47 54 48 2c 20 c, LINE_LENGTH,
5480: 26 6e 75 6d 52 65 61 64 2c 20 64 73 74 29 3b 0a &numRead, dst);.
5490: 20 20 20 20 69 66 20 28 6e 75 6d 52 65 61 64 20 if (numRead
54a0: 3d 3d 20 4c 49 4e 45 5f 4c 45 4e 47 54 48 29 20 == LINE_LENGTH)
54b0: 7b 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 61 74 65 {../*.. * We ate
54c0: 20 61 20 77 68 6f 6c 65 20 6c 69 6e 65 2e 20 50 a whole line. P
54d0: 61 79 20 74 68 65 20 70 72 69 63 65 20 6f 66 20 ay the price of
54e0: 61 20 73 74 72 6c 65 6e 28 29 0a 09 20 2a 2f 0a a strlen().. */.
54f0: 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 50 61 ..result = TclPa
5500: 72 73 65 42 61 63 6b 73 6c 61 73 68 28 73 72 63 rseBackslash(src
5510: 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 73 72 , (int)strlen(sr
5520: 63 29 2c 20 26 6e 75 6d 52 65 61 64 2c 20 64 73 c), &numRead, ds
5530: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 t);. }. if
5540: 20 28 72 65 61 64 50 74 72 20 21 3d 20 4e 55 4c (readPtr != NUL
5550: 4c 29 20 7b 0a 09 2a 72 65 61 64 50 74 72 20 3d L) {..*readPtr =
5560: 20 6e 75 6d 52 65 61 64 3b 0a 20 20 20 20 7d 0a numRead;. }.
5570: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
5580: 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d t;.}.../*. *----
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55d0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 66 --. *. * Tcl_Utf
55e0: 54 6f 55 70 70 65 72 20 2d 2d 0a 20 2a 0a 20 2a ToUpper --. *. *
55f0: 09 43 6f 6e 76 65 72 74 20 6c 6f 77 65 72 63 61 .Convert lowerca
5600: 73 65 20 63 68 61 72 61 63 74 65 72 73 20 74 6f se characters to
5610: 20 75 70 70 65 72 63 61 73 65 20 63 68 61 72 61 uppercase chara
5620: 63 74 65 72 73 20 69 6e 20 61 20 55 54 46 20 73 cters in a UTF s
5630: 74 72 69 6e 67 0a 20 2a 09 69 6e 20 70 6c 61 63 tring. *.in plac
5640: 65 2e 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f e. The conversio
5650: 6e 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 n may shrink the
5660: 20 55 54 46 20 73 74 72 69 6e 67 2e 0a 20 2a 0a UTF string.. *.
5670: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 * Results:. *.R
5680: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 eturns the numbe
5690: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 r of bytes in th
56a0: 65 20 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69 e resulting stri
56b0: 6e 67 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 ng excluding the
56c0: 0a 20 2a 09 74 72 61 69 6c 69 6e 67 20 6e 75 6c . *.trailing nul
56d0: 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 l.. *. * Side ef
56e0: 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 fects:. *.Writes
56f0: 20 61 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e a terminating n
5700: 75 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6c 61 ull after the la
5710: 73 74 20 63 6f 6e 76 65 72 74 65 64 20 63 68 61 st converted cha
5720: 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d racter.. *. *---
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
5780: 5f 55 74 66 54 6f 55 70 70 65 72 28 0a 20 20 20 _UtfToUpper(.
5790: 20 63 68 61 72 20 2a 73 74 72 29 09 09 09 2f 2a char *str).../*
57a0: 20 53 74 72 69 6e 67 20 74 6f 20 63 6f 6e 76 65 String to conve
57b0: 72 74 20 69 6e 20 70 6c 61 63 65 2e 20 2a 2f 0a rt in place. */.
57c0: 7b 0a 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 {. Tcl_UniCha
57d0: 72 20 63 68 20 3d 20 30 2c 20 75 70 43 68 61 72 r ch = 0, upChar
57e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 72 63 2c ;. char *src,
57f0: 20 2a 64 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 *dst;. int b
5800: 79 74 65 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ytes;.. /*.
5810: 20 20 20 2a 20 49 74 65 72 61 74 65 20 6f 76 65 * Iterate ove
5820: 72 20 74 68 65 20 73 74 72 69 6e 67 20 75 6e 74 r the string unt
5830: 69 6c 20 77 65 20 68 69 74 20 74 68 65 20 74 65 il we hit the te
5840: 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 2e 0a rminating null..
5850: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 72 63 */.. src
5860: 20 3d 20 64 73 74 20 3d 20 73 74 72 3b 0a 20 20 = dst = str;.
5870: 20 20 77 68 69 6c 65 20 28 2a 73 72 63 29 20 7b while (*src) {
5880: 0a 09 62 79 74 65 73 20 3d 20 54 63 6c 55 74 66 ..bytes = TclUtf
5890: 54 6f 55 6e 69 43 68 61 72 28 73 72 63 2c 20 26 ToUniChar(src, &
58a0: 63 68 29 3b 0a 09 75 70 43 68 61 72 20 3d 20 54 ch);..upChar = T
58b0: 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 70 70 65 cl_UniCharToUppe
58c0: 72 28 63 68 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 r(ch);.../*.. *
58d0: 54 6f 20 6b 65 65 70 20 62 61 64 6c 79 20 66 6f To keep badly fo
58e0: 72 6d 65 64 20 55 74 66 20 73 74 72 69 6e 67 73 rmed Utf strings
58f0: 20 66 72 6f 6d 20 67 65 74 74 69 6e 67 20 69 6e from getting in
5900: 66 6c 61 74 65 64 20 62 79 20 74 68 65 0a 09 20 flated by the..
5910: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20 28 74 68 * conversion (th
5920: 65 72 65 62 79 20 63 61 75 73 69 6e 67 20 61 20 ereby causing a
5930: 73 65 67 66 61 75 6c 74 29 2c 20 6f 6e 6c 79 20 segfault), only
5940: 63 6f 70 79 20 74 68 65 20 75 70 70 65 72 20 63 copy the upper c
5950: 61 73 65 0a 09 20 2a 20 63 68 61 72 20 74 6f 20 ase.. * char to
5960: 64 73 74 20 69 66 20 69 74 73 20 73 69 7a 65 20 dst if its size
5970: 69 73 20 3c 3d 20 74 68 65 20 6f 72 69 67 69 6e is <= the origin
5980: 61 6c 20 63 68 61 72 2e 0a 09 20 2a 2f 0a 0a 09 al char... */...
5990: 69 66 20 28 62 79 74 65 73 20 3c 20 55 74 66 43 if (bytes < UtfC
59a0: 6f 75 6e 74 28 75 70 43 68 61 72 29 29 20 7b 0a ount(upChar)) {.
59b0: 09 20 20 20 20 6d 65 6d 63 70 79 28 64 73 74 2c . memcpy(dst,
59c0: 20 73 72 63 2c 20 28 73 69 7a 65 5f 74 29 20 62 src, (size_t) b
59d0: 79 74 65 73 29 3b 0a 09 20 20 20 20 64 73 74 20 ytes);.. dst
59e0: 2b 3d 20 62 79 74 65 73 3b 0a 09 7d 20 65 6c 73 += bytes;..} els
59f0: 65 20 7b 0a 09 20 20 20 20 64 73 74 20 2b 3d 20 e {.. dst +=
5a00: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 74 66 Tcl_UniCharToUtf
5a10: 28 75 70 43 68 61 72 2c 20 64 73 74 29 3b 0a 09 (upChar, dst);..
5a20: 7d 0a 09 73 72 63 20 2b 3d 20 62 79 74 65 73 3b }..src += bytes;
5a30: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 64 73 74 20 . }. *dst
5a40: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72 65 74 75 = '\0';. retu
5a50: 72 6e 20 28 64 73 74 20 2d 20 73 74 72 29 3b 0a rn (dst - str);.
5a60: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5ab0: 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 66 54 6f 4c *. * Tcl_UtfToL
5ac0: 6f 77 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f ower --. *. *.Co
5ad0: 6e 76 65 72 74 20 75 70 70 65 72 63 61 73 65 20 nvert uppercase
5ae0: 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 6c 6f characters to lo
5af0: 77 65 72 63 61 73 65 20 63 68 61 72 61 63 74 65 wercase characte
5b00: 72 73 20 69 6e 20 61 20 55 54 46 20 73 74 72 69 rs in a UTF stri
5b10: 6e 67 0a 20 2a 09 69 6e 20 70 6c 61 63 65 2e 20 ng. *.in place.
5b20: 54 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 6d The conversion m
5b30: 61 79 20 73 68 72 69 6e 6b 20 74 68 65 20 55 54 ay shrink the UT
5b40: 46 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 F string.. *. *
5b50: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
5b60: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f rns the number o
5b70: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 f bytes in the r
5b80: 65 73 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 20 esulting string
5b90: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 0a 20 2a excluding the. *
5ba0: 09 74 72 61 69 6c 69 6e 67 20 6e 75 6c 6c 2e 0a .trailing null..
5bb0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
5bc0: 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 61 20 ts:. *.Writes a
5bd0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c terminating null
5be0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 after the last
5bf0: 63 6f 6e 76 65 72 74 65 64 20 63 68 61 72 61 63 converted charac
5c00: 74 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ter.. *. *------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c50: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 74 . */..int.Tcl_Ut
5c60: 66 54 6f 4c 6f 77 65 72 28 0a 20 20 20 20 63 68 fToLower(. ch
5c70: 61 72 20 2a 73 74 72 29 09 09 09 2f 2a 20 53 74 ar *str).../* St
5c80: 72 69 6e 67 20 74 6f 20 63 6f 6e 76 65 72 74 20 ring to convert
5c90: 69 6e 20 70 6c 61 63 65 2e 20 2a 2f 0a 7b 0a 20 in place. */.{.
5ca0: 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 63 Tcl_UniChar c
5cb0: 68 20 3d 20 30 2c 20 6c 6f 77 43 68 61 72 3b 0a h = 0, lowChar;.
5cc0: 20 20 20 20 63 68 61 72 20 2a 73 72 63 2c 20 2a char *src, *
5cd0: 64 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 dst;. int byt
5ce0: 65 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 es;.. /*.
5cf0: 20 2a 20 49 74 65 72 61 74 65 20 6f 76 65 72 20 * Iterate over
5d00: 74 68 65 20 73 74 72 69 6e 67 20 75 6e 74 69 6c the string until
5d10: 20 77 65 20 68 69 74 20 74 68 65 20 74 65 72 6d we hit the term
5d20: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 2e 0a 20 20 inating null..
5d30: 20 20 20 2a 2f 0a 0a 20 20 20 20 73 72 63 20 3d */.. src =
5d40: 20 64 73 74 20 3d 20 73 74 72 3b 0a 20 20 20 20 dst = str;.
5d50: 77 68 69 6c 65 20 28 2a 73 72 63 29 20 7b 0a 09 while (*src) {..
5d60: 62 79 74 65 73 20 3d 20 54 63 6c 55 74 66 54 6f bytes = TclUtfTo
5d70: 55 6e 69 43 68 61 72 28 73 72 63 2c 20 26 63 68 UniChar(src, &ch
5d80: 29 3b 0a 09 6c 6f 77 43 68 61 72 20 3d 20 54 63 );..lowChar = Tc
5d90: 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 l_UniCharToLower
5da0: 28 63 68 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 54 (ch);.../*.. * T
5db0: 6f 20 6b 65 65 70 20 62 61 64 6c 79 20 66 6f 72 o keep badly for
5dc0: 6d 65 64 20 55 74 66 20 73 74 72 69 6e 67 73 20 med Utf strings
5dd0: 66 72 6f 6d 20 67 65 74 74 69 6e 67 20 69 6e 66 from getting inf
5de0: 6c 61 74 65 64 20 62 79 20 74 68 65 0a 09 20 2a lated by the.. *
5df0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 28 74 68 65 conversion (the
5e00: 72 65 62 79 20 63 61 75 73 69 6e 67 20 61 20 73 reby causing a s
5e10: 65 67 66 61 75 6c 74 29 2c 20 6f 6e 6c 79 20 63 egfault), only c
5e20: 6f 70 79 20 74 68 65 20 6c 6f 77 65 72 20 63 61 opy the lower ca
5e30: 73 65 0a 09 20 2a 20 63 68 61 72 20 74 6f 20 64 se.. * char to d
5e40: 73 74 20 69 66 20 69 74 73 20 73 69 7a 65 20 69 st if its size i
5e50: 73 20 3c 3d 20 74 68 65 20 6f 72 69 67 69 6e 61 s <= the origina
5e60: 6c 20 63 68 61 72 2e 0a 09 20 2a 2f 0a 0a 09 69 l char... */...i
5e70: 66 20 28 62 79 74 65 73 20 3c 20 55 74 66 43 6f f (bytes < UtfCo
5e80: 75 6e 74 28 6c 6f 77 43 68 61 72 29 29 20 7b 0a unt(lowChar)) {.
5e90: 09 20 20 20 20 6d 65 6d 63 70 79 28 64 73 74 2c . memcpy(dst,
5ea0: 20 73 72 63 2c 20 28 73 69 7a 65 5f 74 29 20 62 src, (size_t) b
5eb0: 79 74 65 73 29 3b 0a 09 20 20 20 20 64 73 74 20 ytes);.. dst
5ec0: 2b 3d 20 62 79 74 65 73 3b 0a 09 7d 20 65 6c 73 += bytes;..} els
5ed0: 65 20 7b 0a 09 20 20 20 20 64 73 74 20 2b 3d 20 e {.. dst +=
5ee0: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 74 66 Tcl_UniCharToUtf
5ef0: 28 6c 6f 77 43 68 61 72 2c 20 64 73 74 29 3b 0a (lowChar, dst);.
5f00: 09 7d 0a 09 73 72 63 20 2b 3d 20 62 79 74 65 73 .}..src += bytes
5f10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 64 73 74 ;. }. *dst
5f20: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72 65 74 = '\0';. ret
5f30: 75 72 6e 20 28 64 73 74 20 2d 20 73 74 72 29 3b urn (dst - str);
5f40: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f90: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 74 66 54 6f . *. * Tcl_UtfTo
5fa0: 54 69 74 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43 Title --. *. *.C
5fb0: 68 61 6e 67 65 73 20 74 68 65 20 66 69 72 73 74 hanges the first
5fc0: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 20 character of a
5fd0: 55 54 46 20 73 74 72 69 6e 67 20 74 6f 20 74 69 UTF string to ti
5fe0: 74 6c 65 20 63 61 73 65 20 6f 72 20 75 70 70 65 tle case or uppe
5ff0: 72 63 61 73 65 0a 20 2a 09 61 6e 64 20 74 68 65 rcase. *.and the
6000: 20 72 65 73 74 20 6f 66 20 74 68 65 20 73 74 72 rest of the str
6010: 69 6e 67 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 ing to lowercase
6020: 2e 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e . The conversion
6030: 20 68 61 70 70 65 6e 73 20 69 6e 0a 20 2a 09 70 happens in. *.p
6040: 6c 61 63 65 20 61 6e 64 20 6d 61 79 20 73 68 72 lace and may shr
6050: 69 6e 6b 20 74 68 65 20 55 54 46 20 73 74 72 69 ink the UTF stri
6060: 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ng.. *. * Result
6070: 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 s:. *.Returns th
6080: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 e number of byte
6090: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 69 s in the resulti
60a0: 6e 67 20 73 74 72 69 6e 67 20 65 78 63 6c 75 64 ng string exclud
60b0: 69 6e 67 20 74 68 65 0a 20 2a 09 74 72 61 69 6c ing the. *.trail
60c0: 69 6e 67 20 6e 75 6c 6c 2e 0a 20 2a 0a 20 2a 20 ing null.. *. *
60d0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
60e0: 09 57 72 69 74 65 73 20 61 20 74 65 72 6d 69 6e .Writes a termin
60f0: 61 74 69 6e 67 20 6e 75 6c 6c 20 61 66 74 65 72 ating null after
6100: 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 76 65 72 the last conver
6110: 74 65 64 20 63 68 61 72 61 63 74 65 72 2e 0a 20 ted character..
6120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
6170: 69 6e 74 0a 54 63 6c 5f 55 74 66 54 6f 54 69 74 int.Tcl_UtfToTit
6180: 6c 65 28 0a 20 20 20 20 63 68 61 72 20 2a 73 74 le(. char *st
6190: 72 29 09 09 09 2f 2a 20 53 74 72 69 6e 67 20 74 r).../* String t
61a0: 6f 20 63 6f 6e 76 65 72 74 20 69 6e 20 70 6c 61 o convert in pla
61b0: 63 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c ce. */.{. Tcl
61c0: 5f 55 6e 69 43 68 61 72 20 63 68 20 3d 20 30 2c _UniChar ch = 0,
61d0: 20 74 69 74 6c 65 43 68 61 72 2c 20 6c 6f 77 43 titleChar, lowC
61e0: 68 61 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 har;. char *s
61f0: 72 63 2c 20 2a 64 73 74 3b 0a 20 20 20 20 69 6e rc, *dst;. in
6200: 74 20 62 79 74 65 73 3b 0a 0a 20 20 20 20 2f 2a t bytes;.. /*
6210: 0a 20 20 20 20 20 2a 20 43 61 70 69 74 61 6c 69 . * Capitali
6220: 7a 65 20 74 68 65 20 66 69 72 73 74 20 63 68 61 ze the first cha
6230: 72 61 63 74 65 72 20 61 6e 64 20 74 68 65 6e 20 racter and then
6240: 6c 6f 77 65 72 63 61 73 65 20 74 68 65 20 72 65 lowercase the re
6250: 73 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 2a st of the. *
6260: 20 63 68 61 72 61 63 74 65 72 73 20 75 6e 74 69 characters unti
6270: 6c 20 77 65 20 67 65 74 20 74 6f 20 61 20 6e 75 l we get to a nu
6280: 6c 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ll.. */..
6290: 20 73 72 63 20 3d 20 64 73 74 20 3d 20 73 74 72 src = dst = str
62a0: 3b 0a 0a 20 20 20 20 69 66 20 28 2a 73 72 63 29 ;.. if (*src)
62b0: 20 7b 0a 09 62 79 74 65 73 20 3d 20 54 63 6c 55 {..bytes = TclU
62c0: 74 66 54 6f 55 6e 69 43 68 61 72 28 73 72 63 2c tfToUniChar(src,
62d0: 20 26 63 68 29 3b 0a 09 74 69 74 6c 65 43 68 61 &ch);..titleCha
62e0: 72 20 3d 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 r = Tcl_UniCharT
62f0: 6f 54 69 74 6c 65 28 63 68 29 3b 0a 0a 09 69 66 oTitle(ch);...if
6300: 20 28 62 79 74 65 73 20 3c 20 55 74 66 43 6f 75 (bytes < UtfCou
6310: 6e 74 28 74 69 74 6c 65 43 68 61 72 29 29 20 7b nt(titleChar)) {
6320: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 64 73 74 .. memcpy(dst
6330: 2c 20 73 72 63 2c 20 28 73 69 7a 65 5f 74 29 20 , src, (size_t)
6340: 62 79 74 65 73 29 3b 0a 09 20 20 20 20 64 73 74 bytes);.. dst
6350: 20 2b 3d 20 62 79 74 65 73 3b 0a 09 7d 20 65 6c += bytes;..} el
6360: 73 65 20 7b 0a 09 20 20 20 20 64 73 74 20 2b 3d se {.. dst +=
6370: 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 74 Tcl_UniCharToUt
6380: 66 28 74 69 74 6c 65 43 68 61 72 2c 20 64 73 74 f(titleChar, dst
6390: 29 3b 0a 09 7d 0a 09 73 72 63 20 2b 3d 20 62 79 );..}..src += by
63a0: 74 65 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 tes;. }. w
63b0: 68 69 6c 65 20 28 2a 73 72 63 29 20 7b 0a 09 62 hile (*src) {..b
63c0: 79 74 65 73 20 3d 20 54 63 6c 55 74 66 54 6f 55 ytes = TclUtfToU
63d0: 6e 69 43 68 61 72 28 73 72 63 2c 20 26 63 68 29 niChar(src, &ch)
63e0: 3b 0a 09 6c 6f 77 43 68 61 72 20 3d 20 63 68 3b ;..lowChar = ch;
63f0: 0a 09 2f 2a 20 53 70 65 63 69 61 6c 20 65 78 63 ../* Special exc
6400: 65 70 74 69 6f 6e 20 66 6f 72 20 47 65 6f 72 67 eption for Georg
6410: 69 61 6e 20 41 73 6f 6d 74 61 76 72 75 6c 69 20 ian Asomtavruli
6420: 63 68 61 72 73 2c 20 6e 6f 20 74 69 74 6c 65 63 chars, no titlec
6430: 61 73 65 2e 20 2a 2f 0a 09 69 66 20 28 28 75 6e ase. */..if ((un
6440: 73 69 67 6e 65 64 29 28 6c 6f 77 43 68 61 72 20 signed)(lowChar
6450: 2d 20 30 78 31 43 39 30 29 20 3e 3d 20 30 78 33 - 0x1C90) >= 0x3
6460: 30 29 20 7b 0a 09 20 20 20 20 6c 6f 77 43 68 61 0) {.. lowCha
6470: 72 20 3d 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 r = Tcl_UniCharT
6480: 6f 4c 6f 77 65 72 28 6c 6f 77 43 68 61 72 29 3b oLower(lowChar);
6490: 0a 09 7d 0a 0a 09 69 66 20 28 62 79 74 65 73 20 ..}...if (bytes
64a0: 3c 20 55 74 66 43 6f 75 6e 74 28 6c 6f 77 43 68 < UtfCount(lowCh
64b0: 61 72 29 29 20 7b 0a 09 20 20 20 20 6d 65 6d 63 ar)) {.. memc
64c0: 70 79 28 64 73 74 2c 20 73 72 63 2c 20 28 73 69 py(dst, src, (si
64d0: 7a 65 5f 74 29 20 62 79 74 65 73 29 3b 0a 09 20 ze_t) bytes);..
64e0: 20 20 20 64 73 74 20 2b 3d 20 62 79 74 65 73 3b dst += bytes;
64f0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
6500: 64 73 74 20 2b 3d 20 54 63 6c 5f 55 6e 69 43 68 dst += Tcl_UniCh
6510: 61 72 54 6f 55 74 66 28 6c 6f 77 43 68 61 72 2c arToUtf(lowChar,
6520: 20 64 73 74 29 3b 0a 09 7d 0a 09 73 72 63 20 2b dst);..}..src +
6530: 3d 20 62 79 74 65 73 3b 0a 20 20 20 20 7d 0a 20 = bytes;. }.
6540: 20 20 20 2a 64 73 74 20 3d 20 27 5c 30 27 3b 0a *dst = '\0';.
6550: 20 20 20 20 72 65 74 75 72 6e 20 28 64 73 74 20 return (dst
6560: 2d 20 73 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 - str);.}.../*.
6570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
65c0: 6c 70 55 74 66 4e 63 6d 70 32 20 2d 2d 0a 20 2a lpUtfNcmp2 --. *
65d0: 0a 20 2a 09 43 6f 6d 70 61 72 65 20 61 74 20 6d . *.Compare at m
65e0: 6f 73 74 20 6e 75 6d 42 79 74 65 73 20 62 79 74 ost numBytes byt
65f0: 65 73 20 6f 66 20 75 74 66 2d 38 20 73 74 72 69 es of utf-8 stri
6600: 6e 67 73 20 63 73 20 61 6e 64 20 63 74 2e 20 42 ngs cs and ct. B
6610: 6f 74 68 20 63 73 20 61 6e 64 0a 20 2a 09 63 74 oth cs and. *.ct
6620: 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 are assumed to
6630: 62 65 20 61 74 20 6c 65 61 73 74 20 6e 75 6d 42 be at least numB
6640: 79 74 65 73 20 62 79 74 65 73 20 6c 6f 6e 67 2e ytes bytes long.
6650: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
6660: 20 2a 09 52 65 74 75 72 6e 20 3c 30 20 69 66 20 *.Return <0 if
6670: 63 73 20 3c 20 63 74 2c 20 30 20 69 66 20 63 73 cs < ct, 0 if cs
6680: 20 3d 3d 20 63 74 2c 20 6f 72 20 3e 30 20 69 66 == ct, or >0 if
6690: 20 63 73 20 3e 20 63 74 2e 0a 20 2a 0a 20 2a 20 cs > ct.. *. *
66a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
66b0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6700: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 --. */..int.Tclp
6710: 55 74 66 4e 63 6d 70 32 28 0a 20 20 20 20 63 6f UtfNcmp2(. co
6720: 6e 73 74 20 63 68 61 72 20 2a 63 73 2c 09 09 2f nst char *cs,../
6730: 2a 20 55 54 46 20 73 74 72 69 6e 67 20 74 6f 20 * UTF string to
6740: 63 6f 6d 70 61 72 65 20 74 6f 20 63 74 2e 20 2a compare to ct. *
6750: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 /. const char
6760: 20 2a 63 74 2c 09 09 2f 2a 20 55 54 46 20 73 74 *ct,../* UTF st
6770: 72 69 6e 67 20 63 73 20 69 73 20 63 6f 6d 70 61 ring cs is compa
6780: 72 65 64 20 74 6f 2e 20 2a 2f 0a 20 20 20 20 75 red to. */. u
6790: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d nsigned long num
67a0: 42 79 74 65 73 29 09 2f 2a 20 4e 75 6d 62 65 72 Bytes)./* Number
67b0: 20 6f 66 20 2a 62 79 74 65 73 2a 20 74 6f 20 63 of *bytes* to c
67c0: 6f 6d 70 61 72 65 2e 20 2a 2f 0a 7b 0a 20 20 20 ompare. */.{.
67d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 63 61 /*. * We ca
67e0: 6e 27 74 20 73 69 6d 70 6c 79 20 63 61 6c 6c 20 n't simply call
67f0: 27 6d 65 6d 63 6d 70 28 63 73 2c 20 63 74 2c 20 'memcmp(cs, ct,
6800: 6e 75 6d 42 79 74 65 73 29 3b 27 20 62 65 63 61 numBytes);' beca
6810: 75 73 65 20 77 65 20 6e 65 65 64 20 74 6f 0a 20 use we need to.
6820: 20 20 20 20 2a 20 63 68 65 63 6b 20 66 6f 72 20 * check for
6830: 54 63 6c 27 73 20 5c 78 43 30 5c 78 38 30 20 6e Tcl's \xC0\x80 n
6840: 6f 6e 2d 75 74 66 2d 38 20 6e 75 6c 6c 20 65 6e on-utf-8 null en
6850: 63 6f 64 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 coding. Otherwis
6860: 65 20 75 74 66 2d 38 20 6c 65 78 65 73 0a 20 20 e utf-8 lexes.
6870: 20 20 20 2a 20 66 69 6e 65 20 69 6e 20 74 68 65 * fine in the
6880: 20 73 74 72 63 6d 70 20 6d 61 6e 6e 65 72 2e 0a strcmp manner..
6890: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 67 */.. reg
68a0: 69 73 74 65 72 20 69 6e 74 20 72 65 73 75 6c 74 ister int result
68b0: 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 20 28 = 0;.. for (
68c0: 20 3b 20 6e 75 6d 42 79 74 65 73 20 21 3d 20 30 ; numBytes != 0
68d0: 3b 20 6e 75 6d 42 79 74 65 73 2d 2d 2c 20 63 73 ; numBytes--, cs
68e0: 2b 2b 2c 20 63 74 2b 2b 29 20 7b 0a 09 69 66 20 ++, ct++) {..if
68f0: 28 2a 63 73 20 21 3d 20 2a 63 74 29 20 7b 0a 09 (*cs != *ct) {..
6900: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 55 43 48 result = UCH
6910: 41 52 28 2a 63 73 29 20 2d 20 55 43 48 41 52 28 AR(*cs) - UCHAR(
6920: 2a 63 74 29 3b 0a 09 20 20 20 20 62 72 65 61 6b *ct);.. break
6930: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 ;..}. }. i
6940: 66 20 28 6e 75 6d 42 79 74 65 73 20 26 26 20 28 f (numBytes && (
6950: 28 55 43 48 41 52 28 2a 63 73 29 20 3d 3d 20 30 (UCHAR(*cs) == 0
6960: 78 43 30 29 20 7c 7c 20 28 55 43 48 41 52 28 2a xC0) || (UCHAR(*
6970: 63 74 29 20 3d 3d 20 30 78 43 30 29 29 29 20 7b ct) == 0xC0))) {
6980: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 ..unsigned char
6990: 63 31 2c 20 63 32 3b 0a 0a 09 63 31 20 3d 20 28 c1, c2;...c1 = (
69a0: 28 55 43 48 41 52 28 2a 63 73 29 20 3d 3d 20 30 (UCHAR(*cs) == 0
69b0: 78 43 30 29 20 26 26 20 28 55 43 48 41 52 28 63 xC0) && (UCHAR(c
69c0: 73 5b 31 5d 29 20 3d 3d 20 30 78 38 30 29 29 20 s[1]) == 0x80))
69d0: 3f 20 30 20 3a 20 55 43 48 41 52 28 2a 63 73 29 ? 0 : UCHAR(*cs)
69e0: 3b 0a 09 63 32 20 3d 20 28 28 55 43 48 41 52 28 ;..c2 = ((UCHAR(
69f0: 2a 63 74 29 20 3d 3d 20 30 78 43 30 29 20 26 26 *ct) == 0xC0) &&
6a00: 20 28 55 43 48 41 52 28 63 74 5b 31 5d 29 20 3d (UCHAR(ct[1]) =
6a10: 3d 20 30 78 38 30 29 29 20 3f 20 30 20 3a 20 55 = 0x80)) ? 0 : U
6a20: 43 48 41 52 28 2a 63 74 29 3b 0a 09 72 65 73 75 CHAR(*ct);..resu
6a30: 6c 74 20 3d 20 28 63 31 20 2d 20 63 32 29 3b 0a lt = (c1 - c2);.
6a40: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
6a50: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a result;.}.../*.
6a60: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
6ab0: 63 6c 5f 55 74 66 4e 63 6d 70 20 2d 2d 0a 20 2a cl_UtfNcmp --. *
6ac0: 0a 20 2a 09 43 6f 6d 70 61 72 65 20 61 74 20 6d . *.Compare at m
6ad0: 6f 73 74 20 6e 75 6d 43 68 61 72 73 20 55 54 46 ost numChars UTF
6ae0: 20 63 68 61 72 73 20 6f 66 20 73 74 72 69 6e 67 chars of string
6af0: 20 63 73 20 74 6f 20 73 74 72 69 6e 67 20 63 74 cs to string ct
6b00: 2e 20 42 6f 74 68 20 63 73 0a 20 2a 09 61 6e 64 . Both cs. *.and
6b10: 20 63 74 20 61 72 65 20 61 73 73 75 6d 65 64 20 ct are assumed
6b20: 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e to be at least n
6b30: 75 6d 43 68 61 72 73 20 55 54 46 20 63 68 61 72 umChars UTF char
6b40: 73 20 6c 6f 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 s long.. *. * Re
6b50: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
6b60: 20 3c 30 20 69 66 20 63 73 20 3c 20 63 74 2c 20 <0 if cs < ct,
6b70: 30 20 69 66 20 63 73 20 3d 3d 20 63 74 2c 20 6f 0 if cs == ct, o
6b80: 72 20 3e 30 20 69 66 20 63 73 20 3e 20 63 74 2e r >0 if cs > ct.
6b90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6ba0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
6bb0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 ---------. */..i
6c00: 6e 74 0a 54 63 6c 5f 55 74 66 4e 63 6d 70 28 0a nt.Tcl_UtfNcmp(.
6c10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
6c20: 63 73 2c 09 09 2f 2a 20 55 54 46 20 73 74 72 69 cs,../* UTF stri
6c30: 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f ng to compare to
6c40: 20 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 ct. */. cons
6c50: 74 20 63 68 61 72 20 2a 63 74 2c 09 09 2f 2a 20 t char *ct,../*
6c60: 55 54 46 20 73 74 72 69 6e 67 20 63 73 20 69 73 UTF string cs is
6c70: 20 63 6f 6d 70 61 72 65 64 20 74 6f 2e 20 2a 2f compared to. */
6c80: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f . unsigned lo
6c90: 6e 67 20 6e 75 6d 43 68 61 72 73 29 09 2f 2a 20 ng numChars)./*
6ca0: 4e 75 6d 62 65 72 20 6f 66 20 55 54 46 20 63 68 Number of UTF ch
6cb0: 61 72 73 20 74 6f 20 63 6f 6d 70 61 72 65 2e 20 ars to compare.
6cc0: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 55 6e 69 */.{. Tcl_Uni
6cd0: 43 68 61 72 20 63 68 31 20 3d 20 30 2c 20 63 68 Char ch1 = 0, ch
6ce0: 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 2 = 0;.. /*.
6cf0: 20 20 20 20 2a 20 43 61 6e 6e 6f 74 20 75 73 65 * Cannot use
6d00: 20 27 6d 65 6d 63 6d 70 28 63 73 2c 20 63 74 2c 'memcmp(cs, ct,
6d10: 20 6e 29 3b 27 20 61 73 20 62 79 74 65 20 72 65 n);' as byte re
6d20: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 presentation of
6d30: 5c 75 30 30 30 30 20 28 74 68 65 0a 20 20 20 20 \u0000 (the.
6d40: 20 2a 20 70 61 69 72 20 6f 66 20 62 79 74 65 73 * pair of bytes
6d50: 20 30 78 43 30 2c 30 78 38 30 29 20 69 73 20 6c 0xC0,0x80) is l
6d60: 61 72 67 65 72 20 74 68 61 6e 20 62 79 74 65 20 arger than byte
6d70: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f representation o
6d80: 66 20 5c 75 30 30 30 31 0a 20 20 20 20 20 2a 20 f \u0001. *
6d90: 28 74 68 65 20 62 79 74 65 20 30 78 30 31 2e 29 (the byte 0x01.)
6da0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 77 68 . */.. wh
6db0: 69 6c 65 20 28 6e 75 6d 43 68 61 72 73 2d 2d 20 ile (numChars--
6dc0: 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 6e > 0) {../*.. * n
6dd0: 20 6d 75 73 74 20 62 65 20 69 6e 74 65 72 70 72 must be interpr
6de0: 65 74 65 64 20 61 73 20 63 68 61 72 73 2c 20 6e eted as chars, n
6df0: 6f 74 20 62 79 74 65 73 2e 20 54 68 69 73 20 73 ot bytes. This s
6e00: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 0a hould be called.
6e10: 09 20 2a 20 6f 6e 6c 79 20 77 68 65 6e 20 62 6f . * only when bo
6e20: 74 68 20 73 74 72 69 6e 67 73 20 61 72 65 20 6f th strings are o
6e30: 66 20 61 74 20 6c 65 61 73 74 20 6e 20 63 68 61 f at least n cha
6e40: 72 73 20 6c 6f 6e 67 20 28 6e 6f 20 6e 65 65 64 rs long (no need
6e50: 20 66 6f 72 20 5c 30 0a 09 20 2a 20 63 68 65 63 for \0.. * chec
6e60: 6b 29 0a 09 20 2a 2f 0a 0a 09 63 73 20 2b 3d 20 k).. */...cs +=
6e70: 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 TclUtfToUniChar(
6e80: 63 73 2c 20 26 63 68 31 29 3b 0a 09 63 74 20 2b cs, &ch1);..ct +
6e90: 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 = TclUtfToUniCha
6ea0: 72 28 63 74 2c 20 26 63 68 32 29 3b 0a 09 69 66 r(ct, &ch2);..if
6eb0: 20 28 63 68 31 20 21 3d 20 63 68 32 29 20 7b 0a (ch1 != ch2) {.
6ec0: 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 #if TCL_UTF_MAX
6ed0: 3d 3d 20 34 0a 09 20 20 20 20 2f 2a 20 53 75 72 == 4.. /* Sur
6ee0: 72 6f 67 61 74 65 73 20 61 6c 77 61 79 73 20 72 rogates always r
6ef0: 65 70 6f 72 74 20 68 69 67 68 65 72 20 74 68 61 eport higher tha
6f00: 6e 20 6e 6f 6e 2d 73 75 72 72 6f 67 61 74 65 73 n non-surrogates
6f10: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 28 28 63 */.. if (((c
6f20: 68 31 20 26 20 30 78 46 43 30 30 29 20 3d 3d 20 h1 & 0xFC00) ==
6f30: 30 78 44 38 30 30 29 29 20 7b 0a 09 20 20 20 20 0xD800)) {..
6f40: 69 66 20 28 28 63 68 32 20 26 20 30 78 46 43 30 if ((ch2 & 0xFC0
6f50: 30 29 20 21 3d 20 30 78 44 38 30 30 29 20 7b 0a 0) != 0xD800) {.
6f60: 09 09 72 65 74 75 72 6e 20 63 68 31 3b 0a 09 20 ..return ch1;..
6f70: 20 20 20 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 }.. } else
6f80: 20 69 66 20 28 28 63 68 32 20 26 20 30 78 46 43 if ((ch2 & 0xFC
6f90: 30 30 29 20 3d 3d 20 30 78 44 38 30 30 29 20 7b 00) == 0xD800) {
6fa0: 0a 09 09 72 65 74 75 72 6e 20 2d 63 68 32 3b 0a ...return -ch2;.
6fb0: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 20 . }.#endif..
6fc0: 20 20 20 72 65 74 75 72 6e 20 28 63 68 31 20 2d return (ch1 -
6fd0: 20 63 68 32 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a ch2);..}. }.
6fe0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a return 0;.}.
6ff0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7040: 0a 20 2a 20 54 63 6c 5f 55 74 66 4e 63 61 73 65 . * Tcl_UtfNcase
7050: 63 6d 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d cmp --. *. *.Com
7060: 70 61 72 65 20 61 74 20 6d 6f 73 74 20 6e 75 6d pare at most num
7070: 43 68 61 72 73 20 55 54 46 20 63 68 61 72 73 20 Chars UTF chars
7080: 6f 66 20 73 74 72 69 6e 67 20 63 73 20 74 6f 20 of string cs to
7090: 73 74 72 69 6e 67 20 63 74 20 63 61 73 65 0a 20 string ct case.
70a0: 2a 09 69 6e 73 65 6e 73 69 74 69 76 65 2e 20 42 *.insensitive. B
70b0: 6f 74 68 20 63 73 20 61 6e 64 20 63 74 20 61 72 oth cs and ct ar
70c0: 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 e assumed to be
70d0: 61 74 20 6c 65 61 73 74 20 6e 75 6d 43 68 61 72 at least numChar
70e0: 73 20 55 54 46 0a 20 2a 09 63 68 61 72 73 20 6c s UTF. *.chars l
70f0: 6f 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ong.. *. * Resul
7100: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 20 3c 30 ts:. *.Return <0
7110: 20 69 66 20 63 73 20 3c 20 63 74 2c 20 30 20 69 if cs < ct, 0 i
7120: 66 20 63 73 20 3d 3d 20 63 74 2c 20 6f 72 20 3e f cs == ct, or >
7130: 30 20 69 66 20 63 73 20 3e 20 63 74 2e 0a 20 2a 0 if cs > ct.. *
7140: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
7150: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
7160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
71b0: 54 63 6c 5f 55 74 66 4e 63 61 73 65 63 6d 70 28 Tcl_UtfNcasecmp(
71c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
71d0: 2a 63 73 2c 09 09 2f 2a 20 55 54 46 20 73 74 72 *cs,../* UTF str
71e0: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 ing to compare t
71f0: 6f 20 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e o ct. */. con
7200: 73 74 20 63 68 61 72 20 2a 63 74 2c 09 09 2f 2a st char *ct,../*
7210: 20 55 54 46 20 73 74 72 69 6e 67 20 63 73 20 69 UTF string cs i
7220: 73 20 63 6f 6d 70 61 72 65 64 20 74 6f 2e 20 2a s compared to. *
7230: 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c /. unsigned l
7240: 6f 6e 67 20 6e 75 6d 43 68 61 72 73 29 09 2f 2a ong numChars)./*
7250: 20 4e 75 6d 62 65 72 20 6f 66 20 55 54 46 20 63 Number of UTF c
7260: 68 61 72 73 20 74 6f 20 63 6f 6d 70 61 72 65 2e hars to compare.
7270: 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 55 6e */.{. Tcl_Un
7280: 69 43 68 61 72 20 63 68 31 20 3d 20 30 2c 20 63 iChar ch1 = 0, c
7290: 68 32 20 3d 20 30 3b 0a 0a 20 20 20 20 77 68 69 h2 = 0;.. whi
72a0: 6c 65 20 28 6e 75 6d 43 68 61 72 73 2d 2d 20 3e le (numChars-- >
72b0: 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 6e 20 0) {../*.. * n
72c0: 6d 75 73 74 20 62 65 20 69 6e 74 65 72 70 72 65 must be interpre
72d0: 74 65 64 20 61 73 20 63 68 61 72 73 2c 20 6e 6f ted as chars, no
72e0: 74 20 62 79 74 65 73 2e 0a 09 20 2a 20 54 68 69 t bytes... * Thi
72f0: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c s should be call
7300: 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 62 6f 74 ed only when bot
7310: 68 20 73 74 72 69 6e 67 73 20 61 72 65 20 6f 66 h strings are of
7320: 0a 09 20 2a 20 61 74 20 6c 65 61 73 74 20 6e 20 .. * at least n
7330: 63 68 61 72 73 20 6c 6f 6e 67 20 28 6e 6f 20 6e chars long (no n
7340: 65 65 64 20 66 6f 72 20 5c 30 20 63 68 65 63 6b eed for \0 check
7350: 29 0a 09 20 2a 2f 0a 09 63 73 20 2b 3d 20 54 63 ).. */..cs += Tc
7360: 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 63 73 lUtfToUniChar(cs
7370: 2c 20 26 63 68 31 29 3b 0a 09 63 74 20 2b 3d 20 , &ch1);..ct +=
7380: 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 61 72 28 TclUtfToUniChar(
7390: 63 74 2c 20 26 63 68 32 29 3b 0a 09 69 66 20 28 ct, &ch2);..if (
73a0: 63 68 31 20 21 3d 20 63 68 32 29 20 7b 0a 23 69 ch1 != ch2) {.#i
73b0: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3d 3d f TCL_UTF_MAX ==
73c0: 20 34 0a 09 20 20 20 20 2f 2a 20 53 75 72 72 6f 4.. /* Surro
73d0: 67 61 74 65 73 20 61 6c 77 61 79 73 20 72 65 70 gates always rep
73e0: 6f 72 74 20 68 69 67 68 65 72 20 74 68 61 6e 20 ort higher than
73f0: 6e 6f 6e 2d 73 75 72 72 6f 67 61 74 65 73 20 2a non-surrogates *
7400: 2f 0a 09 20 20 20 20 69 66 20 28 28 28 63 68 31 /.. if (((ch1
7410: 20 26 20 30 78 46 43 30 30 29 20 3d 3d 20 30 78 & 0xFC00) == 0x
7420: 44 38 30 30 29 29 20 7b 0a 09 20 20 20 20 69 66 D800)) {.. if
7430: 20 28 28 63 68 32 20 26 20 30 78 46 43 30 30 29 ((ch2 & 0xFC00)
7440: 20 21 3d 20 30 78 44 38 30 30 29 20 7b 0a 09 09 != 0xD800) {...
7450: 72 65 74 75 72 6e 20 63 68 31 3b 0a 09 20 20 20 return ch1;..
7460: 20 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 }.. } else i
7470: 66 20 28 28 63 68 32 20 26 20 30 78 46 43 30 30 f ((ch2 & 0xFC00
7480: 29 20 3d 3d 20 30 78 44 38 30 30 29 20 7b 0a 09 ) == 0xD800) {..
7490: 09 72 65 74 75 72 6e 20 2d 63 68 32 3b 0a 09 20 .return -ch2;..
74a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 20 20 20 }.#endif..
74b0: 20 63 68 31 20 3d 20 54 63 6c 5f 55 6e 69 43 68 ch1 = Tcl_UniCh
74c0: 61 72 54 6f 4c 6f 77 65 72 28 63 68 31 29 3b 0a arToLower(ch1);.
74d0: 09 20 20 20 20 63 68 32 20 3d 20 54 63 6c 5f 55 . ch2 = Tcl_U
74e0: 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 63 68 niCharToLower(ch
74f0: 32 29 3b 0a 09 20 20 20 20 69 66 20 28 63 68 31 2);.. if (ch1
7500: 20 21 3d 20 63 68 32 29 20 7b 0a 09 09 72 65 74 != ch2) {...ret
7510: 75 72 6e 20 28 63 68 31 20 2d 20 63 68 32 29 3b urn (ch1 - ch2);
7520: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
7530: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
7540: 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7590: 2a 0a 20 2a 20 54 63 6c 55 74 66 43 61 73 65 63 *. * TclUtfCasec
75a0: 6d 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 mp --. *. *.Comp
75b0: 61 72 65 20 55 54 46 20 63 68 61 72 73 20 6f 66 are UTF chars of
75c0: 20 73 74 72 69 6e 67 20 63 73 20 74 6f 20 73 74 string cs to st
75d0: 72 69 6e 67 20 63 74 20 63 61 73 65 20 69 6e 73 ring ct case ins
75e0: 65 6e 73 69 74 69 76 65 6c 79 2e 0a 20 2a 09 52 ensitively.. *.R
75f0: 65 70 6c 61 63 65 6d 65 6e 74 20 66 6f 72 20 73 eplacement for s
7600: 74 72 63 61 73 65 63 6d 70 20 69 6e 20 54 63 6c trcasecmp in Tcl
7610: 20 63 6f 72 65 2c 20 69 6e 20 70 6c 61 63 65 73 core, in places
7620: 20 77 68 65 72 65 20 55 54 46 2d 38 20 73 68 6f where UTF-8 sho
7630: 75 6c 64 0a 20 2a 09 62 65 20 68 61 6e 64 6c 65 uld. *.be handle
7640: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 d.. *. * Results
7650: 3a 0a 20 2a 09 52 65 74 75 72 6e 20 3c 30 20 69 :. *.Return <0 i
7660: 66 20 63 73 20 3c 20 63 74 2c 20 30 20 69 66 20 f cs < ct, 0 if
7670: 63 73 20 3d 3d 20 63 74 2c 20 6f 72 20 3e 30 20 cs == ct, or >0
7680: 69 66 20 63 73 20 3e 20 63 74 2e 0a 20 2a 0a 20 if cs > ct.. *.
7690: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
76a0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
7700: 6c 55 74 66 43 61 73 65 63 6d 70 28 0a 20 20 20 lUtfCasecmp(.
7710: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 73 2c const char *cs,
7720: 09 09 2f 2a 20 55 54 46 20 73 74 72 69 6e 67 20 ../* UTF string
7730: 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f 20 63 74 to compare to ct
7740: 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 . */. const c
7750: 68 61 72 20 2a 63 74 29 09 09 2f 2a 20 55 54 46 har *ct)../* UTF
7760: 20 73 74 72 69 6e 67 20 63 73 20 69 73 20 63 6f string cs is co
7770: 6d 70 61 72 65 64 20 74 6f 2e 20 2a 2f 0a 7b 0a mpared to. */.{.
7780: 20 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 Tcl_UniChar
7790: 63 68 31 20 3d 20 30 2c 20 63 68 32 20 3d 20 30 ch1 = 0, ch2 = 0
77a0: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 2a 63 ;.. while (*c
77b0: 73 20 26 26 20 2a 63 74 29 20 7b 0a 09 63 73 20 s && *ct) {..cs
77c0: 2b 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 43 68 += TclUtfToUniCh
77d0: 61 72 28 63 73 2c 20 26 63 68 31 29 3b 0a 09 63 ar(cs, &ch1);..c
77e0: 74 20 2b 3d 20 54 63 6c 55 74 66 54 6f 55 6e 69 t += TclUtfToUni
77f0: 43 68 61 72 28 63 74 2c 20 26 63 68 32 29 3b 0a Char(ct, &ch2);.
7800: 09 69 66 20 28 63 68 31 20 21 3d 20 63 68 32 29 .if (ch1 != ch2)
7810: 20 7b 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d {.#if TCL_UTF_M
7820: 41 58 20 3d 3d 20 34 0a 09 20 20 20 20 2f 2a 20 AX == 4.. /*
7830: 53 75 72 72 6f 67 61 74 65 73 20 61 6c 77 61 79 Surrogates alway
7840: 73 20 72 65 70 6f 72 74 20 68 69 67 68 65 72 20 s report higher
7850: 74 68 61 6e 20 6e 6f 6e 2d 73 75 72 72 6f 67 61 than non-surroga
7860: 74 65 73 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 tes */.. if (
7870: 28 28 63 68 31 20 26 20 30 78 46 43 30 30 29 20 ((ch1 & 0xFC00)
7880: 3d 3d 20 30 78 44 38 30 30 29 29 20 7b 0a 09 20 == 0xD800)) {..
7890: 20 20 20 69 66 20 28 28 63 68 32 20 26 20 30 78 if ((ch2 & 0x
78a0: 46 43 30 30 29 20 21 3d 20 30 78 44 38 30 30 29 FC00) != 0xD800)
78b0: 20 7b 0a 09 09 72 65 74 75 72 6e 20 63 68 31 3b {...return ch1;
78c0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 7d 20 65 .. }.. } e
78d0: 6c 73 65 20 69 66 20 28 28 63 68 32 20 26 20 30 lse if ((ch2 & 0
78e0: 78 46 43 30 30 29 20 3d 3d 20 30 78 44 38 30 30 xFC00) == 0xD800
78f0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d 63 68 ) {...return -ch
7900: 32 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 2;.. }.#endif
7910: 0a 09 20 20 20 20 63 68 31 20 3d 20 54 63 6c 5f .. ch1 = Tcl_
7920: 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 63 UniCharToLower(c
7930: 68 31 29 3b 0a 09 20 20 20 20 63 68 32 20 3d 20 h1);.. ch2 =
7940: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 Tcl_UniCharToLow
7950: 65 72 28 63 68 32 29 3b 0a 09 20 20 20 20 69 66 er(ch2);.. if
7960: 20 28 63 68 31 20 21 3d 20 63 68 32 29 20 7b 0a (ch1 != ch2) {.
7970: 09 09 72 65 74 75 72 6e 20 63 68 31 20 2d 20 63 ..return ch1 - c
7980: 68 32 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 h2;.. }..}.
7990: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 55 }. return U
79a0: 43 48 41 52 28 2a 63 73 29 20 2d 20 55 43 48 41 CHAR(*cs) - UCHA
79b0: 52 28 2a 63 74 29 3b 0a 7d 0a 0a 0c 0a 2f 2a 0a R(*ct);.}..../*.
79c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
7a10: 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 70 70 65 cl_UniCharToUppe
7a20: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 75 r --. *. *.Compu
7a30: 74 65 20 74 68 65 20 75 70 70 65 72 63 61 73 65 te the uppercase
7a40: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 equivalent of t
7a50: 68 65 20 67 69 76 65 6e 20 55 6e 69 63 6f 64 65 he given Unicode
7a60: 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 character.. *.
7a70: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 * Results:. *.Re
7a80: 74 75 72 6e 73 20 74 68 65 20 75 70 70 65 72 63 turns the upperc
7a90: 61 73 65 20 55 6e 69 63 6f 64 65 20 63 68 61 72 ase Unicode char
7aa0: 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 acter.. *. * Sid
7ab0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
7ac0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
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 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7b10: 20 2a 2f 0a 0a 54 63 6c 5f 55 6e 69 43 68 61 72 */..Tcl_UniChar
7b20: 0a 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 55 70 .Tcl_UniCharToUp
7b30: 70 65 72 28 0a 20 20 20 20 69 6e 74 20 63 68 29 per(. int ch)
7b40: 09 09 09 2f 2a 20 55 6e 69 63 6f 64 65 20 63 68 .../* Unicode ch
7b50: 61 72 61 63 74 65 72 20 74 6f 20 63 6f 6e 76 65 aracter to conve
7b60: 72 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 rt. */.{. int
7b70: 20 69 6e 66 6f 20 3d 20 47 65 74 55 6e 69 43 68 info = GetUniCh
7b80: 61 72 49 6e 66 6f 28 63 68 29 3b 0a 0a 20 20 20 arInfo(ch);..
7b90: 20 69 66 20 28 47 65 74 43 61 73 65 54 79 70 65 if (GetCaseType
7ba0: 28 69 6e 66 6f 29 20 26 20 30 78 30 34 29 20 7b (info) & 0x04) {
7bb0: 0a 09 63 68 20 2d 3d 20 47 65 74 44 65 6c 74 61 ..ch -= GetDelta
7bc0: 28 69 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 (info);. }.
7bd0: 20 20 72 65 74 75 72 6e 20 28 54 63 6c 5f 55 6e return (Tcl_Un
7be0: 69 43 68 61 72 29 20 63 68 3b 0a 7d 0a 0c 0a 2f iChar) ch;.}.../
7bf0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
7c40: 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f Tcl_UniCharToLo
7c50: 77 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d wer --. *. *.Com
7c60: 70 75 74 65 20 74 68 65 20 6c 6f 77 65 72 63 61 pute the lowerca
7c70: 73 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 se equivalent of
7c80: 20 74 68 65 20 67 69 76 65 6e 20 55 6e 69 63 6f the given Unico
7c90: 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a de character.. *
7ca0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
7cb0: 52 65 74 75 72 6e 73 20 74 68 65 20 6c 6f 77 65 Returns the lowe
7cc0: 72 63 61 73 65 20 55 6e 69 63 6f 64 65 20 63 68 rcase Unicode ch
7cd0: 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 53 aracter.. *. * S
7ce0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
7cf0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d40: 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 55 6e 69 43 68 -. */..Tcl_UniCh
7d50: 61 72 0a 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f ar.Tcl_UniCharTo
7d60: 4c 6f 77 65 72 28 0a 20 20 20 20 69 6e 74 20 63 Lower(. int c
7d70: 68 29 09 09 09 2f 2a 20 55 6e 69 63 6f 64 65 20 h).../* Unicode
7d80: 63 68 61 72 61 63 74 65 72 20 74 6f 20 63 6f 6e character to con
7d90: 76 65 72 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 vert. */.{. i
7da0: 6e 74 20 69 6e 66 6f 20 3d 20 47 65 74 55 6e 69 nt info = GetUni
7db0: 43 68 61 72 49 6e 66 6f 28 63 68 29 3b 0a 20 20 CharInfo(ch);.
7dc0: 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 47 65 74 int mode = Get
7dd0: 43 61 73 65 54 79 70 65 28 69 6e 66 6f 29 3b 0a CaseType(info);.
7de0: 0a 20 20 20 20 69 66 20 28 28 6d 6f 64 65 20 26 . if ((mode &
7df0: 20 30 78 30 32 29 20 26 26 20 28 6d 6f 64 65 20 0x02) && (mode
7e00: 21 3d 20 30 78 37 29 29 20 7b 0a 09 63 68 20 2b != 0x7)) {..ch +
7e10: 3d 20 47 65 74 44 65 6c 74 61 28 69 6e 66 6f 29 = GetDelta(info)
7e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
7e30: 72 6e 20 28 54 63 6c 5f 55 6e 69 43 68 61 72 29 rn (Tcl_UniChar)
7e40: 20 63 68 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ch;.}.../*. *--
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e90: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 ----. *. * Tcl_U
7ea0: 6e 69 43 68 61 72 54 6f 54 69 74 6c 65 20 2d 2d niCharToTitle --
7eb0: 0a 20 2a 0a 20 2a 09 43 6f 6d 70 75 74 65 20 74 . *. *.Compute t
7ec0: 68 65 20 74 69 74 6c 65 63 61 73 65 20 65 71 75 he titlecase equ
7ed0: 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 20 67 ivalent of the g
7ee0: 69 76 65 6e 20 55 6e 69 63 6f 64 65 20 63 68 61 iven Unicode cha
7ef0: 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 racter.. *. * Re
7f00: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
7f10: 73 20 74 68 65 20 74 69 74 6c 65 63 61 73 65 20 s the titlecase
7f20: 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 Unicode characte
7f30: 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 r.. *. * Side ef
7f40: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
7f50: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
7fa0: 0a 54 63 6c 5f 55 6e 69 43 68 61 72 0a 54 63 6c .Tcl_UniChar.Tcl
7fb0: 5f 55 6e 69 43 68 61 72 54 6f 54 69 74 6c 65 28 _UniCharToTitle(
7fc0: 0a 20 20 20 20 69 6e 74 20 63 68 29 09 09 09 2f . int ch).../
7fd0: 2a 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63 * Unicode charac
7fe0: 74 65 72 20 74 6f 20 63 6f 6e 76 65 72 74 2e 20 ter to convert.
7ff0: 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 69 6e 66 */.{. int inf
8000: 6f 20 3d 20 47 65 74 55 6e 69 43 68 61 72 49 6e o = GetUniCharIn
8010: 66 6f 28 63 68 29 3b 0a 20 20 20 20 69 6e 74 20 fo(ch);. int
8020: 6d 6f 64 65 20 3d 20 47 65 74 43 61 73 65 54 79 mode = GetCaseTy
8030: 70 65 28 69 6e 66 6f 29 3b 0a 0a 20 20 20 20 69 pe(info);.. i
8040: 66 20 28 6d 6f 64 65 20 26 20 30 78 31 29 20 7b f (mode & 0x1) {
8050: 0a 09 2f 2a 0a 09 20 2a 20 53 75 62 74 72 61 63 ../*.. * Subtrac
8060: 74 20 6f 72 20 61 64 64 20 6f 6e 65 20 64 65 70 t or add one dep
8070: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6f 72 ending on the or
8080: 69 67 69 6e 61 6c 20 63 61 73 65 2e 0a 09 20 2a iginal case... *
8090: 2f 0a 0a 09 69 66 20 28 6d 6f 64 65 20 21 3d 20 /...if (mode !=
80a0: 30 78 37 29 20 7b 0a 09 20 20 20 20 63 68 20 2b 0x7) {.. ch +
80b0: 3d 20 28 28 6d 6f 64 65 20 26 20 30 78 34 29 20 = ((mode & 0x4)
80c0: 3f 20 2d 31 20 3a 20 31 29 3b 0a 09 7d 0a 20 20 ? -1 : 1);..}.
80d0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 } else if (mod
80e0: 65 20 3d 3d 20 30 78 34 29 20 7b 0a 09 63 68 20 e == 0x4) {..ch
80f0: 2d 3d 20 47 65 74 44 65 6c 74 61 28 69 6e 66 6f -= GetDelta(info
8100: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
8110: 75 72 6e 20 28 54 63 6c 5f 55 6e 69 43 68 61 72 urn (Tcl_UniChar
8120: 29 20 63 68 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ) ch;.}.../*. *-
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8170: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f -----. *. * Tcl_
8180: 55 6e 69 43 68 61 72 4c 65 6e 20 2d 2d 0a 20 2a UniCharLen --. *
8190: 0a 20 2a 09 46 69 6e 64 20 74 68 65 20 6c 65 6e . *.Find the len
81a0: 67 74 68 20 6f 66 20 61 20 55 6e 69 43 68 61 72 gth of a UniChar
81b0: 20 73 74 72 69 6e 67 2e 20 54 68 65 20 73 74 72 string. The str
81c0: 20 69 6e 70 75 74 20 6d 75 73 74 20 62 65 20 6e input must be n
81d0: 75 6c 6c 0a 20 2a 09 74 65 72 6d 69 6e 61 74 65 ull. *.terminate
81e0: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 d.. *. * Results
81f0: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65 :. *.Returns the
8200: 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 72 20 69 length of str i
8210: 6e 20 55 6e 69 43 68 61 72 73 20 28 6e 6f 74 20 n UniChars (not
8220: 62 79 74 65 73 29 2e 0a 20 2a 0a 20 2a 20 53 69 bytes).. *. * Si
8230: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
8240: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8290: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e . */..int.Tcl_Un
82a0: 69 43 68 61 72 4c 65 6e 28 0a 20 20 20 20 63 6f iCharLen(. co
82b0: 6e 73 74 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 nst Tcl_UniChar
82c0: 2a 75 6e 69 53 74 72 29 09 2f 2a 20 55 6e 69 63 *uniStr)./* Unic
82d0: 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20 66 69 ode string to fi
82e0: 6e 64 20 6c 65 6e 67 74 68 20 6f 66 2e 20 2a 2f nd length of. */
82f0: 0a 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d .{. int len =
8300: 20 30 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 0;.. while (
8310: 2a 75 6e 69 53 74 72 20 21 3d 20 27 5c 30 27 29 *uniStr != '\0')
8320: 20 7b 0a 09 6c 65 6e 2b 2b 3b 0a 09 75 6e 69 53 {..len++;..uniS
8330: 74 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 tr++;. }.
8340: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0c 0a return len;.}...
8350: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
8360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
83a0: 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 4e 63 6d * Tcl_UniCharNcm
83b0: 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 61 p --. *. *.Compa
83c0: 72 65 20 61 74 20 6d 6f 73 74 20 6e 75 6d 43 68 re at most numCh
83d0: 61 72 73 20 75 6e 69 63 68 61 72 73 20 6f 66 20 ars unichars of
83e0: 73 74 72 69 6e 67 20 75 63 73 20 74 6f 20 73 74 string ucs to st
83f0: 72 69 6e 67 20 75 63 74 2e 0a 20 2a 09 42 6f 74 ring uct.. *.Bot
8400: 68 20 75 63 73 20 61 6e 64 20 75 63 74 20 61 72 h ucs and uct ar
8410: 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 e assumed to be
8420: 61 74 20 6c 65 61 73 74 20 6e 75 6d 43 68 61 72 at least numChar
8430: 73 20 75 6e 69 63 68 61 72 73 20 6c 6f 6e 67 2e s unichars long.
8440: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
8450: 20 2a 09 52 65 74 75 72 6e 20 3c 30 20 69 66 20 *.Return <0 if
8460: 75 63 73 20 3c 20 75 63 74 2c 20 30 20 69 66 20 ucs < uct, 0 if
8470: 75 63 73 20 3d 3d 20 75 63 74 2c 20 6f 72 20 3e ucs == uct, or >
8480: 30 20 69 66 20 75 63 73 20 3e 20 75 63 74 2e 0a 0 if ucs > uct..
8490: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
84a0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
84b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
84c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e --------. */..in
8500: 74 0a 54 63 6c 5f 55 6e 69 43 68 61 72 4e 63 6d t.Tcl_UniCharNcm
8510: 70 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c p(. const Tcl
8520: 5f 55 6e 69 43 68 61 72 20 2a 75 63 73 2c 09 2f _UniChar *ucs,./
8530: 2a 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 * Unicode string
8540: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f 20 75 to compare to u
8550: 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ct. */. const
8560: 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 2a 75 63 Tcl_UniChar *uc
8570: 74 2c 09 2f 2a 20 55 6e 69 63 6f 64 65 20 73 74 t,./* Unicode st
8580: 72 69 6e 67 20 75 63 73 20 69 73 20 63 6f 6d 70 ring ucs is comp
8590: 61 72 65 64 20 74 6f 2e 20 2a 2f 0a 20 20 20 20 ared to. */.
85a0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 unsigned long nu
85b0: 6d 43 68 61 72 73 29 09 2f 2a 20 4e 75 6d 62 65 mChars)./* Numbe
85c0: 72 20 6f 66 20 75 6e 69 63 68 61 72 73 20 74 6f r of unichars to
85d0: 20 63 6f 6d 70 61 72 65 2e 20 2a 2f 0a 7b 0a 23 compare. */.{.#
85e0: 69 66 64 65 66 20 57 4f 52 44 53 5f 42 49 47 45 ifdef WORDS_BIGE
85f0: 4e 44 49 41 4e 0a 20 20 20 20 2f 2a 0a 20 20 20 NDIAN. /*.
8600: 20 20 2a 20 57 65 20 61 72 65 20 64 65 66 69 6e * We are defin
8610: 69 74 65 6c 79 20 6f 6e 20 61 20 62 69 67 2d 65 itely on a big-e
8620: 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 3b 20 6d ndian machine; m
8630: 65 6d 63 6d 70 28 29 20 69 73 20 73 61 66 65 0a emcmp() is safe.
8640: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 74 */.. ret
8650: 75 72 6e 20 6d 65 6d 63 6d 70 28 75 63 73 2c 20 urn memcmp(ucs,
8660: 75 63 74 2c 20 6e 75 6d 43 68 61 72 73 2a 73 69 uct, numChars*si
8670: 7a 65 6f 66 28 54 63 6c 5f 55 6e 69 43 68 61 72 zeof(Tcl_UniChar
8680: 29 29 3b 0a 0a 23 65 6c 73 65 20 2f 2a 20 21 57 ));..#else /* !W
8690: 4f 52 44 53 5f 42 49 47 45 4e 44 49 41 4e 20 2a ORDS_BIGENDIAN *
86a0: 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 /. /*. *
86b0: 57 65 20 63 61 6e 27 74 20 73 69 6d 70 6c 79 20 We can't simply
86c0: 63 61 6c 6c 20 6d 65 6d 63 6d 70 28 29 20 62 65 call memcmp() be
86d0: 63 61 75 73 65 20 74 68 61 74 20 69 73 20 6e 6f cause that is no
86e0: 74 20 6c 65 78 69 63 61 6c 6c 79 20 63 6f 72 72 t lexically corr
86f0: 65 63 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ect.. */..
8700: 20 20 66 6f 72 20 28 20 3b 20 6e 75 6d 43 68 61 for ( ; numCha
8710: 72 73 20 21 3d 20 30 3b 20 75 63 73 2b 2b 2c 20 rs != 0; ucs++,
8720: 75 63 74 2b 2b 2c 20 6e 75 6d 43 68 61 72 73 2d uct++, numChars-
8730: 2d 29 20 7b 0a 09 69 66 20 28 2a 75 63 73 20 21 -) {..if (*ucs !
8740: 3d 20 2a 75 63 74 29 20 7b 0a 09 20 20 20 20 72 = *uct) {.. r
8750: 65 74 75 72 6e 20 28 2a 75 63 73 20 2d 20 2a 75 eturn (*ucs - *u
8760: 63 74 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 ct);..}. }.
8770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 return 0;.#end
8780: 69 66 20 2f 2a 20 57 4f 52 44 53 5f 42 49 47 45 if /* WORDS_BIGE
8790: 4e 44 49 41 4e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a NDIAN */.}.../*.
87a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
87b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
87f0: 63 6c 5f 55 6e 69 43 68 61 72 4e 63 61 73 65 63 cl_UniCharNcasec
8800: 6d 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70 mp --. *. *.Comp
8810: 61 72 65 20 61 74 20 6d 6f 73 74 20 6e 75 6d 43 are at most numC
8820: 68 61 72 73 20 75 6e 69 63 68 61 72 73 20 6f 66 hars unichars of
8830: 20 73 74 72 69 6e 67 20 75 63 73 20 74 6f 20 73 string ucs to s
8840: 74 72 69 6e 67 20 75 63 74 20 63 61 73 65 0a 20 tring uct case.
8850: 2a 09 69 6e 73 65 6e 73 69 74 69 76 65 2e 20 42 *.insensitive. B
8860: 6f 74 68 20 75 63 73 20 61 6e 64 20 75 63 74 20 oth ucs and uct
8870: 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 are assumed to b
8880: 65 20 61 74 20 6c 65 61 73 74 20 6e 75 6d 43 68 e at least numCh
8890: 61 72 73 0a 20 2a 09 75 6e 69 63 68 61 72 73 20 ars. *.unichars
88a0: 6c 6f 6e 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 long.. *. * Resu
88b0: 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 20 3c lts:. *.Return <
88c0: 30 20 69 66 20 75 63 73 20 3c 20 75 63 74 2c 20 0 if ucs < uct,
88d0: 30 20 69 66 20 75 63 73 20 3d 3d 20 75 63 74 2c 0 if ucs == uct,
88e0: 20 6f 72 20 3e 30 20 69 66 20 75 63 73 20 3e 20 or >0 if ucs >
88f0: 75 63 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 uct.. *. * Side
8900: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
8910: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
8920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8960: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 /..int.Tcl_UniCh
8970: 61 72 4e 63 61 73 65 63 6d 70 28 0a 20 20 20 20 arNcasecmp(.
8980: 63 6f 6e 73 74 20 54 63 6c 5f 55 6e 69 43 68 61 const Tcl_UniCha
8990: 72 20 2a 75 63 73 2c 09 2f 2a 20 55 6e 69 63 6f r *ucs,./* Unico
89a0: 64 65 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d de string to com
89b0: 70 61 72 65 20 74 6f 20 75 63 74 2e 20 2a 2f 0a pare to uct. */.
89c0: 20 20 20 20 63 6f 6e 73 74 20 54 63 6c 5f 55 6e const Tcl_Un
89d0: 69 43 68 61 72 20 2a 75 63 74 2c 09 2f 2a 20 55 iChar *uct,./* U
89e0: 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 75 63 nicode string uc
89f0: 73 20 69 73 20 63 6f 6d 70 61 72 65 64 20 74 6f s is compared to
8a00: 2e 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 . */. unsigne
8a10: 64 20 6c 6f 6e 67 20 6e 75 6d 43 68 61 72 73 29 d long numChars)
8a20: 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e ./* Number of un
8a30: 69 63 68 61 72 73 20 74 6f 20 63 6f 6d 70 61 72 ichars to compar
8a40: 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 66 6f 72 20 e. */.{. for
8a50: 28 20 3b 20 6e 75 6d 43 68 61 72 73 20 21 3d 20 ( ; numChars !=
8a60: 30 3b 20 6e 75 6d 43 68 61 72 73 2d 2d 2c 20 75 0; numChars--, u
8a70: 63 73 2b 2b 2c 20 75 63 74 2b 2b 29 20 7b 0a 09 cs++, uct++) {..
8a80: 69 66 20 28 2a 75 63 73 20 21 3d 20 2a 75 63 74 if (*ucs != *uct
8a90: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 55 6e 69 ) {.. Tcl_Uni
8aa0: 43 68 61 72 20 6c 63 73 20 3d 20 54 63 6c 5f 55 Char lcs = Tcl_U
8ab0: 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 2a 75 niCharToLower(*u
8ac0: 63 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 55 6e cs);.. Tcl_Un
8ad0: 69 43 68 61 72 20 6c 63 74 20 3d 20 54 63 6c 5f iChar lct = Tcl_
8ae0: 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 2a UniCharToLower(*
8af0: 75 63 74 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 uct);... if (
8b00: 6c 63 73 20 21 3d 20 6c 63 74 29 20 7b 0a 09 09 lcs != lct) {...
8b10: 72 65 74 75 72 6e 20 28 6c 63 73 20 2d 20 6c 63 return (lcs - lc
8b20: 74 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 t);.. }..}.
8b30: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 }. return 0
8b40: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
8b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b90: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 -. *. * Tcl_UniC
8ba0: 68 61 72 49 73 41 6c 6e 75 6d 20 2d 2d 0a 20 2a harIsAlnum --. *
8bb0: 0a 20 2a 09 54 65 73 74 20 69 66 20 61 20 63 68 . *.Test if a ch
8bc0: 61 72 61 63 74 65 72 20 69 73 20 61 6e 20 61 6c aracter is an al
8bd0: 70 68 61 6e 75 6d 65 72 69 63 20 55 6e 69 63 6f phanumeric Unico
8be0: 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a de character.. *
8bf0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
8c00: 52 65 74 75 72 6e 73 20 31 20 69 66 20 63 68 61 Returns 1 if cha
8c10: 72 61 63 74 65 72 20 69 73 20 61 6c 70 68 61 6e racter is alphan
8c20: 75 6d 65 72 69 63 2e 0a 20 2a 0a 20 2a 20 53 69 umeric.. *. * Si
8c30: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
8c40: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c90: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e . */..int.Tcl_Un
8ca0: 69 43 68 61 72 49 73 41 6c 6e 75 6d 28 0a 20 20 iCharIsAlnum(.
8cb0: 20 20 69 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 int ch).../* U
8cc0: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 nicode character
8cd0: 20 74 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b 0a 23 to test. */.{.#
8ce0: 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3e if TCL_UTF_MAX >
8cf0: 20 33 0a 20 20 20 20 69 66 20 28 55 4e 49 43 4f 3. if (UNICO
8d00: 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 45 28 DE_OUT_OF_RANGE(
8d10: 63 68 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 ch)) {..return 0
8d20: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
8d30: 20 20 20 72 65 74 75 72 6e 20 28 28 28 41 4c 50 return (((ALP
8d40: 48 41 5f 42 49 54 53 20 7c 20 44 49 47 49 54 5f HA_BITS | DIGIT_
8d50: 42 49 54 53 29 20 3e 3e 20 47 65 74 43 61 74 65 BITS) >> GetCate
8d60: 67 6f 72 79 28 63 68 29 29 20 26 20 31 29 3b 0a gory(ch)) & 1);.
8d70: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d ----------------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8dc0: 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 68 61 *. * Tcl_UniCha
8dd0: 72 49 73 41 6c 70 68 61 20 2d 2d 0a 20 2a 0a 20 rIsAlpha --. *.
8de0: 2a 09 54 65 73 74 20 69 66 20 61 20 63 68 61 72 *.Test if a char
8df0: 61 63 74 65 72 20 69 73 20 61 6e 20 61 6c 70 68 acter is an alph
8e00: 61 62 65 74 69 63 20 55 6e 69 63 6f 64 65 20 63 abetic Unicode c
8e10: 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 haracter.. *. *
8e20: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
8e30: 72 6e 73 20 31 20 69 66 20 63 68 61 72 61 63 74 rns 1 if charact
8e40: 65 72 20 69 73 20 61 6c 70 68 61 62 65 74 69 63 er is alphabetic
8e50: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
8e60: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
8e70: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
8ec0: 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 61 72 49 int.Tcl_UniCharI
8ed0: 73 41 6c 70 68 61 28 0a 20 20 20 20 69 6e 74 20 sAlpha(. int
8ee0: 63 68 29 09 09 09 2f 2a 20 55 6e 69 63 6f 64 65 ch).../* Unicode
8ef0: 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 74 65 character to te
8f00: 73 74 2e 20 2a 2f 0a 7b 0a 23 69 66 20 54 43 4c st. */.{.#if TCL
8f10: 5f 55 54 46 5f 4d 41 58 20 3e 20 33 0a 20 20 20 _UTF_MAX > 3.
8f20: 20 69 66 20 28 55 4e 49 43 4f 44 45 5f 4f 55 54 if (UNICODE_OUT
8f30: 5f 4f 46 5f 52 41 4e 47 45 28 63 68 29 29 20 7b _OF_RANGE(ch)) {
8f40: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
8f50: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 }.#endif. ret
8f60: 75 72 6e 20 28 28 41 4c 50 48 41 5f 42 49 54 53 urn ((ALPHA_BITS
8f70: 20 3e 3e 20 47 65 74 43 61 74 65 67 6f 72 79 28 >> GetCategory(
8f80: 63 68 29 29 20 26 20 31 29 3b 0a 7d 0a 0c 0a 2f ch)) & 1);.}.../
8f90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8fe0: 20 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 43 6f Tcl_UniCharIsCo
8ff0: 6e 74 72 6f 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 ntrol --. *. *.T
9000: 65 73 74 20 69 66 20 61 20 63 68 61 72 61 63 74 est if a charact
9010: 65 72 20 69 73 20 61 20 55 6e 69 63 6f 64 65 20 er is a Unicode
9020: 63 6f 6e 74 72 6f 6c 20 63 68 61 72 61 63 74 65 control characte
9030: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
9040: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 6e 6f 6e :. *.Returns non
9050: 2d 7a 65 72 6f 20 69 66 20 63 68 61 72 61 63 74 -zero if charact
9060: 65 72 20 69 73 20 61 20 63 6f 6e 74 72 6f 6c 2e er is a control.
9070: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
9080: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
9090: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 ---------. */..i
90e0: 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 nt.Tcl_UniCharIs
90f0: 43 6f 6e 74 72 6f 6c 28 0a 20 20 20 20 69 6e 74 Control(. int
9100: 20 63 68 29 09 09 09 2f 2a 20 55 6e 69 63 6f 64 ch).../* Unicod
9110: 65 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 74 e character to t
9120: 65 73 74 2e 20 2a 2f 0a 7b 0a 23 69 66 20 54 43 est. */.{.#if TC
9130: 4c 5f 55 54 46 5f 4d 41 58 20 3e 20 33 0a 20 20 L_UTF_MAX > 3.
9140: 20 20 69 66 20 28 55 4e 49 43 4f 44 45 5f 4f 55 if (UNICODE_OU
9150: 54 5f 4f 46 5f 52 41 4e 47 45 28 63 68 29 29 20 T_OF_RANGE(ch))
9160: 7b 0a 09 63 68 20 26 3d 20 30 78 31 46 46 46 46 {..ch &= 0x1FFFF
9170: 46 3b 0a 09 69 66 20 28 28 63 68 20 3d 3d 20 30 F;..if ((ch == 0
9180: 78 45 30 30 30 31 29 20 7c 7c 20 28 28 63 68 20 xE0001) || ((ch
9190: 3e 3d 20 30 78 45 30 30 32 30 29 20 26 26 20 28 >= 0xE0020) && (
91a0: 63 68 20 3c 3d 20 30 78 45 30 30 37 66 29 29 29 ch <= 0xE007f)))
91b0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 {.. return 1
91c0: 3b 0a 09 7d 0a 09 69 66 20 28 28 63 68 20 3e 3d ;..}..if ((ch >=
91d0: 20 30 78 46 30 30 30 30 29 20 26 26 20 28 28 63 0xF0000) && ((c
91e0: 68 20 26 20 30 78 46 46 46 46 29 20 3c 3d 20 30 h & 0xFFFF) <= 0
91f0: 78 46 46 46 44 29 29 20 7b 0a 09 20 20 20 20 72 xFFFD)) {.. r
9200: 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 09 72 65 74 eturn 1;..}..ret
9210: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e urn 0;. }.#en
9220: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 28 dif. return (
9230: 28 43 4f 4e 54 52 4f 4c 5f 42 49 54 53 20 3e 3e (CONTROL_BITS >>
9240: 20 47 65 74 43 61 74 65 67 6f 72 79 28 63 68 29 GetCategory(ch)
9250: 29 20 26 20 31 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ) & 1);.}.../*.
9260: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9280: 2d 2d 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 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
92b0: 6c 5f 55 6e 69 43 68 61 72 49 73 44 69 67 69 74 l_UniCharIsDigit
92c0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 65 73 74 20 69 --. *. *.Test i
92d0: 66 20 61 20 63 68 61 72 61 63 74 65 72 20 69 73 f a character is
92e0: 20 61 20 6e 75 6d 65 72 69 63 20 55 6e 69 63 6f a numeric Unico
92f0: 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 2a de character.. *
9300: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
9310: 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f Returns non-zero
9320: 20 69 66 20 63 68 61 72 61 63 74 65 72 20 69 73 if character is
9330: 20 61 20 64 69 67 69 74 2e 0a 20 2a 0a 20 2a 20 a digit.. *. *
9340: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
9350: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93a0: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f --. */..int.Tcl_
93b0: 55 6e 69 43 68 61 72 49 73 44 69 67 69 74 28 0a UniCharIsDigit(.
93c0: 20 20 20 20 69 6e 74 20 63 68 29 09 09 09 2f 2a int ch).../*
93d0: 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 Unicode charact
93e0: 65 72 20 74 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b er to test. */.{
93f0: 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 .#if TCL_UTF_MAX
9400: 20 3e 20 33 0a 20 20 20 20 69 66 20 28 55 4e 49 > 3. if (UNI
9410: 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 CODE_OUT_OF_RANG
9420: 45 28 63 68 29 29 20 7b 0a 09 72 65 74 75 72 6e E(ch)) {..return
9430: 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0;. }.#endif
9440: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 47 65 74 . return (Get
9450: 43 61 74 65 67 6f 72 79 28 63 68 29 20 3d 3d 20 Category(ch) ==
9460: 44 45 43 49 4d 41 4c 5f 44 49 47 49 54 5f 4e 55 DECIMAL_DIGIT_NU
9470: 4d 42 45 52 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a MBER);.}.../*. *
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
94d0: 5f 55 6e 69 43 68 61 72 49 73 47 72 61 70 68 20 _UniCharIsGraph
94e0: 2d 2d 0a 20 2a 0a 20 2a 09 54 65 73 74 20 69 66 --. *. *.Test if
94f0: 20 61 20 63 68 61 72 61 63 74 65 72 20 69 73 20 a character is
9500: 61 6e 79 20 55 6e 69 63 6f 64 65 20 70 72 69 6e any Unicode prin
9510: 74 20 63 68 61 72 61 63 74 65 72 20 65 78 63 65 t character exce
9520: 70 74 20 73 70 61 63 65 2e 0a 20 2a 0a 20 2a 20 pt space.. *. *
9530: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
9540: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 rns non-zero if
9550: 63 68 61 72 61 63 74 65 72 20 69 73 20 70 72 69 character is pri
9560: 6e 74 61 62 6c 65 2c 20 62 75 74 20 6e 6f 74 20 ntable, but not
9570: 73 70 61 63 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 space.. *. * Sid
9580: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
9590: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
95a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
95e0: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 */..int.Tcl_Uni
95f0: 43 68 61 72 49 73 47 72 61 70 68 28 0a 20 20 20 CharIsGraph(.
9600: 20 69 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 6e int ch).../* Un
9610: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 icode character
9620: 74 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b 0a 23 69 to test. */.{.#i
9630: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3e 20 f TCL_UTF_MAX >
9640: 33 0a 20 20 20 20 69 66 20 28 55 4e 49 43 4f 44 3. if (UNICOD
9650: 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 45 28 63 E_OUT_OF_RANGE(c
9660: 68 29 29 20 7b 0a 09 63 68 20 26 3d 20 30 78 31 h)) {..ch &= 0x1
9670: 46 46 46 46 46 3b 0a 09 72 65 74 75 72 6e 20 28 FFFFF;..return (
9680: 63 68 20 3e 3d 20 30 78 45 30 31 30 30 29 20 26 ch >= 0xE0100) &
9690: 26 20 28 63 68 20 3c 3d 20 30 78 45 30 31 45 46 & (ch <= 0xE01EF
96a0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
96b0: 20 20 20 20 72 65 74 75 72 6e 20 28 28 47 52 41 return ((GRA
96c0: 50 48 5f 42 49 54 53 20 3e 3e 20 47 65 74 43 61 PH_BITS >> GetCa
96d0: 74 65 67 6f 72 79 28 63 68 29 29 20 26 20 31 29 tegory(ch)) & 1)
96e0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9730: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 -. *. * Tcl_UniC
9740: 68 61 72 49 73 4c 6f 77 65 72 20 2d 2d 0a 20 2a harIsLower --. *
9750: 0a 20 2a 09 54 65 73 74 20 69 66 20 61 20 63 68 . *.Test if a ch
9760: 61 72 61 63 74 65 72 20 69 73 20 61 20 6c 6f 77 aracter is a low
9770: 65 72 63 61 73 65 20 55 6e 69 63 6f 64 65 20 63 ercase Unicode c
9780: 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 haracter.. *. *
9790: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
97a0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 rns non-zero if
97b0: 63 68 61 72 61 63 74 65 72 20 69 73 20 6c 6f 77 character is low
97c0: 65 72 63 61 73 65 2e 0a 20 2a 0a 20 2a 20 53 69 ercase.. *. * Si
97d0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
97e0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
97f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9830: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e . */..int.Tcl_Un
9840: 69 43 68 61 72 49 73 4c 6f 77 65 72 28 0a 20 20 iCharIsLower(.
9850: 20 20 69 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 int ch).../* U
9860: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 nicode character
9870: 20 74 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b 0a 23 to test. */.{.#
9880: 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3e if TCL_UTF_MAX >
9890: 20 33 0a 20 20 20 20 69 66 20 28 55 4e 49 43 4f 3. if (UNICO
98a0: 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 45 28 DE_OUT_OF_RANGE(
98b0: 63 68 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 ch)) {..return 0
98c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
98d0: 20 20 20 72 65 74 75 72 6e 20 28 47 65 74 43 61 return (GetCa
98e0: 74 65 67 6f 72 79 28 63 68 29 20 3d 3d 20 4c 4f tegory(ch) == LO
98f0: 57 45 52 43 41 53 45 5f 4c 45 54 54 45 52 29 3b WERCASE_LETTER);
9900: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
9910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9950: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 68 . *. * Tcl_UniCh
9960: 61 72 49 73 50 72 69 6e 74 20 2d 2d 0a 20 2a 0a arIsPrint --. *.
9970: 20 2a 09 54 65 73 74 20 69 66 20 61 20 63 68 61 *.Test if a cha
9980: 72 61 63 74 65 72 20 69 73 20 61 20 55 6e 69 63 racter is a Unic
9990: 6f 64 65 20 70 72 69 6e 74 20 63 68 61 72 61 63 ode print charac
99a0: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
99b0: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 6e ts:. *.Returns n
99c0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 63 68 61 72 61 on-zero if chara
99d0: 63 74 65 72 20 69 73 20 70 72 69 6e 74 61 62 6c cter is printabl
99e0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
99f0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
9a00: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
9a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
9a50: 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 61 72 .int.Tcl_UniChar
9a60: 49 73 50 72 69 6e 74 28 0a 20 20 20 20 69 6e 74 IsPrint(. int
9a70: 20 63 68 29 09 09 09 2f 2a 20 55 6e 69 63 6f 64 ch).../* Unicod
9a80: 65 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 74 e character to t
9a90: 65 73 74 2e 20 2a 2f 0a 7b 0a 23 69 66 20 54 43 est. */.{.#if TC
9aa0: 4c 5f 55 54 46 5f 4d 41 58 20 3e 20 33 0a 20 20 L_UTF_MAX > 3.
9ab0: 20 20 69 66 20 28 55 4e 49 43 4f 44 45 5f 4f 55 if (UNICODE_OU
9ac0: 54 5f 4f 46 5f 52 41 4e 47 45 28 63 68 29 29 20 T_OF_RANGE(ch))
9ad0: 7b 0a 09 63 68 20 26 3d 20 30 78 31 46 46 46 46 {..ch &= 0x1FFFF
9ae0: 46 3b 0a 09 72 65 74 75 72 6e 20 28 63 68 20 3e F;..return (ch >
9af0: 3d 20 30 78 45 30 31 30 30 29 20 26 26 20 28 63 = 0xE0100) && (c
9b00: 68 20 3c 3d 20 30 78 45 30 31 45 46 29 3b 0a 20 h <= 0xE01EF);.
9b10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
9b20: 72 65 74 75 72 6e 20 28 28 28 47 52 41 50 48 5f return (((GRAPH_
9b30: 42 49 54 53 7c 53 50 41 43 45 5f 42 49 54 53 29 BITS|SPACE_BITS)
9b40: 20 3e 3e 20 47 65 74 43 61 74 65 67 6f 72 79 28 >> GetCategory(
9b50: 63 68 29 29 20 26 20 31 29 3b 0a 7d 0a 0c 0a 2f ch)) & 1);.}.../
9b60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9b70: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a ----------. *. *
9bb0: 20 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 50 75 Tcl_UniCharIsPu
9bc0: 6e 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 65 73 nct --. *. *.Tes
9bd0: 74 20 69 66 20 61 20 63 68 61 72 61 63 74 65 72 t if a character
9be0: 20 69 73 20 61 20 55 6e 69 63 6f 64 65 20 70 75 is a Unicode pu
9bf0: 6e 63 74 75 61 74 69 6f 6e 20 63 68 61 72 61 63 nctuation charac
9c00: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ter.. *. * Resul
9c10: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 6e ts:. *.Returns n
9c20: 6f 6e 2d 7a 65 72 6f 20 69 66 20 63 68 61 72 61 on-zero if chara
9c30: 63 74 65 72 20 69 73 20 70 75 6e 63 74 2e 0a 20 cter is punct..
9c40: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
9c50: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
9c60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
9c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
9cb0: 0a 54 63 6c 5f 55 6e 69 43 68 61 72 49 73 50 75 .Tcl_UniCharIsPu
9cc0: 6e 63 74 28 0a 20 20 20 20 69 6e 74 20 63 68 29 nct(. int ch)
9cd0: 09 09 09 2f 2a 20 55 6e 69 63 6f 64 65 20 63 68 .../* Unicode ch
9ce0: 61 72 61 63 74 65 72 20 74 6f 20 74 65 73 74 2e aracter to test.
9cf0: 20 2a 2f 0a 7b 0a 23 69 66 20 54 43 4c 5f 55 54 */.{.#if TCL_UT
9d00: 46 5f 4d 41 58 20 3e 20 33 0a 20 20 20 20 69 66 F_MAX > 3. if
9d10: 20 28 55 4e 49 43 4f 44 45 5f 4f 55 54 5f 4f 46 (UNICODE_OUT_OF
9d20: 5f 52 41 4e 47 45 28 63 68 29 29 20 7b 0a 09 72 _RANGE(ch)) {..r
9d30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 23 eturn 0;. }.#
9d40: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e endif. return
9d50: 20 28 28 50 55 4e 43 54 5f 42 49 54 53 20 3e 3e ((PUNCT_BITS >>
9d60: 20 47 65 74 43 61 74 65 67 6f 72 79 28 63 68 29 GetCategory(ch)
9d70: 29 20 26 20 31 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ) & 1);.}.../*.
9d80: 2a 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
9dd0: 6c 5f 55 6e 69 43 68 61 72 49 73 53 70 61 63 65 l_UniCharIsSpace
9de0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 65 73 74 20 69 --. *. *.Test i
9df0: 66 20 61 20 63 68 61 72 61 63 74 65 72 20 69 73 f a character is
9e00: 20 61 20 77 68 69 74 65 73 70 61 63 65 20 55 6e a whitespace Un
9e10: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e icode character.
9e20: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
9e30: 20 2a 09 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a *.Returns non-z
9e40: 65 72 6f 20 69 66 20 63 68 61 72 61 63 74 65 72 ero if character
9e50: 20 69 73 20 61 20 73 70 61 63 65 2e 0a 20 2a 0a is a space.. *.
9e60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
9e70: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
9e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
9ed0: 63 6c 5f 55 6e 69 43 68 61 72 49 73 53 70 61 63 cl_UniCharIsSpac
9ee0: 65 28 0a 20 20 20 20 69 6e 74 20 63 68 29 09 09 e(. int ch)..
9ef0: 09 2f 2a 20 55 6e 69 63 6f 64 65 20 63 68 61 72 ./* Unicode char
9f00: 61 63 74 65 72 20 74 6f 20 74 65 73 74 2e 20 2a acter to test. *
9f10: 2f 0a 7b 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f /.{.#if TCL_UTF_
9f20: 4d 41 58 20 3e 20 33 0a 20 20 20 20 2f 2a 20 49 MAX > 3. /* I
9f30: 67 6e 6f 72 65 20 75 70 70 65 72 20 31 31 20 62 gnore upper 11 b
9f40: 69 74 73 2e 20 2a 2f 0a 20 20 20 20 63 68 20 26 its. */. ch &
9f50: 3d 20 30 78 31 46 46 46 46 46 3b 0a 23 65 6c 73 = 0x1FFFFF;.#els
9f60: 65 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 e. /* Ignore
9f70: 75 70 70 65 72 20 31 36 20 62 69 74 73 2e 20 2a upper 16 bits. *
9f80: 2f 0a 20 20 20 20 63 68 20 26 3d 20 30 78 46 46 /. ch &= 0xFF
9f90: 46 46 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 FF;.#endif..
9fa0: 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65 /*. * If the
9fb0: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 77 69 character is wi
9fc0: 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 31 thin the first 1
9fd0: 32 37 20 63 68 61 72 61 63 74 65 72 73 2c 20 6a 27 characters, j
9fe0: 75 73 74 20 75 73 65 20 74 68 65 0a 20 20 20 20 ust use the.
9ff0: 20 2a 20 73 74 61 6e 64 61 72 64 20 43 20 66 75 * standard C fu
a000: 6e 63 74 69 6f 6e 2c 20 6f 74 68 65 72 77 69 73 nction, otherwis
a010: 65 20 63 6f 6e 73 75 6c 74 20 74 68 65 20 55 6e e consult the Un
a020: 69 63 6f 64 65 20 74 61 62 6c 65 2e 0a 20 20 20 icode table..
a030: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 63 68 */.. if (ch
a040: 20 3c 20 30 78 38 30 29 20 7b 0a 09 72 65 74 75 < 0x80) {..retu
a050: 72 6e 20 54 63 6c 49 73 53 70 61 63 65 50 72 6f rn TclIsSpacePro
a060: 63 28 28 63 68 61 72 29 20 63 68 29 3b 0a 23 69 c((char) ch);.#i
a070: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3e 20 f TCL_UTF_MAX >
a080: 33 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 3. } else if
a090: 28 55 4e 49 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f (UNICODE_OUT_OF_
a0a0: 52 41 4e 47 45 28 63 68 29 29 20 7b 0a 09 72 65 RANGE(ch)) {..re
a0b0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 turn 0;.#endif.
a0c0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 68 } else if (ch
a0d0: 20 3d 3d 20 30 78 30 30 38 35 20 7c 7c 20 63 68 == 0x0085 || ch
a0e0: 20 3d 3d 20 30 78 31 38 30 45 20 7c 7c 20 63 68 == 0x180E || ch
a0f0: 20 3d 3d 20 30 78 32 30 30 42 0a 09 20 20 20 20 == 0x200B..
a100: 7c 7c 20 63 68 20 3d 3d 20 30 78 32 30 32 46 20 || ch == 0x202F
a110: 7c 7c 20 63 68 20 3d 3d 20 30 78 32 30 36 30 20 || ch == 0x2060
a120: 7c 7c 20 63 68 20 3d 3d 20 30 78 46 45 46 46 29 || ch == 0xFEFF)
a130: 20 7b 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 {..return 1;.
a140: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 75 } else {..retu
a150: 72 6e 20 28 28 53 50 41 43 45 5f 42 49 54 53 20 rn ((SPACE_BITS
a160: 3e 3e 20 47 65 74 43 61 74 65 67 6f 72 79 28 63 >> GetCategory(c
a170: 68 29 29 20 26 20 31 29 3b 0a 20 20 20 20 7d 0a h)) & 1);. }.
a180: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
a190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
a1d0: 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 68 61 *. * Tcl_UniCha
a1e0: 72 49 73 55 70 70 65 72 20 2d 2d 0a 20 2a 0a 20 rIsUpper --. *.
a1f0: 2a 09 54 65 73 74 20 69 66 20 61 20 63 68 61 72 *.Test if a char
a200: 61 63 74 65 72 20 69 73 20 61 20 75 70 70 65 72 acter is a upper
a210: 63 61 73 65 20 55 6e 69 63 6f 64 65 20 63 68 61 case Unicode cha
a220: 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 racter.. *. * Re
a230: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
a240: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 63 68 s non-zero if ch
a250: 61 72 61 63 74 65 72 20 69 73 20 75 70 70 65 72 aracter is upper
a260: 63 61 73 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 case.. *. * Side
a270: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
a280: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
a290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a2d0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 */..int.Tcl_UniC
a2e0: 68 61 72 49 73 55 70 70 65 72 28 0a 20 20 20 20 harIsUpper(.
a2f0: 69 6e 74 20 63 68 29 09 09 09 2f 2a 20 55 6e 69 int ch).../* Uni
a300: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 74 code character t
a310: 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b 0a 23 69 66 o test. */.{.#if
a320: 20 54 43 4c 5f 55 54 46 5f 4d 41 58 20 3e 20 33 TCL_UTF_MAX > 3
a330: 0a 20 20 20 20 69 66 20 28 55 4e 49 43 4f 44 45 . if (UNICODE
a340: 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 45 28 63 68 _OUT_OF_RANGE(ch
a350: 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a )) {..return 0;.
a360: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
a370: 20 72 65 74 75 72 6e 20 28 47 65 74 43 61 74 65 return (GetCate
a380: 67 6f 72 79 28 63 68 29 20 3d 3d 20 55 50 50 45 gory(ch) == UPPE
a390: 52 43 41 53 45 5f 4c 45 54 54 45 52 29 3b 0a 7d RCASE_LETTER);.}
a3a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
a3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a3f0: 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 68 61 72 *. * Tcl_UniChar
a400: 49 73 57 6f 72 64 43 68 61 72 20 2d 2d 0a 20 2a IsWordChar --. *
a410: 0a 20 2a 09 54 65 73 74 20 69 66 20 61 20 63 68 . *.Test if a ch
a420: 61 72 61 63 74 65 72 20 69 73 20 61 6c 70 68 61 aracter is alpha
a430: 6e 75 6d 65 72 69 63 20 6f 72 20 61 20 63 6f 6e numeric or a con
a440: 6e 65 63 74 6f 72 20 70 75 6e 63 74 75 61 74 69 nector punctuati
a450: 6f 6e 20 6d 61 72 6b 2e 0a 20 2a 0a 20 2a 20 52 on mark.. *. * R
a460: 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 esults:. *.Retur
a470: 6e 73 20 31 20 69 66 20 63 68 61 72 61 63 74 65 ns 1 if characte
a480: 72 20 69 73 20 61 20 77 6f 72 64 20 63 68 61 72 r is a word char
a490: 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 acter.. *. * Sid
a4a0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
a4b0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
a4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
a500: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 */..int.Tcl_Uni
a510: 43 68 61 72 49 73 57 6f 72 64 43 68 61 72 28 0a CharIsWordChar(.
a520: 20 20 20 20 69 6e 74 20 63 68 29 09 09 09 2f 2a int ch).../*
a530: 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 Unicode charact
a540: 65 72 20 74 6f 20 74 65 73 74 2e 20 2a 2f 0a 7b er to test. */.{
a550: 0a 23 69 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 .#if TCL_UTF_MAX
a560: 20 3e 20 33 0a 20 20 20 20 69 66 20 28 55 4e 49 > 3. if (UNI
a570: 43 4f 44 45 5f 4f 55 54 5f 4f 46 5f 52 41 4e 47 CODE_OUT_OF_RANG
a580: 45 28 63 68 29 29 20 7b 0a 09 72 65 74 75 72 6e E(ch)) {..return
a590: 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0;. }.#endif
a5a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 57 4f . return ((WO
a5b0: 52 44 5f 42 49 54 53 20 3e 3e 20 47 65 74 43 61 RD_BITS >> GetCa
a5c0: 74 65 67 6f 72 79 28 63 68 29 29 20 26 20 31 29 tegory(ch)) & 1)
a5d0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
a5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a620: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 55 6e 69 43 -. *. * Tcl_UniC
a630: 68 61 72 43 61 73 65 4d 61 74 63 68 20 2d 2d 0a harCaseMatch --.
a640: 20 2a 0a 20 2a 09 53 65 65 20 69 66 20 61 20 70 *. *.See if a p
a650: 61 72 74 69 63 75 6c 61 72 20 55 6e 69 63 6f 64 articular Unicod
a660: 65 20 73 74 72 69 6e 67 20 6d 61 74 63 68 65 73 e string matches
a670: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 61 a particular pa
a680: 74 74 65 72 6e 2e 0a 20 2a 09 41 6c 6c 6f 77 73 ttern.. *.Allows
a690: 20 63 61 73 65 20 69 6e 73 65 6e 73 69 74 69 76 case insensitiv
a6a0: 69 74 79 2e 20 54 68 69 73 20 69 73 20 74 68 65 ity. This is the
a6b0: 20 55 6e 69 63 6f 64 65 20 65 71 75 69 76 61 6c Unicode equival
a6c0: 65 6e 74 20 6f 66 20 74 68 65 20 63 68 61 72 2a ent of the char*
a6d0: 0a 20 2a 09 54 63 6c 5f 53 74 72 69 6e 67 43 61 . *.Tcl_StringCa
a6e0: 73 65 4d 61 74 63 68 2e 20 54 68 65 20 55 6e 69 seMatch. The Uni
a6f0: 43 68 61 72 20 73 74 72 69 6e 67 73 20 6d 75 73 Char strings mus
a700: 74 20 62 65 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e t be NULL-termin
a710: 61 74 65 64 2e 0a 20 2a 09 54 68 69 73 20 68 61 ated.. *.This ha
a720: 73 20 6e 6f 20 70 72 6f 76 69 73 69 6f 6e 20 66 s no provision f
a730: 6f 72 20 63 6f 75 6e 74 65 64 20 55 6e 69 43 68 or counted UniCh
a740: 61 72 20 73 74 72 69 6e 67 73 2c 20 74 68 75 73 ar strings, thus
a750: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 20 should not be.
a760: 2a 09 75 73 65 64 20 77 68 65 72 65 20 4e 55 4c *.used where NUL
a770: 4c 73 20 61 72 65 20 65 78 70 65 63 74 65 64 20 Ls are expected
a780: 69 6e 20 74 68 65 20 55 6e 69 43 68 61 72 20 73 in the UniChar s
a790: 74 72 69 6e 67 2e 20 55 73 65 0a 20 2a 09 54 63 tring. Use. *.Tc
a7a0: 6c 55 6e 69 43 68 61 72 4d 61 74 63 68 20 77 68 lUniCharMatch wh
a7b0: 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 2a ere possible.. *
a7c0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
a7d0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 The return value
a7e0: 20 69 73 20 31 20 69 66 20 73 74 72 69 6e 67 20 is 1 if string
a7f0: 6d 61 74 63 68 65 73 20 70 61 74 74 65 72 6e 2c matches pattern,
a800: 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 and 0 otherwise
a810: 2e 20 54 68 65 0a 20 2a 09 6d 61 74 63 68 69 6e . The. *.matchin
a820: 67 20 6f 70 65 72 61 74 69 6f 6e 20 70 65 72 6d g operation perm
a830: 69 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e its the followin
a840: 67 20 73 70 65 63 69 61 6c 20 63 68 61 72 61 63 g special charac
a850: 74 65 72 73 20 69 6e 20 74 68 65 0a 20 2a 09 70 ters in the. *.p
a860: 61 74 74 65 72 6e 3a 20 2a 3f 5c 5b 5d 20 28 73 attern: *?\[] (s
a870: 65 65 20 74 68 65 20 6d 61 6e 75 61 6c 20 65 6e ee the manual en
a880: 74 72 79 20 66 6f 72 20 64 65 74 61 69 6c 73 20 try for details
a890: 6f 6e 20 77 68 61 74 20 74 68 65 73 65 20 6d 65 on what these me
a8a0: 61 6e 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 an).. *. * Side
a8b0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
a8c0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
a8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
a910: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 55 6e 69 43 68 /..int.Tcl_UniCh
a920: 61 72 43 61 73 65 4d 61 74 63 68 28 0a 20 20 20 arCaseMatch(.
a930: 20 63 6f 6e 73 74 20 54 63 6c 5f 55 6e 69 43 68 const Tcl_UniCh
a940: 61 72 20 2a 75 6e 69 53 74 72 2c 09 2f 2a 20 55 ar *uniStr,./* U
a950: 6e 69 63 6f 64 65 20 53 74 72 69 6e 67 2e 20 2a nicode String. *
a960: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c 5f /. const Tcl_
a970: 55 6e 69 43 68 61 72 20 2a 75 6e 69 50 61 74 74 UniChar *uniPatt
a980: 65 72 6e 2c 0a 09 09 09 09 2f 2a 20 50 61 74 74 ern,...../* Patt
a990: 65 72 6e 2c 20 77 68 69 63 68 20 6d 61 79 20 63 ern, which may c
a9a0: 6f 6e 74 61 69 6e 20 73 70 65 63 69 61 6c 0a 09 ontain special..
a9b0: 09 09 09 20 2a 20 63 68 61 72 61 63 74 65 72 73 ... * characters
a9c0: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f 63 . */. int noc
a9d0: 61 73 65 29 09 09 09 2f 2a 20 30 20 66 6f 72 20 ase).../* 0 for
a9e0: 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2c 20 case sensitive,
a9f0: 31 20 66 6f 72 20 69 6e 73 65 6e 73 69 74 69 76 1 for insensitiv
aa00: 65 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 55 e */.{. Tcl_U
aa10: 6e 69 43 68 61 72 20 63 68 31 20 3d 20 30 2c 20 niChar ch1 = 0,
aa20: 70 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 p;.. while (1
aa30: 29 20 7b 0a 09 70 20 3d 20 2a 75 6e 69 50 61 74 ) {..p = *uniPat
aa40: 74 65 72 6e 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 tern;.../*.. * S
aa50: 65 65 20 69 66 20 77 65 27 72 65 20 61 74 20 74 ee if we're at t
aa60: 68 65 20 65 6e 64 20 6f 66 20 62 6f 74 68 20 74 he end of both t
aa70: 68 65 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74 he pattern and t
aa80: 68 65 20 73 74 72 69 6e 67 2e 20 49 66 20 73 6f he string. If so
aa90: 2c 0a 09 20 2a 20 77 65 20 73 75 63 63 65 65 64 ,.. * we succeed
aaa0: 65 64 2e 20 49 66 20 77 65 27 72 65 20 61 74 20 ed. If we're at
aab0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 the end of the p
aac0: 61 74 74 65 72 6e 20 62 75 74 20 6e 6f 74 20 61 attern but not a
aad0: 74 20 74 68 65 20 65 6e 64 0a 09 20 2a 20 6f 66 t the end.. * of
aae0: 20 74 68 65 20 73 74 72 69 6e 67 2c 20 77 65 20 the string, we
aaf0: 66 61 69 6c 65 64 2e 0a 09 20 2a 2f 0a 0a 09 69 failed... */...i
ab00: 66 20 28 70 20 3d 3d 20 30 29 20 7b 0a 09 20 20 f (p == 0) {..
ab10: 20 20 72 65 74 75 72 6e 20 28 2a 75 6e 69 53 74 return (*uniSt
ab20: 72 20 3d 3d 20 30 29 3b 0a 09 7d 0a 09 69 66 20 r == 0);..}..if
ab30: 28 28 2a 75 6e 69 53 74 72 20 3d 3d 20 30 29 20 ((*uniStr == 0)
ab40: 26 26 20 28 70 20 21 3d 20 27 2a 27 29 29 20 7b && (p != '*')) {
ab50: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a .. return 0;.
ab60: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63 .}.../*.. * Chec
ab70: 6b 20 66 6f 72 20 61 20 22 2a 22 20 61 73 20 74 k for a "*" as t
ab80: 68 65 20 6e 65 78 74 20 70 61 74 74 65 72 6e 20 he next pattern
ab90: 63 68 61 72 61 63 74 65 72 2e 20 49 74 20 6d 61 character. It ma
aba0: 74 63 68 65 73 20 61 6e 79 0a 09 20 2a 20 73 75 tches any.. * su
abb0: 62 73 74 72 69 6e 67 2e 20 57 65 20 68 61 6e 64 bstring. We hand
abc0: 6c 65 20 74 68 69 73 20 62 79 20 73 6b 69 70 70 le this by skipp
abd0: 69 6e 67 20 61 6c 6c 20 74 68 65 20 63 68 61 72 ing all the char
abe0: 61 63 74 65 72 73 20 75 70 20 74 6f 20 74 68 65 acters up to the
abf0: 0a 09 20 2a 20 6e 65 78 74 20 6d 61 74 63 68 69 .. * next matchi
ac00: 6e 67 20 6f 6e 65 20 69 6e 20 74 68 65 20 70 61 ng one in the pa
ac10: 74 74 65 72 6e 2c 20 61 6e 64 20 74 68 65 6e 20 ttern, and then
ac20: 63 61 6c 6c 69 6e 67 20 6f 75 72 73 65 6c 76 65 calling ourselve
ac30: 73 0a 09 20 2a 20 72 65 63 75 72 73 69 76 65 6c s.. * recursivel
ac40: 79 20 66 6f 72 20 65 61 63 68 20 70 6f 73 74 66 y for each postf
ac50: 69 78 20 6f 66 20 73 74 72 69 6e 67 2c 20 75 6e ix of string, un
ac60: 74 69 6c 20 65 69 74 68 65 72 20 77 65 20 6d 61 til either we ma
ac70: 74 63 68 20 6f 72 20 77 65 0a 09 20 2a 20 72 65 tch or we.. * re
ac80: 61 63 68 20 74 68 65 20 65 6e 64 20 6f 66 20 74 ach the end of t
ac90: 68 65 20 73 74 72 69 6e 67 2e 0a 09 20 2a 2f 0a he string... */.
aca0: 0a 09 69 66 20 28 70 20 3d 3d 20 27 2a 27 29 20 ..if (p == '*')
acb0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
acc0: 2a 20 53 6b 69 70 20 61 6c 6c 20 73 75 63 63 65 * Skip all succe
acd0: 73 73 69 76 65 20 2a 27 73 20 69 6e 20 74 68 65 ssive *'s in the
ace0: 20 70 61 74 74 65 72 6e 0a 09 20 20 20 20 20 2a pattern.. *
acf0: 2f 0a 0a 09 20 20 20 20 77 68 69 6c 65 20 28 2a /... while (*
ad00: 28 2b 2b 75 6e 69 50 61 74 74 65 72 6e 29 20 3d (++uniPattern) =
ad10: 3d 20 27 2a 27 29 20 7b 0a 09 09 2f 2a 20 65 6d = '*') {.../* em
ad20: 70 74 79 20 62 6f 64 79 20 2a 2f 0a 09 20 20 20 pty body */..
ad30: 20 7d 0a 09 20 20 20 20 70 20 3d 20 2a 75 6e 69 }.. p = *uni
ad40: 50 61 74 74 65 72 6e 3b 0a 09 20 20 20 20 69 66 Pattern;.. if
ad50: 20 28 70 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 (p == 0) {...re
ad60: 74 75 72 6e 20 31 3b 0a 09 20 20 20 20 7d 0a 09 turn 1;.. }..
ad70: 20 20 20 20 69 66 20 28 6e 6f 63 61 73 65 29 20 if (nocase)
ad80: 7b 0a 09 09 70 20 3d 20 54 63 6c 5f 55 6e 69 43 {...p = Tcl_UniC
ad90: 68 61 72 54 6f 4c 6f 77 65 72 28 70 29 3b 0a 09 harToLower(p);..
ada0: 20 20 20 20 7d 0a 09 20 20 20 20 77 68 69 6c 65 }.. while
adb0: 20 28 31 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a (1) {.../*... *
adc0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f Optimization fo
add0: 72 20 6d 61 74 63 68 69 6e 67 20 2d 20 63 72 75 r matching - cru
ade0: 69 73 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 ise through the
adf0: 73 74 72 69 6e 67 0a 09 09 20 2a 20 71 75 69 63 string... * quic
ae00: 6b 6c 79 20 69 66 20 74 68 65 20 6e 65 78 74 20 kly if the next
ae10: 63 68 61 72 20 69 6e 20 74 68 65 20 70 61 74 74 char in the patt
ae20: 65 72 6e 20 69 73 6e 27 74 20 61 20 73 70 65 63 ern isn't a spec
ae30: 69 61 6c 0a 09 09 20 2a 20 63 68 61 72 61 63 74 ial... * charact
ae40: 65 72 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 er... */....if (
ae50: 28 70 20 21 3d 20 27 5b 27 29 20 26 26 20 28 70 (p != '[') && (p
ae60: 20 21 3d 20 27 3f 27 29 20 26 26 20 28 70 20 21 != '?') && (p !
ae70: 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 09 20 20 20 = '\\')) {...
ae80: 20 69 66 20 28 6e 6f 63 61 73 65 29 20 7b 0a 09 if (nocase) {..
ae90: 09 09 77 68 69 6c 65 20 28 2a 75 6e 69 53 74 72 ..while (*uniStr
aea0: 20 26 26 20 28 70 20 21 3d 20 2a 75 6e 69 53 74 && (p != *uniSt
aeb0: 72 29 0a 09 09 09 09 26 26 20 28 70 20 21 3d 20 r).....&& (p !=
aec0: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 Tcl_UniCharToLow
aed0: 65 72 28 2a 75 6e 69 53 74 72 29 29 29 20 7b 0a er(*uniStr))) {.
aee0: 09 09 09 20 20 20 20 75 6e 69 53 74 72 2b 2b 3b ... uniStr++;
aef0: 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 20 65 6c ....}... } el
af00: 73 65 20 7b 0a 09 09 09 77 68 69 6c 65 20 28 2a se {....while (*
af10: 75 6e 69 53 74 72 20 26 26 20 28 70 20 21 3d 20 uniStr && (p !=
af20: 2a 75 6e 69 53 74 72 29 29 20 7b 0a 09 09 09 20 *uniStr)) {....
af30: 20 20 20 75 6e 69 53 74 72 2b 2b 3b 0a 09 09 09 uniStr++;....
af40: 7d 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 }... }...}...
af50: 69 66 20 28 54 63 6c 5f 55 6e 69 43 68 61 72 43 if (Tcl_UniCharC
af60: 61 73 65 4d 61 74 63 68 28 75 6e 69 53 74 72 2c aseMatch(uniStr,
af70: 20 75 6e 69 50 61 74 74 65 72 6e 2c 20 6e 6f 63 uniPattern, noc
af80: 61 73 65 29 29 20 7b 0a 09 09 20 20 20 20 72 65 ase)) {... re
af90: 74 75 72 6e 20 31 3b 0a 09 09 7d 0a 09 09 69 66 turn 1;...}...if
afa0: 20 28 2a 75 6e 69 53 74 72 20 3d 3d 20 30 29 20 (*uniStr == 0)
afb0: 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 {... return 0
afc0: 3b 0a 09 09 7d 0a 09 09 75 6e 69 53 74 72 2b 2b ;...}...uniStr++
afd0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a ;.. }..}.../*
afe0: 0a 09 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 .. * Check for a
aff0: 20 22 3f 22 20 61 73 20 74 68 65 20 6e 65 78 74 "?" as the next
b000: 20 70 61 74 74 65 72 6e 20 63 68 61 72 61 63 74 pattern charact
b010: 65 72 2e 20 49 74 20 6d 61 74 63 68 65 73 20 61 er. It matches a
b020: 6e 79 0a 09 20 2a 20 73 69 6e 67 6c 65 20 63 68 ny.. * single ch
b030: 61 72 61 63 74 65 72 2e 0a 09 20 2a 2f 0a 0a 09 aracter... */...
b040: 69 66 20 28 70 20 3d 3d 20 27 3f 27 29 20 7b 0a if (p == '?') {.
b050: 09 20 20 20 20 75 6e 69 50 61 74 74 65 72 6e 2b . uniPattern+
b060: 2b 3b 0a 09 20 20 20 20 75 6e 69 53 74 72 2b 2b +;.. uniStr++
b070: 3b 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b ;.. continue;
b080: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 ..}.../*.. * Che
b090: 63 6b 20 66 6f 72 20 61 20 22 5b 22 20 61 73 20 ck for a "[" as
b0a0: 74 68 65 20 6e 65 78 74 20 70 61 74 74 65 72 6e the next pattern
b0b0: 20 63 68 61 72 61 63 74 65 72 2e 20 49 74 20 69 character. It i
b0c0: 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 0a s followed by a.
b0d0: 09 20 2a 20 6c 69 73 74 20 6f 66 20 63 68 61 72 . * list of char
b0e0: 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20 acters that are
b0f0: 61 63 63 65 70 74 61 62 6c 65 2c 20 6f 72 20 62 acceptable, or b
b100: 79 20 61 20 72 61 6e 67 65 20 28 74 77 6f 0a 09 y a range (two..
b110: 20 2a 20 63 68 61 72 61 63 74 65 72 73 20 73 65 * characters se
b120: 70 61 72 61 74 65 64 20 62 79 20 22 2d 22 29 2e parated by "-").
b130: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 20 3d 3d .. */...if (p ==
b140: 20 27 5b 27 29 20 7b 0a 09 20 20 20 20 54 63 6c '[') {.. Tcl
b150: 5f 55 6e 69 43 68 61 72 20 73 74 61 72 74 43 68 _UniChar startCh
b160: 61 72 2c 20 65 6e 64 43 68 61 72 3b 0a 0a 09 20 ar, endChar;...
b170: 20 20 20 75 6e 69 50 61 74 74 65 72 6e 2b 2b 3b uniPattern++;
b180: 0a 09 20 20 20 20 63 68 31 20 3d 20 28 6e 6f 63 .. ch1 = (noc
b190: 61 73 65 20 3f 20 54 63 6c 5f 55 6e 69 43 68 61 ase ? Tcl_UniCha
b1a0: 72 54 6f 4c 6f 77 65 72 28 2a 75 6e 69 53 74 72 rToLower(*uniStr
b1b0: 29 20 3a 20 2a 75 6e 69 53 74 72 29 3b 0a 09 20 ) : *uniStr);..
b1c0: 20 20 20 75 6e 69 53 74 72 2b 2b 3b 0a 09 20 20 uniStr++;..
b1d0: 20 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 while (1) {...
b1e0: 69 66 20 28 28 2a 75 6e 69 50 61 74 74 65 72 6e if ((*uniPattern
b1f0: 20 3d 3d 20 27 5d 27 29 20 7c 7c 20 28 2a 75 6e == ']') || (*un
b200: 69 50 61 74 74 65 72 6e 20 3d 3d 20 30 29 29 20 iPattern == 0))
b210: 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 {... return 0
b220: 3b 0a 09 09 7d 0a 09 09 73 74 61 72 74 43 68 61 ;...}...startCha
b230: 72 20 3d 20 28 6e 6f 63 61 73 65 20 3f 20 54 63 r = (nocase ? Tc
b240: 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 l_UniCharToLower
b250: 28 2a 75 6e 69 50 61 74 74 65 72 6e 29 0a 09 09 (*uniPattern)...
b260: 09 3a 20 2a 75 6e 69 50 61 74 74 65 72 6e 29 3b .: *uniPattern);
b270: 0a 09 09 75 6e 69 50 61 74 74 65 72 6e 2b 2b 3b ...uniPattern++;
b280: 0a 09 09 69 66 20 28 2a 75 6e 69 50 61 74 74 65 ...if (*uniPatte
b290: 72 6e 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 20 rn == '-') {...
b2a0: 20 20 20 75 6e 69 50 61 74 74 65 72 6e 2b 2b 3b uniPattern++;
b2b0: 0a 09 09 20 20 20 20 69 66 20 28 2a 75 6e 69 50 ... if (*uniP
b2c0: 61 74 74 65 72 6e 20 3d 3d 20 30 29 20 7b 0a 09 attern == 0) {..
b2d0: 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 09 20 20 ..return 0;...
b2e0: 20 20 7d 0a 09 09 20 20 20 20 65 6e 64 43 68 61 }... endCha
b2f0: 72 20 3d 20 28 6e 6f 63 61 73 65 20 3f 20 54 63 r = (nocase ? Tc
b300: 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 l_UniCharToLower
b310: 28 2a 75 6e 69 50 61 74 74 65 72 6e 29 0a 09 09 (*uniPattern)...
b320: 09 20 20 20 20 3a 20 2a 75 6e 69 50 61 74 74 65 . : *uniPatte
b330: 72 6e 29 3b 0a 09 09 20 20 20 20 75 6e 69 50 61 rn);... uniPa
b340: 74 74 65 72 6e 2b 2b 3b 0a 09 09 20 20 20 20 69 ttern++;... i
b350: 66 20 28 28 28 73 74 61 72 74 43 68 61 72 20 3c f (((startChar <
b360: 3d 20 63 68 31 29 20 26 26 20 28 63 68 31 20 3c = ch1) && (ch1 <
b370: 3d 20 65 6e 64 43 68 61 72 29 29 0a 09 09 09 20 = endChar))....
b380: 20 20 20 7c 7c 20 28 28 65 6e 64 43 68 61 72 20 || ((endChar
b390: 3c 3d 20 63 68 31 29 20 26 26 20 28 63 68 31 20 <= ch1) && (ch1
b3a0: 3c 3d 20 73 74 61 72 74 43 68 61 72 29 29 29 20 <= startChar)))
b3b0: 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 4d 61 {..../*.... * Ma
b3c0: 74 63 68 65 73 20 72 61 6e 67 65 73 20 6f 66 20 tches ranges of
b3d0: 66 6f 72 6d 20 5b 61 2d 7a 5d 20 6f 72 20 5b 7a form [a-z] or [z
b3e0: 2d 61 5d 2e 0a 09 09 09 20 2a 2f 0a 09 09 09 62 -a]..... */....b
b3f0: 72 65 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09 09 reak;... }...
b400: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 61 72 74 } else if (start
b410: 43 68 61 72 20 3d 3d 20 63 68 31 29 20 7b 0a 09 Char == ch1) {..
b420: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a . break;...}.
b430: 09 20 20 20 20 7d 0a 09 20 20 20 20 77 68 69 6c . }.. whil
b440: 65 20 28 2a 75 6e 69 50 61 74 74 65 72 6e 20 21 e (*uniPattern !
b450: 3d 20 27 5d 27 29 20 7b 0a 09 09 69 66 20 28 2a = ']') {...if (*
b460: 75 6e 69 50 61 74 74 65 72 6e 20 3d 3d 20 30 29 uniPattern == 0)
b470: 20 7b 0a 09 09 20 20 20 20 75 6e 69 50 61 74 74 {... uniPatt
b480: 65 72 6e 2d 2d 3b 0a 09 09 20 20 20 20 62 72 65 ern--;... bre
b490: 61 6b 3b 0a 09 09 7d 0a 09 09 75 6e 69 50 61 74 ak;...}...uniPat
b4a0: 74 65 72 6e 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 tern++;.. }..
b4b0: 20 20 20 20 75 6e 69 50 61 74 74 65 72 6e 2b 2b uniPattern++
b4c0: 3b 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b ;.. continue;
b4d0: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 ..}.../*.. * If
b4e0: 74 68 65 20 6e 65 78 74 20 70 61 74 74 65 72 6e the next pattern
b4f0: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 27 5c character is '\
b500: 27 2c 20 6a 75 73 74 20 73 74 72 69 70 20 6f 66 ', just strip of
b510: 66 20 74 68 65 20 27 5c 27 20 73 6f 20 77 65 0a f the '\' so we.
b520: 09 20 2a 20 64 6f 20 65 78 61 63 74 20 6d 61 74 . * do exact mat
b530: 63 68 69 6e 67 20 6f 6e 20 74 68 65 20 63 68 61 ching on the cha
b540: 72 61 63 74 65 72 20 74 68 61 74 20 66 6f 6c 6c racter that foll
b550: 6f 77 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 ows... */...if (
b560: 70 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20 p == '\\') {..
b570: 20 20 69 66 20 28 2a 28 2b 2b 75 6e 69 50 61 74 if (*(++uniPat
b580: 74 65 72 6e 29 20 3d 3d 20 27 5c 30 27 29 20 7b tern) == '\0') {
b590: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 ...return 0;..
b5a0: 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 }..}.../*.. *
b5b0: 54 68 65 72 65 27 73 20 6e 6f 20 73 70 65 63 69 There's no speci
b5c0: 61 6c 20 63 68 61 72 61 63 74 65 72 2e 20 4a 75 al character. Ju
b5d0: 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 st make sure tha
b5e0: 74 20 74 68 65 20 6e 65 78 74 20 62 79 74 65 73 t the next bytes
b5f0: 20 6f 66 0a 09 20 2a 20 65 61 63 68 20 73 74 72 of.. * each str
b600: 69 6e 67 20 6d 61 74 63 68 2e 0a 09 20 2a 2f 0a ing match... */.
b610: 0a 09 69 66 20 28 6e 6f 63 61 73 65 29 20 7b 0a ..if (nocase) {.
b620: 09 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 69 . if (Tcl_Uni
b630: 43 68 61 72 54 6f 4c 6f 77 65 72 28 2a 75 6e 69 CharToLower(*uni
b640: 53 74 72 29 20 21 3d 0a 09 09 20 20 20 20 54 63 Str) !=... Tc
b650: 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 l_UniCharToLower
b660: 28 2a 75 6e 69 50 61 74 74 65 72 6e 29 29 20 7b (*uniPattern)) {
b670: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 ...return 0;..
b680: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 }..} else if (
b690: 2a 75 6e 69 53 74 72 20 21 3d 20 2a 75 6e 69 50 *uniStr != *uniP
b6a0: 61 74 74 65 72 6e 29 20 7b 0a 09 20 20 20 20 72 attern) {.. r
b6b0: 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 09 75 6e 69 eturn 0;..}..uni
b6c0: 53 74 72 2b 2b 3b 0a 09 75 6e 69 50 61 74 74 65 Str++;..uniPatte
b6d0: 72 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a rn++;. }.}...
b6e0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
b6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
b730: 2a 20 54 63 6c 55 6e 69 43 68 61 72 4d 61 74 63 * TclUniCharMatc
b740: 68 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 65 20 69 h --. *. *.See i
b750: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 55 f a particular U
b760: 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 6d 61 nicode string ma
b770: 74 63 68 65 73 20 61 20 70 61 72 74 69 63 75 6c tches a particul
b780: 61 72 20 70 61 74 74 65 72 6e 2e 0a 20 2a 09 41 ar pattern.. *.A
b790: 6c 6c 6f 77 73 20 63 61 73 65 20 69 6e 73 65 6e llows case insen
b7a0: 73 69 74 69 76 69 74 79 2e 20 54 68 69 73 20 69 sitivity. This i
b7b0: 73 20 74 68 65 20 55 6e 69 63 6f 64 65 20 65 71 s the Unicode eq
b7c0: 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 20 uivalent of the
b7d0: 63 68 61 72 2a 0a 20 2a 09 54 63 6c 5f 53 74 72 char*. *.Tcl_Str
b7e0: 69 6e 67 43 61 73 65 4d 61 74 63 68 2e 20 54 68 ingCaseMatch. Th
b7f0: 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 54 63 is variant of Tc
b800: 6c 5f 55 6e 69 43 68 61 72 43 61 73 65 4d 61 74 l_UniCharCaseMat
b810: 63 68 20 75 73 65 73 20 63 6f 75 6e 74 65 64 0a ch uses counted.
b820: 20 2a 09 53 74 72 69 6e 67 73 2c 20 73 6f 20 65 *.Strings, so e
b830: 6d 62 65 64 64 65 64 20 4e 55 4c 4c 73 20 61 72 mbedded NULLs ar
b840: 65 20 61 6c 6c 6f 77 65 64 2e 0a 20 2a 0a 20 2a e allowed.. *. *
b850: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 Results:. *.The
b860: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 return value is
b870: 20 31 20 69 66 20 73 74 72 69 6e 67 20 6d 61 74 1 if string mat
b880: 63 68 65 73 20 70 61 74 74 65 72 6e 2c 20 61 6e ches pattern, an
b890: 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54 d 0 otherwise. T
b8a0: 68 65 0a 20 2a 09 6d 61 74 63 68 69 6e 67 20 6f he. *.matching o
b8b0: 70 65 72 61 74 69 6f 6e 20 70 65 72 6d 69 74 73 peration permits
b8c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 the following s
b8d0: 70 65 63 69 61 6c 20 63 68 61 72 61 63 74 65 72 pecial character
b8e0: 73 20 69 6e 20 74 68 65 0a 20 2a 09 70 61 74 74 s in the. *.patt
b8f0: 65 72 6e 3a 20 2a 3f 5c 5b 5d 20 28 73 65 65 20 ern: *?\[] (see
b900: 74 68 65 20 6d 61 6e 75 61 6c 20 65 6e 74 72 79 the manual entry
b910: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 for details on
b920: 77 68 61 74 20 74 68 65 73 65 20 6d 65 61 6e 29 what these mean)
b930: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
b940: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
b950: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
b960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
b9a0: 69 6e 74 0a 54 63 6c 55 6e 69 43 68 61 72 4d 61 int.TclUniCharMa
b9b0: 74 63 68 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 tch(. const T
b9c0: 63 6c 5f 55 6e 69 43 68 61 72 20 2a 73 74 72 69 cl_UniChar *stri
b9d0: 6e 67 2c 09 2f 2a 20 55 6e 69 63 6f 64 65 20 53 ng,./* Unicode S
b9e0: 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e tring. */. in
b9f0: 74 20 73 74 72 4c 65 6e 2c 09 09 09 2f 2a 20 4c t strLen,.../* L
ba00: 65 6e 67 74 68 20 6f 66 20 53 74 72 69 6e 67 20 ength of String
ba10: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c */. const Tcl
ba20: 5f 55 6e 69 43 68 61 72 20 2a 70 61 74 74 65 72 _UniChar *patter
ba30: 6e 2c 09 2f 2a 20 50 61 74 74 65 72 6e 2c 20 77 n,./* Pattern, w
ba40: 68 69 63 68 20 6d 61 79 20 63 6f 6e 74 61 69 6e hich may contain
ba50: 20 73 70 65 63 69 61 6c 0a 09 09 09 09 20 2a 20 special..... *
ba60: 63 68 61 72 61 63 74 65 72 73 2e 20 2a 2f 0a 20 characters. */.
ba70: 20 20 20 69 6e 74 20 70 74 6e 4c 65 6e 2c 09 09 int ptnLen,..
ba80: 09 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 50 61 ./* Length of Pa
ba90: 74 74 65 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 ttern */. int
baa0: 20 6e 6f 63 61 73 65 29 09 09 09 2f 2a 20 30 20 nocase).../* 0
bab0: 66 6f 72 20 63 61 73 65 20 73 65 6e 73 69 74 69 for case sensiti
bac0: 76 65 2c 20 31 20 66 6f 72 20 69 6e 73 65 6e 73 ve, 1 for insens
bad0: 69 74 69 76 65 20 2a 2f 0a 7b 0a 20 20 20 20 63 itive */.{. c
bae0: 6f 6e 73 74 20 54 63 6c 5f 55 6e 69 43 68 61 72 onst Tcl_UniChar
baf0: 20 2a 73 74 72 69 6e 67 45 6e 64 2c 20 2a 70 61 *stringEnd, *pa
bb00: 74 74 65 72 6e 45 6e 64 3b 0a 20 20 20 20 54 63 tternEnd;. Tc
bb10: 6c 5f 55 6e 69 43 68 61 72 20 70 3b 0a 0a 20 20 l_UniChar p;..
bb20: 20 20 73 74 72 69 6e 67 45 6e 64 20 3d 20 73 74 stringEnd = st
bb30: 72 69 6e 67 20 2b 20 73 74 72 4c 65 6e 3b 0a 20 ring + strLen;.
bb40: 20 20 20 70 61 74 74 65 72 6e 45 6e 64 20 3d 20 patternEnd =
bb50: 70 61 74 74 65 72 6e 20 2b 20 70 74 6e 4c 65 6e pattern + ptnLen
bb60: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 ;.. while (1)
bb70: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 65 65 20 69 {../*.. * See i
bb80: 66 20 77 65 27 72 65 20 61 74 20 74 68 65 20 65 f we're at the e
bb90: 6e 64 20 6f 66 20 62 6f 74 68 20 74 68 65 20 70 nd of both the p
bba0: 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 73 attern and the s
bbb0: 74 72 69 6e 67 2e 20 49 66 20 73 6f 2c 0a 09 20 tring. If so,..
bbc0: 2a 20 77 65 20 73 75 63 63 65 65 64 65 64 2e 20 * we succeeded.
bbd0: 49 66 20 77 65 27 72 65 20 61 74 20 74 68 65 20 If we're at the
bbe0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 74 74 65 end of the patte
bbf0: 72 6e 20 62 75 74 20 6e 6f 74 20 61 74 20 74 68 rn but not at th
bc00: 65 20 65 6e 64 0a 09 20 2a 20 6f 66 20 74 68 65 e end.. * of the
bc10: 20 73 74 72 69 6e 67 2c 20 77 65 20 66 61 69 6c string, we fail
bc20: 65 64 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 ed... */...if (p
bc30: 61 74 74 65 72 6e 20 3d 3d 20 70 61 74 74 65 72 attern == patter
bc40: 6e 45 6e 64 29 20 7b 0a 09 20 20 20 20 72 65 74 nEnd) {.. ret
bc50: 75 72 6e 20 28 73 74 72 69 6e 67 20 3d 3d 20 73 urn (string == s
bc60: 74 72 69 6e 67 45 6e 64 29 3b 0a 09 7d 0a 09 70 tringEnd);..}..p
bc70: 20 3d 20 2a 70 61 74 74 65 72 6e 3b 0a 09 69 66 = *pattern;..if
bc80: 20 28 28 73 74 72 69 6e 67 20 3d 3d 20 73 74 72 ((string == str
bc90: 69 6e 67 45 6e 64 29 20 26 26 20 28 70 20 21 3d ingEnd) && (p !=
bca0: 20 27 2a 27 29 29 20 7b 0a 09 20 20 20 20 72 65 '*')) {.. re
bcb0: 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 0a turn 0;..}.../*.
bcc0: 09 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 . * Check for a
bcd0: 22 2a 22 20 61 73 20 74 68 65 20 6e 65 78 74 20 "*" as the next
bce0: 70 61 74 74 65 72 6e 20 63 68 61 72 61 63 74 65 pattern characte
bcf0: 72 2e 20 49 74 20 6d 61 74 63 68 65 73 20 61 6e r. It matches an
bd00: 79 0a 09 20 2a 20 73 75 62 73 74 72 69 6e 67 2e y.. * substring.
bd10: 20 57 65 20 68 61 6e 64 6c 65 20 74 68 69 73 20 We handle this
bd20: 62 79 20 73 6b 69 70 70 69 6e 67 20 61 6c 6c 20 by skipping all
bd30: 74 68 65 20 63 68 61 72 61 63 74 65 72 73 20 75 the characters u
bd40: 70 20 74 6f 20 74 68 65 0a 09 20 2a 20 6e 65 78 p to the.. * nex
bd50: 74 20 6d 61 74 63 68 69 6e 67 20 6f 6e 65 20 69 t matching one i
bd60: 6e 20 74 68 65 20 70 61 74 74 65 72 6e 2c 20 61 n the pattern, a
bd70: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 69 6e 67 20 nd then calling
bd80: 6f 75 72 73 65 6c 76 65 73 0a 09 20 2a 20 72 65 ourselves.. * re
bd90: 63 75 72 73 69 76 65 6c 79 20 66 6f 72 20 65 61 cursively for ea
bda0: 63 68 20 70 6f 73 74 66 69 78 20 6f 66 20 73 74 ch postfix of st
bdb0: 72 69 6e 67 2c 20 75 6e 74 69 6c 20 65 69 74 68 ring, until eith
bdc0: 65 72 20 77 65 20 6d 61 74 63 68 20 6f 72 20 77 er we match or w
bdd0: 65 0a 09 20 2a 20 72 65 61 63 68 20 74 68 65 20 e.. * reach the
bde0: 65 6e 64 20 6f 66 20 74 68 65 20 73 74 72 69 6e end of the strin
bdf0: 67 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 20 g... */...if (p
be00: 3d 3d 20 27 2a 27 29 20 7b 0a 09 20 20 20 20 2f == '*') {.. /
be10: 2a 0a 09 20 20 20 20 20 2a 20 53 6b 69 70 20 61 *.. * Skip a
be20: 6c 6c 20 73 75 63 63 65 73 73 69 76 65 20 2a 27 ll successive *'
be30: 73 20 69 6e 20 74 68 65 20 70 61 74 74 65 72 6e s in the pattern
be40: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 ... */...
be50: 20 77 68 69 6c 65 20 28 2a 28 2b 2b 70 61 74 74 while (*(++patt
be60: 65 72 6e 29 20 3d 3d 20 27 2a 27 29 20 7b 0a 09 ern) == '*') {..
be70: 09 2f 2a 20 65 6d 70 74 79 20 62 6f 64 79 20 2a ./* empty body *
be80: 2f 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 /.. }.. if
be90: 20 28 70 61 74 74 65 72 6e 20 3d 3d 20 70 61 74 (pattern == pat
bea0: 74 65 72 6e 45 6e 64 29 20 7b 0a 09 09 72 65 74 ternEnd) {...ret
beb0: 75 72 6e 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20 urn 1;.. }..
bec0: 20 20 20 70 20 3d 20 2a 70 61 74 74 65 72 6e 3b p = *pattern;
bed0: 0a 09 20 20 20 20 69 66 20 28 6e 6f 63 61 73 65 .. if (nocase
bee0: 29 20 7b 0a 09 09 70 20 3d 20 54 63 6c 5f 55 6e ) {...p = Tcl_Un
bef0: 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 70 29 3b iCharToLower(p);
bf00: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 77 68 69 .. }.. whi
bf10: 6c 65 20 28 31 29 20 7b 0a 09 09 2f 2a 0a 09 09 le (1) {.../*...
bf20: 20 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 * Optimization
bf30: 66 6f 72 20 6d 61 74 63 68 69 6e 67 20 2d 20 63 for matching - c
bf40: 72 75 69 73 65 20 74 68 72 6f 75 67 68 20 74 68 ruise through th
bf50: 65 20 73 74 72 69 6e 67 0a 09 09 20 2a 20 71 75 e string... * qu
bf60: 69 63 6b 6c 79 20 69 66 20 74 68 65 20 6e 65 78 ickly if the nex
bf70: 74 20 63 68 61 72 20 69 6e 20 74 68 65 20 70 61 t char in the pa
bf80: 74 74 65 72 6e 20 69 73 6e 27 74 20 61 20 73 70 ttern isn't a sp
bf90: 65 63 69 61 6c 0a 09 09 20 2a 20 63 68 61 72 61 ecial... * chara
bfa0: 63 74 65 72 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 cter.... */....i
bfb0: 66 20 28 28 70 20 21 3d 20 27 5b 27 29 20 26 26 f ((p != '[') &&
bfc0: 20 28 70 20 21 3d 20 27 3f 27 29 20 26 26 20 28 (p != '?') && (
bfd0: 70 20 21 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 09 p != '\\')) {...
bfe0: 20 20 20 20 69 66 20 28 6e 6f 63 61 73 65 29 20 if (nocase)
bff0: 7b 0a 09 09 09 77 68 69 6c 65 20 28 28 73 74 72 {....while ((str
c000: 69 6e 67 20 3c 20 73 74 72 69 6e 67 45 6e 64 29 ing < stringEnd)
c010: 20 26 26 20 28 70 20 21 3d 20 2a 73 74 72 69 6e && (p != *strin
c020: 67 29 0a 09 09 09 09 26 26 20 28 70 20 21 3d 20 g).....&& (p !=
c030: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 Tcl_UniCharToLow
c040: 65 72 28 2a 73 74 72 69 6e 67 29 29 29 20 7b 0a er(*string))) {.
c050: 09 09 09 20 20 20 20 73 74 72 69 6e 67 2b 2b 3b ... string++;
c060: 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 20 65 6c ....}... } el
c070: 73 65 20 7b 0a 09 09 09 77 68 69 6c 65 20 28 28 se {....while ((
c080: 73 74 72 69 6e 67 20 3c 20 73 74 72 69 6e 67 45 string < stringE
c090: 6e 64 29 20 26 26 20 28 70 20 21 3d 20 2a 73 74 nd) && (p != *st
c0a0: 72 69 6e 67 29 29 20 7b 0a 09 09 09 20 20 20 20 ring)) {....
c0b0: 73 74 72 69 6e 67 2b 2b 3b 0a 09 09 09 7d 0a 09 string++;....}..
c0c0: 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 69 66 20 . }...}...if
c0d0: 28 54 63 6c 55 6e 69 43 68 61 72 4d 61 74 63 68 (TclUniCharMatch
c0e0: 28 73 74 72 69 6e 67 2c 20 73 74 72 69 6e 67 45 (string, stringE
c0f0: 6e 64 20 2d 20 73 74 72 69 6e 67 2c 0a 09 09 09 nd - string,....
c100: 70 61 74 74 65 72 6e 2c 20 70 61 74 74 65 72 6e pattern, pattern
c110: 45 6e 64 20 2d 20 70 61 74 74 65 72 6e 2c 20 6e End - pattern, n
c120: 6f 63 61 73 65 29 29 20 7b 0a 09 09 20 20 20 20 ocase)) {...
c130: 72 65 74 75 72 6e 20 31 3b 0a 09 09 7d 0a 09 09 return 1;...}...
c140: 69 66 20 28 73 74 72 69 6e 67 20 3d 3d 20 73 74 if (string == st
c150: 72 69 6e 67 45 6e 64 29 20 7b 0a 09 09 20 20 20 ringEnd) {...
c160: 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 7d 0a 09 return 0;...}..
c170: 09 73 74 72 69 6e 67 2b 2b 3b 0a 09 20 20 20 20 .string++;..
c180: 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 }..}.../*.. * Ch
c190: 65 63 6b 20 66 6f 72 20 61 20 22 3f 22 20 61 73 eck for a "?" as
c1a0: 20 74 68 65 20 6e 65 78 74 20 70 61 74 74 65 72 the next patter
c1b0: 6e 20 63 68 61 72 61 63 74 65 72 2e 20 49 74 20 n character. It
c1c0: 6d 61 74 63 68 65 73 20 61 6e 79 0a 09 20 2a 20 matches any.. *
c1d0: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 single character
c1e0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 20 3d ... */...if (p =
c1f0: 3d 20 27 3f 27 29 20 7b 0a 09 20 20 20 20 70 61 = '?') {.. pa
c200: 74 74 65 72 6e 2b 2b 3b 0a 09 20 20 20 20 73 74 ttern++;.. st
c210: 72 69 6e 67 2b 2b 3b 0a 09 20 20 20 20 63 6f 6e ring++;.. con
c220: 74 69 6e 75 65 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 tinue;..}.../*..
c230: 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22 * Check for a "
c240: 5b 22 20 61 73 20 74 68 65 20 6e 65 78 74 20 70 [" as the next p
c250: 61 74 74 65 72 6e 20 63 68 61 72 61 63 74 65 72 attern character
c260: 2e 20 49 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 . It is followed
c270: 20 62 79 20 61 0a 09 20 2a 20 6c 69 73 74 20 6f by a.. * list o
c280: 66 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 f characters tha
c290: 74 20 61 72 65 20 61 63 63 65 70 74 61 62 6c 65 t are acceptable
c2a0: 2c 20 6f 72 20 62 79 20 61 20 72 61 6e 67 65 20 , or by a range
c2b0: 28 74 77 6f 0a 09 20 2a 20 63 68 61 72 61 63 74 (two.. * charact
c2c0: 65 72 73 20 73 65 70 61 72 61 74 65 64 20 62 79 ers separated by
c2d0: 20 22 2d 22 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 "-")... */...if
c2e0: 20 28 70 20 3d 3d 20 27 5b 27 29 20 7b 0a 09 20 (p == '[') {..
c2f0: 20 20 20 54 63 6c 5f 55 6e 69 43 68 61 72 20 63 Tcl_UniChar c
c300: 68 31 2c 20 73 74 61 72 74 43 68 61 72 2c 20 65 h1, startChar, e
c310: 6e 64 43 68 61 72 3b 0a 0a 09 20 20 20 20 70 61 ndChar;... pa
c320: 74 74 65 72 6e 2b 2b 3b 0a 09 20 20 20 20 63 68 ttern++;.. ch
c330: 31 20 3d 20 28 6e 6f 63 61 73 65 20 3f 20 54 63 1 = (nocase ? Tc
c340: 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 l_UniCharToLower
c350: 28 2a 73 74 72 69 6e 67 29 20 3a 20 2a 73 74 72 (*string) : *str
c360: 69 6e 67 29 3b 0a 09 20 20 20 20 73 74 72 69 6e ing);.. strin
c370: 67 2b 2b 3b 0a 09 20 20 20 20 77 68 69 6c 65 20 g++;.. while
c380: 28 31 29 20 7b 0a 09 09 69 66 20 28 28 2a 70 61 (1) {...if ((*pa
c390: 74 74 65 72 6e 20 3d 3d 20 27 5d 27 29 20 7c 7c ttern == ']') ||
c3a0: 20 28 70 61 74 74 65 72 6e 20 3d 3d 20 70 61 74 (pattern == pat
c3b0: 74 65 72 6e 45 6e 64 29 29 20 7b 0a 09 09 20 20 ternEnd)) {...
c3c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 7d 0a return 0;...}.
c3d0: 09 09 73 74 61 72 74 43 68 61 72 20 3d 20 28 6e ..startChar = (n
c3e0: 6f 63 61 73 65 20 3f 20 54 63 6c 5f 55 6e 69 43 ocase ? Tcl_UniC
c3f0: 68 61 72 54 6f 4c 6f 77 65 72 28 2a 70 61 74 74 harToLower(*patt
c400: 65 72 6e 29 20 3a 20 2a 70 61 74 74 65 72 6e 29 ern) : *pattern)
c410: 3b 0a 09 09 70 61 74 74 65 72 6e 2b 2b 3b 0a 09 ;...pattern++;..
c420: 09 69 66 20 28 2a 70 61 74 74 65 72 6e 20 3d 3d .if (*pattern ==
c430: 20 27 2d 27 29 20 7b 0a 09 09 20 20 20 20 70 61 '-') {... pa
c440: 74 74 65 72 6e 2b 2b 3b 0a 09 09 20 20 20 20 69 ttern++;... i
c450: 66 20 28 70 61 74 74 65 72 6e 20 3d 3d 20 70 61 f (pattern == pa
c460: 74 74 65 72 6e 45 6e 64 29 20 7b 0a 09 09 09 72 tternEnd) {....r
c470: 65 74 75 72 6e 20 30 3b 0a 09 09 20 20 20 20 7d eturn 0;... }
c480: 0a 09 09 20 20 20 20 65 6e 64 43 68 61 72 20 3d ... endChar =
c490: 20 28 6e 6f 63 61 73 65 20 3f 20 54 63 6c 5f 55 (nocase ? Tcl_U
c4a0: 6e 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 2a 70 niCharToLower(*p
c4b0: 61 74 74 65 72 6e 29 0a 09 09 09 20 20 20 20 3a attern).... :
c4c0: 20 2a 70 61 74 74 65 72 6e 29 3b 0a 09 09 20 20 *pattern);...
c4d0: 20 20 70 61 74 74 65 72 6e 2b 2b 3b 0a 09 09 20 pattern++;...
c4e0: 20 20 20 69 66 20 28 28 28 73 74 61 72 74 43 68 if (((startCh
c4f0: 61 72 20 3c 3d 20 63 68 31 29 20 26 26 20 28 63 ar <= ch1) && (c
c500: 68 31 20 3c 3d 20 65 6e 64 43 68 61 72 29 29 0a h1 <= endChar)).
c510: 09 09 09 20 20 20 20 7c 7c 20 28 28 65 6e 64 43 ... || ((endC
c520: 68 61 72 20 3c 3d 20 63 68 31 29 20 26 26 20 28 har <= ch1) && (
c530: 63 68 31 20 3c 3d 20 73 74 61 72 74 43 68 61 72 ch1 <= startChar
c540: 29 29 29 20 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 ))) {..../*....
c550: 2a 20 4d 61 74 63 68 65 73 20 72 61 6e 67 65 73 * Matches ranges
c560: 20 6f 66 20 66 6f 72 6d 20 5b 61 2d 7a 5d 20 6f of form [a-z] o
c570: 72 20 5b 7a 2d 61 5d 2e 0a 09 09 09 20 2a 2f 0a r [z-a]..... */.
c580: 09 09 09 62 72 65 61 6b 3b 0a 09 09 20 20 20 20 ...break;...
c590: 7d 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 }...} else if (s
c5a0: 74 61 72 74 43 68 61 72 20 3d 3d 20 63 68 31 29 tartChar == ch1)
c5b0: 20 7b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a {... break;.
c5c0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ..}.. }..
c5d0: 77 68 69 6c 65 20 28 2a 70 61 74 74 65 72 6e 20 while (*pattern
c5e0: 21 3d 20 27 5d 27 29 20 7b 0a 09 09 69 66 20 28 != ']') {...if (
c5f0: 70 61 74 74 65 72 6e 20 3d 3d 20 70 61 74 74 65 pattern == patte
c600: 72 6e 45 6e 64 29 20 7b 0a 09 09 20 20 20 20 70 rnEnd) {... p
c610: 61 74 74 65 72 6e 2d 2d 3b 0a 09 09 20 20 20 20 attern--;...
c620: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 70 61 74 break;...}...pat
c630: 74 65 72 6e 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 tern++;.. }..
c640: 20 20 20 20 70 61 74 74 65 72 6e 2b 2b 3b 0a 09 pattern++;..
c650: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 7d continue;..}
c660: 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65 .../*.. * If the
c670: 20 6e 65 78 74 20 70 61 74 74 65 72 6e 20 63 68 next pattern ch
c680: 61 72 61 63 74 65 72 20 69 73 20 27 5c 27 2c 20 aracter is '\',
c690: 6a 75 73 74 20 73 74 72 69 70 20 6f 66 66 20 74 just strip off t
c6a0: 68 65 20 27 5c 27 20 73 6f 20 77 65 0a 09 20 2a he '\' so we.. *
c6b0: 20 64 6f 20 65 78 61 63 74 20 6d 61 74 63 68 69 do exact matchi
c6c0: 6e 67 20 6f 6e 20 74 68 65 20 63 68 61 72 61 63 ng on the charac
c6d0: 74 65 72 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 ter that follows
c6e0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 20 3d ... */...if (p =
c6f0: 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20 20 20 69 = '\\') {.. i
c700: 66 20 28 2b 2b 70 61 74 74 65 72 6e 20 3d 3d 20 f (++pattern ==
c710: 70 61 74 74 65 72 6e 45 6e 64 29 20 7b 0a 09 09 patternEnd) {...
c720: 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d return 0;.. }
c730: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 ..}.../*.. * The
c740: 72 65 27 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 re's no special
c750: 63 68 61 72 61 63 74 65 72 2e 20 4a 75 73 74 20 character. Just
c760: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 make sure that t
c770: 68 65 20 6e 65 78 74 20 62 79 74 65 73 20 6f 66 he next bytes of
c780: 0a 09 20 2a 20 65 61 63 68 20 73 74 72 69 6e 67 .. * each string
c790: 20 6d 61 74 63 68 2e 0a 09 20 2a 2f 0a 0a 09 69 match... */...i
c7a0: 66 20 28 6e 6f 63 61 73 65 29 20 7b 0a 09 20 20 f (nocase) {..
c7b0: 20 20 69 66 20 28 54 63 6c 5f 55 6e 69 43 68 61 if (Tcl_UniCha
c7c0: 72 54 6f 4c 6f 77 65 72 28 2a 73 74 72 69 6e 67 rToLower(*string
c7d0: 29 20 21 3d 20 54 63 6c 5f 55 6e 69 43 68 61 72 ) != Tcl_UniChar
c7e0: 54 6f 4c 6f 77 65 72 28 2a 70 61 74 74 65 72 6e ToLower(*pattern
c7f0: 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 30 3b )) {...return 0;
c800: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 .. }..} else
c810: 69 66 20 28 2a 73 74 72 69 6e 67 20 21 3d 20 2a if (*string != *
c820: 70 61 74 74 65 72 6e 29 20 7b 0a 09 20 20 20 20 pattern) {..
c830: 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 09 73 74 return 0;..}..st
c840: 72 69 6e 67 2b 2b 3b 0a 09 70 61 74 74 65 72 6e ring++;..pattern
c850: 2b 2b 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a ++;. }.}.../*
c860: 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61 62 . * Local Variab
c870: 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63 0a les:. * mode: c.
c880: 20 2a 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 65 * c-basic-offse
c890: 74 3a 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f 6c t: 4. * fill-col
c8a0: 75 6d 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a 0a umn: 78. * End:.
c8b0: 20 2a 2f 0a */.