Hex Artifact Content
Not logged in

Artifact dd44ba15200c912d459ff11ebf184834be9a203a:

File src/subscript.c part of check-in [39aa870f8f] - Work toward a new mechanism for configuring the ticket subsystem and rendering ticket entry, editing, and viewing screens. Nothing works, but it is all commented out so the code code compile. by drh on 2007-10-14 00:29:14.

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 68 61 73 68 20 74 61  th.  The hash ta
04f0: 62 6c 65 0a 2a 2a 20 69 73 20 6f 66 20 61 20 6c  ble.** is of a l
0500: 69 6d 69 74 65 64 20 61 6e 64 20 66 69 78 65 64  imited and fixed
0510: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
0520: 73 20 6d 6f 64 75 6c 65 20 61 74 74 65 6d 70 74  s module attempt
0530: 73 20 74 6f 20 62 65 20 63 6f 6d 70 6c 65 74 65  s to be complete
0540: 6c 79 20 73 65 6c 66 2d 63 6f 6e 74 61 69 6e 65  ly self-containe
0550: 64 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  d so that it can
0560: 0a 2a 2a 20 62 65 20 70 6f 72 74 61 62 6c 65 20  .** be portable 
0570: 74 6f 20 6f 74 68 65 72 20 70 72 6f 6a 65 63 74  to other project
0580: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  s..*/.#include "
0590: 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75  config.h".#inclu
05a0: 64 65 20 22 73 75 62 73 63 72 69 70 74 2e 68 22  de "subscript.h"
05b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
05c0: 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  t.h>../*.** Conf
05d0: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 73 74 61  iguration consta
05e0: 6e 74 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  nts.*/.#define S
05f0: 42 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 20 20  BSCONFIG_NHASH  
0600: 20 20 34 31 20 20 20 20 20 20 20 20 20 2f 2a 20    41         /* 
0610: 53 69 7a 65 20 6f 66 20 74 68 65 20 68 61 73 68  Size of the hash
0620: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
0630: 65 20 53 42 53 43 4f 4e 46 49 47 5f 4e 53 54 41  e SBSCONFIG_NSTA
0640: 43 4b 20 20 20 31 30 20 20 20 20 20 20 20 20 20  CK   10         
0650: 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 74 61 63 6b  /* Maximum stack
0660: 20 64 65 70 74 68 20 2a 2f 0a 23 64 65 66 69 6e   depth */.#defin
0670: 65 20 53 42 53 43 4f 4e 46 49 47 5f 45 52 52 53  e SBSCONFIG_ERRS
0680: 49 5a 45 20 20 31 30 30 20 20 20 20 20 20 20 20  IZE  100        
0690: 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  /* Maximum size 
06a0: 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  of an error mess
06b0: 61 67 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 76  age */../*.** Av
06c0: 61 69 6c 61 62 6c 65 20 74 6f 6b 65 6e 20 74 79  ailable token ty
06d0: 70 65 73 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  pes:.*/.#define 
06e0: 53 42 53 54 54 5f 57 48 49 54 45 53 50 41 43 45  SBSTT_WHITESPACE
06f0: 20 20 31 20 20 20 20 2f 2a 20 65 78 3a 20 20 20    1    /* ex:   
0700: 5c 30 34 30 20 20 20 2a 2f 0a 23 64 65 66 69 6e  \040   */.#defin
0710: 65 20 53 42 53 54 54 5f 4e 41 4d 45 20 20 20 20  e SBSTT_NAME    
0720: 20 20 20 20 32 20 20 20 20 2f 2a 20 65 78 3a 20      2    /* ex: 
0730: 20 20 2f 61 62 63 64 65 20 20 2a 2f 0a 23 64 65    /abcde  */.#de
0740: 66 69 6e 65 20 53 42 53 54 54 5f 56 45 52 42 20  fine SBSTT_VERB 
0750: 20 20 20 20 20 20 20 33 20 20 20 20 2f 2a 20 65         3    /* e
0760: 78 3a 20 20 20 61 62 63 64 65 20 20 20 2a 2f 0a  x:   abcde   */.
0770: 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 53 54  #define SBSTT_ST
0780: 52 49 4e 47 20 20 20 20 20 20 34 20 20 20 20 2f  RING      4    /
0790: 2a 20 65 78 3a 20 20 20 7b 2e 2e 2e 7d 20 20 20  * ex:   {...}   
07a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54  */.#define SBSTT
07b0: 5f 49 4e 54 45 47 45 52 20 20 20 20 20 35 20 20  _INTEGER     5  
07c0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 69 6e 63    /* Integer inc
07d0: 6c 75 64 69 6e 67 20 6f 70 74 69 6f 6e 20 73 69  luding option si
07e0: 67 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42  gn */.#define SB
07f0: 53 54 54 5f 49 4e 43 4f 4d 50 4c 45 54 45 20 20  STT_INCOMPLETE  
0800: 36 20 20 20 20 2f 2a 20 55 6e 74 65 72 6d 69 6e  6    /* Untermin
0810: 61 74 65 64 20 73 74 72 69 6e 67 20 74 6f 6b 65  ated string toke
0820: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53  n */.#define SBS
0830: 54 54 5f 55 4e 4b 4e 4f 57 4e 20 20 20 20 20 37  TT_UNKNOWN     7
0840: 20 20 20 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20 74      /* Unknown t
0850: 6f 6b 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  oken */.#define 
0860: 53 42 53 54 54 5f 45 4f 46 20 20 20 20 20 20 20  SBSTT_EOF       
0870: 20 20 38 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66    8    /* End of
0880: 20 69 6e 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   input */../*.**
0890: 20 47 69 76 65 6e 20 61 6e 20 69 6e 70 75 74 20   Given an input 
08a0: 73 74 72 69 6e 67 20 7a 20 6f 66 20 6c 65 6e 67  string z of leng
08b0: 74 68 20 6e 2c 20 69 64 65 6e 74 69 66 79 20 74  th n, identify t
08c0: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 0a 2a 2a  he token that.**
08d0: 20 73 74 61 72 74 73 20 61 74 20 7a 5b 30 5d 2e   starts at z[0].
08e0: 20 20 57 72 69 74 65 20 74 68 65 20 74 6f 6b 65    Write the toke
08f0: 6e 20 74 79 70 65 20 69 6e 74 6f 20 2a 70 54 6f  n type into *pTo
0900: 6b 65 6e 54 79 70 65 20 61 6e 64 0a 2a 2a 20 72  kenType and.** r
0910: 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
0920: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a   of the token..*
0930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 62 73  /.static int sbs
0940: 5f 6e 65 78 74 5f 74 6f 6b 65 6e 28 63 6f 6e 73  _next_token(cons
0950: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
0960: 2c 20 69 6e 74 20 2a 70 54 6f 6b 65 6e 54 79 70  , int *pTokenTyp
0970: 65 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  e){.  int c;.  i
0980: 66 28 20 6e 3c 3d 30 20 7c 7c 20 7a 5b 30 5d 3d  f( n<=0 || z[0]=
0990: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 54 6f 6b 65  =0 ){.    *pToke
09a0: 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 45 4f  nType = SBSTT_EO
09b0: 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
09c0: 0a 20 20 7d 0a 20 20 63 20 3d 20 7a 5b 30 5d 3b  .  }.  c = z[0];
09d0: 0a 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63  .  if( isspace(c
09e0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
09f0: 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20      *pTokenType 
0a00: 3d 20 53 42 53 54 54 5f 57 48 49 54 45 53 50 41  = SBSTT_WHITESPA
0a10: 43 45 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  CE;.    for(i=1;
0a20: 20 69 3c 6e 20 26 26 20 69 73 73 70 61 63 65 28   i<n && isspace(
0a30: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
0a40: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a    return i;.  }.
0a50: 20 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a    if( c=='#' ){.
0a60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
0a70: 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 7a  or(i=1; i<n && z
0a80: 5b 69 5d 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27  [i] && z[i-1]!='
0a90: 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \n'; i++){}.    
0aa0: 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42  *pTokenType = SB
0ab0: 53 54 54 5f 57 48 49 54 45 53 50 41 43 45 3b 0a  STT_WHITESPACE;.
0ac0: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
0ad0: 7d 0a 20 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  }.  if( c=='{' )
0ae0: 7b 0a 20 20 20 20 69 6e 74 20 64 65 70 74 68 20  {.    int depth 
0af0: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 1;.    int i;.
0b00: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
0b10: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
0b20: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
0b30: 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 64  '{' ){.        d
0b40: 65 70 74 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  epth++;.      }e
0b50: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 7d  lse if( z[i]=='}
0b60: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 70  ' ){.        dep
0b70: 74 68 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  th--;.        if
0b80: 28 20 64 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  ( depth==0 ){.  
0b90: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
0ba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
0bc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 65      }.    if( de
0bd0: 70 74 68 20 29 7b 0a 20 20 20 20 20 20 2a 70 54  pth ){.      *pT
0be0: 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54  okenType = SBSTT
0bf0: 5f 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20  _INCOMPLETE;.   
0c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
0c10: 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54  TokenType = SBST
0c20: 54 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 7d 0a  T_STRING;.    }.
0c30: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
0c40: 7d 0a 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26  }.  if( c=='/' &
0c50: 26 20 6e 3e 3d 32 20 26 26 20 69 73 61 6c 70 68  & n>=2 && isalph
0c60: 61 28 7a 5b 31 5d 29 20 29 7b 0a 20 20 20 20 69  a(z[1]) ){.    i
0c70: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
0c80: 32 3b 20 69 3c 6e 20 26 26 20 28 69 73 61 6c 6e  2; i<n && (isaln
0c90: 75 6d 28 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d  um(z[i]) || z[i]
0ca0: 3d 3d 27 5f 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20  =='_'); i++){}. 
0cb0: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d     *pTokenType =
0cc0: 20 53 42 53 54 54 5f 4e 41 4d 45 3b 0a 20 20 20   SBSTT_NAME;.   
0cd0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
0ce0: 20 69 66 28 20 69 73 61 6c 70 68 61 28 63 29 20   if( isalpha(c) 
0cf0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
0d00: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26    for(i=1; i<n &
0d10: 26 20 28 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29  & (isalnum(z[i])
0d20: 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 5f 27 29 3b 20   || z[i]=='_'); 
0d30: 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b  i++){}.    *pTok
0d40: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 56  enType = SBSTT_V
0d50: 45 52 42 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ERB;.    return 
0d60: 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 64  i;.  }.  if( isd
0d70: 69 67 69 74 28 63 29 20 7c 7c 20 28 28 63 3d 3d  igit(c) || ((c==
0d80: 27 2d 27 20 7c 7c 20 63 3d 3d 27 2b 27 29 20 26  '-' || c=='+') &
0d90: 26 20 6e 3e 3d 32 20 26 26 20 69 73 64 69 67 69  & n>=2 && isdigi
0da0: 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20  t(z[1])) ){.    
0db0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
0dc0: 3d 31 3b 20 69 3c 6e 20 26 26 20 69 73 64 69 67  =1; i<n && isdig
0dd0: 69 74 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  it(z[i]); i++){}
0de0: 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65  .    *pTokenType
0df0: 20 3d 20 53 42 53 54 54 5f 49 4e 54 45 47 45 52   = SBSTT_INTEGER
0e00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a  ;.    return i;.
0e10: 20 20 7d 0a 20 20 2a 70 54 6f 6b 65 6e 54 79 70    }.  *pTokenTyp
0e20: 65 20 3d 20 53 42 53 54 54 5f 55 4e 4b 4e 4f 57  e = SBSTT_UNKNOW
0e30: 4e 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  N;.  return 1;.}
0e40: 0a 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20  .../*.** Values 
0e50: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
0e60: 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 73 20  e hash table as 
0e70: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
0e80: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0e90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
0ea0: 64 65 66 20 73 74 72 75 63 74 20 53 62 53 56 61  def struct SbSVa
0eb0: 6c 75 65 20 53 62 53 56 61 6c 75 65 3b 0a 73 74  lue SbSValue;.st
0ec0: 72 75 63 74 20 53 62 53 56 61 6c 75 65 20 7b 0a  ruct SbSValue {.
0ed0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
0ee0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
0ef0: 66 20 53 42 53 56 41 4c 5f 2a 20 76 61 6c 75 65  f SBSVAL_* value
0f00: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
0f10: 20 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20     struct {.    
0f20: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
0f30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0f40: 62 79 74 65 73 20 69 6e 20 73 74 72 69 6e 67 2c  bytes in string,
0f50: 20 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 66 69   not counting fi
0f60: 6e 61 6c 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20  nal zero */.    
0f70: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
0f80: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
0f90: 20 73 74 72 69 6e 67 20 63 6f 6e 74 65 6e 74 20   string content 
0fa0: 2a 2f 0a 20 20 20 20 7d 20 73 74 72 3b 20 20 20  */.    } str;   
0fb0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
0fc0: 69 66 20 53 42 53 56 41 4c 5f 53 54 52 20 2a 2f  if SBSVAL_STR */
0fd0: 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20 20  .    struct {.  
0fe0: 20 20 20 20 69 6e 74 20 28 2a 78 56 65 72 62 29      int (*xVerb)
0ff0: 28 53 75 62 73 63 72 69 70 74 2a 29 2c 20 76 6f  (Subscript*), vo
1000: 69 64 2a 29 3b 20 20 2f 2a 20 46 75 6e 63 74 69  id*);  /* Functi
1010: 6f 6e 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  on to do the wor
1020: 6b 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  k */.      void 
1030: 2a 70 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  *pArg;          
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1050: 2f 2a 20 32 6e 64 20 70 61 72 61 6d 65 74 65 72  /* 2nd parameter
1060: 20 74 6f 20 78 56 65 72 62 20 2a 2f 0a 20 20 20   to xVerb */.   
1070: 20 7d 20 76 65 72 62 3b 20 20 20 20 20 20 20 20   } verb;        
1080: 20 2f 2a 20 56 61 6c 75 65 20 69 66 20 53 42 53   /* Value if SBS
1090: 56 41 4c 5f 56 45 52 42 20 2a 2f 0a 20 20 7d 20  VAL_VERB */.  } 
10a0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
10b0: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 42 53 56  .};.#define SBSV
10c0: 41 4c 5f 56 45 52 42 20 20 20 20 30 78 30 30 30  AL_VERB    0x000
10d0: 31 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20  1      /* Value 
10e0: 73 74 6f 72 65 64 20 69 6e 20 75 2e 76 65 72 62  stored in u.verb
10f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 56   */.#define SBSV
1100: 41 4c 5f 53 54 52 20 20 20 20 20 30 78 30 30 30  AL_STR     0x000
1110: 32 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20  2      /* Value 
1120: 73 74 6f 72 65 64 20 69 6e 20 75 2e 73 74 72 20  stored in u.str 
1130: 2a 2f 20 0a 23 64 65 66 69 6e 65 20 53 42 53 56  */ .#define SBSV
1140: 41 4c 5f 44 59 4e 20 20 20 20 20 30 78 30 30 30  AL_DYN     0x000
1150: 34 20 20 20 20 20 20 2f 2a 20 75 2e 73 74 72 2e  4      /* u.str.
1160: 7a 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  z is dynamically
1170: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 23 64   allocated */.#d
1180: 65 66 69 6e 65 20 53 42 53 56 41 4c 5f 45 58 45  efine SBSVAL_EXE
1190: 43 20 20 20 20 30 78 30 30 30 38 20 20 20 20 20  C    0x0008     
11a0: 20 2f 2a 20 75 2e 73 74 72 2e 7a 20 69 73 20 61   /* u.str.z is a
11b0: 20 73 63 72 69 70 74 20 2a 2f 0a 0a 2f 2a 0a 2a   script */../*.*
11c0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 6d 65  * Release any me
11d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  mory allocated b
11e0: 79 20 61 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  y a value..*/.st
11f0: 61 74 69 63 20 76 6f 69 64 20 73 62 73 5f 76 61  atic void sbs_va
1200: 6c 75 65 5f 72 65 73 65 74 28 53 62 53 56 61 6c  lue_reset(SbSVal
1210: 75 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ue *p){.  if( p-
1220: 3e 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f  >flags & SBSVAL_
1230: 44 59 4e 20 29 7b 0a 20 20 20 20 66 72 65 65 28  DYN ){.    free(
1240: 70 2d 3e 75 2e 73 74 72 2e 7a 29 3b 0a 20 20 20  p->u.str.z);.   
1250: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 53 42 53 56   p->flags = SBSV
1260: 41 4c 5f 53 54 52 3b 0a 20 20 20 20 70 2d 3e 75  AL_STR;.    p->u
1270: 2e 73 74 72 2e 7a 20 3d 20 22 22 3b 0a 20 20 20  .str.z = "";.   
1280: 20 70 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 20 3d   p->u.str.size =
1290: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a   0;.  }.}.../*.*
12a0: 2a 20 41 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  * An entry in th
12b0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20  e hash table is 
12c0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
12d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
12e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
12f0: 20 55 73 48 61 73 68 45 6e 74 72 79 20 55 73 48   UsHashEntry UsH
1300: 61 73 68 45 6e 74 72 79 3b 0a 73 74 72 75 63 74  ashEntry;.struct
1310: 20 55 73 48 61 73 68 45 6e 74 72 79 20 7b 0a 20   UsHashEntry {. 
1320: 20 55 73 48 61 73 68 45 6e 74 72 79 20 2a 70 4e   UsHashEntry *pN
1330: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74  ext;     /* Next
1340: 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
1350: 73 61 6d 65 20 68 61 73 68 20 6f 6e 20 7a 4b 65  same hash on zKe
1360: 79 20 2a 2f 0a 20 20 53 62 53 56 61 6c 75 65 20  y */.  SbSValue 
1370: 76 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  val;            
1380: 2f 2a 20 54 68 65 20 70 61 79 6c 6f 61 64 20 2a  /* The payload *
1390: 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20  /.  int nKey;   
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13b0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
13c0: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4b 65 79 5b   */.  char zKey[
13d0: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0];           /*
13e0: 20 54 68 65 20 6b 65 79 20 2a 2f 0a 7d 3b 0a 0a   The key */.};..
13f0: 2f 2a 0a 2a 2a 20 41 20 68 61 73 68 20 74 61 62  /*.** A hash tab
1400: 6c 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  le is an instanc
1410: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1420: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
1430: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1440: 55 73 48 61 73 68 54 61 62 20 55 73 48 61 73 68  UsHashTab UsHash
1450: 54 61 62 3b 0a 73 74 72 75 63 74 20 55 73 48 61  Tab;.struct UsHa
1460: 73 68 54 61 62 20 7b 0a 20 20 55 73 48 61 73 68  shTab {.  UsHash
1470: 45 6e 74 72 79 20 2a 61 48 61 73 68 5b 53 42 53  Entry *aHash[SBS
1480: 43 4f 4e 46 49 47 5f 4e 48 41 53 48 5d 3b 20 20  CONFIG_NHASH];  
1490: 2f 2a 20 54 68 65 20 68 61 73 68 20 74 61 62 6c  /* The hash tabl
14a0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  e */.};../*.** C
14b0: 6f 6d 70 75 74 65 20 61 20 68 61 73 68 20 6f 6e  ompute a hash on
14c0: 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74   a string..*/.st
14d0: 61 74 69 63 20 69 6e 74 20 73 62 73 5f 68 61 73  atic int sbs_has
14e0: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  h(const char *z,
14f0: 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 68   int n){.  int h
1500: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
1520: 2b 2b 29 7b 0a 20 20 20 20 68 20 5e 3d 20 28 68  ++){.    h ^= (h
1530: 3c 3c 31 29 20 7c 20 7a 5b 69 5d 3b 0a 20 20 7d  <<1) | z[i];.  }
1540: 0a 20 20 68 20 26 3d 20 30 78 37 66 66 66 66 66  .  h &= 0x7fffff
1550: 66 3b 0a 20 20 72 65 74 75 72 6e 20 68 20 25 20  f;.  return h % 
1560: 53 42 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 3b  SBSCONFIG_NHASH;
1570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75  .}../*.** Look u
1580: 70 20 61 20 76 61 6c 75 65 20 69 6e 20 74 68 65  p a value in the
1590: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 52 65   hash table.  Re
15a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
15b0: 6f 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  o the value..** 
15c0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
15d0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
15e0: 74 69 63 20 63 6f 6e 73 74 20 53 62 53 56 61 6c  tic const SbSVal
15f0: 75 65 20 2a 73 62 73 5f 66 65 74 63 68 28 0a 20  ue *sbs_fetch(. 
1600: 20 73 62 73 5f 68 61 73 68 20 2a 70 48 61 73 68   sbs_hash *pHash
1610: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1620: 2a 7a 4b 65 79 2c 20 0a 20 20 69 6e 74 20 6e 4b  *zKey, .  int nK
1630: 65 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey.){.  int h;. 
1640: 20 55 73 48 61 73 68 45 6e 74 72 79 20 2a 70 3b   UsHashEntry *p;
1650: 0a 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30 20 29  ..  if( nKey<0 )
1660: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
1670: 4b 65 79 29 3b 0a 20 20 68 20 3d 20 73 62 73 5f  Key);.  h = sbs_
1680: 68 61 73 68 28 7a 4b 65 79 2c 20 6e 4b 65 79 29  hash(zKey, nKey)
1690: 3b 0a 20 20 66 6f 72 28 70 20 3d 20 70 48 61 73  ;.  for(p = pHas
16a0: 68 2d 3e 61 48 61 73 68 5b 68 5d 3b 20 70 3b 20  h->aHash[h]; p; 
16b0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
16c0: 20 69 66 28 20 70 2d 3e 6e 4b 65 79 3d 3d 6e 4b   if( p->nKey==nK
16d0: 65 79 20 26 26 20 6d 65 6d 63 6d 70 28 70 2d 3e  ey && memcmp(p->
16e0: 7a 4b 65 79 2c 7a 4b 65 79 2c 6e 4b 65 79 29 3d  zKey,zKey,nKey)=
16f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1700: 72 6e 20 26 70 2d 3e 76 61 6c 3b 0a 20 20 20 20  rn &p->val;.    
1710: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72 65  ;.}../*.** Store
1730: 20 61 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20   a value in the 
1740: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4f 76 65  hash table.  Ove
1750: 72 77 72 69 74 65 20 61 6e 79 20 70 72 69 6f 72  rwrite any prior
1760: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a 2a 2a   value stored.**
1770: 20 75 6e 64 65 72 20 74 68 65 20 73 61 6d 65 20   under the same 
1780: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  name..**.** If t
1790: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
17a0: 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6e 65 65  4th argument nee
17b0: 64 73 20 74 6f 20 62 65 20 72 65 73 65 74 20 6f  ds to be reset o
17c0: 72 20 66 72 65 65 64 2c 0a 2a 2a 20 74 68 65 20  r freed,.** the 
17d0: 68 61 73 68 20 74 61 62 6c 65 20 77 69 6c 6c 20  hash table will 
17e0: 74 61 6b 65 20 6f 76 65 72 20 72 65 73 70 6f 6e  take over respon
17f0: 73 69 62 69 6c 69 69 74 79 20 66 6f 72 20 64 6f  sibiliity for do
1800: 69 6e 67 20 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ing so..*/.stati
1810: 63 20 69 6e 74 20 73 62 73 5f 73 74 6f 72 65 28  c int sbs_store(
1820: 0a 20 20 73 62 73 5f 68 61 73 68 20 2a 70 48 61  .  sbs_hash *pHa
1830: 73 68 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  sh,         /* I
1840: 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 69 73 20  nsert into this 
1850: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
1860: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
1870: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b  ,       /* The k
1880: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  ey */.  int nKey
1890: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6b  /* Size of the k
18b0: 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 53 62  ey */.  const Sb
18c0: 53 56 61 6c 75 65 20 2a 70 56 61 6c 75 65 20 20  SValue *pValue  
18d0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f   /* The value to
18e0: 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 29 7b   be stored */.){
18f0: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 55 73 48 61  .  int h;.  UsHa
1900: 73 68 45 6e 74 72 79 20 2a 70 3b 0a 0a 20 20 69  shEntry *p;..  i
1910: 66 28 20 6e 4b 65 79 3c 30 20 29 20 6e 4b 65 79  f( nKey<0 ) nKey
1920: 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b   = strlen(zKey);
1930: 0a 20 20 68 20 3d 20 73 62 73 5f 68 61 73 68 28  .  h = sbs_hash(
1940: 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 66  zKey, nKey);.  f
1950: 6f 72 28 70 20 3d 20 70 48 61 73 68 2d 3e 61 48  or(p = pHash->aH
1960: 61 73 68 5b 68 5d 3b 20 70 3b 20 70 3d 70 2d 3e  ash[h]; p; p=p->
1970: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1980: 70 2d 3e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 26 26  p->nKey==nKey &&
1990: 20 6d 65 6d 63 6d 70 28 70 2d 3e 7a 4b 65 79 2c   memcmp(p->zKey,
19a0: 7a 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b  zKey,nKey)==0 ){
19b0: 0a 20 20 20 20 20 20 73 62 73 5f 76 61 6c 75 65  .      sbs_value
19c0: 5f 72 65 73 65 74 28 26 70 2d 3e 76 61 6c 29 3b  _reset(&p->val);
19d0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
19e0: 2d 3e 76 61 6c 2c 20 70 56 61 6c 75 65 2c 20 73  ->val, pValue, s
19f0: 69 7a 65 6f 66 28 70 2d 3e 76 61 6c 29 29 3b 0a  izeof(p->val));.
1a00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 42 53        return SBS
1a10: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
1a20: 20 70 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20   pNew = malloc( 
1a30: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
1a40: 6e 4b 65 79 20 29 3b 0a 20 20 69 66 28 20 70 4e  nKey );.  if( pN
1a50: 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
1a60: 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  nKey = nKey;.   
1a70: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4b   memcpy(pNew->zK
1a80: 65 79 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2b 31  ey, zKey, nKey+1
1a90: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
1aa0: 4e 65 77 2d 3e 76 61 6c 2c 20 70 56 61 6c 75 65  New->val, pValue
1ab0: 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 76  , sizeof(pNew->v
1ac0: 61 6c 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  al));.    pNew->
1ad0: 70 4e 65 78 74 20 3d 20 70 48 61 73 68 2d 3e 61  pNext = pHash->a
1ae0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 48 61  Hash[h];.    pHa
1af0: 73 68 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  sh->aHash[h] = p
1b00: 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
1b10: 53 42 53 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  SBS_OK;.  }.  re
1b20: 74 75 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a  turn SBS_ERROR;.
1b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 61  }../*.** Reset a
1b40: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a   hash table..*/.
1b50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 62 73 5f  static void sbs_
1b60: 68 61 73 68 5f 72 65 73 65 74 28 73 62 73 5f 68  hash_reset(sbs_h
1b70: 61 73 68 20 2a 70 48 61 73 68 29 7b 0a 20 20 69  ash *pHash){.  i
1b80: 6e 74 20 69 3b 0a 20 20 55 73 48 61 73 68 45 6e  nt i;.  UsHashEn
1b90: 74 72 79 20 2a 70 2c 20 2a 70 4e 65 78 74 3b 0a  try *p, *pNext;.
1ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 42 53    for(i=0; i<SBS
1bb0: 43 4f 4e 46 49 47 5f 4e 48 41 53 48 3b 20 69 2b  CONFIG_NHASH; i+
1bc0: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 48  +){.    for(p=pH
1bd0: 61 73 68 2d 3e 61 48 61 73 68 5b 69 5d 3b 20 70  ash->aHash[i]; p
1be0: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
1bf0: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
1c00: 78 74 3b 0a 20 20 20 20 20 20 73 62 73 5f 76 61  xt;.      sbs_va
1c10: 6c 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 76 61  lue_reset(&p->va
1c20: 6c 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 70  l);.      free(p
1c30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d  );.    }.  }.  m
1c40: 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20  emset(pHash, 0, 
1c50: 73 69 7a 65 6f 66 28 2a 70 48 61 73 68 29 29 3b  sizeof(*pHash));
1c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
1c70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62  tance of the Sub
1c80: 73 63 72 69 70 74 20 69 6e 74 65 72 70 72 65 74  script interpret
1c90: 65 72 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 62  er.*/.struct Sub
1ca0: 73 63 72 69 70 74 20 7b 0a 20 20 69 6e 74 20 6e  script {.  int n
1cb0: 53 74 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  Stack;          
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1ce0: 20 6f 6e 20 73 74 61 63 6b 20 2a 2f 0a 20 20 55   on stack */.  U
1cf0: 73 48 61 73 68 54 61 62 20 73 79 6d 54 61 62 3b  sHashTab symTab;
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  /* The symbol ta
1d20: 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 45  ble */.  char zE
1d30: 72 72 4d 73 67 5b 53 42 53 43 4f 4e 46 49 47 5f  rrMsg[SBSCONFIG_
1d40: 45 52 52 53 49 5a 45 5d 3b 20 20 2f 2a 20 53 70  ERRSIZE];  /* Sp
1d50: 61 63 65 20 74 6f 20 77 72 69 74 65 20 61 6e 20  ace to write an 
1d60: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  error message */
1d70: 0a 20 20 53 62 53 56 61 6c 75 65 20 61 53 74 61  .  SbSValue aSta
1d80: 63 6b 5b 53 42 53 43 4f 4e 46 49 47 5f 4e 53 54  ck[SBSCONFIG_NST
1d90: 41 43 4b 5d 3b 20 2f 2a 20 54 68 65 20 73 74 61  ACK]; /* The sta
1da0: 63 6b 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  ck */.};.../*.**
1db0: 20 50 75 73 68 20 61 20 76 61 6c 75 65 20 6f 6e   Push a value on
1dc0: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20  to the stack of 
1dd0: 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 0a 2a  an interpreter.*
1de0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 62 73  /.static int sbs
1df0: 5f 70 75 73 68 28 53 75 62 73 63 72 69 70 74 20  _push(Subscript 
1e00: 2a 70 2c 20 53 62 53 56 61 6c 75 65 20 2a 70 56  *p, SbSValue *pV
1e10: 61 6c 29 7b 0a 20 20 53 62 53 56 61 6c 75 65 20  al){.  SbSValue 
1e20: 2a 70 53 74 6b 3b 0a 20 20 69 66 28 20 70 2d 3e  *pStk;.  if( p->
1e30: 6e 53 74 61 63 6b 3e 3d 53 42 53 43 4f 4e 46 49  nStack>=SBSCONFI
1e40: 47 5f 4e 53 54 41 43 4b 20 29 7b 0a 20 20 20 20  G_NSTACK ){.    
1e50: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1e60: 28 53 42 53 43 4f 4e 46 49 47 5f 45 52 52 53 49  (SBSCONFIG_ERRSI
1e70: 5a 45 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ZE, p->zErrMsg, 
1e80: 22 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 22  "stack overflow"
1e90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 42  );.    return SB
1ea0: 53 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  S_ERROR;.  }.  p
1eb0: 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61  ->aStack[p->nSta
1ec0: 63 6b 2b 2b 5d 20 3d 20 2a 70 56 61 6c 3b 0a 20  ck++] = *pVal;. 
1ed0: 20 72 65 74 75 72 6e 20 53 42 53 5f 4f 4b 3b 0a   return SBS_OK;.
1ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
1ef0: 20 61 6e 20 75 6e 64 65 72 73 63 6f 72 65 20 69   an underscore i
1f00: 6e 74 65 72 70 72 65 74 65 72 0a 2a 2f 0a 76 6f  nterpreter.*/.vo
1f10: 69 64 20 53 62 53 5f 44 65 73 74 72 6f 79 28 73  id SbS_Destroy(s
1f20: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
1f30: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1f40: 73 62 73 5f 68 61 73 68 5f 72 65 73 65 74 28 26  sbs_hash_reset(&
1f50: 70 2d 3e 73 79 6d 54 61 62 29 3b 0a 20 20 66 6f  p->symTab);.  fo
1f60: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 74 61  r(i=0; i<p->nSta
1f70: 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 62  ck; i++){.    sb
1f80: 73 5f 76 61 6c 75 65 5f 72 65 73 65 74 28 26 70  s_value_reset(&p
1f90: 2d 3e 61 53 74 61 63 6b 5b 69 5d 29 3b 0a 20 20  ->aStack[i]);.  
1fa0: 7d 0a 20 20 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  }.  free(p);.}..
1fb0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 65 72  /*.** Set the er
1fc0: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
1fd0: 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  an interpreter. 
1fe0: 20 56 65 72 62 20 69 6d 70 6c 65 6d 65 6e 74 61   Verb implementa
1ff0: 74 69 6f 6e 73 0a 2a 2a 20 75 73 65 20 74 68 69  tions.** use thi
2000: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 74  s routine when t
2010: 68 65 79 20 65 6e 63 6f 75 6e 74 65 72 20 61 6e  hey encounter an
2020: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20   error..*/.void 
2030: 53 62 53 5f 53 65 74 45 72 72 6f 72 4d 65 73 73  SbS_SetErrorMess
2040: 61 67 65 28 73 74 72 75 63 74 20 53 75 62 73 63  age(struct Subsc
2050: 72 69 70 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63  ript *p, const c
2060: 68 61 72 20 2a 7a 45 72 72 29 7b 0a 20 20 69 6e  har *zErr){.  in
2070: 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 28  t nErr = strlen(
2080: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 6e 45 72  zErr);.  if( nEr
2090: 72 3e 73 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 72  r>sizeof(p->zErr
20a0: 4d 73 67 29 2d 31 20 29 7b 0a 20 20 20 20 6e 45  Msg)-1 ){.    nE
20b0: 72 72 20 3d 20 73 69 7a 65 6f 66 28 70 2d 3e 7a  rr = sizeof(p->z
20c0: 45 72 72 4d 73 67 29 2d 31 3b 0a 20 20 7d 0a 20  ErrMsg)-1;.  }. 
20d0: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 45 72 72 4d   memcpy(p->zErrM
20e0: 73 67 2c 20 7a 45 72 72 2c 20 6e 45 72 72 29 3b  sg, zErr, nErr);
20f0: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 5b 6e 45  .  p->zErrMsg[nE
2100: 72 72 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rr] = 0;.}../*.*
2110: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2120: 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  er to the curren
2130: 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  t error message 
2140: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  for the.** inter
2150: 70 72 65 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74  preter..*/.const
2160: 20 63 68 61 72 20 2a 53 62 53 5f 47 65 74 45 72   char *SbS_GetEr
2170: 72 6f 72 4d 65 73 73 61 67 65 28 73 74 72 75 63  rorMessage(struc
2180: 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 29 7b  t Subscript *p){
2190: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 45 72  .  return p->zEr
21a0: 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rMsg;.}../*.** A
21b0: 64 64 20 61 20 6e 65 77 20 76 65 72 62 20 74 68  dd a new verb th
21c0: 65 20 67 69 76 65 6e 20 69 6e 74 65 72 70 72 65  e given interpre
21d0: 74 65 72 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 41  ter.*/.int SbS_A
21e0: 64 64 56 65 72 62 28 0a 20 20 73 74 72 75 63 74  ddVerb(.  struct
21f0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 0a 20   Subscript *p,. 
2200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 65   const char *zVe
2210: 72 62 2c 0a 20 20 69 6e 74 20 28 2a 78 56 65 72  rb,.  int (*xVer
2220: 62 29 28 73 74 72 75 63 74 20 53 75 62 73 63 72  b)(struct Subscr
2230: 69 70 74 2a 2c 76 6f 69 64 2a 29 2c 0a 20 20 76  ipt*,void*),.  v
2240: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 53  oid *pArg.){.  S
2250: 62 53 56 61 6c 75 65 20 76 3b 0a 20 20 76 2e 66  bSValue v;.  v.f
2260: 6c 61 67 73 20 3d 20 53 42 53 56 41 4c 5f 56 45  lags = SBSVAL_VE
2270: 52 42 3b 0a 20 20 76 2e 75 2e 76 65 72 62 2e 78  RB;.  v.u.verb.x
2280: 56 65 72 62 20 3d 20 78 56 65 72 62 3b 0a 20 20  Verb = xVerb;.  
2290: 76 2e 75 2e 76 65 72 62 2e 70 41 72 67 20 3d 20  v.u.verb.pArg = 
22a0: 70 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 73  pArg;.  return s
22b0: 62 73 5f 73 74 6f 72 65 28 26 70 2d 3e 73 79 6d  bs_store(&p->sym
22c0: 54 61 62 2c 20 7a 56 65 72 62 2c 20 2d 31 2c 20  Tab, zVerb, -1, 
22d0: 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  &v);.}../*.** Pu
22e0: 73 68 20 61 20 73 74 72 69 6e 67 20 76 61 6c 75  sh a string valu
22f0: 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  e onto the stack
2300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 34  ..**.** If the 4
2310: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
2320: 30 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69  0, then the stri
2330: 6e 67 20 69 73 20 73 74 61 74 69 63 2e 0a 2a 2a  ng is static..**
2340: 20 49 66 20 74 68 65 20 34 74 68 20 70 61 72 61   If the 4th para
2350: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
2360: 6f 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e  o then the strin
2370: 67 20 77 61 73 20 6f 62 74 61 69 6e 65 64 0a 2a  g was obtained.*
2380: 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  * from malloc an
2390: 64 20 53 75 62 73 63 72 69 70 74 20 77 69 6c 6c  d Subscript will
23a0: 20 74 61 6b 65 20 72 65 73 70 6f 6e 73 69 62 69   take responsibi
23b0: 6c 69 74 79 20 66 6f 72 20 66 72 65 65 69 6e 67  lity for freeing
23c0: 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  .** it..**.** Re
23d0: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
23e0: 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  s and non-zero i
23f0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  f there is an er
2400: 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f  ror..*/.int SbS_
2410: 50 75 73 68 28 0a 20 20 73 74 72 75 63 74 20 53  Push(.  struct S
2420: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 20 2f 2a  ubscript *p,  /*
2430: 20 50 75 73 68 20 6f 6e 74 6f 20 74 68 69 73 20   Push onto this 
2440: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
2450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
2460: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
2470: 6e 67 20 76 61 6c 75 65 20 74 6f 20 70 75 73 68  ng value to push
2480: 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   Length of the s
24b0: 74 72 69 6e 67 2c 20 6f 72 20 2d 31 20 2a 2f 0a  tring, or -1 */.
24c0: 20 20 69 6e 74 20 64 79 6e 20 20 20 20 20 20 20    int dyn       
24d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
24e0: 74 72 75 65 2c 20 7a 20 77 61 73 20 6f 62 74 61  true, z was obta
24f0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
2500: 20 2a 2f 0a 29 7b 0a 20 20 53 62 53 56 61 6c 75   */.){.  SbSValu
2510: 65 20 76 3b 0a 20 20 76 2e 66 6c 61 67 73 20 3d  e v;.  v.flags =
2520: 20 53 42 53 56 41 4c 5f 53 54 52 3b 0a 20 20 69   SBSVAL_STR;.  i
2530: 66 28 20 6e 65 65 64 54 6f 46 72 65 65 20 29 7b  f( needToFree ){
2540: 0a 20 20 20 20 76 2e 66 6c 61 67 73 20 7c 3d 20  .    v.flags |= 
2550: 53 42 53 56 41 4c 5f 44 59 4e 3b 0a 20 20 7d 0a  SBSVAL_DYN;.  }.
2560: 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20    if( n<0 ) n = 
2570: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 76 2e 75  strlen(z);.  v.u
2580: 2e 73 74 72 2e 73 69 7a 65 20 3d 20 6e 3b 0a 20  .str.size = n;. 
2590: 20 76 2e 75 2e 73 74 72 2e 7a 20 3d 20 7a 3b 0a   v.u.str.z = z;.
25a0: 20 20 72 65 74 75 72 6e 20 73 62 73 5f 70 75 73    return sbs_pus
25b0: 68 28 70 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a  h(p, &v);.}../*.
25c0: 2a 2a 20 50 75 73 68 20 61 6e 20 69 6e 74 65 67  ** Push an integ
25d0: 65 72 20 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68  er value onto th
25e0: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
25f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 6c  his routine real
2600: 6c 79 20 6a 75 73 74 20 63 6f 6e 76 65 72 74 73  ly just converts
2610: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74   the integer int
2620: 6f 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  o a string.** th
2630: 65 6e 20 63 61 6c 6c 73 20 53 62 53 5f 50 75 73  en calls SbS_Pus
2640: 68 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75  h..*/.int SbS_Pu
2650: 73 68 49 6e 74 28 73 74 72 75 63 74 20 53 75 62  shInt(struct Sub
2660: 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 69  script *p, int i
2670: 56 61 6c 29 7b 0a 20 20 69 66 28 20 69 56 61 6c  Val){.  if( iVal
2680: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2690: 6e 20 53 62 53 5f 50 75 73 68 28 70 2c 20 22 30  n SbS_Push(p, "0
26a0: 22 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  ", 1, 0);.  }els
26b0: 65 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b  e if( iVal==1 ){
26c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 62 53 5f  .    return SbS_
26d0: 50 75 73 68 28 70 2c 20 22 31 22 2c 20 31 2c 20  Push(p, "1", 1, 
26e0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
26f0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e   char *z;.    in
2700: 74 20 6e 3b 0a 20 20 20 20 63 68 61 72 20 7a 56  t n;.    char zV
2710: 61 6c 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69  al[50];.    spri
2720: 6e 74 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20  ntf(zVal, "%d", 
2730: 69 56 61 6c 29 3b 0a 20 20 20 20 6e 20 3d 20 73  iVal);.    n = s
2740: 74 72 6c 65 6e 28 7a 56 61 6c 29 3b 0a 20 20 20  trlen(zVal);.   
2750: 20 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31   z = malloc( n+1
2760: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b   );.    if( z ){
2770: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 2c  .      strcpy(z,
2780: 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 72 65   zVal);.      re
2790: 74 75 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c  turn SbS_Push(p,
27a0: 20 7a 2c 20 6e 2c 20 31 29 3b 0a 20 20 20 20 7d   z, n, 1);.    }
27b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
27c0: 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20  rn SBS_ERROR;.  
27d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
27e0: 20 50 6f 70 20 61 6e 64 20 64 65 73 74 72 6f 79   Pop and destroy
27f0: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61   zero or more va
2800: 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74  lues from the st
2810: 61 63 6b 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ack..** Return t
2820: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
2830: 75 65 73 20 72 65 6d 61 69 6e 69 6e 67 20 6f 6e  ues remaining on
2840: 20 74 68 65 20 73 74 61 63 6b 20 61 66 74 65 72   the stack after
2850: 0a 2a 2a 20 74 68 65 20 70 6f 70 73 20 6f 63 63  .** the pops occ
2860: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50  ur..*/.int SbS_P
2870: 6f 70 28 73 74 72 75 63 74 20 53 75 62 73 63 72  op(struct Subscr
2880: 69 70 74 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ipt *p, int N){.
2890: 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 26 26 20    while( N>0 && 
28a0: 70 2d 3e 6e 53 74 61 63 6b 3e 30 20 29 7b 0a 20  p->nStack>0 ){. 
28b0: 20 20 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b 0a     p->nStack--;.
28c0: 20 20 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65      sbs_value_re
28d0: 73 65 74 28 26 70 2d 3e 61 53 74 61 63 6b 5b 70  set(&p->aStack[p
28e0: 2d 3e 6e 53 74 61 63 6b 5d 29 3b 0a 20 20 20 20  ->nStack]);.    
28f0: 4e 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  N--;.  }.  retur
2900: 6e 20 70 2d 3e 6e 53 74 61 63 6b 3b 0a 7d 0a 0a  n p->nStack;.}..
2910: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2920: 20 4e 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66   N-th element of
2930: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 30 20 69   the stack.  0 i
2940: 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  s the top of the
2950: 20 73 74 61 63 6b 2e 0a 2a 2a 20 31 20 69 73 20   stack..** 1 is 
2960: 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
2970: 74 20 64 6f 77 6e 2e 20 20 32 20 69 73 20 74 68  t down.  2 is th
2980: 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
2990: 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
29a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
29b0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e  if there is no N
29c0: 2d 74 68 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a  -th element..**.
29d0: 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
29e0: 65 74 75 72 6e 65 64 20 69 73 20 6f 6e 6c 79 20  eturned is only 
29f0: 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
2a00: 76 61 6c 75 65 20 69 73 20 70 6f 70 70 65 64 0a  value is popped.
2a10: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ** from the stac
2a20: 6b 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  k..*/.const char
2a30: 20 2a 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65   *SbS_StackValue
2a40: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70  (struct Subscrip
2a50: 74 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 69 6e 74  t *p, int N, int
2a60: 20 2a 70 53 69 7a 65 29 7b 0a 20 20 53 62 53 56   *pSize){.  SbSV
2a70: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 66  alue *pVal;.  if
2a80: 28 20 4e 3c 30 20 7c 7c 20 4e 3e 3d 70 2d 3e 6e  ( N<0 || N>=p->n
2a90: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  Stack ){.    ret
2aa0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 56 61  urn 0;.  }.  pVa
2ab0: 6c 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 70  l = &p->aStack[p
2ac0: 2d 3e 6e 53 74 61 63 6b 2d 4e 2d 31 5d 3b 0a 20  ->nStack-N-1];. 
2ad0: 20 69 66 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67   if( (pVal->flag
2ae0: 73 20 26 20 53 42 53 56 41 4c 5f 53 54 52 29 3d  s & SBSVAL_STR)=
2af0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2b00: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65   0;.  }.  *pSize
2b10: 20 3d 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73   = pVal->u.str.s
2b20: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 56  ize;.  return pV
2b30: 61 6c 2d 3e 75 2e 73 74 72 2e 7a 3b 0a 7d 0a 0a  al->u.str.z;.}..
2b40: 2f 2a 0a 2a 2a 20 41 20 63 6f 6e 76 65 6e 69 65  /*.** A convenie
2b50: 6e 63 65 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  nce routine for 
2b60: 65 78 74 72 61 63 74 69 6e 67 20 61 6e 20 69 6e  extracting an in
2b70: 74 65 67 65 72 20 76 61 6c 75 65 20 66 72 6f 6d  teger value from
2b80: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a   the.** stack..*
2b90: 2f 0a 69 6e 74 20 53 62 53 5f 53 74 61 63 6b 56  /.int SbS_StackV
2ba0: 61 6c 75 65 49 6e 74 28 73 74 72 75 63 74 20 53  alueInt(struct S
2bb0: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74  ubscript *p, int
2bc0: 20 4e 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 76 3b   N){.  int n, v;
2bd0: 0a 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30  .  int isNeg = 0
2be0: 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 53 62  ;.  char *z = Sb
2bf0: 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20  S_StackValue(p, 
2c00: 4e 2c 20 26 6e 29 3b 0a 20 20 76 20 3d 20 30 3b  N, &n);.  v = 0;
2c10: 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 72 65  .  if( n==0 ) re
2c20: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 5b  turn 0;.  if( z[
2c30: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69  0]=='-' ){.    i
2c40: 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 2b  sNeg = 1;.    z+
2c50: 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 65  +;.    n--;.  }e
2c60: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2b  lse if( z[0]=='+
2c70: 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
2c80: 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69    n--;.  }.  whi
2c90: 6c 65 28 20 6e 3e 30 20 26 26 20 69 73 64 69 67  le( n>0 && isdig
2ca0: 69 74 28 7a 5b 30 5d 29 20 29 7b 0a 20 20 20 20  it(z[0]) ){.    
2cb0: 76 20 3d 20 76 2a 31 30 20 2b 20 7a 5b 30 5d 20  v = v*10 + z[0] 
2cc0: 2d 20 27 30 27 3b 0a 20 20 20 20 7a 2b 2b 3b 0a  - '0';.    z++;.
2cd0: 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69      n--;.  }.  i
2ce0: 66 28 20 69 73 4e 65 67 20 29 7b 0a 20 20 20 20  f( isNeg ){.    
2cf0: 76 20 3d 20 2d 76 3b 0a 20 20 7d 0a 20 20 72 65  v = -v;.  }.  re
2d00: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn v;.}../*.**
2d10: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 76 61   Retrieve the va
2d20: 6c 75 65 20 6f 66 20 61 20 76 61 72 69 61 62 6c  lue of a variabl
2d30: 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  e from the inter
2d40: 70 72 65 74 65 72 2e 20 20 52 65 74 75 72 6e 0a  preter.  Return.
2d50: 2a 2a 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 73 75  ** NULL if no su
2d60: 63 68 20 76 61 72 69 61 62 6c 65 20 69 73 20 64  ch variable is d
2d70: 65 66 69 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  efined.  .**.** 
2d80: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
2d90: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
2da0: 73 61 72 69 6c 79 20 28 70 72 6f 62 61 62 6c 79  sarily (probably
2db0: 20 6e 6f 74 29 20 7a 65 72 6f 2d 74 65 72 6d 69   not) zero-termi
2dc0: 6e 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 74  nated..** The st
2dd0: 72 69 6e 67 20 6d 61 79 20 62 65 20 64 65 61 6c  ring may be deal
2de0: 6c 6f 63 61 74 65 64 20 74 68 65 20 6e 65 78 74  located the next
2df0: 20 74 69 6d 65 20 61 6e 79 74 68 69 6e 67 20 69   time anything i
2e00: 73 20 64 6f 6e 65 20 74 6f 0a 2a 2a 20 74 68 65  s done to.** the
2e10: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 4d   interpreter.  M
2e20: 61 6b 65 20 61 20 63 6f 70 79 20 69 66 20 79 6f  ake a copy if yo
2e30: 75 20 6e 65 65 64 20 69 74 20 74 6f 20 70 65 72  u need it to per
2e40: 73 69 73 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  sist..*/.const c
2e50: 68 61 72 20 2a 53 62 53 5f 46 65 74 63 68 28 0a  har *SbS_Fetch(.
2e60: 20 20 73 74 72 75 63 74 20 53 75 62 73 63 72 69    struct Subscri
2e70: 70 74 20 2a 70 2c 20 20 20 2f 2a 20 54 68 65 20  pt *p,   /* The 
2e80: 69 6e 74 65 72 70 72 65 74 65 72 20 77 65 20 61  interpreter we a
2e90: 72 65 20 69 6e 74 65 72 72 6f 67 61 74 69 6e 67  re interrogating
2ea0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2eb0: 20 2a 7a 4b 65 79 2c 20 20 20 20 20 20 20 20 2f   *zKey,        /
2ec0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 61  * Name of the va
2ed0: 72 69 61 62 6c 65 2e 20 20 43 61 73 65 20 73 65  riable.  Case se
2ee0: 6e 73 69 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74  nsitive */.  int
2ef0: 20 2a 70 4c 65 6e 67 74 68 20 20 20 20 20 20 20   *pLength       
2f00: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2f10: 68 65 20 6c 65 6e 67 74 68 20 68 65 72 65 20 2a  he length here *
2f20: 2f 0a 29 7b 0a 20 20 53 62 53 56 61 6c 75 65 20  /.){.  SbSValue 
2f30: 2a 70 56 61 6c 3b 0a 0a 20 20 70 56 61 6c 20 3d  *pVal;..  pVal =
2f40: 20 73 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73   sbs_fetch(&p->s
2f50: 79 6d 54 61 62 2c 20 7a 4b 65 79 2c 20 2d 31 29  ymTab, zKey, -1)
2f60: 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20  ;.  if( pVal==0 
2f70: 7c 7c 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20  || (pVal->flags 
2f80: 26 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d 30  & SBSVAL_STR)==0
2f90: 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 67 74 68   ){.    *pLength
2fa0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
2fb0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2fc0: 20 2a 70 4c 65 6e 67 74 68 20 3d 20 70 56 61 6c   *pLength = pVal
2fd0: 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20  ->u.str.size;.  
2fe0: 20 20 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 75    return pVal->u
2ff0: 2e 73 74 72 2e 7a 3b 0a 20 20 7d 0a 7d 0a 0a 2f  .str.z;.  }.}../
3000: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
3010: 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
3020: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
3030: 65 20 73 74 61 63 6b 20 68 61 73 0a 2a 2a 20 66  e stack has.** f
3040: 65 77 65 72 20 74 68 61 6e 20 4e 20 65 6c 65 6d  ewer than N elem
3050: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ents.  This is u
3060: 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75  tility routine u
3070: 73 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6d  sed in.** the im
3080: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3090: 76 65 72 62 73 2e 0a 2a 2f 0a 69 6e 74 20 53 62  verbs..*/.int Sb
30a0: 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 73  S_RequireStack(s
30b0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
30c0: 2a 70 2c 20 69 6e 74 20 4e 2c 20 63 6f 6e 73 74  *p, int N, const
30d0: 20 63 68 61 72 20 2a 7a 43 6d 64 29 7b 0a 20 20   char *zCmd){.  
30e0: 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 4e 20  if( p->nStack>N 
30f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
3100: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3110: 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 72 4d 73 67  izeof(p->zErrMsg
3120: 29 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20  ), p->zErrMsg,. 
3130: 20 20 20 20 22 5c 22 25 73 5c 22 20 72 65 71 75      "\"%s\" requ
3140: 69 72 65 73 20 61 74 20 6c 65 61 73 74 20 25 64  ires at least %d
3150: 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 73 20   stack elements 
3160: 2d 20 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 64 22  - only found %d"
3170: 2c 0a 20 20 20 20 20 7a 43 6d 64 2c 20 4e 2c 20  ,.     zCmd, N, 
3180: 70 2d 3e 6e 53 74 61 63 6b 29 3b 0a 20 20 72 65  p->nStack);.  re
3190: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
31a0: 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 22 73   The built-in "s
31b0: 65 74 22 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a  et" command:.**.
31c0: 2a 2a 20 20 20 20 20 20 20 53 54 52 49 4e 47 20  **       STRING 
31d0: 4e 41 4d 45 20 73 65 74 0a 2a 2a 0a 2a 2a 20 57  NAME set.**.** W
31e0: 72 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  rite the value o
31f0: 66 20 53 54 52 49 4e 47 20 69 6e 74 6f 20 76 61  f STRING into va
3200: 72 69 61 62 6c 65 20 63 61 6c 6c 65 64 20 4e 41  riable called NA
3210: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
3220: 74 20 73 65 74 43 6d 64 28 53 75 62 73 63 72 69  t setCmd(Subscri
3230: 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f  pt *p, void *pNo
3240: 74 55 73 65 64 29 7b 0a 20 20 53 62 53 56 61 6c  tUsed){.  SbSVal
3250: 75 65 20 2a 70 54 6f 73 3b 0a 20 20 53 62 53 56  ue *pTos;.  SbSV
3260: 61 6c 75 65 20 2a 70 4e 6f 73 3b 0a 20 20 69 66  alue *pNos;.  if
3270: 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61  ( SbS_RequireSta
3280: 63 6b 28 70 2c 20 32 2c 20 22 73 65 74 22 29 20  ck(p, 2, "set") 
3290: 29 20 72 65 74 75 72 6e 20 53 42 53 5f 45 52 52  ) return SBS_ERR
32a0: 4f 52 3b 0a 20 20 70 54 6f 73 20 3d 20 70 2d 3e  OR;.  pTos = p->
32b0: 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e 6e 53 74 61  aStack[--p->nSta
32c0: 63 6b 5d 3b 0a 20 20 70 4e 6f 73 20 3d 20 70 2d  ck];.  pNos = p-
32d0: 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e 6e 53 74  >aStack[--p->nSt
32e0: 61 63 6b 5d 3b 0a 20 20 73 62 73 5f 73 74 6f 72  ack];.  sbs_stor
32f0: 65 28 26 70 2d 3e 73 79 6d 54 61 62 2c 20 70 54  e(&p->symTab, pT
3300: 6f 73 2d 3e 75 2e 73 74 72 2e 7a 2c 20 70 54 6f  os->u.str.z, pTo
3310: 73 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 2c 20 70  s->u.str.size, p
3320: 4e 6f 73 29 3b 0a 20 20 73 62 73 5f 76 61 6c 75  Nos);.  sbs_valu
3330: 65 5f 72 65 73 65 74 28 70 54 6f 73 29 3b 0a 20  e_reset(pTos);. 
3340: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
3350: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
3360: 77 20 75 6e 64 65 72 73 63 6f 72 65 20 69 6e 74  w underscore int
3370: 65 72 70 72 65 74 65 72 0a 2a 2f 0a 73 74 72 75  erpreter.*/.stru
3380: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 53 62  ct Subscript *Sb
3390: 53 5f 43 72 65 61 74 65 28 76 6f 69 64 29 7b 0a  S_Create(void){.
33a0: 20 20 53 75 62 73 63 72 69 70 74 20 2a 70 3b 0a    Subscript *p;.
33b0: 0a 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  .  p = malloc( s
33c0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
33d0: 66 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73  f( p ){.    mems
33e0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
33f0: 2a 70 29 29 3b 0a 20 20 20 20 53 62 53 5f 41 64  *p));.    SbS_Ad
3400: 64 56 65 72 62 28 70 2c 20 22 73 65 74 22 2c 20  dVerb(p, "set", 
3410: 73 65 74 43 6d 64 2c 20 30 29 3b 0a 20 20 7d 0a  setCmd, 0);.  }.
3420: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3430: 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 74 68  *.** Evaluate th
3440: 65 20 73 63 72 69 70 74 20 67 69 76 65 6e 20 62  e script given b
3450: 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 63 72  y the first nScr
3460: 69 70 74 20 62 79 74 65 73 20 6f 66 20 7a 53 63  ipt bytes of zSc
3470: 72 69 70 74 5b 5d 2e 0a 2a 2a 20 52 65 74 75 72  ript[]..** Retur
3480: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61  n 0 on success a
3490: 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  nd non-zero for 
34a0: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  an error..*/.int
34b0: 20 53 62 53 5f 45 76 61 6c 28 73 74 72 75 63 74   SbS_Eval(struct
34c0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 63   Subscript *p, c
34d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 72 69  onst char *zScri
34e0: 70 74 2c 20 69 6e 74 20 6e 53 63 72 69 70 74 29  pt, int nScript)
34f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 42 53  {.  int rc = SBS
3500: 5f 4f 4b 3b 0a 20 20 69 66 28 20 6e 53 63 72 69  _OK;.  if( nScri
3510: 70 74 3c 30 20 29 20 6e 53 63 72 69 70 74 20 3d  pt<0 ) nScript =
3520: 20 73 74 72 6c 65 6e 28 7a 53 63 72 69 70 74 29   strlen(zScript)
3530: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 63 72 69  ;.  while( nScri
3540: 70 74 3e 30 20 26 26 20 72 63 3d 3d 53 42 53 5f  pt>0 && rc==SBS_
3550: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  OK ){.    int n;
3560: 0a 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a  .    int ttype;.
3570: 20 20 20 20 6e 20 3d 20 73 62 73 5f 74 6f 6b 65      n = sbs_toke
3580: 6e 5f 74 79 70 65 28 7a 53 63 72 69 70 74 2c 20  n_type(zScript, 
3590: 6e 53 63 72 69 70 74 2c 20 26 74 74 79 70 65 29  nScript, &ttype)
35a0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 74 74  ;.    switch( tt
35b0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
35c0: 65 20 53 42 53 54 54 5f 57 48 49 54 45 53 50 41  e SBSTT_WHITESPA
35d0: 43 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72  CE: {.        br
35e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
35f0: 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 45 4f     case SBSTT_EO
3600: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 6e 53 63  F: {.        nSc
3610: 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ript = 0;.      
3620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3630: 0a 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54  .      case SBST
3640: 54 5f 49 4e 43 4f 4d 50 4c 45 54 45 3a 0a 20 20  T_INCOMPLETE:.  
3650: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 55      case SBSTT_U
3660: 4e 4b 4e 4f 57 4e 3a 20 7b 0a 20 20 20 20 20 20  NKNOWN: {.      
3670: 20 20 72 63 20 3d 20 53 42 53 5f 45 52 52 4f 52    rc = SBS_ERROR
3680: 3b 0a 20 20 20 20 20 20 20 20 6e 53 63 72 69 70  ;.        nScrip
3690: 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62  t = n;.        b
36a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
36b0: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 49      case SBSTT_I
36c0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
36d0: 20 20 72 63 20 3d 20 73 62 73 5f 70 75 73 68 28    rc = sbs_push(
36e0: 70 2c 20 7a 53 63 72 69 70 74 2c 20 6e 29 3b 0a  p, zScript, n);.
36f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3710: 65 20 53 42 53 54 54 5f 4e 41 4d 45 3a 20 7b 0a  e SBSTT_NAME: {.
3720: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 62 73          rc = sbs
3730: 5f 70 75 73 68 28 70 2c 20 26 7a 53 63 72 69 70  _push(p, &zScrip
3740: 74 5b 31 5d 2c 20 6e 2d 31 29 3b 0a 20 20 20 20  t[1], n-1);.    
3750: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3760: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 42   }.      case SB
3770: 53 54 54 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20  STT_STRING: {.  
3780: 20 20 20 20 20 20 72 63 20 3d 20 73 62 73 5f 70        rc = sbs_p
3790: 75 73 68 28 70 2c 20 26 7a 53 63 72 69 70 74 5b  ush(p, &zScript[
37a0: 31 5d 2c 20 6e 2d 32 29 3b 0a 20 20 20 20 20 20  1], n-2);.      
37b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
37c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54  .      case SBST
37d0: 54 5f 56 45 52 42 3a 20 7b 0a 20 20 20 20 20 20  T_VERB: {.      
37e0: 20 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61 6c    SbSValue *pVal
37f0: 20 3d 20 73 62 73 5f 66 65 74 63 68 28 70 2d 3e   = sbs_fetch(p->
3800: 70 48 61 73 68 2c 20 7a 53 63 72 69 70 74 2c 20  pHash, zScript, 
3810: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20  nScript);.      
3820: 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b    if( pVal==0 ){
3830: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
3840: 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  SBS_ERROR;.     
3850: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 56 61     }else if( pVa
3860: 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42 53 56 41  l->flags & SBSVA
3870: 4c 5f 56 45 52 42 20 29 7b 0a 20 20 20 20 20 20  L_VERB ){.      
3880: 20 20 20 20 72 63 20 3d 20 70 56 61 6c 2d 3e 75      rc = pVal->u
3890: 2e 76 65 72 62 2e 78 56 65 72 62 28 70 2c 20 70  .verb.xVerb(p, p
38a0: 56 61 6c 2d 3e 75 2e 76 65 72 62 2e 70 41 72 67  Val->u.verb.pArg
38b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
38c0: 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73   if( pVal->flags
38d0: 20 26 20 53 42 53 56 41 4c 5f 45 58 45 43 20 29   & SBSVAL_EXEC )
38e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
38f0: 20 53 62 53 5f 45 76 61 6c 28 70 2c 20 70 56 61   SbS_Eval(p, pVa
3900: 6c 2d 3e 75 2e 73 74 72 2e 7a 2c 20 70 56 61 6c  l->u.str.z, pVal
3910: 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 29 3b 0a 20  ->u.str.size);. 
3920: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3930: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 62 73          rc = sbs
3940: 5f 70 75 73 68 28 70 2c 20 70 56 61 6c 2d 3e 75  _push(p, pVal->u
3950: 2e 73 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75 2e  .str.z, pVal->u.
3960: 73 74 72 2e 73 69 7a 65 29 3b 0a 20 20 20 20 20  str.size);.     
3970: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
3980: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3990: 7d 0a 20 20 20 20 7a 53 63 72 69 70 74 20 2b 3d  }.    zScript +=
39a0: 20 6e 3b 0a 20 20 20 20 6e 53 63 72 69 70 74 20   n;.    nScript 
39b0: 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75  -= n;.  }.  retu
39c0: 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.