Hex Artifact Content
Not logged in

Artifact 1f128a2ff89135198de8f390c4b61937bd009c14:


0000: 0a 20 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  . /* ===========
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 0a 0a 20 20 20 20 46 49 4c  =======..    FIL
0050: 45 3a 20 22 2f 68 6f 6d 65 2f 6a 6f 7a 65 2f 73  E: "/home/joze/s
0060: 72 63 2f 74 63 6c 72 65 61 64 6c 69 6e 65 2f 74  rc/tclreadline/t
0070: 63 6c 72 65 61 64 6c 69 6e 65 2e 63 22 0a 20 20  clreadline.c".  
0080: 20 20 4c 41 53 54 20 4d 4f 44 49 46 49 43 41 54    LAST MODIFICAT
0090: 49 4f 4e 3a 20 22 54 75 65 20 41 75 67 20 32 34  ION: "Tue Aug 24
00a0: 20 30 33 3a 31 31 3a 32 34 20 31 39 39 39 20 28   03:11:24 1999 (
00b0: 6a 6f 7a 65 29 22 0a 20 20 20 20 28 43 29 20 31  joze)".    (C) 1
00c0: 39 39 38 2c 20 31 39 39 39 20 62 79 20 4a 6f 68  998, 1999 by Joh
00d0: 61 6e 6e 65 73 20 5a 65 6c 6c 6e 65 72 2c 20 3c  annes Zellner, <
00e0: 6a 6f 68 61 6e 6e 65 73 40 7a 65 6c 6c 6e 65 72  johannes@zellner
00f0: 2e 6f 72 67 3e 0a 20 20 20 20 24 49 64 24 0a 20  .org>.    $Id$. 
0100: 20 20 20 2d 2d 2d 0a 0a 20 20 20 20 74 63 6c 72     ---..    tclr
0110: 65 61 64 6c 69 6e 65 20 2d 2d 20 67 6e 75 20 72  eadline -- gnu r
0120: 65 61 64 6c 69 6e 65 20 66 6f 72 20 74 63 6c 0a  eadline for tcl.
0130: 20 20 20 20 43 6f 70 79 72 69 67 68 74 20 28 43      Copyright (C
0140: 29 20 31 39 39 39 20 20 4a 6f 68 61 6e 6e 65 73  ) 1999  Johannes
0150: 20 5a 65 6c 6c 6e 65 72 0a 0a 20 20 20 20 54 68   Zellner..    Th
0160: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72  is program is fr
0170: 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f 75  ee software; you
0180: 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 74   can redistribut
0190: 65 20 69 74 20 61 6e 64 2f 6f 72 0a 20 20 20 20  e it and/or.    
01a0: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
01b0: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
01c0: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
01d0: 6c 69 63 20 4c 69 63 65 6e 73 65 0a 20 20 20 20  lic License.    
01e0: 61 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 20  as published by 
01f0: 74 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72  the Free Softwar
0200: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69  e Foundation; ei
0210: 74 68 65 72 20 76 65 72 73 69 6f 6e 20 32 0a 20  ther version 2. 
0220: 20 20 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73     of the Licens
0230: 65 2c 20 6f 72 20 28 61 74 20 79 6f 75 72 20 6f  e, or (at your o
0240: 70 74 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72  ption) any later
0250: 20 76 65 72 73 69 6f 6e 2e 0a 0a 20 20 20 20 54   version...    T
0260: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64  his program is d
0270: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68  istributed in th
0280: 65 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77  e hope that it w
0290: 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 20  ill be useful,. 
02a0: 20 20 20 62 75 74 20 57 49 54 48 4f 55 54 20 41     but WITHOUT A
02b0: 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74  NY WARRANTY; wit
02c0: 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d  hout even the im
02d0: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f  plied warranty o
02e0: 66 0a 20 20 20 20 4d 45 52 43 48 41 4e 54 41 42  f.    MERCHANTAB
02f0: 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53  ILITY or FITNESS
0300: 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41   FOR A PARTICULA
0310: 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65 20  R PURPOSE.  See 
0320: 74 68 65 0a 20 20 20 20 47 4e 55 20 47 65 6e 65  the.    GNU Gene
0330: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e  ral Public Licen
0340: 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61  se for more deta
0350: 69 6c 73 2e 0a 0a 20 20 20 20 59 6f 75 20 73 68  ils...    You sh
0360: 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 69 76  ould have receiv
0370: 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ed a copy of the
0380: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
0390: 6c 69 63 20 4c 69 63 65 6e 73 65 0a 20 20 20 20  lic License.    
03a0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 69 73 20  along with this 
03b0: 70 72 6f 67 72 61 6d 3b 20 69 66 20 6e 6f 74 2c  program; if not,
03c0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 46 72   write to the Fr
03d0: 65 65 20 53 6f 66 74 77 61 72 65 0a 20 20 20 20  ee Software.    
03e0: 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e 63 2e  Foundation, Inc.
03f0: 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c 61 63  , 59 Temple Plac
0400: 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c 20 42  e - Suite 330, B
0410: 6f 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31  oston, MA  02111
0420: 2d 31 33 30 37 2c 20 55 53 41 2e 0a 0a 20 20 20  -1307, USA...   
0430: 20 3c 6a 6f 68 61 6e 6e 65 73 40 7a 65 6c 6c 6e   <johannes@zelln
0440: 65 72 2e 6f 72 67 3e 2c 20 68 74 74 70 3a 2f 2f  er.org>, http://
0450: 77 77 77 2e 7a 65 6c 6c 6e 65 72 2e 6f 72 67 2f  www.zellner.org/
0460: 74 63 6c 72 65 61 64 6c 69 6e 65 2f 0a 0a 20 20  tclreadline/..  
0470: 20 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d    ==============
0480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
04a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
04b0: 3d 3d 3d 3d 20 2a 2f 20 20 0a 0a 0a 23 69 6e 63  ==== */  ...#inc
04c0: 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e  lude <tcl.h>.#in
04d0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
04e0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
04f0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0500: 72 69 6e 67 2e 68 3e 0a 23 64 65 66 69 6e 65 20  ring.h>.#define 
0510: 52 45 41 44 4c 49 4e 45 5f 4c 49 42 52 41 52 59  READLINE_LIBRARY
0520: 0a 23 69 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c  .#include <readl
0530: 69 6e 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ine.h>.#include 
0540: 3c 68 69 73 74 6f 72 79 2e 68 3e 0a 0a 23 69 6e  <history.h>..#in
0550: 63 6c 75 64 65 20 3c 74 63 6c 72 65 61 64 6c 69  clude <tclreadli
0560: 6e 65 2e 68 3e 0a 0a 23 64 65 66 69 6e 65 20 4d  ne.h>..#define M
0570: 41 4c 4c 4f 43 28 73 69 7a 65 29 20 54 63 6c 5f  ALLOC(size) Tcl_
0580: 41 6c 6c 6f 63 28 28 69 6e 74 29 20 73 69 7a 65  Alloc((int) size
0590: 29 0a 23 64 65 66 69 6e 65 20 46 52 45 45 28 70  ).#define FREE(p
05a0: 74 72 29 20 69 66 20 28 70 74 72 29 20 7b 20 54  tr) if (ptr) { T
05b0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 20  cl_Free((char*) 
05c0: 70 74 72 29 3b 20 70 74 72 20 3d 20 30 3b 20 7d  ptr); ptr = 0; }
05d0: 0a 0a 65 6e 75 6d 20 7b 0a 20 20 20 20 5f 43 4d  ..enum {.    _CM
05e0: 44 5f 53 45 54 20 20 20 20 20 3d 20 28 31 20 3c  D_SET     = (1 <
05f0: 3c 20 30 29 2c 0a 20 20 20 20 5f 43 4d 44 5f 47  < 0),.    _CMD_G
0600: 45 54 20 20 20 20 20 3d 20 28 31 20 3c 3c 20 31  ET     = (1 << 1
0610: 29 0a 7d 3b 0a 0a 0a 74 79 70 65 64 65 66 20 73  ).};...typedef s
0620: 74 72 75 63 74 20 63 6d 64 73 5f 74 20 7b 0a 20  truct cmds_t {. 
0630: 20 20 20 73 74 72 75 63 74 20 63 6d 64 73 5f 74     struct cmds_t
0640: 2a 20 70 72 65 76 3b 0a 20 20 20 20 63 68 61 72  * prev;.    char
0650: 2a 2a 20 20 20 20 20 20 20 20 20 63 6d 64 3b 0a  **         cmd;.
0660: 20 20 20 20 73 74 72 75 63 74 20 63 6d 64 73 5f      struct cmds_
0670: 74 2a 20 6e 65 78 74 3b 0a 7d 20 63 6d 64 73 5f  t* next;.} cmds_
0680: 74 3b 0a 0a 0a 23 64 65 66 69 6e 65 20 49 53 57  t;...#define ISW
0690: 48 49 54 45 28 63 29 20 28 28 27 20 27 20 3d 3d  HITE(c) ((' ' ==
06a0: 20 63 29 20 7c 7c 20 28 27 5c 74 27 20 3d 3d 20   c) || ('\t' == 
06b0: 63 29 20 7c 7c 20 28 27 5c 6e 27 20 3d 3d 20 63  c) || ('\n' == c
06c0: 29 29 0a 0a 2f 2a 0a 20 2a 20 66 6f 72 77 61 72  ))../*. * forwar
06d0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 0a  d declarations..
06e0: 20 2a 2f 0a 63 68 61 72 2a 20 73 74 72 69 70 6c   */.char* stripl
06f0: 65 66 74 28 63 68 61 72 2a 20 69 6e 29 3b 0a 63  eft(char* in);.c
0700: 68 61 72 2a 20 73 74 72 69 70 72 69 67 68 74 28  har* stripright(
0710: 63 68 61 72 2a 20 69 6e 29 3b 0a 63 68 61 72 2a  char* in);.char*
0720: 20 73 74 72 69 70 77 68 69 74 65 28 63 68 61 72   stripwhite(char
0730: 2a 20 69 6e 29 3b 0a 63 68 61 72 2a 20 54 63 6c  * in);.char* Tcl
0740: 52 65 61 64 6c 69 6e 65 51 75 6f 74 65 28 63 68  ReadlineQuote(ch
0750: 61 72 2a 20 74 65 78 74 2c 20 63 68 61 72 2a 20  ar* text, char* 
0760: 71 75 6f 74 65 63 68 61 72 73 29 3b 0a 69 6e 74  quotechars);.int
0770: 20 54 63 6c 52 65 61 64 6c 69 6e 65 43 6d 64 28   TclReadlineCmd(
0780: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
0790: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
07a0: 70 2a 20 69 6e 74 65 72 70 2c 0a 20 20 20 20 69  p* interp,.    i
07b0: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 2a 2a 20  nt argc, char** 
07c0: 61 72 67 76 29 3b 0a 76 6f 69 64 20 54 63 6c 52  argv);.void TclR
07d0: 65 61 64 6c 69 6e 65 44 61 74 61 41 76 61 69 6c  eadlineDataAvail
07e0: 61 62 6c 65 48 61 6e 64 6c 65 72 28 43 6c 69 65  ableHandler(Clie
07f0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
0800: 61 2c 20 69 6e 74 20 6d 61 73 6b 29 3b 0a 76 6f  a, int mask);.vo
0810: 69 64 20 54 63 6c 52 65 61 64 6c 69 6e 65 4c 69  id TclReadlineLi
0820: 6e 65 43 6f 6d 70 6c 65 74 65 48 61 6e 64 6c 65  neCompleteHandle
0830: 72 28 63 68 61 72 2a 20 70 74 72 29 3b 0a 69 6e  r(char* ptr);.in
0840: 74 20 54 63 6c 72 65 61 64 6c 69 6e 65 5f 53 61  t Tclreadline_Sa
0850: 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
0860: 70 2a 20 69 6e 74 65 72 70 29 3b 0a 69 6e 74 20  p* interp);.int 
0870: 54 63 6c 72 65 61 64 6c 69 6e 65 5f 49 6e 69 74  Tclreadline_Init
0880: 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74  (Tcl_Interp* int
0890: 65 72 70 29 3b 0a 63 68 61 72 2a 20 54 63 6c 52  erp);.char* TclR
08a0: 65 61 64 6c 69 6e 65 49 6e 69 74 69 61 6c 69 7a  eadlineInitializ
08b0: 65 28 63 68 61 72 2a 20 68 69 73 74 6f 72 79 66  e(char* historyf
08c0: 69 6c 65 29 3b 0a 69 6e 74 20 62 6c 61 6e 6b 5f  ile);.int blank_
08d0: 6c 69 6e 65 28 63 68 61 72 2a 20 73 74 72 29 3b  line(char* str);
08e0: 0a 63 68 61 72 2a 2a 20 54 63 6c 52 65 61 64 6c  .char** TclReadl
08f0: 69 6e 65 43 6f 6d 70 6c 65 74 69 6f 6e 28 63 68  ineCompletion(ch
0900: 61 72 2a 20 74 65 78 74 2c 20 69 6e 74 20 73 74  ar* text, int st
0910: 61 72 74 2c 20 69 6e 74 20 65 6e 64 29 3b 0a 63  art, int end);.c
0920: 68 61 72 2a 20 54 63 6c 52 65 61 64 6c 69 6e 65  har* TclReadline
0930: 30 67 65 6e 65 72 61 74 6f 72 28 63 68 61 72 2a  0generator(char*
0940: 20 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65   text, int state
0950: 29 3b 0a 63 68 61 72 2a 20 54 63 6c 52 65 61 64  );.char* TclRead
0960: 6c 69 6e 65 4b 6e 6f 77 6e 43 6f 6d 6d 61 6e 64  lineKnownCommand
0970: 73 28 63 68 61 72 2a 20 74 65 78 74 2c 20 69 6e  s(char* text, in
0980: 74 20 73 74 61 74 65 2c 20 69 6e 74 20 6d 6f 64  t state, int mod
0990: 65 29 3b 0a 69 6e 74 20 54 63 6c 52 65 61 64 6c  e);.int TclReadl
09a0: 69 6e 65 50 61 72 73 65 28 63 68 61 72 2a 2a 20  ineParse(char** 
09b0: 61 72 67 73 2c 20 69 6e 74 20 6d 61 78 61 72 67  args, int maxarg
09c0: 73 2c 20 63 68 61 72 2a 20 62 75 66 29 3b 0a 0a  s, char* buf);..
09d0: 65 6e 75 6d 20 7b 20 0a 20 20 20 20 4c 49 4e 45  enum { .    LINE
09e0: 5f 50 45 4e 44 49 4e 47 2c 0a 20 20 20 20 4c 49  _PENDING,.    LI
09f0: 4e 45 5f 45 4f 46 2c 0a 20 20 20 20 4c 49 4e 45  NE_EOF,.    LINE
0a00: 5f 43 4f 4d 50 4c 45 54 45 0a 7d 3b 0a 0a 2f 2a  _COMPLETE.};../*
0a10: 2a 0a 20 2a 20 67 6c 6f 62 61 6c 20 76 61 72 69  *. * global vari
0a20: 61 62 6c 65 73 0a 20 2a 2f 0a 73 74 61 74 69 63  ables. */.static
0a30: 20 69 6e 74 20 74 63 6c 72 6c 5f 6c 69 6e 65 5f   int tclrl_line_
0a40: 63 6f 6d 70 6c 65 74 65 20 3d 20 4c 49 4e 45 5f  complete = LINE_
0a50: 50 45 4e 44 49 4e 47 3b 0a 73 74 61 74 69 63 20  PENDING;.static 
0a60: 69 6e 74 20 74 63 6c 72 6c 5f 73 74 61 74 65 20  int tclrl_state 
0a70: 3d 20 54 43 4c 5f 4f 4b 3b 0a 73 74 61 74 69 63  = TCL_OK;.static
0a80: 20 63 68 61 72 2a 20 74 63 6c 72 6c 5f 65 6f 66   char* tclrl_eof
0a90: 5f 73 74 72 69 6e 67 20 3d 20 28 63 68 61 72 2a  _string = (char*
0aa0: 29 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 63  ) NULL;.static c
0ab0: 68 61 72 2a 20 74 63 6c 72 6c 5f 6c 69 6e 65 20  har* tclrl_line 
0ac0: 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 3b 0a  = (char*) NULL;.
0ad0: 73 74 61 74 69 63 20 63 68 61 72 2a 20 74 63 6c  static char* tcl
0ae0: 72 6c 5f 63 75 73 74 6f 6d 5f 63 6f 6d 70 6c 65  rl_custom_comple
0af0: 74 65 72 20 3d 20 28 63 68 61 72 2a 29 20 4e 55  ter = (char*) NU
0b00: 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74  LL;.static int t
0b10: 63 6c 72 6c 5f 75 73 65 5f 62 75 69 6c 74 69 6e  clrl_use_builtin
0b20: 5f 63 6f 6d 70 6c 65 74 65 72 20 3d 20 31 3b 0a  _completer = 1;.
0b30: 54 63 6c 5f 49 6e 74 65 72 70 2a 20 74 63 6c 72  Tcl_Interp* tclr
0b40: 6c 5f 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f  l_interp = (Tcl_
0b50: 49 6e 74 65 72 70 2a 29 20 4e 55 4c 4c 3b 0a 0a  Interp*) NULL;..
0b60: 0a 63 68 61 72 2a 0a 73 74 72 69 70 6c 65 66 74  .char*.stripleft
0b70: 28 63 68 61 72 2a 20 69 6e 29 0a 7b 0a 20 20 20  (char* in).{.   
0b80: 20 63 68 61 72 2a 20 70 74 72 20 3d 20 69 6e 3b   char* ptr = in;
0b90: 0a 20 20 20 20 77 68 69 6c 65 20 28 2a 70 74 72  .    while (*ptr
0ba0: 20 26 26 20 2a 70 74 72 20 3c 3d 20 27 20 27 29   && *ptr <= ' ')
0bb0: 0a 20 20 20 20 20 20 20 20 70 74 72 2b 2b 3b 0a  .        ptr++;.
0bc0: 20 20 20 20 69 66 20 28 69 6e 20 21 3d 20 70 74      if (in != pt
0bd0: 72 29 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  r).        memmo
0be0: 76 65 28 69 6e 2c 20 70 74 72 2c 20 73 74 72 6c  ve(in, ptr, strl
0bf0: 65 6e 28 70 74 72 29 20 2b 20 31 29 3b 0a 20 20  en(ptr) + 1);.  
0c00: 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a    return in;.}..
0c10: 63 68 61 72 2a 0a 73 74 72 69 70 72 69 67 68 74  char*.stripright
0c20: 28 63 68 61 72 2a 20 69 6e 29 0a 7b 0a 20 20 20  (char* in).{.   
0c30: 20 63 68 61 72 2a 20 70 74 72 3b 0a 20 20 20 20   char* ptr;.    
0c40: 66 6f 72 20 28 70 74 72 20 3d 20 73 74 72 63 68  for (ptr = strch
0c50: 72 28 69 6e 2c 20 27 5c 30 27 29 20 2d 20 31 3b  r(in, '\0') - 1;
0c60: 20 70 74 72 20 3e 3d 20 69 6e 20 26 26 20 2a 70   ptr >= in && *p
0c70: 74 72 20 3c 3d 20 27 20 27 3b 20 70 74 72 2d 2d  tr <= ' '; ptr--
0c80: 29 0a 20 20 20 20 20 20 20 20 2a 70 74 72 20 3d  ).        *ptr =
0c90: 20 27 5c 30 27 3b 0a 20 20 20 20 72 65 74 75 72   '\0';.    retur
0ca0: 6e 20 69 6e 3b 0a 7d 0a 0a 63 68 61 72 2a 0a 73  n in;.}..char*.s
0cb0: 74 72 69 70 77 68 69 74 65 28 63 68 61 72 2a 20  tripwhite(char* 
0cc0: 69 6e 29 0a 7b 0a 20 20 20 20 73 74 72 69 70 6c  in).{.    stripl
0cd0: 65 66 74 28 69 6e 29 3b 0a 20 20 20 20 73 74 72  eft(in);.    str
0ce0: 69 70 72 69 67 68 74 28 69 6e 29 3b 0a 20 20 20  ipright(in);.   
0cf0: 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 63   return in;.}..c
0d00: 68 61 72 2a 0a 54 63 6c 52 65 61 64 6c 69 6e 65  har*.TclReadline
0d10: 51 75 6f 74 65 28 63 68 61 72 2a 20 74 65 78 74  Quote(char* text
0d20: 2c 20 63 68 61 72 2a 20 71 75 6f 74 65 63 68 61  , char* quotecha
0d30: 72 73 29 0a 7b 0a 20 20 20 20 63 68 61 72 2a 20  rs).{.    char* 
0d40: 70 74 72 3b 0a 20 20 20 20 63 68 61 72 2a 20 72  ptr;.    char* r
0d50: 65 73 75 6c 74 5f 63 3b 0a 20 20 20 20 69 6e 74  esult_c;.    int
0d60: 20 69 2c 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e   i, len = strlen
0d70: 28 71 75 6f 74 65 63 68 61 72 73 29 3b 0a 20 20  (quotechars);.  
0d80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 72 65    Tcl_DString re
0d90: 73 75 6c 74 3b 0a 0a 20 20 20 20 54 63 6c 5f 44  sult;..    Tcl_D
0da0: 53 74 72 69 6e 67 49 6e 69 74 28 26 72 65 73 75  StringInit(&resu
0db0: 6c 74 29 3b 0a 20 20 20 20 66 6f 72 20 28 70 74  lt);.    for (pt
0dc0: 72 20 3d 20 74 65 78 74 3b 20 70 74 72 20 26 26  r = text; ptr &&
0dd0: 20 2a 70 74 72 3b 20 70 74 72 2b 2b 29 20 7b 0a   *ptr; ptr++) {.
0de0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 20 3d          for (i =
0df0: 20 30 3b 20 69 20 3c 20 6c 65 6e 3b 20 69 2b 2b   0; i < len; i++
0e00: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0e10: 69 66 20 28 71 75 6f 74 65 63 68 61 72 73 5b 69  if (quotechars[i
0e20: 5d 20 3d 3d 20 2a 70 74 72 29 20 7b 0a 20 20 20  ] == *ptr) {.   
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
0e40: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
0e50: 72 65 73 75 6c 74 2c 20 22 5c 5c 22 2c 20 31 29  result, "\\", 1)
0e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0e70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
0e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
0e90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74  .        Tcl_DSt
0ea0: 72 69 6e 67 41 70 70 65 6e 64 28 26 72 65 73 75  ringAppend(&resu
0eb0: 6c 74 2c 20 70 74 72 2c 20 31 29 3b 0a 20 20 20  lt, ptr, 1);.   
0ec0: 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 5f 63 20   }.    result_c 
0ed0: 3d 20 73 74 72 64 75 70 28 54 63 6c 5f 44 53 74  = strdup(Tcl_DSt
0ee0: 72 69 6e 67 56 61 6c 75 65 28 26 72 65 73 75 6c  ringValue(&resul
0ef0: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t));.    return 
0f00: 72 65 73 75 6c 74 5f 63 3b 0a 7d 0a 0a 69 6e 74  result_c;.}..int
0f10: 0a 54 63 6c 52 65 61 64 6c 69 6e 65 43 6d 64 28  .TclReadlineCmd(
0f20: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
0f30: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
0f40: 4d 61 69 6e 20 77 69 6e 64 6f 77 20 61 73 73 6f  Main window asso
0f50: 63 69 61 74 65 64 20 77 69 74 68 20 69 6e 74 65  ciated with inte
0f60: 72 70 72 65 74 65 72 20 20 2a 2f 0a 20 20 20 20  rpreter  */.    
0f70: 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65  Tcl_Interp* inte
0f80: 72 70 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65  rp,     /* Curre
0f90: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 20  nt interpreter  
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 20      */.    int  
0fc0: 20 20 20 20 20 20 20 61 72 67 63 2c 20 20 20 20         argc,    
0fd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0fe0: 61 72 67 75 6d 65 6e 74 73 20 20 20 20 20 20 20  arguments       
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1000: 2f 0a 20 20 20 20 63 68 61 72 2a 2a 20 20 20 20  /.    char**    
1010: 20 20 61 72 67 76 20 20 20 20 20 20 20 20 2f 2a    argv        /*
1020: 20 41 72 67 75 6d 65 6e 74 20 73 74 72 69 6e 67   Argument string
1030: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1040: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 29 0a 7b            */.).{
1050: 0a 20 20 20 20 69 6e 74 09 09 63 2c 20 6c 65 6e  .    int..c, len
1060: 67 74 68 3b 0a 20 20 20 20 0a 20 20 20 20 69 66  gth;.    .    if
1070: 20 28 61 72 67 63 20 3c 20 32 29 0a 20 20 20 20   (argc < 2).    
1080: 20 20 20 20 67 6f 74 6f 20 42 41 44 5f 43 4f 4d      goto BAD_COM
1090: 4d 41 4e 44 3b 0a 0a 20 20 20 20 63 20 3d 20 61  MAND;..    c = a
10a0: 72 67 76 5b 31 5d 5b 30 5d 3b 0a 20 20 20 20 6c  rgv[1][0];.    l
10b0: 65 6e 67 74 68 20 3d 20 73 74 72 6c 65 6e 28 61  ength = strlen(a
10c0: 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 20 20 69 66  rgv[1]);..    if
10d0: 20 28 63 20 3d 3d 20 27 72 27 20 20 26 26 20 73   (c == 'r'  && s
10e0: 74 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20  trncmp(argv[1], 
10f0: 22 72 65 61 64 22 2c 20 6c 65 6e 67 74 68 29 20  "read", length) 
1100: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
1110: 0a 20 20 20 20 20 20 20 20 63 68 61 72 2a 20 65  .        char* e
1120: 78 70 61 6e 73 69 6f 6e 20 3d 20 28 63 68 61 72  xpansion = (char
1130: 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20  *) NULL;.       
1140: 20 69 6e 74 20 73 74 61 74 75 73 3b 0a 20 20 20   int status;.   
1150: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 74 63       .        tc
1160: 6c 72 6c 5f 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  lrl_line_complet
1170: 65 20 3d 20 4c 49 4e 45 5f 50 45 4e 44 49 4e 47  e = LINE_PENDING
1180: 3b 0a 20 20 20 20 20 20 20 20 74 63 6c 72 6c 5f  ;.        tclrl_
1190: 73 74 61 74 65 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  state = TCL_OK;.
11a0: 20 20 20 20 20 20 20 20 72 6c 5f 63 61 6c 6c 62          rl_callb
11b0: 61 63 6b 5f 68 61 6e 64 6c 65 72 5f 69 6e 73 74  ack_handler_inst
11c0: 61 6c 6c 28 61 72 67 63 20 3d 3d 20 33 20 3f 20  all(argc == 3 ? 
11d0: 61 72 67 76 5b 32 5d 20 3a 20 22 25 22 2c 0a 20  argv[2] : "%",. 
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
11f0: 63 6c 52 65 61 64 6c 69 6e 65 4c 69 6e 65 43 6f  clReadlineLineCo
1200: 6d 70 6c 65 74 65 48 61 6e 64 6c 65 72 29 3b 0a  mpleteHandler);.
1210: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 43 72 65  .        Tcl_Cre
1220: 61 74 65 46 69 6c 65 48 61 6e 64 6c 65 72 28 30  ateFileHandler(0
1230: 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 0a  , TCL_READABLE,.
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 54 63 6c 52 65 61 64 6c 69 6e 65 44 61 74 61 41  TclReadlineDataA
1260: 76 61 69 6c 61 62 6c 65 48 61 6e 64 6c 65 72 2c  vailableHandler,
1270: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
1280: 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 20 20 77 68  LL);..        wh
1290: 69 6c 65 20 28 4c 49 4e 45 5f 50 45 4e 44 49 4e  ile (LINE_PENDIN
12a0: 47 20 3d 3d 20 74 63 6c 72 6c 5f 6c 69 6e 65 5f  G == tclrl_line_
12b0: 63 6f 6d 70 6c 65 74 65 20 26 26 20 54 43 4c 5f  complete && TCL_
12c0: 4f 4b 20 3d 3d 20 74 63 6c 72 6c 5f 73 74 61 74  OK == tclrl_stat
12d0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
12e0: 20 54 63 6c 5f 44 6f 4f 6e 65 45 76 65 6e 74 28   Tcl_DoOneEvent(
12f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  0);.        }.. 
1300: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 6c 65 74         Tcl_Delet
1310: 65 46 69 6c 65 48 61 6e 64 6c 65 72 28 30 29 3b  eFileHandler(0);
1320: 0a 0a 09 69 66 20 28 28 4c 49 4e 45 5f 45 4f 46  ...if ((LINE_EOF
1330: 20 3d 3d 20 74 63 6c 72 6c 5f 6c 69 6e 65 5f 63   == tclrl_line_c
1340: 6f 6d 70 6c 65 74 65 29 20 26 26 20 74 63 6c 72  omplete) && tclr
1350: 6c 5f 65 6f 66 5f 73 74 72 69 6e 67 29 20 7b 0a  l_eof_string) {.
1360: 09 20 20 20 20 54 63 6c 5f 45 76 61 6c 28 69 6e  .    Tcl_Eval(in
1370: 74 65 72 70 2c 20 74 63 6c 72 6c 5f 65 6f 66 5f  terp, tclrl_eof_
1380: 73 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  string);.       
1390: 20 20 20 20 20 72 65 74 75 72 6e 20 74 63 6c 72       return tclr
13a0: 6c 5f 73 74 61 74 65 3b 0a 09 7d 0a 0a 20 20 20  l_state;..}..   
13b0: 20 20 20 20 20 73 74 61 74 75 73 20 3d 20 68 69       status = hi
13c0: 73 74 6f 72 79 5f 65 78 70 61 6e 64 28 74 63 6c  story_expand(tcl
13d0: 72 6c 5f 6c 69 6e 65 2c 20 26 65 78 70 61 6e 73  rl_line, &expans
13e0: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ion);.        if
13f0: 20 28 73 74 61 74 75 73 20 3d 3d 20 31 29 0a 20   (status == 1). 
1400: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
1410: 66 28 22 25 73 5c 6e 22 2c 20 65 78 70 61 6e 73  f("%s\n", expans
1420: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 65 6c  ion);.        el
1430: 73 65 20 69 66 20 28 73 74 61 74 75 73 20 3d 3d  se if (status ==
1440: 20 2d 31 29 0a 20 20 20 20 20 20 20 20 20 20 20   -1).           
1450: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1460: 74 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  t(interp, "error
1470: 20 69 6e 20 68 69 73 74 6f 72 79 20 65 78 70 61   in history expa
1480: 6e 73 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 20  nsion\n",.      
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
14a0: 68 61 72 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  har*) NULL);.   
14b0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
14c0: 20 28 65 78 70 61 6e 73 69 6f 6e 20 26 26 20 2a   (expansion && *
14d0: 65 78 70 61 6e 73 69 6f 6e 29 0a 20 20 20 20 20  expansion).     
14e0: 20 20 20 20 20 20 20 61 64 64 5f 68 69 73 74 6f         add_histo
14f0: 72 79 28 65 78 70 61 6e 73 69 6f 6e 29 3b 0a 0a  ry(expansion);..
1500: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
1510: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1520: 20 65 78 70 61 6e 73 69 6f 6e 2c 20 28 63 68 61   expansion, (cha
1530: 72 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  r*) NULL);..    
1540: 20 20 20 20 46 52 45 45 28 74 63 6c 72 6c 5f 6c      FREE(tclrl_l
1550: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 46 52  ine);.        FR
1560: 45 45 28 65 78 70 61 6e 73 69 6f 6e 29 3b 0a 20  EE(expansion);. 
1570: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 63         return tc
1580: 6c 72 6c 5f 73 74 61 74 65 3b 0a 20 20 20 20 7d  lrl_state;.    }
1590: 20 65 6c 73 65 20 69 66 20 28 63 20 3d 3d 20 27   else if (c == '
15a0: 69 27 20 20 26 26 20 73 74 72 6e 63 6d 70 28 61  i'  && strncmp(a
15b0: 72 67 76 5b 31 5d 2c 20 22 69 6e 69 74 69 61 6c  rgv[1], "initial
15c0: 69 7a 65 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d  ize", length) ==
15d0: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66   0) {.        if
15e0: 20 28 33 20 21 3d 20 61 72 67 63 29 0a 20 20 20   (3 != argc).   
15f0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 42 41           goto BA
1600: 44 5f 43 4f 4d 4d 41 4e 44 3b 0a 20 20 20 20 20  D_COMMAND;.     
1610: 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20     else.        
1620: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1630: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1640: 52 65 61 64 6c 69 6e 65 49 6e 69 74 69 61 6c 69  ReadlineInitiali
1650: 7a 65 28 61 72 67 76 5b 32 5d 29 2c 0a 20 20 20  ze(argv[2]),.   
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 3b 0a   (char*) NULL);.
1680: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
1690: 20 3d 3d 20 27 77 27 20 20 26 26 20 73 74 72 6e   == 'w'  && strn
16a0: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 77 72  cmp(argv[1], "wr
16b0: 69 74 65 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d  ite", length) ==
16c0: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66   0) {.        if
16d0: 20 28 33 20 21 3d 20 61 72 67 63 29 0a 20 20 20   (3 != argc).   
16e0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 42 41           goto BA
16f0: 44 5f 43 4f 4d 4d 41 4e 44 3b 0a 20 20 20 20 20  D_COMMAND;.     
1700: 20 20 20 65 6c 73 65 20 69 66 20 28 77 72 69 74     else if (writ
1710: 65 5f 68 69 73 74 6f 72 79 28 61 72 67 76 5b 32  e_history(argv[2
1720: 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ])).            
1730: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1740: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
1750: 20 74 6f 20 77 72 69 74 65 20 68 69 73 74 6f 72   to write histor
1760: 79 20 74 6f 20 5c 22 22 2c 0a 20 20 20 20 20 20  y to \"",.      
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72                ar
1780: 67 76 5b 32 5d 2c 20 22 5c 22 5c 6e 22 2c 20 28  gv[2], "\"\n", (
1790: 63 68 61 72 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  char*) NULL);.  
17a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 20 3d    } else if (c =
17b0: 3d 20 27 61 27 20 20 26 26 20 73 74 72 6e 63 6d  = 'a'  && strncm
17c0: 70 28 61 72 67 76 5b 31 5d 2c 20 22 61 64 64 22  p(argv[1], "add"
17d0: 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 20  , length) == 0) 
17e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 33 20  {.        if (3 
17f0: 21 3d 20 61 72 67 63 29 0a 20 20 20 20 20 20 20  != argc).       
1800: 20 20 20 20 20 67 6f 74 6f 20 42 41 44 5f 43 4f       goto BAD_CO
1810: 4d 4d 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 65  MMAND;.        e
1820: 6c 73 65 20 69 66 20 28 54 63 6c 52 65 61 64 6c  lse if (TclReadl
1830: 69 6e 65 4b 6e 6f 77 6e 43 6f 6d 6d 61 6e 64 73  ineKnownCommands
1840: 28 61 72 67 76 5b 32 5d 2c 20 28 69 6e 74 29 20  (argv[2], (int) 
1850: 30 2c 20 5f 43 4d 44 5f 53 45 54 29 29 0a 20 20  0, _CMD_SET)).  
1860: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
1870: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1880: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 61 64  p, "unable to ad
1890: 64 20 63 6f 6d 6d 61 6e 64 20 5c 22 22 2c 0a 20  d command \"",. 
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 61 72 67 76 5b 32 5d 2c 20 22 5c 22 5c     argv[2], "\"\
18c0: 6e 22 2c 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c  n", (char*) NULL
18d0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
18e0: 20 28 63 20 3d 3d 20 27 63 27 20 20 26 26 20 73   (c == 'c'  && s
18f0: 74 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20  trncmp(argv[1], 
1900: 22 63 6f 6d 70 6c 65 74 65 22 2c 20 6c 65 6e 67  "complete", leng
1910: 74 68 29 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  th) == 0) {.    
1920: 20 20 20 20 69 66 20 28 33 20 21 3d 20 61 72 67      if (3 != arg
1930: 63 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  c).            g
1940: 6f 74 6f 20 42 41 44 5f 43 4f 4d 4d 41 4e 44 3b  oto BAD_COMMAND;
1950: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
1960: 20 28 54 63 6c 5f 43 6f 6d 6d 61 6e 64 43 6f 6d   (Tcl_CommandCom
1970: 70 6c 65 74 65 28 61 72 67 76 5b 32 5d 29 29 0a  plete(argv[2])).
1980: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
1990: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19a0: 65 72 70 2c 20 22 31 22 2c 20 28 63 68 61 72 2a  erp, "1", (char*
19b0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  ) NULL);.       
19c0: 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20   else.          
19d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 30 22 2c 20  lt(interp, "0", 
19f0: 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 3b 0a 20  (char*) NULL);. 
1a00: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 20     } else if (c 
1a10: 3d 3d 20 27 63 27 20 20 26 26 20 73 74 72 6e 63  == 'c'  && strnc
1a20: 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 63 75 73  mp(argv[1], "cus
1a30: 74 6f 6d 63 6f 6d 70 6c 65 74 65 72 22 2c 20 6c  tomcompleter", l
1a40: 65 6e 67 74 68 29 20 3d 3d 20 30 29 20 7b 0a 20  ength) == 0) {. 
1a50: 20 20 20 20 20 20 20 69 66 20 28 33 20 21 3d 20         if (3 != 
1a60: 61 72 67 63 20 26 26 20 32 20 21 3d 20 61 72 67  argc && 2 != arg
1a70: 63 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  c).            g
1a80: 6f 74 6f 20 42 41 44 5f 43 4f 4d 4d 41 4e 44 3b  oto BAD_COMMAND;
1a90: 0a 20 20 20 20 20 20 20 20 69 66 20 28 33 20 3d  .        if (3 =
1aa0: 3d 20 61 72 67 63 29 20 7b 0a 20 20 20 20 20 20  = argc) {.      
1ab0: 20 20 20 20 20 20 69 66 20 28 74 63 6c 72 6c 5f        if (tclrl_
1ac0: 63 75 73 74 6f 6d 5f 63 6f 6d 70 6c 65 74 65 72  custom_completer
1ad0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1ae0: 20 20 46 52 45 45 28 74 63 6c 72 6c 5f 63 75 73    FREE(tclrl_cus
1af0: 74 6f 6d 5f 63 6f 6d 70 6c 65 74 65 72 29 3b 0a  tom_completer);.
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1b10: 21 62 6c 61 6e 6b 5f 6c 69 6e 65 28 61 72 67 76  !blank_line(argv
1b20: 5b 32 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20  [2])).          
1b30: 20 20 20 20 20 20 74 63 6c 72 6c 5f 63 75 73 74        tclrl_cust
1b40: 6f 6d 5f 63 6f 6d 70 6c 65 74 65 72 20 3d 20 73  om_completer = s
1b50: 74 72 69 70 77 68 69 74 65 28 73 74 72 64 75 70  tripwhite(strdup
1b60: 28 61 72 67 76 5b 32 5d 29 29 3b 0a 20 20 20 20  (argv[2]));.    
1b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63      }.        Tc
1b80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 20 28  l_AppendResult (
1b90: 69 6e 74 65 72 70 2c 20 74 63 6c 72 6c 5f 63 75  interp, tclrl_cu
1ba0: 73 74 6f 6d 5f 63 6f 6d 70 6c 65 74 65 72 2c 20  stom_completer, 
1bb0: 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 3b 0a 20  (char*) NULL);. 
1bc0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 20     } else if (c 
1bd0: 3d 3d 20 27 62 27 20 20 26 26 20 73 74 72 6e 63  == 'b'  && strnc
1be0: 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 62 75 69  mp(argv[1], "bui
1bf0: 6c 74 69 6e 63 6f 6d 70 6c 65 74 65 72 22 2c 20  ltincompleter", 
1c00: 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 20 7b 0a  length) == 0) {.
1c10: 20 20 20 20 20 20 20 20 69 6e 74 20 62 6f 6f 6c          int bool
1c20: 20 3d 20 74 63 6c 72 6c 5f 75 73 65 5f 62 75 69   = tclrl_use_bui
1c30: 6c 74 69 6e 5f 63 6f 6d 70 6c 65 74 65 72 3b 0a  ltin_completer;.
1c40: 20 20 20 20 20 20 20 20 69 66 20 28 33 20 21 3d          if (3 !=
1c50: 20 61 72 67 63 20 26 26 20 32 20 21 3d 20 61 72   argc && 2 != ar
1c60: 67 63 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  gc).            
1c70: 67 6f 74 6f 20 42 41 44 5f 43 4f 4d 4d 41 4e 44  goto BAD_COMMAND
1c80: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 33 20  ;.        if (3 
1c90: 3d 3d 20 61 72 67 63 29 20 7b 0a 20 20 20 20 20  == argc) {.     
1ca0: 20 20 20 20 20 20 20 69 66 20 28 54 43 4c 5f 4f         if (TCL_O
1cb0: 4b 20 21 3d 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  K != Tcl_GetBool
1cc0: 65 61 6e 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ean(interp, argv
1cd0: 5b 32 5d 2c 20 26 62 6f 6f 6c 29 29 20 7b 0a 20  [2], &bool)) {. 
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1cf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d00: 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20  interp,.        
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 72 6f              "wro
1d20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d30: 64 20 62 65 20 61 20 62 6f 6f 6c 65 61 6e 20 76  d be a boolean v
1d40: 61 6c 75 65 2e 22 2c 20 28 63 68 61 72 2a 29 20  alue.", (char*) 
1d50: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
1d60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
1d70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
1d80: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 63                tc
1da0: 6c 72 6c 5f 75 73 65 5f 62 75 69 6c 74 69 6e 5f  lrl_use_builtin_
1db0: 63 6f 6d 70 6c 65 74 65 72 20 3d 20 62 6f 6f 6c  completer = bool
1dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1dd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1de0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1df0: 6c 74 28 69 6e 74 65 72 70 2c 20 74 63 6c 72 6c  lt(interp, tclrl
1e00: 5f 75 73 65 5f 62 75 69 6c 74 69 6e 5f 63 6f 6d  _use_builtin_com
1e10: 70 6c 65 74 65 72 20 3f 20 22 31 22 20 3a 20 22  pleter ? "1" : "
1e20: 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0",.            
1e30: 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 3b 0a 20  (char*) NULL);. 
1e40: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 20     } else if (c 
1e50: 3d 3d 20 27 65 27 20 20 26 26 20 73 74 72 6e 63  == 'e'  && strnc
1e60: 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 65 6f 66  mp(argv[1], "eof
1e70: 63 68 61 72 22 2c 20 6c 65 6e 67 74 68 29 20 3d  char", length) =
1e80: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69  = 0) {.        i
1e90: 66 20 28 33 20 21 3d 20 61 72 67 63 20 26 26 20  f (3 != argc && 
1ea0: 32 20 21 3d 20 61 72 67 63 29 0a 20 20 20 20 20  2 != argc).     
1eb0: 20 20 20 20 20 20 20 67 6f 74 6f 20 42 41 44 5f         goto BAD_
1ec0: 43 4f 4d 4d 41 4e 44 3b 0a 20 20 20 20 20 20 20  COMMAND;.       
1ed0: 20 69 66 20 28 33 20 3d 3d 20 61 72 67 63 29 20   if (3 == argc) 
1ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1ef0: 20 28 74 63 6c 72 6c 5f 65 6f 66 5f 73 74 72 69   (tclrl_eof_stri
1f00: 6e 67 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng).            
1f10: 20 20 20 20 46 52 45 45 28 74 63 6c 72 6c 5f 65      FREE(tclrl_e
1f20: 6f 66 5f 73 74 72 69 6e 67 29 3b 0a 20 20 20 20  of_string);.    
1f30: 20 20 20 20 20 20 20 20 69 66 20 28 21 62 6c 61          if (!bla
1f40: 6e 6b 5f 6c 69 6e 65 28 61 72 67 76 5b 32 5d 29  nk_line(argv[2])
1f50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1f60: 20 20 74 63 6c 72 6c 5f 65 6f 66 5f 73 74 72 69    tclrl_eof_stri
1f70: 6e 67 20 3d 20 73 74 72 69 70 77 68 69 74 65 28  ng = stripwhite(
1f80: 73 74 72 64 75 70 28 61 72 67 76 5b 32 5d 29 29  strdup(argv[2]))
1f90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fa0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1fb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 74 63 6c  sult(interp, tcl
1fc0: 72 6c 5f 65 6f 66 5f 73 74 72 69 6e 67 2c 20 28  rl_eof_string, (
1fd0: 63 68 61 72 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  char*) NULL);.  
1fe0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1ff0: 20 20 20 67 6f 74 6f 20 42 41 44 5f 43 4f 4d 4d     goto BAD_COMM
2000: 41 4e 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  AND;.    }..    
2010: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
2020: 42 41 44 5f 43 4f 4d 4d 41 4e 44 3a 0a 20 20 20  BAD_COMMAND:.   
2030: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2040: 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20  t(interp,.      
2050: 20 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a    "wrong # args:
2060: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 72 65 61   should be \"rea
2070: 64 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 3f 61 72  dline option ?ar
2080: 67 20 2e 2e 2e 3f 5c 22 22 2c 0a 20 20 20 20 20  g ...?\"",.     
2090: 20 20 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29     (char*) NULL)
20a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20b0: 5f 45 52 52 4f 52 3b 0a 0a 7d 0a 0a 76 6f 69 64  _ERROR;..}..void
20c0: 0a 54 63 6c 52 65 61 64 6c 69 6e 65 44 61 74 61  .TclReadlineData
20d0: 41 76 61 69 6c 61 62 6c 65 48 61 6e 64 6c 65 72  AvailableHandler
20e0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
20f0: 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 61 73 6b  ntData, int mask
2100: 29 0a 7b 0a 23 69 66 20 30 0a 20 20 20 20 66 70  ).{.#if 0.    fp
2110: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 28  rintf(stderr, "(
2120: 54 63 6c 52 65 61 64 6c 69 6e 65 44 61 74 61 41  TclReadlineDataA
2130: 76 61 69 6c 61 62 6c 65 48 61 6e 64 6c 65 72 29  vailableHandler)
2140: 20 6d 61 73 6b 20 3d 20 25 64 5c 6e 22 2c 20 20   mask = %d\n",  
2150: 6d 61 73 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  mask);.#endif.  
2160: 20 20 69 66 20 28 6d 61 73 6b 20 26 20 54 43 4c    if (mask & TCL
2170: 5f 52 45 41 44 41 42 4c 45 29 20 7b 0a 20 20 20  _READABLE) {.   
2180: 20 20 20 20 20 77 68 69 6c 65 20 28 30 20 3d 3d       while (0 ==
2190: 20 72 6c 5f 64 6f 6e 65 29 0a 20 20 20 20 20 20   rl_done).      
21a0: 20 20 20 20 20 20 72 6c 5f 63 61 6c 6c 62 61 63        rl_callbac
21b0: 6b 5f 72 65 61 64 5f 63 68 61 72 28 29 3b 0a 20  k_read_char();. 
21c0: 20 20 20 7d 0a 7d 0a 0a 76 6f 69 64 0a 54 63 6c     }.}..void.Tcl
21d0: 52 65 61 64 6c 69 6e 65 4c 69 6e 65 43 6f 6d 70  ReadlineLineComp
21e0: 6c 65 74 65 48 61 6e 64 6c 65 72 28 63 68 61 72  leteHandler(char
21f0: 2a 20 70 74 72 29 0a 7b 0a 23 69 66 20 31 0a 20  * ptr).{.#if 1. 
2200: 20 20 20 69 66 20 28 21 70 74 72 29 20 7b 20 2f     if (!ptr) { /
2210: 2a 20 3c 63 2d 64 3e 20 2a 2f 0a 20 20 20 20 20  * <c-d> */.     
2220: 20 20 20 74 63 6c 72 6c 5f 6c 69 6e 65 5f 63 6f     tclrl_line_co
2230: 6d 70 6c 65 74 65 20 3d 20 4c 49 4e 45 5f 45 4f  mplete = LINE_EO
2240: 46 3b 0a 20 20 20 20 20 20 20 20 72 6c 5f 63 61  F;.        rl_ca
2250: 6c 6c 62 61 63 6b 5f 68 61 6e 64 6c 65 72 5f 72  llback_handler_r
2260: 65 6d 6f 76 65 28 29 3b 0a 20 20 20 20 7d 20 65  emove();.    } e
2270: 6c 73 65 20 69 66 20 28 2a 70 74 72 29 20 7b 0a  lse if (*ptr) {.
2280: 20 20 20 20 20 20 20 20 74 63 6c 72 6c 5f 6c 69          tclrl_li
2290: 6e 65 5f 63 6f 6d 70 6c 65 74 65 20 3d 20 4c 49  ne_complete = LI
22a0: 4e 45 5f 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20  NE_COMPLETE;.   
22b0: 20 20 20 20 20 72 6c 5f 63 61 6c 6c 62 61 63 6b       rl_callback
22c0: 5f 68 61 6e 64 6c 65 72 5f 72 65 6d 6f 76 65 28  _handler_remove(
22d0: 29 3b 0a 20 20 20 20 20 20 20 20 74 63 6c 72 6c  );.        tclrl
22e0: 5f 6c 69 6e 65 20 3d 20 70 74 72 3b 0a 20 20 20  _line = ptr;.   
22f0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 20   }.#else.    if 
2300: 28 70 74 72 20 26 26 20 2a 70 74 72 29 20 7b 0a  (ptr && *ptr) {.
2310: 20 20 20 20 20 20 20 20 74 63 6c 72 6c 5f 6c 69          tclrl_li
2320: 6e 65 5f 63 6f 6d 70 6c 65 74 65 20 3d 20 31 3b  ne_complete = 1;
2330: 0a 20 20 20 20 20 20 20 20 72 6c 5f 63 61 6c 6c  .        rl_call
2340: 62 61 63 6b 5f 68 61 6e 64 6c 65 72 5f 72 65 6d  back_handler_rem
2350: 6f 76 65 20 28 29 3b 0a 20 20 20 20 20 20 20 20  ove ();.        
2360: 74 63 6c 72 6c 5f 6c 69 6e 65 20 3d 20 70 74 72  tclrl_line = ptr
2370: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ;.    }.#endif.}
2380: 0a 0a 69 6e 74 0a 54 63 6c 72 65 61 64 6c 69 6e  ..int.Tclreadlin
2390: 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
23a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 0a 7b  nterp *interp).{
23b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 72  .    return Tclr
23c0: 65 61 64 6c 69 6e 65 5f 49 6e 69 74 28 69 6e 74  eadline_Init(int
23d0: 65 72 70 29 3b 0a 7d 0a 0a 69 6e 74 0a 54 63 6c  erp);.}..int.Tcl
23e0: 72 65 61 64 6c 69 6e 65 5f 49 6e 69 74 28 54 63  readline_Init(Tc
23f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2400: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  ).{.    Tcl_Crea
2410: 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
2420: 2c 20 22 3a 3a 74 63 6c 72 65 61 64 6c 69 6e 65  , "::tclreadline
2430: 3a 3a 72 65 61 64 6c 69 6e 65 22 2c 20 54 63 6c  ::readline", Tcl
2440: 52 65 61 64 6c 69 6e 65 43 6d 64 2c 0a 09 20 20  ReadlineCmd,..  
2450: 20 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e    (ClientData) N
2460: 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
2470: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
2480: 3b 0a 20 20 20 20 74 63 6c 72 6c 5f 69 6e 74 65  ;.    tclrl_inte
2490: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
24a0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50   return Tcl_PkgP
24b0: 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
24c0: 74 63 6c 72 65 61 64 6c 69 6e 65 22 2c 20 54 43  tclreadline", TC
24d0: 4c 52 45 41 44 4c 49 4e 45 5f 56 45 52 53 49 4f  LREADLINE_VERSIO
24e0: 4e 29 3b 0a 7d 0a 0a 63 68 61 72 2a 0a 54 63 6c  N);.}..char*.Tcl
24f0: 52 65 61 64 6c 69 6e 65 49 6e 69 74 69 61 6c 69  ReadlineInitiali
2500: 7a 65 28 63 68 61 72 2a 20 68 69 73 74 6f 72 79  ze(char* history
2510: 66 69 6c 65 29 0a 7b 0a 20 20 20 20 72 6c 5f 72  file).{.    rl_r
2520: 65 61 64 6c 69 6e 65 5f 6e 61 6d 65 20 3d 20 22  eadline_name = "
2530: 74 63 6c 72 65 61 64 6c 69 6e 65 22 3b 0a 20 20  tclreadline";.  
2540: 20 20 2f 2a 20 72 6c 5f 73 70 65 63 69 61 6c 5f    /* rl_special_
2550: 70 72 65 66 69 78 65 73 20 3d 20 22 24 7b 5c 22  prefixes = "${\"
2560: 22 3b 20 2a 2f 0a 20 20 20 20 72 6c 5f 73 70 65  "; */.    rl_spe
2570: 63 69 61 6c 5f 70 72 65 66 69 78 65 73 20 3d 20  cial_prefixes = 
2580: 22 24 7b 22 3b 0a 20 20 20 20 2f 2a 2a 0a 20 20  "${";.    /**.  
2590: 20 20 20 2a 20 64 65 66 61 75 6c 74 20 69 73 20     * default is 
25a0: 22 20 5c 74 5c 6e 5c 22 5c 5c 27 60 40 24 3e 3c  " \t\n\"\\'`@$><
25b0: 3d 3b 7c 26 7b 28 22 0a 20 20 20 20 20 2a 20 72  =;|&{(".     * r
25c0: 65 6d 6f 76 65 64 20 22 7b 28 22 0a 20 20 20 20  emoved "{(".    
25d0: 20 2a 20 61 64 64 65 64 20 22 5b 5d 7d 22 0a 20   * added "[]}". 
25e0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 6c 5f 62 61      */.    rl_ba
25f0: 73 69 63 5f 77 6f 72 64 5f 62 72 65 61 6b 5f 63  sic_word_break_c
2600: 68 61 72 61 63 74 65 72 73 20 3d 20 22 20 5c 74  haracters = " \t
2610: 5c 6e 5c 22 5c 5c 27 60 40 24 3e 3c 3d 3b 7c 26  \n\"\\'`@$><=;|&
2620: 5b 5d 7d 22 3b 0a 20 20 20 20 2f 2a 20 72 6c 5f  []}";.    /* rl_
2630: 63 6f 6d 70 6c 65 74 65 72 5f 71 75 6f 74 65 5f  completer_quote_
2640: 63 68 61 72 61 63 74 65 72 73 20 3d 20 22 5c 22  characters = "\"
2650: 22 3b 20 2a 2f 0a 0a 20 20 20 20 75 73 69 6e 67  "; */..    using
2660: 5f 68 69 73 74 6f 72 79 28 29 3b 0a 20 20 20 20  _history();.    
2670: 69 66 20 28 21 74 63 6c 72 6c 5f 65 6f 66 5f 73  if (!tclrl_eof_s
2680: 74 72 69 6e 67 29 0a 20 20 20 20 20 20 20 20 74  tring).        t
2690: 63 6c 72 6c 5f 65 6f 66 5f 73 74 72 69 6e 67 20  clrl_eof_string 
26a0: 3d 20 73 74 72 64 75 70 28 22 70 75 74 73 20 7b  = strdup("puts {
26b0: 7d 3b 20 65 78 69 74 22 29 3b 0a 0a 20 20 20 20  }; exit");..    
26c0: 2f 2a 0a 20 20 20 20 20 2a 20 74 72 79 20 74 6f  /*.     * try to
26d0: 20 72 65 61 64 20 68 69 73 74 6f 72 79 66 69 6c   read historyfil
26e0: 65 20 69 6e 20 68 6f 6d 65 0a 20 20 20 20 20 2a  e in home.     *
26f0: 20 64 69 72 65 63 74 6f 72 79 2e 20 49 66 20 74   directory. If t
2700: 68 69 73 20 66 61 69 6c 65 73 2c 20 74 68 69 73  his failes, this
2710: 0a 20 20 20 20 20 2a 20 69 73 20 2a 6e 6f 74 2a  .     * is *not*
2720: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20   an error..     
2730: 2a 2f 0a 20 20 20 20 72 6c 5f 61 74 74 65 6d 70  */.    rl_attemp
2740: 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 66  ted_completion_f
2750: 75 6e 63 74 69 6f 6e 20 3d 20 28 43 50 50 46 75  unction = (CPPFu
2760: 6e 63 74 69 6f 6e 20 2a 29 20 54 63 6c 52 65 61  nction *) TclRea
2770: 64 6c 69 6e 65 43 6f 6d 70 6c 65 74 69 6f 6e 3b  dlineCompletion;
2780: 0a 20 20 20 20 69 66 20 28 72 65 61 64 5f 68 69  .    if (read_hi
2790: 73 74 6f 72 79 28 68 69 73 74 6f 72 79 66 69 6c  story(historyfil
27a0: 65 29 29 0a 20 20 20 20 20 20 20 20 72 65 74 75  e)).        retu
27b0: 72 6e 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65  rn "unable to re
27c0: 61 64 20 68 69 73 74 6f 72 79 20 66 69 6c 65 22  ad history file"
27d0: 3b 0a 20 20 20 20 0a 20 20 20 20 65 6c 73 65 0a  ;.    .    else.
27e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
27f0: 22 3b 0a 7d 0a 0a 69 6e 74 0a 62 6c 61 6e 6b 5f  ";.}..int.blank_
2800: 6c 69 6e 65 28 63 68 61 72 2a 20 73 74 72 29 0a  line(char* str).
2810: 7b 0a 20 20 20 20 63 68 61 72 2a 20 70 74 72 3b  {.    char* ptr;
2820: 0a 20 20 20 20 66 6f 72 20 28 70 74 72 20 3d 20  .    for (ptr = 
2830: 73 74 72 3b 20 70 74 72 20 26 26 20 2a 70 74 72  str; ptr && *ptr
2840: 3b 20 70 74 72 2b 2b 29 20 7b 0a 20 20 20 20 20  ; ptr++) {.     
2850: 20 20 20 69 66 20 28 21 49 53 57 48 49 54 45 28     if (!ISWHITE(
2860: 2a 70 74 72 29 29 0a 20 20 20 20 20 20 20 20 20  *ptr)).         
2870: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2880: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b   }.    return 1;
2890: 0a 7d 0a 0a 63 68 61 72 2a 2a 0a 54 63 6c 52 65  .}..char**.TclRe
28a0: 61 64 6c 69 6e 65 43 6f 6d 70 6c 65 74 69 6f 6e  adlineCompletion
28b0: 28 63 68 61 72 2a 20 74 65 78 74 2c 20 69 6e 74  (char* text, int
28c0: 20 73 74 61 72 74 2c 20 69 6e 74 20 65 6e 64 29   start, int end)
28d0: 0a 7b 0a 20 20 20 20 63 68 61 72 2a 2a 20 6d 61  .{.    char** ma
28e0: 74 63 68 65 73 20 3d 20 28 63 68 61 72 2a 2a 29  tches = (char**)
28f0: 20 4e 55 4c 4c 3b 0a 0a 23 69 66 20 30 0a 20 20   NULL;..#if 0.  
2900: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2910: 2c 20 22 44 45 42 55 47 3e 20 54 63 6c 52 65 61  , "DEBUG> TclRea
2920: 64 6c 69 6e 65 43 6f 6d 70 6c 65 74 69 6f 6e 3a  dlineCompletion:
2930: 20 74 65 78 74 3d 7c 25 73 7c 5c 6e 22 2c 20 74   text=|%s|\n", t
2940: 65 78 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ext);.    fprint
2950: 66 28 73 74 64 65 72 72 2c 20 22 44 45 42 55 47  f(stderr, "DEBUG
2960: 3e 20 54 63 6c 52 65 61 64 6c 69 6e 65 43 6f 6d  > TclReadlineCom
2970: 70 6c 65 74 69 6f 6e 3a 20 73 74 61 72 74 3d 7c  pletion: start=|
2980: 25 64 7c 5c 6e 22 2c 20 73 74 61 72 74 29 3b 0a  %d|\n", start);.
2990: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
29a0: 72 72 2c 20 22 44 45 42 55 47 3e 20 54 63 6c 52  rr, "DEBUG> TclR
29b0: 65 61 64 6c 69 6e 65 43 6f 6d 70 6c 65 74 69 6f  eadlineCompletio
29c0: 6e 3a 20 65 6e 64 3d 7c 25 64 7c 5c 6e 22 2c 20  n: end=|%d|\n", 
29d0: 65 6e 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  end);.#endif..  
29e0: 20 20 69 66 20 28 74 63 6c 72 6c 5f 63 75 73 74    if (tclrl_cust
29f0: 6f 6d 5f 63 6f 6d 70 6c 65 74 65 72 29 20 7b 0a  om_completer) {.
2a00: 20 20 20 20 20 20 20 20 63 68 61 72 20 73 74 61          char sta
2a10: 72 74 5f 73 5b 42 55 46 53 49 5a 5d 2c 20 65 6e  rt_s[BUFSIZ], en
2a20: 64 5f 73 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20  d_s[BUFSIZ];.   
2a30: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 2a 20 6f 62       Tcl_Obj* ob
2a40: 6a 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  j;.        Tcl_O
2a50: 62 6a 2a 2a 20 6f 62 6a 76 3b 0a 20 20 20 20 20  bj** objv;.     
2a60: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20     int objc;.   
2a70: 20 20 20 20 20 63 68 61 72 2a 20 71 75 6f 74 65       char* quote
2a80: 64 5f 74 65 78 74 20 3d 20 54 63 6c 52 65 61 64  d_text = TclRead
2a90: 6c 69 6e 65 51 75 6f 74 65 28 74 65 78 74 2c 20  lineQuote(text, 
2aa0: 22 24 5b 5d 7b 7d 5c 22 22 29 3b 0a 20 20 20 20  "$[]{}\"");.    
2ab0: 20 20 20 20 63 68 61 72 2a 20 71 75 6f 74 65 64      char* quoted
2ac0: 5f 72 6c 5f 6c 69 6e 65 5f 62 75 66 66 65 72 0a  _rl_line_buffer.
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 54 63              = Tc
2ae0: 6c 52 65 61 64 6c 69 6e 65 51 75 6f 74 65 28 72  lReadlineQuote(r
2af0: 6c 5f 6c 69 6e 65 5f 62 75 66 66 65 72 2c 20 22  l_line_buffer, "
2b00: 24 5b 5d 7b 7d 5c 22 22 29 3b 0a 20 20 20 20 20  $[]{}\"");.     
2b10: 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 66 70     /*.        fp
2b20: 72 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22  rintf (stderr, "
2b30: 28 54 63 6c 52 65 61 64 6c 69 6e 65 43 6f 6d 70  (TclReadlineComp
2b40: 6c 65 74 69 6f 6e 29 20 72 6c 5f 6c 69 6e 65 5f  letion) rl_line_
2b50: 62 75 66 66 65 72 20 3d 20 7c 25 73 7c 5c 6e 22  buffer = |%s|\n"
2b60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 6c  ,.            rl
2b70: 5f 6c 69 6e 65 5f 62 75 66 66 65 72 29 3b 0a 20  _line_buffer);. 
2b80: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 20 28         fprintf (
2b90: 73 74 64 65 72 72 2c 20 22 28 54 63 6c 52 65 61  stderr, "(TclRea
2ba0: 64 6c 69 6e 65 43 6f 6d 70 6c 65 74 69 6f 6e 29  dlineCompletion)
2bb0: 20 71 75 6f 74 65 64 5f 72 6c 5f 6c 69 6e 65 5f   quoted_rl_line_
2bc0: 62 75 66 66 65 72 20 3d 20 7c 25 73 7c 5c 6e 22  buffer = |%s|\n"
2bd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 71 75  ,.            qu
2be0: 6f 74 65 64 5f 72 6c 5f 6c 69 6e 65 5f 62 75 66  oted_rl_line_buf
2bf0: 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 70  fer);.        fp
2c00: 72 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22  rintf (stderr, "
2c10: 28 54 63 6c 52 65 61 64 6c 69 6e 65 43 6f 6d 70  (TclReadlineComp
2c20: 6c 65 74 69 6f 6e 29 20 74 65 78 74 20 3d 20 7c  letion) text = |
2c30: 25 73 7c 5c 6e 22 2c 20 74 65 78 74 29 3b 0a 20  %s|\n", text);. 
2c40: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 20 28         fprintf (
2c50: 73 74 64 65 72 72 2c 20 22 28 54 63 6c 52 65 61  stderr, "(TclRea
2c60: 64 6c 69 6e 65 43 6f 6d 70 6c 65 74 69 6f 6e 29  dlineCompletion)
2c70: 20 71 75 6f 74 65 64 5f 74 65 78 74 20 3d 20 7c   quoted_text = |
2c80: 25 73 7c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s|\n",.        
2c90: 20 20 20 20 71 75 6f 74 65 64 5f 74 65 78 74 29      quoted_text)
2ca0: 3b 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ;.        */.   
2cb0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 73 74 61       sprintf(sta
2cc0: 72 74 5f 73 2c 20 22 25 64 22 2c 20 73 74 61 72  rt_s, "%d", star
2cd0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69  t);.        spri
2ce0: 6e 74 66 28 65 6e 64 5f 73 2c 20 22 25 64 22 2c  ntf(end_s, "%d",
2cf0: 20 65 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 54   end);.        T
2d00: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 74  cl_ResetResult(t
2d10: 63 6c 72 6c 5f 69 6e 74 65 72 70 29 3b 20 2f 2a  clrl_interp); /*
2d20: 20 63 6c 65 61 72 20 72 65 73 75 6c 74 20 73 70   clear result sp
2d30: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  ace */.        t
2d40: 63 6c 72 6c 5f 73 74 61 74 65 20 3d 20 54 63 6c  clrl_state = Tcl
2d50: 5f 56 61 72 45 76 61 6c 28 74 63 6c 72 6c 5f 69  _VarEval(tclrl_i
2d60: 6e 74 65 72 70 2c 20 74 63 6c 72 6c 5f 63 75 73  nterp, tclrl_cus
2d70: 74 6f 6d 5f 63 6f 6d 70 6c 65 74 65 72 2c 0a 20  tom_completer,. 
2d80: 20 20 20 20 20 20 20 20 20 20 20 22 20 5c 22 22             " \""
2d90: 2c 20 71 75 6f 74 65 64 5f 74 65 78 74 2c 20 22  , quoted_text, "
2da0: 5c 22 20 22 2c 20 73 74 61 72 74 5f 73 2c 20 22  \" ", start_s, "
2db0: 20 22 2c 20 65 6e 64 5f 73 2c 0a 20 20 20 20 20   ", end_s,.     
2dc0: 20 20 20 20 20 20 20 22 20 5c 22 22 2c 20 71 75         " \"", qu
2dd0: 6f 74 65 64 5f 72 6c 5f 6c 69 6e 65 5f 62 75 66  oted_rl_line_buf
2de0: 66 65 72 2c 20 22 5c 22 22 2c 20 28 63 68 61 72  fer, "\"", (char
2df0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  *) NULL);.      
2e00: 20 20 46 52 45 45 28 71 75 6f 74 65 64 5f 74 65    FREE(quoted_te
2e10: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 46 52 45  xt);.        FRE
2e20: 45 28 71 75 6f 74 65 64 5f 72 6c 5f 6c 69 6e 65  E(quoted_rl_line
2e30: 5f 62 75 66 66 65 72 29 3b 0a 20 20 20 20 20 20  _buffer);.      
2e40: 20 20 69 66 20 28 54 43 4c 5f 4f 4b 20 21 3d 20    if (TCL_OK != 
2e50: 74 63 6c 72 6c 5f 73 74 61 74 65 29 20 7b 0a 20  tclrl_state) {. 
2e60: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
2e70: 74 66 20 28 73 74 64 65 72 72 2c 20 22 25 73 5c  tf (stderr, "%s\
2e80: 6e 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  n", Tcl_GetStrin
2e90: 67 52 65 73 75 6c 74 28 74 63 6c 72 6c 5f 69 6e  gResult(tclrl_in
2ea0: 74 65 72 70 29 29 3b 0a 20 20 20 20 20 20 20 20  terp));.        
2eb0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 20      /*.         
2ec0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2ed0: 75 6c 74 20 28 74 63 6c 72 6c 5f 69 6e 74 65 72  ult (tclrl_inter
2ee0: 70 2c 20 22 60 22 2c 20 74 63 6c 72 6c 5f 63 75  p, "`", tclrl_cu
2ef0: 73 74 6f 6d 5f 63 6f 6d 70 6c 65 74 65 72 2c 0a  stom_completer,.
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 22 20 7b 22 2c 20 74 65 78 74 2c 20 22 7d 20 22  " {", text, "} "
2f20: 2c 20 73 74 61 72 74 5f 73 2c 20 22 20 22 2c 20  , start_s, " ", 
2f30: 65 6e 64 5f 73 2c 0a 20 20 20 20 20 20 20 20 20  end_s,.         
2f40: 20 20 20 20 20 20 20 22 20 7b 22 2c 20 72 6c 5f         " {", rl_
2f50: 6c 69 6e 65 5f 62 75 66 66 65 72 2c 20 22 7d 27  line_buffer, "}'
2f60: 20 66 61 69 6c 65 64 2e 22 2c 20 28 63 68 61 72   failed.", (char
2f70: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  *) NULL);.      
2f80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f90: 20 20 20 20 20 72 65 74 75 72 6e 20 6d 61 74 63       return matc
2fa0: 68 65 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  hes;.        }. 
2fb0: 20 20 20 20 20 20 20 6f 62 6a 20 3d 20 54 63 6c         obj = Tcl
2fc0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 74 63  _GetObjResult(tc
2fd0: 6c 72 6c 5f 69 6e 74 65 72 70 29 3b 0a 20 20 20  lrl_interp);.   
2fe0: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
2ff0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 74 63 6c 72  GetElements(tclr
3000: 6c 5f 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 26  l_interp, obj, &
3010: 6f 62 6a 63 2c 20 26 6f 62 6a 76 29 3b 0a 20 20  objc, &objv);.  
3020: 20 20 20 20 20 20 2f 2a 20 66 70 72 69 6e 74 66        /* fprintf
3030: 20 28 73 74 64 65 72 72 2c 20 22 28 54 63 6c 52   (stderr, "(TclR
3040: 65 61 64 6c 69 6e 65 43 6f 6d 70 6c 65 74 69 6f  eadlineCompletio
3050: 6e 29 20 6f 62 6a 63 20 3d 20 25 64 5c 6e 22 2c  n) objc = %d\n",
3060: 20 6f 62 6a 63 29 3b 20 2a 2f 0a 20 20 20 20 20   objc); */.     
3070: 20 20 20 69 66 20 28 6f 62 6a 63 29 20 7b 0a 20     if (objc) {. 
3080: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
3090: 2c 20 6c 65 6e 67 74 68 20 2f 2a 20 6e 6f 74 20  , length /* not 
30a0: 75 73 65 64 20 2a 2f 3b 0a 20 20 20 20 20 20 20  used */;.       
30b0: 20 20 20 20 20 6d 61 74 63 68 65 73 20 3d 20 28       matches = (
30c0: 63 68 61 72 2a 2a 29 20 4d 41 4c 4c 4f 43 28 73  char**) MALLOC(s
30d0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28  izeof(char*) * (
30e0: 6f 62 6a 63 20 2b 20 31 29 29 3b 0a 20 20 20 20  objc + 1));.    
30f0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 20 3d          for (i =
3100: 20 30 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69 2b   0; i < objc; i+
3110: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
3120: 20 20 20 20 20 6d 61 74 63 68 65 73 5b 69 5d 20       matches[i] 
3130: 3d 20 73 74 72 64 75 70 28 54 63 6c 5f 47 65 74  = strdup(Tcl_Get
3140: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
3150: 6a 76 5b 69 5d 2c 20 26 6c 65 6e 67 74 68 29 29  jv[i], &length))
3160: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3170: 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 20 20 20    /*.           
3180: 20 20 20 20 20 66 70 72 69 6e 74 66 20 28 73 74       fprintf (st
3190: 64 65 72 72 2c 20 22 28 54 63 6c 52 65 61 64 6c  derr, "(TclReadl
31a0: 69 6e 65 43 6f 6d 70 6c 65 74 69 6f 6e 29 20 6d  ineCompletion) m
31b0: 61 74 63 68 65 73 5b 25 64 5d 20 3d 20 7c 25 73  atches[%d] = |%s
31c0: 7c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  |\n",.          
31d0: 20 20 20 20 20 20 20 20 20 20 69 2c 20 6d 61 74            i, mat
31e0: 63 68 65 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ches[i]);.      
31f0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
3200: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3210: 20 20 20 20 20 20 20 6d 61 74 63 68 65 73 5b 69         matches[i
3220: 5d 20 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c  ] = (char*) NULL
3230: 3b 20 2f 2a 20 74 65 72 6d 69 6e 61 74 65 20 2a  ; /* terminate *
3240: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
3250: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
3260: 75 6c 74 28 74 63 6c 72 6c 5f 69 6e 74 65 72 70  ult(tclrl_interp
3270: 29 3b 20 2f 2a 20 63 6c 65 61 72 20 72 65 73 75  ); /* clear resu
3280: 6c 74 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  lt space */.    
3290: 7d 0a 0a 20 20 20 20 69 66 20 28 21 6d 61 74 63  }..    if (!matc
32a0: 68 65 73 20 26 26 20 74 63 6c 72 6c 5f 75 73 65  hes && tclrl_use
32b0: 5f 62 75 69 6c 74 69 6e 5f 63 6f 6d 70 6c 65 74  _builtin_complet
32c0: 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20 6d 61  er) {.        ma
32d0: 74 63 68 65 73 20 3d 20 63 6f 6d 70 6c 65 74 69  tches = completi
32e0: 6f 6e 5f 6d 61 74 63 68 65 73 28 74 65 78 74 2c  on_matches(text,
32f0: 20 54 63 6c 52 65 61 64 6c 69 6e 65 30 67 65 6e   TclReadline0gen
3300: 65 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 23  erator);.    }.#
3310: 69 66 20 30 0a 20 20 20 20 7b 0a 20 20 20 20 20  if 0.    {.     
3320: 20 20 20 63 68 61 72 20 2a 2a 70 74 72 3b 0a 20     char **ptr;. 
3330: 20 20 20 20 20 20 20 66 6f 72 20 28 70 74 72 20         for (ptr 
3340: 3d 20 6d 61 74 63 68 65 73 3b 20 70 74 72 20 26  = matches; ptr &
3350: 26 20 2a 70 74 72 3b 20 70 74 72 2b 2b 29 0a 20  & *ptr; ptr++). 
3360: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
3370: 74 66 20 28 73 74 64 65 72 72 2c 20 22 28 54 63  tf (stderr, "(Tc
3380: 6c 52 65 61 64 6c 69 6e 65 43 6f 6d 70 6c 65 74  lReadlineComplet
3390: 69 6f 6e 29 20 7c 25 73 7c 5c 6e 22 2c 20 2a 70  ion) |%s|\n", *p
33a0: 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  tr);.    }.#endi
33b0: 66 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75 72  f.    .    retur
33c0: 6e 20 6d 61 74 63 68 65 73 3b 0a 7d 0a 0a 63 68  n matches;.}..ch
33d0: 61 72 2a 0a 54 63 6c 52 65 61 64 6c 69 6e 65 30  ar*.TclReadline0
33e0: 67 65 6e 65 72 61 74 6f 72 28 63 68 61 72 2a 20  generator(char* 
33f0: 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65 29  text, int state)
3400: 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  .{.    return Tc
3410: 6c 52 65 61 64 6c 69 6e 65 4b 6e 6f 77 6e 43 6f  lReadlineKnownCo
3420: 6d 6d 61 6e 64 73 28 74 65 78 74 2c 20 73 74 61  mmands(text, sta
3430: 74 65 2c 20 5f 43 4d 44 5f 47 45 54 29 3b 0a 7d  te, _CMD_GET);.}
3440: 0a 0a 63 68 61 72 2a 0a 54 63 6c 52 65 61 64 6c  ..char*.TclReadl
3450: 69 6e 65 4b 6e 6f 77 6e 43 6f 6d 6d 61 6e 64 73  ineKnownCommands
3460: 28 63 68 61 72 2a 20 74 65 78 74 2c 20 69 6e 74  (char* text, int
3470: 20 73 74 61 74 65 2c 20 69 6e 74 20 6d 6f 64 65   state, int mode
3480: 29 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  ).{.    static i
3490: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 61 74  nt len;.    stat
34a0: 69 63 20 63 6d 64 73 5f 74 20 2a 63 6d 64 73 20  ic cmds_t *cmds 
34b0: 3d 20 28 63 6d 64 73 5f 74 20 2a 29 20 4e 55 4c  = (cmds_t *) NUL
34c0: 4c 2c 20 2a 6e 65 77 3b 0a 20 20 20 20 63 68 61  L, *new;.    cha
34d0: 72 2a 20 74 6d 70 3b 0a 20 20 20 20 63 68 61 72  r* tmp;.    char
34e0: 2a 20 61 72 67 73 5b 32 35 36 5d 3b 0a 20 20 20  * args[256];.   
34f0: 20 69 6e 74 20 69 2c 20 61 72 67 63 3b 0a 20 20   int i, argc;.  
3500: 20 20 63 68 61 72 2a 2a 20 6e 61 6d 65 3b 0a 0a    char** name;..
3510: 20 20 20 20 63 68 61 72 2a 20 6c 6f 63 61 6c 5f      char* local_
3520: 6c 69 6e 65 20 3d 20 28 63 68 61 72 2a 29 20 4e  line = (char*) N
3530: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 75 62  ULL;.    int sub
3540: 3b 0a 20 20 20 20 0a 20 20 20 20 73 77 69 74 63  ;.    .    switc
3550: 68 20 28 6d 6f 64 65 29 20 7b 0a 20 20 20 20 20  h (mode) {.     
3560: 20 20 20 0a 20 20 20 20 20 20 20 20 63 61 73 65     .        case
3570: 20 5f 43 4d 44 5f 53 45 54 3a 0a 0a 20 20 20 20   _CMD_SET:..    
3580: 20 20 20 20 20 20 20 20 6e 65 77 20 3d 20 28 63          new = (c
3590: 6d 64 73 5f 74 20 2a 29 20 4d 41 4c 4c 4f 43 28  mds_t *) MALLOC(
35a0: 73 69 7a 65 6f 66 28 63 6d 64 73 5f 74 29 29 3b  sizeof(cmds_t));
35b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77  .            new
35c0: 2d 3e 6e 65 78 74 20 3d 20 28 63 6d 64 73 5f 74  ->next = (cmds_t
35d0: 20 2a 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 20   *) NULL;..     
35e0: 20 20 20 20 20 20 20 69 66 20 28 21 63 6d 64 73         if (!cmds
35f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3600: 20 20 20 20 63 6d 64 73 20 3d 20 6e 65 77 3b 0a      cmds = new;.
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 63 6d 64 73 2d 3e 70 72 65 76 20 3d 20 6e 65 77  cmds->prev = new
3630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
3640: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
3650: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3660: 20 20 20 63 6d 64 73 2d 3e 70 72 65 76 2d 3e 6e     cmds->prev->n
3670: 65 78 74 20 3d 20 6e 65 77 3b 0a 20 20 20 20 20  ext = new;.     
3680: 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 73 2d             cmds-
3690: 3e 70 72 65 76 20 3d 20 6e 65 77 3b 0a 20 20 20  >prev = new;.   
36a0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
36b0: 20 20 20 20 20 20 20 20 74 6d 70 20 3d 20 73 74          tmp = st
36c0: 72 64 75 70 28 74 65 78 74 29 3b 0a 20 20 20 20  rdup(text);.    
36d0: 20 20 20 20 20 20 20 20 61 72 67 63 20 3d 20 54          argc = T
36e0: 63 6c 52 65 61 64 6c 69 6e 65 50 61 72 73 65 28  clReadlineParse(
36f0: 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 61 72 67  args, sizeof(arg
3700: 73 29 2c 20 74 6d 70 29 3b 0a 0a 20 20 20 20 20  s), tmp);..     
3710: 20 20 20 20 20 20 20 6e 65 77 2d 3e 63 6d 64 20         new->cmd 
3720: 3d 20 28 63 68 61 72 2a 2a 29 20 4d 41 4c 4c 4f  = (char**) MALLO
3730: 43 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  C(sizeof(char*) 
3740: 2a 20 28 61 72 67 63 20 2b 20 31 29 29 3b 0a 0a  * (argc + 1));..
3750: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
3760: 28 69 20 3d 20 30 3b 20 69 20 3c 20 61 72 67 63  (i = 0; i < argc
3770: 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 20 20 20  ; i++).         
3780: 20 20 20 20 20 20 20 6e 65 77 2d 3e 63 6d 64 5b         new->cmd[
3790: 69 5d 20 3d 20 61 72 67 73 5b 69 5d 3b 0a 0a 20  i] = args[i];.. 
37a0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d 3e             new->
37b0: 63 6d 64 5b 61 72 67 63 5d 20 3d 20 28 63 68 61  cmd[argc] = (cha
37c0: 72 2a 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 20  r*) NULL;..     
37d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 63         return (c
37e0: 68 61 72 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20  har*) NULL;.    
37f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
3800: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 5f 43  .        case _C
3810: 4d 44 5f 47 45 54 3a 0a 0a 20 20 20 20 20 20 20  MD_GET:..       
3820: 20 20 20 20 20 6c 6f 63 61 6c 5f 6c 69 6e 65 20       local_line 
3830: 3d 20 73 74 72 64 75 70 28 72 6c 5f 6c 69 6e 65  = strdup(rl_line
3840: 5f 62 75 66 66 65 72 29 3b 0a 20 20 20 20 20 20  _buffer);.      
3850: 20 20 20 20 20 20 73 75 62 20 3d 20 54 63 6c 52        sub = TclR
3860: 65 61 64 6c 69 6e 65 50 61 72 73 65 28 61 72 67  eadlineParse(arg
3870: 73 2c 20 73 69 7a 65 6f 66 28 61 72 67 73 29 2c  s, sizeof(args),
3880: 20 6c 6f 63 61 6c 5f 6c 69 6e 65 29 3b 0a 20 20   local_line);.  
3890: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 70 72            // fpr
38a0: 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22 28  intf (stderr, "(
38b0: 54 63 6c 52 65 61 64 6c 69 6e 65 4b 6e 6f 77 6e  TclReadlineKnown
38c0: 43 6f 6d 6d 61 6e 64 73 29 20 73 74 61 74 65 3d  Commands) state=
38d0: 25 64 5c 6e 22 2c 20 73 74 61 74 65 29 3b 0a 0a  %d\n", state);..
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
38f0: 30 20 3d 3d 20 73 75 62 20 7c 7c 20 28 31 20 3d  0 == sub || (1 =
3900: 3d 20 73 75 62 20 26 26 20 27 5c 30 27 20 21 3d  = sub && '\0' !=
3910: 20 74 65 78 74 5b 30 5d 29 29 20 7b 0a 20 20 20   text[0])) {.   
3920: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 28           // if (
3930: 30 20 3d 3d 20 73 74 61 74 65 29 20 7b 0a 20 20  0 == state) {.  
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3950: 20 28 21 73 74 61 74 65 29 20 7b 0a 20 20 20 20   (!state) {.    
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 6e 65 77 20 3d 20 63 6d 64 73 3b 0a 20 20 20 20  new = cmds;.    
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 74 65 78  len = strlen(tex
39a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
39b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
39c0: 20 20 20 20 20 20 77 68 69 6c 65 20 28 6e 65 77        while (new
39d0: 20 26 26 20 28 6e 61 6d 65 20 3d 20 6e 65 77 2d   && (name = new-
39e0: 3e 63 6d 64 29 29 20 7b 0a 20 20 20 20 20 20 20  >cmd)) {.       
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
3a00: 20 3d 20 6e 65 77 2d 3e 6e 65 78 74 3b 0a 20 20   = new->next;.  
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 69 66 20 28 21 73 74 72 6e 63 6d 70 28 6e    if (!strncmp(n
3a30: 61 6d 65 5b 30 5d 2c 20 74 65 78 74 2c 20 6c 65  ame[0], text, le
3a40: 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)).            
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
3a60: 72 6e 20 73 74 72 64 75 70 28 6e 61 6d 65 5b 30  rn strdup(name[0
3a70: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
3a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3a90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 63 68        return (ch
3aa0: 61 72 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  ar*) NULL;.     
3ab0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
3ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ad0: 20 69 66 20 28 21 73 74 61 74 65 29 20 7b 0a 0a   if (!state) {..
3ae0: 23 69 66 20 30 0a 20 20 20 20 20 20 20 20 20 20  #if 0.          
3af0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
3b00: 66 20 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  f (stderr,.     
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 22 28 54 63 6c 52 65 61 64 6c 69 6e 65     "(TclReadline
3b30: 4b 6e 6f 77 6e 43 6f 6d 6d 61 6e 64 73 29 20 5f  KnownCommands) _
3b40: 43 4d 44 5f 53 55 42 5f 47 45 54 20 3d 20 7c 25  CMD_SUB_GET = |%
3b50: 73 7c 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s| %d %d\n",.   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 74 65 78 74 2c 20 73 74 61 74 65       text, state
3b80: 2c 20 6d 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , mode);.#endif.
3b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ba0: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20       /*.        
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20              len 
3bc0: 3d 20 73 74 72 6c 65 6e 28 6c 6f 63 61 6c 5f 6c  = strlen(local_l
3bd0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ine);.          
3be0: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 70 72            stripr
3bf0: 69 67 68 74 28 6c 6f 63 61 6c 5f 6c 69 6e 65 29  ight(local_line)
3c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3c10: 20 20 20 20 20 20 2a 2f 0a 0a 23 69 66 20 30 0a        */..#if 0.
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c30: 20 20 20 20 69 66 20 28 6c 65 6e 20 21 3d 20 73      if (len != s
3c40: 74 72 6c 65 6e 28 6c 6f 63 61 6c 5f 6c 69 6e 65  trlen(local_line
3c50: 29 29 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20  )) {.#endif.#if 
3c60: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 70 72            // fpr
3c80: 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22 28  intf (stderr, "(
3c90: 54 63 6c 52 65 61 64 6c 69 6e 65 4b 6e 6f 77 6e  TclReadlineKnown
3ca0: 43 6f 6d 6d 61 6e 64 73 29 20 6c 65 6e 20 21 3d  Commands) len !=
3cb0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
3cc0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
3cd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3ce0: 20 20 20 20 20 20 20 20 20 20 20 73 75 62 20 3d             sub =
3cf0: 20 54 63 6c 52 65 61 64 6c 69 6e 65 50 61 72 73   TclReadlinePars
3d00: 65 28 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 61  e(args, sizeof(a
3d10: 72 67 73 29 2c 20 6c 6f 63 61 6c 5f 6c 69 6e 65  rgs), local_line
3d20: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  ) - 1;.         
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d40: 2f 20 66 70 72 69 6e 74 66 20 28 73 74 64 65 72  / fprintf (stder
3d50: 72 2c 20 22 28 54 63 6c 52 65 61 64 6c 69 6e 65  r, "(TclReadline
3d60: 4b 6e 6f 77 6e 43 6f 6d 6d 61 6e 64 73 29 20 6c  KnownCommands) l
3d70: 65 6e 20 3d 3d 5c 6e 22 29 3b 0a 20 20 20 20 20  en ==\n");.     
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3d90: 0a 23 65 6e 64 69 66 0a 23 69 66 20 30 0a 20 20  .#endif.#if 0.  
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
3dd0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
3de0: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
3df0: 74 66 20 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  tf (stderr, "\n"
3e00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3e10: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
3e20: 69 20 3d 20 30 3b 20 69 20 3c 20 73 75 62 3b 20  i = 0; i < sub; 
3e30: 69 2b 2b 29 0a 20 20 20 20 20 20 20 20 20 20 20  i++).           
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 66 70 72 69 6e 74 66 20 28 73 74 64 65 72 72   fprintf (stderr
3e60: 2c 20 22 7c 25 73 7c 5c 6e 22 2c 20 61 72 67 73  , "|%s|\n", args
3e70: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
3e80: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 66 70 72 69 6e 74 66 20 28 73 74 64 65 72 72   fprintf (stderr
3eb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3ec0: 20 20 20 20 20 20 20 20 20 20 22 28 54 63 6c 52            "(TclR
3ed0: 65 61 64 6c 69 6e 65 4b 6e 6f 77 6e 43 6f 6d 6d  eadlineKnownComm
3ee0: 61 6e 64 73 29 20 61 72 67 73 5b 73 75 62 20 2d  ands) args[sub -
3ef0: 20 31 5d 20 3d 20 7c 25 73 7c 5c 6e 22 2c 0a 20   1] = |%s|\n",. 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 20 20 20 20 61 72 67 73 5b 73 75 62 20         args[sub 
3f20: 2d 20 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69  - 1]);.#endif.#i
3f30: 66 20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  f 0.            
3f40: 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62 20          if (sub 
3f50: 3e 20 30 20 26 26 20 61 72 67 73 5b 73 75 62 20  > 0 && args[sub 
3f60: 2d 20 31 5d 20 26 26 20 2a 28 61 72 67 73 5b 73  - 1] && *(args[s
3f70: 75 62 20 2d 20 31 5d 29 20 3d 3d 20 27 24 27 29  ub - 1]) == '$')
3f80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3f90: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 2a             char*
3fa0: 20 76 61 72 20 3d 20 73 74 72 64 75 70 28 61 72   var = strdup(ar
3fb0: 67 73 5b 73 75 62 20 2d 20 31 5d 20 2b 20 31 29  gs[sub - 1] + 1)
3fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3fd0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 2a 20            char* 
3fe0: 70 74 72 20 3d 20 76 61 72 3b 0a 20 20 20 20 20  ptr = var;.     
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 20 69 6e 74 20 76 61 72 6c 65 6e 3b 0a 20     int varlen;. 
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 20 20 20 20 69 66 20 28 76 61 72 29 0a         if (var).
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 6c              varl
4050: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 76 61 72 29  en = strlen(var)
4060: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4070: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20            else. 
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
40a0: 6e 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 3b 0a  n (char*) NULL;.
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 20 20 20 20 20 69 66 20 28 21 76 61 72          if (!var
40d0: 6c 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20  len) {.         
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 46 52 45 45 28 76 61 72 29 3b 0a 20 20     FREE(var);.  
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4120: 20 28 63 68 61 72 2a 20 29 20 4e 55 4c 4c 3b 0a   (char* ) NULL;.
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69          } else i
4150: 66 20 28 27 7b 27 20 3d 3d 20 76 61 72 5b 30 5d  f ('{' == var[0]
4160: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 70 74 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ptr++;.         
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 76 61 72 6c 65 6e 2d 2d 3b 0a 20 20 20     varlen--;.   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
41e0: 70 72 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20  printf (stderr, 
41f0: 22 28 54 63 6c 52 65 61 64 6c 69 6e 65 4b 6e 6f  "(TclReadlineKno
4200: 77 6e 43 6f 6d 6d 61 6e 64 73 29 20 24 5c 6e 22  wnCommands) $\n"
4210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
4220: 20 20 20 20 20 20 20 20 20 20 20 46 52 45 45 28             FREE(
4230: 76 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  var);.          
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
4250: 74 75 72 6e 20 28 63 68 61 72 2a 20 29 20 4e 55  turn (char* ) NU
4260: 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL;.            
4270: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
4280: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4290: 20 20 20 20 20 20 6e 65 77 20 3d 20 63 6d 64 73        new = cmds
42a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
42b0: 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c        len = strl
42c0: 65 6e 28 74 65 78 74 29 3b 0a 0a 20 20 20 20 20  en(text);..     
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
42e0: 68 69 6c 65 20 28 6e 65 77 20 26 26 20 28 6e 61  hile (new && (na
42f0: 6d 65 20 3d 20 6e 65 77 2d 3e 63 6d 64 29 29 20  me = new->cmd)) 
4300: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4310: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
4320: 74 72 63 6d 70 28 6e 61 6d 65 5b 30 5d 2c 20 61  trcmp(name[0], a
4330: 72 67 73 5b 30 5d 29 29 0a 20 20 20 20 20 20 20  rgs[0])).       
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 6e 65 77 20 3d 20 6e 65 77 2d 3e 6e      new = new->n
4380: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ext;.           
4390: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 69 66 20 28 21 6e 65 77 29 0a 20 20 20 20 20 20  if (!new).      
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 20 72 65 74 75 72 6e 20 28 63 68 61 72 2a 29    return (char*)
43e0: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 20 20 20 20   NULL;..        
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
4400: 28 69 20 3d 20 30 3b 20 6e 65 77 2d 3e 63 6d 64  (i = 0; new->cmd
4410: 5b 69 5d 3b 20 69 2b 2b 29 20 2f 2a 20 45 4d 50  [i]; i++) /* EMP
4420: 54 59 20 2a 2f 3b 0a 0a 20 20 20 20 20 20 20 20  TY */;..        
4430: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
4440: 73 75 62 20 3c 20 69 20 26 26 20 21 73 74 72 6e  sub < i && !strn
4450: 63 6d 70 28 6e 65 77 2d 3e 63 6d 64 5b 73 75 62  cmp(new->cmd[sub
4460: 5d 2c 20 74 65 78 74 2c 20 6c 65 6e 29 29 0a 20  ], text, len)). 
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 74         return st
4490: 72 64 75 70 28 6e 65 77 2d 3e 63 6d 64 5b 73 75  rdup(new->cmd[su
44a0: 62 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b]);.           
44b0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20           else.  
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 63 68        return (ch
44e0: 61 72 2a 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  ar*) NULL;..    
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
4510: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  se.             
4520: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 63         return (c
4530: 68 61 72 2a 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20  har*) NULL;..   
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4550: 4e 4f 54 52 45 41 43 48 45 44 20 2a 2f 0a 20 20  NOTREACHED */.  
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
4570: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
4580: 20 7d 0a 0a 0a 20 20 20 20 20 20 20 20 64 65 66   }...        def
4590: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
45a0: 20 20 72 65 74 75 72 6e 20 28 63 68 61 72 2a 29    return (char*)
45b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20   NULL;.         
45c0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 7d     break;..    }
45d0: 0a 20 20 20 20 2f 2a 20 4e 4f 54 52 45 41 43 48  .    /* NOTREACH
45e0: 45 44 20 2a 2f 0a 7d 0a 0a 69 6e 74 0a 54 63 6c  ED */.}..int.Tcl
45f0: 52 65 61 64 6c 69 6e 65 50 61 72 73 65 28 63 68  ReadlineParse(ch
4600: 61 72 2a 2a 20 61 72 67 73 2c 20 69 6e 74 20 6d  ar** args, int m
4610: 61 78 61 72 67 73 2c 20 63 68 61 72 2a 20 62 75  axargs, char* bu
4620: 66 29 0a 7b 0a 20 20 20 20 69 6e 74 20 6e 72 20  f).{.    int nr 
4630: 3d 20 30 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20  = 0;..    while 
4640: 28 2a 62 75 66 20 21 3d 20 27 5c 30 27 20 26 26  (*buf != '\0' &&
4650: 20 6e 72 20 3c 20 6d 61 78 61 72 67 73 29 20 7b   nr < maxargs) {
4660: 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
4670: 20 20 20 20 20 2a 20 53 74 72 69 70 20 77 68 69       * Strip whi
4680: 74 65 73 70 61 63 65 2e 20 20 55 73 65 20 6e 75  tespace.  Use nu
4690: 6c 6c 73 2c 20 73 6f 0a 20 20 20 20 20 20 20 20  lls, so.        
46a0: 20 2a 20 74 68 61 74 20 74 68 65 20 70 72 65 76   * that the prev
46b0: 69 6f 75 73 20 61 72 67 75 6d 65 6e 74 20 69 73  ious argument is
46c0: 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20   terminated.    
46d0: 20 20 20 20 20 2a 20 61 75 74 6f 6d 61 74 69 63       * automatic
46e0: 61 6c 6c 79 2e 0a 20 20 20 20 20 20 20 20 20 2a  ally..         *
46f0: 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20  /.        while 
4700: 28 49 53 57 48 49 54 45 28 2a 62 75 66 29 29 0a  (ISWHITE(*buf)).
4710: 20 20 20 20 20 20 20 20 20 20 20 20 2a 62 75 66              *buf
4720: 2b 2b 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  ++ = '\0';..    
4730: 20 20 20 20 69 66 20 28 21 28 2a 62 75 66 29 29      if (!(*buf))
4740: 20 2f 2a 20 64 6f 6e 27 74 20 63 6f 75 6e 74 20   /* don't count 
4750: 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  the terminating 
4760: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  NULL */.        
4770: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
4780: 20 20 20 20 2a 61 72 67 73 2b 2b 20 3d 20 62 75      *args++ = bu
4790: 66 3b 0a 20 20 20 20 20 20 20 20 6e 72 2b 2b 3b  f;.        nr++;
47a0: 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20  ..        while 
47b0: 28 28 27 5c 30 27 20 21 3d 20 2a 62 75 66 29 20  (('\0' != *buf) 
47c0: 26 26 20 21 49 53 57 48 49 54 45 28 2a 62 75 66  && !ISWHITE(*buf
47d0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  )).            b
47e0: 75 66 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  uf++;.    }..   
47f0: 20 2a 61 72 67 73 20 3d 20 27 5c 30 27 3b 0a 20   *args = '\0';. 
4800: 20 20 20 72 65 74 75 72 6e 20 6e 72 3b 0a 7d 0a     return nr;.}.