Hex Artifact Content
Not logged in

Artifact b97a4128cb40db5b33dece58164cc1207929a6cc:

File src/th.c part of check-in [dffe11c29c] - Update to the latest version of SQLite (3.6.20rc1) and fix some compiler warnings. by drh on 2009-11-01 19:25:47.

0000: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
0010: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0020: 20 54 48 20 63 6f 72 65 2e 20 54 68 69 73 20 66   TH core. This f
0030: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
0040: 20 70 61 72 73 65 72 2c 20 61 6e 64 20 0a 2a 2a   parser, and .**
0050: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
0060: 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 72  ion of the inter
0070: 66 61 63 65 20 69 6e 20 74 68 2e 68 2e 0a 2a 2f  face in th.h..*/
0080: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 68 2e 68  ..#include "th.h
0090: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  ".#include <stri
00a0: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
00b0: 61 73 73 65 72 74 2e 68 3e 0a 0a 74 79 70 65 64  assert.h>..typed
00c0: 65 66 20 73 74 72 75 63 74 20 54 68 5f 43 6f 6d  ef struct Th_Com
00d0: 6d 61 6e 64 20 20 20 54 68 5f 43 6f 6d 6d 61 6e  mand   Th_Comman
00e0: 64 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  d;.typedef struc
00f0: 74 20 54 68 5f 46 72 61 6d 65 20 20 20 20 20 54  t Th_Frame     T
0100: 68 5f 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66  h_Frame;.typedef
0110: 20 73 74 72 75 63 74 20 54 68 5f 56 61 72 69 61   struct Th_Varia
0120: 62 6c 65 20 20 54 68 5f 56 61 72 69 61 62 6c 65  ble  Th_Variable
0130: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  ;../*.** Interpr
0140: 65 74 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a  eter structure..
0150: 2a 2f 0a 73 74 72 75 63 74 20 54 68 5f 49 6e 74  */.struct Th_Int
0160: 65 72 70 20 7b 0a 20 20 54 68 5f 56 74 61 62 20  erp {.  Th_Vtab 
0170: 2a 70 56 74 61 62 3b 20 20 20 20 20 2f 2a 20 43  *pVtab;     /* C
0180: 6f 70 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  opy of the argum
0190: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 54 68  ent passed to Th
01a0: 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 20  _CreateInterp() 
01b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75  */.  char *zResu
01c0: 6c 74 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 65  lt;     /* Curre
01d0: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  nt interpreter r
01e0: 65 73 75 6c 74 20 28 54 68 5f 4d 61 6c 6c 6f 63  esult (Th_Malloc
01f0: 28 29 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  ()ed) */.  int n
0200: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 2f  Result;        /
0210: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
0220: 73 20 69 6e 20 7a 52 65 73 75 6c 74 20 2a 2f 0a  s in zResult */.
0230: 20 20 54 68 5f 48 61 73 68 20 2a 70 61 43 6d 64    Th_Hash *paCmd
0240: 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f  ;     /* Table o
0250: 66 20 72 65 67 69 73 74 65 72 65 64 20 63 6f 6d  f registered com
0260: 6d 61 6e 64 73 20 2a 2f 0a 20 20 54 68 5f 46 72  mands */.  Th_Fr
0270: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 2f  ame *pFrame;   /
0280: 2a 20 43 75 72 72 65 6e 74 20 65 78 65 63 75 74  * Current execut
0290: 69 6f 6e 20 66 72 61 6d 65 20 2a 2f 0a 20 20 69  ion frame */.  i
02a0: 6e 74 20 69 73 4c 69 73 74 4d 6f 64 65 3b 20 20  nt isListMode;  
02b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
02c0: 53 70 6c 69 74 4c 69 73 74 28 29 20 73 68 6f 75  SplitList() shou
02d0: 6c 64 20 6f 70 65 72 61 74 65 20 69 6e 20 22 6c  ld operate in "l
02e0: 69 73 74 22 20 6d 6f 64 65 20 2a 2f 0a 7d 3b 0a  ist" mode */.};.
02f0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 54 48 20 63  ./*.** Each TH c
0300: 6f 6d 6d 61 6e 64 20 72 65 67 69 73 74 65 72 65  ommand registere
0310: 64 20 75 73 69 6e 67 20 54 68 5f 43 72 65 61 74  d using Th_Creat
0320: 65 43 6f 6d 6d 61 6e 64 28 29 20 69 73 20 72 65  eCommand() is re
0330: 70 72 65 73 65 6e 74 65 64 0a 2a 2a 20 62 79 20  presented.** by 
0340: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0350: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0360: 75 63 74 75 72 65 20 73 74 6f 72 65 64 20 69 6e  ucture stored in
0370: 20 74 68 65 20 54 68 5f 49 6e 74 65 72 70 2e 70   the Th_Interp.p
0380: 61 43 6d 64 0a 2a 2a 20 68 61 73 68 2d 74 61 62  aCmd.** hash-tab
0390: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 68  le..*/.struct Th
03a0: 5f 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 69 6e 74  _Command {.  int
03b0: 20 28 2a 78 50 72 6f 63 29 28 54 68 5f 49 6e 74   (*xProc)(Th_Int
03c0: 65 72 70 20 2a 2c 20 76 6f 69 64 20 2a 2c 20 69  erp *, void *, i
03d0: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  nt, const char *
03e0: 2a 2c 20 69 6e 74 20 2a 29 3b 0a 20 20 76 6f 69  *, int *);.  voi
03f0: 64 20 2a 70 43 6f 6e 74 65 78 74 3b 0a 20 20 76  d *pContext;.  v
0400: 6f 69 64 20 28 2a 78 44 65 6c 29 28 54 68 5f 49  oid (*xDel)(Th_I
0410: 6e 74 65 72 70 20 2a 2c 20 76 6f 69 64 20 2a 29  nterp *, void *)
0420: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.};../*.** Each
0430: 20 73 74 61 63 6b 20 66 72 61 6d 65 20 28 76 61   stack frame (va
0440: 72 69 61 62 6c 65 20 73 63 6f 70 65 29 20 69 73  riable scope) is
0450: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
0460: 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  an instance.** o
0470: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
0480: 2e 20 56 61 72 69 61 62 6c 65 20 76 61 6c 75 65  . Variable value
0490: 73 20 73 65 74 20 75 73 69 6e 67 20 74 68 65 20  s set using the 
04a0: 54 68 5f 53 65 74 56 61 72 20 63 6f 6d 6d 61 6e  Th_SetVar comman
04b0: 64 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  d.** are stored 
04c0: 69 6e 20 74 68 65 20 54 68 5f 46 72 61 6d 65 2e  in the Th_Frame.
04d0: 70 61 56 61 72 20 68 61 73 68 20 74 61 62 6c 65  paVar hash table
04e0: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 61   member of the a
04f0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 73 74 61  ssociated.** sta
0500: 63 6b 20 66 72 61 6d 65 20 6f 62 6a 65 63 74 2e  ck frame object.
0510: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 69  .**.** When an i
0520: 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 63 72  nterpreter is cr
0530: 65 61 74 65 64 2c 20 61 20 73 69 6e 67 6c 65 20  eated, a single 
0540: 54 68 5f 46 72 61 6d 65 20 73 74 72 75 63 74 75  Th_Frame structu
0550: 72 65 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 6c  re is also.** al
0560: 6c 6f 63 61 74 65 64 20 2d 20 74 68 65 20 67 6c  located - the gl
0570: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 73 63  obal variable sc
0580: 6f 70 65 2e 20 54 68 5f 49 6e 74 65 72 70 2e 70  ope. Th_Interp.p
0590: 46 72 61 6d 65 20 28 74 68 65 20 63 75 72 72 65  Frame (the curre
05a0: 6e 74 0a 2a 2a 20 69 6e 74 65 72 70 72 65 74 65  nt.** interprete
05b0: 72 20 66 72 61 6d 65 29 20 69 73 20 69 6e 69 74  r frame) is init
05c0: 69 61 6c 69 73 65 64 20 74 6f 20 70 6f 69 6e 74  ialised to point
05d0: 20 74 6f 20 74 68 69 73 20 54 68 5f 46 72 61 6d   to this Th_Fram
05e0: 65 2e 20 49 74 20 69 73 20 0a 2a 2a 20 6e 6f 74  e. It is .** not
05f0: 20 64 65 6c 65 74 65 64 20 66 6f 72 20 74 68 65   deleted for the
0600: 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65   lifetime of the
0610: 20 69 6e 74 65 72 70 72 65 74 65 72 20 28 62 65   interpreter (be
0620: 63 61 75 73 65 20 74 68 65 20 67 6c 6f 62 61 6c  cause the global
0630: 20 0a 2a 2a 20 66 72 61 6d 65 20 6e 65 76 65 72   .** frame never
0640: 20 67 6f 65 73 20 6f 75 74 20 6f 66 20 73 63 6f   goes out of sco
0650: 70 65 29 2e 0a 2a 2a 0a 2a 2a 20 4e 65 77 20 73  pe)..**.** New s
0660: 74 61 63 6b 20 66 72 61 6d 65 73 20 61 72 65 20  tack frames are 
0670: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 54  created by the T
0680: 68 5f 49 6e 46 72 61 6d 65 28 29 20 66 75 6e 63  h_InFrame() func
0690: 74 69 6f 6e 2e 20 42 65 66 6f 72 65 0a 2a 2a 20  tion. Before.** 
06a0: 69 6e 76 6f 6b 69 6e 67 20 69 74 73 20 63 61 6c  invoking its cal
06b0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2c 20  lback function, 
06c0: 54 68 5f 49 6e 46 72 61 6d 65 28 29 20 61 6c 6c  Th_InFrame() all
06d0: 6f 63 61 74 65 73 20 61 20 6e 65 77 20 54 68 5f  ocates a new Th_
06e0: 46 72 61 6d 65 0a 2a 2a 20 73 74 72 75 63 74 75  Frame.** structu
06f0: 72 65 20 77 69 74 68 20 70 43 61 6c 6c 65 72 20  re with pCaller 
0700: 73 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  set to the curre
0710: 6e 74 20 66 72 61 6d 65 20 28 54 68 5f 49 6e 74  nt frame (Th_Int
0720: 65 72 70 2e 70 46 72 61 6d 65 29 2c 0a 2a 2a 20  erp.pFrame),.** 
0730: 61 6e 64 20 73 65 74 73 20 74 68 65 20 63 75 72  and sets the cur
0740: 72 65 6e 74 20 66 72 61 6d 65 20 74 6f 20 74 68  rent frame to th
0750: 65 20 6e 65 77 20 66 72 61 6d 65 20 6f 62 6a 65  e new frame obje
0760: 63 74 2e 20 41 66 74 65 72 20 74 68 65 20 63 61  ct. After the ca
0770: 6c 6c 62 61 63 6b 0a 2a 2a 20 68 61 73 20 62 65  llback.** has be
0780: 65 6e 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 20  en invoked, the 
0790: 61 6c 6c 6f 63 61 74 65 64 20 54 68 5f 46 72 61  allocated Th_Fra
07a0: 6d 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e  me is deleted an
07b0: 64 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  d the value.** o
07c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  f the current fr
07d0: 61 6d 65 20 70 6f 69 6e 74 65 72 20 72 65 73 74  ame pointer rest
07e0: 6f 72 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 42 79 20  ored..** .** By 
07f0: 64 65 66 61 75 6c 74 2c 20 74 68 65 20 54 68 5f  default, the Th_
0800: 53 65 74 56 61 72 28 29 2c 20 54 68 5f 55 6e 73  SetVar(), Th_Uns
0810: 65 74 56 61 72 28 29 20 61 6e 64 20 54 68 5f 47  etVar() and Th_G
0820: 65 74 56 61 72 28 29 20 66 75 6e 63 74 69 6f 6e  etVar() function
0830: 73 20 0a 2a 2a 20 61 63 63 65 73 73 20 76 61 72  s .** access var
0840: 69 61 62 6c 65 20 76 61 6c 75 65 73 20 69 6e 20  iable values in 
0850: 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
0860: 65 2e 20 49 66 20 74 68 65 79 20 6e 65 65 64 20  e. If they need 
0870: 74 6f 20 61 63 63 65 73 73 20 0a 2a 2a 20 74 68  to access .** th
0880: 65 20 67 6c 6f 62 61 6c 20 66 72 61 6d 65 2c 20  e global frame, 
0890: 74 68 65 79 20 64 6f 20 73 6f 20 62 79 20 74 72  they do so by tr
08a0: 61 76 65 72 73 69 6e 67 20 74 68 65 20 70 43 61  aversing the pCa
08b0: 6c 6c 65 72 20 70 6f 69 6e 74 65 72 20 6c 69 73  ller pointer lis
08c0: 74 2e 0a 2a 2a 20 4c 69 6b 65 77 69 73 65 2c 20  t..** Likewise, 
08d0: 74 68 65 20 54 68 5f 4c 69 6e 6b 56 61 72 28 29  the Th_LinkVar()
08e0: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74   function uses t
08f0: 68 65 20 70 43 61 6c 6c 65 72 20 70 6f 69 6e 74  he pCaller point
0900: 65 72 73 20 74 6f 20 0a 2a 2a 20 6c 69 6e 6b 20  ers to .** link 
0910: 74 6f 20 76 61 72 69 61 62 6c 65 73 20 6c 6f 63  to variables loc
0920: 61 74 65 64 20 69 6e 20 74 68 65 20 67 6c 6f 62  ated in the glob
0930: 61 6c 20 6f 72 20 6f 74 68 65 72 20 73 74 61 63  al or other stac
0940: 6b 20 66 72 61 6d 65 73 2e 0a 2a 2f 0a 73 74 72  k frames..*/.str
0950: 75 63 74 20 54 68 5f 46 72 61 6d 65 20 7b 0a 20  uct Th_Frame {. 
0960: 20 54 68 5f 48 61 73 68 20 2a 70 61 56 61 72 3b   Th_Hash *paVar;
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0980: 2a 20 56 61 72 69 61 62 6c 65 73 20 64 65 66 69  * Variables defi
0990: 6e 65 64 20 69 6e 20 74 68 69 73 20 73 63 6f 70  ned in this scop
09a0: 65 20 2a 2f 0a 20 20 54 68 5f 46 72 61 6d 65 20  e */.  Th_Frame 
09b0: 2a 70 43 61 6c 6c 65 72 3b 20 20 20 20 20 20 20  *pCaller;       
09c0: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20       /* Calling 
09d0: 66 72 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  frame */.};../*.
09e0: 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72  ** This structur
09f0: 65 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 76  e represents a v
0a00: 61 6c 75 65 20 61 73 73 69 67 6e 65 64 20 74 6f  alue assigned to
0a10: 20 61 20 74 68 31 20 76 61 72 69 61 62 6c 65 2e   a th1 variable.
0a20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 68 5f 46 72  .**.** The Th_Fr
0a30: 61 6d 65 2e 70 61 56 61 72 20 68 61 73 68 20 74  ame.paVar hash t
0a40: 61 62 6c 65 20 6d 61 70 73 20 66 72 6f 6d 20 76  able maps from v
0a50: 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 28 61 20  ariable name (a 
0a60: 74 68 31 20 73 74 72 69 6e 67 29 0a 2a 2a 20 74  th1 string).** t
0a70: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  o a pointer to a
0a80: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0a90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0aa0: 63 74 75 72 65 2e 20 4d 6f 72 65 20 74 68 61 6e  cture. More than
0ab0: 0a 2a 2a 20 6f 6e 65 20 68 61 73 68 20 74 61 62  .** one hash tab
0ac0: 6c 65 20 65 6e 74 72 79 20 6d 61 79 20 6d 61 70  le entry may map
0ad0: 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72   to a single str
0ae0: 75 63 74 75 72 65 20 69 66 20 76 61 72 69 61 62  ucture if variab
0af0: 6c 65 0a 2a 2a 20 6c 69 6e 6b 73 20 68 61 76 65  le.** links have
0b00: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 75 73   been created us
0b10: 69 6e 67 20 54 68 5f 4c 69 6e 6b 56 61 72 28 29  ing Th_LinkVar()
0b20: 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  . The number of 
0b30: 72 65 66 65 72 65 6e 63 65 73 0a 2a 2a 20 69 73  references.** is
0b40: 20 73 74 6f 72 65 64 20 69 6e 20 54 68 5f 56 61   stored in Th_Va
0b50: 72 69 61 62 6c 65 2e 6e 52 65 66 2e 0a 2a 2a 0a  riable.nRef..**.
0b60: 2a 2a 20 46 6f 72 20 73 63 61 6c 61 72 20 76 61  ** For scalar va
0b70: 72 69 61 62 6c 65 73 2c 20 54 68 5f 56 61 72 69  riables, Th_Vari
0b80: 61 62 6c 65 2e 7a 44 61 74 61 20 69 73 20 6e 65  able.zData is ne
0b90: 76 65 72 20 30 2e 20 54 68 5f 56 61 72 69 61 62  ver 0. Th_Variab
0ba0: 6c 65 2e 6e 44 61 74 61 0a 2a 2a 20 73 74 6f 72  le.nData.** stor
0bb0: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
0bc0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 76 61   bytes in the va
0bd0: 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lue pointed to b
0be0: 79 20 7a 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 46  y zData..**.** F
0bf0: 6f 72 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  or an array vari
0c00: 61 62 6c 65 2c 20 54 68 5f 56 61 72 69 61 62 6c  able, Th_Variabl
0c10: 65 2e 7a 44 61 74 61 20 69 73 20 30 20 61 6e 64  e.zData is 0 and
0c20: 20 70 48 61 73 68 20 70 6f 69 6e 74 73 20 74 6f   pHash points to
0c30: 0a 2a 2a 20 61 20 68 61 73 68 20 74 61 62 6c 65  .** a hash table
0c40: 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e   mapping between
0c50: 20 61 72 72 61 79 20 6b 65 79 20 6e 61 6d 65 20   array key name 
0c60: 28 61 20 74 68 31 20 73 74 72 69 6e 67 29 20 61  (a th1 string) a
0c70: 6e 64 0a 2a 2a 20 61 20 74 68 65 20 70 6f 69 6e  nd.** a the poin
0c80: 74 65 72 20 74 6f 20 74 68 65 20 54 68 5f 56 61  ter to the Th_Va
0c90: 72 69 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  riable structure
0ca0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 63 61   holding the sca
0cb0: 6c 61 72 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  lar.** value..*/
0cc0: 0a 73 74 72 75 63 74 20 54 68 5f 56 61 72 69 61  .struct Th_Varia
0cd0: 62 6c 65 20 7b 0a 20 20 69 6e 74 20 6e 52 65 66  ble {.  int nRef
0ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0cf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0d00: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
0d10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
0d20: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20  .  int nData;   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0d40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
0d50: 73 20 61 74 20 54 68 5f 56 61 72 69 61 62 6c 65  s at Th_Variable
0d60: 2e 7a 44 61 74 61 20 2a 2f 0a 20 20 63 68 61 72  .zData */.  char
0d70: 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 20 20 20   *zData;        
0d80: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
0d90: 6f 72 20 73 63 61 6c 61 72 20 76 61 72 69 61 62  or scalar variab
0da0: 6c 65 73 20 2a 2f 0a 20 20 54 68 5f 48 61 73 68  les */.  Th_Hash
0db0: 20 2a 70 48 61 73 68 3b 20 20 20 20 20 20 20 20   *pHash;        
0dc0: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
0dd0: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 73   array variables
0de0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.};../*.** Ha
0df0: 73 68 20 74 61 62 6c 65 20 41 50 49 3a 0a 2a 2f  sh table API:.*/
0e00: 0a 23 64 65 66 69 6e 65 20 54 48 5f 48 41 53 48  .#define TH_HASH
0e10: 53 49 5a 45 20 32 35 37 0a 73 74 72 75 63 74 20  SIZE 257.struct 
0e20: 54 68 5f 48 61 73 68 20 7b 0a 20 20 54 68 5f 48  Th_Hash {.  Th_H
0e30: 61 73 68 45 6e 74 72 79 20 2a 61 5b 54 48 5f 48  ashEntry *a[TH_H
0e40: 41 53 48 53 49 5a 45 5d 3b 0a 7d 3b 0a 0a 73 74  ASHSIZE];.};..st
0e50: 61 74 69 63 20 69 6e 74 20 74 68 45 76 61 6c 4c  atic int thEvalL
0e60: 6f 63 61 6c 28 54 68 5f 49 6e 74 65 72 70 20 2a  ocal(Th_Interp *
0e70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  , const char *, 
0e80: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
0e90: 20 74 68 53 70 6c 69 74 4c 69 73 74 28 54 68 5f   thSplitList(Th_
0ea0: 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63  Interp*, const c
0eb0: 68 61 72 2a 2c 20 69 6e 74 2c 20 63 68 61 72 2a  har*, int, char*
0ec0: 2a 2a 2c 20 69 6e 74 20 2a 2a 2c 20 69 6e 74 2a  **, int **, int*
0ed0: 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  );..static int t
0ee0: 68 48 65 78 64 69 67 69 74 28 63 68 61 72 20 63  hHexdigit(char c
0ef0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68  );.static int th
0f00: 45 6e 64 4f 66 4c 69 6e 65 28 63 6f 6e 73 74 20  EndOfLine(const 
0f10: 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73  char *, int);..s
0f20: 74 61 74 69 63 20 69 6e 74 20 20 74 68 50 75 73  tatic int  thPus
0f30: 68 46 72 61 6d 65 28 54 68 5f 49 6e 74 65 72 70  hFrame(Th_Interp
0f40: 2a 2c 20 54 68 5f 46 72 61 6d 65 2a 29 3b 0a 73  *, Th_Frame*);.s
0f50: 74 61 74 69 63 20 76 6f 69 64 20 74 68 50 6f 70  tatic void thPop
0f60: 46 72 61 6d 65 28 54 68 5f 49 6e 74 65 72 70 2a  Frame(Th_Interp*
0f70: 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
0f80: 74 68 46 72 65 65 56 61 72 69 61 62 6c 65 28 54  thFreeVariable(T
0f90: 68 5f 48 61 73 68 45 6e 74 72 79 2a 2c 20 76 6f  h_HashEntry*, vo
0fa0: 69 64 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  id*);.static voi
0fb0: 64 20 74 68 46 72 65 65 43 6f 6d 6d 61 6e 64 28  d thFreeCommand(
0fc0: 54 68 5f 48 61 73 68 45 6e 74 72 79 2a 2c 20 76  Th_HashEntry*, v
0fd0: 6f 69 64 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  oid*);../*.** Th
0fe0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
0ff0: 75 73 65 64 20 62 79 20 62 6f 74 68 20 74 68 65  used by both the
1000: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
1010: 6c 61 6e 67 75 61 67 65 20 70 61 72 73 65 72 73  language parsers
1020: 2e 0a 2a 2a 20 47 69 76 65 6e 20 74 68 61 74 20  ..** Given that 
1030: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1040: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 28 7a   input string (z
1050: 2c 20 6e 29 20 69 73 20 61 20 6c 61 6e 67 75 61  , n) is a langua
1060: 67 65 20 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74  ge .** construct
1070: 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74   of the relevant
1080: 20 74 79 70 65 20 28 61 20 63 6f 6d 6d 61 6e 64   type (a command
1090: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 5b 5d 2c   enclosed in [],
10a0: 20 61 6e 20 65 73 63 61 70 65 0a 2a 2a 20 73 65   an escape.** se
10b0: 71 75 65 6e 63 65 20 65 74 63 2e 29 2c 20 74 68  quence etc.), th
10c0: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 64 65  ese functions de
10d0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62  termine the numb
10e0: 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 6f  er of bytes.** o
10f0: 66 20 74 68 65 20 69 6e 70 75 74 20 63 6f 6e 73  f the input cons
1100: 75 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 73  umed by the cons
1110: 74 72 75 63 74 2e 20 46 6f 72 20 65 78 61 6d 70  truct. For examp
1120: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20  le:.**.**   int 
1130: 6e 42 79 74 65 3b 0a 2a 2a 20 20 20 74 68 4e 65  nByte;.**   thNe
1140: 78 74 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  xtCommand(interp
1150: 2c 20 22 5b 65 78 70 72 20 24 61 2b 31 5d 20 24  , "[expr $a+1] $
1160: 6e 49 74 65 72 22 2c 20 31 38 2c 20 26 6e 42 79  nIter", 18, &nBy
1170: 74 65 29 3b 0a 2a 2a 0a 2a 2a 20 72 65 73 75 6c  te);.**.** resul
1180: 74 73 20 69 6e 20 76 61 72 69 61 62 6c 65 20 6e  ts in variable n
1190: 42 79 74 65 20 62 65 69 6e 67 20 73 65 74 20 74  Byte being set t
11a0: 6f 20 31 31 2e 20 4f 72 2c 20 0a 2a 2a 0a 2a 2a  o 11. Or, .**.**
11b0: 20 20 20 74 68 4e 65 78 74 56 61 72 6e 61 6d 65     thNextVarname
11c0: 28 69 6e 74 65 72 70 2c 20 22 24 61 2b 31 22 2c  (interp, "$a+1",
11d0: 20 34 2c 20 26 6e 42 79 74 65 29 3b 0a 2a 2a 0a   4, &nByte);.**.
11e0: 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 6e 42  ** results in nB
11f0: 79 74 65 20 62 65 69 6e 67 20 73 65 74 20 74 6f  yte being set to
1200: 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   2..*/.static in
1210: 74 20 74 68 4e 65 78 74 43 6f 6d 6d 61 6e 64 28  t thNextCommand(
1220: 54 68 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73  Th_Interp*, cons
1230: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1240: 2c 20 69 6e 74 20 2a 70 4e 29 3b 0a 73 74 61 74  , int *pN);.stat
1250: 69 63 20 69 6e 74 20 74 68 4e 65 78 74 45 73 63  ic int thNextEsc
1260: 61 70 65 20 28 54 68 5f 49 6e 74 65 72 70 2a 2c  ape (Th_Interp*,
1270: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
1280: 69 6e 74 20 6e 2c 20 69 6e 74 20 2a 70 4e 29 3b  int n, int *pN);
1290: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 4e 65  .static int thNe
12a0: 78 74 56 61 72 6e 61 6d 65 28 54 68 5f 49 6e 74  xtVarname(Th_Int
12b0: 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  erp*, const char
12c0: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
12d0: 2a 70 4e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  *pN);.static int
12e0: 20 74 68 4e 65 78 74 4e 75 6d 62 65 72 20 28 54   thNextNumber (T
12f0: 68 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74  h_Interp*, const
1300: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
1310: 20 69 6e 74 20 2a 70 4e 29 3b 0a 73 74 61 74 69   int *pN);.stati
1320: 63 20 69 6e 74 20 74 68 4e 65 78 74 53 70 61 63  c int thNextSpac
1330: 65 20 20 28 54 68 5f 49 6e 74 65 72 70 2a 2c 20  e  (Th_Interp*, 
1340: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1350: 6e 74 20 6e 2c 20 69 6e 74 20 2a 70 4e 29 3b 0a  nt n, int *pN);.
1360: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 61  ./*.** Given tha
1370: 74 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  t the input stri
1380: 6e 67 20 28 7a 2c 20 6e 29 20 63 6f 6e 74 61 69  ng (z, n) contai
1390: 6e 73 20 61 20 6c 61 6e 67 75 61 67 65 20 63 6f  ns a language co
13a0: 6e 73 74 72 75 63 74 20 6f 66 0a 2a 2a 20 74 68  nstruct of.** th
13b0: 65 20 72 65 6c 65 76 61 6e 74 20 74 79 70 65 20  e relevant type 
13c0: 28 61 20 63 6f 6d 6d 61 6e 64 20 65 6e 63 6c 6f  (a command enclo
13d0: 73 65 64 20 69 6e 20 5b 5d 2c 20 61 6e 20 65 73  sed in [], an es
13e0: 63 61 70 65 20 73 65 71 75 65 6e 63 65 20 0a 2a  cape sequence .*
13f0: 2a 20 6c 69 6b 65 20 22 5c 78 46 46 22 20 6f 72  * like "\xFF" or
1400: 20 61 20 76 61 72 69 61 62 6c 65 20 72 65 66 65   a variable refe
1410: 72 65 6e 63 65 20 6c 69 6b 65 20 22 24 7b 76 61  rence like "${va
1420: 72 6e 61 6d 65 7d 22 2c 20 70 65 72 66 6f 72 6d  rname}", perform
1430: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 69 6f 6e  .** substitution
1440: 20 6f 6e 20 74 68 65 20 73 74 72 69 6e 67 20 61   on the string a
1450: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1460: 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 20 69 6e  ulting string in
1470: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 70 72 65  .** the interpre
1480: 74 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  ter result..*/.s
1490: 74 61 74 69 63 20 69 6e 74 20 74 68 53 75 62 73  tatic int thSubs
14a0: 74 43 6f 6d 6d 61 6e 64 28 54 68 5f 49 6e 74 65  tCommand(Th_Inte
14b0: 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rp*, const char 
14c0: 2a 7a 2c 20 69 6e 74 20 6e 29 3b 0a 73 74 61 74  *z, int n);.stat
14d0: 69 63 20 69 6e 74 20 74 68 53 75 62 73 74 45 73  ic int thSubstEs
14e0: 63 61 70 65 20 28 54 68 5f 49 6e 74 65 72 70 2a  cape (Th_Interp*
14f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
1500: 20 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20   int n);.static 
1510: 69 6e 74 20 74 68 53 75 62 73 74 56 61 72 6e 61  int thSubstVarna
1520: 6d 65 28 54 68 5f 49 6e 74 65 72 70 2a 2c 20 63  me(Th_Interp*, c
1530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
1540: 74 20 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t n);../*.** Giv
1550: 65 6e 20 74 68 61 74 20 74 68 65 72 65 20 69 73  en that there is
1560: 20 61 20 74 68 31 20 77 6f 72 64 20 6c 6f 63 61   a th1 word loca
1570: 74 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  ted at the start
1580: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 0a 2a   of the input .*
1590: 2a 20 73 74 72 69 6e 67 20 28 7a 2c 20 6e 29 2c  * string (z, n),
15a0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c   determine the l
15b0: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
15c0: 66 20 74 68 61 74 20 77 6f 72 64 2e 20 49 66 20  f that word. If 
15d0: 74 68 65 0a 2a 2a 20 69 73 43 6d 64 20 61 72 67  the.** isCmd arg
15e0: 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
15f0: 6f 2c 20 74 68 65 6e 20 61 6e 20 75 6e 65 73 63  o, then an unesc
1600: 61 70 65 64 20 22 3b 22 20 62 79 74 65 20 6e 6f  aped ";" byte no
1610: 74 20 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 69 6e  t .** located in
1620: 73 69 64 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20  side of a block 
1630: 6f 72 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67  or quoted string
1640: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
1650: 6f 20 6d 61 72 6b 20 0a 2a 2a 20 74 68 65 20 65  o mark .** the e
1660: 6e 64 20 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a  nd of the word..
1670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68  */.static int th
1680: 4e 65 78 74 57 6f 72 64 28 54 68 5f 49 6e 74 65  NextWord(Th_Inte
1690: 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rp*, const char 
16a0: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 2a  *z, int n, int *
16b0: 70 4e 2c 20 69 6e 74 20 69 73 43 6d 64 29 3b 0a  pN, int isCmd);.
16c0: 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 73  ./*.** Perform s
16d0: 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 6e 20 74  ubstitution on t
16e0: 68 65 20 77 6f 72 64 20 63 6f 6e 74 61 69 6e 65  he word containe
16f0: 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73  d in the input s
1700: 74 72 69 6e 67 20 28 7a 2c 20 6e 29 2e 0a 2a 2a  tring (z, n)..**
1710: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
1720: 74 69 6e 67 20 73 74 72 69 6e 67 20 69 6e 20 74  ting string in t
1730: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  he interpreter r
1740: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
1750: 20 69 6e 74 20 74 68 53 75 62 73 74 57 6f 72 64   int thSubstWord
1760: 28 54 68 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e  (Th_Interp*, con
1770: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1780: 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 42  n);../*.** The B
1790: 75 66 66 65 72 20 73 74 72 75 63 74 75 72 65 20  uffer structure 
17a0: 61 6e 64 20 74 68 65 20 74 68 42 75 66 66 65 72  and the thBuffer
17b0: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
17c0: 61 72 65 20 75 73 65 64 20 74 6f 20 6d 61 6b 65  are used to make
17d0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  .** memory alloc
17e0: 61 74 69 6f 6e 20 65 61 73 69 65 72 20 77 68 65  ation easier whe
17f0: 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
1800: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 72 75 63  result..*/.struc
1810: 74 20 42 75 66 66 65 72 20 7b 0a 20 20 63 68 61  t Buffer {.  cha
1820: 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 6e  r *zBuf;.  int n
1830: 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42 75 66 41  Buf;.  int nBufA
1840: 6c 6c 6f 63 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  lloc;.};.typedef
1850: 20 73 74 72 75 63 74 20 42 75 66 66 65 72 20 42   struct Buffer B
1860: 75 66 66 65 72 3b 0a 73 74 61 74 69 63 20 69 6e  uffer;.static in
1870: 74 20 20 74 68 42 75 66 66 65 72 57 72 69 74 65  t  thBufferWrite
1880: 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  (Th_Interp *inte
1890: 72 70 2c 20 42 75 66 66 65 72 20 2a 2c 20 63 6f  rp, Buffer *, co
18a0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29  nst char *, int)
18b0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 68  ;.static void th
18c0: 42 75 66 66 65 72 49 6e 69 74 28 42 75 66 66 65  BufferInit(Buffe
18d0: 72 20 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  r *);.static voi
18e0: 64 20 74 68 42 75 66 66 65 72 46 72 65 65 28 54  d thBufferFree(T
18f0: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  h_Interp *interp
1900: 2c 20 42 75 66 66 65 72 20 2a 29 3b 0a 0a 2f 2a  , Buffer *);../*
1910: 0a 2a 2a 20 41 70 70 65 6e 64 20 6e 41 64 64 20  .** Append nAdd 
1920: 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  bytes of content
1930: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 7a 41 64   copied from zAd
1940: 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
1950: 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 66 65  buffer.** pBuffe
1960: 72 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  r. If there is n
1970: 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ot enough space 
1980: 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61  currently alloca
1990: 74 65 64 2c 20 72 65 73 69 7a 65 0a 2a 2a 20 74  ted, resize.** t
19a0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f  he allocation to
19b0: 20 6d 61 6b 65 20 73 70 61 63 65 2e 0a 2a 2f 0a   make space..*/.
19c0: 73 74 61 74 69 63 20 69 6e 74 20 74 68 42 75 66  static int thBuf
19d0: 66 65 72 57 72 69 74 65 28 0a 20 20 54 68 5f 49  ferWrite(.  Th_I
19e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
19f0: 20 20 42 75 66 66 65 72 20 2a 70 42 75 66 66 65    Buffer *pBuffe
1a00: 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r, .  const char
1a10: 20 2a 7a 41 64 64 2c 20 0a 20 20 69 6e 74 20 6e   *zAdd, .  int n
1a20: 41 64 64 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65  Add.){.  int nRe
1a30: 71 3b 0a 0a 20 20 69 66 28 20 6e 41 64 64 3c 30  q;..  if( nAdd<0
1a40: 20 29 7b 0a 20 20 20 20 6e 41 64 64 20 3d 20 74   ){.    nAdd = t
1a50: 68 5f 73 74 72 6c 65 6e 28 7a 41 64 64 29 3b 0a  h_strlen(zAdd);.
1a60: 20 20 7d 0a 20 20 6e 52 65 71 20 3d 20 70 42 75    }.  nReq = pBu
1a70: 66 66 65 72 2d 3e 6e 42 75 66 2b 6e 41 64 64 2b  ffer->nBuf+nAdd+
1a80: 31 3b 0a 0a 20 20 69 66 28 20 6e 52 65 71 3e 70  1;..  if( nReq>p
1a90: 42 75 66 66 65 72 2d 3e 6e 42 75 66 41 6c 6c 6f  Buffer->nBufAllo
1aa0: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
1ab0: 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  New;.    int nNe
1ac0: 77 3b 0a 0a 20 20 20 20 6e 4e 65 77 20 3d 20 6e  w;..    nNew = n
1ad0: 52 65 71 2a 32 3b 0a 20 20 20 20 7a 4e 65 77 20  Req*2;.    zNew 
1ae0: 3d 20 28 63 68 61 72 20 2a 29 54 68 5f 4d 61 6c  = (char *)Th_Mal
1af0: 6c 6f 63 28 69 6e 74 65 72 70 2c 20 6e 4e 65 77  loc(interp, nNew
1b00: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e  );.    memcpy(zN
1b10: 65 77 2c 20 70 42 75 66 66 65 72 2d 3e 7a 42 75  ew, pBuffer->zBu
1b20: 66 2c 20 70 42 75 66 66 65 72 2d 3e 6e 42 75 66  f, pBuffer->nBuf
1b30: 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69  );.    Th_Free(i
1b40: 6e 74 65 72 70 2c 20 70 42 75 66 66 65 72 2d 3e  nterp, pBuffer->
1b50: 7a 42 75 66 29 3b 0a 20 20 20 20 70 42 75 66 66  zBuf);.    pBuff
1b60: 65 72 2d 3e 6e 42 75 66 41 6c 6c 6f 63 20 3d 20  er->nBufAlloc = 
1b70: 6e 4e 65 77 3b 0a 20 20 20 20 70 42 75 66 66 65  nNew;.    pBuffe
1b80: 72 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65 77 3b 0a  r->zBuf = zNew;.
1b90: 20 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 26 70    }..  memcpy(&p
1ba0: 42 75 66 66 65 72 2d 3e 7a 42 75 66 5b 70 42 75  Buffer->zBuf[pBu
1bb0: 66 66 65 72 2d 3e 6e 42 75 66 5d 2c 20 7a 41 64  ffer->nBuf], zAd
1bc0: 64 2c 20 6e 41 64 64 29 3b 0a 20 20 70 42 75 66  d, nAdd);.  pBuf
1bd0: 66 65 72 2d 3e 6e 42 75 66 20 2b 3d 20 6e 41 64  fer->nBuf += nAd
1be0: 64 3b 0a 20 20 70 42 75 66 66 65 72 2d 3e 7a 42  d;.  pBuffer->zB
1bf0: 75 66 5b 70 42 75 66 66 65 72 2d 3e 6e 42 75 66  uf[pBuffer->nBuf
1c00: 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 65 74  ] = '\0';..  ret
1c10: 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 23 64 65  urn TH_OK;.}.#de
1c20: 66 69 6e 65 20 74 68 42 75 66 66 65 72 57 72 69  fine thBufferWri
1c30: 74 65 28 61 2c 62 2c 63 2c 64 29 20 74 68 42 75  te(a,b,c,d) thBu
1c40: 66 66 65 72 57 72 69 74 65 28 61 2c 62 2c 28 63  fferWrite(a,b,(c
1c50: 6f 6e 73 74 20 63 68 61 72 20 2a 29 63 2c 64 29  onst char *)c,d)
1c60: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1c70: 7a 65 20 74 68 65 20 42 75 66 66 65 72 20 73 74  ze the Buffer st
1c80: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
1c90: 74 6f 20 62 79 20 70 42 75 66 66 65 72 2e 0a 2a  to by pBuffer..*
1ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 68  /.static void th
1cb0: 42 75 66 66 65 72 49 6e 69 74 28 42 75 66 66 65  BufferInit(Buffe
1cc0: 72 20 2a 70 42 75 66 66 65 72 29 7b 0a 20 20 6d  r *pBuffer){.  m
1cd0: 65 6d 73 65 74 28 70 42 75 66 66 65 72 2c 20 30  emset(pBuffer, 0
1ce0: 2c 20 73 69 7a 65 6f 66 28 42 75 66 66 65 72 29  , sizeof(Buffer)
1cf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f  );.}../*.** Zero
1d00: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1d10: 74 65 64 20 74 6f 20 62 79 20 70 42 75 66 66 65  ted to by pBuffe
1d20: 72 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 61  r and free the a
1d30: 73 73 6f 63 69 61 74 65 64 20 6d 65 6d 6f 72 79  ssociated memory
1d40: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  .** allocation..
1d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
1d60: 68 42 75 66 66 65 72 46 72 65 65 28 54 68 5f 49  hBufferFree(Th_I
1d70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 42  nterp *interp, B
1d80: 75 66 66 65 72 20 2a 70 42 75 66 66 65 72 29 7b  uffer *pBuffer){
1d90: 0a 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 72  .  Th_Free(inter
1da0: 70 2c 20 70 42 75 66 66 65 72 2d 3e 7a 42 75 66  p, pBuffer->zBuf
1db0: 29 3b 0a 20 20 74 68 42 75 66 66 65 72 49 6e 69  );.  thBufferIni
1dc0: 74 28 70 42 75 66 66 65 72 29 3b 0a 7d 0a 0a 2f  t(pBuffer);.}../
1dd0: 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 70 61  *.** Assuming pa
1de0: 72 61 6d 65 74 65 72 20 63 20 63 6f 6e 74 61 69  rameter c contai
1df0: 6e 73 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c  ns a hexadecimal
1e00: 20 64 69 67 69 74 20 63 68 61 72 61 63 74 65 72   digit character
1e10: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  ,.** return the 
1e20: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 76 61  corresponding va
1e30: 6c 75 65 20 6f 66 20 74 68 61 74 20 64 69 67 69  lue of that digi
1e40: 74 2e 20 49 66 20 63 20 69 73 20 6e 6f 74 0a 2a  t. If c is not.*
1e50: 2a 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20  * a hexadecimal 
1e60: 64 69 67 69 74 20 63 68 61 72 61 63 74 65 72 2c  digit character,
1e70: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
1e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1e90: 68 48 65 78 64 69 67 69 74 28 63 68 61 72 20 63  hHexdigit(char c
1ea0: 29 7b 0a 20 20 73 77 69 74 63 68 20 28 63 29 20  ){.  switch (c) 
1eb0: 7b 0a 20 20 20 20 63 61 73 65 20 27 30 27 3a 20  {.    case '0': 
1ec0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
1ed0: 73 65 20 27 31 27 3a 20 72 65 74 75 72 6e 20 31  se '1': return 1
1ee0: 3b 0a 20 20 20 20 63 61 73 65 20 27 32 27 3a 20  ;.    case '2': 
1ef0: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63 61  return 2;.    ca
1f00: 73 65 20 27 33 27 3a 20 72 65 74 75 72 6e 20 33  se '3': return 3
1f10: 3b 0a 20 20 20 20 63 61 73 65 20 27 34 27 3a 20  ;.    case '4': 
1f20: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 63 61  return 4;.    ca
1f30: 73 65 20 27 35 27 3a 20 72 65 74 75 72 6e 20 35  se '5': return 5
1f40: 3b 0a 20 20 20 20 63 61 73 65 20 27 36 27 3a 20  ;.    case '6': 
1f50: 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 63 61  return 6;.    ca
1f60: 73 65 20 27 37 27 3a 20 72 65 74 75 72 6e 20 37  se '7': return 7
1f70: 3b 0a 20 20 20 20 63 61 73 65 20 27 38 27 3a 20  ;.    case '8': 
1f80: 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 63 61  return 8;.    ca
1f90: 73 65 20 27 39 27 3a 20 72 65 74 75 72 6e 20 39  se '9': return 9
1fa0: 3b 0a 20 20 20 20 63 61 73 65 20 27 61 27 3a 20  ;.    case 'a': 
1fb0: 63 61 73 65 20 27 41 27 3a 20 72 65 74 75 72 6e  case 'A': return
1fc0: 20 31 30 3b 0a 20 20 20 20 63 61 73 65 20 27 62   10;.    case 'b
1fd0: 27 3a 20 63 61 73 65 20 27 42 27 3a 20 72 65 74  ': case 'B': ret
1fe0: 75 72 6e 20 31 31 3b 0a 20 20 20 20 63 61 73 65  urn 11;.    case
1ff0: 20 27 63 27 3a 20 63 61 73 65 20 27 43 27 3a 20   'c': case 'C': 
2000: 72 65 74 75 72 6e 20 31 32 3b 0a 20 20 20 20 63  return 12;.    c
2010: 61 73 65 20 27 64 27 3a 20 63 61 73 65 20 27 44  ase 'd': case 'D
2020: 27 3a 20 72 65 74 75 72 6e 20 31 33 3b 0a 20 20  ': return 13;.  
2030: 20 20 63 61 73 65 20 27 65 27 3a 20 63 61 73 65    case 'e': case
2040: 20 27 45 27 3a 20 72 65 74 75 72 6e 20 31 34 3b   'E': return 14;
2050: 0a 20 20 20 20 63 61 73 65 20 27 66 27 3a 20 63  .    case 'f': c
2060: 61 73 65 20 27 46 27 3a 20 72 65 74 75 72 6e 20  ase 'F': return 
2070: 31 35 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  15;.  }.  return
2080: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   -1;.}../*.** Ar
2090: 67 75 6d 65 6e 74 20 70 45 6e 74 72 79 20 70 6f  gument pEntry po
20a0: 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
20b0: 20 69 6e 20 61 20 73 74 61 63 6b 20 66 72 61 6d   in a stack fram
20c0: 65 20 68 61 73 68 20 74 61 62 6c 65 0a 2a 2a 20  e hash table.** 
20d0: 28 54 68 5f 46 72 61 6d 65 2e 70 61 56 61 72 29  (Th_Frame.paVar)
20e0: 2e 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  . Decrement the 
20f0: 72 65 66 72 65 72 65 6e 63 65 20 63 6f 75 6e 74  refrerence count
2100: 20 6f 66 20 74 68 65 20 54 68 5f 56 61 72 69 61   of the Th_Varia
2110: 62 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ble.** structure
2120: 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
2130: 70 6f 69 6e 74 73 20 74 6f 2e 20 46 72 65 65 20  points to. Free 
2140: 74 68 65 20 54 68 5f 56 61 72 69 61 62 6c 65 20  the Th_Variable 
2150: 69 66 20 69 74 73 0a 2a 2a 20 72 65 66 65 72 65  if its.** refere
2160: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
2170: 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  s 0..**.** Argum
2180: 65 6e 74 20 70 43 6f 6e 74 65 78 74 20 69 73 20  ent pContext is 
2190: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
21a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 73 74 72   interpreter str
21b0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
21c0: 63 20 76 6f 69 64 20 74 68 46 72 65 65 56 61 72  c void thFreeVar
21d0: 69 61 62 6c 65 28 54 68 5f 48 61 73 68 45 6e 74  iable(Th_HashEnt
21e0: 72 79 20 2a 70 45 6e 74 72 79 2c 20 76 6f 69 64  ry *pEntry, void
21f0: 20 2a 70 43 6f 6e 74 65 78 74 29 7b 0a 20 20 54   *pContext){.  T
2200: 68 5f 56 61 72 69 61 62 6c 65 20 2a 70 56 61 6c  h_Variable *pVal
2210: 75 65 20 3d 20 28 54 68 5f 56 61 72 69 61 62 6c  ue = (Th_Variabl
2220: 65 20 2a 29 70 45 6e 74 72 79 2d 3e 70 44 61 74  e *)pEntry->pDat
2230: 61 3b 0a 20 20 70 56 61 6c 75 65 2d 3e 6e 52 65  a;.  pValue->nRe
2240: 66 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  f--;.  assert( p
2250: 56 61 6c 75 65 2d 3e 6e 52 65 66 3e 3d 30 20 29  Value->nRef>=0 )
2260: 3b 0a 20 20 69 66 28 20 70 56 61 6c 75 65 2d 3e  ;.  if( pValue->
2270: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nRef==0 ){.    T
2280: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  h_Interp *interp
2290: 20 3d 20 28 54 68 5f 49 6e 74 65 72 70 20 2a 29   = (Th_Interp *)
22a0: 70 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 54 68  pContext;.    Th
22b0: 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 70 56  _Free(interp, pV
22c0: 61 6c 75 65 2d 3e 7a 44 61 74 61 29 3b 0a 20 20  alue->zData);.  
22d0: 20 20 69 66 28 20 70 56 61 6c 75 65 2d 3e 70 48    if( pValue->pH
22e0: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 54 68 5f  ash ){.      Th_
22f0: 48 61 73 68 49 74 65 72 61 74 65 28 69 6e 74 65  HashIterate(inte
2300: 72 70 2c 20 70 56 61 6c 75 65 2d 3e 70 48 61 73  rp, pValue->pHas
2310: 68 2c 20 74 68 46 72 65 65 56 61 72 69 61 62 6c  h, thFreeVariabl
2320: 65 2c 20 70 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, pContext);.  
2330: 20 20 20 20 54 68 5f 48 61 73 68 44 65 6c 65 74      Th_HashDelet
2340: 65 28 69 6e 74 65 72 70 2c 20 70 56 61 6c 75 65  e(interp, pValue
2350: 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a  ->pHash);.    }.
2360: 20 20 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65      Th_Free(inte
2370: 72 70 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d  rp, pValue);.  }
2380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
2390: 6e 74 20 70 45 6e 74 72 79 20 70 6f 69 6e 74 73  nt pEntry points
23a0: 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e 20   to an entry in 
23b0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73 68  the command hash
23c0: 20 74 61 62 6c 65 0a 2a 2a 20 28 54 68 5f 49 6e   table.** (Th_In
23d0: 74 65 72 70 2e 70 61 43 6d 64 29 2e 20 44 65 6c  terp.paCmd). Del
23e0: 65 74 65 20 74 68 65 20 54 68 5f 43 6f 6d 6d 61  ete the Th_Comma
23f0: 6e 64 20 73 74 72 75 63 74 75 72 65 20 74 68 61  nd structure tha
2400: 74 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 70  t the.** entry p
2410: 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
2420: 41 72 67 75 6d 65 6e 74 20 70 43 6f 6e 74 65 78  Argument pContex
2430: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
2440: 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
2450: 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  r structure..*/.
2460: 73 74 61 74 69 63 20 76 6f 69 64 20 74 68 46 72  static void thFr
2470: 65 65 43 6f 6d 6d 61 6e 64 28 54 68 5f 48 61 73  eeCommand(Th_Has
2480: 68 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 2c 20  hEntry *pEntry, 
2490: 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 29 7b  void *pContext){
24a0: 0a 20 20 54 68 5f 43 6f 6d 6d 61 6e 64 20 2a 70  .  Th_Command *p
24b0: 43 6f 6d 6d 61 6e 64 20 3d 20 28 54 68 5f 43 6f  Command = (Th_Co
24c0: 6d 6d 61 6e 64 20 2a 29 70 45 6e 74 72 79 2d 3e  mmand *)pEntry->
24d0: 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 43 6f  pData;.  if( pCo
24e0: 6d 6d 61 6e 64 2d 3e 78 44 65 6c 20 29 7b 0a 20  mmand->xDel ){. 
24f0: 20 20 20 70 43 6f 6d 6d 61 6e 64 2d 3e 78 44 65     pCommand->xDe
2500: 6c 28 28 54 68 5f 49 6e 74 65 72 70 20 2a 29 70  l((Th_Interp *)p
2510: 43 6f 6e 74 65 78 74 2c 20 70 43 6f 6d 6d 61 6e  Context, pComman
2520: 64 2d 3e 70 43 6f 6e 74 65 78 74 29 3b 0a 20 20  d->pContext);.  
2530: 7d 0a 20 20 54 68 5f 46 72 65 65 28 28 54 68 5f  }.  Th_Free((Th_
2540: 49 6e 74 65 72 70 20 2a 29 70 43 6f 6e 74 65 78  Interp *)pContex
2550: 74 2c 20 70 45 6e 74 72 79 2d 3e 70 44 61 74 61  t, pEntry->pData
2560: 29 3b 0a 20 20 70 45 6e 74 72 79 2d 3e 70 44 61  );.  pEntry->pDa
2570: 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta = 0;.}../*.**
2580: 20 50 75 73 68 20 61 20 6e 65 77 20 66 72 61 6d   Push a new fram
2590: 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  e onto the stack
25a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25b0: 74 68 50 75 73 68 46 72 61 6d 65 28 54 68 5f 49  thPushFrame(Th_I
25c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54  nterp *interp, T
25d0: 68 5f 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  h_Frame *pFrame)
25e0: 7b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 61 56 61  {.  pFrame->paVa
25f0: 72 20 3d 20 54 68 5f 48 61 73 68 4e 65 77 28 69  r = Th_HashNew(i
2600: 6e 74 65 72 70 29 3b 0a 20 20 70 46 72 61 6d 65  nterp);.  pFrame
2610: 2d 3e 70 43 61 6c 6c 65 72 20 3d 20 69 6e 74 65  ->pCaller = inte
2620: 72 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 69 6e  rp->pFrame;.  in
2630: 74 65 72 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70  terp->pFrame = p
2640: 46 72 61 6d 65 3b 0a 20 20 72 65 74 75 72 6e 20  Frame;.  return 
2650: 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TH_OK;.}../*.** 
2660: 50 6f 70 20 61 20 66 72 61 6d 65 20 6f 66 66 20  Pop a frame off 
2670: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
2680: 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tack..*/.static 
2690: 76 6f 69 64 20 74 68 50 6f 70 46 72 61 6d 65 28  void thPopFrame(
26a0: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  Th_Interp *inter
26b0: 70 29 7b 0a 20 20 54 68 5f 46 72 61 6d 65 20 2a  p){.  Th_Frame *
26c0: 70 46 72 61 6d 65 20 3d 20 69 6e 74 65 72 70 2d  pFrame = interp-
26d0: 3e 70 46 72 61 6d 65 3b 0a 20 20 54 68 5f 48 61  >pFrame;.  Th_Ha
26e0: 73 68 49 74 65 72 61 74 65 28 69 6e 74 65 72 70  shIterate(interp
26f0: 2c 20 70 46 72 61 6d 65 2d 3e 70 61 56 61 72 2c  , pFrame->paVar,
2700: 20 74 68 46 72 65 65 56 61 72 69 61 62 6c 65 2c   thFreeVariable,
2710: 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29   (void *)interp)
2720: 3b 0a 20 20 54 68 5f 48 61 73 68 44 65 6c 65 74  ;.  Th_HashDelet
2730: 65 28 69 6e 74 65 72 70 2c 20 70 46 72 61 6d 65  e(interp, pFrame
2740: 2d 3e 70 61 56 61 72 29 3b 0a 20 20 69 6e 74 65  ->paVar);.  inte
2750: 72 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72  rp->pFrame = pFr
2760: 61 6d 65 2d 3e 70 43 61 6c 6c 65 72 3b 0a 7d 0a  ame->pCaller;.}.
2770: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
2780: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 74 72   part of the str
2790: 69 6e 67 20 28 7a 49 6e 70 75 74 2c 6e 49 6e 70  ing (zInput,nInp
27a0: 75 74 29 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ut) contains an 
27b0: 65 73 63 61 70 65 20 0a 2a 2a 20 73 65 71 75 65  escape .** seque
27c0: 6e 63 65 2e 20 53 65 74 20 2a 70 6e 45 73 63 61  nce. Set *pnEsca
27d0: 70 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  pe to the number
27e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
27f0: 20 65 73 63 61 70 65 20 73 65 71 75 65 6e 63 65   escape sequence
2800: 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  ..** If there is
2810: 20 61 20 70 61 72 73 65 20 65 72 72 6f 72 2c 20   a parse error, 
2820: 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 20  return TH_ERROR 
2830: 61 6e 64 20 73 65 74 20 74 68 65 20 69 6e 74 65  and set the inte
2840: 72 70 72 65 74 65 72 0a 2a 2a 20 72 65 73 75 6c  rpreter.** resul
2850: 74 20 74 6f 20 61 6e 20 65 72 72 6f 72 20 6d 65  t to an error me
2860: 73 73 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  ssage. Otherwise
2870: 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 2e 0a 2a   return TH_OK..*
2880: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 4e  /.static int thN
2890: 65 78 74 45 73 63 61 70 65 28 0a 20 20 54 68 5f  extEscape(.  Th_
28a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
28b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
28c0: 6e 70 75 74 2c 20 0a 20 20 69 6e 74 20 6e 49 6e  nput, .  int nIn
28d0: 70 75 74 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 45  put, .  int *pnE
28e0: 73 63 61 70 65 0a 29 7b 0a 20 20 69 6e 74 20 69  scape.){.  int i
28f0: 20 3d 20 32 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 2;..  assert(
2900: 6e 49 6e 70 75 74 3e 30 29 3b 0a 20 20 61 73 73  nInput>0);.  ass
2910: 65 72 74 28 7a 49 6e 70 75 74 5b 30 5d 3d 3d 27  ert(zInput[0]=='
2920: 5c 5c 27 29 3b 0a 0a 20 20 69 66 28 20 6e 49 6e  \\');..  if( nIn
2930: 70 75 74 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65  put<=1 ){.    re
2940: 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20  turn TH_ERROR;. 
2950: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 7a 49   }..  switch( zI
2960: 6e 70 75 74 5b 31 5d 20 29 7b 0a 20 20 20 20 63  nput[1] ){.    c
2970: 61 73 65 20 27 78 27 3a 20 69 20 3d 20 34 3b 0a  ase 'x': i = 4;.
2980: 20 20 7d 0a 0a 20 20 69 66 28 20 69 3e 6e 49 6e    }..  if( i>nIn
2990: 70 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  put ){.    retur
29a0: 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  n TH_ERROR;.  }.
29b0: 20 20 2a 70 6e 45 73 63 61 70 65 20 3d 20 69 3b    *pnEscape = i;
29c0: 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b  .  return TH_OK;
29d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
29e0: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
29f0: 73 74 72 69 6e 67 20 28 7a 49 6e 70 75 74 2c 6e  string (zInput,n
2a00: 49 6e 70 75 74 29 20 63 6f 6e 74 61 69 6e 73 20  Input) contains 
2a10: 61 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 72 65  a variable.** re
2a20: 66 65 72 65 6e 63 65 2e 20 53 65 74 20 2a 70 6e  ference. Set *pn
2a30: 56 61 72 6e 61 6d 65 20 74 6f 20 74 68 65 20 6e  Varname to the n
2a40: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2a50: 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 0a  n the variable .
2a60: 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 66  ** reference. If
2a70: 20 74 68 65 72 65 20 69 73 20 61 20 70 61 72 73   there is a pars
2a80: 65 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  e error, return 
2a90: 54 48 5f 45 52 52 4f 52 20 61 6e 64 20 73 65 74  TH_ERROR and set
2aa0: 20 74 68 65 20 0a 2a 2a 20 69 6e 74 65 72 70 72   the .** interpr
2ab0: 65 74 65 72 20 72 65 73 75 6c 74 20 74 6f 20 61  eter result to a
2ac0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
2ad0: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
2ae0: 6e 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  n TH_OK..*/.int 
2af0: 74 68 4e 65 78 74 56 61 72 6e 61 6d 65 28 0a 20  thNextVarname(. 
2b00: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65   Th_Interp *inte
2b10: 72 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rp,.  const char
2b20: 20 2a 7a 49 6e 70 75 74 2c 20 0a 20 20 69 6e 74   *zInput, .  int
2b30: 20 6e 49 6e 70 75 74 2c 20 0a 20 20 69 6e 74 20   nInput, .  int 
2b40: 2a 70 6e 56 61 72 6e 61 6d 65 0a 29 7b 0a 20 20  *pnVarname.){.  
2b50: 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
2b60: 28 6e 49 6e 70 75 74 3e 30 29 3b 0a 20 20 61 73  (nInput>0);.  as
2b70: 73 65 72 74 28 7a 49 6e 70 75 74 5b 30 5d 3d 3d  sert(zInput[0]==
2b80: 27 24 27 29 3b 0a 0a 20 20 69 66 28 20 6e 49 6e  '$');..  if( nIn
2b90: 70 75 74 3e 30 20 26 26 20 7a 49 6e 70 75 74 5b  put>0 && zInput[
2ba0: 31 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 66  1]=='{' ){.    f
2bb0: 6f 72 28 69 3d 32 3b 20 69 3c 6e 49 6e 70 75 74  or(i=2; i<nInput
2bc0: 20 26 26 20 7a 49 6e 70 75 74 5b 69 5d 21 3d 27   && zInput[i]!='
2bd0: 7d 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66  }'; i++);.    if
2be0: 28 20 69 3d 3d 6e 49 6e 70 75 74 20 29 7b 0a 20  ( i==nInput ){. 
2bf0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f 45       return TH_E
2c00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
2c10: 69 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i++;.  }else{.  
2c20: 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 69 66 28    i = 1;.    if(
2c30: 20 6e 49 6e 70 75 74 3e 32 20 26 26 20 7a 49 6e   nInput>2 && zIn
2c40: 70 75 74 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 7a  put[1]==':' && z
2c50: 49 6e 70 75 74 5b 32 5d 3d 3d 27 3a 27 20 29 7b  Input[2]==':' ){
2c60: 0a 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20  .      i += 2;. 
2c70: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 20 69     }.    for(; i
2c80: 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20  <nInput; i++){. 
2c90: 20 20 20 20 20 69 66 28 20 7a 49 6e 70 75 74 5b       if( zInput[
2ca0: 69 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  i]=='(' ){.     
2cb0: 20 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 6e 49     for(i++; i<nI
2cc0: 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nput; i++){.    
2cd0: 20 20 20 20 20 20 69 66 28 20 7a 49 6e 70 75 74        if( zInput
2ce0: 5b 69 5d 3d 3d 27 29 27 20 29 20 62 72 65 61 6b  [i]==')' ) break
2cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d00: 7a 49 6e 70 75 74 5b 69 5d 3d 3d 27 5c 5c 27 20  zInput[i]=='\\' 
2d10: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ) i++;.         
2d20: 20 69 66 28 20 7a 49 6e 70 75 74 5b 69 5d 3d 3d   if( zInput[i]==
2d30: 27 7b 27 20 7c 7c 20 7a 49 6e 70 75 74 5b 69 5d  '{' || zInput[i]
2d40: 3d 3d 27 5b 27 20 7c 7c 20 7a 49 6e 70 75 74 5b  =='[' || zInput[
2d50: 69 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  i]=='"' ){.     
2d60: 20 20 20 20 20 20 20 69 6e 74 20 6e 57 6f 72 64         int nWord
2d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
2d80: 74 20 72 63 20 3d 20 74 68 4e 65 78 74 57 6f 72  t rc = thNextWor
2d90: 64 28 69 6e 74 65 72 70 2c 20 26 7a 49 6e 70 75  d(interp, &zInpu
2da0: 74 5b 69 5d 2c 20 6e 49 6e 70 75 74 2d 69 2c 20  t[i], nInput-i, 
2db0: 26 6e 57 6f 72 64 2c 20 30 29 3b 0a 20 20 20 20  &nWord, 0);.    
2dc0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2dd0: 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TH_OK ){.       
2de0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d              i +=
2e10: 20 6e 57 6f 72 64 3b 0a 20 20 20 20 20 20 20 20   nWord;.        
2e20: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2e30: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 49 6e        if( i>=nIn
2e40: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  put ){.         
2e50: 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67 65   Th_ErrorMessage
2e60: 28 69 6e 74 65 72 70 2c 20 22 55 6e 6d 61 74 63  (interp, "Unmatc
2e70: 68 65 64 20 62 72 61 63 6b 65 74 73 3a 22 2c 20  hed brackets:", 
2e80: 7a 49 6e 70 75 74 2c 20 6e 49 6e 70 75 74 29 3b  zInput, nInput);
2e90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2ea0: 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 20 20  n TH_ERROR;.    
2eb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 2b      }.        i+
2ec0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
2ed0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ee0: 69 66 28 20 21 74 68 5f 69 73 61 6c 6e 75 6d 28  if( !th_isalnum(
2ef0: 7a 49 6e 70 75 74 5b 69 5d 29 20 26 26 20 7a 49  zInput[i]) && zI
2f00: 6e 70 75 74 5b 69 5d 21 3d 27 5f 27 20 29 20 62  nput[i]!='_' ) b
2f10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2f20: 0a 20 20 2a 70 6e 56 61 72 6e 61 6d 65 20 3d 20  .  *pnVarname = 
2f30: 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f  i;.  return TH_O
2f40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
2f50: 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  first part of th
2f60: 65 20 73 74 72 69 6e 67 20 28 7a 49 6e 70 75 74  e string (zInput
2f70: 2c 6e 49 6e 70 75 74 29 20 63 6f 6e 74 61 69 6e  ,nInput) contain
2f80: 73 20 61 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 65  s a command.** e
2f90: 6e 63 6c 6f 73 65 64 20 69 6e 20 61 20 22 5b 5d  nclosed in a "[]
2fa0: 22 20 62 6c 6f 63 6b 2e 20 53 65 74 20 2a 70 6e  " block. Set *pn
2fb0: 43 6f 6d 6d 61 6e 64 20 74 6f 20 74 68 65 20 6e  Command to the n
2fc0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2fd0: 6e 20 0a 2a 2a 20 74 68 65 20 76 61 72 69 61 62  n .** the variab
2fe0: 6c 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 66  le reference. If
2ff0: 20 74 68 65 72 65 20 69 73 20 61 20 70 61 72 73   there is a pars
3000: 65 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  e error, return 
3010: 54 48 5f 45 52 52 4f 52 20 0a 2a 2a 20 61 6e 64  TH_ERROR .** and
3020: 20 73 65 74 20 74 68 65 20 69 6e 74 65 72 70 72   set the interpr
3030: 65 74 65 72 20 72 65 73 75 6c 74 20 74 6f 20 61  eter result to a
3040: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
3050: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
3060: 6e 20 0a 2a 2a 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a  n .** TH_OK..*/.
3070: 69 6e 74 20 74 68 4e 65 78 74 43 6f 6d 6d 61 6e  int thNextComman
3080: 64 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a  d(.  Th_Interp *
3090: 69 6e 74 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20  interp,.  const 
30a0: 63 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20 0a 20  char *zInput, . 
30b0: 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 0a 20 20   int nInput, .  
30c0: 69 6e 74 20 2a 70 6e 43 6f 6d 6d 61 6e 64 0a 29  int *pnCommand.)
30d0: 7b 0a 20 20 69 6e 74 20 6e 42 72 61 63 65 20 3d  {.  int nBrace =
30e0: 20 30 3b 0a 20 20 69 6e 74 20 6e 53 71 75 61 72   0;.  int nSquar
30f0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  e = 0;.  int i;.
3100: 0a 20 20 61 73 73 65 72 74 28 6e 49 6e 70 75 74  .  assert(nInput
3110: 3e 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  >0);.  assert( z
3120: 49 6e 70 75 74 5b 30 5d 3d 3d 27 5b 27 20 7c 7c  Input[0]=='[' ||
3130: 20 7a 49 6e 70 75 74 5b 30 5d 3d 3d 27 7b 27 20   zInput[0]=='{' 
3140: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
3150: 3c 6e 49 6e 70 75 74 20 26 26 20 28 69 3d 3d 30  <nInput && (i==0
3160: 20 7c 7c 20 6e 42 72 61 63 65 3e 30 20 7c 7c 20   || nBrace>0 || 
3170: 6e 53 71 75 61 72 65 3e 30 29 3b 20 69 2b 2b 29  nSquare>0); i++)
3180: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a 49  {.    switch( zI
3190: 6e 70 75 74 5b 69 5d 20 29 7b 0a 20 20 20 20 20  nput[i] ){.     
31a0: 20 63 61 73 65 20 27 5c 5c 27 3a 20 69 2b 2b 3b   case '\\': i++;
31b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
31c0: 73 65 20 27 7b 27 3a 20 6e 42 72 61 63 65 2b 2b  se '{': nBrace++
31d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
31e0: 61 73 65 20 27 7d 27 3a 20 6e 42 72 61 63 65 2d  ase '}': nBrace-
31f0: 2d 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  -; break;.      
3200: 63 61 73 65 20 27 5b 27 3a 20 6e 53 71 75 61 72  case '[': nSquar
3210: 65 2b 2b 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  e++; break;.    
3220: 20 20 63 61 73 65 20 27 5d 27 3a 20 6e 53 71 75    case ']': nSqu
3230: 61 72 65 2d 2d 3b 20 62 72 65 61 6b 3b 0a 20 20  are--; break;.  
3240: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42    }.  }.  if( nB
3250: 72 61 63 65 20 7c 7c 20 6e 53 71 75 61 72 65 20  race || nSquare 
3260: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 48  ){.    return TH
3270: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2a  _ERROR;.  }..  *
3280: 70 6e 43 6f 6d 6d 61 6e 64 20 3d 20 69 3b 0a 0a  pnCommand = i;..
3290: 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a    return TH_OK;.
32a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e  }../*.** Set *pn
32b0: 53 70 61 63 65 20 74 6f 20 74 68 65 20 6e 75 6d  Space to the num
32c0: 62 65 72 20 6f 66 20 77 68 69 74 65 73 70 61 63  ber of whitespac
32d0: 65 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  e bytes at the s
32e0: 74 61 72 74 20 6f 66 20 0a 2a 2a 20 69 6e 70 75  tart of .** inpu
32f0: 74 20 73 74 72 69 6e 67 20 28 7a 49 6e 70 75 74  t string (zInput
3300: 2c 20 6e 49 6e 70 75 74 29 2e 20 41 6c 77 61 79  , nInput). Alway
3310: 73 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 2e 0a  s return TH_OK..
3320: 2a 2f 0a 69 6e 74 20 74 68 4e 65 78 74 53 70 61  */.int thNextSpa
3330: 63 65 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20  ce(.  Th_Interp 
3340: 2a 69 6e 74 65 72 70 2c 0a 20 20 63 6f 6e 73 74  *interp,.  const
3350: 20 63 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20 0a   char *zInput, .
3360: 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 0a 20    int nInput, . 
3370: 20 69 6e 74 20 2a 70 6e 53 70 61 63 65 0a 29 7b   int *pnSpace.){
3380: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
3390: 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 20 26 26  i=0; i<nInput &&
33a0: 20 74 68 5f 69 73 73 70 61 63 65 28 7a 49 6e 70   th_isspace(zInp
33b0: 75 74 5b 69 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20  ut[i]); i++);.  
33c0: 2a 70 6e 53 70 61 63 65 20 3d 20 69 3b 0a 20 20  *pnSpace = i;.  
33d0: 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a  return TH_OK;.}.
33e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
33f0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 73 74 72   byte of the str
3400: 69 6e 67 20 28 7a 49 6e 70 75 74 2c 6e 49 6e 70  ing (zInput,nInp
3410: 75 74 29 20 69 73 20 6e 6f 74 20 77 68 69 74 65  ut) is not white
3420: 2d 73 70 61 63 65 2e 0a 2a 2a 20 53 65 74 20 2a  -space..** Set *
3430: 70 6e 57 6f 72 64 20 74 6f 20 74 68 65 20 6e 75  pnWord to the nu
3440: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
3450: 20 74 68 65 20 74 68 31 20 77 6f 72 64 20 74 68   the th1 word th
3460: 61 74 20 73 74 61 72 74 73 0a 2a 2a 20 77 69 74  at starts.** wit
3470: 68 20 74 68 69 73 20 62 79 74 65 2e 20 49 66 20  h this byte. If 
3480: 61 20 63 6f 6d 70 6c 65 74 65 20 77 6f 72 64 20  a complete word 
3490: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 73 65 64  cannot be parsed
34a0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
34b0: 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
34c0: 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 20  return TH_ERROR 
34d0: 61 6e 64 20 73 65 74 20 74 68 65 20 69 6e 74 65  and set the inte
34e0: 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 20 74  rpreter result t
34f0: 6f 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d  o .** an error m
3500: 65 73 73 61 67 65 2e 20 4f 74 68 65 72 77 69 73  essage. Otherwis
3510: 65 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 2e 0a  e return TH_OK..
3520: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 43  **.** If the isC
3530: 6d 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  md argument is n
3540: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
3550: 20 75 6e 65 73 63 61 70 65 64 20 22 3b 22 20 62   unescaped ";" b
3560: 79 74 65 20 6e 6f 74 20 0a 2a 2a 20 6c 6f 63 61  yte not .** loca
3570: 74 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 20  ted inside of a 
3580: 62 6c 6f 63 6b 20 6f 72 20 71 75 6f 74 65 64 20  block or quoted 
3590: 73 74 72 69 6e 67 20 69 73 20 63 6f 6e 73 69 64  string is consid
35a0: 65 72 65 64 20 74 6f 20 6d 61 72 6b 20 0a 2a 2a  ered to mark .**
35b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
35c0: 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  word..*/.static 
35d0: 69 6e 74 20 74 68 4e 65 78 74 57 6f 72 64 28 0a  int thNextWord(.
35e0: 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74    Th_Interp *int
35f0: 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  erp,.  const cha
3600: 72 20 2a 7a 49 6e 70 75 74 2c 20 0a 20 20 69 6e  r *zInput, .  in
3610: 74 20 6e 49 6e 70 75 74 2c 20 0a 20 20 69 6e 74  t nInput, .  int
3620: 20 2a 70 6e 57 6f 72 64 2c 0a 20 20 69 6e 74 20   *pnWord,.  int 
3630: 69 73 43 6d 64 0a 29 7b 0a 20 20 69 6e 74 20 69  isCmd.){.  int i
3640: 45 6e 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  End = 0;..  asse
3650: 72 74 28 20 21 74 68 5f 69 73 73 70 61 63 65 28  rt( !th_isspace(
3660: 7a 49 6e 70 75 74 5b 30 5d 29 20 29 3b 0a 0a 20  zInput[0]) );.. 
3670: 20 69 66 28 20 7a 49 6e 70 75 74 5b 30 5d 3d 3d   if( zInput[0]==
3680: 27 22 27 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  '"' ){.    /* Th
3690: 65 20 77 6f 72 64 20 69 73 20 74 65 72 6d 69 6e  e word is termin
36a0: 61 74 65 64 20 62 79 20 74 68 65 20 6e 65 78 74  ated by the next
36b0: 20 75 6e 65 73 63 61 70 65 64 20 27 22 27 20 63   unescaped '"' c
36c0: 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20  haracter. */.   
36d0: 20 69 45 6e 64 2b 2b 3b 0a 20 20 20 20 77 68 69   iEnd++;.    whi
36e0: 6c 65 28 20 69 45 6e 64 3c 6e 49 6e 70 75 74 20  le( iEnd<nInput 
36f0: 26 26 20 7a 49 6e 70 75 74 5b 69 45 6e 64 5d 21  && zInput[iEnd]!
3700: 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='"' ){.      if
3710: 28 20 7a 49 6e 70 75 74 5b 69 45 6e 64 5d 3d 3d  ( zInput[iEnd]==
3720: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\\' ){.        
3730: 69 45 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  iEnd++;.      }.
3740: 20 20 20 20 20 20 69 45 6e 64 2b 2b 3b 0a 20 20        iEnd++;.  
3750: 20 20 7d 0a 20 20 20 20 69 45 6e 64 2b 2b 3b 0a    }.    iEnd++;.
3760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
3770: 20 6e 42 72 61 63 65 20 3d 20 30 3b 0a 20 20 20   nBrace = 0;.   
3780: 20 69 6e 74 20 6e 53 71 20 3d 20 30 3b 0a 20 20   int nSq = 0;.  
3790: 20 20 77 68 69 6c 65 28 20 69 45 6e 64 3c 6e 49    while( iEnd<nI
37a0: 6e 70 75 74 20 26 26 20 28 6e 42 72 61 63 65 3e  nput && (nBrace>
37b0: 30 20 7c 7c 20 6e 53 71 3e 30 20 7c 7c 0a 20 20  0 || nSq>0 ||.  
37c0: 20 20 20 20 28 21 74 68 5f 69 73 73 70 61 63 65      (!th_isspace
37d0: 28 7a 49 6e 70 75 74 5b 69 45 6e 64 5d 29 20 26  (zInput[iEnd]) &
37e0: 26 20 28 21 69 73 43 6d 64 20 7c 7c 20 7a 49 6e  & (!isCmd || zIn
37f0: 70 75 74 5b 69 45 6e 64 5d 21 3d 27 3b 27 29 29  put[iEnd]!=';'))
3800: 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 73  .    )){.      s
3810: 77 69 74 63 68 28 20 7a 49 6e 70 75 74 5b 69 45  witch( zInput[iE
3820: 6e 64 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  nd] ){.        c
3830: 61 73 65 20 27 5c 5c 27 3a 20 69 45 6e 64 2b 2b  ase '\\': iEnd++
3840: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
3850: 20 63 61 73 65 20 27 7b 27 3a 20 69 66 28 20 6e   case '{': if( n
3860: 53 71 3d 3d 30 20 29 20 6e 42 72 61 63 65 2b 2b  Sq==0 ) nBrace++
3870: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
3880: 20 63 61 73 65 20 27 7d 27 3a 20 69 66 28 20 6e   case '}': if( n
3890: 53 71 3d 3d 30 20 29 20 6e 42 72 61 63 65 2d 2d  Sq==0 ) nBrace--
38a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
38b0: 20 63 61 73 65 20 27 5b 27 3a 20 69 66 28 20 6e   case '[': if( n
38c0: 42 72 61 63 65 3d 3d 30 20 29 20 6e 53 71 2b 2b  Brace==0 ) nSq++
38d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
38e0: 20 63 61 73 65 20 27 5d 27 3a 20 69 66 28 20 6e   case ']': if( n
38f0: 42 72 61 63 65 3d 3d 30 20 29 20 6e 53 71 2d 2d  Brace==0 ) nSq--
3900: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ; break;.      }
3910: 0a 20 20 20 20 20 20 69 45 6e 64 2b 2b 3b 0a 20  .      iEnd++;. 
3920: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 42 72     }.    if( nBr
3930: 61 63 65 3e 30 20 7c 7c 20 6e 53 71 3e 30 20 29  ace>0 || nSq>0 )
3940: 7b 0a 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  {.      /* Parse
3950: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
3960: 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b  return TH_ERROR;
3970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
3980: 28 20 69 45 6e 64 3e 6e 49 6e 70 75 74 20 29 7b  ( iEnd>nInput ){
3990: 0a 20 20 20 20 2f 2a 20 50 61 72 73 65 20 65 72  .    /* Parse er
39a0: 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
39b0: 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  n TH_ERROR;.  }.
39c0: 20 20 2a 70 6e 57 6f 72 64 20 3d 20 69 45 6e 64    *pnWord = iEnd
39d0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b  ;.  return TH_OK
39e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
39f0: 6e 70 75 74 20 73 74 72 69 6e 67 20 28 7a 57 6f  nput string (zWo
3a00: 72 64 2c 20 6e 57 6f 72 64 29 20 63 6f 6e 74 61  rd, nWord) conta
3a10: 69 6e 73 20 61 20 74 68 31 20 73 63 72 69 70 74  ins a th1 script
3a20: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 0a 2a 2a 20   enclosed in.** 
3a30: 61 20 5b 5d 20 62 6c 6f 63 6b 2e 20 50 65 72 66  a [] block. Perf
3a40: 6f 72 6d 20 73 75 62 73 74 69 74 75 74 69 6f 6e  orm substitution
3a50: 20 6f 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74   on the input st
3a60: 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 74  ring and store t
3a70: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20  he.** resulting 
3a80: 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 69 6e  string in the in
3a90: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74  terpreter result
3aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ab0: 74 68 53 75 62 73 74 43 6f 6d 6d 61 6e 64 28 0a  thSubstCommand(.
3ac0: 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74    Th_Interp *int
3ad0: 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  erp,.  const cha
3ae0: 72 20 2a 7a 57 6f 72 64 2c 0a 20 20 69 6e 74 20  r *zWord,.  int 
3af0: 6e 57 6f 72 64 0a 29 7b 0a 20 20 61 73 73 65 72  nWord.){.  asser
3b00: 74 28 6e 57 6f 72 64 3e 3d 32 29 3b 0a 20 20 61  t(nWord>=2);.  a
3b10: 73 73 65 72 74 28 7a 57 6f 72 64 5b 30 5d 3d 3d  ssert(zWord[0]==
3b20: 27 5b 27 20 26 26 20 7a 57 6f 72 64 5b 6e 57 6f  '[' && zWord[nWo
3b30: 72 64 2d 31 5d 3d 3d 27 5d 27 29 3b 0a 20 20 72  rd-1]==']');.  r
3b40: 65 74 75 72 6e 20 74 68 45 76 61 6c 4c 6f 63 61  eturn thEvalLoca
3b50: 6c 28 69 6e 74 65 72 70 2c 20 26 7a 57 6f 72 64  l(interp, &zWord
3b60: 5b 31 5d 2c 20 6e 57 6f 72 64 2d 32 29 3b 0a 7d  [1], nWord-2);.}
3b70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
3b80: 74 20 73 74 72 69 6e 67 20 28 7a 57 6f 72 64 2c  t string (zWord,
3b90: 20 6e 57 6f 72 64 29 20 63 6f 6e 74 61 69 6e 73   nWord) contains
3ba0: 20 61 20 74 68 31 20 76 61 72 69 61 62 6c 65 20   a th1 variable 
3bb0: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 28 61 20  reference.** (a 
3bc0: 27 24 27 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65  '$' byte followe
3bd0: 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
3be0: 6e 61 6d 65 29 2e 20 50 65 72 66 6f 72 6d 20 73  name). Perform s
3bf0: 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 6e 20 0a  ubstitution on .
3c00: 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  ** the input str
3c10: 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ing and store th
3c20: 65 20 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69  e resulting stri
3c30: 6e 67 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70  ng in the interp
3c40: 72 65 74 65 72 20 0a 2a 2a 20 72 65 73 75 6c 74  reter .** result
3c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c60: 74 68 53 75 62 73 74 56 61 72 6e 61 6d 65 28 0a  thSubstVarname(.
3c70: 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74    Th_Interp *int
3c80: 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  erp,.  const cha
3c90: 72 20 2a 7a 57 6f 72 64 2c 0a 20 20 69 6e 74 20  r *zWord,.  int 
3ca0: 6e 57 6f 72 64 0a 29 7b 0a 20 20 61 73 73 65 72  nWord.){.  asser
3cb0: 74 28 6e 57 6f 72 64 3e 3d 31 29 3b 0a 20 20 61  t(nWord>=1);.  a
3cc0: 73 73 65 72 74 28 7a 57 6f 72 64 5b 30 5d 3d 3d  ssert(zWord[0]==
3cd0: 27 24 27 29 3b 0a 20 20 61 73 73 65 72 74 28 6e  '$');.  assert(n
3ce0: 57 6f 72 64 3d 3d 31 20 7c 7c 20 7a 57 6f 72 64  Word==1 || zWord
3cf0: 5b 31 5d 21 3d 27 7b 27 20 7c 7c 20 7a 57 6f 72  [1]!='{' || zWor
3d00: 64 5b 6e 57 6f 72 64 2d 31 5d 3d 3d 27 7d 27 29  d[nWord-1]=='}')
3d10: 3b 0a 20 20 69 66 28 20 6e 57 6f 72 64 3e 31 20  ;.  if( nWord>1 
3d20: 26 26 20 7a 57 6f 72 64 5b 31 5d 3d 3d 27 7b 27  && zWord[1]=='{'
3d30: 20 29 7b 0a 20 20 20 20 7a 57 6f 72 64 2b 2b 3b   ){.    zWord++;
3d40: 0a 20 20 20 20 6e 57 6f 72 64 20 2d 3d 20 32 3b  .    nWord -= 2;
3d50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 57 6f  .  }else if( zWo
3d60: 72 64 5b 6e 57 6f 72 64 2d 31 5d 3d 3d 27 29 27  rd[nWord-1]==')'
3d70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3d80: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 57     for(i=1; i<nW
3d90: 6f 72 64 20 26 26 20 7a 57 6f 72 64 5b 69 5d 21  ord && zWord[i]!
3da0: 3d 27 28 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  ='('; i++);.    
3db0: 69 66 28 20 69 3c 6e 57 6f 72 64 20 29 7b 0a 20  if( i<nWord ){. 
3dc0: 20 20 20 20 20 42 75 66 66 65 72 20 76 61 72 6e       Buffer varn
3dd0: 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
3de0: 49 6e 6e 65 72 3b 0a 20 20 20 20 20 20 63 6f 6e  Inner;.      con
3df0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 6e 65 72 3b  st char *zInner;
3e00: 0a 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ..      int rc =
3e10: 20 74 68 53 75 62 73 74 57 6f 72 64 28 69 6e 74   thSubstWord(int
3e20: 65 72 70 2c 20 26 7a 57 6f 72 64 5b 69 2b 31 5d  erp, &zWord[i+1]
3e30: 2c 20 6e 57 6f 72 64 2d 69 2d 32 29 3b 0a 20 20  , nWord-i-2);.  
3e40: 20 20 20 20 69 66 28 20 72 63 21 3d 54 48 5f 4f      if( rc!=TH_O
3e50: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
3e60: 20 20 20 20 20 20 7a 49 6e 6e 65 72 20 3d 20 54        zInner = T
3e70: 68 5f 47 65 74 52 65 73 75 6c 74 28 69 6e 74 65  h_GetResult(inte
3e80: 72 70 2c 20 26 6e 49 6e 6e 65 72 29 3b 0a 20 20  rp, &nInner);.  
3e90: 20 20 20 20 74 68 42 75 66 66 65 72 49 6e 69 74      thBufferInit
3ea0: 28 26 76 61 72 6e 61 6d 65 29 3b 0a 20 20 20 20  (&varname);.    
3eb0: 20 20 74 68 42 75 66 66 65 72 57 72 69 74 65 28    thBufferWrite(
3ec0: 69 6e 74 65 72 70 2c 20 26 76 61 72 6e 61 6d 65  interp, &varname
3ed0: 2c 20 26 7a 57 6f 72 64 5b 31 5d 2c 20 69 29 3b  , &zWord[1], i);
3ee0: 0a 20 20 20 20 20 20 74 68 42 75 66 66 65 72 57  .      thBufferW
3ef0: 72 69 74 65 28 69 6e 74 65 72 70 2c 20 26 76 61  rite(interp, &va
3f00: 72 6e 61 6d 65 2c 20 7a 49 6e 6e 65 72 2c 20 6e  rname, zInner, n
3f10: 49 6e 6e 65 72 29 3b 0a 20 20 20 20 20 20 74 68  Inner);.      th
3f20: 42 75 66 66 65 72 57 72 69 74 65 28 69 6e 74 65  BufferWrite(inte
3f30: 72 70 2c 20 26 76 61 72 6e 61 6d 65 2c 20 22 29  rp, &varname, ")
3f40: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20  ", 1);.      rc 
3f50: 3d 20 54 68 5f 47 65 74 56 61 72 28 69 6e 74 65  = Th_GetVar(inte
3f60: 72 70 2c 20 76 61 72 6e 61 6d 65 2e 7a 42 75 66  rp, varname.zBuf
3f70: 2c 20 76 61 72 6e 61 6d 65 2e 6e 42 75 66 29 3b  , varname.nBuf);
3f80: 0a 20 20 20 20 20 20 74 68 42 75 66 66 65 72 46  .      thBufferF
3f90: 72 65 65 28 69 6e 74 65 72 70 2c 20 26 76 61 72  ree(interp, &var
3fa0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
3fb0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
3fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 68 5f 47 65  }.  return Th_Ge
3fd0: 74 56 61 72 28 69 6e 74 65 72 70 2c 20 26 7a 57  tVar(interp, &zW
3fe0: 6f 72 64 5b 31 5d 2c 20 6e 57 6f 72 64 2d 31 29  ord[1], nWord-1)
3ff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
4000: 6e 70 75 74 20 73 74 72 69 6e 67 20 28 7a 57 6f  nput string (zWo
4010: 72 64 2c 20 6e 57 6f 72 64 29 20 63 6f 6e 74 61  rd, nWord) conta
4020: 69 6e 73 20 61 20 74 68 31 20 65 73 63 61 70 65  ins a th1 escape
4030: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 50 65   sequence..** Pe
4040: 72 66 6f 72 6d 20 73 75 62 73 74 69 74 75 74 69  rform substituti
4050: 6f 6e 20 6f 6e 20 74 68 65 20 69 6e 70 75 74 20  on on the input 
4060: 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65  string and store
4070: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 0a   the resulting .
4080: 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ** string in the
4090: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73   interpreter res
40a0: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
40b0: 6e 74 20 74 68 53 75 62 73 74 45 73 63 61 70 65  nt thSubstEscape
40c0: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69  (.  Th_Interp *i
40d0: 6e 74 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20 63  nterp,.  const c
40e0: 68 61 72 20 2a 7a 57 6f 72 64 2c 0a 20 20 69 6e  har *zWord,.  in
40f0: 74 20 6e 57 6f 72 64 0a 29 7b 0a 20 20 63 68 61  t nWord.){.  cha
4100: 72 20 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e  r c;..  assert(n
4110: 57 6f 72 64 3e 3d 32 29 3b 0a 20 20 61 73 73 65  Word>=2);.  asse
4120: 72 74 28 7a 57 6f 72 64 5b 30 5d 3d 3d 27 5c 5c  rt(zWord[0]=='\\
4130: 27 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 7a  ');..  switch( z
4140: 57 6f 72 64 5b 31 5d 20 29 7b 0a 20 20 20 20 63  Word[1] ){.    c
4150: 61 73 65 20 27 78 27 3a 20 7b 0a 20 20 20 20 20  ase 'x': {.     
4160: 20 61 73 73 65 72 74 28 6e 57 6f 72 64 3d 3d 34   assert(nWord==4
4170: 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 28 28 74  );.      c = ((t
4180: 68 48 65 78 64 69 67 69 74 28 7a 57 6f 72 64 5b  hHexdigit(zWord[
4190: 32 5d 29 3c 3c 34 29 20 2b 20 74 68 48 65 78 64  2])<<4) + thHexd
41a0: 69 67 69 74 28 7a 57 6f 72 64 5b 33 5d 29 29 3b  igit(zWord[3]));
41b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
41c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 6e 27    }.    case 'n'
41d0: 3a 20 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 5c  : {.      c = '\
41e0: 6e 27 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n';.      break;
41f0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
4200: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
4210: 72 74 28 6e 57 6f 72 64 3d 3d 32 29 3b 0a 20 20  rt(nWord==2);.  
4220: 20 20 20 20 63 20 3d 20 7a 57 6f 72 64 5b 31 5d      c = zWord[1]
4230: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4240: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 68 5f 53     }.  }..  Th_S
4250: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
4260: 20 26 63 2c 20 31 29 3b 0a 20 20 72 65 74 75 72   &c, 1);.  retur
4270: 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  n TH_OK;.}../*.*
4280: 2a 20 54 68 65 20 69 6e 70 75 74 20 73 74 72 69  * The input stri
4290: 6e 67 20 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64  ng (zWord, nWord
42a0: 29 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 68 31  ) contains a th1
42b0: 20 77 6f 72 64 2e 20 50 65 72 66 6f 72 6d 0a 2a   word. Perform.*
42c0: 2a 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  * substitution o
42d0: 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  n the input stri
42e0: 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ng and store the
42f0: 20 72 65 73 75 6c 74 69 6e 67 20 0a 2a 2a 20 73   resulting .** s
4300: 74 72 69 6e 67 20 69 6e 20 74 68 65 20 69 6e 74  tring in the int
4310: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e  erpreter result.
4320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
4330: 68 53 75 62 73 74 57 6f 72 64 28 0a 20 20 54 68  hSubstWord(.  Th
4340: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4350: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4360: 57 6f 72 64 2c 0a 20 20 69 6e 74 20 6e 57 6f 72  Word,.  int nWor
4370: 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d.){.  int rc = 
4380: 54 48 5f 4f 4b 3b 0a 20 20 42 75 66 66 65 72 20  TH_OK;.  Buffer 
4390: 6f 75 74 70 75 74 3b 0a 20 20 69 6e 74 20 69 3b  output;.  int i;
43a0: 0a 0a 20 20 74 68 42 75 66 66 65 72 49 6e 69 74  ..  thBufferInit
43b0: 28 26 6f 75 74 70 75 74 29 3b 0a 0a 20 20 69 66  (&output);..  if
43c0: 28 20 6e 57 6f 72 64 3e 31 20 26 26 20 28 7a 57  ( nWord>1 && (zW
43d0: 6f 72 64 5b 30 5d 3d 3d 27 7b 27 20 26 26 20 7a  ord[0]=='{' && z
43e0: 57 6f 72 64 5b 6e 57 6f 72 64 2d 31 5d 3d 3d 27  Word[nWord-1]=='
43f0: 7d 27 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  }') ){.    rc = 
4400: 74 68 42 75 66 66 65 72 57 72 69 74 65 28 69 6e  thBufferWrite(in
4410: 74 65 72 70 2c 20 26 6f 75 74 70 75 74 2c 20 26  terp, &output, &
4420: 7a 57 6f 72 64 5b 31 5d 2c 20 6e 57 6f 72 64 2d  zWord[1], nWord-
4430: 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20  2);.  }else{..  
4440: 20 20 2f 2a 20 49 66 20 74 68 65 20 77 6f 72 64    /* If the word
4450: 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62   is surrounded b
4460: 79 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20  y double-quotes 
4470: 73 74 72 69 70 20 74 68 65 73 65 20 61 77 61 79  strip these away
4480: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 57 6f  . */.    if( nWo
4490: 72 64 3e 31 20 26 26 20 28 7a 57 6f 72 64 5b 30  rd>1 && (zWord[0
44a0: 5d 3d 3d 27 22 27 20 26 26 20 7a 57 6f 72 64 5b  ]=='"' && zWord[
44b0: 6e 57 6f 72 64 2d 31 5d 3d 3d 27 22 27 29 20 29  nWord-1]=='"') )
44c0: 7b 0a 20 20 20 20 20 20 7a 57 6f 72 64 2b 2b 3b  {.      zWord++;
44d0: 0a 20 20 20 20 20 20 6e 57 6f 72 64 20 2d 3d 20  .      nWord -= 
44e0: 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  2;.    }..    fo
44f0: 72 28 69 3d 30 3b 20 72 63 3d 3d 54 48 5f 4f 4b  r(i=0; rc==TH_OK
4500: 20 26 26 20 69 3c 6e 57 6f 72 64 3b 20 69 2b 2b   && i<nWord; i++
4510: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 47 65  ){.      int nGe
4520: 74 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20 28 2a  t;..      int (*
4530: 78 47 65 74 29 28 54 68 5f 49 6e 74 65 72 70 20  xGet)(Th_Interp 
4540: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
4550: 69 6e 74 2c 20 69 6e 74 20 2a 29 20 3d 20 30 3b  int, int *) = 0;
4560: 0a 20 20 20 20 20 20 69 6e 74 20 28 2a 78 53 75  .      int (*xSu
4570: 62 73 74 29 28 54 68 5f 49 6e 74 65 72 70 20 2a  bst)(Th_Interp *
4580: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
4590: 6e 74 29 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  nt) = 0;..      
45a0: 73 77 69 74 63 68 28 20 7a 57 6f 72 64 5b 69 5d  switch( zWord[i]
45b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
45c0: 20 27 5c 5c 27 3a 0a 20 20 20 20 20 20 20 20 20   '\\':.         
45d0: 20 78 47 65 74 20 3d 20 74 68 4e 65 78 74 45 73   xGet = thNextEs
45e0: 63 61 70 65 3b 20 78 53 75 62 73 74 20 3d 20 74  cape; xSubst = t
45f0: 68 53 75 62 73 74 45 73 63 61 70 65 3b 20 0a 20  hSubstEscape; . 
4600: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4610: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 5b 27          case '['
4620: 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
4630: 21 69 6e 74 65 72 70 2d 3e 69 73 4c 69 73 74 4d  !interp->isListM
4640: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
4650: 20 20 20 78 47 65 74 20 3d 20 74 68 4e 65 78 74     xGet = thNext
4660: 43 6f 6d 6d 61 6e 64 3b 20 78 53 75 62 73 74 20  Command; xSubst 
4670: 3d 20 74 68 53 75 62 73 74 43 6f 6d 6d 61 6e 64  = thSubstCommand
4680: 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ; .            b
4690: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
46a0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  }.        case '
46b0: 24 27 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  $':.          if
46c0: 28 20 21 69 6e 74 65 72 70 2d 3e 69 73 4c 69 73  ( !interp->isLis
46d0: 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
46e0: 20 20 20 20 20 78 47 65 74 20 3d 20 74 68 4e 65       xGet = thNe
46f0: 78 74 56 61 72 6e 61 6d 65 3b 20 78 53 75 62 73  xtVarname; xSubs
4700: 74 20 3d 20 74 68 53 75 62 73 74 56 61 72 6e 61  t = thSubstVarna
4710: 6d 65 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20  me; .           
4720: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4730: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61    }.        defa
4740: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
4750: 20 74 68 42 75 66 66 65 72 57 72 69 74 65 28 69   thBufferWrite(i
4760: 6e 74 65 72 70 2c 20 26 6f 75 74 70 75 74 2c 20  nterp, &output, 
4770: 26 7a 57 6f 72 64 5b 69 5d 2c 20 31 29 3b 0a 20  &zWord[i], 1);. 
4780: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
4790: 65 3b 20 2f 2a 20 47 6f 20 74 6f 20 74 68 65 20  e; /* Go to the 
47a0: 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
47b0: 66 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c  f the for(...) l
47c0: 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  oop */.        }
47d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
47e0: 72 63 20 3d 20 78 47 65 74 28 69 6e 74 65 72 70  rc = xGet(interp
47f0: 2c 20 26 7a 57 6f 72 64 5b 69 5d 2c 20 6e 57 6f  , &zWord[i], nWo
4800: 72 64 2d 69 2c 20 26 6e 47 65 74 29 3b 0a 20 20  rd-i, &nGet);.  
4810: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f      if( rc==TH_O
4820: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
4830: 3d 20 78 53 75 62 73 74 28 69 6e 74 65 72 70 2c  = xSubst(interp,
4840: 20 26 7a 57 6f 72 64 5b 69 5d 2c 20 6e 47 65 74   &zWord[i], nGet
4850: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4860: 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29   if( rc==TH_OK )
4870: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
4880: 63 68 61 72 20 2a 7a 52 65 73 3b 0a 20 20 20 20  char *zRes;.    
4890: 20 20 20 20 69 6e 74 20 6e 52 65 73 3b 0a 20 20      int nRes;.  
48a0: 20 20 20 20 20 20 7a 52 65 73 20 3d 20 54 68 5f        zRes = Th_
48b0: 47 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  GetResult(interp
48c0: 2c 20 26 6e 52 65 73 29 3b 0a 20 20 20 20 20 20  , &nRes);.      
48d0: 20 20 72 63 20 3d 20 74 68 42 75 66 66 65 72 57    rc = thBufferW
48e0: 72 69 74 65 28 69 6e 74 65 72 70 2c 20 26 6f 75  rite(interp, &ou
48f0: 74 70 75 74 2c 20 7a 52 65 73 2c 20 6e 52 65 73  tput, zRes, nRes
4900: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
4910: 28 6e 47 65 74 2d 31 29 3b 0a 20 20 20 20 20 20  (nGet-1);.      
4920: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
4930: 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a  f( rc==TH_OK ){.
4940: 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74      Th_SetResult
4950: 28 69 6e 74 65 72 70 2c 20 6f 75 74 70 75 74 2e  (interp, output.
4960: 7a 42 75 66 2c 20 6f 75 74 70 75 74 2e 6e 42 75  zBuf, output.nBu
4970: 66 29 3b 0a 20 20 7d 0a 20 20 74 68 42 75 66 66  f);.  }.  thBuff
4980: 65 72 46 72 65 65 28 69 6e 74 65 72 70 2c 20 26  erFree(interp, &
4990: 6f 75 74 70 75 74 29 3b 0a 20 20 72 65 74 75 72  output);.  retur
49a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
49b0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 6f 6e  eturn true if on
49c0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
49d0: 6e 67 20 69 73 20 74 72 75 65 20 6f 66 20 74 68  ng is true of th
49e0: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
49f0: 0a 2a 2a 20 74 6f 20 62 79 20 7a 49 6e 70 75 74  .** to by zInput
4a00: 2c 20 6c 65 6e 67 74 68 20 6e 49 6e 70 75 74 3a  , length nInput:
4a10: 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 49 74 20 69 73  .**.**   + It is
4a20: 20 65 6d 70 74 79 2c 20 6f 72 0a 2a 2a 20 20 20   empty, or.**   
4a30: 2b 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  + It contains no
4a40: 74 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 2d  thing but white-
4a50: 73 70 61 63 65 2c 20 6f 72 0a 2a 2a 20 20 20 2b  space, or.**   +
4a60: 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   It contains no 
4a70: 6e 6f 6e 2d 77 68 69 74 65 2d 73 70 61 63 65 20  non-white-space 
4a80: 63 68 61 72 61 63 74 65 72 73 20 62 65 66 6f 72  characters befor
4a90: 65 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  e the first .** 
4aa0: 20 20 20 20 6e 65 77 6c 69 6e 65 20 63 68 61 72      newline char
4ab0: 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  acter..**.** Oth
4ac0: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61  erwise return fa
4ad0: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
4ae0: 6e 74 20 74 68 45 6e 64 4f 66 4c 69 6e 65 28 63  nt thEndOfLine(c
4af0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 70 75  onst char *zInpu
4b00: 74 2c 20 69 6e 74 20 6e 49 6e 70 75 74 29 7b 0a  t, int nInput){.
4b10: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
4b20: 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 20 26 26 20  =0; i<nInput && 
4b30: 7a 49 6e 70 75 74 5b 69 5d 21 3d 27 5c 6e 27 20  zInput[i]!='\n' 
4b40: 26 26 20 74 68 5f 69 73 73 70 61 63 65 28 7a 49  && th_isspace(zI
4b50: 6e 70 75 74 5b 69 5d 29 3b 20 69 2b 2b 29 3b 0a  nput[i]); i++);.
4b60: 20 20 72 65 74 75 72 6e 20 28 28 69 3d 3d 6e 49    return ((i==nI
4b70: 6e 70 75 74 20 7c 7c 20 7a 49 6e 70 75 74 5b 69  nput || zInput[i
4b80: 5d 3d 3d 27 5c 6e 27 29 3f 31 3a 30 29 3b 0a 7d  ]=='\n')?1:0);.}
4b90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
4ba0: 63 74 69 6f 6e 20 73 70 6c 69 74 73 20 74 68 65  ction splits the
4bb0: 20 73 75 70 70 6c 69 65 64 20 74 68 31 20 6c 69   supplied th1 li
4bc0: 73 74 20 28 63 6f 6e 74 61 69 6e 65 64 20 69 6e  st (contained in
4bd0: 20 62 75 66 66 65 72 20 7a 4c 69 73 74 2c 0a 2a   buffer zList,.*
4be0: 2a 20 73 69 7a 65 20 6e 4c 69 73 74 29 20 69 6e  * size nList) in
4bf0: 74 6f 20 65 6c 65 6d 65 6e 74 73 20 61 6e 64 20  to elements and 
4c00: 70 65 72 66 6f 72 6d 73 20 77 6f 72 64 2d 73 75  performs word-su
4c10: 62 73 74 69 74 75 74 69 6f 6e 20 6f 6e 20 65 61  bstitution on ea
4c20: 63 68 0a 2a 2a 20 65 6c 65 6d 65 6e 74 2e 20 49  ch.** element. I
4c30: 66 20 74 68 65 20 54 68 5f 49 6e 74 65 72 70 2e  f the Th_Interp.
4c40: 69 73 4c 69 73 74 4d 6f 64 65 20 76 61 72 69 61  isListMode varia
4c50: 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ble is true, the
4c60: 6e 20 6f 6e 6c 79 0a 2a 2a 20 65 73 63 61 70 65  n only.** escape
4c70: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 73   sequences are s
4c80: 75 62 73 74 69 74 75 74 65 64 20 28 75 73 65 64  ubstituted (used
4c90: 20 62 79 20 74 68 65 20 54 68 5f 53 70 6c 69 74   by the Th_Split
4ca0: 4c 69 73 74 28 29 20 66 75 6e 63 74 69 6f 6e 29  List() function)
4cb0: 2e 0a 2a 2a 20 49 66 20 54 68 5f 49 6e 74 65 72  ..** If Th_Inter
4cc0: 70 2e 69 73 4c 69 73 74 4d 6f 64 65 20 69 73 20  p.isListMode is 
4cd0: 66 61 6c 73 65 2c 20 74 68 65 6e 20 76 61 72 69  false, then vari
4ce0: 61 62 6c 65 20 61 6e 64 20 63 6f 6d 6d 61 6e 64  able and command
4cf0: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 0a 2a 2a   substitution.**
4d00: 20 69 73 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d   is also perform
4d10: 65 64 20 28 75 73 65 64 20 62 79 20 54 68 5f 45  ed (used by Th_E
4d20: 76 61 6c 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  val())..**.** If
4d30: 20 7a 4c 69 73 74 2f 6e 4c 69 73 74 20 64 6f 65   zList/nList doe
4d40: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
4d50: 76 61 6c 69 64 20 6c 69 73 74 2c 20 54 48 5f 45  valid list, TH_E
4d60: 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64  RROR is returned
4d70: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
4d80: 20 6d 65 73 73 61 67 65 20 73 74 6f 72 65 64 20   message stored 
4d90: 69 6e 20 69 6e 74 65 72 70 2e 0a 2a 2a 0a 2a 2a  in interp..**.**
4da0: 20 49 66 20 54 48 5f 4f 4b 20 69 73 20 72 65 74   If TH_OK is ret
4db0: 75 72 6e 65 64 20 61 6e 64 20 70 61 7a 45 6c 65  urned and pazEle
4dc0: 6d 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  m is not NULL, t
4dd0: 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
4de0: 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 70 6f 69   free the.** poi
4df0: 6e 74 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  nter written to 
4e00: 28 2a 70 61 7a 45 6c 65 6d 29 20 75 73 69 6e 67  (*pazElem) using
4e10: 20 54 68 5f 46 72 65 65 28 29 2e 20 54 68 69 73   Th_Free(). This
4e20: 20 72 65 6c 65 61 73 65 73 20 6d 65 6d 6f 72 79   releases memory
4e30: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  .** allocated fo
4e40: 72 20 62 6f 74 68 20 74 68 65 20 28 2a 70 61 7a  r both the (*paz
4e50: 45 6c 65 6d 29 20 61 6e 64 20 28 2a 70 61 6e 45  Elem) and (*panE
4e60: 6c 65 6d 29 20 61 72 72 61 79 73 2e 20 45 78 61  lem) arrays. Exa
4e70: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
4e80: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 2a 2a 20  char **argv;.** 
4e90: 20 20 20 20 69 6e 74 20 2a 61 72 67 6c 3b 0a 2a      int *argl;.*
4ea0: 2a 20 20 20 20 20 69 6e 74 20 61 72 67 63 3b 0a  *     int argc;.
4eb0: 2a 2a 0a 2a 2a 20 20 20 20 20 2f 2f 20 41 66 74  **.**     // Aft
4ec0: 65 72 20 74 68 69 73 20 63 61 6c 6c 2c 20 61 72  er this call, ar
4ed0: 67 76 20 61 6e 64 20 61 72 67 6c 20 70 6f 69 6e  gv and argl poin
4ee0: 74 20 74 6f 20 76 61 6c 69 64 20 61 72 72 61 79  t to valid array
4ef0: 73 2e 20 54 68 65 0a 2a 2a 20 20 20 20 20 2f 2f  s. The.**     //
4f00: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
4f10: 6e 74 73 20 69 6e 20 65 61 63 68 20 69 73 20 61  nts in each is a
4f20: 72 67 63 2e 0a 2a 2a 20 20 20 20 20 2f 2f 0a 2a  rgc..**     //.*
4f30: 2a 20 20 20 20 20 54 68 5f 53 70 6c 69 74 4c 69  *     Th_SplitLi
4f40: 73 74 28 69 6e 74 65 72 70 2c 20 7a 4c 69 73 74  st(interp, zList
4f50: 2c 20 6e 4c 69 73 74 2c 20 26 61 72 67 76 2c 20  , nList, &argv, 
4f60: 26 61 72 67 6c 2c 20 26 61 72 67 63 29 3b 0a 2a  &argl, &argc);.*
4f70: 2a 0a 2a 2a 20 20 20 20 20 2f 2f 20 46 72 65 65  *.**     // Free
4f80: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   all memory allo
4f90: 63 61 74 65 64 20 62 79 20 54 68 5f 53 70 6c 69  cated by Th_Spli
4fa0: 74 4c 69 73 74 28 29 2e 20 54 68 65 20 61 72 72  tList(). The arr
4fb0: 61 79 73 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 20  ays pointed.**  
4fc0: 20 20 20 2f 2f 20 74 6f 20 62 79 20 61 72 67 76     // to by argv
4fd0: 20 61 6e 64 20 61 72 67 6c 20 61 72 65 20 69 6e   and argl are in
4fe0: 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
4ff0: 73 20 63 61 6c 6c 2e 0a 2a 2a 20 20 20 20 20 2f  s call..**     /
5000: 2f 0a 2a 2a 20 20 20 20 20 54 68 5f 46 72 65 65  /.**     Th_Free
5010: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 29 3b 0a  (interp, argv);.
5020: 2a 2a 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  **.*/ .static in
5030: 74 20 74 68 53 70 6c 69 74 4c 69 73 74 28 0a 20  t thSplitList(. 
5040: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65   Th_Interp *inte
5050: 72 70 2c 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  rp,      /* Inte
5060: 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 20  rpreter context 
5070: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5080: 2a 7a 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 50  *zList,     /* P
5090: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
50a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e 70 75   containing inpu
50b0: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  t list */.  int 
50c0: 6e 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  nList,          
50d0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
50e0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
50f0: 20 62 79 20 7a 4c 69 73 74 20 2a 2f 0a 20 20 63   by zList */.  c
5100: 68 61 72 20 2a 2a 2a 70 61 7a 45 6c 65 6d 2c 20  har ***pazElem, 
5110: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72        /* OUT: Ar
5120: 72 61 79 20 6f 66 20 6c 69 73 74 20 65 6c 65 6d  ray of list elem
5130: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 2a  ents */.  int **
5140: 70 61 6e 45 6c 65 6d 2c 20 20 20 20 20 20 20 20  panElem,        
5150: 20 20 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68    /* OUT: Length
5160: 73 20 6f 66 20 65 61 63 68 20 6c 69 73 74 20 65  s of each list e
5170: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
5180: 2a 70 6e 43 6f 75 6e 74 20 20 20 20 20 20 20 20  *pnCount        
5190: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
51a0: 65 72 20 6f 66 20 6c 69 73 74 20 65 6c 65 6d 65  er of list eleme
51b0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
51c0: 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a 0a 20 20 42  rc = TH_OK;..  B
51d0: 75 66 66 65 72 20 73 74 72 62 75 66 3b 0a 20 20  uffer strbuf;.  
51e0: 42 75 66 66 65 72 20 6c 65 6e 62 75 66 3b 0a 20  Buffer lenbuf;. 
51f0: 20 69 6e 74 20 6e 43 6f 75 6e 74 20 3d 20 30 3b   int nCount = 0;
5200: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
5210: 7a 49 6e 70 75 74 20 3d 20 7a 4c 69 73 74 3b 0a  zInput = zList;.
5220: 20 20 69 6e 74 20 6e 49 6e 70 75 74 20 3d 20 6e    int nInput = n
5230: 4c 69 73 74 3b 0a 0a 20 20 74 68 42 75 66 66 65  List;..  thBuffe
5240: 72 49 6e 69 74 28 26 73 74 72 62 75 66 29 3b 0a  rInit(&strbuf);.
5250: 20 20 74 68 42 75 66 66 65 72 49 6e 69 74 28 26    thBufferInit(&
5260: 6c 65 6e 62 75 66 29 3b 0a 0a 20 20 77 68 69 6c  lenbuf);..  whil
5270: 65 28 20 6e 49 6e 70 75 74 3e 30 20 29 7b 0a 20  e( nInput>0 ){. 
5280: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5290: 57 6f 72 64 3b 0a 20 20 20 20 69 6e 74 20 6e 57  Word;.    int nW
52a0: 6f 72 64 3b 0a 0a 20 20 20 20 74 68 4e 65 78 74  ord;..    thNext
52b0: 53 70 61 63 65 28 69 6e 74 65 72 70 2c 20 7a 49  Space(interp, zI
52c0: 6e 70 75 74 2c 20 6e 49 6e 70 75 74 2c 20 26 6e  nput, nInput, &n
52d0: 57 6f 72 64 29 3b 0a 20 20 20 20 7a 49 6e 70 75  Word);.    zInpu
52e0: 74 20 2b 3d 20 6e 57 6f 72 64 3b 0a 20 20 20 20  t += nWord;.    
52f0: 6e 49 6e 70 75 74 20 3d 20 6e 4c 69 73 74 2d 28  nInput = nList-(
5300: 7a 49 6e 70 75 74 2d 7a 4c 69 73 74 29 3b 0a 0a  zInput-zList);..
5310: 20 20 20 20 69 66 28 20 54 48 5f 4f 4b 21 3d 28      if( TH_OK!=(
5320: 72 63 20 3d 20 74 68 4e 65 78 74 57 6f 72 64 28  rc = thNextWord(
5330: 69 6e 74 65 72 70 2c 20 7a 49 6e 70 75 74 2c 20  interp, zInput, 
5340: 6e 49 6e 70 75 74 2c 20 26 6e 57 6f 72 64 2c 20  nInput, &nWord, 
5350: 30 29 29 0a 20 20 20 20 20 7c 7c 20 54 48 5f 4f  0)).     || TH_O
5360: 4b 21 3d 28 72 63 20 3d 20 74 68 53 75 62 73 74  K!=(rc = thSubst
5370: 57 6f 72 64 28 69 6e 74 65 72 70 2c 20 7a 49 6e  Word(interp, zIn
5380: 70 75 74 2c 20 6e 57 6f 72 64 29 29 0a 20 20 20  put, nWord)).   
5390: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
53a0: 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
53b0: 20 7a 49 6e 70 75 74 20 3d 20 26 7a 49 6e 70 75   zInput = &zInpu
53c0: 74 5b 6e 57 6f 72 64 5d 3b 0a 20 20 20 20 6e 49  t[nWord];.    nI
53d0: 6e 70 75 74 20 3d 20 6e 4c 69 73 74 2d 28 7a 49  nput = nList-(zI
53e0: 6e 70 75 74 2d 7a 4c 69 73 74 29 3b 0a 20 20 20  nput-zList);.   
53f0: 20 69 66 28 20 6e 57 6f 72 64 3e 30 20 29 7b 0a   if( nWord>0 ){.
5400: 20 20 20 20 20 20 7a 57 6f 72 64 20 3d 20 54 68        zWord = Th
5410: 5f 47 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _GetResult(inter
5420: 70 2c 20 26 6e 57 6f 72 64 29 3b 0a 20 20 20 20  p, &nWord);.    
5430: 20 20 74 68 42 75 66 66 65 72 57 72 69 74 65 28    thBufferWrite(
5440: 69 6e 74 65 72 70 2c 20 26 73 74 72 62 75 66 2c  interp, &strbuf,
5450: 20 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a   zWord, nWord);.
5460: 20 20 20 20 20 20 74 68 42 75 66 66 65 72 57 72        thBufferWr
5470: 69 74 65 28 69 6e 74 65 72 70 2c 20 26 73 74 72  ite(interp, &str
5480: 62 75 66 2c 20 22 5c 30 22 2c 20 31 29 3b 0a 20  buf, "\0", 1);. 
5490: 20 20 20 20 20 74 68 42 75 66 66 65 72 57 72 69       thBufferWri
54a0: 74 65 28 69 6e 74 65 72 70 2c 20 26 6c 65 6e 62  te(interp, &lenb
54b0: 75 66 2c 20 26 6e 57 6f 72 64 2c 20 73 69 7a 65  uf, &nWord, size
54c0: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
54d0: 6e 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  nCount++;.    }.
54e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 28 6c 65    }.  assert((le
54f0: 6e 62 75 66 2e 6e 42 75 66 2f 73 69 7a 65 6f 66  nbuf.nBuf/sizeof
5500: 28 69 6e 74 29 29 3d 3d 6e 43 6f 75 6e 74 29 3b  (int))==nCount);
5510: 0a 0a 20 20 61 73 73 65 72 74 28 28 70 61 7a 45  ..  assert((pazE
5520: 6c 65 6d 20 26 26 20 70 61 6e 45 6c 65 6d 29 20  lem && panElem) 
5530: 7c 7c 20 28 21 70 61 7a 45 6c 65 6d 20 26 26 20  || (!pazElem && 
5540: 21 70 61 6e 45 6c 65 6d 29 29 3b 0a 20 20 69 66  !panElem));.  if
5550: 28 20 70 61 7a 45 6c 65 6d 20 26 26 20 72 63 3d  ( pazElem && rc=
5560: 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  =TH_OK ){.    in
5570: 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  t i;.    char *z
5580: 45 6c 65 6d 3b 20 0a 20 20 20 20 69 6e 74 20 2a  Elem; .    int *
5590: 61 6e 45 6c 65 6d 3b 0a 20 20 20 20 63 68 61 72  anElem;.    char
55a0: 20 2a 2a 61 7a 45 6c 65 6d 20 3d 20 54 68 5f 4d   **azElem = Th_M
55b0: 61 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 0a 20 20  alloc(interp,.  
55c0: 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 2a      sizeof(char*
55d0: 29 20 2a 20 6e 43 6f 75 6e 74 20 2b 20 20 20 20  ) * nCount +    
55e0: 20 20 2f 2a 20 61 7a 45 6c 65 6d 20 2a 2f 0a 20    /* azElem */. 
55f0: 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
5600: 20 2a 20 6e 43 6f 75 6e 74 20 2b 20 20 20 20 20   * nCount +     
5610: 20 20 20 20 2f 2a 20 61 6e 45 6c 65 6d 20 2a 2f      /* anElem */
5620: 0a 20 20 20 20 20 20 73 74 72 62 75 66 2e 6e 42  .      strbuf.nB
5630: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
5640: 20 20 20 20 20 20 2f 2a 20 73 70 61 63 65 20 66        /* space f
5650: 6f 72 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 20  or list element 
5660: 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20 20 20 29  strings */.    )
5670: 3b 0a 20 20 20 20 61 6e 45 6c 65 6d 20 3d 20 28  ;.    anElem = (
5680: 69 6e 74 20 2a 29 26 61 7a 45 6c 65 6d 5b 6e 43  int *)&azElem[nC
5690: 6f 75 6e 74 5d 3b 0a 20 20 20 20 7a 45 6c 65 6d  ount];.    zElem
56a0: 20 3d 20 28 63 68 61 72 20 2a 29 26 61 6e 45 6c   = (char *)&anEl
56b0: 65 6d 5b 6e 43 6f 75 6e 74 5d 3b 0a 20 20 20 20  em[nCount];.    
56c0: 6d 65 6d 63 70 79 28 61 6e 45 6c 65 6d 2c 20 6c  memcpy(anElem, l
56d0: 65 6e 62 75 66 2e 7a 42 75 66 2c 20 6c 65 6e 62  enbuf.zBuf, lenb
56e0: 75 66 2e 6e 42 75 66 29 3b 0a 20 20 20 20 6d 65  uf.nBuf);.    me
56f0: 6d 63 70 79 28 7a 45 6c 65 6d 2c 20 73 74 72 62  mcpy(zElem, strb
5700: 75 66 2e 7a 42 75 66 2c 20 73 74 72 62 75 66 2e  uf.zBuf, strbuf.
5710: 6e 42 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 69  nBuf);.    for(i
5720: 3d 30 3b 20 69 3c 6e 43 6f 75 6e 74 3b 69 2b 2b  =0; i<nCount;i++
5730: 29 7b 0a 20 20 20 20 20 20 61 7a 45 6c 65 6d 5b  ){.      azElem[
5740: 69 5d 20 3d 20 7a 45 6c 65 6d 3b 0a 20 20 20 20  i] = zElem;.    
5750: 20 20 7a 45 6c 65 6d 20 2b 3d 20 28 61 6e 45 6c    zElem += (anEl
5760: 65 6d 5b 69 5d 20 2b 20 31 29 3b 0a 20 20 20 20  em[i] + 1);.    
5770: 7d 0a 20 20 20 20 2a 70 61 7a 45 6c 65 6d 20 3d  }.    *pazElem =
5780: 20 61 7a 45 6c 65 6d 3b 0a 20 20 20 20 2a 70 61   azElem;.    *pa
5790: 6e 45 6c 65 6d 20 3d 20 61 6e 45 6c 65 6d 3b 0a  nElem = anElem;.
57a0: 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 75 6e    }.  if( pnCoun
57b0: 74 20 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 75 6e  t ){.    *pnCoun
57c0: 74 20 3d 20 6e 43 6f 75 6e 74 3b 0a 20 20 7d 0a  t = nCount;.  }.
57d0: 20 20 0a 20 66 69 6e 69 73 68 3a 0a 20 20 74 68    . finish:.  th
57e0: 42 75 66 66 65 72 46 72 65 65 28 69 6e 74 65 72  BufferFree(inter
57f0: 70 2c 20 26 73 74 72 62 75 66 29 3b 0a 20 20 74  p, &strbuf);.  t
5800: 68 42 75 66 66 65 72 46 72 65 65 28 69 6e 74 65  hBufferFree(inte
5810: 72 70 2c 20 26 6c 65 6e 62 75 66 29 3b 0a 20 20  rp, &lenbuf);.  
5820: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5830: 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65  .** Evaluate the
5840: 20 74 68 31 20 73 63 72 69 70 74 20 63 6f 6e 74   th1 script cont
5850: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 73 74 72  ained in the str
5860: 69 6e 67 20 28 7a 50 72 6f 67 72 61 6d 2c 20 6e  ing (zProgram, n
5870: 50 72 6f 67 72 61 6d 29 0a 2a 2a 20 69 6e 20 74  Program).** in t
5880: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b  he current stack
5890: 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
58a0: 63 20 69 6e 74 20 74 68 45 76 61 6c 4c 6f 63 61  c int thEvalLoca
58b0: 6c 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74  l(Th_Interp *int
58c0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
58d0: 2a 7a 50 72 6f 67 72 61 6d 2c 20 69 6e 74 20 6e  *zProgram, int n
58e0: 50 72 6f 67 72 61 6d 29 7b 0a 20 20 69 6e 74 20  Program){.  int 
58f0: 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a 20 20 63 6f  rc = TH_OK;.  co
5900: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 70 75 74  nst char *zInput
5910: 20 3d 20 7a 50 72 6f 67 72 61 6d 3b 0a 20 20 69   = zProgram;.  i
5920: 6e 74 20 6e 49 6e 70 75 74 20 3d 20 6e 50 72 6f  nt nInput = nPro
5930: 67 72 61 6d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  gram;..  while( 
5940: 72 63 3d 3d 54 48 5f 4f 4b 20 26 26 20 6e 49 6e  rc==TH_OK && nIn
5950: 70 75 74 20 29 7b 0a 20 20 20 20 54 68 5f 48 61  put ){.    Th_Ha
5960: 73 68 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b  shEntry *pEntry;
5970: 0a 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 3b  .    int nSpace;
5980: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5990: 2a 7a 46 69 72 73 74 3b 0a 0a 20 20 20 20 63 68  *zFirst;..    ch
59a0: 61 72 20 2a 2a 61 72 67 76 3b 0a 20 20 20 20 69  ar **argv;.    i
59b0: 6e 74 20 2a 61 72 67 6c 3b 0a 20 20 20 20 69 6e  nt *argl;.    in
59c0: 74 20 61 72 67 63 3b 0a 0a 20 20 20 20 61 73 73  t argc;..    ass
59d0: 65 72 74 28 6e 49 6e 70 75 74 3e 3d 30 29 3b 0a  ert(nInput>=0);.
59e0: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 61 20 73  .    /* Skip a s
59f0: 65 6d 69 2d 63 6f 6c 6f 6e 20 2a 2f 0a 20 20 20  emi-colon */.   
5a00: 20 69 66 28 20 2a 7a 49 6e 70 75 74 3d 3d 27 3b   if( *zInput==';
5a10: 27 20 29 7b 0a 20 20 20 20 20 20 7a 49 6e 70 75  ' ){.      zInpu
5a20: 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 49 6e 70 75  t++;.      nInpu
5a30: 74 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  t--;.    }..    
5a40: 2f 2a 20 53 6b 69 70 20 70 61 73 74 20 6c 65 61  /* Skip past lea
5a50: 64 69 6e 67 20 77 68 69 74 65 2d 73 70 61 63 65  ding white-space
5a60: 2e 20 2a 2f 0a 20 20 20 20 74 68 4e 65 78 74 53  . */.    thNextS
5a70: 70 61 63 65 28 69 6e 74 65 72 70 2c 20 7a 49 6e  pace(interp, zIn
5a80: 70 75 74 2c 20 6e 49 6e 70 75 74 2c 20 26 6e 53  put, nInput, &nS
5a90: 70 61 63 65 29 3b 0a 20 20 20 20 7a 49 6e 70 75  pace);.    zInpu
5aa0: 74 20 2b 3d 20 6e 53 70 61 63 65 3b 0a 20 20 20  t += nSpace;.   
5ab0: 20 6e 49 6e 70 75 74 20 2d 3d 20 6e 53 70 61 63   nInput -= nSpac
5ac0: 65 3b 0a 20 20 20 20 7a 46 69 72 73 74 20 3d 20  e;.    zFirst = 
5ad0: 7a 49 6e 70 75 74 3b 0a 0a 20 20 20 20 2f 2a 20  zInput;..    /* 
5ae0: 43 68 65 63 6b 20 66 6f 72 20 61 20 63 6f 6d 6d  Check for a comm
5af0: 65 6e 74 2e 20 49 66 20 66 6f 75 6e 64 2c 20 73  ent. If found, s
5b00: 6b 69 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  kip to the end o
5b10: 66 20 74 68 65 20 6c 69 6e 65 2e 20 2a 2f 0a 20  f the line. */. 
5b20: 20 20 20 69 66 28 20 7a 49 6e 70 75 74 5b 30 5d     if( zInput[0]
5b30: 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 77  =='#' ){.      w
5b40: 68 69 6c 65 28 20 21 74 68 45 6e 64 4f 66 4c 69  hile( !thEndOfLi
5b50: 6e 65 28 7a 49 6e 70 75 74 2c 20 6e 49 6e 70 75  ne(zInput, nInpu
5b60: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49  t) ){.        zI
5b70: 6e 70 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nput++;.        
5b80: 6e 49 6e 70 75 74 2d 2d 3b 0a 20 20 20 20 20 20  nInput--;.      
5b90: 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
5ba0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5bb0: 47 6f 62 62 6c 65 20 75 70 20 69 6e 70 75 74 20  Gobble up input 
5bc0: 61 20 77 6f 72 64 20 61 74 20 61 20 74 69 6d 65  a word at a time
5bd0: 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 20 6f   until the end o
5be0: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 0a 20 20  f the command.  
5bf0: 20 20 2a 2a 20 28 61 20 73 65 6d 69 2d 63 6f 6c    ** (a semi-col
5c00: 6f 6e 20 6f 72 20 65 6e 64 20 6f 66 20 6c 69 6e  on or end of lin
5c10: 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  e)..    */.    w
5c20: 68 69 6c 65 28 20 72 63 3d 3d 54 48 5f 4f 4b 20  hile( rc==TH_OK 
5c30: 26 26 20 2a 7a 49 6e 70 75 74 21 3d 27 3b 27 20  && *zInput!=';' 
5c40: 26 26 20 21 74 68 45 6e 64 4f 66 4c 69 6e 65 28  && !thEndOfLine(
5c50: 7a 49 6e 70 75 74 2c 20 6e 49 6e 70 75 74 29 20  zInput, nInput) 
5c60: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 6f  ){.      int nWo
5c70: 72 64 3b 0a 20 20 20 20 20 20 74 68 4e 65 78 74  rd;.      thNext
5c80: 53 70 61 63 65 28 69 6e 74 65 72 70 2c 20 7a 49  Space(interp, zI
5c90: 6e 70 75 74 2c 20 6e 49 6e 70 75 74 2c 20 26 6e  nput, nInput, &n
5ca0: 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 72 63  Space);.      rc
5cb0: 20 3d 20 74 68 4e 65 78 74 57 6f 72 64 28 69 6e   = thNextWord(in
5cc0: 74 65 72 70 2c 20 26 7a 49 6e 70 75 74 5b 6e 53  terp, &zInput[nS
5cd0: 70 61 63 65 5d 2c 20 6e 49 6e 70 75 74 2d 6e 53  pace], nInput-nS
5ce0: 70 61 63 65 2c 20 26 6e 57 6f 72 64 2c 20 31 29  pace, &nWord, 1)
5cf0: 3b 0a 20 20 20 20 20 20 7a 49 6e 70 75 74 20 2b  ;.      zInput +
5d00: 3d 20 28 6e 53 70 61 63 65 2b 6e 57 6f 72 64 29  = (nSpace+nWord)
5d10: 3b 0a 20 20 20 20 20 20 6e 49 6e 70 75 74 20 2d  ;.      nInput -
5d20: 3d 20 28 6e 53 70 61 63 65 2b 6e 57 6f 72 64 29  = (nSpace+nWord)
5d30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5d40: 72 63 21 3d 54 48 5f 4f 4b 20 29 20 63 6f 6e 74  rc!=TH_OK ) cont
5d50: 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 70  inue;..    /* Sp
5d60: 6c 69 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  lit the command 
5d70: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
5d80: 20 77 6f 72 64 73 2e 20 54 68 69 73 20 63 61 6c   words. This cal
5d90: 6c 20 61 6c 73 6f 20 64 6f 65 73 0a 20 20 20 20  l also does.    
5da0: 2a 2a 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ** substitution 
5db0: 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  of each individu
5dc0: 61 6c 20 77 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a  al word..    */.
5dd0: 20 20 20 20 72 63 20 3d 20 74 68 53 70 6c 69 74      rc = thSplit
5de0: 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 7a 46 69  List(interp, zFi
5df0: 72 73 74 2c 20 7a 49 6e 70 75 74 2d 7a 46 69 72  rst, zInput-zFir
5e00: 73 74 2c 20 26 61 72 67 76 2c 20 26 61 72 67 6c  st, &argv, &argl
5e10: 2c 20 26 61 72 67 63 29 3b 0a 20 20 20 20 69 66  , &argc);.    if
5e20: 28 20 72 63 21 3d 54 48 5f 4f 4b 20 29 20 63 6f  ( rc!=TH_OK ) co
5e30: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 69 66 28  ntinue;..    if(
5e40: 20 61 72 67 63 3e 30 20 29 7b 0a 0a 20 20 20 20   argc>0 ){..    
5e50: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 74 68 65    /* Look up the
5e60: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 69 6e   command name in
5e70: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73   the command has
5e80: 68 2d 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h-table. */.    
5e90: 20 20 70 45 6e 74 72 79 20 3d 20 54 68 5f 48 61    pEntry = Th_Ha
5ea0: 73 68 46 69 6e 64 28 69 6e 74 65 72 70 2c 20 69  shFind(interp, i
5eb0: 6e 74 65 72 70 2d 3e 70 61 43 6d 64 2c 20 61 72  nterp->paCmd, ar
5ec0: 67 76 5b 30 5d 2c 20 61 72 67 6c 5b 30 5d 2c 20  gv[0], argl[0], 
5ed0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  0);.      if( !p
5ee0: 45 6e 74 72 79 20 29 7b 0a 20 20 20 20 20 20 20  Entry ){.       
5ef0: 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67 65   Th_ErrorMessage
5f00: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63  (interp, "no suc
5f10: 68 20 63 6f 6d 6d 61 6e 64 3a 20 22 2c 20 61 72  h command: ", ar
5f20: 67 76 5b 30 5d 2c 20 61 72 67 6c 5b 30 5d 29 3b  gv[0], argl[0]);
5f30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 48  .        rc = TH
5f40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
5f50: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74  .      /* Call t
5f60: 68 65 20 63 6f 6d 6d 61 6e 64 20 70 72 6f 63 65  he command proce
5f70: 64 75 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  dure. */.      i
5f80: 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a  f( rc==TH_OK ){.
5f90: 20 20 20 20 20 20 20 20 54 68 5f 43 6f 6d 6d 61          Th_Comma
5fa0: 6e 64 20 2a 70 20 3d 20 28 54 68 5f 43 6f 6d 6d  nd *p = (Th_Comm
5fb0: 61 6e 64 20 2a 29 28 70 45 6e 74 72 79 2d 3e 70  and *)(pEntry->p
5fc0: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63  Data);.        c
5fd0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
5fe0: 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  g = (const char 
5ff0: 2a 2a 29 61 72 67 76 3b 0a 20 20 20 20 20 20 20  **)argv;.       
6000: 20 72 63 20 3d 20 70 2d 3e 78 50 72 6f 63 28 69   rc = p->xProc(i
6010: 6e 74 65 72 70 2c 20 70 2d 3e 70 43 6f 6e 74 65  nterp, p->pConte
6020: 78 74 2c 20 61 72 67 63 2c 20 61 7a 41 72 67 2c  xt, argc, azArg,
6030: 20 61 72 67 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   argl);.      }.
6040: 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
6050: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  n error occured,
6060: 20 61 64 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e   add this comman
6070: 64 20 74 6f 20 74 68 65 20 73 74 61 63 6b 20 74  d to the stack t
6080: 72 61 63 65 20 72 65 70 6f 72 74 2e 20 2a 2f 0a  race report. */.
6090: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 48        if( rc==TH
60a0: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
60b0: 20 20 63 68 61 72 20 2a 7a 52 65 73 3b 0a 20 20    char *zRes;.  
60c0: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 73 3b 0a        int nRes;.
60d0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
60e0: 74 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  tack = 0;.      
60f0: 20 20 69 6e 74 20 6e 53 74 61 63 6b 20 3d 20 30    int nStack = 0
6100: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 7a 52 65  ;.  .        zRe
6110: 73 20 3d 20 54 68 5f 54 61 6b 65 52 65 73 75 6c  s = Th_TakeResul
6120: 74 28 69 6e 74 65 72 70 2c 20 26 6e 52 65 73 29  t(interp, &nRes)
6130: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 48  ;.        if( TH
6140: 5f 4f 4b 3d 3d 54 68 5f 47 65 74 56 61 72 28 69  _OK==Th_GetVar(i
6150: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 22  nterp, (char *)"
6160: 3a 3a 74 68 5f 73 74 61 63 6b 5f 74 72 61 63 65  ::th_stack_trace
6170: 22 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ", -1) ){.      
6180: 20 20 20 20 7a 53 74 61 63 6b 20 3d 20 54 68 5f      zStack = Th_
6190: 54 61 6b 65 52 65 73 75 6c 74 28 69 6e 74 65 72  TakeResult(inter
61a0: 70 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20 20 20  p, &nStack);.   
61b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
61c0: 68 5f 4c 69 73 74 41 70 70 65 6e 64 28 69 6e 74  h_ListAppend(int
61d0: 65 72 70 2c 20 26 7a 53 74 61 63 6b 2c 20 26 6e  erp, &zStack, &n
61e0: 53 74 61 63 6b 2c 20 7a 46 69 72 73 74 2c 20 7a  Stack, zFirst, z
61f0: 49 6e 70 75 74 2d 7a 46 69 72 73 74 29 3b 0a 20  Input-zFirst);. 
6200: 20 20 20 20 20 20 20 54 68 5f 53 65 74 56 61 72         Th_SetVar
6210: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
6220: 29 22 3a 3a 74 68 5f 73 74 61 63 6b 5f 74 72 61  )"::th_stack_tra
6230: 63 65 22 2c 20 2d 31 2c 20 7a 53 74 61 63 6b 2c  ce", -1, zStack,
6240: 20 6e 53 74 61 63 6b 29 3b 0a 20 20 20 20 20 20   nStack);.      
6250: 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 28 69    Th_SetResult(i
6260: 6e 74 65 72 70 2c 20 7a 52 65 73 2c 20 6e 52 65  nterp, zRes, nRe
6270: 73 29 3b 0a 20 20 20 20 20 20 20 20 54 68 5f 46  s);.        Th_F
6280: 72 65 65 28 69 6e 74 65 72 70 2c 20 7a 52 65 73  ree(interp, zRes
6290: 29 3b 0a 20 20 20 20 20 20 20 20 54 68 5f 46 72  );.        Th_Fr
62a0: 65 65 28 69 6e 74 65 72 70 2c 20 7a 53 74 61 63  ee(interp, zStac
62b0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
62c0: 7d 0a 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69  }..    Th_Free(i
62d0: 6e 74 65 72 70 2c 20 61 72 67 76 29 3b 0a 20 20  nterp, argv);.  
62e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
62f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
6300: 65 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 72  et an integer fr
6310: 61 6d 65 20 69 64 65 6e 74 69 66 69 65 72 20 70  ame identifier p
6320: 61 73 73 65 64 20 74 6f 20 65 69 74 68 65 72 20  assed to either 
6330: 54 68 5f 45 76 61 6c 28 29 20 6f 72 0a 2a 2a 20  Th_Eval() or.** 
6340: 54 68 5f 4c 69 6e 6b 56 61 72 28 29 2e 20 49 66  Th_LinkVar(). If
6350: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
6360: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
6370: 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 0a   the identified.
6380: 2a 2a 20 54 68 5f 46 72 61 6d 65 20 73 74 72 75  ** Th_Frame stru
6390: 63 74 75 72 65 2e 20 49 66 20 75 6e 73 75 63 63  cture. If unsucc
63a0: 65 73 73 66 75 6c 20 28 6e 6f 20 73 75 63 68 20  essful (no such 
63b0: 66 72 61 6d 65 29 2c 20 72 65 74 75 72 6e 20 30  frame), return 0
63c0: 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 20 61 6e   and.** leave an
63d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
63e0: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
63f0: 72 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  r result..**.** 
6400: 41 72 67 75 6d 65 6e 74 20 69 46 72 61 6d 65 20  Argument iFrame 
6410: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
6420: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
6430: 20 20 20 2a 20 49 66 20 69 46 72 61 6d 65 20 69     * If iFrame i
6440: 73 20 30 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  s 0, this means 
6450: 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
6460: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  e..**.**   * If 
6470: 69 46 72 61 6d 65 20 69 73 20 6e 65 67 61 74 69  iFrame is negati
6480: 76 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 74 68  ve, then the nth
6490: 20 66 72 61 6d 65 20 75 70 20 74 68 65 20 73 74   frame up the st
64a0: 61 63 6b 2c 20 77 68 65 72 65 20 0a 2a 2a 20 20  ack, where .**  
64b0: 20 20 20 6e 20 69 73 20 74 68 65 20 61 62 73 6f     n is the abso
64c0: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 69 46  lute value of iF
64d0: 72 61 6d 65 2e 20 41 20 76 61 6c 75 65 20 6f 66  rame. A value of
64e0: 20 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 0a 2a   -1 means the .*
64f0: 2a 20 20 20 20 20 63 61 6c 6c 69 6e 67 20 70 72  *     calling pr
6500: 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 20  ocedure..**.**  
6510: 20 2a 20 49 66 20 69 46 72 61 6d 65 20 69 73 20   * If iFrame is 
6520: 2b 76 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 74  +ve, then the nt
6530: 68 20 66 72 61 6d 65 20 66 72 6f 6d 20 74 68 65  h frame from the
6540: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 0a   bottom of the .
6550: 2a 2a 20 20 20 20 20 73 74 61 63 6b 2e 20 41 6e  **     stack. An
6560: 20 69 46 72 61 6d 65 20 76 61 6c 75 65 20 6f 66   iFrame value of
6570: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70   1 means the top
6580: 6c 65 76 65 6c 20 28 67 6c 6f 62 61 6c 29 20 66  level (global) f
6590: 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rame..*/.static 
65a0: 54 68 5f 46 72 61 6d 65 20 2a 67 65 74 46 72 61  Th_Frame *getFra
65b0: 6d 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e  me(Th_Interp *in
65c0: 74 65 72 70 2c 20 69 6e 74 20 69 46 72 61 6d 65  terp, int iFrame
65d0: 29 7b 0a 20 20 54 68 5f 46 72 61 6d 65 20 2a 70  ){.  Th_Frame *p
65e0: 20 3d 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d   = interp->pFram
65f0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  e;.  int i;.  if
6600: 28 20 69 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ( iFrame>0 ){.  
6610: 20 20 66 6f 72 28 69 3d 30 3b 20 70 3b 20 69 2b    for(i=0; p; i+
6620: 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d  +){.      p = p-
6630: 3e 70 43 61 6c 6c 65 72 3b 0a 20 20 20 20 7d 0a  >pCaller;.    }.
6640: 20 20 20 20 69 46 72 61 6d 65 20 3d 20 28 69 2a      iFrame = (i*
6650: 2d 31 29 20 2b 20 69 46 72 61 6d 65 3b 0a 20 20  -1) + iFrame;.  
6660: 20 20 70 20 3d 20 69 6e 74 65 72 70 2d 3e 70 46    p = interp->pF
6670: 72 61 6d 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rame;.  }.  for(
6680: 69 3d 30 3b 20 70 20 26 26 20 69 3c 28 69 46 72  i=0; p && i<(iFr
6690: 61 6d 65 2a 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20  ame*-1); i++){. 
66a0: 20 20 20 70 20 3d 20 70 2d 3e 70 43 61 6c 6c 65     p = p->pCalle
66b0: 72 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  r;.  }..  if( !p
66c0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   ){.    char *zF
66d0: 72 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  rame;.    int nF
66e0: 72 61 6d 65 3b 0a 20 20 20 20 54 68 5f 53 65 74  rame;.    Th_Set
66f0: 52 65 73 75 6c 74 49 6e 74 28 69 6e 74 65 72 70  ResultInt(interp
6700: 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 7a  , iFrame);.    z
6710: 46 72 61 6d 65 20 3d 20 54 68 5f 54 61 6b 65 52  Frame = Th_TakeR
6720: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 26 6e  esult(interp, &n
6730: 46 72 61 6d 65 29 3b 0a 20 20 20 20 54 68 5f 45  Frame);.    Th_E
6740: 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65  rrorMessage(inte
6750: 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 66 72 61  rp, "no such fra
6760: 6d 65 3a 22 2c 20 7a 46 72 61 6d 65 2c 20 6e 46  me:", zFrame, nF
6770: 72 61 6d 65 29 3b 0a 20 20 20 20 54 68 5f 46 72  rame);.    Th_Fr
6780: 65 65 28 69 6e 74 65 72 70 2c 20 7a 46 72 61 6d  ee(interp, zFram
6790: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
67a0: 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 76   p;.}.../*.** Ev
67b0: 61 6c 75 61 74 65 20 74 68 31 20 73 63 72 69 70  aluate th1 scrip
67c0: 74 20 28 7a 50 72 6f 67 72 61 6d 2c 20 6e 50 72  t (zProgram, nPr
67d0: 6f 67 72 61 6d 29 20 69 6e 20 74 68 65 20 66 72  ogram) in the fr
67e0: 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ame identified b
67f0: 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 46  y.** argument iF
6800: 72 61 6d 65 2e 20 4c 65 61 76 65 20 65 69 74 68  rame. Leave eith
6810: 65 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  er an error mess
6820: 61 67 65 20 6f 72 20 61 20 72 65 73 75 6c 74 20  age or a result 
6830: 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70  in the.** interp
6840: 72 65 74 65 72 20 72 65 73 75 6c 74 20 61 6e 64  reter result and
6850: 20 72 65 74 75 72 6e 20 61 20 74 68 31 20 65 72   return a th1 er
6860: 72 6f 72 20 63 6f 64 65 20 28 54 48 5f 4f 4b 2c  ror code (TH_OK,
6870: 20 54 48 5f 45 52 52 4f 52 2c 20 0a 2a 2a 20 54   TH_ERROR, .** T
6880: 48 5f 52 45 54 55 52 4e 2c 20 54 48 5f 43 4f 4e  H_RETURN, TH_CON
6890: 54 49 4e 55 45 20 6f 72 20 54 48 5f 42 52 45 41  TINUE or TH_BREA
68a0: 4b 29 2e 0a 2a 2f 0a 69 6e 74 20 54 68 5f 45 76  K)..*/.int Th_Ev
68b0: 61 6c 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e  al(Th_Interp *in
68c0: 74 65 72 70 2c 20 69 6e 74 20 69 46 72 61 6d 65  terp, int iFrame
68d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
68e0: 72 6f 67 72 61 6d 2c 20 69 6e 74 20 6e 50 72 6f  rogram, int nPro
68f0: 67 72 61 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20  gram){.  int rc 
6900: 3d 20 54 48 5f 4f 4b 3b 0a 20 20 54 68 5f 46 72  = TH_OK;.  Th_Fr
6910: 61 6d 65 20 2a 70 53 61 76 65 64 46 72 61 6d 65  ame *pSavedFrame
6920: 20 3d 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d   = interp->pFram
6930: 65 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 54 68 5f  e;..  /* Set Th_
6940: 49 6e 74 65 72 70 2e 70 46 72 61 6d 65 20 74 6f  Interp.pFrame to
6950: 20 74 68 65 20 66 72 61 6d 65 20 74 68 61 74 20   the frame that 
6960: 74 68 69 73 20 73 63 72 69 70 74 20 69 73 20 74  this script is t
6970: 6f 20 62 65 20 0a 20 20 2a 2a 20 65 76 61 6c 75  o be .  ** evalu
6980: 61 74 65 64 20 69 6e 2e 20 54 68 65 20 63 75 72  ated in. The cur
6990: 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20 73 61  rent frame is sa
69a0: 76 65 64 20 69 6e 20 70 53 61 76 65 64 46 72 61  ved in pSavedFra
69b0: 6d 65 20 61 6e 64 20 77 69 6c 6c 0a 20 20 2a 2a  me and will.  **
69c0: 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65 66   be restored bef
69d0: 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
69e0: 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  n returns..  */.
69f0: 20 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d 65    interp->pFrame
6a00: 20 3d 20 67 65 74 46 72 61 6d 65 28 69 6e 74 65   = getFrame(inte
6a10: 72 70 2c 20 69 46 72 61 6d 65 29 3b 0a 0a 20 20  rp, iFrame);..  
6a20: 69 66 28 20 21 69 6e 74 65 72 70 2d 3e 70 46 72  if( !interp->pFr
6a30: 61 6d 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ame ){.    rc = 
6a40: 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TH_ERROR;.  }els
6a50: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 70 75  e{.    int nInpu
6a60: 74 20 3d 20 6e 50 72 6f 67 72 61 6d 3b 0a 20 20  t = nProgram;.  
6a70: 0a 20 20 20 20 69 66 28 20 6e 49 6e 70 75 74 3c  .    if( nInput<
6a80: 30 20 29 7b 0a 20 20 20 20 20 20 6e 49 6e 70 75  0 ){.      nInpu
6a90: 74 20 3d 20 74 68 5f 73 74 72 6c 65 6e 28 7a 50  t = th_strlen(zP
6aa0: 72 6f 67 72 61 6d 29 3b 0a 20 20 20 20 7d 0a 20  rogram);.    }. 
6ab0: 20 20 20 72 63 20 3d 20 74 68 45 76 61 6c 4c 6f     rc = thEvalLo
6ac0: 63 61 6c 28 69 6e 74 65 72 70 2c 20 7a 50 72 6f  cal(interp, zPro
6ad0: 67 72 61 6d 2c 20 6e 49 6e 70 75 74 29 3b 0a 20  gram, nInput);. 
6ae0: 20 7d 0a 0a 20 20 69 6e 74 65 72 70 2d 3e 70 46   }..  interp->pF
6af0: 72 61 6d 65 20 3d 20 70 53 61 76 65 64 46 72 61  rame = pSavedFra
6b00: 6d 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  me;.  return rc;
6b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20  .}../*.** Input 
6b20: 73 74 72 69 6e 67 20 28 7a 56 61 72 6e 61 6d 65  string (zVarname
6b30: 2c 20 6e 56 61 72 6e 61 6d 65 29 20 63 6f 6e 74  , nVarname) cont
6b40: 61 69 6e 73 20 61 20 74 68 31 20 76 61 72 69 61  ains a th1 varia
6b50: 62 6c 65 20 6e 61 6d 65 2e 20 49 74 0a 2a 2a 20  ble name. It.** 
6b60: 6d 61 79 20 62 65 20 61 20 73 69 6d 70 6c 65 20  may be a simple 
6b70: 73 63 61 6c 61 72 20 76 61 72 69 61 62 6c 65 20  scalar variable 
6b80: 6e 61 6d 65 20 6f 72 20 69 74 20 6d 61 79 20 62  name or it may b
6b90: 65 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  e a reference.**
6ba0: 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6d 65 6d   to an array mem
6bb0: 62 65 72 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ber. The variabl
6bc0: 65 20 6e 61 6d 65 20 6d 61 79 20 6f 72 20 6d 61  e name may or ma
6bd0: 79 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  y not begin with
6be0: 0a 2a 2a 20 22 3a 3a 22 2c 20 69 6e 64 69 63 61  .** "::", indica
6bf0: 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 6e 61  ting that the na
6c00: 6d 65 20 72 65 66 65 72 73 20 74 6f 20 61 20 67  me refers to a g
6c10: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 2c 20  lobal variable, 
6c20: 6e 6f 74 0a 2a 2a 20 61 20 6c 6f 63 61 6c 20 73  not.** a local s
6c30: 63 6f 70 65 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  cope one..**.** 
6c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
6c50: 73 70 65 63 74 73 20 61 6e 64 20 63 61 74 65 67  spects and categ
6c60: 6f 72 69 7a 65 73 20 74 68 65 20 73 75 70 70 6c  orizes the suppl
6c70: 69 65 64 20 76 61 72 69 61 62 6c 65 20 6e 61 6d  ied variable nam
6c80: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
6c90: 6e 61 6d 65 20 69 73 20 61 20 67 6c 6f 62 61 6c  name is a global
6ca0: 20 72 65 66 65 72 65 6e 63 65 2c 20 2a 70 69 73   reference, *pis
6cb0: 47 6c 6f 62 61 6c 20 69 73 20 73 65 74 20 74 6f  Global is set to
6cc0: 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
6cd0: 0a 2a 2a 20 66 61 6c 73 65 2e 20 4f 75 74 70 75  .** false. Outpu
6ce0: 74 20 73 74 72 69 6e 67 20 28 2a 70 7a 4f 75 74  t string (*pzOut
6cf0: 65 72 2c 20 2a 70 6e 4f 75 74 65 72 29 20 69 73  er, *pnOuter) is
6d00: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 72 69   set to the vari
6d10: 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 66 20  able name.** if 
6d20: 69 74 20 69 73 20 61 20 73 63 61 6c 61 72 20 72  it is a scalar r
6d30: 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 68 65  eference, or the
6d40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 61 72 72   name of the arr
6d50: 61 79 20 69 66 20 69 74 20 69 73 20 61 6e 0a 2a  ay if it is an.*
6d60: 2a 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  * array variable
6d70: 2e 20 49 66 20 74 68 65 20 76 61 72 69 61 62 6c  . If the variabl
6d80: 65 20 69 73 20 61 20 73 63 61 6c 61 72 2c 20 2a  e is a scalar, *
6d90: 70 7a 49 6e 6e 65 72 20 69 73 20 73 65 74 20 74  pzInner is set t
6da0: 6f 20 30 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  o 0..** If it is
6db0: 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 62   an array variab
6dc0: 6c 65 2c 20 28 2a 70 7a 49 6e 6e 65 72 2c 20 2a  le, (*pzInner, *
6dd0: 70 6e 49 6e 6e 65 72 29 20 69 73 20 73 65 74 20  pnInner) is set 
6de0: 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  to the.** array 
6df0: 6b 65 79 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  key name..*/.sta
6e00: 74 69 63 20 69 6e 74 20 74 68 41 6e 61 6c 79 73  tic int thAnalys
6e10: 65 56 61 72 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  eVarname(.  cons
6e20: 74 20 63 68 61 72 20 2a 7a 56 61 72 6e 61 6d 65  t char *zVarname
6e30: 2c 0a 20 20 69 6e 74 20 6e 56 61 72 6e 61 6d 65  ,.  int nVarname
6e40: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6e50: 2a 70 7a 4f 75 74 65 72 2c 20 20 20 20 20 2f 2a  *pzOuter,     /*
6e60: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
6e70: 20 73 63 61 6c 61 72 2f 61 72 72 61 79 20 6e 61   scalar/array na
6e80: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f  me */.  int *pnO
6e90: 75 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  uter,           
6ea0: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
6eb0: 72 20 6f 66 20 62 79 74 65 73 20 61 74 20 2a 70  r of bytes at *p
6ec0: 7a 4f 75 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  zOuter */.  cons
6ed0: 74 20 63 68 61 72 20 2a 2a 70 7a 49 6e 6e 65 72  t char **pzInner
6ee0: 2c 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f  ,     /* OUT: Po
6ef0: 69 6e 74 65 72 20 74 6f 20 61 72 72 61 79 20 6b  inter to array k
6f00: 65 79 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a  ey (or null) */.
6f10: 20 20 69 6e 74 20 2a 70 6e 49 6e 6e 65 72 2c 20    int *pnInner, 
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f30: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  OUT: Number of b
6f40: 79 74 65 73 20 61 74 20 2a 70 7a 49 6e 6e 65 72  ytes at *pzInner
6f50: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 47 6c   */.  int *pisGl
6f60: 6f 62 61 6c 20 20 20 20 20 20 20 20 20 20 20 20  obal            
6f70: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
6f80: 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
6f90: 61 20 67 6c 6f 62 61 6c 20 72 65 66 20 2a 2f 0a  a global ref */.
6fa0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6fb0: 2a 7a 4f 75 74 65 72 20 3d 20 7a 56 61 72 6e 61  *zOuter = zVarna
6fc0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 65 72  me;.  int nOuter
6fd0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6fe0: 7a 49 6e 6e 65 72 20 3d 20 30 3b 0a 20 20 69 6e  zInner = 0;.  in
6ff0: 74 20 6e 49 6e 6e 65 72 20 3d 20 30 3b 0a 20 20  t nInner = 0;.  
7000: 69 6e 74 20 69 73 47 6c 6f 62 61 6c 20 3d 20 30  int isGlobal = 0
7010: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
7020: 28 20 6e 56 61 72 6e 61 6d 65 3c 30 20 29 7b 0a  ( nVarname<0 ){.
7030: 20 20 20 20 6e 56 61 72 6e 61 6d 65 20 3d 20 74      nVarname = t
7040: 68 5f 73 74 72 6c 65 6e 28 7a 56 61 72 6e 61 6d  h_strlen(zVarnam
7050: 65 29 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74 65 72  e);.  }.  nOuter
7060: 20 3d 20 6e 56 61 72 6e 61 6d 65 3b 0a 0a 20 20   = nVarname;..  
7070: 2f 2a 20 49 66 20 74 68 65 20 76 61 72 69 61 62  /* If the variab
7080: 6c 65 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  le name starts w
7090: 69 74 68 20 22 3a 3a 22 2c 20 74 68 65 6e 20 64  ith "::", then d
70a0: 6f 20 74 68 65 20 6c 6f 6f 6b 75 70 20 69 73 20  o the lookup is 
70b0: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70 70 65  in the.  ** uppe
70c0: 72 6d 6f 73 74 20 28 67 6c 6f 62 61 6c 29 20 66  rmost (global) f
70d0: 72 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rame..  */.  if(
70e0: 20 6e 56 61 72 6e 61 6d 65 3e 32 20 26 26 20 7a   nVarname>2 && z
70f0: 56 61 72 6e 61 6d 65 5b 30 5d 3d 3d 27 3a 27 20  Varname[0]==':' 
7100: 26 26 20 7a 56 61 72 6e 61 6d 65 5b 31 5d 3d 3d  && zVarname[1]==
7110: 27 3a 27 20 29 7b 0a 20 20 20 20 7a 4f 75 74 65  ':' ){.    zOute
7120: 72 20 2b 3d 20 32 3b 0a 20 20 20 20 6e 4f 75 74  r += 2;.    nOut
7130: 65 72 20 2d 3d 20 32 3b 0a 20 20 20 20 69 73 47  er -= 2;.    isG
7140: 6c 6f 62 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a  lobal = 1;.  }..
7150: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
7160: 69 73 20 69 73 20 61 6e 20 61 72 72 61 79 20 72  is is an array r
7170: 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 69  eference. */.  i
7180: 66 28 20 7a 4f 75 74 65 72 5b 6e 4f 75 74 65 72  f( zOuter[nOuter
7190: 2d 31 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  -1]==')' ){.    
71a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 75 74 65  for(i=0; i<nOute
71b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
71c0: 66 28 20 7a 4f 75 74 65 72 5b 69 5d 3d 3d 27 28  f( zOuter[i]=='(
71d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49 6e  ' ){.        zIn
71e0: 6e 65 72 20 3d 20 26 7a 4f 75 74 65 72 5b 69 2b  ner = &zOuter[i+
71f0: 31 5d 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 6e  1];.        nInn
7200: 65 72 20 3d 20 6e 4f 75 74 65 72 2d 69 2d 32 3b  er = nOuter-i-2;
7210: 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 65 72 20  .        nOuter 
7220: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = i;.        bre
7230: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7240: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 7a 4f 75 74 65  }.  }..  *pzOute
7250: 72 20 3d 20 7a 4f 75 74 65 72 3b 0a 20 20 2a 70  r = zOuter;.  *p
7260: 6e 4f 75 74 65 72 20 3d 20 6e 4f 75 74 65 72 3b  nOuter = nOuter;
7270: 0a 20 20 2a 70 7a 49 6e 6e 65 72 20 3d 20 7a 49  .  *pzInner = zI
7280: 6e 6e 65 72 3b 0a 20 20 2a 70 6e 49 6e 6e 65 72  nner;.  *pnInner
7290: 20 3d 20 6e 49 6e 6e 65 72 3b 0a 20 20 2a 70 69   = nInner;.  *pi
72a0: 73 47 6c 6f 62 61 6c 20 3d 20 69 73 47 6c 6f 62  sGlobal = isGlob
72b0: 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 54 48 5f  al;.  return TH_
72c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  OK;.}../*.** Inp
72d0: 75 74 20 73 74 72 69 6e 67 20 28 7a 56 61 72 2c  ut string (zVar,
72e0: 20 6e 56 61 72 29 20 63 6f 6e 74 61 69 6e 73 20   nVar) contains 
72f0: 61 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e  a variable name.
7300: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6c   This function l
7310: 6f 63 61 74 65 73 0a 2a 2a 20 74 68 65 20 54 68  ocates.** the Th
7320: 5f 56 61 72 69 61 62 6c 65 20 73 74 72 75 63 74  _Variable struct
7330: 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
7340: 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 76 61  ith the named va
7350: 72 69 61 62 6c 65 2e 20 54 68 65 20 0a 2a 2a 20  riable. The .** 
7360: 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 6d 61  variable name ma
7370: 79 20 62 65 20 61 20 67 6c 6f 62 61 6c 20 6f 72  y be a global or
7380: 20 6c 6f 63 61 6c 20 73 63 61 6c 61 72 20 6f 72   local scalar or
7390: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 0a   array variable.
73a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 72 65  **.** If the cre
73b0: 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
73c0: 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
73d0: 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c 65 20   named variable 
73e0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 0a 2a  does not exist.*
73f0: 2a 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  * it is created.
7400: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
7410: 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69 6e 20  rror is left in 
7420: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
7430: 72 65 73 75 6c 74 0a 2a 2a 20 61 6e 64 20 4e 55  result.** and NU
7440: 4c 4c 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  LL returned..**.
7450: 2a 2a 20 49 66 20 74 68 65 20 61 72 72 61 79 6f  ** If the arrayo
7460: 6b 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  k argument is fa
7470: 6c 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  lse and the name
7480: 64 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6e  d variable is an
7490: 20 61 72 72 61 79 2c 0a 2a 2a 20 61 6e 20 65 72   array,.** an er
74a0: 72 6f 72 20 69 73 20 6c 65 66 74 20 69 6e 20 74  ror is left in t
74b0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  he interpreter r
74c0: 65 73 75 6c 74 20 61 6e 64 20 4e 55 4c 4c 20 72  esult and NULL r
74d0: 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 61  eturned. If.** a
74e0: 72 72 61 79 6f 6b 20 69 73 20 74 72 75 65 20 61  rrayok is true a
74f0: 6e 20 61 72 72 61 79 20 6e 61 6d 65 20 69 73 20  n array name is 
7500: 4f 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 68  Ok..*/.static Th
7510: 5f 56 61 72 69 61 62 6c 65 20 2a 74 68 46 69 6e  _Variable *thFin
7520: 64 56 61 6c 75 65 28 0a 20 20 54 68 5f 49 6e 74  dValue(.  Th_Int
7530: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 63  erp *interp,.  c
7540: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 2c  onst char *zVar,
7550: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
7560: 74 6f 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65  to variable name
7570: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7590: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
75a0: 61 74 20 6e 56 61 72 20 2a 2f 0a 20 20 69 6e 74  at nVar */.  int
75b0: 20 63 72 65 61 74 65 2c 20 20 20 20 20 20 20 20   create,        
75c0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
75d0: 63 72 65 61 74 65 20 74 68 65 20 76 61 72 69 61  create the varia
75e0: 62 6c 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ble if not found
75f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 6f   */.  int arrayo
7600: 6b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k            /* 
7610: 49 66 20 74 72 75 65 2c 20 61 6e 20 61 72 72 61  If true, an arra
7620: 79 20 69 73 20 4f 6b 2e 20 4f 74 68 65 77 69 73  y is Ok. Othewis
7630: 65 20 61 72 72 61 79 3d 3d 65 72 72 6f 72 20 2a  e array==error *
7640: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
7650: 72 20 2a 7a 4f 75 74 65 72 3b 0a 20 20 69 6e 74  r *zOuter;.  int
7660: 20 6e 4f 75 74 65 72 3b 0a 20 20 63 6f 6e 73 74   nOuter;.  const
7670: 20 63 68 61 72 20 2a 7a 49 6e 6e 65 72 3b 0a 20   char *zInner;. 
7680: 20 69 6e 74 20 6e 49 6e 6e 65 72 3b 0a 20 20 69   int nInner;.  i
7690: 6e 74 20 69 73 47 6c 6f 62 61 6c 3b 0a 0a 20 20  nt isGlobal;..  
76a0: 54 68 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 45  Th_HashEntry *pE
76b0: 6e 74 72 79 3b 0a 20 20 54 68 5f 46 72 61 6d 65  ntry;.  Th_Frame
76c0: 20 2a 70 46 72 61 6d 65 20 3d 20 69 6e 74 65 72   *pFrame = inter
76d0: 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 54 68 5f  p->pFrame;.  Th_
76e0: 56 61 72 69 61 62 6c 65 20 2a 70 56 61 6c 75 65  Variable *pValue
76f0: 3b 0a 0a 20 20 74 68 41 6e 61 6c 79 73 65 56 61  ;..  thAnalyseVa
7700: 72 6e 61 6d 65 28 7a 56 61 72 2c 20 6e 56 61 72  rname(zVar, nVar
7710: 2c 20 26 7a 4f 75 74 65 72 2c 20 26 6e 4f 75 74  , &zOuter, &nOut
7720: 65 72 2c 20 26 7a 49 6e 6e 65 72 2c 20 26 6e 49  er, &zInner, &nI
7730: 6e 6e 65 72 2c 20 26 69 73 47 6c 6f 62 61 6c 29  nner, &isGlobal)
7740: 3b 0a 20 20 69 66 28 20 69 73 47 6c 6f 62 61 6c  ;.  if( isGlobal
7750: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
7760: 46 72 61 6d 65 2d 3e 70 43 61 6c 6c 65 72 20 29  Frame->pCaller )
7770: 20 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65   pFrame = pFrame
7780: 2d 3e 70 43 61 6c 6c 65 72 3b 0a 20 20 7d 0a 0a  ->pCaller;.  }..
7790: 20 20 70 45 6e 74 72 79 20 3d 20 54 68 5f 48 61    pEntry = Th_Ha
77a0: 73 68 46 69 6e 64 28 69 6e 74 65 72 70 2c 20 70  shFind(interp, p
77b0: 46 72 61 6d 65 2d 3e 70 61 56 61 72 2c 20 7a 4f  Frame->paVar, zO
77c0: 75 74 65 72 2c 20 6e 4f 75 74 65 72 2c 20 63 72  uter, nOuter, cr
77d0: 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
77e0: 70 45 6e 74 72 79 20 7c 7c 20 21 63 72 65 61 74  pEntry || !creat
77f0: 65 29 3b 0a 20 20 69 66 28 20 21 70 45 6e 74 72  e);.  if( !pEntr
7800: 79 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  y ){.    goto no
7810: 5f 73 75 63 68 5f 76 61 72 3b 0a 20 20 7d 0a 0a  _such_var;.  }..
7820: 20 20 70 56 61 6c 75 65 20 3d 20 28 54 68 5f 56    pValue = (Th_V
7830: 61 72 69 61 62 6c 65 20 2a 29 70 45 6e 74 72 79  ariable *)pEntry
7840: 2d 3e 70 44 61 74 61 3b 0a 20 20 69 66 28 20 21  ->pData;.  if( !
7850: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 61 73  pValue ){.    as
7860: 73 65 72 74 28 63 72 65 61 74 65 29 3b 0a 20 20  sert(create);.  
7870: 20 20 70 56 61 6c 75 65 20 3d 20 54 68 5f 4d 61    pValue = Th_Ma
7880: 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20 73 69 7a  lloc(interp, siz
7890: 65 6f 66 28 54 68 5f 56 61 72 69 61 62 6c 65 29  eof(Th_Variable)
78a0: 29 3b 0a 20 20 20 20 70 56 61 6c 75 65 2d 3e 6e  );.    pValue->n
78b0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 45 6e  Ref = 1;.    pEn
78c0: 74 72 79 2d 3e 70 44 61 74 61 20 3d 20 28 76 6f  try->pData = (vo
78d0: 69 64 20 2a 29 70 56 61 6c 75 65 3b 0a 20 20 7d  id *)pValue;.  }
78e0: 0a 0a 20 20 69 66 28 20 7a 49 6e 6e 65 72 20 29  ..  if( zInner )
78f0: 7b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 75 65  {.    if( pValue
7900: 2d 3e 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ->zData ){.     
7910: 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67 65   Th_ErrorMessage
7920: 28 69 6e 74 65 72 70 2c 20 22 76 61 72 69 61 62  (interp, "variab
7930: 6c 65 20 69 73 20 61 20 73 63 61 6c 61 72 3a 22  le is a scalar:"
7940: 2c 20 7a 4f 75 74 65 72 2c 20 6e 4f 75 74 65 72  , zOuter, nOuter
7950: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7960: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
7970: 20 21 70 56 61 6c 75 65 2d 3e 70 48 61 73 68 20   !pValue->pHash 
7980: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 63 72  ){.      if( !cr
7990: 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  eate ){.        
79a0: 67 6f 74 6f 20 6e 6f 5f 73 75 63 68 5f 76 61 72  goto no_such_var
79b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
79c0: 70 56 61 6c 75 65 2d 3e 70 48 61 73 68 20 3d 20  pValue->pHash = 
79d0: 54 68 5f 48 61 73 68 4e 65 77 28 69 6e 74 65 72  Th_HashNew(inter
79e0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  p);.    }.    pE
79f0: 6e 74 72 79 20 3d 20 54 68 5f 48 61 73 68 46 69  ntry = Th_HashFi
7a00: 6e 64 28 69 6e 74 65 72 70 2c 20 70 56 61 6c 75  nd(interp, pValu
7a10: 65 2d 3e 70 48 61 73 68 2c 20 7a 49 6e 6e 65 72  e->pHash, zInner
7a20: 2c 20 6e 49 6e 6e 65 72 2c 20 63 72 65 61 74 65  , nInner, create
7a30: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 45 6e 74  );.    if( !pEnt
7a40: 72 79 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ry ){.      goto
7a50: 20 6e 6f 5f 73 75 63 68 5f 76 61 72 3b 0a 20 20   no_such_var;.  
7a60: 20 20 7d 0a 20 20 20 20 70 56 61 6c 75 65 20 3d    }.    pValue =
7a70: 20 28 54 68 5f 56 61 72 69 61 62 6c 65 20 2a 29   (Th_Variable *)
7a80: 70 45 6e 74 72 79 2d 3e 70 44 61 74 61 3b 0a 20  pEntry->pData;. 
7a90: 20 20 20 69 66 28 20 21 70 56 61 6c 75 65 20 29     if( !pValue )
7aa0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 63  {.      assert(c
7ab0: 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 70 56  reate);.      pV
7ac0: 61 6c 75 65 20 3d 20 54 68 5f 4d 61 6c 6c 6f 63  alue = Th_Malloc
7ad0: 28 69 6e 74 65 72 70 2c 20 73 69 7a 65 6f 66 28  (interp, sizeof(
7ae0: 54 68 5f 56 61 72 69 61 62 6c 65 29 29 3b 0a 20  Th_Variable));. 
7af0: 20 20 20 20 20 70 56 61 6c 75 65 2d 3e 6e 52 65       pValue->nRe
7b00: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 6e  f = 1;.      pEn
7b10: 74 72 79 2d 3e 70 44 61 74 61 20 3d 20 28 76 6f  try->pData = (vo
7b20: 69 64 20 2a 29 70 56 61 6c 75 65 3b 0a 20 20 20  id *)pValue;.   
7b30: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
7b40: 69 66 28 20 70 56 61 6c 75 65 2d 3e 70 48 61 73  if( pValue->pHas
7b50: 68 20 26 26 20 21 61 72 72 61 79 6f 6b 20 29 7b  h && !arrayok ){
7b60: 0a 20 20 20 20 20 20 54 68 5f 45 72 72 6f 72 4d  .      Th_ErrorM
7b70: 65 73 73 61 67 65 28 69 6e 74 65 72 70 2c 20 22  essage(interp, "
7b80: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6e 20 61  variable is an a
7b90: 72 72 61 79 3a 22 2c 20 7a 4f 75 74 65 72 2c 20  rray:", zOuter, 
7ba0: 6e 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 72  nOuter);.      r
7bb0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
7bc0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 56 61   }..  return pVa
7bd0: 6c 75 65 3b 0a 0a 6e 6f 5f 73 75 63 68 5f 76 61  lue;..no_such_va
7be0: 72 3a 0a 20 20 54 68 5f 45 72 72 6f 72 4d 65 73  r:.  Th_ErrorMes
7bf0: 73 61 67 65 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sage(interp, "no
7c00: 20 73 75 63 68 20 76 61 72 69 61 62 6c 65 3a 22   such variable:"
7c10: 2c 20 7a 56 61 72 2c 20 6e 56 61 72 29 3b 0a 20  , zVar, nVar);. 
7c20: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7c30: 0a 2a 2a 20 53 74 72 69 6e 67 20 28 7a 56 61 72  .** String (zVar
7c40: 2c 20 6e 56 61 72 29 20 6d 75 73 74 20 63 6f 6e  , nVar) must con
7c50: 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  tain the name of
7c60: 20 61 20 73 63 61 6c 61 72 20 76 61 72 69 61 62   a scalar variab
7c70: 6c 65 20 6f 72 20 0a 2a 2a 20 61 72 72 61 79 20  le or .** array 
7c80: 6d 65 6d 62 65 72 2e 20 4c 6f 6f 6b 20 75 70 20  member. Look up 
7c90: 74 68 65 20 76 61 72 69 61 62 6c 65 2c 20 73 74  the variable, st
7ca0: 6f 72 65 20 69 74 73 20 63 75 72 72 65 6e 74 20  ore its current 
7cb0: 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20 74 68 65  value in .** the
7cc0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73   interpreter res
7cd0: 75 6c 74 20 61 6e 64 20 72 65 74 75 72 6e 20 54  ult and return T
7ce0: 48 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  H_OK..**.** If t
7cf0: 68 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c  he named variabl
7d00: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
7d10: 2c 20 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f  , return TH_ERRO
7d20: 52 20 61 6e 64 20 6c 65 61 76 65 0a 2a 2a 20 61  R and leave.** a
7d30: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
7d40: 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  in the interpret
7d50: 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  er result..*/.in
7d60: 74 20 54 68 5f 47 65 74 56 61 72 28 54 68 5f 49  t Th_GetVar(Th_I
7d70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63  nterp *interp, c
7d80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 2c  onst char *zVar,
7d90: 20 69 6e 74 20 6e 56 61 72 29 7b 0a 20 20 54 68   int nVar){.  Th
7da0: 5f 56 61 72 69 61 62 6c 65 20 2a 70 56 61 6c 75  _Variable *pValu
7db0: 65 3b 0a 0a 20 20 70 56 61 6c 75 65 20 3d 20 74  e;..  pValue = t
7dc0: 68 46 69 6e 64 56 61 6c 75 65 28 69 6e 74 65 72  hFindValue(inter
7dd0: 70 2c 20 7a 56 61 72 2c 20 6e 56 61 72 2c 20 30  p, zVar, nVar, 0
7de0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 70 56 61  , 0);.  if( !pVa
7df0: 6c 75 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lue ){.    retur
7e00: 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  n TH_ERROR;.  }.
7e10: 20 20 69 66 28 20 21 70 56 61 6c 75 65 2d 3e 7a    if( !pValue->z
7e20: 44 61 74 61 20 29 7b 0a 20 20 20 20 54 68 5f 45  Data ){.    Th_E
7e30: 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65  rrorMessage(inte
7e40: 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 76 61 72  rp, "no such var
7e50: 69 61 62 6c 65 3a 22 2c 20 7a 56 61 72 2c 20 6e  iable:", zVar, n
7e60: 56 61 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Var);.    return
7e70: 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a   TH_ERROR;.  }..
7e80: 20 20 72 65 74 75 72 6e 20 54 68 5f 53 65 74 52    return Th_SetR
7e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 56  esult(interp, pV
7ea0: 61 6c 75 65 2d 3e 7a 44 61 74 61 2c 20 70 56 61  alue->zData, pVa
7eb0: 6c 75 65 2d 3e 6e 44 61 74 61 29 3b 0a 7d 0a 0a  lue->nData);.}..
7ec0: 2f 2a 0a 2a 2a 20 53 74 72 69 6e 67 20 28 7a 56  /*.** String (zV
7ed0: 61 72 2c 20 6e 56 61 72 29 20 6d 75 73 74 20 63  ar, nVar) must c
7ee0: 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20  ontain the name 
7ef0: 6f 66 20 61 20 73 63 61 6c 61 72 20 76 61 72 69  of a scalar vari
7f00: 61 62 6c 65 20 6f 72 0a 2a 2a 20 61 72 72 61 79  able or.** array
7f10: 20 6d 65 6d 62 65 72 2e 20 49 66 20 74 68 65 20   member. If the 
7f20: 76 61 72 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f  variable does no
7f30: 74 20 65 78 69 73 74 20 69 74 20 69 73 20 63 72  t exist it is cr
7f40: 65 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 76 61  eated. The.** va
7f50: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
7f60: 20 74 68 65 20 76 61 6c 75 65 20 73 75 70 70 6c   the value suppl
7f70: 69 65 64 20 69 6e 20 73 74 72 69 6e 67 20 28 7a  ied in string (z
7f80: 56 61 6c 75 65 2c 20 6e 56 61 6c 75 65 29 2e 0a  Value, nValue)..
7f90: 2a 2a 0a 2a 2a 20 49 66 20 28 7a 56 61 72 2c 20  **.** If (zVar, 
7fa0: 6e 56 61 72 29 20 72 65 66 65 72 73 20 74 6f 20  nVar) refers to 
7fb0: 61 6e 20 65 78 69 73 74 69 6e 67 20 61 72 72 61  an existing arra
7fc0: 79 2c 20 54 48 5f 45 52 52 4f 52 20 69 73 20 72  y, TH_ERROR is r
7fd0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
7fe0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
7ff0: 6c 65 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65  left in the inte
8000: 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e 0a  rpreter result..
8010: 2a 2f 0a 69 6e 74 20 54 68 5f 53 65 74 56 61 72  */.int Th_SetVar
8020: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69  (.  Th_Interp *i
8030: 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20  nterp, .  const 
8040: 63 68 61 72 20 2a 7a 56 61 72 2c 20 0a 20 20 69  char *zVar, .  i
8050: 6e 74 20 6e 56 61 72 2c 0a 20 20 63 6f 6e 73 74  nt nVar,.  const
8060: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 2c 0a 20   char *zValue,. 
8070: 20 69 6e 74 20 6e 56 61 6c 75 65 0a 29 7b 0a 20   int nValue.){. 
8080: 20 54 68 5f 56 61 72 69 61 62 6c 65 20 2a 70 56   Th_Variable *pV
8090: 61 6c 75 65 3b 0a 0a 20 20 70 56 61 6c 75 65 20  alue;..  pValue 
80a0: 3d 20 74 68 46 69 6e 64 56 61 6c 75 65 28 69 6e  = thFindValue(in
80b0: 74 65 72 70 2c 20 7a 56 61 72 2c 20 6e 56 61 72  terp, zVar, nVar
80c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  , 1, 0);.  if( !
80d0: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 65  pValue ){.    re
80e0: 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20  turn TH_ERROR;. 
80f0: 20 7d 0a 0a 20 20 69 66 28 20 6e 56 61 6c 75 65   }..  if( nValue
8100: 3c 30 20 29 7b 0a 20 20 20 20 6e 56 61 6c 75 65  <0 ){.    nValue
8110: 20 3d 20 74 68 5f 73 74 72 6c 65 6e 28 7a 56 61   = th_strlen(zVa
8120: 6c 75 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lue);.  }.  if( 
8130: 70 56 61 6c 75 65 2d 3e 7a 44 61 74 61 20 29 7b  pValue->zData ){
8140: 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69 6e 74  .    Th_Free(int
8150: 65 72 70 2c 20 70 56 61 6c 75 65 2d 3e 7a 44 61  erp, pValue->zDa
8160: 74 61 29 3b 0a 20 20 20 20 70 56 61 6c 75 65 2d  ta);.    pValue-
8170: 3e 7a 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a  >zData = 0;.  }.
8180: 0a 20 20 61 73 73 65 72 74 28 7a 56 61 6c 75 65  .  assert(zValue
8190: 20 7c 7c 20 6e 56 61 6c 75 65 3d 3d 30 29 3b 0a   || nValue==0);.
81a0: 20 20 70 56 61 6c 75 65 2d 3e 7a 44 61 74 61 20    pValue->zData 
81b0: 3d 20 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65  = Th_Malloc(inte
81c0: 72 70 2c 20 6e 56 61 6c 75 65 2b 31 29 3b 0a 20  rp, nValue+1);. 
81d0: 20 70 56 61 6c 75 65 2d 3e 7a 44 61 74 61 5b 6e   pValue->zData[n
81e0: 56 61 6c 75 65 5d 20 3d 20 27 5c 30 27 3b 0a 20  Value] = '\0';. 
81f0: 20 6d 65 6d 63 70 79 28 70 56 61 6c 75 65 2d 3e   memcpy(pValue->
8200: 7a 44 61 74 61 2c 20 7a 56 61 6c 75 65 2c 20 6e  zData, zValue, n
8210: 56 61 6c 75 65 29 3b 0a 20 20 70 56 61 6c 75 65  Value);.  pValue
8220: 2d 3e 6e 44 61 74 61 20 3d 20 6e 56 61 6c 75 65  ->nData = nValue
8230: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f  ;..  return TH_O
8240: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
8250: 74 65 20 61 20 76 61 72 69 61 62 6c 65 20 6c 69  te a variable li
8260: 6e 6b 20 73 6f 20 74 68 61 74 20 61 63 63 65 73  nk so that acces
8270: 73 69 6e 67 20 76 61 72 69 61 62 6c 65 20 28 7a  sing variable (z
8280: 4c 6f 63 61 6c 2c 20 6e 4c 6f 63 61 6c 29 20 69  Local, nLocal) i
8290: 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73  s.** the same as
82a0: 20 61 63 63 65 73 73 69 6e 67 20 76 61 72 69 61   accessing varia
82b0: 62 6c 65 20 28 7a 4c 69 6e 6b 2c 20 6e 4c 69 6e  ble (zLink, nLin
82c0: 6b 29 20 69 6e 20 73 74 61 63 6b 20 66 72 61 6d  k) in stack fram
82d0: 65 20 69 46 72 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  e iFrame..*/.int
82e0: 20 54 68 5f 4c 69 6e 6b 56 61 72 28 0a 20 20 54   Th_LinkVar(.  T
82f0: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  h_Interp *interp
8300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8310: 20 20 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72    /* Interpreter
8320: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8330: 20 2a 7a 4c 6f 63 61 6c 2c 20 69 6e 74 20 6e 4c   *zLocal, int nL
8340: 6f 63 61 6c 2c 20 20 20 2f 2a 20 4c 6f 63 61 6c  ocal,   /* Local
8350: 20 76 61 72 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e   varname */.  in
8360: 74 20 69 46 72 61 6d 65 2c 20 20 20 20 20 20 20  t iFrame,       
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 2f 2a 20 53 74 61 63 6b 20 66 72 61 6d 65 20   /* Stack frame 
8390: 6f 66 20 6c 69 6e 6b 65 64 20 76 61 72 20 2a 2f  of linked var */
83a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
83b0: 4c 69 6e 6b 2c 20 69 6e 74 20 6e 4c 69 6e 6b 20  Link, int nLink 
83c0: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 76       /* Linked v
83d0: 61 72 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 54  arname */.){.  T
83e0: 68 5f 46 72 61 6d 65 20 2a 70 53 61 76 65 64 46  h_Frame *pSavedF
83f0: 72 61 6d 65 20 3d 20 69 6e 74 65 72 70 2d 3e 70  rame = interp->p
8400: 46 72 61 6d 65 3b 0a 20 20 54 68 5f 46 72 61 6d  Frame;.  Th_Fram
8410: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 54 68 5f  e *pFrame;.  Th_
8420: 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e 74 72  HashEntry *pEntr
8430: 79 3b 0a 20 20 54 68 5f 56 61 72 69 61 62 6c 65  y;.  Th_Variable
8440: 20 2a 70 56 61 6c 75 65 3b 0a 0a 20 20 70 46 72   *pValue;..  pFr
8450: 61 6d 65 20 3d 20 67 65 74 46 72 61 6d 65 28 69  ame = getFrame(i
8460: 6e 74 65 72 70 2c 20 69 46 72 61 6d 65 29 3b 0a  nterp, iFrame);.
8470: 20 20 69 66 28 20 21 70 46 72 61 6d 65 20 29 7b    if( !pFrame ){
8480: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f 45  .    return TH_E
8490: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 53 61 76  RROR;.  }.  pSav
84a0: 65 64 46 72 61 6d 65 20 3d 20 69 6e 74 65 72 70  edFrame = interp
84b0: 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 69 6e 74 65  ->pFrame;.  inte
84c0: 72 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72  rp->pFrame = pFr
84d0: 61 6d 65 3b 0a 20 20 70 56 61 6c 75 65 20 3d 20  ame;.  pValue = 
84e0: 74 68 46 69 6e 64 56 61 6c 75 65 28 69 6e 74 65  thFindValue(inte
84f0: 72 70 2c 20 7a 4c 69 6e 6b 2c 20 6e 4c 69 6e 6b  rp, zLink, nLink
8500: 2c 20 31 2c 20 31 29 3b 0a 20 20 69 6e 74 65 72  , 1, 1);.  inter
8510: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 53 61 76  p->pFrame = pSav
8520: 65 64 46 72 61 6d 65 3b 0a 0a 20 20 70 45 6e 74  edFrame;..  pEnt
8530: 72 79 20 3d 20 54 68 5f 48 61 73 68 46 69 6e 64  ry = Th_HashFind
8540: 28 69 6e 74 65 72 70 2c 20 69 6e 74 65 72 70 2d  (interp, interp-
8550: 3e 70 46 72 61 6d 65 2d 3e 70 61 56 61 72 2c 20  >pFrame->paVar, 
8560: 7a 4c 6f 63 61 6c 2c 20 6e 4c 6f 63 61 6c 2c 20  zLocal, nLocal, 
8570: 31 29 3b 0a 20 20 69 66 28 20 70 45 6e 74 72 79  1);.  if( pEntry
8580: 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 54  ->pData ){.    T
8590: 68 5f 45 72 72 6f 72 4d 65 73 73 61 67 65 28 69  h_ErrorMessage(i
85a0: 6e 74 65 72 70 2c 20 22 76 61 72 69 61 62 6c 65  nterp, "variable
85b0: 20 65 78 69 73 74 73 3a 22 2c 20 7a 4c 6f 63 61   exists:", zLoca
85c0: 6c 2c 20 6e 4c 6f 63 61 6c 29 3b 0a 20 20 20 20  l, nLocal);.    
85d0: 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b  return TH_ERROR;
85e0: 0a 20 20 7d 0a 20 20 70 45 6e 74 72 79 2d 3e 70  .  }.  pEntry->p
85f0: 44 61 74 61 20 3d 20 28 76 6f 69 64 20 2a 29 70  Data = (void *)p
8600: 56 61 6c 75 65 3b 0a 20 20 70 56 61 6c 75 65 2d  Value;.  pValue-
8610: 3e 6e 52 65 66 2b 2b 3b 0a 0a 20 20 72 65 74 75  >nRef++;..  retu
8620: 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  rn TH_OK;.}../*.
8630: 2a 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20  ** Input string 
8640: 28 7a 56 61 72 2c 20 6e 56 61 72 29 20 6d 75 73  (zVar, nVar) mus
8650: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61  t contain the na
8660: 6d 65 20 6f 66 20 61 20 73 63 61 6c 61 72 20 76  me of a scalar v
8670: 61 72 69 61 62 6c 65 2c 0a 2a 2a 20 61 6e 20 61  ariable,.** an a
8680: 72 72 61 79 2c 20 6f 72 20 61 6e 20 61 72 72 61  rray, or an arra
8690: 79 20 6d 65 6d 62 65 72 2e 20 49 66 20 74 68 65  y member. If the
86a0: 20 69 64 65 6e 74 69 66 69 65 64 20 76 61 72 69   identified vari
86b0: 61 62 6c 65 20 65 78 69 73 74 73 2c 20 69 74 0a  able exists, it.
86c0: 2a 2a 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e  ** is deleted an
86d0: 64 20 54 48 5f 4f 4b 20 72 65 74 75 72 6e 65 64  d TH_OK returned
86e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
86f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
8700: 20 6c 65 66 74 0a 2a 2a 20 69 6e 20 74 68 65 20   left.** in the 
8710: 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75  interpreter resu
8720: 6c 74 20 61 6e 64 20 54 48 5f 45 52 52 4f 52 20  lt and TH_ERROR 
8730: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8740: 69 6e 74 20 54 68 5f 55 6e 73 65 74 56 61 72 28  int Th_UnsetVar(
8750: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  Th_Interp *inter
8760: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
8770: 56 61 72 2c 20 69 6e 74 20 6e 56 61 72 29 7b 0a  Var, int nVar){.
8780: 20 20 54 68 5f 56 61 72 69 61 62 6c 65 20 2a 70    Th_Variable *p
8790: 56 61 6c 75 65 3b 0a 0a 20 20 70 56 61 6c 75 65  Value;..  pValue
87a0: 20 3d 20 74 68 46 69 6e 64 56 61 6c 75 65 28 69   = thFindValue(i
87b0: 6e 74 65 72 70 2c 20 7a 56 61 72 2c 20 6e 56 61  nterp, zVar, nVa
87c0: 72 2c 20 31 2c 20 31 29 3b 0a 20 20 69 66 28 20  r, 1, 1);.  if( 
87d0: 21 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72  !pValue ){.    r
87e0: 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a  eturn TH_ERROR;.
87f0: 20 20 7d 0a 0a 20 20 54 68 5f 46 72 65 65 28 69    }..  Th_Free(i
8800: 6e 74 65 72 70 2c 20 70 56 61 6c 75 65 2d 3e 7a  nterp, pValue->z
8810: 44 61 74 61 29 3b 0a 20 20 70 56 61 6c 75 65 2d  Data);.  pValue-
8820: 3e 7a 44 61 74 61 20 3d 20 30 3b 0a 20 20 69 66  >zData = 0;.  if
8830: 28 20 70 56 61 6c 75 65 2d 3e 70 48 61 73 68 20  ( pValue->pHash 
8840: 29 7b 0a 20 20 20 20 54 68 5f 48 61 73 68 49 74  ){.    Th_HashIt
8850: 65 72 61 74 65 28 69 6e 74 65 72 70 2c 20 70 56  erate(interp, pV
8860: 61 6c 75 65 2d 3e 70 48 61 73 68 2c 20 74 68 46  alue->pHash, thF
8870: 72 65 65 56 61 72 69 61 62 6c 65 2c 20 28 76 6f  reeVariable, (vo
8880: 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20  id *)interp);.  
8890: 20 20 54 68 5f 48 61 73 68 44 65 6c 65 74 65 28    Th_HashDelete(
88a0: 69 6e 74 65 72 70 2c 20 70 56 61 6c 75 65 2d 3e  interp, pValue->
88b0: 70 48 61 73 68 29 3b 0a 20 20 20 20 70 56 61 6c  pHash);.    pVal
88c0: 75 65 2d 3e 70 48 61 73 68 20 3d 20 30 3b 0a 20  ue->pHash = 0;. 
88d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f   }.  return TH_O
88e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
88f0: 72 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  rn an allocated 
8900: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
8910: 67 20 61 20 63 6f 70 79 20 6f 66 20 73 74 72 69  g a copy of stri
8920: 6e 67 20 28 7a 2c 20 6e 29 2e 20 54 68 65 0a 2a  ng (z, n). The.*
8930: 2a 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  * caller is resp
8940: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e  onsible for even
8950: 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 54  tually calling T
8960: 68 5f 46 72 65 65 28 29 20 74 6f 20 66 72 65 65  h_Free() to free
8970: 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64  .** the returned
8980: 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 63 68 61 72   buffer..*/.char
8990: 20 2a 74 68 5f 73 74 72 64 75 70 28 54 68 5f 49   *th_strdup(Th_I
89a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63  nterp *interp, c
89b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
89c0: 74 20 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  t n){.  char *zR
89d0: 65 73 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b  es;.  if( n<0 ){
89e0: 0a 20 20 20 20 6e 20 3d 20 74 68 5f 73 74 72 6c  .    n = th_strl
89f0: 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 7a 52 65  en(z);.  }.  zRe
8a00: 73 20 3d 20 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e  s = Th_Malloc(in
8a10: 74 65 72 70 2c 20 6e 2b 31 29 3b 0a 20 20 6d 65  terp, n+1);.  me
8a20: 6d 63 70 79 28 7a 52 65 73 2c 20 7a 2c 20 6e 29  mcpy(zRes, z, n)
8a30: 3b 0a 20 20 7a 52 65 73 5b 6e 5d 20 3d 20 27 5c  ;.  zRes[n] = '\
8a40: 30 27 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  0';.  return zRe
8a50: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  s;.}../*.** Argu
8a60: 6d 65 6e 74 20 7a 50 72 65 20 6d 75 73 74 20 62  ment zPre must b
8a70: 65 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  e a nul-terminat
8a80: 65 64 20 73 74 72 69 6e 67 2e 20 53 65 74 20 74  ed string. Set t
8a90: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0a 2a  he interpreter.*
8aa0: 2a 20 72 65 73 75 6c 74 20 74 6f 20 61 20 73 74  * result to a st
8ab0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
8ac0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8ad0: 7a 50 72 65 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  zPre, followed b
8ae0: 79 0a 2a 2a 20 61 20 73 70 61 63 65 20 28 22 20  y.** a space (" 
8af0: 22 29 20 63 68 61 72 61 63 74 65 72 2c 20 66 6f  ") character, fo
8b00: 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 70 79  llowed by a copy
8b10: 20 6f 66 20 73 74 72 69 6e 67 20 28 7a 2c 20 6e   of string (z, n
8b20: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  )..**.** In othe
8b30: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 65 71 75  r words, the equ
8b40: 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 2a 0a 2a 2a  ivalent of:.*.**
8b50: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 20       printf("%s 
8b60: 25 2e 2a 73 22 2c 20 7a 50 72 65 2c 20 6e 2c 20  %.*s", zPre, n, 
8b70: 7a 29 3b 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  z);.**.** Exampl
8b80: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 5f  e:.**.**     Th_
8b90: 45 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74  ErrorMessage(int
8ba0: 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 76 61  erp, "no such va
8bb0: 72 69 61 62 6c 65 3a 22 2c 20 7a 56 61 72 6e 61  riable:", zVarna
8bc0: 6d 65 2c 20 6e 56 61 72 6e 61 6d 65 29 3b 0a 2a  me, nVarname);.*
8bd0: 2a 0a 2a 2f 0a 69 6e 74 20 54 68 5f 45 72 72 6f  *.*/.int Th_Erro
8be0: 72 4d 65 73 73 61 67 65 28 54 68 5f 49 6e 74 65  rMessage(Th_Inte
8bf0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73  rp *interp, cons
8c00: 74 20 63 68 61 72 20 2a 7a 50 72 65 2c 20 63 6f  t char *zPre, co
8c10: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
8c20: 20 6e 29 7b 0a 20 20 69 66 28 20 69 6e 74 65 72   n){.  if( inter
8c30: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  p ){.    char *z
8c40: 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Res = 0;.    int
8c50: 20 6e 52 65 73 20 3d 20 30 3b 0a 0a 20 20 20 20   nRes = 0;..    
8c60: 54 68 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  Th_SetVar(interp
8c70: 2c 20 28 63 68 61 72 20 2a 29 22 3a 3a 74 68 5f  , (char *)"::th_
8c80: 73 74 61 63 6b 5f 74 72 61 63 65 22 2c 20 2d 31  stack_trace", -1
8c90: 2c 20 30 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20  , 0, 0);.  .    
8ca0: 54 68 5f 53 74 72 69 6e 67 41 70 70 65 6e 64 28  Th_StringAppend(
8cb0: 69 6e 74 65 72 70 2c 20 26 7a 52 65 73 2c 20 26  interp, &zRes, &
8cc0: 6e 52 65 73 2c 20 7a 50 72 65 2c 20 2d 31 29 3b  nRes, zPre, -1);
8cd0: 0a 20 20 20 20 69 66 28 20 7a 52 65 73 5b 6e 52  .    if( zRes[nR
8ce0: 65 73 2d 31 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  es-1]=='"' ){.  
8cf0: 20 20 20 20 54 68 5f 53 74 72 69 6e 67 41 70 70      Th_StringApp
8d00: 65 6e 64 28 69 6e 74 65 72 70 2c 20 26 7a 52 65  end(interp, &zRe
8d10: 73 2c 20 26 6e 52 65 73 2c 20 7a 2c 20 6e 29 3b  s, &nRes, z, n);
8d20: 0a 20 20 20 20 20 20 54 68 5f 53 74 72 69 6e 67  .      Th_String
8d30: 41 70 70 65 6e 64 28 69 6e 74 65 72 70 2c 20 26  Append(interp, &
8d40: 7a 52 65 73 2c 20 26 6e 52 65 73 2c 20 28 63 6f  zRes, &nRes, (co
8d50: 6e 73 74 20 63 68 61 72 20 2a 29 22 5c 22 22 2c  nst char *)"\"",
8d60: 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
8d70: 20 20 20 20 20 20 54 68 5f 53 74 72 69 6e 67 41        Th_StringA
8d80: 70 70 65 6e 64 28 69 6e 74 65 72 70 2c 20 26 7a  ppend(interp, &z
8d90: 52 65 73 2c 20 26 6e 52 65 73 2c 20 28 63 6f 6e  Res, &nRes, (con
8da0: 73 74 20 63 68 61 72 20 2a 29 22 20 22 2c 20 31  st char *)" ", 1
8db0: 29 3b 0a 20 20 20 20 20 20 54 68 5f 53 74 72 69  );.      Th_Stri
8dc0: 6e 67 41 70 70 65 6e 64 28 69 6e 74 65 72 70 2c  ngAppend(interp,
8dd0: 20 26 7a 52 65 73 2c 20 26 6e 52 65 73 2c 20 7a   &zRes, &nRes, z
8de0: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , n);.    }..   
8df0: 20 54 68 5f 53 65 74 52 65 73 75 6c 74 28 69 6e   Th_SetResult(in
8e00: 74 65 72 70 2c 20 7a 52 65 73 2c 20 6e 52 65 73  terp, zRes, nRes
8e10: 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69  );.    Th_Free(i
8e20: 6e 74 65 72 70 2c 20 7a 52 65 73 29 3b 0a 20 20  nterp, zRes);.  
8e30: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f  }..  return TH_O
8e40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
8e50: 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 74 65  the current inte
8e60: 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 20 62  rpreter result b
8e70: 79 20 74 61 6b 69 6e 67 20 61 20 63 6f 70 79 20  y taking a copy 
8e80: 6f 66 20 74 68 65 20 62 75 66 66 65 72 0a 2a 2a  of the buffer.**
8e90: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
8ea0: 2c 20 73 69 7a 65 20 6e 20 62 79 74 65 73 2e 20  , size n bytes. 
8eb0: 54 48 5f 4f 4b 20 69 73 20 61 6c 77 61 79 73 20  TH_OK is always 
8ec0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
8ed0: 20 54 68 5f 53 65 74 52 65 73 75 6c 74 28 54 68   Th_SetResult(Th
8ee0: 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72 70  _Interp *pInterp
8ef0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
8f00: 20 69 6e 74 20 6e 29 7b 0a 0a 20 20 2f 2a 20 46   int n){..  /* F
8f10: 72 65 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ree the current 
8f20: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 54 68 5f 46  result */.  Th_F
8f30: 72 65 65 28 70 49 6e 74 65 72 70 2c 20 70 49 6e  ree(pInterp, pIn
8f40: 74 65 72 70 2d 3e 7a 52 65 73 75 6c 74 29 3b 0a  terp->zResult);.
8f50: 20 20 70 49 6e 74 65 72 70 2d 3e 7a 52 65 73 75    pInterp->zResu
8f60: 6c 74 20 3d 20 30 3b 0a 20 20 70 49 6e 74 65 72  lt = 0;.  pInter
8f70: 70 2d 3e 6e 52 65 73 75 6c 74 20 3d 20 30 3b 0a  p->nResult = 0;.
8f80: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
8f90: 20 20 6e 20 3d 20 74 68 5f 73 74 72 6c 65 6e 28    n = th_strlen(
8fa0: 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a  z);.  }..  if( z
8fb0: 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20 20 63   && n>0 ){.    c
8fc0: 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20  har *zResult;.  
8fd0: 20 20 7a 52 65 73 75 6c 74 20 3d 20 54 68 5f 4d    zResult = Th_M
8fe0: 61 6c 6c 6f 63 28 70 49 6e 74 65 72 70 2c 20 6e  alloc(pInterp, n
8ff0: 2b 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1);.    memcpy(
9000: 7a 52 65 73 75 6c 74 2c 20 7a 2c 20 6e 29 3b 0a  zResult, z, n);.
9010: 20 20 20 20 7a 52 65 73 75 6c 74 5b 6e 5d 20 3d      zResult[n] =
9020: 20 27 5c 30 27 3b 0a 20 20 20 20 70 49 6e 74 65   '\0';.    pInte
9030: 72 70 2d 3e 7a 52 65 73 75 6c 74 20 3d 20 7a 52  rp->zResult = zR
9040: 65 73 75 6c 74 3b 0a 20 20 20 20 70 49 6e 74 65  esult;.    pInte
9050: 72 70 2d 3e 6e 52 65 73 75 6c 74 20 3d 20 6e 3b  rp->nResult = n;
9060: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
9070: 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  H_OK;.}../*.** R
9080: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
9090: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  to the buffer co
90a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
90b0: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
90c0: 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 49 66 20 70  .** result. If p
90d0: 4e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  N is not NULL, s
90e0: 65 74 20 2a 70 4e 20 74 6f 20 74 68 65 20 73 69  et *pN to the si
90f0: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
9100: 65 64 0a 2a 2a 20 62 75 66 66 65 72 2e 0a 2a 2f  ed.** buffer..*/
9110: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 68 5f  .const char *Th_
9120: 47 65 74 52 65 73 75 6c 74 28 54 68 5f 49 6e 74  GetResult(Th_Int
9130: 65 72 70 20 2a 70 49 6e 74 65 72 70 2c 20 69 6e  erp *pInterp, in
9140: 74 20 2a 70 4e 29 7b 0a 20 20 61 73 73 65 72 74  t *pN){.  assert
9150: 28 70 49 6e 74 65 72 70 2d 3e 7a 52 65 73 75 6c  (pInterp->zResul
9160: 74 20 7c 7c 20 70 49 6e 74 65 72 70 2d 3e 6e 52  t || pInterp->nR
9170: 65 73 75 6c 74 3d 3d 30 29 3b 0a 20 20 69 66 28  esult==0);.  if(
9180: 20 70 4e 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d   pN ){.    *pN =
9190: 20 70 49 6e 74 65 72 70 2d 3e 6e 52 65 73 75 6c   pInterp->nResul
91a0: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
91b0: 28 70 49 6e 74 65 72 70 2d 3e 7a 52 65 73 75 6c  (pInterp->zResul
91c0: 74 20 3f 20 70 49 6e 74 65 72 70 2d 3e 7a 52 65  t ? pInterp->zRe
91d0: 73 75 6c 74 20 3a 20 28 63 6f 6e 73 74 20 63 68  sult : (const ch
91e0: 61 72 20 2a 29 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a  ar *)"");.}../*.
91f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
9200: 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65  ter to the buffe
9210: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
9220: 20 63 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72   current interpr
9230: 65 74 65 72 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  eter.** result. 
9240: 49 66 20 70 4e 20 69 73 20 6e 6f 74 20 4e 55 4c  If pN is not NUL
9250: 4c 2c 20 73 65 74 20 2a 70 4e 20 74 6f 20 74 68  L, set *pN to th
9260: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
9270: 74 75 72 6e 65 64 0a 2a 2a 20 62 75 66 66 65 72  turned.** buffer
9280: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
9290: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  ction is the sam
92a0: 65 20 61 73 20 54 68 5f 47 65 74 52 65 73 75 6c  e as Th_GetResul
92b0: 74 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  t() except that 
92c0: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 69 73  the.** caller is
92d0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
92e0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
92f0: 69 6e 67 20 54 68 5f 46 72 65 65 28 29 20 6f 6e  ing Th_Free() on
9300: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64   the.** returned
9310: 20 62 75 66 66 65 72 2e 20 54 68 65 20 69 6e 74   buffer. The int
9320: 65 72 6e 61 6c 20 69 6e 74 65 72 70 72 65 74 65  ernal interprete
9330: 72 20 72 65 73 75 6c 74 20 69 73 20 63 6c 65 61  r result is clea
9340: 72 65 64 0a 2a 2a 20 61 66 74 65 72 20 74 68 69  red.** after thi
9350: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
9360: 6c 6c 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 54  lled..*/.char *T
9370: 68 5f 54 61 6b 65 52 65 73 75 6c 74 28 54 68 5f  h_TakeResult(Th_
9380: 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72 70 2c  Interp *pInterp,
9390: 20 69 6e 74 20 2a 70 4e 29 7b 0a 20 20 69 66 28   int *pN){.  if(
93a0: 20 70 4e 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d   pN ){.    *pN =
93b0: 20 70 49 6e 74 65 72 70 2d 3e 6e 52 65 73 75 6c   pInterp->nResul
93c0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
93d0: 74 65 72 70 2d 3e 7a 52 65 73 75 6c 74 20 29 7b  terp->zResult ){
93e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73 75  .    char *zResu
93f0: 6c 74 20 3d 20 70 49 6e 74 65 72 70 2d 3e 7a 52  lt = pInterp->zR
9400: 65 73 75 6c 74 3b 0a 20 20 20 20 70 49 6e 74 65  esult;.    pInte
9410: 72 70 2d 3e 7a 52 65 73 75 6c 74 20 3d 20 30 3b  rp->zResult = 0;
9420: 0a 20 20 20 20 70 49 6e 74 65 72 70 2d 3e 6e 52  .    pInterp->nR
9430: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 72  esult = 0;.    r
9440: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 20  eturn zResult;. 
9450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
9460: 72 6e 20 28 63 68 61 72 20 2a 29 54 68 5f 4d 61  rn (char *)Th_Ma
9470: 6c 6c 6f 63 28 70 49 6e 74 65 72 70 2c 20 31 29  lloc(pInterp, 1)
9480: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a  ;.  }.}.../* .**
9490: 20 57 72 61 70 70 65 72 73 20 61 72 6f 75 6e 64   Wrappers around
94a0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
94b0: 6c 6c 6f 63 28 29 20 61 6e 64 20 66 72 65 65 28  lloc() and free(
94c0: 29 20 0a 2a 2f 0a 76 6f 69 64 20 2a 54 68 5f 4d  ) .*/.void *Th_M
94d0: 61 6c 6c 6f 63 28 54 68 5f 49 6e 74 65 72 70 20  alloc(Th_Interp 
94e0: 2a 70 49 6e 74 65 72 70 2c 20 69 6e 74 20 6e 42  *pInterp, int nB
94f0: 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20  yte){.  void *p 
9500: 3d 20 70 49 6e 74 65 72 70 2d 3e 70 56 74 61 62  = pInterp->pVtab
9510: 2d 3e 78 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  ->xMalloc(nByte)
9520: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
9530: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 42   memset(p, 0, nB
9540: 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
9550: 72 6e 20 70 3b 0a 7d 0a 76 6f 69 64 20 54 68 5f  rn p;.}.void Th_
9560: 46 72 65 65 28 54 68 5f 49 6e 74 65 72 70 20 2a  Free(Th_Interp *
9570: 70 49 6e 74 65 72 70 2c 20 76 6f 69 64 20 2a 7a  pInterp, void *z
9580: 29 7b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  ){.  if( z ){.  
9590: 20 20 70 49 6e 74 65 72 70 2d 3e 70 56 74 61 62    pInterp->pVtab
95a0: 2d 3e 78 46 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  ->xFree(z);.  }.
95b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74 61 6c 6c  }../*.** Install
95c0: 20 61 20 6e 65 77 20 74 68 31 20 63 6f 6d 6d 61   a new th1 comma
95d0: 6e 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nd. .**.** If a 
95e0: 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68 65 20 73  command of the s
95f0: 61 6d 65 20 6e 61 6d 65 20 61 6c 72 65 61 64 79  ame name already
9600: 20 65 78 69 73 74 73 2c 20 69 74 20 69 73 20 64   exists, it is d
9610: 65 6c 65 74 65 64 20 61 75 74 6f 6d 61 74 69 63  eleted automatic
9620: 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 54 68 5f  ally..*/.int Th_
9630: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20  CreateCommand(. 
9640: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65   Th_Interp *inte
9650: 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  rp, .  const cha
9660: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
9670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
9680: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f   command name */
9690: 0a 20 20 54 68 5f 43 6f 6d 6d 61 6e 64 50 72 6f  .  Th_CommandPro
96a0: 63 20 78 50 72 6f 63 2c 20 20 20 20 20 20 20 20  c xProc,        
96b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64        /* Command
96c0: 20 63 61 6c 6c 62 61 63 6b 20 70 72 6f 63 20 2a   callback proc *
96d0: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65  /.  void *pConte
96e0: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
96f0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
9700: 74 6f 20 70 61 73 73 20 61 73 20 73 65 63 6f 6e  to pass as secon
9710: 64 20 61 72 67 20 74 6f 20 78 50 72 6f 63 20 2a  d arg to xProc *
9720: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
9730: 28 54 68 5f 49 6e 74 65 72 70 20 2a 2c 20 76 6f  (Th_Interp *, vo
9740: 69 64 20 2a 29 20 20 2f 2a 20 43 6f 6d 6d 61 6e  id *)  /* Comman
9750: 64 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6c  d destructor cal
9760: 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 54 68  lback */.){.  Th
9770: 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e 74  _HashEntry *pEnt
9780: 72 79 3b 0a 20 20 54 68 5f 43 6f 6d 6d 61 6e 64  ry;.  Th_Command
9790: 20 2a 70 43 6f 6d 6d 61 6e 64 3b 0a 0a 20 20 70   *pCommand;..  p
97a0: 45 6e 74 72 79 20 3d 20 54 68 5f 48 61 73 68 46  Entry = Th_HashF
97b0: 69 6e 64 28 69 6e 74 65 72 70 2c 20 69 6e 74 65  ind(interp, inte
97c0: 72 70 2d 3e 70 61 43 6d 64 2c 20 28 63 6f 6e 73  rp->paCmd, (cons
97d0: 74 20 63 68 61 72 20 2a 29 7a 4e 61 6d 65 2c 20  t char *)zName, 
97e0: 2d 31 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 45  -1, 1);.  if( pE
97f0: 6e 74 72 79 2d 3e 70 44 61 74 61 20 29 7b 0a 20  ntry->pData ){. 
9800: 20 20 20 70 43 6f 6d 6d 61 6e 64 20 3d 20 70 45     pCommand = pE
9810: 6e 74 72 79 2d 3e 70 44 61 74 61 3b 0a 20 20 20  ntry->pData;.   
9820: 20 69 66 28 20 70 43 6f 6d 6d 61 6e 64 2d 3e 78   if( pCommand->x
9830: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  Del ){.      pCo
9840: 6d 6d 61 6e 64 2d 3e 78 44 65 6c 28 69 6e 74 65  mmand->xDel(inte
9850: 72 70 2c 20 70 43 6f 6d 6d 61 6e 64 2d 3e 70 43  rp, pCommand->pC
9860: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  ontext);.    }. 
9870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6d   }else{.    pCom
9880: 6d 61 6e 64 20 3d 20 54 68 5f 4d 61 6c 6c 6f 63  mand = Th_Malloc
9890: 28 69 6e 74 65 72 70 2c 20 73 69 7a 65 6f 66 28  (interp, sizeof(
98a0: 54 68 5f 43 6f 6d 6d 61 6e 64 29 29 3b 0a 20 20  Th_Command));.  
98b0: 7d 0a 20 20 70 43 6f 6d 6d 61 6e 64 2d 3e 78 50  }.  pCommand->xP
98c0: 72 6f 63 20 3d 20 78 50 72 6f 63 3b 0a 20 20 70  roc = xProc;.  p
98d0: 43 6f 6d 6d 61 6e 64 2d 3e 70 43 6f 6e 74 65 78  Command->pContex
98e0: 74 20 3d 20 70 43 6f 6e 74 65 78 74 3b 0a 20 20  t = pContext;.  
98f0: 70 43 6f 6d 6d 61 6e 64 2d 3e 78 44 65 6c 20 3d  pCommand->xDel =
9900: 20 78 44 65 6c 3b 0a 20 20 70 45 6e 74 72 79 2d   xDel;.  pEntry-
9910: 3e 70 44 61 74 61 20 3d 20 28 76 6f 69 64 20 2a  >pData = (void *
9920: 29 70 43 6f 6d 6d 61 6e 64 3b 0a 20 0a 20 20 72  )pCommand;. .  r
9930: 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a  eturn TH_OK;.}..
9940: 2f 2a 0a 2a 2a 20 52 65 6e 61 6d 65 20 74 68 65  /*.** Rename the
9950: 20 65 78 69 73 74 69 6e 67 20 63 6f 6d 6d 61 6e   existing comman
9960: 64 20 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  d (zName, nName)
9970: 20 74 6f 20 28 7a 4e 65 77 2c 20 6e 4e 65 77 29   to (zNew, nNew)
9980: 2e 20 49 66 20 6e 4e 65 77 20 69 73 20 30 2c 20  . If nNew is 0, 
9990: 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  .** the command 
99a0: 69 73 20 64 65 6c 65 74 65 64 20 69 6e 73 74 65  is deleted inste
99b0: 61 64 20 6f 66 20 72 65 6e 61 6d 65 64 2e 0a 2a  ad of renamed..*
99c0: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
99d0: 75 6c 2c 20 54 48 5f 4f 4b 20 69 73 20 72 65 74  ul, TH_OK is ret
99e0: 75 72 6e 65 64 2e 20 49 66 20 63 6f 6d 6d 61 6e  urned. If comman
99f0: 64 20 7a 4e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  d zName does not
9a00: 20 65 78 69 73 74 2c 20 6f 72 0a 2a 2a 20 69 66   exist, or.** if
9a10: 20 63 6f 6d 6d 61 6e 64 20 7a 4e 65 77 20 61 6c   command zNew al
9a20: 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 61 6e  ready exists, an
9a30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
9a40: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  s left in the .*
9a50: 2a 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65  * interpreter re
9a60: 73 75 6c 74 20 61 6e 64 20 54 48 5f 45 52 52 4f  sult and TH_ERRO
9a70: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
9a80: 2f 0a 69 6e 74 20 54 68 5f 52 65 6e 61 6d 65 43  /.int Th_RenameC
9a90: 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e 74  ommand(.  Th_Int
9aa0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
9ab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9ac0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
9ad0: 20 45 78 69 73 74 69 6e 67 20 63 6f 6d 6d 61 6e   Existing comman
9ae0: 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  d name */.  int 
9af0: 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  nName,          
9b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9b10: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 74  mber of bytes at
9b20: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73   zName */.  cons
9b30: 74 20 63 68 61 72 20 2a 7a 4e 65 77 2c 20 20 20  t char *zNew,   
9b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
9b50: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f   command name */
9b60: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 20 20 20 20  .  int nNew     
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
9b90: 79 74 65 73 20 61 74 20 7a 4e 65 77 20 2a 2f 0a  ytes at zNew */.
9ba0: 29 7b 0a 20 20 54 68 5f 48 61 73 68 45 6e 74 72  ){.  Th_HashEntr
9bb0: 79 20 2a 70 45 6e 74 72 79 3b 0a 20 20 54 68 5f  y *pEntry;.  Th_
9bc0: 48 61 73 68 45 6e 74 72 79 20 2a 70 4e 65 77 45  HashEntry *pNewE
9bd0: 6e 74 72 79 3b 0a 0a 20 20 70 45 6e 74 72 79 20  ntry;..  pEntry 
9be0: 3d 20 54 68 5f 48 61 73 68 46 69 6e 64 28 69 6e  = Th_HashFind(in
9bf0: 74 65 72 70 2c 20 69 6e 74 65 72 70 2d 3e 70 61  terp, interp->pa
9c00: 43 6d 64 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Cmd, zName, nNam
9c10: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 70 45  e, 0);.  if( !pE
9c20: 6e 74 72 79 20 29 7b 0a 20 20 20 20 54 68 5f 45  ntry ){.    Th_E
9c30: 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65  rrorMessage(inte
9c40: 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6d  rp, "no such com
9c50: 6d 61 6e 64 3a 22 2c 20 7a 4e 61 6d 65 2c 20 6e  mand:", zName, n
9c60: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
9c70: 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  n TH_ERROR;.  }.
9c80: 20 20 61 73 73 65 72 74 28 70 45 6e 74 72 79 2d    assert(pEntry-
9c90: 3e 70 44 61 74 61 29 3b 0a 0a 20 20 69 66 28 20  >pData);..  if( 
9ca0: 6e 4e 65 77 3e 30 20 29 7b 0a 20 20 20 20 70 4e  nNew>0 ){.    pN
9cb0: 65 77 45 6e 74 72 79 20 3d 20 54 68 5f 48 61 73  ewEntry = Th_Has
9cc0: 68 46 69 6e 64 28 69 6e 74 65 72 70 2c 20 69 6e  hFind(interp, in
9cd0: 74 65 72 70 2d 3e 70 61 43 6d 64 2c 20 7a 4e 65  terp->paCmd, zNe
9ce0: 77 2c 20 6e 4e 65 77 2c 20 31 29 3b 0a 20 20 20  w, nNew, 1);.   
9cf0: 20 69 66 28 20 70 4e 65 77 45 6e 74 72 79 2d 3e   if( pNewEntry->
9d00: 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 54  pData ){.      T
9d10: 68 5f 45 72 72 6f 72 4d 65 73 73 61 67 65 28 69  h_ErrorMessage(i
9d20: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
9d30: 65 78 69 73 74 73 3a 22 2c 20 7a 4e 65 77 2c 20  exists:", zNew, 
9d40: 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  nNew);.      ret
9d50: 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20  urn TH_ERROR;.  
9d60: 20 20 7d 0a 20 20 20 20 70 4e 65 77 45 6e 74 72    }.    pNewEntr
9d70: 79 2d 3e 70 44 61 74 61 20 3d 20 70 45 6e 74 72  y->pData = pEntr
9d80: 79 2d 3e 70 44 61 74 61 3b 0a 20 20 7d 65 6c 73  y->pData;.  }els
9d90: 65 7b 0a 20 20 20 20 54 68 5f 43 6f 6d 6d 61 6e  e{.    Th_Comman
9da0: 64 20 2a 70 43 6f 6d 6d 61 6e 64 20 3d 20 28 54  d *pCommand = (T
9db0: 68 5f 43 6f 6d 6d 61 6e 64 20 2a 29 28 70 45 6e  h_Command *)(pEn
9dc0: 74 72 79 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  try->pData);.   
9dd0: 20 69 66 28 20 70 43 6f 6d 6d 61 6e 64 2d 3e 78   if( pCommand->x
9de0: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  Del ){.      pCo
9df0: 6d 6d 61 6e 64 2d 3e 78 44 65 6c 28 69 6e 74 65  mmand->xDel(inte
9e00: 72 70 2c 20 70 43 6f 6d 6d 61 6e 64 2d 3e 70 43  rp, pCommand->pC
9e10: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  ontext);.    }. 
9e20: 20 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 72     Th_Free(inter
9e30: 70 2c 20 70 43 6f 6d 6d 61 6e 64 29 3b 0a 20 20  p, pCommand);.  
9e40: 7d 0a 0a 20 20 54 68 5f 48 61 73 68 46 69 6e 64  }..  Th_HashFind
9e50: 28 69 6e 74 65 72 70 2c 20 69 6e 74 65 72 70 2d  (interp, interp-
9e60: 3e 70 61 43 6d 64 2c 20 7a 4e 61 6d 65 2c 20 6e  >paCmd, zName, n
9e70: 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 72 65 74  Name, -1);.  ret
9e80: 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  urn TH_OK;.}../*
9e90: 0a 2a 2a 20 50 75 73 68 20 61 20 73 74 61 63 6b  .** Push a stack
9ea0: 20 66 72 61 6d 65 20 6f 6e 74 6f 20 74 68 65 20   frame onto the 
9eb0: 69 6e 74 65 72 70 72 65 74 65 72 20 73 74 61 63  interpreter stac
9ec0: 6b 2c 20 69 6e 76 6f 6b 65 20 74 68 65 0a 2a 2a  k, invoke the.**
9ed0: 20 63 61 6c 6c 62 61 63 6b 2c 20 61 6e 64 20 70   callback, and p
9ee0: 6f 70 20 74 68 65 20 66 72 61 6d 65 20 62 61 63  op the frame bac
9ef0: 6b 20 6f 66 66 20 61 67 61 69 6e 2e 20 53 65 65  k off again. See
9f00: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
9f10: 69 6f 6e 0a 2a 2a 20 6f 66 20 5b 70 72 6f 63 5d  ion.** of [proc]
9f20: 20 28 74 68 5f 6c 61 6e 67 2e 63 29 20 66 6f 72   (th_lang.c) for
9f30: 20 61 6e 20 65 78 61 6d 70 6c 65 2e 0a 2a 2f 0a   an example..*/.
9f40: 69 6e 74 20 54 68 5f 49 6e 46 72 61 6d 65 28 54  int Th_InFrame(T
9f50: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  h_Interp *interp
9f60: 2c 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 29  ,.  int (*xCall)
9f70: 28 54 68 5f 49 6e 74 65 72 70 20 2a 2c 20 76 6f  (Th_Interp *, vo
9f80: 69 64 20 2a 70 43 6f 6e 74 65 78 74 31 2c 20 76  id *pContext1, v
9f90: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 32 29 2c  oid *pContext2),
9fa0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
9fb0: 74 31 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  t1,.  void *pCon
9fc0: 74 65 78 74 32 0a 29 7b 0a 20 20 54 68 5f 46 72  text2.){.  Th_Fr
9fd0: 61 6d 65 20 66 72 61 6d 65 3b 0a 20 20 69 6e 74  ame frame;.  int
9fe0: 20 72 63 3b 0a 20 20 74 68 50 75 73 68 46 72 61   rc;.  thPushFra
9ff0: 6d 65 28 69 6e 74 65 72 70 2c 20 26 66 72 61 6d  me(interp, &fram
a000: 65 29 3b 0a 20 20 72 63 20 3d 20 78 43 61 6c 6c  e);.  rc = xCall
a010: 28 69 6e 74 65 72 70 2c 20 70 43 6f 6e 74 65 78  (interp, pContex
a020: 74 31 2c 20 70 43 6f 6e 74 65 78 74 32 29 3b 0a  t1, pContext2);.
a030: 20 20 74 68 50 6f 70 46 72 61 6d 65 28 69 6e 74    thPopFrame(int
a040: 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  erp);.  return r
a050: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 70 6c 69  c;.}../*.** Spli
a060: 74 20 61 20 74 68 31 20 6c 69 73 74 20 69 6e 74  t a th1 list int
a070: 6f 20 69 74 73 20 63 6f 6d 70 6f 6e 65 6e 74 20  o its component 
a080: 65 6c 65 6d 65 6e 74 73 2e 20 54 68 65 20 6c 69  elements. The li
a090: 73 74 20 74 6f 20 73 70 6c 69 74 20 69 73 0a 2a  st to split is.*
a0a0: 2a 20 70 61 73 73 65 64 20 76 69 61 20 61 72 67  * passed via arg
a0b0: 75 6d 65 6e 74 73 20 28 7a 4c 69 73 74 2c 20 6e  uments (zList, n
a0c0: 4c 69 73 74 29 2e 20 49 66 20 73 75 63 63 65 73  List). If succes
a0d0: 73 66 75 6c 2c 20 54 48 5f 4f 4b 20 69 73 20 72  sful, TH_OK is r
a0e0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 49 66 20 61  eturned..** If a
a0f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  n error occurs (
a100: 69 66 20 28 7a 4c 69 73 74 2c 20 6e 4c 69 73 74  if (zList, nList
a110: 29 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  ) is not a valid
a120: 20 6c 69 73 74 29 20 61 6e 20 65 72 72 6f 72 0a   list) an error.
a130: 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  ** message is le
a140: 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70  ft in the interp
a150: 72 65 74 65 72 20 72 65 73 75 6c 74 20 61 6e 64  reter result and
a160: 20 54 48 5f 45 52 52 4f 52 20 72 65 74 75 72 6e   TH_ERROR return
a170: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
a180: 63 65 73 73 66 75 6c 2c 20 2a 70 6e 43 6f 75 6e  cessful, *pnCoun
a190: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
a1a0: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
a1b0: 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ts in the list..
a1c0: 2a 2a 20 70 61 6e 45 6c 65 6d 20 69 73 20 73 65  ** panElem is se
a1d0: 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 61 6e  t to point at an
a1e0: 20 61 72 72 61 79 20 6f 66 20 2a 70 6e 43 6f 75   array of *pnCou
a1f0: 6e 74 20 69 6e 74 65 67 65 72 73 20 2d 20 74 68  nt integers - th
a200: 65 20 6c 65 6e 67 74 68 73 0a 2a 2a 20 6f 66 20  e lengths.** of 
a210: 74 68 65 20 65 6c 65 6d 65 6e 74 20 76 61 6c 75  the element valu
a220: 65 73 2e 20 2a 70 61 7a 45 6c 65 6d 20 69 73 20  es. *pazElem is 
a230: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
a240: 61 6e 20 61 72 72 61 79 20 6f 66 20 0a 2a 2a 20  an array of .** 
a250: 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 75 66 66  pointers to buff
a260: 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ers containing t
a270: 68 65 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74  he array element
a280: 27 73 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  's data..**.** T
a290: 6f 20 66 72 65 65 20 74 68 65 20 61 72 72 61 79  o free the array
a2a0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 2a  s allocated at *
a2b0: 70 61 7a 45 6c 65 6d 20 61 6e 64 20 2a 70 61 6e  pazElem and *pan
a2c0: 45 6c 65 6d 2c 20 74 68 65 20 63 61 6c 6c 65 72  Elem, the caller
a2d0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
a2e0: 54 68 5f 46 72 65 65 28 29 20 6f 6e 20 2a 70 61  Th_Free() on *pa
a2f0: 7a 45 6c 65 6d 20 6f 6e 6c 79 2e 20 45 78 61 63  zElem only. Exac
a300: 74 6c 79 20 6f 6e 65 20 73 75 63 68 20 63 61 6c  tly one such cal
a310: 6c 20 74 6f 0a 2a 2a 20 54 68 5f 46 72 65 65 28  l to.** Th_Free(
a320: 29 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 70  ) must be made p
a330: 65 72 20 63 61 6c 6c 20 74 6f 20 54 68 5f 53 70  er call to Th_Sp
a340: 6c 69 74 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a  litList()..**.**
a350: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
a360: 20 20 20 20 69 6e 74 20 6e 45 6c 65 6d 3b 0a 2a      int nElem;.*
a370: 2a 20 20 20 20 20 69 6e 74 20 2a 61 6e 45 6c 65  *     int *anEle
a380: 6d 3b 0a 2a 2a 20 20 20 20 20 63 68 61 72 20 2a  m;.**     char *
a390: 2a 61 7a 45 6c 65 6d 3b 0a 2a 2a 20 20 20 20 20  *azElem;.**     
a3a0: 69 6e 74 20 69 3b 0a 2a 2a 0a 2a 2a 20 20 20 20  int i;.**.**    
a3b0: 20 54 68 5f 53 70 6c 69 74 4c 69 73 74 28 69 6e   Th_SplitList(in
a3c0: 74 65 72 70 2c 20 7a 4c 69 73 74 2c 20 6e 4c 69  terp, zList, nLi
a3d0: 73 74 2c 20 26 61 7a 45 6c 65 6d 2c 20 26 61 6e  st, &azElem, &an
a3e0: 45 6c 65 6d 2c 20 26 6e 45 6c 65 6d 29 3b 0a 2a  Elem, &nElem);.*
a3f0: 2a 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  *     for(i=0; i
a400: 3c 6e 45 6c 65 6d 3b 20 69 2b 2b 29 7b 0a 2a 2a  <nElem; i++){.**
a410: 20 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61         int nData
a420: 20 3d 20 61 6e 45 6c 65 6d 5b 69 5d 3b 0a 2a 2a   = anElem[i];.**
a430: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44 61         char *zDa
a440: 74 61 20 3d 20 61 7a 45 6c 65 6d 5b 69 5d 3b 0a  ta = azElem[i];.
a450: 2a 2a 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20  **       ....** 
a460: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
a470: 54 68 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20  Th_Free(interp, 
a480: 61 7a 45 6c 65 6d 29 3b 0a 2a 2a 0a 2a 2f 0a 69  azElem);.**.*/.i
a490: 6e 74 20 54 68 5f 53 70 6c 69 74 4c 69 73 74 28  nt Th_SplitList(
a4a0: 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e  .  Th_Interp *in
a4b0: 74 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  terp,.  const ch
a4c0: 61 72 20 2a 7a 4c 69 73 74 2c 20 20 20 20 20 20  ar *zList,      
a4d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
a4e0: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
a4f0: 61 69 6e 69 6e 67 20 6c 69 73 74 20 2a 2f 0a 20  aining list */. 
a500: 20 69 6e 74 20 6e 4c 69 73 74 2c 20 20 20 20 20   int nList,     
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a520: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
a530: 74 65 73 20 61 74 20 7a 4c 69 73 74 20 2a 2f 0a  tes at zList */.
a540: 20 20 63 68 61 72 20 2a 2a 2a 70 61 7a 45 6c 65    char ***pazEle
a550: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
a560: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
a570: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 6c  f pointers to el
a580: 65 6d 65 6e 74 20 64 61 74 61 20 2a 2f 0a 20 20  ement data */.  
a590: 69 6e 74 20 2a 2a 70 61 6e 45 6c 65 6d 2c 20 20  int **panElem,  
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66  /* OUT: Array of
a5c0: 20 65 6c 65 6d 65 6e 74 20 64 61 74 61 20 6c 65   element data le
a5d0: 6e 67 74 68 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  ngths */.  int *
a5e0: 70 6e 43 6f 75 6e 74 20 20 20 20 20 20 20 20 20  pnCount         
a5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
a600: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  T: Number of ele
a610: 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 2a 2f  ments in list */
a620: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a630: 69 6e 74 65 72 70 2d 3e 69 73 4c 69 73 74 4d 6f  interp->isListMo
a640: 64 65 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 74  de = 1;.  rc = t
a650: 68 53 70 6c 69 74 4c 69 73 74 28 69 6e 74 65 72  hSplitList(inter
a660: 70 2c 20 7a 4c 69 73 74 2c 20 6e 4c 69 73 74 2c  p, zList, nList,
a670: 20 70 61 7a 45 6c 65 6d 2c 20 70 61 6e 45 6c 65   pazElem, panEle
a680: 6d 2c 20 70 6e 43 6f 75 6e 74 29 3b 0a 20 20 69  m, pnCount);.  i
a690: 6e 74 65 72 70 2d 3e 69 73 4c 69 73 74 4d 6f 64  nterp->isListMod
a6a0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 20  e = 0;.  if( rc 
a6b0: 29 7b 0a 20 20 20 20 54 68 5f 45 72 72 6f 72 4d  ){.    Th_ErrorM
a6c0: 65 73 73 61 67 65 28 69 6e 74 65 72 70 2c 20 22  essage(interp, "
a6d0: 45 78 70 65 63 74 65 64 20 6c 69 73 74 2c 20 67  Expected list, g
a6e0: 6f 74 3a 20 5c 22 22 2c 20 7a 4c 69 73 74 2c 20  ot: \"", zList, 
a6f0: 6e 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65  nList);.  }.  re
a700: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a710: 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
a720: 6c 65 6d 65 6e 74 20 74 6f 20 61 6e 20 65 78 69  lement to an exi
a730: 73 74 69 6e 67 20 74 68 31 20 6c 69 73 74 2e 20  sting th1 list. 
a740: 54 68 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  The element to a
a750: 70 70 65 6e 64 20 0a 2a 2a 20 74 6f 20 74 68 65  ppend .** to the
a760: 20 6c 69 73 74 20 69 73 20 28 7a 45 6c 65 6d 2c   list is (zElem,
a770: 20 6e 45 6c 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 41   nElem)..**.** A
a780: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a790: 65 78 69 73 74 69 6e 67 20 6c 69 73 74 20 6d 75  existing list mu
a7a0: 73 74 20 62 65 20 73 74 6f 72 65 64 20 61 74 20  st be stored at 
a7b0: 2a 70 7a 4c 69 73 74 20 77 68 65 6e 20 74 68 69  *pzList when thi
a7c0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
a7d0: 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 6c 65 6e   called. The len
a7e0: 67 74 68 20 6d 75 73 74 20 62 65 20 73 74 6f 72  gth must be stor
a7f0: 65 64 20 69 6e 20 2a 70 6e 4c 69 73 74 2e 20 54  ed in *pnList. T
a800: 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
a810: 2a 70 7a 4c 69 73 74 20 6d 75 73 74 20 65 69 74  *pzList must eit
a820: 68 65 72 20 62 65 20 4e 55 4c 4c 20 28 69 6e 20  her be NULL (in 
a830: 77 68 69 63 68 20 63 61 73 65 20 2a 70 6e 4c 69  which case *pnLi
a840: 73 74 20 6d 75 73 74 20 62 65 20 30 29 2c 20 6f  st must be 0), o
a850: 72 20 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  r .** a pointer 
a860: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
a870: 65 64 20 66 72 6f 6d 20 54 68 5f 4d 61 6c 6c 6f  ed from Th_Mallo
a880: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  c()..**.** This 
a890: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 54  function calls T
a8a0: 68 5f 46 72 65 65 28 29 20 74 6f 20 66 72 65 65  h_Free() to free
a8b0: 20 74 68 65 20 62 75 66 66 65 72 20 61 74 20 2a   the buffer at *
a8c0: 70 7a 4c 69 73 74 20 61 6e 64 20 73 65 74 73 0a  pzList and sets.
a8d0: 2a 2a 20 2a 70 7a 4c 69 73 74 20 74 6f 20 70 6f  ** *pzList to po
a8e0: 69 6e 74 20 74 6f 20 61 20 6e 65 77 20 62 75 66  int to a new buf
a8f0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
a900: 68 65 20 6e 65 77 20 6c 69 73 74 20 76 61 6c 75  he new list valu
a910: 65 2e 20 2a 70 6e 4c 69 73 74 0a 2a 2a 20 69 73  e. *pnList.** is
a920: 20 73 69 6d 69 6c 61 72 6c 79 20 75 70 64 61 74   similarly updat
a930: 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
a940: 69 6e 67 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ing. The return 
a950: 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20  value is always 
a960: 54 48 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  TH_OK..**.** Exa
a970: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
a980: 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b  char *zList = 0;
a990: 0a 2a 2a 20 20 20 20 20 69 6e 74 20 6e 4c 69 73  .**     int nLis
a9a0: 74 20 3d 20 30 3b 0a 2a 2a 20 20 20 20 20 66 6f  t = 0;.**     fo
a9b0: 72 20 28 2e 2e 2e 29 20 7b 0a 2a 2a 20 20 20 20  r (...) {.**    
a9c0: 20 20 20 63 68 61 72 20 2a 7a 45 6c 65 6d 20 3d     char *zElem =
a9d0: 20 3c 73 6f 6d 65 20 65 78 70 72 65 73 73 69 6f   <some expressio
a9e0: 6e 3e 3b 0a 2a 2a 20 20 20 20 20 20 20 54 68 5f  n>;.**       Th_
a9f0: 4c 69 73 74 41 70 70 65 6e 64 28 69 6e 74 65 72  ListAppend(inter
aa00: 70 2c 20 26 7a 4c 69 73 74 2c 20 26 6e 4c 69 73  p, &zList, &nLis
aa10: 74 2c 20 7a 45 6c 65 6d 2c 20 2d 31 29 3b 0a 2a  t, zElem, -1);.*
aa20: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 54  *     }.**     T
aa30: 68 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  h_SetResult(inte
aa40: 72 70 2c 20 7a 4c 69 73 74 2c 20 6e 4c 69 73 74  rp, zList, nList
aa50: 29 3b 0a 2a 2a 20 20 20 20 20 54 68 5f 46 72 65  );.**     Th_Fre
aa60: 65 28 69 6e 74 65 72 70 2c 20 7a 4c 69 73 74 29  e(interp, zList)
aa70: 3b 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 54 68 5f 4c  ;.**.*/.int Th_L
aa80: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 54 68 5f  istAppend(.  Th_
aa90: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
aaa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
aab0: 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74  erpreter context
aac0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 4c   */.  char **pzL
aad0: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
aae0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 74 72    /* IN/OUT: Ptr
aaf0: 20 74 6f 20 70 74 72 20 74 6f 20 6c 69 73 74 20   to ptr to list 
ab00: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74  */.  int *pnList
ab10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ab20: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
ab30: 72 65 6e 74 20 6c 65 6e 67 74 68 20 6f 66 20 2a  rent length of *
ab40: 70 7a 4c 69 73 74 20 2a 2f 0a 20 20 63 6f 6e 73  pzList */.  cons
ab50: 74 20 63 68 61 72 20 2a 7a 45 6c 65 6d 2c 20 20  t char *zElem,  
ab60: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
ab70: 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69  to append */.  i
ab80: 6e 74 20 6e 45 6c 65 6d 20 20 20 20 20 20 20 20  nt nElem        
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
aba0: 65 6e 67 74 68 20 6f 66 20 6e 45 6c 65 6d 20 2a  ength of nElem *
abb0: 2f 0a 29 7b 0a 20 20 42 75 66 66 65 72 20 6f 75  /.){.  Buffer ou
abc0: 74 70 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  tput;.  int i;..
abd0: 20 20 69 6e 74 20 68 61 73 53 70 65 63 69 61 6c    int hasSpecial
abe0: 43 68 61 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Char = 0;.  int 
abf0: 68 61 73 45 73 63 61 70 65 43 68 61 72 20 3d 20  hasEscapeChar = 
ac00: 30 3b 0a 20 20 69 6e 74 20 6e 42 72 61 63 65 20  0;.  int nBrace 
ac10: 3d 20 30 3b 0a 0a 20 20 6f 75 74 70 75 74 2e 7a  = 0;..  output.z
ac20: 42 75 66 20 3d 20 2a 70 7a 4c 69 73 74 3b 0a 20  Buf = *pzList;. 
ac30: 20 6f 75 74 70 75 74 2e 6e 42 75 66 20 3d 20 2a   output.nBuf = *
ac40: 70 6e 4c 69 73 74 3b 0a 20 20 6f 75 74 70 75 74  pnList;.  output
ac50: 2e 6e 42 75 66 41 6c 6c 6f 63 20 3d 20 6f 75 74  .nBufAlloc = out
ac60: 70 75 74 2e 6e 42 75 66 3b 0a 0a 20 20 69 66 28  put.nBuf;..  if(
ac70: 20 6e 45 6c 65 6d 3c 30 20 29 7b 0a 20 20 20 20   nElem<0 ){.    
ac80: 6e 45 6c 65 6d 20 3d 20 74 68 5f 73 74 72 6c 65  nElem = th_strle
ac90: 6e 28 7a 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20  n(zElem);.  }.  
aca0: 69 66 28 20 6f 75 74 70 75 74 2e 6e 42 75 66 3e  if( output.nBuf>
acb0: 30 20 29 7b 0a 20 20 20 20 74 68 42 75 66 66 65  0 ){.    thBuffe
acc0: 72 57 72 69 74 65 28 69 6e 74 65 72 70 2c 20 26  rWrite(interp, &
acd0: 6f 75 74 70 75 74 2c 20 22 20 22 2c 20 31 29 3b  output, " ", 1);
ace0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  .  }..  for(i=0;
acf0: 20 69 3c 6e 45 6c 65 6d 3b 20 69 2b 2b 29 7b 0a   i<nElem; i++){.
ad00: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 45 6c      char c = zEl
ad10: 65 6d 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 74  em[i];.    if( t
ad20: 68 5f 69 73 73 70 65 63 69 61 6c 28 63 29 20 29  h_isspecial(c) )
ad30: 20 68 61 73 53 70 65 63 69 61 6c 43 68 61 72 20   hasSpecialChar 
ad40: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  = 1;.    if( c==
ad50: 27 5c 5c 27 20 29 20 68 61 73 45 73 63 61 70 65  '\\' ) hasEscape
ad60: 43 68 61 72 20 3d 20 31 3b 0a 20 20 20 20 69 66  Char = 1;.    if
ad70: 28 20 63 3d 3d 27 7b 27 20 29 20 6e 42 72 61 63  ( c=='{' ) nBrac
ad80: 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  e++;.    if( c==
ad90: 27 7d 27 20 29 20 6e 42 72 61 63 65 2d 2d 3b 0a  '}' ) nBrace--;.
ada0: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 45 6c 65 6d    }..  if( nElem
adb0: 3d 3d 30 20 7c 7c 20 28 21 68 61 73 45 73 63 61  ==0 || (!hasEsca
adc0: 70 65 43 68 61 72 20 26 26 20 68 61 73 53 70 65  peChar && hasSpe
add0: 63 69 61 6c 43 68 61 72 20 26 26 20 6e 42 72 61  cialChar && nBra
ade0: 63 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 74 68  ce==0) ){.    th
adf0: 42 75 66 66 65 72 57 72 69 74 65 28 69 6e 74 65  BufferWrite(inte
ae00: 72 70 2c 20 26 6f 75 74 70 75 74 2c 20 22 7b 22  rp, &output, "{"
ae10: 2c 20 31 29 3b 0a 20 20 20 20 74 68 42 75 66 66  , 1);.    thBuff
ae20: 65 72 57 72 69 74 65 28 69 6e 74 65 72 70 2c 20  erWrite(interp, 
ae30: 26 6f 75 74 70 75 74 2c 20 7a 45 6c 65 6d 2c 20  &output, zElem, 
ae40: 6e 45 6c 65 6d 29 3b 0a 20 20 20 20 74 68 42 75  nElem);.    thBu
ae50: 66 66 65 72 57 72 69 74 65 28 69 6e 74 65 72 70  fferWrite(interp
ae60: 2c 20 26 6f 75 74 70 75 74 2c 20 22 7d 22 2c 20  , &output, "}", 
ae70: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
ae80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 6c 65   for(i=0; i<nEle
ae90: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  m; i++){.      c
aea0: 68 61 72 20 63 20 3d 20 7a 45 6c 65 6d 5b 69 5d  har c = zElem[i]
aeb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 74 68 5f 69  ;.      if( th_i
aec0: 73 73 70 65 63 69 61 6c 28 63 29 20 29 20 74 68  sspecial(c) ) th
aed0: 42 75 66 66 65 72 57 72 69 74 65 28 69 6e 74 65  BufferWrite(inte
aee0: 72 70 2c 20 26 6f 75 74 70 75 74 2c 20 22 5c 5c  rp, &output, "\\
aef0: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 74 68 42  ", 1);.      thB
af00: 75 66 66 65 72 57 72 69 74 65 28 69 6e 74 65 72  ufferWrite(inter
af10: 70 2c 20 26 6f 75 74 70 75 74 2c 20 26 63 2c 20  p, &output, &c, 
af20: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1);.    }.  }.. 
af30: 20 2a 70 7a 4c 69 73 74 20 3d 20 6f 75 74 70 75   *pzList = outpu
af40: 74 2e 7a 42 75 66 3b 0a 20 20 2a 70 6e 4c 69 73  t.zBuf;.  *pnLis
af50: 74 20 3d 20 6f 75 74 70 75 74 2e 6e 42 75 66 3b  t = output.nBuf;
af60: 0a 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b  ..  return TH_OK
af70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
af80: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
af90: 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  to an existing t
afa0: 68 31 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20  h1 string. This 
afb0: 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 0a 2a 2a  function uses.**
afc0: 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65 72 66   the same interf
afd0: 61 63 65 20 61 73 20 74 68 65 20 54 68 5f 4c 69  ace as the Th_Li
afe0: 73 74 41 70 70 65 6e 64 28 29 20 66 75 6e 63 74  stAppend() funct
aff0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 54 68 5f 53  ion..*/.int Th_S
b000: 74 72 69 6e 67 41 70 70 65 6e 64 28 0a 20 20 54  tringAppend(.  T
b010: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  h_Interp *interp
b020: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
b030: 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65  nterpreter conte
b040: 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  xt */.  char **p
b050: 7a 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  zStr,           
b060: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
b070: 74 72 20 74 6f 20 70 74 72 20 74 6f 20 6c 69 73  tr to ptr to lis
b080: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 74  t */.  int *pnSt
b090: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
b0a0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
b0b0: 75 72 72 65 6e 74 20 6c 65 6e 67 74 68 20 6f 66  urrent length of
b0c0: 20 2a 70 7a 53 74 72 20 2a 2f 0a 20 20 63 6f 6e   *pzStr */.  con
b0d0: 73 74 20 63 68 61 72 20 2a 7a 45 6c 65 6d 2c 20  st char *zElem, 
b0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b0f0: 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
b100: 69 6e 74 20 6e 45 6c 65 6d 20 20 20 20 20 20 20  int nElem       
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b120: 4c 65 6e 67 74 68 20 6f 66 20 6e 45 6c 65 6d 20  Length of nElem 
b130: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  */.){.  char *zN
b140: 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 0a  ew;.  int nNew;.
b150: 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3c 30 20 29  .  if( nElem<0 )
b160: 7b 0a 20 20 20 20 6e 45 6c 65 6d 20 3d 20 74 68  {.    nElem = th
b170: 5f 73 74 72 6c 65 6e 28 7a 45 6c 65 6d 29 3b 0a  _strlen(zElem);.
b180: 20 20 7d 0a 0a 20 20 6e 4e 65 77 20 3d 20 2a 70    }..  nNew = *p
b190: 6e 53 74 72 20 2b 20 6e 45 6c 65 6d 3b 0a 20 20  nStr + nElem;.  
b1a0: 7a 4e 65 77 20 3d 20 54 68 5f 4d 61 6c 6c 6f 63  zNew = Th_Malloc
b1b0: 28 69 6e 74 65 72 70 2c 20 6e 4e 65 77 29 3b 0a  (interp, nNew);.
b1c0: 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 2a    memcpy(zNew, *
b1d0: 70 7a 53 74 72 2c 20 2a 70 6e 53 74 72 29 3b 0a  pzStr, *pnStr);.
b1e0: 20 20 6d 65 6d 63 70 79 28 26 7a 4e 65 77 5b 2a    memcpy(&zNew[*
b1f0: 70 6e 53 74 72 5d 2c 20 7a 45 6c 65 6d 2c 20 6e  pnStr], zElem, n
b200: 45 6c 65 6d 29 3b 0a 0a 20 20 54 68 5f 46 72 65  Elem);..  Th_Fre
b210: 65 28 69 6e 74 65 72 70 2c 20 2a 70 7a 53 74 72  e(interp, *pzStr
b220: 29 3b 0a 20 20 2a 70 7a 53 74 72 20 3d 20 7a 4e  );.  *pzStr = zN
b230: 65 77 3b 0a 20 20 2a 70 6e 53 74 72 20 3d 20 6e  ew;.  *pnStr = n
b240: 4e 65 77 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  New;..  return T
b250: 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  H_OK;.}../* .** 
b260: 44 65 6c 65 74 65 20 61 6e 20 69 6e 74 65 72 70  Delete an interp
b270: 72 65 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 54  reter..*/.void T
b280: 68 5f 44 65 6c 65 74 65 49 6e 74 65 72 70 28 54  h_DeleteInterp(T
b290: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  h_Interp *interp
b2a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 69 6e 74 65  ){.  assert(inte
b2b0: 72 70 2d 3e 70 46 72 61 6d 65 29 3b 0a 20 20 61  rp->pFrame);.  a
b2c0: 73 73 65 72 74 28 30 3d 3d 69 6e 74 65 72 70 2d  ssert(0==interp-
b2d0: 3e 70 46 72 61 6d 65 2d 3e 70 43 61 6c 6c 65 72  >pFrame->pCaller
b2e0: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
b2f0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
b300: 74 68 65 20 67 6c 6f 62 61 6c 20 66 72 61 6d 65  the global frame
b310: 2e 20 2a 2f 0a 20 20 74 68 50 6f 70 46 72 61 6d  . */.  thPopFram
b320: 65 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 2f 2a  e(interp);..  /*
b330: 20 44 65 6c 65 74 65 20 61 6e 79 20 72 65 73 75   Delete any resu
b340: 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  lt currently sto
b350: 72 65 64 20 69 6e 20 74 68 65 20 69 6e 74 65 72  red in the inter
b360: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 54 68 5f  preter. */.  Th_
b370: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
b380: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 44  , 0, 0);..  /* D
b390: 65 6c 65 74 65 20 61 6c 6c 20 72 65 67 69 73 74  elete all regist
b3a0: 65 72 65 64 20 63 6f 6d 6d 61 6e 64 73 20 61 6e  ered commands an
b3b0: 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61  d the command ha
b3c0: 73 68 2d 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  sh-table itself.
b3d0: 20 2a 2f 0a 20 20 54 68 5f 48 61 73 68 49 74 65   */.  Th_HashIte
b3e0: 72 61 74 65 28 69 6e 74 65 72 70 2c 20 69 6e 74  rate(interp, int
b3f0: 65 72 70 2d 3e 70 61 43 6d 64 2c 20 74 68 46 72  erp->paCmd, thFr
b400: 65 65 43 6f 6d 6d 61 6e 64 2c 20 28 76 6f 69 64  eeCommand, (void
b410: 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54 68   *)interp);.  Th
b420: 5f 48 61 73 68 44 65 6c 65 74 65 28 69 6e 74 65  _HashDelete(inte
b430: 72 70 2c 20 69 6e 74 65 72 70 2d 3e 70 61 43 6d  rp, interp->paCm
b440: 64 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  d);..  /* Delete
b450: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b460: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
b470: 66 2e 20 2a 2f 0a 20 20 54 68 5f 46 72 65 65 28  f. */.  Th_Free(
b480: 69 6e 74 65 72 70 2c 20 28 76 6f 69 64 20 2a 29  interp, (void *)
b490: 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 20 0a  interp);.}../* .
b4a0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
b4b0: 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
b4c0: 54 68 5f 49 6e 74 65 72 70 20 2a 20 54 68 5f 43  Th_Interp * Th_C
b4d0: 72 65 61 74 65 49 6e 74 65 72 70 28 54 68 5f 56  reateInterp(Th_V
b4e0: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 54  tab *pVtab){.  T
b4f0: 68 5f 49 6e 74 65 72 70 20 2a 70 3b 0a 0a 20 20  h_Interp *p;..  
b500: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
b510: 69 6e 69 74 69 61 6c 69 73 65 20 74 68 65 20 69  initialise the i
b520: 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 20 74  nterpreter and t
b530: 68 65 20 67 6c 6f 62 61 6c 20 66 72 61 6d 65 20  he global frame 
b540: 2a 2f 0a 20 20 70 20 3d 20 70 56 74 61 62 2d 3e  */.  p = pVtab->
b550: 78 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54  xMalloc(sizeof(T
b560: 68 5f 49 6e 74 65 72 70 29 20 2b 20 73 69 7a 65  h_Interp) + size
b570: 6f 66 28 54 68 5f 46 72 61 6d 65 29 29 3b 0a 20  of(Th_Frame));. 
b580: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
b590: 7a 65 6f 66 28 54 68 5f 49 6e 74 65 72 70 29 29  zeof(Th_Interp))
b5a0: 3b 0a 20 20 70 2d 3e 70 56 74 61 62 20 3d 20 70  ;.  p->pVtab = p
b5b0: 56 74 61 62 3b 0a 20 20 70 2d 3e 70 61 43 6d 64  Vtab;.  p->paCmd
b5c0: 20 3d 20 54 68 5f 48 61 73 68 4e 65 77 28 70 29   = Th_HashNew(p)
b5d0: 3b 0a 20 20 74 68 50 75 73 68 46 72 61 6d 65 28  ;.  thPushFrame(
b5e0: 70 2c 20 28 54 68 5f 46 72 61 6d 65 20 2a 29 26  p, (Th_Frame *)&
b5f0: 70 5b 31 5d 29 3b 0a 0a 20 20 72 65 74 75 72 6e  p[1]);..  return
b600: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   p;.}../*.** The
b610: 73 65 20 74 77 6f 20 74 79 70 65 73 20 61 72 65  se two types are
b620: 20 75 73 65 64 20 6f 6e 6c 79 20 62 79 20 74 68   used only by th
b630: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 6f 64  e expression mod
b640: 75 6c 65 2c 20 77 68 65 72 65 0a 2a 2a 20 74 68  ule, where.** th
b650: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 6f 64  e expression mod
b660: 75 6c 65 20 6d 65 61 6e 73 20 74 68 65 20 54 68  ule means the Th
b670: 5f 45 78 70 72 28 29 20 61 6e 64 20 65 78 70 72  _Expr() and expr
b680: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  XXX() functions.
b690: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
b6a0: 63 74 20 4f 70 65 72 61 74 6f 72 20 4f 70 65 72  ct Operator Oper
b6b0: 61 74 6f 72 3b 0a 73 74 72 75 63 74 20 4f 70 65  ator;.struct Ope
b6c0: 72 61 74 6f 72 20 7b 0a 20 20 63 6f 6e 73 74 20  rator {.  const 
b6d0: 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 69 6e 74  char *zOp;.  int
b6e0: 20 65 4f 70 3b 0a 20 20 69 6e 74 20 69 50 72 65   eOp;.  int iPre
b6f0: 63 65 64 65 6e 63 65 3b 0a 20 20 69 6e 74 20 65  cedence;.  int e
b700: 41 72 67 54 79 70 65 3b 0a 7d 3b 0a 74 79 70 65  ArgType;.};.type
b710: 64 65 66 20 73 74 72 75 63 74 20 45 78 70 72 20  def struct Expr 
b720: 45 78 70 72 3b 0a 73 74 72 75 63 74 20 45 78 70  Expr;.struct Exp
b730: 72 20 7b 0a 20 20 4f 70 65 72 61 74 6f 72 20 2a  r {.  Operator *
b740: 70 4f 70 3b 0a 20 20 45 78 70 72 20 2a 70 50 61  pOp;.  Expr *pPa
b750: 72 65 6e 74 3b 0a 20 20 45 78 70 72 20 2a 70 4c  rent;.  Expr *pL
b760: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
b770: 67 68 74 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 56  ght;..  char *zV
b780: 61 6c 75 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69  alue;     /* Poi
b790: 6e 74 65 72 20 74 6f 20 6c 69 74 65 72 61 6c 20  nter to literal 
b7a0: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  value */.  int n
b7b0: 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20 2f 2a  Value;        /*
b7c0: 20 4c 65 6e 67 74 68 20 6f 66 20 6c 69 74 65 72   Length of liter
b7d0: 61 6c 20 76 61 6c 75 65 20 62 75 66 66 65 72 20  al value buffer 
b7e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 55 6e 61 72 79 20  */.};../* Unary 
b7f0: 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 23 64 65  operators */.#de
b800: 66 69 6e 65 20 4f 50 5f 55 4e 41 52 59 5f 4d 49  fine OP_UNARY_MI
b810: 4e 55 53 20 20 32 0a 23 64 65 66 69 6e 65 20 4f  NUS  2.#define O
b820: 50 5f 55 4e 41 52 59 5f 50 4c 55 53 20 20 20 33  P_UNARY_PLUS   3
b830: 0a 23 64 65 66 69 6e 65 20 4f 50 5f 42 49 54 57  .#define OP_BITW
b840: 49 53 45 5f 4e 4f 54 20 20 34 0a 23 64 65 66 69  ISE_NOT  4.#defi
b850: 6e 65 20 4f 50 5f 4c 4f 47 49 43 41 4c 5f 4e 4f  ne OP_LOGICAL_NO
b860: 54 20 20 35 0a 0a 2f 2a 20 42 69 6e 61 72 79 20  T  5../* Binary 
b870: 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 23 64 65  operators */.#de
b880: 66 69 6e 65 20 4f 50 5f 4d 55 4c 54 49 50 4c 59  fine OP_MULTIPLY
b890: 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4f       6.#define O
b8a0: 50 5f 44 49 56 49 44 45 20 20 20 20 20 20 20 37  P_DIVIDE       7
b8b0: 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4d 4f 44 55  .#define OP_MODU
b8c0: 4c 55 53 20 20 20 20 20 20 38 0a 23 64 65 66 69  LUS      8.#defi
b8d0: 6e 65 20 4f 50 5f 41 44 44 20 20 20 20 20 20 20  ne OP_ADD       
b8e0: 20 20 20 39 0a 23 64 65 66 69 6e 65 20 4f 50 5f     9.#define OP_
b8f0: 53 55 42 54 52 41 43 54 20 20 20 20 31 30 0a 23  SUBTRACT    10.#
b900: 64 65 66 69 6e 65 20 4f 50 5f 4c 45 46 54 53 48  define OP_LEFTSH
b910: 49 46 54 20 20 20 31 31 0a 23 64 65 66 69 6e 65  IFT   11.#define
b920: 20 4f 50 5f 52 49 47 48 54 53 48 49 46 54 20 20   OP_RIGHTSHIFT  
b930: 31 32 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4c 54  12.#define OP_LT
b940: 20 20 20 20 20 20 20 20 20 20 31 33 0a 23 64 65            13.#de
b950: 66 69 6e 65 20 4f 50 5f 47 54 20 20 20 20 20 20  fine OP_GT      
b960: 20 20 20 20 31 34 0a 23 64 65 66 69 6e 65 20 4f      14.#define O
b970: 50 5f 4c 45 20 20 20 20 20 20 20 20 20 20 31 35  P_LE          15
b980: 0a 23 64 65 66 69 6e 65 20 4f 50 5f 47 45 20 20  .#define OP_GE  
b990: 20 20 20 20 20 20 20 20 31 36 0a 23 64 65 66 69          16.#defi
b9a0: 6e 65 20 4f 50 5f 45 51 20 20 20 20 20 20 20 20  ne OP_EQ        
b9b0: 20 20 31 37 0a 23 64 65 66 69 6e 65 20 4f 50 5f    17.#define OP_
b9c0: 4e 45 20 20 20 20 20 20 20 20 20 20 31 38 0a 23  NE          18.#
b9d0: 64 65 66 69 6e 65 20 4f 50 5f 53 45 51 20 20 20  define OP_SEQ   
b9e0: 20 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65        19.#define
b9f0: 20 4f 50 5f 53 4e 45 20 20 20 20 20 20 20 20 20   OP_SNE         
ba00: 32 30 0a 23 64 65 66 69 6e 65 20 4f 50 5f 42 49  20.#define OP_BI
ba10: 54 57 49 53 45 5f 41 4e 44 20 32 31 0a 23 64 65  TWISE_AND 21.#de
ba20: 66 69 6e 65 20 4f 50 5f 42 49 54 57 49 53 45 5f  fine OP_BITWISE_
ba30: 58 4f 52 20 32 32 0a 23 64 65 66 69 6e 65 20 4f  XOR 22.#define O
ba40: 50 5f 42 49 54 57 49 53 45 5f 4f 52 20 20 32 34  P_BITWISE_OR  24
ba50: 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4c 4f 47 49  .#define OP_LOGI
ba60: 43 41 4c 5f 41 4e 44 20 32 35 0a 23 64 65 66 69  CAL_AND 25.#defi
ba70: 6e 65 20 4f 50 5f 4c 4f 47 49 43 41 4c 5f 4f 52  ne OP_LOGICAL_OR
ba80: 20 20 32 36 0a 0a 2f 2a 20 4f 74 68 65 72 20 73    26../* Other s
ba90: 79 6d 62 6f 6c 73 20 2a 2f 0a 23 64 65 66 69 6e  ymbols */.#defin
baa0: 65 20 4f 50 5f 4f 50 45 4e 5f 42 52 41 43 4b 45  e OP_OPEN_BRACKE
bab0: 54 20 20 32 37 0a 23 64 65 66 69 6e 65 20 4f 50  T  27.#define OP
bac0: 5f 43 4c 4f 53 45 5f 42 52 41 43 4b 45 54 20 32  _CLOSE_BRACKET 2
bad0: 38 0a 0a 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74  8../* Argument t
bae0: 79 70 65 73 2e 20 45 61 63 68 20 6f 70 65 72 61  ypes. Each opera
baf0: 74 6f 72 20 69 6e 20 74 68 65 20 65 78 70 72 65  tor in the expre
bb00: 73 73 69 6f 6e 20 73 79 6e 74 61 78 20 69 73 20  ssion syntax is 
bb10: 64 65 66 69 6e 65 64 0a 2a 2a 20 61 73 20 72 65  defined.** as re
bb20: 71 75 69 72 69 6e 67 20 65 69 74 68 65 72 20 69  quiring either i
bb30: 6e 74 65 67 65 72 2c 20 6e 75 6d 62 65 72 20 28  nteger, number (
bb40: 72 65 61 6c 20 6f 72 20 69 6e 74 65 67 65 72 29  real or integer)
bb50: 20 6f 72 20 73 74 72 69 6e 67 0a 2a 2a 20 6f 70   or string.** op
bb60: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 23 64 65 66 69  erands..*/.#defi
bb70: 6e 65 20 41 52 47 5f 49 4e 54 45 47 45 52 20 31  ne ARG_INTEGER 1
bb80: 0a 23 64 65 66 69 6e 65 20 41 52 47 5f 4e 55 4d  .#define ARG_NUM
bb90: 42 45 52 20 20 32 0a 23 64 65 66 69 6e 65 20 41  BER  2.#define A
bba0: 52 47 5f 53 54 52 49 4e 47 20 20 33 0a 0a 73 74  RG_STRING  3..st
bbb0: 61 74 69 63 20 4f 70 65 72 61 74 6f 72 20 61 4f  atic Operator aO
bbc0: 70 65 72 61 74 6f 72 5b 5d 20 3d 20 7b 0a 0a 20  perator[] = {.. 
bbd0: 20 7b 22 28 22 2c 20 20 4f 50 5f 4f 50 45 4e 5f   {"(",  OP_OPEN_
bbe0: 42 52 41 43 4b 45 54 2c 20 20 20 2d 31 2c 20 30  BRACKET,   -1, 0
bbf0: 7d 2c 0a 20 20 7b 22 29 22 2c 20 20 4f 50 5f 43  },.  {")",  OP_C
bc00: 4c 4f 53 45 5f 42 52 41 43 4b 45 54 2c 20 2d 31  LOSE_BRACKET, -1
bc10: 2c 20 30 7d 2c 0a 0a 20 20 2f 2a 20 4e 6f 74 65  , 0},..  /* Note
bc20: 3a 20 61 6c 6c 20 75 6e 61 72 79 20 6f 70 65 72  : all unary oper
bc30: 61 74 6f 72 73 20 68 61 76 65 20 28 69 50 72 65  ators have (iPre
bc40: 63 65 64 65 6e 63 65 3d 3d 31 29 20 2a 2f 0a 20  cedence==1) */. 
bc50: 20 7b 22 2d 22 2c 20 20 4f 50 5f 55 4e 41 52 59   {"-",  OP_UNARY
bc60: 5f 4d 49 4e 55 53 2c 20 20 20 20 31 2c 20 41 52  _MINUS,    1, AR
bc70: 47 5f 4e 55 4d 42 45 52 7d 2c 0a 20 20 7b 22 2b  G_NUMBER},.  {"+
bc80: 22 2c 20 20 4f 50 5f 55 4e 41 52 59 5f 50 4c 55  ",  OP_UNARY_PLU
bc90: 53 2c 20 20 20 20 20 31 2c 20 41 52 47 5f 4e 55  S,     1, ARG_NU
bca0: 4d 42 45 52 7d 2c 0a 20 20 7b 22 7e 22 2c 20 20  MBER},.  {"~",  
bcb0: 4f 50 5f 42 49 54 57 49 53 45 5f 4e 4f 54 2c 20  OP_BITWISE_NOT, 
bcc0: 20 20 20 31 2c 20 41 52 47 5f 49 4e 54 45 47 45     1, ARG_INTEGE
bcd0: 52 7d 2c 0a 20 20 7b 22 21 22 2c 20 20 4f 50 5f  R},.  {"!",  OP_
bce0: 4c 4f 47 49 43 41 4c 5f 4e 4f 54 2c 20 20 20 20  LOGICAL_NOT,    
bcf0: 31 2c 20 41 52 47 5f 49 4e 54 45 47 45 52 7d 2c  1, ARG_INTEGER},
bd00: 0a 0a 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70  ..  /* Binary op
bd10: 65 72 61 74 6f 72 73 2e 20 49 74 20 69 73 20 69  erators. It is i
bd20: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 74 68 65 20  mportant to the 
bd30: 70 61 72 73 69 6e 67 20 69 6e 20 54 68 5f 45 78  parsing in Th_Ex
bd40: 70 72 28 29 20 74 68 61 74 0a 20 20 20 2a 20 74  pr() that.   * t
bd50: 68 65 20 74 77 6f 2d 63 68 61 72 61 63 74 65 72  he two-character
bd60: 20 73 79 6d 62 6f 6c 73 20 28 22 3d 3d 22 29 20   symbols ("==") 
bd70: 61 70 70 65 61 72 20 62 65 66 6f 72 65 20 74 68  appear before th
bd80: 65 20 6f 6e 65 2d 63 68 61 72 61 63 74 65 72 20  e one-character 
bd90: 0a 20 20 20 2a 20 6f 6e 65 73 20 28 22 3d 22 29  .   * ones ("=")
bda0: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 70  . And that the p
bdb0: 72 69 6f 72 69 74 69 65 73 20 6f 66 20 61 6c 6c  riorities of all
bdc0: 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72   binary operator
bdd0: 73 20 61 72 65 0a 20 20 20 2a 20 69 6e 74 65 67  s are.   * integ
bde0: 65 72 73 20 62 65 74 77 65 65 6e 20 32 20 61 6e  ers between 2 an
bdf0: 64 20 31 32 2e 0a 20 20 20 2a 2f 0a 20 20 7b 22  d 12..   */.  {"
be00: 3c 3c 22 2c 20 4f 50 5f 4c 45 46 54 53 48 49 46  <<", OP_LEFTSHIF
be10: 54 2c 20 20 20 20 20 20 34 2c 20 41 52 47 5f 49  T,      4, ARG_I
be20: 4e 54 45 47 45 52 7d 2c 0a 20 20 7b 22 3e 3e 22  NTEGER},.  {">>"
be30: 2c 20 4f 50 5f 52 49 47 48 54 53 48 49 46 54 2c  , OP_RIGHTSHIFT,
be40: 20 20 20 20 20 34 2c 20 41 52 47 5f 49 4e 54 45       4, ARG_INTE
be50: 47 45 52 7d 2c 0a 20 20 7b 22 3c 3d 22 2c 20 4f  GER},.  {"<=", O
be60: 50 5f 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20  P_LE,           
be70: 20 20 35 2c 20 41 52 47 5f 4e 55 4d 42 45 52 7d    5, ARG_NUMBER}
be80: 2c 0a 20 20 7b 22 3e 3d 22 2c 20 4f 50 5f 47 45  ,.  {">=", OP_GE
be90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 35 2c  ,             5,
bea0: 20 41 52 47 5f 4e 55 4d 42 45 52 7d 2c 0a 20 20   ARG_NUMBER},.  
beb0: 7b 22 3d 3d 22 2c 20 4f 50 5f 45 51 2c 20 20 20  {"==", OP_EQ,   
bec0: 20 20 20 20 20 20 20 20 20 20 36 2c 20 41 52 47            6, ARG
bed0: 5f 4e 55 4d 42 45 52 7d 2c 0a 20 20 7b 22 21 3d  _NUMBER},.  {"!=
bee0: 22 2c 20 4f 50 5f 4e 45 2c 20 20 20 20 20 20 20  ", OP_NE,       
bef0: 20 20 20 20 20 20 36 2c 20 41 52 47 5f 4e 55 4d        6, ARG_NUM
bf00: 42 45 52 7d 2c 0a 20 20 7b 22 65 71 22 2c 20 4f  BER},.  {"eq", O
bf10: 50 5f 53 45 51 2c 20 20 20 20 20 20 20 20 20 20  P_SEQ,          
bf20: 20 20 37 2c 20 41 52 47 5f 53 54 52 49 4e 47 7d    7, ARG_STRING}
bf30: 2c 0a 20 20 7b 22 6e 65 22 2c 20 4f 50 5f 53 4e  ,.  {"ne", OP_SN
bf40: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 37 2c  E,            7,
bf50: 20 41 52 47 5f 53 54 52 49 4e 47 7d 2c 0a 20 20   ARG_STRING},.  
bf60: 7b 22 26 26 22 2c 20 4f 50 5f 4c 4f 47 49 43 41  {"&&", OP_LOGICA
bf70: 4c 5f 41 4e 44 2c 20 20 20 31 31 2c 20 41 52 47  L_AND,   11, ARG
bf80: 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 7b 22 7c  _INTEGER},.  {"|
bf90: 7c 22 2c 20 4f 50 5f 4c 4f 47 49 43 41 4c 5f 4f  |", OP_LOGICAL_O
bfa0: 52 2c 20 20 20 20 31 32 2c 20 41 52 47 5f 49 4e  R,    12, ARG_IN
bfb0: 54 45 47 45 52 7d 2c 0a 0a 20 20 7b 22 2a 22 2c  TEGER},..  {"*",
bfc0: 20 20 4f 50 5f 4d 55 4c 54 49 50 4c 59 2c 20 20    OP_MULTIPLY,  
bfd0: 20 20 20 20 20 32 2c 20 41 52 47 5f 4e 55 4d 42       2, ARG_NUMB
bfe0: 45 52 7d 2c 0a 20 20 7b 22 2f 22 2c 20 20 4f 50  ER},.  {"/",  OP
bff0: 5f 44 49 56 49 44 45 2c 20 20 20 20 20 20 20 20  _DIVIDE,        
c000: 20 32 2c 20 41 52 47 5f 4e 55 4d 42 45 52 7d 2c   2, ARG_NUMBER},
c010: 0a 20 20 7b 22 25 22 2c 20 20 4f 50 5f 4d 4f 44  .  {"%",  OP_MOD
c020: 55 4c 55 53 2c 20 20 20 20 20 20 20 20 32 2c 20  ULUS,        2, 
c030: 41 52 47 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20  ARG_INTEGER},.  
c040: 7b 22 2b 22 2c 20 20 4f 50 5f 41 44 44 2c 20 20  {"+",  OP_ADD,  
c050: 20 20 20 20 20 20 20 20 20 20 33 2c 20 41 52 47            3, ARG
c060: 5f 4e 55 4d 42 45 52 7d 2c 0a 20 20 7b 22 2d 22  _NUMBER},.  {"-"
c070: 2c 20 20 4f 50 5f 53 55 42 54 52 41 43 54 2c 20  ,  OP_SUBTRACT, 
c080: 20 20 20 20 20 20 33 2c 20 41 52 47 5f 4e 55 4d        3, ARG_NUM
c090: 42 45 52 7d 2c 0a 20 20 7b 22 3c 22 2c 20 20 4f  BER},.  {"<",  O
c0a0: 50 5f 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20  P_LT,           
c0b0: 20 20 35 2c 20 41 52 47 5f 4e 55 4d 42 45 52 7d    5, ARG_NUMBER}
c0c0: 2c 0a 20 20 7b 22 3e 22 2c 20 20 4f 50 5f 47 54  ,.  {">",  OP_GT
c0d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 35 2c  ,             5,
c0e0: 20 41 52 47 5f 4e 55 4d 42 45 52 7d 2c 0a 20 20   ARG_NUMBER},.  
c0f0: 7b 22 26 22 2c 20 20 4f 50 5f 42 49 54 57 49 53  {"&",  OP_BITWIS
c100: 45 5f 41 4e 44 2c 20 20 20 20 38 2c 20 41 52 47  E_AND,    8, ARG
c110: 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 7b 22 5e  _INTEGER},.  {"^
c120: 22 2c 20 20 4f 50 5f 42 49 54 57 49 53 45 5f 58  ",  OP_BITWISE_X
c130: 4f 52 2c 20 20 20 20 39 2c 20 41 52 47 5f 49 4e  OR,    9, ARG_IN
c140: 54 45 47 45 52 7d 2c 0a 20 20 7b 22 7c 22 2c 20  TEGER},.  {"|", 
c150: 20 4f 50 5f 42 49 54 57 49 53 45 5f 4f 52 2c 20   OP_BITWISE_OR, 
c160: 20 20 20 31 30 2c 20 41 52 47 5f 49 4e 54 45 47     10, ARG_INTEG
c170: 45 52 7d 2c 0a 0a 20 20 7b 30 2c 30 2c 30 7d 0a  ER},..  {0,0,0}.
c180: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  };../*.** The fi
c190: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
c1a0: 73 74 72 69 6e 67 20 28 7a 49 6e 70 75 74 2c 6e  string (zInput,n
c1b0: 49 6e 70 75 74 29 20 63 6f 6e 74 61 69 6e 73 20  Input) contains 
c1c0: 61 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 53 65 74  a number..** Set
c1d0: 20 2a 70 6e 56 61 72 6e 61 6d 65 20 74 6f 20 74   *pnVarname to t
c1e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
c1f0: 65 73 20 69 6e 20 74 68 65 20 6e 75 6d 65 72 69  es in the numeri
c200: 63 20 73 74 72 69 6e 67 2e 20 0a 2a 2f 0a 73 74  c string. .*/.st
c210: 61 74 69 63 20 69 6e 74 20 74 68 4e 65 78 74 4e  atic int thNextN
c220: 75 6d 62 65 72 28 0a 20 20 54 68 5f 49 6e 74 65  umber(.  Th_Inte
c230: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63  rp *interp, .  c
c240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 70 75  onst char *zInpu
c250: 74 2c 20 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74  t, .  int nInput
c260: 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 74 65  , .  int *pnLite
c270: 72 61 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ral.){.  int i;.
c280: 20 20 69 6e 74 20 73 65 65 6e 44 6f 74 20 3d 20    int seenDot = 
c290: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
c2a0: 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20  nInput; i++){.  
c2b0: 20 20 63 68 61 72 20 63 20 3d 20 7a 49 6e 70 75    char c = zInpu
c2c0: 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 73  t[i];.    if( (s
c2d0: 65 65 6e 44 6f 74 20 7c 7c 20 63 21 3d 27 2e 27  eenDot || c!='.'
c2e0: 29 20 26 26 20 21 74 68 5f 69 73 64 69 67 69 74  ) && !th_isdigit
c2f0: 28 63 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  (c) ) break;.   
c300: 20 69 66 28 20 63 3d 3d 27 2e 27 20 29 20 73 65   if( c=='.' ) se
c310: 65 6e 44 6f 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  enDot = 1;.  }. 
c320: 20 2a 70 6e 4c 69 74 65 72 61 6c 20 3d 20 69 3b   *pnLiteral = i;
c330: 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b  .  return TH_OK;
c340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
c350: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
c360: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
c370: 64 20 65 78 70 72 46 72 65 65 28 54 68 5f 49 6e  d exprFree(Th_In
c380: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 45 78  terp *interp, Ex
c390: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
c3a0: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 65  ( pExpr ){.    e
c3b0: 78 70 72 46 72 65 65 28 69 6e 74 65 72 70 2c 20  xprFree(interp, 
c3c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
c3d0: 20 20 20 65 78 70 72 46 72 65 65 28 69 6e 74 65     exprFree(inte
c3e0: 72 70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rp, pExpr->pRigh
c3f0: 74 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28  t);.    Th_Free(
c400: 69 6e 74 65 72 70 2c 20 70 45 78 70 72 2d 3e 7a  interp, pExpr->z
c410: 56 61 6c 75 65 29 3b 0a 20 20 20 20 54 68 5f 46  Value);.    Th_F
c420: 72 65 65 28 69 6e 74 65 72 70 2c 20 70 45 78 70  ree(interp, pExp
c430: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
c440: 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   Evaluate an exp
c450: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
c460: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
c470: 45 76 61 6c 28 54 68 5f 49 6e 74 65 72 70 20 2a  Eval(Th_Interp *
c480: 69 6e 74 65 72 70 2c 20 45 78 70 72 20 2a 70 45  interp, Expr *pE
c490: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  xpr){.  int rc =
c4a0: 20 54 48 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70   TH_OK;..  if( p
c4b0: 45 78 70 72 2d 3e 70 4f 70 3d 3d 30 20 29 7b 0a  Expr->pOp==0 ){.
c4c0: 20 20 20 20 2f 2a 20 41 20 6c 69 74 65 72 61 6c      /* A literal
c4d0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 74 68 53   */.    rc = thS
c4e0: 75 62 73 74 57 6f 72 64 28 69 6e 74 65 72 70 2c  ubstWord(interp,
c4f0: 20 70 45 78 70 72 2d 3e 7a 56 61 6c 75 65 2c 20   pExpr->zValue, 
c500: 70 45 78 70 72 2d 3e 6e 56 61 6c 75 65 29 3b 0a  pExpr->nValue);.
c510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
c520: 20 65 41 72 67 54 79 70 65 20 3d 20 30 3b 20 20   eArgType = 0;  
c530: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 75           /* Actu
c540: 61 6c 20 74 79 70 65 20 6f 66 20 61 72 67 75 6d  al type of argum
c550: 65 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ents */..    /* 
c560: 41 72 67 75 6d 65 6e 74 20 76 61 6c 75 65 73 20  Argument values 
c570: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 65 66 74  */.    int iLeft
c580: 3b 0a 20 20 20 20 69 6e 74 20 69 52 69 67 68 74  ;.    int iRight
c590: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 66 4c 65  ;.    double fLe
c5a0: 66 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 66  ft;.    double f
c5b0: 52 69 67 68 74 3b 0a 0a 20 20 20 20 2f 2a 20 4c  Right;..    /* L
c5c0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 61 72  eft and right ar
c5d0: 67 75 6d 65 6e 74 73 20 61 73 20 73 74 72 69 6e  guments as strin
c5e0: 67 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  gs */.    char *
c5f0: 7a 4c 65 66 74 20 3d 20 30 3b 20 69 6e 74 20 6e  zLeft = 0; int n
c600: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 63 68  Left = 0;.    ch
c610: 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b 20  ar *zRight = 0; 
c620: 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 30 3b 0a  int nRight = 0;.
c630: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65  .    /* Evaluate
c640: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
c650: 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 74 68  arguments, if th
c660: 65 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  ey exist. */.   
c670: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
c680: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
c690: 65 78 70 72 45 76 61 6c 28 69 6e 74 65 72 70 2c  exprEval(interp,
c6a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
c6b0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 48        if( rc==TH
c6c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OK ){.        z
c6d0: 4c 65 66 74 20 3d 20 54 68 5f 54 61 6b 65 52 65  Left = Th_TakeRe
c6e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 26 6e 4c  sult(interp, &nL
c6f0: 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eft);.      }.  
c700: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
c710: 54 48 5f 4f 4b 20 26 26 20 70 45 78 70 72 2d 3e  TH_OK && pExpr->
c720: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
c730: 72 63 20 3d 20 65 78 70 72 45 76 61 6c 28 69 6e  rc = exprEval(in
c740: 74 65 72 70 2c 20 70 45 78 70 72 2d 3e 70 52 69  terp, pExpr->pRi
c750: 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ght);.      if( 
c760: 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20  rc==TH_OK ){.   
c770: 20 20 20 20 20 7a 52 69 67 68 74 20 3d 20 54 68       zRight = Th
c780: 5f 54 61 6b 65 52 65 73 75 6c 74 28 69 6e 74 65  _TakeResult(inte
c790: 72 70 2c 20 26 6e 52 69 67 68 74 29 3b 0a 20 20  rp, &nRight);.  
c7a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c7b0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 72 67 75   /* Convert argu
c7c0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 69 72 20 72  ments to their r
c7d0: 65 71 75 69 72 65 64 20 66 6f 72 6d 73 2e 20 2a  equired forms. *
c7e0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 48  /.    if( rc==TH
c7f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 65 41 72  _OK ){.      eAr
c800: 67 54 79 70 65 20 3d 20 70 45 78 70 72 2d 3e 70  gType = pExpr->p
c810: 4f 70 2d 3e 65 41 72 67 54 79 70 65 3b 0a 20 20  Op->eArgType;.  
c820: 20 20 20 20 69 66 28 20 65 41 72 67 54 79 70 65      if( eArgType
c830: 3d 3d 41 52 47 5f 4e 55 4d 42 45 52 20 29 7b 0a  ==ARG_NUMBER ){.
c840: 20 20 20 20 20 20 20 20 69 66 28 20 28 7a 4c 65          if( (zLe
c850: 66 74 3d 3d 30 20 7c 7c 20 54 48 5f 4f 4b 3d 3d  ft==0 || TH_OK==
c860: 54 68 5f 54 6f 49 6e 74 28 30 2c 20 7a 4c 65 66  Th_ToInt(0, zLef
c870: 74 2c 20 6e 4c 65 66 74 2c 20 26 69 4c 65 66 74  t, nLeft, &iLeft
c880: 29 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  )).         && (
c890: 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 54 48 5f  zRight==0 || TH_
c8a0: 4f 4b 3d 3d 54 68 5f 54 6f 49 6e 74 28 30 2c 20  OK==Th_ToInt(0, 
c8b0: 7a 52 69 67 68 74 2c 20 6e 52 69 67 68 74 2c 20  zRight, nRight, 
c8c0: 26 69 52 69 67 68 74 29 29 0a 20 20 20 20 20 20  &iRight)).      
c8d0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65    ){.          e
c8e0: 41 72 67 54 79 70 65 20 3d 20 41 52 47 5f 49 4e  ArgType = ARG_IN
c8f0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 7d  TEGER;.        }
c900: 65 6c 73 65 20 69 66 28 20 0a 20 20 20 20 20 20  else if( .      
c910: 20 20 20 20 28 7a 4c 65 66 74 20 26 26 20 54 48      (zLeft && TH
c920: 5f 4f 4b 21 3d 54 68 5f 54 6f 44 6f 75 62 6c 65  _OK!=Th_ToDouble
c930: 28 69 6e 74 65 72 70 2c 20 7a 4c 65 66 74 2c 20  (interp, zLeft, 
c940: 6e 4c 65 66 74 2c 20 26 66 4c 65 66 74 29 29 20  nLeft, &fLeft)) 
c950: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 7a 52  ||.          (zR
c960: 69 67 68 74 20 26 26 20 54 48 5f 4f 4b 21 3d 54  ight && TH_OK!=T
c970: 68 5f 54 6f 44 6f 75 62 6c 65 28 69 6e 74 65 72  h_ToDouble(inter
c980: 70 2c 20 7a 52 69 67 68 74 2c 20 6e 52 69 67 68  p, zRight, nRigh
c990: 74 2c 20 26 66 52 69 67 68 74 29 29 0a 20 20 20  t, &fRight)).   
c9a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
c9b0: 20 20 2f 2a 20 41 20 74 79 70 65 20 65 72 72 6f    /* A type erro
c9c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
c9d0: 72 63 20 3d 20 54 48 5f 45 52 52 4f 52 3b 0a 20  rc = TH_ERROR;. 
c9e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c9f0: 65 6c 73 65 20 69 66 28 20 65 41 72 67 54 79 70  else if( eArgTyp
ca00: 65 3d 3d 41 52 47 5f 49 4e 54 45 47 45 52 20 29  e==ARG_INTEGER )
ca10: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  {.        rc = T
ca20: 68 5f 54 6f 49 6e 74 28 69 6e 74 65 72 70 2c 20  h_ToInt(interp, 
ca30: 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20 26 69  zLeft, nLeft, &i
ca40: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Left);.        i
ca50: 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 26 26 20  f( rc==TH_OK && 
ca60: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
ca70: 20 20 20 20 72 63 20 3d 20 54 68 5f 54 6f 49 6e      rc = Th_ToIn
ca80: 74 28 69 6e 74 65 72 70 2c 20 7a 52 69 67 68 74  t(interp, zRight
ca90: 2c 20 6e 52 69 67 68 74 2c 20 26 69 52 69 67 68  , nRight, &iRigh
caa0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
cab0: 20 20 20 20 7d 20 20 0a 20 20 20 20 7d 0a 0a 20      }  .    }.. 
cac0: 20 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b     if( rc==TH_OK
cad0: 20 26 26 20 65 41 72 67 54 79 70 65 3d 3d 41 52   && eArgType==AR
cae0: 47 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  G_INTEGER ){.   
caf0: 20 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b     int iRes = 0;
cb00: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
cb10: 45 78 70 72 2d 3e 70 4f 70 2d 3e 65 4f 70 20 29  Expr->pOp->eOp )
cb20: 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   {.        case 
cb30: 4f 50 5f 4d 55 4c 54 49 50 4c 59 3a 20 20 20 20  OP_MULTIPLY:    
cb40: 20 69 52 65 73 20 3d 20 69 4c 65 66 74 2a 69 52   iRes = iLeft*iR
cb50: 69 67 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ight;  break;.  
cb60: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 49        case OP_DI
cb70: 56 49 44 45 3a 20 20 20 20 20 20 20 69 52 65 73  VIDE:       iRes
cb80: 20 3d 20 69 4c 65 66 74 2f 69 52 69 67 68 74 3b   = iLeft/iRight;
cb90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
cba0: 20 63 61 73 65 20 4f 50 5f 4d 4f 44 55 4c 55 53   case OP_MODULUS
cbb0: 3a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 4c  :      iRes = iL
cbc0: 65 66 74 25 69 52 69 67 68 74 3b 20 20 62 72 65  eft%iRight;  bre
cbd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
cbe0: 20 4f 50 5f 41 44 44 3a 20 20 20 20 20 20 20 20   OP_ADD:        
cbf0: 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74 2b 69    iRes = iLeft+i
cc00: 52 69 67 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20  Right;  break;. 
cc10: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53         case OP_S
cc20: 55 42 54 52 41 43 54 3a 20 20 20 20 20 69 52 65  UBTRACT:     iRe
cc30: 73 20 3d 20 69 4c 65 66 74 2d 69 52 69 67 68 74  s = iLeft-iRight
cc40: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
cc50: 20 20 63 61 73 65 20 4f 50 5f 4c 45 46 54 53 48    case OP_LEFTSH
cc60: 49 46 54 3a 20 20 20 20 69 52 65 73 20 3d 20 69  IFT:    iRes = i
cc70: 4c 65 66 74 3c 3c 69 52 69 67 68 74 3b 20 62 72  Left<<iRight; br
cc80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
cc90: 65 20 4f 50 5f 52 49 47 48 54 53 48 49 46 54 3a  e OP_RIGHTSHIFT:
cca0: 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74 3e     iRes = iLeft>
ccb0: 3e 69 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a  >iRight; break;.
ccc0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
ccd0: 4c 54 3a 20 20 20 20 20 20 20 20 20 20 20 69 52  LT:           iR
cce0: 65 73 20 3d 20 69 4c 65 66 74 3c 69 52 69 67 68  es = iLeft<iRigh
ccf0: 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t;  break;.     
cd00: 20 20 20 63 61 73 65 20 4f 50 5f 47 54 3a 20 20     case OP_GT:  
cd10: 20 20 20 20 20 20 20 20 20 69 52 65 73 20 3d 20           iRes = 
cd20: 69 4c 65 66 74 3e 69 52 69 67 68 74 3b 20 20 62  iLeft>iRight;  b
cd30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
cd40: 73 65 20 4f 50 5f 4c 45 3a 20 20 20 20 20 20 20  se OP_LE:       
cd50: 20 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74      iRes = iLeft
cd60: 3c 3d 69 52 69 67 68 74 3b 20 62 72 65 61 6b 3b  <=iRight; break;
cd70: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
cd80: 5f 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 69  _GE:           i
cd90: 52 65 73 20 3d 20 69 4c 65 66 74 3e 3d 69 52 69  Res = iLeft>=iRi
cda0: 67 68 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ght; break;.    
cdb0: 20 20 20 20 63 61 73 65 20 4f 50 5f 45 51 3a 20      case OP_EQ: 
cdc0: 20 20 20 20 20 20 20 20 20 20 69 52 65 73 20 3d            iRes =
cdd0: 20 69 4c 65 66 74 3d 3d 69 52 69 67 68 74 3b 20   iLeft==iRight; 
cde0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
cdf0: 61 73 65 20 4f 50 5f 4e 45 3a 20 20 20 20 20 20  ase OP_NE:      
ce00: 20 20 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66       iRes = iLef
ce10: 74 21 3d 69 52 69 67 68 74 3b 20 62 72 65 61 6b  t!=iRight; break
ce20: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  ;.        case O
ce30: 50 5f 42 49 54 57 49 53 45 5f 41 4e 44 3a 20 20  P_BITWISE_AND:  
ce40: 69 52 65 73 20 3d 20 69 4c 65 66 74 26 69 52 69  iRes = iLeft&iRi
ce50: 67 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ght;  break;.   
ce60: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 42 49 54       case OP_BIT
ce70: 57 49 53 45 5f 58 4f 52 3a 20 20 69 52 65 73 20  WISE_XOR:  iRes 
ce80: 3d 20 69 4c 65 66 74 5e 69 52 69 67 68 74 3b 20  = iLeft^iRight; 
ce90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
cea0: 63 61 73 65 20 4f 50 5f 42 49 54 57 49 53 45 5f  case OP_BITWISE_
ceb0: 4f 52 3a 20 20 20 69 52 65 73 20 3d 20 69 4c 65  OR:   iRes = iLe
cec0: 66 74 7c 69 52 69 67 68 74 3b 20 20 62 72 65 61  ft|iRight;  brea
ced0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
cee0: 4f 50 5f 4c 4f 47 49 43 41 4c 5f 41 4e 44 3a 20  OP_LOGICAL_AND: 
cef0: 20 69 52 65 73 20 3d 20 69 4c 65 66 74 26 26 69   iRes = iLeft&&i
cf00: 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a 20 20  Right; break;.  
cf10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c 4f        case OP_LO
cf20: 47 49 43 41 4c 5f 4f 52 3a 20 20 20 69 52 65 73  GICAL_OR:   iRes
cf30: 20 3d 20 69 4c 65 66 74 7c 7c 69 52 69 67 68 74   = iLeft||iRight
cf40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
cf50: 20 63 61 73 65 20 4f 50 5f 55 4e 41 52 59 5f 4d   case OP_UNARY_M
cf60: 49 4e 55 53 3a 20 20 69 52 65 73 20 3d 20 2d 69  INUS:  iRes = -i
cf70: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 62 72 65  Left;        bre
cf80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
cf90: 20 4f 50 5f 55 4e 41 52 59 5f 50 4c 55 53 3a 20   OP_UNARY_PLUS: 
cfa0: 20 20 69 52 65 73 20 3d 20 2b 69 4c 65 66 74 3b    iRes = +iLeft;
cfb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cfc0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c         case OP_L
cfd0: 4f 47 49 43 41 4c 5f 4e 4f 54 3a 20 20 69 52 65  OGICAL_NOT:  iRe
cfe0: 73 20 3d 20 21 69 4c 65 66 74 3b 20 20 20 20 20  s = !iLeft;     
cff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d000: 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
d010: 74 28 21 22 49 6e 74 65 72 6e 61 6c 20 65 72 72  t(!"Internal err
d020: 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  or");.      }.  
d030: 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74      Th_SetResult
d040: 49 6e 74 28 69 6e 74 65 72 70 2c 20 69 52 65 73  Int(interp, iRes
d050: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
d060: 20 72 63 3d 3d 54 48 5f 4f 4b 20 26 26 20 65 41   rc==TH_OK && eA
d070: 72 67 54 79 70 65 3d 3d 41 52 47 5f 4e 55 4d 42  rgType==ARG_NUMB
d080: 45 52 20 29 7b 0a 20 20 20 20 20 20 73 77 69 74  ER ){.      swit
d090: 63 68 28 20 70 45 78 70 72 2d 3e 70 4f 70 2d 3e  ch( pExpr->pOp->
d0a0: 65 4f 70 20 29 20 7b 0a 20 20 20 20 20 20 20 20  eOp ) {.        
d0b0: 63 61 73 65 20 4f 50 5f 4d 55 4c 54 49 50 4c 59  case OP_MULTIPLY
d0c0: 3a 20 54 68 5f 53 65 74 52 65 73 75 6c 74 44 6f  : Th_SetResultDo
d0d0: 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 66 4c 65  uble(interp, fLe
d0e0: 66 74 2a 66 52 69 67 68 74 29 3b 20 20 62 72 65  ft*fRight);  bre
d0f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
d100: 20 4f 50 5f 44 49 56 49 44 45 3a 20 20 20 54 68   OP_DIVIDE:   Th
d110: 5f 53 65 74 52 65 73 75 6c 74 44 6f 75 62 6c 65  _SetResultDouble
d120: 28 69 6e 74 65 72 70 2c 20 66 4c 65 66 74 2f 66  (interp, fLeft/f
d130: 52 69 67 68 74 29 3b 20 20 62 72 65 61 6b 3b 0a  Right);  break;.
d140: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
d150: 41 44 44 3a 20 20 20 20 20 20 54 68 5f 53 65 74  ADD:      Th_Set
d160: 52 65 73 75 6c 74 44 6f 75 62 6c 65 28 69 6e 74  ResultDouble(int
d170: 65 72 70 2c 20 66 4c 65 66 74 2b 66 52 69 67 68  erp, fLeft+fRigh
d180: 74 29 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t);  break;.    
d190: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 55 42 54      case OP_SUBT
d1a0: 52 41 43 54 3a 20 54 68 5f 53 65 74 52 65 73 75  RACT: Th_SetResu
d1b0: 6c 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  ltDouble(interp,
d1c0: 20 66 4c 65 66 74 2d 66 52 69 67 68 74 29 3b 20   fLeft-fRight); 
d1d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d1e0: 63 61 73 65 20 4f 50 5f 4c 54 3a 20 20 20 20 20  case OP_LT:     
d1f0: 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e    Th_SetResultIn
d200: 74 28 69 6e 74 65 72 70 2c 20 66 4c 65 66 74 3c  t(interp, fLeft<
d210: 66 52 69 67 68 74 29 3b 20 20 62 72 65 61 6b 3b  fRight);  break;
d220: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
d230: 5f 47 54 3a 20 20 20 20 20 20 20 54 68 5f 53 65  _GT:       Th_Se
d240: 74 52 65 73 75 6c 74 49 6e 74 28 69 6e 74 65 72  tResultInt(inter
d250: 70 2c 20 66 4c 65 66 74 3e 66 52 69 67 68 74 29  p, fLeft>fRight)
d260: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
d270: 20 20 63 61 73 65 20 4f 50 5f 4c 45 3a 20 20 20    case OP_LE:   
d280: 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74      Th_SetResult
d290: 49 6e 74 28 69 6e 74 65 72 70 2c 20 66 4c 65 66  Int(interp, fLef
d2a0: 74 3c 3d 66 52 69 67 68 74 29 3b 20 62 72 65 61  t<=fRight); brea
d2b0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
d2c0: 4f 50 5f 47 45 3a 20 20 20 20 20 20 20 54 68 5f  OP_GE:       Th_
d2d0: 53 65 74 52 65 73 75 6c 74 49 6e 74 28 69 6e 74  SetResultInt(int
d2e0: 65 72 70 2c 20 66 4c 65 66 74 3e 3d 66 52 69 67  erp, fLeft>=fRig
d2f0: 68 74 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ht); break;.    
d300: 20 20 20 20 63 61 73 65 20 4f 50 5f 45 51 3a 20      case OP_EQ: 
d310: 20 20 20 20 20 20 54 68 5f 53 65 74 52 65 73 75        Th_SetResu
d320: 6c 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 66 4c  ltInt(interp, fL
d330: 65 66 74 3d 3d 66 52 69 67 68 74 29 3b 20 62 72  eft==fRight); br
d340: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
d350: 65 20 4f 50 5f 4e 45 3a 20 20 20 20 20 20 20 54  e OP_NE:       T
d360: 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 28 69  h_SetResultInt(i
d370: 6e 74 65 72 70 2c 20 66 4c 65 66 74 21 3d 66 52  nterp, fLeft!=fR
d380: 69 67 68 74 29 3b 20 62 72 65 61 6b 3b 0a 20 20  ight); break;.  
d390: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
d3a0: 73 73 65 72 74 28 21 22 49 6e 74 65 72 6e 61 6c  ssert(!"Internal
d3b0: 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
d3c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
d3d0: 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20  rc==TH_OK ){.   
d3e0: 20 20 20 69 6e 74 20 69 45 71 75 61 6c 20 3d 20     int iEqual = 
d3f0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
d400: 20 65 41 72 67 54 79 70 65 3d 3d 41 52 47 5f 53   eArgType==ARG_S
d410: 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 69  TRING );.      i
d420: 66 28 20 6e 52 69 67 68 74 3d 3d 6e 4c 65 66 74  f( nRight==nLeft
d430: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 52   && 0==memcmp(zR
d440: 69 67 68 74 2c 20 7a 4c 65 66 74 2c 20 6e 52 69  ight, zLeft, nRi
d450: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
d460: 69 45 71 75 61 6c 20 3d 20 31 3b 0a 20 20 20 20  iEqual = 1;.    
d470: 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68    }.      switch
d480: 28 20 70 45 78 70 72 2d 3e 70 4f 70 2d 3e 65 4f  ( pExpr->pOp->eO
d490: 70 20 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61  p ) {.        ca
d4a0: 73 65 20 4f 50 5f 53 45 51 3a 20 20 20 20 20 20  se OP_SEQ:      
d4b0: 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74   Th_SetResultInt
d4c0: 28 69 6e 74 65 72 70 2c 20 69 45 71 75 61 6c 29  (interp, iEqual)
d4d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
d4e0: 20 63 61 73 65 20 4f 50 5f 53 4e 45 3a 20 20 20   case OP_SNE:   
d4f0: 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74      Th_SetResult
d500: 49 6e 74 28 69 6e 74 65 72 70 2c 20 21 69 45 71  Int(interp, !iEq
d510: 75 61 6c 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ual); break;.   
d520: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73       default: as
d530: 73 65 72 74 28 21 22 49 6e 74 65 72 6e 61 6c 20  sert(!"Internal 
d540: 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d  error");.      }
d550: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 68 5f 46  .    }..    Th_F
d560: 72 65 65 28 69 6e 74 65 72 70 2c 20 7a 4c 65 66  ree(interp, zLef
d570: 74 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28  t);.    Th_Free(
d580: 69 6e 74 65 72 70 2c 20 7a 52 69 67 68 74 29 3b  interp, zRight);
d590: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
d5a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
d5b0: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
d5c0: 20 74 72 65 65 20 66 72 6f 6d 20 61 6e 20 61 72   tree from an ar
d5d0: 72 61 79 20 6f 66 20 74 6f 6b 65 6e 73 2e 20 49  ray of tokens. I
d5e0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
d5f0: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
d600: 20 74 72 65 65 20 69 73 20 73 74 6f 72 65 64 20   tree is stored 
d610: 69 6e 20 61 70 54 6f 6b 65 6e 5b 30 5d 2e 0a 2a  in apToken[0]..*
d620: 2f 0a 69 6e 74 20 65 78 70 72 4d 61 6b 65 54 72  /.int exprMakeTr
d630: 65 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e  ee(Th_Interp *in
d640: 74 65 72 70 2c 20 45 78 70 72 20 2a 2a 61 70 54  terp, Expr **apT
d650: 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
d660: 29 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 3b 0a  ){.  int iLeft;.
d670: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6a    int i;.  int j
d680: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 54 6f  j;..  assert(nTo
d690: 6b 65 6e 3e 30 29 3b 0a 23 64 65 66 69 6e 65 20  ken>0);.#define 
d6a0: 49 53 54 45 52 4d 28 78 29 20 28 61 70 54 6f 6b  ISTERM(x) (apTok
d6b0: 65 6e 5b 78 5d 20 26 26 20 28 21 61 70 54 6f 6b  en[x] && (!apTok
d6c0: 65 6e 5b 78 5d 2d 3e 70 4f 70 20 7c 7c 20 61 70  en[x]->pOp || ap
d6d0: 54 6f 6b 65 6e 5b 78 5d 2d 3e 70 4c 65 66 74 29  Token[x]->pLeft)
d6e0: 29 0a 0a 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a  )..  for(jj=0; j
d6f0: 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b  j<nToken; jj++){
d700: 0a 20 20 20 20 69 66 28 20 61 70 54 6f 6b 65 6e  .    if( apToken
d710: 5b 6a 6a 5d 2d 3e 70 4f 70 20 26 26 20 61 70 54  [jj]->pOp && apT
d720: 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 2d 3e 65  oken[jj]->pOp->e
d730: 4f 70 3d 3d 4f 50 5f 4f 50 45 4e 5f 42 52 41 43  Op==OP_OPEN_BRAC
d740: 4b 45 54 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  KET ){.      int
d750: 20 6e 4e 65 73 74 20 3d 20 31 3b 0a 20 20 20 20   nNest = 1;.    
d760: 20 20 69 6e 74 20 69 4c 65 66 74 20 3d 20 6a 6a    int iLeft = jj
d770: 3b 20 0a 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a  ; ..      for(jj
d780: 2b 2b 3b 20 6a 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a  ++; jj<nToken; j
d790: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 4f 70  j++){.        Op
d7a0: 65 72 61 74 6f 72 20 2a 70 4f 70 20 3d 20 61 70  erator *pOp = ap
d7b0: 54 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 3b 0a  Token[jj]->pOp;.
d7c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 20          if( pOp 
d7d0: 26 26 20 70 4f 70 2d 3e 65 4f 70 3d 3d 4f 50 5f  && pOp->eOp==OP_
d7e0: 4f 50 45 4e 5f 42 52 41 43 4b 45 54 20 29 20 6e  OPEN_BRACKET ) n
d7f0: 4e 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Nest++;.        
d800: 69 66 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e  if( pOp && pOp->
d810: 65 4f 70 3d 3d 4f 50 5f 43 4c 4f 53 45 5f 42 52  eOp==OP_CLOSE_BR
d820: 41 43 4b 45 54 20 29 20 6e 4e 65 73 74 2d 2d 3b  ACKET ) nNest--;
d830: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
d840: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  st==0 ) break;. 
d850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d860: 20 6a 6a 3d 3d 6e 54 6f 6b 65 6e 20 29 7b 0a 20   jj==nToken ){. 
d870: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48         return TH
d880: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
d890: 20 20 20 20 20 20 69 66 28 20 28 6a 6a 2d 69 4c        if( (jj-iL
d8a0: 65 66 74 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  eft)>1 ){.      
d8b0: 20 20 69 66 28 20 65 78 70 72 4d 61 6b 65 54 72    if( exprMakeTr
d8c0: 65 65 28 69 6e 74 65 72 70 2c 20 26 61 70 54 6f  ee(interp, &apTo
d8d0: 6b 65 6e 5b 69 4c 65 66 74 2b 31 5d 2c 20 6a 6a  ken[iLeft+1], jj
d8e0: 2d 69 4c 65 66 74 2d 31 29 20 29 7b 0a 20 20 20  -iLeft-1) ){.   
d8f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48         return TH
d900: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
d910: 7d 0a 20 20 20 20 20 20 20 20 65 78 70 72 46 72  }.        exprFr
d920: 65 65 28 69 6e 74 65 72 70 2c 20 61 70 54 6f 6b  ee(interp, apTok
d930: 65 6e 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 20  en[jj]);.       
d940: 20 65 78 70 72 46 72 65 65 28 69 6e 74 65 72 70   exprFree(interp
d950: 2c 20 61 70 54 6f 6b 65 6e 5b 69 4c 65 66 74 5d  , apToken[iLeft]
d960: 29 3b 0a 20 20 20 20 20 20 20 20 61 70 54 6f 6b  );.        apTok
d970: 65 6e 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  en[jj] = 0;.    
d980: 20 20 20 20 61 70 54 6f 6b 65 6e 5b 69 4c 65 66      apToken[iLef
d990: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  t] = 0;.      }.
d9a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 4c 65      }.  }..  iLe
d9b0: 66 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 6a  ft = 0;.  for(jj
d9c0: 3d 6e 54 6f 6b 65 6e 2d 31 3b 20 6a 6a 3e 3d 30  =nToken-1; jj>=0
d9d0: 3b 20 6a 6a 2d 2d 29 7b 0a 20 20 20 20 69 66 28  ; jj--){.    if(
d9e0: 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a   apToken[jj] ){.
d9f0: 20 20 20 20 20 20 69 66 28 20 61 70 54 6f 6b 65        if( apToke
da00: 6e 5b 6a 6a 5d 2d 3e 70 4f 70 20 26 26 20 61 70  n[jj]->pOp && ap
da10: 54 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 2d 3e  Token[jj]->pOp->
da20: 69 50 72 65 63 65 64 65 6e 63 65 3d 3d 31 20 26  iPrecedence==1 &
da30: 26 20 69 4c 65 66 74 3e 30 20 29 7b 0a 20 20 20  & iLeft>0 ){.   
da40: 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d       apToken[jj]
da50: 2d 3e 70 4c 65 66 74 20 3d 20 61 70 54 6f 6b 65  ->pLeft = apToke
da60: 6e 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20 20 20  n[iLeft];.      
da70: 20 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70    apToken[jj]->p
da80: 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Left->pParent = 
da90: 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 3b 0a 20 20 20  apToken[jj];.   
daa0: 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b 69 4c 65       apToken[iLe
dab0: 66 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ft] = 0;.      }
dac0: 0a 20 20 20 20 20 20 69 4c 65 66 74 20 3d 20 6a  .      iLeft = j
dad0: 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  j;.    }.  }.  f
dae0: 6f 72 28 69 3d 32 3b 20 69 3c 3d 31 32 3b 20 69  or(i=2; i<=12; i
daf0: 2b 2b 29 7b 0a 20 20 20 20 69 4c 65 66 74 20 3d  ++){.    iLeft =
db00: 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d   -1;.    for(jj=
db10: 30 3b 20 6a 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a 6a  0; jj<nToken; jj
db20: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
db30: 2a 70 54 6f 6b 65 6e 20 3d 20 61 70 54 6f 6b 65  *pToken = apToke
db40: 6e 5b 6a 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  n[jj];.      if(
db50: 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a   apToken[jj] ){.
db60: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b          if( pTok
db70: 65 6e 2d 3e 70 4f 70 20 26 26 20 21 70 54 6f 6b  en->pOp && !pTok
db80: 65 6e 2d 3e 70 4c 65 66 74 20 26 26 20 70 54 6f  en->pLeft && pTo
db90: 6b 65 6e 2d 3e 70 4f 70 2d 3e 69 50 72 65 63 65  ken->pOp->iPrece
dba0: 64 65 6e 63 65 3d 3d 69 20 29 7b 0a 20 20 20 20  dence==i ){.    
dbb0: 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74        int iRight
dbc0: 20 3d 20 6a 6a 2b 31 3b 0a 0a 20 20 20 20 20 20   = jj+1;..      
dbd0: 20 20 20 20 69 52 69 67 68 74 20 3d 20 6a 6a 2b      iRight = jj+
dbe0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
dbf0: 28 69 52 69 67 68 74 3d 6a 6a 2b 31 3b 20 21 61  (iRight=jj+1; !a
dc00: 70 54 6f 6b 65 6e 5b 69 52 69 67 68 74 5d 20 26  pToken[iRight] &
dc10: 26 20 69 52 69 67 68 74 3c 6e 54 6f 6b 65 6e 3b  & iRight<nToken;
dc20: 20 69 52 69 67 68 74 2b 2b 29 3b 0a 20 20 20 20   iRight++);.    
dc30: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
dc40: 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 69 4c 65 66  ==nToken || iLef
dc50: 74 3c 30 20 7c 7c 20 21 49 53 54 45 52 4d 28 69  t<0 || !ISTERM(i
dc60: 52 69 67 68 74 29 20 7c 7c 20 21 49 53 54 45 52  Right) || !ISTER
dc70: 4d 28 69 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  M(iLeft) ){.    
dc80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
dc90: 48 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  H_ERROR;.       
dca0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
dcb0: 54 6f 6b 65 6e 2d 3e 70 4c 65 66 74 20 3d 20 61  Token->pLeft = a
dcc0: 70 54 6f 6b 65 6e 5b 69 4c 65 66 74 5d 3b 0a 20  pToken[iLeft];. 
dcd0: 20 20 20 20 20 20 20 20 20 61 70 54 6f 6b 65 6e           apToken
dce0: 5b 69 4c 65 66 74 5d 20 3d 20 30 3b 0a 20 20 20  [iLeft] = 0;.   
dcf0: 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 70         pToken->p
dd00: 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Left->pParent = 
dd10: 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  pToken;.        
dd20: 20 20 70 54 6f 6b 65 6e 2d 3e 70 52 69 67 68 74    pToken->pRight
dd30: 20 3d 20 61 70 54 6f 6b 65 6e 5b 69 52 69 67 68   = apToken[iRigh
dd40: 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  t];.          ap
dd50: 54 6f 6b 65 6e 5b 69 52 69 67 68 74 5d 20 3d 20  Token[iRight] = 
dd60: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f  0;.          pTo
dd70: 6b 65 6e 2d 3e 70 52 69 67 68 74 2d 3e 70 50 61  ken->pRight->pPa
dd80: 72 65 6e 74 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20  rent = pToken;. 
dd90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dda0: 20 69 4c 65 66 74 20 3d 20 6a 6a 3b 0a 20 20 20   iLeft = jj;.   
ddb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ddc0: 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e 54   for(jj=1; jj<nT
ddd0: 6f 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  oken; jj++){.   
dde0: 20 61 73 73 65 72 74 28 20 21 61 70 54 6f 6b 65   assert( !apToke
ddf0: 6e 5b 6a 6a 5d 20 7c 7c 20 21 61 70 54 6f 6b 65  n[jj] || !apToke
de00: 6e 5b 30 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  n[0] );.    if( 
de10: 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a 20  apToken[jj] ){. 
de20: 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b 30 5d 20       apToken[0] 
de30: 3d 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 3b 0a 20  = apToken[jj];. 
de40: 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d       apToken[jj]
de50: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
de60: 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b  .  return TH_OK;
de70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
de80: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
de90: 69 6e 67 20 61 20 54 48 20 65 78 70 72 65 73 73  ing a TH express
dea0: 69 6f 6e 20 74 6f 20 61 20 6c 69 73 74 20 6f 66  ion to a list of
deb0: 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74   tokens..*/.stat
dec0: 69 63 20 69 6e 74 20 65 78 70 72 50 61 72 73 65  ic int exprParse
ded0: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69  (.  Th_Interp *i
dee0: 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 2f 2a  nterp,        /*
def0: 20 49 6e 74 65 72 70 72 65 74 65 72 20 74 6f 20   Interpreter to 
df00: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
df10: 61 67 65 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73  age in */.  cons
df20: 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c 20 20  t char *zExpr,  
df30: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
df40: 74 6f 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  to input string 
df50: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 2c 20  */.  int nExpr, 
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
df80: 73 20 61 74 20 7a 45 78 70 72 20 2a 2f 0a 20 20  s at zExpr */.  
df90: 45 78 70 72 20 2a 2a 2a 70 61 70 54 6f 6b 65 6e  Expr ***papToken
dfa0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
dfb0: 3a 20 41 72 72 61 79 20 6f 66 20 74 6f 6b 65 6e  : Array of token
dfc0: 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 54  s. */.  int *pnT
dfd0: 6f 6b 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  oken            
dfe0: 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
dff0: 66 20 74 6f 6b 65 6e 20 61 72 72 61 79 20 2a 2f  f token array */
e000: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
e010: 69 6e 74 20 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a  int rc = TH_OK;.
e020: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30    int nToken = 0
e030: 3b 0a 20 20 45 78 70 72 20 2a 2a 61 70 54 6f 6b  ;.  Expr **apTok
e040: 65 6e 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  en = 0;..  for(i
e050: 3d 30 3b 20 72 63 3d 3d 54 48 5f 4f 4b 20 26 26  =0; rc==TH_OK &&
e060: 20 69 3c 6e 45 78 70 72 3b 20 29 7b 0a 20 20 20   i<nExpr; ){.   
e070: 20 63 68 61 72 20 63 20 3d 20 7a 45 78 70 72 5b   char c = zExpr[
e080: 69 5d 3b 0a 20 20 20 20 69 66 28 20 74 68 5f 69  i];.    if( th_i
e090: 73 73 70 61 63 65 28 63 29 20 29 7b 20 20 20 20  sspace(c) ){    
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e0c0: 68 69 74 65 2d 73 70 61 63 65 20 20 20 20 20 2a  hite-space     *
e0d0: 2f 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  /.      i++;.   
e0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
e0f0: 70 72 20 2a 70 4e 65 77 20 3d 20 28 45 78 70 72  pr *pNew = (Expr
e100: 20 2a 29 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74   *)Th_Malloc(int
e110: 65 72 70 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  erp, sizeof(Expr
e120: 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ));.      const 
e130: 63 68 61 72 20 2a 7a 20 3d 20 26 7a 45 78 70 72  char *z = &zExpr
e140: 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 73 77 69 74  [i];..      swit
e150: 63 68 20 28 63 29 20 7b 0a 20 20 20 20 20 20 20  ch (c) {.       
e160: 20 63 61 73 65 20 27 30 27 3a 20 63 61 73 65 20   case '0': case 
e170: 27 31 27 3a 20 63 61 73 65 20 27 32 27 3a 20 63  '1': case '2': c
e180: 61 73 65 20 27 33 27 3a 20 63 61 73 65 20 27 34  ase '3': case '4
e190: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
e1a0: 27 35 27 3a 20 63 61 73 65 20 27 36 27 3a 20 63  '5': case '6': c
e1b0: 61 73 65 20 27 37 27 3a 20 63 61 73 65 20 27 38  ase '7': case '8
e1c0: 27 3a 20 63 61 73 65 20 27 39 27 3a 0a 20 20 20  ': case '9':.   
e1d0: 20 20 20 20 20 20 20 74 68 4e 65 78 74 4e 75 6d         thNextNum
e1e0: 62 65 72 28 69 6e 74 65 72 70 2c 20 7a 2c 20 6e  ber(interp, z, n
e1f0: 45 78 70 72 2d 69 2c 20 26 70 4e 65 77 2d 3e 6e  Expr-i, &pNew->n
e200: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e210: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
e220: 20 20 63 61 73 65 20 27 24 27 3a 0a 20 20 20 20    case '$':.    
e230: 20 20 20 20 20 20 74 68 4e 65 78 74 56 61 72 6e        thNextVarn
e240: 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 2c 20 6e  ame(interp, z, n
e250: 45 78 70 72 2d 69 2c 20 26 70 4e 65 77 2d 3e 6e  Expr-i, &pNew->n
e260: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e270: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
e280: 20 20 63 61 73 65 20 27 7b 27 3a 20 63 61 73 65    case '{': case
e290: 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   '[': {.        
e2a0: 20 20 74 68 4e 65 78 74 43 6f 6d 6d 61 6e 64 28    thNextCommand(
e2b0: 69 6e 74 65 72 70 2c 20 7a 2c 20 6e 45 78 70 72  interp, z, nExpr
e2c0: 2d 69 2c 20 26 70 4e 65 77 2d 3e 6e 56 61 6c 75  -i, &pNew->nValu
e2d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  e);.          br
e2e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  eak;.        }..
e2f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 22 27          case '"'
e300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
e310: 74 20 69 45 6e 64 20 3d 20 69 3b 0a 20 20 20 20  t iEnd = i;.    
e320: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2b 2b 69        while( ++i
e330: 45 6e 64 3c 6e 45 78 70 72 20 26 26 20 7a 45 78  End<nExpr && zEx
e340: 70 72 5b 69 45 6e 64 5d 21 3d 27 22 27 20 29 7b  pr[iEnd]!='"' ){
e350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
e360: 20 7a 45 78 70 72 5b 69 45 6e 64 5d 3d 3d 27 5c   zExpr[iEnd]=='\
e370: 5c 27 20 29 20 69 45 6e 64 2b 2b 3b 0a 20 20 20  \' ) iEnd++;.   
e380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e390: 20 20 20 69 66 28 20 69 45 6e 64 3c 6e 45 78 70     if( iEnd<nExp
e3a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
e3b0: 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 20 3d 20   pNew->nValue = 
e3c0: 69 45 6e 64 2b 31 2d 69 3b 0a 20 20 20 20 20 20  iEnd+1-i;.      
e3d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e3e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
e3f0: 0a 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ..        defaul
e400: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
e410: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
e420: 66 6f 72 28 6a 3d 30 3b 20 61 4f 70 65 72 61 74  for(j=0; aOperat
e430: 6f 72 5b 6a 5d 2e 7a 4f 70 3b 20 6a 2b 2b 29 7b  or[j].zOp; j++){
e440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
e450: 20 6e 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20   nOp;.          
e460: 20 20 69 66 28 20 61 4f 70 65 72 61 74 6f 72 5b    if( aOperator[
e470: 6a 5d 2e 69 50 72 65 63 65 64 65 6e 63 65 3d 3d  j].iPrecedence==
e480: 31 20 26 26 20 6e 54 6f 6b 65 6e 3e 30 20 29 7b  1 && nToken>0 ){
e490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
e4a0: 78 70 72 20 2a 70 50 72 65 76 20 3d 20 61 70 54  xpr *pPrev = apT
e4b0: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 2d 31 5d 3b 0a  oken[nToken-1];.
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e4d0: 28 20 21 70 50 72 65 76 2d 3e 70 4f 70 20 7c 7c  ( !pPrev->pOp ||
e4e0: 20 70 50 72 65 76 2d 3e 70 4f 70 2d 3e 65 4f 70   pPrev->pOp->eOp
e4f0: 3d 3d 4f 50 5f 43 4c 4f 53 45 5f 42 52 41 43 4b  ==OP_CLOSE_BRACK
e500: 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ET ){.          
e510: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
e530: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e540: 20 20 20 20 20 20 20 20 20 20 6e 4f 70 20 3d 20            nOp = 
e550: 74 68 5f 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74  th_strlen((const
e560: 20 63 68 61 72 20 2a 29 61 4f 70 65 72 61 74 6f   char *)aOperato
e570: 72 5b 6a 5d 2e 7a 4f 70 29 3b 0a 20 20 20 20 20  r[j].zOp);.     
e580: 20 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70         if( (nExp
e590: 72 2d 69 29 3e 3d 6e 4f 70 20 26 26 20 30 3d 3d  r-i)>=nOp && 0==
e5a0: 6d 65 6d 63 6d 70 28 61 4f 70 65 72 61 74 6f 72  memcmp(aOperator
e5b0: 5b 6a 5d 2e 7a 4f 70 2c 20 26 7a 45 78 70 72 5b  [j].zOp, &zExpr[
e5c0: 69 5d 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20  i], nOp) ){.    
e5d0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
e5e0: 70 4f 70 20 3d 20 26 61 4f 70 65 72 61 74 6f 72  pOp = &aOperator
e5f0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
e600: 20 20 20 69 20 2b 3d 20 6e 4f 70 3b 0a 20 20 20     i += nOp;.   
e610: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
e620: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e630: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e640: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
e650: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
e660: 4f 70 20 7c 7c 20 70 4e 65 77 2d 3e 6e 56 61 6c  Op || pNew->nVal
e670: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ue ){.        if
e680: 28 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 20 29  ( pNew->nValue )
e690: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
e6a0: 20 74 65 72 6d 69 6e 61 6c 2e 20 43 6f 70 79 20   terminal. Copy 
e6b0: 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65  the string value
e6c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
e6d0: 73 73 65 72 74 28 20 21 70 4e 65 77 2d 3e 70 4f  ssert( !pNew->pO
e6e0: 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  p );.          p
e6f0: 4e 65 77 2d 3e 7a 56 61 6c 75 65 20 3d 20 54 68  New->zValue = Th
e700: 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20  _Malloc(interp, 
e710: 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20  pNew->nValue);. 
e720: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
e730: 70 4e 65 77 2d 3e 7a 56 61 6c 75 65 2c 20 7a 2c  pNew->zValue, z,
e740: 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 29 3b 0a   pNew->nValue);.
e750: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 70            i += p
e760: 4e 65 77 2d 3e 6e 56 61 6c 75 65 3b 0a 20 20 20  New->nValue;.   
e770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e780: 66 28 20 28 6e 54 6f 6b 65 6e 25 31 36 29 3d 3d  f( (nToken%16)==
e790: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
e7a0: 2a 20 47 72 6f 77 20 74 68 65 20 61 70 54 6f 6b  * Grow the apTok
e7b0: 65 6e 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  en array. */.   
e7c0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 2a 61 70         Expr **ap
e7d0: 54 6f 6b 65 6e 4f 6c 64 20 3d 20 61 70 54 6f 6b  TokenOld = apTok
e7e0: 65 6e 3b 20 0a 20 20 20 20 20 20 20 20 20 20 61  en; .          a
e7f0: 70 54 6f 6b 65 6e 20 3d 20 54 68 5f 4d 61 6c 6c  pToken = Th_Mall
e800: 6f 63 28 69 6e 74 65 72 70 2c 20 73 69 7a 65 6f  oc(interp, sizeo
e810: 66 28 45 78 70 72 20 2a 29 2a 28 6e 54 6f 6b 65  f(Expr *)*(nToke
e820: 6e 2b 31 36 29 29 3b 0a 20 20 20 20 20 20 20 20  n+16));.        
e830: 20 20 6d 65 6d 63 70 79 28 61 70 54 6f 6b 65 6e    memcpy(apToken
e840: 2c 20 61 70 54 6f 6b 65 6e 4f 6c 64 2c 20 73 69  , apTokenOld, si
e850: 7a 65 6f 66 28 45 78 70 72 20 2a 29 2a 6e 54 6f  zeof(Expr *)*nTo
e860: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
e870: 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20  .        /* Put 
e880: 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 61 74  the new token at
e890: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
e8a0: 61 70 54 6f 6b 65 6e 20 61 72 72 61 79 20 2a 2f  apToken array */
e8b0: 0a 20 20 20 20 20 20 20 20 61 70 54 6f 6b 65 6e  .        apToken
e8c0: 5b 6e 54 6f 6b 65 6e 5d 20 3d 20 70 4e 65 77 3b  [nToken] = pNew;
e8d0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 2b  .        nToken+
e8e0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
e8f0: 20 20 20 20 20 20 20 20 54 68 5f 46 72 65 65 28          Th_Free(
e900: 69 6e 74 65 72 70 2c 20 70 4e 65 77 29 3b 0a 20  interp, pNew);. 
e910: 20 20 20 20 20 20 20 72 63 20 3d 20 54 48 5f 45         rc = TH_E
e920: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
e930: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 61 70 54    }.  }..  *papT
e940: 6f 6b 65 6e 20 3d 20 61 70 54 6f 6b 65 6e 3b 0a  oken = apToken;.
e950: 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 6e 54 6f    *pnToken = nTo
e960: 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ken;.  return rc
e970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75  ;.}../*.** Evalu
e980: 61 74 65 20 74 68 65 20 73 74 72 69 6e 67 20 28  ate the string (
e990: 7a 45 78 70 72 2c 20 6e 45 78 70 72 29 20 61 73  zExpr, nExpr) as
e9a0: 20 61 20 54 68 20 65 78 70 72 65 73 73 69 6f 6e   a Th expression
e9b0: 2e 20 53 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  . Store.** the r
e9c0: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 69 6e 74  esult in the int
e9d0: 65 72 70 72 65 74 65 72 20 69 6e 74 65 72 70 20  erpreter interp 
e9e0: 61 6e 64 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b  and return TH_OK
e9f0: 20 69 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   if.** successfu
ea00: 6c 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  l. If an error o
ea10: 63 63 75 72 73 2c 20 73 74 6f 72 65 20 61 6e 20  ccurs, store an 
ea20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
ea30: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 70 72 65  .** the interpre
ea40: 74 65 72 20 72 65 73 75 6c 74 20 61 6e 64 20 72  ter result and r
ea50: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
ea60: 6f 64 65 2e 0a 2a 2f 20 0a 69 6e 74 20 54 68 5f  ode..*/ .int Th_
ea70: 45 78 70 72 28 54 68 5f 49 6e 74 65 72 70 20 2a  Expr(Th_Interp *
ea80: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
ea90: 61 72 20 2a 7a 45 78 70 72 2c 20 69 6e 74 20 6e  ar *zExpr, int n
eaa0: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Expr){.  int rc;
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ead0: 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
eae0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
eb10: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 54 6f 6b 65   */..  int nToke
eb20: 6e 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 2a  n = 0;.  Expr **
eb30: 61 70 54 6f 6b 65 6e 20 3d 20 30 3b 0a 0a 20 20  apToken = 0;..  
eb40: 69 66 28 20 6e 45 78 70 72 3c 30 20 29 7b 0a 20  if( nExpr<0 ){. 
eb50: 20 20 20 6e 45 78 70 72 20 3d 20 74 68 5f 73 74     nExpr = th_st
eb60: 72 6c 65 6e 28 7a 45 78 70 72 29 3b 0a 20 20 7d  rlen(zExpr);.  }
eb70: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
eb80: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 61   expression to a
eb90: 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2e   list of tokens.
eba0: 20 2a 2f 0a 20 20 72 63 20 3d 20 65 78 70 72 50   */.  rc = exprP
ebb0: 61 72 73 65 28 69 6e 74 65 72 70 2c 20 7a 45 78  arse(interp, zEx
ebc0: 70 72 2c 20 6e 45 78 70 72 2c 20 26 61 70 54 6f  pr, nExpr, &apTo
ebd0: 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 29 3b 0a 0a  ken, &nToken);..
ebe0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 72 73    /* If the pars
ebf0: 69 6e 67 20 77 61 73 20 73 75 63 63 65 73 73 66  ing was successf
ec00: 75 6c 2c 20 63 72 65 61 74 65 20 61 6e 20 65 78  ul, create an ex
ec10: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
ec20: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 73  om.  ** the pars
ec30: 65 64 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e  ed list of token
ec40: 73 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  s. If successful
ec50: 2c 20 61 70 54 6f 6b 65 6e 5b 30 5d 20 69 73 20  , apToken[0] is 
ec60: 73 65 74 0a 20 20 2a 2a 20 74 6f 20 70 6f 69 6e  set.  ** to poin
ec70: 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  t to the root of
ec80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ec90: 74 72 65 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  tree. .  */.  if
eca0: 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20  ( rc==TH_OK ){. 
ecb0: 20 20 20 72 63 20 3d 20 65 78 70 72 4d 61 6b 65     rc = exprMake
ecc0: 54 72 65 65 28 69 6e 74 65 72 70 2c 20 61 70 54  Tree(interp, apT
ecd0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
ece0: 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 54 48   }..  if( rc!=TH
ecf0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 68 5f 45 72  _OK ){.    Th_Er
ed00: 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 72  rorMessage(inter
ed10: 70 2c 20 22 73 79 6e 74 61 78 20 65 72 72 6f 72  p, "syntax error
ed20: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 3a 20   in expression: 
ed30: 5c 22 22 2c 20 7a 45 78 70 72 2c 20 6e 45 78 70  \"", zExpr, nExp
ed40: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76  r);.  }..  /* Ev
ed50: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
ed60: 73 73 69 6f 6e 20 74 72 65 65 2e 20 2a 2f 0a 20  ssion tree. */. 
ed70: 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29   if( rc==TH_OK )
ed80: 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70 72 45  {.    rc = exprE
ed90: 76 61 6c 28 69 6e 74 65 72 70 2c 20 61 70 54 6f  val(interp, apTo
eda0: 6b 65 6e 5b 30 5d 29 3b 0a 20 20 7d 0a 0a 20 20  ken[0]);.  }..  
edb0: 2f 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 61  /* Free memory a
edc0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70 72  llocated by expr
edd0: 50 61 72 73 65 28 29 2e 20 2a 2f 0a 20 20 66 6f  Parse(). */.  fo
ede0: 72 28 69 3d 30 3b 20 69 3c 6e 54 6f 6b 65 6e 3b  r(i=0; i<nToken;
edf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70 72 46   i++){.    exprF
ee00: 72 65 65 28 69 6e 74 65 72 70 2c 20 61 70 54 6f  ree(interp, apTo
ee10: 6b 65 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54  ken[i]);.  }.  T
ee20: 68 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 61  h_Free(interp, a
ee30: 70 54 6f 6b 65 6e 29 3b 0a 0a 20 20 72 65 74 75  pToken);..  retu
ee40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ee50: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
ee60: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ee70: 20 61 20 6e 65 77 20 68 61 73 68 2d 74 61 62 6c   a new hash-tabl
ee80: 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  e. The caller sh
ee90: 6f 75 6c 64 0a 2a 2a 20 28 65 76 65 6e 74 75 61  ould.** (eventua
eea0: 6c 6c 79 29 20 64 65 6c 65 74 65 20 74 68 65 20  lly) delete the 
eeb0: 68 61 73 68 2d 74 61 62 6c 65 20 62 79 20 70 61  hash-table by pa
eec0: 73 73 69 6e 67 20 69 74 20 74 6f 20 54 68 5f 48  ssing it to Th_H
eed0: 61 73 68 44 65 6c 65 74 65 28 29 2e 0a 2a 2f 0a  ashDelete()..*/.
eee0: 54 68 5f 48 61 73 68 20 2a 54 68 5f 48 61 73 68  Th_Hash *Th_Hash
eef0: 4e 65 77 28 54 68 5f 49 6e 74 65 72 70 20 2a 69  New(Th_Interp *i
ef00: 6e 74 65 72 70 29 7b 0a 20 20 54 68 5f 48 61 73  nterp){.  Th_Has
ef10: 68 20 2a 70 3b 0a 20 20 70 20 3d 20 54 68 5f 4d  h *p;.  p = Th_M
ef20: 61 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20 73 69  alloc(interp, si
ef30: 7a 65 6f 66 28 54 68 5f 48 61 73 68 29 29 3b 0a  zeof(Th_Hash));.
ef40: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
ef50: 2a 0a 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72  *.** Iterate thr
ef60: 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
ef70: 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
ef80: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
ef90: 6c 65 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 74 68  le. Invoke.** th
efa0: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
efb0: 69 6f 6e 20 78 43 61 6c 6c 62 61 63 6b 20 66 6f  ion xCallback fo
efc0: 72 20 65 61 63 68 20 65 6e 74 72 79 2e 20 54 68  r each entry. Th
efd0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
efe0: 74 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 78  t.** passed to x
eff0: 43 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 63 6f  Callback is a co
f000: 70 79 20 6f 66 20 74 68 65 20 66 6f 75 72 74 68  py of the fourth
f010: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
f020: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63   to this.** func
f030: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 54 68  tion..*/.void Th
f040: 5f 48 61 73 68 49 74 65 72 61 74 65 28 0a 20 20  _HashIterate(.  
f050: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  Th_Interp *inter
f060: 70 2c 20 0a 20 20 54 68 5f 48 61 73 68 20 2a 70  p, .  Th_Hash *p
f070: 48 61 73 68 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Hash,.  void (*x
f080: 43 61 6c 6c 62 61 63 6b 29 28 54 68 5f 48 61 73  Callback)(Th_Has
f090: 68 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 2c 20  hEntry *pEntry, 
f0a0: 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 29 2c  void *pContext),
f0b0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
f0c0: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t.){.  int i;.  
f0d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 54 48 5f 48 41  for(i=0; i<TH_HA
f0e0: 53 48 53 49 5a 45 3b 20 69 2b 2b 29 7b 0a 20 20  SHSIZE; i++){.  
f0f0: 20 20 54 68 5f 48 61 73 68 45 6e 74 72 79 20 2a    Th_HashEntry *
f100: 70 45 6e 74 72 79 3b 0a 20 20 20 20 54 68 5f 48  pEntry;.    Th_H
f110: 61 73 68 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b  ashEntry *pNext;
f120: 0a 20 20 20 20 66 6f 72 28 70 45 6e 74 72 79 3d  .    for(pEntry=
f130: 70 48 61 73 68 2d 3e 61 5b 69 5d 3b 20 70 45 6e  pHash->a[i]; pEn
f140: 74 72 79 3b 20 70 45 6e 74 72 79 3d 70 4e 65 78  try; pEntry=pNex
f150: 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
f160: 3d 20 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74 3b  = pEntry->pNext;
f170: 0a 20 20 20 20 20 20 78 43 61 6c 6c 62 61 63 6b  .      xCallback
f180: 28 70 45 6e 74 72 79 2c 20 70 43 6f 6e 74 65 78  (pEntry, pContex
f190: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
f1a0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
f1b0: 6e 63 74 69 6f 6e 20 66 6f 72 20 54 68 5f 48 61  nction for Th_Ha
f1c0: 73 68 44 65 6c 65 74 65 28 29 2e 0a 2a 2f 0a 73  shDelete()..*/.s
f1d0: 74 61 74 69 63 20 76 6f 69 64 20 78 46 72 65 65  tatic void xFree
f1e0: 48 61 73 68 45 6e 74 72 79 28 54 68 5f 48 61 73  HashEntry(Th_Has
f1f0: 68 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 2c 20  hEntry *pEntry, 
f200: 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 29 7b  void *pContext){
f210: 0a 20 20 54 68 5f 46 72 65 65 28 28 54 68 5f 49  .  Th_Free((Th_I
f220: 6e 74 65 72 70 20 2a 29 70 43 6f 6e 74 65 78 74  nterp *)pContext
f230: 2c 20 28 76 6f 69 64 20 2a 29 70 45 6e 74 72 79  , (void *)pEntry
f240: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
f250: 20 61 20 68 61 73 68 2d 74 61 62 6c 65 20 70 72   a hash-table pr
f260: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
f270: 65 64 20 62 79 20 54 68 5f 48 61 73 68 4e 65 77  ed by Th_HashNew
f280: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 54 68 5f 48  ()..*/.void Th_H
f290: 61 73 68 44 65 6c 65 74 65 28 54 68 5f 49 6e 74  ashDelete(Th_Int
f2a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 68 5f  erp *interp, Th_
f2b0: 48 61 73 68 20 2a 70 48 61 73 68 29 7b 0a 20 20  Hash *pHash){.  
f2c0: 69 66 28 20 70 48 61 73 68 20 29 7b 0a 20 20 20  if( pHash ){.   
f2d0: 20 54 68 5f 48 61 73 68 49 74 65 72 61 74 65 28   Th_HashIterate(
f2e0: 69 6e 74 65 72 70 2c 20 70 48 61 73 68 2c 20 78  interp, pHash, x
f2f0: 46 72 65 65 48 61 73 68 45 6e 74 72 79 2c 20 28  FreeHashEntry, (
f300: 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a  void *)interp);.
f310: 20 20 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65      Th_Free(inte
f320: 72 70 2c 20 70 48 61 73 68 29 3b 0a 20 20 7d 0a  rp, pHash);.  }.
f330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
f340: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
f350: 6f 20 69 6e 73 65 72 74 20 6f 72 20 64 65 6c 65  o insert or dele
f360: 74 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 74  te hash table it
f370: 65 6d 73 2c 20 6f 72 20 74 6f 20 0a 2a 2a 20 71  ems, or to .** q
f380: 75 65 72 79 20 61 20 68 61 73 68 20 74 61 62 6c  uery a hash tabl
f390: 65 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  e for an existin
f3a0: 67 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  g item..**.** If
f3b0: 20 70 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73   parameter op is
f3c0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
f3d0: 20 74 68 65 6e 20 74 68 65 20 68 61 73 68 2d 74   then the hash-t
f3e0: 61 62 6c 65 20 65 6c 65 6d 65 6e 74 20 0a 2a 2a  able element .**
f3f0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 28   identified by (
f400: 7a 4b 65 79 2c 20 6e 4b 65 79 29 20 69 73 20 72  zKey, nKey) is r
f410: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
f420: 68 61 73 68 2d 74 61 62 6c 65 20 69 66 20 69 74  hash-table if it
f430: 0a 2a 2a 20 65 78 69 73 74 73 2e 20 4e 55 4c 4c  .** exists. NULL
f440: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
f450: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
f460: 66 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  f the hash-table
f470: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 74 65   contains an ite
f480: 6d 20 77 69 74 68 20 6b 65 79 20 28 7a 4b 65 79  m with key (zKey
f490: 2c 20 6e 4b 65 79 29 2c 0a 2a 2a 20 61 20 70 6f  , nKey),.** a po
f4a0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 73 73  inter to the ass
f4b0: 6f 63 69 61 74 65 64 20 54 68 5f 48 61 73 68 45  ociated Th_HashE
f4c0: 6e 74 72 79 20 69 73 20 72 65 74 75 72 6e 65 64  ntry is returned
f4d0: 2e 20 49 66 20 70 61 72 61 6d 65 74 65 72 0a 2a  . If parameter.*
f4e0: 2a 20 6f 70 20 69 73 20 67 72 65 61 74 65 72 20  * op is greater 
f4f0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
f500: 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 61  a new entry is a
f510: 64 64 65 64 20 69 66 20 6f 6e 65 20 63 61 6e 6e  dded if one cann
f520: 6f 74 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 2e 20  ot.** be found. 
f530: 49 66 20 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74  If op is zero, t
f540: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  hen NULL is retu
f550: 72 6e 65 64 20 69 66 20 74 68 65 20 69 74 65 6d  rned if the item
f560: 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 6c 72 65 61   is.** not alrea
f570: 64 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  dy present in th
f580: 65 20 68 61 73 68 2d 74 61 62 6c 65 2e 0a 2a 2f  e hash-table..*/
f590: 0a 54 68 5f 48 61 73 68 45 6e 74 72 79 20 2a 54  .Th_HashEntry *T
f5a0: 68 5f 48 61 73 68 46 69 6e 64 28 0a 20 20 54 68  h_HashFind(.  Th
f5b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
f5c0: 20 0a 20 20 54 68 5f 48 61 73 68 20 2a 70 48 61   .  Th_Hash *pHa
f5d0: 73 68 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  sh,.  const char
f5e0: 20 2a 7a 4b 65 79 2c 0a 20 20 69 6e 74 20 6e 4b   *zKey,.  int nK
f5f0: 65 79 2c 0a 20 20 69 6e 74 20 6f 70 20 20 20 20  ey,.  int op    
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 2f 2a 20 2d 76 65 20 3d 20 64 65 6c 65 74    /* -ve = delet
f620: 65 2c 20 30 20 3d 20 66 69 6e 64 2c 20 2b 76 65  e, 0 = find, +ve
f630: 20 3d 20 69 6e 73 65 72 74 20 2a 2f 0a 29 7b 0a   = insert */.){.
f640: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
f650: 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Key = 0;.  int i
f660: 3b 0a 20 20 54 68 5f 48 61 73 68 45 6e 74 72 79  ;.  Th_HashEntry
f670: 20 2a 70 52 65 74 3b 0a 20 20 54 68 5f 48 61 73   *pRet;.  Th_Has
f680: 68 45 6e 74 72 79 20 2a 2a 70 70 52 65 74 3b 0a  hEntry **ppRet;.
f690: 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30 20 29 7b  .  if( nKey<0 ){
f6a0: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 74 68 5f 73  .    nKey = th_s
f6b0: 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 7d  trlen(zKey);.  }
f6c0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
f6d0: 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Key; i++){.    i
f6e0: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 33 29 20  Key = (iKey<<3) 
f6f0: 5e 20 69 4b 65 79 20 5e 20 7a 4b 65 79 5b 69 5d  ^ iKey ^ zKey[i]
f700: 3b 0a 20 20 7d 0a 20 20 69 4b 65 79 20 3d 20 69  ;.  }.  iKey = i
f710: 4b 65 79 20 25 20 54 48 5f 48 41 53 48 53 49 5a  Key % TH_HASHSIZ
f720: 45 3b 0a 0a 20 20 66 6f 72 28 70 70 52 65 74 3d  E;..  for(ppRet=
f730: 26 70 48 61 73 68 2d 3e 61 5b 69 4b 65 79 5d 3b  &pHash->a[iKey];
f740: 20 28 70 52 65 74 3d 2a 70 70 52 65 74 29 3b 20   (pRet=*ppRet); 
f750: 70 70 52 65 74 3d 26 70 52 65 74 2d 3e 70 4e 65  ppRet=&pRet->pNe
f760: 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  xt){.    assert(
f770: 20 70 52 65 74 20 26 26 20 70 70 52 65 74 20 26   pRet && ppRet &
f780: 26 20 2a 70 70 52 65 74 3d 3d 70 52 65 74 20 29  & *ppRet==pRet )
f790: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e  ;.    if( pRet->
f7a0: 6e 4b 65 79 3d 3d 6e 4b 65 79 20 26 26 20 30 3d  nKey==nKey && 0=
f7b0: 3d 6d 65 6d 63 6d 70 28 70 52 65 74 2d 3e 7a 4b  =memcmp(pRet->zK
f7c0: 65 79 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 20  ey, zKey, nKey) 
f7d0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
f7e0: 69 66 28 20 6f 70 3c 30 20 26 26 20 70 52 65 74  if( op<0 && pRet
f7f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f800: 70 70 52 65 74 20 26 26 20 2a 70 70 52 65 74 3d  ppRet && *ppRet=
f810: 3d 70 52 65 74 20 29 3b 0a 20 20 20 20 2a 70 70  =pRet );.    *pp
f820: 52 65 74 20 3d 20 70 52 65 74 2d 3e 70 4e 65 78  Ret = pRet->pNex
f830: 74 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69  t;.    Th_Free(i
f840: 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
f850: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
f860: 0a 20 20 69 66 28 20 6f 70 3e 30 20 26 26 20 21  .  if( op>0 && !
f870: 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74  pRet ){.    pRet
f880: 20 3d 20 28 54 68 5f 48 61 73 68 45 6e 74 72 79   = (Th_HashEntry
f890: 20 2a 29 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74   *)Th_Malloc(int
f8a0: 65 72 70 2c 20 73 69 7a 65 6f 66 28 54 68 5f 48  erp, sizeof(Th_H
f8b0: 61 73 68 45 6e 74 72 79 29 20 2b 20 6e 4b 65 79  ashEntry) + nKey
f8c0: 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e 7a 4b 65  );.    pRet->zKe
f8d0: 79 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 65  y = (char *)&pRe
f8e0: 74 5b 31 5d 3b 0a 20 20 20 20 70 52 65 74 2d 3e  t[1];.    pRet->
f8f0: 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  nKey = nKey;.   
f900: 20 6d 65 6d 63 70 79 28 70 52 65 74 2d 3e 7a 4b   memcpy(pRet->zK
f910: 65 79 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b  ey, zKey, nKey);
f920: 0a 20 20 20 20 70 52 65 74 2d 3e 70 4e 65 78 74  .    pRet->pNext
f930: 20 3d 20 70 48 61 73 68 2d 3e 61 5b 69 4b 65 79   = pHash->a[iKey
f940: 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e 61 5b  ];.    pHash->a[
f950: 69 4b 65 79 5d 20 3d 20 70 52 65 74 3b 0a 20 20  iKey] = pRet;.  
f960: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
f970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f980: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
f990: 73 61 6d 65 20 61 73 20 74 68 65 20 73 74 61 6e  same as the stan
f9a0: 64 61 72 64 20 73 74 72 6c 65 6e 28 29 20 66 75  dard strlen() fu
f9b0: 6e 63 74 69 6f 6e 2c 20 65 78 63 65 70 74 0a 2a  nction, except.*
f9c0: 2a 20 74 68 61 74 20 69 74 20 72 65 74 75 72 6e  * that it return
f9d0: 73 20 30 20 28 69 6e 73 74 65 61 64 20 6f 66 20  s 0 (instead of 
f9e0: 62 65 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 29  being undefined)
f9f0: 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
fa00: 20 69 73 0a 2a 2a 20 61 20 6e 75 6c 6c 20 70 6f   is.** a null po
fa10: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 74 68  inter..*/.int th
fa20: 5f 73 74 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  _strlen(const ch
fa30: 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 69 6e 74  ar *zStr){.  int
fa40: 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 53   n = 0;.  if( zS
fa50: 74 72 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  tr ){.    while(
fa60: 20 7a 53 74 72 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a   zStr[n] ) n++;.
fa70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
fa80: 7d 0a 0a 2f 2a 20 57 68 69 74 65 73 70 61 63 65  }../* Whitespace
fa90: 20 63 68 61 72 61 63 74 65 72 73 3a 0a 2a 2a 0a   characters:.**.
faa0: 2a 2a 20 20 20 20 20 27 20 27 20 20 20 20 30 78  **     ' '    0x
fab0: 32 30 0a 2a 2a 20 20 20 20 20 27 5c 74 27 20 20  20.**     '\t'  
fac0: 20 30 78 30 39 0a 2a 2a 20 20 20 20 20 27 5c 6e   0x09.**     '\n
fad0: 27 20 20 20 30 78 30 41 0a 2a 2a 20 20 20 20 20  '   0x0A.**     
fae0: 27 5c 76 27 20 20 20 30 78 30 42 0a 2a 2a 20 20  '\v'   0x0B.**  
faf0: 20 20 20 27 5c 66 27 20 20 20 30 78 30 43 0a 2a     '\f'   0x0C.*
fb00: 2a 20 20 20 20 20 27 5c 72 27 20 20 20 30 78 30  *     '\r'   0x0
fb10: 44 0a 2a 2a 0a 2a 2a 20 57 68 69 74 65 73 70 61  D.**.** Whitespa
fb20: 63 65 20 63 68 61 72 61 63 74 65 72 73 20 68 61  ce characters ha
fb30: 76 65 20 74 68 65 20 30 78 30 31 20 66 6c 61 67  ve the 0x01 flag
fb40: 20 73 65 74 2e 20 44 65 63 69 6d 61 6c 20 64 69   set. Decimal di
fb50: 67 69 74 73 20 68 61 76 65 20 74 68 65 0a 2a 2a  gits have the.**
fb60: 20 30 78 32 20 66 6c 61 67 20 73 65 74 2e 20 53   0x2 flag set. S
fb70: 69 6e 67 6c 65 20 62 79 74 65 20 70 72 69 6e 74  ingle byte print
fb80: 61 62 6c 65 20 63 68 61 72 61 63 74 65 72 73 20  able characters 
fb90: 68 61 76 65 20 74 68 65 20 30 78 34 20 66 6c 61  have the 0x4 fla
fba0: 67 20 73 65 74 2e 0a 2a 2a 20 41 6c 70 68 61 62  g set..** Alphab
fbb0: 65 74 20 63 68 61 72 61 63 74 65 72 73 20 68 61  et characters ha
fbc0: 76 65 20 74 68 65 20 30 78 38 20 62 69 74 20 73  ve the 0x8 bit s
fbd0: 65 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  et. .**.** The s
fbe0: 70 65 63 69 61 6c 20 6c 69 73 74 20 63 68 61 72  pecial list char
fbf0: 61 63 74 65 72 73 20 68 61 76 65 20 74 68 65 20  acters have the 
fc00: 30 78 31 30 20 66 6c 61 67 20 73 65 74 0a 2a 2a  0x10 flag set.**
fc10: 0a 2a 2a 20 20 20 20 7b 20 7d 20 5b 20 5d 20 5c  .**    { } [ ] \
fc20: 20 3b 20 27 20 22 0a 2a 2a 0a 2a 2a 20 20 20 20   ; ' ".**.**    
fc30: 22 20 30 78 32 32 0a 2a 2a 0a 2a 2f 0a 73 74 61  " 0x22.**.*/.sta
fc40: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
fc50: 72 20 61 43 68 61 72 50 72 6f 70 5b 32 35 36 5d  r aCharProp[256]
fc60: 20 3d 20 7b 0a 20 20 30 2c 20 20 30 2c 20 20 30   = {.  0,  0,  0
fc70: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
fc80: 2c 20 20 30 2c 20 20 20 20 20 30 2c 20 20 31 2c  ,  0,     0,  1,
fc90: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
fca0: 20 20 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78    0,  0,   /* 0x
fcb0: 30 2e 20 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20  0. */.  0,  0,  
fcc0: 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  1,  1,  0,  0,  
fcd0: 30 2c 20 20 30 2c 20 20 20 20 20 30 2c 20 20 30  0,  0,     0,  0
fce0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
fcf0: 2c 20 20 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30  ,  0,  0,   /* 0
fd00: 78 31 2e 20 2a 2f 0a 20 20 35 2c 20 20 34 2c 20  x1. */.  5,  4, 
fd10: 32 30 2c 20 20 34 2c 20 20 34 2c 20 20 34 2c 20  20,  4,  4,  4, 
fd20: 20 34 2c 20 20 34 2c 20 20 20 20 20 34 2c 20 20   4,  4,     4,  
fd30: 34 2c 20 20 34 2c 20 20 34 2c 20 20 34 2c 20 20  4,  4,  4,  4,  
fd40: 34 2c 20 20 34 2c 20 20 34 2c 20 20 20 2f 2a 20  4,  4,  4,   /* 
fd50: 30 78 32 2e 20 2a 2f 0a 20 20 36 2c 20 20 36 2c  0x2. */.  6,  6,
fd60: 20 20 36 2c 20 20 36 2c 20 20 36 2c 20 20 36 2c    6,  6,  6,  6,
fd70: 20 20 36 2c 20 20 36 2c 20 20 20 20 20 36 2c 20    6,  6,     6, 
fd80: 20 36 2c 20 20 34 2c 20 32 30 2c 20 20 34 2c 20   6,  4, 20,  4, 
fd90: 20 34 2c 20 20 34 2c 20 20 34 2c 20 20 20 2f 2a   4,  4,  4,   /*
fda0: 20 30 78 33 2e 20 2a 2f 0a 20 20 34 2c 20 31 32   0x3. */.  4, 12
fdb0: 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32  , 12, 12, 12, 12
fdc0: 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31 32 2c  , 12, 12,    12,
fdd0: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c   12, 12, 12, 12,
fde0: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 2f   12, 12, 12,   /
fdf0: 2a 20 30 78 34 2e 20 2a 2f 0a 20 31 32 2c 20 31  * 0x4. */. 12, 1
fe00: 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31  2, 12, 12, 12, 1
fe10: 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31 32  2, 12, 12,    12
fe20: 2c 20 31 32 2c 20 31 32 2c 20 32 30 2c 20 32 30  , 12, 12, 20, 20
fe30: 2c 20 32 30 2c 20 20 34 2c 20 20 34 2c 20 20 20  , 20,  4,  4,   
fe40: 2f 2a 20 30 78 35 2e 20 2a 2f 0a 20 20 34 2c 20  /* 0x5. */.  4, 
fe50: 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20  12, 12, 12, 12, 
fe60: 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31  12, 12, 12,    1
fe70: 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31  2, 12, 12, 12, 1
fe80: 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 20  2, 12, 12, 12,  
fe90: 20 2f 2a 20 30 78 36 2e 20 2a 2f 0a 20 31 32 2c   /* 0x6. */. 12,
fea0: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c   12, 12, 12, 12,
feb0: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 20   12, 12, 12,    
fec0: 31 32 2c 20 31 32 2c 20 31 32 2c 20 32 30 2c 20  12, 12, 12, 20, 
fed0: 20 34 2c 20 32 30 2c 20 20 34 2c 20 20 34 2c 20   4, 20,  4,  4, 
fee0: 20 20 2f 2a 20 30 78 37 2e 20 2a 2f 0a 0a 20 20    /* 0x7. */..  
fef0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
ff00: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
ff10: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
ff20: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
ff30: 2c 20 20 20 2f 2a 20 30 78 38 2e 20 2a 2f 0a 20  ,   /* 0x8. */. 
ff40: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
ff50: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
ff60: 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20      0,  0,  0,  
ff70: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
ff80: 30 2c 20 20 20 2f 2a 20 30 78 39 2e 20 2a 2f 0a  0,   /* 0x9. */.
ff90: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ffa0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ffb0: 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20       0,  0,  0, 
ffc0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
ffd0: 20 30 2c 20 20 20 2f 2a 20 30 78 41 2e 20 2a 2f   0,   /* 0xA. */
ffe0: 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  .  0,  0,  0,  0
fff0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
10000 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c  ,     0,  0,  0,
10010 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
10020 20 20 30 2c 20 20 20 2f 2a 20 30 78 42 2e 20 2a    0,   /* 0xB. *
10030 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /.  0,  0,  0,  
10040 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
10050 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30  0,     0,  0,  0
10060 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
10070 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 43 2e 20  ,  0,   /* 0xC. 
10080 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */.  0,  0,  0, 
10090 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
100a0 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20   0,     0,  0,  
100b0 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
100c0 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 44 2e  0,  0,   /* 0xD.
100d0 20 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c   */.  0,  0,  0,
100e0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
100f0 20 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20    0,     0,  0, 
10100 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
10110 20 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 45   0,  0,   /* 0xE
10120 2e 20 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30  . */.  0,  0,  0
10130 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
10140 2c 20 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c  ,  0,     0,  0,
10150 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
10160 20 20 30 2c 20 20 30 20 20 20 20 2f 2a 20 30 78    0,  0    /* 0x
10170 46 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  F. */.};../*.** 
10180 43 6c 6f 6e 65 20 6f 66 20 74 68 65 20 73 74 61  Clone of the sta
10190 6e 64 61 72 64 20 69 73 73 70 61 63 65 28 29 20  ndard isspace() 
101a0 61 6e 64 20 69 73 64 69 67 69 74 20 66 75 6e 63  and isdigit func
101b0 74 69 6f 6e 2f 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  tion/macros..*/.
101c0 69 6e 74 20 74 68 5f 69 73 73 70 61 63 65 28 63  int th_isspace(c
101d0 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75 72 6e  har c){.  return
101e0 20 28 61 43 68 61 72 50 72 6f 70 5b 28 75 6e 73   (aCharProp[(uns
101f0 69 67 6e 65 64 20 63 68 61 72 29 63 5d 20 26 20  igned char)c] & 
10200 30 78 30 31 29 3b 0a 7d 0a 69 6e 74 20 74 68 5f  0x01);.}.int th_
10210 69 73 64 69 67 69 74 28 63 68 61 72 20 63 29 7b  isdigit(char c){
10220 0a 20 20 72 65 74 75 72 6e 20 28 61 43 68 61 72  .  return (aChar
10230 50 72 6f 70 5b 28 75 6e 73 69 67 6e 65 64 20 63  Prop[(unsigned c
10240 68 61 72 29 63 5d 20 26 20 30 78 30 32 29 3b 0a  har)c] & 0x02);.
10250 7d 0a 69 6e 74 20 74 68 5f 69 73 73 70 65 63 69  }.int th_isspeci
10260 61 6c 28 63 68 61 72 20 63 29 7b 0a 20 20 72 65  al(char c){.  re
10270 74 75 72 6e 20 28 61 43 68 61 72 50 72 6f 70 5b  turn (aCharProp[
10280 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 63  (unsigned char)c
10290 5d 20 26 20 30 78 31 31 29 3b 0a 7d 0a 69 6e 74  ] & 0x11);.}.int
102a0 20 74 68 5f 69 73 61 6c 6e 75 6d 28 63 68 61 72   th_isalnum(char
102b0 20 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61   c){.  return (a
102c0 43 68 61 72 50 72 6f 70 5b 28 75 6e 73 69 67 6e  CharProp[(unsign
102d0 65 64 20 63 68 61 72 29 63 5d 20 26 20 30 78 30  ed char)c] & 0x0
102e0 41 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4c  A);.}..#ifndef L
102f0 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 0a 23  ONGDOUBLE_TYPE.#
10300 20 64 65 66 69 6e 65 20 4c 4f 4e 47 44 4f 55 42   define LONGDOUB
10310 4c 45 5f 54 59 50 45 20 6c 6f 6e 67 20 64 6f 75  LE_TYPE long dou
10320 62 6c 65 0a 23 65 6e 64 69 66 0a 74 79 70 65 64  ble.#endif.typed
10330 65 66 20 63 68 61 72 20 75 38 3b 0a 0a 0a 2f 2a  ef char u8;.../*
10340 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10350 69 66 20 7a 20 69 73 20 61 20 70 75 72 65 20 6e  if z is a pure n
10360 75 6d 65 72 69 63 20 73 74 72 69 6e 67 2e 20 20  umeric string.  
10370 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
10380 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f  the.** string co
10390 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61  ntains any chara
103a0 63 74 65 72 20 77 68 69 63 68 20 69 73 20 6e 6f  cter which is no
103b0 74 20 70 61 72 74 20 6f 66 20 61 20 6e 75 6d 62  t part of a numb
103c0 65 72 2e 20 49 66 0a 2a 2a 20 74 68 65 20 73 74  er. If.** the st
103d0 72 69 6e 67 20 69 73 20 6e 75 6d 65 72 69 63 20  ring is numeric 
103e0 61 6e 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  and contains the
103f0 20 27 2e 27 20 63 68 61 72 61 63 74 65 72 2c 20   '.' character, 
10400 73 65 74 20 2a 72 65 61 6c 6e 75 6d 0a 2a 2a 20  set *realnum.** 
10410 74 6f 20 54 52 55 45 20 28 6f 74 68 65 72 77 69  to TRUE (otherwi
10420 73 65 20 46 41 4c 53 45 29 2e 0a 2a 2a 0a 2a 2a  se FALSE)..**.**
10430 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   An empty string
10440 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6e   is considered n
10450 6f 6e 2d 6e 75 6d 65 72 69 63 2e 0a 2a 2f 0a 73  on-numeric..*/.s
10460 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
10470 33 49 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20  3IsNumber(const 
10480 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65  char *z, int *re
10490 61 6c 6e 75 6d 29 7b 0a 20 20 69 6e 74 20 69 6e  alnum){.  int in
104a0 63 72 20 3d 20 31 3b 0a 20 20 69 66 28 20 2a 7a  cr = 1;.  if( *z
104b0 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27  =='-' || *z=='+'
104c0 20 29 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20   ) z += incr;.  
104d0 69 66 28 20 21 74 68 5f 69 73 64 69 67 69 74 28  if( !th_isdigit(
104e0 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20 20  *(u8*)z) ){.    
104f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10500 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 69 66 28  z += incr;.  if(
10510 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
10520 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  num = 0;.  while
10530 28 20 74 68 5f 69 73 64 69 67 69 74 28 2a 28 75  ( th_isdigit(*(u
10540 38 2a 29 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e  8*)z) ){ z += in
10550 63 72 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d  cr; }.  if( *z==
10560 27 2e 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  '.' ){.    z += 
10570 69 6e 63 72 3b 0a 20 20 20 20 69 66 28 20 21 74  incr;.    if( !t
10580 68 5f 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29  h_isdigit(*(u8*)
10590 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
105a0 20 20 20 77 68 69 6c 65 28 20 74 68 5f 69 73 64     while( th_isd
105b0 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b  igit(*(u8*)z) ){
105c0 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20 20   z += incr; }.  
105d0 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
105e0 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20  *realnum = 1;.  
105f0 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20  }.  if( *z=='e' 
10600 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20  || *z=='E' ){.  
10610 20 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 20    z += incr;.   
10620 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20   if( *z=='+' || 
10630 2a 7a 3d 3d 27 2d 27 20 29 20 7a 20 2b 3d 20 69  *z=='-' ) z += i
10640 6e 63 72 3b 0a 20 20 20 20 69 66 28 20 21 74 68  ncr;.    if( !th
10650 5f 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a  _isdigit(*(u8*)z
10660 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
10670 20 20 77 68 69 6c 65 28 20 74 68 5f 69 73 64 69    while( th_isdi
10680 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b 20  git(*(u8*)z) ){ 
10690 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20 20 20  z += incr; }.   
106a0 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
106b0 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d  realnum = 1;.  }
106c0 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b  .  return *z==0;
106d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
106e0 72 69 6e 67 20 7a 5b 5d 20 69 73 20 61 6e 20 61  ring z[] is an a
106f0 73 63 69 69 20 72 65 70 72 65 73 65 6e 74 61 74  scii representat
10700 69 6f 6e 20 6f 66 20 61 20 72 65 61 6c 20 6e 75  ion of a real nu
10710 6d 62 65 72 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74  mber..** Convert
10720 20 74 68 69 73 20 73 74 72 69 6e 67 20 74 6f 20   this string to 
10730 61 20 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  a double..**.** 
10740 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
10750 75 6d 65 73 20 74 68 61 74 20 7a 5b 5d 20 72 65  umes that z[] re
10760 61 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64 20  ally is a valid 
10770 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 0a 2a  number.  If it.*
10780 2a 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 72 65  * is not, the re
10790 73 75 6c 74 20 69 73 20 75 6e 64 65 66 69 6e 65  sult is undefine
107a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
107b0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e  utine is used in
107c0 73 74 65 61 64 20 6f 66 20 74 68 65 20 6c 69 62  stead of the lib
107d0 72 61 72 79 20 61 74 6f 66 28 29 20 66 75 6e 63  rary atof() func
107e0 74 69 6f 6e 20 62 65 63 61 75 73 65 0a 2a 2a 20  tion because.** 
107f0 74 68 65 20 6c 69 62 72 61 72 79 20 61 74 6f 66  the library atof
10800 28 29 20 6d 69 67 68 74 20 77 61 6e 74 20 74 6f  () might want to
10810 20 75 73 65 20 22 2c 22 20 61 73 20 74 68 65 20   use "," as the 
10820 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 69 6e  decimal point in
10830 73 74 65 61 64 0a 2a 2a 20 6f 66 20 22 2e 22 20  stead.** of "." 
10840 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77  depending on how
10850 20 6c 6f 63 61 6c 65 20 69 73 20 73 65 74 2e 20   locale is set. 
10860 20 42 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   But that would 
10870 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 0a 2a  cause problems.*
10880 2a 20 66 6f 72 20 53 51 4c 2e 20 20 53 6f 20 74  * for SQL.  So t
10890 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
108a0 79 73 20 75 73 65 73 20 22 2e 22 20 72 65 67 61  ys uses "." rega
108b0 72 64 6c 65 73 73 20 6f 66 20 6c 6f 63 61 6c 65  rdless of locale
108c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108d0 73 71 6c 69 74 65 33 41 74 6f 46 28 63 6f 6e 73  sqlite3AtoF(cons
108e0 74 20 63 68 61 72 20 2a 7a 2c 20 64 6f 75 62 6c  t char *z, doubl
108f0 65 20 2a 70 52 65 73 75 6c 74 29 7b 0a 20 20 69  e *pResult){.  i
10900 6e 74 20 73 69 67 6e 20 3d 20 31 3b 0a 20 20 63  nt sign = 1;.  c
10910 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
10920 6e 20 3d 20 7a 3b 0a 20 20 4c 4f 4e 47 44 4f 55  n = z;.  LONGDOU
10930 42 4c 45 5f 54 59 50 45 20 76 31 20 3d 20 30 2e  BLE_TYPE v1 = 0.
10940 30 3b 0a 20 20 77 68 69 6c 65 28 20 74 68 5f 69  0;.  while( th_i
10950 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20  sspace(*(u8*)z) 
10960 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 2a 7a 3d  ) z++;.  if( *z=
10970 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73 69 67 6e  ='-' ){.    sign
10980 20 3d 20 2d 31 3b 0a 20 20 20 20 7a 2b 2b 3b 0a   = -1;.    z++;.
10990 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 3d 3d    }else if( *z==
109a0 27 2b 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a  '+' ){.    z++;.
109b0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 74 68 5f    }.  while( th_
109c0 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29  isdigit(*(u8*)z)
109d0 20 29 7b 0a 20 20 20 20 76 31 20 3d 20 76 31 2a   ){.    v1 = v1*
109e0 31 30 2e 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27  10.0 + (*z - '0'
109f0 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a  );.    z++;.  }.
10a00 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
10a10 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
10a20 54 59 50 45 20 64 69 76 69 73 6f 72 20 3d 20 31  TYPE divisor = 1
10a30 2e 30 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  .0;.    z++;.   
10a40 20 77 68 69 6c 65 28 20 74 68 5f 69 73 64 69 67   while( th_isdig
10a50 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20  it(*(u8*)z) ){. 
10a60 20 20 20 20 20 76 31 20 3d 20 76 31 2a 31 30 2e       v1 = v1*10.
10a70 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a  0 + (*z - '0');.
10a80 20 20 20 20 20 20 64 69 76 69 73 6f 72 20 2a 3d        divisor *=
10a90 20 31 30 2e 30 3b 0a 20 20 20 20 20 20 7a 2b 2b   10.0;.      z++
10aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 31 20 2f  ;.    }.    v1 /
10ab0 3d 20 64 69 76 69 73 6f 72 3b 0a 20 20 7d 0a 20  = divisor;.  }. 
10ac0 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
10ad0 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 69  *z=='E' ){.    i
10ae0 6e 74 20 65 73 69 67 6e 20 3d 20 31 3b 0a 20 20  nt esign = 1;.  
10af0 20 20 69 6e 74 20 65 76 61 6c 20 3d 20 30 3b 0a    int eval = 0;.
10b00 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54      LONGDOUBLE_T
10b10 59 50 45 20 73 63 61 6c 65 20 3d 20 31 2e 30 3b  YPE scale = 1.0;
10b20 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
10b30 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ( *z=='-' ){.   
10b40 20 20 20 65 73 69 67 6e 20 3d 20 2d 31 3b 0a 20     esign = -1;. 
10b50 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65       z++;.    }e
10b60 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20  lse if( *z=='+' 
10b70 29 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  ){.      z++;.  
10b80 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 74    }.    while( t
10b90 68 5f 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29  h_isdigit(*(u8*)
10ba0 7a 29 20 29 7b 0a 20 20 20 20 20 20 65 76 61 6c  z) ){.      eval
10bb0 20 3d 20 65 76 61 6c 2a 31 30 20 2b 20 2a 7a 20   = eval*10 + *z 
10bc0 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b  - '0';.      z++
10bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
10be0 65 28 20 65 76 61 6c 3e 3d 36 34 20 29 7b 20 73  e( eval>=64 ){ s
10bf0 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 36 34 3b  cale *= 1.0e+64;
10c00 20 65 76 61 6c 20 2d 3d 20 36 34 3b 20 7d 0a 20   eval -= 64; }. 
10c10 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d     while( eval>=
10c20 31 36 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31  16 ){ scale *= 1
10c30 2e 30 65 2b 31 36 3b 20 65 76 61 6c 20 2d 3d 20  .0e+16; eval -= 
10c40 31 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28  16; }.    while(
10c50 20 65 76 61 6c 3e 3d 34 20 29 7b 20 73 63 61 6c   eval>=4 ){ scal
10c60 65 20 2a 3d 20 31 2e 30 65 2b 34 3b 20 65 76 61  e *= 1.0e+4; eva
10c70 6c 20 2d 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68  l -= 4; }.    wh
10c80 69 6c 65 28 20 65 76 61 6c 3e 3d 31 20 29 7b 20  ile( eval>=1 ){ 
10c90 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 3b  scale *= 1.0e+1;
10ca0 20 65 76 61 6c 20 2d 3d 20 31 3b 20 7d 0a 20 20   eval -= 1; }.  
10cb0 20 20 69 66 28 20 65 73 69 67 6e 3c 30 20 29 7b    if( esign<0 ){
10cc0 0a 20 20 20 20 20 20 76 31 20 2f 3d 20 73 63 61  .      v1 /= sca
10cd0 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  le;.    }else{. 
10ce0 20 20 20 20 20 76 31 20 2a 3d 20 73 63 61 6c 65       v1 *= scale
10cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
10d00 52 65 73 75 6c 74 20 3d 20 73 69 67 6e 3c 30 20  Result = sign<0 
10d10 3f 20 2d 76 31 20 3a 20 76 31 3b 0a 20 20 72 65  ? -v1 : v1;.  re
10d20 74 75 72 6e 20 7a 20 2d 20 7a 42 65 67 69 6e 3b  turn z - zBegin;
10d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
10d40 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72   convert the str
10d50 69 6e 67 20 70 61 73 73 65 64 20 61 73 20 61 72  ing passed as ar
10d60 67 75 6d 65 6e 74 73 20 28 7a 2c 20 6e 29 20 74  guments (z, n) t
10d70 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  o an integer..**
10d80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
10d90 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
10da0 20 69 6e 20 2a 70 69 4f 75 74 20 61 6e 64 20 72   in *piOut and r
10db0 65 74 75 72 6e 20 54 48 5f 4f 4b 2e 20 0a 2a 2a  eturn TH_OK. .**
10dc0 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
10dd0 67 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76  g cannot be conv
10de0 65 72 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  erted to an inte
10df0 67 65 72 2c 20 72 65 74 75 72 6e 20 54 48 5f 45  ger, return TH_E
10e00 52 52 4f 52 2e 20 0a 2a 2a 20 49 66 20 74 68 65  RROR. .** If the
10e10 20 69 6e 74 65 72 70 20 61 72 67 75 6d 65 6e 74   interp argument
10e20 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6c 65   is not NULL, le
10e30 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
10e40 73 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  sage in the .** 
10e50 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75  interpreter resu
10e60 6c 74 20 74 6f 6f 2e 0a 2a 2f 0a 69 6e 74 20 54  lt too..*/.int T
10e70 68 5f 54 6f 49 6e 74 28 54 68 5f 49 6e 74 65 72  h_ToInt(Th_Inter
10e80 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
10e90 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
10ea0 20 69 6e 74 20 2a 70 69 4f 75 74 29 7b 0a 20 20   int *piOut){.  
10eb0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
10ec0 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66   iOut = 0;..  if
10ed0 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ( n<0 ){.    n =
10ee0 20 74 68 5f 73 74 72 6c 65 6e 28 7a 29 3b 0a 20   th_strlen(z);. 
10ef0 20 7d 0a 0a 20 20 69 66 28 20 6e 3e 30 20 26 26   }..  if( n>0 &&
10f00 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a   (z[0]=='-' || z
10f10 5b 30 5d 3d 3d 27 2b 27 29 20 29 7b 0a 20 20 20  [0]=='+') ){.   
10f20 20 69 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f   i = 1;.  }.  fo
10f30 72 28 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  r(; i<n; i++){. 
10f40 20 20 20 69 66 28 20 21 74 68 5f 69 73 64 69 67     if( !th_isdig
10f50 69 74 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  it(z[i]) ){.    
10f60 20 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67    Th_ErrorMessag
10f70 65 28 69 6e 74 65 72 70 2c 20 22 65 78 70 65 63  e(interp, "expec
10f80 74 65 64 20 69 6e 74 65 67 65 72 2c 20 67 6f 74  ted integer, got
10f90 3a 20 5c 22 22 2c 20 7a 2c 20 6e 29 3b 0a 20 20  : \"", z, n);.  
10fa0 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f 45 52      return TH_ER
10fb0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
10fc0 4f 75 74 20 3d 20 69 4f 75 74 20 2a 20 31 30 20  Out = iOut * 10 
10fd0 2b 20 28 7a 5b 69 5d 20 2d 20 34 38 29 3b 0a 20  + (z[i] - 48);. 
10fe0 20 7d 0a 0a 20 20 69 66 28 20 6e 3e 30 20 26 26   }..  if( n>0 &&
10ff0 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
11000 20 20 69 4f 75 74 20 2a 3d 20 2d 31 3b 0a 20 20    iOut *= -1;.  
11010 7d 0a 0a 20 20 2a 70 69 4f 75 74 20 3d 20 69 4f  }..  *piOut = iO
11020 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 54 48 5f  ut;.  return TH_
11030 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  OK;.}../*.** Try
11040 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
11050 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 61 73  string passed as
11060 20 61 72 67 75 6d 65 6e 74 73 20 28 7a 2c 20 6e   arguments (z, n
11070 29 20 74 6f 20 61 20 64 6f 75 62 6c 65 2e 0a 2a  ) to a double..*
11080 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11090 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
110a0 74 20 69 6e 20 2a 70 66 4f 75 74 20 61 6e 64 20  t in *pfOut and 
110b0 72 65 74 75 72 6e 20 54 48 5f 4f 4b 2e 20 0a 2a  return TH_OK. .*
110c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69  *.** If the stri
110d0 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  ng cannot be con
110e0 76 65 72 74 65 64 20 74 6f 20 61 20 64 6f 75 62  verted to a doub
110f0 6c 65 2c 20 72 65 74 75 72 6e 20 54 48 5f 45 52  le, return TH_ER
11100 52 4f 52 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  ROR. .** If the 
11110 69 6e 74 65 72 70 20 61 72 67 75 6d 65 6e 74 20  interp argument 
11120 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6c 65 61  is not NULL, lea
11130 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
11140 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69  age in the .** i
11150 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c  nterpreter resul
11160 74 20 74 6f 6f 2e 0a 2a 2f 0a 69 6e 74 20 54 68  t too..*/.int Th
11170 5f 54 6f 44 6f 75 62 6c 65 28 0a 20 20 54 68 5f  _ToDouble(.  Th_
11180 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
11190 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
111a0 2c 20 0a 20 20 69 6e 74 20 6e 2c 20 0a 20 20 64  , .  int n, .  d
111b0 6f 75 62 6c 65 20 2a 70 66 4f 75 74 0a 29 7b 0a  ouble *pfOut.){.
111c0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
111d0 4e 75 6d 62 65 72 28 28 63 6f 6e 73 74 20 63 68  Number((const ch
111e0 61 72 20 2a 29 7a 2c 20 30 29 20 29 7b 0a 20 20  ar *)z, 0) ){.  
111f0 20 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67    Th_ErrorMessag
11200 65 28 69 6e 74 65 72 70 2c 20 22 65 78 70 65 63  e(interp, "expec
11210 74 65 64 20 6e 75 6d 62 65 72 2c 20 67 6f 74 3a  ted number, got:
11220 20 5c 22 22 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20   \"", z, n);.   
11230 20 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52   return TH_ERROR
11240 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
11250 41 74 6f 46 28 28 63 6f 6e 73 74 20 63 68 61 72  AtoF((const char
11260 20 2a 29 7a 2c 20 70 66 4f 75 74 29 3b 0a 20 20   *)z, pfOut);.  
11270 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a  return TH_OK;.}.
11280 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
11290 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 74  esult of the int
112a0 65 72 70 72 65 74 65 72 20 74 6f 20 74 68 65 20  erpreter to the 
112b0 74 68 31 20 72 65 70 72 65 73 65 6e 74 61 74 69  th1 representati
112c0 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 69 6e 74  on of.** the int
112d0 65 67 65 72 20 69 56 61 6c 20 61 6e 64 20 72 65  eger iVal and re
112e0 74 75 72 6e 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 69  turn TH_OK..*/.i
112f0 6e 74 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49  nt Th_SetResultI
11300 6e 74 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e  nt(Th_Interp *in
11310 74 65 72 70 2c 20 69 6e 74 20 69 56 61 6c 29 7b  terp, int iVal){
11320 0a 20 20 69 6e 74 20 69 73 4e 65 67 61 74 69 76  .  int isNegativ
11330 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  e = 0;.  char zB
11340 75 66 5b 33 32 5d 3b 0a 20 20 63 68 61 72 20 2a  uf[32];.  char *
11350 7a 20 3d 20 26 7a 42 75 66 5b 33 32 5d 3b 0a 0a  z = &zBuf[32];..
11360 20 20 69 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a    if( iVal<0 ){.
11370 20 20 20 20 69 73 4e 65 67 61 74 69 76 65 20 3d      isNegative =
11380 20 31 3b 0a 20 20 20 20 69 56 61 6c 20 3d 20 69   1;.    iVal = i
11390 56 61 6c 20 2a 20 2d 31 3b 0a 20 20 7d 0a 20 20  Val * -1;.  }.  
113a0 2a 28 2d 2d 7a 29 20 3d 20 27 5c 30 27 3b 0a 20  *(--z) = '\0';. 
113b0 20 2a 28 2d 2d 7a 29 20 3d 20 28 63 68 61 72 29   *(--z) = (char)
113c0 28 34 38 2b 28 69 56 61 6c 25 31 30 29 29 3b 0a  (48+(iVal%10));.
113d0 20 20 77 68 69 6c 65 28 20 28 69 56 61 6c 20 3d    while( (iVal =
113e0 20 28 69 56 61 6c 2f 31 30 29 29 3e 30 20 29 7b   (iVal/10))>0 ){
113f0 0a 20 20 20 20 2a 28 2d 2d 7a 29 20 3d 20 28 63  .    *(--z) = (c
11400 68 61 72 29 28 34 38 2b 28 69 56 61 6c 25 31 30  har)(48+(iVal%10
11410 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 7a  ));.    assert(z
11420 3e 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 69 66  >zBuf);.  }.  if
11430 28 20 69 73 4e 65 67 61 74 69 76 65 20 29 7b 0a  ( isNegative ){.
11440 20 20 20 20 2a 28 2d 2d 7a 29 20 3d 20 27 2d 27      *(--z) = '-'
11450 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
11460 54 68 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  Th_SetResult(int
11470 65 72 70 2c 20 7a 2c 20 2d 31 29 3b 0a 7d 0a 0a  erp, z, -1);.}..
11480 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
11490 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 74 65  sult of the inte
114a0 72 70 72 65 74 65 72 20 74 6f 20 74 68 65 20 74  rpreter to the t
114b0 68 31 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  h1 representatio
114c0 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 64 6f 75 62  n of.** the doub
114d0 6c 65 20 66 56 61 6c 20 61 6e 64 20 72 65 74 75  le fVal and retu
114e0 72 6e 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  rn TH_OK..*/.int
114f0 20 54 68 5f 53 65 74 52 65 73 75 6c 74 44 6f 75   Th_SetResultDou
11500 62 6c 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69  ble(Th_Interp *i
11510 6e 74 65 72 70 2c 20 64 6f 75 62 6c 65 20 66 56  nterp, double fV
11520 61 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  al){.  int i;   
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11540 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
11550 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 76 20  e */.  double v 
11560 3d 20 66 56 61 6c 3b 20 20 20 20 20 20 2f 2a 20  = fVal;      /* 
11570 49 6e 70 75 74 20 76 61 6c 75 65 20 2a 2f 0a 20  Input value */. 
11580 20 63 68 61 72 20 7a 42 75 66 5b 31 32 38 5d 3b   char zBuf[128];
11590 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
115a0 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72  buffer */.  char
115b0 20 2a 7a 20 3d 20 7a 42 75 66 3b 20 20 20 20 20   *z = zBuf;     
115c0 20 2f 2a 20 4f 75 74 70 75 74 20 63 75 72 73 6f   /* Output curso
115d0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 6f 74 20  r */.  int iDot 
115e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
115f0 44 69 67 69 74 20 61 66 74 65 72 20 77 68 69 63  Digit after whic
11600 68 20 74 6f 20 70 6c 61 63 65 20 64 65 63 69 6d  h to place decim
11610 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e  al point */.  in
11620 74 20 69 45 78 70 20 3d 20 30 3b 20 20 20 20 20  t iExp = 0;     
11630 20 20 20 20 2f 2a 20 45 78 70 6f 6e 65 6e 74 20      /* Exponent 
11640 28 4e 4e 20 69 6e 20 65 4e 4e 29 20 2a 2f 0a 20  (NN in eNN) */. 
11650 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
11660 70 3b 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20  p;    /* String 
11670 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
11680 66 20 69 45 78 70 20 2a 2f 0a 0a 20 20 2f 2a 20  f iExp */..  /* 
11690 50 72 65 63 69 73 69 6f 6e 3a 20 2a 2f 0a 20 20  Precision: */.  
116a0 23 64 65 66 69 6e 65 20 49 4e 53 49 47 4e 49 46  #define INSIGNIF
116b0 49 43 41 4e 54 20 30 2e 30 30 30 30 30 30 30 30  ICANT 0.00000000
116c0 30 30 30 31 0a 20 20 23 64 65 66 69 6e 65 20 52  0001.  #define R
116d0 4f 55 4e 44 45 52 20 20 20 20 20 20 20 30 2e 30  OUNDER       0.0
116e0 30 30 30 30 30 30 30 30 30 30 30 35 0a 20 20 64  000000000005.  d
116f0 6f 75 62 6c 65 20 69 6e 73 69 67 6e 69 66 69 63  ouble insignific
11700 61 6e 74 20 3d 20 49 4e 53 49 47 4e 49 46 49 43  ant = INSIGNIFIC
11710 41 4e 54 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ANT;..  /* If th
11720 65 20 72 65 61 6c 20 76 61 6c 75 65 20 69 73 20  e real value is 
11730 6e 65 67 61 74 69 76 65 2c 20 77 72 69 74 65 20  negative, write 
11740 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 20  a '-' character 
11750 74 6f 20 74 68 65 0a 20 20 20 2a 20 6f 75 74 70  to the.   * outp
11760 75 74 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d  ut and transform
11770 20 76 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73   v to the corres
11780 70 6f 6e 64 69 6e 67 20 70 6f 73 69 74 69 76 65  ponding positive
11790 20 6e 75 6d 62 65 72 2e 0a 20 20 20 2a 2f 20 0a   number..   */ .
117a0 20 20 69 66 28 20 76 3c 30 2e 30 20 29 7b 0a 20    if( v<0.0 ){. 
117b0 20 20 20 2a 7a 2b 2b 20 3d 20 27 2d 27 3b 0a 20     *z++ = '-';. 
117c0 20 20 20 76 20 2a 3d 20 2d 31 2e 30 3b 0a 20 20     v *= -1.0;.  
117d0 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 69 7a  }..  /* Normaliz
117e0 65 20 76 20 74 6f 20 61 20 76 61 6c 75 65 20 62  e v to a value b
117f0 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64 20 31  etween 1.0 and 1
11800 30 2e 30 2e 20 49 6e 74 65 67 65 72 20 0a 20 20  0.0. Integer .  
11810 20 2a 20 76 61 72 69 61 62 6c 65 20 69 45 78 70   * variable iExp
11820 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 65   is set to the e
11830 78 70 6f 6e 65 6e 74 2e 20 69 2e 65 20 74 68 65  xponent. i.e the
11840 20 6f 72 69 67 69 6e 61 6c 0a 20 20 20 2a 20 76   original.   * v
11850 61 6c 75 65 20 69 73 20 28 76 20 2a 20 31 30 5e  alue is (v * 10^
11860 69 45 78 70 29 20 28 6f 72 20 74 68 65 20 6e 65  iExp) (or the ne
11870 67 61 74 69 76 65 20 74 68 65 72 65 6f 66 29 2e  gative thereof).
11880 0a 20 20 20 2a 2f 20 0a 20 20 69 66 28 20 76 3e  .   */ .  if( v>
11890 30 2e 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  0.0 ){.    while
118a0 28 20 28 76 2b 52 4f 55 4e 44 45 52 29 3e 3d 31  ( (v+ROUNDER)>=1
118b0 30 2e 30 20 29 20 7b 20 69 45 78 70 2b 2b 3b 20  0.0 ) { iExp++; 
118c0 76 20 2a 3d 20 30 2e 31 3b 20 7d 0a 20 20 20 20  v *= 0.1; }.    
118d0 77 68 69 6c 65 28 20 28 76 2b 52 4f 55 4e 44 45  while( (v+ROUNDE
118e0 52 29 3c 31 2e 30 20 29 20 20 20 7b 20 69 45 78  R)<1.0 )   { iEx
118f0 70 2d 2d 3b 20 76 20 2a 3d 20 31 30 2e 30 3b 20  p--; v *= 10.0; 
11900 7d 0a 20 20 7d 0a 20 20 76 20 2b 3d 20 52 4f 55  }.  }.  v += ROU
11910 4e 44 45 52 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  NDER;..  /* For 
11920 61 20 73 6d 61 6c 6c 20 28 3c 31 32 29 20 70 6f  a small (<12) po
11930 73 69 74 69 76 65 20 65 78 70 6f 6e 65 6e 74 2c  sitive exponent,
11940 20 6d 6f 76 65 20 74 68 65 20 64 65 63 69 6d 61   move the decima
11950 6c 20 70 6f 69 6e 74 0a 20 20 20 2a 20 69 6e 73  l point.   * ins
11960 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 74 68  tead of using th
11970 65 20 22 65 58 58 22 20 6e 6f 74 61 74 69 6f 6e  e "eXX" notation
11980 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 69 45  ..   */.  if( iE
11990 78 70 3e 30 20 26 26 20 69 45 78 70 3c 31 32 20  xp>0 && iExp<12 
119a0 29 7b 0a 20 20 20 20 69 44 6f 74 20 3d 20 69 45  ){.    iDot = iE
119b0 78 70 3b 0a 20 20 20 20 69 45 78 70 20 3d 20 30  xp;.    iExp = 0
119c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
119d0 61 20 73 6d 61 6c 6c 20 28 3e 2d 34 29 20 6e 65  a small (>-4) ne
119e0 67 61 74 69 76 65 20 65 78 70 6f 6e 65 6e 74 2c  gative exponent,
119f0 20 77 72 69 74 65 20 6c 65 61 64 69 6e 67 20 7a   write leading z
11a00 65 72 6f 65 73 0a 20 20 20 2a 20 69 6e 73 74 65  eroes.   * inste
11a10 61 64 20 6f 66 20 75 73 69 6e 67 20 74 68 65 20  ad of using the 
11a20 22 65 58 58 22 20 6e 6f 74 61 74 69 6f 6e 2e 0a  "eXX" notation..
11a30 20 20 20 2a 2f 0a 20 20 69 66 28 20 69 45 78 70     */.  if( iExp
11a40 3c 30 20 26 26 20 69 45 78 70 3e 2d 34 20 29 7b  <0 && iExp>-4 ){
11a50 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 30 27 3b  .    *z++ = '0';
11a60 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2e 27 3b  .    *z++ = '.';
11a70 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3e  .    for(i=0; i>
11a80 28 69 45 78 70 2b 31 29 3b 20 69 2d 2d 29 7b 0a  (iExp+1); i--){.
11a90 20 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 30 27        *z++ = '0'
11aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 6f 74  ;.    }.    iDot
11ab0 20 3d 20 2d 31 3b 0a 20 20 20 20 69 45 78 70 20   = -1;.    iExp 
11ac0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 0;.  }..  /* O
11ad0 75 74 70 75 74 20 74 68 65 20 64 69 67 69 74 73  utput the digits
11ae0 20 69 6e 20 72 65 61 6c 20 76 61 6c 75 65 20 76   in real value v
11af0 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 69  . The value of i
11b00 44 6f 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  Dot determines. 
11b10 20 20 2a 20 77 68 65 72 65 20 28 69 66 20 61 74    * where (if at
11b20 20 61 6c 6c 29 20 74 68 65 20 64 65 63 69 6d 61   all) the decima
11b30 6c 20 70 6f 69 6e 74 20 69 73 20 70 6c 61 63 65  l point is place
11b40 64 2e 0a 20 20 20 2a 2f 0a 20 20 66 6f 72 28 69  d..   */.  for(i
11b50 3d 30 3b 20 69 3c 3d 28 69 44 6f 74 2b 31 29 20  =0; i<=(iDot+1) 
11b60 7c 7c 20 76 3e 3d 69 6e 73 69 67 6e 69 66 69 63  || v>=insignific
11b70 61 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2a  ant; i++){.    *
11b80 7a 2b 2b 20 3d 20 28 63 68 61 72 29 28 34 38 20  z++ = (char)(48 
11b90 2b 20 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 76  + (int)v);.    v
11ba0 20 3d 20 28 76 20 2d 20 28 28 64 6f 75 62 6c 65   = (v - ((double
11bb0 29 28 69 6e 74 29 76 29 29 20 2a 20 31 30 2e 30  )(int)v)) * 10.0
11bc0 3b 0a 20 20 20 20 69 6e 73 69 67 6e 69 66 69 63  ;.    insignific
11bd0 61 6e 74 20 2a 3d 20 31 30 2e 30 3b 0a 20 20 20  ant *= 10.0;.   
11be0 20 69 66 28 20 69 44 6f 74 3d 3d 69 20 29 7b 0a   if( iDot==i ){.
11bf0 20 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2e 27        *z++ = '.'
11c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11c10 2a 20 49 66 20 74 68 65 20 65 78 70 6f 6e 65 6e  * If the exponen
11c20 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 61  t is not zero, a
11c30 64 64 20 74 68 65 20 22 65 58 58 22 20 6e 6f 74  dd the "eXX" not
11c40 61 74 69 6f 6e 20 74 6f 20 74 68 65 0a 20 20 20  ation to the.   
11c50 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * end of the str
11c60 69 6e 67 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28  ing..   */.  if(
11c70 20 69 45 78 70 21 3d 30 20 29 7b 0a 20 20 20 20   iExp!=0 ){.    
11c80 2a 7a 2b 2b 20 3d 20 27 65 27 3b 0a 20 20 20 20  *z++ = 'e';.    
11c90 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 28  Th_SetResultInt(
11ca0 69 6e 74 65 72 70 2c 20 69 45 78 70 29 3b 0a 20  interp, iExp);. 
11cb0 20 20 20 7a 45 78 70 20 3d 20 54 68 5f 47 65 74     zExp = Th_Get
11cc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 30  Result(interp, 0
11cd0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
11ce0 7a 45 78 70 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zExp[i]; i++){. 
11cf0 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 7a 45 78 70       *z++ = zExp
11d00 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  [i];.    }.  }..
11d10 20 20 2a 7a 20 3d 20 27 5c 30 27 3b 0a 20 20 72    *z = '\0';.  r
11d20 65 74 75 72 6e 20 54 68 5f 53 65 74 52 65 73 75  eturn Th_SetResu
11d30 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
11d40 20 2d 31 29 3b 0a 7d 0a                           -1);.}.