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