Hex Artifact Content
Not logged in

Artifact 940e69c4e0a174d0857fb98ab479145c8c2efdc6:

File src/subscript.c part of check-in [8ef26c5e72] - Subscript interpreter is now running. by drh on 2007-11-03 04:01:55.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6d 70   contains an imp
0380: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0390: 68 65 20 22 73 75 62 73 63 72 69 70 74 22 20 69  he "subscript" i
03a0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2a 0a 2a  nterpreter..**.*
03b0: 2a 20 53 75 62 73 63 72 69 70 74 20 61 74 74 65  * Subscript atte
03c0: 6d 70 74 73 20 74 6f 20 62 65 20 61 6e 20 65 78  mpts to be an ex
03d0: 74 72 65 6d 65 6c 79 20 6c 69 67 68 74 2d 77 65  tremely light-we
03e0: 69 67 68 74 20 73 63 72 69 70 74 69 6e 67 0a 2a  ight scripting.*
03f0: 2a 20 6c 61 6e 67 75 61 67 65 2e 20 20 49 74 20  * language.  It 
0400: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 62 61 72  contains the bar
0410: 65 73 74 20 6f 66 20 62 61 72 65 20 65 73 73 65  est of bare esse
0420: 6e 74 69 61 6c 73 2e 20 20 49 74 20 69 73 0a 2a  ntials.  It is.*
0430: 2a 20 73 74 61 63 6b 2d 62 61 73 65 64 20 61 6e  * stack-based an
0440: 64 20 66 6f 72 74 68 2d 6c 69 6b 65 2e 20 20 45  d forth-like.  E
0450: 76 65 72 79 74 68 69 6e 67 20 69 73 20 69 6e 20  verything is in 
0460: 61 20 73 69 6e 67 6c 65 20 67 6c 6f 62 61 6c 0a  a single global.
0470: 2a 2a 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54  ** namespace.  T
0480: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
0490: 69 6e 67 6c 65 20 64 61 74 61 74 79 70 65 20 6f  ingle datatype o
04a0: 66 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  f zero-terminate
04b0: 64 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 54 68  d.** string.  Th
04c0: 65 20 73 74 61 63 6b 20 69 73 20 6f 66 20 66 69  e stack is of fi
04d0: 78 65 64 2c 20 6c 69 6d 69 74 65 64 20 64 65 70  xed, limited dep
04e0: 74 68 2e 20 20 54 68 65 20 73 79 6d 62 61 6c 20  th.  The symbal 
04f0: 74 61 62 6c 65 0a 2a 2a 20 69 73 20 6f 66 20 61  table.** is of a
0500: 20 6c 69 6d 69 74 65 64 20 61 6e 64 20 66 69 78   limited and fix
0510: 65 64 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed size..**.** T
0520: 4f 4b 45 4e 53 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  OKENS:.**.**    
0530: 20 20 2a 20 20 41 6c 6c 20 74 6f 6b 65 6e 73 20    *  All tokens 
0540: 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72  are separated fr
0550: 6f 6d 20 65 61 63 68 20 6f 74 68 65 72 20 62 79  om each other by
0560: 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 20   whitespace..** 
0570: 20 20 20 20 20 2a 20 20 4c 65 61 64 69 6e 67 20       *  Leading 
0580: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
0590: 74 65 73 70 61 63 65 20 69 73 20 69 67 6e 6f 72  tespace is ignor
05a0: 65 64 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 54  ed..**      *  T
05b0: 65 78 74 20 77 69 74 68 69 6e 20 6e 65 73 74 65  ext within neste
05c0: 64 20 7b 2e 2e 2e 7d 20 69 73 20 61 20 73 69 6e  d {...} is a sin
05d0: 67 6c 65 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e  gle string token
05e0: 2e 20 20 54 68 65 20 6f 75 74 65 72 6d 6f 73 74  .  The outermost
05f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 75 72 6c  .**         curl
0600: 79 20 62 72 61 63 65 73 20 61 72 65 20 6e 6f 74  y braces are not
0610: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 6f 6b   part of the tok
0620: 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41  en..**      *  A
0630: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69 74  n identifier wit
0640: 68 20 61 20 6c 65 61 64 69 6e 67 20 22 2f 22 20  h a leading "/" 
0650: 69 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65  is a string toke
0660: 6e 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 20  n..**      *  A 
0670: 74 6f 6b 65 6e 20 74 68 61 74 20 6c 6f 6f 6b 73  token that looks
0680: 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 20 69   like a number i
0690: 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e  s a string token
06a0: 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 6e 20  ..**      *  An 
06b0: 69 64 65 6e 74 69 66 69 65 72 20 74 6f 6b 65 6e  identifier token
06c0: 20 69 73 20 63 61 6c 6c 65 64 20 61 20 22 76 65   is called a "ve
06d0: 72 62 22 2e 0a 2a 2a 0a 2a 2a 20 50 52 4f 43 45  rb"..**.** PROCE
06e0: 53 53 49 4e 47 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  SSING:.**.**    
06f0: 20 20 2a 20 20 54 68 65 20 69 6e 70 75 74 20 69    *  The input i
0700: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74  s divided into t
0710: 6f 6b 65 6e 73 2e 20 20 57 68 69 74 65 73 70 61  okens.  Whitespa
0720: 63 65 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  ce is discarded.
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 53 74 72 69  .**         Stri
0740: 6e 67 20 61 6e 64 20 76 65 72 62 20 74 6f 6b 65  ng and verb toke
0750: 6e 73 20 61 72 65 20 70 61 73 73 65 64 20 69 6e  ns are passed in
0760: 74 6f 20 74 68 65 20 65 6e 67 69 6e 65 2e 0a 2a  to the engine..*
0770: 2a 20 20 20 20 20 20 2a 20 20 53 74 72 69 6e 67  *      *  String
0780: 20 74 6f 6b 65 6e 73 20 61 72 65 20 70 75 73 68   tokens are push
0790: 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ed onto the stac
07a0: 6b 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 49 66  k..**      *  If
07b0: 20 61 20 76 65 72 62 20 74 6f 6b 65 6e 20 63 6f   a verb token co
07c0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20 70  rresponds to a p
07d0: 72 6f 63 65 64 75 72 65 2c 20 74 68 61 74 20 70  rocedure, that p
07e0: 72 6f 63 65 64 75 72 65 20 69 73 0a 2a 2a 20 20  rocedure is.**  
07f0: 20 20 20 20 20 20 20 72 75 6e 2e 20 20 54 68 65         run.  The
0800: 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
0810: 20 75 73 65 2c 20 70 6f 70 2c 20 6f 72 20 70 75   use, pop, or pu
0820: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  ll elements from
0830: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65   .**         the
0840: 20 73 74 61 63 6b 2e 0a 2a 2a 20 20 20 20 20 20   stack..**      
0850: 2a 20 20 49 66 20 61 20 76 65 72 62 20 74 6f 6b  *  If a verb tok
0860: 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  en corresponds t
0870: 6f 20 61 20 76 61 72 69 61 62 6c 65 2c 20 74 68  o a variable, th
0880: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a  e value of that.
0890: 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 61  **         varia
08a0: 62 6c 65 20 69 73 20 70 75 73 68 65 64 20 6f 6e  ble is pushed on
08b0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
08c0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
08d0: 61 74 74 65 6d 70 74 73 20 74 6f 20 62 65 20 63  attempts to be c
08e0: 6f 6d 70 6c 65 74 65 6c 79 20 73 65 6c 66 2d 63  ompletely self-c
08f0: 6f 6e 74 61 69 6e 65 64 20 73 6f 20 74 68 61 74  ontained so that
0900: 20 69 74 20 63 61 6e 0a 2a 2a 20 62 65 20 70 6f   it can.** be po
0910: 72 74 61 62 6c 65 20 74 6f 20 6f 74 68 65 72 20  rtable to other 
0920: 70 72 6f 6a 65 63 74 73 2e 0a 2a 2f 0a 23 69 6e  projects..*/.#in
0930: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22  clude "config.h"
0940: 0a 23 69 6e 63 6c 75 64 65 20 22 73 75 62 73 63  .#include "subsc
0950: 72 69 70 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ript.h".#include
0960: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69 66   <assert.h>..#if
0970: 20 49 4e 54 45 52 46 41 43 45 0a 74 79 70 65 64   INTERFACE.typed
0980: 65 66 20 73 74 72 75 63 74 20 53 75 62 73 63 72  ef struct Subscr
0990: 69 70 74 20 53 75 62 73 63 72 69 70 74 3b 0a 23  ipt Subscript;.#
09a0: 64 65 66 69 6e 65 20 53 42 53 5f 4f 4b 20 20 20  define SBS_OK   
09b0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 42 53     0.#define SBS
09c0: 5f 45 52 52 4f 52 20 20 20 31 0a 23 65 6e 64 69  _ERROR   1.#endi
09d0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  f../*.** Configu
09e0: 72 61 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  ration constants
09f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43  .*/.#define SBSC
0a00: 4f 4e 46 49 47 5f 4e 48 41 53 48 20 20 20 20 34  ONFIG_NHASH    4
0a10: 31 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  1         /* Siz
0a20: 65 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61  e of the hash ta
0a30: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ble */.#define S
0a40: 42 53 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20  BSCONFIG_NSTACK 
0a50: 20 20 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20    10         /* 
0a60: 4d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65  Maximum stack de
0a70: 70 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  pth */.#define S
0a80: 42 53 43 4f 4e 46 49 47 5f 45 52 52 53 49 5a 45  BSCONFIG_ERRSIZE
0a90: 20 20 31 30 30 20 20 20 20 20 20 20 20 2f 2a 20    100        /* 
0aa0: 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  Maximum size of 
0ab0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
0ac0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 76 61 69 6c   */../*.** Avail
0ad0: 61 62 6c 65 20 74 6f 6b 65 6e 20 74 79 70 65 73  able token types
0ae0: 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53  :.*/.#define SBS
0af0: 54 54 5f 57 48 49 54 45 53 50 41 43 45 20 20 31  TT_WHITESPACE  1
0b00: 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 5c 30 34      /* ex:   \04
0b10: 30 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  0   */.#define S
0b20: 42 53 54 54 5f 4e 41 4d 45 20 20 20 20 20 20 20  BSTT_NAME       
0b30: 20 32 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 2f   2    /* ex:   /
0b40: 61 62 63 64 65 20 20 2a 2f 0a 23 64 65 66 69 6e  abcde  */.#defin
0b50: 65 20 53 42 53 54 54 5f 56 45 52 42 20 20 20 20  e SBSTT_VERB    
0b60: 20 20 20 20 33 20 20 20 20 2f 2a 20 65 78 3a 20      3    /* ex: 
0b70: 20 20 61 62 63 64 65 20 20 20 2a 2f 0a 23 64 65    abcde   */.#de
0b80: 66 69 6e 65 20 53 42 53 54 54 5f 53 54 52 49 4e  fine SBSTT_STRIN
0b90: 47 20 20 20 20 20 20 34 20 20 20 20 2f 2a 20 65  G      4    /* e
0ba0: 78 3a 20 20 20 7b 2e 2e 2e 7d 20 20 20 2a 2f 0a  x:   {...}   */.
0bb0: 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 49 4e  #define SBSTT_IN
0bc0: 54 45 47 45 52 20 20 20 20 20 35 20 20 20 20 2f  TEGER     5    /
0bd0: 2a 20 49 6e 74 65 67 65 72 20 69 6e 63 6c 75 64  * Integer includ
0be0: 69 6e 67 20 6f 70 74 69 6f 6e 20 73 69 67 6e 20  ing option sign 
0bf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54  */.#define SBSTT
0c00: 5f 49 4e 43 4f 4d 50 4c 45 54 45 20 20 36 20 20  _INCOMPLETE  6  
0c10: 20 20 2f 2a 20 55 6e 74 65 72 6d 69 6e 61 74 65    /* Unterminate
0c20: 64 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e 20 2a  d string token *
0c30: 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f  /.#define SBSTT_
0c40: 55 4e 4b 4e 4f 57 4e 20 20 20 20 20 37 20 20 20  UNKNOWN     7   
0c50: 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20 74 6f 6b 65   /* Unknown toke
0c60: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53  n */.#define SBS
0c70: 54 54 5f 45 4f 46 20 20 20 20 20 20 20 20 20 38  TT_EOF         8
0c80: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e      /* End of in
0c90: 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  put */../*.** Gi
0ca0: 76 65 6e 20 61 6e 20 69 6e 70 75 74 20 73 74 72  ven an input str
0cb0: 69 6e 67 20 7a 20 6f 66 20 6c 65 6e 67 74 68 20  ing z of length 
0cc0: 6e 2c 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  n, identify the 
0cd0: 74 6f 6b 65 6e 20 74 68 61 74 0a 2a 2a 20 73 74  token that.** st
0ce0: 61 72 74 73 20 61 74 20 7a 5b 30 5d 2e 20 20 57  arts at z[0].  W
0cf0: 72 69 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 74  rite the token t
0d00: 79 70 65 20 69 6e 74 6f 20 2a 70 54 6f 6b 65 6e  ype into *pToken
0d10: 54 79 70 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75  Type and.** retu
0d20: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
0d30: 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73   the token..*/.s
0d40: 74 61 74 69 63 20 69 6e 74 20 73 62 73 5f 6e 65  tatic int sbs_ne
0d50: 78 74 5f 74 6f 6b 65 6e 28 63 6f 6e 73 74 20 63  xt_token(const c
0d60: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69  har *z, int n, i
0d70: 6e 74 20 2a 70 54 6f 6b 65 6e 54 79 70 65 29 7b  nt *pTokenType){
0d80: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 66 28 20  .  int c;.  if( 
0d90: 6e 3c 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 20  n<=0 || z[0]==0 
0da0: 29 7b 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79  ){.    *pTokenTy
0db0: 70 65 20 3d 20 53 42 53 54 54 5f 45 4f 46 3b 0a  pe = SBSTT_EOF;.
0dc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
0dd0: 7d 0a 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20  }.  c = z[0];.  
0de0: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
0df0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
0e00: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53   *pTokenType = S
0e10: 42 53 54 54 5f 57 48 49 54 45 53 50 41 43 45 3b  BSTT_WHITESPACE;
0e20: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
0e30: 6e 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  n && isspace(z[i
0e40: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 72  ]); i++){}.    r
0e50: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69  eturn i;.  }.  i
0e60: 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20  f( c=='#' ){.   
0e70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
0e80: 69 3d 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d  i=1; i<n && z[i]
0e90: 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27   && z[i-1]!='\n'
0ea0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54  ; i++){}.    *pT
0eb0: 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54  okenType = SBSTT
0ec0: 5f 57 48 49 54 45 53 50 41 43 45 3b 0a 20 20 20  _WHITESPACE;.   
0ed0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
0ee0: 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 0a 20   if( c=='{' ){. 
0ef0: 20 20 20 69 6e 74 20 64 65 70 74 68 20 3d 20 31     int depth = 1
0f00: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
0f10: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26   for(i=1; i<n &&
0f20: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
0f30: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 7b 27     if( z[i]=='{'
0f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 70 74   ){.        dept
0f50: 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  h++;.      }else
0f60: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 7d 27 20 29   if( z[i]=='}' )
0f70: 7b 0a 20 20 20 20 20 20 20 20 64 65 70 74 68 2d  {.        depth-
0f80: 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  -;.        if( d
0f90: 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
0fa0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
0fb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
0fc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
0fd0: 20 7d 0a 20 20 20 20 69 66 28 20 64 65 70 74 68   }.    if( depth
0fe0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 54 6f 6b 65   ){.      *pToke
0ff0: 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 49 4e  nType = SBSTT_IN
1000: 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 65  COMPLETE;.    }e
1010: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 54 6f 6b  lse{.      *pTok
1020: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 53  enType = SBSTT_S
1030: 54 52 49 4e 47 3b 0a 20 20 20 20 7d 0a 20 20 20  TRING;.    }.   
1040: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1050: 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 6e   if( c=='/' && n
1060: 3e 3d 32 20 26 26 20 69 73 61 6c 70 68 61 28 7a  >=2 && isalpha(z
1070: 5b 31 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  [1]) ){.    int 
1080: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  i;.    for(i=2; 
1090: 69 3c 6e 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  i<n && (isalnum(
10a0: 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27  z[i]) || z[i]=='
10b0: 5f 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  _'); i++){}.    
10c0: 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42  *pTokenType = SB
10d0: 53 54 54 5f 4e 41 4d 45 3b 0a 20 20 20 20 72 65  STT_NAME;.    re
10e0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66  turn i;.  }.  if
10f0: 28 20 69 73 61 6c 70 68 61 28 63 29 20 29 7b 0a  ( isalpha(c) ){.
1100: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1110: 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 28  or(i=1; i<n && (
1120: 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 7c 7c  isalnum(z[i]) ||
1130: 20 7a 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2b 2b   z[i]=='_'); i++
1140: 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54  ){}.    *pTokenT
1150: 79 70 65 20 3d 20 53 42 53 54 54 5f 56 45 52 42  ype = SBSTT_VERB
1160: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a  ;.    return i;.
1170: 20 20 7d 0a 20 20 69 66 28 20 69 73 64 69 67 69    }.  if( isdigi
1180: 74 28 63 29 20 7c 7c 20 28 28 63 3d 3d 27 2d 27  t(c) || ((c=='-'
1190: 20 7c 7c 20 63 3d 3d 27 2b 27 29 20 26 26 20 6e   || c=='+') && n
11a0: 3e 3d 32 20 26 26 20 69 73 64 69 67 69 74 28 7a  >=2 && isdigit(z
11b0: 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 69 6e 74  [1])) ){.    int
11c0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
11d0: 20 69 3c 6e 20 26 26 20 69 73 64 69 67 69 74 28   i<n && isdigit(
11e0: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
11f0: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20    *pTokenType = 
1200: 53 42 53 54 54 5f 49 4e 54 45 47 45 52 3b 0a 20  SBSTT_INTEGER;. 
1210: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d     return i;.  }
1220: 0a 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d  .  *pTokenType =
1230: 20 53 42 53 54 54 5f 55 4e 4b 4e 4f 57 4e 3b 0a   SBSTT_UNKNOWN;.
1240: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a    return 1;.}...
1250: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 61 72 65  /*.** Values are
1260: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 68   stored in the h
1270: 61 73 68 20 74 61 62 6c 65 20 61 73 20 69 6e 73  ash table as ins
1280: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
1290: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
12a0: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
12b0: 20 73 74 72 75 63 74 20 53 62 53 56 61 6c 75 65   struct SbSValue
12c0: 20 53 62 53 56 61 6c 75 65 3b 0a 73 74 72 75 63   SbSValue;.struc
12d0: 74 20 53 62 53 56 61 6c 75 65 20 7b 0a 20 20 69  t SbSValue {.  i
12e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
12f0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 53   /* Bitmask of S
1300: 42 53 56 41 4c 5f 2a 20 76 61 6c 75 65 73 20 2a  BSVAL_* values *
1310: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  /.  union {.    
1320: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 69  struct {.      i
1330: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
1340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1350: 65 73 20 69 6e 20 73 74 72 69 6e 67 2c 20 6e 6f  es in string, no
1360: 74 20 63 6f 75 6e 74 69 6e 67 20 66 69 6e 61 6c  t counting final
1370: 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 63   zero */.      c
1380: 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
1390: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  /* Pointer to st
13a0: 72 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ring content */.
13b0: 20 20 20 20 7d 20 73 74 72 3b 20 20 20 20 20 20      } str;      
13c0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 66 20      /* Value if 
13d0: 53 42 53 56 41 4c 5f 53 54 52 20 2a 2f 0a 20 20  SBSVAL_STR */.  
13e0: 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20    struct {.     
13f0: 20 69 6e 74 20 28 2a 78 56 65 72 62 29 28 53 75   int (*xVerb)(Su
1400: 62 73 63 72 69 70 74 2a 2c 20 76 6f 69 64 2a 29  bscript*, void*)
1410: 3b 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  ;     /* Functio
1420: 6e 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  n to do the work
1430: 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   */.      void *
1440: 70 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  pArg;           
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1460: 2a 20 32 6e 64 20 70 61 72 61 6d 65 74 65 72 20  * 2nd parameter 
1470: 74 6f 20 78 56 65 72 62 20 2a 2f 0a 20 20 20 20  to xVerb */.    
1480: 7d 20 76 65 72 62 3b 20 20 20 20 20 20 20 20 20  } verb;         
1490: 2f 2a 20 56 61 6c 75 65 20 69 66 20 53 42 53 56  /* Value if SBSV
14a0: 41 4c 5f 56 45 52 42 20 2a 2f 0a 20 20 7d 20 75  AL_VERB */.  } u
14b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a  ;              .
14c0: 7d 3b 0a 23 64 65 66 69 6e 65 20 53 42 53 56 41  };.#define SBSVA
14d0: 4c 5f 56 45 52 42 20 20 20 20 30 78 30 30 30 31  L_VERB    0x0001
14e0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 73        /* Value s
14f0: 74 6f 72 65 64 20 69 6e 20 75 2e 76 65 72 62 20  tored in u.verb 
1500: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 56 41  */.#define SBSVA
1510: 4c 5f 53 54 52 20 20 20 20 20 30 78 30 30 30 32  L_STR     0x0002
1520: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 73        /* Value s
1530: 74 6f 72 65 64 20 69 6e 20 75 2e 73 74 72 20 2a  tored in u.str *
1540: 2f 20 0a 23 64 65 66 69 6e 65 20 53 42 53 56 41  / .#define SBSVA
1550: 4c 5f 44 59 4e 20 20 20 20 20 30 78 30 30 30 34  L_DYN     0x0004
1560: 20 20 20 20 20 20 2f 2a 20 75 2e 73 74 72 2e 7a        /* u.str.z
1570: 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   is dynamically 
1580: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 23 64 65  allocated */.#de
1590: 66 69 6e 65 20 53 42 53 56 41 4c 5f 45 58 45 43  fine SBSVAL_EXEC
15a0: 20 20 20 20 30 78 30 30 30 38 20 20 20 20 20 20      0x0008      
15b0: 2f 2a 20 75 2e 73 74 72 2e 7a 20 69 73 20 61 20  /* u.str.z is a 
15c0: 73 63 72 69 70 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  script */../*.**
15d0: 20 52 65 6c 65 61 73 65 20 61 6e 79 20 6d 65 6d   Release any mem
15e0: 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ory allocated by
15f0: 20 61 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61   a value..*/.sta
1600: 74 69 63 20 76 6f 69 64 20 73 62 73 5f 76 61 6c  tic void sbs_val
1610: 75 65 5f 72 65 73 65 74 28 53 62 53 56 61 6c 75  ue_reset(SbSValu
1620: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
1630: 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f 44  flags & SBSVAL_D
1640: 59 4e 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70  YN ){.    free(p
1650: 2d 3e 75 2e 73 74 72 2e 7a 29 3b 0a 20 20 20 20  ->u.str.z);.    
1660: 70 2d 3e 66 6c 61 67 73 20 3d 20 53 42 53 56 41  p->flags = SBSVA
1670: 4c 5f 53 54 52 3b 0a 20 20 20 20 70 2d 3e 75 2e  L_STR;.    p->u.
1680: 73 74 72 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20  str.z = "";.    
1690: 70 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20  p->u.str.size = 
16a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  0;.  }.}.../*.**
16b0: 20 41 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   An entry in the
16c0: 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 61   hash table is a
16d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
16e0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
16f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1700: 53 62 73 48 61 73 68 45 6e 74 72 79 20 53 62 73  SbsHashEntry Sbs
1710: 48 61 73 68 45 6e 74 72 79 3b 0a 73 74 72 75 63  HashEntry;.struc
1720: 74 20 53 62 73 48 61 73 68 45 6e 74 72 79 20 7b  t SbsHashEntry {
1730: 0a 20 20 53 62 73 48 61 73 68 45 6e 74 72 79 20  .  SbsHashEntry 
1740: 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e  *pNext;     /* N
1750: 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
1760: 68 65 20 73 61 6d 65 20 68 61 73 68 20 6f 6e 20  he same hash on 
1770: 7a 4b 65 79 20 2a 2f 0a 20 20 53 62 53 56 61 6c  zKey */.  SbSVal
1780: 75 65 20 76 61 6c 3b 20 20 20 20 20 20 20 20 20  ue val;         
1790: 20 20 20 2f 2a 20 54 68 65 20 70 61 79 6c 6f 61     /* The payloa
17a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 3b  d */.  int nKey;
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17c0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
17d0: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4b  key */.  char zK
17e0: 65 79 5b 30 5d 3b 20 20 20 20 20 20 20 20 20 20  ey[0];          
17f0: 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 7d   /* The key */.}
1800: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 61 73 68 20  ;../*.** A hash 
1810: 74 61 62 6c 65 20 69 73 20 61 6e 20 69 6e 73 74  table is an inst
1820: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1830: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1840: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1850: 63 74 20 53 62 73 48 61 73 68 54 61 62 20 53 62  ct SbsHashTab Sb
1860: 73 48 61 73 68 54 61 62 3b 0a 73 74 72 75 63 74  sHashTab;.struct
1870: 20 53 62 73 48 61 73 68 54 61 62 20 7b 0a 20 20   SbsHashTab {.  
1880: 53 62 73 48 61 73 68 45 6e 74 72 79 20 2a 61 48  SbsHashEntry *aH
1890: 61 73 68 5b 53 42 53 43 4f 4e 46 49 47 5f 4e 48  ash[SBSCONFIG_NH
18a0: 41 53 48 5d 3b 20 20 2f 2a 20 54 68 65 20 68 61  ASH];  /* The ha
18b0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a  sh table */.};..
18c0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
18d0: 68 61 73 68 20 6f 6e 20 61 20 73 74 72 69 6e 67  hash on a string
18e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18f0: 73 62 73 5f 68 61 73 68 28 63 6f 6e 73 74 20 63  sbs_hash(const c
1900: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
1910: 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 69    int h = 0;.  i
1920: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1930: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1940: 68 20 5e 3d 20 28 68 3c 3c 31 29 20 7c 20 7a 5b  h ^= (h<<1) | z[
1950: 69 5d 3b 0a 20 20 7d 0a 20 20 68 20 26 3d 20 30  i];.  }.  h &= 0
1960: 78 37 66 66 66 66 66 66 3b 0a 20 20 72 65 74 75  x7ffffff;.  retu
1970: 72 6e 20 68 20 25 20 53 42 53 43 4f 4e 46 49 47  rn h % SBSCONFIG
1980: 5f 4e 48 41 53 48 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _NHASH;.}../*.**
1990: 20 4c 6f 6f 6b 20 75 70 20 61 20 76 61 6c 75 65   Look up a value
19a0: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
19b0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  le.  Return a po
19c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  inter to the val
19d0: 75 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  ue..** Return NU
19e0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
19f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1a00: 20 53 62 53 56 61 6c 75 65 20 2a 73 62 73 5f 66   SbSValue *sbs_f
1a10: 65 74 63 68 28 0a 20 20 53 62 73 48 61 73 68 54  etch(.  SbsHashT
1a20: 61 62 20 2a 70 48 61 73 68 2c 20 0a 20 20 63 6f  ab *pHash, .  co
1a30: 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20  nst char *zKey, 
1a40: 0a 20 20 69 6e 74 20 6e 4b 65 79 0a 29 7b 0a 20  .  int nKey.){. 
1a50: 20 69 6e 74 20 68 3b 0a 20 20 53 62 73 48 61 73   int h;.  SbsHas
1a60: 68 45 6e 74 72 79 20 2a 70 3b 0a 0a 20 20 69 66  hEntry *p;..  if
1a70: 28 20 6e 4b 65 79 3c 30 20 29 20 6e 4b 65 79 20  ( nKey<0 ) nKey 
1a80: 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a  = strlen(zKey);.
1a90: 20 20 68 20 3d 20 73 62 73 5f 68 61 73 68 28 7a    h = sbs_hash(z
1aa0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 66 6f  Key, nKey);.  fo
1ab0: 72 28 70 20 3d 20 70 48 61 73 68 2d 3e 61 48 61  r(p = pHash->aHa
1ac0: 73 68 5b 68 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70  sh[h]; p; p=p->p
1ad0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1ae0: 2d 3e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 26 26 20  ->nKey==nKey && 
1af0: 6d 65 6d 63 6d 70 28 70 2d 3e 7a 4b 65 79 2c 7a  memcmp(p->zKey,z
1b00: 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a  Key,nKey)==0 ){.
1b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d        return &p-
1b20: 3e 76 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >val;.    }.  }.
1b30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1b40: 2a 0a 2a 2a 20 53 74 6f 72 65 20 61 20 76 61 6c  *.** Store a val
1b50: 75 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ue in the hash t
1b60: 61 62 6c 65 2e 20 20 4f 76 65 72 77 72 69 74 65  able.  Overwrite
1b70: 20 61 6e 79 20 70 72 69 6f 72 20 76 61 6c 75 65   any prior value
1b80: 20 73 74 6f 72 65 64 0a 2a 2a 20 75 6e 64 65 72   stored.** under
1b90: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a   the same name..
1ba0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  **.** If the val
1bb0: 75 65 20 69 6e 20 74 68 65 20 34 74 68 20 61 72  ue in the 4th ar
1bc0: 67 75 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  gument needs to 
1bd0: 62 65 20 72 65 73 65 74 20 6f 72 20 66 72 65 65  be reset or free
1be0: 64 2c 0a 2a 2a 20 74 68 65 20 68 61 73 68 20 74  d,.** the hash t
1bf0: 61 62 6c 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f  able will take o
1c00: 76 65 72 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ver responsibili
1c10: 69 74 79 20 66 6f 72 20 64 6f 69 6e 67 20 73 6f  ity for doing so
1c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c30: 73 62 73 5f 73 74 6f 72 65 28 0a 20 20 53 62 73  sbs_store(.  Sbs
1c40: 48 61 73 68 54 61 62 20 2a 70 48 61 73 68 2c 20  HashTab *pHash, 
1c50: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
1c60: 69 6e 74 6f 20 74 68 69 73 20 68 61 73 68 20 74  into this hash t
1c70: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1c80: 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20  char *zKey,     
1c90: 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
1ca0: 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1cc0: 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 20 2a  ize of the key *
1cd0: 2f 0a 20 20 63 6f 6e 73 74 20 53 62 53 56 61 6c  /.  const SbSVal
1ce0: 75 65 20 2a 70 56 61 6c 75 65 20 20 20 2f 2a 20  ue *pValue   /* 
1cf0: 54 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  The value to be 
1d00: 73 74 6f 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  stored */.){.  i
1d10: 6e 74 20 68 3b 0a 20 20 53 62 73 48 61 73 68 45  nt h;.  SbsHashE
1d20: 6e 74 72 79 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a  ntry *p, *pNew;.
1d30: 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30 20 29 20  .  if( nKey<0 ) 
1d40: 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b  nKey = strlen(zK
1d50: 65 79 29 3b 0a 20 20 68 20 3d 20 73 62 73 5f 68  ey);.  h = sbs_h
1d60: 61 73 68 28 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b  ash(zKey, nKey);
1d70: 0a 20 20 66 6f 72 28 70 20 3d 20 70 48 61 73 68  .  for(p = pHash
1d80: 2d 3e 61 48 61 73 68 5b 68 5d 3b 20 70 3b 20 70  ->aHash[h]; p; p
1d90: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1da0: 69 66 28 20 70 2d 3e 6e 4b 65 79 3d 3d 6e 4b 65  if( p->nKey==nKe
1db0: 79 20 26 26 20 6d 65 6d 63 6d 70 28 70 2d 3e 7a  y && memcmp(p->z
1dc0: 4b 65 79 2c 7a 4b 65 79 2c 6e 4b 65 79 29 3d 3d  Key,zKey,nKey)==
1dd0: 30 20 29 7b 0a 20 20 20 20 20 20 73 62 73 5f 76  0 ){.      sbs_v
1de0: 61 6c 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 76  alue_reset(&p->v
1df0: 61 6c 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  al);.      memcp
1e00: 79 28 26 70 2d 3e 76 61 6c 2c 20 70 56 61 6c 75  y(&p->val, pValu
1e10: 65 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 76 61 6c  e, sizeof(p->val
1e20: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1e30: 20 53 42 53 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   SBS_OK;.    }. 
1e40: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 6d 61 6c 6c   }.  pNew = mall
1e50: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
1e60: 29 20 2b 20 6e 4b 65 79 20 29 3b 0a 20 20 69 66  ) + nKey );.  if
1e70: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e  ( pNew ){.    pN
1e80: 65 77 2d 3e 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b  ew->nKey = nKey;
1e90: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  .    memcpy(pNew
1ea0: 2d 3e 7a 4b 65 79 2c 20 7a 4b 65 79 2c 20 6e 4b  ->zKey, zKey, nK
1eb0: 65 79 2b 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ey+1);.    memcp
1ec0: 79 28 26 70 4e 65 77 2d 3e 76 61 6c 2c 20 70 56  y(&pNew->val, pV
1ed0: 61 6c 75 65 2c 20 73 69 7a 65 6f 66 28 70 4e 65  alue, sizeof(pNe
1ee0: 77 2d 3e 76 61 6c 29 29 3b 0a 20 20 20 20 70 4e  w->val));.    pN
1ef0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 48 61 73  ew->pNext = pHas
1f00: 68 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  h->aHash[h];.   
1f10: 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b 68 5d   pHash->aHash[h]
1f20: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
1f30: 75 72 6e 20 53 42 53 5f 4f 4b 3b 0a 20 20 7d 0a  urn SBS_OK;.  }.
1f40: 20 20 72 65 74 75 72 6e 20 53 42 53 5f 45 52 52    return SBS_ERR
1f50: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  OR;.}../*.** Res
1f60: 65 74 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e  et a hash table.
1f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f80: 73 62 73 5f 68 61 73 68 5f 72 65 73 65 74 28 53  sbs_hash_reset(S
1f90: 62 73 48 61 73 68 54 61 62 20 2a 70 48 61 73 68  bsHashTab *pHash
1fa0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 62  ){.  int i;.  Sb
1fb0: 73 48 61 73 68 45 6e 74 72 79 20 2a 70 2c 20 2a  sHashEntry *p, *
1fc0: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 69 3d 30  pNext;.  for(i=0
1fd0: 3b 20 69 3c 53 42 53 43 4f 4e 46 49 47 5f 4e 48  ; i<SBSCONFIG_NH
1fe0: 41 53 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  ASH; i++){.    f
1ff0: 6f 72 28 70 3d 70 48 61 73 68 2d 3e 61 48 61 73  or(p=pHash->aHas
2000: 68 5b 69 5d 3b 20 70 3b 20 70 3d 70 4e 65 78 74  h[i]; p; p=pNext
2010: 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
2020: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
2030: 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65 74   sbs_value_reset
2040: 28 26 70 2d 3e 76 61 6c 29 3b 0a 20 20 20 20 20  (&p->val);.     
2050: 20 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a   free(p);.    }.
2060: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 48 61    }.  memset(pHa
2070: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  sh, 0, sizeof(*p
2080: 48 61 73 68 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Hash));.}../*.**
2090: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
20a0: 74 68 65 20 53 75 62 73 63 72 69 70 74 20 69 6e  the Subscript in
20b0: 74 65 72 70 72 65 74 65 72 0a 2a 2f 0a 73 74 72  terpreter.*/.str
20c0: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 7b 0a  uct Subscript {.
20d0: 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20    int nStack;   
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2100: 65 6e 74 72 69 65 73 20 6f 6e 20 73 74 61 63 6b  entries on stack
2110: 20 2a 2f 0a 20 20 53 62 73 48 61 73 68 54 61 62   */.  SbsHashTab
2120: 20 73 79 6d 54 61 62 3b 20 20 20 20 20 20 20 20   symTab;        
2130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2140: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  ymbol table */. 
2150: 20 63 68 61 72 20 7a 45 72 72 4d 73 67 5b 53 42   char zErrMsg[SB
2160: 53 43 4f 4e 46 49 47 5f 45 52 52 53 49 5a 45 5d  SCONFIG_ERRSIZE]
2170: 3b 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 77  ;  /* Space to w
2180: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
2190: 73 73 61 67 65 20 2a 2f 0a 20 20 53 62 53 56 61  ssage */.  SbSVa
21a0: 6c 75 65 20 61 53 74 61 63 6b 5b 53 42 53 43 4f  lue aStack[SBSCO
21b0: 4e 46 49 47 5f 4e 53 54 41 43 4b 5d 3b 20 2f 2a  NFIG_NSTACK]; /*
21c0: 20 54 68 65 20 73 74 61 63 6b 20 2a 2f 0a 7d 3b   The stack */.};
21d0: 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20 76  ../*.** Push a v
21e0: 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73 74  alue onto the st
21f0: 61 63 6b 20 6f 66 20 61 6e 20 69 6e 74 65 72 70  ack of an interp
2200: 72 65 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  reter.*/.static 
2210: 69 6e 74 20 73 62 73 5f 70 75 73 68 28 53 75 62  int sbs_push(Sub
2220: 73 63 72 69 70 74 20 2a 70 2c 20 53 62 53 56 61  script *p, SbSVa
2230: 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 66  lue *pVal){.  if
2240: 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 53 42 53  ( p->nStack>=SBS
2250: 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20 29 7b  CONFIG_NSTACK ){
2260: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2270: 72 69 6e 74 66 28 53 42 53 43 4f 4e 46 49 47 5f  rintf(SBSCONFIG_
2280: 45 52 52 53 49 5a 45 2c 20 70 2d 3e 7a 45 72 72  ERRSIZE, p->zErr
2290: 4d 73 67 2c 20 22 73 74 61 63 6b 20 6f 76 65 72  Msg, "stack over
22a0: 66 6c 6f 77 22 29 3b 0a 20 20 20 20 72 65 74 75  flow");.    retu
22b0: 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20  rn SBS_ERROR;.  
22c0: 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d  }.  p->aStack[p-
22d0: 3e 6e 53 74 61 63 6b 2b 2b 5d 20 3d 20 2a 70 56  >nStack++] = *pV
22e0: 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 42 53  al;.  return SBS
22f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
2300: 73 74 72 6f 79 20 61 6e 20 73 75 62 73 63 72 69  stroy an subscri
2310: 70 74 20 69 6e 74 65 72 70 72 65 74 65 72 0a 2a  pt interpreter.*
2320: 2f 0a 76 6f 69 64 20 53 62 53 5f 44 65 73 74 72  /.void SbS_Destr
2330: 6f 79 28 73 74 72 75 63 74 20 53 75 62 73 63 72  oy(struct Subscr
2340: 69 70 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ipt *p){.  int i
2350: 3b 0a 20 20 73 62 73 5f 68 61 73 68 5f 72 65 73  ;.  sbs_hash_res
2360: 65 74 28 26 70 2d 3e 73 79 6d 54 61 62 29 3b 0a  et(&p->symTab);.
2370: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2380: 6e 53 74 61 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  nStack; i++){.  
2390: 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65    sbs_value_rese
23a0: 74 28 26 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 29  t(&p->aStack[i])
23b0: 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 70 29 3b  ;.  }.  free(p);
23c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
23d0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
23e0: 66 6f 72 20 61 6e 20 69 6e 74 65 72 70 72 65 74  for an interpret
23f0: 65 72 2e 20 20 56 65 72 62 20 69 6d 70 6c 65 6d  er.  Verb implem
2400: 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75 73 65  entations.** use
2410: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
2420: 65 6e 20 74 68 65 79 20 65 6e 63 6f 75 6e 74 65  en they encounte
2430: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76  r an error..*/.v
2440: 6f 69 64 20 53 62 53 5f 53 65 74 45 72 72 6f 72  oid SbS_SetError
2450: 4d 65 73 73 61 67 65 28 73 74 72 75 63 74 20 53  Message(struct S
2460: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 63 6f 6e  ubscript *p, con
2470: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 29 7b 0a  st char *zErr){.
2480: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72    int nErr = str
2490: 6c 65 6e 28 7a 45 72 72 29 3b 0a 20 20 69 66 28  len(zErr);.  if(
24a0: 20 6e 45 72 72 3e 73 69 7a 65 6f 66 28 70 2d 3e   nErr>sizeof(p->
24b0: 7a 45 72 72 4d 73 67 29 2d 31 20 29 7b 0a 20 20  zErrMsg)-1 ){.  
24c0: 20 20 6e 45 72 72 20 3d 20 73 69 7a 65 6f 66 28    nErr = sizeof(
24d0: 70 2d 3e 7a 45 72 72 4d 73 67 29 2d 31 3b 0a 20  p->zErrMsg)-1;. 
24e0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a   }.  memcpy(p->z
24f0: 45 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20 6e 45  ErrMsg, zErr, nE
2500: 72 72 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  rr);.  p->zErrMs
2510: 67 5b 6e 45 72 72 5d 20 3d 20 30 3b 0a 7d 0a 0a  g[nErr] = 0;.}..
2520: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2530: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 75  ointer to the cu
2540: 72 72 65 6e 74 20 65 72 72 6f 72 20 6d 65 73 73  rrent error mess
2550: 61 67 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  age for the.** i
2560: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 63  nterpreter..*/.c
2570: 6f 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 47  onst char *SbS_G
2580: 65 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73  etErrorMessage(s
2590: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
25a0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
25b0: 3e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a  >zErrMsg;.}../*.
25c0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 76 65 72  ** Add a new ver
25d0: 62 20 74 68 65 20 67 69 76 65 6e 20 69 6e 74 65  b the given inte
25e0: 72 70 72 65 74 65 72 0a 2a 2f 0a 69 6e 74 20 53  rpreter.*/.int S
25f0: 62 53 5f 41 64 64 56 65 72 62 28 0a 20 20 73 74  bS_AddVerb(.  st
2600: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a  ruct Subscript *
2610: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
2620: 2a 7a 56 65 72 62 2c 0a 20 20 69 6e 74 20 28 2a  *zVerb,.  int (*
2630: 78 56 65 72 62 29 28 73 74 72 75 63 74 20 53 75  xVerb)(struct Su
2640: 62 73 63 72 69 70 74 2a 2c 76 6f 69 64 2a 29 2c  bscript*,void*),
2650: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
2660: 0a 20 20 53 62 53 56 61 6c 75 65 20 76 3b 0a 20  .  SbSValue v;. 
2670: 20 76 2e 66 6c 61 67 73 20 3d 20 53 42 53 56 41   v.flags = SBSVA
2680: 4c 5f 56 45 52 42 3b 0a 20 20 76 2e 75 2e 76 65  L_VERB;.  v.u.ve
2690: 72 62 2e 78 56 65 72 62 20 3d 20 78 56 65 72 62  rb.xVerb = xVerb
26a0: 3b 0a 20 20 76 2e 75 2e 76 65 72 62 2e 70 41 72  ;.  v.u.verb.pAr
26b0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75  g = pArg;.  retu
26c0: 72 6e 20 73 62 73 5f 73 74 6f 72 65 28 26 70 2d  rn sbs_store(&p-
26d0: 3e 73 79 6d 54 61 62 2c 20 7a 56 65 72 62 2c 20  >symTab, zVerb, 
26e0: 2d 31 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  -1, &v);.}../*.*
26f0: 2a 20 50 75 73 68 20 61 20 73 74 72 69 6e 67 20  * Push a string 
2700: 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73  value onto the s
2710: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tack..**.** If t
2720: 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72  he 4th parameter
2730: 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20   is 0, then the 
2740: 73 74 72 69 6e 67 20 69 73 20 73 74 61 74 69 63  string is static
2750: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 34 74 68 20  ..** If the 4th 
2760: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
2770: 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 65 20 73  -zero then the s
2780: 74 72 69 6e 67 20 77 61 73 20 6f 62 74 61 69 6e  tring was obtain
2790: 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ed.** from mallo
27a0: 63 20 61 6e 64 20 53 75 62 73 63 72 69 70 74 20  c and Subscript 
27b0: 77 69 6c 6c 20 74 61 6b 65 20 72 65 73 70 6f 6e  will take respon
27c0: 73 69 62 69 6c 69 74 79 20 66 6f 72 20 66 72 65  sibility for fre
27d0: 65 69 6e 67 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a  eing.** it..**.*
27e0: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
27f0: 63 63 65 73 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65  ccess and non-ze
2800: 72 6f 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ro if there is a
2810: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  n error..*/.int 
2820: 53 62 53 5f 50 75 73 68 28 0a 20 20 73 74 72 75  SbS_Push(.  stru
2830: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c  ct Subscript *p,
2840: 20 20 2f 2a 20 50 75 73 68 20 6f 6e 74 6f 20 74    /* Push onto t
2850: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20  his interpreter 
2860: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20 20  */.  char *z,   
2870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
2880: 72 69 6e 67 20 76 61 6c 75 65 20 74 6f 20 70 75  ring value to pu
2890: 73 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  sh */.  int n,  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28b0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   Length of the s
28c0: 74 72 69 6e 67 2c 20 6f 72 20 2d 31 20 2a 2f 0a  tring, or -1 */.
28d0: 20 20 69 6e 74 20 64 79 6e 20 20 20 20 20 20 20    int dyn       
28e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
28f0: 75 65 2c 20 7a 20 77 61 73 20 6f 62 74 61 69 6e  ue, z was obtain
2900: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a  ed from malloc *
2910: 2f 0a 29 7b 0a 20 20 53 62 53 56 61 6c 75 65 20  /.){.  SbSValue 
2920: 76 3b 0a 20 20 76 2e 66 6c 61 67 73 20 3d 20 53  v;.  v.flags = S
2930: 42 53 56 41 4c 5f 53 54 52 3b 0a 20 20 69 66 28  BSVAL_STR;.  if(
2940: 20 64 79 6e 20 29 7b 0a 20 20 20 20 76 2e 66 6c   dyn ){.    v.fl
2950: 61 67 73 20 7c 3d 20 53 42 53 56 41 4c 5f 44 59  ags |= SBSVAL_DY
2960: 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30  N;.  }.  if( n<0
2970: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29   ) n = strlen(z)
2980: 3b 0a 20 20 76 2e 75 2e 73 74 72 2e 73 69 7a 65  ;.  v.u.str.size
2990: 20 3d 20 6e 3b 0a 20 20 76 2e 75 2e 73 74 72 2e   = n;.  v.u.str.
29a0: 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72 6e 20  z = z;.  return 
29b0: 73 62 73 5f 70 75 73 68 28 70 2c 20 26 76 29 3b  sbs_push(p, &v);
29c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61  .}../*.** Push a
29d0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  n integer value 
29e0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
29f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2a00: 6e 65 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 63  ne really just c
2a10: 6f 6e 76 65 72 74 73 20 74 68 65 20 69 6e 74 65  onverts the inte
2a20: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
2a30: 67 0a 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 73 20  g.** then calls 
2a40: 53 62 53 5f 50 75 73 68 2e 0a 2a 2f 0a 69 6e 74  SbS_Push..*/.int
2a50: 20 53 62 53 5f 50 75 73 68 49 6e 74 28 73 74 72   SbS_PushInt(str
2a60: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70  uct Subscript *p
2a70: 2c 20 69 6e 74 20 69 56 61 6c 29 7b 0a 20 20 69  , int iVal){.  i
2a80: 66 28 20 69 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  f( iVal==0 ){.  
2a90: 20 20 72 65 74 75 72 6e 20 53 62 53 5f 50 75 73    return SbS_Pus
2aa0: 68 28 70 2c 20 22 30 22 2c 20 31 2c 20 30 29 3b  h(p, "0", 1, 0);
2ab0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 56 61  .  }else if( iVa
2ac0: 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75  l==1 ){.    retu
2ad0: 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c 20 22  rn SbS_Push(p, "
2ae0: 31 22 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 65 6c  1", 1, 0);.  }el
2af0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
2b00: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
2b10: 63 68 61 72 20 7a 56 61 6c 5b 35 30 5d 3b 0a 20  char zVal[50];. 
2b20: 20 20 20 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c     sprintf(zVal,
2b30: 20 22 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20   "%d", iVal);.  
2b40: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61    n = strlen(zVa
2b50: 6c 29 3b 0a 20 20 20 20 7a 20 3d 20 6d 61 6c 6c  l);.    z = mall
2b60: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20 69  oc( n+1 );.    i
2b70: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 73 74  f( z ){.      st
2b80: 72 63 70 79 28 7a 2c 20 7a 56 61 6c 29 3b 0a 20  rcpy(z, zVal);. 
2b90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 62 53 5f       return SbS_
2ba0: 50 75 73 68 28 70 2c 20 7a 2c 20 6e 2c 20 31 29  Push(p, z, n, 1)
2bb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bc0: 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f 45 52     return SBS_ER
2bd0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ROR;.    }.  }.}
2be0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 61 6e 64 20  ../*.** Pop and 
2bf0: 64 65 73 74 72 6f 79 20 7a 65 72 6f 20 6f 72 20  destroy zero or 
2c00: 6d 6f 72 65 20 76 61 6c 75 65 73 20 66 72 6f 6d  more values from
2c10: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 52   the stack..** R
2c20: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
2c30: 20 6f 66 20 76 61 6c 75 65 73 20 72 65 6d 61 69   of values remai
2c40: 6e 69 6e 67 20 6f 6e 20 74 68 65 20 73 74 61 63  ning on the stac
2c50: 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 70  k after.** the p
2c60: 6f 70 73 20 6f 63 63 75 72 2e 0a 2a 2f 0a 69 6e  ops occur..*/.in
2c70: 74 20 53 62 53 5f 50 6f 70 28 73 74 72 75 63 74  t SbS_Pop(struct
2c80: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 69   Subscript *p, i
2c90: 6e 74 20 4e 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt N){.  while( 
2ca0: 4e 3e 30 20 26 26 20 70 2d 3e 6e 53 74 61 63 6b  N>0 && p->nStack
2cb0: 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 74  >0 ){.    p->nSt
2cc0: 61 63 6b 2d 2d 3b 0a 20 20 20 20 73 62 73 5f 76  ack--;.    sbs_v
2cd0: 61 6c 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 61  alue_reset(&p->a
2ce0: 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 5d  Stack[p->nStack]
2cf0: 29 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a  );.    N--;.  }.
2d00: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 53 74 61    return p->nSta
2d10: 63 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ck;.}../*.** Ret
2d20: 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 65 6c 65  urn the N-th ele
2d30: 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 74 61 63  ment of the stac
2d40: 6b 2e 20 20 30 20 69 73 20 74 68 65 20 74 6f 70  k.  0 is the top
2d50: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   of the stack..*
2d60: 2a 20 31 20 69 73 20 74 68 65 20 66 69 72 73 74  * 1 is the first
2d70: 20 65 6c 65 6d 65 6e 74 20 64 6f 77 6e 2e 20 20   element down.  
2d80: 32 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  2 is the second 
2d90: 65 6c 65 6d 65 6e 74 2e 20 20 41 6e 64 20 73 6f  element.  And so
2da0: 20 66 6f 72 74 68 2e 0a 2a 2a 20 52 65 74 75 72   forth..** Retur
2db0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
2dc0: 69 73 20 6e 6f 20 4e 2d 74 68 20 65 6c 65 6d 65  is no N-th eleme
2dd0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  nt..**.** The po
2de0: 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
2df0: 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74  s only valid unt
2e00: 69 6c 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  il the value is 
2e10: 70 6f 70 70 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  popped.** from t
2e20: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 6f 6e  he stack..*/.con
2e30: 73 74 20 63 68 61 72 20 2a 53 62 53 5f 53 74 61  st char *SbS_Sta
2e40: 63 6b 56 61 6c 75 65 28 73 74 72 75 63 74 20 53  ckValue(struct S
2e50: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74  ubscript *p, int
2e60: 20 4e 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b   N, int *pSize){
2e70: 0a 20 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61  .  SbSValue *pVa
2e80: 6c 3b 0a 20 20 69 66 28 20 4e 3c 30 20 7c 7c 20  l;.  if( N<0 || 
2e90: 4e 3e 3d 70 2d 3e 6e 53 74 61 63 6b 20 29 7b 0a  N>=p->nStack ){.
2ea0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2eb0: 7d 0a 20 20 70 56 61 6c 20 3d 20 26 70 2d 3e 61  }.  pVal = &p->a
2ec0: 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 2d  Stack[p->nStack-
2ed0: 4e 2d 31 5d 3b 0a 20 20 69 66 28 20 28 70 56 61  N-1];.  if( (pVa
2ee0: 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42 53 56 41  l->flags & SBSVA
2ef0: 4c 5f 53 54 52 29 3d 3d 30 20 29 7b 0a 20 20 20  L_STR)==0 ){.   
2f00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2f10: 20 2a 70 53 69 7a 65 20 3d 20 70 56 61 6c 2d 3e   *pSize = pVal->
2f20: 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 72 65  u.str.size;.  re
2f30: 74 75 72 6e 20 70 56 61 6c 2d 3e 75 2e 73 74 72  turn pVal->u.str
2f40: 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  .z;.}../*.** A c
2f50: 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
2f60: 6e 65 20 66 6f 72 20 65 78 74 72 61 63 74 69 6e  ne for extractin
2f70: 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  g an integer val
2f80: 75 65 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ue from the.** s
2f90: 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53  tack..*/.int SbS
2fa0: 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 28 73  _StackValueInt(s
2fb0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
2fc0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  *p, int N){.  in
2fd0: 74 20 6e 2c 20 76 3b 0a 20 20 69 6e 74 20 69 73  t n, v;.  int is
2fe0: 4e 65 67 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  Neg = 0;.  const
2ff0: 20 63 68 61 72 20 2a 7a 20 3d 20 53 62 53 5f 53   char *z = SbS_S
3000: 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 4e 2c 20  tackValue(p, N, 
3010: 26 6e 29 3b 0a 20 20 76 20 3d 20 30 3b 0a 20 20  &n);.  v = 0;.  
3020: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
3030: 6e 20 30 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d  n 0;.  if( z[0]=
3040: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65  ='-' ){.    isNe
3050: 67 20 3d 20 31 3b 0a 20 20 20 20 7a 2b 2b 3b 0a  g = 1;.    z++;.
3060: 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 65 6c 73 65      n--;.  }else
3070: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2b 27 20 29   if( z[0]=='+' )
3080: 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e  {.    z++;.    n
3090: 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
30a0: 20 6e 3e 30 20 26 26 20 69 73 64 69 67 69 74 28   n>0 && isdigit(
30b0: 7a 5b 30 5d 29 20 29 7b 0a 20 20 20 20 76 20 3d  z[0]) ){.    v =
30c0: 20 76 2a 31 30 20 2b 20 7a 5b 30 5d 20 2d 20 27   v*10 + z[0] - '
30d0: 30 27 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  0';.    z++;.   
30e0: 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n--;.  }.  if( 
30f0: 69 73 4e 65 67 20 29 7b 0a 20 20 20 20 76 20 3d  isNeg ){.    v =
3100: 20 2d 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -v;.  }.  retur
3110: 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n v;.}../*.** Re
3120: 74 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 65  trieve the value
3130: 20 6f 66 20 61 20 76 61 72 69 61 62 6c 65 20 66   of a variable f
3140: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65  rom the interpre
3150: 74 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ter.  Return.** 
3160: 4e 55 4c 4c 20 69 66 20 6e 6f 20 73 75 63 68 20  NULL if no such 
3170: 76 61 72 69 61 62 6c 65 20 69 73 20 64 65 66 69  variable is defi
3180: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ned.  .**.** The
3190: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
31a0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
31b0: 69 6c 79 20 28 70 72 6f 62 61 62 6c 79 20 6e 6f  ily (probably no
31c0: 74 29 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  t) zero-terminat
31d0: 65 64 2e 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e  ed..** The strin
31e0: 67 20 6d 61 79 20 62 65 20 64 65 61 6c 6c 6f 63  g may be dealloc
31f0: 61 74 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  ated the next ti
3200: 6d 65 20 61 6e 79 74 68 69 6e 67 20 69 73 20 64  me anything is d
3210: 6f 6e 65 20 74 6f 0a 2a 2a 20 74 68 65 20 69 6e  one to.** the in
3220: 74 65 72 70 72 65 74 65 72 2e 20 20 4d 61 6b 65  terpreter.  Make
3230: 20 61 20 63 6f 70 79 20 69 66 20 79 6f 75 20 6e   a copy if you n
3240: 65 65 64 20 69 74 20 74 6f 20 70 65 72 73 69 73  eed it to persis
3250: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
3260: 20 2a 53 62 53 5f 46 65 74 63 68 28 0a 20 20 73   *SbS_Fetch(.  s
3270: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
3280: 2a 70 2c 20 20 20 2f 2a 20 54 68 65 20 69 6e 74  *p,   /* The int
3290: 65 72 70 72 65 74 65 72 20 77 65 20 61 72 65 20  erpreter we are 
32a0: 69 6e 74 65 72 72 6f 67 61 74 69 6e 67 20 2a 2f  interrogating */
32b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
32c0: 4b 65 79 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Key,        /* N
32d0: 61 6d 65 20 6f 66 20 74 68 65 20 76 61 72 69 61  ame of the varia
32e0: 62 6c 65 2e 20 20 43 61 73 65 20 73 65 6e 73 69  ble.  Case sensi
32f0: 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  tive */.  int *p
3300: 4c 65 6e 67 74 68 20 20 20 20 20 20 20 20 20 20  Length          
3310: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
3320: 6c 65 6e 67 74 68 20 68 65 72 65 20 2a 2f 0a 29  length here */.)
3330: 7b 0a 20 20 63 6f 6e 73 74 20 53 62 53 56 61 6c  {.  const SbSVal
3340: 75 65 20 2a 70 56 61 6c 3b 0a 0a 20 20 70 56 61  ue *pVal;..  pVa
3350: 6c 20 3d 20 73 62 73 5f 66 65 74 63 68 28 26 70  l = sbs_fetch(&p
3360: 2d 3e 73 79 6d 54 61 62 2c 20 7a 4b 65 79 2c 20  ->symTab, zKey, 
3370: 2d 31 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d  -1);.  if( pVal=
3380: 3d 30 20 7c 7c 20 28 70 56 61 6c 2d 3e 66 6c 61  =0 || (pVal->fla
3390: 67 73 20 26 20 53 42 53 56 41 4c 5f 53 54 52 29  gs & SBSVAL_STR)
33a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ==0 ){.    *pLen
33b0: 67 74 68 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  gth = 0;.    ret
33c0: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
33d0: 20 20 20 20 2a 70 4c 65 6e 67 74 68 20 3d 20 70      *pLength = p
33e0: 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 3b  Val->u.str.size;
33f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 61 6c  .    return pVal
3400: 2d 3e 75 2e 73 74 72 2e 7a 3b 0a 20 20 7d 0a 7d  ->u.str.z;.  }.}
3410: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
3420: 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 72 65   an error and re
3430: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
3440: 20 74 68 65 20 73 74 61 63 6b 20 68 61 73 0a 2a   the stack has.*
3450: 2a 20 66 65 77 65 72 20 74 68 61 6e 20 4e 20 65  * fewer than N e
3460: 6c 65 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69  lements.  This i
3470: 73 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  s utility routin
3480: 65 20 75 73 65 64 20 69 6e 0a 2a 2a 20 74 68 65  e used in.** the
3490: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
34a0: 6f 66 20 76 65 72 62 73 2e 0a 2a 2f 0a 69 6e 74  of verbs..*/.int
34b0: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63   SbS_RequireStac
34c0: 6b 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69  k(struct Subscri
34d0: 70 74 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 63 6f  pt *p, int N, co
34e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 29 7b  nst char *zCmd){
34f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b  .  if( p->nStack
3500: 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >=N ) return 0;.
3510: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3520: 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 45 72  tf(sizeof(p->zEr
3530: 72 4d 73 67 29 2c 20 70 2d 3e 7a 45 72 72 4d 73  rMsg), p->zErrMs
3540: 67 2c 0a 20 20 20 20 20 22 5c 22 25 73 5c 22 20  g,.     "\"%s\" 
3550: 72 65 71 75 69 72 65 73 20 61 74 20 6c 65 61 73  requires at leas
3560: 74 20 25 64 20 73 74 61 63 6b 20 65 6c 65 6d 65  t %d stack eleme
3570: 6e 74 73 20 2d 20 6f 6e 6c 79 20 66 6f 75 6e 64  nts - only found
3580: 20 25 64 22 2c 0a 20 20 20 20 20 7a 43 6d 64 2c   %d",.     zCmd,
3590: 20 4e 2c 20 70 2d 3e 6e 53 74 61 63 6b 29 3b 0a   N, p->nStack);.
35a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
35b0: 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63  *.** Subscript c
35c0: 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 20 53 54  ommand:       ST
35d0: 52 49 4e 47 20 4e 41 4d 45 20 73 65 74 0a 2a 2a  RING NAME set.**
35e0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 76 61  .** Write the va
35f0: 6c 75 65 20 6f 66 20 53 54 52 49 4e 47 20 69 6e  lue of STRING in
3600: 74 6f 20 76 61 72 69 61 62 6c 65 20 63 61 6c 6c  to variable call
3610: 65 64 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74  ed NAME..*/.stat
3620: 69 63 20 69 6e 74 20 73 65 74 43 6d 64 28 53 75  ic int setCmd(Su
3630: 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 64  bscript *p, void
3640: 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 53   *pNotUsed){.  S
3650: 62 53 56 61 6c 75 65 20 2a 70 54 6f 73 3b 0a 20  bSValue *pTos;. 
3660: 20 53 62 53 56 61 6c 75 65 20 2a 70 4e 6f 73 3b   SbSValue *pNos;
3670: 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69  .  if( SbS_Requi
3680: 72 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 73  reStack(p, 2, "s
3690: 65 74 22 29 20 29 20 72 65 74 75 72 6e 20 53 42  et") ) return SB
36a0: 53 5f 45 52 52 4f 52 3b 0a 20 20 70 54 6f 73 20  S_ERROR;.  pTos 
36b0: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70  = &p->aStack[--p
36c0: 2d 3e 6e 53 74 61 63 6b 5d 3b 0a 20 20 70 4e 6f  ->nStack];.  pNo
36d0: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d  s = &p->aStack[-
36e0: 2d 70 2d 3e 6e 53 74 61 63 6b 5d 3b 0a 20 20 73  -p->nStack];.  s
36f0: 62 73 5f 73 74 6f 72 65 28 26 70 2d 3e 73 79 6d  bs_store(&p->sym
3700: 54 61 62 2c 20 70 54 6f 73 2d 3e 75 2e 73 74 72  Tab, pTos->u.str
3710: 2e 7a 2c 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e  .z, pTos->u.str.
3720: 73 69 7a 65 2c 20 70 4e 6f 73 29 3b 0a 20 20 73  size, pNos);.  s
3730: 62 73 5f 76 61 6c 75 65 5f 72 65 73 65 74 28 70  bs_value_reset(p
3740: 54 6f 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Tos);.  return 0
3750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63  ;.}../*.** Subsc
3760: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20  ript command:   
3770: 20 20 20 49 4e 54 45 47 45 52 20 6e 6f 74 20 49     INTEGER not I
3780: 4e 54 45 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63  NTEGER.*/.static
3790: 20 69 6e 74 20 6e 6f 74 43 6d 64 28 73 74 72 75   int notCmd(stru
37a0: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c  ct Subscript *p,
37b0: 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 29   void *pNotUsed)
37c0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28  {.  int n;.  if(
37d0: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63   SbS_RequireStac
37e0: 6b 28 70 2c 20 31 2c 20 22 6e 6f 74 22 29 20 29  k(p, 1, "not") )
37f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e 20 3d   return 1;.  n =
3800: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49   SbS_StackValueI
3810: 6e 74 28 70 2c 20 30 29 3b 0a 20 20 53 62 53 5f  nt(p, 0);.  SbS_
3820: 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 62 53  Pop(p, 1);.  SbS
3830: 5f 50 75 73 68 49 6e 74 28 70 2c 20 21 6e 29 3b  _PushInt(p, !n);
3840: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3850: 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20  /*.** Subscript 
3860: 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 49 4e  command:      IN
3870: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 6d 61  TEGER INTEGER ma
3880: 78 20 49 4e 54 45 47 45 52 0a 2a 2f 0a 73 74 61  x INTEGER.*/.sta
3890: 74 69 63 20 69 6e 74 20 6d 61 78 43 6d 64 28 73  tic int maxCmd(s
38a0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
38b0: 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73  *p, void *pNotUs
38c0: 65 64 29 7b 0a 20 20 69 6e 74 20 61 2c 20 62 3b  ed){.  int a, b;
38d0: 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69  .  if( SbS_Requi
38e0: 72 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 6d  reStack(p, 2, "m
38f0: 61 78 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b  ax") ) return 1;
3900: 0a 20 20 61 20 3d 20 53 62 53 5f 53 74 61 63 6b  .  a = SbS_Stack
3910: 56 61 6c 75 65 49 6e 74 28 70 2c 20 30 29 3b 0a  ValueInt(p, 0);.
3920: 20 20 62 20 3d 20 53 62 53 5f 53 74 61 63 6b 56    b = SbS_StackV
3930: 61 6c 75 65 49 6e 74 28 70 2c 20 31 29 3b 0a 20  alueInt(p, 1);. 
3940: 20 53 62 53 5f 50 6f 70 28 70 2c 20 32 29 3b 0a   SbS_Pop(p, 2);.
3950: 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70 2c    SbS_PushInt(p,
3960: 20 61 3e 62 20 3f 20 61 20 3a 20 62 29 3b 0a 20   a>b ? a : b);. 
3970: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3980: 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f  .** Subscript co
3990: 6d 6d 61 6e 64 3a 20 20 20 20 20 20 49 4e 54 45  mmand:      INTE
39a0: 47 45 52 20 49 4e 54 45 47 45 52 20 61 6e 64 20  GER INTEGER and 
39b0: 49 4e 54 45 47 45 52 0a 2a 2f 0a 73 74 61 74 69  INTEGER.*/.stati
39c0: 63 20 69 6e 74 20 61 6e 64 43 6d 64 28 73 74 72  c int andCmd(str
39d0: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70  uct Subscript *p
39e0: 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64  , void *pNotUsed
39f0: 29 7b 0a 20 20 69 6e 74 20 61 2c 20 62 3b 0a 20  ){.  int a, b;. 
3a00: 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65   if( SbS_Require
3a10: 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 6d 61 78  Stack(p, 2, "max
3a20: 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ") ) return 1;. 
3a30: 20 61 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61   a = SbS_StackVa
3a40: 6c 75 65 49 6e 74 28 70 2c 20 30 29 3b 0a 20 20  lueInt(p, 0);.  
3a50: 62 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c  b = SbS_StackVal
3a60: 75 65 49 6e 74 28 70 2c 20 31 29 3b 0a 20 20 53  ueInt(p, 1);.  S
3a70: 62 53 5f 50 6f 70 28 70 2c 20 32 29 3b 0a 20 20  bS_Pop(p, 2);.  
3a80: 53 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 61  SbS_PushInt(p, a
3a90: 20 26 26 20 62 29 3b 0a 20 20 72 65 74 75 72 6e   && b);.  return
3aa0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62   0;.}../*.** Sub
3ab0: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20  script command: 
3ac0: 20 20 20 20 20 53 54 52 49 4e 47 20 70 75 74 73       STRING puts
3ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
3ae0: 75 74 73 43 6d 64 28 73 74 72 75 63 74 20 53 75  utsCmd(struct Su
3af0: 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 64  bscript *p, void
3b00: 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69   *pNotUsed){.  i
3b10: 6e 74 20 73 69 7a 65 3b 0a 20 20 63 6f 6e 73 74  nt size;.  const
3b20: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
3b30: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b  SbS_RequireStack
3b40: 28 70 2c 20 31 2c 20 22 70 75 74 73 22 29 20 29  (p, 1, "puts") )
3b50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d   return 1;.  z =
3b60: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28   SbS_StackValue(
3b70: 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b 0a 20 20  p, 0, &size);.  
3b80: 70 72 69 6e 74 66 28 22 25 2e 2a 73 5c 6e 22 2c  printf("%.*s\n",
3b90: 20 73 69 7a 65 2c 20 7a 29 3b 0a 20 20 53 62 53   size, z);.  SbS
3ba0: 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 72 65  _Pop(p, 1);.  re
3bb0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
3bc0: 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 62 75 69  * A table of bui
3bd0: 6c 74 2d 69 6e 20 63 6f 6d 6d 61 6e 64 73 0a 2a  lt-in commands.*
3be0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
3bf0: 74 72 75 63 74 20 7b 0a 20 20 63 6f 6e 73 74 20  truct {.  const 
3c00: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e  char *zCmd;.  in
3c10: 74 20 6e 43 6d 64 3b 0a 20 20 69 6e 74 20 28 2a  t nCmd;.  int (*
3c20: 78 43 6d 64 29 28 53 75 62 73 63 72 69 70 74 2a  xCmd)(Subscript*
3c30: 2c 76 6f 69 64 2a 29 3b 0a 7d 20 61 42 75 69 6c  ,void*);.} aBuil
3c40: 74 69 6e 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 61  tin[] = {.  { "a
3c50: 6e 64 22 2c 20 20 20 33 2c 20 20 20 20 61 6e 64  nd",   3,    and
3c60: 43 6d 64 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6d  Cmd    },.  { "m
3c70: 61 78 22 2c 20 20 20 33 2c 20 20 20 20 6d 61 78  ax",   3,    max
3c80: 43 6d 64 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6e  Cmd    },.  { "n
3c90: 6f 74 22 2c 20 20 20 33 2c 20 20 20 20 6e 6f 74  ot",   3,    not
3ca0: 43 6d 64 20 20 20 20 7d 2c 0a 20 20 7b 20 22 70  Cmd    },.  { "p
3cb0: 75 74 73 22 2c 20 20 34 2c 20 20 20 20 70 75 74  uts",  4,    put
3cc0: 73 43 6d 64 20 20 20 7d 2c 0a 20 20 7b 20 22 73  sCmd   },.  { "s
3cd0: 65 74 22 2c 20 20 20 33 2c 20 20 20 20 73 65 74  et",   3,    set
3ce0: 43 6d 64 20 20 20 20 7d 2c 0a 7d 3b 0a 0a 0a 2f  Cmd    },.};.../
3cf0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
3d00: 77 20 73 75 62 73 63 72 69 70 74 20 69 6e 74 65  w subscript inte
3d10: 72 70 72 65 74 65 72 0a 2a 2f 0a 73 74 72 75 63  rpreter.*/.struc
3d20: 74 20 53 75 62 73 63 72 69 70 74 20 2a 53 62 53  t Subscript *SbS
3d30: 5f 43 72 65 61 74 65 28 76 6f 69 64 29 7b 0a 20  _Create(void){. 
3d40: 20 53 75 62 73 63 72 69 70 74 20 2a 70 3b 0a 0a   Subscript *p;..
3d50: 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69    p = malloc( si
3d60: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
3d70: 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ( p ){.    memse
3d80: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
3d90: 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p));.  }.  retur
3da0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76  n p;.}../*.** Ev
3db0: 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70  aluate the scrip
3dc0: 74 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 66  t given by the f
3dd0: 69 72 73 74 20 6e 53 63 72 69 70 74 20 62 79 74  irst nScript byt
3de0: 65 73 20 6f 66 20 7a 53 63 72 69 70 74 5b 5d 2e  es of zScript[].
3df0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
3e00: 73 75 63 63 65 73 73 20 61 6e 64 20 6e 6f 6e 2d  success and non-
3e10: 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f  zero for an erro
3e20: 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 45 76  r..*/.int SbS_Ev
3e30: 61 6c 28 73 74 72 75 63 74 20 53 75 62 73 63 72  al(struct Subscr
3e40: 69 70 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ipt *p, const ch
3e50: 61 72 20 2a 7a 53 63 72 69 70 74 2c 20 69 6e 74  ar *zScript, int
3e60: 20 6e 53 63 72 69 70 74 29 7b 0a 20 20 69 6e 74   nScript){.  int
3e70: 20 72 63 20 3d 20 53 42 53 5f 4f 4b 3b 0a 20 20   rc = SBS_OK;.  
3e80: 69 66 28 20 6e 53 63 72 69 70 74 3c 30 20 29 20  if( nScript<0 ) 
3e90: 6e 53 63 72 69 70 74 20 3d 20 73 74 72 6c 65 6e  nScript = strlen
3ea0: 28 7a 53 63 72 69 70 74 29 3b 0a 20 20 77 68 69  (zScript);.  whi
3eb0: 6c 65 28 20 6e 53 63 72 69 70 74 3e 30 20 26 26  le( nScript>0 &&
3ec0: 20 72 63 3d 3d 53 42 53 5f 4f 4b 20 29 7b 0a 20   rc==SBS_OK ){. 
3ed0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 6e     int n;.    in
3ee0: 74 20 74 74 79 70 65 3b 0a 20 20 20 20 6e 20 3d  t ttype;.    n =
3ef0: 20 73 62 73 5f 6e 65 78 74 5f 74 6f 6b 65 6e 28   sbs_next_token(
3f00: 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74  zScript, nScript
3f10: 2c 20 26 74 74 79 70 65 29 3b 0a 20 20 20 20 73  , &ttype);.    s
3f20: 77 69 74 63 68 28 20 74 74 79 70 65 20 29 7b 0a  witch( ttype ){.
3f30: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54        case SBSTT
3f40: 5f 57 48 49 54 45 53 50 41 43 45 3a 20 7b 0a 20  _WHITESPACE: {. 
3f50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3f70: 20 53 42 53 54 54 5f 45 4f 46 3a 20 7b 0a 20 20   SBSTT_EOF: {.  
3f80: 20 20 20 20 20 20 6e 53 63 72 69 70 74 20 3d 20        nScript = 
3f90: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
3fa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3fb0: 63 61 73 65 20 53 42 53 54 54 5f 49 4e 43 4f 4d  case SBSTT_INCOM
3fc0: 50 4c 45 54 45 3a 0a 20 20 20 20 20 20 63 61 73  PLETE:.      cas
3fd0: 65 20 53 42 53 54 54 5f 55 4e 4b 4e 4f 57 4e 3a  e SBSTT_UNKNOWN:
3fe0: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
3ff0: 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  SBS_ERROR;.     
4000: 20 20 20 6e 53 63 72 69 70 74 20 3d 20 6e 3b 0a     nScript = n;.
4010: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4030: 65 20 53 42 53 54 54 5f 49 4e 54 45 47 45 52 3a  e SBSTT_INTEGER:
4040: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
4050: 53 62 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61  SbS_Push(p, (cha
4060: 72 2a 29 7a 53 63 72 69 70 74 2c 20 6e 2c 20 30  r*)zScript, n, 0
4070: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4090: 63 61 73 65 20 53 42 53 54 54 5f 4e 41 4d 45 3a  case SBSTT_NAME:
40a0: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
40b0: 53 62 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61  SbS_Push(p, (cha
40c0: 72 2a 29 26 7a 53 63 72 69 70 74 5b 31 5d 2c 20  r*)&zScript[1], 
40d0: 6e 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  n-1, 0);.       
40e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
40f0: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54        case SBSTT
4100: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
4110: 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68     rc = SbS_Push
4120: 28 70 2c 20 28 63 68 61 72 2a 29 26 7a 53 63 72  (p, (char*)&zScr
4130: 69 70 74 5b 31 5d 2c 20 6e 2d 32 2c 20 30 29 3b  ipt[1], n-2, 0);
4140: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4160: 73 65 20 53 42 53 54 54 5f 56 45 52 42 3a 20 7b  se SBSTT_VERB: {
4170: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 53  .        const S
4180: 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20  bSValue *pVal = 
4190: 73 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79  sbs_fetch(&p->sy
41a0: 6d 54 61 62 2c 20 28 63 68 61 72 2a 29 7a 53 63  mTab, (char*)zSc
41b0: 72 69 70 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ript, n);.      
41c0: 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b    if( pVal==0 ){
41d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75  .          int u
41e0: 70 72 20 3d 20 73 69 7a 65 6f 66 28 61 42 75 69  pr = sizeof(aBui
41f0: 6c 74 69 6e 29 2f 73 69 7a 65 6f 66 28 61 42 75  ltin)/sizeof(aBu
4200: 69 6c 74 69 6e 5b 30 5d 29 20 2d 20 31 3b 0a 20  iltin[0]) - 1;. 
4210: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6c 77 72           int lwr
4220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
4230: 72 63 20 3d 20 53 42 53 5f 45 52 52 4f 52 3b 0a  rc = SBS_ERROR;.
4240: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
4250: 20 75 70 72 3e 3d 6c 77 72 20 29 7b 0a 20 20 20   upr>=lwr ){.   
4260: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d           int i =
4270: 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20   (upr+lwr)/2;.  
4280: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 20            int c 
4290: 3d 20 73 74 72 6e 63 6d 70 28 7a 53 63 72 69 70  = strncmp(zScrip
42a0: 74 2c 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 7a  t, aBuiltin[i].z
42b0: 43 6d 64 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  Cmd, n);.       
42c0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
42d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
42e0: 63 20 3d 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e  c = aBuiltin[i].
42f0: 78 43 6d 64 28 70 2c 20 30 29 3b 0a 20 20 20 20  xCmd(p, 0);.    
4300: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
4320: 73 65 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20  se if( c<0 ){.  
4330: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 72 20              upr 
4340: 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  = i-1;.         
4350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4360: 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 2b          lwr = i+
4370: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
4380: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4390: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
43a0: 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42 53  Val->flags & SBS
43b0: 56 41 4c 5f 56 45 52 42 20 29 7b 0a 20 20 20 20  VAL_VERB ){.    
43c0: 20 20 20 20 20 20 72 63 20 3d 20 70 56 61 6c 2d        rc = pVal-
43d0: 3e 75 2e 76 65 72 62 2e 78 56 65 72 62 28 70 2c  >u.verb.xVerb(p,
43e0: 20 70 56 61 6c 2d 3e 75 2e 76 65 72 62 2e 70 41   pVal->u.verb.pA
43f0: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  rg);.        }el
4400: 73 65 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61  se if( pVal->fla
4410: 67 73 20 26 20 53 42 53 56 41 4c 5f 45 58 45 43  gs & SBSVAL_EXEC
4420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
4430: 20 3d 20 53 62 53 5f 45 76 61 6c 28 70 2c 20 70   = SbS_Eval(p, p
4440: 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a 2c 20 70 56  Val->u.str.z, pV
4450: 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 29 3b  al->u.str.size);
4460: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
4470: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
4480: 62 53 5f 50 75 73 68 28 70 2c 20 70 56 61 6c 2d  bS_Push(p, pVal-
4490: 3e 75 2e 73 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e  >u.str.z, pVal->
44a0: 75 2e 73 74 72 2e 73 69 7a 65 2c 20 30 29 3b 0a  u.str.size, 0);.
44b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
44c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
44d0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 63 72 69  .    }.    zScri
44e0: 70 74 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 63  pt += n;.    nSc
44f0: 72 69 70 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20  ript -= n;.  }. 
4500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4510: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65  *.** COMMAND: te
4520: 73 74 2d 73 75 62 73 63 72 69 70 74 0a 2a 2f 0a  st-subscript.*/.
4530: 76 6f 69 64 20 74 65 73 74 5f 73 75 62 73 63 72  void test_subscr
4540: 69 70 74 28 76 6f 69 64 29 7b 0a 20 20 53 75 62  ipt(void){.  Sub
4550: 73 63 72 69 70 74 20 2a 70 3b 0a 20 20 69 66 28  script *p;.  if(
4560: 20 67 2e 61 72 67 63 3c 33 20 29 7b 0a 20 20 20   g.argc<3 ){.   
4570: 20 75 73 61 67 65 28 22 53 43 52 49 50 54 22 29   usage("SCRIPT")
4580: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 53 62 53 5f  ;.  }.  p = SbS_
4590: 43 72 65 61 74 65 28 29 3b 0a 20 20 53 62 53 5f  Create();.  SbS_
45a0: 45 76 61 6c 28 70 2c 20 67 2e 61 72 67 76 5b 32  Eval(p, g.argv[2
45b0: 5d 2c 20 73 74 72 6c 65 6e 28 67 2e 61 72 67 76  ], strlen(g.argv
45c0: 5b 32 5d 29 29 3b 0a 7d 0a                       [2]));.}.