Tcl Source Code

Hex Artifact Content
Login

Artifact 18caccb00b6196fe42171ccfa9d6088ecf0def9ed39103b56d8587cdd13fbc10:


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                                       */.