0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68 (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76 lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65 ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 tributed in the
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 l be useful,.**
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 but WITHOUT ANY
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55 A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20 RPOSE. See the
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50 GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 d have received
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 ation, Inc., 59
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 ton, MA 02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 307, USA..**.**
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 nformation:.**
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 * http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6d 70 contains an imp
0380: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 lementation of t
0390: 68 65 20 22 73 75 62 73 63 72 69 70 74 22 20 69 he "subscript" i
03a0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2a 0a 2a nterpreter..**.*
03b0: 2a 20 53 75 62 73 63 72 69 70 74 20 61 74 74 65 * Subscript atte
03c0: 6d 70 74 73 20 74 6f 20 62 65 20 61 6e 20 65 78 mpts to be an ex
03d0: 74 72 65 6d 65 6c 79 20 6c 69 67 68 74 2d 77 65 tremely light-we
03e0: 69 67 68 74 20 73 63 72 69 70 74 69 6e 67 0a 2a ight scripting.*
03f0: 2a 20 6c 61 6e 67 75 61 67 65 2e 20 20 49 74 20 * language. It
0400: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 62 61 72 contains the bar
0410: 65 73 74 20 6f 66 20 62 61 72 65 20 65 73 73 65 est of bare esse
0420: 6e 74 69 61 6c 73 2e 20 20 49 74 20 69 73 0a 2a ntials. It is.*
0430: 2a 20 73 74 61 63 6b 2d 62 61 73 65 64 20 61 6e * stack-based an
0440: 64 20 66 6f 72 74 68 2d 6c 69 6b 65 2e 20 20 45 d forth-like. E
0450: 76 65 72 79 74 68 69 6e 67 20 69 73 20 69 6e 20 verything is in
0460: 61 20 73 69 6e 67 6c 65 20 67 6c 6f 62 61 6c 0a a single global.
0470: 2a 2a 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 ** namespace. T
0480: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 here is only a s
0490: 69 6e 67 6c 65 20 64 61 74 61 74 79 70 65 20 6f ingle datatype o
04a0: 66 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 f zero-terminate
04b0: 64 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 54 68 d.** string. Th
04c0: 65 20 73 74 61 63 6b 20 69 73 20 6f 66 20 66 69 e stack is of fi
04d0: 78 65 64 2c 20 6c 69 6d 69 74 65 64 20 64 65 70 xed, limited dep
04e0: 74 68 2e 20 20 54 68 65 20 73 79 6d 62 61 6c 20 th. The symbal
04f0: 74 61 62 6c 65 0a 2a 2a 20 69 73 20 6f 66 20 61 table.** is of a
0500: 20 6c 69 6d 69 74 65 64 20 61 6e 64 20 66 69 78 limited and fix
0510: 65 64 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 ed size..**.** T
0520: 4f 4b 45 4e 53 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 OKENS:.**.**
0530: 20 20 2a 20 20 41 6c 6c 20 74 6f 6b 65 6e 73 20 * All tokens
0540: 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72 are separated fr
0550: 6f 6d 20 65 61 63 68 20 6f 74 68 65 72 20 62 79 om each other by
0560: 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 20 whitespace..**
0570: 20 20 20 20 20 2a 20 20 4c 65 61 64 69 6e 67 20 * Leading
0580: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69 and trailing whi
0590: 74 65 73 70 61 63 65 20 69 73 20 69 67 6e 6f 72 tespace is ignor
05a0: 65 64 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 54 ed..** * T
05b0: 65 78 74 20 77 69 74 68 69 6e 20 6e 65 73 74 65 ext within neste
05c0: 64 20 7b 2e 2e 2e 7d 20 69 73 20 61 20 73 69 6e d {...} is a sin
05d0: 67 6c 65 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e gle string token
05e0: 2e 20 20 54 68 65 20 6f 75 74 65 72 6d 6f 73 74 . The outermost
05f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 75 72 6c .** curl
0600: 79 20 62 72 61 63 65 73 20 61 72 65 20 6e 6f 74 y braces are not
0610: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 6f 6b part of the tok
0620: 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 en..** * A
0630: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69 74 n identifier wit
0640: 68 20 61 20 6c 65 61 64 69 6e 67 20 22 2f 22 20 h a leading "/"
0650: 69 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65 is a string toke
0660: 6e 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 20 n..** * A
0670: 74 6f 6b 65 6e 20 74 68 61 74 20 6c 6f 6f 6b 73 token that looks
0680: 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 20 69 like a number i
0690: 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e s a string token
06a0: 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 41 6e 20 ..** * An
06b0: 69 64 65 6e 74 69 66 69 65 72 20 74 6f 6b 65 6e identifier token
06c0: 20 69 73 20 63 61 6c 6c 65 64 20 61 20 22 76 65 is called a "ve
06d0: 72 62 22 2e 0a 2a 2a 0a 2a 2a 20 50 52 4f 43 45 rb"..**.** PROCE
06e0: 53 53 49 4e 47 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 SSING:.**.**
06f0: 20 20 2a 20 20 54 68 65 20 69 6e 70 75 74 20 69 * The input i
0700: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74 s divided into t
0710: 6f 6b 65 6e 73 2e 20 20 57 68 69 74 65 73 70 61 okens. Whitespa
0720: 63 65 20 69 73 20 64 69 73 63 61 72 64 65 64 2e ce is discarded.
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 53 74 72 69 .** Stri
0740: 6e 67 20 61 6e 64 20 76 65 72 62 20 74 6f 6b 65 ng and verb toke
0750: 6e 73 20 61 72 65 20 70 61 73 73 65 64 20 69 6e ns are passed in
0760: 74 6f 20 74 68 65 20 65 6e 67 69 6e 65 2e 0a 2a to the engine..*
0770: 2a 20 20 20 20 20 20 2a 20 20 53 74 72 69 6e 67 * * String
0780: 20 74 6f 6b 65 6e 73 20 61 72 65 20 70 75 73 68 tokens are push
0790: 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 ed onto the stac
07a0: 6b 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 49 66 k..** * If
07b0: 20 61 20 76 65 72 62 20 74 6f 6b 65 6e 20 63 6f a verb token co
07c0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20 70 rresponds to a p
07d0: 72 6f 63 65 64 75 72 65 2c 20 74 68 61 74 20 70 rocedure, that p
07e0: 72 6f 63 65 64 75 72 65 20 69 73 0a 2a 2a 20 20 rocedure is.**
07f0: 20 20 20 20 20 20 20 72 75 6e 2e 20 20 54 68 65 run. The
0800: 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 procedure might
0810: 20 75 73 65 2c 20 70 6f 70 2c 20 6f 72 20 70 75 use, pop, or pu
0820: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d ll elements from
0830: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 .** the
0840: 20 73 74 61 63 6b 2e 0a 2a 2a 20 20 20 20 20 20 stack..**
0850: 2a 20 20 49 66 20 61 20 76 65 72 62 20 74 6f 6b * If a verb tok
0860: 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 en corresponds t
0870: 6f 20 61 20 76 61 72 69 61 62 6c 65 2c 20 74 68 o a variable, th
0880: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a e value of that.
0890: 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 61 ** varia
08a0: 62 6c 65 20 69 73 20 70 75 73 68 65 64 20 6f 6e ble is pushed on
08b0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a to the stack..**
08c0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 .** This module
08d0: 61 74 74 65 6d 70 74 73 20 74 6f 20 62 65 20 63 attempts to be c
08e0: 6f 6d 70 6c 65 74 65 6c 79 20 73 65 6c 66 2d 63 ompletely self-c
08f0: 6f 6e 74 61 69 6e 65 64 20 73 6f 20 74 68 61 74 ontained so that
0900: 20 69 74 20 63 61 6e 0a 2a 2a 20 62 65 20 70 6f it can.** be po
0910: 72 74 61 62 6c 65 20 74 6f 20 6f 74 68 65 72 20 rtable to other
0920: 70 72 6f 6a 65 63 74 73 2e 0a 2a 2f 0a 23 69 6e projects..*/.#in
0930: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 clude "config.h"
0940: 0a 23 69 6e 63 6c 75 64 65 20 22 73 75 62 73 63 .#include "subsc
0950: 72 69 70 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 ript.h".#include
0960: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69 66 <assert.h>..#if
0970: 20 49 4e 54 45 52 46 41 43 45 0a 74 79 70 65 64 INTERFACE.typed
0980: 65 66 20 73 74 72 75 63 74 20 53 75 62 73 63 72 ef struct Subscr
0990: 69 70 74 20 53 75 62 73 63 72 69 70 74 3b 0a 23 ipt Subscript;.#
09a0: 64 65 66 69 6e 65 20 53 42 53 5f 4f 4b 20 20 20 define SBS_OK
09b0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 42 53 0.#define SBS
09c0: 5f 45 52 52 4f 52 20 20 20 31 0a 23 65 6e 64 69 _ERROR 1.#endi
09d0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 f../*.** Configu
09e0: 72 61 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 ration constants
09f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43 .*/.#define SBSC
0a00: 4f 4e 46 49 47 5f 4e 48 41 53 48 20 20 20 20 34 ONFIG_NHASH 4
0a10: 31 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 1 /* Siz
0a20: 65 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 e of the hash ta
0a30: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 ble */.#define S
0a40: 42 53 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20 BSCONFIG_NSTACK
0a50: 20 20 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 10 /*
0a60: 4d 61 78 69 6d 75 6d 20 73 74 61 63 6b 20 64 65 Maximum stack de
0a70: 70 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 pth */.#define S
0a80: 42 53 43 4f 4e 46 49 47 5f 45 52 52 53 49 5a 45 BSCONFIG_ERRSIZE
0a90: 20 20 31 30 30 20 20 20 20 20 20 20 20 2f 2a 20 100 /*
0aa0: 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 Maximum size of
0ab0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 an error message
0ac0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 76 61 69 6c */../*.** Avail
0ad0: 61 62 6c 65 20 74 6f 6b 65 6e 20 74 79 70 65 73 able token types
0ae0: 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 :.*/.#define SBS
0af0: 54 54 5f 57 48 49 54 45 53 50 41 43 45 20 20 31 TT_WHITESPACE 1
0b00: 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 5c 30 34 /* ex: \04
0b10: 30 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 0 */.#define S
0b20: 42 53 54 54 5f 4e 41 4d 45 20 20 20 20 20 20 20 BSTT_NAME
0b30: 20 32 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 2f 2 /* ex: /
0b40: 61 62 63 64 65 20 20 2a 2f 0a 23 64 65 66 69 6e abcde */.#defin
0b50: 65 20 53 42 53 54 54 5f 56 45 52 42 20 20 20 20 e SBSTT_VERB
0b60: 20 20 20 20 33 20 20 20 20 2f 2a 20 65 78 3a 20 3 /* ex:
0b70: 20 20 61 62 63 64 65 20 20 20 2a 2f 0a 23 64 65 abcde */.#de
0b80: 66 69 6e 65 20 53 42 53 54 54 5f 53 54 52 49 4e fine SBSTT_STRIN
0b90: 47 20 20 20 20 20 20 34 20 20 20 20 2f 2a 20 65 G 4 /* e
0ba0: 78 3a 20 20 20 7b 2e 2e 2e 7d 20 20 20 2a 2f 0a x: {...} */.
0bb0: 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 49 4e #define SBSTT_IN
0bc0: 54 45 47 45 52 20 20 20 20 20 35 20 20 20 20 2f TEGER 5 /
0bd0: 2a 20 49 6e 74 65 67 65 72 20 69 6e 63 6c 75 64 * Integer includ
0be0: 69 6e 67 20 6f 70 74 69 6f 6e 20 73 69 67 6e 20 ing option sign
0bf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 */.#define SBSTT
0c00: 5f 49 4e 43 4f 4d 50 4c 45 54 45 20 20 36 20 20 _INCOMPLETE 6
0c10: 20 20 2f 2a 20 55 6e 74 65 72 6d 69 6e 61 74 65 /* Unterminate
0c20: 64 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e 20 2a d string token *
0c30: 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f /.#define SBSTT_
0c40: 55 4e 4b 4e 4f 57 4e 20 20 20 20 20 37 20 20 20 UNKNOWN 7
0c50: 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20 74 6f 6b 65 /* Unknown toke
0c60: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 n */.#define SBS
0c70: 54 54 5f 45 4f 46 20 20 20 20 20 20 20 20 20 38 TT_EOF 8
0c80: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e /* End of in
0c90: 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 put */../*.** Gi
0ca0: 76 65 6e 20 61 6e 20 69 6e 70 75 74 20 73 74 72 ven an input str
0cb0: 69 6e 67 20 7a 20 6f 66 20 6c 65 6e 67 74 68 20 ing z of length
0cc0: 6e 2c 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 n, identify the
0cd0: 74 6f 6b 65 6e 20 74 68 61 74 0a 2a 2a 20 73 74 token that.** st
0ce0: 61 72 74 73 20 61 74 20 7a 5b 30 5d 2e 20 20 57 arts at z[0]. W
0cf0: 72 69 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 74 rite the token t
0d00: 79 70 65 20 69 6e 74 6f 20 2a 70 54 6f 6b 65 6e ype into *pToken
0d10: 54 79 70 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 Type and.** retu
0d20: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 rn the length of
0d30: 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 the token..*/.s
0d40: 74 61 74 69 63 20 69 6e 74 20 73 62 73 5f 6e 65 tatic int sbs_ne
0d50: 78 74 5f 74 6f 6b 65 6e 28 63 6f 6e 73 74 20 63 xt_token(const c
0d60: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 har *z, int n, i
0d70: 6e 74 20 2a 70 54 6f 6b 65 6e 54 79 70 65 29 7b nt *pTokenType){
0d80: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 66 28 20 . int c;. if(
0d90: 6e 3c 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 20 n<=0 || z[0]==0
0da0: 29 7b 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 ){. *pTokenTy
0db0: 70 65 20 3d 20 53 42 53 54 54 5f 45 4f 46 3b 0a pe = SBSTT_EOF;.
0dc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
0dd0: 7d 0a 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20 }. c = z[0];.
0de0: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29 if( isspace(c) )
0df0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 {. int i;.
0e00: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 *pTokenType = S
0e10: 42 53 54 54 5f 57 48 49 54 45 53 50 41 43 45 3b BSTT_WHITESPACE;
0e20: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c . for(i=1; i<
0e30: 6e 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69 n && isspace(z[i
0e40: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 72 ]); i++){}. r
0e50: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 eturn i;. }. i
0e60: 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 f( c=='#' ){.
0e70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 int i;. for(
0e80: 69 3d 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d i=1; i<n && z[i]
0e90: 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 && z[i-1]!='\n'
0ea0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 ; i++){}. *pT
0eb0: 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 okenType = SBSTT
0ec0: 5f 57 48 49 54 45 53 50 41 43 45 3b 0a 20 20 20 _WHITESPACE;.
0ed0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 return i;. }.
0ee0: 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 0a 20 if( c=='{' ){.
0ef0: 20 20 20 69 6e 74 20 64 65 70 74 68 20 3d 20 31 int depth = 1
0f00: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 ;. int i;.
0f10: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 for(i=1; i<n &&
0f20: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 z[i]; i++){.
0f30: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 7b 27 if( z[i]=='{'
0f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 70 74 ){. dept
0f50: 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 h++;. }else
0f60: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 7d 27 20 29 if( z[i]=='}' )
0f70: 7b 0a 20 20 20 20 20 20 20 20 64 65 70 74 68 2d {. depth-
0f80: 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 -;. if( d
0f90: 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 epth==0 ){.
0fa0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 i++;.
0fb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
0fc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
0fd0: 20 7d 0a 20 20 20 20 69 66 28 20 64 65 70 74 68 }. if( depth
0fe0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 54 6f 6b 65 ){. *pToke
0ff0: 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 49 4e nType = SBSTT_IN
1000: 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 65 COMPLETE;. }e
1010: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 54 6f 6b lse{. *pTok
1020: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 53 enType = SBSTT_S
1030: 54 52 49 4e 47 3b 0a 20 20 20 20 7d 0a 20 20 20 TRING;. }.
1040: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 return i;. }.
1050: 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 6e if( c=='/' && n
1060: 3e 3d 32 20 26 26 20 69 73 61 6c 70 68 61 28 7a >=2 && isalpha(z
1070: 5b 31 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 [1]) ){. int
1080: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 i;. for(i=2;
1090: 69 3c 6e 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 i<n && (isalnum(
10a0: 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 z[i]) || z[i]=='
10b0: 5f 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 _'); i++){}.
10c0: 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 *pTokenType = SB
10d0: 53 54 54 5f 4e 41 4d 45 3b 0a 20 20 20 20 72 65 STT_NAME;. re
10e0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 turn i;. }. if
10f0: 28 20 69 73 61 6c 70 68 61 28 63 29 20 29 7b 0a ( isalpha(c) ){.
1100: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 int i;. f
1110: 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 28 or(i=1; i<n && (
1120: 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 7c 7c isalnum(z[i]) ||
1130: 20 7a 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2b 2b z[i]=='_'); i++
1140: 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 ){}. *pTokenT
1150: 79 70 65 20 3d 20 53 42 53 54 54 5f 56 45 52 42 ype = SBSTT_VERB
1160: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a ;. return i;.
1170: 20 20 7d 0a 20 20 69 66 28 20 69 73 64 69 67 69 }. if( isdigi
1180: 74 28 63 29 20 7c 7c 20 28 28 63 3d 3d 27 2d 27 t(c) || ((c=='-'
1190: 20 7c 7c 20 63 3d 3d 27 2b 27 29 20 26 26 20 6e || c=='+') && n
11a0: 3e 3d 32 20 26 26 20 69 73 64 69 67 69 74 28 7a >=2 && isdigit(z
11b0: 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 [1])) ){. int
11c0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b i;. for(i=1;
11d0: 20 69 3c 6e 20 26 26 20 69 73 64 69 67 69 74 28 i<n && isdigit(
11e0: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 z[i]); i++){}.
11f0: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 *pTokenType =
1200: 53 42 53 54 54 5f 49 4e 54 45 47 45 52 3b 0a 20 SBSTT_INTEGER;.
1210: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d return i;. }
1220: 0a 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d . *pTokenType =
1230: 20 53 42 53 54 54 5f 55 4e 4b 4e 4f 57 4e 3b 0a SBSTT_UNKNOWN;.
1240: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a return 1;.}...
1250: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 61 72 65 /*.** Values are
1260: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 68 stored in the h
1270: 61 73 68 20 74 61 62 6c 65 20 61 73 20 69 6e 73 ash table as ins
1280: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f tances of the fo
1290: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 llowing.** struc
12a0: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 ture..*/.typedef
12b0: 20 73 74 72 75 63 74 20 53 62 53 56 61 6c 75 65 struct SbSValue
12c0: 20 53 62 53 56 61 6c 75 65 3b 0a 73 74 72 75 63 SbSValue;.struc
12d0: 74 20 53 62 53 56 61 6c 75 65 20 7b 0a 20 20 69 t SbSValue {. i
12e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 nt flags;
12f0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 53 /* Bitmask of S
1300: 42 53 56 41 4c 5f 2a 20 76 61 6c 75 65 73 20 2a BSVAL_* values *
1310: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 /. union {.
1320: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 69 struct {. i
1330: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 nt size;
1340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* Number of byt
1350: 65 73 20 69 6e 20 73 74 72 69 6e 67 2c 20 6e 6f es in string, no
1360: 74 20 63 6f 75 6e 74 69 6e 67 20 66 69 6e 61 6c t counting final
1370: 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 63 zero */. c
1380: 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 har *z;
1390: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 /* Pointer to st
13a0: 72 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a ring content */.
13b0: 20 20 20 20 7d 20 73 74 72 3b 20 20 20 20 20 20 } str;
13c0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 66 20 /* Value if
13d0: 53 42 53 56 41 4c 5f 53 54 52 20 2a 2f 0a 20 20 SBSVAL_STR */.
13e0: 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 struct {.
13f0: 20 69 6e 74 20 28 2a 78 56 65 72 62 29 28 53 75 int (*xVerb)(Su
1400: 62 73 63 72 69 70 74 2a 2c 20 76 6f 69 64 2a 29 bscript*, void*)
1410: 3b 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f ; /* Functio
1420: 6e 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b n to do the work
1430: 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a */. void *
1440: 70 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 pArg;
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1460: 2a 20 32 6e 64 20 70 61 72 61 6d 65 74 65 72 20 * 2nd parameter
1470: 74 6f 20 78 56 65 72 62 20 2a 2f 0a 20 20 20 20 to xVerb */.
1480: 7d 20 76 65 72 62 3b 20 20 20 20 20 20 20 20 20 } verb;
1490: 2f 2a 20 56 61 6c 75 65 20 69 66 20 53 42 53 56 /* Value if SBSV
14a0: 41 4c 5f 56 45 52 42 20 2a 2f 0a 20 20 7d 20 75 AL_VERB */. } u
14b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a ; .
14c0: 7d 3b 0a 23 64 65 66 69 6e 65 20 53 42 53 56 41 };.#define SBSVA
14d0: 4c 5f 56 45 52 42 20 20 20 20 30 78 30 30 30 31 L_VERB 0x0001
14e0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 73 /* Value s
14f0: 74 6f 72 65 64 20 69 6e 20 75 2e 76 65 72 62 20 tored in u.verb
1500: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 56 41 */.#define SBSVA
1510: 4c 5f 53 54 52 20 20 20 20 20 30 78 30 30 30 32 L_STR 0x0002
1520: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 73 /* Value s
1530: 74 6f 72 65 64 20 69 6e 20 75 2e 73 74 72 20 2a tored in u.str *
1540: 2f 20 0a 23 64 65 66 69 6e 65 20 53 42 53 56 41 / .#define SBSVA
1550: 4c 5f 44 59 4e 20 20 20 20 20 30 78 30 30 30 34 L_DYN 0x0004
1560: 20 20 20 20 20 20 2f 2a 20 75 2e 73 74 72 2e 7a /* u.str.z
1570: 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 is dynamically
1580: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 23 64 65 allocated */.#de
1590: 66 69 6e 65 20 53 42 53 56 41 4c 5f 45 58 45 43 fine SBSVAL_EXEC
15a0: 20 20 20 20 30 78 30 30 30 38 20 20 20 20 20 20 0x0008
15b0: 2f 2a 20 75 2e 73 74 72 2e 7a 20 69 73 20 61 20 /* u.str.z is a
15c0: 73 63 72 69 70 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a script */../*.**
15d0: 20 52 65 6c 65 61 73 65 20 61 6e 79 20 6d 65 6d Release any mem
15e0: 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 ory allocated by
15f0: 20 61 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 a value..*/.sta
1600: 74 69 63 20 76 6f 69 64 20 73 62 73 5f 76 61 6c tic void sbs_val
1610: 75 65 5f 72 65 73 65 74 28 53 62 53 56 61 6c 75 ue_reset(SbSValu
1620: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e e *p){. if( p->
1630: 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f 44 flags & SBSVAL_D
1640: 59 4e 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 YN ){. free(p
1650: 2d 3e 75 2e 73 74 72 2e 7a 29 3b 0a 20 20 20 20 ->u.str.z);.
1660: 70 2d 3e 66 6c 61 67 73 20 3d 20 53 42 53 56 41 p->flags = SBSVA
1670: 4c 5f 53 54 52 3b 0a 20 20 20 20 70 2d 3e 75 2e L_STR;. p->u.
1680: 73 74 72 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20 str.z = "";.
1690: 70 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20 p->u.str.size =
16a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 0;. }.}.../*.**
16b0: 20 41 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 An entry in the
16c0: 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 61 hash table is a
16d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 n instance of th
16e0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f is structure..*/
16f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
1700: 53 62 73 48 61 73 68 45 6e 74 72 79 20 53 62 73 SbsHashEntry Sbs
1710: 48 61 73 68 45 6e 74 72 79 3b 0a 73 74 72 75 63 HashEntry;.struc
1720: 74 20 53 62 73 48 61 73 68 45 6e 74 72 79 20 7b t SbsHashEntry {
1730: 0a 20 20 53 62 73 48 61 73 68 45 6e 74 72 79 20 . SbsHashEntry
1740: 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e *pNext; /* N
1750: 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 ext entry with t
1760: 68 65 20 73 61 6d 65 20 68 61 73 68 20 6f 6e 20 he same hash on
1770: 7a 4b 65 79 20 2a 2f 0a 20 20 53 62 53 56 61 6c zKey */. SbSVal
1780: 75 65 20 76 61 6c 3b 20 20 20 20 20 20 20 20 20 ue val;
1790: 20 20 20 2f 2a 20 54 68 65 20 70 61 79 6c 6f 61 /* The payloa
17a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 3b d */. int nKey;
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
17c0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 * Length of the
17d0: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4b key */. char zK
17e0: 65 79 5b 30 5d 3b 20 20 20 20 20 20 20 20 20 20 ey[0];
17f0: 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 7d /* The key */.}
1800: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 61 73 68 20 ;../*.** A hash
1810: 74 61 62 6c 65 20 69 73 20 61 6e 20 69 6e 73 74 table is an inst
1820: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c ance of the foll
1830: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e owing structure.
1840: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 .*/.typedef stru
1850: 63 74 20 53 62 73 48 61 73 68 54 61 62 20 53 62 ct SbsHashTab Sb
1860: 73 48 61 73 68 54 61 62 3b 0a 73 74 72 75 63 74 sHashTab;.struct
1870: 20 53 62 73 48 61 73 68 54 61 62 20 7b 0a 20 20 SbsHashTab {.
1880: 53 62 73 48 61 73 68 45 6e 74 72 79 20 2a 61 48 SbsHashEntry *aH
1890: 61 73 68 5b 53 42 53 43 4f 4e 46 49 47 5f 4e 48 ash[SBSCONFIG_NH
18a0: 41 53 48 5d 3b 20 20 2f 2a 20 54 68 65 20 68 61 ASH]; /* The ha
18b0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a sh table */.};..
18c0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 /*.** Compute a
18d0: 68 61 73 68 20 6f 6e 20 61 20 73 74 72 69 6e 67 hash on a string
18e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
18f0: 73 62 73 5f 68 61 73 68 28 63 6f 6e 73 74 20 63 sbs_hash(const c
1900: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a har *z, int n){.
1910: 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 69 int h = 0;. i
1920: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b nt i;. for(i=0;
1930: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 i<n; i++){.
1940: 68 20 5e 3d 20 28 68 3c 3c 31 29 20 7c 20 7a 5b h ^= (h<<1) | z[
1950: 69 5d 3b 0a 20 20 7d 0a 20 20 68 20 26 3d 20 30 i];. }. h &= 0
1960: 78 37 66 66 66 66 66 66 3b 0a 20 20 72 65 74 75 x7ffffff;. retu
1970: 72 6e 20 68 20 25 20 53 42 53 43 4f 4e 46 49 47 rn h % SBSCONFIG
1980: 5f 4e 48 41 53 48 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a _NHASH;.}../*.**
1990: 20 4c 6f 6f 6b 20 75 70 20 61 20 76 61 6c 75 65 Look up a value
19a0: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 in the hash tab
19b0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f le. Return a po
19c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c inter to the val
19d0: 75 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 ue..** Return NU
19e0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e LL if not found.
19f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 .*/.static const
1a00: 20 53 62 53 56 61 6c 75 65 20 2a 73 62 73 5f 66 SbSValue *sbs_f
1a10: 65 74 63 68 28 0a 20 20 53 62 73 48 61 73 68 54 etch(. SbsHashT
1a20: 61 62 20 2a 70 48 61 73 68 2c 20 0a 20 20 63 6f ab *pHash, . co
1a30: 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20 nst char *zKey,
1a40: 0a 20 20 69 6e 74 20 6e 4b 65 79 0a 29 7b 0a 20 . int nKey.){.
1a50: 20 69 6e 74 20 68 3b 0a 20 20 53 62 73 48 61 73 int h;. SbsHas
1a60: 68 45 6e 74 72 79 20 2a 70 3b 0a 0a 20 20 69 66 hEntry *p;.. if
1a70: 28 20 6e 4b 65 79 3c 30 20 29 20 6e 4b 65 79 20 ( nKey<0 ) nKey
1a80: 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a = strlen(zKey);.
1a90: 20 20 68 20 3d 20 73 62 73 5f 68 61 73 68 28 7a h = sbs_hash(z
1aa0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 66 6f Key, nKey);. fo
1ab0: 72 28 70 20 3d 20 70 48 61 73 68 2d 3e 61 48 61 r(p = pHash->aHa
1ac0: 73 68 5b 68 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 sh[h]; p; p=p->p
1ad0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 Next){. if( p
1ae0: 2d 3e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 26 26 20 ->nKey==nKey &&
1af0: 6d 65 6d 63 6d 70 28 70 2d 3e 7a 4b 65 79 2c 7a memcmp(p->zKey,z
1b00: 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a Key,nKey)==0 ){.
1b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d return &p-
1b20: 3e 76 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a >val;. }. }.
1b30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../
1b40: 2a 0a 2a 2a 20 53 74 6f 72 65 20 61 20 76 61 6c *.** Store a val
1b50: 75 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 ue in the hash t
1b60: 61 62 6c 65 2e 20 20 4f 76 65 72 77 72 69 74 65 able. Overwrite
1b70: 20 61 6e 79 20 70 72 69 6f 72 20 76 61 6c 75 65 any prior value
1b80: 20 73 74 6f 72 65 64 0a 2a 2a 20 75 6e 64 65 72 stored.** under
1b90: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a the same name..
1ba0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c **.** If the val
1bb0: 75 65 20 69 6e 20 74 68 65 20 34 74 68 20 61 72 ue in the 4th ar
1bc0: 67 75 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 gument needs to
1bd0: 62 65 20 72 65 73 65 74 20 6f 72 20 66 72 65 65 be reset or free
1be0: 64 2c 0a 2a 2a 20 74 68 65 20 68 61 73 68 20 74 d,.** the hash t
1bf0: 61 62 6c 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f able will take o
1c00: 76 65 72 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 ver responsibili
1c10: 69 74 79 20 66 6f 72 20 64 6f 69 6e 67 20 73 6f ity for doing so
1c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
1c30: 73 62 73 5f 73 74 6f 72 65 28 0a 20 20 53 62 73 sbs_store(. Sbs
1c40: 48 61 73 68 54 61 62 20 2a 70 48 61 73 68 2c 20 HashTab *pHash,
1c50: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 /* Insert
1c60: 69 6e 74 6f 20 74 68 69 73 20 68 61 73 68 20 74 into this hash t
1c70: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 able */. const
1c80: 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20 char *zKey,
1c90: 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f /* The key */
1ca0: 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 . int nKey,
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
1cc0: 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 20 2a ize of the key *
1cd0: 2f 0a 20 20 63 6f 6e 73 74 20 53 62 53 56 61 6c /. const SbSVal
1ce0: 75 65 20 2a 70 56 61 6c 75 65 20 20 20 2f 2a 20 ue *pValue /*
1cf0: 54 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 The value to be
1d00: 73 74 6f 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 stored */.){. i
1d10: 6e 74 20 68 3b 0a 20 20 53 62 73 48 61 73 68 45 nt h;. SbsHashE
1d20: 6e 74 72 79 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a ntry *p, *pNew;.
1d30: 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30 20 29 20 . if( nKey<0 )
1d40: 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b nKey = strlen(zK
1d50: 65 79 29 3b 0a 20 20 68 20 3d 20 73 62 73 5f 68 ey);. h = sbs_h
1d60: 61 73 68 28 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b ash(zKey, nKey);
1d70: 0a 20 20 66 6f 72 28 70 20 3d 20 70 48 61 73 68 . for(p = pHash
1d80: 2d 3e 61 48 61 73 68 5b 68 5d 3b 20 70 3b 20 70 ->aHash[h]; p; p
1d90: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 =p->pNext){.
1da0: 69 66 28 20 70 2d 3e 6e 4b 65 79 3d 3d 6e 4b 65 if( p->nKey==nKe
1db0: 79 20 26 26 20 6d 65 6d 63 6d 70 28 70 2d 3e 7a y && memcmp(p->z
1dc0: 4b 65 79 2c 7a 4b 65 79 2c 6e 4b 65 79 29 3d 3d Key,zKey,nKey)==
1dd0: 30 20 29 7b 0a 20 20 20 20 20 20 73 62 73 5f 76 0 ){. sbs_v
1de0: 61 6c 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 76 alue_reset(&p->v
1df0: 61 6c 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 al);. memcp
1e00: 79 28 26 70 2d 3e 76 61 6c 2c 20 70 56 61 6c 75 y(&p->val, pValu
1e10: 65 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 76 61 6c e, sizeof(p->val
1e20: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ));. return
1e30: 20 53 42 53 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 SBS_OK;. }.
1e40: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 6d 61 6c 6c }. pNew = mall
1e50: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 oc( sizeof(*pNew
1e60: 29 20 2b 20 6e 4b 65 79 20 29 3b 0a 20 20 69 66 ) + nKey );. if
1e70: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e ( pNew ){. pN
1e80: 65 77 2d 3e 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b ew->nKey = nKey;
1e90: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 . memcpy(pNew
1ea0: 2d 3e 7a 4b 65 79 2c 20 7a 4b 65 79 2c 20 6e 4b ->zKey, zKey, nK
1eb0: 65 79 2b 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 ey+1);. memcp
1ec0: 79 28 26 70 4e 65 77 2d 3e 76 61 6c 2c 20 70 56 y(&pNew->val, pV
1ed0: 61 6c 75 65 2c 20 73 69 7a 65 6f 66 28 70 4e 65 alue, sizeof(pNe
1ee0: 77 2d 3e 76 61 6c 29 29 3b 0a 20 20 20 20 70 4e w->val));. pN
1ef0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 48 61 73 ew->pNext = pHas
1f00: 68 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 h->aHash[h];.
1f10: 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b 68 5d pHash->aHash[h]
1f20: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 = pNew;. ret
1f30: 75 72 6e 20 53 42 53 5f 4f 4b 3b 0a 20 20 7d 0a urn SBS_OK;. }.
1f40: 20 20 72 65 74 75 72 6e 20 53 42 53 5f 45 52 52 return SBS_ERR
1f50: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 OR;.}../*.** Res
1f60: 65 74 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e et a hash table.
1f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
1f80: 73 62 73 5f 68 61 73 68 5f 72 65 73 65 74 28 53 sbs_hash_reset(S
1f90: 62 73 48 61 73 68 54 61 62 20 2a 70 48 61 73 68 bsHashTab *pHash
1fa0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 62 ){. int i;. Sb
1fb0: 73 48 61 73 68 45 6e 74 72 79 20 2a 70 2c 20 2a sHashEntry *p, *
1fc0: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 69 3d 30 pNext;. for(i=0
1fd0: 3b 20 69 3c 53 42 53 43 4f 4e 46 49 47 5f 4e 48 ; i<SBSCONFIG_NH
1fe0: 41 53 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 ASH; i++){. f
1ff0: 6f 72 28 70 3d 70 48 61 73 68 2d 3e 61 48 61 73 or(p=pHash->aHas
2000: 68 5b 69 5d 3b 20 70 3b 20 70 3d 70 4e 65 78 74 h[i]; p; p=pNext
2010: 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d ){. pNext =
2020: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 p->pNext;.
2030: 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65 74 sbs_value_reset
2040: 28 26 70 2d 3e 76 61 6c 29 3b 0a 20 20 20 20 20 (&p->val);.
2050: 20 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a free(p);. }.
2060: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 48 61 }. memset(pHa
2070: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 sh, 0, sizeof(*p
2080: 48 61 73 68 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a Hash));.}../*.**
2090: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 An instance of
20a0: 74 68 65 20 53 75 62 73 63 72 69 70 74 20 69 6e the Subscript in
20b0: 74 65 72 70 72 65 74 65 72 0a 2a 2f 0a 73 74 72 terpreter.*/.str
20c0: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 7b 0a uct Subscript {.
20d0: 20 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 int nStack;
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
2100: 65 6e 74 72 69 65 73 20 6f 6e 20 73 74 61 63 6b entries on stack
2110: 20 2a 2f 0a 20 20 53 62 73 48 61 73 68 54 61 62 */. SbsHashTab
2120: 20 73 79 6d 54 61 62 3b 20 20 20 20 20 20 20 20 symTab;
2130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 /* The s
2140: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 ymbol table */.
2150: 20 63 68 61 72 20 7a 45 72 72 4d 73 67 5b 53 42 char zErrMsg[SB
2160: 53 43 4f 4e 46 49 47 5f 45 52 52 53 49 5a 45 5d SCONFIG_ERRSIZE]
2170: 3b 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 77 ; /* Space to w
2180: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 rite an error me
2190: 73 73 61 67 65 20 2a 2f 0a 20 20 53 62 53 56 61 ssage */. SbSVa
21a0: 6c 75 65 20 61 53 74 61 63 6b 5b 53 42 53 43 4f lue aStack[SBSCO
21b0: 4e 46 49 47 5f 4e 53 54 41 43 4b 5d 3b 20 2f 2a NFIG_NSTACK]; /*
21c0: 20 54 68 65 20 73 74 61 63 6b 20 2a 2f 0a 7d 3b The stack */.};
21d0: 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20 76 ../*.** Push a v
21e0: 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 alue onto the st
21f0: 61 63 6b 20 6f 66 20 61 6e 20 69 6e 74 65 72 70 ack of an interp
2200: 72 65 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 reter.*/.static
2210: 69 6e 74 20 73 62 73 5f 70 75 73 68 28 53 75 62 int sbs_push(Sub
2220: 73 63 72 69 70 74 20 2a 70 2c 20 53 62 53 56 61 script *p, SbSVa
2230: 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 66 lue *pVal){. if
2240: 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 53 42 53 ( p->nStack>=SBS
2250: 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20 29 7b CONFIG_NSTACK ){
2260: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 . sqlite3_snp
2270: 72 69 6e 74 66 28 53 42 53 43 4f 4e 46 49 47 5f rintf(SBSCONFIG_
2280: 45 52 52 53 49 5a 45 2c 20 70 2d 3e 7a 45 72 72 ERRSIZE, p->zErr
2290: 4d 73 67 2c 20 22 73 74 61 63 6b 20 6f 76 65 72 Msg, "stack over
22a0: 66 6c 6f 77 22 29 3b 0a 20 20 20 20 72 65 74 75 flow");. retu
22b0: 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 rn SBS_ERROR;.
22c0: 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d }. p->aStack[p-
22d0: 3e 6e 53 74 61 63 6b 2b 2b 5d 20 3d 20 2a 70 56 >nStack++] = *pV
22e0: 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 42 53 al;. return SBS
22f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 _OK;.}../*.** De
2300: 73 74 72 6f 79 20 61 6e 20 73 75 62 73 63 72 69 stroy an subscri
2310: 70 74 20 69 6e 74 65 72 70 72 65 74 65 72 0a 2a pt interpreter.*
2320: 2f 0a 76 6f 69 64 20 53 62 53 5f 44 65 73 74 72 /.void SbS_Destr
2330: 6f 79 28 73 74 72 75 63 74 20 53 75 62 73 63 72 oy(struct Subscr
2340: 69 70 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 ipt *p){. int i
2350: 3b 0a 20 20 73 62 73 5f 68 61 73 68 5f 72 65 73 ;. sbs_hash_res
2360: 65 74 28 26 70 2d 3e 73 79 6d 54 61 62 29 3b 0a et(&p->symTab);.
2370: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e for(i=0; i<p->
2380: 6e 53 74 61 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 nStack; i++){.
2390: 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65 sbs_value_rese
23a0: 74 28 26 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 29 t(&p->aStack[i])
23b0: 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 70 29 3b ;. }. free(p);
23c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 .}../*.** Set th
23d0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 e error message
23e0: 66 6f 72 20 61 6e 20 69 6e 74 65 72 70 72 65 74 for an interpret
23f0: 65 72 2e 20 20 56 65 72 62 20 69 6d 70 6c 65 6d er. Verb implem
2400: 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75 73 65 entations.** use
2410: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 this routine wh
2420: 65 6e 20 74 68 65 79 20 65 6e 63 6f 75 6e 74 65 en they encounte
2430: 72 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76 r an error..*/.v
2440: 6f 69 64 20 53 62 53 5f 53 65 74 45 72 72 6f 72 oid SbS_SetError
2450: 4d 65 73 73 61 67 65 28 73 74 72 75 63 74 20 53 Message(struct S
2460: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 63 6f 6e ubscript *p, con
2470: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 29 7b 0a st char *zErr){.
2480: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72 int nErr = str
2490: 6c 65 6e 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 len(zErr);. if(
24a0: 20 6e 45 72 72 3e 73 69 7a 65 6f 66 28 70 2d 3e nErr>sizeof(p->
24b0: 7a 45 72 72 4d 73 67 29 2d 31 20 29 7b 0a 20 20 zErrMsg)-1 ){.
24c0: 20 20 6e 45 72 72 20 3d 20 73 69 7a 65 6f 66 28 nErr = sizeof(
24d0: 70 2d 3e 7a 45 72 72 4d 73 67 29 2d 31 3b 0a 20 p->zErrMsg)-1;.
24e0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a }. memcpy(p->z
24f0: 45 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20 6e 45 ErrMsg, zErr, nE
2500: 72 72 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 rr);. p->zErrMs
2510: 67 5b 6e 45 72 72 5d 20 3d 20 30 3b 0a 7d 0a 0a g[nErr] = 0;.}..
2520: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 /*.** Return a p
2530: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 75 ointer to the cu
2540: 72 72 65 6e 74 20 65 72 72 6f 72 20 6d 65 73 73 rrent error mess
2550: 61 67 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 age for the.** i
2560: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 63 nterpreter..*/.c
2570: 6f 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 47 onst char *SbS_G
2580: 65 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73 etErrorMessage(s
2590: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
25a0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d *p){. return p-
25b0: 3e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a >zErrMsg;.}../*.
25c0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 76 65 72 ** Add a new ver
25d0: 62 20 74 68 65 20 67 69 76 65 6e 20 69 6e 74 65 b the given inte
25e0: 72 70 72 65 74 65 72 0a 2a 2f 0a 69 6e 74 20 53 rpreter.*/.int S
25f0: 62 53 5f 41 64 64 56 65 72 62 28 0a 20 20 73 74 bS_AddVerb(. st
2600: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a ruct Subscript *
2610: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 p,. const char
2620: 2a 7a 56 65 72 62 2c 0a 20 20 69 6e 74 20 28 2a *zVerb,. int (*
2630: 78 56 65 72 62 29 28 73 74 72 75 63 74 20 53 75 xVerb)(struct Su
2640: 62 73 63 72 69 70 74 2a 2c 76 6f 69 64 2a 29 2c bscript*,void*),
2650: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b . void *pArg.){
2660: 0a 20 20 53 62 53 56 61 6c 75 65 20 76 3b 0a 20 . SbSValue v;.
2670: 20 76 2e 66 6c 61 67 73 20 3d 20 53 42 53 56 41 v.flags = SBSVA
2680: 4c 5f 56 45 52 42 3b 0a 20 20 76 2e 75 2e 76 65 L_VERB;. v.u.ve
2690: 72 62 2e 78 56 65 72 62 20 3d 20 78 56 65 72 62 rb.xVerb = xVerb
26a0: 3b 0a 20 20 76 2e 75 2e 76 65 72 62 2e 70 41 72 ;. v.u.verb.pAr
26b0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 g = pArg;. retu
26c0: 72 6e 20 73 62 73 5f 73 74 6f 72 65 28 26 70 2d rn sbs_store(&p-
26d0: 3e 73 79 6d 54 61 62 2c 20 7a 56 65 72 62 2c 20 >symTab, zVerb,
26e0: 2d 31 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a -1, &v);.}../*.*
26f0: 2a 20 50 75 73 68 20 61 20 73 74 72 69 6e 67 20 * Push a string
2700: 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73 value onto the s
2710: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 tack..**.** If t
2720: 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72 he 4th parameter
2730: 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 is 0, then the
2740: 73 74 72 69 6e 67 20 69 73 20 73 74 61 74 69 63 string is static
2750: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 34 74 68 20 ..** If the 4th
2760: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e parameter is non
2770: 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 65 20 73 -zero then the s
2780: 74 72 69 6e 67 20 77 61 73 20 6f 62 74 61 69 6e tring was obtain
2790: 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f ed.** from mallo
27a0: 63 20 61 6e 64 20 53 75 62 73 63 72 69 70 74 20 c and Subscript
27b0: 77 69 6c 6c 20 74 61 6b 65 20 72 65 73 70 6f 6e will take respon
27c0: 73 69 62 69 6c 69 74 79 20 66 6f 72 20 66 72 65 sibility for fre
27d0: 65 69 6e 67 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a eing.** it..**.*
27e0: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 * Return 0 on su
27f0: 63 63 65 73 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 ccess and non-ze
2800: 72 6f 20 69 66 20 74 68 65 72 65 20 69 73 20 61 ro if there is a
2810: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 n error..*/.int
2820: 53 62 53 5f 50 75 73 68 28 0a 20 20 73 74 72 75 SbS_Push(. stru
2830: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c ct Subscript *p,
2840: 20 20 2f 2a 20 50 75 73 68 20 6f 6e 74 6f 20 74 /* Push onto t
2850: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 his interpreter
2860: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20 20 */. char *z,
2870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 /* St
2880: 72 69 6e 67 20 76 61 6c 75 65 20 74 6f 20 70 75 ring value to pu
2890: 73 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 sh */. int n,
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
28b0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 Length of the s
28c0: 74 72 69 6e 67 2c 20 6f 72 20 2d 31 20 2a 2f 0a tring, or -1 */.
28d0: 20 20 69 6e 74 20 64 79 6e 20 20 20 20 20 20 20 int dyn
28e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 /* If tr
28f0: 75 65 2c 20 7a 20 77 61 73 20 6f 62 74 61 69 6e ue, z was obtain
2900: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a ed from malloc *
2910: 2f 0a 29 7b 0a 20 20 53 62 53 56 61 6c 75 65 20 /.){. SbSValue
2920: 76 3b 0a 20 20 76 2e 66 6c 61 67 73 20 3d 20 53 v;. v.flags = S
2930: 42 53 56 41 4c 5f 53 54 52 3b 0a 20 20 69 66 28 BSVAL_STR;. if(
2940: 20 64 79 6e 20 29 7b 0a 20 20 20 20 76 2e 66 6c dyn ){. v.fl
2950: 61 67 73 20 7c 3d 20 53 42 53 56 41 4c 5f 44 59 ags |= SBSVAL_DY
2960: 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 N;. }. if( n<0
2970: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 ) n = strlen(z)
2980: 3b 0a 20 20 76 2e 75 2e 73 74 72 2e 73 69 7a 65 ;. v.u.str.size
2990: 20 3d 20 6e 3b 0a 20 20 76 2e 75 2e 73 74 72 2e = n;. v.u.str.
29a0: 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72 6e 20 z = z;. return
29b0: 73 62 73 5f 70 75 73 68 28 70 2c 20 26 76 29 3b sbs_push(p, &v);
29c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 .}../*.** Push a
29d0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 n integer value
29e0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a onto the stack..
29f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 **.** This routi
2a00: 6e 65 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 63 ne really just c
2a10: 6f 6e 76 65 72 74 73 20 74 68 65 20 69 6e 74 65 onverts the inte
2a20: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e ger into a strin
2a30: 67 0a 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 73 20 g.** then calls
2a40: 53 62 53 5f 50 75 73 68 2e 0a 2a 2f 0a 69 6e 74 SbS_Push..*/.int
2a50: 20 53 62 53 5f 50 75 73 68 49 6e 74 28 73 74 72 SbS_PushInt(str
2a60: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 uct Subscript *p
2a70: 2c 20 69 6e 74 20 69 56 61 6c 29 7b 0a 20 20 69 , int iVal){. i
2a80: 66 28 20 69 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 f( iVal==0 ){.
2a90: 20 20 72 65 74 75 72 6e 20 53 62 53 5f 50 75 73 return SbS_Pus
2aa0: 68 28 70 2c 20 22 30 22 2c 20 31 2c 20 30 29 3b h(p, "0", 1, 0);
2ab0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 56 61 . }else if( iVa
2ac0: 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75 l==1 ){. retu
2ad0: 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c 20 22 rn SbS_Push(p, "
2ae0: 31 22 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 1", 1, 0);. }el
2af0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b se{. char *z;
2b00: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 . int n;.
2b10: 63 68 61 72 20 7a 56 61 6c 5b 35 30 5d 3b 0a 20 char zVal[50];.
2b20: 20 20 20 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c sprintf(zVal,
2b30: 20 22 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 "%d", iVal);.
2b40: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61 n = strlen(zVa
2b50: 6c 29 3b 0a 20 20 20 20 7a 20 3d 20 6d 61 6c 6c l);. z = mall
2b60: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20 69 oc( n+1 );. i
2b70: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 73 74 f( z ){. st
2b80: 72 63 70 79 28 7a 2c 20 7a 56 61 6c 29 3b 0a 20 rcpy(z, zVal);.
2b90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 62 53 5f return SbS_
2ba0: 50 75 73 68 28 70 2c 20 7a 2c 20 6e 2c 20 31 29 Push(p, z, n, 1)
2bb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
2bc0: 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f 45 52 return SBS_ER
2bd0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d ROR;. }. }.}
2be0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 61 6e 64 20 ../*.** Pop and
2bf0: 64 65 73 74 72 6f 79 20 7a 65 72 6f 20 6f 72 20 destroy zero or
2c00: 6d 6f 72 65 20 76 61 6c 75 65 73 20 66 72 6f 6d more values from
2c10: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 52 the stack..** R
2c20: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 eturn the number
2c30: 20 6f 66 20 76 61 6c 75 65 73 20 72 65 6d 61 69 of values remai
2c40: 6e 69 6e 67 20 6f 6e 20 74 68 65 20 73 74 61 63 ning on the stac
2c50: 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 70 k after.** the p
2c60: 6f 70 73 20 6f 63 63 75 72 2e 0a 2a 2f 0a 69 6e ops occur..*/.in
2c70: 74 20 53 62 53 5f 50 6f 70 28 73 74 72 75 63 74 t SbS_Pop(struct
2c80: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 69 Subscript *p, i
2c90: 6e 74 20 4e 29 7b 0a 20 20 77 68 69 6c 65 28 20 nt N){. while(
2ca0: 4e 3e 30 20 26 26 20 70 2d 3e 6e 53 74 61 63 6b N>0 && p->nStack
2cb0: 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 74 >0 ){. p->nSt
2cc0: 61 63 6b 2d 2d 3b 0a 20 20 20 20 73 62 73 5f 76 ack--;. sbs_v
2cd0: 61 6c 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 61 alue_reset(&p->a
2ce0: 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 5d Stack[p->nStack]
2cf0: 29 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a );. N--;. }.
2d00: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 53 74 61 return p->nSta
2d10: 63 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 ck;.}../*.** Ret
2d20: 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 65 6c 65 urn the N-th ele
2d30: 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 74 61 63 ment of the stac
2d40: 6b 2e 20 20 30 20 69 73 20 74 68 65 20 74 6f 70 k. 0 is the top
2d50: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a of the stack..*
2d60: 2a 20 31 20 69 73 20 74 68 65 20 66 69 72 73 74 * 1 is the first
2d70: 20 65 6c 65 6d 65 6e 74 20 64 6f 77 6e 2e 20 20 element down.
2d80: 32 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 2 is the second
2d90: 65 6c 65 6d 65 6e 74 2e 20 20 41 6e 64 20 73 6f element. And so
2da0: 20 66 6f 72 74 68 2e 0a 2a 2a 20 52 65 74 75 72 forth..** Retur
2db0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 n NULL if there
2dc0: 69 73 20 6e 6f 20 4e 2d 74 68 20 65 6c 65 6d 65 is no N-th eleme
2dd0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f nt..**.** The po
2de0: 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 inter returned i
2df0: 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74 s only valid unt
2e00: 69 6c 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 il the value is
2e10: 70 6f 70 70 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 popped.** from t
2e20: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 6f 6e he stack..*/.con
2e30: 73 74 20 63 68 61 72 20 2a 53 62 53 5f 53 74 61 st char *SbS_Sta
2e40: 63 6b 56 61 6c 75 65 28 73 74 72 75 63 74 20 53 ckValue(struct S
2e50: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 ubscript *p, int
2e60: 20 4e 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b N, int *pSize){
2e70: 0a 20 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61 . SbSValue *pVa
2e80: 6c 3b 0a 20 20 69 66 28 20 4e 3c 30 20 7c 7c 20 l;. if( N<0 ||
2e90: 4e 3e 3d 70 2d 3e 6e 53 74 61 63 6b 20 29 7b 0a N>=p->nStack ){.
2ea0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
2eb0: 7d 0a 20 20 70 56 61 6c 20 3d 20 26 70 2d 3e 61 }. pVal = &p->a
2ec0: 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 6b 2d Stack[p->nStack-
2ed0: 4e 2d 31 5d 3b 0a 20 20 69 66 28 20 28 70 56 61 N-1];. if( (pVa
2ee0: 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42 53 56 41 l->flags & SBSVA
2ef0: 4c 5f 53 54 52 29 3d 3d 30 20 29 7b 0a 20 20 20 L_STR)==0 ){.
2f00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 return 0;. }.
2f10: 20 2a 70 53 69 7a 65 20 3d 20 70 56 61 6c 2d 3e *pSize = pVal->
2f20: 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 72 65 u.str.size;. re
2f30: 74 75 72 6e 20 70 56 61 6c 2d 3e 75 2e 73 74 72 turn pVal->u.str
2f40: 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 .z;.}../*.** A c
2f50: 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 onvenience routi
2f60: 6e 65 20 66 6f 72 20 65 78 74 72 61 63 74 69 6e ne for extractin
2f70: 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c g an integer val
2f80: 75 65 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 ue from the.** s
2f90: 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 tack..*/.int SbS
2fa0: 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 28 73 _StackValueInt(s
2fb0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
2fc0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e *p, int N){. in
2fd0: 74 20 6e 2c 20 76 3b 0a 20 20 69 6e 74 20 69 73 t n, v;. int is
2fe0: 4e 65 67 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 Neg = 0;. const
2ff0: 20 63 68 61 72 20 2a 7a 20 3d 20 53 62 53 5f 53 char *z = SbS_S
3000: 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 4e 2c 20 tackValue(p, N,
3010: 26 6e 29 3b 0a 20 20 76 20 3d 20 30 3b 0a 20 20 &n);. v = 0;.
3020: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 if( n==0 ) retur
3030: 6e 20 30 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d n 0;. if( z[0]=
3040: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 ='-' ){. isNe
3050: 67 20 3d 20 31 3b 0a 20 20 20 20 7a 2b 2b 3b 0a g = 1;. z++;.
3060: 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 65 6c 73 65 n--;. }else
3070: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2b 27 20 29 if( z[0]=='+' )
3080: 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e {. z++;. n
3090: 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 --;. }. while(
30a0: 20 6e 3e 30 20 26 26 20 69 73 64 69 67 69 74 28 n>0 && isdigit(
30b0: 7a 5b 30 5d 29 20 29 7b 0a 20 20 20 20 76 20 3d z[0]) ){. v =
30c0: 20 76 2a 31 30 20 2b 20 7a 5b 30 5d 20 2d 20 27 v*10 + z[0] - '
30d0: 30 27 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 0';. z++;.
30e0: 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 n--;. }. if(
30f0: 69 73 4e 65 67 20 29 7b 0a 20 20 20 20 76 20 3d isNeg ){. v =
3100: 20 2d 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 -v;. }. retur
3110: 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 n v;.}../*.** Re
3120: 74 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 65 trieve the value
3130: 20 6f 66 20 61 20 76 61 72 69 61 62 6c 65 20 66 of a variable f
3140: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 rom the interpre
3150: 74 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 ter. Return.**
3160: 4e 55 4c 4c 20 69 66 20 6e 6f 20 73 75 63 68 20 NULL if no such
3170: 76 61 72 69 61 62 6c 65 20 69 73 20 64 65 66 69 variable is defi
3180: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 ned. .**.** The
3190: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 returned string
31a0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 is not necessar
31b0: 69 6c 79 20 28 70 72 6f 62 61 62 6c 79 20 6e 6f ily (probably no
31c0: 74 29 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 t) zero-terminat
31d0: 65 64 2e 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e ed..** The strin
31e0: 67 20 6d 61 79 20 62 65 20 64 65 61 6c 6c 6f 63 g may be dealloc
31f0: 61 74 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 ated the next ti
3200: 6d 65 20 61 6e 79 74 68 69 6e 67 20 69 73 20 64 me anything is d
3210: 6f 6e 65 20 74 6f 0a 2a 2a 20 74 68 65 20 69 6e one to.** the in
3220: 74 65 72 70 72 65 74 65 72 2e 20 20 4d 61 6b 65 terpreter. Make
3230: 20 61 20 63 6f 70 79 20 69 66 20 79 6f 75 20 6e a copy if you n
3240: 65 65 64 20 69 74 20 74 6f 20 70 65 72 73 69 73 eed it to persis
3250: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 t..*/.const char
3260: 20 2a 53 62 53 5f 46 65 74 63 68 28 0a 20 20 73 *SbS_Fetch(. s
3270: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
3280: 2a 70 2c 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 *p, /* The int
3290: 65 72 70 72 65 74 65 72 20 77 65 20 61 72 65 20 erpreter we are
32a0: 69 6e 74 65 72 72 6f 67 61 74 69 6e 67 20 2a 2f interrogating */
32b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
32c0: 4b 65 79 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e Key, /* N
32d0: 61 6d 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 ame of the varia
32e0: 62 6c 65 2e 20 20 43 61 73 65 20 73 65 6e 73 69 ble. Case sensi
32f0: 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 tive */. int *p
3300: 4c 65 6e 67 74 68 20 20 20 20 20 20 20 20 20 20 Length
3310: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 /* Write the
3320: 6c 65 6e 67 74 68 20 68 65 72 65 20 2a 2f 0a 29 length here */.)
3330: 7b 0a 20 20 63 6f 6e 73 74 20 53 62 53 56 61 6c {. const SbSVal
3340: 75 65 20 2a 70 56 61 6c 3b 0a 0a 20 20 70 56 61 ue *pVal;.. pVa
3350: 6c 20 3d 20 73 62 73 5f 66 65 74 63 68 28 26 70 l = sbs_fetch(&p
3360: 2d 3e 73 79 6d 54 61 62 2c 20 7a 4b 65 79 2c 20 ->symTab, zKey,
3370: 2d 31 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d -1);. if( pVal=
3380: 3d 30 20 7c 7c 20 28 70 56 61 6c 2d 3e 66 6c 61 =0 || (pVal->fla
3390: 67 73 20 26 20 53 42 53 56 41 4c 5f 53 54 52 29 gs & SBSVAL_STR)
33a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e ==0 ){. *pLen
33b0: 67 74 68 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 gth = 0;. ret
33c0: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a urn 0;. }else{.
33d0: 20 20 20 20 2a 70 4c 65 6e 67 74 68 20 3d 20 70 *pLength = p
33e0: 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 3b Val->u.str.size;
33f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 61 6c . return pVal
3400: 2d 3e 75 2e 73 74 72 2e 7a 3b 0a 20 20 7d 0a 7d ->u.str.z;. }.}
3410: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 ../*.** Generate
3420: 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 72 65 an error and re
3430: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 turn non-zero if
3440: 20 74 68 65 20 73 74 61 63 6b 20 68 61 73 0a 2a the stack has.*
3450: 2a 20 66 65 77 65 72 20 74 68 61 6e 20 4e 20 65 * fewer than N e
3460: 6c 65 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69 lements. This i
3470: 73 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e s utility routin
3480: 65 20 75 73 65 64 20 69 6e 0a 2a 2a 20 74 68 65 e used in.** the
3490: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
34a0: 6f 66 20 76 65 72 62 73 2e 0a 2a 2f 0a 69 6e 74 of verbs..*/.int
34b0: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 SbS_RequireStac
34c0: 6b 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 k(struct Subscri
34d0: 70 74 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 63 6f pt *p, int N, co
34e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 29 7b nst char *zCmd){
34f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b . if( p->nStack
3500: 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a >=N ) return 0;.
3510: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
3520: 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 tf(sizeof(p->zEr
3530: 72 4d 73 67 29 2c 20 70 2d 3e 7a 45 72 72 4d 73 rMsg), p->zErrMs
3540: 67 2c 0a 20 20 20 20 20 22 5c 22 25 73 5c 22 20 g,. "\"%s\"
3550: 72 65 71 75 69 72 65 73 20 61 74 20 6c 65 61 73 requires at leas
3560: 74 20 25 64 20 73 74 61 63 6b 20 65 6c 65 6d 65 t %d stack eleme
3570: 6e 74 73 20 2d 20 6f 6e 6c 79 20 66 6f 75 6e 64 nts - only found
3580: 20 25 64 22 2c 0a 20 20 20 20 20 7a 43 6d 64 2c %d",. zCmd,
3590: 20 4e 2c 20 70 2d 3e 6e 53 74 61 63 6b 29 3b 0a N, p->nStack);.
35a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f return 1;.}../
35b0: 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 *.** Subscript c
35c0: 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 20 53 54 ommand: ST
35d0: 52 49 4e 47 20 4e 41 4d 45 20 73 65 74 0a 2a 2a RING NAME set.**
35e0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 76 61 .** Write the va
35f0: 6c 75 65 20 6f 66 20 53 54 52 49 4e 47 20 69 6e lue of STRING in
3600: 74 6f 20 76 61 72 69 61 62 6c 65 20 63 61 6c 6c to variable call
3610: 65 64 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 ed NAME..*/.stat
3620: 69 63 20 69 6e 74 20 73 65 74 43 6d 64 28 53 75 ic int setCmd(Su
3630: 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 bscript *p, void
3640: 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 53 *pNotUsed){. S
3650: 62 53 56 61 6c 75 65 20 2a 70 54 6f 73 3b 0a 20 bSValue *pTos;.
3660: 20 53 62 53 56 61 6c 75 65 20 2a 70 4e 6f 73 3b SbSValue *pNos;
3670: 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 . if( SbS_Requi
3680: 72 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 73 reStack(p, 2, "s
3690: 65 74 22 29 20 29 20 72 65 74 75 72 6e 20 53 42 et") ) return SB
36a0: 53 5f 45 52 52 4f 52 3b 0a 20 20 70 54 6f 73 20 S_ERROR;. pTos
36b0: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 = &p->aStack[--p
36c0: 2d 3e 6e 53 74 61 63 6b 5d 3b 0a 20 20 70 4e 6f ->nStack];. pNo
36d0: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d s = &p->aStack[-
36e0: 2d 70 2d 3e 6e 53 74 61 63 6b 5d 3b 0a 20 20 73 -p->nStack];. s
36f0: 62 73 5f 73 74 6f 72 65 28 26 70 2d 3e 73 79 6d bs_store(&p->sym
3700: 54 61 62 2c 20 70 54 6f 73 2d 3e 75 2e 73 74 72 Tab, pTos->u.str
3710: 2e 7a 2c 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e .z, pTos->u.str.
3720: 73 69 7a 65 2c 20 70 4e 6f 73 29 3b 0a 20 20 73 size, pNos);. s
3730: 62 73 5f 76 61 6c 75 65 5f 72 65 73 65 74 28 70 bs_value_reset(p
3740: 54 6f 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 Tos);. return 0
3750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 ;.}../*.** Subsc
3760: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 ript command:
3770: 20 20 20 49 4e 54 45 47 45 52 20 6e 6f 74 20 49 INTEGER not I
3780: 4e 54 45 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63 NTEGER.*/.static
3790: 20 69 6e 74 20 6e 6f 74 43 6d 64 28 73 74 72 75 int notCmd(stru
37a0: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c ct Subscript *p,
37b0: 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 void *pNotUsed)
37c0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 {. int n;. if(
37d0: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 SbS_RequireStac
37e0: 6b 28 70 2c 20 31 2c 20 22 6e 6f 74 22 29 20 29 k(p, 1, "not") )
37f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e 20 3d return 1;. n =
3800: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 SbS_StackValueI
3810: 6e 74 28 70 2c 20 30 29 3b 0a 20 20 53 62 53 5f nt(p, 0);. SbS_
3820: 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 62 53 Pop(p, 1);. SbS
3830: 5f 50 75 73 68 49 6e 74 28 70 2c 20 21 6e 29 3b _PushInt(p, !n);
3840: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a . return 0;.}..
3850: 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 /*.** Subscript
3860: 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 49 4e command: IN
3870: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 6d 61 TEGER INTEGER ma
3880: 78 20 49 4e 54 45 47 45 52 0a 2a 2f 0a 73 74 61 x INTEGER.*/.sta
3890: 74 69 63 20 69 6e 74 20 6d 61 78 43 6d 64 28 73 tic int maxCmd(s
38a0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
38b0: 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 *p, void *pNotUs
38c0: 65 64 29 7b 0a 20 20 69 6e 74 20 61 2c 20 62 3b ed){. int a, b;
38d0: 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 . if( SbS_Requi
38e0: 72 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 6d reStack(p, 2, "m
38f0: 61 78 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b ax") ) return 1;
3900: 0a 20 20 61 20 3d 20 53 62 53 5f 53 74 61 63 6b . a = SbS_Stack
3910: 56 61 6c 75 65 49 6e 74 28 70 2c 20 30 29 3b 0a ValueInt(p, 0);.
3920: 20 20 62 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 b = SbS_StackV
3930: 61 6c 75 65 49 6e 74 28 70 2c 20 31 29 3b 0a 20 alueInt(p, 1);.
3940: 20 53 62 53 5f 50 6f 70 28 70 2c 20 32 29 3b 0a SbS_Pop(p, 2);.
3950: 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70 2c SbS_PushInt(p,
3960: 20 61 3e 62 20 3f 20 61 20 3a 20 62 29 3b 0a 20 a>b ? a : b);.
3970: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
3980: 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f .** Subscript co
3990: 6d 6d 61 6e 64 3a 20 20 20 20 20 20 49 4e 54 45 mmand: INTE
39a0: 47 45 52 20 49 4e 54 45 47 45 52 20 61 6e 64 20 GER INTEGER and
39b0: 49 4e 54 45 47 45 52 0a 2a 2f 0a 73 74 61 74 69 INTEGER.*/.stati
39c0: 63 20 69 6e 74 20 61 6e 64 43 6d 64 28 73 74 72 c int andCmd(str
39d0: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 uct Subscript *p
39e0: 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 , void *pNotUsed
39f0: 29 7b 0a 20 20 69 6e 74 20 61 2c 20 62 3b 0a 20 ){. int a, b;.
3a00: 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 if( SbS_Require
3a10: 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 6d 61 78 Stack(p, 2, "max
3a20: 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 ") ) return 1;.
3a30: 20 61 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 a = SbS_StackVa
3a40: 6c 75 65 49 6e 74 28 70 2c 20 30 29 3b 0a 20 20 lueInt(p, 0);.
3a50: 62 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c b = SbS_StackVal
3a60: 75 65 49 6e 74 28 70 2c 20 31 29 3b 0a 20 20 53 ueInt(p, 1);. S
3a70: 62 53 5f 50 6f 70 28 70 2c 20 32 29 3b 0a 20 20 bS_Pop(p, 2);.
3a80: 53 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 61 SbS_PushInt(p, a
3a90: 20 26 26 20 62 29 3b 0a 20 20 72 65 74 75 72 6e && b);. return
3aa0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 0;.}../*.** Sub
3ab0: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 script command:
3ac0: 20 20 20 20 20 53 54 52 49 4e 47 20 70 75 74 73 STRING puts
3ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 .*/.static int p
3ae0: 75 74 73 43 6d 64 28 73 74 72 75 63 74 20 53 75 utsCmd(struct Su
3af0: 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 bscript *p, void
3b00: 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 *pNotUsed){. i
3b10: 6e 74 20 73 69 7a 65 3b 0a 20 20 63 6f 6e 73 74 nt size;. const
3b20: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 char *z;. if(
3b30: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b SbS_RequireStack
3b40: 28 70 2c 20 31 2c 20 22 70 75 74 73 22 29 20 29 (p, 1, "puts") )
3b50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d return 1;. z =
3b60: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 SbS_StackValue(
3b70: 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b 0a 20 20 p, 0, &size);.
3b80: 70 72 69 6e 74 66 28 22 25 2e 2a 73 5c 6e 22 2c printf("%.*s\n",
3b90: 20 73 69 7a 65 2c 20 7a 29 3b 0a 20 20 53 62 53 size, z);. SbS
3ba0: 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 72 65 _Pop(p, 1);. re
3bb0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a turn 0;.}.../*.*
3bc0: 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 62 75 69 * A table of bui
3bd0: 6c 74 2d 69 6e 20 63 6f 6d 6d 61 6e 64 73 0a 2a lt-in commands.*
3be0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 /.static const s
3bf0: 74 72 75 63 74 20 7b 0a 20 20 63 6f 6e 73 74 20 truct {. const
3c00: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e char *zCmd;. in
3c10: 74 20 6e 43 6d 64 3b 0a 20 20 69 6e 74 20 28 2a t nCmd;. int (*
3c20: 78 43 6d 64 29 28 53 75 62 73 63 72 69 70 74 2a xCmd)(Subscript*
3c30: 2c 76 6f 69 64 2a 29 3b 0a 7d 20 61 42 75 69 6c ,void*);.} aBuil
3c40: 74 69 6e 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 61 tin[] = {. { "a
3c50: 6e 64 22 2c 20 20 20 33 2c 20 20 20 20 61 6e 64 nd", 3, and
3c60: 43 6d 64 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6d Cmd },. { "m
3c70: 61 78 22 2c 20 20 20 33 2c 20 20 20 20 6d 61 78 ax", 3, max
3c80: 43 6d 64 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6e Cmd },. { "n
3c90: 6f 74 22 2c 20 20 20 33 2c 20 20 20 20 6e 6f 74 ot", 3, not
3ca0: 43 6d 64 20 20 20 20 7d 2c 0a 20 20 7b 20 22 70 Cmd },. { "p
3cb0: 75 74 73 22 2c 20 20 34 2c 20 20 20 20 70 75 74 uts", 4, put
3cc0: 73 43 6d 64 20 20 20 7d 2c 0a 20 20 7b 20 22 73 sCmd },. { "s
3cd0: 65 74 22 2c 20 20 20 33 2c 20 20 20 20 73 65 74 et", 3, set
3ce0: 43 6d 64 20 20 20 20 7d 2c 0a 7d 3b 0a 0a 0a 2f Cmd },.};.../
3cf0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 *.** Create a ne
3d00: 77 20 73 75 62 73 63 72 69 70 74 20 69 6e 74 65 w subscript inte
3d10: 72 70 72 65 74 65 72 0a 2a 2f 0a 73 74 72 75 63 rpreter.*/.struc
3d20: 74 20 53 75 62 73 63 72 69 70 74 20 2a 53 62 53 t Subscript *SbS
3d30: 5f 43 72 65 61 74 65 28 76 6f 69 64 29 7b 0a 20 _Create(void){.
3d40: 20 53 75 62 73 63 72 69 70 74 20 2a 70 3b 0a 0a Subscript *p;..
3d50: 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 p = malloc( si
3d60: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 zeof(*p) );. if
3d70: 28 20 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 ( p ){. memse
3d80: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a t(p, 0, sizeof(*
3d90: 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 p));. }. retur
3da0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 n p;.}../*.** Ev
3db0: 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 aluate the scrip
3dc0: 74 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 66 t given by the f
3dd0: 69 72 73 74 20 6e 53 63 72 69 70 74 20 62 79 74 irst nScript byt
3de0: 65 73 20 6f 66 20 7a 53 63 72 69 70 74 5b 5d 2e es of zScript[].
3df0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 .** Return 0 on
3e00: 73 75 63 63 65 73 73 20 61 6e 64 20 6e 6f 6e 2d success and non-
3e10: 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f zero for an erro
3e20: 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 45 76 r..*/.int SbS_Ev
3e30: 61 6c 28 73 74 72 75 63 74 20 53 75 62 73 63 72 al(struct Subscr
3e40: 69 70 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 ipt *p, const ch
3e50: 61 72 20 2a 7a 53 63 72 69 70 74 2c 20 69 6e 74 ar *zScript, int
3e60: 20 6e 53 63 72 69 70 74 29 7b 0a 20 20 69 6e 74 nScript){. int
3e70: 20 72 63 20 3d 20 53 42 53 5f 4f 4b 3b 0a 20 20 rc = SBS_OK;.
3e80: 69 66 28 20 6e 53 63 72 69 70 74 3c 30 20 29 20 if( nScript<0 )
3e90: 6e 53 63 72 69 70 74 20 3d 20 73 74 72 6c 65 6e nScript = strlen
3ea0: 28 7a 53 63 72 69 70 74 29 3b 0a 20 20 77 68 69 (zScript);. whi
3eb0: 6c 65 28 20 6e 53 63 72 69 70 74 3e 30 20 26 26 le( nScript>0 &&
3ec0: 20 72 63 3d 3d 53 42 53 5f 4f 4b 20 29 7b 0a 20 rc==SBS_OK ){.
3ed0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 6e int n;. in
3ee0: 74 20 74 74 79 70 65 3b 0a 20 20 20 20 6e 20 3d t ttype;. n =
3ef0: 20 73 62 73 5f 6e 65 78 74 5f 74 6f 6b 65 6e 28 sbs_next_token(
3f00: 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74 zScript, nScript
3f10: 2c 20 26 74 74 79 70 65 29 3b 0a 20 20 20 20 73 , &ttype);. s
3f20: 77 69 74 63 68 28 20 74 74 79 70 65 20 29 7b 0a witch( ttype ){.
3f30: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54 case SBSTT
3f40: 5f 57 48 49 54 45 53 50 41 43 45 3a 20 7b 0a 20 _WHITESPACE: {.
3f50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
3f70: 20 53 42 53 54 54 5f 45 4f 46 3a 20 7b 0a 20 20 SBSTT_EOF: {.
3f80: 20 20 20 20 20 20 6e 53 63 72 69 70 74 20 3d 20 nScript =
3f90: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 0;. break
3fa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
3fb0: 63 61 73 65 20 53 42 53 54 54 5f 49 4e 43 4f 4d case SBSTT_INCOM
3fc0: 50 4c 45 54 45 3a 0a 20 20 20 20 20 20 63 61 73 PLETE:. cas
3fd0: 65 20 53 42 53 54 54 5f 55 4e 4b 4e 4f 57 4e 3a e SBSTT_UNKNOWN:
3fe0: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 {. rc =
3ff0: 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 SBS_ERROR;.
4000: 20 20 20 6e 53 63 72 69 70 74 20 3d 20 6e 3b 0a nScript = n;.
4010: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
4020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 }. cas
4030: 65 20 53 42 53 54 54 5f 49 4e 54 45 47 45 52 3a e SBSTT_INTEGER:
4040: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 {. rc =
4050: 53 62 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 SbS_Push(p, (cha
4060: 72 2a 29 7a 53 63 72 69 70 74 2c 20 6e 2c 20 30 r*)zScript, n, 0
4070: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b );. break
4080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
4090: 63 61 73 65 20 53 42 53 54 54 5f 4e 41 4d 45 3a case SBSTT_NAME:
40a0: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 {. rc =
40b0: 53 62 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 SbS_Push(p, (cha
40c0: 72 2a 29 26 7a 53 63 72 69 70 74 5b 31 5d 2c 20 r*)&zScript[1],
40d0: 6e 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 n-1, 0);.
40e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
40f0: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54 case SBSTT
4100: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 _STRING: {.
4110: 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 rc = SbS_Push
4120: 28 70 2c 20 28 63 68 61 72 2a 29 26 7a 53 63 72 (p, (char*)&zScr
4130: 69 70 74 5b 31 5d 2c 20 6e 2d 32 2c 20 30 29 3b ipt[1], n-2, 0);
4140: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
4150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 }. ca
4160: 73 65 20 53 42 53 54 54 5f 56 45 52 42 3a 20 7b se SBSTT_VERB: {
4170: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 53 . const S
4180: 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 bSValue *pVal =
4190: 73 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 sbs_fetch(&p->sy
41a0: 6d 54 61 62 2c 20 28 63 68 61 72 2a 29 7a 53 63 mTab, (char*)zSc
41b0: 72 69 70 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 ript, n);.
41c0: 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b if( pVal==0 ){
41d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75 . int u
41e0: 70 72 20 3d 20 73 69 7a 65 6f 66 28 61 42 75 69 pr = sizeof(aBui
41f0: 6c 74 69 6e 29 2f 73 69 7a 65 6f 66 28 61 42 75 ltin)/sizeof(aBu
4200: 69 6c 74 69 6e 5b 30 5d 29 20 2d 20 31 3b 0a 20 iltin[0]) - 1;.
4210: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6c 77 72 int lwr
4220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 = 0;.
4230: 72 63 20 3d 20 53 42 53 5f 45 52 52 4f 52 3b 0a rc = SBS_ERROR;.
4240: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 while(
4250: 20 75 70 72 3e 3d 6c 77 72 20 29 7b 0a 20 20 20 upr>=lwr ){.
4260: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d int i =
4270: 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 (upr+lwr)/2;.
4280: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 20 int c
4290: 3d 20 73 74 72 6e 63 6d 70 28 7a 53 63 72 69 70 = strncmp(zScrip
42a0: 74 2c 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 7a t, aBuiltin[i].z
42b0: 43 6d 64 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 Cmd, n);.
42c0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b if( c==0 ){
42d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 . r
42e0: 63 20 3d 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e c = aBuiltin[i].
42f0: 78 43 6d 64 28 70 2c 20 30 29 3b 0a 20 20 20 20 xCmd(p, 0);.
4300: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
4310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c . }el
4320: 73 65 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 se if( c<0 ){.
4330: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 72 20 upr
4340: 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 = i-1;.
4350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
4360: 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 2b lwr = i+
4370: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 1;. }
4380: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
4390: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 }else if( p
43a0: 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42 53 Val->flags & SBS
43b0: 56 41 4c 5f 56 45 52 42 20 29 7b 0a 20 20 20 20 VAL_VERB ){.
43c0: 20 20 20 20 20 20 72 63 20 3d 20 70 56 61 6c 2d rc = pVal-
43d0: 3e 75 2e 76 65 72 62 2e 78 56 65 72 62 28 70 2c >u.verb.xVerb(p,
43e0: 20 70 56 61 6c 2d 3e 75 2e 76 65 72 62 2e 70 41 pVal->u.verb.pA
43f0: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c rg);. }el
4400: 73 65 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 se if( pVal->fla
4410: 67 73 20 26 20 53 42 53 56 41 4c 5f 45 58 45 43 gs & SBSVAL_EXEC
4420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 ){. rc
4430: 20 3d 20 53 62 53 5f 45 76 61 6c 28 70 2c 20 70 = SbS_Eval(p, p
4440: 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a 2c 20 70 56 Val->u.str.z, pV
4450: 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 29 3b al->u.str.size);
4460: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
4470: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 rc = S
4480: 62 53 5f 50 75 73 68 28 70 2c 20 70 56 61 6c 2d bS_Push(p, pVal-
4490: 3e 75 2e 73 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e >u.str.z, pVal->
44a0: 75 2e 73 74 72 2e 73 69 7a 65 2c 20 30 29 3b 0a u.str.size, 0);.
44b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
44c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
44d0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 63 72 69 . }. zScri
44e0: 70 74 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 63 pt += n;. nSc
44f0: 72 69 70 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 ript -= n;. }.
4500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
4510: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 *.** COMMAND: te
4520: 73 74 2d 73 75 62 73 63 72 69 70 74 0a 2a 2f 0a st-subscript.*/.
4530: 76 6f 69 64 20 74 65 73 74 5f 73 75 62 73 63 72 void test_subscr
4540: 69 70 74 28 76 6f 69 64 29 7b 0a 20 20 53 75 62 ipt(void){. Sub
4550: 73 63 72 69 70 74 20 2a 70 3b 0a 20 20 69 66 28 script *p;. if(
4560: 20 67 2e 61 72 67 63 3c 33 20 29 7b 0a 20 20 20 g.argc<3 ){.
4570: 20 75 73 61 67 65 28 22 53 43 52 49 50 54 22 29 usage("SCRIPT")
4580: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 53 62 53 5f ;. }. p = SbS_
4590: 43 72 65 61 74 65 28 29 3b 0a 20 20 53 62 53 5f Create();. SbS_
45a0: 45 76 61 6c 28 70 2c 20 67 2e 61 72 67 76 5b 32 Eval(p, g.argv[2
45b0: 5d 2c 20 73 74 72 6c 65 6e 28 67 2e 61 72 67 76 ], strlen(g.argv
45c0: 5b 32 5d 29 29 3b 0a 7d 0a [2]));.}.