Hex Artifact Content
Not logged in

Artifact 1db6c88ca5442344795ba6227a7e4f68dfeca8ec:

File src/th_lang.c part of check-in [4ee9e31a2d] - Add the TH1 code to the source tree and makefile. But do not yet make any calls to TH1. by drh on 2008-02-13 15:04:49. Also file src/th_lang.c part of check-in [588bb7cd73] - Merged to ed26056bb5. by aku on 2008-02-24 18:50:35.

0000: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ./*.** This file
0010: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
0020: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0030: 61 6c 6c 20 6f 66 20 74 68 65 20 54 48 20 6c 61  all of the TH la
0040: 6e 67 75 61 67 65 20 0a 2a 2a 20 62 75 69 6c 74  nguage .** built
0050: 2d 69 6e 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a  -in commands. .*
0060: 2a 0a 2a 2a 20 41 6c 6c 20 62 75 69 6c 74 2d 69  *.** All built-i
0070: 6e 20 63 6f 6d 6d 61 6e 64 73 20 61 72 65 20 69  n commands are i
0080: 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
0090: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
00a0: 72 66 61 63 65 20 0a 2a 2a 20 64 65 63 6c 61 72  rface .** declar
00b0: 65 64 20 69 6e 20 74 68 2e 68 2c 20 73 6f 20 74  ed in th.h, so t
00c0: 68 69 73 20 66 69 6c 65 20 73 65 72 76 65 73 20  his file serves 
00d0: 61 73 20 62 6f 74 68 20 61 20 70 61 72 74 20 6f  as both a part o
00e0: 66 20 74 68 65 20 6c 61 6e 67 75 61 67 65 20 0a  f the language .
00f0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
0100: 6e 20 61 6e 64 20 61 6e 20 65 78 61 6d 70 6c 65  n and an example
0110: 20 6f 66 20 68 6f 77 20 74 6f 20 65 78 74 65 6e   of how to exten
0120: 64 20 74 68 65 20 6c 61 6e 67 75 61 67 65 20 77  d the language w
0130: 69 74 68 0a 2a 2a 20 6e 65 77 20 63 6f 6d 6d 61  ith.** new comma
0140: 6e 64 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64  nds..*/..#includ
0150: 65 20 22 74 68 2e 68 22 0a 23 69 6e 63 6c 75 64  e "th.h".#includ
0160: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0170: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0180: 0a 0a 69 6e 74 20 54 68 5f 57 72 6f 6e 67 4e 75  ..int Th_WrongNu
0190: 6d 41 72 67 73 28 54 68 5f 49 6e 74 65 72 70 20  mArgs(Th_Interp 
01a0: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63  *interp, const c
01b0: 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 68  har *zMsg){.  Th
01c0: 5f 45 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e  _ErrorMessage(in
01d0: 74 65 72 70 2c 20 0a 20 20 20 20 20 20 22 77 72  terp, .      "wr
01e0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
01f0: 6c 64 20 62 65 20 5c 22 22 2c 20 28 63 6f 6e 73  ld be \"", (cons
0200: 74 20 75 63 68 61 72 2a 29 7a 4d 73 67 2c 20 2d  t uchar*)zMsg, -
0210: 31 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  1.  );.  return 
0220: 54 48 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TH_ERROR;.}../*.
0230: 2a 2a 20 53 79 6e 74 61 78 3a 20 0a 2a 2a 0a 2a  ** Syntax: .**.*
0240: 2a 20 20 20 63 61 74 63 68 20 73 63 72 69 70 74  *   catch script
0250: 20 3f 76 61 72 6e 61 6d 65 3f 0a 2a 2f 0a 73 74   ?varname?.*/.st
0260: 61 74 69 63 20 69 6e 74 20 63 61 74 63 68 5f 63  atic int catch_c
0270: 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e 74  ommand(.  Th_Int
0280: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
0290: 76 6f 69 64 20 2a 63 74 78 2c 20 0a 20 20 69 6e  void *ctx, .  in
02a0: 74 20 61 72 67 63 2c 20 0a 20 20 63 6f 6e 73 74  t argc, .  const
02b0: 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 0a   uchar **argv, .
02c0: 20 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20    int *argl.){. 
02d0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
02e0: 61 72 67 63 21 3d 32 20 26 26 20 61 72 67 63 21  argc!=2 && argc!
02f0: 3d 33 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =3 ){.    return
0300: 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73   Th_WrongNumArgs
0310: 28 69 6e 74 65 72 70 2c 20 22 63 61 74 63 68 20  (interp, "catch 
0320: 73 63 72 69 70 74 20 3f 76 61 72 6e 61 6d 65 3f  script ?varname?
0330: 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ");.  }..  rc = 
0340: 54 68 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  Th_Eval(interp, 
0350: 30 2c 20 61 72 67 76 5b 31 5d 2c 20 2d 31 29 3b  0, argv[1], -1);
0360: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29  .  if( argc==3 )
0370: 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 73 75 6c  {.    int nResul
0380: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 63 68  t;.    const uch
0390: 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 54 68  ar *zResult = Th
03a0: 5f 47 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _GetResult(inter
03b0: 70 2c 20 26 6e 52 65 73 75 6c 74 29 3b 0a 20 20  p, &nResult);.  
03c0: 20 20 54 68 5f 53 65 74 56 61 72 28 69 6e 74 65    Th_SetVar(inte
03d0: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 61 72 67  rp, argv[2], arg
03e0: 6c 5b 32 5d 2c 20 7a 52 65 73 75 6c 74 2c 20 6e  l[2], zResult, n
03f0: 52 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 0a 20 20  Result);.  }..  
0400: 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 28  Th_SetResultInt(
0410: 69 6e 74 65 72 70 2c 20 72 63 29 3b 0a 20 20 72  interp, rc);.  r
0420: 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a  eturn TH_OK;.}..
0430: 2f 2a 0a 2a 2a 20 54 48 20 53 79 6e 74 61 78 3a  /*.** TH Syntax:
0440: 20 0a 2a 2a 0a 2a 2a 20 20 20 69 66 20 65 78 70   .**.**   if exp
0450: 72 31 20 62 6f 64 79 31 20 3f 65 6c 73 65 69 66  r1 body1 ?elseif
0460: 20 65 78 70 72 32 20 62 6f 64 79 32 3f 20 3f 20   expr2 body2? ? 
0470: 3f 65 6c 73 65 3f 20 62 6f 64 79 4e 3f 0a 2a 2f  ?else? bodyN?.*/
0480: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 66 5f 63  .static int if_c
0490: 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e 74  ommand(.  Th_Int
04a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
04b0: 76 6f 69 64 20 2a 63 74 78 2c 20 0a 20 20 69 6e  void *ctx, .  in
04c0: 74 20 61 72 67 63 2c 20 0a 20 20 63 6f 6e 73 74  t argc, .  const
04d0: 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 0a   uchar **argv, .
04e0: 20 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20    int *argl.){. 
04f0: 20 69 6e 74 20 72 63 20 3d 20 54 48 5f 4f 4b 3b   int rc = TH_OK;
0500: 0a 0a 20 20 69 6e 74 20 69 43 6f 6e 64 3b 20 20  ..  int iCond;  
0510: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
0520: 6c 74 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67  lt of evaluating
0530: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
0540: 20 69 6e 74 20 69 3b 0a 0a 20 20 63 6f 6e 73 74   int i;..  const
0550: 20 75 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b   uchar *zResult;
0560: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a  .  int nResult;.
0570: 0a 20 20 69 66 28 20 61 72 67 63 3c 33 20 29 7b  .  if( argc<3 ){
0580: 0a 20 20 20 20 67 6f 74 6f 20 77 72 6f 6e 67 5f  .    goto wrong_
0590: 61 72 67 73 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  args;.  }..  for
05a0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 20 26 26 20  (i=0; i<argc && 
05b0: 72 63 3d 3d 54 48 5f 4f 4b 3b 20 69 2b 3d 33 29  rc==TH_OK; i+=3)
05c0: 7b 0a 20 20 20 20 69 66 28 20 69 3e 61 72 67 63  {.    if( i>argc
05d0: 2d 33 20 29 7b 0a 20 20 20 20 20 20 69 20 3d 20  -3 ){.      i = 
05e0: 61 72 67 63 2d 33 3b 0a 20 20 20 20 20 20 69 43  argc-3;.      iC
05f0: 6f 6e 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ond = 1;.    }el
0600: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 54 48  se{.      if( TH
0610: 5f 4f 4b 21 3d 54 68 5f 45 78 70 72 28 69 6e 74  _OK!=Th_Expr(int
0620: 65 72 70 2c 20 61 72 67 76 5b 69 2b 31 5d 2c 20  erp, argv[i+1], 
0630: 61 72 67 6c 5b 69 2b 31 5d 29 20 29 7b 0a 20 20  argl[i+1]) ){.  
0640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f        return TH_
0650: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
0660: 20 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 54       zResult = T
0670: 68 5f 47 65 74 52 65 73 75 6c 74 28 69 6e 74 65  h_GetResult(inte
0680: 72 70 2c 20 26 6e 52 65 73 75 6c 74 29 3b 0a 20  rp, &nResult);. 
0690: 20 20 20 20 20 72 63 20 3d 20 54 68 5f 54 6f 49       rc = Th_ToI
06a0: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 52 65 73 75  nt(interp, zResu
06b0: 6c 74 2c 20 6e 52 65 73 75 6c 74 2c 20 26 69 43  lt, nResult, &iC
06c0: 6f 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ond);.    }.    
06d0: 69 66 28 20 69 43 6f 6e 64 20 26 26 20 72 63 3d  if( iCond && rc=
06e0: 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  =TH_OK ){.      
06f0: 72 63 20 3d 20 54 68 5f 45 76 61 6c 28 69 6e 74  rc = Th_Eval(int
0700: 65 72 70 2c 20 30 2c 20 61 72 67 76 5b 69 2b 32  erp, 0, argv[i+2
0710: 5d 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72  ], -1);.      br
0720: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
0730: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 77 72    return rc;..wr
0740: 6f 6e 67 5f 61 72 67 73 3a 0a 20 20 72 65 74 75  ong_args:.  retu
0750: 72 6e 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72  rn Th_WrongNumAr
0760: 67 73 28 69 6e 74 65 72 70 2c 20 22 69 66 20 2e  gs(interp, "if .
0770: 2e 2e 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ..");.}../*.** T
0780: 48 20 53 79 6e 74 61 78 3a 20 0a 2a 2a 0a 2a 2a  H Syntax: .**.**
0790: 20 20 20 65 78 70 72 20 65 78 70 72 0a 2a 2f 0a     expr expr.*/.
07a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 5f  static int expr_
07b0: 63 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e  command(.  Th_In
07c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20  terp *interp, . 
07d0: 20 76 6f 69 64 20 2a 63 74 78 2c 20 0a 20 20 69   void *ctx, .  i
07e0: 6e 74 20 61 72 67 63 2c 20 0a 20 20 63 6f 6e 73  nt argc, .  cons
07f0: 74 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c 20  t uchar **argv, 
0800: 0a 20 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a  .  int *argl.){.
0810: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
0820: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 68 5f 57  .    return Th_W
0830: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
0840: 72 70 2c 20 22 65 78 70 72 20 65 78 70 72 65 73  rp, "expr expres
0850: 73 69 6f 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 72  sion");.  }..  r
0860: 65 74 75 72 6e 20 54 68 5f 45 78 70 72 28 69 6e  eturn Th_Expr(in
0870: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 61  terp, argv[1], a
0880: 72 67 6c 5b 31 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rgl[1]);.}../*.*
0890: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 74  * Evaluate the t
08a0: 68 31 20 73 63 72 69 70 74 20 28 7a 42 6f 64 79  h1 script (zBody
08b0: 2c 20 6e 42 6f 64 79 29 20 69 6e 20 74 68 65 20  , nBody) in the 
08c0: 6c 6f 63 61 6c 20 73 74 61 63 6b 20 66 72 61 6d  local stack fram
08d0: 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  e. .** Return th
08e0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
08f0: 65 76 61 6c 75 61 74 69 6f 6e 2c 20 65 78 63 65  evaluation, exce
0900: 70 74 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  pt if the result
0910: 0a 2a 2a 20 69 73 20 54 48 5f 43 4f 4e 54 49 4e  .** is TH_CONTIN
0920: 55 45 2c 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b  UE, return TH_OK
0930: 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61   instead..*/.sta
0940: 74 69 63 20 69 6e 74 20 65 76 61 6c 5f 6c 6f 6f  tic int eval_loo
0950: 70 62 6f 64 79 28 54 68 5f 49 6e 74 65 72 70 20  pbody(Th_Interp 
0960: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 75  *interp, const u
0970: 63 68 61 72 20 2a 7a 42 6f 64 79 2c 20 69 6e 74  char *zBody, int
0980: 20 6e 42 6f 64 79 29 7b 0a 20 20 69 6e 74 20 72   nBody){.  int r
0990: 63 20 3d 20 54 68 5f 45 76 61 6c 28 69 6e 74 65  c = Th_Eval(inte
09a0: 72 70 2c 20 30 2c 20 7a 42 6f 64 79 2c 20 6e 42  rp, 0, zBody, nB
09b0: 6f 64 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ody);.  if( rc==
09c0: 54 48 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20  TH_CONTINUE ){. 
09d0: 20 20 20 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a 20     rc = TH_OK;. 
09e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
09f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 53 79 6e 74  }../*.** TH Synt
0a00: 61 78 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 66 6f 72  ax: .**.**   for
0a10: 20 69 6e 69 74 20 63 6f 6e 64 69 74 69 6f 6e 20   init condition 
0a20: 69 6e 63 72 20 73 63 72 69 70 74 0a 2a 2f 0a 73  incr script.*/.s
0a30: 74 61 74 69 63 20 69 6e 74 20 66 6f 72 5f 63 6f  tatic int for_co
0a40: 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e 74 65  mmand(.  Th_Inte
0a50: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 76  rp *interp, .  v
0a60: 6f 69 64 20 2a 63 74 78 2c 20 0a 20 20 69 6e 74  oid *ctx, .  int
0a70: 20 61 72 67 63 2c 20 0a 20 20 63 6f 6e 73 74 20   argc, .  const 
0a80: 75 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 0a 20  uchar **argv, . 
0a90: 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20 20   int *argl.){.  
0aa0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 43  int rc;.  int iC
0ab0: 6f 6e 64 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  ond;..  if( argc
0ac0: 21 3d 35 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=5 ){.    retur
0ad0: 6e 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  n Th_WrongNumArg
0ae0: 73 28 69 6e 74 65 72 70 2c 20 22 66 6f 72 20 69  s(interp, "for i
0af0: 6e 69 74 20 63 6f 6e 64 69 74 69 6f 6e 20 69 6e  nit condition in
0b00: 63 72 20 73 63 72 69 70 74 22 29 3b 0a 20 20 7d  cr script");.  }
0b10: 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
0b20: 74 68 65 20 27 69 6e 69 74 27 20 73 63 72 69 70  the 'init' scrip
0b30: 74 20 2a 2f 0a 20 20 72 63 20 3d 20 54 68 5f 45  t */.  rc = Th_E
0b40: 76 61 6c 28 69 6e 74 65 72 70 2c 20 30 2c 20 61  val(interp, 0, a
0b50: 72 67 76 5b 31 5d 2c 20 2d 31 29 3b 0a 0a 20 20  rgv[1], -1);..  
0b60: 77 68 69 6c 65 28 20 72 63 3d 3d 54 48 5f 4f 4b  while( rc==TH_OK
0b70: 20 0a 20 20 20 20 20 26 26 20 54 48 5f 4f 4b 3d   .     && TH_OK=
0b80: 3d 28 72 63 20 3d 20 54 68 5f 45 78 70 72 28 69  =(rc = Th_Expr(i
0b90: 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20  nterp, argv[2], 
0ba0: 2d 31 29 29 0a 20 20 20 20 20 26 26 20 54 48 5f  -1)).     && TH_
0bb0: 4f 4b 3d 3d 28 72 63 20 3d 20 54 68 5f 54 6f 49  OK==(rc = Th_ToI
0bc0: 6e 74 28 69 6e 74 65 72 70 2c 20 54 68 5f 47 65  nt(interp, Th_Ge
0bd0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
0be0: 30 29 2c 20 2d 31 2c 20 26 69 43 6f 6e 64 29 29  0), -1, &iCond))
0bf0: 0a 20 20 20 20 20 26 26 20 69 43 6f 6e 64 0a 20  .     && iCond. 
0c00: 20 20 20 20 26 26 20 54 48 5f 4f 4b 3d 3d 28 72      && TH_OK==(r
0c10: 63 20 3d 20 65 76 61 6c 5f 6c 6f 6f 70 62 6f 64  c = eval_loopbod
0c20: 79 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34  y(interp, argv[4
0c30: 5d 2c 20 61 72 67 6c 5b 34 5d 29 29 0a 20 20 29  ], argl[4])).  )
0c40: 7b 0a 20 20 20 20 72 63 20 3d 20 54 68 5f 45 76  {.    rc = Th_Ev
0c50: 61 6c 28 69 6e 74 65 72 70 2c 20 30 2c 20 61 72  al(interp, 0, ar
0c60: 67 76 5b 33 5d 2c 20 2d 31 29 3b 0a 20 20 7d 0a  gv[3], -1);.  }.
0c70: 0a 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 42 52  .  if( rc==TH_BR
0c80: 45 41 4b 20 29 20 72 63 20 3d 20 54 48 5f 4f 4b  EAK ) rc = TH_OK
0c90: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
0ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 53 79 6e 74 61  ../*.** TH Synta
0cb0: 78 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 6c 69 73 74  x: .**.**   list
0cc0: 20 3f 61 72 67 31 20 3f 61 72 67 32 3f 20 2e 2e   ?arg1 ?arg2? ..
0cd0: 2e 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .?.*/.static int
0ce0: 20 6c 69 73 74 5f 63 6f 6d 6d 61 6e 64 28 0a 20   list_command(. 
0cf0: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65   Th_Interp *inte
0d00: 72 70 2c 20 0a 20 20 76 6f 69 64 20 2a 63 74 78  rp, .  void *ctx
0d10: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a  , .  int argc, .
0d20: 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2a    const uchar **
0d30: 61 72 67 76 2c 20 0a 20 20 69 6e 74 20 2a 61 72  argv, .  int *ar
0d40: 67 6c 0a 29 7b 0a 20 20 75 63 68 61 72 20 2a 7a  gl.){.  uchar *z
0d50: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
0d60: 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  nList = 0;.  int
0d70: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20   i;..  for(i=1; 
0d80: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
0d90: 20 20 54 68 5f 4c 69 73 74 41 70 70 65 6e 64 28    Th_ListAppend(
0da0: 69 6e 74 65 72 70 2c 20 26 7a 4c 69 73 74 2c 20  interp, &zList, 
0db0: 26 6e 4c 69 73 74 2c 20 61 72 67 76 5b 69 5d 2c  &nList, argv[i],
0dc0: 20 61 72 67 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20   argl[i]);.  }. 
0dd0: 0a 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 28  .  Th_SetResult(
0de0: 69 6e 74 65 72 70 2c 20 7a 4c 69 73 74 2c 20 6e  interp, zList, n
0df0: 4c 69 73 74 29 3b 0a 20 20 54 68 5f 46 72 65 65  List);.  Th_Free
0e00: 28 69 6e 74 65 72 70 2c 20 7a 4c 69 73 74 29 3b  (interp, zList);
0e10: 0a 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b  ..  return TH_OK
0e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 53 79  ;.}../*.** TH Sy
0e30: 6e 74 61 78 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 6c  ntax: .**.**   l
0e40: 69 6e 64 65 78 20 6c 69 73 74 20 69 6e 64 65 78  index list index
0e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
0e60: 69 6e 64 65 78 5f 63 6f 6d 6d 61 6e 64 28 0a 20  index_command(. 
0e70: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65   Th_Interp *inte
0e80: 72 70 2c 20 0a 20 20 76 6f 69 64 20 2a 63 74 78  rp, .  void *ctx
0e90: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a  , .  int argc, .
0ea0: 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2a    const uchar **
0eb0: 61 72 67 76 2c 20 0a 20 20 69 6e 74 20 2a 61 72  argv, .  int *ar
0ec0: 67 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 45 6c 65  gl.){.  int iEle
0ed0: 6d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  m;.  int rc;..  
0ee0: 75 63 68 61 72 20 2a 2a 61 7a 45 6c 65 6d 3b 0a  uchar **azElem;.
0ef0: 20 20 69 6e 74 20 2a 61 6e 45 6c 65 6d 3b 0a 20    int *anElem;. 
0f00: 20 69 6e 74 20 6e 43 6f 75 6e 74 3b 0a 0a 20 20   int nCount;..  
0f10: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
0f20: 20 20 20 72 65 74 75 72 6e 20 54 68 5f 57 72 6f     return Th_Wro
0f30: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
0f40: 2c 20 22 6c 69 6e 64 65 78 20 6c 69 73 74 20 69  , "lindex list i
0f50: 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 69  ndex");.  }..  i
0f60: 66 28 20 54 48 5f 4f 4b 21 3d 54 68 5f 54 6f 49  f( TH_OK!=Th_ToI
0f70: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
0f80: 32 5d 2c 20 61 72 67 6c 5b 32 5d 2c 20 26 69 45  2], argl[2], &iE
0f90: 6c 65 6d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  lem) ){.    retu
0fa0: 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d  rn TH_ERROR;.  }
0fb0: 0a 0a 20 20 72 63 20 3d 20 54 68 5f 53 70 6c 69  ..  rc = Th_Spli
0fc0: 74 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 61 72  tList(interp, ar
0fd0: 67 76 5b 31 5d 2c 20 61 72 67 6c 5b 31 5d 2c 20  gv[1], argl[1], 
0fe0: 26 61 7a 45 6c 65 6d 2c 20 26 61 6e 45 6c 65 6d  &azElem, &anElem
0ff0: 2c 20 26 6e 43 6f 75 6e 74 29 3b 0a 20 20 69 66  , &nCount);.  if
1000: 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20  ( rc==TH_OK ){. 
1010: 20 20 20 69 66 28 20 69 45 6c 65 6d 3c 6e 43 6f     if( iElem<nCo
1020: 75 6e 74 20 26 26 20 69 45 6c 65 6d 3e 3d 30 20  unt && iElem>=0 
1030: 29 7b 0a 20 20 20 20 20 20 54 68 5f 53 65 74 52  ){.      Th_SetR
1040: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 61 7a  esult(interp, az
1050: 45 6c 65 6d 5b 69 45 6c 65 6d 5d 2c 20 61 6e 45  Elem[iElem], anE
1060: 6c 65 6d 5b 69 45 6c 65 6d 5d 29 3b 0a 20 20 20  lem[iElem]);.   
1070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 68   }else{.      Th
1080: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1090: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p, 0, 0);.    }.
10a0: 20 20 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65      Th_Free(inte
10b0: 72 70 2c 20 61 7a 45 6c 65 6d 29 3b 0a 20 20 7d  rp, azElem);.  }
10c0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
10d0: 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 53 79 6e 74 61  ../*.** TH Synta
10e0: 78 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 6c 6c 65 6e  x: .**.**   llen
10f0: 67 74 68 20 6c 69 73 74 0a 2a 2f 0a 73 74 61 74  gth list.*/.stat
1100: 69 63 20 69 6e 74 20 6c 6c 65 6e 67 74 68 5f 63  ic int llength_c
1110: 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e 74  ommand(.  Th_Int
1120: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
1130: 76 6f 69 64 20 2a 63 74 78 2c 20 0a 20 20 69 6e  void *ctx, .  in
1140: 74 20 61 72 67 63 2c 20 0a 20 20 63 6f 6e 73 74  t argc, .  const
1150: 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 0a   uchar **argv, .
1160: 20 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20    int *argl.){. 
1170: 20 69 6e 74 20 6e 45 6c 65 6d 3b 0a 20 20 69 6e   int nElem;.  in
1180: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67  t rc;..  if( arg
1190: 63 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=2 ){.    retu
11a0: 72 6e 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72  rn Th_WrongNumAr
11b0: 67 73 28 69 6e 74 65 72 70 2c 20 22 6c 6c 65 6e  gs(interp, "llen
11c0: 67 74 68 20 6c 69 73 74 22 29 3b 0a 20 20 7d 0a  gth list");.  }.
11d0: 0a 20 20 72 63 20 3d 20 54 68 5f 53 70 6c 69 74  .  rc = Th_Split
11e0: 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 61 72 67  List(interp, arg
11f0: 76 5b 31 5d 2c 20 61 72 67 6c 5b 31 5d 2c 20 30  v[1], argl[1], 0
1200: 2c 20 30 2c 20 26 6e 45 6c 65 6d 29 3b 0a 20 20  , 0, &nElem);.  
1210: 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b  if( rc==TH_OK ){
1220: 0a 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c  .    Th_SetResul
1230: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 6e 45 6c  tInt(interp, nEl
1240: 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  em);.  }..  retu
1250: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1260: 54 48 20 53 79 6e 74 61 78 3a 20 0a 2a 2a 0a 2a  TH Syntax: .**.*
1270: 2a 20 20 20 73 65 74 20 76 61 72 6e 61 6d 65 20  *   set varname 
1280: 3f 76 61 6c 75 65 3f 0a 2a 2f 0a 73 74 61 74 69  ?value?.*/.stati
1290: 63 20 69 6e 74 20 73 65 74 5f 63 6f 6d 6d 61 6e  c int set_comman
12a0: 64 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a  d(.  Th_Interp *
12b0: 69 6e 74 65 72 70 2c 20 0a 20 20 76 6f 69 64 20  interp, .  void 
12c0: 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 61 72 67  *ctx, .  int arg
12d0: 63 2c 20 0a 20 20 63 6f 6e 73 74 20 75 63 68 61  c, .  const ucha
12e0: 72 20 2a 2a 61 72 67 76 2c 20 0a 20 20 69 6e 74  r **argv, .  int
12f0: 20 2a 61 72 67 6c 0a 29 7b 0a 20 20 69 66 28 20   *argl.){.  if( 
1300: 61 72 67 63 21 3d 32 20 26 26 20 61 72 67 63 21  argc!=2 && argc!
1310: 3d 33 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =3 ){.    return
1320: 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73   Th_WrongNumArgs
1330: 28 69 6e 74 65 72 70 2c 20 22 73 65 74 20 76 61  (interp, "set va
1340: 72 6e 61 6d 65 20 3f 76 61 6c 75 65 3f 22 29 3b  rname ?value?");
1350: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 72 67 63  .  }..  if( argc
1360: 3d 3d 33 20 29 7b 0a 20 20 20 20 54 68 5f 53 65  ==3 ){.    Th_Se
1370: 74 56 61 72 28 69 6e 74 65 72 70 2c 20 61 72 67  tVar(interp, arg
1380: 76 5b 31 5d 2c 20 61 72 67 6c 5b 31 5d 2c 20 61  v[1], argl[1], a
1390: 72 67 76 5b 32 5d 2c 20 61 72 67 6c 5b 32 5d 29  rgv[2], argl[2])
13a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
13b0: 68 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c  h_GetVar(interp,
13c0: 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 6c 5b 31   argv[1], argl[1
13d0: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ]);.}../*.** Whe
13e0: 6e 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20  n a new command 
13f0: 69 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  is created using
1400: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 5b 70   the built-in [p
1410: 72 6f 63 5d 20 63 6f 6d 6d 61 6e 64 2c 20 61 6e  roc] command, an
1420: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  .** instance of 
1430: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1440: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
1450: 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
1460: 65 64 2e 20 41 20 0a 2a 2a 20 70 6f 69 6e 74 65  ed. A .** pointe
1470: 72 20 74 6f 20 74 68 65 20 73 74 72 75 63 74 75  r to the structu
1480: 72 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  re is passed as 
1490: 74 68 65 20 63 6f 6e 74 65 78 74 20 28 73 65 63  the context (sec
14a0: 6f 6e 64 29 20 61 72 67 75 6d 65 6e 74 20 0a 2a  ond) argument .*
14b0: 2a 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 70 72  * to function pr
14c0: 6f 63 5f 63 61 6c 6c 31 28 29 20 77 68 65 6e 20  oc_call1() when 
14d0: 74 68 65 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20  the new command 
14e0: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a  is executed..*/.
14f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
1500: 72 6f 63 44 65 66 6e 20 50 72 6f 63 44 65 66 6e  rocDefn ProcDefn
1510: 3b 0a 73 74 72 75 63 74 20 50 72 6f 63 44 65 66  ;.struct ProcDef
1520: 6e 20 7b 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d  n {.  int nParam
1530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1540: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 6f   /* Number of fo
1550: 72 6d 61 6c 20 28 6e 6f 6e 20 22 61 72 67 73 22  rmal (non "args"
1560: 29 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  ) parameters */.
1570: 20 20 75 63 68 61 72 20 2a 2a 61 7a 50 61 72 61    uchar **azPara
1580: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1590: 50 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 73 20  Parameter names 
15a0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 50 61 72 61  */.  int *anPara
15b0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
15c0: 2f 2a 20 4c 65 6e 67 74 68 73 20 6f 66 20 70 61  /* Lengths of pa
15d0: 72 61 6d 65 74 65 72 20 6e 61 6d 65 73 20 2a 2f  rameter names */
15e0: 0a 20 20 75 63 68 61 72 20 2a 2a 61 7a 44 65 66  .  uchar **azDef
15f0: 61 75 6c 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  ault;         /*
1600: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   Default values 
1610: 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 44 65 66 61  */.  int *anDefa
1620: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
1630: 2f 2a 20 4c 65 6e 67 74 68 73 20 6f 66 20 64 65  /* Lengths of de
1640: 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a  fault values */.
1650: 20 20 69 6e 74 20 68 61 73 41 72 67 73 3b 20 20    int hasArgs;  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1670: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
1680: 20 61 6e 20 22 61 72 67 73 22 20 70 61 72 61 6d   an "args" param
1690: 65 74 65 72 20 2a 2f 0a 20 20 75 63 68 61 72 20  eter */.  uchar 
16a0: 2a 7a 50 72 6f 67 72 61 6d 3b 20 20 20 20 20 20  *zProgram;      
16b0: 20 20 20 20 20 2f 2a 20 42 6f 64 79 20 6f 66 20       /* Body of 
16c0: 70 72 6f 63 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  proc */.  int nP
16d0: 72 6f 67 72 61 6d 3b 20 20 20 20 20 20 20 20 20  rogram;         
16e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16f0: 66 20 62 79 74 65 73 20 61 74 20 7a 50 72 6f 67  f bytes at zProg
1700: 72 61 6d 20 2a 2f 0a 20 20 75 63 68 61 72 20 2a  ram */.  uchar *
1710: 7a 55 73 61 67 65 3b 20 20 20 20 20 20 20 20 20  zUsage;         
1720: 20 20 20 20 2f 2a 20 55 73 61 67 65 20 6d 65 73      /* Usage mes
1730: 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  sage */.  int nU
1740: 73 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  sage;           
1750: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1760: 66 20 62 79 74 65 73 20 61 74 20 7a 55 73 61 67  f bytes at zUsag
1770: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73  e */.};../* This
1780: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
1790: 65 64 20 74 6f 20 74 65 6d 70 6f 72 61 72 69 6c  ed to temporaril
17a0: 79 20 73 74 6f 72 65 20 61 72 67 75 6d 65 6e 74  y store argument
17b0: 73 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 0a  s passed to an .
17c0: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ** invocation of
17d0: 20 61 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74   a command creat
17e0: 65 64 20 75 73 69 6e 67 20 5b 70 72 6f 63 5d 2e  ed using [proc].
17f0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
1800: 20 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 69 73   .** instance is
1810: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1820: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1830: 6f 20 74 68 65 20 70 72 6f 63 5f 63 61 6c 6c 32  o the proc_call2
1840: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
1850: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
1860: 72 6f 63 41 72 67 73 20 50 72 6f 63 41 72 67 73  rocArgs ProcArgs
1870: 3b 0a 73 74 72 75 63 74 20 50 72 6f 63 41 72 67  ;.struct ProcArg
1880: 73 20 7b 0a 20 20 69 6e 74 20 61 72 67 63 3b 0a  s {.  int argc;.
1890: 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2a    const uchar **
18a0: 61 72 67 76 3b 0a 20 20 69 6e 74 20 2a 61 72 67  argv;.  int *arg
18b0: 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  l;.};../*.** Eac
18c0: 68 20 74 69 6d 65 20 61 20 63 6f 6d 6d 61 6e 64  h time a command
18d0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 5b   created using [
18e0: 70 72 6f 63 5d 20 69 73 20 69 6e 76 6f 6b 65 64  proc] is invoked
18f0: 2c 20 61 20 6e 65 77 0a 2a 2a 20 74 68 31 20 73  , a new.** th1 s
1900: 74 61 63 6b 20 66 72 61 6d 65 20 69 73 20 61 6c  tack frame is al
1910: 6c 6f 63 61 74 65 64 20 28 66 6f 72 20 74 68 65  located (for the
1920: 20 70 72 6f 63 27 73 20 6c 6f 63 61 6c 20 76 61   proc's local va
1930: 72 69 61 62 6c 65 73 29 20 61 6e 64 0a 2a 2a 20  riables) and.** 
1940: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
1950: 76 6f 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  voked..**.** Arg
1960: 75 6d 65 6e 74 20 70 43 6f 6e 74 65 78 74 31 20  ument pContext1 
1970: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 61 73  points to the as
1980: 73 6f 63 69 61 74 65 64 20 50 72 6f 63 44 65 66  sociated ProcDef
1990: 6e 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  n structure..** 
19a0: 41 72 67 75 6d 65 6e 74 20 70 43 6f 6e 74 65 78  Argument pContex
19b0: 74 32 20 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t2  points to a 
19c0: 50 72 6f 63 41 72 67 73 20 73 74 72 75 63 74 75  ProcArgs structu
19d0: 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
19e0: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
19f0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
1a00: 20 73 70 65 63 69 66 69 63 20 69 6e 76 6f 63 61   specific invoca
1a10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 63  tion of the proc
1a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a30: 70 72 6f 63 5f 63 61 6c 6c 32 28 54 68 5f 49 6e  proc_call2(Th_In
1a40: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 76 6f  terp *interp, vo
1a50: 69 64 20 2a 70 43 6f 6e 74 65 78 74 31 2c 20 76  id *pContext1, v
1a60: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 32 29 7b  oid *pContext2){
1a70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 50 72 6f 63  .  int i;.  Proc
1a80: 44 65 66 6e 20 2a 70 20 3d 20 28 50 72 6f 63 44  Defn *p = (ProcD
1a90: 65 66 6e 20 2a 29 70 43 6f 6e 74 65 78 74 31 3b  efn *)pContext1;
1aa0: 0a 20 20 50 72 6f 63 41 72 67 73 20 2a 70 41 72  .  ProcArgs *pAr
1ab0: 67 73 20 3d 20 28 50 72 6f 63 41 72 67 73 20 2a  gs = (ProcArgs *
1ac0: 29 70 43 6f 6e 74 65 78 74 32 3b 0a 0a 20 20 2f  )pContext2;..  /
1ad0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65  * Check if there
1ae0: 20 61 72 65 20 74 68 65 20 72 69 67 68 74 20 6e   are the right n
1af0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1b00: 74 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ts. If there are
1b10: 0a 20 20 2a 2a 20 6e 6f 74 2c 20 67 65 6e 65 72  .  ** not, gener
1b20: 61 74 65 20 61 20 75 73 61 67 65 20 6d 65 73 73  ate a usage mess
1b30: 61 67 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  age for the comm
1b40: 61 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  and..  */.  if( 
1b50: 28 70 41 72 67 73 2d 3e 61 72 67 63 3e 28 70 2d  (pArgs->argc>(p-
1b60: 3e 6e 50 61 72 61 6d 2b 31 29 20 26 26 20 21 70  >nParam+1) && !p
1b70: 2d 3e 68 61 73 41 72 67 73 29 20 0a 20 20 20 7c  ->hasArgs) .   |
1b80: 7c 20 28 70 41 72 67 73 2d 3e 61 72 67 63 3c 3d  | (pArgs->argc<=
1b90: 28 70 2d 3e 6e 50 61 72 61 6d 29 20 26 26 20 21  (p->nParam) && !
1ba0: 70 2d 3e 61 7a 44 65 66 61 75 6c 74 5b 70 41 72  p->azDefault[pAr
1bb0: 67 73 2d 3e 61 72 67 63 2d 31 5d 29 0a 20 20 29  gs->argc-1]).  )
1bc0: 7b 0a 20 20 20 20 75 63 68 61 72 20 2a 7a 55 73  {.    uchar *zUs
1bd0: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  age = 0;.    int
1be0: 20 6e 55 73 61 67 65 20 3d 20 30 3b 0a 20 20 20   nUsage = 0;.   
1bf0: 20 54 68 5f 53 74 72 69 6e 67 41 70 70 65 6e 64   Th_StringAppend
1c00: 28 69 6e 74 65 72 70 2c 20 26 7a 55 73 61 67 65  (interp, &zUsage
1c10: 2c 20 26 6e 55 73 61 67 65 2c 20 70 41 72 67 73  , &nUsage, pArgs
1c20: 2d 3e 61 72 67 76 5b 30 5d 2c 20 70 41 72 67 73  ->argv[0], pArgs
1c30: 2d 3e 61 72 67 6c 5b 30 5d 29 3b 0a 20 20 20 20  ->argl[0]);.    
1c40: 54 68 5f 53 74 72 69 6e 67 41 70 70 65 6e 64 28  Th_StringAppend(
1c50: 69 6e 74 65 72 70 2c 20 26 7a 55 73 61 67 65 2c  interp, &zUsage,
1c60: 20 26 6e 55 73 61 67 65 2c 20 70 2d 3e 7a 55 73   &nUsage, p->zUs
1c70: 61 67 65 2c 20 70 2d 3e 6e 55 73 61 67 65 29 3b  age, p->nUsage);
1c80: 0a 20 20 20 20 54 68 5f 53 74 72 69 6e 67 41 70  .    Th_StringAp
1c90: 70 65 6e 64 28 69 6e 74 65 72 70 2c 20 26 7a 55  pend(interp, &zU
1ca0: 73 61 67 65 2c 20 26 6e 55 73 61 67 65 2c 20 28  sage, &nUsage, (
1cb0: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 29 22 22  const uchar *)""
1cc0: 2c 20 31 29 3b 0a 20 20 20 20 54 68 5f 57 72 6f  , 1);.    Th_Wro
1cd0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1ce0: 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 54  , zUsage);.    T
1cf0: 68 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 7a  h_Free(interp, z
1d00: 55 73 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  Usage);.    retu
1d10: 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d  rn TH_ERROR;.  }
1d20: 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20  ..  /* Populate 
1d30: 74 68 65 20 66 6f 72 6d 61 6c 20 70 72 6f 63 20  the formal proc 
1d40: 70 61 72 61 6d 65 74 65 72 73 2e 20 2a 2f 0a 20  parameters. */. 
1d50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1d60: 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  Param; i++){.   
1d70: 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 56   const uchar *zV
1d80: 61 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 56 61 6c  al;.    int nVal
1d90: 3b 0a 20 20 20 20 69 66 28 20 70 41 72 67 73 2d  ;.    if( pArgs-
1da0: 3e 61 72 67 63 3e 28 69 2b 31 29 20 29 7b 0a 20  >argc>(i+1) ){. 
1db0: 20 20 20 20 20 7a 56 61 6c 20 3d 20 70 41 72 67       zVal = pArg
1dc0: 73 2d 3e 61 72 67 76 5b 69 2b 31 5d 3b 0a 20 20  s->argv[i+1];.  
1dd0: 20 20 20 20 6e 56 61 6c 20 3d 20 70 41 72 67 73      nVal = pArgs
1de0: 2d 3e 61 72 67 6c 5b 69 2b 31 5d 3b 0a 20 20 20  ->argl[i+1];.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 56   }else{.      zV
1e00: 61 6c 20 3d 20 70 2d 3e 61 7a 44 65 66 61 75 6c  al = p->azDefaul
1e10: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 6e 56 61 6c  t[i];.      nVal
1e20: 20 3d 20 70 2d 3e 61 6e 44 65 66 61 75 6c 74 5b   = p->anDefault[
1e30: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 68  i];.    }.    Th
1e40: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
1e50: 70 2d 3e 61 7a 50 61 72 61 6d 5b 69 5d 2c 20 70  p->azParam[i], p
1e60: 2d 3e 61 6e 50 61 72 61 6d 5b 69 5d 2c 20 7a 56  ->anParam[i], zV
1e70: 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a 0a  al, nVal);.  }..
1e80: 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1e90: 65 20 22 61 72 67 73 22 20 70 61 72 61 6d 65 74  e "args" paramet
1ea0: 65 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  er, if it exists
1eb0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 68 61 73   */.  if( p->has
1ec0: 41 72 67 73 20 29 7b 0a 20 20 20 20 75 63 68 61  Args ){.    ucha
1ed0: 72 20 2a 7a 41 72 67 73 20 3d 20 30 3b 0a 20 20  r *zArgs = 0;.  
1ee0: 20 20 69 6e 74 20 6e 41 72 67 73 20 3d 20 30 3b    int nArgs = 0;
1ef0: 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 50  .    for(i=p->nP
1f00: 61 72 61 6d 2b 31 3b 20 69 3c 70 41 72 67 73 2d  aram+1; i<pArgs-
1f10: 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >argc; i++){.   
1f20: 20 20 20 54 68 5f 4c 69 73 74 41 70 70 65 6e 64     Th_ListAppend
1f30: 28 69 6e 74 65 72 70 2c 20 26 7a 41 72 67 73 2c  (interp, &zArgs,
1f40: 20 26 6e 41 72 67 73 2c 20 70 41 72 67 73 2d 3e   &nArgs, pArgs->
1f50: 61 72 67 76 5b 69 5d 2c 20 70 41 72 67 73 2d 3e  argv[i], pArgs->
1f60: 61 72 67 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  argl[i]);.    }.
1f70: 20 20 20 20 54 68 5f 53 65 74 56 61 72 28 69 6e      Th_SetVar(in
1f80: 74 65 72 70 2c 20 28 63 6f 6e 73 74 20 75 63 68  terp, (const uch
1f90: 61 72 20 2a 29 22 61 72 67 73 22 2c 20 2d 31 2c  ar *)"args", -1,
1fa0: 20 7a 41 72 67 73 2c 20 6e 41 72 67 73 29 3b 0a   zArgs, nArgs);.
1fb0: 20 20 7d 0a 0a 20 20 54 68 5f 53 65 74 52 65 73    }..  Th_SetRes
1fc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 30 2c 20 30  ult(interp, 0, 0
1fd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 68 5f 45  );.  return Th_E
1fe0: 76 61 6c 28 69 6e 74 65 72 70 2c 20 30 2c 20 70  val(interp, 0, p
1ff0: 2d 3e 7a 50 72 6f 67 72 61 6d 2c 20 70 2d 3e 6e  ->zProgram, p->n
2000: 50 72 6f 67 72 61 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  Program);.}../*.
2010: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2020: 20 69 73 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   is the command 
2030: 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
2040: 72 65 64 20 66 6f 72 20 61 6c 6c 20 63 6f 6d 6d  red for all comm
2050: 61 6e 64 73 0a 2a 2a 20 63 72 65 61 74 65 64 20  ands.** created 
2060: 75 73 69 6e 67 20 74 68 65 20 5b 70 72 6f 63 5d  using the [proc]
2070: 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 73 65   command. The se
2080: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 70  cond argument, p
2090: 43 6f 6e 74 65 78 74 2c 0a 2a 2a 20 69 73 20 61  Context,.** is a
20a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
20b0: 61 73 73 6f 63 69 61 74 65 64 20 50 72 6f 63 44  associated ProcD
20c0: 65 66 6e 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  efn structure..*
20d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
20e0: 63 5f 63 61 6c 6c 31 28 0a 20 20 54 68 5f 49 6e  c_call1(.  Th_In
20f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2100: 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20  void *pContext, 
2110: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20  .  int argc, .  
2120: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2a 61 72  const uchar **ar
2130: 67 76 2c 0a 20 20 69 6e 74 20 2a 61 72 67 6c 0a  gv,.  int *argl.
2140: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
2150: 50 72 6f 63 44 65 66 6e 20 2a 70 20 3d 20 28 50  ProcDefn *p = (P
2160: 72 6f 63 44 65 66 6e 20 2a 29 70 43 6f 6e 74 65  rocDefn *)pConte
2170: 78 74 3b 0a 20 20 50 72 6f 63 41 72 67 73 20 70  xt;.  ProcArgs p
2180: 72 6f 63 61 72 67 73 3b 0a 0a 20 20 2f 2a 20 43  rocargs;..  /* C
2190: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f  all function pro
21a0: 63 5f 63 61 6c 6c 32 28 29 2c 20 77 68 69 63 68  c_call2(), which
21b0: 20 77 69 6c 6c 20 63 61 6c 6c 20 54 68 5f 45 76   will call Th_Ev
21c0: 61 6c 28 29 20 74 6f 20 65 76 61 6c 75 61 74 65  al() to evaluate
21d0: 0a 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f  .  ** the body o
21e0: 66 20 74 68 65 20 5b 70 72 6f 63 5d 2c 20 69 6e  f the [proc], in
21f0: 20 61 20 6e 65 77 20 54 68 20 73 74 61 63 6b 20   a new Th stack 
2200: 66 72 61 6d 65 2e 20 54 68 69 73 20 69 73 20 73  frame. This is s
2210: 6f 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  o that.  ** the 
2220: 70 72 6f 63 20 62 6f 64 79 20 68 61 73 20 69 74  proc body has it
2230: 73 20 6f 77 6e 20 6c 6f 63 61 6c 20 76 61 72 69  s own local vari
2240: 61 62 6c 65 20 63 6f 6e 74 65 78 74 2e 0a 20 20  able context..  
2250: 2a 2f 0a 20 20 70 72 6f 63 61 72 67 73 2e 61 72  */.  procargs.ar
2260: 67 63 20 3d 20 61 72 67 63 3b 0a 20 20 70 72 6f  gc = argc;.  pro
2270: 63 61 72 67 73 2e 61 72 67 76 20 3d 20 61 72 67  cargs.argv = arg
2280: 76 3b 0a 20 20 70 72 6f 63 61 72 67 73 2e 61 72  v;.  procargs.ar
2290: 67 6c 20 3d 20 61 72 67 6c 3b 0a 20 20 72 63 20  gl = argl;.  rc 
22a0: 3d 20 54 68 5f 49 6e 46 72 61 6d 65 28 69 6e 74  = Th_InFrame(int
22b0: 65 72 70 2c 20 70 72 6f 63 5f 63 61 6c 6c 32 2c  erp, proc_call2,
22c0: 20 28 76 6f 69 64 20 2a 29 70 2c 20 28 76 6f 69   (void *)p, (voi
22d0: 64 20 2a 29 26 70 72 6f 63 61 72 67 73 29 3b 0a  d *)&procargs);.
22e0: 0a 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 52 45  .  if( rc==TH_RE
22f0: 54 55 52 4e 20 29 7b 0a 20 20 20 20 72 63 20 3d  TURN ){.    rc =
2300: 20 54 48 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65   TH_OK;.  }.  re
2310: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2320: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2330: 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 73  is registered as
2340: 20 74 68 65 20 64 65 6c 65 74 65 20 63 61 6c 6c   the delete call
2350: 62 61 63 6b 20 66 6f 72 20 61 6c 6c 20 63 6f 6d  back for all com
2360: 6d 61 6e 64 73 20 0a 2a 2a 20 63 72 65 61 74 65  mands .** create
2370: 64 20 75 73 69 6e 67 20 74 68 65 20 62 75 69 6c  d using the buil
2380: 74 2d 69 6e 20 5b 70 72 6f 63 5d 20 63 6f 6d 6d  t-in [proc] comm
2390: 61 6e 64 2e 20 49 74 20 69 73 20 63 61 6c 6c 65  and. It is calle
23a0: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
23b0: 0a 2a 2a 20 77 68 65 6e 20 61 20 63 6f 6d 6d 61  .** when a comma
23c0: 6e 64 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  nd created using
23d0: 20 5b 70 72 6f 63 5d 20 69 73 20 64 65 6c 65 74   [proc] is delet
23e0: 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 66 72  ed. .**.** It fr
23f0: 65 65 73 20 74 68 65 20 50 72 6f 63 44 65 66 6e  ees the ProcDefn
2400: 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63   structure alloc
2410: 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  ated when the co
2420: 6d 6d 61 6e 64 20 77 61 73 20 63 72 65 61 74 65  mmand was create
2430: 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  d..*/ .static vo
2440: 69 64 20 70 72 6f 63 5f 64 65 6c 28 54 68 5f 49  id proc_del(Th_I
2450: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 76  nterp *interp, v
2460: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 29 7b 0a  oid *pContext){.
2470: 20 20 50 72 6f 63 44 65 66 6e 20 2a 70 20 3d 20    ProcDefn *p = 
2480: 28 50 72 6f 63 44 65 66 6e 20 2a 29 70 43 6f 6e  (ProcDefn *)pCon
2490: 74 65 78 74 3b 0a 20 20 54 68 5f 46 72 65 65 28  text;.  Th_Free(
24a0: 69 6e 74 65 72 70 2c 20 28 76 6f 69 64 20 2a 29  interp, (void *)
24b0: 70 2d 3e 7a 55 73 61 67 65 29 3b 0a 20 20 54 68  p->zUsage);.  Th
24c0: 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 28 76  _Free(interp, (v
24d0: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 0a 2f 2a 0a  oid *)p);.}../*.
24e0: 2a 2a 20 54 48 20 53 79 6e 74 61 78 3a 20 0a 2a  ** TH Syntax: .*
24f0: 2a 0a 2a 2a 20 20 20 70 72 6f 63 20 6e 61 6d 65  *.**   proc name
2500: 20 61 72 67 6c 69 73 74 20 63 6f 64 65 0a 2a 2f   arglist code.*/
2510: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
2520: 5f 63 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49  _command(.  Th_I
2530: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
2540: 20 20 76 6f 69 64 20 2a 63 74 78 2c 20 0a 20 20    void *ctx, .  
2550: 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 6f 6e 73  int argc,.  cons
2560: 74 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c 20  t uchar **argv, 
2570: 0a 20 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a  .  int *argl.){.
2580: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2590: 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 50 72 6f 63   *zName;..  Proc
25a0: 44 65 66 6e 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  Defn *p;.  int n
25b0: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
25c0: 20 75 63 68 61 72 20 2a 7a 53 70 61 63 65 3b 0a   uchar *zSpace;.
25d0: 0a 20 20 75 63 68 61 72 20 2a 2a 61 7a 50 61 72  .  uchar **azPar
25e0: 61 6d 3b 0a 20 20 69 6e 74 20 2a 61 6e 50 61 72  am;.  int *anPar
25f0: 61 6d 3b 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d  am;.  int nParam
2600: 3b 0a 0a 20 20 75 63 68 61 72 20 2a 7a 55 73 61  ;..  uchar *zUsa
2610: 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
2620: 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75        /* Build u
2630: 70 20 61 20 75 73 61 67 65 20 6d 65 73 73 61 67  p a usage messag
2640: 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
2650: 6e 55 73 61 67 65 20 3d 20 30 3b 20 20 20 20 20  nUsage = 0;     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2670: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2680: 61 74 20 7a 55 73 61 67 65 20 2a 2f 0a 0a 20 20  at zUsage */..  
2690: 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20  if( argc!=4 ){. 
26a0: 20 20 20 72 65 74 75 72 6e 20 54 68 5f 57 72 6f     return Th_Wro
26b0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
26c0: 2c 20 22 70 72 6f 63 20 6e 61 6d 65 20 61 72 67  , "proc name arg
26d0: 6c 69 73 74 20 63 6f 64 65 22 29 3b 0a 20 20 7d  list code");.  }
26e0: 0a 20 20 69 66 28 20 54 68 5f 53 70 6c 69 74 4c  .  if( Th_SplitL
26f0: 69 73 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ist(interp, argv
2700: 5b 32 5d 2c 20 61 72 67 6c 5b 32 5d 2c 20 26 61  [2], argl[2], &a
2710: 7a 50 61 72 61 6d 2c 20 26 61 6e 50 61 72 61 6d  zParam, &anParam
2720: 2c 20 26 6e 50 61 72 61 6d 29 20 29 7b 0a 20 20  , &nParam) ){.  
2730: 20 20 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f    return TH_ERRO
2740: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  R;.  }..  /* All
2750: 6f 63 61 74 65 20 74 68 65 20 6e 65 77 20 50 72  ocate the new Pr
2760: 6f 63 44 65 66 6e 20 73 74 72 75 63 74 75 72 65  ocDefn structure
2770: 2e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  . */.  nByte = s
2780: 69 7a 65 6f 66 28 50 72 6f 63 44 65 66 6e 29 20  izeof(ProcDefn) 
2790: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 63           /* Proc
27b0: 44 65 66 6e 20 73 74 72 75 63 74 75 72 65 20 2a  Defn structure *
27c0: 2f 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  /.      (sizeof(
27d0: 75 63 68 61 72 20 2a 29 20 2b 20 73 69 7a 65 6f  uchar *) + sizeo
27e0: 66 28 69 6e 74 29 29 20 2a 20 6e 50 61 72 61 6d  f(int)) * nParam
27f0: 20 2b 20 20 20 20 2f 2a 20 61 7a 50 61 72 61 6d   +    /* azParam
2800: 2c 20 61 6e 50 61 72 61 6d 20 2a 2f 0a 20 20 20  , anParam */.   
2810: 20 20 20 28 73 69 7a 65 6f 66 28 75 63 68 61 72     (sizeof(uchar
2820: 20 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74   *) + sizeof(int
2830: 29 29 20 2a 20 6e 50 61 72 61 6d 20 2b 20 20 20  )) * nParam +   
2840: 20 2f 2a 20 61 7a 44 65 66 61 75 6c 74 2c 20 61   /* azDefault, a
2850: 6e 44 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20  nDefault */.    
2860: 20 20 61 72 67 6c 5b 33 5d 20 2b 20 20 20 20 20    argl[3] +     
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 2f 2a 20 7a 50 72 6f 67 72 61 6d 20 2a 2f 0a 20  /* zProgram */. 
28a0: 20 20 20 20 20 61 72 67 6c 5b 32 5d 3b 20 20 20       argl[2];   
28b0: 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
28c0: 6f 70 69 65 73 20 6f 66 20 70 61 72 61 6d 65 74  opies of paramet
28d0: 65 72 20 6e 61 6d 65 73 20 61 6e 64 20 64 65 66  er names and def
28e0: 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  ault values */. 
28f0: 20 70 20 3d 20 28 50 72 6f 63 44 65 66 6e 20 2a   p = (ProcDefn *
2900: 29 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 72  )Th_Malloc(inter
2910: 70 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 2f 2a  p, nByte);..  /*
2920: 20 49 66 20 74 68 65 20 6c 61 73 74 20 70 61 72   If the last par
2930: 61 6d 65 74 65 72 20 69 6e 20 74 68 65 20 70 61  ameter in the pa
2940: 72 61 6d 65 74 65 72 20 6c 69 73 74 20 69 73 20  rameter list is 
2950: 22 61 72 67 73 22 2c 20 74 68 65 6e 20 73 65 74  "args", then set
2960: 20 74 68 65 0a 20 20 2a 2a 20 50 72 6f 63 44 65   the.  ** ProcDe
2970: 66 6e 2e 68 61 73 41 72 67 73 20 66 6c 61 67 2e  fn.hasArgs flag.
2980: 20 54 68 65 20 22 61 72 67 73 22 20 70 61 72 61   The "args" para
2990: 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 72  meter does not r
29a0: 65 71 75 69 72 65 20 61 6e 0a 20 20 2a 2a 20 65  equire an.  ** e
29b0: 6e 74 72 79 20 69 6e 20 74 68 65 20 50 72 6f 63  ntry in the Proc
29c0: 44 65 66 6e 2e 61 7a 50 61 72 61 6d 5b 5d 20 6f  Defn.azParam[] o
29d0: 72 20 50 72 6f 63 44 65 66 6e 2e 61 7a 44 65 66  r ProcDefn.azDef
29e0: 61 75 6c 74 5b 5d 20 61 72 72 61 79 73 2e 0a 20  ault[] arrays.. 
29f0: 20 2a 2f 0a 20 20 69 66 28 20 61 6e 50 61 72 61   */.  if( anPara
2a00: 6d 5b 6e 50 61 72 61 6d 2d 31 5d 3d 3d 34 20 26  m[nParam-1]==4 &
2a10: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 7a 50 61  & 0==memcmp(azPa
2a20: 72 61 6d 5b 6e 50 61 72 61 6d 2d 31 5d 2c 20 22  ram[nParam-1], "
2a30: 61 72 67 73 22 2c 20 34 29 20 29 7b 0a 20 20 20  args", 4) ){.   
2a40: 20 70 2d 3e 68 61 73 41 72 67 73 20 3d 20 31 3b   p->hasArgs = 1;
2a50: 0a 20 20 20 20 6e 50 61 72 61 6d 2d 2d 3b 0a 20  .    nParam--;. 
2a60: 20 7d 0a 0a 20 20 70 2d 3e 6e 50 61 72 61 6d 20   }..  p->nParam 
2a70: 20 20 20 3d 20 6e 50 61 72 61 6d 3b 0a 20 20 70     = nParam;.  p
2a80: 2d 3e 61 7a 50 61 72 61 6d 20 20 20 3d 20 28 75  ->azParam   = (u
2a90: 63 68 61 72 20 2a 2a 29 26 70 5b 31 5d 3b 0a 20  char **)&p[1];. 
2aa0: 20 70 2d 3e 61 6e 50 61 72 61 6d 20 20 20 3d 20   p->anParam   = 
2ab0: 28 69 6e 74 20 2a 29 26 70 2d 3e 61 7a 50 61 72  (int *)&p->azPar
2ac0: 61 6d 5b 6e 50 61 72 61 6d 5d 3b 0a 20 20 70 2d  am[nParam];.  p-
2ad0: 3e 61 7a 44 65 66 61 75 6c 74 20 3d 20 28 75 63  >azDefault = (uc
2ae0: 68 61 72 20 2a 2a 29 26 70 2d 3e 61 6e 50 61 72  har **)&p->anPar
2af0: 61 6d 5b 6e 50 61 72 61 6d 5d 3b 0a 20 20 70 2d  am[nParam];.  p-
2b00: 3e 61 6e 44 65 66 61 75 6c 74 20 3d 20 28 69 6e  >anDefault = (in
2b10: 74 20 2a 29 26 70 2d 3e 61 7a 44 65 66 61 75 6c  t *)&p->azDefaul
2b20: 74 5b 6e 50 61 72 61 6d 5d 3b 0a 20 20 70 2d 3e  t[nParam];.  p->
2b30: 7a 50 72 6f 67 72 61 6d 20 3d 20 28 75 63 68 61  zProgram = (ucha
2b40: 72 20 2a 29 26 70 2d 3e 61 6e 44 65 66 61 75 6c  r *)&p->anDefaul
2b50: 74 5b 6e 50 61 72 61 6d 5d 3b 0a 20 20 6d 65 6d  t[nParam];.  mem
2b60: 63 70 79 28 70 2d 3e 7a 50 72 6f 67 72 61 6d 2c  cpy(p->zProgram,
2b70: 20 61 72 67 76 5b 33 5d 2c 20 61 72 67 6c 5b 33   argv[3], argl[3
2b80: 5d 29 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 61  ]);.  p->nProgra
2b90: 6d 20 3d 20 61 72 67 6c 5b 33 5d 3b 0a 20 20 7a  m = argl[3];.  z
2ba0: 53 70 61 63 65 20 3d 20 26 70 2d 3e 7a 50 72 6f  Space = &p->zPro
2bb0: 67 72 61 6d 5b 70 2d 3e 6e 50 72 6f 67 72 61 6d  gram[p->nProgram
2bc0: 5d 3b 0a 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b  ];.  .  for(i=0;
2bd0: 20 69 3c 6e 50 61 72 61 6d 3b 20 69 2b 2b 29 7b   i<nParam; i++){
2be0: 0a 20 20 20 20 75 63 68 61 72 20 2a 2a 61 7a 3b  .    uchar **az;
2bf0: 0a 20 20 20 20 69 6e 74 20 2a 61 6e 3b 0a 20 20  .    int *an;.  
2c00: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
2c10: 20 54 68 5f 53 70 6c 69 74 4c 69 73 74 28 69 6e   Th_SplitList(in
2c20: 74 65 72 70 2c 20 61 7a 50 61 72 61 6d 5b 69 5d  terp, azParam[i]
2c30: 2c 20 61 6e 50 61 72 61 6d 5b 69 5d 2c 20 26 61  , anParam[i], &a
2c40: 7a 2c 20 26 61 6e 2c 20 26 6e 29 20 29 7b 0a 20  z, &an, &n) ){. 
2c50: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
2c60: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
2c70: 66 28 20 6e 3c 31 20 7c 7c 20 6e 3e 32 20 29 7b  f( n<1 || n>2 ){
2c80: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2c90: 72 20 65 78 70 65 63 74 65 64 5b 5d 20 3d 20 22  r expected[] = "
2ca0: 65 78 70 65 63 74 65 64 20 70 61 72 61 6d 65 74  expected paramet
2cb0: 65 72 2c 20 67 6f 74 20 5c 22 22 3b 0a 20 20 20  er, got \"";.   
2cc0: 20 20 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61     Th_ErrorMessa
2cd0: 67 65 28 69 6e 74 65 72 70 2c 20 65 78 70 65 63  ge(interp, expec
2ce0: 74 65 64 2c 20 61 7a 50 61 72 61 6d 5b 69 5d 2c  ted, azParam[i],
2cf0: 20 61 6e 50 61 72 61 6d 5b 69 5d 29 3b 0a 20 20   anParam[i]);.  
2d00: 20 20 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65      Th_Free(inte
2d10: 72 70 2c 20 61 7a 29 3b 0a 20 20 20 20 20 20 67  rp, az);.      g
2d20: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
2d30: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 6e 50 61     }.    p->anPa
2d40: 72 61 6d 5b 69 5d 20 3d 20 61 6e 5b 30 5d 3b 0a  ram[i] = an[0];.
2d50: 20 20 20 20 70 2d 3e 61 7a 50 61 72 61 6d 5b 69      p->azParam[i
2d60: 5d 20 3d 20 7a 53 70 61 63 65 3b 0a 20 20 20 20  ] = zSpace;.    
2d70: 6d 65 6d 63 70 79 28 7a 53 70 61 63 65 2c 20 61  memcpy(zSpace, a
2d80: 7a 5b 30 5d 2c 20 61 6e 5b 30 5d 29 3b 0a 20 20  z[0], an[0]);.  
2d90: 20 20 7a 53 70 61 63 65 20 2b 3d 20 61 6e 5b 30    zSpace += an[0
2da0: 5d 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 32 20  ];.    if( n==2 
2db0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 6e 44 65  ){.      p->anDe
2dc0: 66 61 75 6c 74 5b 69 5d 20 3d 20 61 6e 5b 31 5d  fault[i] = an[1]
2dd0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 44 65 66  ;.      p->azDef
2de0: 61 75 6c 74 5b 69 5d 20 3d 20 7a 53 70 61 63 65  ault[i] = zSpace
2df0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
2e00: 53 70 61 63 65 2c 20 61 7a 5b 31 5d 2c 20 61 6e  Space, az[1], an
2e10: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7a 53 70 61  [1]);.      zSpa
2e20: 63 65 20 2b 3d 20 61 6e 5b 31 5d 3b 0a 20 20 20  ce += an[1];.   
2e30: 20 7d 0a 0a 20 20 20 20 54 68 5f 53 74 72 69 6e   }..    Th_Strin
2e40: 67 41 70 70 65 6e 64 28 69 6e 74 65 72 70 2c 20  gAppend(interp, 
2e50: 26 7a 55 73 61 67 65 2c 20 26 6e 55 73 61 67 65  &zUsage, &nUsage
2e60: 2c 20 28 63 6f 6e 73 74 20 75 63 68 61 72 20 2a  , (const uchar *
2e70: 29 22 20 22 2c 20 31 29 3b 0a 20 20 20 20 69 66  )" ", 1);.    if
2e80: 28 20 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ( n==2 ){.      
2e90: 54 68 5f 53 74 72 69 6e 67 41 70 70 65 6e 64 28  Th_StringAppend(
2ea0: 69 6e 74 65 72 70 2c 20 26 7a 55 73 61 67 65 2c  interp, &zUsage,
2eb0: 20 26 6e 55 73 61 67 65 2c 20 28 63 6f 6e 73 74   &nUsage, (const
2ec0: 20 75 63 68 61 72 20 2a 29 22 3f 22 2c 20 31 29   uchar *)"?", 1)
2ed0: 3b 0a 20 20 20 20 20 20 54 68 5f 53 74 72 69 6e  ;.      Th_Strin
2ee0: 67 41 70 70 65 6e 64 28 69 6e 74 65 72 70 2c 20  gAppend(interp, 
2ef0: 26 7a 55 73 61 67 65 2c 20 26 6e 55 73 61 67 65  &zUsage, &nUsage
2f00: 2c 20 61 7a 5b 30 5d 2c 20 61 6e 5b 30 5d 29 3b  , az[0], an[0]);
2f10: 0a 20 20 20 20 20 20 54 68 5f 53 74 72 69 6e 67  .      Th_String
2f20: 41 70 70 65 6e 64 28 69 6e 74 65 72 70 2c 20 26  Append(interp, &
2f30: 7a 55 73 61 67 65 2c 20 26 6e 55 73 61 67 65 2c  zUsage, &nUsage,
2f40: 20 28 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 29   (const uchar *)
2f50: 22 3f 22 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  "?", 1);.    }el
2f60: 73 65 7b 0a 20 20 20 20 20 20 54 68 5f 53 74 72  se{.      Th_Str
2f70: 69 6e 67 41 70 70 65 6e 64 28 69 6e 74 65 72 70  ingAppend(interp
2f80: 2c 20 26 7a 55 73 61 67 65 2c 20 26 6e 55 73 61  , &zUsage, &nUsa
2f90: 67 65 2c 20 61 7a 5b 30 5d 2c 20 61 6e 5b 30 5d  ge, az[0], an[0]
2fa0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 68  );.    }..    Th
2fb0: 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 61 7a  _Free(interp, az
2fc0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
2fd0: 20 7a 53 70 61 63 65 2d 28 75 63 68 61 72 20 2a   zSpace-(uchar *
2fe0: 29 70 3c 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20  )p<=nByte );..  
2ff0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
3000: 6e 20 22 61 72 67 73 22 20 70 61 72 61 6d 65 74  n "args" paramet
3010: 65 72 2c 20 61 70 70 65 6e 64 20 69 74 20 74 6f  er, append it to
3020: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3030: 75 73 61 67 65 0a 20 20 2a 2a 20 6d 65 73 73 61  usage.  ** messa
3040: 67 65 2e 20 53 65 74 20 50 72 6f 63 44 65 66 6e  ge. Set ProcDefn
3050: 2e 7a 55 73 61 67 65 20 74 6f 20 70 6f 69 6e 74  .zUsage to point
3060: 20 61 74 20 74 68 65 20 75 73 61 67 65 20 6d 65   at the usage me
3070: 73 73 61 67 65 2e 20 49 74 20 77 69 6c 6c 0a 20  ssage. It will. 
3080: 20 2a 2a 20 62 65 20 66 72 65 65 64 20 61 6c 6f   ** be freed alo
3090: 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ng with the rest
30a0: 20 6f 66 20 74 68 65 20 70 72 6f 63 2d 64 65 66   of the proc-def
30b0: 69 6e 69 74 69 6f 6e 20 62 79 20 70 72 6f 63 5f  inition by proc_
30c0: 64 65 6c 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  del()..  */.  if
30d0: 28 20 70 2d 3e 68 61 73 41 72 67 73 20 29 7b 0a  ( p->hasArgs ){.
30e0: 20 20 20 20 54 68 5f 53 74 72 69 6e 67 41 70 70      Th_StringApp
30f0: 65 6e 64 28 69 6e 74 65 72 70 2c 20 26 7a 55 73  end(interp, &zUs
3100: 61 67 65 2c 20 26 6e 55 73 61 67 65 2c 20 28 63  age, &nUsage, (c
3110: 6f 6e 73 74 20 75 63 68 61 72 20 2a 29 22 20 3f  onst uchar *)" ?
3120: 61 72 67 73 2e 2e 2e 3f 22 2c 20 2d 31 29 3b 0a  args...?", -1);.
3130: 20 20 7d 0a 20 20 70 2d 3e 7a 55 73 61 67 65 20    }.  p->zUsage 
3140: 3d 20 7a 55 73 61 67 65 3b 0a 20 20 70 2d 3e 6e  = zUsage;.  p->n
3150: 55 73 61 67 65 20 3d 20 6e 55 73 61 67 65 3b 0a  Usage = nUsage;.
3160: 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
3170: 68 65 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 77  he new command w
3180: 69 74 68 20 74 68 65 20 74 68 31 20 69 6e 74 65  ith the th1 inte
3190: 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 7a 4e  rpreter. */.  zN
31a0: 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 61 72  ame = (char *)ar
31b0: 67 76 5b 31 5d 3b 0a 20 20 72 63 20 3d 20 54 68  gv[1];.  rc = Th
31c0: 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
31d0: 6e 74 65 72 70 2c 20 7a 4e 61 6d 65 2c 20 70 72  nterp, zName, pr
31e0: 6f 63 5f 63 61 6c 6c 31 2c 20 28 76 6f 69 64 20  oc_call1, (void 
31f0: 2a 29 70 2c 20 70 72 6f 63 5f 64 65 6c 29 3b 0a  *)p, proc_del);.
3200: 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20    if( rc==TH_OK 
3210: 29 7b 0a 20 20 20 20 54 68 5f 53 65 74 52 65 73  ){.    Th_SetRes
3220: 75 6c 74 28 69 6e 74 65 72 70 2c 20 30 2c 20 30  ult(interp, 0, 0
3230: 29 3b 0a 20 20 7d 0a 0a 20 20 54 68 5f 46 72 65  );.  }..  Th_Fre
3240: 65 28 69 6e 74 65 72 70 2c 20 61 7a 50 61 72 61  e(interp, azPara
3250: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 48 5f  m);.  return TH_
3260: 4f 4b 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a  OK;.. error_out:
3270: 0a 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 72  .  Th_Free(inter
3280: 70 2c 20 61 7a 50 61 72 61 6d 29 3b 0a 20 20 54  p, azParam);.  T
3290: 68 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 7a  h_Free(interp, z
32a0: 55 73 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  Usage);.  return
32b0: 20 54 48 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a   TH_ERROR;.}../*
32c0: 0a 2a 2a 20 54 48 20 53 79 6e 74 61 78 3a 20 0a  .** TH Syntax: .
32d0: 2a 2a 0a 2a 2a 20 20 20 72 65 6e 61 6d 65 20 6f  **.**   rename o
32e0: 6c 64 63 6d 64 20 6e 65 77 63 6d 64 0a 2a 2f 0a  ldcmd newcmd.*/.
32f0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6e 61 6d  static int renam
3300: 65 5f 63 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f  e_command(.  Th_
3310: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3320: 0a 20 20 76 6f 69 64 20 2a 63 74 78 2c 20 0a 20  .  void *ctx, . 
3330: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 6f 6e   int argc,.  con
3340: 73 74 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c  st uchar **argv,
3350: 20 0a 20 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b   .  int *argl.){
3360: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
3370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 68 5f  {.    return Th_
3380: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
3390: 65 72 70 2c 20 22 72 65 6e 61 6d 65 20 6f 6c 64  erp, "rename old
33a0: 63 6d 64 20 6e 65 77 63 6d 64 22 29 3b 0a 20 20  cmd newcmd");.  
33b0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 68 5f 52 65  }.  return Th_Re
33c0: 6e 61 6d 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  nameCommand(inte
33d0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67  rp, argv[1], arg
33e0: 6c 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 2c 20 61  l[1], argv[2], a
33f0: 72 67 6c 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rgl[2]);.}../*.*
3400: 2a 20 54 48 20 53 79 6e 74 61 78 3a 20 0a 2a 2a  * TH Syntax: .**
3410: 0a 2a 2a 20 20 20 62 72 65 61 6b 20 20 20 20 3f  .**   break    ?
3420: 76 61 6c 75 65 2e 2e 2e 3f 0a 2a 2a 20 20 20 63  value...?.**   c
3430: 6f 6e 74 69 6e 75 65 20 3f 76 61 6c 75 65 2e 2e  ontinue ?value..
3440: 2e 3f 0a 2a 2a 20 20 20 6f 6b 20 20 20 20 20 20  .?.**   ok      
3450: 20 3f 76 61 6c 75 65 2e 2e 2e 3f 0a 2a 2a 20 20   ?value...?.**  
3460: 20 65 72 72 6f 72 20 20 20 20 3f 76 61 6c 75 65   error    ?value
3470: 2e 2e 2e 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ...?.*/.static i
3480: 6e 74 20 73 69 6d 70 6c 65 5f 63 6f 6d 6d 61 6e  nt simple_comman
3490: 64 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a  d(.  Th_Interp *
34a0: 69 6e 74 65 72 70 2c 20 0a 20 20 76 6f 69 64 20  interp, .  void 
34b0: 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 61 72 67  *ctx, .  int arg
34c0: 63 2c 20 0a 20 20 63 6f 6e 73 74 20 75 63 68 61  c, .  const ucha
34d0: 72 20 2a 2a 61 72 67 76 2c 20 0a 20 20 69 6e 74  r **argv, .  int
34e0: 20 2a 61 72 67 6c 0a 29 7b 0a 20 20 69 66 28 20   *argl.){.  if( 
34f0: 61 72 67 63 21 3d 31 20 26 26 20 61 72 67 63 21  argc!=1 && argc!
3500: 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =2 ){.    return
3510: 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73   Th_WrongNumArgs
3520: 28 69 6e 74 65 72 70 2c 20 22 72 65 74 75 72 6e  (interp, "return
3530: 20 3f 76 61 6c 75 65 3f 22 29 3b 0a 20 20 7d 0a   ?value?");.  }.
3540: 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b    if( argc==2 ){
3550: 0a 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c  .    Th_SetResul
3560: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
3570: 5d 2c 20 61 72 67 6c 5b 31 5d 29 3b 0a 20 20 7d  ], argl[1]);.  }
3580: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 63  .  return (int)c
3590: 74 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48 20  tx;.}../*.** TH 
35a0: 53 79 6e 74 61 78 3a 20 0a 2a 2a 0a 2a 2a 20 20  Syntax: .**.**  
35b0: 20 72 65 74 75 72 6e 20 3f 2d 63 6f 64 65 20 63   return ?-code c
35c0: 6f 64 65 3f 20 3f 76 61 6c 75 65 3f 0a 2a 2f 0a  ode? ?value?.*/.
35d0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 74 75 72  static int retur
35e0: 6e 5f 63 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f  n_command(.  Th_
35f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3600: 0a 20 20 76 6f 69 64 20 2a 63 74 78 2c 20 0a 20  .  void *ctx, . 
3610: 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 63 6f   int argc, .  co
3620: 6e 73 74 20 75 63 68 61 72 20 2a 2a 61 72 67 76  nst uchar **argv
3630: 2c 20 0a 20 20 69 6e 74 20 2a 61 72 67 6c 0a 29  , .  int *argl.)
3640: 7b 0a 20 20 69 6e 74 20 69 43 6f 64 65 20 3d 20  {.  int iCode = 
3650: 54 48 5f 52 45 54 55 52 4e 3b 0a 20 20 69 66 28  TH_RETURN;.  if(
3660: 20 61 72 67 63 3c 31 20 7c 7c 20 61 72 67 63 3e   argc<1 || argc>
3670: 34 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  4 ){.    return 
3680: 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  Th_WrongNumArgs(
3690: 69 6e 74 65 72 70 2c 20 22 72 65 74 75 72 6e 20  interp, "return 
36a0: 3f 2d 63 6f 64 65 20 63 6f 64 65 3f 20 3f 76 61  ?-code code? ?va
36b0: 6c 75 65 3f 22 29 3b 0a 20 20 7d 0a 20 20 69 66  lue?");.  }.  if
36c0: 28 20 61 72 67 63 3e 32 20 29 7b 0a 20 20 20 20  ( argc>2 ){.    
36d0: 69 6e 74 20 72 63 20 3d 20 54 68 5f 54 6f 49 6e  int rc = Th_ToIn
36e0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
36f0: 5d 2c 20 61 72 67 6c 5b 32 5d 2c 20 26 69 43 6f  ], argl[2], &iCo
3700: 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
3710: 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  =TH_OK ){.      
3720: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
3730: 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3d  .  }.  if( argc=
3740: 3d 32 20 7c 7c 20 61 72 67 63 3d 3d 34 20 29 7b  =2 || argc==4 ){
3750: 0a 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c  .    Th_SetResul
3760: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 61  t(interp, argv[a
3770: 72 67 63 2d 31 5d 2c 20 61 72 67 6c 5b 61 72 67  rgc-1], argl[arg
3780: 63 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  c-1]);.  }.  ret
3790: 75 72 6e 20 69 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urn iCode;.}../*
37a0: 0a 2a 2a 20 54 48 20 53 79 6e 74 61 78 3a 0a 2a  .** TH Syntax:.*
37b0: 2a 0a 2a 2a 20 20 20 73 74 72 69 6e 67 20 63 6f  *.**   string co
37c0: 6d 70 61 72 65 20 53 54 52 49 4e 47 31 20 53 54  mpare STRING1 ST
37d0: 52 49 4e 47 32 0a 2a 2f 0a 73 74 61 74 69 63 20  RING2.*/.static 
37e0: 69 6e 74 20 73 74 72 69 6e 67 5f 63 6f 6d 70 61  int string_compa
37f0: 72 65 5f 63 6f 6d 6d 61 6e 64 28 0a 20 20 54 68  re_command(.  Th
3800: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3810: 20 76 6f 69 64 20 2a 63 74 78 2c 20 69 6e 74 20   void *ctx, int 
3820: 61 72 67 63 2c 20 63 6f 6e 73 74 20 75 63 68 61  argc, const ucha
3830: 72 20 2a 2a 61 72 67 76 2c 20 69 6e 74 20 2a 61  r **argv, int *a
3840: 72 67 6c 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgl.){.  const u
3850: 63 68 61 72 20 2a 7a 52 69 67 68 74 3b 20 69 6e  char *zRight; in
3860: 74 20 6e 52 69 67 68 74 3b 0a 20 20 63 6f 6e 73  t nRight;.  cons
3870: 74 20 75 63 68 61 72 20 2a 7a 4c 65 66 74 3b 20  t uchar *zLeft; 
3880: 69 6e 74 20 6e 4c 65 66 74 3b 0a 0a 20 20 69 6e  int nLeft;..  in
3890: 74 20 69 3b 0a 20 20 69 6e 74 20 69 52 65 73 20  t i;.  int iRes 
38a0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  = 0;..  if( argc
38b0: 21 3d 34 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=4 ){.    retur
38c0: 6e 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  n Th_WrongNumArg
38d0: 73 28 69 6e 74 65 72 70 2c 20 22 73 74 72 69 6e  s(interp, "strin
38e0: 67 20 63 6f 6d 70 61 72 65 20 73 74 72 31 20 73  g compare str1 s
38f0: 74 72 32 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 4c  tr2");.  }..  zL
3900: 65 66 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  eft = argv[2];. 
3910: 20 6e 4c 65 66 74 20 3d 20 61 72 67 6c 5b 32 5d   nLeft = argl[2]
3920: 3b 0a 20 20 7a 52 69 67 68 74 20 3d 20 61 72 67  ;.  zRight = arg
3930: 76 5b 33 5d 3b 0a 20 20 6e 52 69 67 68 74 20 3d  v[3];.  nRight =
3940: 20 61 72 67 6c 5b 33 5d 3b 0a 0a 20 20 66 6f 72   argl[3];..  for
3950: 28 69 3d 30 3b 20 69 52 65 73 3d 3d 30 20 26 26  (i=0; iRes==0 &&
3960: 20 69 3c 6e 4c 65 66 74 20 26 26 20 69 3c 6e 52   i<nLeft && i<nR
3970: 69 67 68 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ight; i++){.    
3980: 69 52 65 73 20 3d 20 7a 4c 65 66 74 5b 69 5d 2d  iRes = zLeft[i]-
3990: 7a 52 69 67 68 74 5b 69 5d 3b 0a 20 20 7d 0a 20  zRight[i];.  }. 
39a0: 20 69 66 28 20 69 52 65 73 3d 3d 30 20 29 7b 0a   if( iRes==0 ){.
39b0: 20 20 20 20 69 52 65 73 20 3d 20 6e 4c 65 66 74      iRes = nLeft
39c0: 2d 6e 52 69 67 68 74 3b 0a 20 20 7d 0a 0a 20 20  -nRight;.  }..  
39d0: 69 66 28 20 69 52 65 73 3c 30 20 29 20 69 52 65  if( iRes<0 ) iRe
39e0: 73 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 69 52  s = -1;.  if( iR
39f0: 65 73 3e 30 20 29 20 69 52 65 73 20 3d 20 31 3b  es>0 ) iRes = 1;
3a00: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 54 68 5f  .  .  return Th_
3a10: 53 65 74 52 65 73 75 6c 74 49 6e 74 28 69 6e 74  SetResultInt(int
3a20: 65 72 70 2c 20 69 52 65 73 29 3b 0a 7d 0a 0a 2f  erp, iRes);.}../
3a30: 2a 0a 2a 2a 20 54 48 20 53 79 6e 74 61 78 3a 0a  *.** TH Syntax:.
3a40: 2a 2a 0a 2a 2a 20 20 20 73 74 72 69 6e 67 20 66  **.**   string f
3a50: 69 72 73 74 20 4e 45 45 44 4c 45 20 48 41 59 53  irst NEEDLE HAYS
3a60: 54 41 43 4b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TACK.*/.static i
3a70: 6e 74 20 73 74 72 69 6e 67 5f 66 69 72 73 74 5f  nt string_first_
3a80: 63 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e  command(.  Th_In
3a90: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 76 6f  terp *interp, vo
3aa0: 69 64 20 2a 63 74 78 2c 20 69 6e 74 20 61 72 67  id *ctx, int arg
3ab0: 63 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a  c, const uchar *
3ac0: 2a 61 72 67 76 2c 20 69 6e 74 20 2a 61 72 67 6c  *argv, int *argl
3ad0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 63 68 61  .){.  const ucha
3ae0: 72 20 2a 7a 4e 65 65 64 6c 65 3b 0a 20 20 69 6e  r *zNeedle;.  in
3af0: 74 20 6e 4e 65 65 64 6c 65 3b 0a 20 20 63 6f 6e  t nNeedle;.  con
3b00: 73 74 20 75 63 68 61 72 20 2a 7a 48 61 79 73 74  st uchar *zHayst
3b10: 61 63 6b 3b 0a 20 20 69 6e 74 20 6e 48 61 79 73  ack;.  int nHays
3b20: 74 61 63 6b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  tack;.  int i;. 
3b30: 20 69 6e 74 20 69 52 65 73 3b 0a 0a 20 20 69 66   int iRes;..  if
3b40: 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20  ( argc!=4 ){.   
3b50: 20 72 65 74 75 72 6e 20 54 68 5f 57 72 6f 6e 67   return Th_Wrong
3b60: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
3b70: 22 73 74 72 69 6e 67 20 66 69 72 73 74 20 6e 65  "string first ne
3b80: 65 64 6c 65 20 68 61 79 73 74 61 63 6b 22 29 3b  edle haystack");
3b90: 0a 20 20 7d 0a 0a 20 20 7a 4e 65 65 64 6c 65 20  .  }..  zNeedle 
3ba0: 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4e 65  = argv[2];.  nNe
3bb0: 65 64 6c 65 20 3d 20 61 72 67 6c 5b 32 5d 3b 0a  edle = argl[2];.
3bc0: 20 20 7a 48 61 79 73 74 61 63 6b 20 3d 20 61 72    zHaystack = ar
3bd0: 67 76 5b 33 5d 3b 0a 20 20 6e 48 61 79 73 74 61  gv[3];.  nHaysta
3be0: 63 6b 20 3d 20 61 72 67 6c 5b 33 5d 3b 0a 0a 20  ck = argl[3];.. 
3bf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 48 61   for(i=0; i<(nHa
3c00: 79 73 74 61 63 6b 2d 6e 4e 65 65 64 6c 65 29 3b  ystack-nNeedle);
3c10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30   i++){.    if( 0
3c20: 3d 3d 6d 65 6d 63 6d 70 28 7a 4e 65 65 64 6c 65  ==memcmp(zNeedle
3c30: 2c 20 26 7a 48 61 79 73 74 61 63 6b 5b 69 5d 2c  , &zHaystack[i],
3c40: 20 6e 4e 65 65 64 6c 65 29 20 29 7b 0a 20 20 20   nNeedle) ){.   
3c50: 20 20 20 69 52 65 73 20 3d 20 69 3b 0a 20 20 20     iRes = i;.   
3c60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3c70: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
3c80: 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 28  Th_SetResultInt(
3c90: 69 6e 74 65 72 70 2c 20 69 52 65 73 29 3b 0a 7d  interp, iRes);.}
3ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 53 79 6e 74 61  ../*.** TH Synta
3cb0: 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 74 72 69 6e  x:.**.**   strin
3cc0: 67 20 69 73 20 43 4c 41 53 53 20 53 54 52 49 4e  g is CLASS STRIN
3cd0: 47 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  G.*/.static int 
3ce0: 73 74 72 69 6e 67 5f 69 73 5f 63 6f 6d 6d 61 6e  string_is_comman
3cf0: 64 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a  d(.  Th_Interp *
3d00: 69 6e 74 65 72 70 2c 20 76 6f 69 64 20 2a 63 74  interp, void *ct
3d10: 78 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  x, int argc, con
3d20: 73 74 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c  st uchar **argv,
3d30: 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20 20   int *argl.){.  
3d40: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 52 65  int i;.  int iRe
3d50: 73 20 3d 20 31 3b 0a 20 20 69 66 28 20 61 72 67  s = 1;.  if( arg
3d60: 63 21 3d 34 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=4 ){.    retu
3d70: 72 6e 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72  rn Th_WrongNumAr
3d80: 67 73 28 69 6e 74 65 72 70 2c 20 22 73 74 72 69  gs(interp, "stri
3d90: 6e 67 20 69 73 20 63 6c 61 73 73 20 73 74 72 69  ng is class stri
3da0: 6e 67 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ng");.  }.  if( 
3db0: 61 72 67 6c 5b 32 5d 21 3d 35 20 7c 7c 20 30 21  argl[2]!=5 || 0!
3dc0: 3d 6d 65 6d 63 6d 70 28 61 72 67 76 5b 32 5d 2c  =memcmp(argv[2],
3dd0: 20 22 61 6c 6e 75 6d 22 2c 20 35 29 20 29 7b 0a   "alnum", 5) ){.
3de0: 20 20 20 20 54 68 5f 45 72 72 6f 72 4d 65 73 73      Th_ErrorMess
3df0: 61 67 65 28 69 6e 74 65 72 70 2c 20 22 45 78 70  age(interp, "Exp
3e00: 65 63 74 65 64 20 61 6c 6e 75 6d 2c 20 67 6f 74  ected alnum, got
3e10: 3a 20 22 2c 20 61 72 67 76 5b 32 5d 2c 20 61 72  : ", argv[2], ar
3e20: 67 6c 5b 32 5d 29 3b 0a 20 20 20 20 72 65 74 75  gl[2]);.    retu
3e30: 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d  rn TH_ERROR;.  }
3e40: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ..  for(i=0; i<a
3e50: 72 67 6c 5b 33 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgl[3]; i++){.  
3e60: 20 20 69 66 28 20 21 74 68 5f 69 73 61 6c 6e 75    if( !th_isalnu
3e70: 6d 28 61 72 67 76 5b 33 5d 5b 69 5d 29 20 29 7b  m(argv[3][i]) ){
3e80: 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 30 3b  .      iRes = 0;
3e90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3ea0: 74 75 72 6e 20 54 68 5f 53 65 74 52 65 73 75 6c  turn Th_SetResul
3eb0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 69 52 65  tInt(interp, iRe
3ec0: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48 20  s);.}../*.** TH 
3ed0: 53 79 6e 74 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20  Syntax:.**.**   
3ee0: 73 74 72 69 6e 67 20 6c 61 73 74 20 4e 45 45 44  string last NEED
3ef0: 4c 45 20 48 41 59 53 54 41 43 4b 0a 2a 2f 0a 73  LE HAYSTACK.*/.s
3f00: 74 61 74 69 63 20 69 6e 74 20 73 74 72 69 6e 67  tatic int string
3f10: 5f 6c 61 73 74 5f 63 6f 6d 6d 61 6e 64 28 0a 20  _last_command(. 
3f20: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65   Th_Interp *inte
3f30: 72 70 2c 20 76 6f 69 64 20 2a 63 74 78 2c 20 69  rp, void *ctx, i
3f40: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 75  nt argc, const u
3f50: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 69 6e 74  char **argv, int
3f60: 20 2a 61 72 67 6c 0a 29 7b 0a 20 20 63 6f 6e 73   *argl.){.  cons
3f70: 74 20 75 63 68 61 72 20 2a 7a 4e 65 65 64 6c 65  t uchar *zNeedle
3f80: 3b 0a 20 20 69 6e 74 20 6e 4e 65 65 64 6c 65 3b  ;.  int nNeedle;
3f90: 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a  .  const uchar *
3fa0: 7a 48 61 79 73 74 61 63 6b 3b 0a 20 20 69 6e 74  zHaystack;.  int
3fb0: 20 6e 48 61 79 73 74 61 63 6b 3b 0a 20 20 69 6e   nHaystack;.  in
3fc0: 74 20 69 3b 0a 20 20 69 6e 74 20 69 52 65 73 3b  t i;.  int iRes;
3fd0: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ..  if( argc!=4 
3fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 68  ){.    return Th
3ff0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
4000: 74 65 72 70 2c 20 22 73 74 72 69 6e 67 20 66 69  terp, "string fi
4010: 72 73 74 20 6e 65 65 64 6c 65 20 68 61 79 73 74  rst needle hayst
4020: 61 63 6b 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 4e  ack");.  }..  zN
4030: 65 65 64 6c 65 20 3d 20 61 72 67 76 5b 32 5d 3b  eedle = argv[2];
4040: 0a 20 20 6e 4e 65 65 64 6c 65 20 3d 20 61 72 67  .  nNeedle = arg
4050: 6c 5b 32 5d 3b 0a 20 20 7a 48 61 79 73 74 61 63  l[2];.  zHaystac
4060: 6b 20 3d 20 61 72 67 76 5b 33 5d 3b 0a 20 20 6e  k = argv[3];.  n
4070: 48 61 79 73 74 61 63 6b 20 3d 20 61 72 67 6c 5b  Haystack = argl[
4080: 33 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 48 61  3];..  for(i=nHa
4090: 79 73 74 61 63 6b 2d 6e 4e 65 65 64 6c 65 2d 31  ystack-nNeedle-1
40a0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
40b0: 20 20 69 66 28 20 30 3d 3d 6d 65 6d 63 6d 70 28    if( 0==memcmp(
40c0: 7a 4e 65 65 64 6c 65 2c 20 26 7a 48 61 79 73 74  zNeedle, &zHayst
40d0: 61 63 6b 5b 69 5d 2c 20 6e 4e 65 65 64 6c 65 29  ack[i], nNeedle)
40e0: 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d   ){.      iRes =
40f0: 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   i;.      break;
4100: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
4110: 72 65 74 75 72 6e 20 54 68 5f 53 65 74 52 65 73  return Th_SetRes
4120: 75 6c 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 69  ultInt(interp, i
4130: 52 65 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Res);.}../*.** T
4140: 48 20 53 79 6e 74 61 78 3a 0a 2a 2a 0a 2a 2a 20  H Syntax:.**.** 
4150: 20 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20    string length 
4160: 53 54 52 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63  STRING.*/.static
4170: 20 69 6e 74 20 73 74 72 69 6e 67 5f 6c 65 6e 67   int string_leng
4180: 74 68 5f 63 6f 6d 6d 61 6e 64 28 0a 20 20 54 68  th_command(.  Th
4190: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
41a0: 20 76 6f 69 64 20 2a 63 74 78 2c 20 69 6e 74 20   void *ctx, int 
41b0: 61 72 67 63 2c 20 63 6f 6e 73 74 20 75 63 68 61  argc, const ucha
41c0: 72 20 2a 2a 61 72 67 76 2c 20 69 6e 74 20 2a 61  r **argv, int *a
41d0: 72 67 6c 0a 29 7b 0a 20 20 69 66 28 20 61 72 67  rgl.){.  if( arg
41e0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=3 ){.    retu
41f0: 72 6e 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72  rn Th_WrongNumAr
4200: 67 73 28 69 6e 74 65 72 70 2c 20 22 73 74 72 69  gs(interp, "stri
4210: 6e 67 20 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  ng length string
4220: 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
4230: 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74   Th_SetResultInt
4240: 28 69 6e 74 65 72 70 2c 20 61 72 67 6c 5b 32 5d  (interp, argl[2]
4250: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 53  );.}../*.** TH S
4260: 79 6e 74 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 73  yntax:.**.**   s
4270: 74 72 69 6e 67 20 72 61 6e 67 65 20 53 54 52 49  tring range STRI
4280: 4e 47 20 46 49 52 53 54 20 4c 41 53 54 0a 2a 2f  NG FIRST LAST.*/
4290: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 69  .static int stri
42a0: 6e 67 5f 72 61 6e 67 65 5f 63 6f 6d 6d 61 6e 64  ng_range_command
42b0: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69  (.  Th_Interp *i
42c0: 6e 74 65 72 70 2c 20 76 6f 69 64 20 2a 63 74 78  nterp, void *ctx
42d0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73  , int argc, cons
42e0: 74 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c 20  t uchar **argv, 
42f0: 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20 20 69  int *argl.){.  i
4300: 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 69 6e 74  nt iStart;.  int
4310: 20 69 45 6e 64 3b 0a 0a 20 20 69 66 28 20 61 72   iEnd;..  if( ar
4320: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 72 65 74  gc!=5 ){.    ret
4330: 75 72 6e 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41  urn Th_WrongNumA
4340: 72 67 73 28 69 6e 74 65 72 70 2c 20 22 73 74 72  rgs(interp, "str
4350: 69 6e 67 20 72 61 6e 67 65 20 73 74 72 69 6e 67  ing range string
4360: 20 66 69 72 73 74 20 6c 61 73 74 22 29 3b 0a 20   first last");. 
4370: 20 7d 0a 0a 20 20 69 66 28 20 61 72 67 6c 5b 34   }..  if( argl[4
4380: 5d 3d 3d 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  ]==3 && 0==memcm
4390: 70 28 22 65 6e 64 22 2c 20 61 72 67 76 5b 34 5d  p("end", argv[4]
43a0: 2c 20 33 29 20 29 7b 0a 20 20 20 20 69 45 6e 64  , 3) ){.    iEnd
43b0: 20 3d 20 61 72 67 6c 5b 32 5d 3b 0a 20 20 7d 65   = argl[2];.  }e
43c0: 6c 73 65 20 69 66 28 20 54 68 5f 54 6f 49 6e 74  lse if( Th_ToInt
43d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d  (interp, argv[4]
43e0: 2c 20 61 72 67 6c 5b 34 5d 2c 20 26 69 45 6e 64  , argl[4], &iEnd
43f0: 29 20 29 7b 0a 20 20 20 20 54 68 5f 45 72 72 6f  ) ){.    Th_Erro
4400: 72 4d 65 73 73 61 67 65 28 0a 20 20 20 20 20 20  rMessage(.      
4410: 20 20 69 6e 74 65 72 70 2c 20 22 45 78 70 65 63    interp, "Expec
4420: 74 65 64 20 5c 22 65 6e 64 5c 22 20 6f 72 20 69  ted \"end\" or i
4430: 6e 74 65 67 65 72 2c 20 67 6f 74 3a 22 2c 20 61  nteger, got:", a
4440: 72 67 76 5b 34 5d 2c 20 61 72 67 6c 5b 34 5d 29  rgv[4], argl[4])
4450: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f  ;.    return TH_
4460: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4470: 20 54 68 5f 54 6f 49 6e 74 28 69 6e 74 65 72 70   Th_ToInt(interp
4480: 2c 20 61 72 67 76 5b 33 5d 2c 20 61 72 67 6c 5b  , argv[3], argl[
4490: 33 5d 2c 20 26 69 53 74 61 72 74 29 20 29 7b 0a  3], &iStart) ){.
44a0: 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f 45 52      return TH_ER
44b0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
44c0: 69 53 74 61 72 74 3c 30 20 29 20 69 53 74 61 72  iStart<0 ) iStar
44d0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 45 6e  t = 0;.  if( iEn
44e0: 64 3e 3d 61 72 67 6c 5b 32 5d 20 29 20 69 45 6e  d>=argl[2] ) iEn
44f0: 64 20 3d 20 61 72 67 6c 5b 32 5d 2d 31 3b 0a 20  d = argl[2]-1;. 
4500: 20 69 66 28 20 69 53 74 61 72 74 3e 69 45 6e 64   if( iStart>iEnd
4510: 20 29 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74   ) iEnd = iStart
4520: 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 68  -1;..  return Th
4530: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
4540: 70 2c 20 26 61 72 67 76 5b 32 5d 5b 69 53 74 61  p, &argv[2][iSta
4550: 72 74 5d 2c 20 69 45 6e 64 2d 69 53 74 61 72 74  rt], iEnd-iStart
4560: 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48  +1);.}../*.** TH
4570: 20 53 79 6e 74 61 78 3a 0a 2a 2a 0a 2a 2a 20 20   Syntax:.**.**  
4580: 20 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 53   string repeat S
4590: 54 52 49 4e 47 20 43 4f 55 4e 54 0a 2a 2f 0a 73  TRING COUNT.*/.s
45a0: 74 61 74 69 63 20 69 6e 74 20 73 74 72 69 6e 67  tatic int string
45b0: 5f 72 65 70 65 61 74 5f 63 6f 6d 6d 61 6e 64 28  _repeat_command(
45c0: 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e  .  Th_Interp *in
45d0: 74 65 72 70 2c 20 76 6f 69 64 20 2a 63 74 78 2c  terp, void *ctx,
45e0: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
45f0: 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 69   uchar **argv, i
4600: 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20 20 69 6e  nt *argl.){.  in
4610: 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t n;.  int i;.  
4620: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 75 63 68  int nByte;.  uch
4630: 61 72 20 2a 7a 42 79 74 65 3b 0a 0a 20 20 69 66  ar *zByte;..  if
4640: 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20  ( argc!=4 ){.   
4650: 20 72 65 74 75 72 6e 20 54 68 5f 57 72 6f 6e 67   return Th_Wrong
4660: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
4670: 22 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 73  "string repeat s
4680: 74 72 69 6e 67 20 6e 22 29 3b 0a 20 20 7d 0a 20  tring n");.  }. 
4690: 20 69 66 28 20 54 68 5f 54 6f 49 6e 74 28 69 6e   if( Th_ToInt(in
46a0: 74 65 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20 61  terp, argv[3], a
46b0: 72 67 6c 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20  rgl[3], &n) ){. 
46c0: 20 20 20 72 65 74 75 72 6e 20 54 48 5f 45 52 52     return TH_ERR
46d0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65  OR;.  }..  nByte
46e0: 20 3d 20 61 72 67 6c 5b 32 5d 20 2a 20 6e 3b 0a   = argl[2] * n;.
46f0: 20 20 7a 42 79 74 65 20 3d 20 54 68 5f 4d 61 6c    zByte = Th_Mal
4700: 6c 6f 63 28 69 6e 74 65 72 70 2c 20 6e 42 79 74  loc(interp, nByt
4710: 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  e+1);.  for(i=0;
4720: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 3d 61 72 67   i<nByte; i+=arg
4730: 6c 5b 32 5d 29 7b 0a 20 20 20 20 6d 65 6d 63 70  l[2]){.    memcp
4740: 79 28 26 7a 42 79 74 65 5b 69 5d 2c 20 61 72 67  y(&zByte[i], arg
4750: 76 5b 32 5d 2c 20 61 72 67 6c 5b 32 5d 29 3b 0a  v[2], argl[2]);.
4760: 20 20 7d 0a 0a 20 20 54 68 5f 53 65 74 52 65 73    }..  Th_SetRes
4770: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 79 74  ult(interp, zByt
4780: 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 54 68 5f  e, nByte);.  Th_
4790: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 7a 42 79  Free(interp, zBy
47a0: 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 48  te);.  return TH
47b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48  _OK;.}../*.** TH
47c0: 20 53 79 6e 74 61 78 3a 0a 2a 2a 0a 2a 2a 20 20   Syntax:.**.**  
47d0: 20 69 6e 66 6f 20 65 78 69 73 74 73 20 56 41 52   info exists VAR
47e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
47f0: 6e 66 6f 5f 65 78 69 73 74 73 5f 63 6f 6d 6d 61  nfo_exists_comma
4800: 6e 64 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20  nd(.  Th_Interp 
4810: 2a 69 6e 74 65 72 70 2c 20 76 6f 69 64 20 2a 63  *interp, void *c
4820: 74 78 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  tx, int argc, co
4830: 6e 73 74 20 75 63 68 61 72 20 2a 2a 61 72 67 76  nst uchar **argv
4840: 2c 20 69 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20  , int *argl.){. 
4850: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
4860: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 72  argc!=3 ){.    r
4870: 65 74 75 72 6e 20 54 68 5f 57 72 6f 6e 67 4e 75  eturn Th_WrongNu
4880: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 22 69  mArgs(interp, "i
4890: 6e 66 6f 20 65 78 69 73 74 73 20 76 61 72 22 29  nfo exists var")
48a0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 54 68 5f  ;.  }.  rc = Th_
48b0: 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 61  GetVar(interp, a
48c0: 72 67 76 5b 32 5d 2c 20 61 72 67 6c 5b 32 5d 29  rgv[2], argl[2])
48d0: 3b 0a 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74  ;.  Th_SetResult
48e0: 49 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3f 30  Int(interp, rc?0
48f0: 3a 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 48  :1);.  return TH
4900: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48  _OK;.}../*.** TH
4910: 20 53 79 6e 74 61 78 3a 0a 2a 2a 0a 2a 2a 20 20   Syntax:.**.**  
4920: 20 75 6e 73 65 74 20 56 41 52 0a 2a 2f 0a 73 74   unset VAR.*/.st
4930: 61 74 69 63 20 69 6e 74 20 75 6e 73 65 74 5f 63  atic int unset_c
4940: 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e 74  ommand(.  Th_Int
4950: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
4960: 76 6f 69 64 20 2a 63 74 78 2c 0a 20 20 69 6e 74  void *ctx,.  int
4970: 20 61 72 67 63 2c 0a 20 20 63 6f 6e 73 74 20 75   argc,.  const u
4980: 63 68 61 72 20 2a 2a 61 72 67 76 2c 0a 20 20 69  char **argv,.  i
4990: 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20 20 69 66  nt *argl.){.  if
49a0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
49b0: 20 72 65 74 75 72 6e 20 54 68 5f 57 72 6f 6e 67   return Th_Wrong
49c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
49d0: 22 75 6e 73 65 74 20 76 61 72 22 29 3b 0a 20 20  "unset var");.  
49e0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 68 5f 55 6e  }.  return Th_Un
49f0: 73 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 61  setVar(interp, a
4a00: 72 67 76 5b 31 5d 2c 20 61 72 67 6c 5b 31 5d 29  rgv[1], argl[1])
4a10: 3b 0a 7d 0a 0a 69 6e 74 20 54 68 5f 43 61 6c 6c  ;.}..int Th_Call
4a20: 53 75 62 43 6f 6d 6d 61 6e 64 28 0a 20 20 54 68  SubCommand(.  Th
4a30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4a40: 20 0a 20 20 76 6f 69 64 20 2a 63 74 78 2c 0a 20   .  void *ctx,. 
4a50: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 6f 6e   int argc,.  con
4a60: 73 74 20 75 63 68 61 72 20 2a 2a 61 72 67 76 2c  st uchar **argv,
4a70: 0a 20 20 69 6e 74 20 2a 61 72 67 6c 2c 0a 20 20  .  int *argl,.  
4a80: 54 68 5f 53 75 62 43 6f 6d 6d 61 6e 64 20 2a 61  Th_SubCommand *a
4a90: 53 75 62 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Sub.){.  int i;.
4aa0: 20 20 66 6f 72 28 69 3d 30 3b 20 61 53 75 62 5b    for(i=0; aSub[
4ab0: 69 5d 2e 7a 4e 61 6d 65 3b 20 69 2b 2b 29 7b 0a  i].zName; i++){.
4ac0: 20 20 20 20 75 63 68 61 72 20 2a 7a 4e 61 6d 65      uchar *zName
4ad0: 20 3d 20 28 75 63 68 61 72 20 2a 29 61 53 75 62   = (uchar *)aSub
4ae0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  [i].zName;.    i
4af0: 66 28 20 74 68 5f 73 74 72 6c 65 6e 28 7a 4e 61  f( th_strlen(zNa
4b00: 6d 65 29 3d 3d 61 72 67 6c 5b 31 5d 20 26 26 20  me)==argl[1] && 
4b10: 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4e 61 6d 65 2c  0==memcmp(zName,
4b20: 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 6c 5b 31   argv[1], argl[1
4b30: 5d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ]) ){.      retu
4b40: 72 6e 20 61 53 75 62 5b 69 5d 2e 78 50 72 6f 63  rn aSub[i].xProc
4b50: 28 69 6e 74 65 72 70 2c 20 63 74 78 2c 20 61 72  (interp, ctx, ar
4b60: 67 63 2c 20 61 72 67 76 2c 20 61 72 67 6c 29 3b  gc, argv, argl);
4b70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 68  .    }.  }..  Th
4b80: 5f 45 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e  _ErrorMessage(in
4b90: 74 65 72 70 2c 20 22 45 78 70 65 63 74 65 64 20  terp, "Expected 
4ba0: 73 75 62 2d 63 6f 6d 6d 61 6e 64 2c 20 67 6f 74  sub-command, got
4bb0: 3a 22 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67  :", argv[1], arg
4bc0: 6c 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  l[1]);.  return 
4bd0: 54 48 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TH_ERROR;.}../*.
4be0: 2a 2a 20 54 48 20 53 79 6e 74 61 78 3a 0a 2a 2a  ** TH Syntax:.**
4bf0: 0a 2a 2a 20 20 20 73 74 72 69 6e 67 20 63 6f 6d  .**   string com
4c00: 70 61 72 65 20 53 54 52 31 20 53 54 52 32 0a 2a  pare STR1 STR2.*
4c10: 2a 20 20 20 73 74 72 69 6e 67 20 66 69 72 73 74  *   string first
4c20: 20 20 20 4e 45 45 44 4c 45 20 48 41 59 53 54 41     NEEDLE HAYSTA
4c30: 43 4b 20 3f 53 54 41 52 54 49 4e 44 45 58 3f 0a  CK ?STARTINDEX?.
4c40: 2a 2a 20 20 20 73 74 72 69 6e 67 20 69 73 20 20  **   string is  
4c50: 20 20 20 20 43 4c 41 53 53 20 53 54 52 49 4e 47      CLASS STRING
4c60: 0a 2a 2a 20 20 20 73 74 72 69 6e 67 20 6c 61 73  .**   string las
4c70: 74 20 20 20 20 4e 45 45 44 4c 45 20 48 41 59 53  t    NEEDLE HAYS
4c80: 54 41 43 4b 20 3f 53 54 41 52 54 49 4e 44 45 58  TACK ?STARTINDEX
4c90: 3f 0a 2a 2a 20 20 20 73 74 72 69 6e 67 20 6c 65  ?.**   string le
4ca0: 6e 67 74 68 20 20 53 54 52 49 4e 47 0a 2a 2a 20  ngth  STRING.** 
4cb0: 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20 20    string range  
4cc0: 20 53 54 52 49 4e 47 20 46 49 52 53 54 20 4c 41   STRING FIRST LA
4cd0: 53 54 0a 2a 2a 20 20 20 73 74 72 69 6e 67 20 72  ST.**   string r
4ce0: 65 70 65 61 74 20 20 53 54 52 49 4e 47 20 43 4f  epeat  STRING CO
4cf0: 55 4e 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  UNT.*/.static in
4d00: 74 20 73 74 72 69 6e 67 5f 63 6f 6d 6d 61 6e 64  t string_command
4d10: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69  (.  Th_Interp *i
4d20: 6e 74 65 72 70 2c 20 0a 20 20 76 6f 69 64 20 2a  nterp, .  void *
4d30: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
4d40: 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a  .  const uchar *
4d50: 2a 61 72 67 76 2c 0a 20 20 69 6e 74 20 2a 61 72  *argv,.  int *ar
4d60: 67 6c 0a 29 7b 0a 20 20 54 68 5f 53 75 62 43 6f  gl.){.  Th_SubCo
4d70: 6d 6d 61 6e 64 20 61 53 75 62 5b 5d 20 3d 20 7b  mmand aSub[] = {
4d80: 0a 20 20 20 20 7b 20 22 63 6f 6d 70 61 72 65 22  .    { "compare"
4d90: 2c 20 73 74 72 69 6e 67 5f 63 6f 6d 70 61 72 65  , string_compare
4da0: 5f 63 6f 6d 6d 61 6e 64 20 7d 2c 0a 20 20 20 20  _command },.    
4db0: 7b 20 22 66 69 72 73 74 22 2c 20 20 20 73 74 72  { "first",   str
4dc0: 69 6e 67 5f 66 69 72 73 74 5f 63 6f 6d 6d 61 6e  ing_first_comman
4dd0: 64 20 7d 2c 0a 20 20 20 20 7b 20 22 69 73 22 2c  d },.    { "is",
4de0: 20 20 20 20 20 20 73 74 72 69 6e 67 5f 69 73 5f        string_is_
4df0: 63 6f 6d 6d 61 6e 64 20 7d 2c 0a 20 20 20 20 7b  command },.    {
4e00: 20 22 6c 61 73 74 22 2c 20 20 20 20 73 74 72 69   "last",    stri
4e10: 6e 67 5f 6c 61 73 74 5f 63 6f 6d 6d 61 6e 64 20  ng_last_command 
4e20: 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 6e 67 74 68  },.    { "length
4e30: 22 2c 20 20 73 74 72 69 6e 67 5f 6c 65 6e 67 74  ",  string_lengt
4e40: 68 5f 63 6f 6d 6d 61 6e 64 20 7d 2c 0a 20 20 20  h_command },.   
4e50: 20 7b 20 22 72 61 6e 67 65 22 2c 20 20 20 73 74   { "range",   st
4e60: 72 69 6e 67 5f 72 61 6e 67 65 5f 63 6f 6d 6d 61  ring_range_comma
4e70: 6e 64 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 70  nd },.    { "rep
4e80: 65 61 74 22 2c 20 20 73 74 72 69 6e 67 5f 72 65  eat",  string_re
4e90: 70 65 61 74 5f 63 6f 6d 6d 61 6e 64 20 7d 2c 0a  peat_command },.
4ea0: 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d      { 0, 0 }.  }
4eb0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 68 5f 43 61  ;.  return Th_Ca
4ec0: 6c 6c 53 75 62 43 6f 6d 6d 61 6e 64 28 69 6e 74  llSubCommand(int
4ed0: 65 72 70 2c 20 63 74 78 2c 20 61 72 67 63 2c 20  erp, ctx, argc, 
4ee0: 61 72 67 76 2c 20 61 72 67 6c 2c 20 61 53 75 62  argv, argl, aSub
4ef0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 53  );.}../*.** TH S
4f00: 79 6e 74 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  yntax:.**.**   i
4f10: 6e 66 6f 20 65 78 69 73 74 73 20 56 41 52 4e 41  nfo exists VARNA
4f20: 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ME.*/.static int
4f30: 20 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 0a 20   info_command(. 
4f40: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65   Th_Interp *inte
4f50: 72 70 2c 20 0a 20 20 76 6f 69 64 20 2a 63 74 78  rp, .  void *ctx
4f60: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
4f70: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2a 61 72  const uchar **ar
4f80: 67 76 2c 0a 20 20 69 6e 74 20 2a 61 72 67 6c 0a  gv,.  int *argl.
4f90: 29 7b 0a 20 20 54 68 5f 53 75 62 43 6f 6d 6d 61  ){.  Th_SubComma
4fa0: 6e 64 20 61 53 75 62 5b 5d 20 3d 20 7b 0a 20 20  nd aSub[] = {.  
4fb0: 20 20 7b 20 22 65 78 69 73 74 73 22 2c 20 20 69    { "exists",  i
4fc0: 6e 66 6f 5f 65 78 69 73 74 73 5f 63 6f 6d 6d 61  nfo_exists_comma
4fd0: 6e 64 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  nd },.    { 0, 0
4fe0: 20 7d 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e   }.  };.  return
4ff0: 20 54 68 5f 43 61 6c 6c 53 75 62 43 6f 6d 6d 61   Th_CallSubComma
5000: 6e 64 28 69 6e 74 65 72 70 2c 20 63 74 78 2c 20  nd(interp, ctx, 
5010: 61 72 67 63 2c 20 61 72 67 76 2c 20 61 72 67 6c  argc, argv, argl
5020: 2c 20 61 53 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , aSub);.}../*.*
5030: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 73 63  * Convert the sc
5040: 72 69 70 74 20 6c 65 76 65 6c 20 66 72 61 6d 65  ript level frame
5050: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 28   specification (
5060: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 6d  used by the comm
5070: 61 6e 64 73 20 0a 2a 2a 20 5b 75 70 6c 65 76 65  ands .** [upleve
5080: 6c 5d 20 61 6e 64 20 5b 75 70 76 61 72 5d 29 20  l] and [upvar]) 
5090: 69 6e 20 28 7a 46 72 61 6d 65 2c 20 6e 46 72 61  in (zFrame, nFra
50a0: 6d 65 29 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  me) to an intege
50b0: 72 20 66 72 61 6d 65 20 61 73 20 0a 2a 2a 20 75  r frame as .** u
50c0: 73 65 64 20 62 79 20 54 68 5f 4c 69 6e 6b 56 61  sed by Th_LinkVa
50d0: 72 28 29 20 61 6e 64 20 54 68 5f 45 76 61 6c 28  r() and Th_Eval(
50e0: 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ). If successful
50f0: 2c 20 77 72 69 74 65 20 74 68 65 20 69 6e 74 65  , write the inte
5100: 67 65 72 0a 2a 2a 20 66 72 61 6d 65 20 6c 65 76  ger.** frame lev
5110: 65 6c 20 74 6f 20 2a 70 69 46 72 61 6d 65 20 61  el to *piFrame a
5120: 6e 64 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 2e  nd return TH_OK.
5130: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
5140: 72 6e 20 54 48 5f 45 52 52 4f 52 0a 2a 2a 20 61  rn TH_ERROR.** a
5150: 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
5160: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65  r message in the
5170: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73   interpreter res
5180: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
5190: 6e 74 20 74 68 54 6f 46 72 61 6d 65 28 0a 20 20  nt thToFrame(.  
51a0: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  Th_Interp *inter
51b0: 70 2c 20 0a 20 20 63 6f 6e 73 74 20 75 63 68 61  p, .  const ucha
51c0: 72 20 2a 7a 46 72 61 6d 65 2c 20 0a 20 20 69 6e  r *zFrame, .  in
51d0: 74 20 6e 46 72 61 6d 65 2c 20 0a 20 20 69 6e 74  t nFrame, .  int
51e0: 20 2a 70 69 46 72 61 6d 65 0a 29 7b 0a 20 20 69   *piFrame.){.  i
51f0: 6e 74 20 69 46 72 61 6d 65 3b 0a 20 20 69 66 28  nt iFrame;.  if(
5200: 20 74 68 5f 69 73 64 69 67 69 74 28 7a 46 72 61   th_isdigit(zFra
5210: 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 69 6e  me[0]) ){.    in
5220: 74 20 72 63 20 3d 20 54 68 5f 54 6f 49 6e 74 28  t rc = Th_ToInt(
5230: 69 6e 74 65 72 70 2c 20 7a 46 72 61 6d 65 2c 20  interp, zFrame, 
5240: 6e 46 72 61 6d 65 2c 20 26 69 46 72 61 6d 65 29  nFrame, &iFrame)
5250: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 48  ;.    if( rc!=TH
5260: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5270: 0a 20 20 20 20 69 46 72 61 6d 65 20 3d 20 69 46  .    iFrame = iF
5280: 72 61 6d 65 20 2a 20 2d 31 3b 0a 20 20 7d 65 6c  rame * -1;.  }el
5290: 73 65 20 69 66 28 20 7a 46 72 61 6d 65 5b 30 5d  se if( zFrame[0]
52a0: 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='#' ){.    int
52b0: 20 72 63 20 3d 20 54 68 5f 54 6f 49 6e 74 28 69   rc = Th_ToInt(i
52c0: 6e 74 65 72 70 2c 20 26 7a 46 72 61 6d 65 5b 31  nterp, &zFrame[1
52d0: 5d 2c 20 6e 46 72 61 6d 65 2d 31 2c 20 26 69 46  ], nFrame-1, &iF
52e0: 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  rame);.    if( r
52f0: 63 21 3d 54 48 5f 4f 4b 20 29 20 72 65 74 75 72  c!=TH_OK ) retur
5300: 6e 20 72 63 3b 0a 20 20 20 20 69 46 72 61 6d 65  n rc;.    iFrame
5310: 20 3d 20 69 46 72 61 6d 65 20 2b 20 31 3b 0a 20   = iFrame + 1;. 
5320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
5330: 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d  rn TH_ERROR;.  }
5340: 0a 20 20 2a 70 69 46 72 61 6d 65 20 3d 20 69 46  .  *piFrame = iF
5350: 72 61 6d 65 3b 0a 20 20 72 65 74 75 72 6e 20 54  rame;.  return T
5360: 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  H_OK;.}../*.** T
5370: 48 20 53 79 6e 74 61 78 3a 0a 2a 2a 0a 2a 2a 20  H Syntax:.**.** 
5380: 20 20 75 70 6c 65 76 65 6c 20 3f 4c 45 56 45 4c    uplevel ?LEVEL
5390: 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74  ? SCRIPT.*/.stat
53a0: 69 63 20 69 6e 74 20 75 70 6c 65 76 65 6c 5f 63  ic int uplevel_c
53b0: 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e 74  ommand(.  Th_Int
53c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
53d0: 76 6f 69 64 20 2a 63 74 78 2c 0a 20 20 69 6e 74  void *ctx,.  int
53e0: 20 61 72 67 63 2c 0a 20 20 63 6f 6e 73 74 20 75   argc,.  const u
53f0: 63 68 61 72 20 2a 2a 61 72 67 76 2c 0a 20 20 69  char **argv,.  i
5400: 6e 74 20 2a 61 72 67 6c 0a 29 7b 0a 20 20 69 6e  nt *argl.){.  in
5410: 74 20 69 46 72 61 6d 65 20 3d 20 2d 31 3b 0a 0a  t iFrame = -1;..
5420: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 26 26    if( argc!=2 &&
5430: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
5440: 72 65 74 75 72 6e 20 54 68 5f 57 72 6f 6e 67 4e  return Th_WrongN
5450: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 22  umArgs(interp, "
5460: 75 70 6c 65 76 65 6c 20 3f 6c 65 76 65 6c 3f 20  uplevel ?level? 
5470: 73 63 72 69 70 74 2e 2e 2e 22 29 3b 0a 20 20 7d  script...");.  }
5480: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 26  .  if( argc==3 &
5490: 26 20 54 48 5f 4f 4b 21 3d 74 68 54 6f 46 72 61  & TH_OK!=thToFra
54a0: 6d 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  me(interp, argv[
54b0: 31 5d 2c 20 61 72 67 6c 5b 31 5d 2c 20 26 69 46  1], argl[1], &iF
54c0: 72 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74  rame) ){.    ret
54d0: 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20  urn TH_ERROR;.  
54e0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 68 5f 45 76  }.  return Th_Ev
54f0: 61 6c 28 69 6e 74 65 72 70 2c 20 69 46 72 61 6d  al(interp, iFram
5500: 65 2c 20 61 72 67 76 5b 61 72 67 63 2d 31 5d 2c  e, argv[argc-1],
5510: 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   -1);.}../*.** T
5520: 48 20 53 79 6e 74 61 78 3a 20 0a 2a 2a 0a 2a 2a  H Syntax: .**.**
5530: 20 20 20 75 70 76 61 72 20 3f 46 52 41 4d 45 3f     upvar ?FRAME?
5540: 20 4f 54 48 45 52 56 41 52 20 4d 59 56 41 52 20   OTHERVAR MYVAR 
5550: 3f 4f 54 48 45 52 56 41 52 20 4d 59 56 41 52 20  ?OTHERVAR MYVAR 
5560: 2e 2e 2e 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ...?.*/.static i
5570: 6e 74 20 75 70 76 61 72 5f 63 6f 6d 6d 61 6e 64  nt upvar_command
5580: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69  (.  Th_Interp *i
5590: 6e 74 65 72 70 2c 20 0a 20 20 76 6f 69 64 20 2a  nterp, .  void *
55a0: 63 74 78 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ctx, .  int argc
55b0: 2c 20 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72  , .  const uchar
55c0: 20 2a 2a 61 72 67 76 2c 20 0a 20 20 69 6e 74 20   **argv, .  int 
55d0: 2a 61 72 67 6c 0a 29 7b 0a 20 20 69 6e 74 20 69  *argl.){.  int i
55e0: 56 61 72 20 3d 20 31 3b 0a 20 20 69 6e 74 20 69  Var = 1;.  int i
55f0: 46 72 61 6d 65 20 3d 20 2d 31 3b 0a 20 20 69 6e  Frame = -1;.  in
5600: 74 20 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a 20 20  t rc = TH_OK;.  
5610: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 48  int i;..  if( TH
5620: 5f 4f 4b 3d 3d 74 68 54 6f 46 72 61 6d 65 28 30  _OK==thToFrame(0
5630: 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 6c 5b  , argv[1], argl[
5640: 31 5d 2c 20 26 69 46 72 61 6d 65 29 20 29 7b 0a  1], &iFrame) ){.
5650: 20 20 20 20 69 56 61 72 2b 2b 3b 0a 20 20 7d 0a      iVar++;.  }.
5660: 20 20 69 66 28 20 61 72 67 63 3d 3d 69 56 61 72    if( argc==iVar
5670: 20 7c 7c 20 28 61 72 67 63 2d 69 56 61 72 29 25   || (argc-iVar)%
5680: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
5690: 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  Th_WrongNumArgs(
56a0: 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20 20  interp, .       
56b0: 20 22 75 70 76 61 72 20 66 72 61 6d 65 20 6f 74   "upvar frame ot
56c0: 68 65 72 76 61 72 20 6d 79 76 61 72 20 3f 6f 74  hervar myvar ?ot
56d0: 68 65 72 76 61 72 20 6d 79 76 61 72 2e 2e 2e 3f  hervar myvar...?
56e0: 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ");.  }.  for(i=
56f0: 69 56 61 72 3b 20 72 63 3d 3d 54 48 5f 4f 4b 20  iVar; rc==TH_OK 
5700: 26 26 20 69 3c 61 72 67 63 3b 20 69 3d 69 2b 32  && i<argc; i=i+2
5710: 29 7b 0a 20 20 20 20 72 63 20 3d 20 54 68 5f 4c  ){.    rc = Th_L
5720: 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 61  inkVar(interp, a
5730: 72 67 76 5b 69 2b 31 5d 2c 20 61 72 67 6c 5b 69  rgv[i+1], argl[i
5740: 2b 31 5d 2c 20 69 46 72 61 6d 65 2c 20 61 72 67  +1], iFrame, arg
5750: 76 5b 69 5d 2c 20 61 72 67 6c 5b 69 5d 29 3b 0a  v[i], argl[i]);.
5760: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 53 79 6e  .}../*.** TH Syn
5780: 74 61 78 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 62 72  tax: .**.**   br
5790: 65 61 6b 70 6f 69 6e 74 20 41 52 47 53 0a 2a 2a  eakpoint ARGS.**
57a0: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
57b0: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 74   does nothing at
57c0: 20 61 6c 6c 2e 20 49 74 73 20 70 75 72 70 6f 73   all. Its purpos
57d0: 65 20 69 6e 20 6c 69 66 65 20 69 73 20 74 6f 20  e in life is to 
57e0: 73 65 72 76 65 0a 2a 2a 20 61 73 20 61 20 70 6f  serve.** as a po
57f0: 69 6e 74 20 66 6f 72 20 73 65 74 74 69 6e 67 20  int for setting 
5800: 62 72 65 61 6b 70 6f 69 6e 74 73 20 69 6e 20 61  breakpoints in a
5810: 20 64 65 62 75 67 67 65 72 2e 0a 2a 2f 0a 73 74   debugger..*/.st
5820: 61 74 69 63 20 69 6e 74 20 62 72 65 61 6b 70 6f  atic int breakpo
5830: 69 6e 74 5f 63 6f 6d 6d 61 6e 64 28 0a 20 20 54  int_command(.  T
5840: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  h_Interp *interp
5850: 2c 20 0a 20 20 76 6f 69 64 20 2a 63 74 78 2c 20  , .  void *ctx, 
5860: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20  .  int argc, .  
5870: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2a 61 72  const uchar **ar
5880: 67 76 2c 20 0a 20 20 69 6e 74 20 2a 61 72 67 6c  gv, .  int *argl
5890: 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
58a0: 30 3b 0a 20 20 63 6e 74 2b 2b 3b 0a 20 20 72 65  0;.  cnt++;.  re
58b0: 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f  turn TH_OK;.}../
58c0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
58d0: 65 20 62 75 69 6c 74 2d 69 6e 20 74 68 31 20 6c  e built-in th1 l
58e0: 61 6e 67 75 61 67 65 20 63 6f 6d 6d 61 6e 64 73  anguage commands
58f0: 20 77 69 74 68 20 69 6e 74 65 72 70 72 65 74 65   with interprete
5900: 72 20 69 6e 74 65 72 70 2e 0a 2a 2a 20 55 73 75  r interp..** Usu
5910: 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c  ally this is cal
5920: 6c 65 64 20 73 6f 6f 6e 20 61 66 74 65 72 20 69  led soon after i
5930: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
5940: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 74 68 5f 72  ion..*/.int th_r
5950: 65 67 69 73 74 65 72 5f 6c 61 6e 67 75 61 67 65  egister_language
5960: 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  (Th_Interp *inte
5970: 72 70 29 7b 0a 20 20 2f 2a 20 41 72 72 61 79 20  rp){.  /* Array 
5980: 6f 66 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6d 6d  of built-in comm
5990: 61 6e 64 73 2e 20 2a 2f 0a 20 20 73 74 72 75 63  ands. */.  struc
59a0: 74 20 5f 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 20  t _Command {.   
59b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
59c0: 6d 65 3b 0a 20 20 20 20 54 68 5f 43 6f 6d 6d 61  me;.    Th_Comma
59d0: 6e 64 50 72 6f 63 20 78 50 72 6f 63 3b 0a 20 20  ndProc xProc;.  
59e0: 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
59f0: 3b 0a 20 20 7d 20 61 43 6f 6d 6d 61 6e 64 5b 5d  ;.  } aCommand[]
5a00: 20 3d 20 7b 0a 20 20 20 20 7b 22 63 61 74 63 68   = {.    {"catch
5a10: 22 2c 20 20 20 20 63 61 74 63 68 5f 63 6f 6d 6d  ",    catch_comm
5a20: 61 6e 64 2c 20 20 20 30 7d 2c 0a 20 20 20 20 7b  and,   0},.    {
5a30: 22 65 78 70 72 22 2c 20 20 20 20 20 65 78 70 72  "expr",     expr
5a40: 5f 63 6f 6d 6d 61 6e 64 2c 20 20 20 20 30 7d 2c  _command,    0},
5a50: 0a 20 20 20 20 7b 22 66 6f 72 22 2c 20 20 20 20  .    {"for",    
5a60: 20 20 66 6f 72 5f 63 6f 6d 6d 61 6e 64 2c 20 20    for_command,  
5a70: 20 20 20 30 7d 2c 0a 20 20 20 20 7b 22 69 66 22     0},.    {"if"
5a80: 2c 20 20 20 20 20 20 20 69 66 5f 63 6f 6d 6d 61  ,       if_comma
5a90: 6e 64 2c 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  nd,      0},.   
5aa0: 20 7b 22 69 6e 66 6f 22 2c 20 20 20 20 20 69 6e   {"info",     in
5ab0: 66 6f 5f 63 6f 6d 6d 61 6e 64 2c 20 20 20 20 30  fo_command,    0
5ac0: 7d 2c 0a 20 20 20 20 7b 22 6c 69 6e 64 65 78 22  },.    {"lindex"
5ad0: 2c 20 20 20 6c 69 6e 64 65 78 5f 63 6f 6d 6d 61  ,   lindex_comma
5ae0: 6e 64 2c 20 20 30 7d 2c 0a 20 20 20 20 7b 22 6c  nd,  0},.    {"l
5af0: 69 73 74 22 2c 20 20 20 20 20 6c 69 73 74 5f 63  ist",     list_c
5b00: 6f 6d 6d 61 6e 64 2c 20 20 20 20 30 7d 2c 0a 20  ommand,    0},. 
5b10: 20 20 20 7b 22 6c 6c 65 6e 67 74 68 22 2c 20 20     {"llength",  
5b20: 6c 6c 65 6e 67 74 68 5f 63 6f 6d 6d 61 6e 64 2c  llength_command,
5b30: 20 30 7d 2c 0a 20 20 20 20 7b 22 70 72 6f 63 22   0},.    {"proc"
5b40: 2c 20 20 20 20 20 70 72 6f 63 5f 63 6f 6d 6d 61  ,     proc_comma
5b50: 6e 64 2c 20 20 20 20 30 7d 2c 20 0a 20 20 20 20  nd,    0}, .    
5b60: 7b 22 72 65 6e 61 6d 65 22 2c 20 20 20 72 65 6e  {"rename",   ren
5b70: 61 6d 65 5f 63 6f 6d 6d 61 6e 64 2c 20 20 30 7d  ame_command,  0}
5b80: 2c 0a 20 20 20 20 7b 22 73 65 74 22 2c 20 20 20  ,.    {"set",   
5b90: 20 20 20 73 65 74 5f 63 6f 6d 6d 61 6e 64 2c 20     set_command, 
5ba0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7b 22 73 74      0},.    {"st
5bb0: 72 69 6e 67 22 2c 20 20 20 73 74 72 69 6e 67 5f  ring",   string_
5bc0: 63 6f 6d 6d 61 6e 64 2c 20 20 30 7d 2c 0a 20 20  command,  0},.  
5bd0: 20 20 7b 22 75 6e 73 65 74 22 2c 20 20 20 20 75    {"unset",    u
5be0: 6e 73 65 74 5f 63 6f 6d 6d 61 6e 64 2c 20 20 20  nset_command,   
5bf0: 30 7d 2c 0a 20 20 20 20 7b 22 75 70 6c 65 76 65  0},.    {"upleve
5c00: 6c 22 2c 20 20 75 70 6c 65 76 65 6c 5f 63 6f 6d  l",  uplevel_com
5c10: 6d 61 6e 64 2c 20 30 7d 2c 0a 20 20 20 20 7b 22  mand, 0},.    {"
5c20: 75 70 76 61 72 22 2c 20 20 20 20 75 70 76 61 72  upvar",    upvar
5c30: 5f 63 6f 6d 6d 61 6e 64 2c 20 20 20 30 7d 2c 0a  _command,   0},.
5c40: 0a 20 20 20 20 7b 22 62 72 65 61 6b 70 6f 69 6e  .    {"breakpoin
5c50: 74 22 2c 20 62 72 65 61 6b 70 6f 69 6e 74 5f 63  t", breakpoint_c
5c60: 6f 6d 6d 61 6e 64 2c 20 30 7d 2c 0a 0a 20 20 20  ommand, 0},..   
5c70: 20 7b 22 72 65 74 75 72 6e 22 2c 20 20 20 72 65   {"return",   re
5c80: 74 75 72 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 30 7d  turn_command, 0}
5c90: 2c 0a 20 20 20 20 7b 22 62 72 65 61 6b 22 2c 20  ,.    {"break", 
5ca0: 20 20 20 73 69 6d 70 6c 65 5f 63 6f 6d 6d 61 6e     simple_comman
5cb0: 64 2c 20 28 76 6f 69 64 20 2a 29 54 48 5f 42 52  d, (void *)TH_BR
5cc0: 45 41 4b 7d 2c 20 0a 20 20 20 20 7b 22 63 6f 6e  EAK}, .    {"con
5cd0: 74 69 6e 75 65 22 2c 20 73 69 6d 70 6c 65 5f 63  tinue", simple_c
5ce0: 6f 6d 6d 61 6e 64 2c 20 28 76 6f 69 64 20 2a 29  ommand, (void *)
5cf0: 54 48 5f 43 4f 4e 54 49 4e 55 45 7d 2c 20 0a 20  TH_CONTINUE}, . 
5d00: 20 20 20 7b 22 65 72 72 6f 72 22 2c 20 20 20 20     {"error",    
5d10: 73 69 6d 70 6c 65 5f 63 6f 6d 6d 61 6e 64 2c 20  simple_command, 
5d20: 28 76 6f 69 64 20 2a 29 54 48 5f 45 52 52 4f 52  (void *)TH_ERROR
5d30: 7d 2c 20 0a 0a 20 20 20 20 7b 30 2c 20 30 7d 0a  }, ..    {0, 0}.
5d40: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20    };.  int i;.. 
5d50: 20 2f 2a 20 41 64 64 20 74 68 65 20 6c 61 6e 67   /* Add the lang
5d60: 75 61 67 65 20 63 6f 6d 6d 61 6e 64 73 2e 20 2a  uage commands. *
5d70: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28  /.  for(i=0; i<(
5d80: 73 69 7a 65 6f 66 28 61 43 6f 6d 6d 61 6e 64 29  sizeof(aCommand)
5d90: 2f 73 69 7a 65 6f 66 28 61 43 6f 6d 6d 61 6e 64  /sizeof(aCommand
5da0: 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  [0])); i++){.   
5db0: 20 76 6f 69 64 20 2a 63 74 78 20 3d 20 61 43 6f   void *ctx = aCo
5dc0: 6d 6d 61 6e 64 5b 69 5d 2e 70 43 6f 6e 74 65 78  mmand[i].pContex
5dd0: 74 3b 0a 20 20 20 20 54 68 5f 43 72 65 61 74 65  t;.    Th_Create
5de0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
5df0: 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61 6d  aCommand[i].zNam
5e00: 65 2c 20 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 78  e, aCommand[i].x
5e10: 50 72 6f 63 2c 20 63 74 78 2c 20 30 29 3b 0a 20  Proc, ctx, 0);. 
5e20: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 48 5f   }..  return TH_
5e30: 4f 4b 3b 0a 7d 0a                                OK;.}.