Hex Artifact Content
Not logged in

Artifact 7a4e64645a3111066c8cdcc50f59cb399bb7ad5e:

File src/subscript.c part of check-in [555911dff5] - Render the header of every page using subscript. Add a setup page that for editing that subscript. by drh on 2007-11-21 03:01:40.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6d 70   contains an imp
0380: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0390: 68 65 20 22 73 75 62 73 63 72 69 70 74 22 20 69  he "subscript" i
03a0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2a 0a 2a  nterpreter..**.*
03b0: 2a 20 53 75 62 73 63 72 69 70 74 20 61 74 74 65  * Subscript atte
03c0: 6d 70 74 73 20 74 6f 20 62 65 20 61 6e 20 65 78  mpts to be an ex
03d0: 74 72 65 6d 65 6c 79 20 6c 69 67 68 74 2d 77 65  tremely light-we
03e0: 69 67 68 74 20 73 63 72 69 70 74 69 6e 67 0a 2a  ight scripting.*
03f0: 2a 20 6c 61 6e 67 75 61 67 65 2e 20 20 49 74 20  * language.  It 
0400: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 62 61 72  contains the bar
0410: 65 73 74 20 6f 66 20 62 61 72 65 20 65 73 73 65  est of bare esse
0420: 6e 74 69 61 6c 73 2e 20 20 49 74 20 69 73 0a 2a  ntials.  It is.*
0430: 2a 20 73 74 61 63 6b 2d 62 61 73 65 64 20 61 6e  * stack-based an
0440: 64 20 66 6f 72 74 68 2d 6c 69 6b 65 2e 20 20 45  d forth-like.  E
0450: 76 65 72 79 74 68 69 6e 67 20 69 73 20 69 6e 20  verything is in 
0460: 61 20 73 69 6e 67 6c 65 20 67 6c 6f 62 61 6c 0a  a single global.
0470: 2a 2a 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54  ** namespace.  T
0480: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
0490: 69 6e 67 6c 65 20 64 61 74 61 74 79 70 65 20 6f  ingle datatype o
04a0: 66 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  f zero-terminate
04b0: 64 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 54 68  d.** string.  Th
04c0: 65 20 73 74 61 63 6b 20 69 73 20 6f 66 20 66 69  e stack is of fi
04d0: 78 65 64 2c 20 6c 69 6d 69 74 65 64 20 64 65 70  xed, limited dep
04e0: 74 68 2e 20 20 54 68 65 20 73 79 6d 62 61 6c 20  th.  The symbal 
04f0: 74 61 62 6c 65 0a 2a 2a 20 69 73 20 6f 66 20 61  table.** is of a
0500: 20 6c 69 6d 69 74 65 64 20 61 6e 64 20 66 69 78   limited and fix
0510: 65 64 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed size..**.** T
0520: 4f 4b 45 4e 53 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  OKENS:.**.**    
0530: 20 20 2a 20 20 41 6c 6c 20 74 6f 6b 65 6e 73 20    *  All tokens 
0540: 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72  are separated fr
0550: 6f 6d 20 65 61 63 68 20 6f 74 68 65 72 20 62 79  om each other by
0560: 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 20   whitespace..** 
0570: 20 20 20 20 20 2a 20 20 4c 65 61 64 69 6e 67 20       *  Leading 
0580: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
0590: 74 65 73 70 61 63 65 20 69 73 20 69 67 6e 6f 72  tespace is ignor
05a0: 65 64 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 54  ed..**      *  T
05b0: 65 78 74 20 77 69 74 68 69 6e 20 6e 65 73 74 65  ext within neste
05c0: 64 20 7b 2e 2e 2e 7d 20 69 73 20 61 20 73 69 6e  d {...} is a sin
05d0: 67 6c 65 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e  gle string token
05e0: 2e 20 20 54 68 65 20 6f 75 74 65 72 6d 6f 73 74  .  The outermost
05f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 75 72 6c  .**         curl
0600: 79 20 62 72 61 63 65 73 20 61 72 65 20 6e 6f 74  y braces are not
0610: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 6f 6b   part of the tok
0620: 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41  en..**      *  A
0630: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69 74  n identifier wit
0640: 68 20 61 20 6c 65 61 64 69 6e 67 20 22 2f 22 20  h a leading "/" 
0650: 69 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65  is a string toke
0660: 6e 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 20  n..**      *  A 
0670: 74 6f 6b 65 6e 20 74 68 61 74 20 6c 6f 6f 6b 73  token that looks
0680: 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 20 69   like a number i
0690: 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e  s a string token
06a0: 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 6e 20  ..**      *  An 
06b0: 69 64 65 6e 74 69 66 69 65 72 20 74 6f 6b 65 6e  identifier token
06c0: 20 69 73 20 63 61 6c 6c 65 64 20 61 20 22 76 65   is called a "ve
06d0: 72 62 22 2e 0a 2a 2a 0a 2a 2a 20 50 52 4f 43 45  rb"..**.** PROCE
06e0: 53 53 49 4e 47 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  SSING:.**.**    
06f0: 20 20 2a 20 20 54 68 65 20 69 6e 70 75 74 20 69    *  The input i
0700: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74  s divided into t
0710: 6f 6b 65 6e 73 2e 20 20 57 68 69 74 65 73 70 61  okens.  Whitespa
0720: 63 65 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  ce is discarded.
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 53 74 72 69  .**         Stri
0740: 6e 67 20 61 6e 64 20 76 65 72 62 20 74 6f 6b 65  ng and verb toke
0750: 6e 73 20 61 72 65 20 70 61 73 73 65 64 20 69 6e  ns are passed in
0760: 74 6f 20 74 68 65 20 65 6e 67 69 6e 65 2e 0a 2a  to the engine..*
0770: 2a 20 20 20 20 20 20 2a 20 20 53 74 72 69 6e 67  *      *  String
0780: 20 74 6f 6b 65 6e 73 20 61 72 65 20 70 75 73 68   tokens are push
0790: 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ed onto the stac
07a0: 6b 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 49 66  k..**      *  If
07b0: 20 61 20 76 65 72 62 20 74 6f 6b 65 6e 20 63 6f   a verb token co
07c0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20 70  rresponds to a p
07d0: 72 6f 63 65 64 75 72 65 2c 20 74 68 61 74 20 70  rocedure, that p
07e0: 72 6f 63 65 64 75 72 65 20 69 73 0a 2a 2a 20 20  rocedure is.**  
07f0: 20 20 20 20 20 20 20 72 75 6e 2e 20 20 54 68 65         run.  The
0800: 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
0810: 20 75 73 65 2c 20 70 6f 70 2c 20 6f 72 20 70 75   use, pop, or pu
0820: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  ll elements from
0830: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65   .**         the
0840: 20 73 74 61 63 6b 2e 0a 2a 2a 20 20 20 20 20 20   stack..**      
0850: 2a 20 20 49 66 20 61 20 76 65 72 62 20 74 6f 6b  *  If a verb tok
0860: 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  en corresponds t
0870: 6f 20 61 20 76 61 72 69 61 62 6c 65 2c 20 74 68  o a variable, th
0880: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a  e value of that.
0890: 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 61  **         varia
08a0: 62 6c 65 20 69 73 20 70 75 73 68 65 64 20 6f 6e  ble is pushed on
08b0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
08c0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
08d0: 61 74 74 65 6d 70 74 73 20 74 6f 20 62 65 20 63  attempts to be c
08e0: 6f 6d 70 6c 65 74 65 6c 79 20 73 65 6c 66 2d 63  ompletely self-c
08f0: 6f 6e 74 61 69 6e 65 64 20 73 6f 20 74 68 61 74  ontained so that
0900: 20 69 74 20 63 61 6e 0a 2a 2a 20 62 65 20 70 6f   it can.** be po
0910: 72 74 61 62 6c 65 20 74 6f 20 6f 74 68 65 72 20  rtable to other 
0920: 70 72 6f 6a 65 63 74 73 2e 0a 2a 2f 0a 23 69 6e  projects..*/.#in
0930: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22  clude "config.h"
0940: 0a 23 69 6e 63 6c 75 64 65 20 22 73 75 62 73 63  .#include "subsc
0950: 72 69 70 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ript.h".#include
0960: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69 66   <assert.h>..#if
0970: 20 49 4e 54 45 52 46 41 43 45 0a 74 79 70 65 64   INTERFACE.typed
0980: 65 66 20 73 74 72 75 63 74 20 53 75 62 73 63 72  ef struct Subscr
0990: 69 70 74 20 53 75 62 73 63 72 69 70 74 3b 0a 23  ipt Subscript;.#
09a0: 64 65 66 69 6e 65 20 53 42 53 5f 4f 4b 20 20 20  define SBS_OK   
09b0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 42 53     0.#define SBS
09c0: 5f 45 52 52 4f 52 20 20 20 31 0a 23 65 6e 64 69  _ERROR   1.#endi
09d0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  f../*.** Configu
09e0: 72 61 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  ration constants
09f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43  .*/.#define SBSC
0a00: 4f 4e 46 49 47 5f 4e 48 41 53 48 20 20 20 20 34  ONFIG_NHASH    4
0a10: 31 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  1         /* Siz
0a20: 65 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61  e of the hash ta
0a30: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ble */.#define S
0a40: 42 53 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20  BSCONFIG_NSTACK 
0a50: 20 20 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20    10         /* 
0a60: 4d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65  Maximum stack de
0a70: 70 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  pth */.#define S
0a80: 42 53 43 4f 4e 46 49 47 5f 45 52 52 53 49 5a 45  BSCONFIG_ERRSIZE
0a90: 20 20 31 30 30 20 20 20 20 20 20 20 20 2f 2a 20    100        /* 
0aa0: 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  Maximum size of 
0ab0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
0ac0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 76 61 69 6c   */../*.** Avail
0ad0: 61 62 6c 65 20 74 6f 6b 65 6e 20 74 79 70 65 73  able token types
0ae0: 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53  :.*/.#define SBS
0af0: 54 54 5f 57 48 49 54 45 53 50 41 43 45 20 20 31  TT_WHITESPACE  1
0b00: 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 5c 30 34      /* ex:   \04
0b10: 30 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  0   */.#define S
0b20: 42 53 54 54 5f 4e 41 4d 45 20 20 20 20 20 20 20  BSTT_NAME       
0b30: 20 32 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 2f   2    /* ex:   /
0b40: 61 62 63 64 65 20 20 2a 2f 0a 23 64 65 66 69 6e  abcde  */.#defin
0b50: 65 20 53 42 53 54 54 5f 56 45 52 42 20 20 20 20  e SBSTT_VERB    
0b60: 20 20 20 20 33 20 20 20 20 2f 2a 20 65 78 3a 20      3    /* ex: 
0b70: 20 20 61 62 63 64 65 20 20 20 2a 2f 0a 23 64 65    abcde   */.#de
0b80: 66 69 6e 65 20 53 42 53 54 54 5f 53 54 52 49 4e  fine SBSTT_STRIN
0b90: 47 20 20 20 20 20 20 34 20 20 20 20 2f 2a 20 65  G      4    /* e
0ba0: 78 3a 20 20 20 7b 2e 2e 2e 7d 20 20 20 2a 2f 0a  x:   {...}   */.
0bb0: 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 49 4e  #define SBSTT_IN
0bc0: 54 45 47 45 52 20 20 20 20 20 35 20 20 20 20 2f  TEGER     5    /
0bd0: 2a 20 49 6e 74 65 67 65 72 20 69 6e 63 6c 75 64  * Integer includ
0be0: 69 6e 67 20 6f 70 74 69 6f 6e 20 73 69 67 6e 20  ing option sign 
0bf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54  */.#define SBSTT
0c00: 5f 49 4e 43 4f 4d 50 4c 45 54 45 20 20 36 20 20  _INCOMPLETE  6  
0c10: 20 20 2f 2a 20 55 6e 74 65 72 6d 69 6e 61 74 65    /* Unterminate
0c20: 64 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e 20 2a  d string token *
0c30: 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f  /.#define SBSTT_
0c40: 55 4e 4b 4e 4f 57 4e 20 20 20 20 20 37 20 20 20  UNKNOWN     7   
0c50: 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20 74 6f 6b 65   /* Unknown toke
0c60: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53  n */.#define SBS
0c70: 54 54 5f 45 4f 46 20 20 20 20 20 20 20 20 20 38  TT_EOF         8
0c80: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e      /* End of in
0c90: 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61  put */../*.** Va
0ca0: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
0cb0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
0cc0: 65 20 61 73 20 69 6e 73 74 61 6e 63 65 73 20 6f  e as instances o
0cd0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0ce0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cf0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0d00: 53 62 53 56 61 6c 75 65 20 53 62 53 56 61 6c 75  SbSValue SbSValu
0d10: 65 3b 0a 73 74 72 75 63 74 20 53 62 53 56 61 6c  e;.struct SbSVal
0d20: 75 65 20 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  ue {.  int flags
0d30: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ;        /* Bitm
0d40: 61 73 6b 20 6f 66 20 53 42 53 56 41 4c 5f 2a 20  ask of SBSVAL_* 
0d50: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 6e 69 6f  values */.  unio
0d60: 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 7b  n {.    struct {
0d70: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  .      int size;
0d80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0d90: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 73 74  r of bytes in st
0da0: 72 69 6e 67 2c 20 6e 6f 74 20 63 6f 75 6e 74 69  ring, not counti
0db0: 6e 67 20 66 69 6e 61 6c 20 7a 65 72 6f 20 2a 2f  ng final zero */
0dc0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 20  .      char *z; 
0dd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
0de0: 65 72 20 74 6f 20 73 74 72 69 6e 67 20 63 6f 6e  er to string con
0df0: 74 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 20 73 74  tent */.    } st
0e00: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  r;          /* V
0e10: 61 6c 75 65 20 69 66 20 53 42 53 56 41 4c 5f 53  alue if SBSVAL_S
0e20: 54 52 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  TR */.    struct
0e30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 28 2a 78   {.      int (*x
0e40: 56 65 72 62 29 28 53 75 62 73 63 72 69 70 74 2a  Verb)(Subscript*
0e50: 2c 20 76 6f 69 64 2a 29 3b 20 20 20 20 20 2f 2a  , void*);     /*
0e60: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 64 6f 20   Function to do 
0e70: 74 68 65 20 77 6f 72 6b 20 2a 2f 0a 20 20 20 20  the work */.    
0e80: 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 20 20 20    void *pArg;   
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20 70 61         /* 2nd pa
0eb0: 72 61 6d 65 74 65 72 20 74 6f 20 78 56 65 72 62  rameter to xVerb
0ec0: 20 2a 2f 0a 20 20 20 20 7d 20 76 65 72 62 3b 20   */.    } verb; 
0ed0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
0ee0: 20 69 66 20 53 42 53 56 41 4c 5f 56 45 52 42 20   if SBSVAL_VERB 
0ef0: 2a 2f 0a 20 20 7d 20 75 3b 20 20 20 20 20 20 20  */.  } u;       
0f00: 20 20 20 20 20 20 20 0a 7d 3b 0a 23 64 65 66 69         .};.#defi
0f10: 6e 65 20 53 42 53 56 41 4c 5f 56 45 52 42 20 20  ne SBSVAL_VERB  
0f20: 20 20 30 78 30 30 30 31 20 20 20 20 20 20 2f 2a    0x0001      /*
0f30: 20 56 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   Value stored in
0f40: 20 75 2e 76 65 72 62 20 2a 2f 0a 23 64 65 66 69   u.verb */.#defi
0f50: 6e 65 20 53 42 53 56 41 4c 5f 53 54 52 20 20 20  ne SBSVAL_STR   
0f60: 20 20 30 78 30 30 30 32 20 20 20 20 20 20 2f 2a    0x0002      /*
0f70: 20 56 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   Value stored in
0f80: 20 75 2e 73 74 72 20 2a 2f 20 0a 23 64 65 66 69   u.str */ .#defi
0f90: 6e 65 20 53 42 53 56 41 4c 5f 44 59 4e 20 20 20  ne SBSVAL_DYN   
0fa0: 20 20 30 78 30 30 30 34 20 20 20 20 20 20 2f 2a    0x0004      /*
0fb0: 20 75 2e 73 74 72 2e 7a 20 69 73 20 64 79 6e 61   u.str.z is dyna
0fc0: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
0fd0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53  d */.#define SBS
0fe0: 56 41 4c 5f 45 58 45 43 20 20 20 20 30 78 30 30  VAL_EXEC    0x00
0ff0: 30 38 20 20 20 20 20 20 2f 2a 20 75 2e 73 74 72  08      /* u.str
1000: 2e 7a 20 69 73 20 61 20 73 63 72 69 70 74 20 2a  .z is a script *
1010: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  /../*.** An entr
1020: 79 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  y in the hash ta
1030: 62 6c 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  ble is an instan
1040: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
1050: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
1060: 20 73 74 72 75 63 74 20 53 62 73 48 61 73 68 45   struct SbsHashE
1070: 6e 74 72 79 20 53 62 73 48 61 73 68 45 6e 74 72  ntry SbsHashEntr
1080: 79 3b 0a 73 74 72 75 63 74 20 53 62 73 48 61 73  y;.struct SbsHas
1090: 68 45 6e 74 72 79 20 7b 0a 20 20 53 62 73 48 61  hEntry {.  SbsHa
10a0: 73 68 45 6e 74 72 79 20 2a 70 4e 65 78 74 3b 20  shEntry *pNext; 
10b0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72      /* Next entr
10c0: 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
10d0: 68 61 73 68 20 6f 6e 20 7a 4b 65 79 20 2a 2f 0a  hash on zKey */.
10e0: 20 20 53 62 53 56 61 6c 75 65 20 76 61 6c 3b 20    SbSValue val; 
10f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1100: 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69  e payload */.  i
1110: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
1120: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
1130: 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   of the key */. 
1140: 20 63 68 61 72 20 7a 4b 65 79 5b 30 5d 3b 20 20   char zKey[0];  
1150: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1160: 6b 65 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  key */.};../*.**
1170: 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 69 73   A hash table is
1180: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1190: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
11a0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
11b0: 64 65 66 20 73 74 72 75 63 74 20 53 62 73 48 61  def struct SbsHa
11c0: 73 68 54 61 62 20 53 62 73 48 61 73 68 54 61 62  shTab SbsHashTab
11d0: 3b 0a 73 74 72 75 63 74 20 53 62 73 48 61 73 68  ;.struct SbsHash
11e0: 54 61 62 20 7b 0a 20 20 53 62 73 48 61 73 68 45  Tab {.  SbsHashE
11f0: 6e 74 72 79 20 2a 61 48 61 73 68 5b 53 42 53 43  ntry *aHash[SBSC
1200: 4f 4e 46 49 47 5f 4e 48 41 53 48 5d 3b 20 20 2f  ONFIG_NHASH];  /
1210: 2a 20 54 68 65 20 68 61 73 68 20 74 61 62 6c 65  * The hash table
1220: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
1230: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1240: 20 53 75 62 73 63 72 69 70 74 20 69 6e 74 65 72   Subscript inter
1250: 70 72 65 74 65 72 0a 2a 2f 0a 73 74 72 75 63 74  preter.*/.struct
1260: 20 53 75 62 73 63 72 69 70 74 20 7b 0a 20 20 69   Subscript {.  i
1270: 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 20 20  nt nStack;      
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
12a0: 6e 74 72 69 65 73 20 6f 6e 20 73 74 61 63 6b 20  ntries on stack 
12b0: 2a 2f 0a 20 20 53 62 73 48 61 73 68 54 61 62 20  */.  SbsHashTab 
12c0: 73 79 6d 54 61 62 3b 20 20 20 20 20 20 20 20 20  symTab;         
12d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
12e0: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  ymbol table */. 
12f0: 20 63 68 61 72 20 7a 45 72 72 4d 73 67 5b 53 42   char zErrMsg[SB
1300: 53 43 4f 4e 46 49 47 5f 45 52 52 53 49 5a 45 5d  SCONFIG_ERRSIZE]
1310: 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20  ;   /* Space to 
1320: 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  write an error m
1330: 65 73 73 61 67 65 20 2a 2f 0a 20 20 53 62 53 56  essage */.  SbSV
1340: 61 6c 75 65 20 61 53 74 61 63 6b 5b 53 42 53 43  alue aStack[SBSC
1350: 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 5d 3b 20 2f  ONFIG_NSTACK]; /
1360: 2a 20 54 68 65 20 73 74 61 63 6b 20 2a 2f 0a 7d  * The stack */.}
1370: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  ;.../*.** Given 
1380: 61 6e 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  an input string 
1390: 7a 20 6f 66 20 6c 65 6e 67 74 68 20 6e 2c 20 69  z of length n, i
13a0: 64 65 6e 74 69 66 79 20 74 68 65 20 74 6f 6b 65  dentify the toke
13b0: 6e 20 74 68 61 74 0a 2a 2a 20 73 74 61 72 74 73  n that.** starts
13c0: 20 61 74 20 7a 5b 30 5d 2e 20 20 57 72 69 74 65   at z[0].  Write
13d0: 20 74 68 65 20 74 6f 6b 65 6e 20 74 79 70 65 20   the token type 
13e0: 69 6e 74 6f 20 2a 70 54 6f 6b 65 6e 54 79 70 65  into *pTokenType
13f0: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 74   and.** return t
1400: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
1410: 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69   token..*/.stati
1420: 63 20 69 6e 74 20 73 62 73 5f 6e 65 78 74 5f 74  c int sbs_next_t
1430: 6f 6b 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  oken(const char 
1440: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 2a  *z, int n, int *
1450: 70 54 6f 6b 65 6e 54 79 70 65 29 7b 0a 20 20 69  pTokenType){.  i
1460: 6e 74 20 63 3b 0a 20 20 69 66 28 20 6e 3c 3d 30  nt c;.  if( n<=0
1470: 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20   || z[0]==0 ){. 
1480: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
1490: 20 53 42 53 54 54 5f 45 4f 46 3b 0a 20 20 20 20   SBSTT_EOF;.    
14a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14b0: 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20  c = z[0];.  if( 
14c0: 69 73 73 70 61 63 65 28 63 29 20 29 7b 0a 20 20  isspace(c) ){.  
14d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 54    int i;.    *pT
14e0: 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54  okenType = SBSTT
14f0: 5f 57 48 49 54 45 53 50 41 43 45 3b 0a 20 20 20  _WHITESPACE;.   
1500: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26   for(i=1; i<n &&
1510: 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20   isspace(z[i]); 
1520: 69 2b 2b 29 7b 7d 0a 20 20 20 20 72 65 74 75 72  i++){}.    retur
1530: 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  n i;.  }.  if( c
1540: 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='#' ){.    int
1550: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
1560: 20 69 3c 6e 20 26 26 20 7a 5b 69 5d 20 26 26 20   i<n && z[i] && 
1570: 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 3b 20 69 2b  z[i-1]!='\n'; i+
1580: 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65 6e  +){}.    *pToken
1590: 54 79 70 65 20 3d 20 53 42 53 54 54 5f 57 48 49  Type = SBSTT_WHI
15a0: 54 45 53 50 41 43 45 3b 0a 20 20 20 20 72 65 74  TESPACE;.    ret
15b0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28  urn i;.  }.  if(
15c0: 20 63 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 69   c=='{' ){.    i
15d0: 6e 74 20 64 65 70 74 68 20 3d 20 31 3b 0a 20 20  nt depth = 1;.  
15e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
15f0: 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69  (i=1; i<n && z[i
1600: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
1610: 66 28 20 7a 5b 69 5d 3d 3d 27 7b 27 20 29 7b 0a  f( z[i]=='{' ){.
1620: 20 20 20 20 20 20 20 20 64 65 70 74 68 2b 2b 3b          depth++;
1630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1640: 20 7a 5b 69 5d 3d 3d 27 7d 27 20 29 7b 0a 20 20   z[i]=='}' ){.  
1650: 20 20 20 20 20 20 64 65 70 74 68 2d 2d 3b 0a 20        depth--;. 
1660: 20 20 20 20 20 20 20 69 66 28 20 64 65 70 74 68         if( depth
1670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1680: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
1690: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16b0: 20 20 20 69 66 28 20 64 65 70 74 68 20 29 7b 0a     if( depth ){.
16c0: 20 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70        *pTokenTyp
16d0: 65 20 3d 20 53 42 53 54 54 5f 49 4e 43 4f 4d 50  e = SBSTT_INCOMP
16e0: 4c 45 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LETE;.    }else{
16f0: 0a 20 20 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79  .      *pTokenTy
1700: 70 65 20 3d 20 53 42 53 54 54 5f 53 54 52 49 4e  pe = SBSTT_STRIN
1710: 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  G;.    }.    ret
1720: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28  urn i;.  }.  if(
1730: 20 63 3d 3d 27 2f 27 20 26 26 20 6e 3e 3d 32 20   c=='/' && n>=2 
1740: 26 26 20 69 73 61 6c 70 68 61 28 7a 5b 31 5d 29  && isalpha(z[1])
1750: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1760: 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 20     for(i=2; i<n 
1770: 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d  && (isalnum(z[i]
1780: 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 5f 27 29 3b  ) || z[i]=='_');
1790: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f   i++){}.    *pTo
17a0: 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f  kenType = SBSTT_
17b0: 4e 41 4d 45 3b 0a 20 20 20 20 72 65 74 75 72 6e  NAME;.    return
17c0: 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   i;.  }.  if( is
17d0: 61 6c 70 68 61 28 63 29 20 29 7b 0a 20 20 20 20  alpha(c) ){.    
17e0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
17f0: 3d 31 3b 20 69 3c 6e 20 26 26 20 28 69 73 61 6c  =1; i<n && (isal
1800: 6e 75 6d 28 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69  num(z[i]) || z[i
1810: 5d 3d 3d 27 5f 27 29 3b 20 69 2b 2b 29 7b 7d 0a  ]=='_'); i++){}.
1820: 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20      *pTokenType 
1830: 3d 20 53 42 53 54 54 5f 56 45 52 42 3b 0a 20 20  = SBSTT_VERB;.  
1840: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a    return i;.  }.
1850: 20 20 69 66 28 20 69 73 64 69 67 69 74 28 63 29    if( isdigit(c)
1860: 20 7c 7c 20 28 28 63 3d 3d 27 2d 27 20 7c 7c 20   || ((c=='-' || 
1870: 63 3d 3d 27 2b 27 29 20 26 26 20 6e 3e 3d 32 20  c=='+') && n>=2 
1880: 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29  && isdigit(z[1])
1890: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
18a0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
18b0: 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 69 5d   && isdigit(z[i]
18c0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70  ); i++){}.    *p
18d0: 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54  TokenType = SBST
18e0: 54 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 72  T_INTEGER;.    r
18f0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 2a  eturn i;.  }.  *
1900: 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53  pTokenType = SBS
1910: 54 54 5f 55 4e 4b 4e 4f 57 4e 3b 0a 20 20 72 65  TT_UNKNOWN;.  re
1920: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 1;.}.../*.*
1930: 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 6d 65  * Release any me
1940: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  mory allocated b
1950: 79 20 61 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  y a value..*/.st
1960: 61 74 69 63 20 76 6f 69 64 20 73 62 73 5f 76 61  atic void sbs_va
1970: 6c 75 65 5f 72 65 73 65 74 28 53 62 53 56 61 6c  lue_reset(SbSVal
1980: 75 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ue *p){.  if( p-
1990: 3e 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f  >flags & SBSVAL_
19a0: 44 59 4e 20 29 7b 0a 20 20 20 20 66 72 65 65 28  DYN ){.    free(
19b0: 70 2d 3e 75 2e 73 74 72 2e 7a 29 3b 0a 20 20 20  p->u.str.z);.   
19c0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 53 42 53 56   p->flags = SBSV
19d0: 41 4c 5f 53 54 52 3b 0a 20 20 20 20 70 2d 3e 75  AL_STR;.    p->u
19e0: 2e 73 74 72 2e 7a 20 3d 20 22 22 3b 0a 20 20 20  .str.z = "";.   
19f0: 20 70 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 20 3d   p->u.str.size =
1a00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1a10: 20 43 6f 6d 70 75 74 65 20 61 20 68 61 73 68 20   Compute a hash 
1a20: 6f 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  on a string..*/.
1a30: 73 74 61 74 69 63 20 69 6e 74 20 73 62 73 5f 68  static int sbs_h
1a40: 61 73 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ash(const char *
1a50: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
1a60: 20 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b   h = 0;.  int i;
1a70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
1a80: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 20 5e 3d 20   i++){.    h ^= 
1a90: 28 68 3c 3c 31 29 20 7c 20 7a 5b 69 5d 3b 0a 20  (h<<1) | z[i];. 
1aa0: 20 7d 0a 20 20 68 20 26 3d 20 30 78 37 66 66 66   }.  h &= 0x7fff
1ab0: 66 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 68 20  fff;.  return h 
1ac0: 25 20 53 42 53 43 4f 4e 46 49 47 5f 4e 48 41 53  % SBSCONFIG_NHAS
1ad0: 48 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  H;.}../*.** Look
1ae0: 20 75 70 20 61 20 76 61 6c 75 65 20 69 6e 20 74   up a value in t
1af0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
1b00: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1b10: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a   to the value..*
1b20: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1b30: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
1b40: 74 61 74 69 63 20 63 6f 6e 73 74 20 53 62 53 56  tatic const SbSV
1b50: 61 6c 75 65 20 2a 73 62 73 5f 66 65 74 63 68 28  alue *sbs_fetch(
1b60: 0a 20 20 53 62 73 48 61 73 68 54 61 62 20 2a 70  .  SbsHashTab *p
1b70: 48 61 73 68 2c 20 0a 20 20 63 6f 6e 73 74 20 63  Hash, .  const c
1b80: 68 61 72 20 2a 7a 4b 65 79 2c 20 0a 20 20 69 6e  har *zKey, .  in
1b90: 74 20 6e 4b 65 79 0a 29 7b 0a 20 20 69 6e 74 20  t nKey.){.  int 
1ba0: 68 3b 0a 20 20 53 62 73 48 61 73 68 45 6e 74 72  h;.  SbsHashEntr
1bb0: 79 20 2a 70 3b 0a 0a 20 20 69 66 28 20 6e 4b 65  y *p;..  if( nKe
1bc0: 79 3c 30 20 29 20 6e 4b 65 79 20 3d 20 73 74 72  y<0 ) nKey = str
1bd0: 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 68 20 3d  len(zKey);.  h =
1be0: 20 73 62 73 5f 68 61 73 68 28 7a 4b 65 79 2c 20   sbs_hash(zKey, 
1bf0: 6e 4b 65 79 29 3b 0a 20 20 66 6f 72 28 70 20 3d  nKey);.  for(p =
1c00: 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b 68 5d   pHash->aHash[h]
1c10: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1c20: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4b 65  {.    if( p->nKe
1c30: 79 3d 3d 6e 4b 65 79 20 26 26 20 6d 65 6d 63 6d  y==nKey && memcm
1c40: 70 28 70 2d 3e 7a 4b 65 79 2c 7a 4b 65 79 2c 6e  p(p->zKey,zKey,n
1c50: 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Key)==0 ){.     
1c60: 20 72 65 74 75 72 6e 20 26 70 2d 3e 76 61 6c 3b   return &p->val;
1c70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1c90: 53 74 6f 72 65 20 61 20 76 61 6c 75 65 20 69 6e  Store a value in
1ca0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1cb0: 20 20 4f 76 65 72 77 72 69 74 65 20 61 6e 79 20    Overwrite any 
1cc0: 70 72 69 6f 72 20 76 61 6c 75 65 20 73 74 6f 72  prior value stor
1cd0: 65 64 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20  ed.** under the 
1ce0: 73 61 6d 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  same name..**.**
1cf0: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   If the value in
1d00: 20 74 68 65 20 34 74 68 20 61 72 67 75 6d 65 6e   the 4th argumen
1d10: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
1d20: 73 65 74 20 6f 72 20 66 72 65 65 64 2c 0a 2a 2a  set or freed,.**
1d30: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
1d40: 77 69 6c 6c 20 74 61 6b 65 20 6f 76 65 72 20 72  will take over r
1d50: 65 73 70 6f 6e 73 69 62 69 6c 69 69 74 79 20 66  esponsibiliity f
1d60: 6f 72 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2f 0a  or doing so..*/.
1d70: 73 74 61 74 69 63 20 69 6e 74 20 73 62 73 5f 73  static int sbs_s
1d80: 74 6f 72 65 28 0a 20 20 53 62 73 48 61 73 68 54  tore(.  SbsHashT
1d90: 61 62 20 2a 70 48 61 73 68 2c 20 20 20 20 20 20  ab *pHash,      
1da0: 20 2f 2a 20 49 6e 73 65 72 74 20 69 6e 74 6f 20   /* Insert into 
1db0: 74 68 69 73 20 68 61 73 68 20 74 61 62 6c 65 20  this hash table 
1dc0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1dd0: 2a 7a 4b 65 79 2c 20 20 20 20 20 20 20 20 2f 2a  *zKey,        /*
1de0: 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e   The key */.  in
1df0: 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1e00: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1e10: 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  f the key */.  c
1e20: 6f 6e 73 74 20 53 62 53 56 61 6c 75 65 20 2a 70  onst SbSValue *p
1e30: 56 61 6c 75 65 20 20 20 2f 2a 20 54 68 65 20 76  Value   /* The v
1e40: 61 6c 75 65 20 74 6f 20 62 65 20 73 74 6f 72 65  alue to be store
1e50: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 68 3b  d */.){.  int h;
1e60: 0a 20 20 53 62 73 48 61 73 68 45 6e 74 72 79 20  .  SbsHashEntry 
1e70: 2a 70 2c 20 2a 70 4e 65 77 3b 0a 0a 20 20 69 66  *p, *pNew;..  if
1e80: 28 20 6e 4b 65 79 3c 30 20 29 20 6e 4b 65 79 20  ( nKey<0 ) nKey 
1e90: 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a  = strlen(zKey);.
1ea0: 20 20 68 20 3d 20 73 62 73 5f 68 61 73 68 28 7a    h = sbs_hash(z
1eb0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 66 6f  Key, nKey);.  fo
1ec0: 72 28 70 20 3d 20 70 48 61 73 68 2d 3e 61 48 61  r(p = pHash->aHa
1ed0: 73 68 5b 68 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70  sh[h]; p; p=p->p
1ee0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1ef0: 2d 3e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 26 26 20  ->nKey==nKey && 
1f00: 6d 65 6d 63 6d 70 28 70 2d 3e 7a 4b 65 79 2c 7a  memcmp(p->zKey,z
1f10: 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a  Key,nKey)==0 ){.
1f20: 20 20 20 20 20 20 73 62 73 5f 76 61 6c 75 65 5f        sbs_value_
1f30: 72 65 73 65 74 28 26 70 2d 3e 76 61 6c 29 3b 0a  reset(&p->val);.
1f40: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d        memcpy(&p-
1f50: 3e 76 61 6c 2c 20 70 56 61 6c 75 65 2c 20 73 69  >val, pValue, si
1f60: 7a 65 6f 66 28 70 2d 3e 76 61 6c 29 29 3b 0a 20  zeof(p->val));. 
1f70: 20 20 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f       return SBS_
1f80: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1f90: 70 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  pNew = malloc( s
1fa0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e  izeof(*pNew) + n
1fb0: 4b 65 79 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  Key );.  if( pNe
1fc0: 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
1fd0: 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  Key = nKey;.    
1fe0: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4b 65  memcpy(pNew->zKe
1ff0: 79 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2b 31 29  y, zKey, nKey+1)
2000: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e  ;.    memcpy(&pN
2010: 65 77 2d 3e 76 61 6c 2c 20 70 56 61 6c 75 65 2c  ew->val, pValue,
2020: 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 76 61   sizeof(pNew->va
2030: 6c 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  l));.    pNew->p
2040: 4e 65 78 74 20 3d 20 70 48 61 73 68 2d 3e 61 48  Next = pHash->aH
2050: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 48 61 73  ash[h];.    pHas
2060: 68 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 4e  h->aHash[h] = pN
2070: 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
2080: 42 53 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  BS_OK;.  }.  ret
2090: 75 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 7d  urn SBS_ERROR;.}
20a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20  ../*.** Reset a 
20b0: 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  hash table..*/.s
20c0: 74 61 74 69 63 20 76 6f 69 64 20 73 62 73 5f 68  tatic void sbs_h
20d0: 61 73 68 5f 72 65 73 65 74 28 53 62 73 48 61 73  ash_reset(SbsHas
20e0: 68 54 61 62 20 2a 70 48 61 73 68 29 7b 0a 20 20  hTab *pHash){.  
20f0: 69 6e 74 20 69 3b 0a 20 20 53 62 73 48 61 73 68  int i;.  SbsHash
2100: 45 6e 74 72 79 20 2a 70 2c 20 2a 70 4e 65 78 74  Entry *p, *pNext
2110: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53  ;.  for(i=0; i<S
2120: 42 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 3b 20  BSCONFIG_NHASH; 
2130: 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d  i++){.    for(p=
2140: 70 48 61 73 68 2d 3e 61 48 61 73 68 5b 69 5d 3b  pHash->aHash[i];
2150: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
2160: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
2170: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 62 73 5f  Next;.      sbs_
2180: 76 61 6c 75 65 5f 72 65 73 65 74 28 26 70 2d 3e  value_reset(&p->
2190: 76 61 6c 29 3b 0a 20 20 20 20 20 20 66 72 65 65  val);.      free
21a0: 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (p);.    }.  }. 
21b0: 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30   memset(pHash, 0
21c0: 2c 20 73 69 7a 65 6f 66 28 2a 70 48 61 73 68 29  , sizeof(*pHash)
21d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68  );.}../*.** Push
21e0: 20 61 20 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68   a value onto th
21f0: 65 20 73 74 61 63 6b 20 6f 66 20 61 6e 20 69 6e  e stack of an in
2200: 74 65 72 70 72 65 74 65 72 0a 2a 2f 0a 73 74 61  terpreter.*/.sta
2210: 74 69 63 20 69 6e 74 20 73 62 73 5f 70 75 73 68  tic int sbs_push
2220: 28 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 53  (Subscript *p, S
2230: 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  bSValue *pVal){.
2240: 20 20 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e    if( p->nStack>
2250: 3d 53 42 53 43 4f 4e 46 49 47 5f 4e 53 54 41 43  =SBSCONFIG_NSTAC
2260: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2270: 5f 73 6e 70 72 69 6e 74 66 28 53 42 53 43 4f 4e  _snprintf(SBSCON
2280: 46 49 47 5f 45 52 52 53 49 5a 45 2c 20 70 2d 3e  FIG_ERRSIZE, p->
2290: 7a 45 72 72 4d 73 67 2c 20 22 73 74 61 63 6b 20  zErrMsg, "stack 
22a0: 6f 76 65 72 66 6c 6f 77 22 29 3b 0a 20 20 20 20  overflow");.    
22b0: 72 65 74 75 72 6e 20 53 42 53 5f 45 52 52 4f 52  return SBS_ERROR
22c0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 53 74 61 63  ;.  }.  p->aStac
22d0: 6b 5b 70 2d 3e 6e 53 74 61 63 6b 2b 2b 5d 20 3d  k[p->nStack++] =
22e0: 20 2a 70 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e   *pVal;.  return
22f0: 20 53 42 53 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   SBS_OK;.}../*.*
2300: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
2310: 75 62 73 63 72 69 70 74 20 69 6e 74 65 72 70 72  ubscript interpr
2320: 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61 20  eter.  Return a 
2330: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2340: 2a 20 6e 65 77 20 69 6e 74 65 72 70 72 65 74 65  * new interprete
2350: 72 2c 20 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c  r, or return NUL
2360: 4c 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  L if malloc fail
2370: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 62  s..*/.struct Sub
2380: 73 63 72 69 70 74 20 2a 53 62 53 5f 43 72 65 61  script *SbS_Crea
2390: 74 65 28 76 6f 69 64 29 7b 0a 20 20 53 75 62 73  te(void){.  Subs
23a0: 63 72 69 70 74 20 2a 70 3b 0a 20 20 70 20 3d 20  cript *p;.  p = 
23b0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
23c0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  p) );.  if( p ){
23d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  .    memset(p, 0
23e0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
23f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2400: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
2410: 61 6e 20 73 75 62 73 63 72 69 70 74 20 69 6e 74  an subscript int
2420: 65 72 70 72 65 74 65 72 0a 2a 2f 0a 76 6f 69 64  erpreter.*/.void
2430: 20 53 62 53 5f 44 65 73 74 72 6f 79 28 73 74 72   SbS_Destroy(str
2440: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70  uct Subscript *p
2450: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 62  ){.  int i;.  sb
2460: 73 5f 68 61 73 68 5f 72 65 73 65 74 28 26 70 2d  s_hash_reset(&p-
2470: 3e 73 79 6d 54 61 62 29 3b 0a 20 20 66 6f 72 28  >symTab);.  for(
2480: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 74 61 63 6b  i=0; i<p->nStack
2490: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 62 73 5f  ; i++){.    sbs_
24a0: 76 61 6c 75 65 5f 72 65 73 65 74 28 26 70 2d 3e  value_reset(&p->
24b0: 61 53 74 61 63 6b 5b 69 5d 29 3b 0a 20 20 7d 0a  aStack[i]);.  }.
24c0: 20 20 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a    free(p);.}../*
24d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 65 72 72 6f  .** Set the erro
24e0: 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 61 6e  r message for an
24f0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 56   interpreter.  V
2500: 65 72 62 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  erb implementati
2510: 6f 6e 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  ons.** use this 
2520: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 74 68 65  routine when the
2530: 79 20 65 6e 63 6f 75 6e 74 65 72 20 61 6e 20 65  y encounter an e
2540: 72 72 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 53 62  rror..*/.void Sb
2550: 53 5f 53 65 74 45 72 72 6f 72 4d 65 73 73 61 67  S_SetErrorMessag
2560: 65 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69  e(struct Subscri
2570: 70 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  pt *p, const cha
2580: 72 20 2a 7a 45 72 72 29 7b 0a 20 20 69 6e 74 20  r *zErr){.  int 
2590: 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 28 7a 45  nErr = strlen(zE
25a0: 72 72 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3e  rr);.  if( nErr>
25b0: 73 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 72 4d 73  sizeof(p->zErrMs
25c0: 67 29 2d 31 20 29 7b 0a 20 20 20 20 6e 45 72 72  g)-1 ){.    nErr
25d0: 20 3d 20 73 69 7a 65 6f 66 28 70 2d 3e 7a 45 72   = sizeof(p->zEr
25e0: 72 4d 73 67 29 2d 31 3b 0a 20 20 7d 0a 20 20 6d  rMsg)-1;.  }.  m
25f0: 65 6d 63 70 79 28 70 2d 3e 7a 45 72 72 4d 73 67  emcpy(p->zErrMsg
2600: 2c 20 7a 45 72 72 2c 20 6e 45 72 72 29 3b 0a 20  , zErr, nErr);. 
2610: 20 70 2d 3e 7a 45 72 72 4d 73 67 5b 6e 45 72 72   p->zErrMsg[nErr
2620: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
2630: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2640: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
2650: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  error message fo
2660: 72 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70 72  r the.** interpr
2670: 65 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  eter..*/.const c
2680: 68 61 72 20 2a 53 62 53 5f 47 65 74 45 72 72 6f  har *SbS_GetErro
2690: 72 4d 65 73 73 61 67 65 28 73 74 72 75 63 74 20  rMessage(struct 
26a0: 53 75 62 73 63 72 69 70 74 20 2a 70 29 7b 0a 20  Subscript *p){. 
26b0: 20 72 65 74 75 72 6e 20 70 2d 3e 7a 45 72 72 4d   return p->zErrM
26c0: 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  sg;.}../*.** Add
26d0: 20 61 20 6e 65 77 20 76 65 72 62 20 74 68 65 20   a new verb the 
26e0: 67 69 76 65 6e 20 69 6e 74 65 72 70 72 65 74 65  given interprete
26f0: 72 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 41 64 64  r.*/.int SbS_Add
2700: 56 65 72 62 28 0a 20 20 73 74 72 75 63 74 20 53  Verb(.  struct S
2710: 75 62 73 63 72 69 70 74 20 2a 70 2c 0a 20 20 63  ubscript *p,.  c
2720: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 65 72 62  onst char *zVerb
2730: 2c 0a 20 20 69 6e 74 20 28 2a 78 56 65 72 62 29  ,.  int (*xVerb)
2740: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70  (struct Subscrip
2750: 74 2a 2c 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  t*,void*),.  voi
2760: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 53 62 53  d *pArg.){.  SbS
2770: 56 61 6c 75 65 20 76 3b 0a 20 20 76 2e 66 6c 61  Value v;.  v.fla
2780: 67 73 20 3d 20 53 42 53 56 41 4c 5f 56 45 52 42  gs = SBSVAL_VERB
2790: 3b 0a 20 20 76 2e 75 2e 76 65 72 62 2e 78 56 65  ;.  v.u.verb.xVe
27a0: 72 62 20 3d 20 78 56 65 72 62 3b 0a 20 20 76 2e  rb = xVerb;.  v.
27b0: 75 2e 76 65 72 62 2e 70 41 72 67 20 3d 20 70 41  u.verb.pArg = pA
27c0: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 73 62 73  rg;.  return sbs
27d0: 5f 73 74 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61  _store(&p->symTa
27e0: 62 2c 20 7a 56 65 72 62 2c 20 2d 31 2c 20 26 76  b, zVerb, -1, &v
27f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72  );.}../*.** Stor
2800: 65 20 61 20 76 61 6c 75 65 20 69 6e 20 61 6e 20  e a value in an 
2810: 69 6e 74 65 72 70 72 65 74 65 72 20 76 61 72 69  interpreter vari
2820: 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53  able..*/.int SbS
2830: 5f 53 74 6f 72 65 28 0a 20 20 73 74 72 75 63 74  _Store(.  struct
2840: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 20   Subscript *p,  
2850: 20 2f 2a 20 53 74 6f 72 65 20 69 6e 74 6f 20 74   /* Store into t
2860: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20  his interpreter 
2870: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2880: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  *zName,     /* N
2890: 61 6d 65 20 6f 66 20 74 68 65 20 76 61 72 69 61  ame of the varia
28a0: 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ble */.  const c
28b0: 68 61 72 20 2a 7a 56 61 6c 75 65 2c 20 20 20 20  har *zValue,    
28c0: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20  /* Value of the 
28d0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
28e0: 74 20 6d 61 6b 65 43 6f 70 79 20 20 20 20 20 20  t makeCopy      
28f0: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2900: 20 69 6e 74 65 72 70 72 65 74 65 72 20 6d 61 6b   interpreter mak
2910: 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  es its own copy 
2920: 2a 2f 0a 29 7b 0a 20 20 53 62 53 56 61 6c 75 65  */.){.  SbSValue
2930: 20 76 3b 0a 20 20 76 2e 66 6c 61 67 73 20 3d 20   v;.  v.flags = 
2940: 53 42 53 56 41 4c 5f 53 54 52 3b 0a 20 20 76 2e  SBSVAL_STR;.  v.
2950: 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20 73 74 72  u.str.size = str
2960: 6c 65 6e 28 7a 56 61 6c 75 65 29 3b 0a 20 20 69  len(zValue);.  i
2970: 66 28 20 6d 61 6b 65 43 6f 70 79 20 29 7b 0a 20  f( makeCopy ){. 
2980: 20 20 20 76 2e 75 2e 73 74 72 2e 7a 20 3d 20 6d     v.u.str.z = m
2990: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 56 61  printf("%s", zVa
29a0: 6c 75 65 29 3b 0a 20 20 20 20 76 2e 66 6c 61 67  lue);.    v.flag
29b0: 73 20 7c 3d 20 53 42 53 56 41 4c 5f 44 59 4e 3b  s |= SBSVAL_DYN;
29c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2e  .  }else{.    v.
29d0: 75 2e 73 74 72 2e 7a 20 3d 20 7a 56 61 6c 75 65  u.str.z = zValue
29e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
29f0: 62 73 5f 73 74 6f 72 65 28 26 70 2d 3e 73 79 6d  bs_store(&p->sym
2a00: 54 61 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  Tab, zName, -1, 
2a10: 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  &v);.}../*.** Pu
2a20: 73 68 20 61 20 73 74 72 69 6e 67 20 76 61 6c 75  sh a string valu
2a30: 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  e onto the stack
2a40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 34  ..**.** If the 4
2a50: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
2a60: 30 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69  0, then the stri
2a70: 6e 67 20 69 73 20 73 74 61 74 69 63 2e 0a 2a 2a  ng is static..**
2a80: 20 49 66 20 74 68 65 20 34 74 68 20 70 61 72 61   If the 4th para
2a90: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
2aa0: 6f 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e  o then the strin
2ab0: 67 20 77 61 73 20 6f 62 74 61 69 6e 65 64 0a 2a  g was obtained.*
2ac0: 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  * from malloc an
2ad0: 64 20 53 75 62 73 63 72 69 70 74 20 77 69 6c 6c  d Subscript will
2ae0: 20 74 61 6b 65 20 72 65 73 70 6f 6e 73 69 62 69   take responsibi
2af0: 6c 69 74 79 20 66 6f 72 20 66 72 65 65 69 6e 67  lity for freeing
2b00: 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  .** it..**.** Re
2b10: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
2b20: 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  s and non-zero i
2b30: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  f there is an er
2b40: 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f  ror..*/.int SbS_
2b50: 50 75 73 68 28 0a 20 20 73 74 72 75 63 74 20 53  Push(.  struct S
2b60: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 20 2f 2a  ubscript *p,  /*
2b70: 20 50 75 73 68 20 6f 6e 74 6f 20 74 68 69 73 20   Push onto this 
2b80: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
2b90: 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
2ba0: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
2bb0: 20 76 61 6c 75 65 20 74 6f 20 70 75 73 68 20 2a   value to push *
2bc0: 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
2bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
2be0: 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e  gth of the strin
2bf0: 67 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 69 6e  g, or -1 */.  in
2c00: 74 20 64 79 6e 20 20 20 20 20 20 20 20 20 20 20  t dyn           
2c10: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2c20: 7a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  z was obtained f
2c30: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 29 7b  rom malloc */.){
2c40: 0a 20 20 53 62 53 56 61 6c 75 65 20 76 3b 0a 20  .  SbSValue v;. 
2c50: 20 76 2e 66 6c 61 67 73 20 3d 20 53 42 53 56 41   v.flags = SBSVA
2c60: 4c 5f 53 54 52 3b 0a 20 20 69 66 28 20 64 79 6e  L_STR;.  if( dyn
2c70: 20 29 7b 0a 20 20 20 20 76 2e 66 6c 61 67 73 20   ){.    v.flags 
2c80: 7c 3d 20 53 42 53 56 41 4c 5f 44 59 4e 3b 0a 20  |= SBSVAL_DYN;. 
2c90: 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e   }.  if( n<0 ) n
2ca0: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
2cb0: 76 2e 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20 6e  v.u.str.size = n
2cc0: 3b 0a 20 20 76 2e 75 2e 73 74 72 2e 7a 20 3d 20  ;.  v.u.str.z = 
2cd0: 7a 3b 0a 20 20 72 65 74 75 72 6e 20 73 62 73 5f  z;.  return sbs_
2ce0: 70 75 73 68 28 70 2c 20 26 76 29 3b 0a 7d 0a 0a  push(p, &v);.}..
2cf0: 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 6e 20 69 6e  /*.** Push an in
2d00: 74 65 67 65 72 20 76 61 6c 75 65 20 6f 6e 74 6f  teger value onto
2d10: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
2d20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2d30: 65 61 6c 6c 79 20 6a 75 73 74 20 63 6f 6e 76 65  eally just conve
2d40: 72 74 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  rts the integer 
2d50: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 0a 2a 2a  into a string.**
2d60: 20 74 68 65 6e 20 63 61 6c 6c 73 20 53 62 53 5f   then calls SbS_
2d70: 50 75 73 68 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53  Push..*/.int SbS
2d80: 5f 50 75 73 68 49 6e 74 28 73 74 72 75 63 74 20  _PushInt(struct 
2d90: 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 69 6e  Subscript *p, in
2da0: 74 20 69 56 61 6c 29 7b 0a 20 20 69 66 28 20 69  t iVal){.  if( i
2db0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Val==0 ){.    re
2dc0: 74 75 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c  turn SbS_Push(p,
2dd0: 20 22 30 22 2c 20 31 2c 20 30 29 3b 0a 20 20 7d   "0", 1, 0);.  }
2de0: 65 6c 73 65 20 69 66 28 20 69 56 61 6c 3d 3d 31  else if( iVal==1
2df0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2e00: 62 53 5f 50 75 73 68 28 70 2c 20 22 31 22 2c 20  bS_Push(p, "1", 
2e10: 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1, 0);.  }else{.
2e20: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
2e30: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 68 61 72   int n;.    char
2e40: 20 7a 56 61 6c 5b 35 30 5d 3b 0a 20 20 20 20 73   zVal[50];.    s
2e50: 70 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64  printf(zVal, "%d
2e60: 22 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 6e 20  ", iVal);.    n 
2e70: 3d 20 73 74 72 6c 65 6e 28 7a 56 61 6c 29 3b 0a  = strlen(zVal);.
2e80: 20 20 20 20 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20      z = malloc( 
2e90: 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  n+1 );.    if( z
2ea0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79   ){.      strcpy
2eb0: 28 7a 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  (z, zVal);.     
2ec0: 20 72 65 74 75 72 6e 20 53 62 53 5f 50 75 73 68   return SbS_Push
2ed0: 28 70 2c 20 7a 2c 20 6e 2c 20 31 29 3b 0a 20 20  (p, z, n, 1);.  
2ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2ef0: 65 74 75 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b  eturn SBS_ERROR;
2f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2f10: 0a 2a 2a 20 50 6f 70 20 61 6e 64 20 64 65 73 74  .** Pop and dest
2f20: 72 6f 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  roy zero or more
2f30: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65   values from the
2f40: 20 73 74 61 63 6b 2e 0a 2a 2a 20 52 65 74 75 72   stack..** Retur
2f50: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2f60: 76 61 6c 75 65 73 20 72 65 6d 61 69 6e 69 6e 67  values remaining
2f70: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 61 66   on the stack af
2f80: 74 65 72 0a 2a 2a 20 74 68 65 20 70 6f 70 73 20  ter.** the pops 
2f90: 6f 63 63 75 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62  occur..*/.int Sb
2fa0: 53 5f 50 6f 70 28 73 74 72 75 63 74 20 53 75 62  S_Pop(struct Sub
2fb0: 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 4e  script *p, int N
2fc0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20  ){.  while( N>0 
2fd0: 26 26 20 70 2d 3e 6e 53 74 61 63 6b 3e 30 20 29  && p->nStack>0 )
2fe0: 7b 0a 20 20 20 20 70 2d 3e 6e 53 74 61 63 6b 2d  {.    p->nStack-
2ff0: 2d 3b 0a 20 20 20 20 73 62 73 5f 76 61 6c 75 65  -;.    sbs_value
3000: 5f 72 65 73 65 74 28 26 70 2d 3e 61 53 74 61 63  _reset(&p->aStac
3010: 6b 5b 70 2d 3e 6e 53 74 61 63 6b 5d 29 3b 0a 20  k[p->nStack]);. 
3020: 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65     N--;.  }.  re
3030: 74 75 72 6e 20 70 2d 3e 6e 53 74 61 63 6b 3b 0a  turn p->nStack;.
3040: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3050: 74 68 65 20 4e 2d 74 68 20 65 6c 65 6d 65 6e 74  the N-th element
3060: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
3070: 30 20 69 73 20 74 68 65 20 74 6f 70 20 6f 66 20  0 is the top of 
3080: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 31 20  the stack..** 1 
3090: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  is the first ele
30a0: 6d 65 6e 74 20 64 6f 77 6e 2e 20 20 32 20 69 73  ment down.  2 is
30b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
30c0: 65 6e 74 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  ent.  And so for
30d0: 74 68 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  th..** Return NU
30e0: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
30f0: 6f 20 4e 2d 74 68 20 65 6c 65 6d 65 6e 74 2e 0a  o N-th element..
3100: 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
3110: 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 6f 6e  r returned is on
3120: 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ly valid until t
3130: 68 65 20 76 61 6c 75 65 20 69 73 20 70 6f 70 70  he value is popp
3140: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  ed.** from the s
3150: 74 61 63 6b 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tack..*/.const c
3160: 68 61 72 20 2a 53 62 53 5f 53 74 61 63 6b 56 61  har *SbS_StackVa
3170: 6c 75 65 28 73 74 72 75 63 74 20 53 75 62 73 63  lue(struct Subsc
3180: 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 4e 2c 20  ript *p, int N, 
3190: 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 20 20 53  int *pSize){.  S
31a0: 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  bSValue *pVal;. 
31b0: 20 69 66 28 20 4e 3c 30 20 7c 7c 20 4e 3e 3d 70   if( N<0 || N>=p
31c0: 2d 3e 6e 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  ->nStack ){.    
31d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
31e0: 70 56 61 6c 20 3d 20 26 70 2d 3e 61 53 74 61 63  pVal = &p->aStac
31f0: 6b 5b 70 2d 3e 6e 53 74 61 63 6b 2d 4e 2d 31 5d  k[p->nStack-N-1]
3200: 3b 0a 20 20 69 66 28 20 28 70 56 61 6c 2d 3e 66  ;.  if( (pVal->f
3210: 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f 53 54  lags & SBSVAL_ST
3220: 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)==0 ){.    ret
3230: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 53  urn 0;.  }.  *pS
3240: 69 7a 65 20 3d 20 70 56 61 6c 2d 3e 75 2e 73 74  ize = pVal->u.st
3250: 72 2e 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  r.size;.  return
3260: 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a 3b 0a   pVal->u.str.z;.
3270: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 6f 6e 76 65  }../*.** A conve
3280: 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 66  nience routine f
3290: 6f 72 20 65 78 74 72 61 63 74 69 6e 67 20 61 6e  or extracting an
32a0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
32b0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
32c0: 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 53 74 61  ..*/.int SbS_Sta
32d0: 63 6b 56 61 6c 75 65 49 6e 74 28 73 74 72 75 63  ckValueInt(struc
32e0: 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20  t Subscript *p, 
32f0: 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6e 2c  int N){.  int n,
3300: 20 76 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20   v;.  int isNeg 
3310: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
3320: 72 20 2a 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b  r *z = SbS_Stack
3330: 56 61 6c 75 65 28 70 2c 20 4e 2c 20 26 6e 29 3b  Value(p, N, &n);
3340: 0a 20 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  v = 0;.  if( 
3350: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  n==0 ) return 0;
3360: 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27  .  if( z[0]=='-'
3370: 20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20 3d 20   ){.    isNeg = 
3380: 31 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  1;.    z++;.    
3390: 6e 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n--;.  }else if(
33a0: 20 7a 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20   z[0]=='+' ){.  
33b0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a    z++;.    n--;.
33c0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30    }.  while( n>0
33d0: 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 30 5d   && isdigit(z[0]
33e0: 29 20 29 7b 0a 20 20 20 20 76 20 3d 20 76 2a 31  ) ){.    v = v*1
33f0: 30 20 2b 20 7a 5b 30 5d 20 2d 20 27 30 27 3b 0a  0 + z[0] - '0';.
3400: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 2d 2d      z++;.    n--
3410: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 65  ;.  }.  if( isNe
3420: 67 20 29 7b 0a 20 20 20 20 76 20 3d 20 2d 76 3b  g ){.    v = -v;
3430: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
3440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
3450: 76 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ve the value of 
3460: 61 20 76 61 72 69 61 62 6c 65 20 66 72 6f 6d 20  a variable from 
3470: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
3480: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c    Return.** NULL
3490: 20 69 66 20 6e 6f 20 73 75 63 68 20 76 61 72 69   if no such vari
34a0: 61 62 6c 65 20 69 73 20 64 65 66 69 6e 65 64 2e  able is defined.
34b0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74    .**.** The ret
34c0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
34d0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
34e0: 28 70 72 6f 62 61 62 6c 79 20 6e 6f 74 29 20 7a  (probably not) z
34f0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
3500: 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  ** The string ma
3510: 79 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  y be deallocated
3520: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
3530: 6e 79 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 20  nything is done 
3540: 74 6f 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 70  to.** the interp
3550: 72 65 74 65 72 2e 20 20 4d 61 6b 65 20 61 20 63  reter.  Make a c
3560: 6f 70 79 20 69 66 20 79 6f 75 20 6e 65 65 64 20  opy if you need 
3570: 69 74 20 74 6f 20 70 65 72 73 69 73 74 2e 0a 2a  it to persist..*
3580: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 62  /.const char *Sb
3590: 53 5f 46 65 74 63 68 28 0a 20 20 73 74 72 75 63  S_Fetch(.  struc
35a0: 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20  t Subscript *p, 
35b0: 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72    /* The interpr
35c0: 65 74 65 72 20 77 65 20 61 72 65 20 69 6e 74 65  eter we are inte
35d0: 72 72 6f 67 61 74 69 6e 67 20 2a 2f 0a 20 20 63  rrogating */.  c
35e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c  onst char *zKey,
35f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3600: 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 2e  of the variable.
3610: 20 20 43 61 73 65 20 73 65 6e 73 69 74 69 76 65    Case sensitive
3620: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4c 65 6e 67   */.  int *pLeng
3630: 74 68 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  th             /
3640: 2a 20 57 72 69 74 65 20 74 68 65 20 6c 65 6e 67  * Write the leng
3650: 74 68 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  th here */.){.  
3660: 63 6f 6e 73 74 20 53 62 53 56 61 6c 75 65 20 2a  const SbSValue *
3670: 70 56 61 6c 3b 0a 0a 20 20 70 56 61 6c 20 3d 20  pVal;..  pVal = 
3680: 73 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79  sbs_fetch(&p->sy
3690: 6d 54 61 62 2c 20 7a 4b 65 79 2c 20 2d 31 29 3b  mTab, zKey, -1);
36a0: 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 7c  .  if( pVal==0 |
36b0: 7c 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26  | (pVal->flags &
36c0: 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d 30 20   SBSVAL_STR)==0 
36d0: 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 67 74 68 20  ){.    *pLength 
36e0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
36f0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
3700: 2a 70 4c 65 6e 67 74 68 20 3d 20 70 56 61 6c 2d  *pLength = pVal-
3710: 3e 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 20  >u.str.size;.   
3720: 20 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 75 2e   return pVal->u.
3730: 73 74 72 2e 7a 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  str.z;.  }.}../*
3740: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
3750: 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
3760: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
3770: 20 73 74 61 63 6b 20 68 61 73 0a 2a 2a 20 66 65   stack has.** fe
3780: 77 65 72 20 74 68 61 6e 20 4e 20 65 6c 65 6d 65  wer than N eleme
3790: 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 74  nts.  This is ut
37a0: 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75 73  ility routine us
37b0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6d 70  ed in.** the imp
37c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 76  lementation of v
37d0: 65 72 62 73 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53  erbs..*/.int SbS
37e0: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 73 74  _RequireStack(st
37f0: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a  ruct Subscript *
3800: 70 2c 20 69 6e 74 20 4e 2c 20 63 6f 6e 73 74 20  p, int N, const 
3810: 63 68 61 72 20 2a 7a 43 6d 64 29 7b 0a 20 20 69  char *zCmd){.  i
3820: 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 4e 20  f( p->nStack>=N 
3830: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
3840: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3850: 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 72 4d 73 67  izeof(p->zErrMsg
3860: 29 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20  ), p->zErrMsg,. 
3870: 20 20 20 20 22 5c 22 25 73 5c 22 20 72 65 71 75      "\"%s\" requ
3880: 69 72 65 73 20 61 74 20 6c 65 61 73 74 20 25 64  ires at least %d
3890: 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 73 20   stack elements 
38a0: 2d 20 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 64 22  - only found %d"
38b0: 2c 0a 20 20 20 20 20 7a 43 6d 64 2c 20 4e 2c 20  ,.     zCmd, N, 
38c0: 70 2d 3e 6e 53 74 61 63 6b 29 3b 0a 20 20 72 65  p->nStack);.  re
38d0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
38e0: 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d 61   Subscript comma
38f0: 6e 64 3a 20 20 20 20 20 20 20 53 54 52 49 4e 47  nd:       STRING
3900: 20 4e 41 4d 45 20 73 65 74 0a 2a 2a 0a 2a 2a 20   NAME set.**.** 
3910: 57 72 69 74 65 20 74 68 65 20 76 61 6c 75 65 20  Write the value 
3920: 6f 66 20 53 54 52 49 4e 47 20 69 6e 74 6f 20 76  of STRING into v
3930: 61 72 69 61 62 6c 65 20 63 61 6c 6c 65 64 20 4e  ariable called N
3940: 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  AME..*/.static i
3950: 6e 74 20 73 65 74 43 6d 64 28 53 75 62 73 63 72  nt setCmd(Subscr
3960: 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e  ipt *p, void *pN
3970: 6f 74 55 73 65 64 29 7b 0a 20 20 53 62 53 56 61  otUsed){.  SbSVa
3980: 6c 75 65 20 2a 70 54 6f 73 3b 0a 20 20 53 62 53  lue *pTos;.  SbS
3990: 56 61 6c 75 65 20 2a 70 4e 6f 73 3b 0a 20 20 69  Value *pNos;.  i
39a0: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74  f( SbS_RequireSt
39b0: 61 63 6b 28 70 2c 20 32 2c 20 22 73 65 74 22 29  ack(p, 2, "set")
39c0: 20 29 20 72 65 74 75 72 6e 20 53 42 53 5f 45 52   ) return SBS_ER
39d0: 52 4f 52 3b 0a 20 20 70 54 6f 73 20 3d 20 26 70  ROR;.  pTos = &p
39e0: 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e 6e 53  ->aStack[--p->nS
39f0: 74 61 63 6b 5d 3b 0a 20 20 70 4e 6f 73 20 3d 20  tack];.  pNos = 
3a00: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e  &p->aStack[--p->
3a10: 6e 53 74 61 63 6b 5d 3b 0a 20 20 73 62 73 5f 73  nStack];.  sbs_s
3a20: 74 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62 2c  tore(&p->symTab,
3a30: 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 7a 2c 20   pTos->u.str.z, 
3a40: 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 73 69 7a 65  pTos->u.str.size
3a50: 2c 20 70 4e 6f 73 29 3b 0a 20 20 73 62 73 5f 76  , pNos);.  sbs_v
3a60: 61 6c 75 65 5f 72 65 73 65 74 28 70 54 6f 73 29  alue_reset(pTos)
3a70: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
3a80: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74  ./*.** Subscript
3a90: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 49   command:      I
3aa0: 4e 54 45 47 45 52 20 6e 6f 74 20 49 4e 54 45 47  NTEGER not INTEG
3ab0: 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ER.*/.static int
3ac0: 20 6e 6f 74 43 6d 64 28 73 74 72 75 63 74 20 53   notCmd(struct S
3ad0: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69  ubscript *p, voi
3ae0: 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20  d *pNotUsed){.  
3af0: 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 53 62 53  int n;.  if( SbS
3b00: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c  _RequireStack(p,
3b10: 20 31 2c 20 22 6e 6f 74 22 29 20 29 20 72 65 74   1, "not") ) ret
3b20: 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20 53 62 53  urn 1;.  n = SbS
3b30: 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 28 70  _StackValueInt(p
3b40: 2c 20 30 29 3b 0a 20 20 53 62 53 5f 50 6f 70 28  , 0);.  SbS_Pop(
3b50: 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f 50 75 73  p, 1);.  SbS_Pus
3b60: 68 49 6e 74 28 70 2c 20 21 6e 29 3b 0a 20 20 72  hInt(p, !n);.  r
3b70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 64 65 66  eturn 0;.}..#def
3b80: 69 6e 65 20 53 42 53 4f 50 5f 41 44 44 20 20 20  ine SBSOP_ADD   
3b90: 31 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f  1.#define SBSOP_
3ba0: 53 55 42 20 20 20 32 0a 23 64 65 66 69 6e 65 20  SUB   2.#define 
3bb0: 53 42 53 4f 50 5f 4d 55 4c 20 20 20 33 0a 23 64  SBSOP_MUL   3.#d
3bc0: 65 66 69 6e 65 20 53 42 53 4f 50 5f 44 49 56 20  efine SBSOP_DIV 
3bd0: 20 20 34 0a 23 64 65 66 69 6e 65 20 53 42 53 4f    4.#define SBSO
3be0: 50 5f 41 4e 44 20 20 20 35 0a 23 64 65 66 69 6e  P_AND   5.#defin
3bf0: 65 20 53 42 53 4f 50 5f 4f 52 20 20 20 20 36 0a  e SBSOP_OR    6.
3c00: 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 4d 49  #define SBSOP_MI
3c10: 4e 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 42  N   7.#define SB
3c20: 53 4f 50 5f 4d 41 58 20 20 20 38 0a 0a 2f 2a 0a  SOP_MAX   8../*.
3c30: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d  ** Subscript com
3c40: 6d 61 6e 64 3a 20 20 20 20 20 20 49 4e 54 45 47  mand:      INTEG
3c50: 45 52 20 49 4e 54 45 47 45 52 20 3c 62 69 6e 61  ER INTEGER <bina
3c60: 72 79 2d 6f 70 3e 20 49 4e 54 45 47 45 52 0a 2a  ry-op> INTEGER.*
3c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 70  /.static int bop
3c80: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
3c90: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
3ca0: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 2c 20 62 2c  Op){.  int a, b,
3cb0: 20 63 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65   c;.  if( SbS_Re
3cc0: 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20 32 2c  quireStack(p, 2,
3cd0: 20 22 42 49 4e 41 52 59 2d 4f 50 22 29 20 29 20   "BINARY-OP") ) 
3ce0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 20 3d 20  return 1;.  a = 
3cf0: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e  SbS_StackValueIn
3d00: 74 28 70 2c 20 30 29 3b 0a 20 20 62 20 3d 20 53  t(p, 0);.  b = S
3d10: 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74  bS_StackValueInt
3d20: 28 70 2c 20 31 29 3b 0a 20 20 73 77 69 74 63 68  (p, 1);.  switch
3d30: 28 20 28 69 6e 74 29 70 4f 70 20 29 7b 0a 20 20  ( (int)pOp ){.  
3d40: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 41 44 44    case SBSOP_ADD
3d50: 3a 20 20 63 20 3d 20 61 2b 62 3b 20 20 20 20 20  :  c = a+b;     
3d60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3d70: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 53 55 42    case SBSOP_SUB
3d80: 3a 20 20 63 20 3d 20 61 2d 62 3b 20 20 20 20 20  :  c = a-b;     
3d90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3da0: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 55 4c    case SBSOP_MUL
3db0: 3a 20 20 63 20 3d 20 61 2a 62 3b 20 20 20 20 20  :  c = a*b;     
3dc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3dd0: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 44 49 56    case SBSOP_DIV
3de0: 3a 20 20 63 20 3d 20 62 21 3d 30 20 3f 20 61 2f  :  c = b!=0 ? a/
3df0: 62 20 3a 20 30 3b 20 62 72 65 61 6b 3b 0a 20 20  b : 0; break;.  
3e00: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 41 4e 44    case SBSOP_AND
3e10: 3a 20 20 63 20 3d 20 61 20 26 26 20 62 3b 20 20  :  c = a && b;  
3e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3e30: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4f 52 3a    case SBSOP_OR:
3e40: 20 20 20 63 20 3d 20 61 20 7c 7c 20 62 3b 20 20     c = a || b;  
3e50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3e60: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 49 4e    case SBSOP_MIN
3e70: 3a 20 20 63 20 3d 20 61 3c 62 20 3f 20 61 20 3a  :  c = a<b ? a :
3e80: 20 62 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   b;    break;.  
3e90: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 41 58    case SBSOP_MAX
3ea0: 3a 20 20 63 20 3d 20 61 3c 62 20 3f 20 62 20 3a  :  c = a<b ? b :
3eb0: 20 61 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   a;    break;.  
3ec0: 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 32  }.  SbS_Pop(p, 2
3ed0: 29 3b 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74  );.  SbS_PushInt
3ee0: 28 70 2c 20 63 29 3b 0a 20 20 72 65 74 75 72 6e  (p, c);.  return
3ef0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62   0;.}../*.** Sub
3f00: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20  script command: 
3f10: 20 20 20 20 53 54 52 49 4e 47 20 68 61 73 63 61      STRING hasca
3f20: 70 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  p INTEGER.**.** 
3f30: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
3f40: 68 65 20 75 73 65 72 20 68 61 73 20 61 6c 6c 20  he user has all 
3f50: 6f 66 20 74 68 65 20 63 61 70 61 62 69 6c 69 74  of the capabilit
3f60: 69 65 73 20 6c 69 73 74 65 64 2e 0a 2a 2f 0a 73  ies listed..*/.s
3f70: 74 61 74 69 63 20 69 6e 74 20 68 61 73 63 61 70  tatic int hascap
3f80: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
3f90: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
3fa0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73  NotUsed){.  cons
3fb0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
3fc0: 20 6e 2c 20 61 3b 0a 20 20 69 66 28 20 53 62 53   n, a;.  if( SbS
3fd0: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c  _RequireStack(p,
3fe0: 20 31 2c 20 22 68 61 73 63 61 70 22 29 20 29 20   1, "hascap") ) 
3ff0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d 20  return 1;.  z = 
4000: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70  SbS_StackValue(p
4010: 2c 20 30 2c 20 26 6e 29 3b 0a 20 20 61 20 3d 20  , 0, &n);.  a = 
4020: 6c 6f 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69  login_has_capabi
4030: 6c 69 74 79 28 7a 2c 20 6e 29 3b 0a 20 20 53 62  lity(z, n);.  Sb
4040: 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53  S_Pop(p, 1);.  S
4050: 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 61 29  bS_PushInt(p, a)
4060: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4070: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74  ./*.** Subscript
4080: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 53 54   command:     ST
4090: 52 49 4e 47 20 6c 69 6e 65 63 6f 75 6e 74 20 49  RING linecount I
40a0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 74  NTEGER.**.** Ret
40b0: 75 72 6e 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61  urn one more tha
40c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
40d0: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  \n characters in
40e0: 20 53 54 52 49 4e 47 2e 0a 2a 2f 0a 73 74 61 74   STRING..*/.stat
40f0: 69 63 20 69 6e 74 20 6c 69 6e 65 63 6e 74 43 6d  ic int linecntCm
4100: 64 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69  d(struct Subscri
4110: 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f  pt *p, void *pNo
4120: 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20  tUsed){.  const 
4130: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 73  char *z;.  int s
4140: 69 7a 65 2c 20 6e 2c 20 69 3b 0a 20 20 69 66 28  ize, n, i;.  if(
4150: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63   SbS_RequireStac
4160: 6b 28 70 2c 20 31 2c 20 22 6c 69 6e 65 63 6f 75  k(p, 1, "linecou
4170: 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b  nt") ) return 1;
4180: 0a 20 20 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b  .  z = SbS_Stack
4190: 56 61 6c 75 65 28 70 2c 20 30 2c 20 26 73 69 7a  Value(p, 0, &siz
41a0: 65 29 3b 0a 20 20 66 6f 72 28 6e 3d 31 2c 20 69  e);.  for(n=1, i
41b0: 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
41c0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
41d0: 27 5c 6e 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a  '\n' ) n++;.  }.
41e0: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b    SbS_Pop(p, 1);
41f0: 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70  .  SbS_PushInt(p
4200: 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  , n);.  return 0
4210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63  ;.}../*.** Subsc
4220: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20  ript command:   
4230: 20 20 4e 41 4d 45 20 65 78 69 73 74 73 20 49 4e    NAME exists IN
4240: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 74 75  TEGER.**.** Retu
4250: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 76  rn TRUE if the v
4260: 61 72 69 61 62 6c 65 20 4e 41 4d 45 20 65 78 69  ariable NAME exi
4270: 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sts..*/.static i
4280: 6e 74 20 65 78 69 73 74 73 43 6d 64 28 73 74 72  nt existsCmd(str
4290: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70  uct Subscript *p
42a0: 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64  , void *pNotUsed
42b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
42c0: 2a 7a 3b 0a 20 20 69 6e 74 20 73 69 7a 65 2c 20  *z;.  int size, 
42d0: 78 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71  x;.  if( SbS_Req
42e0: 75 69 72 65 53 74 61 63 6b 28 70 2c 20 31 2c 20  uireStack(p, 1, 
42f0: 22 65 78 69 73 74 73 22 29 20 29 20 72 65 74 75  "exists") ) retu
4300: 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 53 62 53 5f  rn 1;.  z = SbS_
4310: 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c  StackValue(p, 0,
4320: 20 26 73 69 7a 65 29 3b 0a 20 20 78 20 3d 20 73   &size);.  x = s
4330: 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d  bs_fetch(&p->sym
4340: 54 61 62 2c 20 28 63 68 61 72 2a 29 7a 2c 20 73  Tab, (char*)z, s
4350: 69 7a 65 29 21 3d 30 3b 0a 20 20 53 62 53 5f 50  ize)!=0;.  SbS_P
4360: 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f  op(p, 1);.  SbS_
4370: 50 75 73 68 49 6e 74 28 70 2c 20 78 29 3b 0a 20  PushInt(p, x);. 
4380: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4390: 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f  .** Subscript co
43a0: 6d 6d 61 6e 64 3a 20 20 20 20 20 20 20 56 41 4c  mmand:       VAL
43b0: 55 45 20 4e 41 4d 45 20 67 65 74 20 56 41 4c 55  UE NAME get VALU
43c0: 45 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20 74 68 65  E.**.** Push the
43d0: 20 76 61 6c 75 65 20 6f 66 20 76 61 72 69 62 6c   value of varibl
43e0: 65 20 4e 41 4d 45 20 6f 6e 74 6f 20 74 68 65 20  e NAME onto the 
43f0: 73 74 61 63 6b 20 69 66 20 69 74 20 65 78 69 73  stack if it exis
4400: 74 73 2e 0a 2a 2a 20 49 66 20 4e 41 4d 45 20 64  ts..** If NAME d
4410: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 70  oes not exist, p
4420: 75 74 73 20 56 41 4c 55 45 20 6f 6e 74 6f 20 74  uts VALUE onto t
4430: 68 65 20 73 74 61 63 6b 20 69 6e 73 74 65 61 64  he stack instead
4440: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4450: 67 65 74 43 6d 64 28 53 75 62 73 63 72 69 70 74  getCmd(Subscript
4460: 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55   *p, void *pNotU
4470: 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  sed){.  const ch
4480: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ar *zName;.  int
4490: 20 6e 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20   nName;.  const 
44a0: 53 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  SbSValue *pVal;.
44b0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
44c0: 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69  .  if( SbS_Requi
44d0: 72 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 67  reStack(p, 2, "g
44e0: 65 74 22 29 20 29 20 72 65 74 75 72 6e 20 53 42  et") ) return SB
44f0: 53 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65  S_ERROR;.  zName
4500: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75   = SbS_StackValu
4510: 65 28 70 2c 20 30 2c 20 26 6e 4e 61 6d 65 29 3b  e(p, 0, &nName);
4520: 0a 20 20 70 56 61 6c 20 3d 20 73 62 73 5f 66 65  .  pVal = sbs_fe
4530: 74 63 68 28 26 70 2d 3e 73 79 6d 54 61 62 2c 20  tch(&p->symTab, 
4540: 28 63 68 61 72 2a 29 7a 4e 61 6d 65 2c 20 6e 4e  (char*)zName, nN
4550: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 61 6c  ame);.  if( pVal
4560: 21 3d 30 20 26 26 20 28 70 56 61 6c 2d 3e 66 6c  !=0 && (pVal->fl
4570: 61 67 73 20 26 20 53 42 53 56 41 4c 5f 53 54 52  ags & SBSVAL_STR
4580: 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 62 53 5f  )!=0 ){.    SbS_
4590: 50 6f 70 28 70 2c 20 32 29 3b 0a 20 20 20 20 72  Pop(p, 2);.    r
45a0: 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70 2c 20  c = SbS_Push(p, 
45b0: 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a 2c 20 70  pVal->u.str.z, p
45c0: 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 2c  Val->u.str.size,
45d0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
45e0: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b    SbS_Pop(p, 1);
45f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4600: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ;.}..../*.** Tru
4610: 65 20 69 66 20 6f 75 74 70 75 74 20 69 73 20 65  e if output is e
4620: 6e 61 62 6c 65 64 2e 20 20 46 61 6c 73 65 20 69  nabled.  False i
4630: 66 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73  f disabled..*/.s
4640: 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65  tatic int enable
4650: 4f 75 74 70 75 74 20 3d 20 31 3b 0a 0a 2f 2a 0a  Output = 1;../*.
4660: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d  ** Subscript com
4670: 6d 61 6e 64 3a 20 20 20 20 20 20 42 4f 4f 4c 45  mand:      BOOLE
4680: 41 4e 20 65 6e 61 62 6c 65 5f 6f 75 74 70 75 74  AN enable_output
4690: 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  .**.** Enable or
46a0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 70 75 74   disable the put
46b0: 73 20 61 6e 64 20 68 70 75 74 73 20 63 6f 6d 6d  s and hputs comm
46c0: 61 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ands..*/.static 
46d0: 69 6e 74 20 65 6e 61 62 6c 65 4f 75 74 70 75 74  int enableOutput
46e0: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
46f0: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
4700: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 66 28 20  NotUsed){.  if( 
4710: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b  SbS_RequireStack
4720: 28 70 2c 20 31 2c 20 22 65 6e 61 62 6c 65 5f 6f  (p, 1, "enable_o
4730: 75 74 70 75 74 22 29 20 29 20 72 65 74 75 72 6e  utput") ) return
4740: 20 31 3b 0a 20 20 65 6e 61 62 6c 65 4f 75 74 70   1;.  enableOutp
4750: 75 74 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61  ut = SbS_StackVa
4760: 6c 75 65 49 6e 74 28 70 2c 20 30 29 21 3d 30 3b  lueInt(p, 0)!=0;
4770: 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29  .  SbS_Pop(p, 1)
4780: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4790: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74  ./*.** Subscript
47a0: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 53   command:      S
47b0: 54 52 49 4e 47 20 70 75 74 73 0a 2a 2a 20 53 75  TRING puts.** Su
47c0: 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a  bscript command:
47d0: 20 20 20 20 20 20 53 54 52 49 4e 47 20 68 74 6d        STRING htm
47e0: 6c 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 53  l.**.** Output S
47f0: 54 52 49 4e 47 20 61 73 20 48 54 4d 4c 20 28 68  TRING as HTML (h
4800: 74 6d 6c 29 20 6f 72 20 75 6e 63 68 61 6e 67 65  tml) or unchange
4810: 64 20 28 70 75 74 73 29 2e 20 20 0a 2a 2a 20 50  d (puts).  .** P
4820: 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
4830: 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tack..*/.static 
4840: 69 6e 74 20 70 75 74 73 43 6d 64 28 73 74 72 75  int putsCmd(stru
4850: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c  ct Subscript *p,
4860: 20 76 6f 69 64 20 2a 70 43 6f 6e 76 65 72 74 29   void *pConvert)
4870: 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  {.  int size;.  
4880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
4890: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69   char *zOut;.  i
48a0: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74  f( SbS_RequireSt
48b0: 61 63 6b 28 70 2c 20 31 2c 20 22 70 75 74 73 22  ack(p, 1, "puts"
48c0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
48d0: 69 66 28 20 65 6e 61 62 6c 65 4f 75 74 70 75 74  if( enableOutput
48e0: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 53 62 53 5f   ){.    z = SbS_
48f0: 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c  StackValue(p, 0,
4900: 20 26 73 69 7a 65 29 3b 0a 20 20 20 20 69 66 28   &size);.    if(
4910: 20 70 43 6f 6e 76 65 72 74 20 29 7b 20 20 20 20   pConvert ){    
4920: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 68 74  .      zOut = ht
4930: 6d 6c 69 7a 65 28 7a 2c 20 73 69 7a 65 29 3b 0a  mlize(z, size);.
4940: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 73 74 72        size = str
4950: 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  len(zOut);.    }
4960: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4f 75 74  else{.      zOut
4970: 20 3d 20 28 63 68 61 72 2a 29 7a 3b 0a 20 20 20   = (char*)z;.   
4980: 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 63 67 69   }.    if( g.cgi
4990: 50 61 6e 69 63 20 29 7b 0a 20 20 20 20 20 20 63  Panic ){.      c
49a0: 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e  gi_append_conten
49b0: 74 28 7a 4f 75 74 2c 20 73 69 7a 65 29 3b 0a 20  t(zOut, size);. 
49c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
49d0: 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 73  printf("%.*s", s
49e0: 69 7a 65 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  ize, zOut);.    
49f0: 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 76 65  }.    if( pConve
4a00: 72 74 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rt ){.      free
4a10: 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
4a20: 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31  }.  SbS_Pop(p, 1
4a30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
4a40: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  .../*.** A table
4a50: 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6d   of built-in com
4a60: 6d 61 6e 64 73 0a 2a 2f 0a 73 74 61 74 69 63 20  mands.*/.static 
4a70: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
4a80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
4a90: 64 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 64 29  d;.  int (*xCmd)
4aa0: 28 53 75 62 73 63 72 69 70 74 2a 2c 76 6f 69 64  (Subscript*,void
4ab0: 2a 29 3b 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  *);.  void *pArg
4ac0: 3b 0a 7d 20 61 42 75 69 6c 74 69 6e 5b 5d 20 3d  ;.} aBuiltin[] =
4ad0: 20 7b 0a 20 20 7b 20 22 61 64 64 22 2c 20 20 20   {.  { "add",   
4ae0: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64            bopCmd
4af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b00: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 41 4e 44  (void*)SBSOP_AND
4b10: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 61 6e 64 22      },.  { "and"
4b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ,             bo
4b30: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  pCmd,           
4b40: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50      (void*)SBSOP
4b50: 5f 41 4e 44 20 20 20 20 7d 2c 0a 20 20 7b 20 22  _AND    },.  { "
4b60: 64 69 76 22 2c 20 20 20 20 20 20 20 20 20 20 20  div",           
4b70: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
4b80: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
4b90: 42 53 4f 50 5f 44 49 56 20 20 20 20 7d 2c 0a 20  BSOP_DIV    },. 
4ba0: 20 7b 20 22 65 6e 61 62 6c 65 5f 6f 75 74 70 75   { "enable_outpu
4bb0: 74 22 2c 20 20 20 65 6e 61 62 6c 65 4f 75 74 70  t",   enableOutp
4bc0: 75 74 43 6d 64 2c 20 20 20 20 20 20 30 20 20 20  utCmd,      0   
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 7d 2c 0a 20 20 7b 20 22 65 78 69 73 74 73 22 2c  },.  { "exists",
4bf0: 20 20 20 20 20 20 20 20 20 20 65 78 69 73 74 73            exists
4c00: 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cmd,            
4c10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4c20: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 67 65 74 22      },.  { "get"
4c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65  ,             ge
4c40: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  tCmd,           
4c50: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
4c60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
4c70: 68 61 73 63 61 70 22 2c 20 20 20 20 20 20 20 20  hascap",        
4c80: 20 20 68 61 73 63 61 70 43 6d 64 2c 20 20 20 20    hascapCmd,    
4c90: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4cb0: 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20 20 20 20   { "html",      
4cc0: 20 20 20 20 20 20 70 75 74 73 43 6d 64 2c 20 20        putsCmd,  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
4ce0: 64 2a 29 31 20 20 20 20 20 20 20 20 20 20 20 20  d*)1            
4cf0: 7d 2c 0a 20 20 7b 20 22 6c 69 6e 65 63 6f 75 6e  },.  { "linecoun
4d00: 74 22 2c 20 20 20 20 20 20 20 6c 69 6e 65 63 6e  t",       linecn
4d10: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  tCmd,           
4d20: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
4d30: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6d 61 78 22      },.  { "max"
4d40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ,             bo
4d50: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  pCmd,           
4d60: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50      (void*)SBSOP
4d70: 5f 4d 41 58 20 20 20 20 7d 2c 0a 20 20 7b 20 22  _MAX    },.  { "
4d80: 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  min",           
4d90: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
4da0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
4db0: 42 53 4f 50 5f 4d 49 4e 20 20 20 20 7d 2c 0a 20  BSOP_MIN    },. 
4dc0: 20 7b 20 22 6d 75 6c 22 2c 20 20 20 20 20 20 20   { "mul",       
4dd0: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20        bopCmd,   
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
4df0: 64 2a 29 53 42 53 4f 50 5f 4d 55 4c 20 20 20 20  d*)SBSOP_MUL    
4e00: 7d 2c 0a 20 20 7b 20 22 6e 6f 74 22 2c 20 20 20  },.  { "not",   
4e10: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 43 6d 64            notCmd
4e20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4e30: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
4e40: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6f 72 22 2c      },.  { "or",
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
4e60: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  pCmd,           
4e70: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50      (void*)SBSOP
4e80: 5f 4f 52 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22  _OR     },.  { "
4e90: 70 75 74 73 22 2c 20 20 20 20 20 20 20 20 20 20  puts",          
4ea0: 20 20 70 75 74 73 43 6d 64 2c 20 20 20 20 20 20    putsCmd,      
4eb0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4ed0: 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20 20   { "set",       
4ee0: 20 20 20 20 20 20 73 65 74 43 6d 64 2c 20 20 20        setCmd,   
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 7d 2c 0a 20 20 7b 20 22 73 75 62 22 2c 20 20 20  },.  { "sub",   
4f20: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64            bopCmd
4f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f40: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 53 55 42  (void*)SBSOP_SUB
4f50: 20 20 20 20 7d 2c 0a 7d 3b 0a 20 20 0a 0a 2f 2a      },.};.  ../*
4f60: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 61 20 7a 65  .** Compare a ze
4f70: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ro-terminated st
4f80: 72 69 6e 67 20 7a 50 61 74 74 65 72 6e 20 61 67  ring zPattern ag
4f90: 61 69 6e 73 74 0a 2a 2a 20 61 6e 20 75 6e 74 65  ainst.** an unte
4fa0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
4fb0: 7a 53 74 72 20 6f 66 20 6c 65 6e 67 74 68 20 6e  zStr of length n
4fc0: 53 74 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  Str..**.** Retur
4fd0: 6e 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  n less than, equ
4fe0: 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
4ff0: 72 20 74 68 61 6e 20 7a 65 72 6f 20 69 66 0a 2a  r than zero if.*
5000: 2a 20 7a 50 61 74 74 65 72 6e 20 69 73 20 6c 65  * zPattern is le
5010: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
5020: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
5030: 61 6e 20 7a 53 74 72 2e 0a 2a 2f 0a 73 74 61 74  an zStr..*/.stat
5040: 69 63 20 69 6e 74 20 63 6f 6d 70 61 72 65 5f 63  ic int compare_c
5050: 6d 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  md(const char *z
5060: 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63  Pattern, const c
5070: 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e 74 20 6e  har *zStr, int n
5080: 53 74 72 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20  Str){.  int c = 
5090: 73 74 72 6e 63 6d 70 28 7a 50 61 74 74 65 72 6e  strncmp(zPattern
50a0: 2c 20 7a 53 74 72 2c 20 6e 53 74 72 29 3b 0a 20  , zStr, nStr);. 
50b0: 20 69 66 28 20 63 3d 3d 30 20 26 26 20 7a 50 61   if( c==0 && zPa
50c0: 74 74 65 72 6e 5b 6e 53 74 72 5d 21 3d 30 20 29  ttern[nStr]!=0 )
50d0: 7b 0a 20 20 20 20 63 20 3d 20 31 3b 0a 20 20 7d  {.    c = 1;.  }
50e0: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
50f0: 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 74  /*.** Evaluate t
5100: 68 65 20 73 63 72 69 70 74 20 67 69 76 65 6e 20  he script given 
5110: 62 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 63  by the first nSc
5120: 72 69 70 74 20 62 79 74 65 73 20 6f 66 20 7a 53  ript bytes of zS
5130: 63 72 69 70 74 5b 5d 2e 0a 2a 2a 20 52 65 74 75  cript[]..** Retu
5140: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  rn 0 on success 
5150: 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  and non-zero for
5160: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
5170: 74 20 53 62 53 5f 45 76 61 6c 28 73 74 72 75 63  t SbS_Eval(struc
5180: 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20  t Subscript *p, 
5190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 72  const char *zScr
51a0: 69 70 74 2c 20 69 6e 74 20 6e 53 63 72 69 70 74  ipt, int nScript
51b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 42  ){.  int rc = SB
51c0: 53 5f 4f 4b 3b 0a 20 20 69 66 28 20 6e 53 63 72  S_OK;.  if( nScr
51d0: 69 70 74 3c 30 20 29 20 6e 53 63 72 69 70 74 20  ipt<0 ) nScript 
51e0: 3d 20 73 74 72 6c 65 6e 28 7a 53 63 72 69 70 74  = strlen(zScript
51f0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 63 72  );.  while( nScr
5200: 69 70 74 3e 30 20 26 26 20 72 63 3d 3d 53 42 53  ipt>0 && rc==SBS
5210: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
5220: 3b 0a 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b  ;.    int ttype;
5230: 0a 20 20 20 20 6e 20 3d 20 73 62 73 5f 6e 65 78  .    n = sbs_nex
5240: 74 5f 74 6f 6b 65 6e 28 7a 53 63 72 69 70 74 2c  t_token(zScript,
5250: 20 6e 53 63 72 69 70 74 2c 20 26 74 74 79 70 65   nScript, &ttype
5260: 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 7b 0a  );..#if 0.    {.
5270: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6e 45 6c        int i, nEl
5280: 65 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  em;.      const 
5290: 63 68 61 72 20 2a 7a 45 6c 65 6d 3b 0a 20 20 20  char *zElem;.   
52a0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b     if( p->nStack
52b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  >0 ){.        pr
52c0: 69 6e 74 66 28 22 53 54 41 43 4b 3a 22 29 3b 0a  intf("STACK:");.
52d0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
52e0: 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69 2b   i<p->nStack; i+
52f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45  +){.          zE
5300: 6c 65 6d 20 3d 20 53 62 53 5f 53 74 61 63 6b 56  lem = SbS_StackV
5310: 61 6c 75 65 28 70 2c 20 69 2c 20 26 6e 45 6c 65  alue(p, i, &nEle
5320: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72  m);.          pr
5330: 69 6e 74 66 28 22 20 5b 25 2e 2a 73 5d 22 2c 20  intf(" [%.*s]", 
5340: 6e 45 6c 65 6d 2c 20 7a 45 6c 65 6d 29 3b 0a 20  nElem, zElem);. 
5350: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5360: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
5370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69       }.      pri
5380: 6e 74 66 28 22 54 4f 4b 45 4e 28 25 64 29 3a 20  ntf("TOKEN(%d): 
5390: 5b 25 2e 2a 73 5d 5c 6e 22 2c 20 74 74 79 70 65  [%.*s]\n", ttype
53a0: 2c 20 6e 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20  , n, zScript);. 
53b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
53c0: 20 73 77 69 74 63 68 28 20 74 74 79 70 65 20 29   switch( ttype )
53d0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 42 53  {.      case SBS
53e0: 54 54 5f 57 48 49 54 45 53 50 41 43 45 3a 20 7b  TT_WHITESPACE: {
53f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
5410: 73 65 20 53 42 53 54 54 5f 45 4f 46 3a 20 7b 0a  se SBSTT_EOF: {.
5420: 20 20 20 20 20 20 20 20 6e 53 63 72 69 70 74 20          nScript 
5430: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
5440: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5450: 20 20 63 61 73 65 20 53 42 53 54 54 5f 49 4e 43    case SBSTT_INC
5460: 4f 4d 50 4c 45 54 45 3a 0a 20 20 20 20 20 20 63  OMPLETE:.      c
5470: 61 73 65 20 53 42 53 54 54 5f 55 4e 4b 4e 4f 57  ase SBSTT_UNKNOW
5480: 4e 3a 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20  N: {.        rc 
5490: 3d 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20  = SBS_ERROR;.   
54a0: 20 20 20 20 20 6e 53 63 72 69 70 74 20 3d 20 6e       nScript = n
54b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
54c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
54d0: 61 73 65 20 53 42 53 54 54 5f 49 4e 54 45 47 45  ase SBSTT_INTEGE
54e0: 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20  R: {.        rc 
54f0: 3d 20 53 62 53 5f 50 75 73 68 28 70 2c 20 28 63  = SbS_Push(p, (c
5500: 68 61 72 2a 29 7a 53 63 72 69 70 74 2c 20 6e 2c  har*)zScript, n,
5510: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
5520: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5530: 20 20 63 61 73 65 20 53 42 53 54 54 5f 4e 41 4d    case SBSTT_NAM
5540: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E: {.        rc 
5550: 3d 20 53 62 53 5f 50 75 73 68 28 70 2c 20 28 63  = SbS_Push(p, (c
5560: 68 61 72 2a 29 26 7a 53 63 72 69 70 74 5b 31 5d  har*)&zScript[1]
5570: 2c 20 6e 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  , n-1, 0);.     
5580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5590: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 42 53  }.      case SBS
55a0: 54 54 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TT_STRING: {.   
55b0: 20 20 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75       rc = SbS_Pu
55c0: 73 68 28 70 2c 20 28 63 68 61 72 2a 29 26 7a 53  sh(p, (char*)&zS
55d0: 63 72 69 70 74 5b 31 5d 2c 20 6e 2d 32 2c 20 30  cript[1], n-2, 0
55e0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
55f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5600: 63 61 73 65 20 53 42 53 54 54 5f 56 45 52 42 3a  case SBSTT_VERB:
5610: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69   {.        /* Fi
5620: 72 73 74 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20  rst look up the 
5630: 76 65 72 62 20 69 6e 20 74 68 65 20 68 61 73 68  verb in the hash
5640: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
5650: 20 20 63 6f 6e 73 74 20 53 62 53 56 61 6c 75 65    const SbSValue
5660: 20 2a 70 56 61 6c 20 3d 20 73 62 73 5f 66 65 74   *pVal = sbs_fet
5670: 63 68 28 26 70 2d 3e 73 79 6d 54 61 62 2c 20 28  ch(&p->symTab, (
5680: 63 68 61 72 2a 29 7a 53 63 72 69 70 74 2c 20 6e  char*)zScript, n
5690: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
56a0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
56b0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 76 65      /* If the ve
56c0: 72 62 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  rb is not in the
56d0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 6c 6f 6f   hash table, loo
56e0: 6b 20 66 6f 72 20 61 20 0a 20 20 20 20 20 20 20  k for a .       
56f0: 20 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 63     ** built-in c
5700: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 20 20  ommand */.      
5710: 20 20 20 20 69 6e 74 20 75 70 72 20 3d 20 73 69      int upr = si
5720: 7a 65 6f 66 28 61 42 75 69 6c 74 69 6e 29 2f 73  zeof(aBuiltin)/s
5730: 69 7a 65 6f 66 28 61 42 75 69 6c 74 69 6e 5b 30  izeof(aBuiltin[0
5740: 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ]) - 1;.        
5750: 20 20 69 6e 74 20 6c 77 72 20 3d 20 30 3b 0a 20    int lwr = 0;. 
5760: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 42           rc = SB
5770: 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  S_ERROR;.       
5780: 20 20 20 77 68 69 6c 65 28 20 75 70 72 3e 3d 6c     while( upr>=l
5790: 77 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  wr ){.          
57a0: 20 20 69 6e 74 20 69 20 3d 20 28 75 70 72 2b 6c    int i = (upr+l
57b0: 77 72 29 2f 32 3b 0a 20 20 20 20 20 20 20 20 20  wr)/2;.         
57c0: 20 20 20 69 6e 74 20 63 20 3d 20 63 6f 6d 70 61     int c = compa
57d0: 72 65 5f 63 6d 64 28 61 42 75 69 6c 74 69 6e 5b  re_cmd(aBuiltin[
57e0: 69 5d 2e 7a 43 6d 64 2c 20 7a 53 63 72 69 70 74  i].zCmd, zScript
57f0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
5800: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
5810: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
5820: 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 78 43 6d   aBuiltin[i].xCm
5830: 64 28 70 2c 20 61 42 75 69 6c 74 69 6e 5b 69 5d  d(p, aBuiltin[i]
5840: 2e 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  .pArg);.        
5850: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5860: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
5870: 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
5880: 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 2d          upr = i-
5890: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
58a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
58b0: 20 20 20 20 6c 77 72 20 3d 20 69 2b 31 3b 0a 20      lwr = i+1;. 
58c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
58d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
58e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 56 61 6c 2d   }else if( pVal-
58f0: 3e 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f  >flags & SBSVAL_
5900: 56 45 52 42 20 29 7b 0a 20 20 20 20 20 20 20 20  VERB ){.        
5910: 20 20 72 63 20 3d 20 70 56 61 6c 2d 3e 75 2e 76    rc = pVal->u.v
5920: 65 72 62 2e 78 56 65 72 62 28 70 2c 20 70 56 61  erb.xVerb(p, pVa
5930: 6c 2d 3e 75 2e 76 65 72 62 2e 70 41 72 67 29 3b  l->u.verb.pArg);
5940: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
5950: 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26  f( pVal->flags &
5960: 20 53 42 53 56 41 4c 5f 45 58 45 43 20 29 7b 0a   SBSVAL_EXEC ){.
5970: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
5980: 62 53 5f 45 76 61 6c 28 70 2c 20 70 56 61 6c 2d  bS_Eval(p, pVal-
5990: 3e 75 2e 73 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e  >u.str.z, pVal->
59a0: 75 2e 73 74 72 2e 73 69 7a 65 29 3b 0a 20 20 20  u.str.size);.   
59b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
59c0: 20 20 20 20 20 20 72 63 20 3d 20 53 62 53 5f 50        rc = SbS_P
59d0: 75 73 68 28 70 2c 20 70 56 61 6c 2d 3e 75 2e 73  ush(p, pVal->u.s
59e0: 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75 2e 73 74  tr.z, pVal->u.st
59f0: 72 2e 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  r.size, 0);.    
5a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5a10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5a20: 20 7d 0a 20 20 20 20 7a 53 63 72 69 70 74 20 2b   }.    zScript +
5a30: 3d 20 6e 3b 0a 20 20 20 20 6e 53 63 72 69 70 74  = n;.    nScript
5a40: 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74   -= n;.  }.  ret
5a50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5a60: 20 54 68 65 20 7a 5b 5d 20 69 6e 70 75 74 20 63   The z[] input c
5a70: 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 6d 69 78  ontains text mix
5a80: 65 64 20 77 69 74 68 20 73 75 62 73 63 72 69 70  ed with subscrip
5a90: 74 20 73 63 72 69 70 74 73 2e 0a 2a 2a 20 54 68  t scripts..** Th
5aa0: 65 20 73 75 62 73 63 72 69 70 74 20 73 63 72 69  e subscript scri
5ab0: 70 74 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  pts are containe
5ac0: 64 20 77 69 74 68 69 6e 20 5b 2e 2e 2e 5d 2e 20  d within [...]. 
5ad0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
5ae0: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 74   processes the t
5af0: 65 6d 70 6c 61 74 65 20 61 6e 64 20 77 72 69 74  emplate and writ
5b00: 65 73 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  es the results o
5b10: 6e 20 65 69 74 68 65 72 0a 2a 2a 20 73 74 64 6f  n either.** stdo
5b20: 75 74 20 6f 72 20 69 6e 74 6f 20 43 47 49 2e 0a  ut or into CGI..
5b30: 2a 2f 0a 69 6e 74 20 53 62 53 5f 52 65 6e 64 65  */.int SbS_Rende
5b40: 72 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69  r(struct Subscri
5b50: 70 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  pt *p, const cha
5b60: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 20 3d  r *z){.  int i =
5b70: 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
5b80: 42 53 5f 4f 4b 3b 0a 20 20 77 68 69 6c 65 28 20  BS_OK;.  while( 
5b90: 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  z[i] ){.    if( 
5ba0: 7a 5b 69 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  z[i]=='[' ){.   
5bb0: 20 20 20 69 66 28 20 65 6e 61 62 6c 65 4f 75 74     if( enableOut
5bc0: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  put ){.        i
5bd0: 66 28 20 67 2e 63 67 69 50 61 6e 69 63 20 29 7b  f( g.cgiPanic ){
5be0: 0a 20 20 20 20 20 20 20 20 20 20 63 67 69 5f 61  .          cgi_a
5bf0: 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a 2c  ppend_content(z,
5c00: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   i);.        }el
5c10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 77  se{.          fw
5c20: 72 69 74 65 28 7a 2c 20 31 2c 20 69 2c 20 73 74  rite(z, 1, i, st
5c30: 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  dout);.        }
5c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
5c50: 20 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 66   += i+1;.      f
5c60: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20  or(i=0; z[i] && 
5c70: 7a 5b 69 5d 21 3d 27 5d 27 3b 20 69 2b 2b 29 7b  z[i]!=']'; i++){
5c80: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 62 53  }.      rc = SbS
5c90: 5f 45 76 61 6c 28 70 2c 20 7a 2c 20 69 29 3b 0a  _Eval(p, z, i);.
5ca0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 42        if( rc!=SB
5cb0: 53 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  S_OK ) break;.  
5cc0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 69      if( z[i] ) i
5cd0: 2b 2b 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 69  ++;.      z += i
5ce0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20  ;.      i = 0;. 
5cf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5d00: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i++;.    }.  }. 
5d10: 20 69 66 28 20 69 3e 30 20 26 26 20 65 6e 61 62   if( i>0 && enab
5d20: 6c 65 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  leOutput ){.    
5d30: 69 66 28 20 67 2e 63 67 69 50 61 6e 69 63 20 29  if( g.cgiPanic )
5d40: 7b 0a 20 20 20 20 20 20 63 67 69 5f 61 70 70 65  {.      cgi_appe
5d50: 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a 2c 20 69 29  nd_content(z, i)
5d60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5d70: 20 20 20 66 77 72 69 74 65 28 7a 2c 20 31 2c 20     fwrite(z, 1, 
5d80: 69 2c 20 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  i, stdout);.    
5d90: 7d 0a 20 20 7d 20 0a 20 20 72 65 74 75 72 6e 20  }.  } .  return 
5da0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d  rc;.}../*.** COM
5db0: 4d 41 4e 44 3a 20 74 65 73 74 2d 73 75 62 73 63  MAND: test-subsc
5dc0: 72 69 70 74 0a 2a 2f 0a 76 6f 69 64 20 74 65 73  ript.*/.void tes
5dd0: 74 5f 73 75 62 73 63 72 69 70 74 28 76 6f 69 64  t_subscript(void
5de0: 29 7b 0a 20 20 53 75 62 73 63 72 69 70 74 20 2a  ){.  Subscript *
5df0: 70 3b 0a 20 20 42 6c 6f 62 20 69 6e 3b 0a 20 20  p;.  Blob in;.  
5e00: 69 66 28 20 67 2e 61 72 67 63 3c 33 20 29 7b 0a  if( g.argc<3 ){.
5e10: 20 20 20 20 75 73 61 67 65 28 22 46 49 4c 45 22      usage("FILE"
5e20: 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65  );.  }.  blob_ze
5e30: 72 6f 28 26 69 6e 29 3b 0a 20 20 62 6c 6f 62 5f  ro(&in);.  blob_
5e40: 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26  read_from_file(&
5e50: 69 6e 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  in, g.argv[2]);.
5e60: 20 20 70 20 3d 20 53 62 53 5f 43 72 65 61 74 65    p = SbS_Create
5e70: 28 29 3b 0a 20 20 53 62 53 5f 52 65 6e 64 65 72  ();.  SbS_Render
5e80: 28 70 2c 20 62 6c 6f 62 5f 73 74 72 28 26 69 6e  (p, blob_str(&in
5e90: 29 29 3b 0a 7d 0a                                ));.}.