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;.}.