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;.}.