Hex Artifact Content
Not logged in

Artifact 64131ef2eafe0f4e9f65cfd8cc16e4d952d3528c:

File src/subscript.c part of check-in [d913179b82] - Progress toward ticket editing. This is an incremental check-in. by drh on 2007-11-24 21:28:03.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6d 70   contains an imp
0380: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0390: 68 65 20 22 73 75 62 73 63 72 69 70 74 22 20 69  he "subscript" i
03a0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2a 0a 2a  nterpreter..**.*
03b0: 2a 20 53 75 62 73 63 72 69 70 74 20 61 74 74 65  * Subscript atte
03c0: 6d 70 74 73 20 74 6f 20 62 65 20 61 6e 20 65 78  mpts to be an ex
03d0: 74 72 65 6d 65 6c 79 20 6c 69 67 68 74 2d 77 65  tremely light-we
03e0: 69 67 68 74 20 73 63 72 69 70 74 69 6e 67 0a 2a  ight scripting.*
03f0: 2a 20 6c 61 6e 67 75 61 67 65 2e 20 20 49 74 20  * language.  It 
0400: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 62 61 72  contains the bar
0410: 65 73 74 20 6f 66 20 62 61 72 65 20 65 73 73 65  est of bare esse
0420: 6e 74 69 61 6c 73 2e 20 20 49 74 20 69 73 0a 2a  ntials.  It is.*
0430: 2a 20 73 74 61 63 6b 2d 62 61 73 65 64 20 61 6e  * stack-based an
0440: 64 20 66 6f 72 74 68 2d 6c 69 6b 65 2e 20 20 45  d forth-like.  E
0450: 76 65 72 79 74 68 69 6e 67 20 69 73 20 69 6e 20  verything is in 
0460: 61 20 73 69 6e 67 6c 65 20 67 6c 6f 62 61 6c 0a  a single global.
0470: 2a 2a 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54  ** namespace.  T
0480: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
0490: 69 6e 67 6c 65 20 64 61 74 61 74 79 70 65 20 6f  ingle datatype o
04a0: 66 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  f zero-terminate
04b0: 64 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 54 68  d.** string.  Th
04c0: 65 20 73 74 61 63 6b 20 69 73 20 6f 66 20 66 69  e stack is of fi
04d0: 78 65 64 2c 20 6c 69 6d 69 74 65 64 20 64 65 70  xed, limited dep
04e0: 74 68 2e 20 20 54 68 65 20 73 79 6d 62 61 6c 20  th.  The symbal 
04f0: 74 61 62 6c 65 0a 2a 2a 20 69 73 20 6f 66 20 61  table.** is of a
0500: 20 6c 69 6d 69 74 65 64 20 61 6e 64 20 66 69 78   limited and fix
0510: 65 64 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed size..**.** T
0520: 4f 4b 45 4e 53 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  OKENS:.**.**    
0530: 20 20 2a 20 20 41 6c 6c 20 74 6f 6b 65 6e 73 20    *  All tokens 
0540: 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72  are separated fr
0550: 6f 6d 20 65 61 63 68 20 6f 74 68 65 72 20 62 79  om each other by
0560: 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 20   whitespace..** 
0570: 20 20 20 20 20 2a 20 20 4c 65 61 64 69 6e 67 20       *  Leading 
0580: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
0590: 74 65 73 70 61 63 65 20 69 73 20 69 67 6e 6f 72  tespace is ignor
05a0: 65 64 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 54  ed..**      *  T
05b0: 65 78 74 20 77 69 74 68 69 6e 20 6e 65 73 74 65  ext within neste
05c0: 64 20 7b 2e 2e 2e 7d 20 69 73 20 61 20 73 69 6e  d {...} is a sin
05d0: 67 6c 65 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e  gle string token
05e0: 2e 20 20 54 68 65 20 6f 75 74 65 72 6d 6f 73 74  .  The outermost
05f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 75 72 6c  .**         curl
0600: 79 20 62 72 61 63 65 73 20 61 72 65 20 6e 6f 74  y braces are not
0610: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 6f 6b   part of the tok
0620: 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41  en..**      *  A
0630: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69 74  n identifier wit
0640: 68 20 61 20 6c 65 61 64 69 6e 67 20 22 2f 22 20  h a leading "/" 
0650: 69 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65  is a string toke
0660: 6e 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 20  n..**      *  A 
0670: 74 6f 6b 65 6e 20 74 68 61 74 20 6c 6f 6f 6b 73  token that looks
0680: 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 20 69   like a number i
0690: 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e  s a string token
06a0: 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 6e 20  ..**      *  An 
06b0: 69 64 65 6e 74 69 66 69 65 72 20 74 6f 6b 65 6e  identifier token
06c0: 20 69 73 20 63 61 6c 6c 65 64 20 61 20 22 76 65   is called a "ve
06d0: 72 62 22 2e 0a 2a 2a 0a 2a 2a 20 50 52 4f 43 45  rb"..**.** PROCE
06e0: 53 53 49 4e 47 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  SSING:.**.**    
06f0: 20 20 2a 20 20 54 68 65 20 69 6e 70 75 74 20 69    *  The input i
0700: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74  s divided into t
0710: 6f 6b 65 6e 73 2e 20 20 57 68 69 74 65 73 70 61  okens.  Whitespa
0720: 63 65 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  ce is discarded.
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 53 74 72 69  .**         Stri
0740: 6e 67 20 61 6e 64 20 76 65 72 62 20 74 6f 6b 65  ng and verb toke
0750: 6e 73 20 61 72 65 20 70 61 73 73 65 64 20 69 6e  ns are passed in
0760: 74 6f 20 74 68 65 20 65 6e 67 69 6e 65 2e 0a 2a  to the engine..*
0770: 2a 20 20 20 20 20 20 2a 20 20 53 74 72 69 6e 67  *      *  String
0780: 20 74 6f 6b 65 6e 73 20 61 72 65 20 70 75 73 68   tokens are push
0790: 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ed onto the stac
07a0: 6b 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 49 66  k..**      *  If
07b0: 20 61 20 76 65 72 62 20 74 6f 6b 65 6e 20 63 6f   a verb token co
07c0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20 70  rresponds to a p
07d0: 72 6f 63 65 64 75 72 65 2c 20 74 68 61 74 20 70  rocedure, that p
07e0: 72 6f 63 65 64 75 72 65 20 69 73 0a 2a 2a 20 20  rocedure is.**  
07f0: 20 20 20 20 20 20 20 72 75 6e 2e 20 20 54 68 65         run.  The
0800: 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
0810: 20 75 73 65 2c 20 70 6f 70 2c 20 6f 72 20 70 75   use, pop, or pu
0820: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  ll elements from
0830: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65   .**         the
0840: 20 73 74 61 63 6b 2e 0a 2a 2a 20 20 20 20 20 20   stack..**      
0850: 2a 20 20 49 66 20 61 20 76 65 72 62 20 74 6f 6b  *  If a verb tok
0860: 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  en corresponds t
0870: 6f 20 61 20 76 61 72 69 61 62 6c 65 2c 20 74 68  o a variable, th
0880: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a  e value of that.
0890: 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 61  **         varia
08a0: 62 6c 65 20 69 73 20 70 75 73 68 65 64 20 6f 6e  ble is pushed on
08b0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
08c0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
08d0: 61 74 74 65 6d 70 74 73 20 74 6f 20 62 65 20 63  attempts to be c
08e0: 6f 6d 70 6c 65 74 65 6c 79 20 73 65 6c 66 2d 63  ompletely self-c
08f0: 6f 6e 74 61 69 6e 65 64 20 73 6f 20 74 68 61 74  ontained so that
0900: 20 69 74 20 63 61 6e 0a 2a 2a 20 62 65 20 70 6f   it can.** be po
0910: 72 74 61 62 6c 65 20 74 6f 20 6f 74 68 65 72 20  rtable to other 
0920: 70 72 6f 6a 65 63 74 73 2e 0a 2a 2f 0a 23 69 6e  projects..*/.#in
0930: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22  clude "config.h"
0940: 0a 23 69 6e 63 6c 75 64 65 20 22 73 75 62 73 63  .#include "subsc
0950: 72 69 70 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ript.h".#include
0960: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69 66   <assert.h>..#if
0970: 20 49 4e 54 45 52 46 41 43 45 0a 74 79 70 65 64   INTERFACE.typed
0980: 65 66 20 73 74 72 75 63 74 20 53 75 62 73 63 72  ef struct Subscr
0990: 69 70 74 20 53 75 62 73 63 72 69 70 74 3b 0a 23  ipt Subscript;.#
09a0: 64 65 66 69 6e 65 20 53 42 53 5f 4f 4b 20 20 20  define SBS_OK   
09b0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 42 53     0.#define SBS
09c0: 5f 45 52 52 4f 52 20 20 20 31 0a 23 64 65 66 69  _ERROR   1.#defi
09d0: 6e 65 20 53 42 53 5f 52 45 54 55 52 4e 20 20 32  ne SBS_RETURN  2
09e0: 0a 23 64 65 66 69 6e 65 20 53 42 53 5f 42 52 45  .#define SBS_BRE
09f0: 41 4b 20 20 20 33 0a 23 65 6e 64 69 66 0a 0a 2f  AK   3.#endif../
0a00: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
0a10: 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 0a 2a 2f 0a  on constants.*/.
0a20: 23 64 65 66 69 6e 65 20 53 42 53 43 4f 4e 46 49  #define SBSCONFI
0a30: 47 5f 4e 48 41 53 48 20 20 20 20 34 31 20 20 20  G_NHASH    41   
0a40: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
0a50: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
0a60: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43 4f  */.#define SBSCO
0a70: 4e 46 49 47 5f 4e 53 54 41 43 4b 20 20 20 31 30  NFIG_NSTACK   10
0a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
0a90: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20  mum stack depth 
0aa0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43 4f  */.#define SBSCO
0ab0: 4e 46 49 47 5f 45 52 52 53 49 5a 45 20 20 31 30  NFIG_ERRSIZE  10
0ac0: 30 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  0        /* Maxi
0ad0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 20 65  mum size of an e
0ae0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
0af0: 0a 2f 2a 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65  ./*.** Available
0b00: 20 74 6f 6b 65 6e 20 74 79 70 65 73 3a 0a 2a 2f   token types:.*/
0b10: 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 57  .#define SBSTT_W
0b20: 48 49 54 45 53 50 41 43 45 20 20 31 20 20 20 20  HITESPACE  1    
0b30: 2f 2a 20 65 78 3a 20 20 20 5c 30 34 30 20 20 20  /* ex:   \040   
0b40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54  */.#define SBSTT
0b50: 5f 4e 41 4d 45 20 20 20 20 20 20 20 20 32 20 20  _NAME        2  
0b60: 20 20 2f 2a 20 65 78 3a 20 20 20 2f 61 62 63 64    /* ex:   /abcd
0b70: 65 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42  e  */.#define SB
0b80: 53 54 54 5f 56 45 52 42 20 20 20 20 20 20 20 20  STT_VERB        
0b90: 33 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 61 62  3    /* ex:   ab
0ba0: 63 64 65 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65  cde   */.#define
0bb0: 20 53 42 53 54 54 5f 53 54 52 49 4e 47 20 20 20   SBSTT_STRING   
0bc0: 20 20 20 34 20 20 20 20 2f 2a 20 65 78 3a 20 20     4    /* ex:  
0bd0: 20 7b 2e 2e 2e 7d 20 20 20 2a 2f 0a 23 64 65 66   {...}   */.#def
0be0: 69 6e 65 20 53 42 53 54 54 5f 49 4e 54 45 47 45  ine SBSTT_INTEGE
0bf0: 52 20 20 20 20 20 35 20 20 20 20 2f 2a 20 49 6e  R     5    /* In
0c00: 74 65 67 65 72 20 69 6e 63 6c 75 64 69 6e 67 20  teger including 
0c10: 6f 70 74 69 6f 6e 20 73 69 67 6e 20 2a 2f 0a 23  option sign */.#
0c20: 64 65 66 69 6e 65 20 53 42 53 54 54 5f 49 4e 43  define SBSTT_INC
0c30: 4f 4d 50 4c 45 54 45 20 20 36 20 20 20 20 2f 2a  OMPLETE  6    /*
0c40: 20 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74   Unterminated st
0c50: 72 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 23 64  ring token */.#d
0c60: 65 66 69 6e 65 20 53 42 53 54 54 5f 55 4e 4b 4e  efine SBSTT_UNKN
0c70: 4f 57 4e 20 20 20 20 20 37 20 20 20 20 2f 2a 20  OWN     7    /* 
0c80: 55 6e 6b 6e 6f 77 6e 20 74 6f 6b 65 6e 20 2a 2f  Unknown token */
0c90: 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 45  .#define SBSTT_E
0ca0: 4f 46 20 20 20 20 20 20 20 20 20 38 20 20 20 20  OF         8    
0cb0: 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75 74 20  /* End of input 
0cc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73  */../*.** Values
0cd0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
0ce0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 73  he hash table as
0cf0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
0d00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73  e following.** s
0d10: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
0d20: 65 64 65 66 20 73 74 72 75 63 74 20 53 62 53 56  edef struct SbSV
0d30: 61 6c 75 65 20 53 62 53 56 61 6c 75 65 3b 0a 73  alue SbSValue;.s
0d40: 74 72 75 63 74 20 53 62 53 56 61 6c 75 65 20 7b  truct SbSValue {
0d50: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
0d60: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
0d70: 6f 66 20 53 42 53 56 41 4c 5f 2a 20 76 61 6c 75  of SBSVAL_* valu
0d80: 65 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a  es */.  union {.
0d90: 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20      struct {.   
0da0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
0db0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0dc0: 20 62 79 74 65 73 20 69 6e 20 73 74 72 69 6e 67   bytes in string
0dd0: 2c 20 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 66  , not counting f
0de0: 69 6e 61 6c 20 7a 65 72 6f 20 2a 2f 0a 20 20 20  inal zero */.   
0df0: 20 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20     char *z;     
0e00: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
0e10: 6f 20 73 74 72 69 6e 67 20 63 6f 6e 74 65 6e 74  o string content
0e20: 20 2a 2f 0a 20 20 20 20 7d 20 73 74 72 3b 20 20   */.    } str;  
0e30: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
0e40: 20 69 66 20 53 42 53 56 41 4c 5f 53 54 52 20 2a   if SBSVAL_STR *
0e50: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20  /.    struct {. 
0e60: 20 20 20 20 20 69 6e 74 20 28 2a 78 56 65 72 62       int (*xVerb
0e70: 29 28 53 75 62 73 63 72 69 70 74 2a 2c 20 76 6f  )(Subscript*, vo
0e80: 69 64 2a 29 3b 20 20 20 20 20 2f 2a 20 46 75 6e  id*);     /* Fun
0e90: 63 74 69 6f 6e 20 74 6f 20 64 6f 20 74 68 65 20  ction to do the 
0ea0: 77 6f 72 6b 20 2a 2f 0a 20 20 20 20 20 20 76 6f  work */.      vo
0eb0: 69 64 20 2a 70 41 72 67 3b 20 20 20 20 20 20 20  id *pArg;       
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 2f 2a 20 32 6e 64 20 70 61 72 61 6d 65     /* 2nd parame
0ee0: 74 65 72 20 74 6f 20 78 56 65 72 62 20 2a 2f 0a  ter to xVerb */.
0ef0: 20 20 20 20 7d 20 76 65 72 62 3b 20 20 20 20 20      } verb;     
0f00: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 66 20      /* Value if 
0f10: 53 42 53 56 41 4c 5f 56 45 52 42 20 2a 2f 0a 20  SBSVAL_VERB */. 
0f20: 20 7d 20 75 3b 20 20 20 20 20 20 20 20 20 20 20   } u;           
0f30: 20 20 20 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53     .};.#define S
0f40: 42 53 56 41 4c 5f 56 45 52 42 20 20 20 20 30 78  BSVAL_VERB    0x
0f50: 30 30 30 31 20 20 20 20 20 20 2f 2a 20 56 61 6c  0001      /* Val
0f60: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 76  ue stored in u.v
0f70: 65 72 62 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  erb */.#define S
0f80: 42 53 56 41 4c 5f 53 54 52 20 20 20 20 20 30 78  BSVAL_STR     0x
0f90: 30 30 30 32 20 20 20 20 20 20 2f 2a 20 56 61 6c  0002      /* Val
0fa0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 73  ue stored in u.s
0fb0: 74 72 20 2a 2f 20 0a 23 64 65 66 69 6e 65 20 53  tr */ .#define S
0fc0: 42 53 56 41 4c 5f 44 59 4e 20 20 20 20 20 30 78  BSVAL_DYN     0x
0fd0: 30 30 30 34 20 20 20 20 20 20 2f 2a 20 75 2e 73  0004      /* u.s
0fe0: 74 72 2e 7a 20 69 73 20 64 79 6e 61 6d 69 63 61  tr.z is dynamica
0ff0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  lly allocated */
1000: 0a 23 64 65 66 69 6e 65 20 53 42 53 56 41 4c 5f  .#define SBSVAL_
1010: 45 58 45 43 20 20 20 20 30 78 30 30 30 38 20 20  EXEC    0x0008  
1020: 20 20 20 20 2f 2a 20 75 2e 73 74 72 2e 7a 20 69      /* u.str.z i
1030: 73 20 61 20 73 63 72 69 70 74 20 2a 2f 0a 0a 2f  s a script */../
1040: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 69 6e  *.** An entry in
1050: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
1060: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
1070: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1080: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1090: 75 63 74 20 53 62 73 48 61 73 68 45 6e 74 72 79  uct SbsHashEntry
10a0: 20 53 62 73 48 61 73 68 45 6e 74 72 79 3b 0a 73   SbsHashEntry;.s
10b0: 74 72 75 63 74 20 53 62 73 48 61 73 68 45 6e 74  truct SbsHashEnt
10c0: 72 79 20 7b 0a 20 20 53 62 73 48 61 73 68 45 6e  ry {.  SbsHashEn
10d0: 74 72 79 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  try *pNext;     
10e0: 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
10f0: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
1100: 20 6f 6e 20 7a 4b 65 79 20 2a 2f 0a 20 20 53 62   on zKey */.  Sb
1110: 53 56 61 6c 75 65 20 76 61 6c 3b 20 20 20 20 20  SValue val;     
1120: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1130: 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  yload */.  int n
1140: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
1150: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
1160: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  the key */.  cha
1170: 72 20 7a 4b 65 79 5b 31 5d 3b 20 20 20 20 20 20  r zKey[1];      
1180: 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
1190: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 68  */.};../*.** A h
11a0: 61 73 68 20 74 61 62 6c 65 20 69 73 20 61 6e 20  ash table is an 
11b0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
11c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
11d0: 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ure..*/.typedef 
11e0: 73 74 72 75 63 74 20 53 62 73 48 61 73 68 54 61  struct SbsHashTa
11f0: 62 20 53 62 73 48 61 73 68 54 61 62 3b 0a 73 74  b SbsHashTab;.st
1200: 72 75 63 74 20 53 62 73 48 61 73 68 54 61 62 20  ruct SbsHashTab 
1210: 7b 0a 20 20 53 62 73 48 61 73 68 45 6e 74 72 79  {.  SbsHashEntry
1220: 20 2a 61 48 61 73 68 5b 53 42 53 43 4f 4e 46 49   *aHash[SBSCONFI
1230: 47 5f 4e 48 41 53 48 5d 3b 20 20 2f 2a 20 54 68  G_NHASH];  /* Th
1240: 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
1250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
1260: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62  tance of the Sub
1270: 73 63 72 69 70 74 20 69 6e 74 65 72 70 72 65 74  script interpret
1280: 65 72 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 62  er.*/.struct Sub
1290: 73 63 72 69 70 74 20 7b 0a 20 20 69 6e 74 20 6e  script {.  int n
12a0: 53 74 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  Stack;          
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
12d0: 65 73 20 6f 6e 20 73 74 61 63 6b 20 2a 2f 0a 20  es on stack */. 
12e0: 20 53 62 73 48 61 73 68 54 61 62 20 73 79 6d 54   SbsHashTab symT
12f0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
1300: 20 20 20 20 2f 2a 20 54 68 65 20 73 79 6d 62 6f      /* The symbo
1310: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61  l table */.  cha
1320: 72 20 7a 45 72 72 4d 73 67 5b 53 42 53 43 4f 4e  r zErrMsg[SBSCON
1330: 46 49 47 5f 45 52 52 53 49 5a 45 5d 3b 20 20 20  FIG_ERRSIZE];   
1340: 2f 2a 20 53 70 61 63 65 20 74 6f 20 77 72 69 74  /* Space to writ
1350: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
1360: 67 65 20 2a 2f 0a 20 20 53 62 53 56 61 6c 75 65  ge */.  SbSValue
1370: 20 61 53 74 61 63 6b 5b 53 42 53 43 4f 4e 46 49   aStack[SBSCONFI
1380: 47 5f 4e 53 54 41 43 4b 5d 3b 20 2f 2a 20 54 68  G_NSTACK]; /* Th
1390: 65 20 73 74 61 63 6b 20 2a 2f 0a 7d 3b 0a 0a 0a  e stack */.};...
13a0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 69  /*.** Given an i
13b0: 6e 70 75 74 20 73 74 72 69 6e 67 20 7a 20 6f 66  nput string z of
13c0: 20 6c 65 6e 67 74 68 20 6e 2c 20 69 64 65 6e 74   length n, ident
13d0: 69 66 79 20 74 68 65 20 74 6f 6b 65 6e 20 74 68  ify the token th
13e0: 61 74 0a 2a 2a 20 73 74 61 72 74 73 20 61 74 20  at.** starts at 
13f0: 7a 5b 30 5d 2e 20 20 57 72 69 74 65 20 74 68 65  z[0].  Write the
1400: 20 74 6f 6b 65 6e 20 74 79 70 65 20 69 6e 74 6f   token type into
1410: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 61 6e 64   *pTokenType and
1420: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6c  .** return the l
1430: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 74 6f 6b  ength of the tok
1440: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
1450: 74 20 73 62 73 5f 6e 65 78 74 5f 74 6f 6b 65 6e  t sbs_next_token
1460: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1470: 69 6e 74 20 6e 2c 20 69 6e 74 20 2a 70 54 6f 6b  int n, int *pTok
1480: 65 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 63  enType){.  int c
1490: 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 7c 7c 20  ;.  if( n<=0 || 
14a0: 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  z[0]==0 ){.    *
14b0: 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53  pTokenType = SBS
14c0: 54 54 5f 45 4f 46 3b 0a 20 20 20 20 72 65 74 75  TT_EOF;.    retu
14d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 20 3d 20  rn 0;.  }.  c = 
14e0: 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 69 73 73 70  z[0];.  if( issp
14f0: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 69 6e  ace(c) ){.    in
1500: 74 20 69 3b 0a 20 20 20 20 2a 70 54 6f 6b 65 6e  t i;.    *pToken
1510: 54 79 70 65 20 3d 20 53 42 53 54 54 5f 57 48 49  Type = SBSTT_WHI
1520: 54 45 53 50 41 43 45 3b 0a 20 20 20 20 66 6f 72  TESPACE;.    for
1530: 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 69 73 73  (i=1; i<n && iss
1540: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
1550: 7b 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b  {}.    return i;
1560: 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 23  .  }.  if( c=='#
1570: 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ' ){.    int i;.
1580: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
1590: 20 26 26 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 2d   && z[i] && z[i-
15a0: 31 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d  1]!='\n'; i++){}
15b0: 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65  .    *pTokenType
15c0: 20 3d 20 53 42 53 54 54 5f 57 48 49 54 45 53 50   = SBSTT_WHITESP
15d0: 41 43 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ACE;.    return 
15e0: 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d  i;.  }.  if( c==
15f0: 27 7b 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  '{' ){.    int d
1600: 65 70 74 68 20 3d 20 31 3b 0a 20 20 20 20 69 6e  epth = 1;.    in
1610: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
1620: 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d 3b 20 69  ; i<n && z[i]; i
1630: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
1640: 5b 69 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20  [i]=='{' ){.    
1650: 20 20 20 20 64 65 70 74 68 2b 2b 3b 0a 20 20 20      depth++;.   
1660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
1670: 5d 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='}' ){.      
1680: 20 20 64 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20    depth--;.     
1690: 20 20 20 69 66 28 20 64 65 70 74 68 3d 3d 30 20     if( depth==0 
16a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  ){.          i++
16b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
16d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16e0: 66 28 20 64 65 70 74 68 20 29 7b 0a 20 20 20 20  f( depth ){.    
16f0: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20    *pTokenType = 
1700: 53 42 53 54 54 5f 49 4e 43 4f 4d 50 4c 45 54 45  SBSTT_INCOMPLETE
1710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1720: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
1730: 20 53 42 53 54 54 5f 53 54 52 49 4e 47 3b 0a 20   SBSTT_STRING;. 
1740: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1750: 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d  i;.  }.  if( c==
1760: 27 2f 27 20 26 26 20 6e 3e 3d 32 20 26 26 20 69  '/' && n>=2 && i
1770: 73 61 6c 70 68 61 28 7a 5b 31 5d 29 20 29 7b 0a  salpha(z[1]) ){.
1780: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1790: 6f 72 28 69 3d 32 3b 20 69 3c 6e 20 26 26 20 28  or(i=2; i<n && (
17a0: 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 7c 7c  isalnum(z[i]) ||
17b0: 20 7a 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2b 2b   z[i]=='_'); i++
17c0: 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54  ){}.    *pTokenT
17d0: 79 70 65 20 3d 20 53 42 53 54 54 5f 4e 41 4d 45  ype = SBSTT_NAME
17e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a  ;.    return i;.
17f0: 20 20 7d 0a 20 20 69 66 28 20 69 73 61 6c 70 68    }.  if( isalph
1800: 61 28 63 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  a(c) ){.    int 
1810: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
1820: 69 3c 6e 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  i<n && (isalnum(
1830: 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27  z[i]) || z[i]=='
1840: 5f 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  _'); i++){}.    
1850: 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42  *pTokenType = SB
1860: 53 54 54 5f 56 45 52 42 3b 0a 20 20 20 20 72 65  STT_VERB;.    re
1870: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66  turn i;.  }.  if
1880: 28 20 69 73 64 69 67 69 74 28 63 29 20 7c 7c 20  ( isdigit(c) || 
1890: 28 28 63 3d 3d 27 2d 27 20 7c 7c 20 63 3d 3d 27  ((c=='-' || c=='
18a0: 2b 27 29 20 26 26 20 6e 3e 3d 32 20 26 26 20 69  +') && n>=2 && i
18b0: 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b  sdigit(z[1])) ){
18c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18d0: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20  for(i=1; i<n && 
18e0: 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 3b 20 69  isdigit(z[i]); i
18f0: 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65  ++){}.    *pToke
1900: 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 49 4e  nType = SBSTT_IN
1910: 54 45 47 45 52 3b 0a 20 20 20 20 72 65 74 75 72  TEGER;.    retur
1920: 6e 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 54 6f 6b  n i;.  }.  *pTok
1930: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 55  enType = SBSTT_U
1940: 4e 4b 4e 4f 57 4e 3b 0a 20 20 72 65 74 75 72 6e  NKNOWN;.  return
1950: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65   1;.}.../*.** Re
1960: 6c 65 61 73 65 20 61 6e 79 20 6d 65 6d 6f 72 79  lease any memory
1970: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20   allocated by a 
1980: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1990: 20 76 6f 69 64 20 73 62 73 5f 76 61 6c 75 65 5f   void sbs_value_
19a0: 72 65 73 65 74 28 53 62 53 56 61 6c 75 65 20 2a  reset(SbSValue *
19b0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  p){.  if( p->fla
19c0: 67 73 20 26 20 53 42 53 56 41 4c 5f 44 59 4e 20  gs & SBSVAL_DYN 
19d0: 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 75  ){.    free(p->u
19e0: 2e 73 74 72 2e 7a 29 3b 0a 20 20 20 20 70 2d 3e  .str.z);.    p->
19f0: 66 6c 61 67 73 20 3d 20 53 42 53 56 41 4c 5f 53  flags = SBSVAL_S
1a00: 54 52 3b 0a 20 20 20 20 70 2d 3e 75 2e 73 74 72  TR;.    p->u.str
1a10: 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20 70 2d 3e  .z = "";.    p->
1a20: 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20 30 3b 0a  u.str.size = 0;.
1a30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1a40: 70 75 74 65 20 61 20 68 61 73 68 20 6f 6e 20 61  pute a hash on a
1a50: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
1a60: 69 63 20 69 6e 74 20 73 62 73 5f 68 61 73 68 28  ic int sbs_hash(
1a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1a80: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d  nt n){.  int h =
1a90: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
1aa0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
1ab0: 29 7b 0a 20 20 20 20 68 20 5e 3d 20 28 68 3c 3c  ){.    h ^= (h<<
1ac0: 31 29 20 7c 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  1) | z[i];.  }. 
1ad0: 20 68 20 26 3d 20 30 78 37 66 66 66 66 66 66 3b   h &= 0x7ffffff;
1ae0: 0a 20 20 72 65 74 75 72 6e 20 68 20 25 20 53 42  .  return h % SB
1af0: 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 3b 0a 7d  SCONFIG_NHASH;.}
1b00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20  ../*.** Look up 
1b10: 61 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  a value in the h
1b20: 61 73 68 20 74 61 62 6c 65 2e 20 20 52 65 74 75  ash table.  Retu
1b30: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1b40: 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 52 65  the value..** Re
1b50: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1b60: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
1b70: 63 20 63 6f 6e 73 74 20 53 62 53 56 61 6c 75 65  c const SbSValue
1b80: 20 2a 73 62 73 5f 66 65 74 63 68 28 0a 20 20 53   *sbs_fetch(.  S
1b90: 62 73 48 61 73 68 54 61 62 20 2a 70 48 61 73 68  bsHashTab *pHash
1ba0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1bb0: 2a 7a 4b 65 79 2c 20 0a 20 20 69 6e 74 20 6e 4b  *zKey, .  int nK
1bc0: 65 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey.){.  int h;. 
1bd0: 20 53 62 73 48 61 73 68 45 6e 74 72 79 20 2a 70   SbsHashEntry *p
1be0: 3b 0a 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30 20  ;..  if( nKey<0 
1bf0: 29 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28  ) nKey = strlen(
1c00: 7a 4b 65 79 29 3b 0a 20 20 68 20 3d 20 73 62 73  zKey);.  h = sbs
1c10: 5f 68 61 73 68 28 7a 4b 65 79 2c 20 6e 4b 65 79  _hash(zKey, nKey
1c20: 29 3b 0a 20 20 66 6f 72 28 70 20 3d 20 70 48 61  );.  for(p = pHa
1c30: 73 68 2d 3e 61 48 61 73 68 5b 68 5d 3b 20 70 3b  sh->aHash[h]; p;
1c40: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1c50: 20 20 69 66 28 20 70 2d 3e 6e 4b 65 79 3d 3d 6e    if( p->nKey==n
1c60: 4b 65 79 20 26 26 20 6d 65 6d 63 6d 70 28 70 2d  Key && memcmp(p-
1c70: 3e 7a 4b 65 79 2c 7a 4b 65 79 2c 6e 4b 65 79 29  >zKey,zKey,nKey)
1c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1c90: 75 72 6e 20 26 70 2d 3e 76 61 6c 3b 0a 20 20 20  urn &p->val;.   
1ca0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1cb0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72  0;.}../*.** Stor
1cc0: 65 20 61 20 76 61 6c 75 65 20 69 6e 20 74 68 65  e a value in the
1cd0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4f 76   hash table.  Ov
1ce0: 65 72 77 72 69 74 65 20 61 6e 79 20 70 72 69 6f  erwrite any prio
1cf0: 72 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a 2a  r value stored.*
1d00: 2a 20 75 6e 64 65 72 20 74 68 65 20 73 61 6d 65  * under the same
1d10: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
1d20: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
1d30: 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6e 65   4th argument ne
1d40: 65 64 73 20 74 6f 20 62 65 20 72 65 73 65 74 20  eds to be reset 
1d50: 6f 72 20 66 72 65 65 64 2c 0a 2a 2a 20 74 68 65  or freed,.** the
1d60: 20 68 61 73 68 20 74 61 62 6c 65 20 77 69 6c 6c   hash table will
1d70: 20 74 61 6b 65 20 6f 76 65 72 20 72 65 73 70 6f   take over respo
1d80: 6e 73 69 62 69 6c 69 69 74 79 20 66 6f 72 20 64  nsibiliity for d
1d90: 6f 69 6e 67 20 73 6f 2e 0a 2a 2f 0a 73 74 61 74  oing so..*/.stat
1da0: 69 63 20 69 6e 74 20 73 62 73 5f 73 74 6f 72 65  ic int sbs_store
1db0: 28 0a 20 20 53 62 73 48 61 73 68 54 61 62 20 2a  (.  SbsHashTab *
1dc0: 70 48 61 73 68 2c 20 20 20 20 20 20 20 2f 2a 20  pHash,       /* 
1dd0: 49 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 69 73  Insert into this
1de0: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
1df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
1e00: 79 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  y,        /* The
1e10: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b   key */.  int nK
1e20: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1e30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1e40: 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
1e50: 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 75   SbSValue *pValu
1e60: 65 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  e   /* The value
1e70: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 2a 2f   to be stored */
1e80: 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 53  .){.  int h;.  S
1e90: 62 73 48 61 73 68 45 6e 74 72 79 20 2a 70 2c 20  bsHashEntry *p, 
1ea0: 2a 70 4e 65 77 3b 0a 0a 20 20 69 66 28 20 6e 4b  *pNew;..  if( nK
1eb0: 65 79 3c 30 20 29 20 6e 4b 65 79 20 3d 20 73 74  ey<0 ) nKey = st
1ec0: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 68 20  rlen(zKey);.  h 
1ed0: 3d 20 73 62 73 5f 68 61 73 68 28 7a 4b 65 79 2c  = sbs_hash(zKey,
1ee0: 20 6e 4b 65 79 29 3b 0a 20 20 66 6f 72 28 70 20   nKey);.  for(p 
1ef0: 3d 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b 68  = pHash->aHash[h
1f00: 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ]; p; p=p->pNext
1f10: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4b  ){.    if( p->nK
1f20: 65 79 3d 3d 6e 4b 65 79 20 26 26 20 6d 65 6d 63  ey==nKey && memc
1f30: 6d 70 28 70 2d 3e 7a 4b 65 79 2c 7a 4b 65 79 2c  mp(p->zKey,zKey,
1f40: 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nKey)==0 ){.    
1f50: 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65    sbs_value_rese
1f60: 74 28 26 70 2d 3e 76 61 6c 29 3b 0a 20 20 20 20  t(&p->val);.    
1f70: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 76 61 6c    memcpy(&p->val
1f80: 2c 20 70 56 61 6c 75 65 2c 20 73 69 7a 65 6f 66  , pValue, sizeof
1f90: 28 70 2d 3e 76 61 6c 29 29 3b 0a 20 20 20 20 20  (p->val));.     
1fa0: 20 72 65 74 75 72 6e 20 53 42 53 5f 4f 4b 3b 0a   return SBS_OK;.
1fb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
1fc0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
1fd0: 66 28 2a 70 4e 65 77 29 20 2b 20 6e 4b 65 79 20  f(*pNew) + nKey 
1fe0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
1ff0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4b 65 79 20  .    pNew->nKey 
2000: 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6d 65 6d 63  = nKey;.    memc
2010: 70 79 28 70 4e 65 77 2d 3e 7a 4b 65 79 2c 20 7a  py(pNew->zKey, z
2020: 4b 65 79 2c 20 6e 4b 65 79 2b 31 29 3b 0a 20 20  Key, nKey+1);.  
2030: 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
2040: 76 61 6c 2c 20 70 56 61 6c 75 65 2c 20 73 69 7a  val, pValue, siz
2050: 65 6f 66 28 70 4e 65 77 2d 3e 76 61 6c 29 29 3b  eof(pNew->val));
2060: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  .    pNew->pNext
2070: 20 3d 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b   = pHash->aHash[
2080: 68 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e 61  h];.    pHash->a
2090: 48 61 73 68 5b 68 5d 20 3d 20 70 4e 65 77 3b 0a  Hash[h] = pNew;.
20a0: 20 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f 4f      return SBS_O
20b0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
20c0: 53 42 53 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  SBS_ERROR;.}../*
20d0: 0a 2a 2a 20 52 65 73 65 74 20 61 20 68 61 73 68  .** Reset a hash
20e0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
20f0: 63 20 76 6f 69 64 20 73 62 73 5f 68 61 73 68 5f  c void sbs_hash_
2100: 72 65 73 65 74 28 53 62 73 48 61 73 68 54 61 62  reset(SbsHashTab
2110: 20 2a 70 48 61 73 68 29 7b 0a 20 20 69 6e 74 20   *pHash){.  int 
2120: 69 3b 0a 20 20 53 62 73 48 61 73 68 45 6e 74 72  i;.  SbsHashEntr
2130: 79 20 2a 70 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  y *p, *pNext;.  
2140: 66 6f 72 28 69 3d 30 3b 20 69 3c 53 42 53 43 4f  for(i=0; i<SBSCO
2150: 4e 46 49 47 5f 4e 48 41 53 48 3b 20 69 2b 2b 29  NFIG_NHASH; i++)
2160: 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 48 61 73  {.    for(p=pHas
2170: 68 2d 3e 61 48 61 73 68 5b 69 5d 3b 20 70 3b 20  h->aHash[i]; p; 
2180: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  p=pNext){.      
2190: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
21a0: 3b 0a 20 20 20 20 20 20 73 62 73 5f 76 61 6c 75  ;.      sbs_valu
21b0: 65 5f 72 65 73 65 74 28 26 70 2d 3e 76 61 6c 29  e_reset(&p->val)
21c0: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 70 29 3b  ;.      free(p);
21d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d  .    }.  }.  mem
21e0: 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20 73 69  set(pHash, 0, si
21f0: 7a 65 6f 66 28 2a 70 48 61 73 68 29 29 3b 0a 7d  zeof(*pHash));.}
2200: 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20 76  ../*.** Push a v
2210: 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73 74  alue onto the st
2220: 61 63 6b 20 6f 66 20 61 6e 20 69 6e 74 65 72 70  ack of an interp
2230: 72 65 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  reter.*/.static 
2240: 69 6e 74 20 73 62 73 5f 70 75 73 68 28 53 75 62  int sbs_push(Sub
2250: 73 63 72 69 70 74 20 2a 70 2c 20 53 62 53 56 61  script *p, SbSVa
2260: 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 66  lue *pVal){.  if
2270: 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 53 42 53  ( p->nStack>=SBS
2280: 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20 29 7b  CONFIG_NSTACK ){
2290: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
22a0: 72 69 6e 74 66 28 53 42 53 43 4f 4e 46 49 47 5f  rintf(SBSCONFIG_
22b0: 45 52 52 53 49 5a 45 2c 20 70 2d 3e 7a 45 72 72  ERRSIZE, p->zErr
22c0: 4d 73 67 2c 20 22 73 74 61 63 6b 20 6f 76 65 72  Msg, "stack over
22d0: 66 6c 6f 77 22 29 3b 0a 20 20 20 20 72 65 74 75  flow");.    retu
22e0: 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20  rn SBS_ERROR;.  
22f0: 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d  }.  p->aStack[p-
2300: 3e 6e 53 74 61 63 6b 2b 2b 5d 20 3d 20 2a 70 56  >nStack++] = *pV
2310: 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 42 53  al;.  return SBS
2320: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
2330: 65 61 74 65 20 61 20 6e 65 77 20 73 75 62 73 63  eate a new subsc
2340: 72 69 70 74 20 69 6e 74 65 72 70 72 65 74 65 72  ript interpreter
2350: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2360: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65  ter to the.** ne
2370: 77 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 6f  w interpreter, o
2380: 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  r return NULL if
2390: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
23a0: 2f 0a 73 74 72 75 63 74 20 53 75 62 73 63 72 69  /.struct Subscri
23b0: 70 74 20 2a 53 62 53 5f 43 72 65 61 74 65 28 76  pt *SbS_Create(v
23c0: 6f 69 64 29 7b 0a 20 20 53 75 62 73 63 72 69 70  oid){.  Subscrip
23d0: 74 20 2a 70 3b 0a 20 20 70 20 3d 20 6d 61 6c 6c  t *p;.  p = mall
23e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
23f0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
2400: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
2410: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7d 0a 20  zeof(*p));.  }. 
2420: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2430: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 61 6e 20 73  .** Destroy an s
2440: 75 62 73 63 72 69 70 74 20 69 6e 74 65 72 70 72  ubscript interpr
2450: 65 74 65 72 0a 2a 2f 0a 76 6f 69 64 20 53 62 53  eter.*/.void SbS
2460: 5f 44 65 73 74 72 6f 79 28 73 74 72 75 63 74 20  _Destroy(struct 
2470: 53 75 62 73 63 72 69 70 74 20 2a 70 29 7b 0a 20  Subscript *p){. 
2480: 20 69 6e 74 20 69 3b 0a 20 20 73 62 73 5f 68 61   int i;.  sbs_ha
2490: 73 68 5f 72 65 73 65 74 28 26 70 2d 3e 73 79 6d  sh_reset(&p->sym
24a0: 54 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Tab);.  for(i=0;
24b0: 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69 2b   i<p->nStack; i+
24c0: 2b 29 7b 0a 20 20 20 20 73 62 73 5f 76 61 6c 75  +){.    sbs_valu
24d0: 65 5f 72 65 73 65 74 28 26 70 2d 3e 61 53 74 61  e_reset(&p->aSta
24e0: 63 6b 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 72  ck[i]);.  }.  fr
24f0: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
2500: 53 65 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65  Set the error me
2510: 73 73 61 67 65 20 66 6f 72 20 61 6e 20 69 6e 74  ssage for an int
2520: 65 72 70 72 65 74 65 72 2e 20 20 56 65 72 62 20  erpreter.  Verb 
2530: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a  implementations.
2540: 2a 2a 20 75 73 65 20 74 68 69 73 20 72 6f 75 74  ** use this rout
2550: 69 6e 65 20 77 68 65 6e 20 74 68 65 79 20 65 6e  ine when they en
2560: 63 6f 75 6e 74 65 72 20 61 6e 20 65 72 72 6f 72  counter an error
2570: 2e 0a 2a 2f 0a 76 6f 69 64 20 53 62 53 5f 53 65  ..*/.void SbS_Se
2580: 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73 74  tErrorMessage(st
2590: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a  ruct Subscript *
25a0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
25b0: 45 72 72 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74  Err, ...){.  int
25c0: 20 6e 45 72 72 3b 0a 20 20 63 68 61 72 20 2a 7a   nErr;.  char *z
25d0: 4d 73 67 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61  Msg;.  va_list a
25e0: 70 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  p;..  va_start(a
25f0: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7a 4d 73 67  p, zErr);.  zMsg
2600: 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 45 72 72   = vmprintf(zErr
2610: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2620: 61 70 29 3b 0a 20 20 6e 45 72 72 20 3d 20 73 74  ap);.  nErr = st
2630: 72 6c 65 6e 28 7a 4d 73 67 29 3b 0a 20 20 69 66  rlen(zMsg);.  if
2640: 28 20 6e 45 72 72 3e 73 69 7a 65 6f 66 28 70 2d  ( nErr>sizeof(p-
2650: 3e 7a 45 72 72 4d 73 67 29 2d 31 20 29 7b 0a 20  >zErrMsg)-1 ){. 
2660: 20 20 20 6e 45 72 72 20 3d 20 73 69 7a 65 6f 66     nErr = sizeof
2670: 28 70 2d 3e 7a 45 72 72 4d 73 67 29 2d 31 3b 0a  (p->zErrMsg)-1;.
2680: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e    }.  memcpy(p->
2690: 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 2c 20 6e  zErrMsg, zMsg, n
26a0: 45 72 72 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Err);.  p->zErrM
26b0: 73 67 5b 6e 45 72 72 5d 20 3d 20 30 3b 0a 20 20  sg[nErr] = 0;.  
26c0: 66 72 65 65 28 7a 4d 73 67 29 3b 0a 7d 0a 0a 2f  free(zMsg);.}../
26d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
26e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 75 72  inter to the cur
26f0: 72 65 6e 74 20 65 72 72 6f 72 20 6d 65 73 73 61  rent error messa
2700: 67 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ge for the.** in
2710: 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 63 6f  terpreter..*/.co
2720: 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 47 65  nst char *SbS_Ge
2730: 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73 74  tErrorMessage(st
2740: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a  ruct Subscript *
2750: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
2760: 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  zErrMsg;.}../*.*
2770: 2a 20 41 64 64 20 61 20 6e 65 77 20 76 65 72 62  * Add a new verb
2780: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 74 65 72   the given inter
2790: 70 72 65 74 65 72 0a 2a 2f 0a 69 6e 74 20 53 62  preter.*/.int Sb
27a0: 53 5f 41 64 64 56 65 72 62 28 0a 20 20 73 74 72  S_AddVerb(.  str
27b0: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70  uct Subscript *p
27c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
27d0: 7a 56 65 72 62 2c 0a 20 20 69 6e 74 20 28 2a 78  zVerb,.  int (*x
27e0: 56 65 72 62 29 28 73 74 72 75 63 74 20 53 75 62  Verb)(struct Sub
27f0: 73 63 72 69 70 74 2a 2c 76 6f 69 64 2a 29 2c 0a  script*,void*),.
2800: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
2810: 20 20 53 62 53 56 61 6c 75 65 20 76 3b 0a 20 20    SbSValue v;.  
2820: 76 2e 66 6c 61 67 73 20 3d 20 53 42 53 56 41 4c  v.flags = SBSVAL
2830: 5f 56 45 52 42 3b 0a 20 20 76 2e 75 2e 76 65 72  _VERB;.  v.u.ver
2840: 62 2e 78 56 65 72 62 20 3d 20 78 56 65 72 62 3b  b.xVerb = xVerb;
2850: 0a 20 20 76 2e 75 2e 76 65 72 62 2e 70 41 72 67  .  v.u.verb.pArg
2860: 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72   = pArg;.  retur
2870: 6e 20 73 62 73 5f 73 74 6f 72 65 28 26 70 2d 3e  n sbs_store(&p->
2880: 73 79 6d 54 61 62 2c 20 7a 56 65 72 62 2c 20 2d  symTab, zVerb, -
2890: 31 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1, &v);.}../*.**
28a0: 20 53 74 6f 72 65 20 61 20 76 61 6c 75 65 20 69   Store a value i
28b0: 6e 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  n an interpreter
28c0: 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   variable..*/.in
28d0: 74 20 53 62 53 5f 53 74 6f 72 65 28 0a 20 20 73  t SbS_Store(.  s
28e0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
28f0: 2a 70 2c 20 20 20 2f 2a 20 53 74 6f 72 65 20 69  *p,   /* Store i
2900: 6e 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72  nto this interpr
2910: 65 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  eter */.  const 
2920: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
2930: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2940: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  variable */.  co
2950: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65  nst char *zValue
2960: 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66  ,    /* Value of
2970: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 2a 2f   the variable */
2980: 0a 20 20 69 6e 74 20 70 65 72 73 69 73 74 65 6e  .  int persisten
2990: 63 65 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20  ce        /* 0: 
29a0: 73 74 61 74 69 63 2e 20 20 31 3a 20 65 70 68 65  static.  1: ephe
29b0: 6d 65 72 61 6c 2e 20 20 32 3a 20 64 79 6e 61 6d  meral.  2: dynam
29c0: 69 63 20 2a 2f 0a 29 7b 0a 20 20 53 62 53 56 61  ic */.){.  SbSVa
29d0: 6c 75 65 20 76 3b 0a 20 20 76 2e 66 6c 61 67 73  lue v;.  v.flags
29e0: 20 3d 20 53 42 53 56 41 4c 5f 53 54 52 3b 0a 20   = SBSVAL_STR;. 
29f0: 20 76 2e 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20   v.u.str.size = 
2a00: 73 74 72 6c 65 6e 28 7a 56 61 6c 75 65 29 3b 0a  strlen(zValue);.
2a10: 20 20 69 66 28 20 70 65 72 73 69 73 74 65 6e 63    if( persistenc
2a20: 65 3d 3d 31 20 29 7b 0a 20 20 20 20 76 2e 75 2e  e==1 ){.    v.u.
2a30: 73 74 72 2e 7a 20 3d 20 6d 70 72 69 6e 74 66 28  str.z = mprintf(
2a40: 22 25 73 22 2c 20 7a 56 61 6c 75 65 29 3b 0a 20  "%s", zValue);. 
2a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2e 75 2e   }else{.    v.u.
2a60: 73 74 72 2e 7a 20 3d 20 28 63 68 61 72 2a 29 7a  str.z = (char*)z
2a70: 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Value;.  }.  if(
2a80: 20 70 65 72 73 69 73 74 65 6e 63 65 3e 30 20 29   persistence>0 )
2a90: 7b 0a 20 20 20 20 76 2e 66 6c 61 67 73 20 7c 3d  {.    v.flags |=
2aa0: 20 53 42 53 56 41 4c 5f 44 59 4e 3b 0a 20 20 7d   SBSVAL_DYN;.  }
2ab0: 0a 20 20 72 65 74 75 72 6e 20 73 62 73 5f 73 74  .  return sbs_st
2ac0: 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62 2c 20  ore(&p->symTab, 
2ad0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 26 76 29 3b 0a  zName, -1, &v);.
2ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20  }../*.** Push a 
2af0: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 6e 74  string value ont
2b00: 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  o the stack..**.
2b10: 2a 2a 20 49 66 20 74 68 65 20 34 74 68 20 70 61  ** If the 4th pa
2b20: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
2b30: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  en the string is
2b40: 20 73 74 61 74 69 63 2e 0a 2a 2a 20 49 66 20 74   static..** If t
2b50: 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72  he 4th parameter
2b60: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65   is non-zero the
2b70: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 77 61 73  n the string was
2b80: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
2b90: 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 53 75 62  m malloc and Sub
2ba0: 73 63 72 69 70 74 20 77 69 6c 6c 20 74 61 6b 65  script will take
2bb0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2bc0: 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 69  for freeing.** i
2bd0: 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
2be0: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  0 on success and
2bf0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2c00: 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a  re is an error..
2c10: 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75 73 68 28  */.int SbS_Push(
2c20: 0a 20 20 73 74 72 75 63 74 20 53 75 62 73 63 72  .  struct Subscr
2c30: 69 70 74 20 2a 70 2c 20 20 2f 2a 20 50 75 73 68  ipt *p,  /* Push
2c40: 20 6f 6e 74 6f 20 74 68 69 73 20 69 6e 74 65 72   onto this inter
2c50: 70 72 65 74 65 72 20 2a 2f 0a 20 20 63 68 61 72  preter */.  char
2c60: 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20   *z,            
2c70: 20 20 2f 2a 20 53 74 72 69 6e 67 20 76 61 6c 75    /* String valu
2c80: 65 20 74 6f 20 70 75 73 68 20 2a 2f 0a 20 20 69  e to push */.  i
2c90: 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
2ca0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
2cb0: 66 20 74 68 65 20 73 74 72 69 6e 67 2c 20 6f 72  f the string, or
2cc0: 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 64 79 6e   -1 */.  int dyn
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ce0: 2a 20 49 66 20 74 72 75 65 2c 20 7a 20 77 61 73  * If true, z was
2cf0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
2d00: 61 6c 6c 6f 63 20 2a 2f 0a 29 7b 0a 20 20 53 62  alloc */.){.  Sb
2d10: 53 56 61 6c 75 65 20 76 3b 0a 20 20 76 2e 66 6c  SValue v;.  v.fl
2d20: 61 67 73 20 3d 20 53 42 53 56 41 4c 5f 53 54 52  ags = SBSVAL_STR
2d30: 3b 0a 20 20 69 66 28 20 64 79 6e 20 29 7b 0a 20  ;.  if( dyn ){. 
2d40: 20 20 20 76 2e 66 6c 61 67 73 20 7c 3d 20 53 42     v.flags |= SB
2d50: 53 56 41 4c 5f 44 59 4e 3b 0a 20 20 7d 0a 20 20  SVAL_DYN;.  }.  
2d60: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 73 74  if( n<0 ) n = st
2d70: 72 6c 65 6e 28 7a 29 3b 0a 20 20 76 2e 75 2e 73  rlen(z);.  v.u.s
2d80: 74 72 2e 73 69 7a 65 20 3d 20 6e 3b 0a 20 20 76  tr.size = n;.  v
2d90: 2e 75 2e 73 74 72 2e 7a 20 3d 20 7a 3b 0a 20 20  .u.str.z = z;.  
2da0: 72 65 74 75 72 6e 20 73 62 73 5f 70 75 73 68 28  return sbs_push(
2db0: 70 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p, &v);.}../*.**
2dc0: 20 50 75 73 68 20 61 6e 20 69 6e 74 65 67 65 72   Push an integer
2dd0: 20 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20   value onto the 
2de0: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stack..**.** Thi
2df0: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 6c 6c 79  s routine really
2e00: 20 6a 75 73 74 20 63 6f 6e 76 65 72 74 73 20 74   just converts t
2e10: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  he integer into 
2e20: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 65 6e  a string.** then
2e30: 20 63 61 6c 6c 73 20 53 62 53 5f 50 75 73 68 2e   calls SbS_Push.
2e40: 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75 73 68  .*/.int SbS_Push
2e50: 49 6e 74 28 73 74 72 75 63 74 20 53 75 62 73 63  Int(struct Subsc
2e60: 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 69 56 61  ript *p, int iVa
2e70: 6c 29 7b 0a 20 20 69 66 28 20 69 56 61 6c 3d 3d  l){.  if( iVal==
2e80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2e90: 53 62 53 5f 50 75 73 68 28 70 2c 20 22 30 22 2c  SbS_Push(p, "0",
2ea0: 20 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   1, 0);.  }else 
2eb0: 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20  if( iVal==1 ){. 
2ec0: 20 20 20 72 65 74 75 72 6e 20 53 62 53 5f 50 75     return SbS_Pu
2ed0: 73 68 28 70 2c 20 22 31 22 2c 20 31 2c 20 30 29  sh(p, "1", 1, 0)
2ee0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
2ef0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
2f00: 6e 3b 0a 20 20 20 20 63 68 61 72 20 7a 56 61 6c  n;.    char zVal
2f10: 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74  [50];.    sprint
2f20: 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20 69 56  f(zVal, "%d", iV
2f30: 61 6c 29 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72  al);.    n = str
2f40: 6c 65 6e 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7a  len(zVal);.    z
2f50: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29   = malloc( n+1 )
2f60: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
2f70: 20 20 20 20 20 73 74 72 63 70 79 28 7a 2c 20 7a       strcpy(z, z
2f80: 56 61 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Val);.      retu
2f90: 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c 20 7a  rn SbS_Push(p, z
2fa0: 2c 20 6e 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  , n, 1);.    }el
2fb0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
2fc0: 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20   SBS_ERROR;.    
2fd0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2fe0: 6f 70 20 61 6e 64 20 64 65 73 74 72 6f 79 20 7a  op and destroy z
2ff0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75  ero or more valu
3000: 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  es from the stac
3010: 6b 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  k..** Return the
3020: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75 65   number of value
3030: 73 20 72 65 6d 61 69 6e 69 6e 67 20 6f 6e 20 74  s remaining on t
3040: 68 65 20 73 74 61 63 6b 20 61 66 74 65 72 0a 2a  he stack after.*
3050: 2a 20 74 68 65 20 70 6f 70 73 20 6f 63 63 75 72  * the pops occur
3060: 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 6f 70  ..*/.int SbS_Pop
3070: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70  (struct Subscrip
3080: 74 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  t *p, int N){.  
3090: 77 68 69 6c 65 28 20 4e 3e 30 20 26 26 20 70 2d  while( N>0 && p-
30a0: 3e 6e 53 74 61 63 6b 3e 30 20 29 7b 0a 20 20 20  >nStack>0 ){.   
30b0: 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b 0a 20 20   p->nStack--;.  
30c0: 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65    sbs_value_rese
30d0: 74 28 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e  t(&p->aStack[p->
30e0: 6e 53 74 61 63 6b 5d 29 3b 0a 20 20 20 20 4e 2d  nStack]);.    N-
30f0: 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
3100: 70 2d 3e 6e 53 74 61 63 6b 3b 0a 7d 0a 0a 2f 2a  p->nStack;.}../*
3110: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e  .** Return the N
3120: 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  -th element of t
3130: 68 65 20 73 74 61 63 6b 2e 20 20 30 20 69 73 20  he stack.  0 is 
3140: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
3150: 74 61 63 6b 2e 0a 2a 2a 20 31 20 69 73 20 74 68  tack..** 1 is th
3160: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
3170: 64 6f 77 6e 2e 20 20 32 20 69 73 20 74 68 65 20  down.  2 is the 
3180: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 2e 20  second element. 
3190: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   And so forth..*
31a0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
31b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e 2d 74   there is no N-t
31c0: 68 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  h element..**.**
31d0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
31e0: 75 72 6e 65 64 20 69 73 20 6f 6e 6c 79 20 76 61  urned is only va
31f0: 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 76 61  lid until the va
3200: 6c 75 65 20 69 73 20 70 6f 70 70 65 64 0a 2a 2a  lue is popped.**
3210: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
3220: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
3230: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 73  SbS_StackValue(s
3240: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
3250: 2a 70 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 2a  *p, int N, int *
3260: 70 53 69 7a 65 29 7b 0a 20 20 53 62 53 56 61 6c  pSize){.  SbSVal
3270: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 66 28 20  ue *pVal;.  if( 
3280: 4e 3c 30 20 7c 7c 20 4e 3e 3d 70 2d 3e 6e 53 74  N<0 || N>=p->nSt
3290: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ack ){.    retur
32a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 56 61 6c 20  n 0;.  }.  pVal 
32b0: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e  = &p->aStack[p->
32c0: 6e 53 74 61 63 6b 2d 4e 2d 31 5d 3b 0a 20 20 69  nStack-N-1];.  i
32d0: 66 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20  f( (pVal->flags 
32e0: 26 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d 30  & SBSVAL_STR)==0
32f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3300: 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
3310: 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a   pVal->u.str.siz
3320: 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c  e;.  return pVal
3330: 2d 3e 75 2e 73 74 72 2e 7a 3b 0a 7d 0a 0a 2f 2a  ->u.str.z;.}../*
3340: 0a 2a 2a 20 41 20 63 6f 6e 76 65 6e 69 65 6e 63  .** A convenienc
3350: 65 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 78  e routine for ex
3360: 74 72 61 63 74 69 6e 67 20 61 6e 20 69 6e 74 65  tracting an inte
3370: 67 65 72 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  ger value from t
3380: 68 65 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a  he.** stack..*/.
3390: 69 6e 74 20 53 62 53 5f 53 74 61 63 6b 56 61 6c  int SbS_StackVal
33a0: 75 65 49 6e 74 28 73 74 72 75 63 74 20 53 75 62  ueInt(struct Sub
33b0: 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 4e  script *p, int N
33c0: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 76 3b 0a 20  ){.  int n, v;. 
33d0: 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a   int isNeg = 0;.
33e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
33f0: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65  = SbS_StackValue
3400: 28 70 2c 20 4e 2c 20 26 6e 29 3b 0a 20 20 76 20  (p, N, &n);.  v 
3410: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20  = 0;.  if( n==0 
3420: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
3430: 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
3440: 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20     isNeg = 1;.  
3450: 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a    z++;.    n--;.
3460: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
3470: 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='+' ){.    z++
3480: 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 20  ;.    n--;.  }. 
3490: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 69   while( n>0 && i
34a0: 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b 0a  sdigit(z[0]) ){.
34b0: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
34c0: 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 7a  [0] - '0';.    z
34d0: 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d  ++;.    n--;.  }
34e0: 0a 20 20 69 66 28 20 69 73 4e 65 67 20 29 7b 0a  .  if( isNeg ){.
34f0: 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20 7d 0a      v = -v;.  }.
3500: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f    return v;.}../
3510: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 74 68  *.** Retrieve th
3520: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 76 61 72  e value of a var
3530: 69 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 69  iable from the i
3540: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 52 65 74  nterpreter.  Ret
3550: 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 6e  urn.** NULL if n
3560: 6f 20 73 75 63 68 20 76 61 72 69 61 62 6c 65 20  o such variable 
3570: 69 73 20 64 65 66 69 6e 65 64 2e 20 20 0a 2a 2a  is defined.  .**
3580: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
3590: 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 6e   string is not n
35a0: 65 63 65 73 73 61 72 69 6c 79 20 28 70 72 6f 62  ecessarily (prob
35b0: 61 62 6c 79 20 6e 6f 74 29 20 7a 65 72 6f 2d 74  ably not) zero-t
35c0: 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 54 68  erminated..** Th
35d0: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
35e0: 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20  deallocated the 
35f0: 6e 65 78 74 20 74 69 6d 65 20 61 6e 79 74 68 69  next time anythi
3600: 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 0a 2a 2a  ng is done to.**
3610: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
3620: 2e 20 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 69  .  Make a copy i
3630: 66 20 79 6f 75 20 6e 65 65 64 20 69 74 20 74 6f  f you need it to
3640: 20 70 65 72 73 69 73 74 2e 0a 2a 2f 0a 63 6f 6e   persist..*/.con
3650: 73 74 20 63 68 61 72 20 2a 53 62 53 5f 46 65 74  st char *SbS_Fet
3660: 63 68 28 0a 20 20 73 74 72 75 63 74 20 53 75 62  ch(.  struct Sub
3670: 73 63 72 69 70 74 20 2a 70 2c 20 20 20 2f 2a 20  script *p,   /* 
3680: 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  The interpreter 
3690: 77 65 20 61 72 65 20 69 6e 74 65 72 72 6f 67 61  we are interroga
36a0: 74 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ting */.  const 
36b0: 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20  char *zKey,     
36c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
36d0: 65 20 76 61 72 69 61 62 6c 65 2e 20 20 43 61 73  e variable.  Cas
36e0: 65 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a 20  e sensitive */. 
36f0: 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
3700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3710: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 20 2a  gth of the key *
3720: 2f 0a 20 20 69 6e 74 20 2a 70 4c 65 6e 67 74 68  /.  int *pLength
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3740: 57 72 69 74 65 20 74 68 65 20 6c 65 6e 67 74 68  Write the length
3750: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   here */.){.  co
3760: 6e 73 74 20 53 62 53 56 61 6c 75 65 20 2a 70 56  nst SbSValue *pV
3770: 61 6c 3b 0a 0a 20 20 70 56 61 6c 20 3d 20 73 62  al;..  pVal = sb
3780: 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d 54  s_fetch(&p->symT
3790: 61 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b  ab, zKey, nKey);
37a0: 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 7c  .  if( pVal==0 |
37b0: 7c 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26  | (pVal->flags &
37c0: 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d 30 20   SBSVAL_STR)==0 
37d0: 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 67 74 68 20  ){.    *pLength 
37e0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
37f0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
3800: 2a 70 4c 65 6e 67 74 68 20 3d 20 70 56 61 6c 2d  *pLength = pVal-
3810: 3e 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 20  >u.str.size;.   
3820: 20 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 75 2e   return pVal->u.
3830: 73 74 72 2e 7a 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  str.z;.  }.}../*
3840: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
3850: 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
3860: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
3870: 20 73 74 61 63 6b 20 68 61 73 0a 2a 2a 20 66 65   stack has.** fe
3880: 77 65 72 20 74 68 61 6e 20 4e 20 65 6c 65 6d 65  wer than N eleme
3890: 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 74  nts.  This is ut
38a0: 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75 73  ility routine us
38b0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6d 70  ed in.** the imp
38c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 76  lementation of v
38d0: 65 72 62 73 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53  erbs..*/.int SbS
38e0: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 73 74  _RequireStack(st
38f0: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a  ruct Subscript *
3900: 70 2c 20 69 6e 74 20 4e 2c 20 63 6f 6e 73 74 20  p, int N, const 
3910: 63 68 61 72 20 2a 7a 43 6d 64 29 7b 0a 20 20 69  char *zCmd){.  i
3920: 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 4e 20  f( p->nStack>=N 
3930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
3940: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3950: 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 72 4d 73 67  izeof(p->zErrMsg
3960: 29 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20  ), p->zErrMsg,. 
3970: 20 20 20 20 22 5c 22 25 73 5c 22 20 72 65 71 75      "\"%s\" requ
3980: 69 72 65 73 20 61 74 20 6c 65 61 73 74 20 25 64  ires at least %d
3990: 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 73 20   stack elements 
39a0: 2d 20 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 64 22  - only found %d"
39b0: 2c 0a 20 20 20 20 20 7a 43 6d 64 2c 20 4e 2c 20  ,.     zCmd, N, 
39c0: 70 2d 3e 6e 53 74 61 63 6b 29 3b 0a 20 20 72 65  p->nStack);.  re
39d0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
39e0: 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d 61   Subscript comma
39f0: 6e 64 3a 20 20 20 20 20 20 20 53 54 52 49 4e 47  nd:       STRING
3a00: 20 4e 41 4d 45 20 73 65 74 0a 2a 2a 0a 2a 2a 20   NAME set.**.** 
3a10: 57 72 69 74 65 20 74 68 65 20 76 61 6c 75 65 20  Write the value 
3a20: 6f 66 20 53 54 52 49 4e 47 20 69 6e 74 6f 20 76  of STRING into v
3a30: 61 72 69 61 62 6c 65 20 63 61 6c 6c 65 64 20 4e  ariable called N
3a40: 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  AME..*/.static i
3a50: 6e 74 20 73 65 74 43 6d 64 28 53 75 62 73 63 72  nt setCmd(Subscr
3a60: 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e  ipt *p, void *pN
3a70: 6f 74 55 73 65 64 29 7b 0a 20 20 53 62 53 56 61  otUsed){.  SbSVa
3a80: 6c 75 65 20 2a 70 54 6f 73 3b 0a 20 20 53 62 53  lue *pTos;.  SbS
3a90: 56 61 6c 75 65 20 2a 70 4e 6f 73 3b 0a 20 20 69  Value *pNos;.  i
3aa0: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74  f( SbS_RequireSt
3ab0: 61 63 6b 28 70 2c 20 32 2c 20 22 73 65 74 22 29  ack(p, 2, "set")
3ac0: 20 29 20 72 65 74 75 72 6e 20 53 42 53 5f 45 52   ) return SBS_ER
3ad0: 52 4f 52 3b 0a 20 20 70 54 6f 73 20 3d 20 26 70  ROR;.  pTos = &p
3ae0: 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e 6e 53  ->aStack[--p->nS
3af0: 74 61 63 6b 5d 3b 0a 20 20 70 4e 6f 73 20 3d 20  tack];.  pNos = 
3b00: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e  &p->aStack[--p->
3b10: 6e 53 74 61 63 6b 5d 3b 0a 20 20 73 62 73 5f 73  nStack];.  sbs_s
3b20: 74 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62 2c  tore(&p->symTab,
3b30: 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 7a 2c 20   pTos->u.str.z, 
3b40: 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 73 69 7a 65  pTos->u.str.size
3b50: 2c 20 70 4e 6f 73 29 3b 0a 20 20 73 62 73 5f 76  , pNos);.  sbs_v
3b60: 61 6c 75 65 5f 72 65 73 65 74 28 70 54 6f 73 29  alue_reset(pTos)
3b70: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
3b80: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74  ./*.** Subscript
3b90: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 49   command:      I
3ba0: 4e 54 45 47 45 52 20 6e 6f 74 20 49 4e 54 45 47  NTEGER not INTEG
3bb0: 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ER.*/.static int
3bc0: 20 6e 6f 74 43 6d 64 28 73 74 72 75 63 74 20 53   notCmd(struct S
3bd0: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69  ubscript *p, voi
3be0: 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20  d *pNotUsed){.  
3bf0: 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 53 62 53  int n;.  if( SbS
3c00: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c  _RequireStack(p,
3c10: 20 31 2c 20 22 6e 6f 74 22 29 20 29 20 72 65 74   1, "not") ) ret
3c20: 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20 53 62 53  urn 1;.  n = SbS
3c30: 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 28 70  _StackValueInt(p
3c40: 2c 20 30 29 3b 0a 20 20 53 62 53 5f 50 6f 70 28  , 0);.  SbS_Pop(
3c50: 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f 50 75 73  p, 1);.  SbS_Pus
3c60: 68 49 6e 74 28 70 2c 20 21 6e 29 3b 0a 20 20 72  hInt(p, !n);.  r
3c70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 64 65 66  eturn 0;.}..#def
3c80: 69 6e 65 20 53 42 53 4f 50 5f 41 44 44 20 20 20  ine SBSOP_ADD   
3c90: 31 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f  1.#define SBSOP_
3ca0: 53 55 42 20 20 20 32 0a 23 64 65 66 69 6e 65 20  SUB   2.#define 
3cb0: 53 42 53 4f 50 5f 4d 55 4c 20 20 20 33 0a 23 64  SBSOP_MUL   3.#d
3cc0: 65 66 69 6e 65 20 53 42 53 4f 50 5f 44 49 56 20  efine SBSOP_DIV 
3cd0: 20 20 34 0a 23 64 65 66 69 6e 65 20 53 42 53 4f    4.#define SBSO
3ce0: 50 5f 41 4e 44 20 20 20 35 0a 23 64 65 66 69 6e  P_AND   5.#defin
3cf0: 65 20 53 42 53 4f 50 5f 4f 52 20 20 20 20 36 0a  e SBSOP_OR    6.
3d00: 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 4d 49  #define SBSOP_MI
3d10: 4e 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 42  N   7.#define SB
3d20: 53 4f 50 5f 4d 41 58 20 20 20 38 0a 0a 2f 2a 0a  SOP_MAX   8../*.
3d30: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d  ** Subscript com
3d40: 6d 61 6e 64 3a 20 20 20 20 20 20 49 4e 54 45 47  mand:      INTEG
3d50: 45 52 20 49 4e 54 45 47 45 52 20 3c 62 69 6e 61  ER INTEGER <bina
3d60: 72 79 2d 6f 70 3e 20 49 4e 54 45 47 45 52 0a 2a  ry-op> INTEGER.*
3d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 70  /.static int bop
3d80: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
3d90: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
3da0: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 2c 20 62 2c  Op){.  int a, b,
3db0: 20 63 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65   c;.  if( SbS_Re
3dc0: 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20 32 2c  quireStack(p, 2,
3dd0: 20 22 42 49 4e 41 52 59 2d 4f 50 22 29 20 29 20   "BINARY-OP") ) 
3de0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 20 3d 20  return 1;.  a = 
3df0: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e  SbS_StackValueIn
3e00: 74 28 70 2c 20 30 29 3b 0a 20 20 62 20 3d 20 53  t(p, 0);.  b = S
3e10: 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74  bS_StackValueInt
3e20: 28 70 2c 20 31 29 3b 0a 20 20 73 77 69 74 63 68  (p, 1);.  switch
3e30: 28 20 28 69 6e 74 29 70 4f 70 20 29 7b 0a 20 20  ( (int)pOp ){.  
3e40: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 41 44 44    case SBSOP_ADD
3e50: 3a 20 20 63 20 3d 20 61 2b 62 3b 20 20 20 20 20  :  c = a+b;     
3e60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3e70: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 53 55 42    case SBSOP_SUB
3e80: 3a 20 20 63 20 3d 20 61 2d 62 3b 20 20 20 20 20  :  c = a-b;     
3e90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3ea0: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 55 4c    case SBSOP_MUL
3eb0: 3a 20 20 63 20 3d 20 61 2a 62 3b 20 20 20 20 20  :  c = a*b;     
3ec0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3ed0: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 44 49 56    case SBSOP_DIV
3ee0: 3a 20 20 63 20 3d 20 62 21 3d 30 20 3f 20 61 2f  :  c = b!=0 ? a/
3ef0: 62 20 3a 20 30 3b 20 62 72 65 61 6b 3b 0a 20 20  b : 0; break;.  
3f00: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 41 4e 44    case SBSOP_AND
3f10: 3a 20 20 63 20 3d 20 61 20 26 26 20 62 3b 20 20  :  c = a && b;  
3f20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3f30: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4f 52 3a    case SBSOP_OR:
3f40: 20 20 20 63 20 3d 20 61 20 7c 7c 20 62 3b 20 20     c = a || b;  
3f50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3f60: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 49 4e    case SBSOP_MIN
3f70: 3a 20 20 63 20 3d 20 61 3c 62 20 3f 20 61 20 3a  :  c = a<b ? a :
3f80: 20 62 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   b;    break;.  
3f90: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 41 58    case SBSOP_MAX
3fa0: 3a 20 20 63 20 3d 20 61 3c 62 20 3f 20 62 20 3a  :  c = a<b ? b :
3fb0: 20 61 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   a;    break;.  
3fc0: 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 32  }.  SbS_Pop(p, 2
3fd0: 29 3b 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74  );.  SbS_PushInt
3fe0: 28 70 2c 20 63 29 3b 0a 20 20 72 65 74 75 72 6e  (p, c);.  return
3ff0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62   0;.}../*.** Sub
4000: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20  script command: 
4010: 20 20 20 20 53 54 52 49 4e 47 20 68 61 73 63 61      STRING hasca
4020: 70 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  p INTEGER.**.** 
4030: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
4040: 68 65 20 75 73 65 72 20 68 61 73 20 61 6c 6c 20  he user has all 
4050: 6f 66 20 74 68 65 20 63 61 70 61 62 69 6c 69 74  of the capabilit
4060: 69 65 73 20 6c 69 73 74 65 64 2e 0a 2a 2f 0a 73  ies listed..*/.s
4070: 74 61 74 69 63 20 69 6e 74 20 68 61 73 63 61 70  tatic int hascap
4080: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
4090: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
40a0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73  NotUsed){.  cons
40b0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
40c0: 20 6e 2c 20 61 3b 0a 20 20 69 66 28 20 53 62 53   n, a;.  if( SbS
40d0: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c  _RequireStack(p,
40e0: 20 31 2c 20 22 68 61 73 63 61 70 22 29 20 29 20   1, "hascap") ) 
40f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d 20  return 1;.  z = 
4100: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70  SbS_StackValue(p
4110: 2c 20 30 2c 20 26 6e 29 3b 0a 20 20 61 20 3d 20  , 0, &n);.  a = 
4120: 6c 6f 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69  login_has_capabi
4130: 6c 69 74 79 28 7a 2c 20 6e 29 3b 0a 20 20 53 62  lity(z, n);.  Sb
4140: 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53  S_Pop(p, 1);.  S
4150: 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 61 29  bS_PushInt(p, a)
4160: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4170: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74  ./*.** Subscript
4180: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 53 54   command:     ST
4190: 52 49 4e 47 20 6c 69 6e 65 63 6f 75 6e 74 20 49  RING linecount I
41a0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 74  NTEGER.**.** Ret
41b0: 75 72 6e 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61  urn one more tha
41c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
41d0: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  \n characters in
41e0: 20 53 54 52 49 4e 47 2e 0a 2a 2f 0a 73 74 61 74   STRING..*/.stat
41f0: 69 63 20 69 6e 74 20 6c 69 6e 65 63 6e 74 43 6d  ic int linecntCm
4200: 64 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69  d(struct Subscri
4210: 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f  pt *p, void *pNo
4220: 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20  tUsed){.  const 
4230: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 73  char *z;.  int s
4240: 69 7a 65 2c 20 6e 2c 20 69 3b 0a 20 20 69 66 28  ize, n, i;.  if(
4250: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63   SbS_RequireStac
4260: 6b 28 70 2c 20 31 2c 20 22 6c 69 6e 65 63 6f 75  k(p, 1, "linecou
4270: 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b  nt") ) return 1;
4280: 0a 20 20 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b  .  z = SbS_Stack
4290: 56 61 6c 75 65 28 70 2c 20 30 2c 20 26 73 69 7a  Value(p, 0, &siz
42a0: 65 29 3b 0a 20 20 66 6f 72 28 6e 3d 31 2c 20 69  e);.  for(n=1, i
42b0: 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
42c0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
42d0: 27 5c 6e 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a  '\n' ) n++;.  }.
42e0: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b    SbS_Pop(p, 1);
42f0: 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70  .  SbS_PushInt(p
4300: 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  , n);.  return 0
4310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63  ;.}../*.** Subsc
4320: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20  ript command:   
4330: 20 20 4e 41 4d 45 20 65 78 69 73 74 73 20 49 4e    NAME exists IN
4340: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 74 75  TEGER.**.** Retu
4350: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 76  rn TRUE if the v
4360: 61 72 69 61 62 6c 65 20 4e 41 4d 45 20 65 78 69  ariable NAME exi
4370: 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sts..*/.static i
4380: 6e 74 20 65 78 69 73 74 73 43 6d 64 28 73 74 72  nt existsCmd(str
4390: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70  uct Subscript *p
43a0: 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64  , void *pNotUsed
43b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
43c0: 2a 7a 3b 0a 20 20 69 6e 74 20 73 69 7a 65 2c 20  *z;.  int size, 
43d0: 78 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71  x;.  if( SbS_Req
43e0: 75 69 72 65 53 74 61 63 6b 28 70 2c 20 31 2c 20  uireStack(p, 1, 
43f0: 22 65 78 69 73 74 73 22 29 20 29 20 72 65 74 75  "exists") ) retu
4400: 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 53 62 53 5f  rn 1;.  z = SbS_
4410: 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c  StackValue(p, 0,
4420: 20 26 73 69 7a 65 29 3b 0a 20 20 78 20 3d 20 73   &size);.  x = s
4430: 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d  bs_fetch(&p->sym
4440: 54 61 62 2c 20 28 63 68 61 72 2a 29 7a 2c 20 73  Tab, (char*)z, s
4450: 69 7a 65 29 21 3d 30 3b 0a 20 20 53 62 53 5f 50  ize)!=0;.  SbS_P
4460: 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f  op(p, 1);.  SbS_
4470: 50 75 73 68 49 6e 74 28 70 2c 20 78 29 3b 0a 20  PushInt(p, x);. 
4480: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4490: 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f  .** Subscript co
44a0: 6d 6d 61 6e 64 3a 20 20 20 20 20 20 20 56 41 4c  mmand:       VAL
44b0: 55 45 20 4e 41 4d 45 20 67 65 74 20 56 41 4c 55  UE NAME get VALU
44c0: 45 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20 74 68 65  E.**.** Push the
44d0: 20 76 61 6c 75 65 20 6f 66 20 76 61 72 69 62 6c   value of varibl
44e0: 65 20 4e 41 4d 45 20 6f 6e 74 6f 20 74 68 65 20  e NAME onto the 
44f0: 73 74 61 63 6b 20 69 66 20 69 74 20 65 78 69 73  stack if it exis
4500: 74 73 2e 0a 2a 2a 20 49 66 20 4e 41 4d 45 20 64  ts..** If NAME d
4510: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 70  oes not exist, p
4520: 75 74 73 20 56 41 4c 55 45 20 6f 6e 74 6f 20 74  uts VALUE onto t
4530: 68 65 20 73 74 61 63 6b 20 69 6e 73 74 65 61 64  he stack instead
4540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4550: 67 65 74 43 6d 64 28 53 75 62 73 63 72 69 70 74  getCmd(Subscript
4560: 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55   *p, void *pNotU
4570: 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  sed){.  const ch
4580: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ar *zName;.  int
4590: 20 6e 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20   nName;.  const 
45a0: 53 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  SbSValue *pVal;.
45b0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
45c0: 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69  .  if( SbS_Requi
45d0: 72 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 67  reStack(p, 2, "g
45e0: 65 74 22 29 20 29 20 72 65 74 75 72 6e 20 53 42  et") ) return SB
45f0: 53 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65  S_ERROR;.  zName
4600: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75   = SbS_StackValu
4610: 65 28 70 2c 20 30 2c 20 26 6e 4e 61 6d 65 29 3b  e(p, 0, &nName);
4620: 0a 20 20 70 56 61 6c 20 3d 20 73 62 73 5f 66 65  .  pVal = sbs_fe
4630: 74 63 68 28 26 70 2d 3e 73 79 6d 54 61 62 2c 20  tch(&p->symTab, 
4640: 28 63 68 61 72 2a 29 7a 4e 61 6d 65 2c 20 6e 4e  (char*)zName, nN
4650: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 61 6c  ame);.  if( pVal
4660: 21 3d 30 20 26 26 20 28 70 56 61 6c 2d 3e 66 6c  !=0 && (pVal->fl
4670: 61 67 73 20 26 20 53 42 53 56 41 4c 5f 53 54 52  ags & SBSVAL_STR
4680: 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 62 53 5f  )!=0 ){.    SbS_
4690: 50 6f 70 28 70 2c 20 32 29 3b 0a 20 20 20 20 72  Pop(p, 2);.    r
46a0: 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70 2c 20  c = SbS_Push(p, 
46b0: 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a 2c 20 70  pVal->u.str.z, p
46c0: 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 2c  Val->u.str.size,
46d0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
46e0: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b    SbS_Pop(p, 1);
46f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4700: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ;.}..../*.** Tru
4710: 65 20 69 66 20 6f 75 74 70 75 74 20 69 73 20 65  e if output is e
4720: 6e 61 62 6c 65 64 2e 20 20 46 61 6c 73 65 20 69  nabled.  False i
4730: 66 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73  f disabled..*/.s
4740: 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65  tatic int enable
4750: 4f 75 74 70 75 74 20 3d 20 31 3b 0a 0a 2f 2a 0a  Output = 1;../*.
4760: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d  ** Subscript com
4770: 6d 61 6e 64 3a 20 20 20 20 20 20 42 4f 4f 4c 45  mand:      BOOLE
4780: 41 4e 20 65 6e 61 62 6c 65 5f 6f 75 74 70 75 74  AN enable_output
4790: 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  .**.** Enable or
47a0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 70 75 74   disable the put
47b0: 73 20 61 6e 64 20 68 70 75 74 73 20 63 6f 6d 6d  s and hputs comm
47c0: 61 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ands..*/.static 
47d0: 69 6e 74 20 65 6e 61 62 6c 65 4f 75 74 70 75 74  int enableOutput
47e0: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63  Cmd(struct Subsc
47f0: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70  ript *p, void *p
4800: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 66 28 20  NotUsed){.  if( 
4810: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b  SbS_RequireStack
4820: 28 70 2c 20 31 2c 20 22 65 6e 61 62 6c 65 5f 6f  (p, 1, "enable_o
4830: 75 74 70 75 74 22 29 20 29 20 72 65 74 75 72 6e  utput") ) return
4840: 20 31 3b 0a 20 20 65 6e 61 62 6c 65 4f 75 74 70   1;.  enableOutp
4850: 75 74 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61  ut = SbS_StackVa
4860: 6c 75 65 49 6e 74 28 70 2c 20 30 29 21 3d 30 3b  lueInt(p, 0)!=0;
4870: 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29  .  SbS_Pop(p, 1)
4880: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4890: 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 74 65 78 74  ./*.** Send text
48a0: 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
48b0: 61 74 65 20 6f 75 74 70 75 74 3a 20 20 45 69 74  ate output:  Eit
48c0: 68 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 73 6f  her to the conso
48d0: 6c 65 0a 2a 2a 20 6f 72 20 74 6f 20 74 68 65 20  le.** or to the 
48e0: 43 47 49 20 72 65 70 6c 79 20 62 75 66 66 65 72  CGI reply buffer
48f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4900: 20 73 65 6e 64 54 65 78 74 28 63 6f 6e 73 74 20   sendText(const 
4910: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
4920: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 4f 75 74  .  if( enableOut
4930: 70 75 74 20 26 26 20 6e 20 29 7b 0a 20 20 20 20  put && n ){.    
4940: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 73 74  if( n<0 ) n = st
4950: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28  rlen(z);.    if(
4960: 20 67 2e 63 67 69 50 61 6e 69 63 20 29 7b 0a 20   g.cgiPanic ){. 
4970: 20 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f       cgi_append_
4980: 63 6f 6e 74 65 6e 74 28 7a 2c 20 6e 29 3b 0a 20  content(z, n);. 
4990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
49a0: 66 77 72 69 74 65 28 7a 2c 20 31 2c 20 6e 2c 20  fwrite(z, 1, n, 
49b0: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  stdout);.    }. 
49c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73   }.}../*.** Subs
49d0: 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20  cript command:  
49e0: 20 20 20 20 53 54 52 49 4e 47 20 70 75 74 73 0a      STRING puts.
49f0: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d  ** Subscript com
4a00: 6d 61 6e 64 3a 20 20 20 20 20 20 53 54 52 49 4e  mand:      STRIN
4a10: 47 20 68 74 6d 6c 0a 2a 2a 0a 2a 2a 20 4f 75 74  G html.**.** Out
4a20: 70 75 74 20 53 54 52 49 4e 47 20 61 73 20 48 54  put STRING as HT
4a30: 4d 4c 20 28 68 74 6d 6c 29 20 6f 72 20 75 6e 63  ML (html) or unc
4a40: 68 61 6e 67 65 64 20 28 70 75 74 73 29 2e 20 20  hanged (puts).  
4a50: 0a 2a 2a 20 50 6f 70 20 69 74 20 66 72 6f 6d 20  .** Pop it from 
4a60: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74  the stack..*/.st
4a70: 61 74 69 63 20 69 6e 74 20 70 75 74 73 43 6d 64  atic int putsCmd
4a80: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70  (struct Subscrip
4a90: 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 43 6f 6e  t *p, void *pCon
4aa0: 76 65 72 74 29 7b 0a 20 20 69 6e 74 20 73 69 7a  vert){.  int siz
4ab0: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
4ac0: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  *z;.  char *zOut
4ad0: 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75  ;.  if( SbS_Requ
4ae0: 69 72 65 53 74 61 63 6b 28 70 2c 20 31 2c 20 22  ireStack(p, 1, "
4af0: 70 75 74 73 22 29 20 29 20 72 65 74 75 72 6e 20  puts") ) return 
4b00: 31 3b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 4f  1;.  if( enableO
4b10: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 7a 20 3d  utput ){.    z =
4b20: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28   SbS_StackValue(
4b30: 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b 0a 20 20  p, 0, &size);.  
4b40: 20 20 69 66 28 20 70 43 6f 6e 76 65 72 74 20 29    if( pConvert )
4b50: 7b 20 20 20 20 0a 20 20 20 20 20 20 7a 4f 75 74  {    .      zOut
4b60: 20 3d 20 68 74 6d 6c 69 7a 65 28 7a 2c 20 73 69   = htmlize(z, si
4b70: 7a 65 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  ze);.      size 
4b80: 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a  = strlen(zOut);.
4b90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ba0: 20 7a 4f 75 74 20 3d 20 28 63 68 61 72 2a 29 7a   zOut = (char*)z
4bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6e 64  ;.    }.    send
4bc0: 54 65 78 74 28 7a 4f 75 74 2c 20 73 69 7a 65 29  Text(zOut, size)
4bd0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 76 65  ;.    if( pConve
4be0: 72 74 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rt ){.      free
4bf0: 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
4c00: 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31  }.  SbS_Pop(p, 1
4c10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70  ../*.** Subscrip
4c30: 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20  t command:      
4c40: 53 54 52 49 4e 47 20 77 69 6b 69 0a 2a 2a 0a 2a  STRING wiki.**.*
4c50: 2a 20 52 65 6e 64 65 72 20 74 68 65 20 69 6e 70  * Render the inp
4c60: 75 74 20 73 74 72 69 6e 67 20 61 73 20 77 69 6b  ut string as wik
4c70: 69 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  i..*/.static int
4c80: 20 77 69 6b 69 43 6d 64 28 73 74 72 75 63 74 20   wikiCmd(struct 
4c90: 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f  Subscript *p, vo
4ca0: 69 64 20 2a 70 43 6f 6e 76 65 72 74 29 7b 0a 20  id *pConvert){. 
4cb0: 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 63 6f 6e   int size;.  con
4cc0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
4cd0: 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61  ( SbS_RequireSta
4ce0: 63 6b 28 70 2c 20 31 2c 20 22 77 69 6b 69 22 29  ck(p, 1, "wiki")
4cf0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
4d00: 66 28 20 65 6e 61 62 6c 65 4f 75 74 70 75 74 20  f( enableOutput 
4d10: 29 7b 0a 20 20 20 20 42 6c 6f 62 20 73 72 63 3b  ){.    Blob src;
4d20: 0a 20 20 20 20 7a 20 3d 20 53 62 53 5f 53 74 61  .    z = SbS_Sta
4d30: 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c 20 26 73  ckValue(p, 0, &s
4d40: 69 7a 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 69  ize);.    blob_i
4d50: 6e 69 74 28 26 73 72 63 2c 20 7a 2c 20 73 69 7a  nit(&src, z, siz
4d60: 65 29 3b 0a 20 20 20 20 77 69 6b 69 5f 63 6f 6e  e);.    wiki_con
4d70: 76 65 72 74 28 26 73 72 63 2c 20 30 2c 20 57 49  vert(&src, 0, WI
4d80: 4b 49 5f 49 4e 4c 49 4e 45 29 3b 0a 20 20 20 20  KI_INLINE);.    
4d90: 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 72 63 29  blob_reset(&src)
4da0: 3b 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70 28  ;.  }.  SbS_Pop(
4db0: 70 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  p, 1);.  return 
4dc0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73  0;.}../*.** Subs
4dd0: 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20  cript command:  
4de0: 20 4e 41 4d 45 20 54 45 58 54 2d 4c 49 53 54 20   NAME TEXT-LIST 
4df0: 4e 55 4d 4c 49 4e 45 53 20 63 6f 6d 62 6f 62 6f  NUMLINES combobo
4e00: 78 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  x.**.** Generate
4e10: 20 61 6e 20 48 54 4d 4c 20 63 6f 6d 62 6f 62 6f   an HTML combobo
4e20: 78 2e 20 20 4e 41 4d 45 20 69 73 20 62 6f 74 68  x.  NAME is both
4e30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4e40: 0a 2a 2a 20 43 47 49 20 70 61 72 61 6d 65 74 65  .** CGI paramete
4e50: 72 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  r and the name o
4e60: 66 20 61 20 76 61 72 69 61 62 6c 65 20 74 68 61  f a variable tha
4e70: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  t contains the.*
4e80: 2a 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65  * currently sele
4e90: 63 74 65 64 20 76 61 6c 75 65 2e 20 20 54 45 58  cted value.  TEX
4ea0: 54 2d 4c 49 53 54 20 69 73 20 61 20 6c 69 73 74  T-LIST is a list
4eb0: 20 6f 66 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   of possible.** 
4ec0: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 63  values for the c
4ed0: 6f 6d 62 6f 62 6f 78 2e 20 20 4e 55 4d 4c 49 4e  ombobox.  NUMLIN
4ee0: 45 53 20 69 73 20 31 20 66 6f 72 20 61 20 74 72  ES is 1 for a tr
4ef0: 75 65 20 63 6f 6d 62 6f 62 6f 78 2e 0a 2a 2a 20  ue combobox..** 
4f00: 49 66 20 4e 55 4d 4c 49 4e 45 53 20 69 73 20 67  If NUMLINES is g
4f10: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 6e 65 20  reater than one 
4f20: 74 68 65 6e 20 74 68 65 20 64 69 73 70 6c 61 79  then the display
4f30: 20 69 73 20 61 20 6c 69 73 74 62 6f 78 0a 2a 2a   is a listbox.**
4f40: 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
4f50: 20 6f 66 20 6c 69 6e 65 73 20 67 69 76 65 6e 2e   of lines given.
4f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4f70: 6f 6d 62 6f 62 6f 78 43 6d 64 28 73 74 72 75 63  omboboxCmd(struc
4f80: 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20  t Subscript *p, 
4f90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  void *NotUsed){.
4fa0: 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72    if( SbS_Requir
4fb0: 65 53 74 61 63 6b 28 70 2c 20 33 2c 20 22 63 6f  eStack(p, 3, "co
4fc0: 6d 62 6f 62 6f 78 22 29 20 29 20 72 65 74 75 72  mbobox") ) retur
4fd0: 6e 20 31 3b 0a 20 20 69 66 28 20 65 6e 61 62 6c  n 1;.  if( enabl
4fe0: 65 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 69  eOutput ){.    i
4ff0: 6e 74 20 68 65 69 67 68 74 3b 0a 20 20 20 20 42  nt height;.    B
5000: 6c 6f 62 20 6c 69 73 74 2c 20 65 6c 65 6d 3b 0a  lob list, elem;.
5010: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c      char *zName,
5020: 20 2a 7a 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74   *zList;.    int
5030: 20 6e 4e 61 6d 65 2c 20 6e 4c 69 73 74 2c 20 6e   nName, nList, n
5040: 56 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Value;.    const
5050: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b 0a 20   char *zValue;. 
5060: 20 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 48 3b     char *z, *zH;
5070: 0a 0a 20 20 20 20 68 65 69 67 68 74 20 3d 20 53  ..    height = S
5080: 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74  bS_StackValueInt
5090: 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 4c 69 73  (p, 0);.    zLis
50a0: 74 20 3d 20 28 63 68 61 72 2a 29 53 62 53 5f 53  t = (char*)SbS_S
50b0: 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 31 2c 20  tackValue(p, 1, 
50c0: 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 62 6c 6f  &nList);.    blo
50d0: 62 5f 69 6e 69 74 28 26 6c 69 73 74 2c 20 7a 4c  b_init(&list, zL
50e0: 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 20  ist, nList);.   
50f0: 20 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29   zName = (char*)
5100: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70  SbS_StackValue(p
5110: 2c 20 32 2c 20 26 6e 4e 61 6d 65 29 3b 0a 20 20  , 2, &nName);.  
5120: 20 20 7a 56 61 6c 75 65 20 3d 20 53 62 53 5f 46    zValue = SbS_F
5130: 65 74 63 68 28 70 2c 20 7a 4e 61 6d 65 2c 20 6e  etch(p, zName, n
5140: 4e 61 6d 65 2c 20 26 6e 56 61 6c 75 65 29 3b 0a  Name, &nValue);.
5150: 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28      z = mprintf(
5160: 22 3c 73 65 6c 65 63 74 20 6e 61 6d 65 3d 5c 22  "<select name=\"
5170: 25 7a 5c 22 20 73 69 7a 65 3d 5c 22 25 64 5c 22  %z\" size=\"%d\"
5180: 3e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  >", .           
5190: 20 20 20 20 20 20 68 74 6d 6c 69 7a 65 28 7a 4e        htmlize(zN
51a0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 2c 20 68 65 69  ame, nName), hei
51b0: 67 68 74 29 3b 0a 20 20 20 20 73 65 6e 64 54 65  ght);.    sendTe
51c0: 78 74 28 7a 2c 20 2d 31 29 3b 0a 20 20 20 20 66  xt(z, -1);.    f
51d0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c  ree(z);.    whil
51e0: 65 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c  e( blob_token(&l
51f0: 69 73 74 2c 20 26 65 6c 65 6d 29 20 29 7b 0a 20  ist, &elem) ){. 
5200: 20 20 20 20 20 7a 48 20 3d 20 68 74 6d 6c 69 7a       zH = htmliz
5210: 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 65  e(blob_buffer(&e
5220: 6c 65 6d 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  lem), blob_size(
5230: 26 65 6c 65 6d 29 29 3b 0a 20 20 20 20 20 20 69  &elem));.      i
5240: 66 28 20 7a 56 61 6c 75 65 20 26 26 20 62 6c 6f  f( zValue && blo
5250: 62 5f 73 69 7a 65 28 26 65 6c 65 6d 29 3d 3d 6e  b_size(&elem)==n
5260: 56 61 6c 75 65 20 0a 20 20 20 20 20 20 20 20 20  Value .         
5270: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 7a 56      && memcmp(zV
5280: 61 6c 75 65 2c 20 62 6c 6f 62 5f 62 75 66 66 65  alue, blob_buffe
5290: 72 28 26 65 6c 65 6d 29 2c 20 6e 56 61 6c 75 65  r(&elem), nValue
52a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
52b0: 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 3c 6f 70  z = mprintf("<op
52c0: 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22 25 73 5c  tion value=\"%s\
52d0: 22 20 73 65 6c 65 63 74 65 64 3e 25 73 3c 2f 6f  " selected>%s</o
52e0: 70 74 69 6f 6e 3e 22 2c 20 7a 48 2c 20 7a 48 29  ption>", zH, zH)
52f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5300: 20 20 20 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e         z = mprin
5310: 74 66 28 22 3c 6f 70 74 69 6f 6e 20 76 61 6c 75  tf("<option valu
5320: 65 3d 5c 22 25 73 5c 22 3e 25 73 3c 2f 6f 70 74  e=\"%s\">%s</opt
5330: 69 6f 6e 3e 22 2c 20 7a 48 2c 20 7a 48 29 3b 0a  ion>", zH, zH);.
5340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72        }.      fr
5350: 65 65 28 7a 48 29 3b 0a 20 20 20 20 20 20 73 65  ee(zH);.      se
5360: 6e 64 54 65 78 74 28 7a 2c 20 2d 31 29 3b 0a 20  ndText(z, -1);. 
5370: 20 20 20 20 20 66 72 65 65 28 7a 29 3b 0a 20 20       free(z);.  
5380: 20 20 7d 0a 20 20 20 20 73 65 6e 64 54 65 78 74    }.    sendText
5390: 28 22 3c 2f 73 65 6c 65 63 74 3e 22 2c 20 2d 31  ("</select>", -1
53a0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
53b0: 74 28 26 6c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  t(&list);.  }.  
53c0: 53 62 53 5f 50 6f 70 28 70 2c 20 33 29 3b 0a 20  SbS_Pop(p, 3);. 
53d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
53e0: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 6f 66 20  *.** A table of 
53f0: 62 75 69 6c 74 2d 69 6e 20 63 6f 6d 6d 61 6e 64  built-in command
5400: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  s.*/.static cons
5410: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 63 6f 6e  t struct {.  con
5420: 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20  st char *zCmd;. 
5430: 20 69 6e 74 20 28 2a 78 43 6d 64 29 28 53 75 62   int (*xCmd)(Sub
5440: 73 63 72 69 70 74 2a 2c 76 6f 69 64 2a 29 3b 0a  script*,void*);.
5450: 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 0a 7d 20    void *pArg;.} 
5460: 61 42 75 69 6c 74 69 6e 5b 5d 20 3d 20 7b 0a 20  aBuiltin[] = {. 
5470: 20 7b 20 22 61 64 64 22 2c 20 20 20 20 20 20 20   { "add",       
5480: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20        bopCmd,   
5490: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
54a0: 64 2a 29 53 42 53 4f 50 5f 41 4e 44 20 20 20 20  d*)SBSOP_AND    
54b0: 7d 2c 0a 20 20 7b 20 22 61 6e 64 22 2c 20 20 20  },.  { "and",   
54c0: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64            bopCmd
54d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
54e0: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 41 4e 44  (void*)SBSOP_AND
54f0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6d 62      },.  { "comb
5500: 6f 62 6f 78 22 2c 20 20 20 20 20 20 20 20 63 6f  obox",        co
5510: 6d 62 6f 62 6f 78 43 6d 64 2c 20 20 20 20 20 20  mboboxCmd,      
5520: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
5530: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
5540: 64 69 76 22 2c 20 20 20 20 20 20 20 20 20 20 20  div",           
5550: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
5560: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
5570: 42 53 4f 50 5f 44 49 56 20 20 20 20 7d 2c 0a 20  BSOP_DIV    },. 
5580: 20 7b 20 22 65 6e 61 62 6c 65 5f 6f 75 74 70 75   { "enable_outpu
5590: 74 22 2c 20 20 20 65 6e 61 62 6c 65 4f 75 74 70  t",   enableOutp
55a0: 75 74 43 6d 64 2c 20 20 20 20 20 20 30 20 20 20  utCmd,      0   
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 7d 2c 0a 20 20 7b 20 22 65 78 69 73 74 73 22 2c  },.  { "exists",
55d0: 20 20 20 20 20 20 20 20 20 20 65 78 69 73 74 73            exists
55e0: 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cmd,            
55f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5600: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 67 65 74 22      },.  { "get"
5610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65  ,             ge
5620: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  tCmd,           
5630: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
5640: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
5650: 68 61 73 63 61 70 22 2c 20 20 20 20 20 20 20 20  hascap",        
5660: 20 20 68 61 73 63 61 70 43 6d 64 2c 20 20 20 20    hascapCmd,    
5670: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
5680: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5690: 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20 20 20 20   { "html",      
56a0: 20 20 20 20 20 20 70 75 74 73 43 6d 64 2c 20 20        putsCmd,  
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
56c0: 64 2a 29 31 20 20 20 20 20 20 20 20 20 20 20 20  d*)1            
56d0: 7d 2c 0a 20 20 7b 20 22 6c 69 6e 65 63 6f 75 6e  },.  { "linecoun
56e0: 74 22 2c 20 20 20 20 20 20 20 6c 69 6e 65 63 6e  t",       linecn
56f0: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  tCmd,           
5700: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5710: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6d 61 78 22      },.  { "max"
5720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ,             bo
5730: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  pCmd,           
5740: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50      (void*)SBSOP
5750: 5f 4d 41 58 20 20 20 20 7d 2c 0a 20 20 7b 20 22  _MAX    },.  { "
5760: 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  min",           
5770: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20    bopCmd,       
5780: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53          (void*)S
5790: 42 53 4f 50 5f 4d 49 4e 20 20 20 20 7d 2c 0a 20  BSOP_MIN    },. 
57a0: 20 7b 20 22 6d 75 6c 22 2c 20 20 20 20 20 20 20   { "mul",       
57b0: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20        bopCmd,   
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
57d0: 64 2a 29 53 42 53 4f 50 5f 4d 55 4c 20 20 20 20  d*)SBSOP_MUL    
57e0: 7d 2c 0a 20 20 7b 20 22 6e 6f 74 22 2c 20 20 20  },.  { "not",   
57f0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 43 6d 64            notCmd
5800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5810: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5820: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6f 72 22 2c      },.  { "or",
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
5840: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20  pCmd,           
5850: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50      (void*)SBSOP
5860: 5f 4f 52 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22  _OR     },.  { "
5870: 70 75 74 73 22 2c 20 20 20 20 20 20 20 20 20 20  puts",          
5880: 20 20 70 75 74 73 43 6d 64 2c 20 20 20 20 20 20    putsCmd,      
5890: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
58b0: 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20 20   { "set",       
58c0: 20 20 20 20 20 20 73 65 74 43 6d 64 2c 20 20 20        setCmd,   
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 7d 2c 0a 20 20 7b 20 22 73 75 62 22 2c 20 20 20  },.  { "sub",   
5900: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64            bopCmd
5910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5920: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 53 55 42  (void*)SBSOP_SUB
5930: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 77 69 6b 69      },.  { "wiki
5940: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 77 69  ",            wi
5950: 6b 69 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20  kiCmd,          
5960: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
5970: 20 20 20 20 20 20 20 20 7d 2c 0a 7d 3b 0a 20 20          },.};.  
5980: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
5990: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
59a0: 64 20 73 74 72 69 6e 67 20 7a 50 61 74 74 65 72  d string zPatter
59b0: 6e 20 61 67 61 69 6e 73 74 0a 2a 2a 20 61 6e 20  n against.** an 
59c0: 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  unterminated str
59d0: 69 6e 67 20 7a 53 74 72 20 6f 66 20 6c 65 6e 67  ing zStr of leng
59e0: 74 68 20 6e 53 74 72 2e 0a 2a 2a 0a 2a 2a 20 52  th nStr..**.** R
59f0: 65 74 75 72 6e 20 6c 65 73 73 20 74 68 61 6e 2c  eturn less than,
5a00: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
5a10: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 20  eater than zero 
5a20: 69 66 0a 2a 2a 20 7a 50 61 74 74 65 72 6e 20 69  if.** zPattern i
5a30: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
5a40: 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
5a50: 72 20 74 68 61 6e 20 7a 53 74 72 2e 0a 2a 2f 0a  r than zStr..*/.
5a60: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 61  static int compa
5a70: 72 65 5f 63 6d 64 28 63 6f 6e 73 74 20 63 68 61  re_cmd(const cha
5a80: 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20 63 6f 6e  r *zPattern, con
5a90: 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 69  st char *zStr, i
5aa0: 6e 74 20 6e 53 74 72 29 7b 0a 20 20 69 6e 74 20  nt nStr){.  int 
5ab0: 63 20 3d 20 73 74 72 6e 63 6d 70 28 7a 50 61 74  c = strncmp(zPat
5ac0: 74 65 72 6e 2c 20 7a 53 74 72 2c 20 6e 53 74 72  tern, zStr, nStr
5ad0: 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 26 26  );.  if( c==0 &&
5ae0: 20 7a 50 61 74 74 65 72 6e 5b 6e 53 74 72 5d 21   zPattern[nStr]!
5af0: 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 31 3b  =0 ){.    c = 1;
5b00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b  .  }.  return c;
5b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61  .}../*.** Evalua
5b20: 74 65 20 74 68 65 20 73 63 72 69 70 74 20 67 69  te the script gi
5b30: 76 65 6e 20 62 79 20 74 68 65 20 66 69 72 73 74  ven by the first
5b40: 20 6e 53 63 72 69 70 74 20 62 79 74 65 73 20 6f   nScript bytes o
5b50: 66 20 7a 53 63 72 69 70 74 5b 5d 2e 0a 2a 2a 20  f zScript[]..** 
5b60: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
5b70: 65 73 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ess and non-zero
5b80: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 2a   for an error..*
5b90: 2f 0a 69 6e 74 20 53 62 53 5f 45 76 61 6c 28 73  /.int SbS_Eval(s
5ba0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
5bb0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5bc0: 7a 53 63 72 69 70 74 2c 20 69 6e 74 20 6e 53 63  zScript, int nSc
5bd0: 72 69 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  ript){.  int rc 
5be0: 3d 20 53 42 53 5f 4f 4b 3b 0a 20 20 69 66 28 20  = SBS_OK;.  if( 
5bf0: 6e 53 63 72 69 70 74 3c 30 20 29 20 6e 53 63 72  nScript<0 ) nScr
5c00: 69 70 74 20 3d 20 73 74 72 6c 65 6e 28 7a 53 63  ipt = strlen(zSc
5c10: 72 69 70 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  ript);.  while( 
5c20: 6e 53 63 72 69 70 74 3e 30 20 26 26 20 72 63 3d  nScript>0 && rc=
5c30: 3d 53 42 53 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  =SBS_OK ){.    i
5c40: 6e 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20 74 74  nt n;.    int tt
5c50: 79 70 65 3b 0a 20 20 20 20 6e 20 3d 20 73 62 73  ype;.    n = sbs
5c60: 5f 6e 65 78 74 5f 74 6f 6b 65 6e 28 7a 53 63 72  _next_token(zScr
5c70: 69 70 74 2c 20 6e 53 63 72 69 70 74 2c 20 26 74  ipt, nScript, &t
5c80: 74 79 70 65 29 3b 0a 0a 23 69 66 20 30 0a 20 20  type);..#if 0.  
5c90: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c    {.      int i,
5ca0: 20 6e 45 6c 65 6d 3b 0a 20 20 20 20 20 20 63 6f   nElem;.      co
5cb0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6c 65 6d 3b  nst char *zElem;
5cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
5cd0: 74 61 63 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  tack>0 ){.      
5ce0: 20 20 70 72 69 6e 74 66 28 22 53 54 41 43 4b 3a    printf("STACK:
5cf0: 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
5d00: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 74 61 63 6b  i=0; i<p->nStack
5d10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5d20: 20 20 7a 45 6c 65 6d 20 3d 20 53 62 53 5f 53 74    zElem = SbS_St
5d30: 61 63 6b 56 61 6c 75 65 28 70 2c 20 69 2c 20 26  ackValue(p, i, &
5d40: 6e 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  nElem);.        
5d50: 20 20 70 72 69 6e 74 66 28 22 20 5b 25 2e 2a 73    printf(" [%.*s
5d60: 5d 22 2c 20 6e 45 6c 65 6d 2c 20 7a 45 6c 65 6d  ]", nElem, zElem
5d70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5d80: 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22       printf("\n"
5d90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5da0: 20 70 72 69 6e 74 66 28 22 54 4f 4b 45 4e 28 25   printf("TOKEN(%
5db0: 64 29 3a 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 20 74  d): [%.*s]\n", t
5dc0: 74 79 70 65 2c 20 6e 2c 20 7a 53 63 72 69 70 74  type, n, zScript
5dd0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
5de0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 74 74 79  .    switch( tty
5df0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
5e00: 20 53 42 53 54 54 5f 57 48 49 54 45 53 50 41 43   SBSTT_WHITESPAC
5e10: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65  E: {.        bre
5e20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5e30: 20 20 63 61 73 65 20 53 42 53 54 54 5f 45 4f 46    case SBSTT_EOF
5e40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 6e 53 63 72  : {.        nScr
5e50: 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ipt = 0;.       
5e60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5e70: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54        case SBSTT
5e80: 5f 49 4e 43 4f 4d 50 4c 45 54 45 3a 0a 20 20 20  _INCOMPLETE:.   
5e90: 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 55 4e     case SBSTT_UN
5ea0: 4b 4e 4f 57 4e 3a 20 7b 0a 20 20 20 20 20 20 20  KNOWN: {.       
5eb0: 20 72 63 20 3d 20 53 42 53 5f 45 52 52 4f 52 3b   rc = SBS_ERROR;
5ec0: 0a 20 20 20 20 20 20 20 20 6e 53 63 72 69 70 74  .        nScript
5ed0: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72   = n;.        br
5ee0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5ef0: 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 49 4e     case SBSTT_IN
5f00: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20  TEGER: {.       
5f10: 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70   rc = SbS_Push(p
5f20: 2c 20 28 63 68 61 72 2a 29 7a 53 63 72 69 70 74  , (char*)zScript
5f30: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , n, 0);.       
5f40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5f50: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54        case SBSTT
5f60: 5f 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 20  _NAME: {.       
5f70: 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70   rc = SbS_Push(p
5f80: 2c 20 28 63 68 61 72 2a 29 26 7a 53 63 72 69 70  , (char*)&zScrip
5f90: 74 5b 31 5d 2c 20 6e 2d 31 2c 20 30 29 3b 0a 20  t[1], n-1, 0);. 
5fa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5fc0: 20 53 42 53 54 54 5f 53 54 52 49 4e 47 3a 20 7b   SBSTT_STRING: {
5fd0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 62  .        rc = Sb
5fe0: 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 72 2a  S_Push(p, (char*
5ff0: 29 26 7a 53 63 72 69 70 74 5b 31 5d 2c 20 6e 2d  )&zScript[1], n-
6000: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  2, 0);.        b
6010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6020: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 56      case SBSTT_V
6030: 45 52 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f  ERB: {.        /
6040: 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 75 70 20  * First look up 
6050: 74 68 65 20 76 65 72 62 20 69 6e 20 74 68 65 20  the verb in the 
6060: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
6070: 20 20 20 20 20 20 63 6f 6e 73 74 20 53 62 53 56        const SbSV
6080: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73 62 73  alue *pVal = sbs
6090: 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d 54 61  _fetch(&p->symTa
60a0: 62 2c 20 28 63 68 61 72 2a 29 7a 53 63 72 69 70  b, (char*)zScrip
60b0: 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  t, n);.        i
60c0: 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  f( pVal==0 ){.  
60d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
60e0: 65 20 76 65 72 62 20 69 73 20 6e 6f 74 20 69 6e  e verb is not in
60f0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2c   the hash table,
6100: 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 0a 20 20 20   look for a .   
6110: 20 20 20 20 20 20 20 2a 2a 20 62 75 69 6c 74 2d         ** built-
6120: 69 6e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  in command */.  
6130: 20 20 20 20 20 20 20 20 69 6e 74 20 75 70 72 20          int upr 
6140: 3d 20 73 69 7a 65 6f 66 28 61 42 75 69 6c 74 69  = sizeof(aBuilti
6150: 6e 29 2f 73 69 7a 65 6f 66 28 61 42 75 69 6c 74  n)/sizeof(aBuilt
6160: 69 6e 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20  in[0]) - 1;.    
6170: 20 20 20 20 20 20 69 6e 74 20 6c 77 72 20 3d 20        int lwr = 
6180: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
6190: 3d 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20  = SBS_ERROR;.   
61a0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 75 70         while( up
61b0: 72 3e 3d 6c 77 72 20 29 7b 0a 20 20 20 20 20 20  r>=lwr ){.      
61c0: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 28 75        int i = (u
61d0: 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 20  pr+lwr)/2;.     
61e0: 20 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 63         int c = c
61f0: 6f 6d 70 61 72 65 5f 63 6d 64 28 61 42 75 69 6c  ompare_cmd(aBuil
6200: 74 69 6e 5b 69 5d 2e 7a 43 6d 64 2c 20 7a 53 63  tin[i].zCmd, zSc
6210: 72 69 70 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ript, n);.      
6220: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
6230: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6240: 72 63 20 3d 20 61 42 75 69 6c 74 69 6e 5b 69 5d  rc = aBuiltin[i]
6250: 2e 78 43 6d 64 28 70 2c 20 61 42 75 69 6c 74 69  .xCmd(p, aBuilti
6260: 6e 5b 69 5d 2e 70 41 72 67 29 3b 0a 20 20 20 20  n[i].pArg);.    
6270: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
6290: 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 72 20              upr 
62b0: 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  = i-1;.         
62c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
62d0: 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 2b          lwr = i+
62e0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
62f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6300: 20 20 20 20 20 20 20 69 66 28 20 75 70 72 3c 6c         if( upr<l
6310: 77 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  wr ){.          
6320: 20 20 53 62 53 5f 53 65 74 45 72 72 6f 72 4d 65    SbS_SetErrorMe
6330: 73 73 61 67 65 28 70 2c 20 22 75 6e 6b 6e 6f 77  ssage(p, "unknow
6340: 6e 20 76 65 72 62 3a 20 25 2e 2a 73 22 2c 20 6e  n verb: %.*s", n
6350: 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20  , zScript);.    
6360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6370: 7d 65 6c 73 65 20 69 66 28 20 70 56 61 6c 2d 3e  }else if( pVal->
6380: 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f 56  flags & SBSVAL_V
6390: 45 52 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ERB ){.         
63a0: 20 72 63 20 3d 20 70 56 61 6c 2d 3e 75 2e 76 65   rc = pVal->u.ve
63b0: 72 62 2e 78 56 65 72 62 28 70 2c 20 70 56 61 6c  rb.xVerb(p, pVal
63c0: 2d 3e 75 2e 76 65 72 62 2e 70 41 72 67 29 3b 0a  ->u.verb.pArg);.
63d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
63e0: 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20  ( pVal->flags & 
63f0: 53 42 53 56 41 4c 5f 45 58 45 43 20 29 7b 0a 20  SBSVAL_EXEC ){. 
6400: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 62           rc = Sb
6410: 53 5f 45 76 61 6c 28 70 2c 20 70 56 61 6c 2d 3e  S_Eval(p, pVal->
6420: 75 2e 73 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75  u.str.z, pVal->u
6430: 2e 73 74 72 2e 73 69 7a 65 29 3b 0a 20 20 20 20  .str.size);.    
6440: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6450: 20 20 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75       rc = SbS_Pu
6460: 73 68 28 70 2c 20 70 56 61 6c 2d 3e 75 2e 73 74  sh(p, pVal->u.st
6470: 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72  r.z, pVal->u.str
6480: 2e 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  .size, 0);.     
6490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
64a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
64b0: 7d 0a 20 20 20 20 7a 53 63 72 69 70 74 20 2b 3d  }.    zScript +=
64c0: 20 6e 3b 0a 20 20 20 20 6e 53 63 72 69 70 74 20   n;.    nScript 
64d0: 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75  -= n;.  }.  retu
64e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
64f0: 54 68 65 20 7a 5b 5d 20 69 6e 70 75 74 20 63 6f  The z[] input co
6500: 6e 74 61 69 6e 73 20 74 65 78 74 20 6d 69 78 65  ntains text mixe
6510: 64 20 77 69 74 68 20 73 75 62 73 63 72 69 70 74  d with subscript
6520: 20 73 63 72 69 70 74 73 2e 0a 2a 2a 20 54 68 65   scripts..** The
6530: 20 73 75 62 73 63 72 69 70 74 20 73 63 72 69 70   subscript scrip
6540: 74 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  ts are contained
6550: 20 77 69 74 68 69 6e 20 5b 2e 2e 2e 5d 2e 20 20   within [...].  
6560: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
6570: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 74 65  processes the te
6580: 6d 70 6c 61 74 65 20 61 6e 64 20 77 72 69 74 65  mplate and write
6590: 73 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e  s the results on
65a0: 20 65 69 74 68 65 72 0a 2a 2a 20 73 74 64 6f 75   either.** stdou
65b0: 74 20 6f 72 20 69 6e 74 6f 20 43 47 49 2e 0a 2a  t or into CGI..*
65c0: 2f 0a 69 6e 74 20 53 62 53 5f 52 65 6e 64 65 72  /.int SbS_Render
65d0: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70  (struct Subscrip
65e0: 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  t *p, const char
65f0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20   *z){.  int i = 
6600: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 42  0;.  int rc = SB
6610: 53 5f 4f 4b 3b 0a 20 20 77 68 69 6c 65 28 20 7a  S_OK;.  while( z
6620: 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  [i] ){.    if( z
6630: 5b 69 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  [i]=='[' ){.    
6640: 20 20 73 65 6e 64 54 65 78 74 28 7a 2c 20 69 29    sendText(z, i)
6650: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31  ;.      z += i+1
6660: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
6670: 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27   z[i] && z[i]!='
6680: 5d 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]'; i++){}.     
6690: 20 72 63 20 3d 20 53 62 53 5f 45 76 61 6c 28 70   rc = SbS_Eval(p
66a0: 2c 20 7a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , z, i);.      i
66b0: 66 28 20 72 63 21 3d 53 42 53 5f 4f 4b 20 29 20  f( rc!=SBS_OK ) 
66c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
66d0: 20 7a 5b 69 5d 20 29 20 69 2b 2b 3b 0a 20 20 20   z[i] ) i++;.   
66e0: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20     z += i;.     
66f0: 20 69 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   i = 0;.    }els
6700: 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  e{.      i++;.  
6710: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
6720: 3d 3d 53 42 53 5f 45 52 52 4f 52 20 29 7b 0a 20  ==SBS_ERROR ){. 
6730: 20 20 20 73 65 6e 64 54 65 78 74 28 22 3c 68 72     sendText("<hr
6740: 3e 3c 70 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d  ><p><font color=
6750: 5c 22 72 65 64 5c 22 3e 3c 62 3e 45 52 52 4f 52  \"red\"><b>ERROR
6760: 3a 20 22 2c 20 2d 31 29 3b 0a 20 20 20 20 73 65  : ", -1);.    se
6770: 6e 64 54 65 78 74 28 53 62 53 5f 47 65 74 45 72  ndText(SbS_GetEr
6780: 72 6f 72 4d 65 73 73 61 67 65 28 70 29 2c 20 2d  rorMessage(p), -
6790: 31 29 3b 0a 20 20 20 20 73 65 6e 64 54 65 78 74  1);.    sendText
67a0: 28 22 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 70  ("</b></font></p
67b0: 3e 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  >", -1);.  }else
67c0: 7b 0a 20 20 20 20 73 65 6e 64 54 65 78 74 28 7a  {.    sendText(z
67d0: 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , i);.  }.  retu
67e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
67f0: 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 73 75  COMMAND: test-su
6800: 62 73 63 72 69 70 74 0a 2a 2f 0a 76 6f 69 64 20  bscript.*/.void 
6810: 74 65 73 74 5f 73 75 62 73 63 72 69 70 74 28 76  test_subscript(v
6820: 6f 69 64 29 7b 0a 20 20 53 75 62 73 63 72 69 70  oid){.  Subscrip
6830: 74 20 2a 70 3b 0a 20 20 42 6c 6f 62 20 69 6e 3b  t *p;.  Blob in;
6840: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3c 33 20  .  if( g.argc<3 
6850: 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 46 49  ){.    usage("FI
6860: 4c 45 22 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62  LE");.  }.  blob
6870: 5f 7a 65 72 6f 28 26 69 6e 29 3b 0a 20 20 62 6c  _zero(&in);.  bl
6880: 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c  ob_read_from_fil
6890: 65 28 26 69 6e 2c 20 67 2e 61 72 67 76 5b 32 5d  e(&in, g.argv[2]
68a0: 29 3b 0a 20 20 70 20 3d 20 53 62 53 5f 43 72 65  );.  p = SbS_Cre
68b0: 61 74 65 28 29 3b 0a 20 20 53 62 53 5f 52 65 6e  ate();.  SbS_Ren
68c0: 64 65 72 28 70 2c 20 62 6c 6f 62 5f 73 74 72 28  der(p, blob_str(
68d0: 26 69 6e 29 29 3b 0a 7d 0a                       &in));.}.