Hex Artifact Content
Not logged in

Artifact b76caa035f861c741cde2cd236efc946a27cbded:

File src/subscript.c part of check-in [a5e4e1ba96] - More work on ticketing. This is a non-working incremental check-in. by drh on 2007-11-24 23:59:47. Also file src/subscript.c part of check-in [d0305b305a] - Merged mainline into my branch to get the newest application. by aku on 2007-12-05 08:07:46.

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 64 65 66 69  _ERROR   1.#defi
09d0: 6e 65 20 53 42 53 5f 52 45 54 55 52 4e 20 20 32  ne SBS_RETURN  2
09e0: 0a 23 64 65 66 69 6e 65 20 53 42 53 5f 42 52 45  .#define SBS_BRE
09f0: 41 4b 20 20 20 33 0a 23 65 6e 64 69 66 0a 0a 2f  AK   3.#endif../
0a00: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
0a10: 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 0a 2a 2f 0a  on constants.*/.
0a20: 23 64 65 66 69 6e 65 20 53 42 53 43 4f 4e 46 49  #define SBSCONFI
0a30: 47 5f 4e 48 41 53 48 20 20 20 20 34 31 20 20 20  G_NHASH    41   
0a40: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
0a50: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
0a60: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43 4f  */.#define SBSCO
0a70: 4e 46 49 47 5f 4e 53 54 41 43 4b 20 20 20 32 30  NFIG_NSTACK   20
0a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
0a90: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20  mum stack depth 
0aa0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43 4f  */.#define SBSCO
0ab0: 4e 46 49 47 5f 45 52 52 53 49 5a 45 20 20 31 30  NFIG_ERRSIZE  10
0ac0: 30 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  0        /* Maxi
0ad0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 20 65  mum size of an e
0ae0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
0af0: 0a 2f 2a 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65  ./*.** Available
0b00: 20 74 6f 6b 65 6e 20 74 79 70 65 73 3a 0a 2a 2f   token types:.*/
0b10: 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 57  .#define SBSTT_W
0b20: 48 49 54 45 53 50 41 43 45 20 20 31 20 20 20 20  HITESPACE  1    
0b30: 2f 2a 20 65 78 3a 20 20 20 5c 30 34 30 20 20 20  /* ex:   \040   
0b40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54  */.#define SBSTT
0b50: 5f 4e 41 4d 45 20 20 20 20 20 20 20 20 32 20 20  _NAME        2  
0b60: 20 20 2f 2a 20 65 78 3a 20 20 20 2f 61 62 63 64    /* ex:   /abcd
0b70: 65 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42  e  */.#define SB
0b80: 53 54 54 5f 56 45 52 42 20 20 20 20 20 20 20 20  STT_VERB        
0b90: 33 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 61 62  3    /* ex:   ab
0ba0: 63 64 65 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65  cde   */.#define
0bb0: 20 53 42 53 54 54 5f 53 54 52 49 4e 47 20 20 20   SBSTT_STRING   
0bc0: 20 20 20 34 20 20 20 20 2f 2a 20 65 78 3a 20 20     4    /* ex:  
0bd0: 20 7b 2e 2e 2e 7d 20 20 20 2a 2f 0a 23 64 65 66   {...}   */.#def
0be0: 69 6e 65 20 53 42 53 54 54 5f 51 55 4f 54 45 44  ine SBSTT_QUOTED
0bf0: 20 20 20 20 20 20 35 20 20 20 20 2f 2a 20 65 78        5    /* ex
0c00: 3a 20 20 20 22 2e 2e 2e 5c 6e 2e 2e 2e 22 20 2a  :   "...\n..." *
0c10: 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f  /.#define SBSTT_
0c20: 49 4e 54 45 47 45 52 20 20 20 20 20 36 20 20 20  INTEGER     6   
0c30: 20 2f 2a 20 49 6e 74 65 67 65 72 20 69 6e 63 6c   /* Integer incl
0c40: 75 64 69 6e 67 20 6f 70 74 69 6f 6e 20 73 69 67  uding option sig
0c50: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53  n */.#define SBS
0c60: 54 54 5f 49 4e 43 4f 4d 50 4c 45 54 45 20 20 37  TT_INCOMPLETE  7
0c70: 20 20 20 20 2f 2a 20 55 6e 74 65 72 6d 69 6e 61      /* Untermina
0c80: 74 65 64 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e  ted string token
0c90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54   */.#define SBST
0ca0: 54 5f 55 4e 4b 4e 4f 57 4e 20 20 20 20 20 38 20  T_UNKNOWN     8 
0cb0: 20 20 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20 74 6f     /* Unknown to
0cc0: 6b 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ken */.#define S
0cd0: 42 53 54 54 5f 45 4f 46 20 20 20 20 20 20 20 20  BSTT_EOF        
0ce0: 20 39 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20   9    /* End of 
0cf0: 69 6e 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  input */../*.** 
0d00: 56 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  Values are store
0d10: 64 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  d in the hash ta
0d20: 62 6c 65 20 61 73 20 69 6e 73 74 61 6e 63 65 73  ble as instances
0d30: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0d40: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  g.** structure..
0d50: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0d60: 74 20 53 62 53 56 61 6c 75 65 20 53 62 53 56 61  t SbSValue SbSVa
0d70: 6c 75 65 3b 0a 73 74 72 75 63 74 20 53 62 53 56  lue;.struct SbSV
0d80: 61 6c 75 65 20 7b 0a 20 20 69 6e 74 20 66 6c 61  alue {.  int fla
0d90: 67 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 69  gs;        /* Bi
0da0: 74 6d 61 73 6b 20 6f 66 20 53 42 53 56 41 4c 5f  tmask of SBSVAL_
0db0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 6e  * values */.  un
0dc0: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
0dd0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a   {.      int siz
0de0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
0df0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
0e00: 73 74 72 69 6e 67 2c 20 6e 6f 74 20 63 6f 75 6e  string, not coun
0e10: 74 69 6e 67 20 66 69 6e 61 6c 20 7a 65 72 6f 20  ting final zero 
0e20: 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
0e30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
0e40: 6e 74 65 72 20 74 6f 20 73 74 72 69 6e 67 20 63  nter to string c
0e50: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 20  ontent */.    } 
0e60: 73 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  str;          /*
0e70: 20 56 61 6c 75 65 20 69 66 20 53 42 53 56 41 4c   Value if SBSVAL
0e80: 5f 53 54 52 20 2a 2f 0a 20 20 20 20 73 74 72 75  _STR */.    stru
0e90: 63 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 28  ct {.      int (
0ea0: 2a 78 56 65 72 62 29 28 53 75 62 73 63 72 69 70  *xVerb)(Subscrip
0eb0: 74 2a 2c 20 76 6f 69 64 2a 29 3b 20 20 20 20 20  t*, void*);     
0ec0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 64  /* Function to d
0ed0: 6f 20 74 68 65 20 77 6f 72 6b 20 2a 2f 0a 20 20  o the work */.  
0ee0: 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 20      void *pArg; 
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20           /* 2nd 
0f10: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 56 65  parameter to xVe
0f20: 72 62 20 2a 2f 0a 20 20 20 20 7d 20 76 65 72 62  rb */.    } verb
0f30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  ;         /* Val
0f40: 75 65 20 69 66 20 53 42 53 56 41 4c 5f 56 45 52  ue if SBSVAL_VER
0f50: 42 20 2a 2f 0a 20 20 7d 20 75 3b 20 20 20 20 20  B */.  } u;     
0f60: 20 20 20 20 20 20 20 20 20 0a 7d 3b 0a 23 64 65           .};.#de
0f70: 66 69 6e 65 20 53 42 53 56 41 4c 5f 56 45 52 42  fine SBSVAL_VERB
0f80: 20 20 20 20 30 78 30 30 30 31 20 20 20 20 20 20      0x0001      
0f90: 2f 2a 20 56 61 6c 75 65 20 73 74 6f 72 65 64 20  /* Value stored 
0fa0: 69 6e 20 75 2e 76 65 72 62 20 2a 2f 0a 23 64 65  in u.verb */.#de
0fb0: 66 69 6e 65 20 53 42 53 56 41 4c 5f 53 54 52 20  fine SBSVAL_STR 
0fc0: 20 20 20 20 30 78 30 30 30 32 20 20 20 20 20 20      0x0002      
0fd0: 2f 2a 20 56 61 6c 75 65 20 73 74 6f 72 65 64 20  /* Value stored 
0fe0: 69 6e 20 75 2e 73 74 72 20 2a 2f 20 0a 23 64 65  in u.str */ .#de
0ff0: 66 69 6e 65 20 53 42 53 56 41 4c 5f 44 59 4e 20  fine SBSVAL_DYN 
1000: 20 20 20 20 30 78 30 30 30 34 20 20 20 20 20 20      0x0004      
1010: 2f 2a 20 75 2e 73 74 72 2e 7a 20 69 73 20 64 79  /* u.str.z is dy
1020: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
1030: 74 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ted */.#define S
1040: 42 53 56 41 4c 5f 45 58 45 43 20 20 20 20 30 78  BSVAL_EXEC    0x
1050: 30 30 30 38 20 20 20 20 20 20 2f 2a 20 75 2e 73  0008      /* u.s
1060: 74 72 2e 7a 20 69 73 20 61 20 73 63 72 69 70 74  tr.z is a script
1070: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 6e   */../*.** An en
1080: 74 72 79 20 69 6e 20 74 68 65 20 68 61 73 68 20  try in the hash 
1090: 74 61 62 6c 65 20 69 73 20 61 6e 20 69 6e 73 74  table is an inst
10a0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
10b0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
10c0: 65 66 20 73 74 72 75 63 74 20 53 62 73 48 61 73  ef struct SbsHas
10d0: 68 45 6e 74 72 79 20 53 62 73 48 61 73 68 45 6e  hEntry SbsHashEn
10e0: 74 72 79 3b 0a 73 74 72 75 63 74 20 53 62 73 48  try;.struct SbsH
10f0: 61 73 68 45 6e 74 72 79 20 7b 0a 20 20 53 62 73  ashEntry {.  Sbs
1100: 48 61 73 68 45 6e 74 72 79 20 2a 70 4e 65 78 74  HashEntry *pNext
1110: 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  ;     /* Next en
1120: 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1130: 65 20 68 61 73 68 20 6f 6e 20 7a 4b 65 79 20 2a  e hash on zKey *
1140: 2f 0a 20 20 53 62 53 56 61 6c 75 65 20 76 61 6c  /.  SbSValue val
1150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1160: 54 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  The payload */. 
1170: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
1180: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
1190: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f  th of the key */
11a0: 0a 20 20 63 68 61 72 20 7a 4b 65 79 5b 31 5d 3b  .  char zKey[1];
11b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11c0: 65 20 6b 65 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  e key */.};../*.
11d0: 2a 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20  ** A hash table 
11e0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
11f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1200: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
1210: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 62 73  pedef struct Sbs
1220: 48 61 73 68 54 61 62 20 53 62 73 48 61 73 68 54  HashTab SbsHashT
1230: 61 62 3b 0a 73 74 72 75 63 74 20 53 62 73 48 61  ab;.struct SbsHa
1240: 73 68 54 61 62 20 7b 0a 20 20 53 62 73 48 61 73  shTab {.  SbsHas
1250: 68 45 6e 74 72 79 20 2a 61 48 61 73 68 5b 53 42  hEntry *aHash[SB
1260: 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 5d 3b 20  SCONFIG_NHASH]; 
1270: 20 2f 2a 20 54 68 65 20 68 61 73 68 20 74 61 62   /* The hash tab
1280: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1290: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
12a0: 68 65 20 53 75 62 73 63 72 69 70 74 20 69 6e 74  he Subscript int
12b0: 65 72 70 72 65 74 65 72 0a 2a 2f 0a 73 74 72 75  erpreter.*/.stru
12c0: 63 74 20 53 75 62 73 63 72 69 70 74 20 7b 0a 20  ct Subscript {. 
12d0: 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20   int nStack;    
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1300: 20 65 6e 74 72 69 65 73 20 6f 6e 20 73 74 61 63   entries on stac
1310: 6b 20 2a 2f 0a 20 20 53 62 73 48 61 73 68 54 61  k */.  SbsHashTa
1320: 62 20 73 79 6d 54 61 62 3b 20 20 20 20 20 20 20  b symTab;       
1330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1340: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 2a 2f   symbol table */
1350: 0a 20 20 63 68 61 72 20 7a 45 72 72 4d 73 67 5b  .  char zErrMsg[
1360: 53 42 53 43 4f 4e 46 49 47 5f 45 52 52 53 49 5a  SBSCONFIG_ERRSIZ
1370: 45 5d 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 74  E];   /* Space t
1380: 6f 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  o write an error
1390: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 53 62   message */.  Sb
13a0: 53 56 61 6c 75 65 20 61 53 74 61 63 6b 5b 53 42  SValue aStack[SB
13b0: 53 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 5d 3b  SCONFIG_NSTACK];
13c0: 20 2f 2a 20 54 68 65 20 73 74 61 63 6b 20 2a 2f   /* The stack */
13d0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  .};.../*.** Give
13e0: 6e 20 61 6e 20 69 6e 70 75 74 20 73 74 72 69 6e  n an input strin
13f0: 67 20 7a 20 6f 66 20 6c 65 6e 67 74 68 20 6e 2c  g z of length n,
1400: 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 74 6f   identify the to
1410: 6b 65 6e 20 74 68 61 74 0a 2a 2a 20 73 74 61 72  ken that.** star
1420: 74 73 20 61 74 20 7a 5b 30 5d 2e 20 20 57 72 69  ts at z[0].  Wri
1430: 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 74 79 70  te the token typ
1440: 65 20 69 6e 74 6f 20 2a 70 54 6f 6b 65 6e 54 79  e into *pTokenTy
1450: 70 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  pe and.** return
1460: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
1470: 68 65 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  he token..*/.sta
1480: 74 69 63 20 69 6e 74 20 73 62 73 5f 6e 65 78 74  tic int sbs_next
1490: 5f 74 6f 6b 65 6e 28 63 6f 6e 73 74 20 63 68 61  _token(const cha
14a0: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  r *z, int n, int
14b0: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 29 7b 0a 20   *pTokenType){. 
14c0: 20 69 6e 74 20 63 3b 0a 20 20 69 66 28 20 6e 3c   int c;.  if( n<
14d0: 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 20 29 7b  =0 || z[0]==0 ){
14e0: 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65  .    *pTokenType
14f0: 20 3d 20 53 42 53 54 54 5f 45 4f 46 3b 0a 20 20   = SBSTT_EOF;.  
1500: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1510: 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66    c = z[0];.  if
1520: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 7b 0a  ( isspace(c) ){.
1530: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a      int i;.    *
1540: 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53  pTokenType = SBS
1550: 54 54 5f 57 48 49 54 45 53 50 41 43 45 3b 0a 20  TT_WHITESPACE;. 
1560: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20     for(i=1; i<n 
1570: 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29  && isspace(z[i])
1580: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 72 65 74  ; i++){}.    ret
1590: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28  urn i;.  }.  if(
15a0: 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 69   c=='#' ){.    i
15b0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
15c0: 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d 20 26  1; i<n && z[i] &
15d0: 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 3b 20  & z[i-1]!='\n'; 
15e0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b  i++){}.    *pTok
15f0: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 57  enType = SBSTT_W
1600: 48 49 54 45 53 50 41 43 45 3b 0a 20 20 20 20 72  HITESPACE;.    r
1610: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69  eturn i;.  }.  i
1620: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
1630: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1640: 69 3d 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d  i=1; i<n && z[i]
1650: 20 26 26 20 7a 5b 69 5d 21 3d 27 22 27 3b 20 69   && z[i]!='"'; i
1660: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69 66 28 20  ++){.       if( 
1670: 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 26 26 20 69 3c  z[i]=='\\' && i<
1680: 6e 2d 31 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20  n-1 ){ i++; }.  
1690: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d    }.    if( z[i]
16a0: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 2a  =='"' ){.      *
16b0: 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53  pTokenType = SBS
16c0: 54 54 5f 51 55 4f 54 45 44 3b 0a 20 20 20 20 20  TT_QUOTED;.     
16d0: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
16e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
16f0: 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54  TokenType = SBST
1700: 54 5f 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  T_INCOMPLETE;.  
1710: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
1720: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d    }.  }.  if( c=
1730: 3d 27 7b 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='{' ){.    int 
1740: 64 65 70 74 68 20 3d 20 31 3b 0a 20 20 20 20 69  depth = 1;.    i
1750: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1760: 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d 3b 20  1; i<n && z[i]; 
1770: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1780: 7a 5b 69 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20  z[i]=='{' ){.   
1790: 20 20 20 20 20 64 65 70 74 68 2b 2b 3b 0a 20 20       depth++;.  
17a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
17b0: 69 5d 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 20  i]=='}' ){.     
17c0: 20 20 20 64 65 70 74 68 2d 2d 3b 0a 20 20 20 20     depth--;.    
17d0: 20 20 20 20 69 66 28 20 64 65 70 74 68 3d 3d 30      if( depth==0
17e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
17f0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
1800: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1810: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1820: 69 66 28 20 64 65 70 74 68 20 29 7b 0a 20 20 20  if( depth ){.   
1830: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
1840: 20 53 42 53 54 54 5f 49 4e 43 4f 4d 50 4c 45 54   SBSTT_INCOMPLET
1850: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1860: 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20      *pTokenType 
1870: 3d 20 53 42 53 54 54 5f 53 54 52 49 4e 47 3b 0a  = SBSTT_STRING;.
1880: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1890: 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d   i;.  }.  if( c=
18a0: 3d 27 2f 27 20 26 26 20 6e 3e 3d 32 20 26 26 20  ='/' && n>=2 && 
18b0: 69 73 61 6c 70 68 61 28 7a 5b 31 5d 29 20 29 7b  isalpha(z[1]) ){
18c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18d0: 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 20 26 26 20  for(i=2; i<n && 
18e0: 28 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 7c  (isalnum(z[i]) |
18f0: 7c 20 7a 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2b  | z[i]=='_'); i+
1900: 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65 6e  +){}.    *pToken
1910: 54 79 70 65 20 3d 20 53 42 53 54 54 5f 4e 41 4d  Type = SBSTT_NAM
1920: 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b  E;.    return i;
1930: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 61 6c 70  .  }.  if( isalp
1940: 68 61 28 63 29 20 29 7b 0a 20 20 20 20 69 6e 74  ha(c) ){.    int
1950: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
1960: 20 69 3c 6e 20 26 26 20 28 69 73 61 6c 6e 75 6d   i<n && (isalnum
1970: 28 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d  (z[i]) || z[i]==
1980: 27 5f 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  '_'); i++){}.   
1990: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53   *pTokenType = S
19a0: 42 53 54 54 5f 56 45 52 42 3b 0a 20 20 20 20 72  BSTT_VERB;.    r
19b0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69  eturn i;.  }.  i
19c0: 66 28 20 69 73 64 69 67 69 74 28 63 29 20 7c 7c  f( isdigit(c) ||
19d0: 20 28 28 63 3d 3d 27 2d 27 20 7c 7c 20 63 3d 3d   ((c=='-' || c==
19e0: 27 2b 27 29 20 26 26 20 6e 3e 3d 32 20 26 26 20  '+') && n>=2 && 
19f0: 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29  isdigit(z[1])) )
1a00: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1a10: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26   for(i=1; i<n &&
1a20: 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 3b 20   isdigit(z[i]); 
1a30: 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b  i++){}.    *pTok
1a40: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 49  enType = SBSTT_I
1a50: 4e 54 45 47 45 52 3b 0a 20 20 20 20 72 65 74 75  NTEGER;.    retu
1a60: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 54 6f  rn i;.  }.  *pTo
1a70: 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f  kenType = SBSTT_
1a80: 55 4e 4b 4e 4f 57 4e 3b 0a 20 20 72 65 74 75 72  UNKNOWN;.  retur
1a90: 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  n 1;.}.../*.** R
1aa0: 65 6c 65 61 73 65 20 61 6e 79 20 6d 65 6d 6f 72  elease any memor
1ab0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61  y allocated by a
1ac0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1ad0: 63 20 76 6f 69 64 20 73 62 73 5f 76 61 6c 75 65  c void sbs_value
1ae0: 5f 72 65 73 65 74 28 53 62 53 56 61 6c 75 65 20  _reset(SbSValue 
1af0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c  *p){.  if( p->fl
1b00: 61 67 73 20 26 20 53 42 53 56 41 4c 5f 44 59 4e  ags & SBSVAL_DYN
1b10: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e   ){.    free(p->
1b20: 75 2e 73 74 72 2e 7a 29 3b 0a 20 20 20 20 70 2d  u.str.z);.    p-
1b30: 3e 66 6c 61 67 73 20 3d 20 53 42 53 56 41 4c 5f  >flags = SBSVAL_
1b40: 53 54 52 3b 0a 20 20 20 20 70 2d 3e 75 2e 73 74  STR;.    p->u.st
1b50: 72 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20 70 2d  r.z = "";.    p-
1b60: 3e 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20 30 3b  >u.str.size = 0;
1b70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1b80: 6d 70 75 74 65 20 61 20 68 61 73 68 20 6f 6e 20  mpute a hash on 
1b90: 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  a string..*/.sta
1ba0: 74 69 63 20 69 6e 74 20 73 62 73 5f 68 61 73 68  tic int sbs_hash
1bb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1bc0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20  int n){.  int h 
1bd0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
1be0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
1bf0: 2b 29 7b 0a 20 20 20 20 68 20 5e 3d 20 28 68 3c  +){.    h ^= (h<
1c00: 3c 31 29 20 7c 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  <1) | z[i];.  }.
1c10: 20 20 68 20 26 3d 20 30 78 37 66 66 66 66 66 66    h &= 0x7ffffff
1c20: 3b 0a 20 20 72 65 74 75 72 6e 20 68 20 25 20 53  ;.  return h % S
1c30: 42 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 3b 0a  BSCONFIG_NHASH;.
1c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70  }../*.** Look up
1c50: 20 61 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20   a value in the 
1c60: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 52 65 74  hash table.  Ret
1c70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1c80: 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 52   the value..** R
1c90: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1ca0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
1cb0: 69 63 20 63 6f 6e 73 74 20 53 62 53 56 61 6c 75  ic const SbSValu
1cc0: 65 20 2a 73 62 73 5f 66 65 74 63 68 28 0a 20 20  e *sbs_fetch(.  
1cd0: 53 62 73 48 61 73 68 54 61 62 20 2a 70 48 61 73  SbsHashTab *pHas
1ce0: 68 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  h, .  const char
1cf0: 20 2a 7a 4b 65 79 2c 20 0a 20 20 69 6e 74 20 6e   *zKey, .  int n
1d00: 4b 65 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a  Key.){.  int h;.
1d10: 20 20 53 62 73 48 61 73 68 45 6e 74 72 79 20 2a    SbsHashEntry *
1d20: 70 3b 0a 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30  p;..  if( nKey<0
1d30: 20 29 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e   ) nKey = strlen
1d40: 28 7a 4b 65 79 29 3b 0a 20 20 68 20 3d 20 73 62  (zKey);.  h = sb
1d50: 73 5f 68 61 73 68 28 7a 4b 65 79 2c 20 6e 4b 65  s_hash(zKey, nKe
1d60: 79 29 3b 0a 20 20 66 6f 72 28 70 20 3d 20 70 48  y);.  for(p = pH
1d70: 61 73 68 2d 3e 61 48 61 73 68 5b 68 5d 3b 20 70  ash->aHash[h]; p
1d80: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1d90: 20 20 20 69 66 28 20 70 2d 3e 6e 4b 65 79 3d 3d     if( p->nKey==
1da0: 6e 4b 65 79 20 26 26 20 6d 65 6d 63 6d 70 28 70  nKey && memcmp(p
1db0: 2d 3e 7a 4b 65 79 2c 7a 4b 65 79 2c 6e 4b 65 79  ->zKey,zKey,nKey
1dc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1dd0: 74 75 72 6e 20 26 70 2d 3e 76 61 6c 3b 0a 20 20  turn &p->val;.  
1de0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1df0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f   0;.}../*.** Sto
1e00: 72 65 20 61 20 76 61 6c 75 65 20 69 6e 20 74 68  re a value in th
1e10: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4f  e hash table.  O
1e20: 76 65 72 77 72 69 74 65 20 61 6e 79 20 70 72 69  verwrite any pri
1e30: 6f 72 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a  or value stored.
1e40: 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 73 61 6d  ** under the sam
1e50: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
1e60: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
1e70: 65 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6e  e 4th argument n
1e80: 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 65 74  eeds to be reset
1e90: 20 6f 72 20 66 72 65 65 64 2c 0a 2a 2a 20 74 68   or freed,.** th
1ea0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 77 69 6c  e hash table wil
1eb0: 6c 20 74 61 6b 65 20 6f 76 65 72 20 72 65 73 70  l take over resp
1ec0: 6f 6e 73 69 62 69 6c 69 69 74 79 20 66 6f 72 20  onsibiliity for 
1ed0: 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2f 0a 73 74 61  doing so..*/.sta
1ee0: 74 69 63 20 69 6e 74 20 73 62 73 5f 73 74 6f 72  tic int sbs_stor
1ef0: 65 28 0a 20 20 53 62 73 48 61 73 68 54 61 62 20  e(.  SbsHashTab 
1f00: 2a 70 48 61 73 68 2c 20 20 20 20 20 20 20 2f 2a  *pHash,       /*
1f10: 20 49 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 69   Insert into thi
1f20: 73 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  s hash table */.
1f30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
1f40: 65 79 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ey,        /* Th
1f50: 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  e key */.  int n
1f60: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1f70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1f80: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
1f90: 74 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61 6c  t SbSValue *pVal
1fa0: 75 65 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ue   /* The valu
1fb0: 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 2a  e to be stored *
1fc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  /.){.  int h;.  
1fd0: 53 62 73 48 61 73 68 45 6e 74 72 79 20 2a 70 2c  SbsHashEntry *p,
1fe0: 20 2a 70 4e 65 77 3b 0a 0a 20 20 69 66 28 20 6e   *pNew;..  if( n
1ff0: 4b 65 79 3c 30 20 29 20 6e 4b 65 79 20 3d 20 73  Key<0 ) nKey = s
2000: 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 68  trlen(zKey);.  h
2010: 20 3d 20 73 62 73 5f 68 61 73 68 28 7a 4b 65 79   = sbs_hash(zKey
2020: 2c 20 6e 4b 65 79 29 3b 0a 20 20 66 6f 72 28 70  , nKey);.  for(p
2030: 20 3d 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b   = pHash->aHash[
2040: 68 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  h]; p; p=p->pNex
2050: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  t){.    if( p->n
2060: 4b 65 79 3d 3d 6e 4b 65 79 20 26 26 20 6d 65 6d  Key==nKey && mem
2070: 63 6d 70 28 70 2d 3e 7a 4b 65 79 2c 7a 4b 65 79  cmp(p->zKey,zKey
2080: 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ,nKey)==0 ){.   
2090: 20 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73     sbs_value_res
20a0: 65 74 28 26 70 2d 3e 76 61 6c 29 3b 0a 20 20 20  et(&p->val);.   
20b0: 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 76 61     memcpy(&p->va
20c0: 6c 2c 20 70 56 61 6c 75 65 2c 20 73 69 7a 65 6f  l, pValue, sizeo
20d0: 66 28 70 2d 3e 76 61 6c 29 29 3b 0a 20 20 20 20  f(p->val));.    
20e0: 20 20 72 65 74 75 72 6e 20 53 42 53 5f 4f 4b 3b    return SBS_OK;
20f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
2100: 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  w = malloc( size
2110: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 4b 65 79  of(*pNew) + nKey
2120: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29   );.  if( pNew )
2130: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4b 65 79  {.    pNew->nKey
2140: 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6d 65 6d   = nKey;.    mem
2150: 63 70 79 28 70 4e 65 77 2d 3e 7a 4b 65 79 2c 20  cpy(pNew->zKey, 
2160: 7a 4b 65 79 2c 20 6e 4b 65 79 2b 31 29 3b 0a 20  zKey, nKey+1);. 
2170: 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
2180: 3e 76 61 6c 2c 20 70 56 61 6c 75 65 2c 20 73 69  >val, pValue, si
2190: 7a 65 6f 66 28 70 4e 65 77 2d 3e 76 61 6c 29 29  zeof(pNew->val))
21a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ;.    pNew->pNex
21b0: 74 20 3d 20 70 48 61 73 68 2d 3e 61 48 61 73 68  t = pHash->aHash
21c0: 5b 68 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e  [h];.    pHash->
21d0: 61 48 61 73 68 5b 68 5d 20 3d 20 70 4e 65 77 3b  aHash[h] = pNew;
21e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f  .    return SBS_
21f0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2200: 20 53 42 53 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   SBS_ERROR;.}../
2210: 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 68 61 73  *.** Reset a has
2220: 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  h table..*/.stat
2230: 69 63 20 76 6f 69 64 20 73 62 73 5f 68 61 73 68  ic void sbs_hash
2240: 5f 72 65 73 65 74 28 53 62 73 48 61 73 68 54 61  _reset(SbsHashTa
2250: 62 20 2a 70 48 61 73 68 29 7b 0a 20 20 69 6e 74  b *pHash){.  int
2260: 20 69 3b 0a 20 20 53 62 73 48 61 73 68 45 6e 74   i;.  SbsHashEnt
2270: 72 79 20 2a 70 2c 20 2a 70 4e 65 78 74 3b 0a 20  ry *p, *pNext;. 
2280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 42 53 43   for(i=0; i<SBSC
2290: 4f 4e 46 49 47 5f 4e 48 41 53 48 3b 20 69 2b 2b  ONFIG_NHASH; i++
22a0: 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 48 61  ){.    for(p=pHa
22b0: 73 68 2d 3e 61 48 61 73 68 5b 69 5d 3b 20 70 3b  sh->aHash[i]; p;
22c0: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20   p=pNext){.     
22d0: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
22e0: 74 3b 0a 20 20 20 20 20 20 73 62 73 5f 76 61 6c  t;.      sbs_val
22f0: 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 76 61 6c  ue_reset(&p->val
2300: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 70 29  );.      free(p)
2310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65  ;.    }.  }.  me
2320: 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20 73  mset(pHash, 0, s
2330: 69 7a 65 6f 66 28 2a 70 48 61 73 68 29 29 3b 0a  izeof(*pHash));.
2340: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20  }../*.** Push a 
2350: 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73  value onto the s
2360: 74 61 63 6b 20 6f 66 20 61 6e 20 69 6e 74 65 72  tack of an inter
2370: 70 72 65 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63  preter.*/.static
2380: 20 69 6e 74 20 73 62 73 5f 70 75 73 68 28 53 75   int sbs_push(Su
2390: 62 73 63 72 69 70 74 20 2a 70 2c 20 53 62 53 56  bscript *p, SbSV
23a0: 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69  alue *pVal){.  i
23b0: 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 53 42  f( p->nStack>=SB
23c0: 53 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20 29  SCONFIG_NSTACK )
23d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
23e0: 70 72 69 6e 74 66 28 53 42 53 43 4f 4e 46 49 47  printf(SBSCONFIG
23f0: 5f 45 52 52 53 49 5a 45 2c 20 70 2d 3e 7a 45 72  _ERRSIZE, p->zEr
2400: 72 4d 73 67 2c 20 22 73 74 61 63 6b 20 6f 76 65  rMsg, "stack ove
2410: 72 66 6c 6f 77 22 29 3b 0a 20 20 20 20 72 65 74  rflow");.    ret
2420: 75 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20  urn SBS_ERROR;. 
2430: 20 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70   }.  p->aStack[p
2440: 2d 3e 6e 53 74 61 63 6b 2b 2b 5d 20 3d 20 2a 70  ->nStack++] = *p
2450: 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 42  Val;.  return SB
2460: 53 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  S_OK;.}../*.** C
2470: 72 65 61 74 65 20 61 20 6e 65 77 20 73 75 62 73  reate a new subs
2480: 63 72 69 70 74 20 69 6e 74 65 72 70 72 65 74 65  cript interprete
2490: 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  r.  Return a poi
24a0: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6e  nter to the.** n
24b0: 65 77 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20  ew interpreter, 
24c0: 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  or return NULL i
24d0: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
24e0: 2a 2f 0a 73 74 72 75 63 74 20 53 75 62 73 63 72  */.struct Subscr
24f0: 69 70 74 20 2a 53 62 53 5f 43 72 65 61 74 65 28  ipt *SbS_Create(
2500: 76 6f 69 64 29 7b 0a 20 20 53 75 62 73 63 72 69  void){.  Subscri
2510: 70 74 20 2a 70 3b 0a 20 20 70 20 3d 20 6d 61 6c  pt *p;.  p = mal
2520: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
2530: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
2540: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2550: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7d 0a  izeof(*p));.  }.
2560: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2570: 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 61 6e 20  *.** Destroy an 
2580: 73 75 62 73 63 72 69 70 74 20 69 6e 74 65 72 70  subscript interp
2590: 72 65 74 65 72 0a 2a 2f 0a 76 6f 69 64 20 53 62  reter.*/.void Sb
25a0: 53 5f 44 65 73 74 72 6f 79 28 73 74 72 75 63 74  S_Destroy(struct
25b0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 29 7b 0a   Subscript *p){.
25c0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 62 73 5f 68    int i;.  sbs_h
25d0: 61 73 68 5f 72 65 73 65 74 28 26 70 2d 3e 73 79  ash_reset(&p->sy
25e0: 6d 54 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  mTab);.  for(i=0
25f0: 3b 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69  ; i<p->nStack; i
2600: 2b 2b 29 7b 0a 20 20 20 20 73 62 73 5f 76 61 6c  ++){.    sbs_val
2610: 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 61 53 74  ue_reset(&p->aSt
2620: 61 63 6b 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  ack[i]);.  }.  f
2630: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
2640: 20 53 65 74 20 74 68 65 20 65 72 72 6f 72 20 6d   Set the error m
2650: 65 73 73 61 67 65 20 66 6f 72 20 61 6e 20 69 6e  essage for an in
2660: 74 65 72 70 72 65 74 65 72 2e 20 20 56 65 72 62  terpreter.  Verb
2670: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
2680: 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 72 6f 75  .** use this rou
2690: 74 69 6e 65 20 77 68 65 6e 20 74 68 65 79 20 65  tine when they e
26a0: 6e 63 6f 75 6e 74 65 72 20 61 6e 20 65 72 72 6f  ncounter an erro
26b0: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 53 62 53 5f 53  r..*/.void SbS_S
26c0: 65 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73  etErrorMessage(s
26d0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
26e0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
26f0: 7a 45 72 72 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  zErr, ...){.  in
2700: 74 20 6e 45 72 72 3b 0a 20 20 63 68 61 72 20 2a  t nErr;.  char *
2710: 7a 4d 73 67 3b 0a 20 20 76 61 5f 6c 69 73 74 20  zMsg;.  va_list 
2720: 61 70 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28  ap;..  va_start(
2730: 61 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7a 4d 73  ap, zErr);.  zMs
2740: 67 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 45 72  g = vmprintf(zEr
2750: 72 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  r, ap);.  va_end
2760: 28 61 70 29 3b 0a 20 20 6e 45 72 72 20 3d 20 73  (ap);.  nErr = s
2770: 74 72 6c 65 6e 28 7a 4d 73 67 29 3b 0a 20 20 69  trlen(zMsg);.  i
2780: 66 28 20 6e 45 72 72 3e 73 69 7a 65 6f 66 28 70  f( nErr>sizeof(p
2790: 2d 3e 7a 45 72 72 4d 73 67 29 2d 31 20 29 7b 0a  ->zErrMsg)-1 ){.
27a0: 20 20 20 20 6e 45 72 72 20 3d 20 73 69 7a 65 6f      nErr = sizeo
27b0: 66 28 70 2d 3e 7a 45 72 72 4d 73 67 29 2d 31 3b  f(p->zErrMsg)-1;
27c0: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d  .  }.  memcpy(p-
27d0: 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 2c 20  >zErrMsg, zMsg, 
27e0: 6e 45 72 72 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  nErr);.  p->zErr
27f0: 4d 73 67 5b 6e 45 72 72 5d 20 3d 20 30 3b 0a 20  Msg[nErr] = 0;. 
2800: 20 66 72 65 65 28 7a 4d 73 67 29 3b 0a 7d 0a 0a   free(zMsg);.}..
2810: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2820: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 75  ointer to the cu
2830: 72 72 65 6e 74 20 65 72 72 6f 72 20 6d 65 73 73  rrent error mess
2840: 61 67 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  age for the.** i
2850: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 63  nterpreter..*/.c
2860: 6f 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 47  onst char *SbS_G
2870: 65 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73  etErrorMessage(s
2880: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
2890: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
28a0: 3e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a  >zErrMsg;.}../*.
28b0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 76 65 72  ** Add a new ver
28c0: 62 20 74 68 65 20 67 69 76 65 6e 20 69 6e 74 65  b the given inte
28d0: 72 70 72 65 74 65 72 0a 2a 2f 0a 69 6e 74 20 53  rpreter.*/.int S
28e0: 62 53 5f 41 64 64 56 65 72 62 28 0a 20 20 73 74  bS_AddVerb(.  st
28f0: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a  ruct Subscript *
2900: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
2910: 2a 7a 56 65 72 62 2c 0a 20 20 69 6e 74 20 28 2a  *zVerb,.  int (*
2920: 78 56 65 72 62 29 28 73 74 72 75 63 74 20 53 75  xVerb)(struct Su
2930: 62 73 63 72 69 70 74 2a 2c 76 6f 69 64 2a 29 2c  bscript*,void*),
2940: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
2950: 0a 20 20 53 62 53 56 61 6c 75 65 20 76 3b 0a 20  .  SbSValue v;. 
2960: 20 76 2e 66 6c 61 67 73 20 3d 20 53 42 53 56 41   v.flags = SBSVA
2970: 4c 5f 56 45 52 42 3b 0a 20 20 76 2e 75 2e 76 65  L_VERB;.  v.u.ve
2980: 72 62 2e 78 56 65 72 62 20 3d 20 78 56 65 72 62  rb.xVerb = xVerb
2990: 3b 0a 20 20 76 2e 75 2e 76 65 72 62 2e 70 41 72  ;.  v.u.verb.pAr
29a0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75  g = pArg;.  retu
29b0: 72 6e 20 73 62 73 5f 73 74 6f 72 65 28 26 70 2d  rn sbs_store(&p-
29c0: 3e 73 79 6d 54 61 62 2c 20 7a 56 65 72 62 2c 20  >symTab, zVerb, 
29d0: 2d 31 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  -1, &v);.}../*.*
29e0: 2a 20 53 74 6f 72 65 20 61 20 76 61 6c 75 65 20  * Store a value 
29f0: 69 6e 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65  in an interprete
2a00: 72 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69  r variable..*/.i
2a10: 6e 74 20 53 62 53 5f 53 74 6f 72 65 28 0a 20 20  nt SbS_Store(.  
2a20: 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74  struct Subscript
2a30: 20 2a 70 2c 20 20 20 2f 2a 20 53 74 6f 72 65 20   *p,   /* Store 
2a40: 69 6e 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70  into this interp
2a50: 72 65 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  reter */.  const
2a60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
2a70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2a80: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 63   variable */.  c
2a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75  onst char *zValu
2aa0: 65 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f  e,    /* Value o
2ab0: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 2a  f the variable *
2ac0: 2f 0a 20 20 69 6e 74 20 70 65 72 73 69 73 74 65  /.  int persiste
2ad0: 6e 63 65 20 20 20 20 20 20 20 20 2f 2a 20 30 3a  nce        /* 0:
2ae0: 20 73 74 61 74 69 63 2e 20 20 31 3a 20 65 70 68   static.  1: eph
2af0: 65 6d 65 72 61 6c 2e 20 20 32 3a 20 64 79 6e 61  emeral.  2: dyna
2b00: 6d 69 63 20 2a 2f 0a 29 7b 0a 20 20 53 62 53 56  mic */.){.  SbSV
2b10: 61 6c 75 65 20 76 3b 0a 20 20 76 2e 66 6c 61 67  alue v;.  v.flag
2b20: 73 20 3d 20 53 42 53 56 41 4c 5f 53 54 52 3b 0a  s = SBSVAL_STR;.
2b30: 20 20 76 2e 75 2e 73 74 72 2e 73 69 7a 65 20 3d    v.u.str.size =
2b40: 20 73 74 72 6c 65 6e 28 7a 56 61 6c 75 65 29 3b   strlen(zValue);
2b50: 0a 20 20 69 66 28 20 70 65 72 73 69 73 74 65 6e  .  if( persisten
2b60: 63 65 3d 3d 31 20 29 7b 0a 20 20 20 20 76 2e 75  ce==1 ){.    v.u
2b70: 2e 73 74 72 2e 7a 20 3d 20 6d 70 72 69 6e 74 66  .str.z = mprintf
2b80: 28 22 25 73 22 2c 20 7a 56 61 6c 75 65 29 3b 0a  ("%s", zValue);.
2b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2e 75    }else{.    v.u
2ba0: 2e 73 74 72 2e 7a 20 3d 20 28 63 68 61 72 2a 29  .str.z = (char*)
2bb0: 7a 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 69 66  zValue;.  }.  if
2bc0: 28 20 70 65 72 73 69 73 74 65 6e 63 65 3e 30 20  ( persistence>0 
2bd0: 29 7b 0a 20 20 20 20 76 2e 66 6c 61 67 73 20 7c  ){.    v.flags |
2be0: 3d 20 53 42 53 56 41 4c 5f 44 59 4e 3b 0a 20 20  = SBSVAL_DYN;.  
2bf0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 62 73 5f 73  }.  return sbs_s
2c00: 74 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62 2c  tore(&p->symTab,
2c10: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 26 76 29 3b   zName, -1, &v);
2c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61  .}../*.** Push a
2c30: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 6e   string value on
2c40: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
2c50: 0a 2a 2a 20 49 66 20 74 68 65 20 34 74 68 20 70  .** If the 4th p
2c60: 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
2c70: 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 69  hen the string i
2c80: 73 20 73 74 61 74 69 63 2e 0a 2a 2a 20 49 66 20  s static..** If 
2c90: 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65  the 4th paramete
2ca0: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  r is non-zero th
2cb0: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 77 61  en the string wa
2cc0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
2cd0: 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 53 75  om malloc and Su
2ce0: 62 73 63 72 69 70 74 20 77 69 6c 6c 20 74 61 6b  bscript will tak
2cf0: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
2d00: 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20   for freeing.** 
2d10: 69 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  it..**.** Return
2d20: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e   0 on success an
2d30: 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  d non-zero if th
2d40: 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  ere is an error.
2d50: 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75 73 68  .*/.int SbS_Push
2d60: 28 0a 20 20 73 74 72 75 63 74 20 53 75 62 73 63  (.  struct Subsc
2d70: 72 69 70 74 20 2a 70 2c 20 20 2f 2a 20 50 75 73  ript *p,  /* Pus
2d80: 68 20 6f 6e 74 6f 20 74 68 69 73 20 69 6e 74 65  h onto this inte
2d90: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 63 68 61  rpreter */.  cha
2da0: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
2db0: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 76 61 6c     /* String val
2dc0: 75 65 20 74 6f 20 70 75 73 68 20 2a 2f 0a 20 20  ue to push */.  
2dd0: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
2de0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
2df0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 2c 20 6f  of the string, o
2e00: 72 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 64 79  r -1 */.  int dy
2e10: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
2e20: 2f 2a 20 49 66 20 74 72 75 65 2c 20 7a 20 77 61  /* If true, z wa
2e30: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2e40: 6d 61 6c 6c 6f 63 20 2a 2f 0a 29 7b 0a 20 20 53  malloc */.){.  S
2e50: 62 53 56 61 6c 75 65 20 76 3b 0a 20 20 76 2e 66  bSValue v;.  v.f
2e60: 6c 61 67 73 20 3d 20 53 42 53 56 41 4c 5f 53 54  lags = SBSVAL_ST
2e70: 52 3b 0a 20 20 69 66 28 20 64 79 6e 20 29 7b 0a  R;.  if( dyn ){.
2e80: 20 20 20 20 76 2e 66 6c 61 67 73 20 7c 3d 20 53      v.flags |= S
2e90: 42 53 56 41 4c 5f 44 59 4e 3b 0a 20 20 7d 0a 20  BSVAL_DYN;.  }. 
2ea0: 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 73   if( n<0 ) n = s
2eb0: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 76 2e 75 2e  trlen(z);.  v.u.
2ec0: 73 74 72 2e 73 69 7a 65 20 3d 20 6e 3b 0a 20 20  str.size = n;.  
2ed0: 76 2e 75 2e 73 74 72 2e 7a 20 3d 20 7a 3b 0a 20  v.u.str.z = z;. 
2ee0: 20 72 65 74 75 72 6e 20 73 62 73 5f 70 75 73 68   return sbs_push
2ef0: 28 70 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (p, &v);.}../*.*
2f00: 2a 20 50 75 73 68 20 61 6e 20 69 6e 74 65 67 65  * Push an intege
2f10: 72 20 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65  r value onto the
2f20: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
2f30: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 6c 6c  is routine reall
2f40: 79 20 6a 75 73 74 20 63 6f 6e 76 65 72 74 73 20  y just converts 
2f50: 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  the integer into
2f60: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 65   a string.** the
2f70: 6e 20 63 61 6c 6c 73 20 53 62 53 5f 50 75 73 68  n calls SbS_Push
2f80: 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75 73  ..*/.int SbS_Pus
2f90: 68 49 6e 74 28 73 74 72 75 63 74 20 53 75 62 73  hInt(struct Subs
2fa0: 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 69 56  cript *p, int iV
2fb0: 61 6c 29 7b 0a 20 20 69 66 28 20 69 56 61 6c 3d  al){.  if( iVal=
2fc0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2fd0: 20 53 62 53 5f 50 75 73 68 28 70 2c 20 22 30 22   SbS_Push(p, "0"
2fe0: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 1, 0);.  }else
2ff0: 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a   if( iVal==1 ){.
3000: 20 20 20 20 72 65 74 75 72 6e 20 53 62 53 5f 50      return SbS_P
3010: 75 73 68 28 70 2c 20 22 31 22 2c 20 31 2c 20 30  ush(p, "1", 1, 0
3020: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3030: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74  char *z;.    int
3040: 20 6e 3b 0a 20 20 20 20 63 68 61 72 20 7a 56 61   n;.    char zVa
3050: 6c 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  l[50];.    sprin
3060: 74 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20 69  tf(zVal, "%d", i
3070: 56 61 6c 29 3b 0a 20 20 20 20 6e 20 3d 20 73 74  Val);.    n = st
3080: 72 6c 65 6e 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rlen(zVal);.    
3090: 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20  z = malloc( n+1 
30a0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  );.    if( z ){.
30b0: 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 2c 20        strcpy(z, 
30c0: 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  zVal);.      ret
30d0: 75 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c 20  urn SbS_Push(p, 
30e0: 7a 2c 20 6e 2c 20 31 29 3b 0a 20 20 20 20 7d 65  z, n, 1);.    }e
30f0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
3100: 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20  n SBS_ERROR;.   
3110: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
3120: 50 6f 70 20 61 6e 64 20 64 65 73 74 72 6f 79 20  Pop and destroy 
3130: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c  zero or more val
3140: 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ues from the sta
3150: 63 6b 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ck..** Return th
3160: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75  e number of valu
3170: 65 73 20 72 65 6d 61 69 6e 69 6e 67 20 6f 6e 20  es remaining on 
3180: 74 68 65 20 73 74 61 63 6b 20 61 66 74 65 72 0a  the stack after.
3190: 2a 2a 20 74 68 65 20 70 6f 70 73 20 6f 63 63 75  ** the pops occu
31a0: 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 6f  r..*/.int SbS_Po
31b0: 70 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69  p(struct Subscri
31c0: 70 74 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  pt *p, int N){. 
31d0: 20 77 68 69 6c 65 28 20 4e 3e 30 20 26 26 20 70   while( N>0 && p
31e0: 2d 3e 6e 53 74 61 63 6b 3e 30 20 29 7b 0a 20 20  ->nStack>0 ){.  
31f0: 20 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b 0a 20    p->nStack--;. 
3200: 20 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73     sbs_value_res
3210: 65 74 28 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d  et(&p->aStack[p-
3220: 3e 6e 53 74 61 63 6b 5d 29 3b 0a 20 20 20 20 4e  >nStack]);.    N
3230: 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  --;.  }.  return
3240: 20 70 2d 3e 6e 53 74 61 63 6b 3b 0a 7d 0a 0a 2f   p->nStack;.}../
3250: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3260: 4e 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  N-th element of 
3270: 74 68 65 20 73 74 61 63 6b 2e 20 20 30 20 69 73  the stack.  0 is
3280: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
3290: 73 74 61 63 6b 2e 0a 2a 2a 20 31 20 69 73 20 74  stack..** 1 is t
32a0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
32b0: 20 64 6f 77 6e 2e 20 20 32 20 69 73 20 74 68 65   down.  2 is the
32c0: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 2e   second element.
32d0: 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a    And so forth..
32e0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
32f0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e 2d  f there is no N-
3300: 74 68 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a  th element..**.*
3310: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
3320: 74 75 72 6e 65 64 20 69 73 20 6f 6e 6c 79 20 76  turned is only v
3330: 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 76  alid until the v
3340: 61 6c 75 65 20 69 73 20 70 6f 70 70 65 64 0a 2a  alue is popped.*
3350: 2a 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  * from the stack
3360: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
3370: 2a 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28  *SbS_StackValue(
3380: 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74  struct Subscript
3390: 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20   *p, int N, int 
33a0: 2a 70 53 69 7a 65 29 7b 0a 20 20 53 62 53 56 61  *pSize){.  SbSVa
33b0: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 66 28  lue *pVal;.  if(
33c0: 20 4e 3c 30 20 7c 7c 20 4e 3e 3d 70 2d 3e 6e 53   N<0 || N>=p->nS
33d0: 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  tack ){.    retu
33e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 56 61 6c  rn 0;.  }.  pVal
33f0: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d   = &p->aStack[p-
3400: 3e 6e 53 74 61 63 6b 2d 4e 2d 31 5d 3b 0a 20 20  >nStack-N-1];.  
3410: 69 66 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73  if( (pVal->flags
3420: 20 26 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d   & SBSVAL_STR)==
3430: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3440: 30 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  0;.  }.  *pSize 
3450: 3d 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69  = pVal->u.str.si
3460: 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 61  ze;.  return pVa
3470: 6c 2d 3e 75 2e 73 74 72 2e 7a 3b 0a 7d 0a 0a 2f  l->u.str.z;.}../
3480: 2a 0a 2a 2a 20 41 20 63 6f 6e 76 65 6e 69 65 6e  *.** A convenien
3490: 63 65 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65  ce routine for e
34a0: 78 74 72 61 63 74 69 6e 67 20 61 6e 20 69 6e 74  xtracting an int
34b0: 65 67 65 72 20 76 61 6c 75 65 20 66 72 6f 6d 20  eger value from 
34c0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f  the.** stack..*/
34d0: 0a 69 6e 74 20 53 62 53 5f 53 74 61 63 6b 56 61  .int SbS_StackVa
34e0: 6c 75 65 49 6e 74 28 73 74 72 75 63 74 20 53 75  lueInt(struct Su
34f0: 62 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 20  bscript *p, int 
3500: 4e 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 76 3b 0a  N){.  int n, v;.
3510: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
3520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3530: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75   = SbS_StackValu
3540: 65 28 70 2c 20 4e 2c 20 26 6e 29 3b 0a 20 20 76  e(p, N, &n);.  v
3550: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 30   = 0;.  if( n==0
3560: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
3570: 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
3580: 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20      isNeg = 1;. 
3590: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b     z++;.    n--;
35a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30  .  }else if( z[0
35b0: 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 2b  ]=='+' ){.    z+
35c0: 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  +;.    n--;.  }.
35d0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
35e0: 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b  isdigit(z[0]) ){
35f0: 0a 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20  .    v = v*10 + 
3600: 7a 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  z[0] - '0';.    
3610: 7a 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  z++;.    n--;.  
3620: 7d 0a 20 20 69 66 28 20 69 73 4e 65 67 20 29 7b  }.  if( isNeg ){
3630: 0a 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20 7d  .    v = -v;.  }
3640: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
3650: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 74  /*.** Retrieve t
3660: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 76 61  he value of a va
3670: 72 69 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  riable from the 
3680: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 52 65  interpreter.  Re
3690: 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20  turn.** NULL if 
36a0: 6e 6f 20 73 75 63 68 20 76 61 72 69 61 62 6c 65  no such variable
36b0: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 0a 2a   is defined.  .*
36c0: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
36d0: 64 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20  d string is not 
36e0: 6e 65 63 65 73 73 61 72 69 6c 79 20 28 70 72 6f  necessarily (pro
36f0: 62 61 62 6c 79 20 6e 6f 74 29 20 7a 65 72 6f 2d  bably not) zero-
3700: 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 54  terminated..** T
3710: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
3720: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
3730: 20 6e 65 78 74 20 74 69 6d 65 20 61 6e 79 74 68   next time anyth
3740: 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 0a 2a  ing is done to.*
3750: 2a 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  * the interprete
3760: 72 2e 20 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  r.  Make a copy 
3770: 69 66 20 79 6f 75 20 6e 65 65 64 20 69 74 20 74  if you need it t
3780: 6f 20 70 65 72 73 69 73 74 2e 0a 2a 2f 0a 63 6f  o persist..*/.co
3790: 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 46 65  nst char *SbS_Fe
37a0: 74 63 68 28 0a 20 20 73 74 72 75 63 74 20 53 75  tch(.  struct Su
37b0: 62 73 63 72 69 70 74 20 2a 70 2c 20 20 20 2f 2a  bscript *p,   /*
37c0: 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   The interpreter
37d0: 20 77 65 20 61 72 65 20 69 6e 74 65 72 72 6f 67   we are interrog
37e0: 61 74 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  ating */.  const
37f0: 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20   char *zKey,    
3800: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3810: 68 65 20 76 61 72 69 61 62 6c 65 2e 20 20 43 61  he variable.  Ca
3820: 73 65 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a  se sensitive */.
3830: 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
3850: 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 20  ngth of the key 
3860: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4c 65 6e 67 74  */.  int *pLengt
3870: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h             /*
3880: 20 57 72 69 74 65 20 74 68 65 20 6c 65 6e 67 74   Write the lengt
3890: 68 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  h here */.){.  c
38a0: 6f 6e 73 74 20 53 62 53 56 61 6c 75 65 20 2a 70  onst SbSValue *p
38b0: 56 61 6c 3b 0a 0a 20 20 70 56 61 6c 20 3d 20 73  Val;..  pVal = s
38c0: 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d  bs_fetch(&p->sym
38d0: 54 61 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  Tab, zKey, nKey)
38e0: 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20  ;.  if( pVal==0 
38f0: 7c 7c 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20  || (pVal->flags 
3900: 26 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d 30  & SBSVAL_STR)==0
3910: 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 67 74 68   ){.    *pLength
3920: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
3930: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
3940: 20 2a 70 4c 65 6e 67 74 68 20 3d 20 70 56 61 6c   *pLength = pVal
3950: 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20  ->u.str.size;.  
3960: 20 20 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 75    return pVal->u
3970: 2e 73 74 72 2e 7a 3b 0a 20 20 7d 0a 7d 0a 0a 2f  .str.z;.  }.}../
3980: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
3990: 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
39a0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
39b0: 65 20 73 74 61 63 6b 20 68 61 73 0a 2a 2a 20 66  e stack has.** f
39c0: 65 77 65 72 20 74 68 61 6e 20 4e 20 65 6c 65 6d  ewer than N elem
39d0: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ents.  This is u
39e0: 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75  tility routine u
39f0: 73 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6d  sed in.** the im
3a00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3a10: 76 65 72 62 73 2e 0a 2a 2f 0a 69 6e 74 20 53 62  verbs..*/.int Sb
3a20: 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 73  S_RequireStack(s
3a30: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
3a40: 2a 70 2c 20 69 6e 74 20 4e 2c 20 63 6f 6e 73 74  *p, int N, const
3a50: 20 63 68 61 72 20 2a 7a 43 6d 64 29 7b 0a 20 20   char *zCmd){.  
3a60: 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 4e  if( p->nStack>=N
3a70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
3a80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3a90: 73 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 72 4d 73  sizeof(p->zErrMs
3aa0: 67 29 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 0a  g), p->zErrMsg,.
3ab0: 20 20 20 20 20 22 5c 22 25 73 5c 22 20 72 65 71       "\"%s\" req
3ac0: 75 69 72 65 73 20 61 74 20 6c 65 61 73 74 20 25  uires at least %
3ad0: 64 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 73  d stack elements
3ae0: 20 2d 20 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 64   - only found %d
3af0: 22 2c 0a 20 20 20 20 20 7a 43 6d 64 2c 20 4e 2c  ",.     zCmd, N,
3b00: 20 70 2d 3e 6e 53 74 61 63 6b 29 3b 0a 20 20 72   p->nStack);.  r
3b10: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
3b20: 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d  * Subscript comm
3b30: 61 6e 64 3a 20 20 20 20 20 20 20 53 54 52 49 4e  and:       STRIN
3b40: 47 20 4e 41 4d 45 20 73 65 74 0a 2a 2a 0a 2a 2a  G NAME set.**.**
3b50: 20 57 72 69 74 65 20 74 68 65 20 76 61 6c 75 65   Write the value
3b60: 20 6f 66 20 53 54 52 49 4e 47 20 69 6e 74 6f 20   of STRING into 
3b70: 76 61 72 69 61 62 6c 65 20 63 61 6c 6c 65 64 20  variable called 
3b80: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME..*/.static 
3b90: 69 6e 74 20 73 65 74 43 6d 64 28 53 75 62 73 63  int setCmd(Subsc
3ba0: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
3bb0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 53 62 53 56  NotUsed){.  SbSV
3bc0: 61 6c 75 65 20 2a 70 54 6f 73 3b 0a 20 20 53 62  alue *pTos;.  Sb
3bd0: 53 56 61 6c 75 65 20 2a 70 4e 6f 73 3b 0a 20 20  SValue *pNos;.  
3be0: 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53  if( SbS_RequireS
3bf0: 74 61 63 6b 28 70 2c 20 32 2c 20 22 73 65 74 22  tack(p, 2, "set"
3c00: 29 20 29 20 72 65 74 75 72 6e 20 53 42 53 5f 45  ) ) return SBS_E
3c10: 52 52 4f 52 3b 0a 20 20 70 54 6f 73 20 3d 20 26  RROR;.  pTos = &
3c20: 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e 6e  p->aStack[--p->n
3c30: 53 74 61 63 6b 5d 3b 0a 20 20 70 4e 6f 73 20 3d  Stack];.  pNos =
3c40: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d   &p->aStack[--p-
3c50: 3e 6e 53 74 61 63 6b 5d 3b 0a 20 20 73 62 73 5f  >nStack];.  sbs_
3c60: 73 74 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62  store(&p->symTab
3c70: 2c 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 7a 2c  , pTos->u.str.z,
3c80: 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 73 69 7a   pTos->u.str.siz
3c90: 65 2c 20 70 4e 6f 73 29 3b 0a 20 20 73 62 73 5f  e, pNos);.  sbs_
3ca0: 76 61 6c 75 65 5f 72 65 73 65 74 28 70 54 6f 73  value_reset(pTos
3cb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
3cc0: 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70  ../*.** Subscrip
3cd0: 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20  t command:      
3ce0: 49 4e 54 45 47 45 52 20 6e 6f 74 20 49 4e 54 45  INTEGER not INTE
3cf0: 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  GER.*/.static in
3d00: 74 20 6e 6f 74 43 6d 64 28 73 74 72 75 63 74 20  t notCmd(struct 
3d10: 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f  Subscript *p, vo
3d20: 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20  id *pNotUsed){. 
3d30: 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 53 62   int n;.  if( Sb
3d40: 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70  S_RequireStack(p
3d50: 2c 20 31 2c 20 22 6e 6f 74 22 29 20 29 20 72 65  , 1, "not") ) re
3d60: 74 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20 53 62  turn 1;.  n = Sb
3d70: 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 28  S_StackValueInt(
3d80: 70 2c 20 30 29 3b 0a 20 20 53 62 53 5f 50 6f 70  p, 0);.  SbS_Pop
3d90: 28 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f 50 75  (p, 1);.  SbS_Pu
3da0: 73 68 49 6e 74 28 70 2c 20 21 6e 29 3b 0a 20 20  shInt(p, !n);.  
3db0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 64 65  return 0;.}..#de
3dc0: 66 69 6e 65 20 53 42 53 4f 50 5f 41 44 44 20 20  fine SBSOP_ADD  
3dd0: 20 31 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50   1.#define SBSOP
3de0: 5f 53 55 42 20 20 20 32 0a 23 64 65 66 69 6e 65  _SUB   2.#define
3df0: 20 53 42 53 4f 50 5f 4d 55 4c 20 20 20 33 0a 23   SBSOP_MUL   3.#
3e00: 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 44 49 56  define SBSOP_DIV
3e10: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 53 42 53     4.#define SBS
3e20: 4f 50 5f 41 4e 44 20 20 20 35 0a 23 64 65 66 69  OP_AND   5.#defi
3e30: 6e 65 20 53 42 53 4f 50 5f 4f 52 20 20 20 20 36  ne SBSOP_OR    6
3e40: 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 4d  .#define SBSOP_M
3e50: 49 4e 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53  IN   7.#define S
3e60: 42 53 4f 50 5f 4d 41 58 20 20 20 38 0a 23 64 65  BSOP_MAX   8.#de
3e70: 66 69 6e 65 20 53 42 53 4f 50 5f 45 51 20 20 20  fine SBSOP_EQ   
3e80: 20 39 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50   9.#define SBSOP
3e90: 5f 4e 45 20 20 20 31 30 0a 23 64 65 66 69 6e 65  _NE   10.#define
3ea0: 20 53 42 53 4f 50 5f 4c 54 20 20 20 31 31 0a 23   SBSOP_LT   11.#
3eb0: 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 47 54 20  define SBSOP_GT 
3ec0: 20 20 31 32 0a 23 64 65 66 69 6e 65 20 53 42 53    12.#define SBS
3ed0: 4f 50 5f 4c 45 20 20 20 31 33 0a 23 64 65 66 69  OP_LE   13.#defi
3ee0: 6e 65 20 53 42 53 4f 50 5f 47 45 20 20 20 31 34  ne SBSOP_GE   14
3ef0: 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70  ../*.** Subscrip
3f00: 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20  t command:      
3f10: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
3f20: 3c 62 69 6e 61 72 79 2d 6f 70 3e 20 49 4e 54 45  <binary-op> INTE
3f30: 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  GER.*/.static in
3f40: 74 20 62 6f 70 43 6d 64 28 73 74 72 75 63 74 20  t bopCmd(struct 
3f50: 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f  Subscript *p, vo
3f60: 69 64 20 2a 70 4f 70 29 7b 0a 20 20 69 6e 74 20  id *pOp){.  int 
3f70: 61 2c 20 62 2c 20 63 3b 0a 20 20 69 66 28 20 53  a, b, c;.  if( S
3f80: 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28  bS_RequireStack(
3f90: 70 2c 20 32 2c 20 22 42 49 4e 41 52 59 2d 4f 50  p, 2, "BINARY-OP
3fa0: 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ") ) return 1;. 
3fb0: 20 61 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61   a = SbS_StackVa
3fc0: 6c 75 65 49 6e 74 28 70 2c 20 31 29 3b 0a 20 20  lueInt(p, 1);.  
3fd0: 62 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c  b = SbS_StackVal
3fe0: 75 65 49 6e 74 28 70 2c 20 30 29 3b 0a 20 20 73  ueInt(p, 0);.  s
3ff0: 77 69 74 63 68 28 20 28 69 6e 74 29 70 4f 70 20  witch( (int)pOp 
4000: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  ){.    case SBSO
4010: 50 5f 45 51 3a 20 20 20 63 20 3d 20 61 3d 3d 62  P_EQ:   c = a==b
4020: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
4030: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4040: 50 5f 4e 45 3a 20 20 20 63 20 3d 20 61 21 3d 62  P_NE:   c = a!=b
4050: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
4060: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4070: 50 5f 4c 54 3a 20 20 20 63 20 3d 20 61 3c 62 3b  P_LT:   c = a<b;
4080: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4090: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
40a0: 50 5f 4c 45 3a 20 20 20 63 20 3d 20 61 3c 3d 62  P_LE:   c = a<=b
40b0: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
40c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
40d0: 50 5f 47 54 3a 20 20 20 63 20 3d 20 61 3e 62 3b  P_GT:   c = a>b;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
40f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4100: 50 5f 47 45 3a 20 20 20 63 20 3d 20 61 3e 3d 62  P_GE:   c = a>=b
4110: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
4120: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4130: 50 5f 41 44 44 3a 20 20 63 20 3d 20 61 2b 62 3b  P_ADD:  c = a+b;
4140: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4150: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4160: 50 5f 53 55 42 3a 20 20 63 20 3d 20 61 2d 62 3b  P_SUB:  c = a-b;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4180: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4190: 50 5f 4d 55 4c 3a 20 20 63 20 3d 20 61 2a 62 3b  P_MUL:  c = a*b;
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
41b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
41c0: 50 5f 44 49 56 3a 20 20 63 20 3d 20 62 21 3d 30  P_DIV:  c = b!=0
41d0: 20 3f 20 61 2f 62 20 3a 20 30 3b 20 62 72 65 61   ? a/b : 0; brea
41e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
41f0: 50 5f 41 4e 44 3a 20 20 63 20 3d 20 61 20 26 26  P_AND:  c = a &&
4200: 20 62 3b 20 20 20 20 20 20 20 20 20 62 72 65 61   b;         brea
4210: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4220: 50 5f 4f 52 3a 20 20 20 63 20 3d 20 61 20 7c 7c  P_OR:   c = a ||
4230: 20 62 3b 20 20 20 20 20 20 20 20 20 62 72 65 61   b;         brea
4240: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4250: 50 5f 4d 49 4e 3a 20 20 63 20 3d 20 61 3c 62 20  P_MIN:  c = a<b 
4260: 3f 20 61 20 3a 20 62 3b 20 20 20 20 62 72 65 61  ? a : b;    brea
4270: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f  k;.    case SBSO
4280: 50 5f 4d 41 58 3a 20 20 63 20 3d 20 61 3c 62 20  P_MAX:  c = a<b 
4290: 3f 20 62 20 3a 20 61 3b 20 20 20 20 62 72 65 61  ? b : a;    brea
42a0: 6b 3b 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70  k;.  }.  SbS_Pop
42b0: 28 70 2c 20 32 29 3b 0a 20 20 53 62 53 5f 50 75  (p, 2);.  SbS_Pu
42c0: 73 68 49 6e 74 28 70 2c 20 63 29 3b 0a 20 20 72  shInt(p, c);.  r
42d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
42e0: 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d  * Subscript comm
42f0: 61 6e 64 3a 20 20 20 20 20 20 53 54 52 49 4e 47  and:      STRING
4300: 20 53 54 52 49 4e 47 20 73 74 72 65 71 20 49 4e   STRING streq IN
4310: 54 45 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20  TEGER.*/.static 
4320: 69 6e 74 20 73 74 72 65 71 43 6d 64 28 73 74 72  int streqCmd(str
4330: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70  uct Subscript *p
4340: 2c 20 76 6f 69 64 20 2a 70 4f 70 29 7b 0a 20 20  , void *pOp){.  
4350: 69 6e 74 20 63 2c 20 6e 41 2c 20 6e 42 3b 0a 20  int c, nA, nB;. 
4360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 41 2c 20   const char *A, 
4370: 2a 42 3b 0a 20 20 0a 20 20 69 66 28 20 53 62 53  *B;.  .  if( SbS
4380: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c  _RequireStack(p,
4390: 20 32 2c 20 22 42 49 4e 41 52 59 2d 4f 50 22 29   2, "BINARY-OP")
43a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 41   ) return 1;.  A
43b0: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75   = SbS_StackValu
43c0: 65 28 70 2c 20 31 2c 20 26 6e 41 29 3b 0a 20 20  e(p, 1, &nA);.  
43d0: 42 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c  B = SbS_StackVal
43e0: 75 65 28 70 2c 20 30 2c 20 26 6e 42 29 3b 0a 20  ue(p, 0, &nB);. 
43f0: 20 63 20 3d 20 6e 41 3d 3d 6e 42 20 26 26 20 6d   c = nA==nB && m
4400: 65 6d 63 6d 70 28 41 2c 42 2c 6e 41 29 3d 3d 30  emcmp(A,B,nA)==0
4410: 3b 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 32  ;.  SbS_Pop(p, 2
4420: 29 3b 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74  );.  SbS_PushInt
4430: 28 70 2c 20 63 29 3b 0a 20 20 72 65 74 75 72 6e  (p, c);.  return
4440: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62   0;.}../*.** Sub
4450: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20  script command: 
4460: 20 20 20 20 53 54 52 49 4e 47 20 68 61 73 63 61      STRING hasca
4470: 70 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  p INTEGER.**.** 
4480: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
4490: 68 65 20 75 73 65 72 20 68 61 73 20 61 6c 6c 20  he user has all 
44a0: 6f 66 20 74 68 65 20 63 61 70 61 62 69 6c 69 74  of the capabilit
44b0: 69 65 73 20 6c 69 73 74 65 64 2e 0a 2a 2f 0a 73  ies listed..*/.s
44c0: 74 61 74 69 63 20 69 6e 74 20 68 61 73 63 61 70  tatic int hascap
44d0: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
44e0: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
44f0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73  NotUsed){.  cons
4500: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
4510: 20 6e 2c 20 61 3b 0a 20 20 69 66 28 20 53 62 53   n, a;.  if( SbS
4520: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c  _RequireStack(p,
4530: 20 31 2c 20 22 68 61 73 63 61 70 22 29 20 29 20   1, "hascap") ) 
4540: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d 20  return 1;.  z = 
4550: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70  SbS_StackValue(p
4560: 2c 20 30 2c 20 26 6e 29 3b 0a 20 20 61 20 3d 20  , 0, &n);.  a = 
4570: 6c 6f 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69  login_has_capabi
4580: 6c 69 74 79 28 7a 2c 20 6e 29 3b 0a 20 20 53 62  lity(z, n);.  Sb
4590: 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53  S_Pop(p, 1);.  S
45a0: 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 61 29  bS_PushInt(p, a)
45b0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
45c0: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74  ./*.** Subscript
45d0: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 53 54   command:     ST
45e0: 52 49 4e 47 20 6c 69 6e 65 63 6f 75 6e 74 20 49  RING linecount I
45f0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 74  NTEGER.**.** Ret
4600: 75 72 6e 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61  urn one more tha
4610: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
4620: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  \n characters in
4630: 20 53 54 52 49 4e 47 2e 0a 2a 2f 0a 73 74 61 74   STRING..*/.stat
4640: 69 63 20 69 6e 74 20 6c 69 6e 65 63 6e 74 43 6d  ic int linecntCm
4650: 64 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69  d(struct Subscri
4660: 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f  pt *p, void *pNo
4670: 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20  tUsed){.  const 
4680: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 73  char *z;.  int s
4690: 69 7a 65 2c 20 6e 2c 20 69 3b 0a 20 20 69 66 28  ize, n, i;.  if(
46a0: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63   SbS_RequireStac
46b0: 6b 28 70 2c 20 31 2c 20 22 6c 69 6e 65 63 6f 75  k(p, 1, "linecou
46c0: 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b  nt") ) return 1;
46d0: 0a 20 20 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b  .  z = SbS_Stack
46e0: 56 61 6c 75 65 28 70 2c 20 30 2c 20 26 73 69 7a  Value(p, 0, &siz
46f0: 65 29 3b 0a 20 20 66 6f 72 28 6e 3d 31 2c 20 69  e);.  for(n=1, i
4700: 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
4710: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
4720: 27 5c 6e 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a  '\n' ) n++;.  }.
4730: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b    SbS_Pop(p, 1);
4740: 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70  .  SbS_PushInt(p
4750: 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  , n);.  return 0
4760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63  ;.}../*.** Subsc
4770: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20  ript command:   
4780: 20 20 53 54 52 49 4e 47 20 6c 65 6e 67 74 68 20    STRING length 
4790: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65  INTEGER.**.** Re
47a0: 74 75 72 6e 20 6f 6e 65 20 6d 6f 72 65 20 74 68  turn one more th
47b0: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 63 68  an the number ch
47c0: 61 72 61 63 74 65 72 73 20 69 6e 20 53 54 52 49  aracters in STRI
47d0: 4e 47 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NG..*/.static in
47e0: 74 20 6c 65 6e 67 74 68 43 6d 64 28 73 74 72 75  t lengthCmd(stru
47f0: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c  ct Subscript *p,
4800: 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 29   void *pNotUsed)
4810: 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  {.  int size;.  
4820: 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53  if( SbS_RequireS
4830: 74 61 63 6b 28 70 2c 20 31 2c 20 22 6c 65 6e 67  tack(p, 1, "leng
4840: 74 68 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b  th") ) return 1;
4850: 0a 20 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75  .  SbS_StackValu
4860: 65 28 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b 0a  e(p, 0, &size);.
4870: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b    SbS_Pop(p, 1);
4880: 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70  .  SbS_PushInt(p
4890: 2c 20 73 69 7a 65 29 3b 0a 20 20 72 65 74 75 72  , size);.  retur
48a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75  n 0;.}../*.** Su
48b0: 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a  bscript command:
48c0: 20 20 20 20 20 4e 41 4d 45 20 65 78 69 73 74 73       NAME exists
48d0: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52   INTEGER.**.** R
48e0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
48f0: 65 20 76 61 72 69 61 62 6c 65 20 4e 41 4d 45 20  e variable NAME 
4900: 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  exists..*/.stati
4910: 63 20 69 6e 74 20 65 78 69 73 74 73 43 6d 64 28  c int existsCmd(
4920: 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74  struct Subscript
4930: 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55   *p, void *pNotU
4940: 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  sed){.  const ch
4950: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 73 69 7a  ar *z;.  int siz
4960: 65 2c 20 78 3b 0a 20 20 69 66 28 20 53 62 53 5f  e, x;.  if( SbS_
4970: 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20  RequireStack(p, 
4980: 31 2c 20 22 65 78 69 73 74 73 22 29 20 29 20 72  1, "exists") ) r
4990: 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 53  eturn 1;.  z = S
49a0: 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 2c  bS_StackValue(p,
49b0: 20 30 2c 20 26 73 69 7a 65 29 3b 0a 20 20 78 20   0, &size);.  x 
49c0: 3d 20 73 62 73 5f 66 65 74 63 68 28 26 70 2d 3e  = sbs_fetch(&p->
49d0: 73 79 6d 54 61 62 2c 20 28 63 68 61 72 2a 29 7a  symTab, (char*)z
49e0: 2c 20 73 69 7a 65 29 21 3d 30 3b 0a 20 20 53 62  , size)!=0;.  Sb
49f0: 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53  S_Pop(p, 1);.  S
4a00: 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 78 29  bS_PushInt(p, x)
4a10: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4a20: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74  ./*.** Subscript
4a30: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 20   command:       
4a40: 56 41 4c 55 45 20 4e 41 4d 45 20 67 65 74 20 56  VALUE NAME get V
4a50: 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20  ALUE.**.** Push 
4a60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 76 61 72  the value of var
4a70: 69 62 6c 65 20 4e 41 4d 45 20 6f 6e 74 6f 20 74  ible NAME onto t
4a80: 68 65 20 73 74 61 63 6b 20 69 66 20 69 74 20 65  he stack if it e
4a90: 78 69 73 74 73 2e 0a 2a 2a 20 49 66 20 4e 41 4d  xists..** If NAM
4aa0: 45 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  E does not exist
4ab0: 2c 20 70 75 74 73 20 56 41 4c 55 45 20 6f 6e 74  , puts VALUE ont
4ac0: 6f 20 74 68 65 20 73 74 61 63 6b 20 69 6e 73 74  o the stack inst
4ad0: 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ead..*/.static i
4ae0: 6e 74 20 67 65 74 43 6d 64 28 53 75 62 73 63 72  nt getCmd(Subscr
4af0: 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e  ipt *p, void *pN
4b00: 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74  otUsed){.  const
4b10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
4b20: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 63 6f 6e  int nName;.  con
4b30: 73 74 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61  st SbSValue *pVa
4b40: 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  l;.  int rc = 0;
4b50: 0a 20 20 0a 20 20 69 66 28 20 53 62 53 5f 52 65  .  .  if( SbS_Re
4b60: 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20 32 2c  quireStack(p, 2,
4b70: 20 22 67 65 74 22 29 20 29 20 72 65 74 75 72 6e   "get") ) return
4b80: 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e   SBS_ERROR;.  zN
4b90: 61 6d 65 20 3d 20 53 62 53 5f 53 74 61 63 6b 56  ame = SbS_StackV
4ba0: 61 6c 75 65 28 70 2c 20 30 2c 20 26 6e 4e 61 6d  alue(p, 0, &nNam
4bb0: 65 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 62 73  e);.  pVal = sbs
4bc0: 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d 54 61  _fetch(&p->symTa
4bd0: 62 2c 20 28 63 68 61 72 2a 29 7a 4e 61 6d 65 2c  b, (char*)zName,
4be0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   nName);.  if( p
4bf0: 56 61 6c 21 3d 30 20 26 26 20 28 70 56 61 6c 2d  Val!=0 && (pVal-
4c00: 3e 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f  >flags & SBSVAL_
4c10: 53 54 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 53  STR)!=0 ){.    S
4c20: 62 53 5f 50 6f 70 28 70 2c 20 32 29 3b 0a 20 20  bS_Pop(p, 2);.  
4c30: 20 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 28    rc = SbS_Push(
4c40: 70 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a  p, pVal->u.str.z
4c50: 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69  , pVal->u.str.si
4c60: 7a 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ze, 0);.  }else{
4c70: 0a 20 20 20 20 53 62 53 5f 50 6f 70 28 70 2c 20  .    SbS_Pop(p, 
4c80: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
4c90: 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20   rc;.}..../*.** 
4ca0: 54 72 75 65 20 69 66 20 6f 75 74 70 75 74 20 69  True if output i
4cb0: 73 20 65 6e 61 62 6c 65 64 2e 20 20 46 61 6c 73  s enabled.  Fals
4cc0: 65 20 69 66 20 64 69 73 61 62 6c 65 64 2e 0a 2a  e if disabled..*
4cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e 61  /.static int ena
4ce0: 62 6c 65 4f 75 74 70 75 74 20 3d 20 31 3b 0a 0a  bleOutput = 1;..
4cf0: 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20  /*.** Subscript 
4d00: 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 42 4f  command:      BO
4d10: 4f 4c 45 41 4e 20 65 6e 61 62 6c 65 5f 6f 75 74  OLEAN enable_out
4d20: 70 75 74 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65  put.**.** Enable
4d30: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
4d40: 70 75 74 73 20 61 6e 64 20 68 70 75 74 73 20 63  puts and hputs c
4d50: 6f 6d 6d 61 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74  ommands..*/.stat
4d60: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 4f 75 74  ic int enableOut
4d70: 70 75 74 43 6d 64 28 73 74 72 75 63 74 20 53 75  putCmd(struct Su
4d80: 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 64  bscript *p, void
4d90: 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69   *pNotUsed){.  i
4da0: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74  f( SbS_RequireSt
4db0: 61 63 6b 28 70 2c 20 31 2c 20 22 65 6e 61 62 6c  ack(p, 1, "enabl
4dc0: 65 5f 6f 75 74 70 75 74 22 29 20 29 20 72 65 74  e_output") ) ret
4dd0: 75 72 6e 20 31 3b 0a 20 20 65 6e 61 62 6c 65 4f  urn 1;.  enableO
4de0: 75 74 70 75 74 20 3d 20 53 62 53 5f 53 74 61 63  utput = SbS_Stac
4df0: 6b 56 61 6c 75 65 49 6e 74 28 70 2c 20 30 29 21  kValueInt(p, 0)!
4e00: 3d 30 3b 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c  =0;.  SbS_Pop(p,
4e10: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b   1);.  return 0;
4e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 74  .}../*.** Send t
4e30: 65 78 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  ext to the appro
4e40: 70 72 69 61 74 65 20 6f 75 74 70 75 74 3a 20 20  priate output:  
4e50: 45 69 74 68 65 72 20 74 6f 20 74 68 65 20 63 6f  Either to the co
4e60: 6e 73 6f 6c 65 0a 2a 2a 20 6f 72 20 74 6f 20 74  nsole.** or to t
4e70: 68 65 20 43 47 49 20 72 65 70 6c 79 20 62 75 66  he CGI reply buf
4e80: 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  fer..*/.static v
4e90: 6f 69 64 20 73 65 6e 64 54 65 78 74 28 63 6f 6e  oid sendText(con
4ea0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
4eb0: 6e 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  n){.  if( enable
4ec0: 4f 75 74 70 75 74 20 26 26 20 6e 20 29 7b 0a 20  Output && n ){. 
4ed0: 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d     if( n<0 ) n =
4ee0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
4ef0: 69 66 28 20 67 2e 63 67 69 50 61 6e 69 63 20 29  if( g.cgiPanic )
4f00: 7b 0a 20 20 20 20 20 20 63 67 69 5f 61 70 70 65  {.      cgi_appe
4f10: 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a 2c 20 6e 29  nd_content(z, n)
4f20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4f30: 20 20 20 66 77 72 69 74 65 28 7a 2c 20 31 2c 20     fwrite(z, 1, 
4f40: 6e 2c 20 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  n, stdout);.    
4f50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
4f60: 75 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64  ubscript command
4f70: 3a 20 20 20 20 20 20 53 54 52 49 4e 47 20 70 75  :      STRING pu
4f80: 74 73 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20  ts.** Subscript 
4f90: 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 53 54  command:      ST
4fa0: 52 49 4e 47 20 68 74 6d 6c 0a 2a 2a 0a 2a 2a 20  RING html.**.** 
4fb0: 4f 75 74 70 75 74 20 53 54 52 49 4e 47 20 61 73  Output STRING as
4fc0: 20 48 54 4d 4c 20 28 68 74 6d 6c 29 20 6f 72 20   HTML (html) or 
4fd0: 75 6e 63 68 61 6e 67 65 64 20 28 70 75 74 73 29  unchanged (puts)
4fe0: 2e 20 20 0a 2a 2a 20 50 6f 70 20 69 74 20 66 72  .  .** Pop it fr
4ff0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f  om the stack..*/
5000: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 74 73  .static int puts
5010: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
5020: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
5030: 43 6f 6e 76 65 72 74 29 7b 0a 20 20 69 6e 74 20  Convert){.  int 
5040: 73 69 7a 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  size;.  const ch
5050: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a  ar *z;.  char *z
5060: 4f 75 74 3b 0a 20 20 69 66 28 20 53 62 53 5f 52  Out;.  if( SbS_R
5070: 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20 31  equireStack(p, 1
5080: 2c 20 22 70 75 74 73 22 29 20 29 20 72 65 74 75  , "puts") ) retu
5090: 72 6e 20 31 3b 0a 20 20 69 66 28 20 65 6e 61 62  rn 1;.  if( enab
50a0: 6c 65 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  leOutput ){.    
50b0: 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c  z = SbS_StackVal
50c0: 75 65 28 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b  ue(p, 0, &size);
50d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 76 65 72  .    if( pConver
50e0: 74 20 29 7b 20 20 20 20 0a 20 20 20 20 20 20 7a  t ){    .      z
50f0: 4f 75 74 20 3d 20 68 74 6d 6c 69 7a 65 28 7a 2c  Out = htmlize(z,
5100: 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 73 69   size);.      si
5110: 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74  ze = strlen(zOut
5120: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5130: 20 20 20 20 7a 4f 75 74 20 3d 20 28 63 68 61 72      zOut = (char
5140: 2a 29 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  *)z;.    }.    s
5150: 65 6e 64 54 65 78 74 28 7a 4f 75 74 2c 20 73 69  endText(zOut, si
5160: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  ze);.    if( pCo
5170: 6e 76 65 72 74 20 29 7b 0a 20 20 20 20 20 20 66  nvert ){.      f
5180: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
5190: 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70  .  }.  SbS_Pop(p
51a0: 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  , 1);.  return 0
51b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63  ;.}../*.** Subsc
51c0: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20  ript command:   
51d0: 20 20 20 53 54 52 49 4e 47 20 77 69 6b 69 0a 2a     STRING wiki.*
51e0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 74 68 65 20  *.** Render the 
51f0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 61 73 20  input string as 
5200: 77 69 6b 69 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wiki..*/.static 
5210: 69 6e 74 20 77 69 6b 69 43 6d 64 28 73 74 72 75  int wikiCmd(stru
5220: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c  ct Subscript *p,
5230: 20 76 6f 69 64 20 2a 70 43 6f 6e 76 65 72 74 29   void *pConvert)
5240: 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  {.  int size;.  
5250: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
5260: 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65   if( SbS_Require
5270: 53 74 61 63 6b 28 70 2c 20 31 2c 20 22 77 69 6b  Stack(p, 1, "wik
5280: 69 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i") ) return 1;.
5290: 20 20 69 66 28 20 65 6e 61 62 6c 65 4f 75 74 70    if( enableOutp
52a0: 75 74 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 73  ut ){.    Blob s
52b0: 72 63 3b 0a 20 20 20 20 7a 20 3d 20 53 62 53 5f  rc;.    z = SbS_
52c0: 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c  StackValue(p, 0,
52d0: 20 26 73 69 7a 65 29 3b 0a 20 20 20 20 62 6c 6f   &size);.    blo
52e0: 62 5f 69 6e 69 74 28 26 73 72 63 2c 20 7a 2c 20  b_init(&src, z, 
52f0: 73 69 7a 65 29 3b 0a 20 20 20 20 77 69 6b 69 5f  size);.    wiki_
5300: 63 6f 6e 76 65 72 74 28 26 73 72 63 2c 20 30 2c  convert(&src, 0,
5310: 20 57 49 4b 49 5f 49 4e 4c 49 4e 45 29 3b 0a 20   WIKI_INLINE);. 
5320: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73     blob_reset(&s
5330: 72 63 29 3b 0a 20 20 7d 0a 20 20 53 62 53 5f 50  rc);.  }.  SbS_P
5340: 6f 70 28 70 2c 20 31 29 3b 0a 20 20 72 65 74 75  op(p, 1);.  retu
5350: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
5360: 75 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64  ubscript command
5370: 3a 20 20 20 4e 41 4d 45 20 54 45 58 54 2d 4c 49  :   NAME TEXT-LI
5380: 53 54 20 4e 55 4d 4c 49 4e 45 53 20 63 6f 6d 62  ST NUMLINES comb
5390: 6f 62 6f 78 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72  obox.**.** Gener
53a0: 61 74 65 20 61 6e 20 48 54 4d 4c 20 63 6f 6d 62  ate an HTML comb
53b0: 6f 62 6f 78 2e 20 20 4e 41 4d 45 20 69 73 20 62  obox.  NAME is b
53c0: 6f 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  oth the name of 
53d0: 74 68 65 0a 2a 2a 20 43 47 49 20 70 61 72 61 6d  the.** CGI param
53e0: 65 74 65 72 20 61 6e 64 20 74 68 65 20 6e 61 6d  eter and the nam
53f0: 65 20 6f 66 20 61 20 76 61 72 69 61 62 6c 65 20  e of a variable 
5400: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
5410: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 73  e.** currently s
5420: 65 6c 65 63 74 65 64 20 76 61 6c 75 65 2e 20 20  elected value.  
5430: 54 45 58 54 2d 4c 49 53 54 20 69 73 20 61 20 6c  TEXT-LIST is a l
5440: 69 73 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 0a  ist of possible.
5450: 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ** values for th
5460: 65 20 63 6f 6d 62 6f 62 6f 78 2e 20 20 4e 55 4d  e combobox.  NUM
5470: 4c 49 4e 45 53 20 69 73 20 31 20 66 6f 72 20 61  LINES is 1 for a
5480: 20 74 72 75 65 20 63 6f 6d 62 6f 62 6f 78 2e 0a   true combobox..
5490: 2a 2a 20 49 66 20 4e 55 4d 4c 49 4e 45 53 20 69  ** If NUMLINES i
54a0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
54b0: 6e 65 20 74 68 65 6e 20 74 68 65 20 64 69 73 70  ne then the disp
54c0: 6c 61 79 20 69 73 20 61 20 6c 69 73 74 62 6f 78  lay is a listbox
54d0: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 75 6d  .** with the num
54e0: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 67 69 76  ber of lines giv
54f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
5500: 74 20 63 6f 6d 62 6f 62 6f 78 43 6d 64 28 73 74  t comboboxCmd(st
5510: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a  ruct Subscript *
5520: 70 2c 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  p, void *NotUsed
5530: 29 7b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71  ){.  if( SbS_Req
5540: 75 69 72 65 53 74 61 63 6b 28 70 2c 20 33 2c 20  uireStack(p, 3, 
5550: 22 63 6f 6d 62 6f 62 6f 78 22 29 20 29 20 72 65  "combobox") ) re
5560: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 65 6e  turn 1;.  if( en
5570: 61 62 6c 65 4f 75 74 70 75 74 20 29 7b 0a 20 20  ableOutput ){.  
5580: 20 20 69 6e 74 20 68 65 69 67 68 74 3b 0a 20 20    int height;.  
5590: 20 20 42 6c 6f 62 20 6c 69 73 74 2c 20 65 6c 65    Blob list, ele
55a0: 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  m;.    char *zNa
55b0: 6d 65 2c 20 2a 7a 4c 69 73 74 3b 0a 20 20 20 20  me, *zList;.    
55c0: 69 6e 74 20 6e 4e 61 6d 65 2c 20 6e 4c 69 73 74  int nName, nList
55d0: 2c 20 6e 56 61 6c 75 65 3b 0a 20 20 20 20 63 6f  , nValue;.    co
55e0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65  nst char *zValue
55f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 2c 20 2a  ;.    char *z, *
5600: 7a 48 3b 0a 0a 20 20 20 20 68 65 69 67 68 74 20  zH;..    height 
5610: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65  = SbS_StackValue
5620: 49 6e 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a  Int(p, 0);.    z
5630: 4c 69 73 74 20 3d 20 28 63 68 61 72 2a 29 53 62  List = (char*)Sb
5640: 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20  S_StackValue(p, 
5650: 31 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  1, &nList);.    
5660: 62 6c 6f 62 5f 69 6e 69 74 28 26 6c 69 73 74 2c  blob_init(&list,
5670: 20 7a 4c 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a   zList, nList);.
5680: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 28 63 68 61      zName = (cha
5690: 72 2a 29 53 62 53 5f 53 74 61 63 6b 56 61 6c 75  r*)SbS_StackValu
56a0: 65 28 70 2c 20 32 2c 20 26 6e 4e 61 6d 65 29 3b  e(p, 2, &nName);
56b0: 0a 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 53 62  .    zValue = Sb
56c0: 53 5f 46 65 74 63 68 28 70 2c 20 7a 4e 61 6d 65  S_Fetch(p, zName
56d0: 2c 20 6e 4e 61 6d 65 2c 20 26 6e 56 61 6c 75 65  , nName, &nValue
56e0: 29 3b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e  );.    z = mprin
56f0: 74 66 28 22 3c 73 65 6c 65 63 74 20 6e 61 6d 65  tf("<select name
5700: 3d 5c 22 25 7a 5c 22 20 73 69 7a 65 3d 5c 22 25  =\"%z\" size=\"%
5710: 64 5c 22 3e 22 2c 20 0a 20 20 20 20 20 20 20 20  d\">", .        
5720: 20 20 20 20 20 20 20 20 20 68 74 6d 6c 69 7a 65           htmlize
5730: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 2c 20  (zName, nName), 
5740: 68 65 69 67 68 74 29 3b 0a 20 20 20 20 73 65 6e  height);.    sen
5750: 64 54 65 78 74 28 7a 2c 20 2d 31 29 3b 0a 20 20  dText(z, -1);.  
5760: 20 20 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 77    free(z);.    w
5770: 68 69 6c 65 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e  hile( blob_token
5780: 28 26 6c 69 73 74 2c 20 26 65 6c 65 6d 29 20 29  (&list, &elem) )
5790: 7b 0a 20 20 20 20 20 20 7a 48 20 3d 20 68 74 6d  {.      zH = htm
57a0: 6c 69 7a 65 28 62 6c 6f 62 5f 62 75 66 66 65 72  lize(blob_buffer
57b0: 28 26 65 6c 65 6d 29 2c 20 62 6c 6f 62 5f 73 69  (&elem), blob_si
57c0: 7a 65 28 26 65 6c 65 6d 29 29 3b 0a 20 20 20 20  ze(&elem));.    
57d0: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20    if( zValue && 
57e0: 62 6c 6f 62 5f 73 69 7a 65 28 26 65 6c 65 6d 29  blob_size(&elem)
57f0: 3d 3d 6e 56 61 6c 75 65 20 0a 20 20 20 20 20 20  ==nValue .      
5800: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
5810: 28 7a 56 61 6c 75 65 2c 20 62 6c 6f 62 5f 62 75  (zValue, blob_bu
5820: 66 66 65 72 28 26 65 6c 65 6d 29 2c 20 6e 56 61  ffer(&elem), nVa
5830: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
5840: 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22     z = mprintf("
5850: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22  <option value=\"
5860: 25 73 5c 22 20 73 65 6c 65 63 74 65 64 3e 25 73  %s\" selected>%s
5870: 3c 2f 6f 70 74 69 6f 6e 3e 22 2c 20 7a 48 2c 20  </option>", zH, 
5880: 7a 48 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  zH);.      }else
5890: 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 6d 70  {.        z = mp
58a0: 72 69 6e 74 66 28 22 3c 6f 70 74 69 6f 6e 20 76  rintf("<option v
58b0: 61 6c 75 65 3d 5c 22 25 73 5c 22 3e 25 73 3c 2f  alue=\"%s\">%s</
58c0: 6f 70 74 69 6f 6e 3e 22 2c 20 7a 48 2c 20 7a 48  option>", zH, zH
58d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
58e0: 20 66 72 65 65 28 7a 48 29 3b 0a 20 20 20 20 20   free(zH);.     
58f0: 20 73 65 6e 64 54 65 78 74 28 7a 2c 20 2d 31 29   sendText(z, -1)
5900: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 29 3b  ;.      free(z);
5910: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6e 64 54  .    }.    sendT
5920: 65 78 74 28 22 3c 2f 73 65 6c 65 63 74 3e 22 2c  ext("</select>",
5930: 20 2d 31 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72   -1);.    blob_r
5940: 65 73 65 74 28 26 6c 69 73 74 29 3b 0a 20 20 7d  eset(&list);.  }
5950: 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 33 29  .  SbS_Pop(p, 3)
5960: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
5970: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74  ./*.** Subscript
5980: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 53 54   command:     ST
5990: 52 49 4e 47 20 42 4f 4f 4c 45 41 4e 20 69 66 0a  RING BOOLEAN if.
59a0: 2a 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 53  **.** Evaluate S
59b0: 54 52 49 4e 47 20 61 73 20 61 20 73 63 72 69 70  TRING as a scrip
59c0: 74 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20  t if BOOLEAN is 
59d0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
59e0: 69 6e 74 20 69 66 43 6d 64 28 73 74 72 75 63 74  int ifCmd(struct
59f0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76   Subscript *p, v
5a00: 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a  oid *pNotUsed){.
5a10: 20 20 69 6e 74 20 63 6f 6e 64 3b 0a 20 20 69 6e    int cond;.  in
5a20: 74 20 72 63 20 3d 20 53 42 53 5f 4f 4b 3b 0a 0a  t rc = SBS_OK;..
5a30: 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72    if( SbS_Requir
5a40: 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 69 66  eStack(p, 2, "if
5a50: 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ") ) return 1;. 
5a60: 20 63 6f 6e 64 20 3d 20 53 62 53 5f 53 74 61 63   cond = SbS_Stac
5a70: 6b 56 61 6c 75 65 49 6e 74 28 70 2c 20 30 29 3b  kValueInt(p, 0);
5a80: 0a 20 20 69 66 28 20 63 6f 6e 64 20 29 7b 0a 20  .  if( cond ){. 
5a90: 20 20 20 53 62 53 56 61 6c 75 65 20 73 63 72 69     SbSValue scri
5aa0: 70 74 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 70  pt = p->aStack[p
5ab0: 2d 3e 6e 53 74 61 63 6b 2d 32 5d 3b 0a 20 20 20  ->nStack-2];.   
5ac0: 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53   p->aStack[p->nS
5ad0: 74 61 63 6b 2d 32 5d 2e 66 6c 61 67 73 20 3d 20  tack-2].flags = 
5ae0: 30 3b 0a 20 20 20 20 53 62 53 5f 50 6f 70 28 70  0;.    SbS_Pop(p
5af0: 2c 20 32 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  , 2);.    rc = S
5b00: 62 53 5f 45 76 61 6c 28 70 2c 20 73 63 72 69 70  bS_Eval(p, scrip
5b10: 74 2e 75 2e 73 74 72 2e 7a 2c 20 73 63 72 69 70  t.u.str.z, scrip
5b20: 74 2e 75 2e 73 74 72 2e 73 69 7a 65 29 3b 0a 20  t.u.str.size);. 
5b30: 20 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73     sbs_value_res
5b40: 65 74 28 26 73 63 72 69 70 74 29 3b 0a 20 20 7d  et(&script);.  }
5b50: 65 6c 73 65 7b 0a 20 20 20 20 53 62 53 5f 50 6f  else{.    SbS_Po
5b60: 70 28 70 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 72  p(p, 2);.  }.  r
5b70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5b80: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d  ** Subscript com
5b90: 6d 61 6e 64 3a 20 20 20 20 20 2e 2e 2e 20 53 54  mand:     ... ST
5ba0: 52 49 4e 47 20 43 4f 55 4e 54 20 63 6f 6e 63 61  RING COUNT conca
5bb0: 74 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  t STRING.**.** C
5bc0: 6f 6e 63 61 74 65 6e 61 74 65 20 43 4f 55 4e 54  oncatenate COUNT
5bd0: 20 73 74 72 69 6e 67 73 20 69 6e 74 6f 20 61 20   strings into a 
5be0: 73 69 6e 67 6c 65 20 73 74 72 69 6e 67 20 61 6e  single string an
5bf0: 64 20 6c 65 61 76 65 0a 2a 2a 20 74 68 65 20 63  d leave.** the c
5c00: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 6e 20  oncatenation on 
5c10: 74 68 65 20 73 74 61 63 6b 2e 20 0a 2a 2f 0a 73  the stack. .*/.s
5c20: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 63 61 74  tatic int concat
5c30: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
5c40: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
5c50: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20  NotUsed){.  int 
5c60: 63 6f 75 6e 74 3b 0a 20 20 69 6e 74 20 6e 42 79  count;.  int nBy
5c70: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  te;.  char *z;. 
5c80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66   int i, j;..  if
5c90: 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61  ( SbS_RequireSta
5ca0: 63 6b 28 70 2c 20 31 2c 20 22 63 6f 6e 63 61 74  ck(p, 1, "concat
5cb0: 22 29 20 29 20 72 65 74 75 72 6e 20 53 42 53 5f  ") ) return SBS_
5cc0: 45 52 52 4f 52 3b 0a 20 20 63 6f 75 6e 74 20 3d  ERROR;.  count =
5cd0: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49   SbS_StackValueI
5ce0: 6e 74 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  nt(p, 0);.  if( 
5cf0: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b  SbS_RequireStack
5d00: 28 70 2c 20 63 6f 75 6e 74 2b 31 2c 20 22 63 6f  (p, count+1, "co
5d10: 6e 63 61 74 22 29 20 29 20 72 65 74 75 72 6e 20  ncat") ) return 
5d20: 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 53 62 53  SBS_ERROR;.  SbS
5d30: 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 6e 42  _Pop(p, 1);.  nB
5d40: 79 74 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  yte = 1;.  for(i
5d50: 3d 70 2d 3e 6e 53 74 61 63 6b 2d 63 6f 75 6e 74  =p->nStack-count
5d60: 3b 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69  ; i<p->nStack; i
5d70: 2b 2b 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  ++){.    nByte +
5d80: 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 75  = p->aStack[i].u
5d90: 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 7d 0a 20  .str.size;.  }. 
5da0: 20 7a 20 3d 20 6d 61 6c 6c 6f 63 28 6e 42 79 74   z = malloc(nByt
5db0: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
5dc0: 7b 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22  { fossil_panic("
5dd0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
5de0: 20 7d 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 69 3d   }.  for(j=0, i=
5df0: 70 2d 3e 6e 53 74 61 63 6b 2d 63 6f 75 6e 74 3b  p->nStack-count;
5e00: 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69 2b   i<p->nStack; i+
5e10: 2b 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  +){.    nByte = 
5e20: 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 75 2e 73  p->aStack[i].u.s
5e30: 74 72 2e 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d  tr.size;.    mem
5e40: 63 70 79 28 26 7a 5b 6a 5d 2c 20 70 2d 3e 61 53  cpy(&z[j], p->aS
5e50: 74 61 63 6b 5b 69 5d 2e 75 2e 73 74 72 2e 7a 2c  tack[i].u.str.z,
5e60: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 6a 20 2b   nByte);.    j +
5e70: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 7a  = nByte;.  }.  z
5e80: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 53 62 53 5f 50  [j] = 0;.  SbS_P
5e90: 6f 70 28 70 2c 20 63 6f 75 6e 74 29 3b 0a 20 20  op(p, count);.  
5ea0: 53 62 53 5f 50 75 73 68 28 70 2c 20 7a 2c 20 6a  SbS_Push(p, z, j
5eb0: 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 1);.  return S
5ec0: 42 53 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  BS_OK;.}.../*.**
5ed0: 20 41 20 74 61 62 6c 65 20 6f 66 20 62 75 69 6c   A table of buil
5ee0: 74 2d 69 6e 20 63 6f 6d 6d 61 6e 64 73 0a 2a 2f  t-in commands.*/
5ef0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74  .static const st
5f00: 72 75 63 74 20 7b 0a 20 20 63 6f 6e 73 74 20 63  ruct {.  const c
5f10: 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e 74  har *zCmd;.  int
5f20: 20 28 2a 78 43 6d 64 29 28 53 75 62 73 63 72 69   (*xCmd)(Subscri
5f30: 70 74 2a 2c 76 6f 69 64 2a 29 3b 0a 20 20 76 6f  pt*,void*);.  vo
5f40: 69 64 20 2a 70 41 72 67 3b 0a 7d 20 61 42 75 69  id *pArg;.} aBui
5f50: 6c 74 69 6e 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  ltin[] = {.  { "
5f60: 61 64 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  add",           
5f70: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
5f80: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
5f90: 42 53 4f 50 5f 41 4e 44 20 20 20 20 7d 2c 0a 20  BSOP_AND    },. 
5fa0: 20 7b 20 22 61 6e 64 22 2c 20 20 20 20 20 20 20   { "and",       
5fb0: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20        bopCmd,   
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
5fd0: 64 2a 29 53 42 53 4f 50 5f 41 4e 44 20 20 20 20  d*)SBSOP_AND    
5fe0: 7d 2c 0a 20 20 7b 20 22 63 6f 6d 62 6f 62 6f 78  },.  { "combobox
5ff0: 22 2c 20 20 20 20 20 20 20 20 63 6f 6d 62 6f 62  ",        combob
6000: 6f 78 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20  oxCmd,          
6010: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6020: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6e 63      },.  { "conc
6030: 61 74 22 2c 20 20 20 20 20 20 20 20 20 20 63 6f  at",          co
6040: 6e 63 61 74 43 6d 64 2c 20 20 20 20 20 20 20 20  ncatCmd,        
6050: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
6060: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
6070: 64 69 76 22 2c 20 20 20 20 20 20 20 20 20 20 20  div",           
6080: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
6090: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
60a0: 42 53 4f 50 5f 44 49 56 20 20 20 20 7d 2c 0a 20  BSOP_DIV    },. 
60b0: 20 7b 20 22 65 6e 61 62 6c 65 5f 6f 75 74 70 75   { "enable_outpu
60c0: 74 22 2c 20 20 20 65 6e 61 62 6c 65 4f 75 74 70  t",   enableOutp
60d0: 75 74 43 6d 64 2c 20 20 20 20 20 20 30 20 20 20  utCmd,      0   
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 7d 2c 0a 20 20 7b 20 22 65 71 22 2c 20 20 20 20  },.  { "eq",    
6100: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64            bopCmd
6110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6120: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 45 51 20  (void*)SBSOP_EQ 
6130: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 65 78 69 73      },.  { "exis
6140: 74 73 22 2c 20 20 20 20 20 20 20 20 20 20 65 78  ts",          ex
6150: 69 73 74 73 43 6d 64 2c 20 20 20 20 20 20 20 20  istsCmd,        
6160: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
6170: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
6180: 67 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  get",           
6190: 20 20 67 65 74 43 6d 64 2c 20 20 20 20 20 20 20    getCmd,       
61a0: 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
61c0: 20 7b 20 22 68 61 73 63 61 70 22 2c 20 20 20 20   { "hascap",    
61d0: 20 20 20 20 20 20 68 61 73 63 61 70 43 6d 64 2c        hascapCmd,
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 7d 2c 0a 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20  },.  { "html",  
6210: 20 20 20 20 20 20 20 20 20 20 70 75 74 73 43 6d            putsCm
6220: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
6230: 28 76 6f 69 64 2a 29 31 20 20 20 20 20 20 20 20  (void*)1        
6240: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 69 66 22 2c      },.  { "if",
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6260: 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cmd,            
6270: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
6280: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
6290: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
62a0: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
62b0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
62c0: 42 53 4f 50 5f 4c 45 20 20 20 20 20 7d 2c 0a 20  BSOP_LE     },. 
62d0: 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20 20   { "length",    
62e0: 20 20 20 20 20 20 6c 65 6e 67 74 68 43 6d 64 2c        lengthCmd,
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 7d 2c 0a 20 20 7b 20 22 6c 69 6e 65 63 6f 75 6e  },.  { "linecoun
6320: 74 22 2c 20 20 20 20 20 20 20 6c 69 6e 65 63 6e  t",       linecn
6330: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  tCmd,           
6340: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6350: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6c 74 22 2c      },.  { "lt",
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
6370: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  pCmd,           
6380: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50      (void*)SBSOP
6390: 5f 4c 54 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22  _LT     },.  { "
63a0: 6d 61 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  max",           
63b0: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
63c0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
63d0: 42 53 4f 50 5f 4d 41 58 20 20 20 20 7d 2c 0a 20  BSOP_MAX    },. 
63e0: 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20 20 20   { "min",       
63f0: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20        bopCmd,   
6400: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
6410: 64 2a 29 53 42 53 4f 50 5f 4d 49 4e 20 20 20 20  d*)SBSOP_MIN    
6420: 7d 2c 0a 20 20 7b 20 22 6d 75 6c 22 2c 20 20 20  },.  { "mul",   
6430: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64            bopCmd
6440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6450: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 4d 55 4c  (void*)SBSOP_MUL
6460: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6e 6f 74 22      },.  { "not"
6470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f  ,             no
6480: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  tCmd,           
6490: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
64a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
64b0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
64c0: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
64d0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
64e0: 42 53 4f 50 5f 4f 52 20 20 20 20 20 7d 2c 0a 20  BSOP_OR     },. 
64f0: 20 7b 20 22 70 75 74 73 22 2c 20 20 20 20 20 20   { "puts",      
6500: 20 20 20 20 20 20 70 75 74 73 43 6d 64 2c 20 20        putsCmd,  
6510: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 7d 2c 0a 20 20 7b 20 22 73 65 74 22 2c 20 20 20  },.  { "set",   
6540: 20 20 20 20 20 20 20 20 20 20 73 65 74 43 6d 64            setCmd
6550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6560: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6570: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 74 72 65      },.  { "stre
6580: 71 22 2c 20 20 20 20 20 20 20 20 20 20 20 73 74  q",           st
6590: 72 65 71 43 6d 64 2c 20 20 20 20 20 20 20 20 20  reqCmd,         
65a0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
65b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
65c0: 73 75 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  sub",           
65d0: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
65e0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
65f0: 42 53 4f 50 5f 53 55 42 20 20 20 20 7d 2c 0a 20  BSOP_SUB    },. 
6600: 20 7b 20 22 77 69 6b 69 22 2c 20 20 20 20 20 20   { "wiki",      
6610: 20 20 20 20 20 20 77 69 6b 69 43 6d 64 2c 20 20        wikiCmd,  
6620: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 20              0,  
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 7d 2c 0a 7d 3b 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20  },.};.  ../*.** 
6650: 43 6f 6d 70 61 72 65 20 61 20 7a 65 72 6f 2d 74  Compare a zero-t
6660: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
6670: 20 7a 50 61 74 74 65 72 6e 20 61 67 61 69 6e 73   zPattern agains
6680: 74 0a 2a 2a 20 61 6e 20 75 6e 74 65 72 6d 69 6e  t.** an untermin
6690: 61 74 65 64 20 73 74 72 69 6e 67 20 7a 53 74 72  ated string zStr
66a0: 20 6f 66 20 6c 65 6e 67 74 68 20 6e 53 74 72 2e   of length nStr.
66b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6c 65  .**.** Return le
66c0: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
66d0: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
66e0: 61 6e 20 7a 65 72 6f 20 69 66 0a 2a 2a 20 7a 50  an zero if.** zP
66f0: 61 74 74 65 72 6e 20 69 73 20 6c 65 73 73 20 74  attern is less t
6700: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
6710: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  r greater than z
6720: 53 74 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Str..*/.static i
6730: 6e 74 20 63 6f 6d 70 61 72 65 5f 63 6d 64 28 63  nt compare_cmd(c
6740: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74  onst char *zPatt
6750: 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ern, const char 
6760: 2a 7a 53 74 72 2c 20 69 6e 74 20 6e 53 74 72 29  *zStr, int nStr)
6770: 7b 0a 20 20 69 6e 74 20 63 20 3d 20 73 74 72 6e  {.  int c = strn
6780: 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 20 7a 53  cmp(zPattern, zS
6790: 74 72 2c 20 6e 53 74 72 29 3b 0a 20 20 69 66 28  tr, nStr);.  if(
67a0: 20 63 3d 3d 30 20 26 26 20 7a 50 61 74 74 65 72   c==0 && zPatter
67b0: 6e 5b 6e 53 74 72 5d 21 3d 30 20 29 7b 0a 20 20  n[nStr]!=0 ){.  
67c0: 20 20 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72    c = 1;.  }.  r
67d0: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
67e0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73  * Evaluate the s
67f0: 63 72 69 70 74 20 67 69 76 65 6e 20 62 79 20 74  cript given by t
6800: 68 65 20 66 69 72 73 74 20 6e 53 63 72 69 70 74  he first nScript
6810: 20 62 79 74 65 73 20 6f 66 20 7a 53 63 72 69 70   bytes of zScrip
6820: 74 5b 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  t[]..** Return 0
6830: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
6840: 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20  non-zero for an 
6850: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62  error..*/.int Sb
6860: 53 5f 45 76 61 6c 28 73 74 72 75 63 74 20 53 75  S_Eval(struct Su
6870: 62 73 63 72 69 70 74 20 2a 70 2c 20 63 6f 6e 73  bscript *p, cons
6880: 74 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 2c  t char *zScript,
6890: 20 69 6e 74 20 6e 53 63 72 69 70 74 29 7b 0a 20   int nScript){. 
68a0: 20 69 6e 74 20 72 63 20 3d 20 53 42 53 5f 4f 4b   int rc = SBS_OK
68b0: 3b 0a 20 20 69 66 28 20 6e 53 63 72 69 70 74 3c  ;.  if( nScript<
68c0: 30 20 29 20 6e 53 63 72 69 70 74 20 3d 20 73 74  0 ) nScript = st
68d0: 72 6c 65 6e 28 7a 53 63 72 69 70 74 29 3b 0a 20  rlen(zScript);. 
68e0: 20 77 68 69 6c 65 28 20 6e 53 63 72 69 70 74 3e   while( nScript>
68f0: 30 20 26 26 20 72 63 3d 3d 53 42 53 5f 4f 4b 20  0 && rc==SBS_OK 
6900: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
6910: 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20    int ttype;.   
6920: 20 6e 20 3d 20 73 62 73 5f 6e 65 78 74 5f 74 6f   n = sbs_next_to
6930: 6b 65 6e 28 7a 53 63 72 69 70 74 2c 20 6e 53 63  ken(zScript, nSc
6940: 72 69 70 74 2c 20 26 74 74 79 70 65 29 3b 0a 0a  ript, &ttype);..
6950: 23 69 66 20 30 0a 20 20 20 20 7b 0a 20 20 20 20  #if 0.    {.    
6960: 20 20 69 6e 74 20 69 2c 20 6e 45 6c 65 6d 3b 0a    int i, nElem;.
6970: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
6980: 20 2a 7a 45 6c 65 6d 3b 0a 20 20 20 20 20 20 69   *zElem;.      i
6990: 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 30 20 29  f( p->nStack>0 )
69a0: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
69b0: 28 22 53 54 41 43 4b 3a 22 29 3b 0a 20 20 20 20  ("STACK:");.    
69c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
69d0: 2d 3e 6e 53 74 61 63 6b 3b 20 69 2b 2b 29 7b 0a  ->nStack; i++){.
69e0: 20 20 20 20 20 20 20 20 20 20 7a 45 6c 65 6d 20            zElem 
69f0: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65  = SbS_StackValue
6a00: 28 70 2c 20 69 2c 20 26 6e 45 6c 65 6d 29 3b 0a  (p, i, &nElem);.
6a10: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
6a20: 28 22 20 5b 25 2e 2a 73 5d 22 2c 20 6e 45 6c 65  (" [%.*s]", nEle
6a30: 6d 2c 20 7a 45 6c 65 6d 29 3b 0a 20 20 20 20 20  m, zElem);.     
6a40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 72 69     }.        pri
6a50: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
6a60: 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
6a70: 22 54 4f 4b 45 4e 28 25 64 29 3a 20 5b 25 2e 2a  "TOKEN(%d): [%.*
6a80: 73 5d 5c 6e 22 2c 20 74 74 79 70 65 2c 20 6e 2c  s]\n", ttype, n,
6a90: 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d   zScript);.    }
6aa0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69  .#endif..    swi
6ab0: 74 63 68 28 20 74 74 79 70 65 20 29 7b 0a 20 20  tch( ttype ){.  
6ac0: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 57      case SBSTT_W
6ad0: 48 49 54 45 53 50 41 43 45 3a 20 7b 0a 20 20 20  HITESPACE: {.   
6ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6af0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
6b00: 42 53 54 54 5f 45 4f 46 3a 20 7b 0a 20 20 20 20  BSTT_EOF: {.    
6b10: 20 20 20 20 6e 53 63 72 69 70 74 20 3d 20 30 3b      nScript = 0;
6b20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
6b40: 73 65 20 53 42 53 54 54 5f 49 4e 43 4f 4d 50 4c  se SBSTT_INCOMPL
6b50: 45 54 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ETE:.      case 
6b60: 53 42 53 54 54 5f 55 4e 4b 4e 4f 57 4e 3a 20 7b  SBSTT_UNKNOWN: {
6b70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 42  .        rc = SB
6b80: 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  S_ERROR;.       
6b90: 20 6e 53 63 72 69 70 74 20 3d 20 6e 3b 0a 20 20   nScript = n;.  
6ba0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6bb0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
6bc0: 53 42 53 54 54 5f 49 4e 54 45 47 45 52 3a 20 7b  SBSTT_INTEGER: {
6bd0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 62  .        rc = Sb
6be0: 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 72 2a  S_Push(p, (char*
6bf0: 29 7a 53 63 72 69 70 74 2c 20 6e 2c 20 30 29 3b  )zScript, n, 0);
6c00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
6c20: 73 65 20 53 42 53 54 54 5f 4e 41 4d 45 3a 20 7b  se SBSTT_NAME: {
6c30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 62  .        rc = Sb
6c40: 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 72 2a  S_Push(p, (char*
6c50: 29 26 7a 53 63 72 69 70 74 5b 31 5d 2c 20 6e 2d  )&zScript[1], n-
6c60: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
6c70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6c80: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 53      case SBSTT_S
6c90: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 20  TRING: {.       
6ca0: 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70   rc = SbS_Push(p
6cb0: 2c 20 28 63 68 61 72 2a 29 26 7a 53 63 72 69 70  , (char*)&zScrip
6cc0: 74 5b 31 5d 2c 20 6e 2d 32 2c 20 30 29 3b 0a 20  t[1], n-2, 0);. 
6cd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
6cf0: 20 53 42 53 54 54 5f 51 55 4f 54 45 44 3a 20 7b   SBSTT_QUOTED: {
6d00: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
6d10: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73   = mprintf("%.*s
6d20: 22 2c 20 6e 2d 32 2c 20 26 7a 53 63 72 69 70 74  ", n-2, &zScript
6d30: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  [1]);.        in
6d40: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 20 20  t i, j;.        
6d50: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b  for(i=j=0; z[i];
6d60: 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
6d70: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b        int c = z[
6d80: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
6d90: 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69  ( c=='\\' && z[i
6da0: 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
6db0: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
6dc0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
6dd0: 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='n' ){.       
6de0: 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b         c = '\n';
6df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
6e00: 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26  se if( c>='0' &&
6e10: 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20   c<='7' ){.     
6e20: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
6e40: 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20  -= '0';.        
6e50: 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
6e60: 3c 33 20 26 26 20 7a 5b 69 2b 6b 5d 3e 3d 27 30  <3 && z[i+k]>='0
6e70: 27 20 26 26 20 7a 5b 69 2b 6b 5d 3c 3d 27 37 27  ' && z[i+k]<='7'
6e80: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
6e90: 20 20 20 20 20 20 20 20 63 20 3d 20 63 2a 38 20          c = c*8 
6ea0: 2b 20 7a 5b 69 2b 6b 5d 20 2d 20 27 30 27 3b 0a  + z[i+k] - '0';.
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 20                i 
6ed0: 2b 3d 20 6b 2d 31 3b 0a 20 20 20 20 20 20 20 20  += k-1;.        
6ee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6ef0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 5d  }.          z[j]
6f00: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
6f10: 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30          z[j] = 0
6f20: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
6f30: 62 53 5f 50 75 73 68 28 70 2c 20 7a 2c 20 6a 2c  bS_Push(p, z, j,
6f40: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
6f50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6f60: 20 20 63 61 73 65 20 53 42 53 54 54 5f 56 45 52    case SBSTT_VER
6f70: 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  B: {.        /* 
6f80: 46 69 72 73 74 20 6c 6f 6f 6b 20 75 70 20 74 68  First look up th
6f90: 65 20 76 65 72 62 20 69 6e 20 74 68 65 20 68 61  e verb in the ha
6fa0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
6fb0: 20 20 20 20 63 6f 6e 73 74 20 53 62 53 56 61 6c      const SbSVal
6fc0: 75 65 20 2a 70 56 61 6c 20 3d 20 73 62 73 5f 66  ue *pVal = sbs_f
6fd0: 65 74 63 68 28 26 70 2d 3e 73 79 6d 54 61 62 2c  etch(&p->symTab,
6fe0: 20 28 63 68 61 72 2a 29 7a 53 63 72 69 70 74 2c   (char*)zScript,
6ff0: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   n);.        if(
7000: 20 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   pVal==0 ){.    
7010: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
7020: 76 65 72 62 20 69 73 20 6e 6f 74 20 69 6e 20 74  verb is not in t
7030: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2c 20 6c  he hash table, l
7040: 6f 6f 6b 20 66 6f 72 20 61 20 0a 20 20 20 20 20  ook for a .     
7050: 20 20 20 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e       ** built-in
7060: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
7070: 20 20 20 20 20 20 69 6e 74 20 75 70 72 20 3d 20        int upr = 
7080: 73 69 7a 65 6f 66 28 61 42 75 69 6c 74 69 6e 29  sizeof(aBuiltin)
7090: 2f 73 69 7a 65 6f 66 28 61 42 75 69 6c 74 69 6e  /sizeof(aBuiltin
70a0: 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  [0]) - 1;.      
70b0: 20 20 20 20 69 6e 74 20 6c 77 72 20 3d 20 30 3b      int lwr = 0;
70c0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
70d0: 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  SBS_ERROR;.     
70e0: 20 20 20 20 20 77 68 69 6c 65 28 20 75 70 72 3e       while( upr>
70f0: 3d 6c 77 72 20 29 7b 0a 20 20 20 20 20 20 20 20  =lwr ){.        
7100: 20 20 20 20 69 6e 74 20 69 20 3d 20 28 75 70 72      int i = (upr
7110: 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 20 20 20  +lwr)/2;.       
7120: 20 20 20 20 20 69 6e 74 20 63 20 3d 20 63 6f 6d       int c = com
7130: 70 61 72 65 5f 63 6d 64 28 61 42 75 69 6c 74 69  pare_cmd(aBuilti
7140: 6e 5b 69 5d 2e 7a 43 6d 64 2c 20 7a 53 63 72 69  n[i].zCmd, zScri
7150: 70 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  pt, n);.        
7160: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
7180: 20 3d 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 78   = aBuiltin[i].x
7190: 43 6d 64 28 70 2c 20 61 42 75 69 6c 74 69 6e 5b  Cmd(p, aBuiltin[
71a0: 69 5d 2e 70 41 72 67 29 3b 0a 20 20 20 20 20 20  i].pArg);.      
71b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
71c0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
71d0: 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
71e0: 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
71f0: 69 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i-1;.           
7200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7210: 20 20 20 20 20 20 6c 77 72 20 3d 20 69 2b 31 3b        lwr = i+1;
7220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7230: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7240: 20 20 20 20 20 69 66 28 20 75 70 72 3c 6c 77 72       if( upr<lwr
7250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7260: 53 62 53 5f 53 65 74 45 72 72 6f 72 4d 65 73 73  SbS_SetErrorMess
7270: 61 67 65 28 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  age(p, "unknown 
7280: 76 65 72 62 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20  verb: %.*s", n, 
7290: 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20  zScript);.      
72a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
72b0: 6c 73 65 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c  lse if( pVal->fl
72c0: 61 67 73 20 26 20 53 42 53 56 41 4c 5f 56 45 52  ags & SBSVAL_VER
72d0: 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  B ){.          r
72e0: 63 20 3d 20 70 56 61 6c 2d 3e 75 2e 76 65 72 62  c = pVal->u.verb
72f0: 2e 78 56 65 72 62 28 70 2c 20 70 56 61 6c 2d 3e  .xVerb(p, pVal->
7300: 75 2e 76 65 72 62 2e 70 41 72 67 29 3b 0a 20 20  u.verb.pArg);.  
7310: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7320: 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42  pVal->flags & SB
7330: 53 56 41 4c 5f 45 58 45 43 20 29 7b 0a 20 20 20  SVAL_EXEC ){.   
7340: 20 20 20 20 20 20 20 72 63 20 3d 20 53 62 53 5f         rc = SbS_
7350: 45 76 61 6c 28 70 2c 20 70 56 61 6c 2d 3e 75 2e  Eval(p, pVal->u.
7360: 73 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75 2e 73  str.z, pVal->u.s
7370: 74 72 2e 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  tr.size);.      
7380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7390: 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68     rc = SbS_Push
73a0: 28 70 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e  (p, pVal->u.str.
73b0: 7a 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73  z, pVal->u.str.s
73c0: 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
73d0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
73e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
73f0: 20 20 20 20 7a 53 63 72 69 70 74 20 2b 3d 20 6e      zScript += n
7400: 3b 0a 20 20 20 20 6e 53 63 72 69 70 74 20 2d 3d  ;.    nScript -=
7410: 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   n;.  }.  return
7420: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
7430: 65 20 7a 5b 5d 20 69 6e 70 75 74 20 63 6f 6e 74  e z[] input cont
7440: 61 69 6e 73 20 74 65 78 74 20 6d 69 78 65 64 20  ains text mixed 
7450: 77 69 74 68 20 73 75 62 73 63 72 69 70 74 20 73  with subscript s
7460: 63 72 69 70 74 73 2e 0a 2a 2a 20 54 68 65 20 73  cripts..** The s
7470: 75 62 73 63 72 69 70 74 20 73 63 72 69 70 74 73  ubscript scripts
7480: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
7490: 69 74 68 69 6e 20 5b 2e 2e 2e 5d 2e 20 20 54 68  ithin [...].  Th
74a0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 70 72  is routine.** pr
74b0: 6f 63 65 73 73 65 73 20 74 68 65 20 74 65 6d 70  ocesses the temp
74c0: 6c 61 74 65 20 61 6e 64 20 77 72 69 74 65 73 20  late and writes 
74d0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e 20 65  the results on e
74e0: 69 74 68 65 72 0a 2a 2a 20 73 74 64 6f 75 74 20  ither.** stdout 
74f0: 6f 72 20 69 6e 74 6f 20 43 47 49 2e 0a 2a 2f 0a  or into CGI..*/.
7500: 69 6e 74 20 53 62 53 5f 52 65 6e 64 65 72 28 73  int SbS_Render(s
7510: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
7520: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
7530: 7a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  z){.  int i = 0;
7540: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 42 53 5f  .  int rc = SBS_
7550: 4f 4b 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69  OK;.  while( z[i
7560: 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ] ){.    if( z[i
7570: 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='[' ){.      
7580: 73 65 6e 64 54 65 78 74 28 7a 2c 20 69 29 3b 0a  sendText(z, i);.
7590: 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a        z += i+1;.
75a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
75b0: 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 5d 27  [i] && z[i]!=']'
75c0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 72  ; i++){}.      r
75d0: 63 20 3d 20 53 62 53 5f 45 76 61 6c 28 70 2c 20  c = SbS_Eval(p, 
75e0: 7a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  z, i);.      if(
75f0: 20 72 63 21 3d 53 42 53 5f 4f 4b 20 29 20 62 72   rc!=SBS_OK ) br
7600: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  eak;.      if( z
7610: 5b 69 5d 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  [i] ) i++;.     
7620: 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 69   z += i;.      i
7630: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
7640: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
7650: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
7660: 53 42 53 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  SBS_ERROR ){.   
7670: 20 73 65 6e 64 54 65 78 74 28 22 3c 68 72 3e 3c   sendText("<hr><
7680: 70 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22  p><font color=\"
7690: 72 65 64 5c 22 3e 3c 62 3e 45 52 52 4f 52 3a 20  red\"><b>ERROR: 
76a0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 73 65 6e 64  ", -1);.    send
76b0: 54 65 78 74 28 53 62 53 5f 47 65 74 45 72 72 6f  Text(SbS_GetErro
76c0: 72 4d 65 73 73 61 67 65 28 70 29 2c 20 2d 31 29  rMessage(p), -1)
76d0: 3b 0a 20 20 20 20 73 65 6e 64 54 65 78 74 28 22  ;.    sendText("
76e0: 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 22  </b></font></p>"
76f0: 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
7700: 20 20 20 20 73 65 6e 64 54 65 78 74 28 7a 2c 20      sendText(z, 
7710: 69 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i);.  }.  return
7720: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f   rc;.}../*.** CO
7730: 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 73 75 62 73  MMAND: test-subs
7740: 63 72 69 70 74 0a 2a 2f 0a 76 6f 69 64 20 74 65  cript.*/.void te
7750: 73 74 5f 73 75 62 73 63 72 69 70 74 28 76 6f 69  st_subscript(voi
7760: 64 29 7b 0a 20 20 53 75 62 73 63 72 69 70 74 20  d){.  Subscript 
7770: 2a 70 3b 0a 20 20 42 6c 6f 62 20 69 6e 3b 0a 20  *p;.  Blob in;. 
7780: 20 69 66 28 20 67 2e 61 72 67 63 3c 33 20 29 7b   if( g.argc<3 ){
7790: 0a 20 20 20 20 75 73 61 67 65 28 22 46 49 4c 45  .    usage("FILE
77a0: 22 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a  ");.  }.  blob_z
77b0: 65 72 6f 28 26 69 6e 29 3b 0a 20 20 62 6c 6f 62  ero(&in);.  blob
77c0: 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28  _read_from_file(
77d0: 26 69 6e 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b  &in, g.argv[2]);
77e0: 0a 20 20 70 20 3d 20 53 62 53 5f 43 72 65 61 74  .  p = SbS_Creat
77f0: 65 28 29 3b 0a 20 20 53 62 53 5f 52 65 6e 64 65  e();.  SbS_Rende
7800: 72 28 70 2c 20 62 6c 6f 62 5f 73 74 72 28 26 69  r(p, blob_str(&i
7810: 6e 29 29 3b 0a 7d 0a                             n));.}.