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 75 63 68 61 72 20 2a 7a 52 65 73 */. uchar *zRes
01c0: 75 6c 74 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 ult; /* Curr
01d0: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 ent interpreter
01e0: 72 65 73 75 6c 74 20 28 54 68 5f 4d 61 6c 6c 6f result (Th_Mallo
01f0: 63 28 29 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 c()ed) */. int
0200: 6e 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 nResult;
0210: 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* number of byt
0220: 65 73 20 69 6e 20 7a 52 65 73 75 6c 74 20 2a 2f es in zResult */
0230: 0a 20 20 54 68 5f 48 61 73 68 20 2a 70 61 43 6d . Th_Hash *paCm
0240: 64 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 d; /* Table
0250: 6f 66 20 72 65 67 69 73 74 65 72 65 64 20 63 6f of registered co
0260: 6d 6d 61 6e 64 73 20 2a 2f 0a 20 20 54 68 5f 46 mmands */. Th_F
0270: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 rame *pFrame;
0280: 2f 2a 20 43 75 72 72 65 6e 74 20 65 78 65 63 75 /* Current execu
0290: 74 69 6f 6e 20 66 72 61 6d 65 20 2a 2f 0a 20 20 tion frame */.
02a0: 69 6e 74 20 69 73 4c 69 73 74 4d 6f 64 65 3b 20 int isListMode;
02b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 /* True if t
02c0: 68 53 70 6c 69 74 4c 69 73 74 28 29 20 73 68 6f hSplitList() sho
02d0: 75 6c 64 20 6f 70 65 72 61 74 65 20 69 6e 20 22 uld operate in "
02e0: 6c 69 73 74 22 20 6d 6f 64 65 20 2a 2f 0a 7d 3b list" mode */.};
02f0: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 54 48 20 ../*.** Each TH
0300: 63 6f 6d 6d 61 6e 64 20 72 65 67 69 73 74 65 72 command register
0310: 65 64 20 75 73 69 6e 67 20 54 68 5f 43 72 65 61 ed using Th_Crea
0320: 74 65 43 6f 6d 6d 61 6e 64 28 29 20 69 73 20 72 teCommand() is r
0330: 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a 20 62 79 epresented.** by
0340: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 an instance of
0350: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 the following st
0360: 72 75 63 74 75 72 65 20 73 74 6f 72 65 64 20 69 ructure stored i
0370: 6e 20 74 68 65 20 54 68 5f 49 6e 74 65 72 70 2e n the Th_Interp.
0380: 70 61 43 6d 64 0a 2a 2a 20 68 61 73 68 2d 74 61 paCmd.** hash-ta
0390: 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 ble..*/.struct T
03a0: 68 5f 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 69 6e h_Command {. in
03b0: 74 20 28 2a 78 50 72 6f 63 29 28 54 68 5f 49 6e t (*xProc)(Th_In
03c0: 74 65 72 70 20 2a 2c 20 76 6f 69 64 20 2a 2c 20 terp *, void *,
03d0: 69 6e 74 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 int, const uchar
03e0: 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b 0a 20 20 76 **, int *);. v
03f0: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 3b 0a 20 oid *pContext;.
0400: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 54 68 void (*xDel)(Th
0410: 5f 49 6e 74 65 72 70 20 2a 2c 20 76 6f 69 64 20 _Interp *, void
0420: 2a 29 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 *);.};../*.** Ea
0430: 63 68 20 73 74 61 63 6b 20 66 72 61 6d 65 20 28 ch stack frame (
0440: 76 61 72 69 61 62 6c 65 20 73 63 6f 70 65 29 20 variable scope)
0450: 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 is represented b
0460: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a y an instance.**
0470: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 of this structu
0480: 72 65 2e 20 56 61 72 69 61 62 6c 65 20 76 61 6c re. Variable val
0490: 75 65 73 20 73 65 74 20 75 73 69 6e 67 20 74 68 ues set using th
04a0: 65 20 54 68 5f 53 65 74 56 61 72 20 63 6f 6d 6d e Th_SetVar comm
04b0: 61 6e 64 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 and.** are store
04c0: 64 20 69 6e 20 74 68 65 20 54 68 5f 46 72 61 6d d in the Th_Fram
04d0: 65 2e 70 61 56 61 72 20 68 61 73 68 20 74 61 62 e.paVar hash tab
04e0: 6c 65 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 le member of the
04f0: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 73 associated.** s
0500: 74 61 63 6b 20 66 72 61 6d 65 20 6f 62 6a 65 63 tack frame objec
0510: 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 6e t..**.** When an
0520: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 interpreter is
0530: 63 72 65 61 74 65 64 2c 20 61 20 73 69 6e 67 6c created, a singl
0540: 65 20 54 68 5f 46 72 61 6d 65 20 73 74 72 75 63 e Th_Frame struc
0550: 74 75 72 65 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 ture is also.**
0560: 61 6c 6c 6f 63 61 74 65 64 20 2d 20 74 68 65 20 allocated - the
0570: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 global variable
0580: 73 63 6f 70 65 2e 20 54 68 5f 49 6e 74 65 72 70 scope. Th_Interp
0590: 2e 70 46 72 61 6d 65 20 28 74 68 65 20 63 75 72 .pFrame (the cur
05a0: 72 65 6e 74 0a 2a 2a 20 69 6e 74 65 72 70 72 65 rent.** interpre
05b0: 74 65 72 20 66 72 61 6d 65 29 20 69 73 20 69 6e ter frame) is in
05c0: 69 74 69 61 6c 69 73 65 64 20 74 6f 20 70 6f 69 itialised to poi
05d0: 6e 74 20 74 6f 20 74 68 69 73 20 54 68 5f 46 72 nt to this Th_Fr
05e0: 61 6d 65 2e 20 49 74 20 69 73 20 0a 2a 2a 20 6e ame. It is .** n
05f0: 6f 74 20 64 65 6c 65 74 65 64 20 66 6f 72 20 74 ot deleted for t
0600: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 he lifetime of t
0610: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 28 he interpreter (
0620: 62 65 63 61 75 73 65 20 74 68 65 20 67 6c 6f 62 because the glob
0630: 61 6c 20 0a 2a 2a 20 66 72 61 6d 65 20 6e 65 76 al .** frame nev
0640: 65 72 20 67 6f 65 73 20 6f 75 74 20 6f 66 20 73 er goes out of s
0650: 63 6f 70 65 29 2e 0a 2a 2a 0a 2a 2a 20 4e 65 77 cope)..**.** New
0660: 20 73 74 61 63 6b 20 66 72 61 6d 65 73 20 61 72 stack frames ar
0670: 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 e created by the
0680: 20 54 68 5f 49 6e 46 72 61 6d 65 28 29 20 66 75 Th_InFrame() fu
0690: 6e 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 0a 2a nction. Before.*
06a0: 2a 20 69 6e 76 6f 6b 69 6e 67 20 69 74 73 20 63 * invoking its c
06b0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e allback function
06c0: 2c 20 54 68 5f 49 6e 46 72 61 6d 65 28 29 20 61 , Th_InFrame() a
06d0: 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 54 llocates a new T
06e0: 68 5f 46 72 61 6d 65 0a 2a 2a 20 73 74 72 75 63 h_Frame.** struc
06f0: 74 75 72 65 20 77 69 74 68 20 70 43 61 6c 6c 65 ture with pCalle
0700: 72 20 73 65 74 20 74 6f 20 74 68 65 20 63 75 72 r set to the cur
0710: 72 65 6e 74 20 66 72 61 6d 65 20 28 54 68 5f 49 rent frame (Th_I
0720: 6e 74 65 72 70 2e 70 46 72 61 6d 65 29 2c 0a 2a nterp.pFrame),.*
0730: 2a 20 61 6e 64 20 73 65 74 73 20 74 68 65 20 63 * and sets the c
0740: 75 72 72 65 6e 74 20 66 72 61 6d 65 20 74 6f 20 urrent frame to
0750: 74 68 65 20 6e 65 77 20 66 72 61 6d 65 20 6f 62 the new frame ob
0760: 6a 65 63 74 2e 20 41 66 74 65 72 20 74 68 65 20 ject. After the
0770: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 68 61 73 20 callback.** has
0780: 62 65 65 6e 20 69 6e 76 6f 6b 65 64 2c 20 74 68 been invoked, th
0790: 65 20 61 6c 6c 6f 63 61 74 65 64 20 54 68 5f 46 e allocated Th_F
07a0: 72 61 6d 65 20 69 73 20 64 65 6c 65 74 65 64 20 rame is deleted
07b0: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a and the value.**
07c0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 of the current
07d0: 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 72 65 frame pointer re
07e0: 73 74 6f 72 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 42 stored..** .** B
07f0: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 20 54 y default, the T
0800: 68 5f 53 65 74 56 61 72 28 29 2c 20 54 68 5f 55 h_SetVar(), Th_U
0810: 6e 73 65 74 56 61 72 28 29 20 61 6e 64 20 54 68 nsetVar() and Th
0820: 5f 47 65 74 56 61 72 28 29 20 66 75 6e 63 74 69 _GetVar() functi
0830: 6f 6e 73 20 0a 2a 2a 20 61 63 63 65 73 73 20 76 ons .** access v
0840: 61 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20 69 ariable values i
0850: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 n the current fr
0860: 61 6d 65 2e 20 49 66 20 74 68 65 79 20 6e 65 65 ame. If they nee
0870: 64 20 74 6f 20 61 63 63 65 73 73 20 0a 2a 2a 20 d to access .**
0880: 74 68 65 20 67 6c 6f 62 61 6c 20 66 72 61 6d 65 the global frame
0890: 2c 20 74 68 65 79 20 64 6f 20 73 6f 20 62 79 20 , they do so by
08a0: 74 72 61 76 65 72 73 69 6e 67 20 74 68 65 20 70 traversing the p
08b0: 43 61 6c 6c 65 72 20 70 6f 69 6e 74 65 72 20 6c Caller pointer l
08c0: 69 73 74 2e 0a 2a 2a 20 4c 69 6b 65 77 69 73 65 ist..** Likewise
08d0: 2c 20 74 68 65 20 54 68 5f 4c 69 6e 6b 56 61 72 , the Th_LinkVar
08e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 () function uses
08f0: 20 74 68 65 20 70 43 61 6c 6c 65 72 20 70 6f 69 the pCaller poi
0900: 6e 74 65 72 73 20 74 6f 20 0a 2a 2a 20 6c 69 6e nters to .** lin
0910: 6b 20 74 6f 20 76 61 72 69 61 62 6c 65 73 20 6c k to variables l
0920: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 67 6c ocated in the gl
0930: 6f 62 61 6c 20 6f 72 20 6f 74 68 65 72 20 73 74 obal or other st
0940: 61 63 6b 20 66 72 61 6d 65 73 2e 0a 2a 2f 0a 73 ack frames..*/.s
0950: 74 72 75 63 74 20 54 68 5f 46 72 61 6d 65 20 7b truct Th_Frame {
0960: 0a 20 20 54 68 5f 48 61 73 68 20 2a 70 61 56 61 . Th_Hash *paVa
0970: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
0980: 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 64 65 /* Variables de
0990: 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 73 63 fined in this sc
09a0: 6f 70 65 20 2a 2f 0a 20 20 54 68 5f 46 72 61 6d ope */. Th_Fram
09b0: 65 20 2a 70 43 61 6c 6c 65 72 3b 20 20 20 20 20 e *pCaller;
09c0: 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 69 6e /* Callin
09d0: 67 20 66 72 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f g frame */.};../
09e0: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 *.** This struct
09f0: 75 72 65 20 72 65 70 72 65 73 65 6e 74 73 20 61 ure represents a
0a00: 20 76 61 6c 75 65 20 61 73 73 69 67 6e 65 64 20 value assigned
0a10: 74 6f 20 61 20 74 68 31 20 76 61 72 69 61 62 6c to a th1 variabl
0a20: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 68 5f e..**.** The Th_
0a30: 46 72 61 6d 65 2e 70 61 56 61 72 20 68 61 73 68 Frame.paVar hash
0a40: 20 74 61 62 6c 65 20 6d 61 70 73 20 66 72 6f 6d table maps from
0a50: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 28 variable name (
0a60: 61 20 74 68 31 20 73 74 72 69 6e 67 29 0a 2a 2a a th1 string).**
0a70: 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f to a pointer to
0a80: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 an instance of
0a90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 the following st
0aa0: 72 75 63 74 75 72 65 2e 20 4d 6f 72 65 20 74 68 ructure. More th
0ab0: 61 6e 0a 2a 2a 20 6f 6e 65 20 68 61 73 68 20 74 an.** one hash t
0ac0: 61 62 6c 65 20 65 6e 74 72 79 20 6d 61 79 20 6d able entry may m
0ad0: 61 70 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 ap to a single s
0ae0: 74 72 75 63 74 75 72 65 20 69 66 20 76 61 72 69 tructure if vari
0af0: 61 62 6c 65 0a 2a 2a 20 6c 69 6e 6b 73 20 68 61 able.** links ha
0b00: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 ve been created
0b10: 75 73 69 6e 67 20 54 68 5f 4c 69 6e 6b 56 61 72 using Th_LinkVar
0b20: 28 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f (). The number o
0b30: 66 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2a 20 f references.**
0b40: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 54 68 5f is stored in Th_
0b50: 56 61 72 69 61 62 6c 65 2e 6e 52 65 66 2e 0a 2a Variable.nRef..*
0b60: 2a 0a 2a 2a 20 46 6f 72 20 73 63 61 6c 61 72 20 *.** For scalar
0b70: 76 61 72 69 61 62 6c 65 73 2c 20 54 68 5f 56 61 variables, Th_Va
0b80: 72 69 61 62 6c 65 2e 7a 44 61 74 61 20 69 73 20 riable.zData is
0b90: 6e 65 76 65 72 20 30 2e 20 54 68 5f 56 61 72 69 never 0. Th_Vari
0ba0: 61 62 6c 65 2e 6e 44 61 74 61 0a 2a 2a 20 73 74 able.nData.** st
0bb0: 6f 72 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 ores the number
0bc0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 of bytes in the
0bd0: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f value pointed to
0be0: 20 62 79 20 7a 44 61 74 61 2e 0a 2a 2a 0a 2a 2a by zData..**.**
0bf0: 20 46 6f 72 20 61 6e 20 61 72 72 61 79 20 76 61 For an array va
0c00: 72 69 61 62 6c 65 2c 20 54 68 5f 56 61 72 69 61 riable, Th_Varia
0c10: 62 6c 65 2e 7a 44 61 74 61 20 69 73 20 30 20 61 ble.zData is 0 a
0c20: 6e 64 20 70 48 61 73 68 20 70 6f 69 6e 74 73 20 nd pHash points
0c30: 74 6f 0a 2a 2a 20 61 20 68 61 73 68 20 74 61 62 to.** a hash tab
0c40: 6c 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 le mapping betwe
0c50: 65 6e 20 61 72 72 61 79 20 6b 65 79 20 6e 61 6d en array key nam
0c60: 65 20 28 61 20 74 68 31 20 73 74 72 69 6e 67 29 e (a th1 string)
0c70: 20 61 6e 64 0a 2a 2a 20 61 20 74 68 65 20 70 6f and.** a the po
0c80: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 68 5f inter to the Th_
0c90: 56 61 72 69 61 62 6c 65 20 73 74 72 75 63 74 75 Variable structu
0ca0: 72 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 re holding the s
0cb0: 63 61 6c 61 72 0a 2a 2a 20 76 61 6c 75 65 2e 0a calar.** value..
0cc0: 2a 2f 0a 73 74 72 75 63 74 20 54 68 5f 56 61 72 */.struct Th_Var
0cd0: 69 61 62 6c 65 20 7b 0a 20 20 69 6e 74 20 6e 52 iable {. int nR
0ce0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ef;
0cf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
0d00: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f of references to
0d10: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 this structure
0d20: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 */. int nData;
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
0d50: 74 65 73 20 61 74 20 54 68 5f 56 61 72 69 61 62 tes at Th_Variab
0d60: 6c 65 2e 7a 44 61 74 61 20 2a 2f 0a 20 20 75 63 le.zData */. uc
0d70: 68 61 72 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 har *zData;
0d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 /* Dat
0d90: 61 20 66 6f 72 20 73 63 61 6c 61 72 20 76 61 72 a for scalar var
0da0: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 54 68 5f 48 iables */. Th_H
0db0: 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20 20 20 ash *pHash;
0dc0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 /* Data
0dd0: 66 6f 72 20 61 72 72 61 79 20 76 61 72 69 61 62 for array variab
0de0: 6c 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a les */.};../*.**
0df0: 20 48 61 73 68 20 74 61 62 6c 65 20 41 50 49 3a Hash table API:
0e00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 48 5f 48 .*/.#define TH_H
0e10: 41 53 48 53 49 5a 45 20 32 35 37 0a 73 74 72 75 ASHSIZE 257.stru
0e20: 63 74 20 54 68 5f 48 61 73 68 20 7b 0a 20 20 54 ct Th_Hash {. T
0e30: 68 5f 48 61 73 68 45 6e 74 72 79 20 2a 61 5b 54 h_HashEntry *a[T
0e40: 48 5f 48 41 53 48 53 49 5a 45 5d 3b 0a 7d 3b 0a H_HASHSIZE];.};.
0e50: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 45 76 .static int thEv
0e60: 61 6c 4c 6f 63 61 6c 28 54 68 5f 49 6e 74 65 72 alLocal(Th_Inter
0e70: 70 20 2a 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 p *, const uchar
0e80: 20 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 *, int);.static
0e90: 20 69 6e 74 20 74 68 53 70 6c 69 74 4c 69 73 74 int thSplitList
0ea0: 28 54 68 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e (Th_Interp*, con
0eb0: 73 74 20 75 63 68 61 72 2a 2c 20 69 6e 74 2c 20 st uchar*, int,
0ec0: 75 63 68 61 72 2a 2a 2a 2c 20 69 6e 74 20 2a 2a uchar***, int **
0ed0: 2c 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 , int*);..static
0ee0: 20 69 6e 74 20 74 68 48 65 78 64 69 67 69 74 28 int thHexdigit(
0ef0: 75 63 68 61 72 20 63 29 3b 0a 73 74 61 74 69 63 uchar c);.static
0f00: 20 69 6e 74 20 74 68 45 6e 64 4f 66 4c 69 6e 65 int thEndOfLine
0f10: 28 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2c 20 (const uchar *,
0f20: 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e int);..static in
0f30: 74 20 20 74 68 50 75 73 68 46 72 61 6d 65 28 54 t thPushFrame(T
0f40: 68 5f 49 6e 74 65 72 70 2a 2c 20 54 68 5f 46 72 h_Interp*, Th_Fr
0f50: 61 6d 65 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f ame*);.static vo
0f60: 69 64 20 74 68 50 6f 70 46 72 61 6d 65 28 54 68 id thPopFrame(Th
0f70: 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 73 74 61 74 _Interp*);..stat
0f80: 69 63 20 76 6f 69 64 20 74 68 46 72 65 65 56 61 ic void thFreeVa
0f90: 72 69 61 62 6c 65 28 54 68 5f 48 61 73 68 45 6e riable(Th_HashEn
0fa0: 74 72 79 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73 74 try*, void*);.st
0fb0: 61 74 69 63 20 76 6f 69 64 20 74 68 46 72 65 65 atic void thFree
0fc0: 43 6f 6d 6d 61 6e 64 28 54 68 5f 48 61 73 68 45 Command(Th_HashE
0fd0: 6e 74 72 79 2a 2c 20 76 6f 69 64 2a 29 3b 0a 0a ntry*, void*);..
0fe0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 /*.** The follow
0ff0: 69 6e 67 20 61 72 65 20 75 73 65 64 20 62 79 20 ing are used by
1000: 62 6f 74 68 20 74 68 65 20 65 78 70 72 65 73 73 both the express
1010: 69 6f 6e 20 61 6e 64 20 6c 61 6e 67 75 61 67 65 ion and language
1020: 20 70 61 72 73 65 72 73 2e 0a 2a 2a 20 47 69 76 parsers..** Giv
1030: 65 6e 20 74 68 61 74 20 74 68 65 20 73 74 61 72 en that the star
1040: 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 t of the input s
1050: 74 72 69 6e 67 20 28 7a 2c 20 6e 29 20 69 73 20 tring (z, n) is
1060: 61 20 6c 61 6e 67 75 61 67 65 20 0a 2a 2a 20 63 a language .** c
1070: 6f 6e 73 74 72 75 63 74 20 6f 66 20 74 68 65 20 onstruct of the
1080: 72 65 6c 65 76 61 6e 74 20 74 79 70 65 20 28 61 relevant type (a
1090: 20 63 6f 6d 6d 61 6e 64 20 65 6e 63 6c 6f 73 65 command enclose
10a0: 64 20 69 6e 20 5b 5d 2c 20 61 6e 20 65 73 63 61 d in [], an esca
10b0: 70 65 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 65 pe.** sequence e
10c0: 74 63 2e 29 2c 20 74 68 65 73 65 20 66 75 6e 63 tc.), these func
10d0: 74 69 6f 6e 73 20 64 65 74 65 72 6d 69 6e 65 20 tions determine
10e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
10f0: 74 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e tes.** of the in
1100: 70 75 74 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 put consumed by
1110: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 2e 20 46 the construct. F
1120: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a or example:.**.*
1130: 2a 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 2a * int nByte;.*
1140: 2a 20 20 20 74 68 4e 65 78 74 43 6f 6d 6d 61 6e * thNextComman
1150: 64 28 69 6e 74 65 72 70 2c 20 22 5b 65 78 70 72 d(interp, "[expr
1160: 20 24 61 2b 31 5d 20 24 6e 49 74 65 72 22 2c 20 $a+1] $nIter",
1170: 31 38 2c 20 26 6e 42 79 74 65 29 3b 0a 2a 2a 0a 18, &nByte);.**.
1180: 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 76 61 ** results in va
1190: 72 69 61 62 6c 65 20 6e 42 79 74 65 20 62 65 69 riable nByte bei
11a0: 6e 67 20 73 65 74 20 74 6f 20 31 31 2e 20 4f 72 ng set to 11. Or
11b0: 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 74 68 4e 65 78 , .**.** thNex
11c0: 74 56 61 72 6e 61 6d 65 28 69 6e 74 65 72 70 2c tVarname(interp,
11d0: 20 22 24 61 2b 31 22 2c 20 34 2c 20 26 6e 42 79 "$a+1", 4, &nBy
11e0: 74 65 29 3b 0a 2a 2a 0a 2a 2a 20 72 65 73 75 6c te);.**.** resul
11f0: 74 73 20 69 6e 20 6e 42 79 74 65 20 62 65 69 6e ts in nByte bein
1200: 67 20 73 65 74 20 74 6f 20 32 2e 0a 2a 2f 0a 73 g set to 2..*/.s
1210: 74 61 74 69 63 20 69 6e 74 20 74 68 4e 65 78 74 tatic int thNext
1220: 43 6f 6d 6d 61 6e 64 28 54 68 5f 49 6e 74 65 72 Command(Th_Inter
1230: 70 2a 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 20 p*, const uchar
1240: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 2a *z, int n, int *
1250: 70 4e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 pN);.static int
1260: 74 68 4e 65 78 74 45 73 63 61 70 65 20 28 54 68 thNextEscape (Th
1270: 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20 _Interp*, const
1280: 75 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c uchar *z, int n,
1290: 20 69 6e 74 20 2a 70 4e 29 3b 0a 73 74 61 74 69 int *pN);.stati
12a0: 63 20 69 6e 74 20 74 68 4e 65 78 74 56 61 72 6e c int thNextVarn
12b0: 61 6d 65 28 54 68 5f 49 6e 74 65 72 70 2a 2c 20 ame(Th_Interp*,
12c0: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 2c 20 const uchar *z,
12d0: 69 6e 74 20 6e 2c 20 69 6e 74 20 2a 70 4e 29 3b int n, int *pN);
12e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 4e 65 .static int thNe
12f0: 78 74 4e 75 6d 62 65 72 20 28 54 68 5f 49 6e 74 xtNumber (Th_Int
1300: 65 72 70 2a 2c 20 63 6f 6e 73 74 20 75 63 68 61 erp*, const ucha
1310: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 r *z, int n, int
1320: 20 2a 70 4e 29 3b 0a 73 74 61 74 69 63 20 69 6e *pN);.static in
1330: 74 20 74 68 4e 65 78 74 53 70 61 63 65 20 20 28 t thNextSpace (
1340: 54 68 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 Th_Interp*, cons
1350: 74 20 75 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 t uchar *z, int
1360: 6e 2c 20 69 6e 74 20 2a 70 4e 29 3b 0a 0a 2f 2a n, int *pN);../*
1370: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 61 74 20 74 .** Given that t
1380: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 he input string
1390: 28 7a 2c 20 6e 29 20 63 6f 6e 74 61 69 6e 73 20 (z, n) contains
13a0: 61 20 6c 61 6e 67 75 61 67 65 20 63 6f 6e 73 74 a language const
13b0: 72 75 63 74 20 6f 66 0a 2a 2a 20 74 68 65 20 72 ruct of.** the r
13c0: 65 6c 65 76 61 6e 74 20 74 79 70 65 20 28 61 20 elevant type (a
13d0: 63 6f 6d 6d 61 6e 64 20 65 6e 63 6c 6f 73 65 64 command enclosed
13e0: 20 69 6e 20 5b 5d 2c 20 61 6e 20 65 73 63 61 70 in [], an escap
13f0: 65 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 6c e sequence .** l
1400: 69 6b 65 20 22 5c 78 46 46 22 20 6f 72 20 61 20 ike "\xFF" or a
1410: 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e variable referen
1420: 63 65 20 6c 69 6b 65 20 22 24 7b 76 61 72 6e 61 ce like "${varna
1430: 6d 65 7d 22 2c 20 70 65 72 66 6f 72 6d 0a 2a 2a me}", perform.**
1440: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 6e substitution on
1450: 20 74 68 65 20 73 74 72 69 6e 67 20 61 6e 64 20 the string and
1460: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 store the result
1470: 69 6e 67 20 73 74 72 69 6e 67 20 69 6e 0a 2a 2a ing string in.**
1480: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
1490: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 result..*/.stat
14a0: 69 63 20 69 6e 74 20 74 68 53 75 62 73 74 43 6f ic int thSubstCo
14b0: 6d 6d 61 6e 64 28 54 68 5f 49 6e 74 65 72 70 2a mmand(Th_Interp*
14c0: 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a , const uchar *z
14d0: 2c 20 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 , int n);.static
14e0: 20 69 6e 74 20 74 68 53 75 62 73 74 45 73 63 61 int thSubstEsca
14f0: 70 65 20 28 54 68 5f 49 6e 74 65 72 70 2a 2c 20 pe (Th_Interp*,
1500: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 2c 20 const uchar *z,
1510: 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 int n);.static i
1520: 6e 74 20 74 68 53 75 62 73 74 56 61 72 6e 61 6d nt thSubstVarnam
1530: 65 28 54 68 5f 49 6e 74 65 72 70 2a 2c 20 63 6f e(Th_Interp*, co
1540: 6e 73 74 20 75 63 68 61 72 20 2a 7a 2c 20 69 6e nst uchar *z, in
1550: 74 20 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 t n);../*.** Giv
1560: 65 6e 20 74 68 61 74 20 74 68 65 72 65 20 69 73 en that there is
1570: 20 61 20 74 68 31 20 77 6f 72 64 20 6c 6f 63 61 a th1 word loca
1580: 74 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 ted at the start
1590: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 0a 2a of the input .*
15a0: 2a 20 73 74 72 69 6e 67 20 28 7a 2c 20 6e 29 2c * string (z, n),
15b0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c determine the l
15c0: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f ength in bytes o
15d0: 66 20 74 68 61 74 20 77 6f 72 64 2e 20 49 66 20 f that word. If
15e0: 74 68 65 0a 2a 2a 20 69 73 43 6d 64 20 61 72 67 the.** isCmd arg
15f0: 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 ument is non-zer
1600: 6f 2c 20 74 68 65 6e 20 61 6e 20 75 6e 65 73 63 o, then an unesc
1610: 61 70 65 64 20 22 3b 22 20 62 79 74 65 20 6e 6f aped ";" byte no
1620: 74 20 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 69 6e t .** located in
1630: 73 69 64 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 side of a block
1640: 6f 72 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 or quoted string
1650: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 is considered t
1660: 6f 20 6d 61 72 6b 20 0a 2a 2a 20 74 68 65 20 65 o mark .** the e
1670: 6e 64 20 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a nd of the word..
1680: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 */.static int th
1690: 4e 65 78 74 57 6f 72 64 28 54 68 5f 49 6e 74 65 NextWord(Th_Inte
16a0: 72 70 2a 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 rp*, const uchar
16b0: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 *z, int n, int
16c0: 2a 70 4e 2c 20 69 6e 74 20 69 73 43 6d 64 29 3b *pN, int isCmd);
16d0: 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 ../*.** Perform
16e0: 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 6e 20 substitution on
16f0: 74 68 65 20 77 6f 72 64 20 63 6f 6e 74 61 69 6e the word contain
1700: 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 ed in the input
1710: 73 74 72 69 6e 67 20 28 7a 2c 20 6e 29 2e 0a 2a string (z, n)..*
1720: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 * Store the resu
1730: 6c 74 69 6e 67 20 73 74 72 69 6e 67 20 69 6e 20 lting string in
1740: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
1750: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 result..*/.stati
1760: 63 20 69 6e 74 20 74 68 53 75 62 73 74 57 6f 72 c int thSubstWor
1770: 64 28 54 68 5f 49 6e 74 65 72 70 2a 2c 20 63 6f d(Th_Interp*, co
1780: 6e 73 74 20 75 63 68 61 72 20 2a 7a 2c 20 69 6e nst uchar *z, in
1790: 74 20 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 t n);../*.** The
17a0: 20 42 75 66 66 65 72 20 73 74 72 75 63 74 75 72 Buffer structur
17b0: 65 20 61 6e 64 20 74 68 65 20 74 68 42 75 66 66 e and the thBuff
17c0: 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e erXXX() function
17d0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 6d 61 s are used to ma
17e0: 6b 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c ke.** memory all
17f0: 6f 63 61 74 69 6f 6e 20 65 61 73 69 65 72 20 77 ocation easier w
1800: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 hen building up
1810: 61 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 72 a result..*/.str
1820: 75 63 74 20 42 75 66 66 65 72 20 7b 0a 20 20 75 uct Buffer {. u
1830: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e char *zBuf;. in
1840: 74 20 6e 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42 t nBuf;. int nB
1850: 75 66 41 6c 6c 6f 63 3b 0a 7d 3b 0a 74 79 70 65 ufAlloc;.};.type
1860: 64 65 66 20 73 74 72 75 63 74 20 42 75 66 66 65 def struct Buffe
1870: 72 20 42 75 66 66 65 72 3b 0a 73 74 61 74 69 63 r Buffer;.static
1880: 20 69 6e 74 20 20 74 68 42 75 66 66 65 72 57 72 int thBufferWr
1890: 69 74 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 ite(Th_Interp *i
18a0: 6e 74 65 72 70 2c 20 42 75 66 66 65 72 20 2a 2c nterp, Buffer *,
18b0: 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2c 20 const uchar *,
18c0: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 int);.static voi
18d0: 64 20 74 68 42 75 66 66 65 72 49 6e 69 74 28 42 d thBufferInit(B
18e0: 75 66 66 65 72 20 2a 29 3b 0a 73 74 61 74 69 63 uffer *);.static
18f0: 20 76 6f 69 64 20 74 68 42 75 66 66 65 72 46 72 void thBufferFr
1900: 65 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e ee(Th_Interp *in
1910: 74 65 72 70 2c 20 42 75 66 66 65 72 20 2a 29 3b terp, Buffer *);
1920: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 6e ../*.** Append n
1930: 41 64 64 20 62 79 74 65 73 20 6f 66 20 63 6f 6e Add bytes of con
1940: 74 65 6e 74 20 63 6f 70 69 65 64 20 66 72 6f 6d tent copied from
1950: 20 7a 41 64 64 20 74 6f 20 74 68 65 20 65 6e 64 zAdd to the end
1960: 20 6f 66 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 of buffer.** pB
1970: 75 66 66 65 72 2e 20 49 66 20 74 68 65 72 65 20 uffer. If there
1980: 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 is not enough sp
1990: 61 63 65 20 63 75 72 72 65 6e 74 6c 79 20 61 6c ace currently al
19a0: 6c 6f 63 61 74 65 64 2c 20 72 65 73 69 7a 65 0a located, resize.
19b0: 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f ** the allocatio
19c0: 6e 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 2e n to make space.
19d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .*/.static int t
19e0: 68 42 75 66 66 65 72 57 72 69 74 65 28 0a 20 20 hBufferWrite(.
19f0: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 Th_Interp *inter
1a00: 70 2c 20 0a 20 20 42 75 66 66 65 72 20 2a 70 42 p, . Buffer *pB
1a10: 75 66 66 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 uffer, . const
1a20: 75 63 68 61 72 20 2a 7a 41 64 64 2c 20 0a 20 20 uchar *zAdd, .
1a30: 69 6e 74 20 6e 41 64 64 0a 29 7b 0a 20 20 69 6e int nAdd.){. in
1a40: 74 20 6e 52 65 71 3b 0a 0a 20 20 69 66 28 20 6e t nReq;.. if( n
1a50: 41 64 64 3c 30 20 29 7b 0a 20 20 20 20 6e 41 64 Add<0 ){. nAd
1a60: 64 20 3d 20 74 68 5f 73 74 72 6c 65 6e 28 7a 41 d = th_strlen(zA
1a70: 64 64 29 3b 0a 20 20 7d 0a 20 20 6e 52 65 71 20 dd);. }. nReq
1a80: 3d 20 70 42 75 66 66 65 72 2d 3e 6e 42 75 66 2b = pBuffer->nBuf+
1a90: 6e 41 64 64 2b 31 3b 0a 0a 20 20 69 66 28 20 6e nAdd+1;.. if( n
1aa0: 52 65 71 3e 70 42 75 66 66 65 72 2d 3e 6e 42 75 Req>pBuffer->nBu
1ab0: 66 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 75 63 fAlloc ){. uc
1ac0: 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 69 har *zNew;. i
1ad0: 6e 74 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 6e 4e nt nNew;.. nN
1ae0: 65 77 20 3d 20 6e 52 65 71 2a 32 3b 0a 20 20 20 ew = nReq*2;.
1af0: 20 7a 4e 65 77 20 3d 20 28 75 63 68 61 72 20 2a zNew = (uchar *
1b00: 29 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 72 )Th_Malloc(inter
1b10: 70 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 6d 65 p, nNew);. me
1b20: 6d 63 70 79 28 7a 4e 65 77 2c 20 70 42 75 66 66 mcpy(zNew, pBuff
1b30: 65 72 2d 3e 7a 42 75 66 2c 20 70 42 75 66 66 65 er->zBuf, pBuffe
1b40: 72 2d 3e 6e 42 75 66 29 3b 0a 20 20 20 20 54 68 r->nBuf);. Th
1b50: 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 70 42 _Free(interp, pB
1b60: 75 66 66 65 72 2d 3e 7a 42 75 66 29 3b 0a 20 20 uffer->zBuf);.
1b70: 20 20 70 42 75 66 66 65 72 2d 3e 6e 42 75 66 41 pBuffer->nBufA
1b80: 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 lloc = nNew;.
1b90: 20 70 42 75 66 66 65 72 2d 3e 7a 42 75 66 20 3d pBuffer->zBuf =
1ba0: 20 7a 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 6d 65 zNew;. }.. me
1bb0: 6d 63 70 79 28 26 70 42 75 66 66 65 72 2d 3e 7a mcpy(&pBuffer->z
1bc0: 42 75 66 5b 70 42 75 66 66 65 72 2d 3e 6e 42 75 Buf[pBuffer->nBu
1bd0: 66 5d 2c 20 7a 41 64 64 2c 20 6e 41 64 64 29 3b f], zAdd, nAdd);
1be0: 0a 20 20 70 42 75 66 66 65 72 2d 3e 6e 42 75 66 . pBuffer->nBuf
1bf0: 20 2b 3d 20 6e 41 64 64 3b 0a 20 20 70 42 75 66 += nAdd;. pBuf
1c00: 66 65 72 2d 3e 7a 42 75 66 5b 70 42 75 66 66 65 fer->zBuf[pBuffe
1c10: 72 2d 3e 6e 42 75 66 5d 20 3d 20 27 5c 30 27 3b r->nBuf] = '\0';
1c20: 0a 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b .. return TH_OK
1c30: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 74 68 42 75 ;.}.#define thBu
1c40: 66 66 65 72 57 72 69 74 65 28 61 2c 62 2c 63 2c fferWrite(a,b,c,
1c50: 64 29 20 74 68 42 75 66 66 65 72 57 72 69 74 65 d) thBufferWrite
1c60: 28 61 2c 62 2c 28 63 6f 6e 73 74 20 75 63 68 61 (a,b,(const ucha
1c70: 72 20 2a 29 63 2c 64 29 0a 0a 2f 2a 0a 2a 2a 20 r *)c,d)../*.**
1c80: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 42 Initialize the B
1c90: 75 66 66 65 72 20 73 74 72 75 63 74 75 72 65 20 uffer structure
1ca0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 42 pointed to by pB
1cb0: 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 uffer..*/.static
1cc0: 20 76 6f 69 64 20 74 68 42 75 66 66 65 72 49 6e void thBufferIn
1cd0: 69 74 28 42 75 66 66 65 72 20 2a 70 42 75 66 66 it(Buffer *pBuff
1ce0: 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 42 er){. memset(pB
1cf0: 75 66 66 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 uffer, 0, sizeof
1d00: 28 42 75 66 66 65 72 29 29 3b 0a 7d 0a 0a 2f 2a (Buffer));.}../*
1d10: 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 62 75 66 .** Zero the buf
1d20: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 fer pointed to b
1d30: 79 20 70 42 75 66 66 65 72 20 61 6e 64 20 66 72 y pBuffer and fr
1d40: 65 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 ee the associate
1d50: 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f d memory.** allo
1d60: 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 cation..*/.stati
1d70: 63 20 76 6f 69 64 20 74 68 42 75 66 66 65 72 46 c void thBufferF
1d80: 72 65 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 ree(Th_Interp *i
1d90: 6e 74 65 72 70 2c 20 42 75 66 66 65 72 20 2a 70 nterp, Buffer *p
1da0: 42 75 66 66 65 72 29 7b 0a 20 20 54 68 5f 46 72 Buffer){. Th_Fr
1db0: 65 65 28 69 6e 74 65 72 70 2c 20 70 42 75 66 66 ee(interp, pBuff
1dc0: 65 72 2d 3e 7a 42 75 66 29 3b 0a 20 20 74 68 42 er->zBuf);. thB
1dd0: 75 66 66 65 72 49 6e 69 74 28 70 42 75 66 66 65 ufferInit(pBuffe
1de0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 r);.}../*.** Ass
1df0: 75 6d 69 6e 67 20 70 61 72 61 6d 65 74 65 72 20 uming parameter
1e00: 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 68 65 78 c contains a hex
1e10: 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74 20 63 adecimal digit c
1e20: 68 61 72 61 63 74 65 72 2c 0a 2a 2a 20 72 65 74 haracter,.** ret
1e30: 75 72 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f urn the correspo
1e40: 6e 64 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 74 nding value of t
1e50: 68 61 74 20 64 69 67 69 74 2e 20 49 66 20 63 20 hat digit. If c
1e60: 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 68 65 78 61 is not.** a hexa
1e70: 64 65 63 69 6d 61 6c 20 64 69 67 69 74 20 63 68 decimal digit ch
1e80: 61 72 61 63 74 65 72 2c 20 2d 31 20 69 73 20 72 aracter, -1 is r
1e90: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 eturned..*/.stat
1ea0: 69 63 20 69 6e 74 20 74 68 48 65 78 64 69 67 69 ic int thHexdigi
1eb0: 74 28 75 63 68 61 72 20 63 29 7b 0a 20 20 73 77 t(uchar c){. sw
1ec0: 69 74 63 68 20 28 63 29 20 7b 0a 20 20 20 20 63 itch (c) {. c
1ed0: 61 73 65 20 27 30 27 3a 20 72 65 74 75 72 6e 20 ase '0': return
1ee0: 30 3b 0a 20 20 20 20 63 61 73 65 20 27 31 27 3a 0;. case '1':
1ef0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 return 1;. c
1f00: 61 73 65 20 27 32 27 3a 20 72 65 74 75 72 6e 20 ase '2': return
1f10: 32 3b 0a 20 20 20 20 63 61 73 65 20 27 33 27 3a 2;. case '3':
1f20: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 63 return 3;. c
1f30: 61 73 65 20 27 34 27 3a 20 72 65 74 75 72 6e 20 ase '4': return
1f40: 34 3b 0a 20 20 20 20 63 61 73 65 20 27 35 27 3a 4;. case '5':
1f50: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 63 return 5;. c
1f60: 61 73 65 20 27 36 27 3a 20 72 65 74 75 72 6e 20 ase '6': return
1f70: 36 3b 0a 20 20 20 20 63 61 73 65 20 27 37 27 3a 6;. case '7':
1f80: 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 20 20 63 return 7;. c
1f90: 61 73 65 20 27 38 27 3a 20 72 65 74 75 72 6e 20 ase '8': return
1fa0: 38 3b 0a 20 20 20 20 63 61 73 65 20 27 39 27 3a 8;. case '9':
1fb0: 20 72 65 74 75 72 6e 20 39 3b 0a 20 20 20 20 63 return 9;. c
1fc0: 61 73 65 20 27 61 27 3a 20 63 61 73 65 20 27 41 ase 'a': case 'A
1fd0: 27 3a 20 72 65 74 75 72 6e 20 31 30 3b 0a 20 20 ': return 10;.
1fe0: 20 20 63 61 73 65 20 27 62 27 3a 20 63 61 73 65 case 'b': case
1ff0: 20 27 42 27 3a 20 72 65 74 75 72 6e 20 31 31 3b 'B': return 11;
2000: 0a 20 20 20 20 63 61 73 65 20 27 63 27 3a 20 63 . case 'c': c
2010: 61 73 65 20 27 43 27 3a 20 72 65 74 75 72 6e 20 ase 'C': return
2020: 31 32 3b 0a 20 20 20 20 63 61 73 65 20 27 64 27 12;. case 'd'
2030: 3a 20 63 61 73 65 20 27 44 27 3a 20 72 65 74 75 : case 'D': retu
2040: 72 6e 20 31 33 3b 0a 20 20 20 20 63 61 73 65 20 rn 13;. case
2050: 27 65 27 3a 20 63 61 73 65 20 27 45 27 3a 20 72 'e': case 'E': r
2060: 65 74 75 72 6e 20 31 34 3b 0a 20 20 20 20 63 61 eturn 14;. ca
2070: 73 65 20 27 66 27 3a 20 63 61 73 65 20 27 46 27 se 'f': case 'F'
2080: 3a 20 72 65 74 75 72 6e 20 31 35 3b 0a 20 20 7d : return 15;. }
2090: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a . return -1;.}.
20a0: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 ./*.** Argument
20b0: 70 45 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 6f pEntry points to
20c0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 61 20 73 an entry in a s
20d0: 74 61 63 6b 20 66 72 61 6d 65 20 68 61 73 68 20 tack frame hash
20e0: 74 61 62 6c 65 0a 2a 2a 20 28 54 68 5f 46 72 61 table.** (Th_Fra
20f0: 6d 65 2e 70 61 56 61 72 29 2e 20 44 65 63 72 65 me.paVar). Decre
2100: 6d 65 6e 74 20 74 68 65 20 72 65 66 72 65 72 65 ment the refrere
2110: 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 nce count of the
2120: 20 54 68 5f 56 61 72 69 61 62 6c 65 0a 2a 2a 20 Th_Variable.**
2130: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 74 structure that t
2140: 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 he entry points
2150: 74 6f 2e 20 46 72 65 65 20 74 68 65 20 54 68 5f to. Free the Th_
2160: 56 61 72 69 61 62 6c 65 20 69 66 20 69 74 73 0a Variable if its.
2170: 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 ** reference cou
2180: 6e 74 20 72 65 61 63 68 65 73 20 30 2e 0a 2a 2a nt reaches 0..**
2190: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 6f .** Argument pCo
21a0: 6e 74 65 78 74 20 69 73 20 61 20 70 6f 69 6e 74 ntext is a point
21b0: 65 72 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 er to the interp
21c0: 72 65 74 65 72 20 73 74 72 75 63 74 75 72 65 2e reter structure.
21d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
21e0: 74 68 46 72 65 65 56 61 72 69 61 62 6c 65 28 54 thFreeVariable(T
21f0: 68 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e h_HashEntry *pEn
2200: 74 72 79 2c 20 76 6f 69 64 20 2a 70 43 6f 6e 74 try, void *pCont
2210: 65 78 74 29 7b 0a 20 20 54 68 5f 56 61 72 69 61 ext){. Th_Varia
2220: 62 6c 65 20 2a 70 56 61 6c 75 65 20 3d 20 28 54 ble *pValue = (T
2230: 68 5f 56 61 72 69 61 62 6c 65 20 2a 29 70 45 6e h_Variable *)pEn
2240: 74 72 79 2d 3e 70 44 61 74 61 3b 0a 20 20 70 56 try->pData;. pV
2250: 61 6c 75 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 alue->nRef--;.
2260: 61 73 73 65 72 74 28 20 70 56 61 6c 75 65 2d 3e assert( pValue->
2270: 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 69 66 28 nRef>=0 );. if(
2280: 20 70 56 61 6c 75 65 2d 3e 6e 52 65 66 3d 3d 30 pValue->nRef==0
2290: 20 29 7b 0a 20 20 20 20 54 68 5f 49 6e 74 65 72 ){. Th_Inter
22a0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 28 54 68 5f p *interp = (Th_
22b0: 49 6e 74 65 72 70 20 2a 29 70 43 6f 6e 74 65 78 Interp *)pContex
22c0: 74 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69 t;. Th_Free(i
22d0: 6e 74 65 72 70 2c 20 70 56 61 6c 75 65 2d 3e 7a nterp, pValue->z
22e0: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70 Data);. if( p
22f0: 56 61 6c 75 65 2d 3e 70 48 61 73 68 20 29 7b 0a Value->pHash ){.
2300: 20 20 20 20 20 20 54 68 5f 48 61 73 68 49 74 65 Th_HashIte
2310: 72 61 74 65 28 69 6e 74 65 72 70 2c 20 70 56 61 rate(interp, pVa
2320: 6c 75 65 2d 3e 70 48 61 73 68 2c 20 74 68 46 72 lue->pHash, thFr
2330: 65 65 56 61 72 69 61 62 6c 65 2c 20 70 43 6f 6e eeVariable, pCon
2340: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 54 68 5f text);. Th_
2350: 48 61 73 68 44 65 6c 65 74 65 28 69 6e 74 65 72 HashDelete(inter
2360: 70 2c 20 70 56 61 6c 75 65 2d 3e 70 48 61 73 68 p, pValue->pHash
2370: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 68 5f );. }. Th_
2380: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 70 56 61 Free(interp, pVa
2390: 6c 75 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a lue);. }.}../*.
23a0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 6e 74 ** Argument pEnt
23b0: 72 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 ry points to an
23c0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 6f 6d entry in the com
23d0: 6d 61 6e 64 20 68 61 73 68 20 74 61 62 6c 65 0a mand hash table.
23e0: 2a 2a 20 28 54 68 5f 49 6e 74 65 72 70 2e 70 61 ** (Th_Interp.pa
23f0: 43 6d 64 29 2e 20 44 65 6c 65 74 65 20 74 68 65 Cmd). Delete the
2400: 20 54 68 5f 43 6f 6d 6d 61 6e 64 20 73 74 72 75 Th_Command stru
2410: 63 74 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a cture that the.*
2420: 2a 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20 74 * entry points t
2430: 6f 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e o..**.** Argumen
2440: 74 20 70 43 6f 6e 74 65 78 74 20 69 73 20 61 20 t pContext is a
2450: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 pointer to the i
2460: 6e 74 65 72 70 72 65 74 65 72 20 73 74 72 75 63 nterpreter struc
2470: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ture..*/.static
2480: 76 6f 69 64 20 74 68 46 72 65 65 43 6f 6d 6d 61 void thFreeComma
2490: 6e 64 28 54 68 5f 48 61 73 68 45 6e 74 72 79 20 nd(Th_HashEntry
24a0: 2a 70 45 6e 74 72 79 2c 20 76 6f 69 64 20 2a 70 *pEntry, void *p
24b0: 43 6f 6e 74 65 78 74 29 7b 0a 20 20 54 68 5f 43 Context){. Th_C
24c0: 6f 6d 6d 61 6e 64 20 2a 70 43 6f 6d 6d 61 6e 64 ommand *pCommand
24d0: 20 3d 20 28 54 68 5f 43 6f 6d 6d 61 6e 64 20 2a = (Th_Command *
24e0: 29 70 45 6e 74 72 79 2d 3e 70 44 61 74 61 3b 0a )pEntry->pData;.
24f0: 20 20 69 66 28 20 70 43 6f 6d 6d 61 6e 64 2d 3e if( pCommand->
2500: 78 44 65 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6d xDel ){. pCom
2510: 6d 61 6e 64 2d 3e 78 44 65 6c 28 28 54 68 5f 49 mand->xDel((Th_I
2520: 6e 74 65 72 70 20 2a 29 70 43 6f 6e 74 65 78 74 nterp *)pContext
2530: 2c 20 70 43 6f 6d 6d 61 6e 64 2d 3e 70 43 6f 6e , pCommand->pCon
2540: 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 54 68 5f text);. }. Th_
2550: 46 72 65 65 28 28 54 68 5f 49 6e 74 65 72 70 20 Free((Th_Interp
2560: 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 45 6e 74 *)pContext, pEnt
2570: 72 79 2d 3e 70 44 61 74 61 29 3b 0a 20 20 70 45 ry->pData);. pE
2580: 6e 74 72 79 2d 3e 70 44 61 74 61 20 3d 20 30 3b ntry->pData = 0;
2590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 .}../*.** Push a
25a0: 20 6e 65 77 20 66 72 61 6d 65 20 6f 6e 74 6f 20 new frame onto
25b0: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 the stack..*/.st
25c0: 61 74 69 63 20 69 6e 74 20 74 68 50 75 73 68 46 atic int thPushF
25d0: 72 61 6d 65 28 54 68 5f 49 6e 74 65 72 70 20 2a rame(Th_Interp *
25e0: 69 6e 74 65 72 70 2c 20 54 68 5f 46 72 61 6d 65 interp, Th_Frame
25f0: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 70 46 72 *pFrame){. pFr
2600: 61 6d 65 2d 3e 70 61 56 61 72 20 3d 20 54 68 5f ame->paVar = Th_
2610: 48 61 73 68 4e 65 77 28 69 6e 74 65 72 70 29 3b HashNew(interp);
2620: 0a 20 20 70 46 72 61 6d 65 2d 3e 70 43 61 6c 6c . pFrame->pCall
2630: 65 72 20 3d 20 69 6e 74 65 72 70 2d 3e 70 46 72 er = interp->pFr
2640: 61 6d 65 3b 0a 20 20 69 6e 74 65 72 70 2d 3e 70 ame;. interp->p
2650: 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a Frame = pFrame;.
2660: 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a return TH_OK;.
2670: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 61 20 66 }../*.** Pop a f
2680: 72 61 6d 65 20 6f 66 66 20 74 68 65 20 74 6f 70 rame off the top
2690: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a of the stack..*
26a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 68 /.static void th
26b0: 50 6f 70 46 72 61 6d 65 28 54 68 5f 49 6e 74 65 PopFrame(Th_Inte
26c0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 rp *interp){. T
26d0: 68 5f 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 h_Frame *pFrame
26e0: 3d 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d 65 = interp->pFrame
26f0: 3b 0a 20 20 54 68 5f 48 61 73 68 49 74 65 72 61 ;. Th_HashItera
2700: 74 65 28 69 6e 74 65 72 70 2c 20 70 46 72 61 6d te(interp, pFram
2710: 65 2d 3e 70 61 56 61 72 2c 20 74 68 46 72 65 65 e->paVar, thFree
2720: 56 61 72 69 61 62 6c 65 2c 20 28 76 6f 69 64 20 Variable, (void
2730: 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54 68 5f *)interp);. Th_
2740: 48 61 73 68 44 65 6c 65 74 65 28 69 6e 74 65 72 HashDelete(inter
2750: 70 2c 20 70 46 72 61 6d 65 2d 3e 70 61 56 61 72 p, pFrame->paVar
2760: 29 3b 0a 20 20 69 6e 74 65 72 70 2d 3e 70 46 72 );. interp->pFr
2770: 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e 70 43 ame = pFrame->pC
2780: 61 6c 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 aller;.}../*.**
2790: 54 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f The first part o
27a0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 28 7a 49 f the string (zI
27b0: 6e 70 75 74 2c 6e 49 6e 70 75 74 29 20 63 6f 6e nput,nInput) con
27c0: 74 61 69 6e 73 20 61 6e 20 65 73 63 61 70 65 20 tains an escape
27d0: 0a 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 53 65 .** sequence. Se
27e0: 74 20 2a 70 6e 45 73 63 61 70 65 20 74 6f 20 74 t *pnEscape to t
27f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
2800: 65 73 20 69 6e 20 74 68 65 20 65 73 63 61 70 65 es in the escape
2810: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 49 66 sequence..** If
2820: 20 74 68 65 72 65 20 69 73 20 61 20 70 61 72 73 there is a pars
2830: 65 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 e error, return
2840: 54 48 5f 45 52 52 4f 52 20 61 6e 64 20 73 65 74 TH_ERROR and set
2850: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
2860: 0a 2a 2a 20 72 65 73 75 6c 74 20 74 6f 20 61 6e .** result to an
2870: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 error message.
2880: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e Otherwise return
2890: 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 TH_OK..*/.stati
28a0: 63 20 69 6e 74 20 74 68 4e 65 78 74 45 73 63 61 c int thNextEsca
28b0: 70 65 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 pe(. Th_Interp
28c0: 2a 69 6e 74 65 72 70 2c 0a 20 20 63 6f 6e 73 74 *interp,. const
28d0: 20 75 63 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20 uchar *zInput,
28e0: 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 0a . int nInput, .
28f0: 20 20 69 6e 74 20 2a 70 6e 45 73 63 61 70 65 0a int *pnEscape.
2900: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 32 3b 0a ){. int i = 2;.
2910: 0a 20 20 61 73 73 65 72 74 28 6e 49 6e 70 75 74 . assert(nInput
2920: 3e 30 29 3b 0a 20 20 61 73 73 65 72 74 28 7a 49 >0);. assert(zI
2930: 6e 70 75 74 5b 30 5d 3d 3d 27 5c 5c 27 29 3b 0a nput[0]=='\\');.
2940: 0a 20 20 69 66 28 20 6e 49 6e 70 75 74 3c 3d 31 . if( nInput<=1
2950: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 ){. return T
2960: 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 H_ERROR;. }..
2970: 73 77 69 74 63 68 28 20 7a 49 6e 70 75 74 5b 31 switch( zInput[1
2980: 5d 20 29 7b 0a 20 20 20 20 63 61 73 65 20 27 78 ] ){. case 'x
2990: 27 3a 20 69 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 ': i = 4;. }..
29a0: 20 69 66 28 20 69 3e 6e 49 6e 70 75 74 20 29 7b if( i>nInput ){
29b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f 45 . return TH_E
29c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 2a 70 6e 45 RROR;. }. *pnE
29d0: 73 63 61 70 65 20 3d 20 69 3b 0a 20 20 72 65 74 scape = i;. ret
29e0: 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a urn TH_OK;.}../*
29f0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 .** The first pa
2a00: 72 74 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 rt of the string
2a10: 20 28 7a 49 6e 70 75 74 2c 6e 49 6e 70 75 74 29 (zInput,nInput)
2a20: 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 72 69 contains a vari
2a30: 61 62 6c 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 able.** referenc
2a40: 65 2e 20 53 65 74 20 2a 70 6e 56 61 72 6e 61 6d e. Set *pnVarnam
2a50: 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 e to the number
2a60: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 of bytes in the
2a70: 76 61 72 69 61 62 6c 65 20 0a 2a 2a 20 72 65 66 variable .** ref
2a80: 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 72 65 erence. If there
2a90: 20 69 73 20 61 20 70 61 72 73 65 20 65 72 72 6f is a parse erro
2aa0: 72 2c 20 72 65 74 75 72 6e 20 54 48 5f 45 52 52 r, return TH_ERR
2ab0: 4f 52 20 61 6e 64 20 73 65 74 20 74 68 65 20 0a OR and set the .
2ac0: 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 ** interpreter r
2ad0: 65 73 75 6c 74 20 74 6f 20 61 6e 20 65 72 72 6f esult to an erro
2ae0: 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 72 r message. Other
2af0: 77 69 73 65 20 72 65 74 75 72 6e 20 54 48 5f 4f wise return TH_O
2b00: 4b 2e 0a 2a 2f 0a 69 6e 74 20 74 68 4e 65 78 74 K..*/.int thNext
2b10: 56 61 72 6e 61 6d 65 28 0a 20 20 54 68 5f 49 6e Varname(. Th_In
2b20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 terp *interp,.
2b30: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 49 6e const uchar *zIn
2b40: 70 75 74 2c 20 0a 20 20 69 6e 74 20 6e 49 6e 70 put, . int nInp
2b50: 75 74 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 56 61 ut, . int *pnVa
2b60: 72 6e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 69 rname.){. int i
2b70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 49 6e 70 ;.. assert(nInp
2b80: 75 74 3e 30 29 3b 0a 20 20 61 73 73 65 72 74 28 ut>0);. assert(
2b90: 7a 49 6e 70 75 74 5b 30 5d 3d 3d 27 24 27 29 3b zInput[0]=='$');
2ba0: 0a 0a 20 20 69 66 28 20 6e 49 6e 70 75 74 3e 30 .. if( nInput>0
2bb0: 20 26 26 20 7a 49 6e 70 75 74 5b 31 5d 3d 3d 27 && zInput[1]=='
2bc0: 7b 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d {' ){. for(i=
2bd0: 32 3b 20 69 3c 6e 49 6e 70 75 74 20 26 26 20 7a 2; i<nInput && z
2be0: 49 6e 70 75 74 5b 69 5d 21 3d 27 7d 27 3b 20 69 Input[i]!='}'; i
2bf0: 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d ++);. if( i==
2c00: 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 nInput ){.
2c10: 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b return TH_ERROR;
2c20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a . }. i++;.
2c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d }else{. i =
2c40: 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 49 6e 70 1;. if( nInp
2c50: 75 74 3e 32 20 26 26 20 7a 49 6e 70 75 74 5b 31 ut>2 && zInput[1
2c60: 5d 3d 3d 27 3a 27 20 26 26 20 7a 49 6e 70 75 74 ]==':' && zInput
2c70: 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 [2]==':' ){.
2c80: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a i += 2;. }.
2c90: 20 20 20 20 66 6f 72 28 3b 20 69 3c 6e 49 6e 70 for(; i<nInp
2ca0: 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 ut; i++){.
2cb0: 69 66 28 20 7a 49 6e 70 75 74 5b 69 5d 3d 3d 27 if( zInput[i]=='
2cc0: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f (' ){. fo
2cd0: 72 28 69 2b 2b 3b 20 69 3c 6e 49 6e 70 75 74 3b r(i++; i<nInput;
2ce0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 i++){.
2cf0: 20 69 66 28 20 7a 49 6e 70 75 74 5b 69 5d 3d 3d if( zInput[i]==
2d00: 27 29 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 ')' ) break;.
2d10: 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e 70 75 if( zInpu
2d20: 74 5b 69 5d 3d 3d 27 5c 5c 27 20 29 20 69 2b 2b t[i]=='\\' ) i++
2d30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 ;. if(
2d40: 7a 49 6e 70 75 74 5b 69 5d 3d 3d 27 7b 27 20 7c zInput[i]=='{' |
2d50: 7c 20 7a 49 6e 70 75 74 5b 69 5d 3d 3d 27 5b 27 | zInput[i]=='['
2d60: 20 7c 7c 20 7a 49 6e 70 75 74 5b 69 5d 3d 3d 27 || zInput[i]=='
2d70: 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 "' ){.
2d80: 20 20 69 6e 74 20 6e 57 6f 72 64 3b 0a 20 20 20 int nWord;.
2d90: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 int rc
2da0: 3d 20 74 68 4e 65 78 74 57 6f 72 64 28 69 6e 74 = thNextWord(int
2db0: 65 72 70 2c 20 26 7a 49 6e 70 75 74 5b 69 5d 2c erp, &zInput[i],
2dc0: 20 6e 49 6e 70 75 74 2d 69 2c 20 26 6e 57 6f 72 nInput-i, &nWor
2dd0: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 d, 0);.
2de0: 20 20 20 69 66 28 20 72 63 21 3d 54 48 5f 4f 4b if( rc!=TH_OK
2df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
2e00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 return rc;.
2e10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
2e20: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 57 6f 72 i += nWor
2e30: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 d;. }.
2e40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
2e50: 20 69 66 28 20 69 3e 3d 6e 49 6e 70 75 74 20 29 if( i>=nInput )
2e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 68 5f 45 {. Th_E
2e70: 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 rrorMessage(inte
2e80: 72 70 2c 20 22 55 6e 6d 61 74 63 68 65 64 20 62 rp, "Unmatched b
2e90: 72 61 63 6b 65 74 73 3a 22 2c 20 7a 49 6e 70 75 rackets:", zInpu
2ea0: 74 2c 20 6e 49 6e 70 75 74 29 3b 0a 20 20 20 20 t, nInput);.
2eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f return TH_
2ec0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d ERROR;. }
2ed0: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 . i++;.
2ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
2ef0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 }. if( !
2f00: 74 68 5f 69 73 61 6c 6e 75 6d 28 7a 49 6e 70 75 th_isalnum(zInpu
2f10: 74 5b 69 5d 29 20 26 26 20 7a 49 6e 70 75 74 5b t[i]) && zInput[
2f20: 69 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b i]!='_' ) break;
2f30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 . }. }.. *p
2f40: 6e 56 61 72 6e 61 6d 65 20 3d 20 69 3b 0a 20 20 nVarname = i;.
2f50: 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a return TH_OK;.}.
2f60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 ./*.** The first
2f70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 74 72 part of the str
2f80: 69 6e 67 20 28 7a 49 6e 70 75 74 2c 6e 49 6e 70 ing (zInput,nInp
2f90: 75 74 29 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 ut) contains a c
2fa0: 6f 6d 6d 61 6e 64 0a 2a 2a 20 65 6e 63 6c 6f 73 ommand.** enclos
2fb0: 65 64 20 69 6e 20 61 20 22 5b 5d 22 20 62 6c 6f ed in a "[]" blo
2fc0: 63 6b 2e 20 53 65 74 20 2a 70 6e 43 6f 6d 6d 61 ck. Set *pnComma
2fd0: 6e 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 nd to the number
2fe0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a of bytes in .**
2ff0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 72 65 the variable re
3000: 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 72 ference. If ther
3010: 65 20 69 73 20 61 20 70 61 72 73 65 20 65 72 72 e is a parse err
3020: 6f 72 2c 20 72 65 74 75 72 6e 20 54 48 5f 45 52 or, return TH_ER
3030: 52 4f 52 20 0a 2a 2a 20 61 6e 64 20 73 65 74 20 ROR .** and set
3040: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
3050: 72 65 73 75 6c 74 20 74 6f 20 61 6e 20 65 72 72 result to an err
3060: 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 or message. Othe
3070: 72 77 69 73 65 20 72 65 74 75 72 6e 20 0a 2a 2a rwise return .**
3080: 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 74 TH_OK..*/.int t
3090: 68 4e 65 78 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 hNextCommand(.
30a0: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 Th_Interp *inter
30b0: 70 2c 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72 p,. const uchar
30c0: 20 2a 7a 49 6e 70 75 74 2c 20 0a 20 20 69 6e 74 *zInput, . int
30d0: 20 6e 49 6e 70 75 74 2c 20 0a 20 20 69 6e 74 20 nInput, . int
30e0: 2a 70 6e 43 6f 6d 6d 61 6e 64 0a 29 7b 0a 20 20 *pnCommand.){.
30f0: 69 6e 74 20 6e 42 72 61 63 65 20 3d 20 30 3b 0a int nBrace = 0;.
3100: 20 20 69 6e 74 20 6e 53 71 75 61 72 65 20 3d 20 int nSquare =
3110: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 0;. int i;.. a
3120: 73 73 65 72 74 28 6e 49 6e 70 75 74 3e 30 29 3b ssert(nInput>0);
3130: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 70 75 . assert( zInpu
3140: 74 5b 30 5d 3d 3d 27 5b 27 20 7c 7c 20 7a 49 6e t[0]=='[' || zIn
3150: 70 75 74 5b 30 5d 3d 3d 27 7b 27 20 29 3b 0a 0a put[0]=='{' );..
3160: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e for(i=0; i<nIn
3170: 70 75 74 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 put && (i==0 ||
3180: 6e 42 72 61 63 65 3e 30 20 7c 7c 20 6e 53 71 75 nBrace>0 || nSqu
3190: 61 72 65 3e 30 29 3b 20 69 2b 2b 29 7b 0a 20 20 are>0); i++){.
31a0: 20 20 73 77 69 74 63 68 28 20 7a 49 6e 70 75 74 switch( zInput
31b0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 [i] ){. cas
31c0: 65 20 27 5c 5c 27 3a 20 69 2b 2b 3b 20 62 72 65 e '\\': i++; bre
31d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 ak;. case '
31e0: 7b 27 3a 20 6e 42 72 61 63 65 2b 2b 3b 20 62 72 {': nBrace++; br
31f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 eak;. case
3200: 27 7d 27 3a 20 6e 42 72 61 63 65 2d 2d 3b 20 62 '}': nBrace--; b
3210: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 reak;. case
3220: 20 27 5b 27 3a 20 6e 53 71 75 61 72 65 2b 2b 3b '[': nSquare++;
3230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 break;. ca
3240: 73 65 20 27 5d 27 3a 20 6e 53 71 75 61 72 65 2d se ']': nSquare-
3250: 2d 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a -; break;. }.
3260: 20 20 7d 0a 20 20 69 66 28 20 6e 42 72 61 63 65 }. if( nBrace
3270: 20 7c 7c 20 6e 53 71 75 61 72 65 20 29 7b 0a 20 || nSquare ){.
3280: 20 20 20 72 65 74 75 72 6e 20 54 48 5f 45 52 52 return TH_ERR
3290: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 43 6f OR;. }.. *pnCo
32a0: 6d 6d 61 6e 64 20 3d 20 69 3b 0a 0a 20 20 72 65 mmand = i;.. re
32b0: 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f turn TH_OK;.}../
32c0: 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e 53 70 61 63 *.** Set *pnSpac
32d0: 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 e to the number
32e0: 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 62 79 of whitespace by
32f0: 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 tes at the start
3300: 20 6f 66 20 0a 2a 2a 20 69 6e 70 75 74 20 73 74 of .** input st
3310: 72 69 6e 67 20 28 7a 49 6e 70 75 74 2c 20 6e 49 ring (zInput, nI
3320: 6e 70 75 74 29 2e 20 41 6c 77 61 79 73 20 72 65 nput). Always re
3330: 74 75 72 6e 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 69 turn TH_OK..*/.i
3340: 6e 74 20 74 68 4e 65 78 74 53 70 61 63 65 28 0a nt thNextSpace(.
3350: 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Th_Interp *int
3360: 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20 75 63 68 erp,. const uch
3370: 61 72 20 2a 7a 49 6e 70 75 74 2c 20 0a 20 20 69 ar *zInput, . i
3380: 6e 74 20 6e 49 6e 70 75 74 2c 20 0a 20 20 69 6e nt nInput, . in
3390: 74 20 2a 70 6e 53 70 61 63 65 0a 29 7b 0a 20 20 t *pnSpace.){.
33a0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 int i;. for(i=0
33b0: 3b 20 69 3c 6e 49 6e 70 75 74 20 26 26 20 74 68 ; i<nInput && th
33c0: 5f 69 73 73 70 61 63 65 28 7a 49 6e 70 75 74 5b _isspace(zInput[
33d0: 69 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 2a 70 6e i]); i++);. *pn
33e0: 53 70 61 63 65 20 3d 20 69 3b 0a 20 20 72 65 74 Space = i;. ret
33f0: 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a urn TH_OK;.}../*
3400: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 .** The first by
3410: 74 65 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 te of the string
3420: 20 28 7a 49 6e 70 75 74 2c 6e 49 6e 70 75 74 29 (zInput,nInput)
3430: 20 69 73 20 6e 6f 74 20 77 68 69 74 65 2d 73 70 is not white-sp
3440: 61 63 65 2e 0a 2a 2a 20 53 65 74 20 2a 70 6e 57 ace..** Set *pnW
3450: 6f 72 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 ord to the numbe
3460: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 r of bytes in th
3470: 65 20 74 68 31 20 77 6f 72 64 20 74 68 61 74 20 e th1 word that
3480: 73 74 61 72 74 73 0a 2a 2a 20 77 69 74 68 20 74 starts.** with t
3490: 68 69 73 20 62 79 74 65 2e 20 49 66 20 61 20 63 his byte. If a c
34a0: 6f 6d 70 6c 65 74 65 20 77 6f 72 64 20 63 61 6e omplete word can
34b0: 6e 6f 74 20 62 65 20 70 61 72 73 65 64 20 6f 72 not be parsed or
34c0: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 65 some other.** e
34d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 rror occurs, ret
34e0: 75 72 6e 20 54 48 5f 45 52 52 4f 52 20 61 6e 64 urn TH_ERROR and
34f0: 20 73 65 74 20 74 68 65 20 69 6e 74 65 72 70 72 set the interpr
3500: 65 74 65 72 20 72 65 73 75 6c 74 20 74 6f 20 0a eter result to .
3510: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 ** an error mess
3520: 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 20 72 age. Otherwise r
3530: 65 74 75 72 6e 20 54 48 5f 4f 4b 2e 0a 2a 2a 0a eturn TH_OK..**.
3540: 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6d 64 20 ** If the isCmd
3550: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d argument is non-
3560: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 20 75 6e zero, then an un
3570: 65 73 63 61 70 65 64 20 22 3b 22 20 62 79 74 65 escaped ";" byte
3580: 20 6e 6f 74 20 0a 2a 2a 20 6c 6f 63 61 74 65 64 not .** located
3590: 20 69 6e 73 69 64 65 20 6f 66 20 61 20 62 6c 6f inside of a blo
35a0: 63 6b 20 6f 72 20 71 75 6f 74 65 64 20 73 74 72 ck or quoted str
35b0: 69 6e 67 20 69 73 20 63 6f 6e 73 69 64 65 72 65 ing is considere
35c0: 64 20 74 6f 20 6d 61 72 6b 20 0a 2a 2a 20 74 68 d to mark .** th
35d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 77 6f 72 e end of the wor
35e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 d..*/.static int
35f0: 20 74 68 4e 65 78 74 57 6f 72 64 28 0a 20 20 54 thNextWord(. T
3600: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 h_Interp *interp
3610: 2c 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 ,. const uchar
3620: 2a 7a 49 6e 70 75 74 2c 20 0a 20 20 69 6e 74 20 *zInput, . int
3630: 6e 49 6e 70 75 74 2c 20 0a 20 20 69 6e 74 20 2a nInput, . int *
3640: 70 6e 57 6f 72 64 2c 0a 20 20 69 6e 74 20 69 73 pnWord,. int is
3650: 43 6d 64 0a 29 7b 0a 20 20 69 6e 74 20 69 45 6e Cmd.){. int iEn
3660: 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 d = 0;.. assert
3670: 28 20 21 74 68 5f 69 73 73 70 61 63 65 28 7a 49 ( !th_isspace(zI
3680: 6e 70 75 74 5b 30 5d 29 20 29 3b 0a 0a 20 20 69 nput[0]) );.. i
3690: 66 28 20 7a 49 6e 70 75 74 5b 30 5d 3d 3d 27 22 f( zInput[0]=='"
36a0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 ' ){. /* The
36b0: 77 6f 72 64 20 69 73 20 74 65 72 6d 69 6e 61 74 word is terminat
36c0: 65 64 20 62 79 20 74 68 65 20 6e 65 78 74 20 75 ed by the next u
36d0: 6e 65 73 63 61 70 65 64 20 27 22 27 20 63 68 61 nescaped '"' cha
36e0: 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 racter. */. i
36f0: 45 6e 64 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 End++;. while
3700: 28 20 69 45 6e 64 3c 6e 49 6e 70 75 74 20 26 26 ( iEnd<nInput &&
3710: 20 7a 49 6e 70 75 74 5b 69 45 6e 64 5d 21 3d 27 zInput[iEnd]!='
3720: 22 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 "' ){. if(
3730: 7a 49 6e 70 75 74 5b 69 45 6e 64 5d 3d 3d 27 5c zInput[iEnd]=='\
3740: 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 45 \' ){. iE
3750: 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 nd++;. }.
3760: 20 20 20 20 69 45 6e 64 2b 2b 3b 0a 20 20 20 20 iEnd++;.
3770: 7d 0a 20 20 20 20 69 45 6e 64 2b 2b 3b 0a 20 20 }. iEnd++;.
3780: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e }else{. int n
3790: 42 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 Brace = 0;. i
37a0: 6e 74 20 6e 53 71 20 3d 20 30 3b 0a 20 20 20 20 nt nSq = 0;.
37b0: 77 68 69 6c 65 28 20 69 45 6e 64 3c 6e 49 6e 70 while( iEnd<nInp
37c0: 75 74 20 26 26 20 28 6e 42 72 61 63 65 3e 30 20 ut && (nBrace>0
37d0: 7c 7c 20 6e 53 71 3e 30 20 7c 7c 0a 20 20 20 20 || nSq>0 ||.
37e0: 20 20 28 21 74 68 5f 69 73 73 70 61 63 65 28 7a (!th_isspace(z
37f0: 49 6e 70 75 74 5b 69 45 6e 64 5d 29 20 26 26 20 Input[iEnd]) &&
3800: 28 21 69 73 43 6d 64 20 7c 7c 20 7a 49 6e 70 75 (!isCmd || zInpu
3810: 74 5b 69 45 6e 64 5d 21 3d 27 3b 27 29 29 0a 20 t[iEnd]!=';')).
3820: 20 20 20 29 29 7b 0a 20 20 20 20 20 20 73 77 69 )){. swi
3830: 74 63 68 28 20 7a 49 6e 70 75 74 5b 69 45 6e 64 tch( zInput[iEnd
3840: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 ] ){. cas
3850: 65 20 27 5c 5c 27 3a 20 69 45 6e 64 2b 2b 3b 20 e '\\': iEnd++;
3860: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 break;. c
3870: 61 73 65 20 27 7b 27 3a 20 69 66 28 20 6e 53 71 ase '{': if( nSq
3880: 3d 3d 30 20 29 20 6e 42 72 61 63 65 2b 2b 3b 20 ==0 ) nBrace++;
3890: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 break;. c
38a0: 61 73 65 20 27 7d 27 3a 20 69 66 28 20 6e 53 71 ase '}': if( nSq
38b0: 3d 3d 30 20 29 20 6e 42 72 61 63 65 2d 2d 3b 20 ==0 ) nBrace--;
38c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 break;. c
38d0: 61 73 65 20 27 5b 27 3a 20 69 66 28 20 6e 42 72 ase '[': if( nBr
38e0: 61 63 65 3d 3d 30 20 29 20 6e 53 71 2b 2b 3b 20 ace==0 ) nSq++;
38f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 break;. c
3900: 61 73 65 20 27 5d 27 3a 20 69 66 28 20 6e 42 72 ase ']': if( nBr
3910: 61 63 65 3d 3d 30 20 29 20 6e 53 71 2d 2d 3b 20 ace==0 ) nSq--;
3920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
3930: 20 20 20 20 20 69 45 6e 64 2b 2b 3b 0a 20 20 20 iEnd++;.
3940: 20 7d 0a 20 20 20 20 69 66 28 20 6e 42 72 61 63 }. if( nBrac
3950: 65 3e 30 20 7c 7c 20 6e 53 71 3e 30 20 29 7b 0a e>0 || nSq>0 ){.
3960: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 65 /* Parse e
3970: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 rror */. re
3980: 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 turn TH_ERROR;.
3990: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 }. }.. if(
39a0: 69 45 6e 64 3e 6e 49 6e 70 75 74 20 29 7b 0a 20 iEnd>nInput ){.
39b0: 20 20 20 2f 2a 20 50 61 72 73 65 20 65 72 72 6f /* Parse erro
39c0: 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 r */. return
39d0: 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 TH_ERROR;. }.
39e0: 2a 70 6e 57 6f 72 64 20 3d 20 69 45 6e 64 3b 0a *pnWord = iEnd;.
39f0: 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a return TH_OK;.
3a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 }../*.** The inp
3a10: 75 74 20 73 74 72 69 6e 67 20 28 7a 57 6f 72 64 ut string (zWord
3a20: 2c 20 6e 57 6f 72 64 29 20 63 6f 6e 74 61 69 6e , nWord) contain
3a30: 73 20 61 20 74 68 31 20 73 63 72 69 70 74 20 65 s a th1 script e
3a40: 6e 63 6c 6f 73 65 64 20 69 6e 0a 2a 2a 20 61 20 nclosed in.** a
3a50: 5b 5d 20 62 6c 6f 63 6b 2e 20 50 65 72 66 6f 72 [] block. Perfor
3a60: 6d 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f m substitution o
3a70: 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 n the input stri
3a80: 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 ng and store the
3a90: 0a 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 73 74 .** resulting st
3aa0: 72 69 6e 67 20 69 6e 20 74 68 65 20 69 6e 74 65 ring in the inte
3ab0: 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e 0a rpreter result..
3ac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68 */.static int th
3ad0: 53 75 62 73 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 SubstCommand(.
3ae0: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 Th_Interp *inter
3af0: 70 2c 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72 p,. const uchar
3b00: 20 2a 7a 57 6f 72 64 2c 0a 20 20 69 6e 74 20 6e *zWord,. int n
3b10: 57 6f 72 64 0a 29 7b 0a 20 20 61 73 73 65 72 74 Word.){. assert
3b20: 28 6e 57 6f 72 64 3e 3d 32 29 3b 0a 20 20 61 73 (nWord>=2);. as
3b30: 73 65 72 74 28 7a 57 6f 72 64 5b 30 5d 3d 3d 27 sert(zWord[0]=='
3b40: 5b 27 20 26 26 20 7a 57 6f 72 64 5b 6e 57 6f 72 [' && zWord[nWor
3b50: 64 2d 31 5d 3d 3d 27 5d 27 29 3b 0a 20 20 72 65 d-1]==']');. re
3b60: 74 75 72 6e 20 74 68 45 76 61 6c 4c 6f 63 61 6c turn thEvalLocal
3b70: 28 69 6e 74 65 72 70 2c 20 26 7a 57 6f 72 64 5b (interp, &zWord[
3b80: 31 5d 2c 20 6e 57 6f 72 64 2d 32 29 3b 0a 7d 0a 1], nWord-2);.}.
3b90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 ./*.** The input
3ba0: 20 73 74 72 69 6e 67 20 28 7a 57 6f 72 64 2c 20 string (zWord,
3bb0: 6e 57 6f 72 64 29 20 63 6f 6e 74 61 69 6e 73 20 nWord) contains
3bc0: 61 20 74 68 31 20 76 61 72 69 61 62 6c 65 20 72 a th1 variable r
3bd0: 65 66 65 72 65 6e 63 65 0a 2a 2a 20 28 61 20 27 eference.** (a '
3be0: 24 27 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65 64 $' byte followed
3bf0: 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6e by a variable n
3c00: 61 6d 65 29 2e 20 50 65 72 66 6f 72 6d 20 73 75 ame). Perform su
3c10: 62 73 74 69 74 75 74 69 6f 6e 20 6f 6e 20 0a 2a bstitution on .*
3c20: 2a 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 * the input stri
3c30: 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 ng and store the
3c40: 20 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69 6e resulting strin
3c50: 67 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 g in the interpr
3c60: 65 74 65 72 20 0a 2a 2a 20 72 65 73 75 6c 74 2e eter .** result.
3c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .*/.static int t
3c80: 68 53 75 62 73 74 56 61 72 6e 61 6d 65 28 0a 20 hSubstVarname(.
3c90: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Th_Interp *inte
3ca0: 72 70 2c 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 rp,. const ucha
3cb0: 72 20 2a 7a 57 6f 72 64 2c 0a 20 20 69 6e 74 20 r *zWord,. int
3cc0: 6e 57 6f 72 64 0a 29 7b 0a 20 20 61 73 73 65 72 nWord.){. asser
3cd0: 74 28 6e 57 6f 72 64 3e 3d 31 29 3b 0a 20 20 61 t(nWord>=1);. a
3ce0: 73 73 65 72 74 28 7a 57 6f 72 64 5b 30 5d 3d 3d ssert(zWord[0]==
3cf0: 27 24 27 29 3b 0a 20 20 61 73 73 65 72 74 28 6e '$');. assert(n
3d00: 57 6f 72 64 3d 3d 31 20 7c 7c 20 7a 57 6f 72 64 Word==1 || zWord
3d10: 5b 31 5d 21 3d 27 7b 27 20 7c 7c 20 7a 57 6f 72 [1]!='{' || zWor
3d20: 64 5b 6e 57 6f 72 64 2d 31 5d 3d 3d 27 7d 27 29 d[nWord-1]=='}')
3d30: 3b 0a 20 20 69 66 28 20 6e 57 6f 72 64 3e 31 20 ;. if( nWord>1
3d40: 26 26 20 7a 57 6f 72 64 5b 31 5d 3d 3d 27 7b 27 && zWord[1]=='{'
3d50: 20 29 7b 0a 20 20 20 20 7a 57 6f 72 64 2b 2b 3b ){. zWord++;
3d60: 0a 20 20 20 20 6e 57 6f 72 64 20 2d 3d 20 32 3b . nWord -= 2;
3d70: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 57 6f . }else if( zWo
3d80: 72 64 5b 6e 57 6f 72 64 2d 31 5d 3d 3d 27 29 27 rd[nWord-1]==')'
3d90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
3da0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 57 for(i=1; i<nW
3db0: 6f 72 64 20 26 26 20 7a 57 6f 72 64 5b 69 5d 21 ord && zWord[i]!
3dc0: 3d 27 28 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 ='('; i++);.
3dd0: 69 66 28 20 69 3c 6e 57 6f 72 64 20 29 7b 0a 20 if( i<nWord ){.
3de0: 20 20 20 20 20 42 75 66 66 65 72 20 76 61 72 6e Buffer varn
3df0: 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e ame;. int n
3e00: 49 6e 6e 65 72 3b 0a 20 20 20 20 20 20 63 6f 6e Inner;. con
3e10: 73 74 20 75 63 68 61 72 20 2a 7a 49 6e 6e 65 72 st uchar *zInner
3e20: 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 ;.. int rc
3e30: 3d 20 74 68 53 75 62 73 74 57 6f 72 64 28 69 6e = thSubstWord(in
3e40: 74 65 72 70 2c 20 26 7a 57 6f 72 64 5b 69 2b 31 terp, &zWord[i+1
3e50: 5d 2c 20 6e 57 6f 72 64 2d 69 2d 32 29 3b 0a 20 ], nWord-i-2);.
3e60: 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 48 5f if( rc!=TH_
3e70: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a OK ) return rc;.
3e80: 0a 20 20 20 20 20 20 7a 49 6e 6e 65 72 20 3d 20 . zInner =
3e90: 54 68 5f 47 65 74 52 65 73 75 6c 74 28 69 6e 74 Th_GetResult(int
3ea0: 65 72 70 2c 20 26 6e 49 6e 6e 65 72 29 3b 0a 20 erp, &nInner);.
3eb0: 20 20 20 20 20 74 68 42 75 66 66 65 72 49 6e 69 thBufferIni
3ec0: 74 28 26 76 61 72 6e 61 6d 65 29 3b 0a 20 20 20 t(&varname);.
3ed0: 20 20 20 74 68 42 75 66 66 65 72 57 72 69 74 65 thBufferWrite
3ee0: 28 69 6e 74 65 72 70 2c 20 26 76 61 72 6e 61 6d (interp, &varnam
3ef0: 65 2c 20 26 7a 57 6f 72 64 5b 31 5d 2c 20 69 29 e, &zWord[1], i)
3f00: 3b 0a 20 20 20 20 20 20 74 68 42 75 66 66 65 72 ;. thBuffer
3f10: 57 72 69 74 65 28 69 6e 74 65 72 70 2c 20 26 76 Write(interp, &v
3f20: 61 72 6e 61 6d 65 2c 20 7a 49 6e 6e 65 72 2c 20 arname, zInner,
3f30: 6e 49 6e 6e 65 72 29 3b 0a 20 20 20 20 20 20 74 nInner);. t
3f40: 68 42 75 66 66 65 72 57 72 69 74 65 28 69 6e 74 hBufferWrite(int
3f50: 65 72 70 2c 20 26 76 61 72 6e 61 6d 65 2c 20 22 erp, &varname, "
3f60: 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 )", 1);. rc
3f70: 20 3d 20 54 68 5f 47 65 74 56 61 72 28 69 6e 74 = Th_GetVar(int
3f80: 65 72 70 2c 20 76 61 72 6e 61 6d 65 2e 7a 42 75 erp, varname.zBu
3f90: 66 2c 20 76 61 72 6e 61 6d 65 2e 6e 42 75 66 29 f, varname.nBuf)
3fa0: 3b 0a 20 20 20 20 20 20 74 68 42 75 66 66 65 72 ;. thBuffer
3fb0: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 26 76 61 Free(interp, &va
3fc0: 72 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 rname);. re
3fd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 turn rc;. }.
3fe0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 68 5f 47 }. return Th_G
3ff0: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 26 7a etVar(interp, &z
4000: 57 6f 72 64 5b 31 5d 2c 20 6e 57 6f 72 64 2d 31 Word[1], nWord-1
4010: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 );.}../*.** The
4020: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 28 7a 57 input string (zW
4030: 6f 72 64 2c 20 6e 57 6f 72 64 29 20 63 6f 6e 74 ord, nWord) cont
4040: 61 69 6e 73 20 61 20 74 68 31 20 65 73 63 61 70 ains a th1 escap
4050: 65 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 50 e sequence..** P
4060: 65 72 66 6f 72 6d 20 73 75 62 73 74 69 74 75 74 erform substitut
4070: 69 6f 6e 20 6f 6e 20 74 68 65 20 69 6e 70 75 74 ion on the input
4080: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 string and stor
4090: 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 e the resulting
40a0: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 .** string in th
40b0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 e interpreter re
40c0: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 sult..*/.static
40d0: 69 6e 74 20 74 68 53 75 62 73 74 45 73 63 61 70 int thSubstEscap
40e0: 65 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a e(. Th_Interp *
40f0: 69 6e 74 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20 interp,. const
4100: 75 63 68 61 72 20 2a 7a 57 6f 72 64 2c 0a 20 20 uchar *zWord,.
4110: 69 6e 74 20 6e 57 6f 72 64 0a 29 7b 0a 20 20 75 int nWord.){. u
4120: 63 68 61 72 20 63 3b 0a 0a 20 20 61 73 73 65 72 char c;.. asser
4130: 74 28 6e 57 6f 72 64 3e 3d 32 29 3b 0a 20 20 61 t(nWord>=2);. a
4140: 73 73 65 72 74 28 7a 57 6f 72 64 5b 30 5d 3d 3d ssert(zWord[0]==
4150: 27 5c 5c 27 29 3b 0a 0a 20 20 73 77 69 74 63 68 '\\');.. switch
4160: 28 20 7a 57 6f 72 64 5b 31 5d 20 29 7b 0a 20 20 ( zWord[1] ){.
4170: 20 20 63 61 73 65 20 27 78 27 3a 20 7b 0a 20 20 case 'x': {.
4180: 20 20 20 20 61 73 73 65 72 74 28 6e 57 6f 72 64 assert(nWord
4190: 3d 3d 34 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 ==4);. c =
41a0: 28 28 74 68 48 65 78 64 69 67 69 74 28 7a 57 6f ((thHexdigit(zWo
41b0: 72 64 5b 32 5d 29 3c 3c 34 29 20 2b 20 74 68 48 rd[2])<<4) + thH
41c0: 65 78 64 69 67 69 74 28 7a 57 6f 72 64 5b 33 5d exdigit(zWord[3]
41d0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b ));. break;
41e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
41f0: 27 6e 27 3a 20 7b 0a 20 20 20 20 20 20 63 20 3d 'n': {. c =
4200: 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 62 72 65 '\n';. bre
4210: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 ak;. }. de
4220: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 fault: {. a
4230: 73 73 65 72 74 28 6e 57 6f 72 64 3d 3d 32 29 3b ssert(nWord==2);
4240: 0a 20 20 20 20 20 20 63 20 3d 20 7a 57 6f 72 64 . c = zWord
4250: 5b 31 5d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b [1];. break
4260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 ;. }. }.. T
4270: 68 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 h_SetResult(inte
4280: 72 70 2c 20 26 63 2c 20 31 29 3b 0a 20 20 72 65 rp, &c, 1);. re
4290: 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f turn TH_OK;.}../
42a0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 73 *.** The input s
42b0: 74 72 69 6e 67 20 28 7a 57 6f 72 64 2c 20 6e 57 tring (zWord, nW
42c0: 6f 72 64 29 20 63 6f 6e 74 61 69 6e 73 20 61 20 ord) contains a
42d0: 74 68 31 20 77 6f 72 64 2e 20 50 65 72 66 6f 72 th1 word. Perfor
42e0: 6d 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 69 6f m.** substitutio
42f0: 6e 20 6f 6e 20 74 68 65 20 69 6e 70 75 74 20 73 n on the input s
4300: 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 tring and store
4310: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 0a 2a the resulting .*
4320: 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 * string in the
4330: 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75 interpreter resu
4340: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e lt..*/.static in
4350: 74 20 74 68 53 75 62 73 74 57 6f 72 64 28 0a 20 t thSubstWord(.
4360: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Th_Interp *inte
4370: 72 70 2c 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 rp,. const ucha
4380: 72 20 2a 7a 57 6f 72 64 2c 0a 20 20 69 6e 74 20 r *zWord,. int
4390: 6e 57 6f 72 64 0a 29 7b 0a 20 20 69 6e 74 20 72 nWord.){. int r
43a0: 63 20 3d 20 54 48 5f 4f 4b 3b 0a 20 20 42 75 66 c = TH_OK;. Buf
43b0: 66 65 72 20 6f 75 74 70 75 74 3b 0a 20 20 69 6e fer output;. in
43c0: 74 20 69 3b 0a 0a 20 20 74 68 42 75 66 66 65 72 t i;.. thBuffer
43d0: 49 6e 69 74 28 26 6f 75 74 70 75 74 29 3b 0a 0a Init(&output);..
43e0: 20 20 69 66 28 20 6e 57 6f 72 64 3e 31 20 26 26 if( nWord>1 &&
43f0: 20 28 7a 57 6f 72 64 5b 30 5d 3d 3d 27 7b 27 20 (zWord[0]=='{'
4400: 26 26 20 7a 57 6f 72 64 5b 6e 57 6f 72 64 2d 31 && zWord[nWord-1
4410: 5d 3d 3d 27 7d 27 29 20 29 7b 0a 20 20 20 20 72 ]=='}') ){. r
4420: 63 20 3d 20 74 68 42 75 66 66 65 72 57 72 69 74 c = thBufferWrit
4430: 65 28 69 6e 74 65 72 70 2c 20 26 6f 75 74 70 75 e(interp, &outpu
4440: 74 2c 20 26 7a 57 6f 72 64 5b 31 5d 2c 20 6e 57 t, &zWord[1], nW
4450: 6f 72 64 2d 32 29 3b 0a 20 20 7d 65 6c 73 65 7b ord-2);. }else{
4460: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 .. /* If the
4470: 77 6f 72 64 20 69 73 20 73 75 72 72 6f 75 6e 64 word is surround
4480: 65 64 20 62 79 20 64 6f 75 62 6c 65 2d 71 75 6f ed by double-quo
4490: 74 65 73 20 73 74 72 69 70 20 74 68 65 73 65 20 tes strip these
44a0: 61 77 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 away. */. if(
44b0: 20 6e 57 6f 72 64 3e 31 20 26 26 20 28 7a 57 6f nWord>1 && (zWo
44c0: 72 64 5b 30 5d 3d 3d 27 22 27 20 26 26 20 7a 57 rd[0]=='"' && zW
44d0: 6f 72 64 5b 6e 57 6f 72 64 2d 31 5d 3d 3d 27 22 ord[nWord-1]=='"
44e0: 27 29 20 29 7b 0a 20 20 20 20 20 20 7a 57 6f 72 ') ){. zWor
44f0: 64 2b 2b 3b 0a 20 20 20 20 20 20 6e 57 6f 72 64 d++;. nWord
4500: 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 -= 2;. }..
4510: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 54 for(i=0; rc==T
4520: 48 5f 4f 4b 20 26 26 20 69 3c 6e 57 6f 72 64 3b H_OK && i<nWord;
4530: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 i++){. int
4540: 20 6e 47 65 74 3b 0a 0a 20 20 20 20 20 20 69 6e nGet;.. in
4550: 74 20 28 2a 78 47 65 74 29 28 54 68 5f 49 6e 74 t (*xGet)(Th_Int
4560: 65 72 70 20 2a 2c 20 63 6f 6e 73 74 20 75 63 68 erp *, const uch
4570: 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 29 ar*, int, int *)
4580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 = 0;. int
4590: 28 2a 78 53 75 62 73 74 29 28 54 68 5f 49 6e 74 (*xSubst)(Th_Int
45a0: 65 72 70 20 2a 2c 20 63 6f 6e 73 74 20 75 63 68 erp *, const uch
45b0: 61 72 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 0a ar*, int) = 0;..
45c0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 7a 57 switch( zW
45d0: 6f 72 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 ord[i] ){.
45e0: 20 20 63 61 73 65 20 27 5c 5c 27 3a 0a 20 20 20 case '\\':.
45f0: 20 20 20 20 20 20 20 78 47 65 74 20 3d 20 74 68 xGet = th
4600: 4e 65 78 74 45 73 63 61 70 65 3b 20 78 53 75 62 NextEscape; xSub
4610: 73 74 20 3d 20 74 68 53 75 62 73 74 45 73 63 61 st = thSubstEsca
4620: 70 65 3b 20 0a 20 20 20 20 20 20 20 20 20 20 62 pe; . b
4630: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 reak;. ca
4640: 73 65 20 27 5b 27 3a 0a 20 20 20 20 20 20 20 20 se '[':.
4650: 20 20 69 66 28 20 21 69 6e 74 65 72 70 2d 3e 69 if( !interp->i
4660: 73 4c 69 73 74 4d 6f 64 65 20 29 7b 0a 20 20 20 sListMode ){.
4670: 20 20 20 20 20 20 20 20 20 78 47 65 74 20 3d 20 xGet =
4680: 74 68 4e 65 78 74 43 6f 6d 6d 61 6e 64 3b 20 78 thNextCommand; x
4690: 53 75 62 73 74 20 3d 20 74 68 53 75 62 73 74 43 Subst = thSubstC
46a0: 6f 6d 6d 61 6e 64 3b 20 0a 20 20 20 20 20 20 20 ommand; .
46b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
46c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
46d0: 63 61 73 65 20 27 24 27 3a 0a 20 20 20 20 20 20 case '$':.
46e0: 20 20 20 20 69 66 28 20 21 69 6e 74 65 72 70 2d if( !interp-
46f0: 3e 69 73 4c 69 73 74 4d 6f 64 65 20 29 7b 0a 20 >isListMode ){.
4700: 20 20 20 20 20 20 20 20 20 20 20 78 47 65 74 20 xGet
4710: 3d 20 74 68 4e 65 78 74 56 61 72 6e 61 6d 65 3b = thNextVarname;
4720: 20 78 53 75 62 73 74 20 3d 20 74 68 53 75 62 73 xSubst = thSubs
4730: 74 56 61 72 6e 61 6d 65 3b 20 0a 20 20 20 20 20 tVarname; .
4740: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
4750: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
4760: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 default: {.
4770: 20 20 20 20 20 20 20 74 68 42 75 66 66 65 72 57 thBufferW
4780: 72 69 74 65 28 69 6e 74 65 72 70 2c 20 26 6f 75 rite(interp, &ou
4790: 74 70 75 74 2c 20 26 7a 57 6f 72 64 5b 69 5d 2c tput, &zWord[i],
47a0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 1);. c
47b0: 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 47 6f 20 74 ontinue; /* Go t
47c0: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 o the next itera
47d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 28 tion of the for(
47e0: 2e 2e 2e 29 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 ...) loop */.
47f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a }. }..
4800: 20 20 20 20 20 20 72 63 20 3d 20 78 47 65 74 28 rc = xGet(
4810: 69 6e 74 65 72 70 2c 20 26 7a 57 6f 72 64 5b 69 interp, &zWord[i
4820: 5d 2c 20 6e 57 6f 72 64 2d 69 2c 20 26 6e 47 65 ], nWord-i, &nGe
4830: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 t);. if( rc
4840: 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 ==TH_OK ){.
4850: 20 20 20 72 63 20 3d 20 78 53 75 62 73 74 28 69 rc = xSubst(i
4860: 6e 74 65 72 70 2c 20 26 7a 57 6f 72 64 5b 69 5d nterp, &zWord[i]
4870: 2c 20 6e 47 65 74 29 3b 0a 20 20 20 20 20 20 7d , nGet);. }
4880: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 . if( rc==T
4890: 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 H_OK ){.
48a0: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 52 65 const uchar *zRe
48b0: 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e s;. int n
48c0: 52 65 73 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 Res;. zRe
48d0: 73 20 3d 20 54 68 5f 47 65 74 52 65 73 75 6c 74 s = Th_GetResult
48e0: 28 69 6e 74 65 72 70 2c 20 26 6e 52 65 73 29 3b (interp, &nRes);
48f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 74 68 . rc = th
4900: 42 75 66 66 65 72 57 72 69 74 65 28 69 6e 74 65 BufferWrite(inte
4910: 72 70 2c 20 26 6f 75 74 70 75 74 2c 20 7a 52 65 rp, &output, zRe
4920: 73 2c 20 6e 52 65 73 29 3b 0a 20 20 20 20 20 20 s, nRes);.
4930: 20 20 69 20 2b 3d 20 28 6e 47 65 74 2d 31 29 3b i += (nGet-1);
4940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
4950: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 48 }.. if( rc==TH
4960: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 68 5f 53 65 _OK ){. Th_Se
4970: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
4980: 6f 75 74 70 75 74 2e 7a 42 75 66 2c 20 6f 75 74 output.zBuf, out
4990: 70 75 74 2e 6e 42 75 66 29 3b 0a 20 20 7d 0a 20 put.nBuf);. }.
49a0: 20 74 68 42 75 66 66 65 72 46 72 65 65 28 69 6e thBufferFree(in
49b0: 74 65 72 70 2c 20 26 6f 75 74 70 75 74 29 3b 0a terp, &output);.
49c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
49d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 /*.** Return tru
49e0: 65 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 e if one of the
49f0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 following is tru
4a00: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 e of the buffer
4a10: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 pointed.** to by
4a20: 20 7a 49 6e 70 75 74 2c 20 6c 65 6e 67 74 68 20 zInput, length
4a30: 6e 49 6e 70 75 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 nInput:.**.**
4a40: 2b 20 49 74 20 69 73 20 65 6d 70 74 79 2c 20 6f + It is empty, o
4a50: 72 0a 2a 2a 20 20 20 2b 20 49 74 20 63 6f 6e 74 r.** + It cont
4a60: 61 69 6e 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 ains nothing but
4a70: 20 77 68 69 74 65 2d 73 70 61 63 65 2c 20 6f 72 white-space, or
4a80: 0a 2a 2a 20 20 20 2b 20 49 74 20 63 6f 6e 74 61 .** + It conta
4a90: 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 77 68 69 74 65 ins no non-white
4aa0: 2d 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72 -space character
4ab0: 73 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 s before the fir
4ac0: 73 74 20 0a 2a 2a 20 20 20 20 20 6e 65 77 6c 69 st .** newli
4ad0: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a ne character..**
4ae0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 .** Otherwise re
4af0: 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 turn false..*/.s
4b00: 74 61 74 69 63 20 69 6e 74 20 74 68 45 6e 64 4f tatic int thEndO
4b10: 66 4c 69 6e 65 28 63 6f 6e 73 74 20 75 63 68 61 fLine(const ucha
4b20: 72 20 2a 7a 49 6e 70 75 74 2c 20 69 6e 74 20 6e r *zInput, int n
4b30: 49 6e 70 75 74 29 7b 0a 20 20 69 6e 74 20 69 3b Input){. int i;
4b40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 . for(i=0; i<nI
4b50: 6e 70 75 74 20 26 26 20 7a 49 6e 70 75 74 5b 69 nput && zInput[i
4b60: 5d 21 3d 27 5c 6e 27 20 26 26 20 74 68 5f 69 73 ]!='\n' && th_is
4b70: 73 70 61 63 65 28 7a 49 6e 70 75 74 5b 69 5d 29 space(zInput[i])
4b80: 3b 20 69 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e ; i++);. return
4b90: 20 28 28 69 3d 3d 6e 49 6e 70 75 74 20 7c 7c 20 ((i==nInput ||
4ba0: 7a 49 6e 70 75 74 5b 69 5d 3d 3d 27 5c 6e 27 29 zInput[i]=='\n')
4bb0: 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ?1:0);.}../*.**
4bc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 70 This function sp
4bd0: 6c 69 74 73 20 74 68 65 20 73 75 70 70 6c 69 65 lits the supplie
4be0: 64 20 74 68 31 20 6c 69 73 74 20 28 63 6f 6e 74 d th1 list (cont
4bf0: 61 69 6e 65 64 20 69 6e 20 62 75 66 66 65 72 20 ained in buffer
4c00: 7a 4c 69 73 74 2c 0a 2a 2a 20 73 69 7a 65 20 6e zList,.** size n
4c10: 4c 69 73 74 29 20 69 6e 74 6f 20 65 6c 65 6d 65 List) into eleme
4c20: 6e 74 73 20 61 6e 64 20 70 65 72 66 6f 72 6d 73 nts and performs
4c30: 20 77 6f 72 64 2d 73 75 62 73 74 69 74 75 74 69 word-substituti
4c40: 6f 6e 20 6f 6e 20 65 61 63 68 0a 2a 2a 20 65 6c on on each.** el
4c50: 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 54 68 ement. If the Th
4c60: 5f 49 6e 74 65 72 70 2e 69 73 4c 69 73 74 4d 6f _Interp.isListMo
4c70: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 de variable is t
4c80: 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a rue, then only.*
4c90: 2a 20 65 73 63 61 70 65 20 73 65 71 75 65 6e 63 * escape sequenc
4ca0: 65 73 20 61 72 65 20 73 75 62 73 74 69 74 75 74 es are substitut
4cb0: 65 64 20 28 75 73 65 64 20 62 79 20 74 68 65 20 ed (used by the
4cc0: 54 68 5f 53 70 6c 69 74 4c 69 73 74 28 29 20 66 Th_SplitList() f
4cd0: 75 6e 63 74 69 6f 6e 29 2e 0a 2a 2a 20 49 66 20 unction)..** If
4ce0: 54 68 5f 49 6e 74 65 72 70 2e 69 73 4c 69 73 74 Th_Interp.isList
4cf0: 4d 6f 64 65 20 69 73 20 66 61 6c 73 65 2c 20 74 Mode is false, t
4d00: 68 65 6e 20 76 61 72 69 61 62 6c 65 20 61 6e 64 hen variable and
4d10: 20 63 6f 6d 6d 61 6e 64 20 73 75 62 73 74 69 74 command substit
4d20: 75 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 6c 73 6f ution.** is also
4d30: 20 70 65 72 66 6f 72 6d 65 64 20 28 75 73 65 64 performed (used
4d40: 20 62 79 20 54 68 5f 45 76 61 6c 28 29 29 2e 0a by Th_Eval())..
4d50: 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 73 74 2f 6e **.** If zList/n
4d60: 4c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f List does not co
4d70: 6e 74 61 69 6e 20 61 20 76 61 6c 69 64 20 6c 69 ntain a valid li
4d80: 73 74 2c 20 54 48 5f 45 52 52 4f 52 20 69 73 20 st, TH_ERROR is
4d90: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 returned.** and
4da0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 an error message
4db0: 20 73 74 6f 72 65 64 20 69 6e 20 69 6e 74 65 72 stored in inter
4dc0: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 54 48 5f 4f p..**.** If TH_O
4dd0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e K is returned an
4de0: 64 20 70 61 7a 45 6c 65 6d 20 69 73 20 6e 6f 74 d pazElem is not
4df0: 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 NULL, the calle
4e00: 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 r should free th
4e10: 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 77 72 69 e.** pointer wri
4e20: 74 74 65 6e 20 74 6f 20 28 2a 70 61 7a 45 6c 65 tten to (*pazEle
4e30: 6d 29 20 75 73 69 6e 67 20 54 68 5f 46 72 65 65 m) using Th_Free
4e40: 28 29 2e 20 54 68 69 73 20 72 65 6c 65 61 73 65 (). This release
4e50: 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f s memory.** allo
4e60: 63 61 74 65 64 20 66 6f 72 20 62 6f 74 68 20 74 cated for both t
4e70: 68 65 20 28 2a 70 61 7a 45 6c 65 6d 29 20 61 6e he (*pazElem) an
4e80: 64 20 28 2a 70 61 6e 45 6c 65 6d 29 20 61 72 72 d (*panElem) arr
4e90: 61 79 73 2e 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a ays. Example:.**
4ea0: 0a 2a 2a 20 20 20 20 20 75 63 68 61 72 20 2a 2a .** uchar **
4eb0: 61 72 67 76 3b 0a 2a 2a 20 20 20 20 20 69 6e 74 argv;.** int
4ec0: 20 2a 61 72 67 6c 3b 0a 2a 2a 20 20 20 20 20 69 *argl;.** i
4ed0: 6e 74 20 61 72 67 63 3b 0a 2a 2a 0a 2a 2a 20 20 nt argc;.**.**
4ee0: 20 20 20 2f 2f 20 41 66 74 65 72 20 74 68 69 73 // After this
4ef0: 20 63 61 6c 6c 2c 20 61 72 67 76 20 61 6e 64 20 call, argv and
4f00: 61 72 67 6c 20 70 6f 69 6e 74 20 74 6f 20 76 61 argl point to va
4f10: 6c 69 64 20 61 72 72 61 79 73 2e 20 54 68 65 0a lid arrays. The.
4f20: 2a 2a 20 20 20 20 20 2f 2f 20 6e 75 6d 62 65 72 ** // number
4f30: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 of elements in
4f40: 65 61 63 68 20 69 73 20 61 72 67 63 2e 0a 2a 2a each is argc..**
4f50: 20 20 20 20 20 2f 2f 0a 2a 2a 20 20 20 20 20 54 //.** T
4f60: 68 5f 53 70 6c 69 74 4c 69 73 74 28 69 6e 74 65 h_SplitList(inte
4f70: 72 70 2c 20 7a 4c 69 73 74 2c 20 6e 4c 69 73 74 rp, zList, nList
4f80: 2c 20 26 61 72 67 76 2c 20 26 61 72 67 6c 2c 20 , &argv, &argl,
4f90: 26 61 72 67 63 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 &argc);.**.**
4fa0: 20 20 2f 2f 20 46 72 65 65 20 61 6c 6c 20 6d 65 // Free all me
4fb0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 mory allocated b
4fc0: 79 20 54 68 5f 53 70 6c 69 74 4c 69 73 74 28 29 y Th_SplitList()
4fd0: 2e 20 54 68 65 20 61 72 72 61 79 73 20 70 6f 69 . The arrays poi
4fe0: 6e 74 65 64 0a 2a 2a 20 20 20 20 20 2f 2f 20 74 nted.** // t
4ff0: 6f 20 62 79 20 61 72 67 76 20 61 6e 64 20 61 72 o by argv and ar
5000: 67 6c 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 gl are invalidat
5010: 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e ed by this call.
5020: 0a 2a 2a 20 20 20 20 20 2f 2f 0a 2a 2a 20 20 20 .** //.**
5030: 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 72 70 Th_Free(interp
5040: 2c 20 61 72 67 76 29 3b 0a 2a 2a 0a 2a 2f 20 0a , argv);.**.*/ .
5050: 73 74 61 74 69 63 20 69 6e 74 20 74 68 53 70 6c static int thSpl
5060: 69 74 4c 69 73 74 28 0a 20 20 54 68 5f 49 6e 74 itList(. Th_Int
5070: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 erp *interp,
5080: 20 20 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 /* Interpreter
5090: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f context */. co
50a0: 6e 73 74 20 75 63 68 61 72 20 2a 7a 4c 69 73 74 nst uchar *zList
50b0: 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 , /* Pointer
50c0: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 to buffer conta
50d0: 69 6e 69 6e 67 20 69 6e 70 75 74 20 6c 69 73 74 ining input list
50e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 2c */. int nList,
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
5100: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 Size of buffer
5110: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4c pointed to by zL
5120: 69 73 74 20 2a 2f 0a 20 20 75 63 68 61 72 20 2a ist */. uchar *
5130: 2a 2a 70 61 7a 45 6c 65 6d 2c 20 20 20 20 20 20 **pazElem,
5140: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f /* OUT: Array o
5150: 66 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 20 f list elements
5160: 2a 2f 0a 20 20 69 6e 74 20 2a 2a 70 61 6e 45 6c */. int **panEl
5170: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 em, /*
5180: 4f 55 54 3a 20 4c 65 6e 67 74 68 73 20 6f 66 20 OUT: Lengths of
5190: 65 61 63 68 20 6c 69 73 74 20 65 6c 65 6d 65 6e each list elemen
51a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f t */. int *pnCo
51b0: 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 2f unt /
51c0: 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 * OUT: Number of
51d0: 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 20 2a list elements *
51e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 /.){. int rc =
51f0: 54 48 5f 4f 4b 3b 0a 0a 20 20 42 75 66 66 65 72 TH_OK;.. Buffer
5200: 20 73 74 72 62 75 66 3b 0a 20 20 42 75 66 66 65 strbuf;. Buffe
5210: 72 20 6c 65 6e 62 75 66 3b 0a 20 20 69 6e 74 20 r lenbuf;. int
5220: 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 20 20 63 nCount = 0;.. c
5230: 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 49 6e 70 onst uchar *zInp
5240: 75 74 20 3d 20 7a 4c 69 73 74 3b 0a 20 20 69 6e ut = zList;. in
5250: 74 20 6e 49 6e 70 75 74 20 3d 20 6e 4c 69 73 74 t nInput = nList
5260: 3b 0a 0a 20 20 74 68 42 75 66 66 65 72 49 6e 69 ;.. thBufferIni
5270: 74 28 26 73 74 72 62 75 66 29 3b 0a 20 20 74 68 t(&strbuf);. th
5280: 42 75 66 66 65 72 49 6e 69 74 28 26 6c 65 6e 62 BufferInit(&lenb
5290: 75 66 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e uf);.. while( n
52a0: 49 6e 70 75 74 3e 30 20 29 7b 0a 20 20 20 20 63 Input>0 ){. c
52b0: 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 57 6f 72 onst uchar *zWor
52c0: 64 3b 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 d;. int nWord
52d0: 3b 0a 0a 20 20 20 20 74 68 4e 65 78 74 53 70 61 ;.. thNextSpa
52e0: 63 65 28 69 6e 74 65 72 70 2c 20 7a 49 6e 70 75 ce(interp, zInpu
52f0: 74 2c 20 6e 49 6e 70 75 74 2c 20 26 6e 57 6f 72 t, nInput, &nWor
5300: 64 29 3b 0a 20 20 20 20 7a 49 6e 70 75 74 20 2b d);. zInput +
5310: 3d 20 6e 57 6f 72 64 3b 0a 20 20 20 20 6e 49 6e = nWord;. nIn
5320: 70 75 74 20 3d 20 6e 4c 69 73 74 2d 28 7a 49 6e put = nList-(zIn
5330: 70 75 74 2d 7a 4c 69 73 74 29 3b 0a 0a 20 20 20 put-zList);..
5340: 20 69 66 28 20 54 48 5f 4f 4b 21 3d 28 72 63 20 if( TH_OK!=(rc
5350: 3d 20 74 68 4e 65 78 74 57 6f 72 64 28 69 6e 74 = thNextWord(int
5360: 65 72 70 2c 20 7a 49 6e 70 75 74 2c 20 6e 49 6e erp, zInput, nIn
5370: 70 75 74 2c 20 26 6e 57 6f 72 64 2c 20 30 29 29 put, &nWord, 0))
5380: 0a 20 20 20 20 20 7c 7c 20 54 48 5f 4f 4b 21 3d . || TH_OK!=
5390: 28 72 63 20 3d 20 74 68 53 75 62 73 74 57 6f 72 (rc = thSubstWor
53a0: 64 28 69 6e 74 65 72 70 2c 20 7a 49 6e 70 75 74 d(interp, zInput
53b0: 2c 20 6e 57 6f 72 64 29 29 0a 20 20 20 20 29 7b , nWord)). ){
53c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 . goto fini
53d0: 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 sh;. }. zI
53e0: 6e 70 75 74 20 3d 20 26 7a 49 6e 70 75 74 5b 6e nput = &zInput[n
53f0: 57 6f 72 64 5d 3b 0a 20 20 20 20 6e 49 6e 70 75 Word];. nInpu
5400: 74 20 3d 20 6e 4c 69 73 74 2d 28 7a 49 6e 70 75 t = nList-(zInpu
5410: 74 2d 7a 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 t-zList);. if
5420: 28 20 6e 57 6f 72 64 3e 30 20 29 7b 0a 20 20 20 ( nWord>0 ){.
5430: 20 20 20 7a 57 6f 72 64 20 3d 20 54 68 5f 47 65 zWord = Th_Ge
5440: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
5450: 26 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 74 &nWord);. t
5460: 68 42 75 66 66 65 72 57 72 69 74 65 28 69 6e 74 hBufferWrite(int
5470: 65 72 70 2c 20 26 73 74 72 62 75 66 2c 20 7a 57 erp, &strbuf, zW
5480: 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20 ord, nWord);.
5490: 20 20 20 74 68 42 75 66 66 65 72 57 72 69 74 65 thBufferWrite
54a0: 28 69 6e 74 65 72 70 2c 20 26 73 74 72 62 75 66 (interp, &strbuf
54b0: 2c 20 22 5c 30 22 2c 20 31 29 3b 0a 20 20 20 20 , "\0", 1);.
54c0: 20 20 74 68 42 75 66 66 65 72 57 72 69 74 65 28 thBufferWrite(
54d0: 69 6e 74 65 72 70 2c 20 26 6c 65 6e 62 75 66 2c interp, &lenbuf,
54e0: 20 26 6e 57 6f 72 64 2c 20 73 69 7a 65 6f 66 28 &nWord, sizeof(
54f0: 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 6e 43 6f int));. nCo
5500: 75 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d unt++;. }. }
5510: 0a 20 20 61 73 73 65 72 74 28 28 6c 65 6e 62 75 . assert((lenbu
5520: 66 2e 6e 42 75 66 2f 73 69 7a 65 6f 66 28 69 6e f.nBuf/sizeof(in
5530: 74 29 29 3d 3d 6e 43 6f 75 6e 74 29 3b 0a 0a 20 t))==nCount);..
5540: 20 61 73 73 65 72 74 28 28 70 61 7a 45 6c 65 6d assert((pazElem
5550: 20 26 26 20 70 61 6e 45 6c 65 6d 29 20 7c 7c 20 && panElem) ||
5560: 28 21 70 61 7a 45 6c 65 6d 20 26 26 20 21 70 61 (!pazElem && !pa
5570: 6e 45 6c 65 6d 29 29 3b 0a 20 20 69 66 28 20 70 nElem));. if( p
5580: 61 7a 45 6c 65 6d 20 26 26 20 72 63 3d 3d 54 48 azElem && rc==TH
5590: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 _OK ){. int i
55a0: 3b 0a 20 20 20 20 75 63 68 61 72 20 2a 7a 45 6c ;. uchar *zEl
55b0: 65 6d 3b 20 0a 20 20 20 20 69 6e 74 20 2a 61 6e em; . int *an
55c0: 45 6c 65 6d 3b 0a 20 20 20 20 75 63 68 61 72 20 Elem;. uchar
55d0: 2a 2a 61 7a 45 6c 65 6d 20 3d 20 54 68 5f 4d 61 **azElem = Th_Ma
55e0: 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 0a 20 20 20 lloc(interp,.
55f0: 20 20 20 73 69 7a 65 6f 66 28 75 63 68 61 72 2a sizeof(uchar*
5600: 29 20 2a 20 6e 43 6f 75 6e 74 20 2b 20 20 20 20 ) * nCount +
5610: 20 20 2f 2a 20 61 7a 45 6c 65 6d 20 2a 2f 0a 20 /* azElem */.
5620: 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 sizeof(int)
5630: 20 2a 20 6e 43 6f 75 6e 74 20 2b 20 20 20 20 20 * nCount +
5640: 20 20 20 20 2f 2a 20 61 6e 45 6c 65 6d 20 2a 2f /* anElem */
5650: 0a 20 20 20 20 20 20 73 74 72 62 75 66 2e 6e 42 . strbuf.nB
5660: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 uf
5670: 20 20 20 20 20 20 2f 2a 20 73 70 61 63 65 20 66 /* space f
5680: 6f 72 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 20 or list element
5690: 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20 20 20 29 strings */. )
56a0: 3b 0a 20 20 20 20 61 6e 45 6c 65 6d 20 3d 20 28 ;. anElem = (
56b0: 69 6e 74 20 2a 29 26 61 7a 45 6c 65 6d 5b 6e 43 int *)&azElem[nC
56c0: 6f 75 6e 74 5d 3b 0a 20 20 20 20 7a 45 6c 65 6d ount];. zElem
56d0: 20 3d 20 28 75 63 68 61 72 20 2a 29 26 61 6e 45 = (uchar *)&anE
56e0: 6c 65 6d 5b 6e 43 6f 75 6e 74 5d 3b 0a 20 20 20 lem[nCount];.
56f0: 20 6d 65 6d 63 70 79 28 61 6e 45 6c 65 6d 2c 20 memcpy(anElem,
5700: 6c 65 6e 62 75 66 2e 7a 42 75 66 2c 20 6c 65 6e lenbuf.zBuf, len
5710: 62 75 66 2e 6e 42 75 66 29 3b 0a 20 20 20 20 6d buf.nBuf);. m
5720: 65 6d 63 70 79 28 7a 45 6c 65 6d 2c 20 73 74 72 emcpy(zElem, str
5730: 62 75 66 2e 7a 42 75 66 2c 20 73 74 72 62 75 66 buf.zBuf, strbuf
5740: 2e 6e 42 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 .nBuf);. for(
5750: 69 3d 30 3b 20 69 3c 6e 43 6f 75 6e 74 3b 69 2b i=0; i<nCount;i+
5760: 2b 29 7b 0a 20 20 20 20 20 20 61 7a 45 6c 65 6d +){. azElem
5770: 5b 69 5d 20 3d 20 7a 45 6c 65 6d 3b 0a 20 20 20 [i] = zElem;.
5780: 20 20 20 7a 45 6c 65 6d 20 2b 3d 20 28 61 6e 45 zElem += (anE
5790: 6c 65 6d 5b 69 5d 20 2b 20 31 29 3b 0a 20 20 20 lem[i] + 1);.
57a0: 20 7d 0a 20 20 20 20 2a 70 61 7a 45 6c 65 6d 20 }. *pazElem
57b0: 3d 20 61 7a 45 6c 65 6d 3b 0a 20 20 20 20 2a 70 = azElem;. *p
57c0: 61 6e 45 6c 65 6d 20 3d 20 61 6e 45 6c 65 6d 3b anElem = anElem;
57d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 75 . }. if( pnCou
57e0: 6e 74 20 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 75 nt ){. *pnCou
57f0: 6e 74 20 3d 20 6e 43 6f 75 6e 74 3b 0a 20 20 7d nt = nCount;. }
5800: 0a 20 20 0a 20 66 69 6e 69 73 68 3a 0a 20 20 74 . . finish:. t
5810: 68 42 75 66 66 65 72 46 72 65 65 28 69 6e 74 65 hBufferFree(inte
5820: 72 70 2c 20 26 73 74 72 62 75 66 29 3b 0a 20 20 rp, &strbuf);.
5830: 74 68 42 75 66 66 65 72 46 72 65 65 28 69 6e 74 thBufferFree(int
5840: 65 72 70 2c 20 26 6c 65 6e 62 75 66 29 3b 0a 20 erp, &lenbuf);.
5850: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
5860: 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 74 68 *.** Evaluate th
5870: 65 20 74 68 31 20 73 63 72 69 70 74 20 63 6f 6e e th1 script con
5880: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 73 74 tained in the st
5890: 72 69 6e 67 20 28 7a 50 72 6f 67 72 61 6d 2c 20 ring (zProgram,
58a0: 6e 50 72 6f 67 72 61 6d 29 0a 2a 2a 20 69 6e 20 nProgram).** in
58b0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 the current stac
58c0: 6b 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 k frame..*/.stat
58d0: 69 63 20 69 6e 74 20 74 68 45 76 61 6c 4c 6f 63 ic int thEvalLoc
58e0: 61 6c 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e al(Th_Interp *in
58f0: 74 65 72 70 2c 20 63 6f 6e 73 74 20 75 63 68 61 terp, const ucha
5900: 72 20 2a 7a 50 72 6f 67 72 61 6d 2c 20 69 6e 74 r *zProgram, int
5910: 20 6e 50 72 6f 67 72 61 6d 29 7b 0a 20 20 69 6e nProgram){. in
5920: 74 20 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a 20 20 t rc = TH_OK;.
5930: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 49 6e const uchar *zIn
5940: 70 75 74 20 3d 20 7a 50 72 6f 67 72 61 6d 3b 0a put = zProgram;.
5950: 20 20 69 6e 74 20 6e 49 6e 70 75 74 20 3d 20 6e int nInput = n
5960: 50 72 6f 67 72 61 6d 3b 0a 0a 20 20 77 68 69 6c Program;.. whil
5970: 65 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 26 26 20 e( rc==TH_OK &&
5980: 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 54 68 nInput ){. Th
5990: 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e 74 _HashEntry *pEnt
59a0: 72 79 3b 0a 20 20 20 20 69 6e 74 20 6e 53 70 61 ry;. int nSpa
59b0: 63 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 63 ce;. const uc
59c0: 68 61 72 20 2a 7a 46 69 72 73 74 3b 0a 0a 20 20 har *zFirst;..
59d0: 20 20 75 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a uchar **argv;.
59e0: 20 20 20 20 69 6e 74 20 2a 61 72 67 6c 3b 0a 20 int *argl;.
59f0: 20 20 20 69 6e 74 20 61 72 67 63 3b 0a 0a 20 20 int argc;..
5a00: 20 20 61 73 73 65 72 74 28 6e 49 6e 70 75 74 3e assert(nInput>
5a10: 3d 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 =0);.. /* Ski
5a20: 70 20 61 20 73 65 6d 69 2d 63 6f 6c 6f 6e 20 2a p a semi-colon *
5a30: 2f 0a 20 20 20 20 69 66 28 20 2a 7a 49 6e 70 75 /. if( *zInpu
5a40: 74 3d 3d 27 3b 27 20 29 7b 0a 20 20 20 20 20 20 t==';' ){.
5a50: 7a 49 6e 70 75 74 2b 2b 3b 0a 20 20 20 20 20 20 zInput++;.
5a60: 6e 49 6e 70 75 74 2d 2d 3b 0a 20 20 20 20 7d 0a nInput--;. }.
5a70: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 73 . /* Skip pas
5a80: 74 20 6c 65 61 64 69 6e 67 20 77 68 69 74 65 2d t leading white-
5a90: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 74 68 space. */. th
5aa0: 4e 65 78 74 53 70 61 63 65 28 69 6e 74 65 72 70 NextSpace(interp
5ab0: 2c 20 7a 49 6e 70 75 74 2c 20 6e 49 6e 70 75 74 , zInput, nInput
5ac0: 2c 20 26 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 , &nSpace);.
5ad0: 7a 49 6e 70 75 74 20 2b 3d 20 6e 53 70 61 63 65 zInput += nSpace
5ae0: 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 2d 3d 20 ;. nInput -=
5af0: 6e 53 70 61 63 65 3b 0a 20 20 20 20 7a 46 69 72 nSpace;. zFir
5b00: 73 74 20 3d 20 7a 49 6e 70 75 74 3b 0a 0a 20 20 st = zInput;..
5b10: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 /* Check for a
5b20: 20 63 6f 6d 6d 65 6e 74 2e 20 49 66 20 66 6f 75 comment. If fou
5b30: 6e 64 2c 20 73 6b 69 70 20 74 6f 20 74 68 65 20 nd, skip to the
5b40: 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e end of the line.
5b50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 49 6e 70 */. if( zInp
5b60: 75 74 5b 30 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 ut[0]=='#' ){.
5b70: 20 20 20 20 77 68 69 6c 65 28 20 21 74 68 45 6e while( !thEn
5b80: 64 4f 66 4c 69 6e 65 28 7a 49 6e 70 75 74 2c 20 dOfLine(zInput,
5b90: 6e 49 6e 70 75 74 29 20 29 7b 0a 20 20 20 20 20 nInput) ){.
5ba0: 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a 20 20 20 zInput++;.
5bb0: 20 20 20 20 20 6e 49 6e 70 75 74 2d 2d 3b 0a 20 nInput--;.
5bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e }. con
5bd0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 tinue;. }..
5be0: 20 20 2f 2a 20 47 6f 62 62 6c 65 20 75 70 20 69 /* Gobble up i
5bf0: 6e 70 75 74 20 61 20 77 6f 72 64 20 61 74 20 61 nput a word at a
5c00: 20 74 69 6d 65 20 75 6e 74 69 6c 20 74 68 65 20 time until the
5c10: 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 end of the comma
5c20: 6e 64 0a 20 20 20 20 2a 2a 20 28 61 20 73 65 6d nd. ** (a sem
5c30: 69 2d 63 6f 6c 6f 6e 20 6f 72 20 65 6e 64 20 6f i-colon or end o
5c40: 66 20 6c 69 6e 65 29 2e 0a 20 20 20 20 2a 2f 0a f line).. */.
5c50: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 while( rc==T
5c60: 48 5f 4f 4b 20 26 26 20 2a 7a 49 6e 70 75 74 21 H_OK && *zInput!
5c70: 3d 27 3b 27 20 26 26 20 21 74 68 45 6e 64 4f 66 =';' && !thEndOf
5c80: 4c 69 6e 65 28 7a 49 6e 70 75 74 2c 20 6e 49 6e Line(zInput, nIn
5c90: 70 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e put) ){. in
5ca0: 74 20 6e 57 6f 72 64 3b 0a 20 20 20 20 20 20 74 t nWord;. t
5cb0: 68 4e 65 78 74 53 70 61 63 65 28 69 6e 74 65 72 hNextSpace(inter
5cc0: 70 2c 20 7a 49 6e 70 75 74 2c 20 6e 49 6e 70 75 p, zInput, nInpu
5cd0: 74 2c 20 26 6e 53 70 61 63 65 29 3b 0a 20 20 20 t, &nSpace);.
5ce0: 20 20 20 72 63 20 3d 20 74 68 4e 65 78 74 57 6f rc = thNextWo
5cf0: 72 64 28 69 6e 74 65 72 70 2c 20 26 7a 49 6e 70 rd(interp, &zInp
5d00: 75 74 5b 6e 53 70 61 63 65 5d 2c 20 6e 49 6e 70 ut[nSpace], nInp
5d10: 75 74 2d 6e 53 70 61 63 65 2c 20 26 6e 57 6f 72 ut-nSpace, &nWor
5d20: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a 49 6e d, 1);. zIn
5d30: 70 75 74 20 2b 3d 20 28 6e 53 70 61 63 65 2b 6e put += (nSpace+n
5d40: 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 6e 49 6e Word);. nIn
5d50: 70 75 74 20 2d 3d 20 28 6e 53 70 61 63 65 2b 6e put -= (nSpace+n
5d60: 57 6f 72 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 Word);. }.
5d70: 20 69 66 28 20 72 63 21 3d 54 48 5f 4f 4b 20 29 if( rc!=TH_OK )
5d80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 continue;..
5d90: 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 63 6f 6d /* Split the com
5da0: 6d 61 6e 64 20 69 6e 74 6f 20 61 6e 20 61 72 72 mand into an arr
5db0: 61 79 20 6f 66 20 77 6f 72 64 73 2e 20 54 68 69 ay of words. Thi
5dc0: 73 20 63 61 6c 6c 20 61 6c 73 6f 20 64 6f 65 73 s call also does
5dd0: 0a 20 20 20 20 2a 2a 20 73 75 62 73 74 69 74 75 . ** substitu
5de0: 74 69 6f 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 tion of each ind
5df0: 69 76 69 64 75 61 6c 20 77 6f 72 64 2e 0a 20 20 ividual word..
5e00: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 74 68 */. rc = th
5e10: 53 70 6c 69 74 4c 69 73 74 28 69 6e 74 65 72 70 SplitList(interp
5e20: 2c 20 7a 46 69 72 73 74 2c 20 7a 49 6e 70 75 74 , zFirst, zInput
5e30: 2d 7a 46 69 72 73 74 2c 20 26 61 72 67 76 2c 20 -zFirst, &argv,
5e40: 26 61 72 67 6c 2c 20 26 61 72 67 63 29 3b 0a 20 &argl, &argc);.
5e50: 20 20 20 69 66 28 20 72 63 21 3d 54 48 5f 4f 4b if( rc!=TH_OK
5e60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 ) continue;..
5e70: 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b 0a if( argc>0 ){.
5e80: 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 75 . /* Look u
5e90: 70 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6e 61 p the command na
5ea0: 6d 65 20 69 6e 20 74 68 65 20 63 6f 6d 6d 61 6e me in the comman
5eb0: 64 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 2a 2f d hash-table. */
5ec0: 0a 20 20 20 20 20 20 70 45 6e 74 72 79 20 3d 20 . pEntry =
5ed0: 54 68 5f 48 61 73 68 46 69 6e 64 28 69 6e 74 65 Th_HashFind(inte
5ee0: 72 70 2c 20 69 6e 74 65 72 70 2d 3e 70 61 43 6d rp, interp->paCm
5ef0: 64 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72 67 6c d, argv[0], argl
5f00: 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 [0], 0);. i
5f10: 66 28 20 21 70 45 6e 74 72 79 20 29 7b 0a 20 20 f( !pEntry ){.
5f20: 20 20 20 20 20 20 54 68 5f 45 72 72 6f 72 4d 65 Th_ErrorMe
5f30: 73 73 61 67 65 28 69 6e 74 65 72 70 2c 20 22 6e ssage(interp, "n
5f40: 6f 20 73 75 63 68 20 63 6f 6d 6d 61 6e 64 3a 20 o such command:
5f50: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72 67 6c ", argv[0], argl
5f60: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 [0]);. rc
5f70: 20 3d 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 20 = TH_ERROR;.
5f80: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 }.. /* C
5f90: 61 6c 6c 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 all the command
5fa0: 70 72 6f 63 65 64 75 72 65 2e 20 2a 2f 0a 20 20 procedure. */.
5fb0: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f if( rc==TH_O
5fc0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 68 5f K ){. Th_
5fd0: 43 6f 6d 6d 61 6e 64 20 2a 70 20 3d 20 28 54 68 Command *p = (Th
5fe0: 5f 43 6f 6d 6d 61 6e 64 20 2a 29 28 70 45 6e 74 _Command *)(pEnt
5ff0: 72 79 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 ry->pData);.
6000: 20 20 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 const uchar
6010: 2a 2a 61 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 **azArg = (const
6020: 20 75 63 68 61 72 20 2a 2a 29 61 72 67 76 3b 0a uchar **)argv;.
6030: 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e rc = p->
6040: 78 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 70 2d xProc(interp, p-
6050: 3e 70 43 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c >pContext, argc,
6060: 20 61 7a 41 72 67 2c 20 61 72 67 6c 29 3b 0a 20 azArg, argl);.
6070: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 }. .
6080: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f /* If an error o
6090: 63 63 75 72 65 64 2c 20 61 64 64 20 74 68 69 73 ccured, add this
60a0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 68 65 20 command to the
60b0: 73 74 61 63 6b 20 74 72 61 63 65 20 72 65 70 6f stack trace repo
60c0: 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 rt. */. if(
60d0: 20 72 63 3d 3d 54 48 5f 45 52 52 4f 52 20 29 7b rc==TH_ERROR ){
60e0: 0a 20 20 20 20 20 20 20 20 75 63 68 61 72 20 2a . uchar *
60f0: 7a 52 65 73 3b 0a 20 20 20 20 20 20 20 20 69 6e zRes;. in
6100: 74 20 6e 52 65 73 3b 0a 20 20 20 20 20 20 20 20 t nRes;.
6110: 75 63 68 61 72 20 2a 7a 53 74 61 63 6b 20 3d 20 uchar *zStack =
6120: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 0;. int n
6130: 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 0a 20 20 Stack = 0;. .
6140: 20 20 20 20 20 20 7a 52 65 73 20 3d 20 54 68 5f zRes = Th_
6150: 54 61 6b 65 52 65 73 75 6c 74 28 69 6e 74 65 72 TakeResult(inter
6160: 70 2c 20 26 6e 52 65 73 29 3b 0a 20 20 20 20 20 p, &nRes);.
6170: 20 20 20 69 66 28 20 54 48 5f 4f 4b 3d 3d 54 68 if( TH_OK==Th
6180: 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 _GetVar(interp,
6190: 28 75 63 68 61 72 20 2a 29 22 3a 3a 74 68 5f 73 (uchar *)"::th_s
61a0: 74 61 63 6b 5f 74 72 61 63 65 22 2c 20 2d 31 29 tack_trace", -1)
61b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 ){. zS
61c0: 74 61 63 6b 20 3d 20 54 68 5f 54 61 6b 65 52 65 tack = Th_TakeRe
61d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 26 6e 53 sult(interp, &nS
61e0: 74 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d tack);. }
61f0: 0a 20 20 20 20 20 20 20 20 54 68 5f 4c 69 73 74 . Th_List
6200: 41 70 70 65 6e 64 28 69 6e 74 65 72 70 2c 20 26 Append(interp, &
6210: 7a 53 74 61 63 6b 2c 20 26 6e 53 74 61 63 6b 2c zStack, &nStack,
6220: 20 7a 46 69 72 73 74 2c 20 7a 49 6e 70 75 74 2d zFirst, zInput-
6230: 7a 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 zFirst);.
6240: 20 54 68 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Th_SetVar(inter
6250: 70 2c 20 28 75 63 68 61 72 20 2a 29 22 3a 3a 74 p, (uchar *)"::t
6260: 68 5f 73 74 61 63 6b 5f 74 72 61 63 65 22 2c 20 h_stack_trace",
6270: 2d 31 2c 20 7a 53 74 61 63 6b 2c 20 6e 53 74 61 -1, zStack, nSta
6280: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 54 68 5f ck);. Th_
6290: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
62a0: 2c 20 7a 52 65 73 2c 20 6e 52 65 73 29 3b 0a 20 , zRes, nRes);.
62b0: 20 20 20 20 20 20 20 54 68 5f 46 72 65 65 28 69 Th_Free(i
62c0: 6e 74 65 72 70 2c 20 7a 52 65 73 29 3b 0a 20 20 nterp, zRes);.
62d0: 20 20 20 20 20 20 54 68 5f 46 72 65 65 28 69 6e Th_Free(in
62e0: 74 65 72 70 2c 20 7a 53 74 61 63 6b 29 3b 0a 20 terp, zStack);.
62f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 }. }..
6300: 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 72 70 Th_Free(interp
6310: 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 0a 20 20 , argv);. }..
6320: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
6330: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 61 6e .** Interpret an
6340: 20 69 6e 74 65 67 65 72 20 66 72 61 6d 65 20 69 integer frame i
6350: 64 65 6e 74 69 66 69 65 72 20 70 61 73 73 65 64 dentifier passed
6360: 20 74 6f 20 65 69 74 68 65 72 20 54 68 5f 45 76 to either Th_Ev
6370: 61 6c 28 29 20 6f 72 0a 2a 2a 20 54 68 5f 4c 69 al() or.** Th_Li
6380: 6e 6b 56 61 72 28 29 2e 20 49 66 20 73 75 63 63 nkVar(). If succ
6390: 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 61 essful, return a
63a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
63b0: 69 64 65 6e 74 69 66 69 65 64 0a 2a 2a 20 54 68 identified.** Th
63c0: 5f 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 _Frame structure
63d0: 2e 20 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 . If unsuccessfu
63e0: 6c 20 28 6e 6f 20 73 75 63 68 20 66 72 61 6d 65 l (no such frame
63f0: 29 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 0a ), return 0 and.
6400: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f ** leave an erro
6410: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 r message in the
6420: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 interpreter res
6430: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d ult..**.** Argum
6440: 65 6e 74 20 69 46 72 61 6d 65 20 69 73 20 69 6e ent iFrame is in
6450: 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c terpreted as fol
6460: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 lows:.**.** *
6470: 49 66 20 69 46 72 61 6d 65 20 69 73 20 30 2c 20 If iFrame is 0,
6480: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 63 this means the c
6490: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2a urrent frame..**
64a0: 0a 2a 2a 20 20 20 2a 20 49 66 20 69 46 72 61 6d .** * If iFram
64b0: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 e is negative, t
64c0: 68 65 6e 20 74 68 65 20 6e 74 68 20 66 72 61 6d hen the nth fram
64d0: 65 20 75 70 20 74 68 65 20 73 74 61 63 6b 2c 20 e up the stack,
64e0: 77 68 65 72 65 20 0a 2a 2a 20 20 20 20 20 6e 20 where .** n
64f0: 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 is the absolute
6500: 76 61 6c 75 65 20 6f 66 20 69 46 72 61 6d 65 2e value of iFrame.
6510: 20 41 20 76 61 6c 75 65 20 6f 66 20 2d 31 20 6d A value of -1 m
6520: 65 61 6e 73 20 74 68 65 20 0a 2a 2a 20 20 20 20 eans the .**
6530: 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 calling procedu
6540: 72 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 re..**.** * If
6550: 20 69 46 72 61 6d 65 20 69 73 20 2b 76 65 2c 20 iFrame is +ve,
6560: 74 68 65 6e 20 74 68 65 20 6e 74 68 20 66 72 61 then the nth fra
6570: 6d 65 20 66 72 6f 6d 20 74 68 65 20 62 6f 74 74 me from the bott
6580: 6f 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 om of the .**
6590: 20 20 73 74 61 63 6b 2e 20 41 6e 20 69 46 72 61 stack. An iFra
65a0: 6d 65 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 me value of 1 me
65b0: 61 6e 73 20 74 68 65 20 74 6f 70 6c 65 76 65 6c ans the toplevel
65c0: 20 28 67 6c 6f 62 61 6c 29 20 66 72 61 6d 65 2e (global) frame.
65d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 68 5f 46 72 .*/.static Th_Fr
65e0: 61 6d 65 20 2a 67 65 74 46 72 61 6d 65 28 54 68 ame *getFrame(Th
65f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
6600: 20 69 6e 74 20 69 46 72 61 6d 65 29 7b 0a 20 20 int iFrame){.
6610: 54 68 5f 46 72 61 6d 65 20 2a 70 20 3d 20 69 6e Th_Frame *p = in
6620: 74 65 72 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 terp->pFrame;.
6630: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72 int i;. if( iFr
6640: 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 ame>0 ){. for
6650: 28 69 3d 30 3b 20 70 3b 20 69 2b 2b 29 7b 0a 20 (i=0; p; i++){.
6660: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 43 61 6c p = p->pCal
6670: 6c 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ler;. }. i
6680: 46 72 61 6d 65 20 3d 20 28 69 2a 2d 31 29 20 2b Frame = (i*-1) +
6690: 20 69 46 72 61 6d 65 3b 0a 20 20 20 20 70 20 3d iFrame;. p =
66a0: 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d 65 3b interp->pFrame;
66b0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 . }. for(i=0;
66c0: 70 20 26 26 20 69 3c 28 69 46 72 61 6d 65 2a 2d p && i<(iFrame*-
66d0: 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 1); i++){. p
66e0: 3d 20 70 2d 3e 70 43 61 6c 6c 65 72 3b 0a 20 20 = p->pCaller;.
66f0: 7d 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 }.. if( !p ){.
6700: 20 20 20 75 63 68 61 72 20 2a 7a 46 72 61 6d 65 uchar *zFrame
6710: 3b 0a 20 20 20 20 69 6e 74 20 6e 46 72 61 6d 65 ;. int nFrame
6720: 3b 0a 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 ;. Th_SetResu
6730: 6c 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 69 46 ltInt(interp, iF
6740: 72 61 6d 65 29 3b 0a 20 20 20 20 7a 46 72 61 6d rame);. zFram
6750: 65 20 3d 20 54 68 5f 54 61 6b 65 52 65 73 75 6c e = Th_TakeResul
6760: 74 28 69 6e 74 65 72 70 2c 20 26 6e 46 72 61 6d t(interp, &nFram
6770: 65 29 3b 0a 20 20 20 20 54 68 5f 45 72 72 6f 72 e);. Th_Error
6780: 4d 65 73 73 61 67 65 28 69 6e 74 65 72 70 2c 20 Message(interp,
6790: 22 6e 6f 20 73 75 63 68 20 66 72 61 6d 65 3a 22 "no such frame:"
67a0: 2c 20 7a 46 72 61 6d 65 2c 20 6e 46 72 61 6d 65 , zFrame, nFrame
67b0: 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69 );. Th_Free(i
67c0: 6e 74 65 72 70 2c 20 7a 46 72 61 6d 65 29 3b 0a nterp, zFrame);.
67d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a }. return p;.
67e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 }.../*.** Evalua
67f0: 74 65 20 74 68 31 20 73 63 72 69 70 74 20 28 7a te th1 script (z
6800: 50 72 6f 67 72 61 6d 2c 20 6e 50 72 6f 67 72 61 Program, nProgra
6810: 6d 29 20 69 6e 20 74 68 65 20 66 72 61 6d 65 20 m) in the frame
6820: 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a identified by.**
6830: 20 61 72 67 75 6d 65 6e 74 20 69 46 72 61 6d 65 argument iFrame
6840: 2e 20 4c 65 61 76 65 20 65 69 74 68 65 72 20 61 . Leave either a
6850: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 n error message
6860: 6f 72 20 61 20 72 65 73 75 6c 74 20 69 6e 20 74 or a result in t
6870: 68 65 0a 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 he.** interprete
6880: 72 20 72 65 73 75 6c 74 20 61 6e 64 20 72 65 74 r result and ret
6890: 75 72 6e 20 61 20 74 68 31 20 65 72 72 6f 72 20 urn a th1 error
68a0: 63 6f 64 65 20 28 54 48 5f 4f 4b 2c 20 54 48 5f code (TH_OK, TH_
68b0: 45 52 52 4f 52 2c 20 0a 2a 2a 20 54 48 5f 52 45 ERROR, .** TH_RE
68c0: 54 55 52 4e 2c 20 54 48 5f 43 4f 4e 54 49 4e 55 TURN, TH_CONTINU
68d0: 45 20 6f 72 20 54 48 5f 42 52 45 41 4b 29 2e 0a E or TH_BREAK)..
68e0: 2a 2f 0a 69 6e 74 20 54 68 5f 45 76 61 6c 28 54 */.int Th_Eval(T
68f0: 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 h_Interp *interp
6900: 2c 20 69 6e 74 20 69 46 72 61 6d 65 2c 20 63 6f , int iFrame, co
6910: 6e 73 74 20 75 63 68 61 72 20 2a 7a 50 72 6f 67 nst uchar *zProg
6920: 72 61 6d 2c 20 69 6e 74 20 6e 50 72 6f 67 72 61 ram, int nProgra
6930: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 m){. int rc = T
6940: 48 5f 4f 4b 3b 0a 20 20 54 68 5f 46 72 61 6d 65 H_OK;. Th_Frame
6950: 20 2a 70 53 61 76 65 64 46 72 61 6d 65 20 3d 20 *pSavedFrame =
6960: 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d 65 3b 0a interp->pFrame;.
6970: 0a 20 20 2f 2a 20 53 65 74 20 54 68 5f 49 6e 74 . /* Set Th_Int
6980: 65 72 70 2e 70 46 72 61 6d 65 20 74 6f 20 74 68 erp.pFrame to th
6990: 65 20 66 72 61 6d 65 20 74 68 61 74 20 74 68 69 e frame that thi
69a0: 73 20 73 63 72 69 70 74 20 69 73 20 74 6f 20 62 s script is to b
69b0: 65 20 0a 20 20 2a 2a 20 65 76 61 6c 75 61 74 65 e . ** evaluate
69c0: 64 20 69 6e 2e 20 54 68 65 20 63 75 72 72 65 6e d in. The curren
69d0: 74 20 66 72 61 6d 65 20 69 73 20 73 61 76 65 64 t frame is saved
69e0: 20 69 6e 20 70 53 61 76 65 64 46 72 61 6d 65 20 in pSavedFrame
69f0: 61 6e 64 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 and will. ** be
6a00: 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 restored before
6a10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 this function r
6a20: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 eturns.. */. i
6a30: 6e 74 65 72 70 2d 3e 70 46 72 61 6d 65 20 3d 20 nterp->pFrame =
6a40: 67 65 74 46 72 61 6d 65 28 69 6e 74 65 72 70 2c getFrame(interp,
6a50: 20 69 46 72 61 6d 65 29 3b 0a 0a 20 20 69 66 28 iFrame);.. if(
6a60: 20 21 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d 65 !interp->pFrame
6a70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 54 48 5f ){. rc = TH_
6a80: 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a ERROR;. }else{.
6a90: 20 20 20 20 69 6e 74 20 6e 49 6e 70 75 74 20 3d int nInput =
6aa0: 20 6e 50 72 6f 67 72 61 6d 3b 0a 20 20 0a 20 20 nProgram;. .
6ab0: 20 20 69 66 28 20 6e 49 6e 70 75 74 3c 30 20 29 if( nInput<0 )
6ac0: 7b 0a 20 20 20 20 20 20 6e 49 6e 70 75 74 20 3d {. nInput =
6ad0: 20 74 68 5f 73 74 72 6c 65 6e 28 7a 50 72 6f 67 th_strlen(zProg
6ae0: 72 61 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ram);. }.
6af0: 72 63 20 3d 20 74 68 45 76 61 6c 4c 6f 63 61 6c rc = thEvalLocal
6b00: 28 69 6e 74 65 72 70 2c 20 7a 50 72 6f 67 72 61 (interp, zProgra
6b10: 6d 2c 20 6e 49 6e 70 75 74 29 3b 0a 20 20 7d 0a m, nInput);. }.
6b20: 0a 20 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d . interp->pFram
6b30: 65 20 3d 20 70 53 61 76 65 64 46 72 61 6d 65 3b e = pSavedFrame;
6b40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
6b50: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 73 74 72 ./*.** Input str
6b60: 69 6e 67 20 28 7a 56 61 72 6e 61 6d 65 2c 20 6e ing (zVarname, n
6b70: 56 61 72 6e 61 6d 65 29 20 63 6f 6e 74 61 69 6e Varname) contain
6b80: 73 20 61 20 74 68 31 20 76 61 72 69 61 62 6c 65 s a th1 variable
6b90: 20 6e 61 6d 65 2e 20 49 74 0a 2a 2a 20 6d 61 79 name. It.** may
6ba0: 20 62 65 20 61 20 73 69 6d 70 6c 65 20 73 63 61 be a simple sca
6bb0: 6c 61 72 20 76 61 72 69 61 62 6c 65 20 6e 61 6d lar variable nam
6bc0: 65 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 61 e or it may be a
6bd0: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f reference.** to
6be0: 20 61 6e 20 61 72 72 61 79 20 6d 65 6d 62 65 72 an array member
6bf0: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 6e . The variable n
6c00: 61 6d 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e ame may or may n
6c10: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 0a 2a 2a ot begin with.**
6c20: 20 22 3a 3a 22 2c 20 69 6e 64 69 63 61 74 69 6e "::", indicatin
6c30: 67 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 20 g that the name
6c40: 72 65 66 65 72 73 20 74 6f 20 61 20 67 6c 6f 62 refers to a glob
6c50: 61 6c 20 76 61 72 69 61 62 6c 65 2c 20 6e 6f 74 al variable, not
6c60: 0a 2a 2a 20 61 20 6c 6f 63 61 6c 20 73 63 6f 70 .** a local scop
6c70: 65 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 e one..**.** Thi
6c80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 70 65 s function inspe
6c90: 63 74 73 20 61 6e 64 20 63 61 74 65 67 6f 72 69 cts and categori
6ca0: 7a 65 73 20 74 68 65 20 73 75 70 70 6c 69 65 64 zes the supplied
6cb0: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0a variable name..
6cc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d **.** If the nam
6cd0: 65 20 69 73 20 61 20 67 6c 6f 62 61 6c 20 72 65 e is a global re
6ce0: 66 65 72 65 6e 63 65 2c 20 2a 70 69 73 47 6c 6f ference, *pisGlo
6cf0: 62 61 6c 20 69 73 20 73 65 74 20 74 6f 20 74 72 bal is set to tr
6d00: 75 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a ue. Otherwise.**
6d10: 20 66 61 6c 73 65 2e 20 4f 75 74 70 75 74 20 73 false. Output s
6d20: 74 72 69 6e 67 20 28 2a 70 7a 4f 75 74 65 72 2c tring (*pzOuter,
6d30: 20 2a 70 6e 4f 75 74 65 72 29 20 69 73 20 73 65 *pnOuter) is se
6d40: 74 20 74 6f 20 74 68 65 20 76 61 72 69 61 62 6c t to the variabl
6d50: 65 20 6e 61 6d 65 0a 2a 2a 20 69 66 20 69 74 20 e name.** if it
6d60: 69 73 20 61 20 73 63 61 6c 61 72 20 72 65 66 65 is a scalar refe
6d70: 72 65 6e 63 65 2c 20 6f 72 20 74 68 65 20 6e 61 rence, or the na
6d80: 6d 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 me of the array
6d90: 69 66 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20 61 if it is an.** a
6da0: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2e 20 49 rray variable. I
6db0: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 f the variable i
6dc0: 73 20 61 20 73 63 61 6c 61 72 2c 20 2a 70 7a 49 s a scalar, *pzI
6dd0: 6e 6e 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 nner is set to 0
6de0: 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 61 6e ..** If it is an
6df0: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c array variable,
6e00: 20 28 2a 70 7a 49 6e 6e 65 72 2c 20 2a 70 6e 49 (*pzInner, *pnI
6e10: 6e 6e 65 72 29 20 69 73 20 73 65 74 20 74 6f 20 nner) is set to
6e20: 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6b 65 79 the.** array key
6e30: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 name..*/.static
6e40: 20 69 6e 74 20 74 68 41 6e 61 6c 79 73 65 56 61 int thAnalyseVa
6e50: 72 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 75 rname(. const u
6e60: 63 68 61 72 20 2a 7a 56 61 72 6e 61 6d 65 2c 0a char *zVarname,.
6e70: 20 20 69 6e 74 20 6e 56 61 72 6e 61 6d 65 2c 0a int nVarname,.
6e80: 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 2a const uchar **
6e90: 70 7a 4f 75 74 65 72 2c 20 20 20 20 20 2f 2a 20 pzOuter, /*
6ea0: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 OUT: Pointer to
6eb0: 73 63 61 6c 61 72 2f 61 72 72 61 79 20 6e 61 6d scalar/array nam
6ec0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 e */. int *pnOu
6ed0: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 ter,
6ee0: 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 /* OUT: Number
6ef0: 20 6f 66 20 62 79 74 65 73 20 61 74 20 2a 70 7a of bytes at *pz
6f00: 4f 75 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 Outer */. const
6f10: 20 75 63 68 61 72 20 2a 2a 70 7a 49 6e 6e 65 72 uchar **pzInner
6f20: 2c 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f , /* OUT: Po
6f30: 69 6e 74 65 72 20 74 6f 20 61 72 72 61 79 20 6b inter to array k
6f40: 65 79 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a ey (or null) */.
6f50: 20 20 69 6e 74 20 2a 70 6e 49 6e 6e 65 72 2c 20 int *pnInner,
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
6f70: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 OUT: Number of b
6f80: 79 74 65 73 20 61 74 20 2a 70 7a 49 6e 6e 65 72 ytes at *pzInner
6f90: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 47 6c */. int *pisGl
6fa0: 6f 62 61 6c 20 20 20 20 20 20 20 20 20 20 20 20 obal
6fb0: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 /* OUT: Set to
6fc0: 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 true if this is
6fd0: 61 20 67 6c 6f 62 61 6c 20 72 65 66 20 2a 2f 0a a global ref */.
6fe0: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72 ){. const uchar
6ff0: 20 2a 7a 4f 75 74 65 72 20 3d 20 7a 56 61 72 6e *zOuter = zVarn
7000: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 65 ame;. int nOute
7010: 72 3b 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72 r;. const uchar
7020: 20 2a 7a 49 6e 6e 65 72 20 3d 20 30 3b 0a 20 20 *zInner = 0;.
7030: 69 6e 74 20 6e 49 6e 6e 65 72 20 3d 20 30 3b 0a int nInner = 0;.
7040: 20 20 69 6e 74 20 69 73 47 6c 6f 62 61 6c 20 3d int isGlobal =
7050: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 0;. int i;..
7060: 69 66 28 20 6e 56 61 72 6e 61 6d 65 3c 30 20 29 if( nVarname<0 )
7070: 7b 0a 20 20 20 20 6e 56 61 72 6e 61 6d 65 20 3d {. nVarname =
7080: 20 74 68 5f 73 74 72 6c 65 6e 28 7a 56 61 72 6e th_strlen(zVarn
7090: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74 ame);. }. nOut
70a0: 65 72 20 3d 20 6e 56 61 72 6e 61 6d 65 3b 0a 0a er = nVarname;..
70b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 76 61 72 69 /* If the vari
70c0: 61 62 6c 65 20 6e 61 6d 65 20 73 74 61 72 74 73 able name starts
70d0: 20 77 69 74 68 20 22 3a 3a 22 2c 20 74 68 65 6e with "::", then
70e0: 20 64 6f 20 74 68 65 20 6c 6f 6f 6b 75 70 20 69 do the lookup i
70f0: 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70 s in the. ** up
7100: 70 65 72 6d 6f 73 74 20 28 67 6c 6f 62 61 6c 29 permost (global)
7110: 20 66 72 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 frame.. */. i
7120: 66 28 20 6e 56 61 72 6e 61 6d 65 3e 32 20 26 26 f( nVarname>2 &&
7130: 20 7a 56 61 72 6e 61 6d 65 5b 30 5d 3d 3d 27 3a zVarname[0]==':
7140: 27 20 26 26 20 7a 56 61 72 6e 61 6d 65 5b 31 5d ' && zVarname[1]
7150: 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 4f 75 ==':' ){. zOu
7160: 74 65 72 20 2b 3d 20 32 3b 0a 20 20 20 20 6e 4f ter += 2;. nO
7170: 75 74 65 72 20 2d 3d 20 32 3b 0a 20 20 20 20 69 uter -= 2;. i
7180: 73 47 6c 6f 62 61 6c 20 3d 20 31 3b 0a 20 20 7d sGlobal = 1;. }
7190: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 .. /* Check if
71a0: 74 68 69 73 20 69 73 20 61 6e 20 61 72 72 61 79 this is an array
71b0: 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 reference. */.
71c0: 20 69 66 28 20 7a 4f 75 74 65 72 5b 6e 4f 75 74 if( zOuter[nOut
71d0: 65 72 2d 31 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 er-1]==')' ){.
71e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 75 for(i=0; i<nOu
71f0: 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 ter; i++){.
7200: 20 69 66 28 20 7a 4f 75 74 65 72 5b 69 5d 3d 3d if( zOuter[i]==
7210: 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a '(' ){. z
7220: 49 6e 6e 65 72 20 3d 20 26 7a 4f 75 74 65 72 5b Inner = &zOuter[
7230: 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6e 49 i+1];. nI
7240: 6e 6e 65 72 20 3d 20 6e 4f 75 74 65 72 2d 69 2d nner = nOuter-i-
7250: 32 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 65 2;. nOute
7260: 72 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 62 r = i;. b
7270: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
7280: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 7a 4f 75 }. }.. *pzOu
7290: 74 65 72 20 3d 20 7a 4f 75 74 65 72 3b 0a 20 20 ter = zOuter;.
72a0: 2a 70 6e 4f 75 74 65 72 20 3d 20 6e 4f 75 74 65 *pnOuter = nOute
72b0: 72 3b 0a 20 20 2a 70 7a 49 6e 6e 65 72 20 3d 20 r;. *pzInner =
72c0: 7a 49 6e 6e 65 72 3b 0a 20 20 2a 70 6e 49 6e 6e zInner;. *pnInn
72d0: 65 72 20 3d 20 6e 49 6e 6e 65 72 3b 0a 20 20 2a er = nInner;. *
72e0: 70 69 73 47 6c 6f 62 61 6c 20 3d 20 69 73 47 6c pisGlobal = isGl
72f0: 6f 62 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 54 obal;. return T
7300: 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 H_OK;.}../*.** I
7310: 6e 70 75 74 20 73 74 72 69 6e 67 20 28 7a 56 61 nput string (zVa
7320: 72 2c 20 6e 56 61 72 29 20 63 6f 6e 74 61 69 6e r, nVar) contain
7330: 73 20 61 20 76 61 72 69 61 62 6c 65 20 6e 61 6d s a variable nam
7340: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e e. This function
7350: 20 6c 6f 63 61 74 65 73 0a 2a 2a 20 74 68 65 20 locates.** the
7360: 54 68 5f 56 61 72 69 61 62 6c 65 20 73 74 72 75 Th_Variable stru
7370: 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 cture associated
7380: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 with the named
7390: 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 0a 2a variable. The .*
73a0: 2a 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 * variable name
73b0: 6d 61 79 20 62 65 20 61 20 67 6c 6f 62 61 6c 20 may be a global
73c0: 6f 72 20 6c 6f 63 61 6c 20 73 63 61 6c 61 72 20 or local scalar
73d0: 6f 72 20 61 72 72 61 79 20 76 61 72 69 61 62 6c or array variabl
73e0: 65 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 e.**.** If the c
73f0: 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 reate argument i
7400: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 s non-zero and t
7410: 68 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c he named variabl
7420: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 e does not exist
7430: 0a 2a 2a 20 69 74 20 69 73 20 63 72 65 61 74 65 .** it is create
7440: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e d. Otherwise, an
7450: 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69 error is left i
7460: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 n the interprete
7470: 72 20 72 65 73 75 6c 74 0a 2a 2a 20 61 6e 64 20 r result.** and
7480: 4e 55 4c 4c 20 72 65 74 75 72 6e 65 64 2e 0a 2a NULL returned..*
7490: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 72 61 *.** If the arra
74a0: 79 6f 6b 20 61 72 67 75 6d 65 6e 74 20 69 73 20 yok argument is
74b0: 66 61 6c 73 65 20 61 6e 64 20 74 68 65 20 6e 61 false and the na
74c0: 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69 73 20 med variable is
74d0: 61 6e 20 61 72 72 61 79 2c 0a 2a 2a 20 61 6e 20 an array,.** an
74e0: 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69 6e error is left in
74f0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
7500: 20 72 65 73 75 6c 74 20 61 6e 64 20 4e 55 4c 4c result and NULL
7510: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a returned. If.**
7520: 20 61 72 72 61 79 6f 6b 20 69 73 20 74 72 75 65 arrayok is true
7530: 20 61 6e 20 61 72 72 61 79 20 6e 61 6d 65 20 69 an array name i
7540: 73 20 4f 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 s Ok..*/.static
7550: 54 68 5f 56 61 72 69 61 62 6c 65 20 2a 74 68 46 Th_Variable *thF
7560: 69 6e 64 56 61 6c 75 65 28 0a 20 20 54 68 5f 49 indValue(. Th_I
7570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
7580: 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 56 const uchar *zV
7590: 61 72 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 ar, /* Point
75a0: 65 72 20 74 6f 20 76 61 72 69 61 62 6c 65 20 6e er to variable n
75b0: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 ame */. int nVa
75c0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r,
75d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* Number of byt
75e0: 65 73 20 61 74 20 6e 56 61 72 20 2a 2f 0a 20 20 es at nVar */.
75f0: 69 6e 74 20 63 72 65 61 74 65 2c 20 20 20 20 20 int create,
7600: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 /* If tru
7610: 65 2c 20 63 72 65 61 74 65 20 74 68 65 20 76 61 e, create the va
7620: 72 69 61 62 6c 65 20 69 66 20 6e 6f 74 20 66 6f riable if not fo
7630: 75 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 und */. int arr
7640: 61 79 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 ayok
7650: 2f 2a 20 49 66 20 74 72 75 65 2c 20 61 6e 20 61 /* If true, an a
7660: 72 72 61 79 20 69 73 20 4f 6b 2e 20 4f 74 68 65 rray is Ok. Othe
7670: 77 69 73 65 20 61 72 72 61 79 3d 3d 65 72 72 6f wise array==erro
7680: 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 r */.){. const
7690: 75 63 68 61 72 20 2a 7a 4f 75 74 65 72 3b 0a 20 uchar *zOuter;.
76a0: 20 69 6e 74 20 6e 4f 75 74 65 72 3b 0a 20 20 63 int nOuter;. c
76b0: 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 49 6e 6e onst uchar *zInn
76c0: 65 72 3b 0a 20 20 69 6e 74 20 6e 49 6e 6e 65 72 er;. int nInner
76d0: 3b 0a 20 20 69 6e 74 20 69 73 47 6c 6f 62 61 6c ;. int isGlobal
76e0: 3b 0a 0a 20 20 54 68 5f 48 61 73 68 45 6e 74 72 ;.. Th_HashEntr
76f0: 79 20 2a 70 45 6e 74 72 79 3b 0a 20 20 54 68 5f y *pEntry;. Th_
7700: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 Frame *pFrame =
7710: 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d 65 3b 0a interp->pFrame;.
7720: 20 20 54 68 5f 56 61 72 69 61 62 6c 65 20 2a 70 Th_Variable *p
7730: 56 61 6c 75 65 3b 0a 0a 20 20 74 68 41 6e 61 6c Value;.. thAnal
7740: 79 73 65 56 61 72 6e 61 6d 65 28 7a 56 61 72 2c yseVarname(zVar,
7750: 20 6e 56 61 72 2c 20 26 7a 4f 75 74 65 72 2c 20 nVar, &zOuter,
7760: 26 6e 4f 75 74 65 72 2c 20 26 7a 49 6e 6e 65 72 &nOuter, &zInner
7770: 2c 20 26 6e 49 6e 6e 65 72 2c 20 26 69 73 47 6c , &nInner, &isGl
7780: 6f 62 61 6c 29 3b 0a 20 20 69 66 28 20 69 73 47 obal);. if( isG
7790: 6c 6f 62 61 6c 20 29 7b 0a 20 20 20 20 77 68 69 lobal ){. whi
77a0: 6c 65 28 20 70 46 72 61 6d 65 2d 3e 70 43 61 6c le( pFrame->pCal
77b0: 6c 65 72 20 29 20 70 46 72 61 6d 65 20 3d 20 70 ler ) pFrame = p
77c0: 46 72 61 6d 65 2d 3e 70 43 61 6c 6c 65 72 3b 0a Frame->pCaller;.
77d0: 20 20 7d 0a 0a 20 20 70 45 6e 74 72 79 20 3d 20 }.. pEntry =
77e0: 54 68 5f 48 61 73 68 46 69 6e 64 28 69 6e 74 65 Th_HashFind(inte
77f0: 72 70 2c 20 70 46 72 61 6d 65 2d 3e 70 61 56 61 rp, pFrame->paVa
7800: 72 2c 20 7a 4f 75 74 65 72 2c 20 6e 4f 75 74 65 r, zOuter, nOute
7810: 72 2c 20 63 72 65 61 74 65 29 3b 0a 20 20 61 73 r, create);. as
7820: 73 65 72 74 28 70 45 6e 74 72 79 20 7c 7c 20 21 sert(pEntry || !
7830: 63 72 65 61 74 65 29 3b 0a 20 20 69 66 28 20 21 create);. if( !
7840: 70 45 6e 74 72 79 20 29 7b 0a 20 20 20 20 67 6f pEntry ){. go
7850: 74 6f 20 6e 6f 5f 73 75 63 68 5f 76 61 72 3b 0a to no_such_var;.
7860: 20 20 7d 0a 0a 20 20 70 56 61 6c 75 65 20 3d 20 }.. pValue =
7870: 28 54 68 5f 56 61 72 69 61 62 6c 65 20 2a 29 70 (Th_Variable *)p
7880: 45 6e 74 72 79 2d 3e 70 44 61 74 61 3b 0a 20 20 Entry->pData;.
7890: 69 66 28 20 21 70 56 61 6c 75 65 20 29 7b 0a 20 if( !pValue ){.
78a0: 20 20 20 61 73 73 65 72 74 28 63 72 65 61 74 65 assert(create
78b0: 29 3b 0a 20 20 20 20 70 56 61 6c 75 65 20 3d 20 );. pValue =
78c0: 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 72 70 Th_Malloc(interp
78d0: 2c 20 73 69 7a 65 6f 66 28 54 68 5f 56 61 72 69 , sizeof(Th_Vari
78e0: 61 62 6c 65 29 29 3b 0a 20 20 20 20 70 56 61 6c able));. pVal
78f0: 75 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 ue->nRef = 1;.
7900: 20 20 70 45 6e 74 72 79 2d 3e 70 44 61 74 61 20 pEntry->pData
7910: 3d 20 28 76 6f 69 64 20 2a 29 70 56 61 6c 75 65 = (void *)pValue
7920: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 49 6e ;. }.. if( zIn
7930: 6e 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 ner ){. if( p
7940: 56 61 6c 75 65 2d 3e 7a 44 61 74 61 20 29 7b 0a Value->zData ){.
7950: 20 20 20 20 20 20 54 68 5f 45 72 72 6f 72 4d 65 Th_ErrorMe
7960: 73 73 61 67 65 28 69 6e 74 65 72 70 2c 20 22 76 ssage(interp, "v
7970: 61 72 69 61 62 6c 65 20 69 73 20 61 20 73 63 61 ariable is a sca
7980: 6c 61 72 3a 22 2c 20 7a 4f 75 74 65 72 2c 20 6e lar:", zOuter, n
7990: 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 Outer);. re
79a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 turn 0;. }.
79b0: 20 20 69 66 28 20 21 70 56 61 6c 75 65 2d 3e 70 if( !pValue->p
79c0: 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 69 66 Hash ){. if
79d0: 28 20 21 63 72 65 61 74 65 20 29 7b 0a 20 20 20 ( !create ){.
79e0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 73 75 63 goto no_suc
79f0: 68 5f 76 61 72 3b 0a 20 20 20 20 20 20 7d 0a 20 h_var;. }.
7a00: 20 20 20 20 20 70 56 61 6c 75 65 2d 3e 70 48 61 pValue->pHa
7a10: 73 68 20 3d 20 54 68 5f 48 61 73 68 4e 65 77 28 sh = Th_HashNew(
7a20: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 interp);. }.
7a30: 20 20 20 70 45 6e 74 72 79 20 3d 20 54 68 5f 48 pEntry = Th_H
7a40: 61 73 68 46 69 6e 64 28 69 6e 74 65 72 70 2c 20 ashFind(interp,
7a50: 70 56 61 6c 75 65 2d 3e 70 48 61 73 68 2c 20 7a pValue->pHash, z
7a60: 49 6e 6e 65 72 2c 20 6e 49 6e 6e 65 72 2c 20 63 Inner, nInner, c
7a70: 72 65 61 74 65 29 3b 0a 20 20 20 20 69 66 28 20 reate);. if(
7a80: 21 70 45 6e 74 72 79 20 29 7b 0a 20 20 20 20 20 !pEntry ){.
7a90: 20 67 6f 74 6f 20 6e 6f 5f 73 75 63 68 5f 76 61 goto no_such_va
7aa0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 56 61 r;. }. pVa
7ab0: 6c 75 65 20 3d 20 28 54 68 5f 56 61 72 69 61 62 lue = (Th_Variab
7ac0: 6c 65 20 2a 29 70 45 6e 74 72 79 2d 3e 70 44 61 le *)pEntry->pDa
7ad0: 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 56 61 ta;. if( !pVa
7ae0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 lue ){. ass
7af0: 65 72 74 28 63 72 65 61 74 65 29 3b 0a 20 20 20 ert(create);.
7b00: 20 20 20 70 56 61 6c 75 65 20 3d 20 54 68 5f 4d pValue = Th_M
7b10: 61 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20 73 69 alloc(interp, si
7b20: 7a 65 6f 66 28 54 68 5f 56 61 72 69 61 62 6c 65 zeof(Th_Variable
7b30: 29 29 3b 0a 20 20 20 20 20 20 70 56 61 6c 75 65 ));. pValue
7b40: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 ->nRef = 1;.
7b50: 20 20 70 45 6e 74 72 79 2d 3e 70 44 61 74 61 20 pEntry->pData
7b60: 3d 20 28 76 6f 69 64 20 2a 29 70 56 61 6c 75 65 = (void *)pValue
7b70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b ;. }. }else{
7b80: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 75 65 2d . if( pValue-
7b90: 3e 70 48 61 73 68 20 26 26 20 21 61 72 72 61 79 >pHash && !array
7ba0: 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54 68 5f 45 ok ){. Th_E
7bb0: 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 rrorMessage(inte
7bc0: 72 70 2c 20 22 76 61 72 69 61 62 6c 65 20 69 73 rp, "variable is
7bd0: 20 61 6e 20 61 72 72 61 79 3a 22 2c 20 7a 4f 75 an array:", zOu
7be0: 74 65 72 2c 20 6e 4f 75 74 65 72 29 3b 0a 20 20 ter, nOuter);.
7bf0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
7c00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 }. }.. retur
7c10: 6e 20 70 56 61 6c 75 65 3b 0a 0a 6e 6f 5f 73 75 n pValue;..no_su
7c20: 63 68 5f 76 61 72 3a 0a 20 20 54 68 5f 45 72 72 ch_var:. Th_Err
7c30: 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 72 70 orMessage(interp
7c40: 2c 20 22 6e 6f 20 73 75 63 68 20 76 61 72 69 61 , "no such varia
7c50: 62 6c 65 3a 22 2c 20 7a 56 61 72 2c 20 6e 56 61 ble:", zVar, nVa
7c60: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a r);. return 0;.
7c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 69 6e 67 20 }../*.** String
7c80: 28 7a 56 61 72 2c 20 6e 56 61 72 29 20 6d 75 73 (zVar, nVar) mus
7c90: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 t contain the na
7ca0: 6d 65 20 6f 66 20 61 20 73 63 61 6c 61 72 20 76 me of a scalar v
7cb0: 61 72 69 61 62 6c 65 20 6f 72 20 0a 2a 2a 20 61 ariable or .** a
7cc0: 72 72 61 79 20 6d 65 6d 62 65 72 2e 20 4c 6f 6f rray member. Loo
7cd0: 6b 20 75 70 20 74 68 65 20 76 61 72 69 61 62 6c k up the variabl
7ce0: 65 2c 20 73 74 6f 72 65 20 69 74 73 20 63 75 72 e, store its cur
7cf0: 72 65 6e 74 20 76 61 6c 75 65 20 69 6e 20 0a 2a rent value in .*
7d00: 2a 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 * the interprete
7d10: 72 20 72 65 73 75 6c 74 20 61 6e 64 20 72 65 74 r result and ret
7d20: 75 72 6e 20 54 48 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a urn TH_OK..**.**
7d30: 20 49 66 20 74 68 65 20 6e 61 6d 65 64 20 76 61 If the named va
7d40: 72 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 riable does not
7d50: 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20 54 48 exist, return TH
7d60: 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 _ERROR and leave
7d70: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 .** an error mes
7d80: 73 61 67 65 20 69 6e 20 74 68 65 20 69 6e 74 65 sage in the inte
7d90: 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e 0a rpreter result..
7da0: 2a 2f 0a 69 6e 74 20 54 68 5f 47 65 74 56 61 72 */.int Th_GetVar
7db0: 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 (Th_Interp *inte
7dc0: 72 70 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 20 rp, const uchar
7dd0: 2a 7a 56 61 72 2c 20 69 6e 74 20 6e 56 61 72 29 *zVar, int nVar)
7de0: 7b 0a 20 20 54 68 5f 56 61 72 69 61 62 6c 65 20 {. Th_Variable
7df0: 2a 70 56 61 6c 75 65 3b 0a 0a 20 20 70 56 61 6c *pValue;.. pVal
7e00: 75 65 20 3d 20 74 68 46 69 6e 64 56 61 6c 75 65 ue = thFindValue
7e10: 28 69 6e 74 65 72 70 2c 20 7a 56 61 72 2c 20 6e (interp, zVar, n
7e20: 56 61 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 Var, 0, 0);. if
7e30: 28 20 21 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 ( !pValue ){.
7e40: 20 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 return TH_ERROR
7e50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 56 61 ;. }. if( !pVa
7e60: 6c 75 65 2d 3e 7a 44 61 74 61 20 29 7b 0a 20 20 lue->zData ){.
7e70: 20 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67 Th_ErrorMessag
7e80: 65 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 e(interp, "no su
7e90: 63 68 20 76 61 72 69 61 62 6c 65 3a 22 2c 20 7a ch variable:", z
7ea0: 56 61 72 2c 20 6e 56 61 72 29 3b 0a 20 20 20 20 Var, nVar);.
7eb0: 72 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b return TH_ERROR;
7ec0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 . }.. return T
7ed0: 68 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 h_SetResult(inte
7ee0: 72 70 2c 20 70 56 61 6c 75 65 2d 3e 7a 44 61 74 rp, pValue->zDat
7ef0: 61 2c 20 70 56 61 6c 75 65 2d 3e 6e 44 61 74 61 a, pValue->nData
7f00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 69 );.}../*.** Stri
7f10: 6e 67 20 28 7a 56 61 72 2c 20 6e 56 61 72 29 20 ng (zVar, nVar)
7f20: 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 must contain the
7f30: 20 6e 61 6d 65 20 6f 66 20 61 20 73 63 61 6c 61 name of a scala
7f40: 72 20 76 61 72 69 61 62 6c 65 20 6f 72 0a 2a 2a r variable or.**
7f50: 20 61 72 72 61 79 20 6d 65 6d 62 65 72 2e 20 49 array member. I
7f60: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 64 f the variable d
7f70: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69 74 oes not exist it
7f80: 20 69 73 20 63 72 65 61 74 65 64 2e 20 54 68 65 is created. The
7f90: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 .** variable is
7fa0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 set to the value
7fb0: 20 73 75 70 70 6c 69 65 64 20 69 6e 20 73 74 72 supplied in str
7fc0: 69 6e 67 20 28 7a 56 61 6c 75 65 2c 20 6e 56 61 ing (zValue, nVa
7fd0: 6c 75 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 28 lue)..**.** If (
7fe0: 7a 56 61 72 2c 20 6e 56 61 72 29 20 72 65 66 65 zVar, nVar) refe
7ff0: 72 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e rs to an existin
8000: 67 20 61 72 72 61 79 2c 20 54 48 5f 45 52 52 4f g array, TH_ERRO
8010: 52 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a R is returned.**
8020: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 and an error me
8030: 73 73 61 67 65 20 6c 65 66 74 20 69 6e 20 74 68 ssage left in th
8040: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 e interpreter re
8050: 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 54 68 5f sult..*/.int Th_
8060: 53 65 74 56 61 72 28 0a 20 20 54 68 5f 49 6e 74 SetVar(. Th_Int
8070: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 erp *interp, .
8080: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 56 61 const uchar *zVa
8090: 72 2c 20 0a 20 20 69 6e 74 20 6e 56 61 72 2c 0a r, . int nVar,.
80a0: 20 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a const uchar *z
80b0: 56 61 6c 75 65 2c 0a 20 20 69 6e 74 20 6e 56 61 Value,. int nVa
80c0: 6c 75 65 0a 29 7b 0a 20 20 54 68 5f 56 61 72 69 lue.){. Th_Vari
80d0: 61 62 6c 65 20 2a 70 56 61 6c 75 65 3b 0a 0a 20 able *pValue;..
80e0: 20 70 56 61 6c 75 65 20 3d 20 74 68 46 69 6e 64 pValue = thFind
80f0: 56 61 6c 75 65 28 69 6e 74 65 72 70 2c 20 7a 56 Value(interp, zV
8100: 61 72 2c 20 6e 56 61 72 2c 20 31 2c 20 30 29 3b ar, nVar, 1, 0);
8110: 0a 20 20 69 66 28 20 21 70 56 61 6c 75 65 20 29 . if( !pValue )
8120: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f {. return TH_
8130: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 ERROR;. }.. if
8140: 28 20 6e 56 61 6c 75 65 3c 30 20 29 7b 0a 20 20 ( nValue<0 ){.
8150: 20 20 6e 56 61 6c 75 65 20 3d 20 74 68 5f 73 74 nValue = th_st
8160: 72 6c 65 6e 28 7a 56 61 6c 75 65 29 3b 0a 20 20 rlen(zValue);.
8170: 7d 0a 20 20 69 66 28 20 70 56 61 6c 75 65 2d 3e }. if( pValue->
8180: 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 54 68 5f zData ){. Th_
8190: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 70 56 61 Free(interp, pVa
81a0: 6c 75 65 2d 3e 7a 44 61 74 61 29 3b 0a 20 20 20 lue->zData);.
81b0: 20 70 56 61 6c 75 65 2d 3e 7a 44 61 74 61 20 3d pValue->zData =
81c0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 0;. }.. asser
81d0: 74 28 7a 56 61 6c 75 65 20 7c 7c 20 6e 56 61 6c t(zValue || nVal
81e0: 75 65 3d 3d 30 29 3b 0a 20 20 70 56 61 6c 75 65 ue==0);. pValue
81f0: 2d 3e 7a 44 61 74 61 20 3d 20 54 68 5f 4d 61 6c ->zData = Th_Mal
8200: 6c 6f 63 28 69 6e 74 65 72 70 2c 20 6e 56 61 6c loc(interp, nVal
8210: 75 65 2b 31 29 3b 0a 20 20 70 56 61 6c 75 65 2d ue+1);. pValue-
8220: 3e 7a 44 61 74 61 5b 6e 56 61 6c 75 65 5d 20 3d >zData[nValue] =
8230: 20 27 5c 30 27 3b 0a 20 20 6d 65 6d 63 70 79 28 '\0';. memcpy(
8240: 70 56 61 6c 75 65 2d 3e 7a 44 61 74 61 2c 20 7a pValue->zData, z
8250: 56 61 6c 75 65 2c 20 6e 56 61 6c 75 65 29 3b 0a Value, nValue);.
8260: 20 20 70 56 61 6c 75 65 2d 3e 6e 44 61 74 61 20 pValue->nData
8270: 3d 20 6e 56 61 6c 75 65 3b 0a 0a 20 20 72 65 74 = nValue;.. ret
8280: 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a urn TH_OK;.}../*
8290: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 76 61 72 .** Create a var
82a0: 69 61 62 6c 65 20 6c 69 6e 6b 20 73 6f 20 74 68 iable link so th
82b0: 61 74 20 61 63 63 65 73 73 69 6e 67 20 76 61 72 at accessing var
82c0: 69 61 62 6c 65 20 28 7a 4c 6f 63 61 6c 2c 20 6e iable (zLocal, n
82d0: 4c 6f 63 61 6c 29 20 69 73 0a 2a 2a 20 74 68 65 Local) is.** the
82e0: 20 73 61 6d 65 20 61 73 20 61 63 63 65 73 73 69 same as accessi
82f0: 6e 67 20 76 61 72 69 61 62 6c 65 20 28 7a 4c 69 ng variable (zLi
8300: 6e 6b 2c 20 6e 4c 69 6e 6b 29 20 69 6e 20 73 74 nk, nLink) in st
8310: 61 63 6b 20 66 72 61 6d 65 20 69 46 72 61 6d 65 ack frame iFrame
8320: 2e 0a 2a 2f 0a 69 6e 74 20 54 68 5f 4c 69 6e 6b ..*/.int Th_Link
8330: 56 61 72 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 Var(. Th_Interp
8340: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 *interp,
8350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 /* Int
8360: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 63 6f erpreter */. co
8370: 6e 73 74 20 75 63 68 61 72 20 2a 7a 4c 6f 63 61 nst uchar *zLoca
8380: 6c 2c 20 69 6e 74 20 6e 4c 6f 63 61 6c 2c 20 20 l, int nLocal,
8390: 20 2f 2a 20 4c 6f 63 61 6c 20 76 61 72 6e 61 6d /* Local varnam
83a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 61 6d e */. int iFram
83b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
83c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 /* Sta
83d0: 63 6b 20 66 72 61 6d 65 20 6f 66 20 6c 69 6e 6b ck frame of link
83e0: 65 64 20 76 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 ed var */. cons
83f0: 74 20 75 63 68 61 72 20 2a 7a 4c 69 6e 6b 2c 20 t uchar *zLink,
8400: 69 6e 74 20 6e 4c 69 6e 6b 20 20 20 20 20 20 2f int nLink /
8410: 2a 20 4c 69 6e 6b 65 64 20 76 61 72 6e 61 6d 65 * Linked varname
8420: 20 2a 2f 0a 29 7b 0a 20 20 54 68 5f 46 72 61 6d */.){. Th_Fram
8430: 65 20 2a 70 53 61 76 65 64 46 72 61 6d 65 20 3d e *pSavedFrame =
8440: 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d 65 3b interp->pFrame;
8450: 0a 20 20 54 68 5f 46 72 61 6d 65 20 2a 70 46 72 . Th_Frame *pFr
8460: 61 6d 65 3b 0a 20 20 54 68 5f 48 61 73 68 45 6e ame;. Th_HashEn
8470: 74 72 79 20 2a 70 45 6e 74 72 79 3b 0a 20 20 54 try *pEntry;. T
8480: 68 5f 56 61 72 69 61 62 6c 65 20 2a 70 56 61 6c h_Variable *pVal
8490: 75 65 3b 0a 0a 20 20 70 46 72 61 6d 65 20 3d 20 ue;.. pFrame =
84a0: 67 65 74 46 72 61 6d 65 28 69 6e 74 65 72 70 2c getFrame(interp,
84b0: 20 69 46 72 61 6d 65 29 3b 0a 20 20 69 66 28 20 iFrame);. if(
84c0: 21 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 72 !pFrame ){. r
84d0: 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a eturn TH_ERROR;.
84e0: 20 20 7d 0a 20 20 70 53 61 76 65 64 46 72 61 6d }. pSavedFram
84f0: 65 20 3d 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 e = interp->pFra
8500: 6d 65 3b 0a 20 20 69 6e 74 65 72 70 2d 3e 70 46 me;. interp->pF
8510: 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 20 rame = pFrame;.
8520: 20 70 56 61 6c 75 65 20 3d 20 74 68 46 69 6e 64 pValue = thFind
8530: 56 61 6c 75 65 28 69 6e 74 65 72 70 2c 20 7a 4c Value(interp, zL
8540: 69 6e 6b 2c 20 6e 4c 69 6e 6b 2c 20 31 2c 20 31 ink, nLink, 1, 1
8550: 29 3b 0a 20 20 69 6e 74 65 72 70 2d 3e 70 46 72 );. interp->pFr
8560: 61 6d 65 20 3d 20 70 53 61 76 65 64 46 72 61 6d ame = pSavedFram
8570: 65 3b 0a 0a 20 20 70 45 6e 74 72 79 20 3d 20 54 e;.. pEntry = T
8580: 68 5f 48 61 73 68 46 69 6e 64 28 69 6e 74 65 72 h_HashFind(inter
8590: 70 2c 20 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d p, interp->pFram
85a0: 65 2d 3e 70 61 56 61 72 2c 20 7a 4c 6f 63 61 6c e->paVar, zLocal
85b0: 2c 20 6e 4c 6f 63 61 6c 2c 20 31 29 3b 0a 20 20 , nLocal, 1);.
85c0: 69 66 28 20 70 45 6e 74 72 79 2d 3e 70 44 61 74 if( pEntry->pDat
85d0: 61 20 29 7b 0a 20 20 20 20 54 68 5f 45 72 72 6f a ){. Th_Erro
85e0: 72 4d 65 73 73 61 67 65 28 69 6e 74 65 72 70 2c rMessage(interp,
85f0: 20 22 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 "variable exist
8600: 73 3a 22 2c 20 7a 4c 6f 63 61 6c 2c 20 6e 4c 6f s:", zLocal, nLo
8610: 63 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e cal);. return
8620: 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 TH_ERROR;. }.
8630: 20 70 45 6e 74 72 79 2d 3e 70 44 61 74 61 20 3d pEntry->pData =
8640: 20 28 76 6f 69 64 20 2a 29 70 56 61 6c 75 65 3b (void *)pValue;
8650: 0a 20 20 70 56 61 6c 75 65 2d 3e 6e 52 65 66 2b . pValue->nRef+
8660: 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 48 5f +;.. return TH_
8670: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 OK;.}../*.** Inp
8680: 75 74 20 73 74 72 69 6e 67 20 28 7a 56 61 72 2c ut string (zVar,
8690: 20 6e 56 61 72 29 20 6d 75 73 74 20 63 6f 6e 74 nVar) must cont
86a0: 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 ain the name of
86b0: 61 20 73 63 61 6c 61 72 20 76 61 72 69 61 62 6c a scalar variabl
86c0: 65 2c 0a 2a 2a 20 61 6e 20 61 72 72 61 79 2c 20 e,.** an array,
86d0: 6f 72 20 61 6e 20 61 72 72 61 79 20 6d 65 6d 62 or an array memb
86e0: 65 72 2e 20 49 66 20 74 68 65 20 69 64 65 6e 74 er. If the ident
86f0: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 65 ified variable e
8700: 78 69 73 74 73 2c 20 69 74 0a 2a 2a 20 69 73 20 xists, it.** is
8710: 64 65 6c 65 74 65 64 20 61 6e 64 20 54 48 5f 4f deleted and TH_O
8720: 4b 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 K returned. Othe
8730: 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 rwise, an error
8740: 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 0a message is left.
8750: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 ** in the interp
8760: 72 65 74 65 72 20 72 65 73 75 6c 74 20 61 6e 64 reter result and
8770: 20 54 48 5f 45 52 52 4f 52 20 69 73 20 72 65 74 TH_ERROR is ret
8780: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 54 68 urned..*/.int Th
8790: 5f 55 6e 73 65 74 56 61 72 28 54 68 5f 49 6e 74 _UnsetVar(Th_Int
87a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e erp *interp, con
87b0: 73 74 20 75 63 68 61 72 20 2a 7a 56 61 72 2c 20 st uchar *zVar,
87c0: 69 6e 74 20 6e 56 61 72 29 7b 0a 20 20 54 68 5f int nVar){. Th_
87d0: 56 61 72 69 61 62 6c 65 20 2a 70 56 61 6c 75 65 Variable *pValue
87e0: 3b 0a 0a 20 20 70 56 61 6c 75 65 20 3d 20 74 68 ;.. pValue = th
87f0: 46 69 6e 64 56 61 6c 75 65 28 69 6e 74 65 72 70 FindValue(interp
8800: 2c 20 7a 56 61 72 2c 20 6e 56 61 72 2c 20 31 2c , zVar, nVar, 1,
8810: 20 31 29 3b 0a 20 20 69 66 28 20 21 70 56 61 6c 1);. if( !pVal
8820: 75 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e ue ){. return
8830: 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a TH_ERROR;. }..
8840: 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 72 70 Th_Free(interp
8850: 2c 20 70 56 61 6c 75 65 2d 3e 7a 44 61 74 61 29 , pValue->zData)
8860: 3b 0a 20 20 70 56 61 6c 75 65 2d 3e 7a 44 61 74 ;. pValue->zDat
8870: 61 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 56 61 a = 0;. if( pVa
8880: 6c 75 65 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 lue->pHash ){.
8890: 20 20 54 68 5f 48 61 73 68 49 74 65 72 61 74 65 Th_HashIterate
88a0: 28 69 6e 74 65 72 70 2c 20 70 56 61 6c 75 65 2d (interp, pValue-
88b0: 3e 70 48 61 73 68 2c 20 74 68 46 72 65 65 56 61 >pHash, thFreeVa
88c0: 72 69 61 62 6c 65 2c 20 28 76 6f 69 64 20 2a 29 riable, (void *)
88d0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 68 5f interp);. Th_
88e0: 48 61 73 68 44 65 6c 65 74 65 28 69 6e 74 65 72 HashDelete(inter
88f0: 70 2c 20 70 56 61 6c 75 65 2d 3e 70 48 61 73 68 p, pValue->pHash
8900: 29 3b 0a 20 20 20 20 70 56 61 6c 75 65 2d 3e 70 );. pValue->p
8910: 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 Hash = 0;. }.
8920: 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a return TH_OK;.}.
8930: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e ./*.** Return an
8940: 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 allocated buffe
8950: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 r containing a c
8960: 6f 70 79 20 6f 66 20 73 74 72 69 6e 67 20 28 7a opy of string (z
8970: 2c 20 6e 29 2e 20 54 68 65 0a 2a 2a 20 63 61 6c , n). The.** cal
8980: 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 ler is responsib
8990: 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c le for eventuall
89a0: 79 20 63 61 6c 6c 69 6e 67 20 54 68 5f 46 72 65 y calling Th_Fre
89b0: 65 28 29 20 74 6f 20 66 72 65 65 0a 2a 2a 20 74 e() to free.** t
89c0: 68 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 he returned buff
89d0: 65 72 2e 0a 2a 2f 0a 75 63 68 61 72 20 2a 74 68 er..*/.uchar *th
89e0: 5f 73 74 72 64 75 70 28 54 68 5f 49 6e 74 65 72 _strdup(Th_Inter
89f0: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 p *interp, const
8a00: 20 75 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e uchar *z, int n
8a10: 29 7b 0a 20 20 75 63 68 61 72 20 2a 7a 52 65 73 ){. uchar *zRes
8a20: 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 ;. if( n<0 ){.
8a30: 20 20 20 6e 20 3d 20 74 68 5f 73 74 72 6c 65 6e n = th_strlen
8a40: 28 7a 29 3b 0a 20 20 7d 0a 20 20 7a 52 65 73 20 (z);. }. zRes
8a50: 3d 20 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 = Th_Malloc(inte
8a60: 72 70 2c 20 6e 2b 31 29 3b 0a 20 20 6d 65 6d 63 rp, n+1);. memc
8a70: 70 79 28 7a 52 65 73 2c 20 7a 2c 20 6e 29 3b 0a py(zRes, z, n);.
8a80: 20 20 7a 52 65 73 5b 6e 5d 20 3d 20 27 5c 30 27 zRes[n] = '\0'
8a90: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 3b ;. return zRes;
8aa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 .}../*.** Argume
8ab0: 6e 74 20 7a 50 72 65 20 6d 75 73 74 20 62 65 20 nt zPre must be
8ac0: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 a nul-terminated
8ad0: 20 73 74 72 69 6e 67 2e 20 53 65 74 20 74 68 65 string. Set the
8ae0: 20 69 6e 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 interpreter.**
8af0: 72 65 73 75 6c 74 20 74 6f 20 61 20 73 74 72 69 result to a stri
8b00: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 ng containing th
8b10: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 7a 50 e contents of zP
8b20: 72 65 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 0a re, followed by.
8b30: 2a 2a 20 61 20 73 70 61 63 65 20 28 22 20 22 29 ** a space (" ")
8b40: 20 63 68 61 72 61 63 74 65 72 2c 20 66 6f 6c 6c character, foll
8b50: 6f 77 65 64 20 62 79 20 61 20 63 6f 70 79 20 6f owed by a copy o
8b60: 66 20 73 74 72 69 6e 67 20 28 7a 2c 20 6e 29 2e f string (z, n).
8b70: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 .**.** In other
8b80: 77 6f 72 64 73 2c 20 74 68 65 20 65 71 75 69 76 words, the equiv
8b90: 61 6c 65 6e 74 20 6f 66 3a 0a 2a 0a 2a 2a 20 20 alent of:.*.**
8ba0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 25 2e printf("%s %.
8bb0: 2a 73 22 2c 20 7a 50 72 65 2c 20 6e 2c 20 7a 29 *s", zPre, n, z)
8bc0: 3b 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a ;.**.** Example:
8bd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 5f 45 72 .**.** Th_Er
8be0: 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 72 rorMessage(inter
8bf0: 70 2c 20 22 6e 6f 20 73 75 63 68 20 76 61 72 69 p, "no such vari
8c00: 61 62 6c 65 3a 22 2c 20 7a 56 61 72 6e 61 6d 65 able:", zVarname
8c10: 2c 20 6e 56 61 72 6e 61 6d 65 29 3b 0a 2a 2a 0a , nVarname);.**.
8c20: 2a 2f 0a 69 6e 74 20 54 68 5f 45 72 72 6f 72 4d */.int Th_ErrorM
8c30: 65 73 73 61 67 65 28 54 68 5f 49 6e 74 65 72 70 essage(Th_Interp
8c40: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 *interp, const
8c50: 63 68 61 72 20 2a 7a 50 72 65 2c 20 63 6f 6e 73 char *zPre, cons
8c60: 74 20 75 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 t uchar *z, int
8c70: 6e 29 7b 0a 20 20 69 66 28 20 69 6e 74 65 72 70 n){. if( interp
8c80: 20 29 7b 0a 20 20 20 20 75 63 68 61 72 20 2a 7a ){. uchar *z
8c90: 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 Res = 0;. int
8ca0: 20 6e 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 nRes = 0;. i
8cb0: 6e 74 20 6e 50 72 65 20 3d 20 74 68 5f 73 74 72 nt nPre = th_str
8cc0: 6c 65 6e 28 7a 50 72 65 29 3b 0a 0a 20 20 20 20 len(zPre);..
8cd0: 54 68 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 Th_SetVar(interp
8ce0: 2c 20 28 75 63 68 61 72 20 2a 29 22 3a 3a 74 68 , (uchar *)"::th
8cf0: 5f 73 74 61 63 6b 5f 74 72 61 63 65 22 2c 20 2d _stack_trace", -
8d00: 31 2c 20 30 2c 20 30 29 3b 0a 20 20 0a 20 20 20 1, 0, 0);. .
8d10: 20 54 68 5f 53 74 72 69 6e 67 41 70 70 65 6e 64 Th_StringAppend
8d20: 28 69 6e 74 65 72 70 2c 20 26 7a 52 65 73 2c 20 (interp, &zRes,
8d30: 26 6e 52 65 73 2c 20 7a 50 72 65 2c 20 2d 31 29 &nRes, zPre, -1)
8d40: 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 73 5b 6e ;. if( zRes[n
8d50: 52 65 73 2d 31 5d 3d 3d 27 22 27 20 29 7b 0a 20 Res-1]=='"' ){.
8d60: 20 20 20 20 20 54 68 5f 53 74 72 69 6e 67 41 70 Th_StringAp
8d70: 70 65 6e 64 28 69 6e 74 65 72 70 2c 20 26 7a 52 pend(interp, &zR
8d80: 65 73 2c 20 26 6e 52 65 73 2c 20 7a 2c 20 6e 29 es, &nRes, z, n)
8d90: 3b 0a 20 20 20 20 20 20 54 68 5f 53 74 72 69 6e ;. Th_Strin
8da0: 67 41 70 70 65 6e 64 28 69 6e 74 65 72 70 2c 20 gAppend(interp,
8db0: 26 7a 52 65 73 2c 20 26 6e 52 65 73 2c 20 28 63 &zRes, &nRes, (c
8dc0: 6f 6e 73 74 20 75 63 68 61 72 20 2a 29 22 5c 22 onst uchar *)"\"
8dd0: 22 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 ", 1);. }else
8de0: 7b 0a 20 20 20 20 20 20 54 68 5f 53 74 72 69 6e {. Th_Strin
8df0: 67 41 70 70 65 6e 64 28 69 6e 74 65 72 70 2c 20 gAppend(interp,
8e00: 26 7a 52 65 73 2c 20 26 6e 52 65 73 2c 20 28 63 &zRes, &nRes, (c
8e10: 6f 6e 73 74 20 75 63 68 61 72 20 2a 29 22 20 22 onst uchar *)" "
8e20: 2c 20 31 29 3b 0a 20 20 20 20 20 20 54 68 5f 53 , 1);. Th_S
8e30: 74 72 69 6e 67 41 70 70 65 6e 64 28 69 6e 74 65 tringAppend(inte
8e40: 72 70 2c 20 26 7a 52 65 73 2c 20 26 6e 52 65 73 rp, &zRes, &nRes
8e50: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 0a , z, n);. }..
8e60: 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 Th_SetResult
8e70: 28 69 6e 74 65 72 70 2c 20 7a 52 65 73 2c 20 6e (interp, zRes, n
8e80: 52 65 73 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 Res);. Th_Fre
8e90: 65 28 69 6e 74 65 72 70 2c 20 7a 52 65 73 29 3b e(interp, zRes);
8ea0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 . }.. return T
8eb0: 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 H_OK;.}../*.** S
8ec0: 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 et the current i
8ed0: 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c nterpreter resul
8ee0: 74 20 62 79 20 74 61 6b 69 6e 67 20 61 20 63 6f t by taking a co
8ef0: 70 79 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 py of the buffer
8f00: 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 .** pointed to b
8f10: 79 20 7a 2c 20 73 69 7a 65 20 6e 20 62 79 74 65 y z, size n byte
8f20: 73 2e 20 54 48 5f 4f 4b 20 69 73 20 61 6c 77 61 s. TH_OK is alwa
8f30: 79 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a ys returned..*/.
8f40: 69 6e 74 20 54 68 5f 53 65 74 52 65 73 75 6c 74 int Th_SetResult
8f50: 28 54 68 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 (Th_Interp *pInt
8f60: 65 72 70 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 erp, const uchar
8f70: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 0a 20 20 *z, int n){..
8f80: 2f 2a 20 46 72 65 65 20 74 68 65 20 63 75 72 72 /* Free the curr
8f90: 65 6e 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 ent result */.
8fa0: 54 68 5f 46 72 65 65 28 70 49 6e 74 65 72 70 2c Th_Free(pInterp,
8fb0: 20 70 49 6e 74 65 72 70 2d 3e 7a 52 65 73 75 6c pInterp->zResul
8fc0: 74 29 3b 0a 20 20 70 49 6e 74 65 72 70 2d 3e 7a t);. pInterp->z
8fd0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 70 49 Result = 0;. pI
8fe0: 6e 74 65 72 70 2d 3e 6e 52 65 73 75 6c 74 20 3d nterp->nResult =
8ff0: 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3c 30 20 29 0;.. if( n<0 )
9000: 7b 0a 20 20 20 20 6e 20 3d 20 74 68 5f 73 74 72 {. n = th_str
9010: 6c 65 6e 28 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 len(z);. }.. i
9020: 66 28 20 7a 20 26 26 20 6e 3e 30 20 29 7b 0a 20 f( z && n>0 ){.
9030: 20 20 20 75 63 68 61 72 20 2a 7a 52 65 73 75 6c uchar *zResul
9040: 74 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d t;. zResult =
9050: 20 54 68 5f 4d 61 6c 6c 6f 63 28 70 49 6e 74 65 Th_Malloc(pInte
9060: 72 70 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 6d 65 rp, n+1);. me
9070: 6d 63 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 2c mcpy(zResult, z,
9080: 20 6e 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 n);. zResult
9090: 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 [n] = '\0';.
90a0: 70 49 6e 74 65 72 70 2d 3e 7a 52 65 73 75 6c 74 pInterp->zResult
90b0: 20 3d 20 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20 = zResult;.
90c0: 70 49 6e 74 65 72 70 2d 3e 6e 52 65 73 75 6c 74 pInterp->nResult
90d0: 20 3d 20 6e 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 = n;. }.. ret
90e0: 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a urn TH_OK;.}../*
90f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 .** Return a poi
9100: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 nter to the buff
9110: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 er containing th
9120: 65 20 63 75 72 72 65 6e 74 20 69 6e 74 65 72 70 e current interp
9130: 72 65 74 65 72 0a 2a 2a 20 72 65 73 75 6c 74 2e reter.** result.
9140: 20 49 66 20 70 4e 20 69 73 20 6e 6f 74 20 4e 55 If pN is not NU
9150: 4c 4c 2c 20 73 65 74 20 2a 70 4e 20 74 6f 20 74 LL, set *pN to t
9160: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 he size of the r
9170: 65 74 75 72 6e 65 64 0a 2a 2a 20 62 75 66 66 65 eturned.** buffe
9180: 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 75 63 68 61 r..*/.const ucha
9190: 72 20 2a 54 68 5f 47 65 74 52 65 73 75 6c 74 28 r *Th_GetResult(
91a0: 54 68 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 Th_Interp *pInte
91b0: 72 70 2c 20 69 6e 74 20 2a 70 4e 29 7b 0a 20 20 rp, int *pN){.
91c0: 61 73 73 65 72 74 28 70 49 6e 74 65 72 70 2d 3e assert(pInterp->
91d0: 7a 52 65 73 75 6c 74 20 7c 7c 20 70 49 6e 74 65 zResult || pInte
91e0: 72 70 2d 3e 6e 52 65 73 75 6c 74 3d 3d 30 29 3b rp->nResult==0);
91f0: 0a 20 20 69 66 28 20 70 4e 20 29 7b 0a 20 20 20 . if( pN ){.
9200: 20 2a 70 4e 20 3d 20 70 49 6e 74 65 72 70 2d 3e *pN = pInterp->
9210: 6e 52 65 73 75 6c 74 3b 0a 20 20 7d 0a 20 20 72 nResult;. }. r
9220: 65 74 75 72 6e 20 28 70 49 6e 74 65 72 70 2d 3e eturn (pInterp->
9230: 7a 52 65 73 75 6c 74 20 3f 20 70 49 6e 74 65 72 zResult ? pInter
9240: 70 2d 3e 7a 52 65 73 75 6c 74 20 3a 20 28 63 6f p->zResult : (co
9250: 6e 73 74 20 75 63 68 61 72 20 2a 29 22 22 29 3b nst uchar *)"");
9260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
9270: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
9280: 65 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e e buffer contain
9290: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 ing the current
92a0: 69 6e 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 72 interpreter.** r
92b0: 65 73 75 6c 74 2e 20 49 66 20 70 4e 20 69 73 20 esult. If pN is
92c0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 not NULL, set *p
92d0: 4e 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 N to the size of
92e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a the returned.**
92f0: 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 buffer..**.** T
9300: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
9310: 74 68 65 20 73 61 6d 65 20 61 73 20 54 68 5f 47 the same as Th_G
9320: 65 74 52 65 73 75 6c 74 28 29 20 65 78 63 65 70 etResult() excep
9330: 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 63 61 t that the.** ca
9340: 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 ller is responsi
9350: 62 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c ble for eventual
9360: 6c 79 20 63 61 6c 6c 69 6e 67 20 54 68 5f 46 72 ly calling Th_Fr
9370: 65 65 28 29 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 ee() on the.** r
9380: 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 2e 20 eturned buffer.
9390: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 The internal int
93a0: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 20 erpreter result
93b0: 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 66 is cleared.** af
93c0: 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f ter this functio
93d0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a n is called..*/.
93e0: 75 63 68 61 72 20 2a 54 68 5f 54 61 6b 65 52 65 uchar *Th_TakeRe
93f0: 73 75 6c 74 28 54 68 5f 49 6e 74 65 72 70 20 2a sult(Th_Interp *
9400: 70 49 6e 74 65 72 70 2c 20 69 6e 74 20 2a 70 4e pInterp, int *pN
9410: 29 7b 0a 20 20 69 66 28 20 70 4e 20 29 7b 0a 20 ){. if( pN ){.
9420: 20 20 20 2a 70 4e 20 3d 20 70 49 6e 74 65 72 70 *pN = pInterp
9430: 2d 3e 6e 52 65 73 75 6c 74 3b 0a 20 20 7d 0a 20 ->nResult;. }.
9440: 20 69 66 28 20 70 49 6e 74 65 72 70 2d 3e 7a 52 if( pInterp->zR
9450: 65 73 75 6c 74 20 29 7b 0a 20 20 20 20 75 63 68 esult ){. uch
9460: 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 70 49 ar *zResult = pI
9470: 6e 74 65 72 70 2d 3e 7a 52 65 73 75 6c 74 3b 0a nterp->zResult;.
9480: 20 20 20 20 70 49 6e 74 65 72 70 2d 3e 7a 52 65 pInterp->zRe
9490: 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 70 49 sult = 0;. pI
94a0: 6e 74 65 72 70 2d 3e 6e 52 65 73 75 6c 74 20 3d nterp->nResult =
94b0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 0;. return z
94c0: 52 65 73 75 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b Result;. }else{
94d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 75 63 68 . return (uch
94e0: 61 72 20 2a 29 54 68 5f 4d 61 6c 6c 6f 63 28 70 ar *)Th_Malloc(p
94f0: 49 6e 74 65 72 70 2c 20 31 29 3b 0a 20 20 7d 0a Interp, 1);. }.
9500: 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 57 72 61 70 70 }.../* .** Wrapp
9510: 65 72 73 20 61 72 6f 75 6e 64 20 74 68 65 20 73 ers around the s
9520: 75 70 70 6c 69 65 64 20 6d 61 6c 6c 6f 63 28 29 upplied malloc()
9530: 20 61 6e 64 20 66 72 65 65 28 29 20 0a 2a 2f 0a and free() .*/.
9540: 76 6f 69 64 20 2a 54 68 5f 4d 61 6c 6c 6f 63 28 void *Th_Malloc(
9550: 54 68 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 Th_Interp *pInte
9560: 72 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a rp, int nByte){.
9570: 20 20 76 6f 69 64 20 2a 70 20 3d 20 70 49 6e 74 void *p = pInt
9580: 65 72 70 2d 3e 70 56 74 61 62 2d 3e 78 4d 61 6c erp->pVtab->xMal
9590: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 loc(nByte);. if
95a0: 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 ( p ){. memse
95b0: 74 28 70 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a t(p, 0, nByte);.
95c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a }. return p;.
95d0: 7d 0a 76 6f 69 64 20 54 68 5f 46 72 65 65 28 54 }.void Th_Free(T
95e0: 68 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72 h_Interp *pInter
95f0: 70 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 69 p, void *z){. i
9600: 66 28 20 7a 20 29 7b 0a 20 20 20 20 70 49 6e 74 f( z ){. pInt
9610: 65 72 70 2d 3e 70 56 74 61 62 2d 3e 78 46 72 65 erp->pVtab->xFre
9620: 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a e(z);. }.}../*.
9630: 2a 2a 20 49 6e 73 74 61 6c 6c 20 61 20 6e 65 77 ** Install a new
9640: 20 74 68 31 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a th1 command. .*
9650: 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6d 6d 61 6e *.** If a comman
9660: 64 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 d of the same na
9670: 6d 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 me already exist
9680: 73 2c 20 69 74 20 69 73 20 64 65 6c 65 74 65 64 s, it is deleted
9690: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a automatically..
96a0: 2a 2f 0a 69 6e 74 20 54 68 5f 43 72 65 61 74 65 */.int Th_Create
96b0: 43 6f 6d 6d 61 6e 64 28 0a 20 20 54 68 5f 49 6e Command(. Th_In
96c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 terp *interp, .
96d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
96e0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 me,
96f0: 20 20 20 20 2f 2a 20 4e 65 77 20 63 6f 6d 6d 61 /* New comma
9700: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 68 5f nd name */. Th_
9710: 43 6f 6d 6d 61 6e 64 50 72 6f 63 20 78 50 72 6f CommandProc xPro
9720: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 c,
9730: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 63 61 6c 6c 62 /* Command callb
9740: 61 63 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 76 6f ack proc */. vo
9750: 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 id *pContext,
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9770: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 70 61 73 /* Value to pas
9780: 73 20 61 73 20 73 65 63 6f 6e 64 20 61 72 67 20 s as second arg
9790: 74 6f 20 78 50 72 6f 63 20 2a 2f 0a 20 20 76 6f to xProc */. vo
97a0: 69 64 20 28 2a 78 44 65 6c 29 28 54 68 5f 49 6e id (*xDel)(Th_In
97b0: 74 65 72 70 20 2a 2c 20 76 6f 69 64 20 2a 29 20 terp *, void *)
97c0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 64 65 73 74 /* Command dest
97d0: 72 75 63 74 6f 72 20 63 61 6c 6c 62 61 63 6b 20 ructor callback
97e0: 2a 2f 0a 29 7b 0a 20 20 54 68 5f 48 61 73 68 45 */.){. Th_HashE
97f0: 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 0a 20 20 ntry *pEntry;.
9800: 54 68 5f 43 6f 6d 6d 61 6e 64 20 2a 70 43 6f 6d Th_Command *pCom
9810: 6d 61 6e 64 3b 0a 0a 20 20 70 45 6e 74 72 79 20 mand;.. pEntry
9820: 3d 20 54 68 5f 48 61 73 68 46 69 6e 64 28 69 6e = Th_HashFind(in
9830: 74 65 72 70 2c 20 69 6e 74 65 72 70 2d 3e 70 61 terp, interp->pa
9840: 43 6d 64 2c 20 28 63 6f 6e 73 74 20 75 63 68 61 Cmd, (const ucha
9850: 72 20 2a 29 7a 4e 61 6d 65 2c 20 2d 31 2c 20 31 r *)zName, -1, 1
9860: 29 3b 0a 20 20 69 66 28 20 70 45 6e 74 72 79 2d );. if( pEntry-
9870: 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 70 43 >pData ){. pC
9880: 6f 6d 6d 61 6e 64 20 3d 20 70 45 6e 74 72 79 2d ommand = pEntry-
9890: 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 >pData;. if(
98a0: 70 43 6f 6d 6d 61 6e 64 2d 3e 78 44 65 6c 20 29 pCommand->xDel )
98b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6d 6d 61 6e 64 {. pCommand
98c0: 2d 3e 78 44 65 6c 28 69 6e 74 65 72 70 2c 20 70 ->xDel(interp, p
98d0: 43 6f 6d 6d 61 6e 64 2d 3e 70 43 6f 6e 74 65 78 Command->pContex
98e0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 t);. }. }els
98f0: 65 7b 0a 20 20 20 20 70 43 6f 6d 6d 61 6e 64 20 e{. pCommand
9900: 3d 20 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 = Th_Malloc(inte
9910: 72 70 2c 20 73 69 7a 65 6f 66 28 54 68 5f 43 6f rp, sizeof(Th_Co
9920: 6d 6d 61 6e 64 29 29 3b 0a 20 20 7d 0a 20 20 70 mmand));. }. p
9930: 43 6f 6d 6d 61 6e 64 2d 3e 78 50 72 6f 63 20 3d Command->xProc =
9940: 20 78 50 72 6f 63 3b 0a 20 20 70 43 6f 6d 6d 61 xProc;. pComma
9950: 6e 64 2d 3e 70 43 6f 6e 74 65 78 74 20 3d 20 70 nd->pContext = p
9960: 43 6f 6e 74 65 78 74 3b 0a 20 20 70 43 6f 6d 6d Context;. pComm
9970: 61 6e 64 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c and->xDel = xDel
9980: 3b 0a 20 20 70 45 6e 74 72 79 2d 3e 70 44 61 74 ;. pEntry->pDat
9990: 61 20 3d 20 28 76 6f 69 64 20 2a 29 70 43 6f 6d a = (void *)pCom
99a0: 6d 61 6e 64 3b 0a 20 0a 20 20 72 65 74 75 72 6e mand;. . return
99b0: 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a TH_OK;.}../*.**
99c0: 20 52 65 6e 61 6d 65 20 74 68 65 20 65 78 69 73 Rename the exis
99d0: 74 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 28 7a 4e ting command (zN
99e0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 20 74 6f 20 28 ame, nName) to (
99f0: 7a 4e 65 77 2c 20 6e 4e 65 77 29 2e 20 49 66 20 zNew, nNew). If
9a00: 6e 4e 65 77 20 69 73 20 30 2c 20 0a 2a 2a 20 74 nNew is 0, .** t
9a10: 68 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 he command is de
9a20: 6c 65 74 65 64 20 69 6e 73 74 65 61 64 20 6f 66 leted instead of
9a30: 20 72 65 6e 61 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 renamed..**.**
9a40: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54 If successful, T
9a50: 48 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 H_OK is returned
9a60: 2e 20 49 66 20 63 6f 6d 6d 61 6e 64 20 7a 4e 61 . If command zNa
9a70: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 me does not exis
9a80: 74 2c 20 6f 72 0a 2a 2a 20 69 66 20 63 6f 6d 6d t, or.** if comm
9a90: 61 6e 64 20 7a 4e 65 77 20 61 6c 72 65 61 64 79 and zNew already
9aa0: 20 65 78 69 73 74 73 2c 20 61 6e 20 65 72 72 6f exists, an erro
9ab0: 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 r message is lef
9ac0: 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 6e 74 t in the .** int
9ad0: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 20 erpreter result
9ae0: 61 6e 64 20 54 48 5f 45 52 52 4f 52 20 69 73 20 and TH_ERROR is
9af0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 returned..*/.int
9b00: 20 54 68 5f 52 65 6e 61 6d 65 43 6f 6d 6d 61 6e Th_RenameComman
9b10: 64 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a d(. Th_Interp *
9b20: 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 interp, . const
9b30: 20 75 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 uchar *zName,
9b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 /* Exi
9b50: 73 74 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6e 61 sting command na
9b60: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d me */. int nNam
9b70: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
9b80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
9b90: 20 6f 66 20 62 79 74 65 73 20 61 74 20 7a 4e 61 of bytes at zNa
9ba0: 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 63 me */. const uc
9bb0: 68 61 72 20 2a 7a 4e 65 77 2c 20 20 20 20 20 20 har *zNew,
9bc0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 6f /* New co
9bd0: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 mmand name */.
9be0: 69 6e 74 20 6e 4e 65 77 20 20 20 20 20 20 20 20 int nNew
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
9c00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
9c10: 73 20 61 74 20 7a 4e 65 77 20 2a 2f 0a 29 7b 0a s at zNew */.){.
9c20: 20 20 54 68 5f 48 61 73 68 45 6e 74 72 79 20 2a Th_HashEntry *
9c30: 70 45 6e 74 72 79 3b 0a 20 20 54 68 5f 48 61 73 pEntry;. Th_Has
9c40: 68 45 6e 74 72 79 20 2a 70 4e 65 77 45 6e 74 72 hEntry *pNewEntr
9c50: 79 3b 0a 0a 20 20 70 45 6e 74 72 79 20 3d 20 54 y;.. pEntry = T
9c60: 68 5f 48 61 73 68 46 69 6e 64 28 69 6e 74 65 72 h_HashFind(inter
9c70: 70 2c 20 69 6e 74 65 72 70 2d 3e 70 61 43 6d 64 p, interp->paCmd
9c80: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 , zName, nName,
9c90: 30 29 3b 0a 20 20 69 66 28 20 21 70 45 6e 74 72 0);. if( !pEntr
9ca0: 79 20 29 7b 0a 20 20 20 20 54 68 5f 45 72 72 6f y ){. Th_Erro
9cb0: 72 4d 65 73 73 61 67 65 28 69 6e 74 65 72 70 2c rMessage(interp,
9cc0: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6d 6d 61 6e "no such comman
9cd0: 64 3a 22 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d d:", zName, nNam
9ce0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 e);. return T
9cf0: 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 H_ERROR;. }. a
9d00: 73 73 65 72 74 28 70 45 6e 74 72 79 2d 3e 70 44 ssert(pEntry->pD
9d10: 61 74 61 29 3b 0a 0a 20 20 69 66 28 20 6e 4e 65 ata);.. if( nNe
9d20: 77 3e 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 45 w>0 ){. pNewE
9d30: 6e 74 72 79 20 3d 20 54 68 5f 48 61 73 68 46 69 ntry = Th_HashFi
9d40: 6e 64 28 69 6e 74 65 72 70 2c 20 69 6e 74 65 72 nd(interp, inter
9d50: 70 2d 3e 70 61 43 6d 64 2c 20 7a 4e 65 77 2c 20 p->paCmd, zNew,
9d60: 6e 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20 69 66 nNew, 1);. if
9d70: 28 20 70 4e 65 77 45 6e 74 72 79 2d 3e 70 44 61 ( pNewEntry->pDa
9d80: 74 61 20 29 7b 0a 20 20 20 20 20 20 54 68 5f 45 ta ){. Th_E
9d90: 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 rrorMessage(inte
9da0: 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 65 78 69 rp, "command exi
9db0: 73 74 73 3a 22 2c 20 7a 4e 65 77 2c 20 6e 4e 65 sts:", zNew, nNe
9dc0: 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e w);. return
9dd0: 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TH_ERROR;. }
9de0: 0a 20 20 20 20 70 4e 65 77 45 6e 74 72 79 2d 3e . pNewEntry->
9df0: 70 44 61 74 61 20 3d 20 70 45 6e 74 72 79 2d 3e pData = pEntry->
9e00: 70 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a pData;. }else{.
9e10: 20 20 20 20 54 68 5f 43 6f 6d 6d 61 6e 64 20 2a Th_Command *
9e20: 70 43 6f 6d 6d 61 6e 64 20 3d 20 28 54 68 5f 43 pCommand = (Th_C
9e30: 6f 6d 6d 61 6e 64 20 2a 29 28 70 45 6e 74 72 79 ommand *)(pEntry
9e40: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 ->pData);. if
9e50: 28 20 70 43 6f 6d 6d 61 6e 64 2d 3e 78 44 65 6c ( pCommand->xDel
9e60: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6d 6d 61 ){. pComma
9e70: 6e 64 2d 3e 78 44 65 6c 28 69 6e 74 65 72 70 2c nd->xDel(interp,
9e80: 20 70 43 6f 6d 6d 61 6e 64 2d 3e 70 43 6f 6e 74 pCommand->pCont
9e90: 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ext);. }.
9ea0: 54 68 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 Th_Free(interp,
9eb0: 70 43 6f 6d 6d 61 6e 64 29 3b 0a 20 20 7d 0a 0a pCommand);. }..
9ec0: 20 20 54 68 5f 48 61 73 68 46 69 6e 64 28 69 6e Th_HashFind(in
9ed0: 74 65 72 70 2c 20 69 6e 74 65 72 70 2d 3e 70 61 terp, interp->pa
9ee0: 43 6d 64 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d Cmd, zName, nNam
9ef0: 65 2c 20 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e e, -1);. return
9f00: 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a TH_OK;.}../*.**
9f10: 20 50 75 73 68 20 61 20 73 74 61 63 6b 20 66 72 Push a stack fr
9f20: 61 6d 65 20 6f 6e 74 6f 20 74 68 65 20 69 6e 74 ame onto the int
9f30: 65 72 70 72 65 74 65 72 20 73 74 61 63 6b 2c 20 erpreter stack,
9f40: 69 6e 76 6f 6b 65 20 74 68 65 0a 2a 2a 20 63 61 invoke the.** ca
9f50: 6c 6c 62 61 63 6b 2c 20 61 6e 64 20 70 6f 70 20 llback, and pop
9f60: 74 68 65 20 66 72 61 6d 65 20 62 61 63 6b 20 6f the frame back o
9f70: 66 66 20 61 67 61 69 6e 2e 20 53 65 65 20 74 68 ff again. See th
9f80: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e e implementation
9f90: 0a 2a 2a 20 6f 66 20 5b 70 72 6f 63 5d 20 28 74 .** of [proc] (t
9fa0: 68 5f 6c 61 6e 67 2e 63 29 20 66 6f 72 20 61 6e h_lang.c) for an
9fb0: 20 65 78 61 6d 70 6c 65 2e 0a 2a 2f 0a 69 6e 74 example..*/.int
9fc0: 20 54 68 5f 49 6e 46 72 61 6d 65 28 54 68 5f 49 Th_InFrame(Th_I
9fd0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
9fe0: 20 69 6e 74 20 28 2a 78 43 61 6c 6c 29 28 54 68 int (*xCall)(Th
9ff0: 5f 49 6e 74 65 72 70 20 2a 2c 20 76 6f 69 64 20 _Interp *, void
a000: 2a 70 43 6f 6e 74 65 78 74 31 2c 20 76 6f 69 64 *pContext1, void
a010: 20 2a 70 43 6f 6e 74 65 78 74 32 29 2c 0a 20 20 *pContext2),.
a020: 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 31 2c void *pContext1,
a030: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 . void *pContex
a040: 74 32 0a 29 7b 0a 20 20 54 68 5f 46 72 61 6d 65 t2.){. Th_Frame
a050: 20 66 72 61 6d 65 3b 0a 20 20 69 6e 74 20 72 63 frame;. int rc
a060: 3b 0a 20 20 74 68 50 75 73 68 46 72 61 6d 65 28 ;. thPushFrame(
a070: 69 6e 74 65 72 70 2c 20 26 66 72 61 6d 65 29 3b interp, &frame);
a080: 0a 20 20 72 63 20 3d 20 78 43 61 6c 6c 28 69 6e . rc = xCall(in
a090: 74 65 72 70 2c 20 70 43 6f 6e 74 65 78 74 31 2c terp, pContext1,
a0a0: 20 70 43 6f 6e 74 65 78 74 32 29 3b 0a 20 20 74 pContext2);. t
a0b0: 68 50 6f 70 46 72 61 6d 65 28 69 6e 74 65 72 70 hPopFrame(interp
a0c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a );. return rc;.
a0d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 70 6c 69 74 20 61 }../*.** Split a
a0e0: 20 74 68 31 20 6c 69 73 74 20 69 6e 74 6f 20 69 th1 list into i
a0f0: 74 73 20 63 6f 6d 70 6f 6e 65 6e 74 20 65 6c 65 ts component ele
a100: 6d 65 6e 74 73 2e 20 54 68 65 20 6c 69 73 74 20 ments. The list
a110: 74 6f 20 73 70 6c 69 74 20 69 73 0a 2a 2a 20 70 to split is.** p
a120: 61 73 73 65 64 20 76 69 61 20 61 72 67 75 6d 65 assed via argume
a130: 6e 74 73 20 28 7a 4c 69 73 74 2c 20 6e 4c 69 73 nts (zList, nLis
a140: 74 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 t). If successfu
a150: 6c 2c 20 54 48 5f 4f 4b 20 69 73 20 72 65 74 75 l, TH_OK is retu
a160: 72 6e 65 64 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 rned..** If an e
a170: 72 72 6f 72 20 6f 63 63 75 72 73 20 28 69 66 20 rror occurs (if
a180: 28 7a 4c 69 73 74 2c 20 6e 4c 69 73 74 29 20 69 (zList, nList) i
a190: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6c 69 s not a valid li
a1a0: 73 74 29 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 st) an error.**
a1b0: 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 message is left
a1c0: 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 in the interpret
a1d0: 65 72 20 72 65 73 75 6c 74 20 61 6e 64 20 54 48 er result and TH
a1e0: 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e _ERROR returned.
a1f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 .**.** If succes
a200: 73 66 75 6c 2c 20 2a 70 6e 43 6f 75 6e 74 20 69 sful, *pnCount i
a210: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d s set to the num
a220: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 ber of elements
a230: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 in the list..**
a240: 70 61 6e 45 6c 65 6d 20 69 73 20 73 65 74 20 74 panElem is set t
a250: 6f 20 70 6f 69 6e 74 20 61 74 20 61 6e 20 61 72 o point at an ar
a260: 72 61 79 20 6f 66 20 2a 70 6e 43 6f 75 6e 74 20 ray of *pnCount
a270: 69 6e 74 65 67 65 72 73 20 2d 20 74 68 65 20 6c integers - the l
a280: 65 6e 67 74 68 73 0a 2a 2a 20 6f 66 20 74 68 65 engths.** of the
a290: 20 65 6c 65 6d 65 6e 74 20 76 61 6c 75 65 73 2e element values.
a2a0: 20 2a 70 61 7a 45 6c 65 6d 20 69 73 20 73 65 74 *pazElem is set
a2b0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 61 6e 20 to point at an
a2c0: 61 72 72 61 79 20 6f 66 20 0a 2a 2a 20 70 6f 69 array of .** poi
a2d0: 6e 74 65 72 73 20 74 6f 20 62 75 66 66 65 72 73 nters to buffers
a2e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 containing the
a2f0: 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 27 73 20 array element's
a300: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 data..**.** To f
a310: 72 65 65 20 74 68 65 20 61 72 72 61 79 73 20 61 ree the arrays a
a320: 6c 6c 6f 63 61 74 65 64 20 61 74 20 2a 70 61 7a llocated at *paz
a330: 45 6c 65 6d 20 61 6e 64 20 2a 70 61 6e 45 6c 65 Elem and *panEle
a340: 6d 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a m, the caller.**
a350: 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 54 68 5f should call Th_
a360: 46 72 65 65 28 29 20 6f 6e 20 2a 70 61 7a 45 6c Free() on *pazEl
a370: 65 6d 20 6f 6e 6c 79 2e 20 45 78 61 63 74 6c 79 em only. Exactly
a380: 20 6f 6e 65 20 73 75 63 68 20 63 61 6c 6c 20 74 one such call t
a390: 6f 0a 2a 2a 20 54 68 5f 46 72 65 65 28 29 20 6d o.** Th_Free() m
a3a0: 75 73 74 20 62 65 20 6d 61 64 65 20 70 65 72 20 ust be made per
a3b0: 63 61 6c 6c 20 74 6f 20 54 68 5f 53 70 6c 69 74 call to Th_Split
a3c0: 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 45 78 List()..**.** Ex
a3d0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 ample:.**.**
a3e0: 20 69 6e 74 20 6e 45 6c 65 6d 3b 0a 2a 2a 20 20 int nElem;.**
a3f0: 20 20 20 69 6e 74 20 2a 61 6e 45 6c 65 6d 3b 0a int *anElem;.
a400: 2a 2a 20 20 20 20 20 75 63 68 61 72 20 2a 2a 61 ** uchar **a
a410: 7a 45 6c 65 6d 3b 0a 2a 2a 20 20 20 20 20 69 6e zElem;.** in
a420: 74 20 69 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 t i;.**.** T
a430: 68 5f 53 70 6c 69 74 4c 69 73 74 28 69 6e 74 65 h_SplitList(inte
a440: 72 70 2c 20 7a 4c 69 73 74 2c 20 6e 4c 69 73 74 rp, zList, nList
a450: 2c 20 26 61 7a 45 6c 65 6d 2c 20 26 61 6e 45 6c , &azElem, &anEl
a460: 65 6d 2c 20 26 6e 45 6c 65 6d 29 3b 0a 2a 2a 20 em, &nElem);.**
a470: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e for(i=0; i<n
a480: 45 6c 65 6d 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 Elem; i++){.**
a490: 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d int nData =
a4a0: 20 61 6e 45 6c 65 6d 5b 69 5d 3b 0a 2a 2a 20 20 anElem[i];.**
a4b0: 20 20 20 20 20 75 63 68 61 72 20 2a 7a 44 61 74 uchar *zDat
a4c0: 61 20 3d 20 61 7a 45 6c 65 6d 5b 69 5d 3b 0a 2a a = azElem[i];.*
a4d0: 2a 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 * ....**
a4e0: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 }.**.** T
a4f0: 68 5f 46 72 65 65 28 69 6e 74 65 72 70 2c 20 61 h_Free(interp, a
a500: 7a 45 6c 65 6d 29 3b 0a 2a 2a 0a 2a 2f 0a 69 6e zElem);.**.*/.in
a510: 74 20 54 68 5f 53 70 6c 69 74 4c 69 73 74 28 0a t Th_SplitList(.
a520: 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Th_Interp *int
a530: 65 72 70 2c 0a 20 20 63 6f 6e 73 74 20 75 63 68 erp,. const uch
a540: 61 72 20 2a 7a 4c 69 73 74 2c 20 20 20 20 20 20 ar *zList,
a550: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
a560: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 r to buffer cont
a570: 61 69 6e 69 6e 67 20 6c 69 73 74 20 2a 2f 0a 20 aining list */.
a580: 20 69 6e 74 20 6e 4c 69 73 74 2c 20 20 20 20 20 int nList,
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a5a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
a5b0: 74 65 73 20 61 74 20 7a 4c 69 73 74 20 2a 2f 0a tes at zList */.
a5c0: 20 20 75 63 68 61 72 20 2a 2a 2a 70 61 7a 45 6c uchar ***pazEl
a5d0: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 em,
a5e0: 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 /* OUT: Array
a5f0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 of pointers to e
a600: 6c 65 6d 65 6e 74 20 64 61 74 61 20 2a 2f 0a 20 lement data */.
a610: 20 69 6e 74 20 2a 2a 70 61 6e 45 6c 65 6d 2c 20 int **panElem,
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a630: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f /* OUT: Array o
a640: 66 20 65 6c 65 6d 65 6e 74 20 64 61 74 61 20 6c f element data l
a650: 65 6e 67 74 68 73 20 2a 2f 0a 20 20 69 6e 74 20 engths */. int
a660: 2a 70 6e 43 6f 75 6e 74 20 20 20 20 20 20 20 20 *pnCount
a670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f /* O
a680: 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c UT: Number of el
a690: 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 2a ements in list *
a6a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 /.){. int rc;.
a6b0: 20 69 6e 74 65 72 70 2d 3e 69 73 4c 69 73 74 4d interp->isListM
a6c0: 6f 64 65 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 ode = 1;. rc =
a6d0: 74 68 53 70 6c 69 74 4c 69 73 74 28 69 6e 74 65 thSplitList(inte
a6e0: 72 70 2c 20 7a 4c 69 73 74 2c 20 6e 4c 69 73 74 rp, zList, nList
a6f0: 2c 20 70 61 7a 45 6c 65 6d 2c 20 70 61 6e 45 6c , pazElem, panEl
a700: 65 6d 2c 20 70 6e 43 6f 75 6e 74 29 3b 0a 20 20 em, pnCount);.
a710: 69 6e 74 65 72 70 2d 3e 69 73 4c 69 73 74 4d 6f interp->isListMo
a720: 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 de = 0;. if( rc
a730: 20 29 7b 0a 20 20 20 20 54 68 5f 45 72 72 6f 72 ){. Th_Error
a740: 4d 65 73 73 61 67 65 28 69 6e 74 65 72 70 2c 20 Message(interp,
a750: 22 45 78 70 65 63 74 65 64 20 6c 69 73 74 2c 20 "Expected list,
a760: 67 6f 74 3a 20 5c 22 22 2c 20 7a 4c 69 73 74 2c got: \"", zList,
a770: 20 6e 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 nList);. }. r
a780: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
a790: 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 ** Append a new
a7a0: 65 6c 65 6d 65 6e 74 20 74 6f 20 61 6e 20 65 78 element to an ex
a7b0: 69 73 74 69 6e 67 20 74 68 31 20 6c 69 73 74 2e isting th1 list.
a7c0: 20 54 68 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 The element to
a7d0: 61 70 70 65 6e 64 20 0a 2a 2a 20 74 6f 20 74 68 append .** to th
a7e0: 65 20 6c 69 73 74 20 69 73 20 28 7a 45 6c 65 6d e list is (zElem
a7f0: 2c 20 6e 45 6c 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 , nElem)..**.**
a800: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 A pointer to the
a810: 20 65 78 69 73 74 69 6e 67 20 6c 69 73 74 20 6d existing list m
a820: 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 61 74 ust be stored at
a830: 20 2a 70 7a 4c 69 73 74 20 77 68 65 6e 20 74 68 *pzList when th
a840: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 is.** function i
a850: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 6c 65 s called. The le
a860: 6e 67 74 68 20 6d 75 73 74 20 62 65 20 73 74 6f ngth must be sto
a870: 72 65 64 20 69 6e 20 2a 70 6e 4c 69 73 74 2e 20 red in *pnList.
a880: 54 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 The value .** of
a890: 20 2a 70 7a 4c 69 73 74 20 6d 75 73 74 20 65 69 *pzList must ei
a8a0: 74 68 65 72 20 62 65 20 4e 55 4c 4c 20 28 69 6e ther be NULL (in
a8b0: 20 77 68 69 63 68 20 63 61 73 65 20 2a 70 6e 4c which case *pnL
a8c0: 69 73 74 20 6d 75 73 74 20 62 65 20 30 29 2c 20 ist must be 0),
a8d0: 6f 72 20 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 or .** a pointer
a8e0: 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 to memory obtai
a8f0: 6e 65 64 20 66 72 6f 6d 20 54 68 5f 4d 61 6c 6c ned from Th_Mall
a900: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 oc()..**.** This
a910: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 function calls
a920: 54 68 5f 46 72 65 65 28 29 20 74 6f 20 66 72 65 Th_Free() to fre
a930: 65 20 74 68 65 20 62 75 66 66 65 72 20 61 74 20 e the buffer at
a940: 2a 70 7a 4c 69 73 74 20 61 6e 64 20 73 65 74 73 *pzList and sets
a950: 0a 2a 2a 20 2a 70 7a 4c 69 73 74 20 74 6f 20 70 .** *pzList to p
a960: 6f 69 6e 74 20 74 6f 20 61 20 6e 65 77 20 62 75 oint to a new bu
a970: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 ffer containing
a980: 74 68 65 20 6e 65 77 20 6c 69 73 74 20 76 61 6c the new list val
a990: 75 65 2e 20 2a 70 6e 4c 69 73 74 0a 2a 2a 20 69 ue. *pnList.** i
a9a0: 73 20 73 69 6d 69 6c 61 72 6c 79 20 75 70 64 61 s similarly upda
a9b0: 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 ted before retur
a9c0: 6e 69 6e 67 2e 20 54 68 65 20 72 65 74 75 72 6e ning. The return
a9d0: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73 value is always
a9e0: 20 54 48 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 45 78 TH_OK..**.** Ex
a9f0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 ample:.**.**
aa00: 20 75 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 uchar *zList =
aa10: 30 3b 0a 2a 2a 20 20 20 20 20 69 6e 74 20 6e 4c 0;.** int nL
aa20: 69 73 74 20 3d 20 30 3b 0a 2a 2a 20 20 20 20 20 ist = 0;.**
aa30: 66 6f 72 20 28 2e 2e 2e 29 20 7b 0a 2a 2a 20 20 for (...) {.**
aa40: 20 20 20 20 20 75 63 68 61 72 20 2a 7a 45 6c 65 uchar *zEle
aa50: 6d 20 3d 20 3c 73 6f 6d 65 20 65 78 70 72 65 73 m = <some expres
aa60: 73 69 6f 6e 3e 3b 0a 2a 2a 20 20 20 20 20 20 20 sion>;.**
aa70: 54 68 5f 4c 69 73 74 41 70 70 65 6e 64 28 69 6e Th_ListAppend(in
aa80: 74 65 72 70 2c 20 26 7a 4c 69 73 74 2c 20 26 6e terp, &zList, &n
aa90: 4c 69 73 74 2c 20 7a 45 6c 65 6d 2c 20 2d 31 29 List, zElem, -1)
aaa0: 3b 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 ;.** }.**
aab0: 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 28 69 Th_SetResult(i
aac0: 6e 74 65 72 70 2c 20 7a 4c 69 73 74 2c 20 6e 4c nterp, zList, nL
aad0: 69 73 74 29 3b 0a 2a 2a 20 20 20 20 20 54 68 5f ist);.** Th_
aae0: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 7a 4c 69 Free(interp, zLi
aaf0: 73 74 29 3b 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 54 st);.**.*/.int T
ab00: 68 5f 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 h_ListAppend(.
ab10: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 Th_Interp *inter
ab20: 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 p, /*
ab30: 49 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 Interpreter cont
ab40: 65 78 74 20 2a 2f 0a 20 20 75 63 68 61 72 20 2a ext */. uchar *
ab50: 2a 70 7a 4c 69 73 74 2c 20 20 20 20 20 20 20 20 *pzList,
ab60: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a /* IN/OUT:
ab70: 20 50 74 72 20 74 6f 20 70 74 72 20 74 6f 20 6c Ptr to ptr to l
ab80: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e ist */. int *pn
ab90: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 List,
aba0: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a /* IN/OUT:
abb0: 20 43 75 72 72 65 6e 74 20 6c 65 6e 67 74 68 20 Current length
abc0: 6f 66 20 2a 70 7a 4c 69 73 74 20 2a 2f 0a 20 20 of *pzList */.
abd0: 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 45 6c const uchar *zEl
abe0: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 em, /*
abf0: 44 61 74 61 20 74 6f 20 61 70 70 65 6e 64 20 2a Data to append *
ac00: 2f 0a 20 20 69 6e 74 20 6e 45 6c 65 6d 20 20 20 /. int nElem
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ac20: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 6e 45 /* Length of nE
ac30: 6c 65 6d 20 2a 2f 0a 29 7b 0a 20 20 42 75 66 66 lem */.){. Buff
ac40: 65 72 20 6f 75 74 70 75 74 3b 0a 20 20 69 6e 74 er output;. int
ac50: 20 69 3b 0a 0a 20 20 69 6e 74 20 68 61 73 53 70 i;.. int hasSp
ac60: 65 63 69 61 6c 43 68 61 72 20 3d 20 30 3b 0a 20 ecialChar = 0;.
ac70: 20 69 6e 74 20 68 61 73 45 73 63 61 70 65 43 68 int hasEscapeCh
ac80: 61 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 ar = 0;. int nB
ac90: 72 61 63 65 20 3d 20 30 3b 0a 0a 20 20 6f 75 74 race = 0;.. out
aca0: 70 75 74 2e 7a 42 75 66 20 3d 20 2a 70 7a 4c 69 put.zBuf = *pzLi
acb0: 73 74 3b 0a 20 20 6f 75 74 70 75 74 2e 6e 42 75 st;. output.nBu
acc0: 66 20 3d 20 2a 70 6e 4c 69 73 74 3b 0a 20 20 6f f = *pnList;. o
acd0: 75 74 70 75 74 2e 6e 42 75 66 41 6c 6c 6f 63 20 utput.nBufAlloc
ace0: 3d 20 6f 75 74 70 75 74 2e 6e 42 75 66 3b 0a 0a = output.nBuf;..
acf0: 20 20 69 66 28 20 6e 45 6c 65 6d 3c 30 20 29 7b if( nElem<0 ){
ad00: 0a 20 20 20 20 6e 45 6c 65 6d 20 3d 20 74 68 5f . nElem = th_
ad10: 73 74 72 6c 65 6e 28 7a 45 6c 65 6d 29 3b 0a 20 strlen(zElem);.
ad20: 20 7d 0a 20 20 69 66 28 20 6f 75 74 70 75 74 2e }. if( output.
ad30: 6e 42 75 66 3e 30 20 29 7b 0a 20 20 20 20 74 68 nBuf>0 ){. th
ad40: 42 75 66 66 65 72 57 72 69 74 65 28 69 6e 74 65 BufferWrite(inte
ad50: 72 70 2c 20 26 6f 75 74 70 75 74 2c 20 22 20 22 rp, &output, " "
ad60: 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 , 1);. }.. for
ad70: 28 69 3d 30 3b 20 69 3c 6e 45 6c 65 6d 3b 20 69 (i=0; i<nElem; i
ad80: 2b 2b 29 7b 0a 20 20 20 20 75 63 68 61 72 20 63 ++){. uchar c
ad90: 20 3d 20 7a 45 6c 65 6d 5b 69 5d 3b 0a 20 20 20 = zElem[i];.
ada0: 20 69 66 28 20 74 68 5f 69 73 73 70 65 63 69 61 if( th_isspecia
adb0: 6c 28 63 29 20 29 20 68 61 73 53 70 65 63 69 61 l(c) ) hasSpecia
adc0: 6c 43 68 61 72 20 3d 20 31 3b 0a 20 20 20 20 69 lChar = 1;. i
add0: 66 28 20 63 3d 3d 27 5c 5c 27 20 29 20 68 61 73 f( c=='\\' ) has
ade0: 45 73 63 61 70 65 43 68 61 72 20 3d 20 31 3b 0a EscapeChar = 1;.
adf0: 20 20 20 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 if( c=='{' )
ae00: 20 6e 42 72 61 63 65 2b 2b 3b 0a 20 20 20 20 69 nBrace++;. i
ae10: 66 28 20 63 3d 3d 27 7d 27 20 29 20 6e 42 72 61 f( c=='}' ) nBra
ae20: 63 65 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 ce--;. }.. if(
ae30: 20 6e 45 6c 65 6d 3d 3d 30 20 7c 7c 20 28 21 68 nElem==0 || (!h
ae40: 61 73 45 73 63 61 70 65 43 68 61 72 20 26 26 20 asEscapeChar &&
ae50: 68 61 73 53 70 65 63 69 61 6c 43 68 61 72 20 26 hasSpecialChar &
ae60: 26 20 6e 42 72 61 63 65 3d 3d 30 29 20 29 7b 0a & nBrace==0) ){.
ae70: 20 20 20 20 74 68 42 75 66 66 65 72 57 72 69 74 thBufferWrit
ae80: 65 28 69 6e 74 65 72 70 2c 20 26 6f 75 74 70 75 e(interp, &outpu
ae90: 74 2c 20 22 7b 22 2c 20 31 29 3b 0a 20 20 20 20 t, "{", 1);.
aea0: 74 68 42 75 66 66 65 72 57 72 69 74 65 28 69 6e thBufferWrite(in
aeb0: 74 65 72 70 2c 20 26 6f 75 74 70 75 74 2c 20 7a terp, &output, z
aec0: 45 6c 65 6d 2c 20 6e 45 6c 65 6d 29 3b 0a 20 20 Elem, nElem);.
aed0: 20 20 74 68 42 75 66 66 65 72 57 72 69 74 65 28 thBufferWrite(
aee0: 69 6e 74 65 72 70 2c 20 26 6f 75 74 70 75 74 2c interp, &output,
aef0: 20 22 7d 22 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 "}", 1);. }els
af00: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 e{. for(i=0;
af10: 69 3c 6e 45 6c 65 6d 3b 20 69 2b 2b 29 7b 0a 20 i<nElem; i++){.
af20: 20 20 20 20 20 75 63 68 61 72 20 63 20 3d 20 7a uchar c = z
af30: 45 6c 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 Elem[i];. i
af40: 66 28 20 74 68 5f 69 73 73 70 65 63 69 61 6c 28 f( th_isspecial(
af50: 63 29 20 29 20 74 68 42 75 66 66 65 72 57 72 69 c) ) thBufferWri
af60: 74 65 28 69 6e 74 65 72 70 2c 20 26 6f 75 74 70 te(interp, &outp
af70: 75 74 2c 20 22 5c 5c 22 2c 20 31 29 3b 0a 20 20 ut, "\\", 1);.
af80: 20 20 20 20 74 68 42 75 66 66 65 72 57 72 69 74 thBufferWrit
af90: 65 28 69 6e 74 65 72 70 2c 20 26 6f 75 74 70 75 e(interp, &outpu
afa0: 74 2c 20 26 63 2c 20 31 29 3b 0a 20 20 20 20 7d t, &c, 1);. }
afb0: 0a 20 20 7d 0a 0a 20 20 2a 70 7a 4c 69 73 74 20 . }.. *pzList
afc0: 3d 20 6f 75 74 70 75 74 2e 7a 42 75 66 3b 0a 20 = output.zBuf;.
afd0: 20 2a 70 6e 4c 69 73 74 20 3d 20 6f 75 74 70 75 *pnList = outpu
afe0: 74 2e 6e 42 75 66 3b 0a 0a 20 20 72 65 74 75 72 t.nBuf;.. retur
aff0: 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a n TH_OK;.}../*.*
b000: 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 * Append a new e
b010: 6c 65 6d 65 6e 74 20 74 6f 20 61 6e 20 65 78 69 lement to an exi
b020: 73 74 69 6e 67 20 74 68 31 20 73 74 72 69 6e 67 sting th1 string
b030: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 . This function
b040: 75 73 65 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 uses.** the same
b050: 20 69 6e 74 65 72 66 61 63 65 20 61 73 20 74 68 interface as th
b060: 65 20 54 68 5f 4c 69 73 74 41 70 70 65 6e 64 28 e Th_ListAppend(
b070: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 ) function..*/.i
b080: 6e 74 20 54 68 5f 53 74 72 69 6e 67 41 70 70 65 nt Th_StringAppe
b090: 6e 64 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 nd(. Th_Interp
b0a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 *interp,
b0b0: 20 20 20 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 /* Interprete
b0c0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 75 r context */. u
b0d0: 63 68 61 72 20 2a 2a 70 7a 53 74 72 2c 20 20 20 char **pzStr,
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
b0f0: 4e 2f 4f 55 54 3a 20 50 74 72 20 74 6f 20 70 74 N/OUT: Ptr to pt
b100: 72 20 74 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 r to list */. i
b110: 6e 74 20 2a 70 6e 53 74 72 2c 20 20 20 20 20 20 nt *pnStr,
b120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
b130: 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 6c N/OUT: Current l
b140: 65 6e 67 74 68 20 6f 66 20 2a 70 7a 53 74 72 20 ength of *pzStr
b150: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 63 68 61 72 */. const uchar
b160: 20 2a 7a 45 6c 65 6d 2c 20 20 20 20 20 20 20 20 *zElem,
b170: 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 61 70 70 /* Data to app
b180: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c end */. int nEl
b190: 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 em
b1a0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 /* Length
b1b0: 6f 66 20 6e 45 6c 65 6d 20 2a 2f 0a 29 7b 0a 20 of nElem */.){.
b1c0: 20 75 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 uchar *zNew;.
b1d0: 69 6e 74 20 6e 4e 65 77 3b 0a 0a 20 20 69 66 28 int nNew;.. if(
b1e0: 20 6e 45 6c 65 6d 3c 30 20 29 7b 0a 20 20 20 20 nElem<0 ){.
b1f0: 6e 45 6c 65 6d 20 3d 20 74 68 5f 73 74 72 6c 65 nElem = th_strle
b200: 6e 28 7a 45 6c 65 6d 29 3b 0a 20 20 7d 0a 0a 20 n(zElem);. }..
b210: 20 6e 4e 65 77 20 3d 20 2a 70 6e 53 74 72 20 2b nNew = *pnStr +
b220: 20 6e 45 6c 65 6d 3b 0a 20 20 7a 4e 65 77 20 3d nElem;. zNew =
b230: 20 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 72 Th_Malloc(inter
b240: 70 2c 20 6e 4e 65 77 29 3b 0a 20 20 6d 65 6d 63 p, nNew);. memc
b250: 70 79 28 7a 4e 65 77 2c 20 2a 70 7a 53 74 72 2c py(zNew, *pzStr,
b260: 20 2a 70 6e 53 74 72 29 3b 0a 20 20 6d 65 6d 63 *pnStr);. memc
b270: 70 79 28 26 7a 4e 65 77 5b 2a 70 6e 53 74 72 5d py(&zNew[*pnStr]
b280: 2c 20 7a 45 6c 65 6d 2c 20 6e 45 6c 65 6d 29 3b , zElem, nElem);
b290: 0a 0a 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 .. Th_Free(inte
b2a0: 72 70 2c 20 2a 70 7a 53 74 72 29 3b 0a 20 20 2a rp, *pzStr);. *
b2b0: 70 7a 53 74 72 20 3d 20 7a 4e 65 77 3b 0a 20 20 pzStr = zNew;.
b2c0: 2a 70 6e 53 74 72 20 3d 20 6e 4e 65 77 3b 0a 0a *pnStr = nNew;..
b2d0: 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a return TH_OK;.
b2e0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 44 65 6c 65 74 65 }../* .** Delete
b2f0: 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e an interpreter.
b300: 0a 2a 2f 0a 76 6f 69 64 20 54 68 5f 44 65 6c 65 .*/.void Th_Dele
b310: 74 65 49 6e 74 65 72 70 28 54 68 5f 49 6e 74 65 teInterp(Th_Inte
b320: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 61 rp *interp){. a
b330: 73 73 65 72 74 28 69 6e 74 65 72 70 2d 3e 70 46 ssert(interp->pF
b340: 72 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 rame);. assert(
b350: 30 3d 3d 69 6e 74 65 72 70 2d 3e 70 46 72 61 6d 0==interp->pFram
b360: 65 2d 3e 70 43 61 6c 6c 65 72 29 3b 0a 0a 20 20 e->pCaller);..
b370: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f /* Delete the co
b380: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 67 6c ntents of the gl
b390: 6f 62 61 6c 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 obal frame. */.
b3a0: 20 74 68 50 6f 70 46 72 61 6d 65 28 69 6e 74 65 thPopFrame(inte
b3b0: 72 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 rp);.. /* Delet
b3c0: 65 20 61 6e 79 20 72 65 73 75 6c 74 20 63 75 72 e any result cur
b3d0: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e rently stored in
b3e0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
b3f0: 2e 20 2a 2f 0a 20 20 54 68 5f 53 65 74 52 65 73 . */. Th_SetRes
b400: 75 6c 74 28 69 6e 74 65 72 70 2c 20 30 2c 20 30 ult(interp, 0, 0
b410: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 );.. /* Delete
b420: 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20 63 all registered c
b430: 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 74 68 65 20 ommands and the
b440: 63 6f 6d 6d 61 6e 64 20 68 61 73 68 2d 74 61 62 command hash-tab
b450: 6c 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 le itself. */.
b460: 54 68 5f 48 61 73 68 49 74 65 72 61 74 65 28 69 Th_HashIterate(i
b470: 6e 74 65 72 70 2c 20 69 6e 74 65 72 70 2d 3e 70 nterp, interp->p
b480: 61 43 6d 64 2c 20 74 68 46 72 65 65 43 6f 6d 6d aCmd, thFreeComm
b490: 61 6e 64 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 and, (void *)int
b4a0: 65 72 70 29 3b 0a 20 20 54 68 5f 48 61 73 68 44 erp);. Th_HashD
b4b0: 65 6c 65 74 65 28 69 6e 74 65 72 70 2c 20 69 6e elete(interp, in
b4c0: 74 65 72 70 2d 3e 70 61 43 6d 64 29 3b 0a 0a 20 terp->paCmd);..
b4d0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 /* Delete the i
b4e0: 6e 74 65 72 70 72 65 74 65 72 20 73 74 72 75 63 nterpreter struc
b4f0: 74 75 72 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a ture itself. */.
b500: 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 72 70 Th_Free(interp
b510: 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 , (void *)interp
b520: 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 72 65 );.}../* .** Cre
b530: 61 74 65 20 61 20 6e 65 77 20 69 6e 74 65 72 70 ate a new interp
b540: 72 65 74 65 72 2e 0a 2a 2f 0a 54 68 5f 49 6e 74 reter..*/.Th_Int
b550: 65 72 70 20 2a 20 54 68 5f 43 72 65 61 74 65 49 erp * Th_CreateI
b560: 6e 74 65 72 70 28 54 68 5f 56 74 61 62 20 2a 70 nterp(Th_Vtab *p
b570: 56 74 61 62 29 7b 0a 20 20 54 68 5f 49 6e 74 65 Vtab){. Th_Inte
b580: 72 70 20 2a 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c rp *p;.. /* All
b590: 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 ocate and initia
b5a0: 6c 69 73 65 20 74 68 65 20 69 6e 74 65 72 70 72 lise the interpr
b5b0: 65 74 65 72 20 61 6e 64 20 74 68 65 20 67 6c 6f eter and the glo
b5c0: 62 61 6c 20 66 72 61 6d 65 20 2a 2f 0a 20 20 70 bal frame */. p
b5d0: 20 3d 20 70 56 74 61 62 2d 3e 78 4d 61 6c 6c 6f = pVtab->xMallo
b5e0: 63 28 73 69 7a 65 6f 66 28 54 68 5f 49 6e 74 65 c(sizeof(Th_Inte
b5f0: 72 70 29 20 2b 20 73 69 7a 65 6f 66 28 54 68 5f rp) + sizeof(Th_
b600: 46 72 61 6d 65 29 29 3b 0a 20 20 6d 65 6d 73 65 Frame));. memse
b610: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 54 t(p, 0, sizeof(T
b620: 68 5f 49 6e 74 65 72 70 29 29 3b 0a 20 20 70 2d h_Interp));. p-
b630: 3e 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a >pVtab = pVtab;.
b640: 20 20 70 2d 3e 70 61 43 6d 64 20 3d 20 54 68 5f p->paCmd = Th_
b650: 48 61 73 68 4e 65 77 28 70 29 3b 0a 20 20 74 68 HashNew(p);. th
b660: 50 75 73 68 46 72 61 6d 65 28 70 2c 20 28 54 68 PushFrame(p, (Th
b670: 5f 46 72 61 6d 65 20 2a 29 26 70 5b 31 5d 29 3b _Frame *)&p[1]);
b680: 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a .. return p;.}.
b690: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 74 77 6f ./*.** These two
b6a0: 20 74 79 70 65 73 20 61 72 65 20 75 73 65 64 20 types are used
b6b0: 6f 6e 6c 79 20 62 79 20 74 68 65 20 65 78 70 72 only by the expr
b6c0: 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65 2c 20 77 ession module, w
b6d0: 68 65 72 65 0a 2a 2a 20 74 68 65 20 65 78 70 72 here.** the expr
b6e0: 65 73 73 69 6f 6e 20 6d 6f 64 75 6c 65 20 6d 65 ession module me
b6f0: 61 6e 73 20 74 68 65 20 54 68 5f 45 78 70 72 28 ans the Th_Expr(
b700: 29 20 61 6e 64 20 65 78 70 72 58 58 58 28 29 20 ) and exprXXX()
b710: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 functions..*/.ty
b720: 70 65 64 65 66 20 73 74 72 75 63 74 20 4f 70 65 pedef struct Ope
b730: 72 61 74 6f 72 20 4f 70 65 72 61 74 6f 72 3b 0a rator Operator;.
b740: 73 74 72 75 63 74 20 4f 70 65 72 61 74 6f 72 20 struct Operator
b750: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a {. const char *
b760: 7a 4f 70 3b 0a 20 20 69 6e 74 20 65 4f 70 3b 0a zOp;. int eOp;.
b770: 20 20 69 6e 74 20 69 50 72 65 63 65 64 65 6e 63 int iPrecedenc
b780: 65 3b 0a 20 20 69 6e 74 20 65 41 72 67 54 79 70 e;. int eArgTyp
b790: 65 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 e;.};.typedef st
b7a0: 72 75 63 74 20 45 78 70 72 20 45 78 70 72 3b 0a ruct Expr Expr;.
b7b0: 73 74 72 75 63 74 20 45 78 70 72 20 7b 0a 20 20 struct Expr {.
b7c0: 4f 70 65 72 61 74 6f 72 20 2a 70 4f 70 3b 0a 20 Operator *pOp;.
b7d0: 20 45 78 70 72 20 2a 70 50 61 72 65 6e 74 3b 0a Expr *pParent;.
b7e0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 Expr *pLeft;.
b7f0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a Expr *pRight;..
b800: 20 20 75 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b uchar *zValue;
b810: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 /* Pointer
b820: 74 6f 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 to literal value
b830: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 75 65 */. int nValue
b840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 ; /* Leng
b850: 74 68 20 6f 66 20 6c 69 74 65 72 61 6c 20 76 61 th of literal va
b860: 6c 75 65 20 62 75 66 66 65 72 20 2a 2f 0a 7d 3b lue buffer */.};
b870: 0a 0a 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 ../* Unary opera
b880: 74 6f 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 tors */.#define
b890: 4f 50 5f 55 4e 41 52 59 5f 4d 49 4e 55 53 20 20 OP_UNARY_MINUS
b8a0: 32 0a 23 64 65 66 69 6e 65 20 4f 50 5f 55 4e 41 2.#define OP_UNA
b8b0: 52 59 5f 50 4c 55 53 20 20 20 33 0a 23 64 65 66 RY_PLUS 3.#def
b8c0: 69 6e 65 20 4f 50 5f 42 49 54 57 49 53 45 5f 4e ine OP_BITWISE_N
b8d0: 4f 54 20 20 34 0a 23 64 65 66 69 6e 65 20 4f 50 OT 4.#define OP
b8e0: 5f 4c 4f 47 49 43 41 4c 5f 4e 4f 54 20 20 35 0a _LOGICAL_NOT 5.
b8f0: 0a 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 ./* Binary opera
b900: 74 6f 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 tors */.#define
b910: 4f 50 5f 4d 55 4c 54 49 50 4c 59 20 20 20 20 20 OP_MULTIPLY
b920: 36 0a 23 64 65 66 69 6e 65 20 4f 50 5f 44 49 56 6.#define OP_DIV
b930: 49 44 45 20 20 20 20 20 20 20 37 0a 23 64 65 66 IDE 7.#def
b940: 69 6e 65 20 4f 50 5f 4d 4f 44 55 4c 55 53 20 20 ine OP_MODULUS
b950: 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20 4f 50 8.#define OP
b960: 5f 41 44 44 20 20 20 20 20 20 20 20 20 20 39 0a _ADD 9.
b970: 23 64 65 66 69 6e 65 20 4f 50 5f 53 55 42 54 52 #define OP_SUBTR
b980: 41 43 54 20 20 20 20 31 30 0a 23 64 65 66 69 6e ACT 10.#defin
b990: 65 20 4f 50 5f 4c 45 46 54 53 48 49 46 54 20 20 e OP_LEFTSHIFT
b9a0: 20 31 31 0a 23 64 65 66 69 6e 65 20 4f 50 5f 52 11.#define OP_R
b9b0: 49 47 48 54 53 48 49 46 54 20 20 31 32 0a 23 64 IGHTSHIFT 12.#d
b9c0: 65 66 69 6e 65 20 4f 50 5f 4c 54 20 20 20 20 20 efine OP_LT
b9d0: 20 20 20 20 20 31 33 0a 23 64 65 66 69 6e 65 20 13.#define
b9e0: 4f 50 5f 47 54 20 20 20 20 20 20 20 20 20 20 31 OP_GT 1
b9f0: 34 0a 23 64 65 66 69 6e 65 20 4f 50 5f 4c 45 20 4.#define OP_LE
ba00: 20 20 20 20 20 20 20 20 20 31 35 0a 23 64 65 66 15.#def
ba10: 69 6e 65 20 4f 50 5f 47 45 20 20 20 20 20 20 20 ine OP_GE
ba20: 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 4f 50 16.#define OP
ba30: 5f 45 51 20 20 20 20 20 20 20 20 20 20 31 37 0a _EQ 17.
ba40: 23 64 65 66 69 6e 65 20 4f 50 5f 4e 45 20 20 20 #define OP_NE
ba50: 20 20 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e 18.#defin
ba60: 65 20 4f 50 5f 53 45 51 20 20 20 20 20 20 20 20 e OP_SEQ
ba70: 20 31 39 0a 23 64 65 66 69 6e 65 20 4f 50 5f 53 19.#define OP_S
ba80: 4e 45 20 20 20 20 20 20 20 20 20 32 30 0a 23 64 NE 20.#d
ba90: 65 66 69 6e 65 20 4f 50 5f 42 49 54 57 49 53 45 efine OP_BITWISE
baa0: 5f 41 4e 44 20 32 31 0a 23 64 65 66 69 6e 65 20 _AND 21.#define
bab0: 4f 50 5f 42 49 54 57 49 53 45 5f 58 4f 52 20 32 OP_BITWISE_XOR 2
bac0: 32 0a 23 64 65 66 69 6e 65 20 4f 50 5f 42 49 54 2.#define OP_BIT
bad0: 57 49 53 45 5f 4f 52 20 20 32 34 0a 23 64 65 66 WISE_OR 24.#def
bae0: 69 6e 65 20 4f 50 5f 4c 4f 47 49 43 41 4c 5f 41 ine OP_LOGICAL_A
baf0: 4e 44 20 32 35 0a 23 64 65 66 69 6e 65 20 4f 50 ND 25.#define OP
bb00: 5f 4c 4f 47 49 43 41 4c 5f 4f 52 20 20 32 36 0a _LOGICAL_OR 26.
bb10: 0a 2f 2a 20 4f 74 68 65 72 20 73 79 6d 62 6f 6c ./* Other symbol
bb20: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50 5f s */.#define OP_
bb30: 4f 50 45 4e 5f 42 52 41 43 4b 45 54 20 20 32 37 OPEN_BRACKET 27
bb40: 0a 23 64 65 66 69 6e 65 20 4f 50 5f 43 4c 4f 53 .#define OP_CLOS
bb50: 45 5f 42 52 41 43 4b 45 54 20 32 38 0a 0a 2f 2a E_BRACKET 28../*
bb60: 20 41 72 67 75 6d 65 6e 74 20 74 79 70 65 73 2e Argument types.
bb70: 20 45 61 63 68 20 6f 70 65 72 61 74 6f 72 20 69 Each operator i
bb80: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e n the expression
bb90: 20 73 79 6e 74 61 78 20 69 73 20 64 65 66 69 6e syntax is defin
bba0: 65 64 0a 2a 2a 20 61 73 20 72 65 71 75 69 72 69 ed.** as requiri
bbb0: 6e 67 20 65 69 74 68 65 72 20 69 6e 74 65 67 65 ng either intege
bbc0: 72 2c 20 6e 75 6d 62 65 72 20 28 72 65 61 6c 20 r, number (real
bbd0: 6f 72 20 69 6e 74 65 67 65 72 29 20 6f 72 20 73 or integer) or s
bbe0: 74 72 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 6e 64 tring.** operand
bbf0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 s..*/.#define AR
bc00: 47 5f 49 4e 54 45 47 45 52 20 31 0a 23 64 65 66 G_INTEGER 1.#def
bc10: 69 6e 65 20 41 52 47 5f 4e 55 4d 42 45 52 20 20 ine ARG_NUMBER
bc20: 32 0a 23 64 65 66 69 6e 65 20 41 52 47 5f 53 54 2.#define ARG_ST
bc30: 52 49 4e 47 20 20 33 0a 0a 73 74 61 74 69 63 20 RING 3..static
bc40: 4f 70 65 72 61 74 6f 72 20 61 4f 70 65 72 61 74 Operator aOperat
bc50: 6f 72 5b 5d 20 3d 20 7b 0a 0a 20 20 7b 22 28 22 or[] = {.. {"("
bc60: 2c 20 20 4f 50 5f 4f 50 45 4e 5f 42 52 41 43 4b , OP_OPEN_BRACK
bc70: 45 54 2c 20 20 20 2d 31 2c 20 30 7d 2c 0a 20 20 ET, -1, 0},.
bc80: 7b 22 29 22 2c 20 20 4f 50 5f 43 4c 4f 53 45 5f {")", OP_CLOSE_
bc90: 42 52 41 43 4b 45 54 2c 20 2d 31 2c 20 30 7d 2c BRACKET, -1, 0},
bca0: 0a 0a 20 20 2f 2a 20 4e 6f 74 65 3a 20 61 6c 6c .. /* Note: all
bcb0: 20 75 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 73 unary operators
bcc0: 20 68 61 76 65 20 28 69 50 72 65 63 65 64 65 6e have (iPreceden
bcd0: 63 65 3d 3d 31 29 20 2a 2f 0a 20 20 7b 22 2d 22 ce==1) */. {"-"
bce0: 2c 20 20 4f 50 5f 55 4e 41 52 59 5f 4d 49 4e 55 , OP_UNARY_MINU
bcf0: 53 2c 20 20 20 20 31 2c 20 41 52 47 5f 4e 55 4d S, 1, ARG_NUM
bd00: 42 45 52 7d 2c 0a 20 20 7b 22 2b 22 2c 20 20 4f BER},. {"+", O
bd10: 50 5f 55 4e 41 52 59 5f 50 4c 55 53 2c 20 20 20 P_UNARY_PLUS,
bd20: 20 20 31 2c 20 41 52 47 5f 4e 55 4d 42 45 52 7d 1, ARG_NUMBER}
bd30: 2c 0a 20 20 7b 22 7e 22 2c 20 20 4f 50 5f 42 49 ,. {"~", OP_BI
bd40: 54 57 49 53 45 5f 4e 4f 54 2c 20 20 20 20 31 2c TWISE_NOT, 1,
bd50: 20 41 52 47 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 ARG_INTEGER},.
bd60: 20 7b 22 21 22 2c 20 20 4f 50 5f 4c 4f 47 49 43 {"!", OP_LOGIC
bd70: 41 4c 5f 4e 4f 54 2c 20 20 20 20 31 2c 20 41 52 AL_NOT, 1, AR
bd80: 47 5f 49 4e 54 45 47 45 52 7d 2c 0a 0a 20 20 2f G_INTEGER},.. /
bd90: 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f * Binary operato
bda0: 72 73 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74 rs. It is import
bdb0: 61 6e 74 20 74 6f 20 74 68 65 20 70 61 72 73 69 ant to the parsi
bdc0: 6e 67 20 69 6e 20 54 68 5f 45 78 70 72 28 29 20 ng in Th_Expr()
bdd0: 74 68 61 74 0a 20 20 20 2a 20 74 68 65 20 74 77 that. * the tw
bde0: 6f 2d 63 68 61 72 61 63 74 65 72 20 73 79 6d 62 o-character symb
bdf0: 6f 6c 73 20 28 22 3d 3d 22 29 20 61 70 70 65 61 ols ("==") appea
be00: 72 20 62 65 66 6f 72 65 20 74 68 65 20 6f 6e 65 r before the one
be10: 2d 63 68 61 72 61 63 74 65 72 20 0a 20 20 20 2a -character . *
be20: 20 6f 6e 65 73 20 28 22 3d 22 29 2e 20 41 6e 64 ones ("="). And
be30: 20 74 68 61 74 20 74 68 65 20 70 72 69 6f 72 69 that the priori
be40: 74 69 65 73 20 6f 66 20 61 6c 6c 20 62 69 6e 61 ties of all bina
be50: 72 79 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 ry operators are
be60: 0a 20 20 20 2a 20 69 6e 74 65 67 65 72 73 20 62 . * integers b
be70: 65 74 77 65 65 6e 20 32 20 61 6e 64 20 31 32 2e etween 2 and 12.
be80: 0a 20 20 20 2a 2f 0a 20 20 7b 22 3c 3c 22 2c 20 . */. {"<<",
be90: 4f 50 5f 4c 45 46 54 53 48 49 46 54 2c 20 20 20 OP_LEFTSHIFT,
bea0: 20 20 20 34 2c 20 41 52 47 5f 49 4e 54 45 47 45 4, ARG_INTEGE
beb0: 52 7d 2c 0a 20 20 7b 22 3e 3e 22 2c 20 4f 50 5f R},. {">>", OP_
bec0: 52 49 47 48 54 53 48 49 46 54 2c 20 20 20 20 20 RIGHTSHIFT,
bed0: 34 2c 20 41 52 47 5f 49 4e 54 45 47 45 52 7d 2c 4, ARG_INTEGER},
bee0: 0a 20 20 7b 22 3c 3d 22 2c 20 4f 50 5f 4c 45 2c . {"<=", OP_LE,
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 2c 20 5,
bf00: 41 52 47 5f 4e 55 4d 42 45 52 7d 2c 0a 20 20 7b ARG_NUMBER},. {
bf10: 22 3e 3d 22 2c 20 4f 50 5f 47 45 2c 20 20 20 20 ">=", OP_GE,
bf20: 20 20 20 20 20 20 20 20 20 35 2c 20 41 52 47 5f 5, ARG_
bf30: 4e 55 4d 42 45 52 7d 2c 0a 20 20 7b 22 3d 3d 22 NUMBER},. {"=="
bf40: 2c 20 4f 50 5f 45 51 2c 20 20 20 20 20 20 20 20 , OP_EQ,
bf50: 20 20 20 20 20 36 2c 20 41 52 47 5f 4e 55 4d 42 6, ARG_NUMB
bf60: 45 52 7d 2c 0a 20 20 7b 22 21 3d 22 2c 20 4f 50 ER},. {"!=", OP
bf70: 5f 4e 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 _NE,
bf80: 20 36 2c 20 41 52 47 5f 4e 55 4d 42 45 52 7d 2c 6, ARG_NUMBER},
bf90: 0a 20 20 7b 22 65 71 22 2c 20 4f 50 5f 53 45 51 . {"eq", OP_SEQ
bfa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 37 2c 20 , 7,
bfb0: 41 52 47 5f 53 54 52 49 4e 47 7d 2c 0a 20 20 7b ARG_STRING},. {
bfc0: 22 6e 65 22 2c 20 4f 50 5f 53 4e 45 2c 20 20 20 "ne", OP_SNE,
bfd0: 20 20 20 20 20 20 20 20 20 37 2c 20 41 52 47 5f 7, ARG_
bfe0: 53 54 52 49 4e 47 7d 2c 0a 20 20 7b 22 26 26 22 STRING},. {"&&"
bff0: 2c 20 4f 50 5f 4c 4f 47 49 43 41 4c 5f 41 4e 44 , OP_LOGICAL_AND
c000: 2c 20 20 20 31 31 2c 20 41 52 47 5f 49 4e 54 45 , 11, ARG_INTE
c010: 47 45 52 7d 2c 0a 20 20 7b 22 7c 7c 22 2c 20 4f GER},. {"||", O
c020: 50 5f 4c 4f 47 49 43 41 4c 5f 4f 52 2c 20 20 20 P_LOGICAL_OR,
c030: 20 31 32 2c 20 41 52 47 5f 49 4e 54 45 47 45 52 12, ARG_INTEGER
c040: 7d 2c 0a 0a 20 20 7b 22 2a 22 2c 20 20 4f 50 5f },.. {"*", OP_
c050: 4d 55 4c 54 49 50 4c 59 2c 20 20 20 20 20 20 20 MULTIPLY,
c060: 32 2c 20 41 52 47 5f 4e 55 4d 42 45 52 7d 2c 0a 2, ARG_NUMBER},.
c070: 20 20 7b 22 2f 22 2c 20 20 4f 50 5f 44 49 56 49 {"/", OP_DIVI
c080: 44 45 2c 20 20 20 20 20 20 20 20 20 32 2c 20 41 DE, 2, A
c090: 52 47 5f 4e 55 4d 42 45 52 7d 2c 0a 20 20 7b 22 RG_NUMBER},. {"
c0a0: 25 22 2c 20 20 4f 50 5f 4d 4f 44 55 4c 55 53 2c %", OP_MODULUS,
c0b0: 20 20 20 20 20 20 20 20 32 2c 20 41 52 47 5f 49 2, ARG_I
c0c0: 4e 54 45 47 45 52 7d 2c 0a 20 20 7b 22 2b 22 2c NTEGER},. {"+",
c0d0: 20 20 4f 50 5f 41 44 44 2c 20 20 20 20 20 20 20 OP_ADD,
c0e0: 20 20 20 20 20 33 2c 20 41 52 47 5f 4e 55 4d 42 3, ARG_NUMB
c0f0: 45 52 7d 2c 0a 20 20 7b 22 2d 22 2c 20 20 4f 50 ER},. {"-", OP
c100: 5f 53 55 42 54 52 41 43 54 2c 20 20 20 20 20 20 _SUBTRACT,
c110: 20 33 2c 20 41 52 47 5f 4e 55 4d 42 45 52 7d 2c 3, ARG_NUMBER},
c120: 0a 20 20 7b 22 3c 22 2c 20 20 4f 50 5f 4c 54 2c . {"<", OP_LT,
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 2c 20 5,
c140: 41 52 47 5f 4e 55 4d 42 45 52 7d 2c 0a 20 20 7b ARG_NUMBER},. {
c150: 22 3e 22 2c 20 20 4f 50 5f 47 54 2c 20 20 20 20 ">", OP_GT,
c160: 20 20 20 20 20 20 20 20 20 35 2c 20 41 52 47 5f 5, ARG_
c170: 4e 55 4d 42 45 52 7d 2c 0a 20 20 7b 22 26 22 2c NUMBER},. {"&",
c180: 20 20 4f 50 5f 42 49 54 57 49 53 45 5f 41 4e 44 OP_BITWISE_AND
c190: 2c 20 20 20 20 38 2c 20 41 52 47 5f 49 4e 54 45 , 8, ARG_INTE
c1a0: 47 45 52 7d 2c 0a 20 20 7b 22 5e 22 2c 20 20 4f GER},. {"^", O
c1b0: 50 5f 42 49 54 57 49 53 45 5f 58 4f 52 2c 20 20 P_BITWISE_XOR,
c1c0: 20 20 39 2c 20 41 52 47 5f 49 4e 54 45 47 45 52 9, ARG_INTEGER
c1d0: 7d 2c 0a 20 20 7b 22 7c 22 2c 20 20 4f 50 5f 42 },. {"|", OP_B
c1e0: 49 54 57 49 53 45 5f 4f 52 2c 20 20 20 20 31 30 ITWISE_OR, 10
c1f0: 2c 20 41 52 47 5f 49 4e 54 45 47 45 52 7d 2c 0a , ARG_INTEGER},.
c200: 0a 20 20 7b 30 2c 30 2c 30 7d 0a 7d 3b 0a 0a 2f . {0,0,0}.};../
c210: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 *.** The first p
c220: 61 72 74 20 6f 66 20 74 68 65 20 73 74 72 69 6e art of the strin
c230: 67 20 28 7a 49 6e 70 75 74 2c 6e 49 6e 70 75 74 g (zInput,nInput
c240: 29 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6d ) contains a num
c250: 62 65 72 2e 0a 2a 2a 20 53 65 74 20 2a 70 6e 56 ber..** Set *pnV
c260: 61 72 6e 61 6d 65 20 74 6f 20 74 68 65 20 6e 75 arname to the nu
c270: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
c280: 20 74 68 65 20 6e 75 6d 65 72 69 63 20 73 74 72 the numeric str
c290: 69 6e 67 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 ing. .*/.static
c2a0: 69 6e 74 20 74 68 4e 65 78 74 4e 75 6d 62 65 72 int thNextNumber
c2b0: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 (. Th_Interp *i
c2c0: 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 nterp, . const
c2d0: 75 63 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20 0a uchar *zInput, .
c2e0: 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 0a 20 int nInput, .
c2f0: 20 69 6e 74 20 2a 70 6e 4c 69 74 65 72 61 6c 0a int *pnLiteral.
c300: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e ){. int i;. in
c310: 74 20 73 65 65 6e 44 6f 74 20 3d 20 30 3b 0a 20 t seenDot = 0;.
c320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 for(i=0; i<nInp
c330: 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 63 ut; i++){. uc
c340: 68 61 72 20 63 20 3d 20 7a 49 6e 70 75 74 5b 69 har c = zInput[i
c350: 5d 3b 0a 20 20 20 20 69 66 28 20 28 73 65 65 6e ];. if( (seen
c360: 44 6f 74 20 7c 7c 20 63 21 3d 27 2e 27 29 20 26 Dot || c!='.') &
c370: 26 20 21 74 68 5f 69 73 64 69 67 69 74 28 63 29 & !th_isdigit(c)
c380: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 ) break;. if
c390: 28 20 63 3d 3d 27 2e 27 20 29 20 73 65 65 6e 44 ( c=='.' ) seenD
c3a0: 6f 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2a 70 ot = 1;. }. *p
c3b0: 6e 4c 69 74 65 72 61 6c 20 3d 20 69 3b 0a 20 20 nLiteral = i;.
c3c0: 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a return TH_OK;.}.
c3d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 65 ./*.** Free an e
c3e0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a xpression tree..
c3f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 */.static void e
c400: 78 70 72 46 72 65 65 28 54 68 5f 49 6e 74 65 72 xprFree(Th_Inter
c410: 70 20 2a 69 6e 74 65 72 70 2c 20 45 78 70 72 20 p *interp, Expr
c420: 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 *pExpr){. if( p
c430: 45 78 70 72 20 29 7b 0a 20 20 20 20 65 78 70 72 Expr ){. expr
c440: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 70 45 78 Free(interp, pEx
c450: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 pr->pLeft);.
c460: 65 78 70 72 46 72 65 65 28 69 6e 74 65 72 70 2c exprFree(interp,
c470: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b pExpr->pRight);
c480: 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69 6e 74 . Th_Free(int
c490: 65 72 70 2c 20 70 45 78 70 72 2d 3e 7a 56 61 6c erp, pExpr->zVal
c4a0: 75 65 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 ue);. Th_Free
c4b0: 28 69 6e 74 65 72 70 2c 20 70 45 78 70 72 29 3b (interp, pExpr);
c4c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 . }.}../*.** Ev
c4d0: 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 aluate an expres
c4e0: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 sion tree..*/.st
c4f0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 45 76 61 atic int exprEva
c500: 6c 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 l(Th_Interp *int
c510: 65 72 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 erp, Expr *pExpr
c520: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 48 ){. int rc = TH
c530: 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 _OK;.. if( pExp
c540: 72 2d 3e 70 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 r->pOp==0 ){.
c550: 20 2f 2a 20 41 20 6c 69 74 65 72 61 6c 20 2a 2f /* A literal */
c560: 0a 20 20 20 20 72 63 20 3d 20 74 68 53 75 62 73 . rc = thSubs
c570: 74 57 6f 72 64 28 69 6e 74 65 72 70 2c 20 70 45 tWord(interp, pE
c580: 78 70 72 2d 3e 7a 56 61 6c 75 65 2c 20 70 45 78 xpr->zValue, pEx
c590: 70 72 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d pr->nValue);. }
c5a0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 41 else{. int eA
c5b0: 72 67 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 rgType;
c5c0: 20 20 2f 2a 20 41 63 74 75 61 6c 20 74 79 70 65 /* Actual type
c5d0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f of arguments */
c5e0: 0a 0a 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e .. /* Argumen
c5f0: 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 t values */.
c600: 69 6e 74 20 69 4c 65 66 74 3b 0a 20 20 20 20 69 int iLeft;. i
c610: 6e 74 20 69 52 69 67 68 74 3b 0a 20 20 20 20 64 nt iRight;. d
c620: 6f 75 62 6c 65 20 66 4c 65 66 74 3b 0a 20 20 20 ouble fLeft;.
c630: 20 64 6f 75 62 6c 65 20 66 52 69 67 68 74 3b 0a double fRight;.
c640: 0a 20 20 20 20 2f 2a 20 4c 65 66 74 20 61 6e 64 . /* Left and
c650: 20 72 69 67 68 74 20 61 72 67 75 6d 65 6e 74 73 right arguments
c660: 20 61 73 20 73 74 72 69 6e 67 73 20 2a 2f 0a 20 as strings */.
c670: 20 20 20 75 63 68 61 72 20 2a 7a 4c 65 66 74 20 uchar *zLeft
c680: 3d 20 30 3b 20 69 6e 74 20 6e 4c 65 66 74 3b 0a = 0; int nLeft;.
c690: 20 20 20 20 75 63 68 61 72 20 2a 7a 52 69 67 68 uchar *zRigh
c6a0: 74 20 3d 20 30 3b 20 69 6e 74 20 6e 52 69 67 68 t = 0; int nRigh
c6b0: 74 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 75 t;.. /* Evalu
c6c0: 61 74 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 ate left and rig
c6d0: 68 74 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 ht arguments, if
c6e0: 20 74 68 65 79 20 65 78 69 73 74 2e 20 2a 2f 0a they exist. */.
c6f0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 if( pExpr->p
c700: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 72 63 Left ){. rc
c710: 20 3d 20 65 78 70 72 45 76 61 6c 28 69 6e 74 65 = exprEval(inte
c720: 72 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 rp, pExpr->pLeft
c730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d );. if( rc=
c740: 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 =TH_OK ){.
c750: 20 20 7a 4c 65 66 74 20 3d 20 54 68 5f 54 61 6b zLeft = Th_Tak
c760: 65 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 eResult(interp,
c770: 26 6e 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d &nLeft);. }
c780: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 . }. if( r
c790: 63 3d 3d 54 48 5f 4f 4b 20 26 26 20 70 45 78 70 c==TH_OK && pExp
c7a0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 r->pRight ){.
c7b0: 20 20 20 72 63 20 3d 20 65 78 70 72 45 76 61 6c rc = exprEval
c7c0: 28 69 6e 74 65 72 70 2c 20 70 45 78 70 72 2d 3e (interp, pExpr->
c7d0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 pRight);. i
c7e0: 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a f( rc==TH_OK ){.
c7f0: 20 20 20 20 20 20 20 20 7a 52 69 67 68 74 20 3d zRight =
c800: 20 54 68 5f 54 61 6b 65 52 65 73 75 6c 74 28 69 Th_TakeResult(i
c810: 6e 74 65 72 70 2c 20 26 6e 52 69 67 68 74 29 3b nterp, &nRight);
c820: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a . }. }..
c830: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 /* Convert a
c840: 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 69 rguments to thei
c850: 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 6d 73 r required forms
c860: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d . */. if( rc=
c870: 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 =TH_OK ){.
c880: 65 41 72 67 54 79 70 65 20 3d 20 70 45 78 70 72 eArgType = pExpr
c890: 2d 3e 70 4f 70 2d 3e 65 41 72 67 54 79 70 65 3b ->pOp->eArgType;
c8a0: 0a 20 20 20 20 20 20 69 66 28 20 65 41 72 67 54 . if( eArgT
c8b0: 79 70 65 3d 3d 41 52 47 5f 4e 55 4d 42 45 52 20 ype==ARG_NUMBER
c8c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 ){. if( (
c8d0: 7a 4c 65 66 74 3d 3d 30 20 7c 7c 20 54 48 5f 4f zLeft==0 || TH_O
c8e0: 4b 3d 3d 54 68 5f 54 6f 49 6e 74 28 30 2c 20 7a K==Th_ToInt(0, z
c8f0: 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20 26 69 4c Left, nLeft, &iL
c900: 65 66 74 29 29 0a 20 20 20 20 20 20 20 20 20 26 eft)). &
c910: 26 20 28 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 & (zRight==0 ||
c920: 54 48 5f 4f 4b 3d 3d 54 68 5f 54 6f 49 6e 74 28 TH_OK==Th_ToInt(
c930: 30 2c 20 7a 52 69 67 68 74 2c 20 6e 52 69 67 68 0, zRight, nRigh
c940: 74 2c 20 26 69 52 69 67 68 74 29 29 0a 20 20 20 t, &iRight)).
c950: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 ){.
c960: 20 20 65 41 72 67 54 79 70 65 20 3d 20 41 52 47 eArgType = ARG
c970: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 _INTEGER;.
c980: 20 20 7d 65 6c 73 65 20 69 66 28 20 0a 20 20 20 }else if( .
c990: 20 20 20 20 20 20 20 28 7a 4c 65 66 74 20 26 26 (zLeft &&
c9a0: 20 54 48 5f 4f 4b 21 3d 54 68 5f 54 6f 44 6f 75 TH_OK!=Th_ToDou
c9b0: 62 6c 65 28 69 6e 74 65 72 70 2c 20 7a 4c 65 66 ble(interp, zLef
c9c0: 74 2c 20 6e 4c 65 66 74 2c 20 26 66 4c 65 66 74 t, nLeft, &fLeft
c9d0: 29 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 )) ||.
c9e0: 28 7a 52 69 67 68 74 20 26 26 20 54 48 5f 4f 4b (zRight && TH_OK
c9f0: 21 3d 54 68 5f 54 6f 44 6f 75 62 6c 65 28 69 6e !=Th_ToDouble(in
ca00: 74 65 72 70 2c 20 7a 52 69 67 68 74 2c 20 6e 52 terp, zRight, nR
ca10: 69 67 68 74 2c 20 26 66 52 69 67 68 74 29 29 0a ight, &fRight)).
ca20: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 ){.
ca30: 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65 20 65 /* A type e
ca40: 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 rror. */.
ca50: 20 20 20 72 63 20 3d 20 54 48 5f 45 52 52 4f 52 rc = TH_ERROR
ca60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
ca70: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 41 72 67 }else if( eArg
ca80: 54 79 70 65 3d 3d 41 52 47 5f 49 4e 54 45 47 45 Type==ARG_INTEGE
ca90: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 R ){. rc
caa0: 3d 20 54 68 5f 54 6f 49 6e 74 28 69 6e 74 65 72 = Th_ToInt(inter
cab0: 70 2c 20 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 2c p, zLeft, nLeft,
cac0: 20 26 69 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 &iLeft);.
cad0: 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 if( rc==TH_OK
cae0: 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 && zRight ){.
caf0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 68 5f 54 rc = Th_T
cb00: 6f 49 6e 74 28 69 6e 74 65 72 70 2c 20 7a 52 69 oInt(interp, zRi
cb10: 67 68 74 2c 20 6e 52 69 67 68 74 2c 20 26 69 52 ght, nRight, &iR
cb20: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d ight);. }
cb30: 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 7d . } . }
cb40: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 48 .. if( rc==TH
cb50: 5f 4f 4b 20 26 26 20 65 41 72 67 54 79 70 65 3d _OK && eArgType=
cb60: 3d 41 52 47 5f 49 4e 54 45 47 45 52 20 29 7b 0a =ARG_INTEGER ){.
cb70: 20 20 20 20 20 20 69 6e 74 20 69 52 65 73 3b 0a int iRes;.
cb80: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45 switch( pE
cb90: 78 70 72 2d 3e 70 4f 70 2d 3e 65 4f 70 20 29 20 xpr->pOp->eOp )
cba0: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f {. case O
cbb0: 50 5f 4d 55 4c 54 49 50 4c 59 3a 20 20 20 20 20 P_MULTIPLY:
cbc0: 69 52 65 73 20 3d 20 69 4c 65 66 74 2a 69 52 69 iRes = iLeft*iRi
cbd0: 67 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 ght; break;.
cbe0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 49 56 case OP_DIV
cbf0: 49 44 45 3a 20 20 20 20 20 20 20 69 52 65 73 20 IDE: iRes
cc00: 3d 20 69 4c 65 66 74 2f 69 52 69 67 68 74 3b 20 = iLeft/iRight;
cc10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 break;.
cc20: 63 61 73 65 20 4f 50 5f 4d 4f 44 55 4c 55 53 3a case OP_MODULUS:
cc30: 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 4c 65 iRes = iLe
cc40: 66 74 25 69 52 69 67 68 74 3b 20 20 62 72 65 61 ft%iRight; brea
cc50: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 k;. case
cc60: 4f 50 5f 41 44 44 3a 20 20 20 20 20 20 20 20 20 OP_ADD:
cc70: 20 69 52 65 73 20 3d 20 69 4c 65 66 74 2b 69 52 iRes = iLeft+iR
cc80: 69 67 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20 ight; break;.
cc90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 55 case OP_SU
cca0: 42 54 52 41 43 54 3a 20 20 20 20 20 69 52 65 73 BTRACT: iRes
ccb0: 20 3d 20 69 4c 65 66 74 2d 69 52 69 67 68 74 3b = iLeft-iRight;
ccc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
ccd0: 20 63 61 73 65 20 4f 50 5f 4c 45 46 54 53 48 49 case OP_LEFTSHI
cce0: 46 54 3a 20 20 20 20 69 52 65 73 20 3d 20 69 4c FT: iRes = iL
ccf0: 65 66 74 3c 3c 69 52 69 67 68 74 3b 20 62 72 65 eft<<iRight; bre
cd00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 ak;. case
cd10: 20 4f 50 5f 52 49 47 48 54 53 48 49 46 54 3a 20 OP_RIGHTSHIFT:
cd20: 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74 3e 3e iRes = iLeft>>
cd30: 69 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a 20 iRight; break;.
cd40: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c case OP_L
cd50: 54 3a 20 20 20 20 20 20 20 20 20 20 20 69 52 65 T: iRe
cd60: 73 20 3d 20 69 4c 65 66 74 3c 69 52 69 67 68 74 s = iLeft<iRight
cd70: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 ; break;.
cd80: 20 20 63 61 73 65 20 4f 50 5f 47 54 3a 20 20 20 case OP_GT:
cd90: 20 20 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 iRes = i
cda0: 4c 65 66 74 3e 69 52 69 67 68 74 3b 20 20 62 72 Left>iRight; br
cdb0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 eak;. cas
cdc0: 65 20 4f 50 5f 4c 45 3a 20 20 20 20 20 20 20 20 e OP_LE:
cdd0: 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74 3c iRes = iLeft<
cde0: 3d 69 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a =iRight; break;.
cdf0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f case OP_
ce00: 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 69 52 GE: iR
ce10: 65 73 20 3d 20 69 4c 65 66 74 3e 3d 69 52 69 67 es = iLeft>=iRig
ce20: 68 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 ht; break;.
ce30: 20 20 20 63 61 73 65 20 4f 50 5f 45 51 3a 20 20 case OP_EQ:
ce40: 20 20 20 20 20 20 20 20 20 69 52 65 73 20 3d 20 iRes =
ce50: 69 4c 65 66 74 3d 3d 69 52 69 67 68 74 3b 20 62 iLeft==iRight; b
ce60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 reak;. ca
ce70: 73 65 20 4f 50 5f 4e 45 3a 20 20 20 20 20 20 20 se OP_NE:
ce80: 20 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66 74 iRes = iLeft
ce90: 21 3d 69 52 69 67 68 74 3b 20 62 72 65 61 6b 3b !=iRight; break;
cea0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 . case OP
ceb0: 5f 42 49 54 57 49 53 45 5f 41 4e 44 3a 20 20 69 _BITWISE_AND: i
cec0: 52 65 73 20 3d 20 69 4c 65 66 74 26 69 52 69 67 Res = iLeft&iRig
ced0: 68 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 ht; break;.
cee0: 20 20 20 20 63 61 73 65 20 4f 50 5f 42 49 54 57 case OP_BITW
cef0: 49 53 45 5f 58 4f 52 3a 20 20 69 52 65 73 20 3d ISE_XOR: iRes =
cf00: 20 69 4c 65 66 74 5e 69 52 69 67 68 74 3b 20 20 iLeft^iRight;
cf10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 break;. c
cf20: 61 73 65 20 4f 50 5f 42 49 54 57 49 53 45 5f 4f ase OP_BITWISE_O
cf30: 52 3a 20 20 20 69 52 65 73 20 3d 20 69 4c 65 66 R: iRes = iLef
cf40: 74 7c 69 52 69 67 68 74 3b 20 20 62 72 65 61 6b t|iRight; break
cf50: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f ;. case O
cf60: 50 5f 4c 4f 47 49 43 41 4c 5f 41 4e 44 3a 20 20 P_LOGICAL_AND:
cf70: 69 52 65 73 20 3d 20 69 4c 65 66 74 26 26 69 52 iRes = iLeft&&iR
cf80: 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 ight; break;.
cf90: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c 4f 47 case OP_LOG
cfa0: 49 43 41 4c 5f 4f 52 3a 20 20 20 69 52 65 73 20 ICAL_OR: iRes
cfb0: 3d 20 69 4c 65 66 74 7c 7c 69 52 69 67 68 74 3b = iLeft||iRight;
cfc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 break;.
cfd0: 63 61 73 65 20 4f 50 5f 55 4e 41 52 59 5f 4d 49 case OP_UNARY_MI
cfe0: 4e 55 53 3a 20 20 69 52 65 73 20 3d 20 2d 69 4c NUS: iRes = -iL
cff0: 65 66 74 3b 20 20 20 20 20 20 20 20 62 72 65 61 eft; brea
d000: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 k;. case
d010: 4f 50 5f 55 4e 41 52 59 5f 50 4c 55 53 3a 20 20 OP_UNARY_PLUS:
d020: 20 69 52 65 73 20 3d 20 2b 69 4c 65 66 74 3b 20 iRes = +iLeft;
d030: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
d040: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c 4f case OP_LO
d050: 47 49 43 41 4c 5f 4e 4f 54 3a 20 20 69 52 65 73 GICAL_NOT: iRes
d060: 20 3d 20 21 69 4c 65 66 74 3b 20 20 20 20 20 20 = !iLeft;
d070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
d080: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 default: assert
d090: 28 21 22 49 6e 74 65 72 6e 61 6c 20 65 72 72 6f (!"Internal erro
d0a0: 72 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 r");. }.
d0b0: 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 Th_SetResultI
d0c0: 6e 74 28 69 6e 74 65 72 70 2c 20 69 52 65 73 29 nt(interp, iRes)
d0d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
d0e0: 72 63 3d 3d 54 48 5f 4f 4b 20 26 26 20 65 41 72 rc==TH_OK && eAr
d0f0: 67 54 79 70 65 3d 3d 41 52 47 5f 4e 55 4d 42 45 gType==ARG_NUMBE
d100: 52 20 29 7b 0a 20 20 20 20 20 20 73 77 69 74 63 R ){. switc
d110: 68 28 20 70 45 78 70 72 2d 3e 70 4f 70 2d 3e 65 h( pExpr->pOp->e
d120: 4f 70 20 29 20 7b 0a 20 20 20 20 20 20 20 20 63 Op ) {. c
d130: 61 73 65 20 4f 50 5f 4d 55 4c 54 49 50 4c 59 3a ase OP_MULTIPLY:
d140: 20 54 68 5f 53 65 74 52 65 73 75 6c 74 44 6f 75 Th_SetResultDou
d150: 62 6c 65 28 69 6e 74 65 72 70 2c 20 66 4c 65 66 ble(interp, fLef
d160: 74 2a 66 52 69 67 68 74 29 3b 20 20 62 72 65 61 t*fRight); brea
d170: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 k;. case
d180: 4f 50 5f 44 49 56 49 44 45 3a 20 20 20 54 68 5f OP_DIVIDE: Th_
d190: 53 65 74 52 65 73 75 6c 74 44 6f 75 62 6c 65 28 SetResultDouble(
d1a0: 69 6e 74 65 72 70 2c 20 66 4c 65 66 74 2f 66 52 interp, fLeft/fR
d1b0: 69 67 68 74 29 3b 20 20 62 72 65 61 6b 3b 0a 20 ight); break;.
d1c0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 case OP_A
d1d0: 44 44 3a 20 20 20 20 20 20 54 68 5f 53 65 74 52 DD: Th_SetR
d1e0: 65 73 75 6c 74 44 6f 75 62 6c 65 28 69 6e 74 65 esultDouble(inte
d1f0: 72 70 2c 20 66 4c 65 66 74 2b 66 52 69 67 68 74 rp, fLeft+fRight
d200: 29 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 ); break;.
d210: 20 20 20 63 61 73 65 20 4f 50 5f 53 55 42 54 52 case OP_SUBTR
d220: 41 43 54 3a 20 54 68 5f 53 65 74 52 65 73 75 6c ACT: Th_SetResul
d230: 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 tDouble(interp,
d240: 66 4c 65 66 74 2d 66 52 69 67 68 74 29 3b 20 20 fLeft-fRight);
d250: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 break;. c
d260: 61 73 65 20 4f 50 5f 4c 54 3a 20 20 20 20 20 20 ase OP_LT:
d270: 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 Th_SetResultInt
d280: 28 69 6e 74 65 72 70 2c 20 66 4c 65 66 74 3c 66 (interp, fLeft<f
d290: 52 69 67 68 74 29 3b 20 20 62 72 65 61 6b 3b 0a Right); break;.
d2a0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f case OP_
d2b0: 47 54 3a 20 20 20 20 20 20 20 54 68 5f 53 65 74 GT: Th_Set
d2c0: 52 65 73 75 6c 74 49 6e 74 28 69 6e 74 65 72 70 ResultInt(interp
d2d0: 2c 20 66 4c 65 66 74 3e 66 52 69 67 68 74 29 3b , fLeft>fRight);
d2e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
d2f0: 20 63 61 73 65 20 4f 50 5f 4c 45 3a 20 20 20 20 case OP_LE:
d300: 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 Th_SetResultI
d310: 6e 74 28 69 6e 74 65 72 70 2c 20 66 4c 65 66 74 nt(interp, fLeft
d320: 3c 3d 66 52 69 67 68 74 29 3b 20 62 72 65 61 6b <=fRight); break
d330: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f ;. case O
d340: 50 5f 47 45 3a 20 20 20 20 20 20 20 54 68 5f 53 P_GE: Th_S
d350: 65 74 52 65 73 75 6c 74 49 6e 74 28 69 6e 74 65 etResultInt(inte
d360: 72 70 2c 20 66 4c 65 66 74 3e 3d 66 52 69 67 68 rp, fLeft>=fRigh
d370: 74 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 t); break;.
d380: 20 20 20 63 61 73 65 20 4f 50 5f 45 51 3a 20 20 case OP_EQ:
d390: 20 20 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c Th_SetResul
d3a0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 66 4c 65 tInt(interp, fLe
d3b0: 66 74 3d 3d 66 52 69 67 68 74 29 3b 20 62 72 65 ft==fRight); bre
d3c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 ak;. case
d3d0: 20 4f 50 5f 4e 45 3a 20 20 20 20 20 20 20 54 68 OP_NE: Th
d3e0: 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 28 69 6e _SetResultInt(in
d3f0: 74 65 72 70 2c 20 66 4c 65 66 74 21 3d 66 52 69 terp, fLeft!=fRi
d400: 67 68 74 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 ght); break;.
d410: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 default: as
d420: 73 65 72 74 28 21 22 49 6e 74 65 72 6e 61 6c 20 sert(!"Internal
d430: 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d error");. }
d440: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 . }else if( r
d450: 63 3d 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 c==TH_OK ){.
d460: 20 20 69 6e 74 20 69 45 71 75 61 6c 20 3d 20 30 int iEqual = 0
d470: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 ;. assert(
d480: 65 41 72 67 54 79 70 65 3d 3d 41 52 47 5f 53 54 eArgType==ARG_ST
d490: 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 69 66 RING );. if
d4a0: 28 20 6e 52 69 67 68 74 3d 3d 6e 4c 65 66 74 20 ( nRight==nLeft
d4b0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 52 69 && 0==memcmp(zRi
d4c0: 67 68 74 2c 20 7a 4c 65 66 74 2c 20 6e 52 69 67 ght, zLeft, nRig
d4d0: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 ht) ){. i
d4e0: 45 71 75 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 Equal = 1;.
d4f0: 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 }. switch(
d500: 20 70 45 78 70 72 2d 3e 70 4f 70 2d 3e 65 4f 70 pExpr->pOp->eOp
d510: 20 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 ) {. cas
d520: 65 20 4f 50 5f 53 45 51 3a 20 20 20 20 20 20 20 e OP_SEQ:
d530: 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e 74 28 Th_SetResultInt(
d540: 69 6e 74 65 72 70 2c 20 69 45 71 75 61 6c 29 3b interp, iEqual);
d550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 break;.
d560: 63 61 73 65 20 4f 50 5f 53 4e 45 3a 20 20 20 20 case OP_SNE:
d570: 20 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 Th_SetResultI
d580: 6e 74 28 69 6e 74 65 72 70 2c 20 21 69 45 71 75 nt(interp, !iEqu
d590: 61 6c 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 al); break;.
d5a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 default: ass
d5b0: 65 72 74 28 21 22 49 6e 74 65 72 6e 61 6c 20 65 ert(!"Internal e
d5c0: 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 0a rror");. }.
d5d0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 68 5f 46 72 }.. Th_Fr
d5e0: 65 65 28 69 6e 74 65 72 70 2c 20 7a 4c 65 66 74 ee(interp, zLeft
d5f0: 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28 69 );. Th_Free(i
d600: 6e 74 65 72 70 2c 20 7a 52 69 67 68 74 29 3b 0a nterp, zRight);.
d610: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 }.. return rc
d620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 ;.}../*.** Creat
d630: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 e an expression
d640: 74 72 65 65 20 66 72 6f 6d 20 61 6e 20 61 72 72 tree from an arr
d650: 61 79 20 6f 66 20 74 6f 6b 65 6e 73 2e 20 49 66 ay of tokens. If
d660: 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 successful,.**
d670: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 the root of the
d680: 74 72 65 65 20 69 73 20 73 74 6f 72 65 64 20 69 tree is stored i
d690: 6e 20 61 70 54 6f 6b 65 6e 5b 30 5d 2e 0a 2a 2f n apToken[0]..*/
d6a0: 0a 69 6e 74 20 65 78 70 72 4d 61 6b 65 54 72 65 .int exprMakeTre
d6b0: 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 e(Th_Interp *int
d6c0: 65 72 70 2c 20 45 78 70 72 20 2a 2a 61 70 54 6f erp, Expr **apTo
d6d0: 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 29 ken, int nToken)
d6e0: 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 3b 0a 20 {. int iLeft;.
d6f0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6a 6a int i;. int jj
d700: 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 54 6f 6b ;.. assert(nTok
d710: 65 6e 3e 30 29 3b 0a 23 64 65 66 69 6e 65 20 49 en>0);.#define I
d720: 53 54 45 52 4d 28 78 29 20 28 61 70 54 6f 6b 65 STERM(x) (apToke
d730: 6e 5b 78 5d 20 26 26 20 28 21 61 70 54 6f 6b 65 n[x] && (!apToke
d740: 6e 5b 78 5d 2d 3e 70 4f 70 20 7c 7c 20 61 70 54 n[x]->pOp || apT
d750: 6f 6b 65 6e 5b 78 5d 2d 3e 70 4c 65 66 74 29 29 oken[x]->pLeft))
d760: 0a 0a 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a .. for(jj=0; jj
d770: 3c 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b 0a <nToken; jj++){.
d780: 20 20 20 20 69 66 28 20 61 70 54 6f 6b 65 6e 5b if( apToken[
d790: 6a 6a 5d 2d 3e 70 4f 70 20 26 26 20 61 70 54 6f jj]->pOp && apTo
d7a0: 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 2d 3e 65 4f ken[jj]->pOp->eO
d7b0: 70 3d 3d 4f 50 5f 4f 50 45 4e 5f 42 52 41 43 4b p==OP_OPEN_BRACK
d7c0: 45 54 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 ET ){. int
d7d0: 6e 4e 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 nNest = 1;.
d7e0: 20 69 6e 74 20 69 4c 65 66 74 20 3d 20 6a 6a 3b int iLeft = jj;
d7f0: 20 0a 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 2b .. for(jj+
d800: 2b 3b 20 6a 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a 6a +; jj<nToken; jj
d810: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 4f 70 65 ++){. Ope
d820: 72 61 74 6f 72 20 2a 70 4f 70 20 3d 20 61 70 54 rator *pOp = apT
d830: 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 3b 0a 20 oken[jj]->pOp;.
d840: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 20 26 if( pOp &
d850: 26 20 70 4f 70 2d 3e 65 4f 70 3d 3d 4f 50 5f 4f & pOp->eOp==OP_O
d860: 50 45 4e 5f 42 52 41 43 4b 45 54 20 29 20 6e 4e PEN_BRACKET ) nN
d870: 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 est++;. i
d880: 66 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e 65 f( pOp && pOp->e
d890: 4f 70 3d 3d 4f 50 5f 43 4c 4f 53 45 5f 42 52 41 Op==OP_CLOSE_BRA
d8a0: 43 4b 45 54 20 29 20 6e 4e 65 73 74 2d 2d 3b 0a CKET ) nNest--;.
d8b0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 73 if( nNes
d8c0: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 t==0 ) break;.
d8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 }. if(
d8e0: 6a 6a 3d 3d 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 jj==nToken ){.
d8f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f return TH_
d900: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 ERROR;. }.
d910: 20 20 20 20 20 69 66 28 20 28 6a 6a 2d 69 4c 65 if( (jj-iLe
d920: 66 74 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 ft)>1 ){.
d930: 20 69 66 28 20 65 78 70 72 4d 61 6b 65 54 72 65 if( exprMakeTre
d940: 65 28 69 6e 74 65 72 70 2c 20 26 61 70 54 6f 6b e(interp, &apTok
d950: 65 6e 5b 69 4c 65 66 74 2b 31 5d 2c 20 6a 6a 2d en[iLeft+1], jj-
d960: 69 4c 65 66 74 2d 31 29 20 29 7b 0a 20 20 20 20 iLeft-1) ){.
d970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 5f return TH_
d980: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d ERROR;. }
d990: 0a 20 20 20 20 20 20 20 20 65 78 70 72 46 72 65 . exprFre
d9a0: 65 28 69 6e 74 65 72 70 2c 20 61 70 54 6f 6b 65 e(interp, apToke
d9b0: 6e 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 n[jj]);.
d9c0: 65 78 70 72 46 72 65 65 28 69 6e 74 65 72 70 2c exprFree(interp,
d9d0: 20 61 70 54 6f 6b 65 6e 5b 69 4c 65 66 74 5d 29 apToken[iLeft])
d9e0: 3b 0a 20 20 20 20 20 20 20 20 61 70 54 6f 6b 65 ;. apToke
d9f0: 6e 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 n[jj] = 0;.
da00: 20 20 20 61 70 54 6f 6b 65 6e 5b 69 4c 65 66 74 apToken[iLeft
da10: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 ] = 0;. }.
da20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 4c 65 66 }. }.. iLef
da30: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 6a 3d t = 0;. for(jj=
da40: 6e 54 6f 6b 65 6e 2d 31 3b 20 6a 6a 3e 3d 30 3b nToken-1; jj>=0;
da50: 20 6a 6a 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 jj--){. if(
da60: 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a 20 apToken[jj] ){.
da70: 20 20 20 20 20 69 66 28 20 61 70 54 6f 6b 65 6e if( apToken
da80: 5b 6a 6a 5d 2d 3e 70 4f 70 20 26 26 20 61 70 54 [jj]->pOp && apT
da90: 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4f 70 2d 3e 69 oken[jj]->pOp->i
daa0: 50 72 65 63 65 64 65 6e 63 65 3d 3d 31 20 26 26 Precedence==1 &&
dab0: 20 69 4c 65 66 74 3e 30 20 29 7b 0a 20 20 20 20 iLeft>0 ){.
dac0: 20 20 20 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 2d apToken[jj]-
dad0: 3e 70 4c 65 66 74 20 3d 20 61 70 54 6f 6b 65 6e >pLeft = apToken
dae0: 5b 69 4c 65 66 74 5d 3b 0a 20 20 20 20 20 20 20 [iLeft];.
daf0: 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 2d 3e 70 4c apToken[jj]->pL
db00: 65 66 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20 61 eft->pParent = a
db10: 70 54 6f 6b 65 6e 5b 6a 6a 5d 3b 0a 20 20 20 20 pToken[jj];.
db20: 20 20 20 20 61 70 54 6f 6b 65 6e 5b 69 4c 65 66 apToken[iLef
db30: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a t] = 0;. }.
db40: 20 20 20 20 20 20 69 4c 65 66 74 20 3d 20 6a 6a iLeft = jj
db50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f ;. }. }. fo
db60: 72 28 69 3d 32 3b 20 69 3c 3d 31 32 3b 20 69 2b r(i=2; i<=12; i+
db70: 2b 29 7b 0a 20 20 20 20 69 4c 65 66 74 20 3d 20 +){. iLeft =
db80: 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 30 -1;. for(jj=0
db90: 3b 20 6a 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b ; jj<nToken; jj+
dba0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a +){. Expr *
dbb0: 70 54 6f 6b 65 6e 20 3d 20 61 70 54 6f 6b 65 6e pToken = apToken
dbc0: 5b 6a 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 [jj];. if(
dbd0: 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a 20 apToken[jj] ){.
dbe0: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 if( pToke
dbf0: 6e 2d 3e 70 4f 70 20 26 26 20 21 70 54 6f 6b 65 n->pOp && !pToke
dc00: 6e 2d 3e 70 4c 65 66 74 20 26 26 20 70 54 6f 6b n->pLeft && pTok
dc10: 65 6e 2d 3e 70 4f 70 2d 3e 69 50 72 65 63 65 64 en->pOp->iPreced
dc20: 65 6e 63 65 3d 3d 69 20 29 7b 0a 20 20 20 20 20 ence==i ){.
dc30: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 20 int iRight
dc40: 3d 20 6a 6a 2b 31 3b 0a 0a 20 20 20 20 20 20 20 = jj+1;..
dc50: 20 20 20 69 52 69 67 68 74 20 3d 20 6a 6a 2b 31 iRight = jj+1
dc60: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 ;. for(
dc70: 69 52 69 67 68 74 3d 6a 6a 2b 31 3b 20 21 61 70 iRight=jj+1; !ap
dc80: 54 6f 6b 65 6e 5b 69 52 69 67 68 74 5d 20 26 26 Token[iRight] &&
dc90: 20 69 52 69 67 68 74 3c 6e 54 6f 6b 65 6e 3b 20 iRight<nToken;
dca0: 69 52 69 67 68 74 2b 2b 29 3b 0a 20 20 20 20 20 iRight++);.
dcb0: 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74 3d if( iRight=
dcc0: 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 69 4c 65 66 74 =nToken || iLeft
dcd0: 3c 30 20 7c 7c 20 21 49 53 54 45 52 4d 28 69 52 <0 || !ISTERM(iR
dce0: 69 67 68 74 29 20 7c 7c 20 21 49 53 54 45 52 4d ight) || !ISTERM
dcf0: 28 69 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 (iLeft) ){.
dd00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 return TH
dd10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 _ERROR;.
dd20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 }. pT
dd30: 6f 6b 65 6e 2d 3e 70 4c 65 66 74 20 3d 20 61 70 oken->pLeft = ap
dd40: 54 6f 6b 65 6e 5b 69 4c 65 66 74 5d 3b 0a 20 20 Token[iLeft];.
dd50: 20 20 20 20 20 20 20 20 61 70 54 6f 6b 65 6e 5b apToken[
dd60: 69 4c 65 66 74 5d 20 3d 20 30 3b 0a 20 20 20 20 iLeft] = 0;.
dd70: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 4c pToken->pL
dd80: 65 66 74 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 eft->pParent = p
dd90: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 Token;.
dda0: 20 70 54 6f 6b 65 6e 2d 3e 70 52 69 67 68 74 20 pToken->pRight
ddb0: 3d 20 61 70 54 6f 6b 65 6e 5b 69 52 69 67 68 74 = apToken[iRight
ddc0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 54 ];. apT
ddd0: 6f 6b 65 6e 5b 69 52 69 67 68 74 5d 20 3d 20 30 oken[iRight] = 0
dde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 6b ;. pTok
ddf0: 65 6e 2d 3e 70 52 69 67 68 74 2d 3e 70 50 61 72 en->pRight->pPar
de00: 65 6e 74 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20 20 ent = pToken;.
de10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
de20: 69 4c 65 66 74 20 3d 20 6a 6a 3b 0a 20 20 20 20 iLeft = jj;.
de30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 }. }. }.
de40: 66 6f 72 28 6a 6a 3d 31 3b 20 6a 6a 3c 6e 54 6f for(jj=1; jj<nTo
de50: 6b 65 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 ken; jj++){.
de60: 61 73 73 65 72 74 28 20 21 61 70 54 6f 6b 65 6e assert( !apToken
de70: 5b 6a 6a 5d 20 7c 7c 20 21 61 70 54 6f 6b 65 6e [jj] || !apToken
de80: 5b 30 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 61 [0] );. if( a
de90: 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 29 7b 0a 20 20 pToken[jj] ){.
dea0: 20 20 20 20 61 70 54 6f 6b 65 6e 5b 30 5d 20 3d apToken[0] =
deb0: 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 3b 0a 20 20 apToken[jj];.
dec0: 20 20 20 20 61 70 54 6f 6b 65 6e 5b 6a 6a 5d 20 apToken[jj]
ded0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a = 0;. }. }..
dee0: 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a return TH_OK;.
def0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 }../*.** Parse a
df00: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 string containi
df10: 6e 67 20 61 20 54 48 20 65 78 70 72 65 73 73 69 ng a TH expressi
df20: 6f 6e 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 on to a list of
df30: 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 tokens..*/.stati
df40: 63 20 69 6e 74 20 65 78 70 72 50 61 72 73 65 28 c int exprParse(
df50: 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e . Th_Interp *in
df60: 74 65 72 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 terp, /*
df70: 49 6e 74 65 72 70 72 65 74 65 72 20 74 6f 20 6c Interpreter to l
df80: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 eave error messa
df90: 67 65 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 ge in */. const
dfa0: 20 75 63 68 61 72 20 2a 7a 45 78 70 72 2c 20 20 uchar *zExpr,
dfb0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 /* Pointer
dfc0: 74 6f 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 to input string
dfd0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 2c 20 */. int nExpr,
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
dff0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
e000: 73 20 61 74 20 7a 45 78 70 72 20 2a 2f 0a 20 20 s at zExpr */.
e010: 45 78 70 72 20 2a 2a 2a 70 61 70 54 6f 6b 65 6e Expr ***papToken
e020: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 , /* OUT
e030: 3a 20 41 72 72 61 79 20 6f 66 20 74 6f 6b 65 6e : Array of token
e040: 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 54 s. */. int *pnT
e050: 6f 6b 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 oken
e060: 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f /* OUT: Size o
e070: 66 20 74 6f 6b 65 6e 20 61 72 72 61 79 20 2a 2f f token array */
e080: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 .){. int i;..
e090: 69 6e 74 20 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a int rc = TH_OK;.
e0a0: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 int nToken = 0
e0b0: 3b 0a 20 20 45 78 70 72 20 2a 2a 61 70 54 6f 6b ;. Expr **apTok
e0c0: 65 6e 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 en = 0;.. for(i
e0d0: 3d 30 3b 20 72 63 3d 3d 54 48 5f 4f 4b 20 26 26 =0; rc==TH_OK &&
e0e0: 20 69 3c 6e 45 78 70 72 3b 20 29 7b 0a 20 20 20 i<nExpr; ){.
e0f0: 20 75 63 68 61 72 20 63 20 3d 20 7a 45 78 70 72 uchar c = zExpr
e100: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 74 68 5f [i];. if( th_
e110: 69 73 73 70 61 63 65 28 63 29 20 29 7b 20 20 20 isspace(c) ){
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
e140: 57 68 69 74 65 2d 73 70 61 63 65 20 20 20 20 20 White-space
e150: 2a 2f 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 */. i++;.
e160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 }else{. E
e170: 78 70 72 20 2a 70 4e 65 77 20 3d 20 28 45 78 70 xpr *pNew = (Exp
e180: 72 20 2a 29 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e r *)Th_Malloc(in
e190: 74 65 72 70 2c 20 73 69 7a 65 6f 66 28 45 78 70 terp, sizeof(Exp
e1a0: 72 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 r));. const
e1b0: 20 75 63 68 61 72 20 2a 7a 20 3d 20 26 7a 45 78 uchar *z = &zEx
e1c0: 70 72 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 73 77 pr[i];.. sw
e1d0: 69 74 63 68 20 28 63 29 20 7b 0a 20 20 20 20 20 itch (c) {.
e1e0: 20 20 20 63 61 73 65 20 27 30 27 3a 20 63 61 73 case '0': cas
e1f0: 65 20 27 31 27 3a 20 63 61 73 65 20 27 32 27 3a e '1': case '2':
e200: 20 63 61 73 65 20 27 33 27 3a 20 63 61 73 65 20 case '3': case
e210: 27 34 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 '4':. cas
e220: 65 20 27 35 27 3a 20 63 61 73 65 20 27 36 27 3a e '5': case '6':
e230: 20 63 61 73 65 20 27 37 27 3a 20 63 61 73 65 20 case '7': case
e240: 27 38 27 3a 20 63 61 73 65 20 27 39 27 3a 0a 20 '8': case '9':.
e250: 20 20 20 20 20 20 20 20 20 74 68 4e 65 78 74 4e thNextN
e260: 75 6d 62 65 72 28 69 6e 74 65 72 70 2c 20 7a 2c umber(interp, z,
e270: 20 6e 45 78 70 72 2d 69 2c 20 26 70 4e 65 77 2d nExpr-i, &pNew-
e280: 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 >nValue);.
e290: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 break;..
e2a0: 20 20 20 20 63 61 73 65 20 27 24 27 3a 0a 20 20 case '$':.
e2b0: 20 20 20 20 20 20 20 20 74 68 4e 65 78 74 56 61 thNextVa
e2c0: 72 6e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 2c rname(interp, z,
e2d0: 20 6e 45 78 70 72 2d 69 2c 20 26 70 4e 65 77 2d nExpr-i, &pNew-
e2e0: 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 >nValue);.
e2f0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 break;..
e300: 20 20 20 20 63 61 73 65 20 27 7b 27 3a 20 63 61 case '{': ca
e310: 73 65 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20 20 se '[': {.
e320: 20 20 20 20 74 68 4e 65 78 74 43 6f 6d 6d 61 6e thNextComman
e330: 64 28 69 6e 74 65 72 70 2c 20 7a 2c 20 6e 45 78 d(interp, z, nEx
e340: 70 72 2d 69 2c 20 26 70 4e 65 77 2d 3e 6e 56 61 pr-i, &pNew->nVa
e350: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 lue);.
e360: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d break;. }
e370: 0a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 .. case '
e380: 22 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 "': {.
e390: 69 6e 74 20 69 45 6e 64 20 3d 20 69 3b 0a 20 20 int iEnd = i;.
e3a0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2b while( +
e3b0: 2b 69 45 6e 64 3c 6e 45 78 70 72 20 26 26 20 7a +iEnd<nExpr && z
e3c0: 45 78 70 72 5b 69 45 6e 64 5d 21 3d 27 22 27 20 Expr[iEnd]!='"'
e3d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 ){. i
e3e0: 66 28 20 7a 45 78 70 72 5b 69 45 6e 64 5d 3d 3d f( zExpr[iEnd]==
e3f0: 27 5c 5c 27 20 29 20 69 45 6e 64 2b 2b 3b 0a 20 '\\' ) iEnd++;.
e400: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
e410: 20 20 20 20 20 69 66 28 20 69 45 6e 64 3c 6e 45 if( iEnd<nE
e420: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 xpr ){.
e430: 20 20 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 20 pNew->nValue
e440: 3d 20 69 45 6e 64 2b 31 2d 69 3b 0a 20 20 20 20 = iEnd+1-i;.
e450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
e460: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
e470: 20 7d 0a 0a 20 20 20 20 20 20 20 20 64 65 66 61 }.. defa
e480: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 ult: {.
e490: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 int j;.
e4a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 61 4f 70 65 72 for(j=0; aOper
e4b0: 61 74 6f 72 5b 6a 5d 2e 7a 4f 70 3b 20 6a 2b 2b ator[j].zOp; j++
e4c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 ){. i
e4d0: 6e 74 20 6e 4f 70 3b 0a 20 20 20 20 20 20 20 20 nt nOp;.
e4e0: 20 20 20 20 69 66 28 20 61 4f 70 65 72 61 74 6f if( aOperato
e4f0: 72 5b 6a 5d 2e 69 50 72 65 63 65 64 65 6e 63 65 r[j].iPrecedence
e500: 3d 3d 31 20 26 26 20 6e 54 6f 6b 65 6e 3e 30 20 ==1 && nToken>0
e510: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ){.
e520: 20 45 78 70 72 20 2a 70 50 72 65 76 20 3d 20 61 Expr *pPrev = a
e530: 70 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 2d 31 5d pToken[nToken-1]
e540: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
e550: 69 66 28 20 21 70 50 72 65 76 2d 3e 70 4f 70 20 if( !pPrev->pOp
e560: 7c 7c 20 70 50 72 65 76 2d 3e 70 4f 70 2d 3e 65 || pPrev->pOp->e
e570: 4f 70 3d 3d 4f 50 5f 43 4c 4f 53 45 5f 42 52 41 Op==OP_CLOSE_BRA
e580: 43 4b 45 54 20 29 7b 0a 20 20 20 20 20 20 20 20 CKET ){.
e590: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 continue
e5a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
e5b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a }. }.
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4f 70 20 nOp
e5d0: 3d 20 74 68 5f 73 74 72 6c 65 6e 28 28 63 6f 6e = th_strlen((con
e5e0: 73 74 20 75 63 68 61 72 20 2a 29 61 4f 70 65 72 st uchar *)aOper
e5f0: 61 74 6f 72 5b 6a 5d 2e 7a 4f 70 29 3b 0a 20 20 ator[j].zOp);.
e600: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e if( (n
e610: 45 78 70 72 2d 69 29 3e 3d 6e 4f 70 20 26 26 20 Expr-i)>=nOp &&
e620: 30 3d 3d 6d 65 6d 63 6d 70 28 61 4f 70 65 72 61 0==memcmp(aOpera
e630: 74 6f 72 5b 6a 5d 2e 7a 4f 70 2c 20 26 7a 45 78 tor[j].zOp, &zEx
e640: 70 72 5b 69 5d 2c 20 6e 4f 70 29 20 29 7b 0a 20 pr[i], nOp) ){.
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 pNe
e660: 77 2d 3e 70 4f 70 20 3d 20 26 61 4f 70 65 72 61 w->pOp = &aOpera
e670: 74 6f 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 tor[j];.
e680: 20 20 20 20 20 20 69 20 2b 3d 20 6e 4f 70 3b 0a i += nOp;.
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 br
e6a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 eak;.
e6b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 }. }.
e6c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
e6d0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 .. if( pNew
e6e0: 2d 3e 70 4f 70 20 7c 7c 20 70 4e 65 77 2d 3e 6e ->pOp || pNew->n
e6f0: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 Value ){.
e700: 20 69 66 28 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 if( pNew->nValu
e710: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f e ){. /
e720: 2a 20 41 20 74 65 72 6d 69 6e 61 6c 2e 20 43 6f * A terminal. Co
e730: 70 79 20 74 68 65 20 73 74 72 69 6e 67 20 76 61 py the string va
e740: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 lue. */.
e750: 20 20 61 73 73 65 72 74 28 20 21 70 4e 65 77 2d assert( !pNew-
e760: 3e 70 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20 >pOp );.
e770: 20 20 70 4e 65 77 2d 3e 7a 56 61 6c 75 65 20 3d pNew->zValue =
e780: 20 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 72 Th_Malloc(inter
e790: 70 2c 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 29 p, pNew->nValue)
e7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 ;. memc
e7b0: 70 79 28 70 4e 65 77 2d 3e 7a 56 61 6c 75 65 2c py(pNew->zValue,
e7c0: 20 7a 2c 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 z, pNew->nValue
e7d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b );. i +
e7e0: 3d 20 70 4e 65 77 2d 3e 6e 56 61 6c 75 65 3b 0a = pNew->nValue;.
e7f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
e800: 20 20 69 66 28 20 28 6e 54 6f 6b 65 6e 25 31 36 if( (nToken%16
e810: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )==0 ){.
e820: 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 61 70 /* Grow the ap
e830: 54 6f 6b 65 6e 20 61 72 72 61 79 2e 20 2a 2f 0a Token array. */.
e840: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a Expr *
e850: 2a 61 70 54 6f 6b 65 6e 4f 6c 64 20 3d 20 61 70 *apTokenOld = ap
e860: 54 6f 6b 65 6e 3b 20 0a 20 20 20 20 20 20 20 20 Token; .
e870: 20 20 61 70 54 6f 6b 65 6e 20 3d 20 54 68 5f 4d apToken = Th_M
e880: 61 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20 73 69 alloc(interp, si
e890: 7a 65 6f 66 28 45 78 70 72 20 2a 29 2a 28 6e 54 zeof(Expr *)*(nT
e8a0: 6f 6b 65 6e 2b 31 36 29 29 3b 0a 20 20 20 20 20 oken+16));.
e8b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 54 6f memcpy(apTo
e8c0: 6b 65 6e 2c 20 61 70 54 6f 6b 65 6e 4f 6c 64 2c ken, apTokenOld,
e8d0: 20 73 69 7a 65 6f 66 28 45 78 70 72 20 2a 29 2a sizeof(Expr *)*
e8e0: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 nToken);.
e8f0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 }.. /* P
e900: 75 74 20 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e ut the new token
e910: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 at the end of t
e920: 68 65 20 61 70 54 6f 6b 65 6e 20 61 72 72 61 79 he apToken array
e930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 70 54 6f */. apTo
e940: 6b 65 6e 5b 6e 54 6f 6b 65 6e 5d 20 3d 20 70 4e ken[nToken] = pN
e950: 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b ew;. nTok
e960: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 en++;. }els
e970: 65 7b 0a 20 20 20 20 20 20 20 20 54 68 5f 46 72 e{. Th_Fr
e980: 65 65 28 69 6e 74 65 72 70 2c 20 70 4e 65 77 29 ee(interp, pNew)
e990: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 ;. rc = T
e9a0: 48 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d H_ERROR;. }
e9b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 . }. }.. *p
e9c0: 61 70 54 6f 6b 65 6e 20 3d 20 61 70 54 6f 6b 65 apToken = apToke
e9d0: 6e 3b 0a 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 n;. *pnToken =
e9e0: 6e 54 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e nToken;. return
e9f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 rc;.}../*.** Ev
ea00: 61 6c 75 61 74 65 20 74 68 65 20 73 74 72 69 6e aluate the strin
ea10: 67 20 28 7a 45 78 70 72 2c 20 6e 45 78 70 72 29 g (zExpr, nExpr)
ea20: 20 61 73 20 61 20 54 68 20 65 78 70 72 65 73 73 as a Th express
ea30: 69 6f 6e 2e 20 53 74 6f 72 65 0a 2a 2a 20 74 68 ion. Store.** th
ea40: 65 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 e result in the
ea50: 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e 74 65 interpreter inte
ea60: 72 70 20 61 6e 64 20 72 65 74 75 72 6e 20 54 48 rp and return TH
ea70: 5f 4f 4b 20 69 66 0a 2a 2a 20 73 75 63 63 65 73 _OK if.** succes
ea80: 73 66 75 6c 2e 20 49 66 20 61 6e 20 65 72 72 6f sful. If an erro
ea90: 72 20 6f 63 63 75 72 73 2c 20 73 74 6f 72 65 20 r occurs, store
eaa0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 an error message
eab0: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 in.** the inter
eac0: 70 72 65 74 65 72 20 72 65 73 75 6c 74 20 61 6e preter result an
ead0: 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f d return an erro
eae0: 72 20 63 6f 64 65 2e 0a 2a 2f 20 0a 69 6e 74 20 r code..*/ .int
eaf0: 54 68 5f 45 78 70 72 28 54 68 5f 49 6e 74 65 72 Th_Expr(Th_Inter
eb00: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 p *interp, const
eb10: 20 75 63 68 61 72 20 2a 7a 45 78 70 72 2c 20 69 uchar *zExpr, i
eb20: 6e 74 20 6e 45 78 70 72 29 7b 0a 20 20 69 6e 74 nt nExpr){. int
eb30: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 rc;
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
eb50: 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f * Return Code */
eb60: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 . int i;
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
eb80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 /* Loop cou
eb90: 6e 74 65 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e nter */.. int n
eba0: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 45 78 70 Token = 0;. Exp
ebb0: 72 20 2a 2a 61 70 54 6f 6b 65 6e 20 3d 20 30 3b r **apToken = 0;
ebc0: 0a 0a 20 20 69 66 28 20 6e 45 78 70 72 3c 30 20 .. if( nExpr<0
ebd0: 29 7b 0a 20 20 20 20 6e 45 78 70 72 20 3d 20 74 ){. nExpr = t
ebe0: 68 5f 73 74 72 6c 65 6e 28 7a 45 78 70 72 29 3b h_strlen(zExpr);
ebf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 72 73 65 . }.. /* Parse
ec00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 the expression
ec10: 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b to a list of tok
ec20: 65 6e 73 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 65 ens. */. rc = e
ec30: 78 70 72 50 61 72 73 65 28 69 6e 74 65 72 70 2c xprParse(interp,
ec40: 20 7a 45 78 70 72 2c 20 6e 45 78 70 72 2c 20 26 zExpr, nExpr, &
ec50: 61 70 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e apToken, &nToken
ec60: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 );.. /* If the
ec70: 70 61 72 73 69 6e 67 20 77 61 73 20 73 75 63 63 parsing was succ
ec80: 65 73 73 66 75 6c 2c 20 63 72 65 61 74 65 20 61 essful, create a
ec90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 n expression tre
eca0: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 e from. ** the
ecb0: 70 61 72 73 65 64 20 6c 69 73 74 20 6f 66 20 74 parsed list of t
ecc0: 6f 6b 65 6e 73 2e 20 49 66 20 73 75 63 63 65 73 okens. If succes
ecd0: 73 66 75 6c 2c 20 61 70 54 6f 6b 65 6e 5b 30 5d sful, apToken[0]
ece0: 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74 6f 20 is set. ** to
ecf0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f point to the roo
ed00: 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 t of the express
ed10: 69 6f 6e 20 74 72 65 65 2e 20 0a 20 20 2a 2f 0a ion tree. . */.
ed20: 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f 4b 20 if( rc==TH_OK
ed30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70 72 ){. rc = expr
ed40: 4d 61 6b 65 54 72 65 65 28 69 6e 74 65 72 70 2c MakeTree(interp,
ed50: 20 61 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e apToken, nToken
ed60: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 );. }.. if( rc
ed70: 21 3d 54 48 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 !=TH_OK ){. T
ed80: 68 5f 45 72 72 6f 72 4d 65 73 73 61 67 65 28 69 h_ErrorMessage(i
ed90: 6e 74 65 72 70 2c 20 22 73 79 6e 74 61 78 20 65 nterp, "syntax e
eda0: 72 72 6f 72 20 69 6e 20 65 78 70 72 65 73 73 69 rror in expressi
edb0: 6f 6e 3a 20 5c 22 22 2c 20 7a 45 78 70 72 2c 20 on: \"", zExpr,
edc0: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f nExpr);. }.. /
edd0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 * Evaluate the e
ede0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 xpression tree.
edf0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 54 48 5f */. if( rc==TH_
ee00: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 OK ){. rc = e
ee10: 78 70 72 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 xprEval(interp,
ee20: 61 70 54 6f 6b 65 6e 5b 30 5d 29 3b 0a 20 20 7d apToken[0]);. }
ee30: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 6d 65 6d 6f .. /* Free memo
ee40: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 ry allocated by
ee50: 65 78 70 72 50 61 72 73 65 28 29 2e 20 2a 2f 0a exprParse(). */.
ee60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 6f for(i=0; i<nTo
ee70: 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 ken; i++){. e
ee80: 78 70 72 46 72 65 65 28 69 6e 74 65 72 70 2c 20 xprFree(interp,
ee90: 61 70 54 6f 6b 65 6e 5b 69 5d 29 3b 0a 20 20 7d apToken[i]);. }
eea0: 0a 20 20 54 68 5f 46 72 65 65 28 69 6e 74 65 72 . Th_Free(inter
eeb0: 70 2c 20 61 70 54 6f 6b 65 6e 29 3b 0a 0a 20 20 p, apToken);..
eec0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
eed0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 .** Allocate and
eee0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 return a pointe
eef0: 72 20 74 6f 20 61 20 6e 65 77 20 68 61 73 68 2d r to a new hash-
ef00: 74 61 62 6c 65 2e 20 54 68 65 20 63 61 6c 6c 65 table. The calle
ef10: 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 28 65 76 65 r should.** (eve
ef20: 6e 74 75 61 6c 6c 79 29 20 64 65 6c 65 74 65 20 ntually) delete
ef30: 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 20 62 the hash-table b
ef40: 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 y passing it to
ef50: 54 68 5f 48 61 73 68 44 65 6c 65 74 65 28 29 2e Th_HashDelete().
ef60: 0a 2a 2f 0a 54 68 5f 48 61 73 68 20 2a 54 68 5f .*/.Th_Hash *Th_
ef70: 48 61 73 68 4e 65 77 28 54 68 5f 49 6e 74 65 72 HashNew(Th_Inter
ef80: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 68 p *interp){. Th
ef90: 5f 48 61 73 68 20 2a 70 3b 0a 20 20 70 20 3d 20 _Hash *p;. p =
efa0: 54 68 5f 4d 61 6c 6c 6f 63 28 69 6e 74 65 72 70 Th_Malloc(interp
efb0: 2c 20 73 69 7a 65 6f 66 28 54 68 5f 48 61 73 68 , sizeof(Th_Hash
efc0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a ));. return p;.
efd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65 }../*.** Iterate
efe0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c through all val
eff0: 75 65 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 ues currently st
f000: 6f 72 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 ored in the hash
f010: 20 74 61 62 6c 65 2e 20 49 6e 76 6f 6b 65 0a 2a table. Invoke.*
f020: 2a 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 * the callback f
f030: 75 6e 63 74 69 6f 6e 20 78 43 61 6c 6c 62 61 63 unction xCallbac
f040: 6b 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79 k for each entry
f050: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 . The second arg
f060: 75 6d 65 6e 74 0a 2a 2a 20 70 61 73 73 65 64 20 ument.** passed
f070: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 to xCallback is
f080: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 6f a copy of the fo
f090: 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 70 61 urth argument pa
f0a0: 73 73 65 64 20 74 6f 20 74 68 69 73 0a 2a 2a 20 ssed to this.**
f0b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 function..*/.voi
f0c0: 64 20 54 68 5f 48 61 73 68 49 74 65 72 61 74 65 d Th_HashIterate
f0d0: 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 (. Th_Interp *i
f0e0: 6e 74 65 72 70 2c 20 0a 20 20 54 68 5f 48 61 73 nterp, . Th_Has
f0f0: 68 20 2a 70 48 61 73 68 2c 0a 20 20 76 6f 69 64 h *pHash,. void
f100: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 54 68 (*xCallback)(Th
f110: 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e 74 _HashEntry *pEnt
f120: 72 79 2c 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 ry, void *pConte
f130: 78 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f xt),. void *pCo
f140: 6e 74 65 78 74 0a 29 7b 0a 20 20 69 6e 74 20 69 ntext.){. int i
f150: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 ;. for(i=0; i<T
f160: 48 5f 48 41 53 48 53 49 5a 45 3b 20 69 2b 2b 29 H_HASHSIZE; i++)
f170: 7b 0a 20 20 20 20 54 68 5f 48 61 73 68 45 6e 74 {. Th_HashEnt
f180: 72 79 20 2a 70 45 6e 74 72 79 3b 0a 20 20 20 20 ry *pEntry;.
f190: 54 68 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 4e Th_HashEntry *pN
f1a0: 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 45 6e ext;. for(pEn
f1b0: 74 72 79 3d 70 48 61 73 68 2d 3e 61 5b 69 5d 3b try=pHash->a[i];
f1c0: 20 70 45 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d pEntry; pEntry=
f1d0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e pNext){. pN
f1e0: 65 78 74 20 3d 20 70 45 6e 74 72 79 2d 3e 70 4e ext = pEntry->pN
f1f0: 65 78 74 3b 0a 20 20 20 20 20 20 78 43 61 6c 6c ext;. xCall
f200: 62 61 63 6b 28 70 45 6e 74 72 79 2c 20 70 43 6f back(pEntry, pCo
f210: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 ntext);. }.
f220: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 }.}../*.** Helpe
f230: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 54 r function for T
f240: 68 5f 48 61 73 68 44 65 6c 65 74 65 28 29 2e 0a h_HashDelete()..
f250: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 */.static void x
f260: 46 72 65 65 48 61 73 68 45 6e 74 72 79 28 54 68 FreeHashEntry(Th
f270: 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e 74 _HashEntry *pEnt
f280: 72 79 2c 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 ry, void *pConte
f290: 78 74 29 7b 0a 20 20 54 68 5f 46 72 65 65 28 28 xt){. Th_Free((
f2a0: 54 68 5f 49 6e 74 65 72 70 20 2a 29 70 43 6f 6e Th_Interp *)pCon
f2b0: 74 65 78 74 2c 20 28 76 6f 69 64 20 2a 29 70 45 text, (void *)pE
f2c0: 6e 74 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ntry);.}../*.**
f2d0: 46 72 65 65 20 61 20 68 61 73 68 2d 74 61 62 6c Free a hash-tabl
f2e0: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c e previously all
f2f0: 6f 63 61 74 65 64 20 62 79 20 54 68 5f 48 61 73 ocated by Th_Has
f300: 68 4e 65 77 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 hNew()..*/.void
f310: 54 68 5f 48 61 73 68 44 65 6c 65 74 65 28 54 68 Th_HashDelete(Th
f320: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
f330: 20 54 68 5f 48 61 73 68 20 2a 70 48 61 73 68 29 Th_Hash *pHash)
f340: 7b 0a 20 20 69 66 28 20 70 48 61 73 68 20 29 7b {. if( pHash ){
f350: 0a 20 20 20 20 54 68 5f 48 61 73 68 49 74 65 72 . Th_HashIter
f360: 61 74 65 28 69 6e 74 65 72 70 2c 20 70 48 61 73 ate(interp, pHas
f370: 68 2c 20 78 46 72 65 65 48 61 73 68 45 6e 74 72 h, xFreeHashEntr
f380: 79 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 y, (void *)inter
f390: 70 29 3b 0a 20 20 20 20 54 68 5f 46 72 65 65 28 p);. Th_Free(
f3a0: 69 6e 74 65 72 70 2c 20 70 48 61 73 68 29 3b 0a interp, pHash);.
f3b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 }.}../*.** Thi
f3c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 s function is us
f3d0: 65 64 20 74 6f 20 69 6e 73 65 72 74 20 6f 72 20 ed to insert or
f3e0: 64 65 6c 65 74 65 20 68 61 73 68 20 74 61 62 6c delete hash tabl
f3f0: 65 20 69 74 65 6d 73 2c 20 6f 72 20 74 6f 20 0a e items, or to .
f400: 2a 2a 20 71 75 65 72 79 20 61 20 68 61 73 68 20 ** query a hash
f410: 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 65 78 69 table for an exi
f420: 73 74 69 6e 67 20 69 74 65 6d 2e 0a 2a 2a 0a 2a sting item..**.*
f430: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f * If parameter o
f440: 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a p is less than z
f450: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 68 61 ero, then the ha
f460: 73 68 2d 74 61 62 6c 65 20 65 6c 65 6d 65 6e 74 sh-table element
f470: 20 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 .** identified
f480: 62 79 20 28 7a 4b 65 79 2c 20 6e 4b 65 79 29 20 by (zKey, nKey)
f490: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 is removed from
f4a0: 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 20 69 the hash-table i
f4b0: 66 20 69 74 0a 2a 2a 20 65 78 69 73 74 73 2e 20 f it.** exists.
f4c0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 NULL is returned
f4d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 ..**.** Otherwis
f4e0: 65 2c 20 69 66 20 74 68 65 20 68 61 73 68 2d 74 e, if the hash-t
f4f0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e able contains an
f500: 20 69 74 65 6d 20 77 69 74 68 20 6b 65 79 20 28 item with key (
f510: 7a 4b 65 79 2c 20 6e 4b 65 79 29 2c 0a 2a 2a 20 zKey, nKey),.**
f520: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 a pointer to the
f530: 20 61 73 73 6f 63 69 61 74 65 64 20 54 68 5f 48 associated Th_H
f540: 61 73 68 45 6e 74 72 79 20 69 73 20 72 65 74 75 ashEntry is retu
f550: 72 6e 65 64 2e 20 49 66 20 70 61 72 61 6d 65 74 rned. If paramet
f560: 65 72 0a 2a 2a 20 6f 70 20 69 73 20 67 72 65 61 er.** op is grea
f570: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 ter than zero, t
f580: 68 65 6e 20 61 20 6e 65 77 20 65 6e 74 72 79 20 hen a new entry
f590: 69 73 20 61 64 64 65 64 20 69 66 20 6f 6e 65 20 is added if one
f5a0: 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 66 6f 75 cannot.** be fou
f5b0: 6e 64 2e 20 49 66 20 6f 70 20 69 73 20 7a 65 72 nd. If op is zer
f5c0: 6f 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 o, then NULL is
f5d0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 returned if the
f5e0: 69 74 65 6d 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 item is.** not a
f5f0: 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 69 lready present i
f600: 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 n the hash-table
f610: 2e 0a 2a 2f 0a 54 68 5f 48 61 73 68 45 6e 74 72 ..*/.Th_HashEntr
f620: 79 20 2a 54 68 5f 48 61 73 68 46 69 6e 64 28 0a y *Th_HashFind(.
f630: 20 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Th_Interp *int
f640: 65 72 70 2c 20 0a 20 20 54 68 5f 48 61 73 68 20 erp, . Th_Hash
f650: 2a 70 48 61 73 68 2c 0a 20 20 63 6f 6e 73 74 20 *pHash,. const
f660: 75 63 68 61 72 20 2a 7a 4b 65 79 2c 0a 20 20 69 uchar *zKey,. i
f670: 6e 74 20 6e 4b 65 79 2c 0a 20 20 69 6e 74 20 6f nt nKey,. int o
f680: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p
f690: 20 20 20 20 20 20 20 2f 2a 20 2d 76 65 20 3d 20 /* -ve =
f6a0: 64 65 6c 65 74 65 2c 20 30 20 3d 20 66 69 6e 64 delete, 0 = find
f6b0: 2c 20 2b 76 65 20 3d 20 69 6e 73 65 72 74 20 2a , +ve = insert *
f6c0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 /.){. unsigned
f6d0: 69 6e 74 20 69 4b 65 79 20 3d 20 30 3b 0a 20 20 int iKey = 0;.
f6e0: 69 6e 74 20 69 3b 0a 20 20 54 68 5f 48 61 73 68 int i;. Th_Hash
f6f0: 45 6e 74 72 79 20 2a 70 52 65 74 3b 0a 20 20 54 Entry *pRet;. T
f700: 68 5f 48 61 73 68 45 6e 74 72 79 20 2a 2a 70 70 h_HashEntry **pp
f710: 52 65 74 3b 0a 0a 20 20 69 66 28 20 6e 4b 65 79 Ret;.. if( nKey
f720: 3c 30 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d <0 ){. nKey =
f730: 20 74 68 5f 73 74 72 6c 65 6e 28 7a 4b 65 79 29 th_strlen(zKey)
f740: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 ;. }.. for(i=0
f750: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a ; i<nKey; i++){.
f760: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 iKey = (iKey
f770: 3c 3c 33 29 20 5e 20 69 4b 65 79 20 5e 20 7a 4b <<3) ^ iKey ^ zK
f780: 65 79 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 4b 65 ey[i];. }. iKe
f790: 79 20 3d 20 69 4b 65 79 20 25 20 54 48 5f 48 41 y = iKey % TH_HA
f7a0: 53 48 53 49 5a 45 3b 0a 0a 20 20 66 6f 72 28 70 SHSIZE;.. for(p
f7b0: 70 52 65 74 3d 26 70 48 61 73 68 2d 3e 61 5b 69 pRet=&pHash->a[i
f7c0: 4b 65 79 5d 3b 20 28 70 52 65 74 3d 2a 70 70 52 Key]; (pRet=*ppR
f7d0: 65 74 29 3b 20 70 70 52 65 74 3d 26 70 52 65 74 et); ppRet=&pRet
f7e0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 ->pNext){. as
f7f0: 73 65 72 74 28 20 70 52 65 74 20 26 26 20 70 70 sert( pRet && pp
f800: 52 65 74 20 26 26 20 2a 70 70 52 65 74 3d 3d 70 Ret && *ppRet==p
f810: 52 65 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 Ret );. if( p
f820: 52 65 74 2d 3e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 Ret->nKey==nKey
f830: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 52 65 && 0==memcmp(pRe
f840: 74 2d 3e 7a 4b 65 79 2c 20 7a 4b 65 79 2c 20 6e t->zKey, zKey, n
f850: 4b 65 79 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 Key) ) break;.
f860: 7d 0a 0a 20 20 69 66 28 20 6f 70 3c 30 20 26 26 }.. if( op<0 &&
f870: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 61 73 73 pRet ){. ass
f880: 65 72 74 28 20 70 70 52 65 74 20 26 26 20 2a 70 ert( ppRet && *p
f890: 70 52 65 74 3d 3d 70 52 65 74 20 29 3b 0a 20 20 pRet==pRet );.
f8a0: 20 20 2a 70 70 52 65 74 20 3d 20 70 52 65 74 2d *ppRet = pRet-
f8b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 68 5f 46 >pNext;. Th_F
f8c0: 72 65 65 28 69 6e 74 65 72 70 2c 20 70 52 65 74 ree(interp, pRet
f8d0: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b );. pRet = 0;
f8e0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3e 30 . }.. if( op>0
f8f0: 20 26 26 20 21 70 52 65 74 20 29 7b 0a 20 20 20 && !pRet ){.
f900: 20 70 52 65 74 20 3d 20 28 54 68 5f 48 61 73 68 pRet = (Th_Hash
f910: 45 6e 74 72 79 20 2a 29 54 68 5f 4d 61 6c 6c 6f Entry *)Th_Mallo
f920: 63 28 69 6e 74 65 72 70 2c 20 73 69 7a 65 6f 66 c(interp, sizeof
f930: 28 54 68 5f 48 61 73 68 45 6e 74 72 79 29 20 2b (Th_HashEntry) +
f940: 20 6e 4b 65 79 29 3b 0a 20 20 20 20 70 52 65 74 nKey);. pRet
f950: 2d 3e 7a 4b 65 79 20 3d 20 28 75 63 68 61 72 20 ->zKey = (uchar
f960: 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 *)&pRet[1];.
f970: 70 52 65 74 2d 3e 6e 4b 65 79 20 3d 20 6e 4b 65 pRet->nKey = nKe
f980: 79 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 52 y;. memcpy(pR
f990: 65 74 2d 3e 7a 4b 65 79 2c 20 7a 4b 65 79 2c 20 et->zKey, zKey,
f9a0: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 52 65 74 2d nKey);. pRet-
f9b0: 3e 70 4e 65 78 74 20 3d 20 70 48 61 73 68 2d 3e >pNext = pHash->
f9c0: 61 5b 69 4b 65 79 5d 3b 0a 20 20 20 20 70 48 61 a[iKey];. pHa
f9d0: 73 68 2d 3e 61 5b 69 4b 65 79 5d 20 3d 20 70 52 sh->a[iKey] = pR
f9e0: 65 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 et;. }.. retur
f9f0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a n pRet;.}../*.**
fa00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 This function i
fa10: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 s the same as th
fa20: 65 20 73 74 61 6e 64 61 72 64 20 73 74 72 6c 65 e standard strle
fa30: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 65 78 n() function, ex
fa40: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 cept.** that it
fa50: 72 65 74 75 72 6e 73 20 30 20 28 69 6e 73 74 65 returns 0 (inste
fa60: 61 64 20 6f 66 20 62 65 69 6e 67 20 75 6e 64 65 ad of being unde
fa70: 66 69 6e 65 64 29 20 69 66 20 74 68 65 20 61 72 fined) if the ar
fa80: 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 61 20 6e gument is.** a n
fa90: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a ull pointer..*/.
faa0: 69 6e 74 20 74 68 5f 73 74 72 6c 65 6e 28 63 6f int th_strlen(co
fab0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
fac0: 72 20 2a 7a 53 74 72 29 7b 0a 20 20 69 6e 74 20 r *zStr){. int
fad0: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 53 74 n = 0;. if( zSt
fae0: 72 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 r ){. while(
faf0: 7a 53 74 72 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a 20 zStr[n] ) n++;.
fb00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d }. return n;.}
fb10: 0a 0a 2f 2a 20 57 68 69 74 65 73 70 61 63 65 20 ../* Whitespace
fb20: 63 68 61 72 61 63 74 65 72 73 3a 0a 2a 2a 0a 2a characters:.**.*
fb30: 2a 20 20 20 20 20 27 20 27 20 20 20 20 30 78 32 * ' ' 0x2
fb40: 30 0a 2a 2a 20 20 20 20 20 27 5c 74 27 20 20 20 0.** '\t'
fb50: 30 78 30 39 0a 2a 2a 20 20 20 20 20 27 5c 6e 27 0x09.** '\n'
fb60: 20 20 20 30 78 30 41 0a 2a 2a 20 20 20 20 20 27 0x0A.** '
fb70: 5c 76 27 20 20 20 30 78 30 42 0a 2a 2a 20 20 20 \v' 0x0B.**
fb80: 20 20 27 5c 66 27 20 20 20 30 78 30 43 0a 2a 2a '\f' 0x0C.**
fb90: 20 20 20 20 20 27 5c 72 27 20 20 20 30 78 30 44 '\r' 0x0D
fba0: 0a 2a 2a 0a 2a 2a 20 57 68 69 74 65 73 70 61 63 .**.** Whitespac
fbb0: 65 20 63 68 61 72 61 63 74 65 72 73 20 68 61 76 e characters hav
fbc0: 65 20 74 68 65 20 30 78 30 31 20 66 6c 61 67 20 e the 0x01 flag
fbd0: 73 65 74 2e 20 44 65 63 69 6d 61 6c 20 64 69 67 set. Decimal dig
fbe0: 69 74 73 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 its have the.**
fbf0: 30 78 32 20 66 6c 61 67 20 73 65 74 2e 20 53 69 0x2 flag set. Si
fc00: 6e 67 6c 65 20 62 79 74 65 20 70 72 69 6e 74 61 ngle byte printa
fc10: 62 6c 65 20 63 68 61 72 61 63 74 65 72 73 20 68 ble characters h
fc20: 61 76 65 20 74 68 65 20 30 78 34 20 66 6c 61 67 ave the 0x4 flag
fc30: 20 73 65 74 2e 0a 2a 2a 20 41 6c 70 68 61 62 65 set..** Alphabe
fc40: 74 20 63 68 61 72 61 63 74 65 72 73 20 68 61 76 t characters hav
fc50: 65 20 74 68 65 20 30 78 38 20 62 69 74 20 73 65 e the 0x8 bit se
fc60: 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 t. .**.** The sp
fc70: 65 63 69 61 6c 20 6c 69 73 74 20 63 68 61 72 61 ecial list chara
fc80: 63 74 65 72 73 20 68 61 76 65 20 74 68 65 20 30 cters have the 0
fc90: 78 31 30 20 66 6c 61 67 20 73 65 74 0a 2a 2a 0a x10 flag set.**.
fca0: 2a 2a 20 20 20 20 7b 20 7d 20 5b 20 5d 20 5c 20 ** { } [ ] \
fcb0: 3b 20 27 20 22 0a 2a 2a 0a 2a 2a 20 20 20 20 22 ; ' ".**.** "
fcc0: 20 30 78 32 32 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 0x22.**.*/.stat
fcd0: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ic unsigned char
fce0: 20 61 43 68 61 72 50 72 6f 70 5b 32 35 36 5d 20 aCharProp[256]
fcf0: 3d 20 7b 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c = {. 0, 0, 0,
fd00: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0, 0, 0, 0,
fd10: 20 20 30 2c 20 20 20 20 20 30 2c 20 20 31 2c 20 0, 0, 1,
fd20: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 1, 1, 1, 1,
fd30: 20 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 30 0, 0, /* 0x0
fd40: 2e 20 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 31 . */. 0, 0, 1
fd50: 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 , 1, 0, 0, 0
fd60: 2c 20 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c , 0, 0, 0,
fd70: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0, 0, 0, 0,
fd80: 20 20 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 0, 0, /* 0x
fd90: 31 2e 20 2a 2f 0a 20 20 35 2c 20 20 34 2c 20 32 1. */. 5, 4, 2
fda0: 30 2c 20 20 34 2c 20 20 34 2c 20 20 34 2c 20 20 0, 4, 4, 4,
fdb0: 34 2c 20 20 34 2c 20 20 20 20 20 34 2c 20 20 34 4, 4, 4, 4
fdc0: 2c 20 20 34 2c 20 20 34 2c 20 20 34 2c 20 20 34 , 4, 4, 4, 4
fdd0: 2c 20 20 34 2c 20 20 34 2c 20 20 20 2f 2a 20 30 , 4, 4, /* 0
fde0: 78 32 2e 20 2a 2f 0a 20 20 36 2c 20 20 36 2c 20 x2. */. 6, 6,
fdf0: 20 36 2c 20 20 36 2c 20 20 36 2c 20 20 36 2c 20 6, 6, 6, 6,
fe00: 20 36 2c 20 20 36 2c 20 20 20 20 20 36 2c 20 20 6, 6, 6,
fe10: 36 2c 20 20 34 2c 20 32 30 2c 20 20 34 2c 20 20 6, 4, 20, 4,
fe20: 34 2c 20 20 34 2c 20 20 34 2c 20 20 20 2f 2a 20 4, 4, 4, /*
fe30: 30 78 33 2e 20 2a 2f 0a 20 20 34 2c 20 31 32 2c 0x3. */. 4, 12,
fe40: 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 12, 12, 12, 12,
fe50: 20 31 32 2c 20 31 32 2c 20 20 20 20 31 32 2c 20 12, 12, 12,
fe60: 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 12, 12, 12, 12,
fe70: 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 2f 2a 12, 12, 12, /*
fe80: 20 30 78 34 2e 20 2a 2f 0a 20 31 32 2c 20 31 32 0x4. */. 12, 12
fe90: 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 , 12, 12, 12, 12
fea0: 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31 32 2c , 12, 12, 12,
feb0: 20 31 32 2c 20 31 32 2c 20 32 30 2c 20 32 30 2c 12, 12, 20, 20,
fec0: 20 32 30 2c 20 20 34 2c 20 20 34 2c 20 20 20 2f 20, 4, 4, /
fed0: 2a 20 30 78 35 2e 20 2a 2f 0a 20 20 34 2c 20 31 * 0x5. */. 4, 1
fee0: 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 2, 12, 12, 12, 1
fef0: 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31 32 2, 12, 12, 12
ff00: 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 , 12, 12, 12, 12
ff10: 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 , 12, 12, 12,
ff20: 2f 2a 20 30 78 36 2e 20 2a 2f 0a 20 31 32 2c 20 /* 0x6. */. 12,
ff30: 31 32 2c 20 31 32 2c 20 31 32 2c 20 31 32 2c 20 12, 12, 12, 12,
ff40: 31 32 2c 20 31 32 2c 20 31 32 2c 20 20 20 20 31 12, 12, 12, 1
ff50: 32 2c 20 31 32 2c 20 31 32 2c 20 32 30 2c 20 20 2, 12, 12, 20,
ff60: 34 2c 20 32 30 2c 20 20 34 2c 20 20 34 2c 20 20 4, 20, 4, 4,
ff70: 20 2f 2a 20 30 78 37 2e 20 2a 2f 0a 0a 20 20 30 /* 0x7. */.. 0
ff80: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 , 0, 0, 0, 0
ff90: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 20 , 0, 0, 0,
ffa0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0, 0, 0, 0,
ffb0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0, 0, 0, 0,
ffc0: 20 20 20 2f 2a 20 30 78 38 2e 20 2a 2f 0a 20 20 /* 0x8. */.
ffd0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 0, 0, 0, 0,
ffe0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 0, 0, 0, 0,
fff0: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 0, 0, 0, 0
10000 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 , 0, 0, 0, 0
10010 2c 20 20 20 2f 2a 20 30 78 39 2e 20 2a 2f 0a 20 , /* 0x9. */.
10020 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 0, 0, 0, 0,
10030 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 0, 0, 0, 0,
10040 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 0, 0, 0,
10050 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 0, 0, 0, 0,
10060 30 2c 20 20 20 2f 2a 20 30 78 41 2e 20 2a 2f 0a 0, /* 0xA. */.
10070 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0, 0, 0, 0,
10080 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0, 0, 0, 0,
10090 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 0, 0, 0,
100a0 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 0, 0, 0, 0,
100b0 20 30 2c 20 20 20 2f 2a 20 30 78 42 2e 20 2a 2f 0, /* 0xB. */
100c0 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 . 0, 0, 0, 0
100d0 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 , 0, 0, 0, 0
100e0 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 2c , 0, 0, 0,
100f0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0, 0, 0, 0,
10100 20 20 30 2c 20 20 20 2f 2a 20 30 78 43 2e 20 2a 0, /* 0xC. *
10110 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 /. 0, 0, 0,
10120 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 0, 0, 0, 0,
10130 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 0, 0, 0, 0
10140 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 , 0, 0, 0, 0
10150 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 44 2e 20 , 0, /* 0xD.
10160 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 */. 0, 0, 0,
10170 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 0, 0, 0, 0,
10180 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 0, 0, 0,
10190 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 0, 0, 0, 0,
101a0 30 2c 20 20 30 2c 20 20 20 2f 2a 20 30 78 45 2e 0, 0, /* 0xE.
101b0 20 2a 2f 0a 20 20 30 2c 20 20 30 2c 20 20 30 2c */. 0, 0, 0,
101c0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0, 0, 0, 0,
101d0 20 20 30 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 0, 0, 0,
101e0 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 0, 0, 0, 0,
101f0 20 30 2c 20 20 30 20 20 20 20 2f 2a 20 30 78 46 0, 0 /* 0xF
10200 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 . */.};../*.** C
10210 6c 6f 6e 65 20 6f 66 20 74 68 65 20 73 74 61 6e lone of the stan
10220 64 61 72 64 20 69 73 73 70 61 63 65 28 29 20 61 dard isspace() a
10230 6e 64 20 69 73 64 69 67 69 74 20 66 75 6e 63 74 nd isdigit funct
10240 69 6f 6e 2f 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 69 ion/macros..*/.i
10250 6e 74 20 74 68 5f 69 73 73 70 61 63 65 28 75 6e nt th_isspace(un
10260 73 69 67 6e 65 64 20 63 68 61 72 20 63 29 7b 0a signed char c){.
10270 20 20 72 65 74 75 72 6e 20 28 61 43 68 61 72 50 return (aCharP
10280 72 6f 70 5b 63 5d 20 26 20 30 78 30 31 29 3b 0a rop[c] & 0x01);.
10290 7d 0a 69 6e 74 20 74 68 5f 69 73 64 69 67 69 74 }.int th_isdigit
102a0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 (unsigned char c
102b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 43 68 ){. return (aCh
102c0 61 72 50 72 6f 70 5b 63 5d 20 26 20 30 78 30 32 arProp[c] & 0x02
102d0 29 3b 0a 7d 0a 69 6e 74 20 74 68 5f 69 73 73 70 );.}.int th_issp
102e0 65 63 69 61 6c 28 75 6e 73 69 67 6e 65 64 20 63 ecial(unsigned c
102f0 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75 72 6e har c){. return
10300 20 28 61 43 68 61 72 50 72 6f 70 5b 63 5d 20 26 (aCharProp[c] &
10310 20 30 78 31 31 29 3b 0a 7d 0a 69 6e 74 20 74 68 0x11);.}.int th
10320 5f 69 73 61 6c 6e 75 6d 28 75 6e 73 69 67 6e 65 _isalnum(unsigne
10330 64 20 63 68 61 72 20 63 29 7b 0a 20 20 72 65 74 d char c){. ret
10340 75 72 6e 20 28 61 43 68 61 72 50 72 6f 70 5b 63 urn (aCharProp[c
10350 5d 20 26 20 30 78 30 41 29 3b 0a 7d 0a 0a 23 69 ] & 0x0A);.}..#i
10360 66 6e 64 65 66 20 4c 4f 4e 47 44 4f 55 42 4c 45 fndef LONGDOUBLE
10370 5f 54 59 50 45 0a 23 20 64 65 66 69 6e 65 20 4c _TYPE.# define L
10380 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 6c ONGDOUBLE_TYPE l
10390 6f 6e 67 20 64 6f 75 62 6c 65 0a 23 65 6e 64 69 ong double.#endi
103a0 66 0a 74 79 70 65 64 65 66 20 75 63 68 61 72 20 f.typedef uchar
103b0 75 38 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 u8;.../*.** Retu
103c0 72 6e 20 54 52 55 45 20 69 66 20 7a 20 69 73 20 rn TRUE if z is
103d0 61 20 70 75 72 65 20 6e 75 6d 65 72 69 63 20 73 a pure numeric s
103e0 74 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 46 tring. Return F
103f0 41 4c 53 45 20 69 66 20 74 68 65 0a 2a 2a 20 73 ALSE if the.** s
10400 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 tring contains a
10410 6e 79 20 63 68 61 72 61 63 74 65 72 20 77 68 69 ny character whi
10420 63 68 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f ch is not part o
10430 66 20 61 20 6e 75 6d 62 65 72 2e 20 49 66 0a 2a f a number. If.*
10440 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 * the string is
10450 6e 75 6d 65 72 69 63 20 61 6e 64 20 63 6f 6e 74 numeric and cont
10460 61 69 6e 73 20 74 68 65 20 27 2e 27 20 63 68 61 ains the '.' cha
10470 72 61 63 74 65 72 2c 20 73 65 74 20 2a 72 65 61 racter, set *rea
10480 6c 6e 75 6d 0a 2a 2a 20 74 6f 20 54 52 55 45 20 lnum.** to TRUE
10490 28 6f 74 68 65 72 77 69 73 65 20 46 41 4c 53 45 (otherwise FALSE
104a0 29 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6d 70 74 )..**.** An empt
104b0 79 20 73 74 72 69 6e 67 20 69 73 20 63 6f 6e 73 y string is cons
104c0 69 64 65 72 65 64 20 6e 6f 6e 2d 6e 75 6d 65 72 idered non-numer
104d0 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ic..*/.static in
104e0 74 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 62 65 t sqlite3IsNumbe
104f0 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c r(const char *z,
10500 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a int *realnum){.
10510 20 20 69 6e 74 20 69 6e 63 72 20 3d 20 31 3b 0a int incr = 1;.
10520 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c if( *z=='-' ||
10530 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 20 2b 3d 20 *z=='+' ) z +=
10540 69 6e 63 72 3b 0a 20 20 69 66 28 20 21 74 68 5f incr;. if( !th_
10550 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 isdigit(*(u8*)z)
10560 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
10570 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 69 6e 63 ;. }. z += inc
10580 72 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d r;. if( realnum
10590 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b ) *realnum = 0;
105a0 0a 20 20 77 68 69 6c 65 28 20 74 68 5f 69 73 64 . while( th_isd
105b0 69 67 69 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b igit(*(u8*)z) ){
105c0 20 7a 20 2b 3d 20 69 6e 63 72 3b 20 7d 0a 20 20 z += incr; }.
105d0 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 if( *z=='.' ){.
105e0 20 20 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 z += incr;.
105f0 20 20 69 66 28 20 21 74 68 5f 69 73 64 69 67 69 if( !th_isdigi
10600 74 28 2a 28 75 38 2a 29 7a 29 20 29 20 72 65 74 t(*(u8*)z) ) ret
10610 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 urn 0;. while
10620 28 20 74 68 5f 69 73 64 69 67 69 74 28 2a 28 75 ( th_isdigit(*(u
10630 38 2a 29 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e 8*)z) ){ z += in
10640 63 72 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 cr; }. if( re
10650 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d alnum ) *realnum
10660 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 = 1;. }. if(
10670 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 *z=='e' || *z=='
10680 45 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20 69 E' ){. z += i
10690 6e 63 72 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d ncr;. if( *z=
106a0 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 ='+' || *z=='-'
106b0 29 20 7a 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 20 ) z += incr;.
106c0 20 69 66 28 20 21 74 68 5f 69 73 64 69 67 69 74 if( !th_isdigit
106d0 28 2a 28 75 38 2a 29 7a 29 20 29 20 72 65 74 75 (*(u8*)z) ) retu
106e0 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 rn 0;. while(
106f0 20 74 68 5f 69 73 64 69 67 69 74 28 2a 28 75 38 th_isdigit(*(u8
10700 2a 29 7a 29 20 29 7b 20 7a 20 2b 3d 20 69 6e 63 *)z) ){ z += inc
10710 72 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61 r; }. if( rea
10720 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 lnum ) *realnum
10730 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 = 1;. }. retur
10740 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a n *z==0;.}../*.*
10750 2a 20 54 68 65 20 73 74 72 69 6e 67 20 7a 5b 5d * The string z[]
10760 20 69 73 20 61 6e 20 61 73 63 69 69 20 72 65 70 is an ascii rep
10770 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 resentation of a
10780 20 72 65 61 6c 20 6e 75 6d 62 65 72 2e 0a 2a 2a real number..**
10790 20 43 6f 6e 76 65 72 74 20 74 68 69 73 20 73 74 Convert this st
107a0 72 69 6e 67 20 74 6f 20 61 20 64 6f 75 62 6c 65 ring to a double
107b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ..**.** This rou
107c0 74 69 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61 tine assumes tha
107d0 74 20 7a 5b 5d 20 72 65 61 6c 6c 79 20 69 73 20 t z[] really is
107e0 61 20 76 61 6c 69 64 20 6e 75 6d 62 65 72 2e 20 a valid number.
107f0 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74 If it.** is not
10800 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 , the result is
10810 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a undefined..**.**
10820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 This routine is
10830 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 used instead of
10840 20 74 68 65 20 6c 69 62 72 61 72 79 20 61 74 6f the library ato
10850 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 65 63 f() function bec
10860 61 75 73 65 0a 2a 2a 20 74 68 65 20 6c 69 62 72 ause.** the libr
10870 61 72 79 20 61 74 6f 66 28 29 20 6d 69 67 68 74 ary atof() might
10880 20 77 61 6e 74 20 74 6f 20 75 73 65 20 22 2c 22 want to use ","
10890 20 61 73 20 74 68 65 20 64 65 63 69 6d 61 6c 20 as the decimal
108a0 70 6f 69 6e 74 20 69 6e 73 74 65 61 64 0a 2a 2a point instead.**
108b0 20 6f 66 20 22 2e 22 20 64 65 70 65 6e 64 69 6e of "." dependin
108c0 67 20 6f 6e 20 68 6f 77 20 6c 6f 63 61 6c 65 20 g on how locale
108d0 69 73 20 73 65 74 2e 20 20 42 75 74 20 74 68 61 is set. But tha
108e0 74 20 77 6f 75 6c 64 20 63 61 75 73 65 20 70 72 t would cause pr
108f0 6f 62 6c 65 6d 73 0a 2a 2a 20 66 6f 72 20 53 51 oblems.** for SQ
10900 4c 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 L. So this rout
10910 69 6e 65 20 61 6c 77 61 79 73 20 75 73 65 73 20 ine always uses
10920 22 2e 22 20 72 65 67 61 72 64 6c 65 73 73 20 6f "." regardless o
10930 66 20 6c 6f 63 61 6c 65 2e 0a 2a 2f 0a 73 74 61 f locale..*/.sta
10940 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 41 tic int sqlite3A
10950 74 6f 46 28 63 6f 6e 73 74 20 63 68 61 72 20 2a toF(const char *
10960 7a 2c 20 64 6f 75 62 6c 65 20 2a 70 52 65 73 75 z, double *pResu
10970 6c 74 29 7b 0a 20 20 69 6e 74 20 73 69 67 6e 20 lt){. int sign
10980 3d 20 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 = 1;. const cha
10990 72 20 2a 7a 42 65 67 69 6e 20 3d 20 7a 3b 0a 20 r *zBegin = z;.
109a0 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 LONGDOUBLE_TYPE
109b0 20 76 31 20 3d 20 30 2e 30 3b 0a 20 20 77 68 69 v1 = 0.0;. whi
109c0 6c 65 28 20 74 68 5f 69 73 73 70 61 63 65 28 2a le( th_isspace(*
109d0 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 (u8*)z) ) z++;.
109e0 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a if( *z=='-' ){.
109f0 20 20 20 20 73 69 67 6e 20 3d 20 2d 31 3b 0a 20 sign = -1;.
10a00 20 20 20 7a 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 z++;. }else
10a10 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 if( *z=='+' ){.
10a20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 z++;. }. wh
10a30 69 6c 65 28 20 74 68 5f 69 73 64 69 67 69 74 28 ile( th_isdigit(
10a40 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 20 20 *(u8*)z) ){.
10a50 76 31 20 3d 20 76 31 2a 31 30 2e 30 20 2b 20 28 v1 = v1*10.0 + (
10a60 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 7a *z - '0');. z
10a70 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a ++;. }. if( *z
10a80 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 4c 4f 4e =='.' ){. LON
10a90 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 64 69 76 GDOUBLE_TYPE div
10aa0 69 73 6f 72 20 3d 20 31 2e 30 3b 0a 20 20 20 20 isor = 1.0;.
10ab0 7a 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 z++;. while(
10ac0 74 68 5f 69 73 64 69 67 69 74 28 2a 28 75 38 2a th_isdigit(*(u8*
10ad0 29 7a 29 20 29 7b 0a 20 20 20 20 20 20 76 31 20 )z) ){. v1
10ae0 3d 20 76 31 2a 31 30 2e 30 20 2b 20 28 2a 7a 20 = v1*10.0 + (*z
10af0 2d 20 27 30 27 29 3b 0a 20 20 20 20 20 20 64 69 - '0');. di
10b00 76 69 73 6f 72 20 2a 3d 20 31 30 2e 30 3b 0a 20 visor *= 10.0;.
10b10 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a z++;. }.
10b20 20 20 20 20 76 31 20 2f 3d 20 64 69 76 69 73 6f v1 /= diviso
10b30 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d r;. }. if( *z=
10b40 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 ='e' || *z=='E'
10b50 29 7b 0a 20 20 20 20 69 6e 74 20 65 73 69 67 6e ){. int esign
10b60 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 76 = 1;. int ev
10b70 61 6c 20 3d 20 30 3b 0a 20 20 20 20 4c 4f 4e 47 al = 0;. LONG
10b80 44 4f 55 42 4c 45 5f 54 59 50 45 20 73 63 61 6c DOUBLE_TYPE scal
10b90 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20 7a 2b 2b e = 1.0;. z++
10ba0 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2d ;. if( *z=='-
10bb0 27 20 29 7b 0a 20 20 20 20 20 20 65 73 69 67 6e ' ){. esign
10bc0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7a 2b 2b = -1;. z++
10bd0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
10be0 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 20 *z=='+' ){.
10bf0 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 z++;. }.
10c00 77 68 69 6c 65 28 20 74 68 5f 69 73 64 69 67 69 while( th_isdigi
10c10 74 28 2a 28 75 38 2a 29 7a 29 20 29 7b 0a 20 20 t(*(u8*)z) ){.
10c20 20 20 20 20 65 76 61 6c 20 3d 20 65 76 61 6c 2a eval = eval*
10c30 31 30 20 2b 20 2a 7a 20 2d 20 27 30 27 3b 0a 20 10 + *z - '0';.
10c40 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a z++;. }.
10c50 20 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e while( eval>
10c60 3d 36 34 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 =64 ){ scale *=
10c70 31 2e 30 65 2b 36 34 3b 20 65 76 61 6c 20 2d 3d 1.0e+64; eval -=
10c80 20 36 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 64; }. while
10c90 28 20 65 76 61 6c 3e 3d 31 36 20 29 7b 20 73 63 ( eval>=16 ){ sc
10ca0 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 36 3b 20 ale *= 1.0e+16;
10cb0 65 76 61 6c 20 2d 3d 20 31 36 3b 20 7d 0a 20 20 eval -= 16; }.
10cc0 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d 34 while( eval>=4
10cd0 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 ){ scale *= 1.0
10ce0 65 2b 34 3b 20 65 76 61 6c 20 2d 3d 20 34 3b 20 e+4; eval -= 4;
10cf0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76 61 }. while( eva
10d00 6c 3e 3d 31 20 29 7b 20 73 63 61 6c 65 20 2a 3d l>=1 ){ scale *=
10d10 20 31 2e 30 65 2b 31 3b 20 65 76 61 6c 20 2d 3d 1.0e+1; eval -=
10d20 20 31 3b 20 7d 0a 20 20 20 20 69 66 28 20 65 73 1; }. if( es
10d30 69 67 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 76 ign<0 ){. v
10d40 31 20 2f 3d 20 73 63 61 6c 65 3b 0a 20 20 20 20 1 /= scale;.
10d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 31 20 }else{. v1
10d60 2a 3d 20 73 63 61 6c 65 3b 0a 20 20 20 20 7d 0a *= scale;. }.
10d70 20 20 7d 0a 20 20 2a 70 52 65 73 75 6c 74 20 3d }. *pResult =
10d80 20 73 69 67 6e 3c 30 20 3f 20 2d 76 31 20 3a 20 sign<0 ? -v1 :
10d90 76 31 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 2d v1;. return z -
10da0 20 7a 42 65 67 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a zBegin;.}../*.*
10db0 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 * Try to convert
10dc0 20 74 68 65 20 73 74 72 69 6e 67 20 70 61 73 73 the string pass
10dd0 65 64 20 61 73 20 61 72 67 75 6d 65 6e 74 73 20 ed as arguments
10de0 28 7a 2c 20 6e 29 20 74 6f 20 61 6e 20 69 6e 74 (z, n) to an int
10df0 65 67 65 72 2e 0a 2a 2a 20 49 66 20 73 75 63 63 eger..** If succ
10e00 65 73 73 66 75 6c 2c 20 73 74 6f 72 65 20 74 68 essful, store th
10e10 65 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 69 4f e result in *piO
10e20 75 74 20 61 6e 64 20 72 65 74 75 72 6e 20 54 48 ut and return TH
10e30 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 _OK. .**.** If t
10e40 68 65 20 73 74 72 69 6e 67 20 63 61 6e 6e 6f 74 he string cannot
10e50 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f be converted to
10e60 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 74 an integer, ret
10e70 75 72 6e 20 54 48 5f 45 52 52 4f 52 2e 20 0a 2a urn TH_ERROR. .*
10e80 2a 20 49 66 20 74 68 65 20 69 6e 74 65 72 70 20 * If the interp
10e90 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 argument is not
10ea0 4e 55 4c 4c 2c 20 6c 65 61 76 65 20 61 6e 20 65 NULL, leave an e
10eb0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 rror message in
10ec0 74 68 65 20 0a 2a 2a 20 69 6e 74 65 72 70 72 65 the .** interpre
10ed0 74 65 72 20 72 65 73 75 6c 74 20 74 6f 6f 2e 0a ter result too..
10ee0 2a 2f 0a 69 6e 74 20 54 68 5f 54 6f 49 6e 74 28 */.int Th_ToInt(
10ef0 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 Th_Interp *inter
10f00 70 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a p, const uchar *
10f10 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 2a 70 z, int n, int *p
10f20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d iOut){. int i =
10f30 20 30 3b 0a 20 20 69 6e 74 20 69 4f 75 74 20 3d 0;. int iOut =
10f40 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3c 30 20 29 0;.. if( n<0 )
10f50 7b 0a 20 20 20 20 6e 20 3d 20 74 68 5f 73 74 72 {. n = th_str
10f60 6c 65 6e 28 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 len(z);. }.. i
10f70 66 28 20 6e 3e 30 20 26 26 20 28 7a 5b 30 5d 3d f( n>0 && (z[0]=
10f80 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b ='-' || z[0]=='+
10f90 27 29 20 29 7b 0a 20 20 20 20 69 20 3d 20 31 3b ') ){. i = 1;
10fa0 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 69 3c 6e . }. for(; i<n
10fb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 ; i++){. if(
10fc0 21 74 68 5f 69 73 64 69 67 69 74 28 7a 5b 69 5d !th_isdigit(z[i]
10fd0 29 20 29 7b 0a 20 20 20 20 20 20 54 68 5f 45 72 ) ){. Th_Er
10fe0 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 72 rorMessage(inter
10ff0 70 2c 20 22 65 78 70 65 63 74 65 64 20 69 6e 74 p, "expected int
11000 65 67 65 72 2c 20 67 6f 74 3a 20 5c 22 22 2c 20 eger, got: \"",
11010 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 z, n);. ret
11020 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 urn TH_ERROR;.
11030 20 20 7d 0a 20 20 20 20 69 4f 75 74 20 3d 20 69 }. iOut = i
11040 4f 75 74 20 2a 20 31 30 20 2b 20 28 7a 5b 69 5d Out * 10 + (z[i]
11050 20 2d 20 34 38 29 3b 0a 20 20 7d 0a 0a 20 20 69 - 48);. }.. i
11060 66 28 20 6e 3e 30 20 26 26 20 7a 5b 30 5d 3d 3d f( n>0 && z[0]==
11070 27 2d 27 20 29 7b 0a 20 20 20 20 69 4f 75 74 20 '-' ){. iOut
11080 2a 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2a 70 *= -1;. }.. *p
11090 69 4f 75 74 20 3d 20 69 4f 75 74 3b 0a 20 20 72 iOut = iOut;. r
110a0 65 74 75 72 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a eturn TH_OK;.}..
110b0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e /*.** Try to con
110c0 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 vert the string
110d0 70 61 73 73 65 64 20 61 73 20 61 72 67 75 6d 65 passed as argume
110e0 6e 74 73 20 28 7a 2c 20 6e 29 20 74 6f 20 61 20 nts (z, n) to a
110f0 64 6f 75 62 6c 65 2e 0a 2a 2a 20 49 66 20 73 75 double..** If su
11100 63 63 65 73 73 66 75 6c 2c 20 73 74 6f 72 65 20 ccessful, store
11110 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 the result in *p
11120 66 4f 75 74 20 61 6e 64 20 72 65 74 75 72 6e 20 fOut and return
11130 54 48 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 TH_OK. .**.** If
11140 20 74 68 65 20 73 74 72 69 6e 67 20 63 61 6e 6e the string cann
11150 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 ot be converted
11160 74 6f 20 61 20 64 6f 75 62 6c 65 2c 20 72 65 74 to a double, ret
11170 75 72 6e 20 54 48 5f 45 52 52 4f 52 2e 20 0a 2a urn TH_ERROR. .*
11180 2a 20 49 66 20 74 68 65 20 69 6e 74 65 72 70 20 * If the interp
11190 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 argument is not
111a0 4e 55 4c 4c 2c 20 6c 65 61 76 65 20 61 6e 20 65 NULL, leave an e
111b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 rror message in
111c0 74 68 65 20 0a 2a 2a 20 69 6e 74 65 72 70 72 65 the .** interpre
111d0 74 65 72 20 72 65 73 75 6c 74 20 74 6f 6f 2e 0a ter result too..
111e0 2a 2f 0a 69 6e 74 20 54 68 5f 54 6f 44 6f 75 62 */.int Th_ToDoub
111f0 6c 65 28 0a 20 20 54 68 5f 49 6e 74 65 72 70 20 le(. Th_Interp
11200 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 *interp, . cons
11210 74 20 75 63 68 61 72 20 2a 7a 2c 20 0a 20 20 69 t uchar *z, . i
11220 6e 74 20 6e 2c 20 0a 20 20 64 6f 75 62 6c 65 20 nt n, . double
11230 2a 70 66 4f 75 74 0a 29 7b 0a 20 20 69 66 28 20 *pfOut.){. if(
11240 21 73 71 6c 69 74 65 33 49 73 4e 75 6d 62 65 72 !sqlite3IsNumber
11250 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 7a ((const char *)z
11260 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 68 5f 45 , 0) ){. Th_E
11270 72 72 6f 72 4d 65 73 73 61 67 65 28 69 6e 74 65 rrorMessage(inte
11280 72 70 2c 20 22 65 78 70 65 63 74 65 64 20 6e 75 rp, "expected nu
11290 6d 62 65 72 2c 20 67 6f 74 3a 20 5c 22 22 2c 20 mber, got: \"",
112a0 7a 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 z, n);. retur
112b0 6e 20 54 48 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a n TH_ERROR;. }.
112c0 0a 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 28 . sqlite3AtoF((
112d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 7a 2c 20 const char *)z,
112e0 70 66 4f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e pfOut);. return
112f0 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a TH_OK;.}../*.**
11300 20 53 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 Set the result
11310 6f 66 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 of the interpret
11320 65 72 20 74 6f 20 74 68 65 20 74 68 31 20 72 65 er to the th1 re
11330 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 0a presentation of.
11340 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 ** the integer i
11350 56 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 54 Val and return T
11360 48 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 54 68 5f H_OK..*/.int Th_
11370 53 65 74 52 65 73 75 6c 74 49 6e 74 28 54 68 5f SetResultInt(Th_
11380 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
11390 69 6e 74 20 69 56 61 6c 29 7b 0a 20 20 69 6e 74 int iVal){. int
113a0 20 69 73 4e 65 67 61 74 69 76 65 20 3d 20 30 3b isNegative = 0;
113b0 0a 20 20 75 63 68 61 72 20 7a 42 75 66 5b 33 32 . uchar zBuf[32
113c0 5d 3b 0a 20 20 75 63 68 61 72 20 2a 7a 20 3d 20 ];. uchar *z =
113d0 26 7a 42 75 66 5b 33 32 5d 3b 0a 0a 20 20 69 66 &zBuf[32];.. if
113e0 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20 20 ( iVal<0 ){.
113f0 69 73 4e 65 67 61 74 69 76 65 20 3d 20 31 3b 0a isNegative = 1;.
11400 20 20 20 20 69 56 61 6c 20 3d 20 69 56 61 6c 20 iVal = iVal
11410 2a 20 2d 31 3b 0a 20 20 7d 0a 20 20 2a 28 2d 2d * -1;. }. *(--
11420 7a 29 20 3d 20 27 5c 30 27 3b 0a 20 20 2a 28 2d z) = '\0';. *(-
11430 2d 7a 29 20 3d 20 28 75 63 68 61 72 29 28 34 38 -z) = (uchar)(48
11440 2b 28 69 56 61 6c 25 31 30 29 29 3b 0a 20 20 77 +(iVal%10));. w
11450 68 69 6c 65 28 20 28 69 56 61 6c 20 3d 20 28 69 hile( (iVal = (i
11460 56 61 6c 2f 31 30 29 29 3e 30 20 29 7b 0a 20 20 Val/10))>0 ){.
11470 20 20 2a 28 2d 2d 7a 29 20 3d 20 28 75 63 68 61 *(--z) = (ucha
11480 72 29 28 34 38 2b 28 69 56 61 6c 25 31 30 29 29 r)(48+(iVal%10))
11490 3b 0a 20 20 20 20 61 73 73 65 72 74 28 7a 3e 7a ;. assert(z>z
114a0 42 75 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 Buf);. }. if(
114b0 69 73 4e 65 67 61 74 69 76 65 20 29 7b 0a 20 20 isNegative ){.
114c0 20 20 2a 28 2d 2d 7a 29 20 3d 20 27 2d 27 3b 0a *(--z) = '-';.
114d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 68 }.. return Th
114e0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
114f0 70 2c 20 7a 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a p, z, -1);.}../*
11500 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 73 75 .** Set the resu
11510 6c 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72 70 lt of the interp
11520 72 65 74 65 72 20 74 6f 20 74 68 65 20 74 68 31 reter to the th1
11530 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 representation
11540 6f 66 0a 2a 2a 20 74 68 65 20 64 6f 75 62 6c 65 of.** the double
11550 20 66 56 61 6c 20 61 6e 64 20 72 65 74 75 72 6e fVal and return
11560 20 54 48 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 54 TH_OK..*/.int T
11570 68 5f 53 65 74 52 65 73 75 6c 74 44 6f 75 62 6c h_SetResultDoubl
11580 65 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 e(Th_Interp *int
11590 65 72 70 2c 20 64 6f 75 62 6c 65 20 66 56 61 6c erp, double fVal
115a0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 ){. int i;
115b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 /* It
115c0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 erator variable
115d0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 76 20 3d 20 */. double v =
115e0 66 56 61 6c 3b 20 20 20 20 20 20 2f 2a 20 49 6e fVal; /* In
115f0 70 75 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 put value */. u
11600 63 68 61 72 20 7a 42 75 66 5b 31 32 38 5d 3b 20 char zBuf[128];
11610 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 /* Output b
11620 75 66 66 65 72 20 2a 2f 0a 20 20 75 63 68 61 72 uffer */. uchar
11630 20 2a 7a 20 3d 20 7a 42 75 66 3b 20 20 20 20 20 *z = zBuf;
11640 20 2f 2a 20 4f 75 74 70 75 74 20 63 75 72 73 6f /* Output curso
11650 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 6f 74 20 r */. int iDot
11660 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 = 0; /*
11670 44 69 67 69 74 20 61 66 74 65 72 20 77 68 69 63 Digit after whic
11680 68 20 74 6f 20 70 6c 61 63 65 20 64 65 63 69 6d h to place decim
11690 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e al point */. in
116a0 74 20 69 45 78 70 20 3d 20 30 3b 20 20 20 20 20 t iExp = 0;
116b0 20 20 20 20 2f 2a 20 45 78 70 6f 6e 65 6e 74 20 /* Exponent
116c0 28 4e 4e 20 69 6e 20 65 4e 4e 29 20 2a 2f 0a 20 (NN in eNN) */.
116d0 20 63 6f 6e 73 74 20 75 63 68 61 72 20 2a 7a 45 const uchar *zE
116e0 78 70 3b 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 xp; /* String
116f0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 representation
11700 6f 66 20 69 45 78 70 20 2a 2f 0a 0a 20 20 2f 2a of iExp */.. /*
11710 20 50 72 65 63 69 73 69 6f 6e 3a 20 2a 2f 0a 20 Precision: */.
11720 20 23 64 65 66 69 6e 65 20 49 4e 53 49 47 4e 49 #define INSIGNI
11730 46 49 43 41 4e 54 20 30 2e 30 30 30 30 30 30 30 FICANT 0.0000000
11740 30 30 30 30 31 0a 20 20 23 64 65 66 69 6e 65 20 00001. #define
11750 52 4f 55 4e 44 45 52 20 20 20 20 20 20 20 30 2e ROUNDER 0.
11760 30 30 30 30 30 30 30 30 30 30 30 30 35 0a 20 20 0000000000005.
11770 64 6f 75 62 6c 65 20 69 6e 73 69 67 6e 69 66 69 double insignifi
11780 63 61 6e 74 20 3d 20 49 4e 53 49 47 4e 49 46 49 cant = INSIGNIFI
11790 43 41 4e 54 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 CANT;.. /* If t
117a0 68 65 20 72 65 61 6c 20 76 61 6c 75 65 20 69 73 he real value is
117b0 20 6e 65 67 61 74 69 76 65 2c 20 77 72 69 74 65 negative, write
117c0 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 a '-' character
117d0 20 74 6f 20 74 68 65 0a 20 20 20 2a 20 6f 75 74 to the. * out
117e0 70 75 74 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 put and transfor
117f0 6d 20 76 20 74 6f 20 74 68 65 20 63 6f 72 72 65 m v to the corre
11800 73 70 6f 6e 64 69 6e 67 20 70 6f 73 69 74 69 76 sponding positiv
11810 65 20 6e 75 6d 62 65 72 2e 0a 20 20 20 2a 2f 20 e number.. */
11820 0a 20 20 69 66 28 20 76 3c 30 2e 30 20 29 7b 0a . if( v<0.0 ){.
11830 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2d 27 3b 0a *z++ = '-';.
11840 20 20 20 20 76 20 2a 3d 20 2d 31 2e 30 3b 0a 20 v *= -1.0;.
11850 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 69 }.. /* Normali
11860 7a 65 20 76 20 74 6f 20 61 20 76 61 6c 75 65 20 ze v to a value
11870 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64 20 between 1.0 and
11880 31 30 2e 30 2e 20 49 6e 74 65 67 65 72 20 0a 20 10.0. Integer .
11890 20 20 2a 20 76 61 72 69 61 62 6c 65 20 69 45 78 * variable iEx
118a0 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 p is set to the
118b0 65 78 70 6f 6e 65 6e 74 2e 20 69 2e 65 20 74 68 exponent. i.e th
118c0 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 20 2a 20 e original. *
118d0 76 61 6c 75 65 20 69 73 20 28 76 20 2a 20 31 30 value is (v * 10
118e0 5e 69 45 78 70 29 20 28 6f 72 20 74 68 65 20 6e ^iExp) (or the n
118f0 65 67 61 74 69 76 65 20 74 68 65 72 65 6f 66 29 egative thereof)
11900 2e 0a 20 20 20 2a 2f 20 0a 20 20 69 66 28 20 76 .. */ . if( v
11910 3e 30 2e 30 20 29 7b 0a 20 20 20 20 77 68 69 6c >0.0 ){. whil
11920 65 28 20 28 76 2b 52 4f 55 4e 44 45 52 29 3e 3d e( (v+ROUNDER)>=
11930 31 30 2e 30 20 29 20 7b 20 69 45 78 70 2b 2b 3b 10.0 ) { iExp++;
11940 20 76 20 2a 3d 20 30 2e 31 3b 20 7d 0a 20 20 20 v *= 0.1; }.
11950 20 77 68 69 6c 65 28 20 28 76 2b 52 4f 55 4e 44 while( (v+ROUND
11960 45 52 29 3c 31 2e 30 20 29 20 20 20 7b 20 69 45 ER)<1.0 ) { iE
11970 78 70 2d 2d 3b 20 76 20 2a 3d 20 31 30 2e 30 3b xp--; v *= 10.0;
11980 20 7d 0a 20 20 7d 0a 20 20 76 20 2b 3d 20 52 4f }. }. v += RO
11990 55 4e 44 45 52 3b 0a 0a 20 20 2f 2a 20 46 6f 72 UNDER;.. /* For
119a0 20 61 20 73 6d 61 6c 6c 20 28 3c 31 32 29 20 70 a small (<12) p
119b0 6f 73 69 74 69 76 65 20 65 78 70 6f 6e 65 6e 74 ositive exponent
119c0 2c 20 6d 6f 76 65 20 74 68 65 20 64 65 63 69 6d , move the decim
119d0 61 6c 20 70 6f 69 6e 74 0a 20 20 20 2a 20 69 6e al point. * in
119e0 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 74 stead of using t
119f0 68 65 20 22 65 58 58 22 20 6e 6f 74 61 74 69 6f he "eXX" notatio
11a00 6e 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 69 n.. */. if( i
11a10 45 78 70 3e 30 20 26 26 20 69 45 78 70 3c 31 32 Exp>0 && iExp<12
11a20 20 29 7b 0a 20 20 20 20 69 44 6f 74 20 3d 20 69 ){. iDot = i
11a30 45 78 70 3b 0a 20 20 20 20 69 45 78 70 20 3d 20 Exp;. iExp =
11a40 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 0;. }.. /* For
11a50 20 61 20 73 6d 61 6c 6c 20 28 3e 2d 34 29 20 6e a small (>-4) n
11a60 65 67 61 74 69 76 65 20 65 78 70 6f 6e 65 6e 74 egative exponent
11a70 2c 20 77 72 69 74 65 20 6c 65 61 64 69 6e 67 20 , write leading
11a80 7a 65 72 6f 65 73 0a 20 20 20 2a 20 69 6e 73 74 zeroes. * inst
11a90 65 61 64 20 6f 66 20 75 73 69 6e 67 20 74 68 65 ead of using the
11aa0 20 22 65 58 58 22 20 6e 6f 74 61 74 69 6f 6e 2e "eXX" notation.
11ab0 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 69 45 78 . */. if( iEx
11ac0 70 3c 30 20 26 26 20 69 45 78 70 3e 2d 34 20 29 p<0 && iExp>-4 )
11ad0 7b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 30 27 {. *z++ = '0'
11ae0 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2e 27 ;. *z++ = '.'
11af0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 ;. for(i=0; i
11b00 3e 28 69 45 78 70 2b 31 29 3b 20 69 2d 2d 29 7b >(iExp+1); i--){
11b10 0a 20 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 30 . *z++ = '0
11b20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 6f ';. }. iDo
11b30 74 20 3d 20 2d 31 3b 0a 20 20 20 20 69 45 78 70 t = -1;. iExp
11b40 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 = 0;. }.. /*
11b50 4f 75 74 70 75 74 20 74 68 65 20 64 69 67 69 74 Output the digit
11b60 73 20 69 6e 20 72 65 61 6c 20 76 61 6c 75 65 20 s in real value
11b70 76 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 v. The value of
11b80 69 44 6f 74 20 64 65 74 65 72 6d 69 6e 65 73 0a iDot determines.
11b90 20 20 20 2a 20 77 68 65 72 65 20 28 69 66 20 61 * where (if a
11ba0 74 20 61 6c 6c 29 20 74 68 65 20 64 65 63 69 6d t all) the decim
11bb0 61 6c 20 70 6f 69 6e 74 20 69 73 20 70 6c 61 63 al point is plac
11bc0 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 66 6f 72 28 ed.. */. for(
11bd0 69 3d 30 3b 20 69 3c 3d 28 69 44 6f 74 2b 31 29 i=0; i<=(iDot+1)
11be0 20 7c 7c 20 76 3e 3d 69 6e 73 69 67 6e 69 66 69 || v>=insignifi
11bf0 63 61 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 cant; i++){.
11c00 2a 7a 2b 2b 20 3d 20 28 75 63 68 61 72 29 28 34 *z++ = (uchar)(4
11c10 38 20 2b 20 28 69 6e 74 29 76 29 3b 0a 20 20 20 8 + (int)v);.
11c20 20 76 20 3d 20 28 76 20 2d 20 28 28 64 6f 75 62 v = (v - ((doub
11c30 6c 65 29 28 69 6e 74 29 76 29 29 20 2a 20 31 30 le)(int)v)) * 10
11c40 2e 30 3b 0a 20 20 20 20 69 6e 73 69 67 6e 69 66 .0;. insignif
11c50 69 63 61 6e 74 20 2a 3d 20 31 30 2e 30 3b 0a 20 icant *= 10.0;.
11c60 20 20 20 69 66 28 20 69 44 6f 74 3d 3d 69 20 29 if( iDot==i )
11c70 7b 0a 20 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 {. *z++ = '
11c80 2e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 .';. }. }..
11c90 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 6f 6e /* If the expon
11ca0 65 6e 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c ent is not zero,
11cb0 20 61 64 64 20 74 68 65 20 22 65 58 58 22 20 6e add the "eXX" n
11cc0 6f 74 61 74 69 6f 6e 20 74 6f 20 74 68 65 0a 20 otation to the.
11cd0 20 20 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 * end of the s
11ce0 74 72 69 6e 67 2e 0a 20 20 20 2a 2f 0a 20 20 69 tring.. */. i
11cf0 66 28 20 69 45 78 70 21 3d 30 20 29 7b 0a 20 20 f( iExp!=0 ){.
11d00 20 20 2a 7a 2b 2b 20 3d 20 27 65 27 3b 0a 20 20 *z++ = 'e';.
11d10 20 20 54 68 5f 53 65 74 52 65 73 75 6c 74 49 6e Th_SetResultIn
11d20 74 28 69 6e 74 65 72 70 2c 20 69 45 78 70 29 3b t(interp, iExp);
11d30 0a 20 20 20 20 7a 45 78 70 20 3d 20 54 68 5f 47 . zExp = Th_G
11d40 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
11d50 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 0);. for(i=0
11d60 3b 20 7a 45 78 70 5b 69 5d 3b 20 69 2b 2b 29 7b ; zExp[i]; i++){
11d70 0a 20 20 20 20 20 20 2a 7a 2b 2b 20 3d 20 7a 45 . *z++ = zE
11d80 78 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d xp[i];. }. }
11d90 0a 0a 20 20 2a 7a 20 3d 20 27 5c 30 27 3b 0a 20 .. *z = '\0';.
11da0 20 72 65 74 75 72 6e 20 54 68 5f 53 65 74 52 65 return Th_SetRe
11db0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 sult(interp, zBu
11dc0 66 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a f, -1);.}../*.**
11dd0 20 53 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 Set the result
11de0 6f 66 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 of the interpret
11df0 65 72 20 74 6f 20 74 68 65 20 74 68 31 20 72 65 er to the th1 re
11e00 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 0a presentation of.
11e10 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 ** the pointer p
11e20 20 61 6e 64 20 72 65 74 75 72 6e 20 54 48 5f 4f and return TH_O
11e30 4b 2e 20 54 68 65 20 74 68 31 20 72 65 70 72 65 K. The th1 repre
11e40 73 65 6e 74 61 74 69 6f 6e 20 63 61 6e 20 62 65 sentation can be
11e50 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20 62 61 .** converted ba
11e60 63 6b 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 ck to a pointer
11e70 75 73 69 6e 67 20 54 68 5f 54 6f 50 74 72 28 29 using Th_ToPtr()
11e80 2e 0a 2a 2f 0a 69 6e 74 20 54 68 5f 53 65 74 52 ..*/.int Th_SetR
11e90 65 73 75 6c 74 50 74 72 28 54 68 5f 49 6e 74 65 esultPtr(Th_Inte
11ea0 72 70 20 2a 69 6e 74 65 72 70 2c 20 76 6f 69 64 rp *interp, void
11eb0 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 *p){. char zBu
11ec0 66 5b 33 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a f[32];. char *z
11ed0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 ;. int i;. uns
11ee0 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20 28 75 igned int v = (u
11ef0 6e 73 69 67 6e 65 64 20 69 6e 74 29 70 3b 0a 0a nsigned int)p;..
11f00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 48 65 const char zHe
11f10 78 5b 31 36 5d 20 3d 20 22 30 31 32 33 34 35 36 x[16] = "0123456
11f20 37 38 39 41 42 43 44 45 46 22 3b 0a 0a 20 20 61 789ABCDEF";.. a
11f30 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 6e ssert( sizeof(un
11f40 73 69 67 6e 65 64 20 69 6e 74 29 3d 3d 73 69 7a signed int)==siz
11f50 65 6f 66 28 76 6f 69 64 20 2a 29 20 29 3b 0a 0a eof(void *) );..
11f60 20 20 7a 42 75 66 5b 33 31 5d 20 3d 20 27 5c 30 zBuf[31] = '\0
11f70 27 3b 0a 20 20 7a 20 3d 20 26 7a 42 75 66 5b 33 ';. z = &zBuf[3
11f80 30 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 0];.. for(i=0;
11f90 69 3c 28 73 69 7a 65 6f 66 28 75 6e 73 69 67 6e i<(sizeof(unsign
11fa0 65 64 20 69 6e 74 29 2a 32 29 3b 20 69 2b 2b 29 ed int)*2); i++)
11fb0 7b 0a 20 20 20 20 2a 7a 2d 2d 20 3d 20 7a 48 65 {. *z-- = zHe
11fc0 78 5b 28 76 26 30 78 30 30 30 30 30 30 30 46 29 x[(v&0x0000000F)
11fd0 5d 3b 0a 20 20 20 20 76 20 3d 20 76 3e 3e 34 3b ];. v = v>>4;
11fe0 0a 20 20 7d 0a 0a 20 20 2a 7a 2d 2d 20 3d 20 27 . }.. *z-- = '
11ff0 78 27 3b 0a 20 20 2a 7a 20 3d 20 27 30 27 3b 0a x';. *z = '0';.
12000 0a 20 20 72 65 74 75 72 6e 20 54 68 5f 53 65 74 . return Th_Set
12010 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 Result(interp, (
12020 75 63 68 61 72 20 2a 29 7a 2c 20 2d 31 29 3b 0a uchar *)z, -1);.
12030 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 }../*.** Convert
12040 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 28 7a input string (z
12050 2c 20 6e 29 20 74 6f 20 61 20 67 65 6e 65 72 69 , n) to a generi
12060 63 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 74 68 c pointer. If th
12070 65 20 63 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20 e conversion.**
12080 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 is successful, s
12090 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 tore the result
120a0 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 in *pp and retur
120b0 6e 20 54 48 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 n TH_OK..**.** I
120c0 66 20 74 68 65 20 73 74 72 69 6e 67 20 63 61 6e f the string can
120d0 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 not be converted
120e0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2c 20 72 to a pointer, r
120f0 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 2e 20 eturn TH_ERROR.
12100 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 74 65 72 .** If the inter
12110 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f p argument is no
12120 74 20 4e 55 4c 4c 2c 20 6c 65 61 76 65 20 61 6e t NULL, leave an
12130 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 error message i
12140 6e 20 74 68 65 20 0a 2a 2a 20 69 6e 74 65 72 70 n the .** interp
12150 72 65 74 65 72 20 72 65 73 75 6c 74 20 74 6f 6f reter result too
12160 2e 0a 2a 2f 0a 69 6e 74 20 54 68 5f 54 6f 50 74 ..*/.int Th_ToPt
12170 72 28 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 r(Th_Interp *int
12180 65 72 70 2c 20 63 6f 6e 73 74 20 75 63 68 61 72 erp, const uchar
12190 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 76 6f 69 64 *z, int n, void
121a0 20 2a 2a 70 70 29 7b 0a 20 20 75 6e 73 69 67 6e **pp){. unsign
121b0 65 64 20 69 6e 74 20 69 50 74 72 3b 0a 20 20 69 ed int iPtr;. i
121c0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 73 nt i;. assert(s
121d0 69 7a 65 6f 66 28 75 6e 73 69 67 6e 65 64 20 69 izeof(unsigned i
121e0 6e 74 29 3d 3d 73 69 7a 65 6f 66 28 76 6f 69 64 nt)==sizeof(void
121f0 20 2a 29 29 3b 0a 0a 20 20 69 66 28 20 6e 3c 33 *));.. if( n<3
12200 20 7c 7c 20 7a 5b 30 5d 21 3d 27 30 27 20 7c 7c || z[0]!='0' ||
12210 20 7a 5b 31 5d 21 3d 27 78 27 20 29 7b 0a 20 20 z[1]!='x' ){.
12220 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 goto error_out
12230 3b 0a 20 20 7d 0a 0a 20 20 69 50 74 72 20 3d 20 ;. }.. iPtr =
12240 30 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 0;. for(i=2; i<
12250 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 n; i++){. int
12260 20 64 69 67 69 74 20 3d 20 74 68 48 65 78 64 69 digit = thHexdi
12270 67 69 74 28 7a 5b 69 5d 29 3b 0a 20 20 20 20 69 git(z[i]);. i
12280 66 28 20 64 69 67 69 74 3c 30 20 29 7b 0a 20 20 f( digit<0 ){.
12290 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f goto error_o
122a0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 50 ut;. }. iP
122b0 74 72 20 3d 20 28 69 50 74 72 3c 3c 34 29 20 2b tr = (iPtr<<4) +
122c0 20 64 69 67 69 74 3b 0a 20 20 7d 0a 0a 20 20 2a digit;. }.. *
122d0 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 69 50 74 pp = (void *)iPt
122e0 72 3b 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 4f r;. return TH_O
122f0 4b 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 K;..error_out:.
12300 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61 67 65 Th_ErrorMessage
12310 28 69 6e 74 65 72 70 2c 20 22 65 78 70 65 63 74 (interp, "expect
12320 65 64 20 70 6f 69 6e 74 65 72 2c 20 67 6f 74 3a ed pointer, got:
12330 20 5c 22 22 2c 20 7a 2c 20 6e 29 3b 0a 20 20 72 \"", z, n);. r
12340 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a eturn TH_ERROR;.
12350 7d 0a }.