Hex Artifact Content
Not logged in

Artifact 05228f97bf1c2b9fbb97da401a15390b12672818:

File src/th.c part of check-in [0c99a1554a] - Modify the TH1 script interperter to use native characters rather than unsigned characters. Fix a bug in the combobox extension command of TH1. by drh on 2008-10-24 16:36:34.

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 3b 20 20 20 20 20 20   eArgType;      
c530: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 74       /* Actual t
c540: 79 70 65 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ype of arguments
c550: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 72 67 75   */..    /* Argu
c560: 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  ment values */. 
c570: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 0a 20 20     int iLeft;.  
c580: 20 20 69 6e 74 20 69 52 69 67 68 74 3b 0a 20 20    int iRight;.  
c590: 20 20 64 6f 75 62 6c 65 20 66 4c 65 66 74 3b 0a    double fLeft;.
c5a0: 20 20 20 20 64 6f 75 62 6c 65 20 66 52 69 67 68      double fRigh
c5b0: 74 3b 0a 0a 20 20 20 20 2f 2a 20 4c 65 66 74 20  t;..    /* Left 
c5c0: 61 6e 64 20 72 69 67 68 74 20 61 72 67 75 6d 65  and right argume
c5d0: 6e 74 73 20 61 73 20 73 74 72 69 6e 67 73 20 2a  nts as strings *
c5e0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 65 66  /.    char *zLef
c5f0: 74 20 3d 20 30 3b 20 69 6e 74 20 6e 4c 65 66 74  t = 0; int nLeft
c600: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 69 67  ;.    char *zRig
c610: 68 74 20 3d 20 30 3b 20 69 6e 74 20 6e 52 69 67  ht = 0; int nRig
c620: 68 74 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ht;..    /* Eval
c630: 75 61 74 65 20 6c 65 66 74 20 61 6e 64 20 72 69  uate left and ri
c640: 67 68 74 20 61 72 67 75 6d 65 6e 74 73 2c 20 69  ght arguments, i
c650: 66 20 74 68 65 79 20 65 78 69 73 74 2e 20 2a 2f  f they exist. */
c660: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
c670: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 72  pLeft ){.      r
c680: 63 20 3d 20 65 78 70 72 45 76 61 6c 28 69 6e 74  c = exprEval(int
c690: 65 72 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  erp, pExpr->pLef
c6a0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
c6b0: 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  ==TH_OK ){.     
c6c0: 20 20 20 7a 4c 65 66 74 20 3d 20 54 68 5f 54 61     zLeft = Th_Ta
c6d0: 6b 65 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  keResult(interp,
c6e0: 20 26 6e 4c 65 66 74 29 3b 0a 20 20 20 20 20 20   &nLeft);.      
c6f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c700: 72 63 3d 3d 54 48 5f 4f 4b 20 26 26 20 70 45 78  rc==TH_OK && pEx
c710: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
c720: 20 20 20 20 72 63 20 3d 20 65 78 70 72 45 76 61      rc = exprEva
c730: 6c 28 69 6e 74 65 72 70 2c 20 70 45 78 70 72 2d  l(interp, pExpr-
c740: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
c750: 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b  if( rc==TH_OK ){
c760: 0a 20 20 20 20 20 20 20 20 7a 52 69 67 68 74 20  .        zRight 
c770: 3d 20 54 68 5f 54 61 6b 65 52 65 73 75 6c 74 28  = Th_TakeResult(
c780: 69 6e 74 65 72 70 2c 20 26 6e 52 69 67 68 74 29  interp, &nRight)
c790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c7a0: 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
c7b0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
c7c0: 69 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 6d  ir required form
c7d0: 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  s. */.    if( rc
c7e0: 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  ==TH_OK ){.     
c7f0: 20 65 41 72 67 54 79 70 65 20 3d 20 70 45 78 70   eArgType = pExp
c800: 72 2d 3e 70 4f 70 2d 3e 65 41 72 67 54 79 70 65  r->pOp->eArgType
c810: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 41 72 67  ;.      if( eArg
c820: 54 79 70 65 3d 3d 41 52 47 5f 4e 55 4d 42 45 52  Type==ARG_NUMBER
c830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c840: 28 7a 4c 65 66 74 3d 3d 30 20 7c 7c 20 54 48 5f  (zLeft==0 || TH_
c850: 4f 4b 3d 3d 54 68 5f 54 6f 49 6e 74 28 30 2c 20  OK==Th_ToInt(0, 
c860: 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20 26 69  zLeft, nLeft, &i
c870: 4c 65 66 74 29 29 0a 20 20 20 20 20 20 20 20 20  Left)).         
c880: 26 26 20 28 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  && (zRight==0 ||
c890: 20 54 48 5f 4f 4b 3d 3d 54 68 5f 54 6f 49 6e 74   TH_OK==Th_ToInt
c8a0: 28 30 2c 20 7a 52 69 67 68 74 2c 20 6e 52 69 67  (0, zRight, nRig
c8b0: 68 74 2c 20 26 69 52 69 67 68 74 29 29 0a 20 20  ht, &iRight)).  
c8c0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
c8d0: 20 20 20 65 41 72 67 54 79 70 65 20 3d 20 41 52     eArgType = AR
c8e0: 47 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  G_INTEGER;.     
c8f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 0a 20 20     }else if( .  
c900: 20 20 20 20 20 20 20 20 28 7a 4c 65 66 74 20 26          (zLeft &
c910: 26 20 54 48 5f 4f 4b 21 3d 54 68 5f 54 6f 44 6f  & TH_OK!=Th_ToDo
c920: 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 7a 4c 65  uble(interp, zLe
c930: 66 74 2c 20 6e 4c 65 66 74 2c 20 26 66 4c 65 66  ft, nLeft, &fLef
c940: 74 29 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  t)) ||.         
c950: 20 28 7a 52 69 67 68 74 20 26 26 20 54 48 5f 4f   (zRight && TH_O
c960: 4b 21 3d 54 68 5f 54 6f 44 6f 75 62 6c 65 28 69  K!=Th_ToDouble(i
c970: 6e 74 65 72 70 2c 20 7a 52 69 67 68 74 2c 20 6e  nterp, zRight, n
c980: 52 69 67 68 74 2c 20 26 66 52 69 67 68 74 29 29  Right, &fRight))
c990: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
c9a0: 20 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65 20        /* A type 
c9b0: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  error. */.      
c9c0: 20 20 20 20 72 63 20 3d 20 54 48 5f 45 52 52 4f      rc = TH_ERRO
c9d0: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
c9e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 41 72     }else if( eAr
c9f0: 67 54 79 70 65 3d 3d 41 52 47 5f 49 4e 54 45 47  gType==ARG_INTEG
ca00: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ER ){.        rc
ca10: 20 3d 20 54 68 5f 54 6f 49 6e 74 28 69 6e 74 65   = Th_ToInt(inte
ca20: 72 70 2c 20 7a 4c 65 66 74 2c 20 6e 4c 65 66 74  rp, zLeft, nLeft
ca30: 2c 20 26 69 4c 65 66 74 29 3b 0a 20 20 20 20 20  , &iLeft);.     
ca40: 20 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b     if( rc==TH_OK
ca50: 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20   && zRight ){.  
ca60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 68 5f          rc = Th_
ca70: 54 6f 49 6e 74 28 69 6e 74 65 72 70 2c 20 7a 52  ToInt(interp, zR
ca80: 69 67 68 74 2c 20 6e 52 69 67 68 74 2c 20 26 69  ight, nRight, &i
ca90: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
caa0: 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
cab0: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54  }..    if( rc==T
cac0: 48 5f 4f 4b 20 26 26 20 65 41 72 67 54 79 70 65  H_OK && eArgType
cad0: 3d 3d 41 52 47 5f 49 4e 54 45 47 45 52 20 29 7b  ==ARG_INTEGER ){
cae0: 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 73 3b  .      int iRes;
caf0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
cb00: 45 78 70 72 2d 3e 70 4f 70 2d 3e 65 4f 70 20 29  Expr->pOp->eOp )
cb10: 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   {.        case 
cb20: 4f 50 5f 4d 55 4c 54 49 50 4c 59 3a 20 20 20 20  OP_MULTIPLY:    
cb30: 20 69 52 65 73 20 3d 20 69 4c 65 66 74 2a 69 52   iRes = iLeft*iR
cb40: 69 67 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ight;  break;.  
cb50: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 49        case OP_DI
cb60: 56 49 44 45 3a 20 20 20 20 20 20 20 69 52 65 73  VIDE:       iRes
cb70: 20 3d 20 69 4c 65 66 74 2f 69 52 69 67 68 74 3b   = iLeft/iRight;
cb80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
cb90: 20 63 61 73 65 20 4f 50 5f 4d 4f 44 55 4c 55 53   case OP_MODULUS
cba0: 3a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 4c  :      iRes = iL
cbb0: 65 66 74 25 69 52 69 67 68 74 3b 20 20 62 72 65  eft%iRight;  bre
cbc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
cbd0: 20 4f 50 5f 41 44 44 3a 20 20 20 20 20 20 20 20   OP_ADD:        
cbe0: 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74 2b 69    iRes = iLeft+i
cbf0: 52 69 67 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20  Right;  break;. 
cc00: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53         case OP_S
cc10: 55 42 54 52 41 43 54 3a 20 20 20 20 20 69 52 65  UBTRACT:     iRe
cc20: 73 20 3d 20 69 4c 65 66 74 2d 69 52 69 67 68 74  s = iLeft-iRight
cc30: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
cc40: 20 20 63 61 73 65 20 4f 50 5f 4c 45 46 54 53 48    case OP_LEFTSH
cc50: 49 46 54 3a 20 20 20 20 69 52 65 73 20 3d 20 69  IFT:    iRes = i
cc60: 4c 65 66 74 3c 3c 69 52 69 67 68 74 3b 20 62 72  Left<<iRight; br
cc70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
cc80: 65 20 4f 50 5f 52 49 47 48 54 53 48 49 46 54 3a  e OP_RIGHTSHIFT:
cc90: 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74 3e     iRes = iLeft>
cca0: 3e 69 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a  >iRight; break;.
ccb0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
ccc0: 4c 54 3a 20 20 20 20 20 20 20 20 20 20 20 69 52  LT:           iR
ccd0: 65 73 20 3d 20 69 4c 65 66 74 3c 69 52 69 67 68  es = iLeft<iRigh
cce0: 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t;  break;.     
ccf0: 20 20 20 63 61 73 65 20 4f 50 5f 47 54 3a 20 20     case OP_GT:  
cd00: 20 20 20 20 20 20 20 20 20 69 52 65 73 20 3d 20           iRes = 
cd10: 69 4c 65 66 74 3e 69 52 69 67 68 74 3b 20 20 62  iLeft>iRight;  b
cd20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
cd30: 73 65 20 4f 50 5f 4c 45 3a 20 20 20 20 20 20 20  se OP_LE:       
cd40: 20 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74      iRes = iLeft
cd50: 3c 3d 69 52 69 67 68 74 3b 20 62 72 65 61 6b 3b  <=iRight; break;
cd60: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
cd70: 5f 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 69  _GE:           i
cd80: 52 65 73 20 3d 20 69 4c 65 66 74 3e 3d 69 52 69  Res = iLeft>=iRi
cd90: 67 68 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ght; break;.    
cda0: 20 20 20 20 63 61 73 65 20 4f 50 5f 45 51 3a 20      case OP_EQ: 
cdb0: 20 20 20 20 20 20 20 20 20 20 69 52 65 73 20 3d            iRes =
cdc0: 20 69 4c 65 66 74 3d 3d 69 52 69 67 68 74 3b 20   iLeft==iRight; 
cdd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
cde0: 61 73 65 20 4f 50 5f 4e 45 3a 20 20 20 20 20 20  ase OP_NE:      
cdf0: 20 20 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66       iRes = iLef
ce00: 74 21 3d 69 52 69 67 68 74 3b 20 62 72 65 61 6b  t!=iRight; break
ce10: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  ;.        case O
ce20: 50 5f 42 49 54 57 49 53 45 5f 41 4e 44 3a 20 20  P_BITWISE_AND:  
ce30: 69 52 65 73 20 3d 20 69 4c 65 66 74 26 69 52 69  iRes = iLeft&iRi
ce40: 67 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ght;  break;.   
ce50: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 42 49 54       case OP_BIT
ce60: 57 49 53 45 5f 58 4f 52 3a 20 20 69 52 65 73 20  WISE_XOR:  iRes 
ce70: 3d 20 69 4c 65 66 74 5e 69 52 69 67 68 74 3b 20  = iLeft^iRight; 
ce80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ce90: 63 61 73 65 20 4f 50 5f 42 49 54 57 49 53 45 5f  case OP_BITWISE_
cea0: 4f 52 3a 20 20 20 69 52 65 73 20 3d 20 69 4c 65  OR:   iRes = iLe
ceb0: 66 74 7c 69 52 69 67 68 74 3b 20 20 62 72 65 61  ft|iRight;  brea
cec0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
ced0: 4f 50 5f 4c 4f 47 49 43 41 4c 5f 41 4e 44 3a 20  OP_LOGICAL_AND: 
cee0: 20 69 52 65 73 20 3d 20 69 4c 65 66 74 26 26 69   iRes = iLeft&&i
cef0: 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a 20 20  Right; break;.  
cf00: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c 4f        case OP_LO
cf10: 47 49 43 41 4c 5f 4f 52 3a 20 20 20 69 52 65 73  GICAL_OR:   iRes
cf20: 20 3d 20 69 4c 65 66 74 7c 7c 69 52 69 67 68 74   = iLeft||iRight
cf30: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
cf40: 20 63 61 73 65 20 4f 50 5f 55 4e 41 52 59 5f 4d   case OP_UNARY_M
cf50: 49 4e 55 53 3a 20 20 69 52 65 73 20 3d 20 2d 69  INUS:  iRes = -i
cf60: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 62 72 65  Left;        bre
cf70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
cf80: 20 4f 50 5f 55 4e 41 52 59 5f 50 4c 55 53 3a 20   OP_UNARY_PLUS: 
cf90: 20 20 69 52 65 73 20 3d 20 2b 69 4c 65 66 74 3b    iRes = +iLeft;
cfa0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cfb0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c         case OP_L
cfc0: 4f 47 49 43 41 4c 5f 4e 4f 54 3a 20 20 69 52 65  OGICAL_NOT:  iRe
cfd0: 73 20 3d 20 21 69 4c 65 66 74 3b 20 20 20 20 20  s = !iLeft;     
cfe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
cff0: 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
d000: 74 28 21 22 49 6e 74 65 72 6e 61 6c 20 65 72 72  t(!"Internal err
d010: 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  or");.      }.  
d020: 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74      Th_SetResult
d030: 49 6e 74 28 69 6e 74 65 72 70 2c 20 69 52 65 73  Int(interp, iRes
d040: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
d050: 20 72 63 3d 3d 54 48 5f 4f 4b 20 26 26 20 65 41   rc==TH_OK && eA
d060: 72 67 54 79 70 65 3d 3d 41 52 47 5f 4e 55 4d 42  rgType==ARG_NUMB
d070: 45 52 20 29 7b 0a 20 20 20 20 20 20 73 77 69 74  ER ){.      swit
d080: 63 68 28 20 70 45 78 70 72 2d 3e 70 4f 70 2d 3e  ch( pExpr->pOp->
d090: 65 4f 70 20 29 20 7b 0a 20 20 20 20 20 20 20 20  eOp ) {.        
d0a0: 63 61 73 65 20 4f 50 5f 4d 55 4c 54 49 50 4c 59  case OP_MULTIPLY
d0b0: 3a 20 54 68 5f 53 65 74 52 65 73 75 6c 74 44 6f  : Th_SetResultDo
d0c0: 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 66 4c 65  uble(interp, fLe
d0d0: 66 74 2a 66 52 69 67 68 74 29 3b 20 20 62 72 65  ft*fRight);  bre
d0e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
d0f0: 20 4f 50 5f 44 49 56 49 44 45 3a 20 20 20 54 68   OP_DIVIDE:   Th
d100: 5f 53 65 74 52 65 73 75 6c 74 44 6f 75 62 6c 65  _SetResultDouble
d110: 28 69 6e 74 65 72 70 2c 20 66 4c 65 66 74 2f 66  (interp, fLeft/f
d120: 52 69 67 68 74 29 3b 20 20 62 72 65 61 6b 3b 0a  Right);  break;.
d130: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
d140: 41 44 44 3a 20 20 20 20 20 20 54 68 5f 53 65 74  ADD:      Th_Set
d150: 52 65 73 75 6c 74 44 6f 75 62 6c 65 28 69 6e 74  ResultDouble(int
d160: 65 72 70 2c 20 66 4c 65 66 74 2b 66 52 69 67 68  erp, fLeft+fRigh
d170: 74 29 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t);  break;.    
d180: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 55 42 54      case OP_SUBT
d190: 52 41 43 54 3a 20 54 68 5f 53 65 74 52 65 73 75  RACT: Th_SetResu
d1a0: 6c 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  ltDouble(interp,
d1b0: 20 66 4c 65 66 74 2d 66 52 69 67 68 74 29 3b 20   fLeft-fRight); 
d1c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d1d0: 63 61 73 65 20 4f 50 5f 4c 54 3a 20 20 20 20 20  case OP_LT:     
d1e0: 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e    Th_SetResultIn
d1f0: 74 28 69 6e 74 65 72 70 2c 20 66 4c 65 66 74 3c  t(interp, fLeft<
d200: 66 52 69 67 68 74 29 3b 20 20 62 72 65 61 6b 3b  fRight);  break;
d210: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
d220: 5f 47 54 3a 20 20 20 20 20 20 20 54 68 5f 53 65  _GT:       Th_Se
d230: 74 52 65 73 75 6c 74 49 6e 74 28 69 6e 74 65 72  tResultInt(inter
d240: 70 2c 20 66 4c 65 66 74 3e 66 52 69 67 68 74 29  p, fLeft>fRight)
d250: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
d260: 20 20 63 61 73 65 20 4f 50 5f 4c 45 3a 20 20 20    case OP_LE:   
d270: 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74      Th_SetResult
d280: 49 6e 74 28 69 6e 74 65 72 70 2c 20 66 4c 65 66  Int(interp, fLef
d290: 74 3c 3d 66 52 69 67 68 74 29 3b 20 62 72 65 61  t<=fRight); brea
d2a0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
d2b0: 4f 50 5f 47 45 3a 20 20 20 20 20 20 20 54 68 5f  OP_GE:       Th_
d2c0: 53 65 74 52 65 73 75 6c 74 49 6e 74 28 69 6e 74  SetResultInt(int
d2d0: 65 72 70 2c 20 66 4c 65 66 74 3e 3d 66 52 69 67  erp, fLeft>=fRig
d2e0: 68 74 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ht); break;.    
d2f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 45 51 3a 20      case OP_EQ: 
d300: 20 20 20 20 20 20 54 68 5f 53 65 74 52 65 73 75        Th_SetResu
d310: 6c 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 66 4c  ltInt(interp, fL
d320: 65 66 74 3d 3d 66 52 69 67 68 74 29 3b 20 62 72  eft==fRight); br
d330: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
d340: 65 20 4f 50 5f 4e 45 3a 20 20 20 20 20 20 20 54  e OP_NE:       T
d350: 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 28 69  h_SetResultInt(i
d360: 6e 74 65 72 70 2c 20 66 4c 65 66 74 21 3d 66 52  nterp, fLeft!=fR
d370: 69 67 68 74 29 3b 20 62 72 65 61 6b 3b 0a 20 20  ight); break;.  
d380: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
d390: 73 73 65 72 74 28 21 22 49 6e 74 65 72 6e 61 6c  ssert(!"Internal
d3a0: 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
d3b0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
d3c0: 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20  rc==TH_OK ){.   
d3d0: 20 20 20 69 6e 74 20 69 45 71 75 61 6c 20 3d 20     int iEqual = 
d3e0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
d3f0: 20 65 41 72 67 54 79 70 65 3d 3d 41 52 47 5f 53   eArgType==ARG_S
d400: 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 69  TRING );.      i
d410: 66 28 20 6e 52 69 67 68 74 3d 3d 6e 4c 65 66 74  f( nRight==nLeft
d420: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 52   && 0==memcmp(zR
d430: 69 67 68 74 2c 20 7a 4c 65 66 74 2c 20 6e 52 69  ight, zLeft, nRi
d440: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
d450: 69 45 71 75 61 6c 20 3d 20 31 3b 0a 20 20 20 20  iEqual = 1;.    
d460: 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68    }.      switch
d470: 28 20 70 45 78 70 72 2d 3e 70 4f 70 2d 3e 65 4f  ( pExpr->pOp->eO
d480: 70 20 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61  p ) {.        ca
d490: 73 65 20 4f 50 5f 53 45 51 3a 20 20 20 20 20 20  se OP_SEQ:      
d4a0: 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74   Th_SetResultInt
d4b0: 28 69 6e 74 65 72 70 2c 20 69 45 71 75 61 6c 29  (interp, iEqual)
d4c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
d4d0: 20 63 61 73 65 20 4f 50 5f 53 4e 45 3a 20 20 20   case OP_SNE:   
d4e0: 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74      Th_SetResult
d4f0: 49 6e 74 28 69 6e 74 65 72 70 2c 20 21 69 45 71  Int(interp, !iEq
d500: 75 61 6c 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ual); break;.   
d510: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73       default: as
d520: 73 65 72 74 28 21 22 49 6e 74 65 72 6e 61 6c 20  sert(!"Internal 
d530: 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d  error");.      }
d540: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 68 5f 46  .    }..    Th_F
d550: 72 65 65 28 69 6e 74 65 72 70 2c 20 7a 4c 65 66  ree(interp, zLef
d560: 74 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28  t);.    Th_Free(
d570: 69 6e 74 65 72 70 2c 20 7a 52 69 67 68 74 29 3b  interp, zRight);
d580: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
d590: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
d5a0: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
d5b0: 20 74 72 65 65 20 66 72 6f 6d 20 61 6e 20 61 72   tree from an ar
d5c0: 72 61 79 20 6f 66 20 74 6f 6b 65 6e 73 2e 20 49  ray of tokens. I
d5d0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
d5e0: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
d5f0: 20 74 72 65 65 20 69 73 20 73 74 6f 72 65 64 20   tree is stored 
d600: 69 6e 20 61 70 54 6f 6b 65 6e 5b 30 5d 2e 0a 2a  in apToken[0]..*
d610: 2f 0a 69 6e 74 20 65 78 70 72 4d 61 6b 65 54 72  /.int exprMakeTr
d620: 65 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e  ee(Th_Interp *in
d630: 74 65 72 70 2c 20 45 78 70 72 20 2a 2a 61 70 54  terp, Expr **apT
d640: 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
d650: 29 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 3b 0a  ){.  int iLeft;.
d660: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6a    int i;.  int j
d670: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 54 6f  j;..  assert(nTo
d680: 6b 65 6e 3e 30 29 3b 0a 23 64 65 66 69 6e 65 20  ken>0);.#define 
d690: 49 53 54 45 52 4d 28 78 29 20 28 61 70 54 6f 6b  ISTERM(x) (apTok
d6a0: 65 6e 5b 78 5d 20 26 26 20 28 21 61 70 54 6f 6b  en[x] && (!apTok
d6b0: 65 6e 5b 78 5d 2d 3e 70 4f 70 20 7c 7c 20 61 70  en[x]->pOp || ap
d6c0: 54 6f 6b 65 6e 5b 78 5d 2d 3e 70 4c 65 66 74 29  Token[x]->pLeft)
d6d0: 29 0a 0a 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a  )..  for(jj=0; j
d6e0: 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b  j<nToken; jj++){
d6f0: 0a 20 20 20 20 69 66 28 20 61 70 54 6f 6b 65 6e  .    if( apToken
d700: 5b 6a 6a 5d 2d 3e 70 4f 70 20 26 26 20 61 70 54  [jj]->pOp && apT
d710: 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 2d 3e 65  oken[jj]->pOp->e
d720: 4f 70 3d 3d 4f 50 5f 4f 50 45 4e 5f 42 52 41 43  Op==OP_OPEN_BRAC
d730: 4b 45 54 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  KET ){.      int
d740: 20 6e 4e 65 73 74 20 3d 20 31 3b 0a 20 20 20 20   nNest = 1;.    
d750: 20 20 69 6e 74 20 69 4c 65 66 74 20 3d 20 6a 6a    int iLeft = jj
d760: 3b 20 0a 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a  ; ..      for(jj
d770: 2b 2b 3b 20 6a 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a  ++; jj<nToken; j
d780: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 4f 70  j++){.        Op
d790: 65 72 61 74 6f 72 20 2a 70 4f 70 20 3d 20 61 70  erator *pOp = ap
d7a0: 54 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 3b 0a  Token[jj]->pOp;.
d7b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 20          if( pOp 
d7c0: 26 26 20 70 4f 70 2d 3e 65 4f 70 3d 3d 4f 50 5f  && pOp->eOp==OP_
d7d0: 4f 50 45 4e 5f 42 52 41 43 4b 45 54 20 29 20 6e  OPEN_BRACKET ) n
d7e0: 4e 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Nest++;.        
d7f0: 69 66 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e  if( pOp && pOp->
d800: 65 4f 70 3d 3d 4f 50 5f 43 4c 4f 53 45 5f 42 52  eOp==OP_CLOSE_BR
d810: 41 43 4b 45 54 20 29 20 6e 4e 65 73 74 2d 2d 3b  ACKET ) nNest--;
d820: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
d830: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  st==0 ) break;. 
d840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d850: 20 6a 6a 3d 3d 6e 54 6f 6b 65 6e 20 29 7b 0a 20   jj==nToken ){. 
d860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48         return TH
d870: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
d880: 20 20 20 20 20 20 69 66 28 20 28 6a 6a 2d 69 4c        if( (jj-iL
d890: 65 66 74 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  eft)>1 ){.      
d8a0: 20 20 69 66 28 20 65 78 70 72 4d 61 6b 65 54 72    if( exprMakeTr
d8b0: 65 65 28 69 6e 74 65 72 70 2c 20 26 61 70 54 6f  ee(interp, &apTo
d8c0: 6b 65 6e 5b 69 4c 65 66 74 2b 31 5d 2c 20 6a 6a  ken[iLeft+1], jj
d8d0: 2d 69 4c 65 66 74 2d 31 29 20 29 7b 0a 20 20 20  -iLeft-1) ){.   
d8e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48         return TH
d8f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
d900: 7d 0a 20 20 20 20 20 20 20 20 65 78 70 72 46 72  }.        exprFr
d910: 65 65 28 69 6e 74 65 72 70 2c 20 61 70 54 6f 6b  ee(interp, apTok
d920: 65 6e 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 20  en[jj]);.       
d930: 20 65 78 70 72 46 72 65 65 28 69 6e 74 65 72 70   exprFree(interp
d940: 2c 20 61 70 54 6f 6b 65 6e 5b 69 4c 65 66 74 5d  , apToken[iLeft]
d950: 29 3b 0a 20 20 20 20 20 20 20 20 61 70 54 6f 6b  );.        apTok
d960: 65 6e 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  en[jj] = 0;.    
d970: 20 20 20 20 61 70 54 6f 6b 65 6e 5b 69 4c 65 66      apToken[iLef
d980: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  t] = 0;.      }.
d990: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 4c 65      }.  }..  iLe
d9a0: 66 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 6a  ft = 0;.  for(jj
d9b0: 3d 6e 54 6f 6b 65 6e 2d 31 3b 20 6a 6a 3e 3d 30  =nToken-1; jj>=0
d9c0: 3b 20 6a 6a 2d 2d 29 7b 0a 20 20 20 20 69 66 28  ; jj--){.    if(
d9d0: 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a   apToken[jj] ){.
d9e0: 20 20 20 20 20 20 69 66 28 20 61 70 54 6f 6b 65        if( apToke
d9f0: 6e 5b 6a 6a 5d 2d 3e 70 4f 70 20 26 26 20 61 70  n[jj]->pOp && ap
da00: 54 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 2d 3e  Token[jj]->pOp->
da10: 69 50 72 65 63 65 64 65 6e 63 65 3d 3d 31 20 26  iPrecedence==1 &
da20: 26 20 69 4c 65 66 74 3e 30 20 29 7b 0a 20 20 20  & iLeft>0 ){.   
da30: 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d       apToken[jj]
da40: 2d 3e 70 4c 65 66 74 20 3d 20 61 70 54 6f 6b 65  ->pLeft = apToke
da50: 6e 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20 20 20  n[iLeft];.      
da60: 20 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70    apToken[jj]->p
da70: 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Left->pParent = 
da80: 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 3b 0a 20 20 20  apToken[jj];.   
da90: 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b 69 4c 65       apToken[iLe
daa0: 66 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ft] = 0;.      }
dab0: 0a 20 20 20 20 20 20 69 4c 65 66 74 20 3d 20 6a  .      iLeft = j
dac0: 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  j;.    }.  }.  f
dad0: 6f 72 28 69 3d 32 3b 20 69 3c 3d 31 32 3b 20 69  or(i=2; i<=12; i
dae0: 2b 2b 29 7b 0a 20 20 20 20 69 4c 65 66 74 20 3d  ++){.    iLeft =
daf0: 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d   -1;.    for(jj=
db00: 30 3b 20 6a 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a 6a  0; jj<nToken; jj
db10: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
db20: 2a 70 54 6f 6b 65 6e 20 3d 20 61 70 54 6f 6b 65  *pToken = apToke
db30: 6e 5b 6a 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  n[jj];.      if(
db40: 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a   apToken[jj] ){.
db50: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b          if( pTok
db60: 65 6e 2d 3e 70 4f 70 20 26 26 20 21 70 54 6f 6b  en->pOp && !pTok
db70: 65 6e 2d 3e 70 4c 65 66 74 20 26 26 20 70 54 6f  en->pLeft && pTo
db80: 6b 65 6e 2d 3e 70 4f 70 2d 3e 69 50 72 65 63 65  ken->pOp->iPrece
db90: 64 65 6e 63 65 3d 3d 69 20 29 7b 0a 20 20 20 20  dence==i ){.    
dba0: 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74        int iRight
dbb0: 20 3d 20 6a 6a 2b 31 3b 0a 0a 20 20 20 20 20 20   = jj+1;..      
dbc0: 20 20 20 20 69 52 69 67 68 74 20 3d 20 6a 6a 2b      iRight = jj+
dbd0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
dbe0: 28 69 52 69 67 68 74 3d 6a 6a 2b 31 3b 20 21 61  (iRight=jj+1; !a
dbf0: 70 54 6f 6b 65 6e 5b 69 52 69 67 68 74 5d 20 26  pToken[iRight] &
dc00: 26 20 69 52 69 67 68 74 3c 6e 54 6f 6b 65 6e 3b  & iRight<nToken;
dc10: 20 69 52 69 67 68 74 2b 2b 29 3b 0a 20 20 20 20   iRight++);.    
dc20: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
dc30: 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 69 4c 65 66  ==nToken || iLef
dc40: 74 3c 30 20 7c 7c 20 21 49 53 54 45 52 4d 28 69  t<0 || !ISTERM(i
dc50: 52 69 67 68 74 29 20 7c 7c 20 21 49 53 54 45 52  Right) || !ISTER
dc60: 4d 28 69 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  M(iLeft) ){.    
dc70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
dc80: 48 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  H_ERROR;.       
dc90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
dca0: 54 6f 6b 65 6e 2d 3e 70 4c 65 66 74 20 3d 20 61  Token->pLeft = a
dcb0: 70 54 6f 6b 65 6e 5b 69 4c 65 66 74 5d 3b 0a 20  pToken[iLeft];. 
dcc0: 20 20 20 20 20 20 20 20 20 61 70 54 6f 6b 65 6e           apToken
dcd0: 5b 69 4c 65 66 74 5d 20 3d 20 30 3b 0a 20 20 20  [iLeft] = 0;.   
dce0: 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 70         pToken->p
dcf0: 4c 65 66 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Left->pParent = 
dd00: 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  pToken;.        
dd10: 20 20 70 54 6f 6b 65 6e 2d 3e 70 52 69 67 68 74    pToken->pRight
dd20: 20 3d 20 61 70 54 6f 6b 65 6e 5b 69 52 69 67 68   = apToken[iRigh
dd30: 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  t];.          ap
dd40: 54 6f 6b 65 6e 5b 69 52 69 67 68 74 5d 20 3d 20  Token[iRight] = 
dd50: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f  0;.          pTo
dd60: 6b 65 6e 2d 3e 70 52 69 67 68 74 2d 3e 70 50 61  ken->pRight->pPa
dd70: 72 65 6e 74 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20  rent = pToken;. 
dd80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dd90: 20 69 4c 65 66 74 20 3d 20 6a 6a 3b 0a 20 20 20   iLeft = jj;.   
dda0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ddb0: 20 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e 54   for(jj=1; jj<nT
ddc0: 6f 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  oken; jj++){.   
ddd0: 20 61 73 73 65 72 74 28 20 21 61 70 54 6f 6b 65   assert( !apToke
dde0: 6e 5b 6a 6a 5d 20 7c 7c 20 21 61 70 54 6f 6b 65  n[jj] || !apToke
ddf0: 6e 5b 30 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  n[0] );.    if( 
de00: 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a 20  apToken[jj] ){. 
de10: 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b 30 5d 20       apToken[0] 
de20: 3d 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 3b 0a 20  = apToken[jj];. 
de30: 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d       apToken[jj]
de40: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
de50: 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b  .  return TH_OK;
de60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
de70: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
de80: 69 6e 67 20 61 20 54 48 20 65 78 70 72 65 73 73  ing a TH express
de90: 69 6f 6e 20 74 6f 20 61 20 6c 69 73 74 20 6f 66  ion to a list of
dea0: 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74   tokens..*/.stat
deb0: 69 63 20 69 6e 74 20 65 78 70 72 50 61 72 73 65  ic int exprParse
dec0: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69  (.  Th_Interp *i
ded0: 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 2f 2a  nterp,        /*
dee0: 20 49 6e 74 65 72 70 72 65 74 65 72 20 74 6f 20   Interpreter to 
def0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
df00: 61 67 65 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73  age in */.  cons
df10: 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c 20 20  t char *zExpr,  
df20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
df30: 74 6f 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  to input string 
df40: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 2c 20  */.  int nExpr, 
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
df70: 73 20 61 74 20 7a 45 78 70 72 20 2a 2f 0a 20 20  s at zExpr */.  
df80: 45 78 70 72 20 2a 2a 2a 70 61 70 54 6f 6b 65 6e  Expr ***papToken
df90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
dfa0: 3a 20 41 72 72 61 79 20 6f 66 20 74 6f 6b 65 6e  : Array of token
dfb0: 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 54  s. */.  int *pnT
dfc0: 6f 6b 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  oken            
dfd0: 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
dfe0: 66 20 74 6f 6b 65 6e 20 61 72 72 61 79 20 2a 2f  f token array */
dff0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
e000: 69 6e 74 20 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a  int rc = TH_OK;.
e010: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30    int nToken = 0
e020: 3b 0a 20 20 45 78 70 72 20 2a 2a 61 70 54 6f 6b  ;.  Expr **apTok
e030: 65 6e 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  en = 0;..  for(i
e040: 3d 30 3b 20 72 63 3d 3d 54 48 5f 4f 4b 20 26 26  =0; rc==TH_OK &&
e050: 20 69 3c 6e 45 78 70 72 3b 20 29 7b 0a 20 20 20   i<nExpr; ){.   
e060: 20 63 68 61 72 20 63 20 3d 20 7a 45 78 70 72 5b   char c = zExpr[
e070: 69 5d 3b 0a 20 20 20 20 69 66 28 20 74 68 5f 69  i];.    if( th_i
e080: 73 73 70 61 63 65 28 63 29 20 29 7b 20 20 20 20  sspace(c) ){    
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e0b0: 68 69 74 65 2d 73 70 61 63 65 20 20 20 20 20 2a  hite-space     *
e0c0: 2f 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  /.      i++;.   
e0d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
e0e0: 70 72 20 2a 70 4e 65 77 20 3d 20 28 45 78 70 72  pr *pNew = (Expr
e0f0: 20 2a 29 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74   *)Th_Malloc(int
e100: 65 72 70 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  erp, sizeof(Expr
e110: 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ));.      const 
e120: 63 68 61 72 20 2a 7a 20 3d 20 26 7a 45 78 70 72  char *z = &zExpr
e130: 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 73 77 69 74  [i];..      swit
e140: 63 68 20 28 63 29 20 7b 0a 20 20 20 20 20 20 20  ch (c) {.       
e150: 20 63 61 73 65 20 27 30 27 3a 20 63 61 73 65 20   case '0': case 
e160: 27 31 27 3a 20 63 61 73 65 20 27 32 27 3a 20 63  '1': case '2': c
e170: 61 73 65 20 27 33 27 3a 20 63 61 73 65 20 27 34  ase '3': case '4
e180: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
e190: 27 35 27 3a 20 63 61 73 65 20 27 36 27 3a 20 63  '5': case '6': c
e1a0: 61 73 65 20 27 37 27 3a 20 63 61 73 65 20 27 38  ase '7': case '8
e1b0: 27 3a 20 63 61 73 65 20 27 39 27 3a 0a 20 20 20  ': case '9':.   
e1c0: 20 20 20 20 20 20 20 74 68 4e 65 78 74 4e 75 6d         thNextNum
e1d0: 62 65 72 28 69 6e 74 65 72 70 2c 20 7a 2c 20 6e  ber(interp, z, n
e1e0: 45 78 70 72 2d 69 2c 20 26 70 4e 65 77 2d 3e 6e  Expr-i, &pNew->n
e1f0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e200: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
e210: 20 20 63 61 73 65 20 27 24 27 3a 0a 20 20 20 20    case '$':.    
e220: 20 20 20 20 20 20 74 68 4e 65 78 74 56 61 72 6e        thNextVarn
e230: 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 2c 20 6e  ame(interp, z, n
e240: 45 78 70 72 2d 69 2c 20 26 70 4e 65 77 2d 3e 6e  Expr-i, &pNew->n
e250: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e260: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
e270: 20 20 63 61 73 65 20 27 7b 27 3a 20 63 61 73 65    case '{': case
e280: 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   '[': {.        
e290: 20 20 74 68 4e 65 78 74 43 6f 6d 6d 61 6e 64 28    thNextCommand(
e2a0: 69 6e 74 65 72 70 2c 20 7a 2c 20 6e 45 78 70 72  interp, z, nExpr
e2b0: 2d 69 2c 20 26 70 4e 65 77 2d 3e 6e 56 61 6c 75  -i, &pNew->nValu
e2c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  e);.          br
e2d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  eak;.        }..
e2e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 22 27          case '"'
e2f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
e300: 74 20 69 45 6e 64 20 3d 20 69 3b 0a 20 20 20 20  t iEnd = i;.    
e310: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2b 2b 69        while( ++i
e320: 45 6e 64 3c 6e 45 78 70 72 20 26 26 20 7a 45 78  End<nExpr && zEx
e330: 70 72 5b 69 45 6e 64 5d 21 3d 27 22 27 20 29 7b  pr[iEnd]!='"' ){
e340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
e350: 20 7a 45 78 70 72 5b 69 45 6e 64 5d 3d 3d 27 5c   zExpr[iEnd]=='\
e360: 5c 27 20 29 20 69 45 6e 64 2b 2b 3b 0a 20 20 20  \' ) iEnd++;.   
e370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e380: 20 20 20 69 66 28 20 69 45 6e 64 3c 6e 45 78 70     if( iEnd<nExp
e390: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
e3a0: 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 20 3d 20   pNew->nValue = 
e3b0: 69 45 6e 64 2b 31 2d 69 3b 0a 20 20 20 20 20 20  iEnd+1-i;.      
e3c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
e3e0: 0a 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ..        defaul
e3f0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
e400: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
e410: 66 6f 72 28 6a 3d 30 3b 20 61 4f 70 65 72 61 74  for(j=0; aOperat
e420: 6f 72 5b 6a 5d 2e 7a 4f 70 3b 20 6a 2b 2b 29 7b  or[j].zOp; j++){
e430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
e440: 20 6e 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20   nOp;.          
e450: 20 20 69 66 28 20 61 4f 70 65 72 61 74 6f 72 5b    if( aOperator[
e460: 6a 5d 2e 69 50 72 65 63 65 64 65 6e 63 65 3d 3d  j].iPrecedence==
e470: 31 20 26 26 20 6e 54 6f 6b 65 6e 3e 30 20 29 7b  1 && nToken>0 ){
e480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
e490: 78 70 72 20 2a 70 50 72 65 76 20 3d 20 61 70 54  xpr *pPrev = apT
e4a0: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 2d 31 5d 3b 0a  oken[nToken-1];.
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e4c0: 28 20 21 70 50 72 65 76 2d 3e 70 4f 70 20 7c 7c  ( !pPrev->pOp ||
e4d0: 20 70 50 72 65 76 2d 3e 70 4f 70 2d 3e 65 4f 70   pPrev->pOp->eOp
e4e0: 3d 3d 4f 50 5f 43 4c 4f 53 45 5f 42 52 41 43 4b  ==OP_CLOSE_BRACK
e4f0: 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ET ){.          
e500: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
e520: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e530: 20 20 20 20 20 20 20 20 20 20 6e 4f 70 20 3d 20            nOp = 
e540: 74 68 5f 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74  th_strlen((const
e550: 20 63 68 61 72 20 2a 29 61 4f 70 65 72 61 74 6f   char *)aOperato
e560: 72 5b 6a 5d 2e 7a 4f 70 29 3b 0a 20 20 20 20 20  r[j].zOp);.     
e570: 20 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70         if( (nExp
e580: 72 2d 69 29 3e 3d 6e 4f 70 20 26 26 20 30 3d 3d  r-i)>=nOp && 0==
e590: 6d 65 6d 63 6d 70 28 61 4f 70 65 72 61 74 6f 72  memcmp(aOperator
e5a0: 5b 6a 5d 2e 7a 4f 70 2c 20 26 7a 45 78 70 72 5b  [j].zOp, &zExpr[
e5b0: 69 5d 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20  i], nOp) ){.    
e5c0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
e5d0: 70 4f 70 20 3d 20 26 61 4f 70 65 72 61 74 6f 72  pOp = &aOperator
e5e0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
e5f0: 20 20 20 69 20 2b 3d 20 6e 4f 70 3b 0a 20 20 20     i += nOp;.   
e600: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
e610: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e620: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e630: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
e640: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
e650: 4f 70 20 7c 7c 20 70 4e 65 77 2d 3e 6e 56 61 6c  Op || pNew->nVal
e660: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ue ){.        if
e670: 28 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 20 29  ( pNew->nValue )
e680: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
e690: 20 74 65 72 6d 69 6e 61 6c 2e 20 43 6f 70 79 20   terminal. Copy 
e6a0: 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65  the string value
e6b0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
e6c0: 73 73 65 72 74 28 20 21 70 4e 65 77 2d 3e 70 4f  ssert( !pNew->pO
e6d0: 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  p );.          p
e6e0: 4e 65 77 2d 3e 7a 56 61 6c 75 65 20 3d 20 54 68  New->zValue = Th
e6f0: 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20  _Malloc(interp, 
e700: 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20  pNew->nValue);. 
e710: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
e720: 70 4e 65 77 2d 3e 7a 56 61 6c 75 65 2c 20 7a 2c  pNew->zValue, z,
e730: 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 29 3b 0a   pNew->nValue);.
e740: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 70            i += p
e750: 4e 65 77 2d 3e 6e 56 61 6c 75 65 3b 0a 20 20 20  New->nValue;.   
e760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e770: 66 28 20 28 6e 54 6f 6b 65 6e 25 31 36 29 3d 3d  f( (nToken%16)==
e780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
e790: 2a 20 47 72 6f 77 20 74 68 65 20 61 70 54 6f 6b  * Grow the apTok
e7a0: 65 6e 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  en array. */.   
e7b0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 2a 61 70         Expr **ap
e7c0: 54 6f 6b 65 6e 4f 6c 64 20 3d 20 61 70 54 6f 6b  TokenOld = apTok
e7d0: 65 6e 3b 20 0a 20 20 20 20 20 20 20 20 20 20 61  en; .          a
e7e0: 70 54 6f 6b 65 6e 20 3d 20 54 68 5f 4d 61 6c 6c  pToken = Th_Mall
e7f0: 6f 63 28 69 6e 74 65 72 70 2c 20 73 69 7a 65 6f  oc(interp, sizeo
e800: 66 28 45 78 70 72 20 2a 29 2a 28 6e 54 6f 6b 65  f(Expr *)*(nToke
e810: 6e 2b 31 36 29 29 3b 0a 20 20 20 20 20 20 20 20  n+16));.        
e820: 20 20 6d 65 6d 63 70 79 28 61 70 54 6f 6b 65 6e    memcpy(apToken
e830: 2c 20 61 70 54 6f 6b 65 6e 4f 6c 64 2c 20 73 69  , apTokenOld, si
e840: 7a 65 6f 66 28 45 78 70 72 20 2a 29 2a 6e 54 6f  zeof(Expr *)*nTo
e850: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
e860: 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20  .        /* Put 
e870: 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 61 74  the new token at
e880: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
e890: 61 70 54 6f 6b 65 6e 20 61 72 72 61 79 20 2a 2f  apToken array */
e8a0: 0a 20 20 20 20 20 20 20 20 61 70 54 6f 6b 65 6e  .        apToken
e8b0: 5b 6e 54 6f 6b 65 6e 5d 20 3d 20 70 4e 65 77 3b  [nToken] = pNew;
e8c0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 2b  .        nToken+
e8d0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
e8e0: 20 20 20 20 20 20 20 20 54 68 5f 46 72 65 65 28          Th_Free(
e8f0: 69 6e 74 65 72 70 2c 20 70 4e 65 77 29 3b 0a 20  interp, pNew);. 
e900: 20 20 20 20 20 20 20 72 63 20 3d 20 54 48 5f 45         rc = TH_E
e910: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
e920: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 61 70 54    }.  }..  *papT
e930: 6f 6b 65 6e 20 3d 20 61 70 54 6f 6b 65 6e 3b 0a  oken = apToken;.
e940: 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 6e 54 6f    *pnToken = nTo
e950: 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ken;.  return rc
e960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75  ;.}../*.** Evalu
e970: 61 74 65 20 74 68 65 20 73 74 72 69 6e 67 20 28  ate the string (
e980: 7a 45 78 70 72 2c 20 6e 45 78 70 72 29 20 61 73  zExpr, nExpr) as
e990: 20 61 20 54 68 20 65 78 70 72 65 73 73 69 6f 6e   a Th expression
e9a0: 2e 20 53 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  . Store.** the r
e9b0: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 69 6e 74  esult in the int
e9c0: 65 72 70 72 65 74 65 72 20 69 6e 74 65 72 70 20  erpreter interp 
e9d0: 61 6e 64 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b  and return TH_OK
e9e0: 20 69 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   if.** successfu
e9f0: 6c 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  l. If an error o
ea00: 63 63 75 72 73 2c 20 73 74 6f 72 65 20 61 6e 20  ccurs, store an 
ea10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
ea20: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 70 72 65  .** the interpre
ea30: 74 65 72 20 72 65 73 75 6c 74 20 61 6e 64 20 72  ter result and r
ea40: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
ea50: 6f 64 65 2e 0a 2a 2f 20 0a 69 6e 74 20 54 68 5f  ode..*/ .int Th_
ea60: 45 78 70 72 28 54 68 5f 49 6e 74 65 72 70 20 2a  Expr(Th_Interp *
ea70: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
ea80: 61 72 20 2a 7a 45 78 70 72 2c 20 69 6e 74 20 6e  ar *zExpr, int n
ea90: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Expr){.  int rc;
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
eac0: 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
ead0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaf0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
eb00: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 54 6f 6b 65   */..  int nToke
eb10: 6e 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 2a  n = 0;.  Expr **
eb20: 61 70 54 6f 6b 65 6e 20 3d 20 30 3b 0a 0a 20 20  apToken = 0;..  
eb30: 69 66 28 20 6e 45 78 70 72 3c 30 20 29 7b 0a 20  if( nExpr<0 ){. 
eb40: 20 20 20 6e 45 78 70 72 20 3d 20 74 68 5f 73 74     nExpr = th_st
eb50: 72 6c 65 6e 28 7a 45 78 70 72 29 3b 0a 20 20 7d  rlen(zExpr);.  }
eb60: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
eb70: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 61   expression to a
eb80: 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2e   list of tokens.
eb90: 20 2a 2f 0a 20 20 72 63 20 3d 20 65 78 70 72 50   */.  rc = exprP
eba0: 61 72 73 65 28 69 6e 74 65 72 70 2c 20 7a 45 78  arse(interp, zEx
ebb0: 70 72 2c 20 6e 45 78 70 72 2c 20 26 61 70 54 6f  pr, nExpr, &apTo
ebc0: 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 29 3b 0a 0a  ken, &nToken);..
ebd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 72 73    /* If the pars
ebe0: 69 6e 67 20 77 61 73 20 73 75 63 63 65 73 73 66  ing was successf
ebf0: 75 6c 2c 20 63 72 65 61 74 65 20 61 6e 20 65 78  ul, create an ex
ec00: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
ec10: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 73  om.  ** the pars
ec20: 65 64 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e  ed list of token
ec30: 73 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  s. If successful
ec40: 2c 20 61 70 54 6f 6b 65 6e 5b 30 5d 20 69 73 20  , apToken[0] is 
ec50: 73 65 74 0a 20 20 2a 2a 20 74 6f 20 70 6f 69 6e  set.  ** to poin
ec60: 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  t to the root of
ec70: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ec80: 74 72 65 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  tree. .  */.  if
ec90: 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20  ( rc==TH_OK ){. 
eca0: 20 20 20 72 63 20 3d 20 65 78 70 72 4d 61 6b 65     rc = exprMake
ecb0: 54 72 65 65 28 69 6e 74 65 72 70 2c 20 61 70 54  Tree(interp, apT
ecc0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
ecd0: 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 54 48   }..  if( rc!=TH
ece0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 68 5f 45 72  _OK ){.    Th_Er
ecf0: 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 72  rorMessage(inter
ed00: 70 2c 20 22 73 79 6e 74 61 78 20 65 72 72 6f 72  p, "syntax error
ed10: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 3a 20   in expression: 
ed20: 5c 22 22 2c 20 7a 45 78 70 72 2c 20 6e 45 78 70  \"", zExpr, nExp
ed30: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76  r);.  }..  /* Ev
ed40: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
ed50: 73 73 69 6f 6e 20 74 72 65 65 2e 20 2a 2f 0a 20  ssion tree. */. 
ed60: 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29   if( rc==TH_OK )
ed70: 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70 72 45  {.    rc = exprE
ed80: 76 61 6c 28 69 6e 74 65 72 70 2c 20 61 70 54 6f  val(interp, apTo
ed90: 6b 65 6e 5b 30 5d 29 3b 0a 20 20 7d 0a 0a 20 20  ken[0]);.  }..  
eda0: 2f 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 61  /* Free memory a
edb0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70 72  llocated by expr
edc0: 50 61 72 73 65 28 29 2e 20 2a 2f 0a 20 20 66 6f  Parse(). */.  fo
edd0: 72 28 69 3d 30 3b 20 69 3c 6e 54 6f 6b 65 6e 3b  r(i=0; i<nToken;
ede0: 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70 72 46   i++){.    exprF
edf0: 72 65 65 28 69 6e 74 65 72 70 2c 20 61 70 54 6f  ree(interp, apTo
ee00: 6b 65 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54  ken[i]);.  }.  T
ee10: 68 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 61  h_Free(interp, a
ee20: 70 54 6f 6b 65 6e 29 3b 0a 0a 20 20 72 65 74 75  pToken);..  retu
ee30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ee40: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
ee50: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ee60: 20 61 20 6e 65 77 20 68 61 73 68 2d 74 61 62 6c   a new hash-tabl
ee70: 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  e. The caller sh
ee80: 6f 75 6c 64 0a 2a 2a 20 28 65 76 65 6e 74 75 61  ould.** (eventua
ee90: 6c 6c 79 29 20 64 65 6c 65 74 65 20 74 68 65 20  lly) delete the 
eea0: 68 61 73 68 2d 74 61 62 6c 65 20 62 79 20 70 61  hash-table by pa
eeb0: 73 73 69 6e 67 20 69 74 20 74 6f 20 54 68 5f 48  ssing it to Th_H
eec0: 61 73 68 44 65 6c 65 74 65 28 29 2e 0a 2a 2f 0a  ashDelete()..*/.
eed0: 54 68 5f 48 61 73 68 20 2a 54 68 5f 48 61 73 68  Th_Hash *Th_Hash
eee0: 4e 65 77 28 54 68 5f 49 6e 74 65 72 70 20 2a 69  New(Th_Interp *i
eef0: 6e 74 65 72 70 29 7b 0a 20 20 54 68 5f 48 61 73  nterp){.  Th_Has
ef00: 68 20 2a 70 3b 0a 20 20 70 20 3d 20 54 68 5f 4d  h *p;.  p = Th_M
ef10: 61 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20 73 69  alloc(interp, si
ef20: 7a 65 6f 66 28 54 68 5f 48 61 73 68 29 29 3b 0a  zeof(Th_Hash));.
ef30: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
ef40: 2a 0a 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72  *.** Iterate thr
ef50: 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
ef60: 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
ef70: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
ef80: 6c 65 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 74 68  le. Invoke.** th
ef90: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
efa0: 69 6f 6e 20 78 43 61 6c 6c 62 61 63 6b 20 66 6f  ion xCallback fo
efb0: 72 20 65 61 63 68 20 65 6e 74 72 79 2e 20 54 68  r each entry. Th
efc0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
efd0: 74 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 78  t.** passed to x
efe0: 43 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 63 6f  Callback is a co
eff0: 70 79 20 6f 66 20 74 68 65 20 66 6f 75 72 74 68  py of the fourth
f000: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
f010: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63   to this.** func
f020: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 54 68  tion..*/.void Th
f030: 5f 48 61 73 68 49 74 65 72 61 74 65 28 0a 20 20  _HashIterate(.  
f040: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  Th_Interp *inter
f050: 70 2c 20 0a 20 20 54 68 5f 48 61 73 68 20 2a 70  p, .  Th_Hash *p
f060: 48 61 73 68 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Hash,.  void (*x
f070: 43 61 6c 6c 62 61 63 6b 29 28 54 68 5f 48 61 73  Callback)(Th_Has
f080: 68 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 2c 20  hEntry *pEntry, 
f090: 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 29 2c  void *pContext),
f0a0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
f0b0: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t.){.  int i;.  
f0c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 54 48 5f 48 41  for(i=0; i<TH_HA
f0d0: 53 48 53 49 5a 45 3b 20 69 2b 2b 29 7b 0a 20 20  SHSIZE; i++){.  
f0e0: 20 20 54 68 5f 48 61 73 68 45 6e 74 72 79 20 2a    Th_HashEntry *
f0f0: 70 45 6e 74 72 79 3b 0a 20 20 20 20 54 68 5f 48  pEntry;.    Th_H
f100: 61 73 68 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b  ashEntry *pNext;
f110: 0a 20 20 20 20 66 6f 72 28 70 45 6e 74 72 79 3d  .    for(pEntry=
f120: 70 48 61 73 68 2d 3e 61 5b 69 5d 3b 20 70 45 6e  pHash->a[i]; pEn
f130: 74 72 79 3b 20 70 45 6e 74 72 79 3d 70 4e 65 78  try; pEntry=pNex
f140: 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
f150: 3d 20 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74 3b  = pEntry->pNext;
f160: 0a 20 20 20 20 20 20 78 43 61 6c 6c 62 61 63 6b  .      xCallback
f170: 28 70 45 6e 74 72 79 2c 20 70 43 6f 6e 74 65 78  (pEntry, pContex
f180: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
f190: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
f1a0: 6e 63 74 69 6f 6e 20 66 6f 72 20 54 68 5f 48 61  nction for Th_Ha
f1b0: 73 68 44 65 6c 65 74 65 28 29 2e 0a 2a 2f 0a 73  shDelete()..*/.s
f1c0: 74 61 74 69 63 20 76 6f 69 64 20 78 46 72 65 65  tatic void xFree
f1d0: 48 61 73 68 45 6e 74 72 79 28 54 68 5f 48 61 73  HashEntry(Th_Has
f1e0: 68 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 2c 20  hEntry *pEntry, 
f1f0: 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 29 7b  void *pContext){
f200: 0a 20 20 54 68 5f 46 72 65 65 28 28 54 68 5f 49  .  Th_Free((Th_I
f210: 6e 74 65 72 70 20 2a 29 70 43 6f 6e 74 65 78 74  nterp *)pContext
f220: 2c 20 28 76 6f 69 64 20 2a 29 70 45 6e 74 72 79  , (void *)pEntry
f230: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
f240: 20 61 20 68 61 73 68 2d 74 61 62 6c 65 20 70 72   a hash-table pr
f250: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
f260: 65 64 20 62 79 20 54 68 5f 48 61 73 68 4e 65 77  ed by Th_HashNew
f270: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 54 68 5f 48  ()..*/.void Th_H
f280: 61 73 68 44 65 6c 65 74 65 28 54 68 5f 49 6e 74  ashDelete(Th_Int
f290: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 68 5f  erp *interp, Th_
f2a0: 48 61 73 68 20 2a 70 48 61 73 68 29 7b 0a 20 20  Hash *pHash){.  
f2b0: 69 66 28 20 70 48 61 73 68 20 29 7b 0a 20 20 20  if( pHash ){.   
f2c0: 20 54 68 5f 48 61 73 68 49 74 65 72 61 74 65 28   Th_HashIterate(
f2d0: 69 6e 74 65 72 70 2c 20 70 48 61 73 68 2c 20 78  interp, pHash, x
f2e0: 46 72 65 65 48 61 73 68 45 6e 74 72 79 2c 20 28  FreeHashEntry, (
f2f0: 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a  void *)interp);.
f300: 20 20 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65      Th_Free(inte
f310: 72 70 2c 20 70 48 61 73 68 29 3b 0a 20 20 7d 0a  rp, pHash);.  }.
f320: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
f330: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
f340: 6f 20 69 6e 73 65 72 74 20 6f 72 20 64 65 6c 65  o insert or dele
f350: 74 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 74  te hash table it
f360: 65 6d 73 2c 20 6f 72 20 74 6f 20 0a 2a 2a 20 71  ems, or to .** q
f370: 75 65 72 79 20 61 20 68 61 73 68 20 74 61 62 6c  uery a hash tabl
f380: 65 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  e for an existin
f390: 67 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  g item..**.** If
f3a0: 20 70 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73   parameter op is
f3b0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
f3c0: 20 74 68 65 6e 20 74 68 65 20 68 61 73 68 2d 74   then the hash-t
f3d0: 61 62 6c 65 20 65 6c 65 6d 65 6e 74 20 0a 2a 2a  able element .**
f3e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 28   identified by (
f3f0: 7a 4b 65 79 2c 20 6e 4b 65 79 29 20 69 73 20 72  zKey, nKey) is r
f400: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
f410: 68 61 73 68 2d 74 61 62 6c 65 20 69 66 20 69 74  hash-table if it
f420: 0a 2a 2a 20 65 78 69 73 74 73 2e 20 4e 55 4c 4c  .** exists. NULL
f430: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
f440: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
f450: 66 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  f the hash-table
f460: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 74 65   contains an ite
f470: 6d 20 77 69 74 68 20 6b 65 79 20 28 7a 4b 65 79  m with key (zKey
f480: 2c 20 6e 4b 65 79 29 2c 0a 2a 2a 20 61 20 70 6f  , nKey),.** a po
f490: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 73 73  inter to the ass
f4a0: 6f 63 69 61 74 65 64 20 54 68 5f 48 61 73 68 45  ociated Th_HashE
f4b0: 6e 74 72 79 20 69 73 20 72 65 74 75 72 6e 65 64  ntry is returned
f4c0: 2e 20 49 66 20 70 61 72 61 6d 65 74 65 72 0a 2a  . If parameter.*
f4d0: 2a 20 6f 70 20 69 73 20 67 72 65 61 74 65 72 20  * op is greater 
f4e0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
f4f0: 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 61  a new entry is a
f500: 64 64 65 64 20 69 66 20 6f 6e 65 20 63 61 6e 6e  dded if one cann
f510: 6f 74 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 2e 20  ot.** be found. 
f520: 49 66 20 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74  If op is zero, t
f530: 68 65 6e 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  hen NULL is retu
f540: 72 6e 65 64 20 69 66 20 74 68 65 20 69 74 65 6d  rned if the item
f550: 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 6c 72 65 61   is.** not alrea
f560: 64 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  dy present in th
f570: 65 20 68 61 73 68 2d 74 61 62 6c 65 2e 0a 2a 2f  e hash-table..*/
f580: 0a 54 68 5f 48 61 73 68 45 6e 74 72 79 20 2a 54  .Th_HashEntry *T
f590: 68 5f 48 61 73 68 46 69 6e 64 28 0a 20 20 54 68  h_HashFind(.  Th
f5a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
f5b0: 20 0a 20 20 54 68 5f 48 61 73 68 20 2a 70 48 61   .  Th_Hash *pHa
f5c0: 73 68 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  sh,.  const char
f5d0: 20 2a 7a 4b 65 79 2c 0a 20 20 69 6e 74 20 6e 4b   *zKey,.  int nK
f5e0: 65 79 2c 0a 20 20 69 6e 74 20 6f 70 20 20 20 20  ey,.  int op    
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 2f 2a 20 2d 76 65 20 3d 20 64 65 6c 65 74    /* -ve = delet
f610: 65 2c 20 30 20 3d 20 66 69 6e 64 2c 20 2b 76 65  e, 0 = find, +ve
f620: 20 3d 20 69 6e 73 65 72 74 20 2a 2f 0a 29 7b 0a   = insert */.){.
f630: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
f640: 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Key = 0;.  int i
f650: 3b 0a 20 20 54 68 5f 48 61 73 68 45 6e 74 72 79  ;.  Th_HashEntry
f660: 20 2a 70 52 65 74 3b 0a 20 20 54 68 5f 48 61 73   *pRet;.  Th_Has
f670: 68 45 6e 74 72 79 20 2a 2a 70 70 52 65 74 3b 0a  hEntry **ppRet;.
f680: 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30 20 29 7b  .  if( nKey<0 ){
f690: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 74 68 5f 73  .    nKey = th_s
f6a0: 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 7d  trlen(zKey);.  }
f6b0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
f6c0: 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Key; i++){.    i
f6d0: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 33 29 20  Key = (iKey<<3) 
f6e0: 5e 20 69 4b 65 79 20 5e 20 7a 4b 65 79 5b 69 5d  ^ iKey ^ zKey[i]
f6f0: 3b 0a 20 20 7d 0a 20 20 69 4b 65 79 20 3d 20 69  ;.  }.  iKey = i
f700: 4b 65 79 20 25 20 54 48 5f 48 41 53 48 53 49 5a  Key % TH_HASHSIZ
f710: 45 3b 0a 0a 20 20 66 6f 72 28 70 70 52 65 74 3d  E;..  for(ppRet=
f720: 26 70 48 61 73 68 2d 3e 61 5b 69 4b 65 79 5d 3b  &pHash->a[iKey];
f730: 20 28 70 52 65 74 3d 2a 70 70 52 65 74 29 3b 20   (pRet=*ppRet); 
f740: 70 70 52 65 74 3d 26 70 52 65 74 2d 3e 70 4e 65  ppRet=&pRet->pNe
f750: 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  xt){.    assert(
f760: 20 70 52 65 74 20 26 26 20 70 70 52 65 74 20 26   pRet && ppRet &
f770: 26 20 2a 70 70 52 65 74 3d 3d 70 52 65 74 20 29  & *ppRet==pRet )
f780: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e  ;.    if( pRet->
f790: 6e 4b 65 79 3d 3d 6e 4b 65 79 20 26 26 20 30 3d  nKey==nKey && 0=
f7a0: 3d 6d 65 6d 63 6d 70 28 70 52 65 74 2d 3e 7a 4b  =memcmp(pRet->zK
f7b0: 65 79 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 20  ey, zKey, nKey) 
f7c0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
f7d0: 69 66 28 20 6f 70 3c 30 20 26 26 20 70 52 65 74  if( op<0 && pRet
f7e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f7f0: 70 70 52 65 74 20 26 26 20 2a 70 70 52 65 74 3d  ppRet && *ppRet=
f800: 3d 70 52 65 74 20 29 3b 0a 20 20 20 20 2a 70 70  =pRet );.    *pp
f810: 52 65 74 20 3d 20 70 52 65 74 2d 3e 70 4e 65 78  Ret = pRet->pNex
f820: 74 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69  t;.    Th_Free(i
f830: 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
f840: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
f850: 0a 20 20 69 66 28 20 6f 70 3e 30 20 26 26 20 21  .  if( op>0 && !
f860: 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74  pRet ){.    pRet
f870: 20 3d 20 28 54 68 5f 48 61 73 68 45 6e 74 72 79   = (Th_HashEntry
f880: 20 2a 29 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74   *)Th_Malloc(int
f890: 65 72 70 2c 20 73 69 7a 65 6f 66 28 54 68 5f 48  erp, sizeof(Th_H
f8a0: 61 73 68 45 6e 74 72 79 29 20 2b 20 6e 4b 65 79  ashEntry) + nKey
f8b0: 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e 7a 4b 65  );.    pRet->zKe
f8c0: 79 20 3d 20 28 63 68 61 72 20 2a 29 26 70 52 65  y = (char *)&pRe
f8d0: 74 5b 31 5d 3b 0a 20 20 20 20 70 52 65 74 2d 3e  t[1];.    pRet->
f8e0: 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  nKey = nKey;.   
f8f0: 20 6d 65 6d 63 70 79 28 70 52 65 74 2d 3e 7a 4b   memcpy(pRet->zK
f900: 65 79 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b  ey, zKey, nKey);
f910: 0a 20 20 20 20 70 52 65 74 2d 3e 70 4e 65 78 74  .    pRet->pNext
f920: 20 3d 20 70 48 61 73 68 2d 3e 61 5b 69 4b 65 79   = pHash->a[iKey
f930: 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e 61 5b  ];.    pHash->a[
f940: 69 4b 65 79 5d 20 3d 20 70 52 65 74 3b 0a 20 20  iKey] = pRet;.  
f950: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
f960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f970: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
f980: 73 61 6d 65 20 61 73 20 74 68 65 20 73 74 61 6e  same as the stan
f990: 64 61 72 64 20 73 74 72 6c 65 6e 28 29 20 66 75  dard strlen() fu
f9a0: 6e 63 74 69 6f 6e 2c 20 65 78 63 65 70 74 0a 2a  nction, except.*
f9b0: 2a 20 74 68 61 74 20 69 74 20 72 65 74 75 72 6e  * that it return
f9c0: 73 20 30 20 28 69 6e 73 74 65 61 64 20 6f 66 20  s 0 (instead of 
f9d0: 62 65 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 29  being undefined)
f9e0: 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
f9f0: 20 69 73 0a 2a 2a 20 61 20 6e 75 6c 6c 20 70 6f   is.** a null po
fa00: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 74 68  inter..*/.int th
fa10: 5f 73 74 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  _strlen(const ch
fa20: 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 69 6e 74  ar *zStr){.  int
fa30: 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 53   n = 0;.  if( zS
fa40: 74 72 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  tr ){.    while(
fa50: 20 7a 53 74 72 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a   zStr[n] ) n++;.
fa60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
fa70: 7d 0a 0a 2f 2a 20 57 68 69 74 65 73 70 61 63 65  }../* Whitespace
fa80: 20 63 68 61 72 61 63 74 65 72 73 3a 0a 2a 2a 0a   characters:.**.
fa90: 2a 2a 20 20 20 20 20 27 20 27 20 20 20 20 30 78  **     ' '    0x
faa0: 32 30 0a 2a 2a 20 20 20 20 20 27 5c 74 27 20 20  20.**     '\t'  
fab0: 20 30 78 30 39 0a 2a 2a 20 20 20 20 20 27 5c 6e   0x09.**     '\n
fac0: 27 20 20 20 30 78 30 41 0a 2a 2a 20 20 20 20 20  '   0x0A.**     
fad0: 27 5c 76 27 20 20 20 30 78 30 42 0a 2a 2a 20 20  '\v'   0x0B.**  
fae0: 20 20 20 27 5c 66 27 20 20 20 30 78 30 43 0a 2a     '\f'   0x0C.*
faf0: 2a 20 20 20 20 20 27 5c 72 27 20 20 20 30 78 30  *     '\r'   0x0
fb00: 44 0a 2a 2a 0a 2a 2a 20 57 68 69 74 65 73 70 61  D.**.** Whitespa
fb10: 63 65 20 63 68 61 72 61 63 74 65 72 73 20 68 61  ce characters ha
fb20: 76 65 20 74 68 65 20 30 78 30 31 20 66 6c 61 67  ve the 0x01 flag
fb30: 20 73 65 74 2e 20 44 65 63 69 6d 61 6c 20 64 69   set. Decimal di
fb40: 67 69 74 73 20 68 61 76 65 20 74 68 65 0a 2a 2a  gits have the.**
fb50: 20 30 78 32 20 66 6c 61 67 20 73 65 74 2e 20 53   0x2 flag set. S
fb60: 69 6e 67 6c 65 20 62 79 74 65 20 70 72 69 6e 74  ingle byte print
fb70: 61 62 6c 65 20 63 68 61 72 61 63 74 65 72 73 20  able characters 
fb80: 68 61 76 65 20 74 68 65 20 30 78 34 20 66 6c 61  have the 0x4 fla
fb90: 67 20 73 65 74 2e 0a 2a 2a 20 41 6c 70 68 61 62  g set..** Alphab
fba0: 65 74 20 63 68 61 72 61 63 74 65 72 73 20 68 61  et characters ha
fbb0: 76 65 20 74 68 65 20 30 78 38 20 62 69 74 20 73  ve the 0x8 bit s
fbc0: 65 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  et. .**.** The s
fbd0: 70 65 63 69 61 6c 20 6c 69 73 74 20 63 68 61 72  pecial list char
fbe0: 61 63 74 65 72 73 20 68 61 76 65 20 74 68 65 20  acters have the 
fbf0: 30 78 31 30 20 66 6c 61 67 20 73 65 74 0a 2a 2a  0x10 flag set.**
fc00: 0a 2a 2a 20 20 20 20 7b 20 7d 20 5b 20 5d 20 5c  .**    { } [ ] \
fc10: 20 3b 20 27 20 22 0a 2a 2a 0a 2a 2a 20 20 20 20   ; ' ".**.**    
fc20: 22 20 30 78 32 32 0a 2a 2a 0a 2a 2f 0a 73 74 61  " 0x22.**.*/.sta
fc30: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
fc40: 72 20 61 43 68 61 72 50 72 6f 70 5b 32 35 36 5d  r aCharProp[256]
fc50: 20 3d 20 7b 0a 20 20 30 2c 20 20 30 2c 20 20 30   = {.  0,  0,  0
fc60: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
fc70: 2c 20 20 30 2c 20 20 20 20 20 30 2c 20 20 31 2c  ,  0,     0,  1,
fc80: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
fc90: 20 20 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78    0,  0,   /* 0x
fca0: 30 2e 20 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20  0. */.  0,  0,  
fcb0: 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  1,  1,  0,  0,  
fcc0: 30 2c 20 20 30 2c 20 20 20 20 20 30 2c 20 20 30  0,  0,     0,  0
fcd0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
fce0: 2c 20 20 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30  ,  0,  0,   /* 0
fcf0: 78 31 2e 20 2a 2f 0a 20 20 35 2c 20 20 34 2c 20  x1. */.  5,  4, 
fd00: 32 30 2c 20 20 34 2c 20 20 34 2c 20 20 34 2c 20  20,  4,  4,  4, 
fd10: 20 34 2c 20 20 34 2c 20 20 20 20 20 34 2c 20 20   4,  4,     4,  
fd20: 34 2c 20 20 34 2c 20 20 34 2c 20 20 34 2c 20 20  4,  4,  4,  4,  
fd30: 34 2c 20 20 34 2c 20 20 34 2c 20 20 20 2f 2a 20  4,  4,  4,   /* 
fd40: 30 78 32 2e 20 2a 2f 0a 20 20 36 2c 20 20 36 2c  0x2. */.  6,  6,
fd50: 20 20 36 2c 20 20 36 2c 20 20 36 2c 20 20 36 2c    6,  6,  6,  6,
fd60: 20 20 36 2c 20 20 36 2c 20 20 20 20 20 36 2c 20    6,  6,     6, 
fd70: 20 36 2c 20 20 34 2c 20 32 30 2c 20 20 34 2c 20   6,  4, 20,  4, 
fd80: 20 34 2c 20 20 34 2c 20 20 34 2c 20 20 20 2f 2a   4,  4,  4,   /*
fd90: 20 30 78 33 2e 20 2a 2f 0a 20 20 34 2c 20 31 32   0x3. */.  4, 12
fda0: 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32  , 12, 12, 12, 12
fdb0: 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31 32 2c  , 12, 12,    12,
fdc0: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c   12, 12, 12, 12,
fdd0: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 2f   12, 12, 12,   /
fde0: 2a 20 30 78 34 2e 20 2a 2f 0a 20 31 32 2c 20 31  * 0x4. */. 12, 1
fdf0: 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31  2, 12, 12, 12, 1
fe00: 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31 32  2, 12, 12,    12
fe10: 2c 20 31 32 2c 20 31 32 2c 20 32 30 2c 20 32 30  , 12, 12, 20, 20
fe20: 2c 20 32 30 2c 20 20 34 2c 20 20 34 2c 20 20 20  , 20,  4,  4,   
fe30: 2f 2a 20 30 78 35 2e 20 2a 2f 0a 20 20 34 2c 20  /* 0x5. */.  4, 
fe40: 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20  12, 12, 12, 12, 
fe50: 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31  12, 12, 12,    1
fe60: 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31  2, 12, 12, 12, 1
fe70: 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 20  2, 12, 12, 12,  
fe80: 20 2f 2a 20 30 78 36 2e 20 2a 2f 0a 20 31 32 2c   /* 0x6. */. 12,
fe90: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c   12, 12, 12, 12,
fea0: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 20   12, 12, 12,    
feb0: 31 32 2c 20 31 32 2c 20 31 32 2c 20 32 30 2c 20  12, 12, 12, 20, 
fec0: 20 34 2c 20 32 30 2c 20 20 34 2c 20 20 34 2c 20   4, 20,  4,  4, 
fed0: 20 20 2f 2a 20 30 78 37 2e 20 2a 2f 0a 0a 20 20    /* 0x7. */..  
fee0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
fef0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
ff00: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
ff10: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
ff20: 2c 20 20 20 2f 2a 20 30 78 38 2e 20 2a 2f 0a 20  ,   /* 0x8. */. 
ff30: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
ff40: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
ff50: 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20      0,  0,  0,  
ff60: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
ff70: 30 2c 20 20 20 2f 2a 20 30 78 39 2e 20 2a 2f 0a  0,   /* 0x9. */.
ff80: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ff90: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ffa0: 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20       0,  0,  0, 
ffb0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
ffc0: 20 30 2c 20 20 20 2f 2a 20 30 78 41 2e 20 2a 2f   0,   /* 0xA. */
ffd0: 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  .  0,  0,  0,  0
ffe0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
fff0: 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c  ,     0,  0,  0,
10000 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
10010 20 20 30 2c 20 20 20 2f 2a 20 30 78 42 2e 20 2a    0,   /* 0xB. *
10020 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /.  0,  0,  0,  
10030 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
10040 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30  0,     0,  0,  0
10050 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
10060 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 43 2e 20  ,  0,   /* 0xC. 
10070 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */.  0,  0,  0, 
10080 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
10090 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20   0,     0,  0,  
100a0 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
100b0 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 44 2e  0,  0,   /* 0xD.
100c0 20 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c   */.  0,  0,  0,
100d0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
100e0 20 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20    0,     0,  0, 
100f0 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
10100 20 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 45   0,  0,   /* 0xE
10110 2e 20 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30  . */.  0,  0,  0
10120 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
10130 2c 20 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c  ,  0,     0,  0,
10140 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
10150 20 20 30 2c 20 20 30 20 20 20 20 2f 2a 20 30 78    0,  0    /* 0x
10160 46 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  F. */.};../*.** 
10170 43 6c 6f 6e 65 20 6f 66 20 74 68 65 20 73 74 61  Clone of the sta
10180 6e 64 61 72 64 20 69 73 73 70 61 63 65 28 29 20  ndard isspace() 
10190 61 6e 64 20 69 73 64 69 67 69 74 20 66 75 6e 63  and isdigit func
101a0 74 69 6f 6e 2f 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  tion/macros..*/.
101b0 69 6e 74 20 74 68 5f 69 73 73 70 61 63 65 28 63  int th_isspace(c
101c0 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75 72 6e  har c){.  return
101d0 20 28 61 43 68 61 72 50 72 6f 70 5b 28 75 6e 73   (aCharProp[(uns
101e0 69 67 6e 65 64 20 63 68 61 72 29 63 5d 20 26 20  igned char)c] & 
101f0 30 78 30 31 29 3b 0a 7d 0a 69 6e 74 20 74 68 5f  0x01);.}.int th_
10200 69 73 64 69 67 69 74 28 63 68 61 72 20 63 29 7b  isdigit(char c){
10210 0a 20 20 72 65 74 75 72 6e 20 28 61 43 68 61 72  .  return (aChar
10220 50 72 6f 70 5b 28 75 6e 73 69 67 6e 65 64 20 63  Prop[(unsigned c
10230 68 61 72 29 63 5d 20 26 20 30 78 30 32 29 3b 0a  har)c] & 0x02);.
10240 7d 0a 69 6e 74 20 74 68 5f 69 73 73 70 65 63 69  }.int th_isspeci
10250 61 6c 28 63 68 61 72 20 63 29 7b 0a 20 20 72 65  al(char c){.  re
10260 74 75 72 6e 20 28 61 43 68 61 72 50 72 6f 70 5b  turn (aCharProp[
10270 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 63  (unsigned char)c
10280 5d 20 26 20 30 78 31 31 29 3b 0a 7d 0a 69 6e 74  ] & 0x11);.}.int
10290 20 74 68 5f 69 73 61 6c 6e 75 6d 28 63 68 61 72   th_isalnum(char
102a0 20 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61   c){.  return (a
102b0 43 68 61 72 50 72 6f 70 5b 28 75 6e 73 69 67 6e  CharProp[(unsign
102c0 65 64 20 63 68 61 72 29 63 5d 20 26 20 30 78 30  ed char)c] & 0x0
102d0 41 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4c  A);.}..#ifndef L
102e0 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 0a 23  ONGDOUBLE_TYPE.#
102f0 20 64 65 66 69 6e 65 20 4c 4f 4e 47 44 4f 55 42   define LONGDOUB
10300 4c 45 5f 54 59 50 45 20 6c 6f 6e 67 20 64 6f 75  LE_TYPE long dou
10310 62 6c 65 0a 23 65 6e 64 69 66 0a 74 79 70 65 64  ble.#endif.typed
10320 65 66 20 63 68 61 72 20 75 38 3b 0a 0a 0a 2f 2a  ef char u8;.../*
10330 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10340 69 66 20 7a 20 69 73 20 61 20 70 75 72 65 20 6e  if z is a pure n
10350 75 6d 65 72 69 63 20 73 74 72 69 6e 67 2e 20 20  umeric string.  
10360 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
10370 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f  the.** string co
10380 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61  ntains any chara
10390 63 74 65 72 20 77 68 69 63 68 20 69 73 20 6e 6f  cter which is no
103a0 74 20 70 61 72 74 20 6f 66 20 61 20 6e 75 6d 62  t part of a numb
103b0 65 72 2e 20 49 66 0a 2a 2a 20 74 68 65 20 73 74  er. If.** the st
103c0 72 69 6e 67 20 69 73 20 6e 75 6d 65 72 69 63 20  ring is numeric 
103d0 61 6e 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  and contains the
103e0 20 27 2e 27 20 63 68 61 72 61 63 74 65 72 2c 20   '.' character, 
103f0 73 65 74 20 2a 72 65 61 6c 6e 75 6d 0a 2a 2a 20  set *realnum.** 
10400 74 6f 20 54 52 55 45 20 28 6f 74 68 65 72 77 69  to TRUE (otherwi
10410 73 65 20 46 41 4c 53 45 29 2e 0a 2a 2a 0a 2a 2a  se FALSE)..**.**
10420 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   An empty string
10430 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6e   is considered n
10440 6f 6e 2d 6e 75 6d 65 72 69 63 2e 0a 2a 2f 0a 73  on-numeric..*/.s
10450 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
10460 33 49 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20  3IsNumber(const 
10470 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65  char *z, int *re
10480 61 6c 6e 75 6d 29 7b 0a 20 20 69 6e 74 20 69 6e  alnum){.  int in
10490 63 72 20 3d 20 31 3b 0a 20 20 69 66 28 20 2a 7a  cr = 1;.  if( *z
104a0 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27  =='-' || *z=='+'
104b0 20 29 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20   ) z += incr;.  
104c0 69 66 28 20 21 74 68 5f 69 73 64 69 67 69 74 28  if( !th_isdigit(
104d0 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20 20  *(u8*)z) ){.    
104e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
104f0 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 69 66 28  z += incr;.  if(
10500 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
10510 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  num = 0;.  while
10520 28 20 74 68 5f 69 73 64 69 67 69 74 28 2a 28 75  ( th_isdigit(*(u
10530 38 2a 29 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e  8*)z) ){ z += in
10540 63 72 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d  cr; }.  if( *z==
10550 27 2e 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  '.' ){.    z += 
10560 69 6e 63 72 3b 0a 20 20 20 20 69 66 28 20 21 74  incr;.    if( !t
10570 68 5f 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29  h_isdigit(*(u8*)
10580 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
10590 20 20 20 77 68 69 6c 65 28 20 74 68 5f 69 73 64     while( th_isd
105a0 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b  igit(*(u8*)z) ){
105b0 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20 20   z += incr; }.  
105c0 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
105d0 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20  *realnum = 1;.  
105e0 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20  }.  if( *z=='e' 
105f0 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20  || *z=='E' ){.  
10600 20 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 20    z += incr;.   
10610 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20   if( *z=='+' || 
10620 2a 7a 3d 3d 27 2d 27 20 29 20 7a 20 2b 3d 20 69  *z=='-' ) z += i
10630 6e 63 72 3b 0a 20 20 20 20 69 66 28 20 21 74 68  ncr;.    if( !th
10640 5f 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a  _isdigit(*(u8*)z
10650 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
10660 20 20 77 68 69 6c 65 28 20 74 68 5f 69 73 64 69    while( th_isdi
10670 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b 20  git(*(u8*)z) ){ 
10680 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20 20 20  z += incr; }.   
10690 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
106a0 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d  realnum = 1;.  }
106b0 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b  .  return *z==0;
106c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
106d0 72 69 6e 67 20 7a 5b 5d 20 69 73 20 61 6e 20 61  ring z[] is an a
106e0 73 63 69 69 20 72 65 70 72 65 73 65 6e 74 61 74  scii representat
106f0 69 6f 6e 20 6f 66 20 61 20 72 65 61 6c 20 6e 75  ion of a real nu
10700 6d 62 65 72 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74  mber..** Convert
10710 20 74 68 69 73 20 73 74 72 69 6e 67 20 74 6f 20   this string to 
10720 61 20 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  a double..**.** 
10730 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
10740 75 6d 65 73 20 74 68 61 74 20 7a 5b 5d 20 72 65  umes that z[] re
10750 61 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64 20  ally is a valid 
10760 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 0a 2a  number.  If it.*
10770 2a 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 72 65  * is not, the re
10780 73 75 6c 74 20 69 73 20 75 6e 64 65 66 69 6e 65  sult is undefine
10790 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
107a0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e  utine is used in
107b0 73 74 65 61 64 20 6f 66 20 74 68 65 20 6c 69 62  stead of the lib
107c0 72 61 72 79 20 61 74 6f 66 28 29 20 66 75 6e 63  rary atof() func
107d0 74 69 6f 6e 20 62 65 63 61 75 73 65 0a 2a 2a 20  tion because.** 
107e0 74 68 65 20 6c 69 62 72 61 72 79 20 61 74 6f 66  the library atof
107f0 28 29 20 6d 69 67 68 74 20 77 61 6e 74 20 74 6f  () might want to
10800 20 75 73 65 20 22 2c 22 20 61 73 20 74 68 65 20   use "," as the 
10810 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 69 6e  decimal point in
10820 73 74 65 61 64 0a 2a 2a 20 6f 66 20 22 2e 22 20  stead.** of "." 
10830 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77  depending on how
10840 20 6c 6f 63 61 6c 65 20 69 73 20 73 65 74 2e 20   locale is set. 
10850 20 42 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   But that would 
10860 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 0a 2a  cause problems.*
10870 2a 20 66 6f 72 20 53 51 4c 2e 20 20 53 6f 20 74  * for SQL.  So t
10880 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
10890 79 73 20 75 73 65 73 20 22 2e 22 20 72 65 67 61  ys uses "." rega
108a0 72 64 6c 65 73 73 20 6f 66 20 6c 6f 63 61 6c 65  rdless of locale
108b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108c0 73 71 6c 69 74 65 33 41 74 6f 46 28 63 6f 6e 73  sqlite3AtoF(cons
108d0 74 20 63 68 61 72 20 2a 7a 2c 20 64 6f 75 62 6c  t char *z, doubl
108e0 65 20 2a 70 52 65 73 75 6c 74 29 7b 0a 20 20 69  e *pResult){.  i
108f0 6e 74 20 73 69 67 6e 20 3d 20 31 3b 0a 20 20 63  nt sign = 1;.  c
10900 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
10910 6e 20 3d 20 7a 3b 0a 20 20 4c 4f 4e 47 44 4f 55  n = z;.  LONGDOU
10920 42 4c 45 5f 54 59 50 45 20 76 31 20 3d 20 30 2e  BLE_TYPE v1 = 0.
10930 30 3b 0a 20 20 77 68 69 6c 65 28 20 74 68 5f 69  0;.  while( th_i
10940 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29 20  sspace(*(u8*)z) 
10950 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 2a 7a 3d  ) z++;.  if( *z=
10960 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73 69 67 6e  ='-' ){.    sign
10970 20 3d 20 2d 31 3b 0a 20 20 20 20 7a 2b 2b 3b 0a   = -1;.    z++;.
10980 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 3d 3d    }else if( *z==
10990 27 2b 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a  '+' ){.    z++;.
109a0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 74 68 5f    }.  while( th_
109b0 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29  isdigit(*(u8*)z)
109c0 20 29 7b 0a 20 20 20 20 76 31 20 3d 20 76 31 2a   ){.    v1 = v1*
109d0 31 30 2e 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27  10.0 + (*z - '0'
109e0 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a  );.    z++;.  }.
109f0 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
10a00 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
10a10 54 59 50 45 20 64 69 76 69 73 6f 72 20 3d 20 31  TYPE divisor = 1
10a20 2e 30 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  .0;.    z++;.   
10a30 20 77 68 69 6c 65 28 20 74 68 5f 69 73 64 69 67   while( th_isdig
10a40 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20  it(*(u8*)z) ){. 
10a50 20 20 20 20 20 76 31 20 3d 20 76 31 2a 31 30 2e       v1 = v1*10.
10a60 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a  0 + (*z - '0');.
10a70 20 20 20 20 20 20 64 69 76 69 73 6f 72 20 2a 3d        divisor *=
10a80 20 31 30 2e 30 3b 0a 20 20 20 20 20 20 7a 2b 2b   10.0;.      z++
10a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 31 20 2f  ;.    }.    v1 /
10aa0 3d 20 64 69 76 69 73 6f 72 3b 0a 20 20 7d 0a 20  = divisor;.  }. 
10ab0 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
10ac0 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 69  *z=='E' ){.    i
10ad0 6e 74 20 65 73 69 67 6e 20 3d 20 31 3b 0a 20 20  nt esign = 1;.  
10ae0 20 20 69 6e 74 20 65 76 61 6c 20 3d 20 30 3b 0a    int eval = 0;.
10af0 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54      LONGDOUBLE_T
10b00 59 50 45 20 73 63 61 6c 65 20 3d 20 31 2e 30 3b  YPE scale = 1.0;
10b10 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
10b20 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ( *z=='-' ){.   
10b30 20 20 20 65 73 69 67 6e 20 3d 20 2d 31 3b 0a 20     esign = -1;. 
10b40 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65       z++;.    }e
10b50 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20  lse if( *z=='+' 
10b60 29 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  ){.      z++;.  
10b70 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 74    }.    while( t
10b80 68 5f 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29  h_isdigit(*(u8*)
10b90 7a 29 20 29 7b 0a 20 20 20 20 20 20 65 76 61 6c  z) ){.      eval
10ba0 20 3d 20 65 76 61 6c 2a 31 30 20 2b 20 2a 7a 20   = eval*10 + *z 
10bb0 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b  - '0';.      z++
10bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
10bd0 65 28 20 65 76 61 6c 3e 3d 36 34 20 29 7b 20 73  e( eval>=64 ){ s
10be0 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 36 34 3b  cale *= 1.0e+64;
10bf0 20 65 76 61 6c 20 2d 3d 20 36 34 3b 20 7d 0a 20   eval -= 64; }. 
10c00 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d     while( eval>=
10c10 31 36 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31  16 ){ scale *= 1
10c20 2e 30 65 2b 31 36 3b 20 65 76 61 6c 20 2d 3d 20  .0e+16; eval -= 
10c30 31 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28  16; }.    while(
10c40 20 65 76 61 6c 3e 3d 34 20 29 7b 20 73 63 61 6c   eval>=4 ){ scal
10c50 65 20 2a 3d 20 31 2e 30 65 2b 34 3b 20 65 76 61  e *= 1.0e+4; eva
10c60 6c 20 2d 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68  l -= 4; }.    wh
10c70 69 6c 65 28 20 65 76 61 6c 3e 3d 31 20 29 7b 20  ile( eval>=1 ){ 
10c80 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 3b  scale *= 1.0e+1;
10c90 20 65 76 61 6c 20 2d 3d 20 31 3b 20 7d 0a 20 20   eval -= 1; }.  
10ca0 20 20 69 66 28 20 65 73 69 67 6e 3c 30 20 29 7b    if( esign<0 ){
10cb0 0a 20 20 20 20 20 20 76 31 20 2f 3d 20 73 63 61  .      v1 /= sca
10cc0 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  le;.    }else{. 
10cd0 20 20 20 20 20 76 31 20 2a 3d 20 73 63 61 6c 65       v1 *= scale
10ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
10cf0 52 65 73 75 6c 74 20 3d 20 73 69 67 6e 3c 30 20  Result = sign<0 
10d00 3f 20 2d 76 31 20 3a 20 76 31 3b 0a 20 20 72 65  ? -v1 : v1;.  re
10d10 74 75 72 6e 20 7a 20 2d 20 7a 42 65 67 69 6e 3b  turn z - zBegin;
10d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
10d30 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72   convert the str
10d40 69 6e 67 20 70 61 73 73 65 64 20 61 73 20 61 72  ing passed as ar
10d50 67 75 6d 65 6e 74 73 20 28 7a 2c 20 6e 29 20 74  guments (z, n) t
10d60 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  o an integer..**
10d70 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
10d80 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
10d90 20 69 6e 20 2a 70 69 4f 75 74 20 61 6e 64 20 72   in *piOut and r
10da0 65 74 75 72 6e 20 54 48 5f 4f 4b 2e 20 0a 2a 2a  eturn TH_OK. .**
10db0 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
10dc0 67 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76  g cannot be conv
10dd0 65 72 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  erted to an inte
10de0 67 65 72 2c 20 72 65 74 75 72 6e 20 54 48 5f 45  ger, return TH_E
10df0 52 52 4f 52 2e 20 0a 2a 2a 20 49 66 20 74 68 65  RROR. .** If the
10e00 20 69 6e 74 65 72 70 20 61 72 67 75 6d 65 6e 74   interp argument
10e10 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6c 65   is not NULL, le
10e20 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
10e30 73 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  sage in the .** 
10e40 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75  interpreter resu
10e50 6c 74 20 74 6f 6f 2e 0a 2a 2f 0a 69 6e 74 20 54  lt too..*/.int T
10e60 68 5f 54 6f 49 6e 74 28 54 68 5f 49 6e 74 65 72  h_ToInt(Th_Inter
10e70 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
10e80 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
10e90 20 69 6e 74 20 2a 70 69 4f 75 74 29 7b 0a 20 20   int *piOut){.  
10ea0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
10eb0 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66   iOut = 0;..  if
10ec0 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ( n<0 ){.    n =
10ed0 20 74 68 5f 73 74 72 6c 65 6e 28 7a 29 3b 0a 20   th_strlen(z);. 
10ee0 20 7d 0a 0a 20 20 69 66 28 20 6e 3e 30 20 26 26   }..  if( n>0 &&
10ef0 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a   (z[0]=='-' || z
10f00 5b 30 5d 3d 3d 27 2b 27 29 20 29 7b 0a 20 20 20  [0]=='+') ){.   
10f10 20 69 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f   i = 1;.  }.  fo
10f20 72 28 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  r(; i<n; i++){. 
10f30 20 20 20 69 66 28 20 21 74 68 5f 69 73 64 69 67     if( !th_isdig
10f40 69 74 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  it(z[i]) ){.    
10f50 20 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67    Th_ErrorMessag
10f60 65 28 69 6e 74 65 72 70 2c 20 22 65 78 70 65 63  e(interp, "expec
10f70 74 65 64 20 69 6e 74 65 67 65 72 2c 20 67 6f 74  ted integer, got
10f80 3a 20 5c 22 22 2c 20 7a 2c 20 6e 29 3b 0a 20 20  : \"", z, n);.  
10f90 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f 45 52      return TH_ER
10fa0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
10fb0 4f 75 74 20 3d 20 69 4f 75 74 20 2a 20 31 30 20  Out = iOut * 10 
10fc0 2b 20 28 7a 5b 69 5d 20 2d 20 34 38 29 3b 0a 20  + (z[i] - 48);. 
10fd0 20 7d 0a 0a 20 20 69 66 28 20 6e 3e 30 20 26 26   }..  if( n>0 &&
10fe0 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
10ff0 20 20 69 4f 75 74 20 2a 3d 20 2d 31 3b 0a 20 20    iOut *= -1;.  
11000 7d 0a 0a 20 20 2a 70 69 4f 75 74 20 3d 20 69 4f  }..  *piOut = iO
11010 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 54 48 5f  ut;.  return TH_
11020 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  OK;.}../*.** Try
11030 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
11040 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 61 73  string passed as
11050 20 61 72 67 75 6d 65 6e 74 73 20 28 7a 2c 20 6e   arguments (z, n
11060 29 20 74 6f 20 61 20 64 6f 75 62 6c 65 2e 0a 2a  ) to a double..*
11070 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11080 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
11090 74 20 69 6e 20 2a 70 66 4f 75 74 20 61 6e 64 20  t in *pfOut and 
110a0 72 65 74 75 72 6e 20 54 48 5f 4f 4b 2e 20 0a 2a  return TH_OK. .*
110b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69  *.** If the stri
110c0 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  ng cannot be con
110d0 76 65 72 74 65 64 20 74 6f 20 61 20 64 6f 75 62  verted to a doub
110e0 6c 65 2c 20 72 65 74 75 72 6e 20 54 48 5f 45 52  le, return TH_ER
110f0 52 4f 52 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  ROR. .** If the 
11100 69 6e 74 65 72 70 20 61 72 67 75 6d 65 6e 74 20  interp argument 
11110 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6c 65 61  is not NULL, lea
11120 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
11130 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69  age in the .** i
11140 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c  nterpreter resul
11150 74 20 74 6f 6f 2e 0a 2a 2f 0a 69 6e 74 20 54 68  t too..*/.int Th
11160 5f 54 6f 44 6f 75 62 6c 65 28 0a 20 20 54 68 5f  _ToDouble(.  Th_
11170 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
11180 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11190 2c 20 0a 20 20 69 6e 74 20 6e 2c 20 0a 20 20 64  , .  int n, .  d
111a0 6f 75 62 6c 65 20 2a 70 66 4f 75 74 0a 29 7b 0a  ouble *pfOut.){.
111b0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
111c0 4e 75 6d 62 65 72 28 28 63 6f 6e 73 74 20 63 68  Number((const ch
111d0 61 72 20 2a 29 7a 2c 20 30 29 20 29 7b 0a 20 20  ar *)z, 0) ){.  
111e0 20 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67    Th_ErrorMessag
111f0 65 28 69 6e 74 65 72 70 2c 20 22 65 78 70 65 63  e(interp, "expec
11200 74 65 64 20 6e 75 6d 62 65 72 2c 20 67 6f 74 3a  ted number, got:
11210 20 5c 22 22 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20   \"", z, n);.   
11220 20 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52   return TH_ERROR
11230 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
11240 41 74 6f 46 28 28 63 6f 6e 73 74 20 63 68 61 72  AtoF((const char
11250 20 2a 29 7a 2c 20 70 66 4f 75 74 29 3b 0a 20 20   *)z, pfOut);.  
11260 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a  return TH_OK;.}.
11270 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
11280 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 74  esult of the int
11290 65 72 70 72 65 74 65 72 20 74 6f 20 74 68 65 20  erpreter to the 
112a0 74 68 31 20 72 65 70 72 65 73 65 6e 74 61 74 69  th1 representati
112b0 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 69 6e 74  on of.** the int
112c0 65 67 65 72 20 69 56 61 6c 20 61 6e 64 20 72 65  eger iVal and re
112d0 74 75 72 6e 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 69  turn TH_OK..*/.i
112e0 6e 74 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49  nt Th_SetResultI
112f0 6e 74 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e  nt(Th_Interp *in
11300 74 65 72 70 2c 20 69 6e 74 20 69 56 61 6c 29 7b  terp, int iVal){
11310 0a 20 20 69 6e 74 20 69 73 4e 65 67 61 74 69 76  .  int isNegativ
11320 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  e = 0;.  char zB
11330 75 66 5b 33 32 5d 3b 0a 20 20 63 68 61 72 20 2a  uf[32];.  char *
11340 7a 20 3d 20 26 7a 42 75 66 5b 33 32 5d 3b 0a 0a  z = &zBuf[32];..
11350 20 20 69 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a    if( iVal<0 ){.
11360 20 20 20 20 69 73 4e 65 67 61 74 69 76 65 20 3d      isNegative =
11370 20 31 3b 0a 20 20 20 20 69 56 61 6c 20 3d 20 69   1;.    iVal = i
11380 56 61 6c 20 2a 20 2d 31 3b 0a 20 20 7d 0a 20 20  Val * -1;.  }.  
11390 2a 28 2d 2d 7a 29 20 3d 20 27 5c 30 27 3b 0a 20  *(--z) = '\0';. 
113a0 20 2a 28 2d 2d 7a 29 20 3d 20 28 63 68 61 72 29   *(--z) = (char)
113b0 28 34 38 2b 28 69 56 61 6c 25 31 30 29 29 3b 0a  (48+(iVal%10));.
113c0 20 20 77 68 69 6c 65 28 20 28 69 56 61 6c 20 3d    while( (iVal =
113d0 20 28 69 56 61 6c 2f 31 30 29 29 3e 30 20 29 7b   (iVal/10))>0 ){
113e0 0a 20 20 20 20 2a 28 2d 2d 7a 29 20 3d 20 28 63  .    *(--z) = (c
113f0 68 61 72 29 28 34 38 2b 28 69 56 61 6c 25 31 30  har)(48+(iVal%10
11400 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 7a  ));.    assert(z
11410 3e 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 69 66  >zBuf);.  }.  if
11420 28 20 69 73 4e 65 67 61 74 69 76 65 20 29 7b 0a  ( isNegative ){.
11430 20 20 20 20 2a 28 2d 2d 7a 29 20 3d 20 27 2d 27      *(--z) = '-'
11440 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
11450 54 68 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  Th_SetResult(int
11460 65 72 70 2c 20 7a 2c 20 2d 31 29 3b 0a 7d 0a 0a  erp, z, -1);.}..
11470 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
11480 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 74 65  sult of the inte
11490 72 70 72 65 74 65 72 20 74 6f 20 74 68 65 20 74  rpreter to the t
114a0 68 31 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  h1 representatio
114b0 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 64 6f 75 62  n of.** the doub
114c0 6c 65 20 66 56 61 6c 20 61 6e 64 20 72 65 74 75  le fVal and retu
114d0 72 6e 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  rn TH_OK..*/.int
114e0 20 54 68 5f 53 65 74 52 65 73 75 6c 74 44 6f 75   Th_SetResultDou
114f0 62 6c 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69  ble(Th_Interp *i
11500 6e 74 65 72 70 2c 20 64 6f 75 62 6c 65 20 66 56  nterp, double fV
11510 61 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  al){.  int i;   
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11530 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
11540 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 76 20  e */.  double v 
11550 3d 20 66 56 61 6c 3b 20 20 20 20 20 20 2f 2a 20  = fVal;      /* 
11560 49 6e 70 75 74 20 76 61 6c 75 65 20 2a 2f 0a 20  Input value */. 
11570 20 63 68 61 72 20 7a 42 75 66 5b 31 32 38 5d 3b   char zBuf[128];
11580 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
11590 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72  buffer */.  char
115a0 20 2a 7a 20 3d 20 7a 42 75 66 3b 20 20 20 20 20   *z = zBuf;     
115b0 20 2f 2a 20 4f 75 74 70 75 74 20 63 75 72 73 6f   /* Output curso
115c0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 6f 74 20  r */.  int iDot 
115d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
115e0 44 69 67 69 74 20 61 66 74 65 72 20 77 68 69 63  Digit after whic
115f0 68 20 74 6f 20 70 6c 61 63 65 20 64 65 63 69 6d  h to place decim
11600 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e  al point */.  in
11610 74 20 69 45 78 70 20 3d 20 30 3b 20 20 20 20 20  t iExp = 0;     
11620 20 20 20 20 2f 2a 20 45 78 70 6f 6e 65 6e 74 20      /* Exponent 
11630 28 4e 4e 20 69 6e 20 65 4e 4e 29 20 2a 2f 0a 20  (NN in eNN) */. 
11640 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
11650 70 3b 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20  p;    /* String 
11660 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
11670 66 20 69 45 78 70 20 2a 2f 0a 0a 20 20 2f 2a 20  f iExp */..  /* 
11680 50 72 65 63 69 73 69 6f 6e 3a 20 2a 2f 0a 20 20  Precision: */.  
11690 23 64 65 66 69 6e 65 20 49 4e 53 49 47 4e 49 46  #define INSIGNIF
116a0 49 43 41 4e 54 20 30 2e 30 30 30 30 30 30 30 30  ICANT 0.00000000
116b0 30 30 30 31 0a 20 20 23 64 65 66 69 6e 65 20 52  0001.  #define R
116c0 4f 55 4e 44 45 52 20 20 20 20 20 20 20 30 2e 30  OUNDER       0.0
116d0 30 30 30 30 30 30 30 30 30 30 30 35 0a 20 20 64  000000000005.  d
116e0 6f 75 62 6c 65 20 69 6e 73 69 67 6e 69 66 69 63  ouble insignific
116f0 61 6e 74 20 3d 20 49 4e 53 49 47 4e 49 46 49 43  ant = INSIGNIFIC
11700 41 4e 54 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ANT;..  /* If th
11710 65 20 72 65 61 6c 20 76 61 6c 75 65 20 69 73 20  e real value is 
11720 6e 65 67 61 74 69 76 65 2c 20 77 72 69 74 65 20  negative, write 
11730 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 20  a '-' character 
11740 74 6f 20 74 68 65 0a 20 20 20 2a 20 6f 75 74 70  to the.   * outp
11750 75 74 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d  ut and transform
11760 20 76 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73   v to the corres
11770 70 6f 6e 64 69 6e 67 20 70 6f 73 69 74 69 76 65  ponding positive
11780 20 6e 75 6d 62 65 72 2e 0a 20 20 20 2a 2f 20 0a   number..   */ .
11790 20 20 69 66 28 20 76 3c 30 2e 30 20 29 7b 0a 20    if( v<0.0 ){. 
117a0 20 20 20 2a 7a 2b 2b 20 3d 20 27 2d 27 3b 0a 20     *z++ = '-';. 
117b0 20 20 20 76 20 2a 3d 20 2d 31 2e 30 3b 0a 20 20     v *= -1.0;.  
117c0 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 69 7a  }..  /* Normaliz
117d0 65 20 76 20 74 6f 20 61 20 76 61 6c 75 65 20 62  e v to a value b
117e0 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64 20 31  etween 1.0 and 1
117f0 30 2e 30 2e 20 49 6e 74 65 67 65 72 20 0a 20 20  0.0. Integer .  
11800 20 2a 20 76 61 72 69 61 62 6c 65 20 69 45 78 70   * variable iExp
11810 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 65   is set to the e
11820 78 70 6f 6e 65 6e 74 2e 20 69 2e 65 20 74 68 65  xponent. i.e the
11830 20 6f 72 69 67 69 6e 61 6c 0a 20 20 20 2a 20 76   original.   * v
11840 61 6c 75 65 20 69 73 20 28 76 20 2a 20 31 30 5e  alue is (v * 10^
11850 69 45 78 70 29 20 28 6f 72 20 74 68 65 20 6e 65  iExp) (or the ne
11860 67 61 74 69 76 65 20 74 68 65 72 65 6f 66 29 2e  gative thereof).
11870 0a 20 20 20 2a 2f 20 0a 20 20 69 66 28 20 76 3e  .   */ .  if( v>
11880 30 2e 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  0.0 ){.    while
11890 28 20 28 76 2b 52 4f 55 4e 44 45 52 29 3e 3d 31  ( (v+ROUNDER)>=1
118a0 30 2e 30 20 29 20 7b 20 69 45 78 70 2b 2b 3b 20  0.0 ) { iExp++; 
118b0 76 20 2a 3d 20 30 2e 31 3b 20 7d 0a 20 20 20 20  v *= 0.1; }.    
118c0 77 68 69 6c 65 28 20 28 76 2b 52 4f 55 4e 44 45  while( (v+ROUNDE
118d0 52 29 3c 31 2e 30 20 29 20 20 20 7b 20 69 45 78  R)<1.0 )   { iEx
118e0 70 2d 2d 3b 20 76 20 2a 3d 20 31 30 2e 30 3b 20  p--; v *= 10.0; 
118f0 7d 0a 20 20 7d 0a 20 20 76 20 2b 3d 20 52 4f 55  }.  }.  v += ROU
11900 4e 44 45 52 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  NDER;..  /* For 
11910 61 20 73 6d 61 6c 6c 20 28 3c 31 32 29 20 70 6f  a small (<12) po
11920 73 69 74 69 76 65 20 65 78 70 6f 6e 65 6e 74 2c  sitive exponent,
11930 20 6d 6f 76 65 20 74 68 65 20 64 65 63 69 6d 61   move the decima
11940 6c 20 70 6f 69 6e 74 0a 20 20 20 2a 20 69 6e 73  l point.   * ins
11950 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 74 68  tead of using th
11960 65 20 22 65 58 58 22 20 6e 6f 74 61 74 69 6f 6e  e "eXX" notation
11970 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 69 45  ..   */.  if( iE
11980 78 70 3e 30 20 26 26 20 69 45 78 70 3c 31 32 20  xp>0 && iExp<12 
11990 29 7b 0a 20 20 20 20 69 44 6f 74 20 3d 20 69 45  ){.    iDot = iE
119a0 78 70 3b 0a 20 20 20 20 69 45 78 70 20 3d 20 30  xp;.    iExp = 0
119b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
119c0 61 20 73 6d 61 6c 6c 20 28 3e 2d 34 29 20 6e 65  a small (>-4) ne
119d0 67 61 74 69 76 65 20 65 78 70 6f 6e 65 6e 74 2c  gative exponent,
119e0 20 77 72 69 74 65 20 6c 65 61 64 69 6e 67 20 7a   write leading z
119f0 65 72 6f 65 73 0a 20 20 20 2a 20 69 6e 73 74 65  eroes.   * inste
11a00 61 64 20 6f 66 20 75 73 69 6e 67 20 74 68 65 20  ad of using the 
11a10 22 65 58 58 22 20 6e 6f 74 61 74 69 6f 6e 2e 0a  "eXX" notation..
11a20 20 20 20 2a 2f 0a 20 20 69 66 28 20 69 45 78 70     */.  if( iExp
11a30 3c 30 20 26 26 20 69 45 78 70 3e 2d 34 20 29 7b  <0 && iExp>-4 ){
11a40 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 30 27 3b  .    *z++ = '0';
11a50 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2e 27 3b  .    *z++ = '.';
11a60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3e  .    for(i=0; i>
11a70 28 69 45 78 70 2b 31 29 3b 20 69 2d 2d 29 7b 0a  (iExp+1); i--){.
11a80 20 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 30 27        *z++ = '0'
11a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 6f 74  ;.    }.    iDot
11aa0 20 3d 20 2d 31 3b 0a 20 20 20 20 69 45 78 70 20   = -1;.    iExp 
11ab0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 0;.  }..  /* O
11ac0 75 74 70 75 74 20 74 68 65 20 64 69 67 69 74 73  utput the digits
11ad0 20 69 6e 20 72 65 61 6c 20 76 61 6c 75 65 20 76   in real value v
11ae0 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 69  . The value of i
11af0 44 6f 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  Dot determines. 
11b00 20 20 2a 20 77 68 65 72 65 20 28 69 66 20 61 74    * where (if at
11b10 20 61 6c 6c 29 20 74 68 65 20 64 65 63 69 6d 61   all) the decima
11b20 6c 20 70 6f 69 6e 74 20 69 73 20 70 6c 61 63 65  l point is place
11b30 64 2e 0a 20 20 20 2a 2f 0a 20 20 66 6f 72 28 69  d..   */.  for(i
11b40 3d 30 3b 20 69 3c 3d 28 69 44 6f 74 2b 31 29 20  =0; i<=(iDot+1) 
11b50 7c 7c 20 76 3e 3d 69 6e 73 69 67 6e 69 66 69 63  || v>=insignific
11b60 61 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2a  ant; i++){.    *
11b70 7a 2b 2b 20 3d 20 28 63 68 61 72 29 28 34 38 20  z++ = (char)(48 
11b80 2b 20 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 76  + (int)v);.    v
11b90 20 3d 20 28 76 20 2d 20 28 28 64 6f 75 62 6c 65   = (v - ((double
11ba0 29 28 69 6e 74 29 76 29 29 20 2a 20 31 30 2e 30  )(int)v)) * 10.0
11bb0 3b 0a 20 20 20 20 69 6e 73 69 67 6e 69 66 69 63  ;.    insignific
11bc0 61 6e 74 20 2a 3d 20 31 30 2e 30 3b 0a 20 20 20  ant *= 10.0;.   
11bd0 20 69 66 28 20 69 44 6f 74 3d 3d 69 20 29 7b 0a   if( iDot==i ){.
11be0 20 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2e 27        *z++ = '.'
11bf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11c00 2a 20 49 66 20 74 68 65 20 65 78 70 6f 6e 65 6e  * If the exponen
11c10 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 61  t is not zero, a
11c20 64 64 20 74 68 65 20 22 65 58 58 22 20 6e 6f 74  dd the "eXX" not
11c30 61 74 69 6f 6e 20 74 6f 20 74 68 65 0a 20 20 20  ation to the.   
11c40 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * end of the str
11c50 69 6e 67 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28  ing..   */.  if(
11c60 20 69 45 78 70 21 3d 30 20 29 7b 0a 20 20 20 20   iExp!=0 ){.    
11c70 2a 7a 2b 2b 20 3d 20 27 65 27 3b 0a 20 20 20 20  *z++ = 'e';.    
11c80 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 28  Th_SetResultInt(
11c90 69 6e 74 65 72 70 2c 20 69 45 78 70 29 3b 0a 20  interp, iExp);. 
11ca0 20 20 20 7a 45 78 70 20 3d 20 54 68 5f 47 65 74     zExp = Th_Get
11cb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 30  Result(interp, 0
11cc0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
11cd0 7a 45 78 70 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zExp[i]; i++){. 
11ce0 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 7a 45 78 70       *z++ = zExp
11cf0 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  [i];.    }.  }..
11d00 20 20 2a 7a 20 3d 20 27 5c 30 27 3b 0a 20 20 72    *z = '\0';.  r
11d10 65 74 75 72 6e 20 54 68 5f 53 65 74 52 65 73 75  eturn Th_SetResu
11d20 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
11d30 20 2d 31 29 3b 0a 7d 0a                           -1);.}.