Hex Artifact Content

Artifact 9f831c5c92d12419ae78be6f159ebd3fb814aee5:


0000: 2f 2a 20 0a 20 2a 20 74 6b 46 6f 6e 74 2e 63 20  /* . * tkFont.c 
0010: 28 43 54 6b 29 20 2d 2d 0a 20 2a 0a 20 2a 09 43  (CTk) --. *. *.C
0020: 54 6b 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  Tk does not have
0030: 20 66 6f 6e 74 73 2c 20 62 75 74 20 54 6b 27 73   fonts, but Tk's
0040: 20 75 74 69 6c 69 74 79 20 70 72 6f 63 65 64 75   utility procedu
0050: 72 65 73 0a 20 2a 09 66 6f 72 20 6d 65 61 73 75  res. *.for measu
0060: 72 69 6e 67 20 61 6e 64 20 64 69 73 70 6c 61 79  ring and display
0070: 69 6e 67 20 74 65 78 74 20 61 72 65 20 70 72 6f  ing text are pro
0080: 76 69 64 65 64 2e 0a 20 2a 0a 20 2a 20 43 6f 70  vided.. *. * Cop
0090: 79 72 69 67 68 74 20 28 63 29 20 31 39 39 30 2d  yright (c) 1990-
00a0: 31 39 39 34 20 54 68 65 20 52 65 67 65 6e 74 73  1994 The Regents
00b0: 20 6f 66 20 74 68 65 20 55 6e 69 76 65 72 73 69   of the Universi
00c0: 74 79 20 6f 66 20 43 61 6c 69 66 6f 72 6e 69 61  ty of California
00d0: 2e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28  .. * Copyright (
00e0: 63 29 20 31 39 39 34 2d 31 39 39 35 20 53 75 6e  c) 1994-1995 Sun
00f0: 20 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49   Microsystems, I
0100: 6e 63 2e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74  nc.. * Copyright
0110: 20 28 63 29 20 31 39 39 34 2d 31 39 39 35 20 43   (c) 1994-1995 C
0120: 6c 65 76 65 6c 61 6e 64 20 43 6c 69 6e 69 63 20  leveland Clinic 
0130: 46 6f 75 6e 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a  Foundation. *. *
0140: 20 53 65 65 20 74 68 65 20 66 69 6c 65 20 22 6c   See the file "l
0150: 69 63 65 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f  icense.terms" fo
0160: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  r information on
0170: 20 75 73 61 67 65 20 61 6e 64 20 72 65 64 69 73   usage and redis
0180: 74 72 69 62 75 74 69 6f 6e 0a 20 2a 20 6f 66 20  tribution. * of 
0190: 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 66  this file, and f
01a0: 6f 72 20 61 20 44 49 53 43 4c 41 49 4d 45 52 20  or a DISCLAIMER 
01b0: 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e 54 49 45  OF ALL WARRANTIE
01c0: 53 2e 0a 20 2a 0a 20 2a 20 40 28 23 29 20 24 49  S.. *. * @(#) $I
01d0: 64 3a 20 63 74 6b 2e 73 68 61 72 2c 76 20 31 2e  d: ctk.shar,v 1.
01e0: 35 30 20 31 39 39 36 2f 30 31 2f 31 35 20 31 34  50 1996/01/15 14
01f0: 3a 34 37 3a 31 36 20 61 6e 64 72 65 77 6d 20 45  :47:16 andrewm E
0200: 78 70 20 61 6e 64 72 65 77 6d 20 24 0a 20 2a 2f  xp andrewm $. */
0210: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6b 50 6f  ..#include "tkPo
0220: 72 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  rt.h".#include "
0230: 74 6b 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20  tkInt.h"../*. * 
0240: 43 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  Characters used 
0250: 77 68 65 6e 20 64 69 73 70 6c 61 79 69 6e 67 20  when displaying 
0260: 63 6f 6e 74 72 6f 6c 20 73 65 71 75 65 6e 63 65  control sequence
0270: 73 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63  s.. */..static c
0280: 68 61 72 20 68 65 78 43 68 61 72 73 5b 5d 20 3d  har hexChars[] =
0290: 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
02a0: 65 66 78 74 6e 76 72 5c 5c 22 3b 0a 0a 2f 2a 0a  efxtnvr\\";../*.
02b0: 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67   * The following
02c0: 20 74 61 62 6c 65 20 6d 61 70 73 20 73 6f 6d 65   table maps some
02d0: 20 63 6f 6e 74 72 6f 6c 20 63 68 61 72 61 63 74   control charact
02e0: 65 72 73 20 74 6f 20 73 65 71 75 65 6e 63 65 73  ers to sequences
02f0: 0a 20 2a 20 6c 69 6b 65 20 27 5c 6e 27 20 72 61  . * like '\n' ra
0300: 74 68 65 72 20 74 68 61 6e 20 27 5c 78 31 30 27  ther than '\x10'
0310: 2e 20 20 41 20 7a 65 72 6f 20 65 6e 74 72 79 20  .  A zero entry 
0320: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6d 65 61  in the table mea
0330: 6e 73 0a 20 2a 20 6e 6f 20 73 75 63 68 20 6d 61  ns. * no such ma
0340: 70 70 69 6e 67 20 65 78 69 73 74 73 2c 20 61 6e  pping exists, an
0350: 64 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 6c 79  d the table only
0360: 20 6d 61 70 73 20 63 68 61 72 61 63 74 65 72 73   maps characters
0370: 0a 20 2a 20 6c 65 73 73 20 74 68 61 6e 20 30 78  . * less than 0x
0380: 31 30 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  10.. */..static 
0390: 63 68 61 72 20 6d 61 70 43 68 61 72 73 5b 5d 20  char mapChars[] 
03a0: 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c  = {.    0, 0, 0,
03b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
03c0: 20 27 61 27 2c 20 27 62 27 2c 20 27 74 27 2c 20   'a', 'b', 't', 
03d0: 27 6e 27 2c 20 27 76 27 2c 20 27 66 27 2c 20 27  'n', 'v', 'f', '
03e0: 72 27 2c 0a 20 20 20 20 30 0a 7d 3b 0a 0a 2f 2a  r',.    0.};../*
03f0: 0a 20 2a 20 57 69 64 74 68 20 6f 66 20 74 61 62  . * Width of tab
0400: 73 2c 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  s, in characters
0410: 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 54  .. */..#define T
0420: 41 42 5f 57 49 44 54 48 09 38 0a 0a 0c 0a 2f 2a  AB_WIDTH.8..../*
0430: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0470: 2d 0a 20 2a 0a 20 2a 20 54 6b 4d 65 61 73 75 72  -. *. * TkMeasur
0480: 65 43 68 61 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  eChars --. *. *.
0490: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
04a0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
04b0: 20 66 72 6f 6d 20 61 20 73 74 72 69 6e 67 20 74   from a string t
04c0: 68 61 74 0a 20 2a 09 77 69 6c 6c 20 66 69 74 20  hat. *.will fit 
04d0: 69 6e 20 61 20 67 69 76 65 6e 20 68 6f 72 69 7a  in a given horiz
04e0: 6f 6e 74 61 6c 20 73 70 61 6e 2e 20 20 54 68 65  ontal span.  The
04f0: 20 6d 65 61 73 75 72 65 6d 65 6e 74 0a 20 2a 09   measurement. *.
0500: 69 73 20 64 6f 6e 65 20 75 6e 64 65 72 20 74 68  is done under th
0510: 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61  e assumption tha
0520: 74 20 54 6b 44 69 73 70 6c 61 79 43 68 61 72 73  t TkDisplayChars
0530: 20 77 69 6c 6c 0a 20 2a 09 62 65 20 75 73 65 64   will. *.be used
0540: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 64 69 73   to actually dis
0550: 70 6c 61 79 20 74 68 65 20 63 68 61 72 61 63 74  play the charact
0560: 65 72 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ers.. *. * Resul
0570: 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72  ts:. *.The retur
0580: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
0590: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
05a0: 65 72 73 20 66 72 6f 6d 20 73 6f 75 72 63 65 0a  ers from source.
05b0: 20 2a 09 74 68 61 74 20 66 69 74 20 69 6e 20 74   *.that fit in t
05c0: 68 65 20 73 70 61 6e 20 67 69 76 65 6e 20 62 79  he span given by
05d0: 20 73 74 61 72 74 58 20 61 6e 64 20 6d 61 78 58   startX and maxX
05e0: 2e 20 20 2a 6e 65 78 74 58 50 74 72 0a 20 2a 09  .  *nextXPtr. *.
05f0: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
0600: 68 20 74 68 65 20 78 2d 63 6f 6f 72 64 69 6e 61  h the x-coordina
0610: 74 65 20 61 74 20 77 68 69 63 68 20 74 68 65 20  te at which the 
0620: 66 69 72 73 74 0a 20 2a 09 63 68 61 72 61 63 74  first. *.charact
0630: 65 72 20 74 68 61 74 20 64 69 64 6e 27 74 20 66  er that didn't f
0640: 69 74 20 77 6f 75 6c 64 20 62 65 20 64 72 61 77  it would be draw
0650: 6e 2c 20 69 66 20 69 74 20 77 65 72 65 20 74 6f  n, if it were to
0660: 0a 20 2a 09 62 65 20 64 72 61 77 6e 2e 0a 20 2a  . *.be drawn.. *
0670: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
0680: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
06d0: 2a 2f 0a 0a 69 6e 74 0a 54 6b 4d 65 61 73 75 72  */..int.TkMeasur
06e0: 65 43 68 61 72 73 28 73 6f 75 72 63 65 2c 20 6d  eChars(source, m
06f0: 61 78 43 68 61 72 73 2c 20 73 74 61 72 74 58 2c  axChars, startX,
0700: 20 6d 61 78 58 2c 20 74 61 62 4f 72 69 67 69 6e   maxX, tabOrigin
0710: 2c 20 66 6c 61 67 73 2c 20 6e 65 78 74 58 50 74  , flags, nextXPt
0720: 72 29 0a 20 20 20 20 63 68 61 72 20 2a 73 6f 75  r).    char *sou
0730: 72 63 65 3b 09 09 2f 2a 20 43 68 61 72 61 63 74  rce;../* Charact
0740: 65 72 73 20 74 6f 20 62 65 20 64 69 73 70 6c 61  ers to be displa
0750: 79 65 64 2e 20 20 4e 65 65 64 20 6e 6f 74 0a 09  yed.  Need not..
0760: 09 09 09 20 2a 20 62 65 20 4e 55 4c 4c 2d 74 65  ... * be NULL-te
0770: 72 6d 69 6e 61 74 65 64 2e 20 2a 2f 0a 20 20 20  rminated. */.   
0780: 20 69 6e 74 20 6d 61 78 43 68 61 72 73 3b 09 09   int maxChars;..
0790: 2f 2a 20 4d 61 78 69 6d 75 6d 20 23 20 6f 66 20  /* Maximum # of 
07a0: 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 63 6f  characters to co
07b0: 6e 73 69 64 65 72 20 66 72 6f 6d 0a 09 09 09 09  nsider from.....
07c0: 20 2a 20 73 6f 75 72 63 65 2e 20 2a 2f 0a 20 20   * source. */.  
07d0: 20 20 69 6e 74 20 73 74 61 72 74 58 3b 09 09 09    int startX;...
07e0: 2f 2a 20 58 2d 70 6f 73 74 69 6f 6e 20 61 74 20  /* X-postion at 
07f0: 77 68 69 63 68 20 66 69 72 73 74 20 63 68 61 72  which first char
0800: 61 63 74 65 72 20 77 69 6c 6c 0a 09 09 09 09 20  acter will..... 
0810: 2a 20 62 65 20 64 72 61 77 6e 2e 20 2a 2f 0a 20  * be drawn. */. 
0820: 20 20 20 69 6e 74 20 6d 61 78 58 3b 09 09 09 2f     int maxX;.../
0830: 2a 20 44 6f 6e 27 74 20 63 6f 6e 73 69 64 65 72  * Don't consider
0840: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 74   any character t
0850: 68 61 74 20 77 6f 75 6c 64 0a 09 09 09 09 20 2a  hat would..... *
0860: 20 63 72 6f 73 73 20 74 68 69 73 20 78 2d 70 6f   cross this x-po
0870: 73 69 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  sition. */.    i
0880: 6e 74 20 74 61 62 4f 72 69 67 69 6e 3b 09 09 2f  nt tabOrigin;../
0890: 2a 20 58 2d 6c 6f 63 61 74 69 6f 6e 20 74 68 61  * X-location tha
08a0: 74 20 73 65 72 76 65 73 20 61 73 20 22 6f 72 69  t serves as "ori
08b0: 67 69 6e 22 20 66 6f 72 0a 09 09 09 09 20 2a 20  gin" for..... * 
08c0: 74 61 62 20 73 74 6f 70 73 2e 20 2a 2f 0a 20 20  tab stops. */.  
08d0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 09 09 09 2f    int flags;.../
08e0: 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 20 62  * Various flag b
08f0: 69 74 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  its OR-ed togeth
0900: 65 72 2e 0a 09 09 09 09 20 2a 20 54 4b 5f 57 48  er...... * TK_WH
0910: 4f 4c 45 5f 57 4f 52 44 53 20 6d 65 61 6e 73 20  OLE_WORDS means 
0920: 73 74 6f 70 20 6f 6e 20 61 20 77 6f 72 64 20 62  stop on a word b
0930: 6f 75 6e 64 61 72 79 0a 09 09 09 09 20 2a 20 28  oundary..... * (
0940: 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20 73 70  just before a sp
0950: 61 63 65 20 63 68 61 72 61 63 74 65 72 29 20 69  ace character) i
0960: 66 0a 09 09 09 09 20 2a 20 70 6f 73 73 69 62 6c  f..... * possibl
0970: 65 2e 20 20 54 4b 5f 41 54 5f 4c 45 41 53 54 5f  e.  TK_AT_LEAST_
0980: 4f 4e 45 20 6d 65 61 6e 73 20 61 6c 77 61 79 73  ONE means always
0990: 0a 09 09 09 09 20 2a 20 72 65 74 75 72 6e 20 61  ..... * return a
09a0: 20 76 61 6c 75 65 20 6f 66 20 61 74 20 6c 65 61   value of at lea
09b0: 73 74 20 6f 6e 65 2c 20 65 76 65 6e 0a 09 09 09  st one, even....
09c0: 09 20 2a 20 69 66 20 74 68 65 20 63 68 61 72 61  . * if the chara
09d0: 63 74 65 72 20 64 6f 65 73 6e 27 74 20 66 69 74  cter doesn't fit
09e0: 2e 20 0a 09 09 09 09 20 2a 20 54 4b 5f 50 41 52  . ..... * TK_PAR
09f0: 54 49 41 4c 5f 4f 4b 20 6d 65 61 6e 73 20 69 74  TIAL_OK means it
0a00: 27 73 20 4f 4b 20 74 6f 20 64 69 73 70 6c 61 79  's OK to display
0a10: 20 6f 6e 6c 79 0a 09 09 09 09 20 2a 20 61 20 70   only..... * a p
0a20: 61 72 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  art of the last 
0a30: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
0a40: 20 6c 69 6e 65 2e 0a 09 09 09 09 20 2a 20 54 4b   line...... * TK
0a50: 5f 4e 45 57 4c 49 4e 45 53 5f 4e 4f 54 5f 53 50  _NEWLINES_NOT_SP
0a60: 45 43 49 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ECIAL means that
0a70: 20 6e 65 77 6c 69 6e 65 73 0a 09 09 09 09 20 2a   newlines..... *
0a80: 20 61 72 65 20 74 72 65 61 74 65 64 20 6a 75 73   are treated jus
0a90: 74 20 6c 69 6b 65 20 6f 74 68 65 72 20 63 6f 6e  t like other con
0aa0: 74 72 6f 6c 20 63 68 61 72 73 3a 0a 09 09 09 09  trol chars:.....
0ab0: 20 2a 20 74 68 65 79 20 64 6f 6e 27 74 20 74 65   * they don't te
0ac0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 69 6e 65  rminate the line
0ad0: 2e 0a 09 09 09 09 20 2a 20 54 4b 5f 49 47 4e 4f  ...... * TK_IGNO
0ae0: 52 45 5f 54 41 42 53 20 6d 65 61 6e 73 20 67 69  RE_TABS means gi
0af0: 76 65 20 61 6c 6c 20 74 61 62 73 20 7a 65 72 6f  ve all tabs zero
0b00: 0a 09 09 09 09 20 2a 20 77 69 64 74 68 2e 20 2a  ..... * width. *
0b10: 2f 0a 20 20 20 20 69 6e 74 20 2a 6e 65 78 74 58  /.    int *nextX
0b20: 50 74 72 3b 09 09 2f 2a 20 52 65 74 75 72 6e 20  Ptr;../* Return 
0b30: 78 2d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 65  x-position of te
0b40: 72 6d 69 6e 61 74 69 6e 67 0a 09 09 09 09 20 2a  rminating..... *
0b50: 20 63 68 61 72 61 63 74 65 72 20 68 65 72 65 2e   character here.
0b60: 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74   */.{.    regist
0b70: 65 72 20 63 68 61 72 20 2a 70 3b 09 09 2f 2a 20  er char *p;../* 
0b80: 43 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65  Current characte
0b90: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 74  r. */.    regist
0ba0: 65 72 20 69 6e 74 20 63 3b 0a 20 20 20 20 63 68  er int c;.    ch
0bb0: 61 72 20 2a 74 65 72 6d 3b 09 09 09 2f 2a 20 50  ar *term;.../* P
0bc0: 6f 69 6e 74 65 72 20 74 6f 20 6d 6f 73 74 20 72  ointer to most r
0bd0: 65 63 65 6e 74 20 63 68 61 72 61 63 74 65 72 20  ecent character 
0be0: 74 68 61 74 0a 09 09 09 09 20 2a 20 6d 61 79 20  that..... * may 
0bf0: 6c 65 67 61 6c 6c 79 20 62 65 20 61 20 74 65 72  legally be a ter
0c00: 6d 69 6e 61 74 69 6e 67 20 63 68 61 72 61 63 74  minating charact
0c10: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  er. */.    int t
0c20: 65 72 6d 58 3b 09 09 09 2f 2a 20 58 2d 70 6f 73  ermX;.../* X-pos
0c30: 69 74 69 6f 6e 20 6a 75 73 74 20 61 66 74 65 72  ition just after
0c40: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 6e   term. */.    in
0c50: 74 20 63 75 72 58 3b 09 09 09 2f 2a 20 58 2d 70  t curX;.../* X-p
0c60: 6f 73 69 74 69 6f 6e 20 63 6f 72 72 65 73 70 6f  osition correspo
0c70: 6e 64 69 6e 67 20 74 6f 20 70 2e 20 2a 2f 0a 20  nding to p. */. 
0c80: 20 20 20 69 6e 74 20 6e 65 77 58 3b 09 09 09 2f     int newX;.../
0c90: 2a 20 58 2d 70 6f 73 69 74 69 6f 6e 20 63 6f 72  * X-position cor
0ca0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 2b  responding to p+
0cb0: 31 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  1. */.    int re
0cc0: 6d 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  m;..    /*.     
0cd0: 2a 20 53 63 61 6e 20 74 68 65 20 69 6e 70 75 74  * Scan the input
0ce0: 20 73 74 72 69 6e 67 20 6f 6e 65 20 63 68 61 72   string one char
0cf0: 61 63 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  acter at a time,
0d00: 20 75 6e 74 69 6c 20 61 20 63 68 61 72 61 63 74   until a charact
0d10: 65 72 0a 20 20 20 20 20 2a 20 69 73 20 66 6f 75  er.     * is fou
0d20: 6e 64 20 74 68 61 74 20 63 72 6f 73 73 65 73 20  nd that crosses 
0d30: 6d 61 78 58 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  maxX..     */.. 
0d40: 20 20 20 6e 65 77 58 20 3d 20 63 75 72 58 20 3d     newX = curX =
0d50: 20 73 74 61 72 74 58 3b 0a 20 20 20 20 74 65 72   startX;.    ter
0d60: 6d 58 20 3d 20 30 3b 09 09 2f 2a 20 4e 6f 74 20  mX = 0;../* Not 
0d70: 6e 65 65 64 65 64 2c 20 62 75 74 20 65 6c 69 6d  needed, but elim
0d80: 69 6e 61 74 65 73 20 63 6f 6d 70 69 6c 65 72 20  inates compiler 
0d90: 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  warning. */.    
0da0: 74 65 72 6d 20 3d 20 73 6f 75 72 63 65 3b 0a 20  term = source;. 
0db0: 20 20 20 66 6f 72 20 28 70 20 3d 20 73 6f 75 72     for (p = sour
0dc0: 63 65 2c 20 63 20 3d 20 2a 70 20 26 20 30 78 66  ce, c = *p & 0xf
0dd0: 66 3b 20 6d 61 78 43 68 61 72 73 20 3e 20 30 3b  f; maxChars > 0;
0de0: 20 70 2b 2b 2c 20 6d 61 78 43 68 61 72 73 2d 2d   p++, maxChars--
0df0: 29 20 7b 0a 09 69 66 20 28 69 73 70 72 69 6e 74  ) {..if (isprint
0e00: 28 55 43 48 41 52 28 63 29 29 29 20 7b 0a 09 20  (UCHAR(c))) {.. 
0e10: 20 20 20 6e 65 77 58 2b 2b 3b 0a 09 7d 20 65 6c     newX++;..} el
0e20: 73 65 20 69 66 20 28 63 20 3d 3d 20 27 5c 74 27  se if (c == '\t'
0e30: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 28 66  ) {..    if (!(f
0e40: 6c 61 67 73 20 26 20 54 4b 5f 49 47 4e 4f 52 45  lags & TK_IGNORE
0e50: 5f 54 41 42 53 29 29 20 7b 0a 09 09 6e 65 77 58  _TABS)) {...newX
0e60: 20 2b 3d 20 54 41 42 5f 57 49 44 54 48 3b 0a 09   += TAB_WIDTH;..
0e70: 09 72 65 6d 20 3d 20 28 6e 65 77 58 20 2d 20 74  .rem = (newX - t
0e80: 61 62 4f 72 69 67 69 6e 29 20 25 20 54 41 42 5f  abOrigin) % TAB_
0e90: 57 49 44 54 48 3b 0a 09 09 69 66 20 28 72 65 6d  WIDTH;...if (rem
0ea0: 20 3c 20 30 29 20 7b 0a 09 09 20 20 20 20 72 65   < 0) {...    re
0eb0: 6d 20 2b 3d 20 54 41 42 5f 57 49 44 54 48 3b 0a  m += TAB_WIDTH;.
0ec0: 09 09 7d 0a 09 09 6e 65 77 58 20 2d 3d 20 72 65  ..}...newX -= re
0ed0: 6d 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73  m;..    }..} els
0ee0: 65 20 7b 0a 09 20 20 20 20 69 66 20 28 63 20 3d  e {..    if (c =
0ef0: 3d 20 27 5c 6e 27 20 26 26 20 21 28 66 6c 61 67  = '\n' && !(flag
0f00: 73 20 26 20 54 4b 5f 4e 45 57 4c 49 4e 45 53 5f  s & TK_NEWLINES_
0f10: 4e 4f 54 5f 53 50 45 43 49 41 4c 29 29 20 7b 0a  NOT_SPECIAL)) {.
0f20: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a  ..break;..    }.
0f30: 09 20 20 20 20 69 66 20 28 63 20 3e 3d 20 30 20  .    if (c >= 0 
0f40: 26 26 20 63 20 3c 20 73 69 7a 65 6f 66 28 6d 61  && c < sizeof(ma
0f50: 70 43 68 61 72 73 29 20 26 26 20 6d 61 70 43 68  pChars) && mapCh
0f60: 61 72 73 5b 63 5d 29 20 7b 0a 09 09 6e 65 77 58  ars[c]) {...newX
0f70: 20 2b 3d 20 32 3b 0a 09 20 20 20 20 7d 20 65 6c   += 2;..    } el
0f80: 73 65 20 7b 0a 09 09 6e 65 77 58 20 2b 3d 20 34  se {...newX += 4
0f90: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66  ;..    }..}...if
0fa0: 20 28 6e 65 77 58 20 3e 20 6d 61 78 58 29 20 7b   (newX > maxX) {
0fb0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a  ..    break;..}.
0fc0: 09 69 66 20 28 6d 61 78 43 68 61 72 73 20 3e 20  .if (maxChars > 
0fd0: 31 29 20 7b 0a 09 20 20 20 20 63 20 3d 20 70 5b  1) {..    c = p[
0fe0: 31 5d 20 26 20 30 78 66 66 3b 0a 09 7d 20 65 6c  1] & 0xff;..} el
0ff0: 73 65 20 7b 0a 09 20 20 20 20 63 20 3d 20 30 3b  se {..    c = 0;
1000: 0a 09 7d 0a 09 69 66 20 28 69 73 73 70 61 63 65  ..}..if (isspace
1010: 28 55 43 48 41 52 28 63 29 29 20 7c 7c 20 28 63  (UCHAR(c)) || (c
1020: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 74   == 0)) {..    t
1030: 65 72 6d 20 3d 20 70 2b 31 3b 0a 09 20 20 20 20  erm = p+1;..    
1040: 74 65 72 6d 58 20 3d 20 6e 65 77 58 3b 0a 09 7d  termX = newX;..}
1050: 0a 09 63 75 72 58 20 3d 20 6e 65 77 58 3b 0a 20  ..curX = newX;. 
1060: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1070: 20 20 2a 20 50 20 70 6f 69 6e 74 73 20 74 6f 20    * P points to 
1080: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
1090: 74 65 72 20 74 68 61 74 20 64 6f 65 73 6e 27 74  ter that doesn't
10a0: 20 66 69 74 20 69 6e 20 74 68 65 20 64 65 73 69   fit in the desi
10b0: 72 65 64 0a 20 20 20 20 20 2a 20 73 70 61 6e 2e  red.     * span.
10c0: 20 20 55 73 65 20 74 68 65 20 66 6c 61 67 73 20    Use the flags 
10d0: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68  to figure out wh
10e0: 61 74 20 74 6f 20 72 65 74 75 72 6e 2e 0a 20 20  at to return..  
10f0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 28     */..    if ((
1100: 66 6c 61 67 73 20 26 20 54 4b 5f 50 41 52 54 49  flags & TK_PARTI
1110: 41 4c 5f 4f 4b 29 20 26 26 20 28 63 75 72 58 20  AL_OK) && (curX 
1120: 3c 20 6d 61 78 58 29 29 20 7b 0a 09 63 75 72 58  < maxX)) {..curX
1130: 20 3d 20 6e 65 77 58 3b 0a 09 70 2b 2b 3b 0a 20   = newX;..p++;. 
1140: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 66 6c     }.    if ((fl
1150: 61 67 73 20 26 20 54 4b 5f 41 54 5f 4c 45 41 53  ags & TK_AT_LEAS
1160: 54 5f 4f 4e 45 29 20 26 26 20 28 74 65 72 6d 20  T_ONE) && (term 
1170: 3d 3d 20 73 6f 75 72 63 65 29 20 26 26 20 28 6d  == source) && (m
1180: 61 78 43 68 61 72 73 20 3e 20 30 29 0a 09 20 20  axChars > 0)..  
1190: 20 20 20 26 26 20 21 69 73 73 70 61 63 65 28 55     && !isspace(U
11a0: 43 48 41 52 28 2a 74 65 72 6d 29 29 29 20 7b 0a  CHAR(*term))) {.
11b0: 09 74 65 72 6d 20 3d 20 70 3b 0a 09 74 65 72 6d  .term = p;..term
11c0: 58 20 3d 20 63 75 72 58 3b 0a 09 69 66 20 28 74  X = curX;..if (t
11d0: 65 72 6d 20 3d 3d 20 73 6f 75 72 63 65 29 20 7b  erm == source) {
11e0: 0a 09 20 20 20 20 74 65 72 6d 2b 2b 3b 0a 09 20  ..    term++;.. 
11f0: 20 20 20 74 65 72 6d 58 20 3d 20 6e 65 77 58 3b     termX = newX;
1200: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ..}.    } else i
1210: 66 20 28 28 6d 61 78 43 68 61 72 73 20 3d 3d 20  f ((maxChars == 
1220: 30 29 20 7c 7c 20 21 28 66 6c 61 67 73 20 26 20  0) || !(flags & 
1230: 54 4b 5f 57 48 4f 4c 45 5f 57 4f 52 44 53 29 29  TK_WHOLE_WORDS))
1240: 20 7b 0a 09 74 65 72 6d 20 3d 20 70 3b 0a 09 74   {..term = p;..t
1250: 65 72 6d 58 20 3d 20 63 75 72 58 3b 0a 20 20 20  ermX = curX;.   
1260: 20 7d 0a 20 20 20 20 2a 6e 65 78 74 58 50 74 72   }.    *nextXPtr
1270: 20 3d 20 74 65 72 6d 58 3b 0a 20 20 20 20 72 65   = termX;.    re
1280: 74 75 72 6e 20 74 65 72 6d 2d 73 6f 75 72 63 65  turn term-source
1290: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
12e0: 43 74 6b 44 69 73 70 6c 61 79 43 68 61 72 73 20  CtkDisplayChars 
12f0: 2d 2d 0a 20 2a 0a 20 2a 09 44 72 61 77 20 61 20  --. *. *.Draw a 
1300: 73 74 72 69 6e 67 20 6f 66 20 63 68 61 72 61 63  string of charac
1310: 74 65 72 73 20 6f 6e 20 74 68 65 20 73 63 72 65  ters on the scre
1320: 65 6e 2c 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20  en, converting. 
1330: 2a 09 74 61 62 73 20 74 6f 20 74 68 65 20 72 69  *.tabs to the ri
1340: 67 68 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 70  ght number of sp
1350: 61 63 65 73 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  aces and control
1360: 20 63 68 61 72 61 63 74 65 72 73 0a 20 2a 09 74   characters. *.t
1370: 6f 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  o sequences of t
1380: 68 65 20 66 6f 72 6d 20 22 5c 78 68 68 22 20 77  he form "\xhh" w
1390: 68 65 72 65 20 68 68 20 61 72 65 20 74 77 6f 20  here hh are two 
13a0: 68 65 78 0a 20 2a 09 64 69 67 69 74 73 2e 0a 20  hex. *.digits.. 
13b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
13c0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  .None.. *. * Sid
13d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e  e effects:. *.In
13e0: 66 6f 72 6d 61 74 69 6f 6e 20 67 65 74 73 20 64  formation gets d
13f0: 72 61 77 6e 20 6f 6e 20 74 68 65 20 73 63 72 65  rawn on the scre
1400: 65 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  en.. *. *-------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69  -------. */..voi
1450: 64 0a 54 6b 44 69 73 70 6c 61 79 43 68 61 72 73  d.TkDisplayChars
1460: 28 77 69 6e 2c 20 73 74 79 6c 65 2c 20 73 74 72  (win, style, str
1470: 69 6e 67 2c 20 6e 75 6d 43 68 61 72 73 2c 20 78  ing, numChars, x
1480: 2c 20 79 2c 20 74 61 62 4f 72 69 67 69 6e 2c 20  , y, tabOrigin, 
1490: 66 6c 61 67 73 29 0a 20 20 20 20 54 6b 5f 57 69  flags).    Tk_Wi
14a0: 6e 64 6f 77 20 77 69 6e 3b 09 09 2f 2a 20 57 69  ndow win;../* Wi
14b0: 6e 64 6f 77 20 69 6e 20 77 68 69 63 68 20 74 6f  ndow in which to
14c0: 20 64 72 61 77 2e 20 2a 2f 0a 20 20 20 20 43 74   draw. */.    Ct
14d0: 6b 5f 53 74 79 6c 65 20 73 74 79 6c 65 3b 09 09  k_Style style;..
14e0: 2f 2a 20 44 69 73 70 6c 61 79 20 63 68 61 72 61  /* Display chara
14f0: 63 74 65 72 73 20 75 73 69 6e 67 20 74 68 69 73  cters using this
1500: 20 73 74 79 6c 65 2e 20 2a 2f 0a 20 20 20 20 63   style. */.    c
1510: 68 61 72 20 2a 73 74 72 69 6e 67 3b 09 09 2f 2a  har *string;../*
1520: 20 43 68 61 72 61 63 74 65 72 73 20 74 6f 20 62   Characters to b
1530: 65 20 64 69 73 70 6c 61 79 65 64 2e 20 2a 2f 0a  e displayed. */.
1540: 20 20 20 20 69 6e 74 20 6e 75 6d 43 68 61 72 73      int numChars
1550: 3b 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;../* Number of 
1560: 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 64 69  characters to di
1570: 73 70 6c 61 79 20 66 72 6f 6d 0a 09 09 09 09 20  splay from..... 
1580: 2a 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20  * string. */.   
1590: 20 69 6e 74 20 78 2c 20 79 3b 09 09 09 2f 2a 20   int x, y;.../* 
15a0: 43 6f 6f 72 64 69 6e 61 74 65 73 20 61 74 20 77  Coordinates at w
15b0: 68 69 63 68 20 74 6f 20 64 72 61 77 20 73 74 72  hich to draw str
15c0: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ing. */.    int 
15d0: 74 61 62 4f 72 69 67 69 6e 3b 09 09 2f 2a 20 58  tabOrigin;../* X
15e0: 2d 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74 20 73  -location that s
15f0: 65 72 76 65 73 20 61 73 20 22 6f 72 69 67 69 6e  erves as "origin
1600: 22 20 66 6f 72 0a 09 09 09 09 20 2a 20 74 61 62  " for..... * tab
1610: 20 73 74 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 69   stops. */.    i
1620: 6e 74 20 66 6c 61 67 73 3b 09 09 09 2f 2a 20 46  nt flags;.../* F
1630: 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
1640: 64 69 73 70 6c 61 79 2e 20 20 4f 6e 6c 79 0a 09  display.  Only..
1650: 09 09 09 20 2a 20 54 4b 5f 4e 45 57 4c 49 4e 45  ... * TK_NEWLINE
1660: 53 5f 4e 4f 54 5f 53 50 45 43 49 41 4c 20 61 6e  S_NOT_SPECIAL an
1670: 64 20 54 4b 5f 49 47 4e 4f 52 45 5f 54 41 42 53  d TK_IGNORE_TABS
1680: 0a 09 09 09 09 20 2a 20 61 72 65 20 73 75 70 70  ..... * are supp
1690: 6f 72 74 65 64 20 72 69 67 68 74 20 6e 6f 77 2e  orted right now.
16a0: 20 20 53 65 65 0a 09 09 09 09 20 2a 20 54 6b 4d    See..... * TkM
16b0: 65 61 73 75 72 65 43 68 61 72 73 20 66 6f 72 20  easureChars for 
16c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
16d0: 74 20 69 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72  t it. */.{.    r
16e0: 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 70 3b  egister char *p;
16f0: 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 63 68 61  ../* Current cha
1700: 72 61 63 74 65 72 20 62 65 69 6e 67 20 73 63 61  racter being sca
1710: 6e 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 67  nned. */.    reg
1720: 69 73 74 65 72 20 69 6e 74 20 63 3b 0a 20 20 20  ister int c;.   
1730: 20 63 68 61 72 20 2a 73 74 61 72 74 3b 09 09 2f   char *start;../
1740: 2a 20 46 69 72 73 74 20 63 68 61 72 61 63 74 65  * First characte
1750: 72 20 77 61 69 74 69 6e 67 20 74 6f 20 62 65 20  r waiting to be 
1760: 64 69 73 70 6c 61 79 65 64 2e 20 2a 2f 0a 20 20  displayed. */.  
1770: 20 20 69 6e 74 20 73 74 61 72 74 58 3b 09 09 09    int startX;...
1780: 2f 2a 20 58 2d 63 6f 6f 72 64 69 6e 61 74 65 20  /* X-coordinate 
1790: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
17a0: 20 73 74 61 72 74 2e 20 2a 2f 0a 20 20 20 20 69   start. */.    i
17b0: 6e 74 20 63 75 72 58 3b 09 09 09 2f 2a 20 58 2d  nt curX;.../* X-
17c0: 63 6f 6f 72 64 69 6e 61 74 65 20 63 6f 72 72 65  coordinate corre
17d0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 2e 20 2a  sponding to p. *
17e0: 2f 0a 20 20 20 20 63 68 61 72 20 72 65 70 6c 61  /.    char repla
17f0: 63 65 5b 31 30 5d 3b 0a 20 20 20 20 69 6e 74 20  ce[10];.    int 
1800: 72 65 6d 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  rem;..    /*.   
1810: 20 20 2a 20 53 63 61 6e 20 74 68 65 20 73 74 72    * Scan the str
1820: 69 6e 67 20 6f 6e 65 20 63 68 61 72 61 63 74 65  ing one characte
1830: 72 20 61 74 20 61 20 74 69 6d 65 2e 20 20 44 69  r at a time.  Di
1840: 73 70 6c 61 79 20 63 6f 6e 74 72 6f 6c 0a 20 20  splay control.  
1850: 20 20 20 2a 20 63 68 61 72 61 63 74 65 72 73 20     * characters 
1860: 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 75 74  immediately, but
1870: 20 64 65 6c 61 79 20 64 69 73 70 6c 61 79 69 6e   delay displayin
1880: 67 20 6e 6f 72 6d 61 6c 20 63 68 61 72 61 63 74  g normal charact
1890: 65 72 73 0a 20 20 20 20 20 2a 20 69 6e 20 6f 72  ers.     * in or
18a0: 64 65 72 20 74 6f 20 70 61 73 73 20 6d 61 6e 79  der to pass many
18b0: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 74   characters to t
18c0: 68 65 20 73 65 72 76 65 72 20 61 6c 6c 20 74 6f  he server all to
18d0: 67 65 74 68 65 72 2e 0a 20 20 20 20 20 2a 2f 0a  gether..     */.
18e0: 0a 20 20 20 20 73 74 61 72 74 58 20 3d 20 63 75  .    startX = cu
18f0: 72 58 20 3d 20 78 3b 0a 20 20 20 20 73 74 61 72  rX = x;.    star
1900: 74 20 3d 20 73 74 72 69 6e 67 3b 0a 20 20 20 20  t = string;.    
1910: 66 6f 72 20 28 70 20 3d 20 73 74 72 69 6e 67 3b  for (p = string;
1920: 20 6e 75 6d 43 68 61 72 73 20 3e 20 30 3b 20 6e   numChars > 0; n
1930: 75 6d 43 68 61 72 73 2d 2d 2c 20 70 2b 2b 29 20  umChars--, p++) 
1940: 7b 0a 09 63 20 3d 20 2a 70 20 26 20 30 78 66 66  {..c = *p & 0xff
1950: 3b 0a 09 69 66 20 28 69 73 70 72 69 6e 74 28 55  ;..if (isprint(U
1960: 43 48 41 52 28 63 29 29 29 20 7b 0a 09 20 20 20  CHAR(c))) {..   
1970: 20 63 75 72 58 2b 2b 3b 0a 09 20 20 20 20 63 6f   curX++;..    co
1980: 6e 74 69 6e 75 65 3b 0a 09 7d 0a 09 69 66 20 28  ntinue;..}..if (
1990: 70 20 21 3d 20 73 74 61 72 74 29 20 7b 0a 09 20  p != start) {.. 
19a0: 20 20 20 43 74 6b 5f 44 72 61 77 53 74 72 69 6e     Ctk_DrawStrin
19b0: 67 28 77 69 6e 2c 20 73 74 61 72 74 58 2c 20 79  g(win, startX, y
19c0: 2c 20 73 74 79 6c 65 2c 20 73 74 61 72 74 2c 20  , style, start, 
19d0: 70 20 2d 20 73 74 61 72 74 29 3b 0a 09 20 20 20  p - start);..   
19e0: 20 73 74 61 72 74 58 20 3d 20 63 75 72 58 3b 0a   startX = curX;.
19f0: 09 7d 0a 09 69 66 20 28 63 20 3d 3d 20 27 5c 74  .}..if (c == '\t
1a00: 27 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 28  ') {..    if (!(
1a10: 66 6c 61 67 73 20 26 20 54 4b 5f 49 47 4e 4f 52  flags & TK_IGNOR
1a20: 45 5f 54 41 42 53 29 29 20 7b 0a 09 09 63 75 72  E_TABS)) {...cur
1a30: 58 20 2b 3d 20 54 41 42 5f 57 49 44 54 48 3b 0a  X += TAB_WIDTH;.
1a40: 09 09 72 65 6d 20 3d 20 28 63 75 72 58 20 2d 20  ..rem = (curX - 
1a50: 74 61 62 4f 72 69 67 69 6e 29 20 25 20 54 41 42  tabOrigin) % TAB
1a60: 5f 57 49 44 54 48 3b 0a 09 09 69 66 20 28 72 65  _WIDTH;...if (re
1a70: 6d 20 3c 20 30 29 20 7b 0a 09 09 20 20 20 20 72  m < 0) {...    r
1a80: 65 6d 20 2b 3d 20 54 41 42 5f 57 49 44 54 48 3b  em += TAB_WIDTH;
1a90: 0a 09 09 7d 0a 09 09 63 75 72 58 20 2d 3d 20 72  ...}...curX -= r
1aa0: 65 6d 3b 0a 09 09 43 74 6b 5f 46 69 6c 6c 52 65  em;...Ctk_FillRe
1ab0: 63 74 28 77 69 6e 2c 20 73 74 61 72 74 58 2c 20  ct(win, startX, 
1ac0: 79 2c 20 73 74 61 72 74 58 2b 31 2c 20 79 2b 31  y, startX+1, y+1
1ad0: 2c 20 73 74 79 6c 65 2c 20 27 20 27 29 3b 0a 09  , style, ' ');..
1ae0: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a      }..} else {.
1af0: 09 20 20 20 20 69 66 20 28 63 20 3d 3d 20 27 5c  .    if (c == '\
1b00: 6e 27 20 26 26 20 21 28 66 6c 61 67 73 20 26 20  n' && !(flags & 
1b10: 54 4b 5f 4e 45 57 4c 49 4e 45 53 5f 4e 4f 54 5f  TK_NEWLINES_NOT_
1b20: 53 50 45 43 49 41 4c 29 29 20 7b 0a 09 09 79 2b  SPECIAL)) {...y+
1b30: 2b 3b 0a 09 09 63 75 72 58 20 3d 20 78 3b 0a 09  +;...curX = x;..
1b40: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20      } else {..  
1b50: 20 20 09 69 66 20 28 63 20 3e 3d 20 30 20 26 26    .if (c >= 0 &&
1b60: 20 63 20 3c 20 73 69 7a 65 6f 66 28 6d 61 70 43   c < sizeof(mapC
1b70: 68 61 72 73 29 20 26 26 20 6d 61 70 43 68 61 72  hars) && mapChar
1b80: 73 5b 63 5d 29 20 7b 0a 09 09 20 20 20 20 72 65  s[c]) {...    re
1b90: 70 6c 61 63 65 5b 30 5d 20 3d 20 27 5c 5c 27 3b  place[0] = '\\';
1ba0: 0a 09 09 20 20 20 20 72 65 70 6c 61 63 65 5b 31  ...    replace[1
1bb0: 5d 20 3d 20 6d 61 70 43 68 61 72 73 5b 63 5d 3b  ] = mapChars[c];
1bc0: 0a 09 09 20 20 20 20 43 74 6b 5f 44 72 61 77 53  ...    Ctk_DrawS
1bd0: 74 72 69 6e 67 28 77 69 6e 2c 20 73 74 61 72 74  tring(win, start
1be0: 58 2c 20 79 2c 20 73 74 79 6c 65 2c 20 72 65 70  X, y, style, rep
1bf0: 6c 61 63 65 2c 20 32 29 3b 0a 09 09 20 20 20 20  lace, 2);...    
1c00: 63 75 72 58 20 2b 3d 20 32 3b 0a 09 20 20 20 20  curX += 2;..    
1c10: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
1c20: 72 65 70 6c 61 63 65 5b 30 5d 20 3d 20 27 5c 5c  replace[0] = '\\
1c30: 27 3b 0a 09 09 20 20 20 20 72 65 70 6c 61 63 65  ';...    replace
1c40: 5b 31 5d 20 3d 20 27 78 27 3b 0a 09 09 20 20 20  [1] = 'x';...   
1c50: 20 72 65 70 6c 61 63 65 5b 32 5d 20 3d 20 68 65   replace[2] = he
1c60: 78 43 68 61 72 73 5b 28 63 20 3e 3e 20 34 29 20  xChars[(c >> 4) 
1c70: 26 20 30 78 66 5d 3b 0a 09 09 20 20 20 20 72 65  & 0xf];...    re
1c80: 70 6c 61 63 65 5b 33 5d 20 3d 20 68 65 78 43 68  place[3] = hexCh
1c90: 61 72 73 5b 63 20 26 20 30 78 66 5d 3b 0a 09 09  ars[c & 0xf];...
1ca0: 20 20 20 20 43 74 6b 5f 44 72 61 77 53 74 72 69      Ctk_DrawStri
1cb0: 6e 67 28 77 69 6e 2c 20 73 74 61 72 74 58 2c 20  ng(win, startX, 
1cc0: 79 2c 20 73 74 79 6c 65 2c 20 72 65 70 6c 61 63  y, style, replac
1cd0: 65 2c 20 34 29 3b 0a 09 09 20 20 20 20 63 75 72  e, 4);...    cur
1ce0: 58 20 2b 3d 20 34 3b 0a 09 09 7d 0a 09 20 20 20  X += 4;...}..   
1cf0: 20 7d 0a 09 7d 0a 09 73 74 61 72 74 58 20 3d 20   }..}..startX = 
1d00: 63 75 72 58 3b 0a 09 73 74 61 72 74 20 3d 20 70  curX;..start = p
1d10: 2b 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  +1;.    }..    /
1d20: 2a 0a 20 20 20 20 20 2a 20 41 74 20 74 68 65 20  *.     * At the 
1d30: 76 65 72 79 20 65 6e 64 2c 20 74 68 65 72 65 20  very end, there 
1d40: 6d 61 79 20 62 65 20 6f 6e 65 20 6c 61 73 74 20  may be one last 
1d50: 62 61 74 63 68 20 6f 66 20 6e 6f 72 6d 61 6c 20  batch of normal 
1d60: 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
1d70: 2a 20 74 6f 20 64 69 73 70 6c 61 79 2e 0a 20 20  * to display..  
1d80: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 70     */..    if (p
1d90: 20 21 3d 20 73 74 61 72 74 29 20 7b 0a 09 43 74   != start) {..Ct
1da0: 6b 5f 44 72 61 77 53 74 72 69 6e 67 28 77 69 6e  k_DrawString(win
1db0: 2c 20 73 74 61 72 74 58 2c 20 79 2c 20 73 74 79  , startX, y, sty
1dc0: 6c 65 2c 20 73 74 61 72 74 2c 20 70 20 2d 20 73  le, start, p - s
1dd0: 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  tart);.    }.}..
1de0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
1df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
1e30: 20 2a 20 54 6b 43 6f 6d 70 75 74 65 54 65 78 74   * TkComputeText
1e40: 47 65 6f 6d 65 74 72 79 20 2d 2d 0a 20 2a 0a 20  Geometry --. *. 
1e50: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
1e60: 20 63 6f 6d 70 75 74 65 73 20 74 68 65 20 61 6d   computes the am
1e70: 6f 75 6e 74 20 6f 66 20 73 63 72 65 65 6e 20 73  ount of screen s
1e80: 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f 0a 20  pace needed to. 
1e90: 2a 09 64 69 73 70 6c 61 79 20 61 20 6d 75 6c 74  *.display a mult
1ea0: 69 2d 6c 69 6e 65 20 73 74 72 69 6e 67 20 6f 66  i-line string of
1eb0: 20 74 65 78 74 2e 0a 20 2a 0a 20 2a 20 52 65 73   text.. *. * Res
1ec0: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 72 65 20 69  ults:. *.There i
1ed0: 73 20 6e 6f 20 72 65 74 75 72 6e 20 76 61 6c 75  s no return valu
1ee0: 65 2e 20 20 54 68 65 20 64 69 6d 65 6e 73 69 6f  e.  The dimensio
1ef0: 6e 73 20 6f 66 20 74 68 65 20 73 63 72 65 65 6e  ns of the screen
1f00: 20 61 72 65 61 0a 20 2a 09 6e 65 65 64 65 64 20   area. *.needed 
1f10: 74 6f 20 64 69 73 70 6c 61 79 20 74 68 65 20 74  to display the t
1f20: 65 78 74 20 61 72 65 20 72 65 74 75 72 6e 65 64  ext are returned
1f30: 20 69 6e 20 2a 77 69 64 74 68 50 74 72 2c 20 61   in *widthPtr, a
1f40: 6e 64 20 2a 68 65 69 67 68 74 50 74 72 2e 0a 20  nd *heightPtr.. 
1f50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
1f60: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
1f70: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69  -------. */..voi
1fc0: 64 0a 54 6b 43 6f 6d 70 75 74 65 54 65 78 74 47  d.TkComputeTextG
1fd0: 65 6f 6d 65 74 72 79 28 73 74 72 69 6e 67 2c 20  eometry(string, 
1fe0: 6e 75 6d 43 68 61 72 73 2c 20 77 72 61 70 4c 65  numChars, wrapLe
1ff0: 6e 67 74 68 2c 20 77 69 64 74 68 50 74 72 2c 20  ngth, widthPtr, 
2000: 68 65 69 67 68 74 50 74 72 29 0a 20 20 20 20 63  heightPtr).    c
2010: 68 61 72 20 2a 73 74 72 69 6e 67 3b 09 09 2f 2a  har *string;../*
2020: 20 53 74 72 69 6e 67 20 77 68 6f 73 65 20 64 69   String whose di
2030: 6d 65 6e 73 69 6f 6e 73 20 61 72 65 20 74 6f 20  mensions are to 
2040: 62 65 0a 09 09 09 09 20 2a 20 63 6f 6d 70 75 74  be..... * comput
2050: 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ed. */.    int n
2060: 75 6d 43 68 61 72 73 3b 09 09 2f 2a 20 4e 75 6d  umChars;../* Num
2070: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
2080: 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 66 72  s to consider fr
2090: 6f 6d 0a 09 09 09 09 20 2a 20 73 74 72 69 6e 67  om..... * string
20a0: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 72 61  . */.    int wra
20b0: 70 4c 65 6e 67 74 68 3b 09 09 2f 2a 20 4c 6f 6e  pLength;../* Lon
20c0: 67 65 73 74 20 70 65 72 6d 69 73 73 69 62 6c 65  gest permissible
20d0: 20 6c 69 6e 65 20 6c 65 6e 67 74 68 2c 20 69 6e   line length, in
20e0: 0a 09 09 09 09 20 2a 20 70 69 78 65 6c 73 2e 20  ..... * pixels. 
20f0: 20 3c 3d 20 30 20 6d 65 61 6e 73 20 6e 6f 20 61   <= 0 means no a
2100: 75 74 6f 6d 61 74 69 63 20 77 72 61 70 70 69 6e  utomatic wrappin
2110: 67 3a 0a 09 09 09 09 20 2a 20 6a 75 73 74 20 6c  g:..... * just l
2120: 65 74 20 6c 69 6e 65 73 20 67 65 74 20 61 73 20  et lines get as 
2130: 6c 6f 6e 67 20 61 73 20 6e 65 65 64 65 64 2e 20  long as needed. 
2140: 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 77 69 64 74  */.    int *widt
2150: 68 50 74 72 3b 09 09 2f 2a 20 53 74 6f 72 65 20  hPtr;../* Store 
2160: 77 69 64 74 68 20 6f 66 20 73 74 72 69 6e 67 20  width of string 
2170: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  here. */.    int
2180: 20 2a 68 65 69 67 68 74 50 74 72 3b 09 09 2f 2a   *heightPtr;../*
2190: 20 53 74 6f 72 65 20 68 65 69 67 68 74 20 6f 66   Store height of
21a0: 20 73 74 72 69 6e 67 20 68 65 72 65 2e 20 2a 2f   string here. */
21b0: 0a 7b 0a 20 20 20 20 69 6e 74 20 74 68 69 73 57  .{.    int thisW
21c0: 69 64 74 68 2c 20 6d 61 78 57 69 64 74 68 2c 20  idth, maxWidth, 
21d0: 6e 75 6d 4c 69 6e 65 73 3b 0a 20 20 20 20 63 68  numLines;.    ch
21e0: 61 72 20 2a 70 3b 0a 0a 20 20 20 20 69 66 20 28  ar *p;..    if (
21f0: 77 72 61 70 4c 65 6e 67 74 68 20 3c 3d 20 30 29  wrapLength <= 0)
2200: 20 7b 0a 09 77 72 61 70 4c 65 6e 67 74 68 20 3d   {..wrapLength =
2210: 20 49 4e 54 5f 4d 41 58 3b 0a 20 20 20 20 7d 0a   INT_MAX;.    }.
2220: 20 20 20 20 6d 61 78 57 69 64 74 68 20 3d 20 30      maxWidth = 0
2230: 3b 0a 20 20 20 20 66 6f 72 20 28 6e 75 6d 4c 69  ;.    for (numLi
2240: 6e 65 73 20 3d 20 31 2c 20 70 20 3d 20 73 74 72  nes = 1, p = str
2250: 69 6e 67 3b 20 28 70 20 2d 20 73 74 72 69 6e 67  ing; (p - string
2260: 29 20 3c 20 6e 75 6d 43 68 61 72 73 3b 20 6e 75  ) < numChars; nu
2270: 6d 4c 69 6e 65 73 2b 2b 29 20 7b 0a 09 70 20 2b  mLines++) {..p +
2280: 3d 20 54 6b 4d 65 61 73 75 72 65 43 68 61 72 73  = TkMeasureChars
2290: 28 70 2c 20 6e 75 6d 43 68 61 72 73 20 2d 20 28  (p, numChars - (
22a0: 70 20 2d 20 73 74 72 69 6e 67 29 2c 20 30 2c 0a  p - string), 0,.
22b0: 09 09 77 72 61 70 4c 65 6e 67 74 68 2c 20 30 2c  ..wrapLength, 0,
22c0: 20 54 4b 5f 57 48 4f 4c 45 5f 57 4f 52 44 53 7c   TK_WHOLE_WORDS|
22d0: 54 4b 5f 41 54 5f 4c 45 41 53 54 5f 4f 4e 45 2c  TK_AT_LEAST_ONE,
22e0: 20 26 74 68 69 73 57 69 64 74 68 29 3b 0a 09 69   &thisWidth);..i
22f0: 66 20 28 74 68 69 73 57 69 64 74 68 20 3e 20 6d  f (thisWidth > m
2300: 61 78 57 69 64 74 68 29 20 7b 0a 09 20 20 20 20  axWidth) {..    
2310: 6d 61 78 57 69 64 74 68 20 3d 20 74 68 69 73 57  maxWidth = thisW
2320: 69 64 74 68 3b 0a 09 7d 0a 09 69 66 20 28 2a 70  idth;..}..if (*p
2330: 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 62 72   == 0) {..    br
2340: 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  eak;..}.../*.. *
2350: 20 49 66 20 74 68 65 20 63 68 61 72 61 63 74 65   If the characte
2360: 72 20 74 68 61 74 20 64 69 64 6e 27 74 20 66 69  r that didn't fi
2370: 74 20 69 6e 20 74 68 69 73 20 6c 69 6e 65 20 77  t in this line w
2380: 61 73 20 61 20 77 68 69 74 65 0a 09 20 2a 20 73  as a white.. * s
2390: 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20 74  pace character t
23a0: 68 65 6e 20 73 6b 69 70 20 69 74 2e 0a 09 20 2a  hen skip it... *
23b0: 2f 0a 0a 09 69 66 20 28 69 73 73 70 61 63 65 28  /...if (isspace(
23c0: 55 43 48 41 52 28 2a 70 29 29 29 20 7b 0a 09 20  UCHAR(*p))) {.. 
23d0: 20 20 20 70 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d     p++;..}.    }
23e0: 0a 20 20 20 20 2a 77 69 64 74 68 50 74 72 20 3d  .    *widthPtr =
23f0: 20 6d 61 78 57 69 64 74 68 3b 0a 20 20 20 20 2a   maxWidth;.    *
2400: 68 65 69 67 68 74 50 74 72 20 3d 20 6e 75 6d 4c  heightPtr = numL
2410: 69 6e 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  ines;.}.../*. *-
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2460: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 44 69  -----. *. * TkDi
2470: 73 70 6c 61 79 54 65 78 74 20 2d 2d 0a 20 2a 0a  splayText --. *.
2480: 20 2a 09 44 69 73 70 6c 61 79 20 61 20 74 65 78   *.Display a tex
2490: 74 20 73 74 72 69 6e 67 20 6f 6e 20 6f 6e 65 20  t string on one 
24a0: 6f 72 20 6d 6f 72 65 20 6c 69 6e 65 73 2e 0a 20  or more lines.. 
24b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
24c0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  .None.. *. * Sid
24d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68  e effects:. *.Th
24e0: 65 20 74 65 78 74 20 67 69 76 65 6e 20 62 79 20  e text given by 
24f0: 22 73 74 72 69 6e 67 22 20 67 65 74 73 20 64 69  "string" gets di
2500: 73 70 6c 61 79 65 64 20 61 74 20 74 68 65 20 67  splayed at the g
2510: 69 76 65 6e 20 6c 6f 63 61 74 69 6f 6e 0a 20 2a  iven location. *
2520: 09 69 6e 20 74 68 65 20 67 69 76 65 6e 20 77 69  .in the given wi
2530: 6e 64 6f 77 20 77 69 74 68 20 74 68 65 20 67 69  ndow with the gi
2540: 76 65 6e 20 73 74 79 6c 65 20 65 74 63 2e 0a 20  ven style etc.. 
2550: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
25a0: 76 6f 69 64 0a 54 6b 44 69 73 70 6c 61 79 54 65  void.TkDisplayTe
25b0: 78 74 28 77 69 6e 2c 20 73 74 79 6c 65 2c 20 73  xt(win, style, s
25c0: 74 72 69 6e 67 2c 20 6e 75 6d 43 68 61 72 73 2c  tring, numChars,
25d0: 20 78 2c 20 79 2c 0a 09 6c 65 6e 67 74 68 2c 20   x, y,..length, 
25e0: 6a 75 73 74 69 66 79 2c 20 75 6e 64 65 72 6c 69  justify, underli
25f0: 6e 65 29 0a 20 20 20 20 54 6b 5f 57 69 6e 64 6f  ne).    Tk_Windo
2600: 77 20 77 69 6e 3b 09 09 2f 2a 20 57 69 6e 64 6f  w win;../* Windo
2610: 77 20 69 6e 20 77 68 69 63 68 20 74 6f 20 64 72  w in which to dr
2620: 61 77 20 74 68 65 20 74 65 78 74 2e 20 2a 2f 0a  aw the text. */.
2630: 20 20 20 20 43 74 6b 5f 53 74 79 6c 65 20 73 74      Ctk_Style st
2640: 79 6c 65 3b 09 09 2f 2a 20 53 74 79 6c 65 20 69  yle;../* Style i
2650: 6e 20 77 68 69 63 68 20 74 6f 20 64 72 61 77 20  n which to draw 
2660: 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 09  characters.    .
2670: 09 09 09 20 2a 20 28 65 78 63 65 70 74 20 66 6f  ... * (except fo
2680: 72 20 75 6e 64 65 72 6c 69 6e 65 64 20 63 68 61  r underlined cha
2690: 72 29 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  r). */.    char 
26a0: 2a 73 74 72 69 6e 67 3b 09 09 2f 2a 20 53 74 72  *string;../* Str
26b0: 69 6e 67 20 74 6f 20 64 69 73 70 6c 61 79 3b 20  ing to display; 
26c0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 6d 62   may contain emb
26d0: 65 64 64 65 64 0a 09 09 09 09 20 2a 20 6e 65 77  edded..... * new
26e0: 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 69 6e  lines. */.    in
26f0: 74 20 6e 75 6d 43 68 61 72 73 3b 09 09 2f 2a 20  t numChars;../* 
2700: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
2710: 74 65 72 73 20 74 6f 20 75 73 65 20 66 72 6f 6d  ters to use from
2720: 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20   string. */.    
2730: 69 6e 74 20 78 2c 20 79 3b 09 09 09 2f 2a 20 50  int x, y;.../* P
2740: 69 78 65 6c 20 63 6f 6f 72 64 69 6e 61 74 65 73  ixel coordinates
2750: 20 77 69 74 68 69 6e 20 64 72 61 77 61 62 6c 65   within drawable
2760: 20 6f 66 0a 09 09 09 09 20 2a 20 75 70 70 65 72   of..... * upper
2770: 20 6c 65 66 74 20 63 6f 72 6e 65 72 20 6f 66 20   left corner of 
2780: 64 69 73 70 6c 61 79 20 61 72 65 61 2e 20 2a 2f  display area. */
2790: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b  .    int length;
27a0: 09 09 09 2f 2a 20 4c 69 6e 65 20 6c 65 6e 67 74  .../* Line lengt
27b0: 68 20 69 6e 20 70 69 78 65 6c 73 3b 20 20 75 73  h in pixels;  us
27c0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 09 09  ed to compute...
27d0: 09 09 20 2a 20 77 6f 72 64 20 77 72 61 70 20 70  .. * word wrap p
27e0: 6f 69 6e 74 73 20 61 6e 64 20 61 6c 73 6f 20 66  oints and also f
27f0: 6f 72 0a 09 09 09 09 20 2a 20 6a 75 73 74 69 66  or..... * justif
2800: 69 63 61 74 69 6f 6e 2e 20 20 20 4d 75 73 74 20  ication.   Must 
2810: 62 65 20 3e 20 30 2e 20 2a 2f 0a 20 20 20 20 54  be > 0. */.    T
2820: 6b 5f 4a 75 73 74 69 66 79 20 6a 75 73 74 69 66  k_Justify justif
2830: 79 3b 09 09 2f 2a 20 48 6f 77 20 74 6f 20 6a 75  y;../* How to ju
2840: 73 74 69 66 79 20 6c 69 6e 65 73 2e 20 2a 2f 0a  stify lines. */.
2850: 20 20 20 20 69 6e 74 20 75 6e 64 65 72 6c 69 6e      int underlin
2860: 65 3b 09 09 2f 2a 20 49 6e 64 65 78 20 6f 66 20  e;../* Index of 
2870: 63 68 61 72 61 63 74 65 72 20 74 6f 20 75 6e 64  character to und
2880: 65 72 6c 69 6e 65 2c 20 6f 72 20 3c 20 30 0a 09  erline, or < 0..
2890: 09 09 09 20 2a 20 66 6f 72 20 6e 6f 20 75 6e 64  ... * for no und
28a0: 65 72 6c 69 6e 69 6e 67 2e 20 2a 2f 0a 7b 0a 20  erlining. */.{. 
28b0: 20 20 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20     char *p;.    
28c0: 69 6e 74 20 63 68 61 72 73 54 68 69 73 4c 69 6e  int charsThisLin
28d0: 65 2c 20 6c 65 6e 67 74 68 54 68 69 73 4c 69 6e  e, lengthThisLin
28e0: 65 2c 20 78 54 68 69 73 4c 69 6e 65 3b 0a 20 20  e, xThisLine;.  
28f0: 20 20 69 6e 74 20 75 6e 64 65 72 6c 69 6e 65 4f    int underlineO
2900: 66 66 73 65 74 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ffset;..    /*. 
2910: 20 20 20 20 2a 20 57 6f 72 6b 20 74 68 72 6f 75      * Work throu
2920: 67 68 20 74 68 65 20 73 74 72 69 6e 67 20 6f 6e  gh the string on
2930: 65 20 6c 69 6e 65 20 61 74 20 61 20 74 69 6d 65  e line at a time
2940: 2e 20 20 44 69 73 70 6c 61 79 20 65 61 63 68 20  .  Display each 
2950: 6c 69 6e 65 0a 20 20 20 20 20 2a 20 69 6e 20 66  line.     * in f
2960: 6f 75 72 20 73 74 65 70 73 3a 0a 20 20 20 20 20  our steps:.     
2970: 2a 20 20 20 20 20 31 2e 20 43 6f 6d 70 75 74 65  *     1. Compute
2980: 20 74 68 65 20 6c 69 6e 65 27 73 20 6c 65 6e 67   the line's leng
2990: 74 68 2e 0a 20 20 20 20 20 2a 20 20 20 20 20 32  th..     *     2
29a0: 2e 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  . Figure out whe
29b0: 72 65 20 74 6f 20 64 69 73 70 6c 61 79 20 74 68  re to display th
29c0: 65 20 6c 69 6e 65 20 66 6f 72 20 6a 75 73 74 69  e line for justi
29d0: 66 69 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 2a  fication..     *
29e0: 20 20 20 20 20 33 2e 20 44 69 73 70 6c 61 79 20       3. Display 
29f0: 74 68 65 20 6c 69 6e 65 2e 0a 20 20 20 20 20 2a  the line..     *
2a00: 20 20 20 20 20 34 2e 20 55 6e 64 65 72 6c 69 6e       4. Underlin
2a10: 65 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  e one character 
2a20: 69 66 20 6e 65 65 64 65 64 2e 0a 20 20 20 20 20  if needed..     
2a30: 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 70 20 3d  */..    for (p =
2a40: 20 73 74 72 69 6e 67 3b 20 6e 75 6d 43 68 61 72   string; numChar
2a50: 73 20 3e 20 30 3b 20 29 20 7b 0a 09 63 68 61 72  s > 0; ) {..char
2a60: 73 54 68 69 73 4c 69 6e 65 20 3d 20 54 6b 4d 65  sThisLine = TkMe
2a70: 61 73 75 72 65 43 68 61 72 73 28 70 2c 20 6e 75  asureChars(p, nu
2a80: 6d 43 68 61 72 73 2c 20 30 2c 20 6c 65 6e 67 74  mChars, 0, lengt
2a90: 68 2c 20 30 2c 0a 09 09 54 4b 5f 57 48 4f 4c 45  h, 0,...TK_WHOLE
2aa0: 5f 57 4f 52 44 53 7c 54 4b 5f 41 54 5f 4c 45 41  _WORDS|TK_AT_LEA
2ab0: 53 54 5f 4f 4e 45 2c 20 26 6c 65 6e 67 74 68 54  ST_ONE, &lengthT
2ac0: 68 69 73 4c 69 6e 65 29 3b 0a 09 69 66 20 28 6a  hisLine);..if (j
2ad0: 75 73 74 69 66 79 20 3d 3d 20 54 4b 5f 4a 55 53  ustify == TK_JUS
2ae0: 54 49 46 59 5f 4c 45 46 54 29 20 7b 0a 09 20 20  TIFY_LEFT) {..  
2af0: 20 20 78 54 68 69 73 4c 69 6e 65 20 3d 20 78 3b    xThisLine = x;
2b00: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6a 75 73  ..} else if (jus
2b10: 74 69 66 79 20 3d 3d 20 54 4b 5f 4a 55 53 54 49  tify == TK_JUSTI
2b20: 46 59 5f 43 45 4e 54 45 52 29 20 7b 0a 09 20 20  FY_CENTER) {..  
2b30: 20 20 78 54 68 69 73 4c 69 6e 65 20 3d 20 78 20    xThisLine = x 
2b40: 2b 20 28 6c 65 6e 67 74 68 20 2d 20 6c 65 6e 67  + (length - leng
2b50: 74 68 54 68 69 73 4c 69 6e 65 29 2f 32 3b 0a 09  thThisLine)/2;..
2b60: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 78 54  } else {..    xT
2b70: 68 69 73 4c 69 6e 65 20 3d 20 78 20 2b 20 28 6c  hisLine = x + (l
2b80: 65 6e 67 74 68 20 2d 20 6c 65 6e 67 74 68 54 68  ength - lengthTh
2b90: 69 73 4c 69 6e 65 29 3b 0a 09 7d 0a 09 54 6b 44  isLine);..}..TkD
2ba0: 69 73 70 6c 61 79 43 68 61 72 73 28 77 69 6e 2c  isplayChars(win,
2bb0: 20 73 74 79 6c 65 2c 20 70 2c 20 63 68 61 72 73   style, p, chars
2bc0: 54 68 69 73 4c 69 6e 65 2c 0a 09 09 78 54 68 69  ThisLine,...xThi
2bd0: 73 4c 69 6e 65 2c 20 79 2c 20 78 54 68 69 73 4c  sLine, y, xThisL
2be0: 69 6e 65 2c 20 30 29 3b 0a 09 69 66 20 28 28 75  ine, 0);..if ((u
2bf0: 6e 64 65 72 6c 69 6e 65 20 3e 3d 20 30 29 20 26  nderline >= 0) &
2c00: 26 20 28 75 6e 64 65 72 6c 69 6e 65 20 3c 20 63  & (underline < c
2c10: 68 61 72 73 54 68 69 73 4c 69 6e 65 29 29 20 7b  harsThisLine)) {
2c20: 0a 09 20 20 20 20 28 76 6f 69 64 29 20 54 6b 4d  ..    (void) TkM
2c30: 65 61 73 75 72 65 43 68 61 72 73 28 70 2c 20 75  easureChars(p, u
2c40: 6e 64 65 72 6c 69 6e 65 2c 20 30 2c 20 6c 65 6e  nderline, 0, len
2c50: 67 74 68 2c 20 30 2c 0a 09 09 20 20 20 20 54 4b  gth, 0,...    TK
2c60: 5f 57 48 4f 4c 45 5f 57 4f 52 44 53 7c 54 4b 5f  _WHOLE_WORDS|TK_
2c70: 41 54 5f 4c 45 41 53 54 5f 4f 4e 45 2c 20 26 75  AT_LEAST_ONE, &u
2c80: 6e 64 65 72 6c 69 6e 65 4f 66 66 73 65 74 29 3b  nderlineOffset);
2c90: 0a 09 20 20 20 20 54 6b 44 69 73 70 6c 61 79 43  ..    TkDisplayC
2ca0: 68 61 72 73 28 77 69 6e 2c 20 43 54 4b 5f 55 4e  hars(win, CTK_UN
2cb0: 44 45 52 4c 49 4e 45 5f 53 54 59 4c 45 2c 20 70  DERLINE_STYLE, p
2cc0: 2b 75 6e 64 65 72 6c 69 6e 65 2c 20 31 2c 0a 09  +underline, 1,..
2cd0: 09 20 20 20 20 78 54 68 69 73 4c 69 6e 65 2b 75  .    xThisLine+u
2ce0: 6e 64 65 72 6c 69 6e 65 4f 66 66 73 65 74 2c 20  nderlineOffset, 
2cf0: 79 2c 20 78 54 68 69 73 4c 69 6e 65 2c 20 30 29  y, xThisLine, 0)
2d00: 3b 0a 09 7d 0a 09 70 20 2b 3d 20 63 68 61 72 73  ;..}..p += chars
2d10: 54 68 69 73 4c 69 6e 65 3b 0a 09 6e 75 6d 43 68  ThisLine;..numCh
2d20: 61 72 73 20 2d 3d 20 63 68 61 72 73 54 68 69 73  ars -= charsThis
2d30: 4c 69 6e 65 3b 0a 09 75 6e 64 65 72 6c 69 6e 65  Line;..underline
2d40: 20 2d 3d 20 63 68 61 72 73 54 68 69 73 4c 69 6e   -= charsThisLin
2d50: 65 3b 0a 09 79 2b 2b 3b 0a 0a 09 2f 2a 0a 09 20  e;..y++;.../*.. 
2d60: 2a 20 49 66 20 74 68 65 20 63 68 61 72 61 63 74  * If the charact
2d70: 65 72 20 74 68 61 74 20 64 69 64 6e 27 74 20 66  er that didn't f
2d80: 69 74 20 77 61 73 20 61 20 73 70 61 63 65 20 63  it was a space c
2d90: 68 61 72 61 63 74 65 72 2c 20 73 6b 69 70 20 69  haracter, skip i
2da0: 74 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 69 73  t... */...if (is
2db0: 73 70 61 63 65 28 55 43 48 41 52 28 2a 70 29 29  space(UCHAR(*p))
2dc0: 29 20 7b 0a 09 20 20 20 20 70 2b 2b 3b 0a 09 20  ) {..    p++;.. 
2dd0: 20 20 20 6e 75 6d 43 68 61 72 73 2d 2d 3b 0a 09     numChars--;..
2de0: 20 20 20 20 75 6e 64 65 72 6c 69 6e 65 2d 2d 3b      underline--;
2df0: 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a              ..}.    }.}.