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 31 5d 3b 20 20 char zKey[1];
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 53 74 6f 72 );.}../*.** Stor
2800: 65 20 61 20 76 61 6c 75 65 20 69 6e 20 61 6e 20 e a value in an
2810: 69 6e 74 65 72 70 72 65 74 65 72 20 76 61 72 69 interpreter vari
2820: 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 able..*/.int SbS
2830: 5f 53 74 6f 72 65 28 0a 20 20 73 74 72 75 63 74 _Store(. struct
2840: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 20 Subscript *p,
2850: 20 2f 2a 20 53 74 6f 72 65 20 69 6e 74 6f 20 74 /* Store into t
2860: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 his interpreter
2870: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
2880: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e *zName, /* N
2890: 61 6d 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 ame of the varia
28a0: 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 ble */. const c
28b0: 68 61 72 20 2a 7a 56 61 6c 75 65 2c 20 20 20 20 har *zValue,
28c0: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 /* Value of the
28d0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e variable */. in
28e0: 74 20 70 65 72 73 69 73 74 65 6e 63 65 20 20 20 t persistence
28f0: 20 20 20 20 20 2f 2a 20 30 3a 20 73 74 61 74 69 /* 0: stati
2900: 63 2e 20 20 31 3a 20 65 70 68 65 6d 65 72 61 6c c. 1: ephemeral
2910: 2e 20 20 32 3a 20 64 79 6e 61 6d 69 63 20 2a 2f . 2: dynamic */
2920: 0a 29 7b 0a 20 20 53 62 53 56 61 6c 75 65 20 76 .){. SbSValue v
2930: 3b 0a 20 20 76 2e 66 6c 61 67 73 20 3d 20 53 42 ;. v.flags = SB
2940: 53 56 41 4c 5f 53 54 52 3b 0a 20 20 76 2e 75 2e SVAL_STR;. v.u.
2950: 73 74 72 2e 73 69 7a 65 20 3d 20 73 74 72 6c 65 str.size = strle
2960: 6e 28 7a 56 61 6c 75 65 29 3b 0a 20 20 69 66 28 n(zValue);. if(
2970: 20 70 65 72 73 69 73 74 65 6e 63 65 3d 3d 31 20 persistence==1
2980: 29 7b 0a 20 20 20 20 76 2e 75 2e 73 74 72 2e 7a ){. v.u.str.z
2990: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c = mprintf("%s",
29a0: 20 7a 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 zValue);. }els
29b0: 65 7b 0a 20 20 20 20 76 2e 75 2e 73 74 72 2e 7a e{. v.u.str.z
29c0: 20 3d 20 28 63 68 61 72 2a 29 7a 56 61 6c 75 65 = (char*)zValue
29d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 65 72 73 ;. }. if( pers
29e0: 69 73 74 65 6e 63 65 3e 30 20 29 7b 0a 20 20 20 istence>0 ){.
29f0: 20 76 2e 66 6c 61 67 73 20 7c 3d 20 53 42 53 56 v.flags |= SBSV
2a00: 41 4c 5f 44 59 4e 3b 0a 20 20 7d 0a 20 20 72 65 AL_DYN;. }. re
2a10: 74 75 72 6e 20 73 62 73 5f 73 74 6f 72 65 28 26 turn sbs_store(&
2a20: 70 2d 3e 73 79 6d 54 61 62 2c 20 7a 4e 61 6d 65 p->symTab, zName
2a30: 2c 20 2d 31 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a , -1, &v);.}../*
2a40: 0a 2a 2a 20 50 75 73 68 20 61 20 73 74 72 69 6e .** Push a strin
2a50: 67 20 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 g value onto the
2a60: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 stack..**.** If
2a70: 20 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 the 4th paramet
2a80: 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 er is 0, then th
2a90: 65 20 73 74 72 69 6e 67 20 69 73 20 73 74 61 74 e string is stat
2aa0: 69 63 2e 0a 2a 2a 20 49 66 20 74 68 65 20 34 74 ic..** If the 4t
2ab0: 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e h parameter is n
2ac0: 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 65 on-zero then the
2ad0: 20 73 74 72 69 6e 67 20 77 61 73 20 6f 62 74 61 string was obta
2ae0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c ined.** from mal
2af0: 6c 6f 63 20 61 6e 64 20 53 75 62 73 63 72 69 70 loc and Subscrip
2b00: 74 20 77 69 6c 6c 20 74 61 6b 65 20 72 65 73 70 t will take resp
2b10: 6f 6e 73 69 62 69 6c 69 74 79 20 66 6f 72 20 66 onsibility for f
2b20: 72 65 65 69 6e 67 0a 2a 2a 20 69 74 2e 0a 2a 2a reeing.** it..**
2b30: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 .** Return 0 on
2b40: 73 75 63 63 65 73 73 20 61 6e 64 20 6e 6f 6e 2d success and non-
2b50: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 69 73 zero if there is
2b60: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e an error..*/.in
2b70: 74 20 53 62 53 5f 50 75 73 68 28 0a 20 20 73 74 t SbS_Push(. st
2b80: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a ruct Subscript *
2b90: 70 2c 20 20 2f 2a 20 50 75 73 68 20 6f 6e 74 6f p, /* Push onto
2ba0: 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 this interprete
2bb0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c 20 r */. char *z,
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2bd0: 53 74 72 69 6e 67 20 76 61 6c 75 65 20 74 6f 20 String value to
2be0: 70 75 73 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c push */. int n,
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c00: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 /* Length of the
2c10: 20 73 74 72 69 6e 67 2c 20 6f 72 20 2d 31 20 2a string, or -1 *
2c20: 2f 0a 20 20 69 6e 74 20 64 79 6e 20 20 20 20 20 /. int dyn
2c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 /* If
2c40: 74 72 75 65 2c 20 7a 20 77 61 73 20 6f 62 74 61 true, z was obta
2c50: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 ined from malloc
2c60: 20 2a 2f 0a 29 7b 0a 20 20 53 62 53 56 61 6c 75 */.){. SbSValu
2c70: 65 20 76 3b 0a 20 20 76 2e 66 6c 61 67 73 20 3d e v;. v.flags =
2c80: 20 53 42 53 56 41 4c 5f 53 54 52 3b 0a 20 20 69 SBSVAL_STR;. i
2c90: 66 28 20 64 79 6e 20 29 7b 0a 20 20 20 20 76 2e f( dyn ){. v.
2ca0: 66 6c 61 67 73 20 7c 3d 20 53 42 53 56 41 4c 5f flags |= SBSVAL_
2cb0: 44 59 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e DYN;. }. if( n
2cc0: 3c 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 <0 ) n = strlen(
2cd0: 7a 29 3b 0a 20 20 76 2e 75 2e 73 74 72 2e 73 69 z);. v.u.str.si
2ce0: 7a 65 20 3d 20 6e 3b 0a 20 20 76 2e 75 2e 73 74 ze = n;. v.u.st
2cf0: 72 2e 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72 r.z = z;. retur
2d00: 6e 20 73 62 73 5f 70 75 73 68 28 70 2c 20 26 76 n sbs_push(p, &v
2d10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 );.}../*.** Push
2d20: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 an integer valu
2d30: 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b e onto the stack
2d40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ..**.** This rou
2d50: 74 69 6e 65 20 72 65 61 6c 6c 79 20 6a 75 73 74 tine really just
2d60: 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 69 6e converts the in
2d70: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 teger into a str
2d80: 69 6e 67 0a 2a 2a 20 74 68 65 6e 20 63 61 6c 6c ing.** then call
2d90: 73 20 53 62 53 5f 50 75 73 68 2e 0a 2a 2f 0a 69 s SbS_Push..*/.i
2da0: 6e 74 20 53 62 53 5f 50 75 73 68 49 6e 74 28 73 nt SbS_PushInt(s
2db0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
2dc0: 2a 70 2c 20 69 6e 74 20 69 56 61 6c 29 7b 0a 20 *p, int iVal){.
2dd0: 20 69 66 28 20 69 56 61 6c 3d 3d 30 20 29 7b 0a if( iVal==0 ){.
2de0: 20 20 20 20 72 65 74 75 72 6e 20 53 62 53 5f 50 return SbS_P
2df0: 75 73 68 28 70 2c 20 22 30 22 2c 20 31 2c 20 30 ush(p, "0", 1, 0
2e00: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 );. }else if( i
2e10: 56 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 72 65 Val==1 ){. re
2e20: 74 75 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c turn SbS_Push(p,
2e30: 20 22 31 22 2c 20 31 2c 20 30 29 3b 0a 20 20 7d "1", 1, 0);. }
2e40: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a else{. char *
2e50: 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 z;. int n;.
2e60: 20 20 63 68 61 72 20 7a 56 61 6c 5b 35 30 5d 3b char zVal[50];
2e70: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 56 61 . sprintf(zVa
2e80: 6c 2c 20 22 25 64 22 2c 20 69 56 61 6c 29 3b 0a l, "%d", iVal);.
2e90: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a n = strlen(z
2ea0: 56 61 6c 29 3b 0a 20 20 20 20 7a 20 3d 20 6d 61 Val);. z = ma
2eb0: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 20 lloc( n+1 );.
2ec0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 if( z ){.
2ed0: 73 74 72 63 70 79 28 7a 2c 20 7a 56 61 6c 29 3b strcpy(z, zVal);
2ee0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 62 . return Sb
2ef0: 53 5f 50 75 73 68 28 70 2c 20 7a 2c 20 6e 2c 20 S_Push(p, z, n,
2f00: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 1);. }else{.
2f10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f return SBS_
2f20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d ERROR;. }. }
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 61 6e .}../*.** Pop an
2f40: 64 20 64 65 73 74 72 6f 79 20 7a 65 72 6f 20 6f d destroy zero o
2f50: 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 20 66 72 r more values fr
2f60: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a om the stack..**
2f70: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 Return the numb
2f80: 65 72 20 6f 66 20 76 61 6c 75 65 73 20 72 65 6d er of values rem
2f90: 61 69 6e 69 6e 67 20 6f 6e 20 74 68 65 20 73 74 aining on the st
2fa0: 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 ack after.** the
2fb0: 20 70 6f 70 73 20 6f 63 63 75 72 2e 0a 2a 2f 0a pops occur..*/.
2fc0: 69 6e 74 20 53 62 53 5f 50 6f 70 28 73 74 72 75 int SbS_Pop(stru
2fd0: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c ct Subscript *p,
2fe0: 20 69 6e 74 20 4e 29 7b 0a 20 20 77 68 69 6c 65 int N){. while
2ff0: 28 20 4e 3e 30 20 26 26 20 70 2d 3e 6e 53 74 61 ( N>0 && p->nSta
3000: 63 6b 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e ck>0 ){. p->n
3010: 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 73 62 73 Stack--;. sbs
3020: 5f 76 61 6c 75 65 5f 72 65 73 65 74 28 26 70 2d _value_reset(&p-
3030: 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 >aStack[p->nStac
3040: 6b 5d 29 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 k]);. N--;.
3050: 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 53 }. return p->nS
3060: 74 61 63 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 tack;.}../*.** R
3070: 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 65 eturn the N-th e
3080: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 74 lement of the st
3090: 61 63 6b 2e 20 20 30 20 69 73 20 74 68 65 20 74 ack. 0 is the t
30a0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e op of the stack.
30b0: 0a 2a 2a 20 31 20 69 73 20 74 68 65 20 66 69 72 .** 1 is the fir
30c0: 73 74 20 65 6c 65 6d 65 6e 74 20 64 6f 77 6e 2e st element down.
30d0: 20 20 32 20 69 73 20 74 68 65 20 73 65 63 6f 6e 2 is the secon
30e0: 64 20 65 6c 65 6d 65 6e 74 2e 20 20 41 6e 64 20 d element. And
30f0: 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 52 65 74 so forth..** Ret
3100: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 urn NULL if ther
3110: 65 20 69 73 20 6e 6f 20 4e 2d 74 68 20 65 6c 65 e is no N-th ele
3120: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 ment..**.** The
3130: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 pointer returned
3140: 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 is only valid u
3150: 6e 74 69 6c 20 74 68 65 20 76 61 6c 75 65 20 69 ntil the value i
3160: 73 20 70 6f 70 70 65 64 0a 2a 2a 20 66 72 6f 6d s popped.** from
3170: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 63 the stack..*/.c
3180: 6f 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 53 onst char *SbS_S
3190: 74 61 63 6b 56 61 6c 75 65 28 73 74 72 75 63 74 tackValue(struct
31a0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 69 Subscript *p, i
31b0: 6e 74 20 4e 2c 20 69 6e 74 20 2a 70 53 69 7a 65 nt N, int *pSize
31c0: 29 7b 0a 20 20 53 62 53 56 61 6c 75 65 20 2a 70 ){. SbSValue *p
31d0: 56 61 6c 3b 0a 20 20 69 66 28 20 4e 3c 30 20 7c Val;. if( N<0 |
31e0: 7c 20 4e 3e 3d 70 2d 3e 6e 53 74 61 63 6b 20 29 | N>=p->nStack )
31f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
3200: 20 20 7d 0a 20 20 70 56 61 6c 20 3d 20 26 70 2d }. pVal = &p-
3210: 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 74 61 63 >aStack[p->nStac
3220: 6b 2d 4e 2d 31 5d 3b 0a 20 20 69 66 28 20 28 70 k-N-1];. if( (p
3230: 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42 53 Val->flags & SBS
3240: 56 41 4c 5f 53 54 52 29 3d 3d 30 20 29 7b 0a 20 VAL_STR)==0 ){.
3250: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
3260: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 56 61 6c . *pSize = pVal
3270: 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 ->u.str.size;.
3280: 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 75 2e 73 return pVal->u.s
3290: 74 72 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 tr.z;.}../*.** A
32a0: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 convenience rou
32b0: 74 69 6e 65 20 66 6f 72 20 65 78 74 72 61 63 74 tine for extract
32c0: 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 ing an integer v
32d0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 2a 2a alue from the.**
32e0: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 53 stack..*/.int S
32f0: 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 bS_StackValueInt
3300: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 (struct Subscrip
3310: 74 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 t *p, int N){.
3320: 69 6e 74 20 6e 2c 20 76 3b 0a 20 20 69 6e 74 20 int n, v;. int
3330: 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 63 6f 6e isNeg = 0;. con
3340: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 53 62 53 st char *z = SbS
3350: 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 4e _StackValue(p, N
3360: 2c 20 26 6e 29 3b 0a 20 20 76 20 3d 20 30 3b 0a , &n);. v = 0;.
3370: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 if( n==0 ) ret
3380: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 5b 30 urn 0;. if( z[0
3390: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 ]=='-' ){. is
33a0: 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 2b 2b Neg = 1;. z++
33b0: 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 65 6c ;. n--;. }el
33c0: 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2b 27 se if( z[0]=='+'
33d0: 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 ){. z++;.
33e0: 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c n--;. }. whil
33f0: 65 28 20 6e 3e 30 20 26 26 20 69 73 64 69 67 69 e( n>0 && isdigi
3400: 74 28 7a 5b 30 5d 29 20 29 7b 0a 20 20 20 20 76 t(z[0]) ){. v
3410: 20 3d 20 76 2a 31 30 20 2b 20 7a 5b 30 5d 20 2d = v*10 + z[0] -
3420: 20 27 30 27 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 '0';. z++;.
3430: 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 n--;. }. if
3440: 28 20 69 73 4e 65 67 20 29 7b 0a 20 20 20 20 76 ( isNeg ){. v
3450: 20 3d 20 2d 76 3b 0a 20 20 7d 0a 20 20 72 65 74 = -v;. }. ret
3460: 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 urn v;.}../*.**
3470: 52 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c Retrieve the val
3480: 75 65 20 6f 66 20 61 20 76 61 72 69 61 62 6c 65 ue of a variable
3490: 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 from the interp
34a0: 72 65 74 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a reter. Return.*
34b0: 2a 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 73 75 63 * NULL if no suc
34c0: 68 20 76 61 72 69 61 62 6c 65 20 69 73 20 64 65 h variable is de
34d0: 66 69 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 fined. .**.** T
34e0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 he returned stri
34f0: 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 ng is not necess
3500: 61 72 69 6c 79 20 28 70 72 6f 62 61 62 6c 79 20 arily (probably
3510: 6e 6f 74 29 20 7a 65 72 6f 2d 74 65 72 6d 69 6e not) zero-termin
3520: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 74 72 ated..** The str
3530: 69 6e 67 20 6d 61 79 20 62 65 20 64 65 61 6c 6c ing may be deall
3540: 6f 63 61 74 65 64 20 74 68 65 20 6e 65 78 74 20 ocated the next
3550: 74 69 6d 65 20 61 6e 79 74 68 69 6e 67 20 69 73 time anything is
3560: 20 64 6f 6e 65 20 74 6f 0a 2a 2a 20 74 68 65 20 done to.** the
3570: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 4d 61 interpreter. Ma
3580: 6b 65 20 61 20 63 6f 70 79 20 69 66 20 79 6f 75 ke a copy if you
3590: 20 6e 65 65 64 20 69 74 20 74 6f 20 70 65 72 73 need it to pers
35a0: 69 73 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 ist..*/.const ch
35b0: 61 72 20 2a 53 62 53 5f 46 65 74 63 68 28 0a 20 ar *SbS_Fetch(.
35c0: 20 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 struct Subscrip
35d0: 74 20 2a 70 2c 20 20 20 2f 2a 20 54 68 65 20 69 t *p, /* The i
35e0: 6e 74 65 72 70 72 65 74 65 72 20 77 65 20 61 72 nterpreter we ar
35f0: 65 20 69 6e 74 65 72 72 6f 67 61 74 69 6e 67 20 e interrogating
3600: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
3610: 2a 7a 4b 65 79 2c 20 20 20 20 20 20 20 20 2f 2a *zKey, /*
3620: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 61 72 Name of the var
3630: 69 61 62 6c 65 2e 20 20 43 61 73 65 20 73 65 6e iable. Case sen
3640: 73 69 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 sitive */. int
3650: 2a 70 4c 65 6e 67 74 68 20 20 20 20 20 20 20 20 *pLength
3660: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 /* Write th
3670: 65 20 6c 65 6e 67 74 68 20 68 65 72 65 20 2a 2f e length here */
3680: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 53 62 53 56 .){. const SbSV
3690: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 0a 20 20 70 alue *pVal;.. p
36a0: 56 61 6c 20 3d 20 73 62 73 5f 66 65 74 63 68 28 Val = sbs_fetch(
36b0: 26 70 2d 3e 73 79 6d 54 61 62 2c 20 7a 4b 65 79 &p->symTab, zKey
36c0: 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 70 56 61 , -1);. if( pVa
36d0: 6c 3d 3d 30 20 7c 7c 20 28 70 56 61 6c 2d 3e 66 l==0 || (pVal->f
36e0: 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f 53 54 lags & SBSVAL_ST
36f0: 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 4c R)==0 ){. *pL
3700: 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20 20 72 ength = 0;. r
3710: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 eturn 0;. }else
3720: 7b 0a 20 20 20 20 2a 70 4c 65 6e 67 74 68 20 3d {. *pLength =
3730: 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a pVal->u.str.siz
3740: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 e;. return pV
3750: 61 6c 2d 3e 75 2e 73 74 72 2e 7a 3b 0a 20 20 7d al->u.str.z;. }
3760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 .}../*.** Genera
3770: 74 65 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 te an error and
3780: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 return non-zero
3790: 69 66 20 74 68 65 20 73 74 61 63 6b 20 68 61 73 if the stack has
37a0: 0a 2a 2a 20 66 65 77 65 72 20 74 68 61 6e 20 4e .** fewer than N
37b0: 20 65 6c 65 6d 65 6e 74 73 2e 20 20 54 68 69 73 elements. This
37c0: 20 69 73 20 75 74 69 6c 69 74 79 20 72 6f 75 74 is utility rout
37d0: 69 6e 65 20 75 73 65 64 20 69 6e 0a 2a 2a 20 74 ine used in.** t
37e0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f he implementatio
37f0: 6e 20 6f 66 20 76 65 72 62 73 2e 0a 2a 2f 0a 69 n of verbs..*/.i
3800: 6e 74 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 nt SbS_RequireSt
3810: 61 63 6b 28 73 74 72 75 63 74 20 53 75 62 73 63 ack(struct Subsc
3820: 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 ript *p, int N,
3830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 const char *zCmd
3840: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 53 74 61 ){. if( p->nSta
3850: 63 6b 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 30 ck>=N ) return 0
3860: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 ;. sqlite3_snpr
3870: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a intf(sizeof(p->z
3880: 45 72 72 4d 73 67 29 2c 20 70 2d 3e 7a 45 72 72 ErrMsg), p->zErr
3890: 4d 73 67 2c 0a 20 20 20 20 20 22 5c 22 25 73 5c Msg,. "\"%s\
38a0: 22 20 72 65 71 75 69 72 65 73 20 61 74 20 6c 65 " requires at le
38b0: 61 73 74 20 25 64 20 73 74 61 63 6b 20 65 6c 65 ast %d stack ele
38c0: 6d 65 6e 74 73 20 2d 20 6f 6e 6c 79 20 66 6f 75 ments - only fou
38d0: 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 7a 43 6d nd %d",. zCm
38e0: 64 2c 20 4e 2c 20 70 2d 3e 6e 53 74 61 63 6b 29 d, N, p->nStack)
38f0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a ;. return 1;.}.
3900: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 ./*.** Subscript
3910: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 20 command:
3920: 53 54 52 49 4e 47 20 4e 41 4d 45 20 73 65 74 0a STRING NAME set.
3930: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 **.** Write the
3940: 76 61 6c 75 65 20 6f 66 20 53 54 52 49 4e 47 20 value of STRING
3950: 69 6e 74 6f 20 76 61 72 69 61 62 6c 65 20 63 61 into variable ca
3960: 6c 6c 65 64 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 lled NAME..*/.st
3970: 61 74 69 63 20 69 6e 74 20 73 65 74 43 6d 64 28 atic int setCmd(
3980: 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f Subscript *p, vo
3990: 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 id *pNotUsed){.
39a0: 20 53 62 53 56 61 6c 75 65 20 2a 70 54 6f 73 3b SbSValue *pTos;
39b0: 0a 20 20 53 62 53 56 61 6c 75 65 20 2a 70 4e 6f . SbSValue *pNo
39c0: 73 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 s;. if( SbS_Req
39d0: 75 69 72 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 uireStack(p, 2,
39e0: 22 73 65 74 22 29 20 29 20 72 65 74 75 72 6e 20 "set") ) return
39f0: 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 70 54 6f SBS_ERROR;. pTo
3a00: 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d s = &p->aStack[-
3a10: 2d 70 2d 3e 6e 53 74 61 63 6b 5d 3b 0a 20 20 70 -p->nStack];. p
3a20: 4e 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b Nos = &p->aStack
3a30: 5b 2d 2d 70 2d 3e 6e 53 74 61 63 6b 5d 3b 0a 20 [--p->nStack];.
3a40: 20 73 62 73 5f 73 74 6f 72 65 28 26 70 2d 3e 73 sbs_store(&p->s
3a50: 79 6d 54 61 62 2c 20 70 54 6f 73 2d 3e 75 2e 73 ymTab, pTos->u.s
3a60: 74 72 2e 7a 2c 20 70 54 6f 73 2d 3e 75 2e 73 74 tr.z, pTos->u.st
3a70: 72 2e 73 69 7a 65 2c 20 70 4e 6f 73 29 3b 0a 20 r.size, pNos);.
3a80: 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65 74 sbs_value_reset
3a90: 28 70 54 6f 73 29 3b 0a 20 20 72 65 74 75 72 6e (pTos);. return
3aa0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 0;.}../*.** Sub
3ab0: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 script command:
3ac0: 20 20 20 20 20 49 4e 54 45 47 45 52 20 6e 6f 74 INTEGER not
3ad0: 20 49 4e 54 45 47 45 52 0a 2a 2f 0a 73 74 61 74 INTEGER.*/.stat
3ae0: 69 63 20 69 6e 74 20 6e 6f 74 43 6d 64 28 73 74 ic int notCmd(st
3af0: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a ruct Subscript *
3b00: 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 p, void *pNotUse
3b10: 64 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 d){. int n;. i
3b20: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 f( SbS_RequireSt
3b30: 61 63 6b 28 70 2c 20 31 2c 20 22 6e 6f 74 22 29 ack(p, 1, "not")
3b40: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e ) return 1;. n
3b50: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 = SbS_StackValu
3b60: 65 49 6e 74 28 70 2c 20 30 29 3b 0a 20 20 53 62 eInt(p, 0);. Sb
3b70: 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 S_Pop(p, 1);. S
3b80: 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 21 6e bS_PushInt(p, !n
3b90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d );. return 0;.}
3ba0: 0a 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f ..#define SBSOP_
3bb0: 41 44 44 20 20 20 31 0a 23 64 65 66 69 6e 65 20 ADD 1.#define
3bc0: 53 42 53 4f 50 5f 53 55 42 20 20 20 32 0a 23 64 SBSOP_SUB 2.#d
3bd0: 65 66 69 6e 65 20 53 42 53 4f 50 5f 4d 55 4c 20 efine SBSOP_MUL
3be0: 20 20 33 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 3.#define SBSO
3bf0: 50 5f 44 49 56 20 20 20 34 0a 23 64 65 66 69 6e P_DIV 4.#defin
3c00: 65 20 53 42 53 4f 50 5f 41 4e 44 20 20 20 35 0a e SBSOP_AND 5.
3c10: 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 4f 52 #define SBSOP_OR
3c20: 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 53 42 6.#define SB
3c30: 53 4f 50 5f 4d 49 4e 20 20 20 37 0a 23 64 65 66 SOP_MIN 7.#def
3c40: 69 6e 65 20 53 42 53 4f 50 5f 4d 41 58 20 20 20 ine SBSOP_MAX
3c50: 38 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 8../*.** Subscri
3c60: 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 pt command:
3c70: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 INTEGER INTEGER
3c80: 20 3c 62 69 6e 61 72 79 2d 6f 70 3e 20 49 4e 54 <binary-op> INT
3c90: 45 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 EGER.*/.static i
3ca0: 6e 74 20 62 6f 70 43 6d 64 28 73 74 72 75 63 74 nt bopCmd(struct
3cb0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 Subscript *p, v
3cc0: 6f 69 64 20 2a 70 4f 70 29 7b 0a 20 20 69 6e 74 oid *pOp){. int
3cd0: 20 61 2c 20 62 2c 20 63 3b 0a 20 20 69 66 28 20 a, b, c;. if(
3ce0: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b SbS_RequireStack
3cf0: 28 70 2c 20 32 2c 20 22 42 49 4e 41 52 59 2d 4f (p, 2, "BINARY-O
3d00: 50 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a P") ) return 1;.
3d10: 20 20 61 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 a = SbS_StackV
3d20: 61 6c 75 65 49 6e 74 28 70 2c 20 30 29 3b 0a 20 alueInt(p, 0);.
3d30: 20 62 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 b = SbS_StackVa
3d40: 6c 75 65 49 6e 74 28 70 2c 20 31 29 3b 0a 20 20 lueInt(p, 1);.
3d50: 73 77 69 74 63 68 28 20 28 69 6e 74 29 70 4f 70 switch( (int)pOp
3d60: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 42 53 ){. case SBS
3d70: 4f 50 5f 41 44 44 3a 20 20 63 20 3d 20 61 2b 62 OP_ADD: c = a+b
3d80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 ; bre
3d90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 ak;. case SBS
3da0: 4f 50 5f 53 55 42 3a 20 20 63 20 3d 20 61 2d 62 OP_SUB: c = a-b
3db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 ; bre
3dc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 ak;. case SBS
3dd0: 4f 50 5f 4d 55 4c 3a 20 20 63 20 3d 20 61 2a 62 OP_MUL: c = a*b
3de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 ; bre
3df0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 ak;. case SBS
3e00: 4f 50 5f 44 49 56 3a 20 20 63 20 3d 20 62 21 3d OP_DIV: c = b!=
3e10: 30 20 3f 20 61 2f 62 20 3a 20 30 3b 20 62 72 65 0 ? a/b : 0; bre
3e20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 ak;. case SBS
3e30: 4f 50 5f 41 4e 44 3a 20 20 63 20 3d 20 61 20 26 OP_AND: c = a &
3e40: 26 20 62 3b 20 20 20 20 20 20 20 20 20 62 72 65 & b; bre
3e50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 ak;. case SBS
3e60: 4f 50 5f 4f 52 3a 20 20 20 63 20 3d 20 61 20 7c OP_OR: c = a |
3e70: 7c 20 62 3b 20 20 20 20 20 20 20 20 20 62 72 65 | b; bre
3e80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 ak;. case SBS
3e90: 4f 50 5f 4d 49 4e 3a 20 20 63 20 3d 20 61 3c 62 OP_MIN: c = a<b
3ea0: 20 3f 20 61 20 3a 20 62 3b 20 20 20 20 62 72 65 ? a : b; bre
3eb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 ak;. case SBS
3ec0: 4f 50 5f 4d 41 58 3a 20 20 63 20 3d 20 61 3c 62 OP_MAX: c = a<b
3ed0: 20 3f 20 62 20 3a 20 61 3b 20 20 20 20 62 72 65 ? b : a; bre
3ee0: 61 6b 3b 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f ak;. }. SbS_Po
3ef0: 70 28 70 2c 20 32 29 3b 0a 20 20 53 62 53 5f 50 p(p, 2);. SbS_P
3f00: 75 73 68 49 6e 74 28 70 2c 20 63 29 3b 0a 20 20 ushInt(p, c);.
3f10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
3f20: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d ** Subscript com
3f30: 6d 61 6e 64 3a 20 20 20 20 20 53 54 52 49 4e 47 mand: STRING
3f40: 20 68 61 73 63 61 70 20 49 4e 54 45 47 45 52 0a hascap INTEGER.
3f50: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 **.** Return tru
3f60: 65 20 69 66 20 74 68 65 20 75 73 65 72 20 68 61 e if the user ha
3f70: 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 61 70 s all of the cap
3f80: 61 62 69 6c 69 74 69 65 73 20 6c 69 73 74 65 64 abilities listed
3f90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
3fa0: 68 61 73 63 61 70 43 6d 64 28 73 74 72 75 63 74 hascapCmd(struct
3fb0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 Subscript *p, v
3fc0: 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a oid *pNotUsed){.
3fd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b const char *z;
3fe0: 0a 20 20 69 6e 74 20 6e 2c 20 61 3b 0a 20 20 69 . int n, a;. i
3ff0: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 f( SbS_RequireSt
4000: 61 63 6b 28 70 2c 20 31 2c 20 22 68 61 73 63 61 ack(p, 1, "hasca
4010: 70 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a p") ) return 1;.
4020: 20 20 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 z = SbS_StackV
4030: 61 6c 75 65 28 70 2c 20 30 2c 20 26 6e 29 3b 0a alue(p, 0, &n);.
4040: 20 20 61 20 3d 20 6c 6f 67 69 6e 5f 68 61 73 5f a = login_has_
4050: 63 61 70 61 62 69 6c 69 74 79 28 7a 2c 20 6e 29 capability(z, n)
4060: 3b 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 ;. SbS_Pop(p, 1
4070: 29 3b 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 );. SbS_PushInt
4080: 28 70 2c 20 61 29 3b 0a 20 20 72 65 74 75 72 6e (p, a);. return
4090: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 0;.}../*.** Sub
40a0: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 script command:
40b0: 20 20 20 20 53 54 52 49 4e 47 20 6c 69 6e 65 63 STRING linec
40c0: 6f 75 6e 74 20 49 4e 54 45 47 45 52 0a 2a 2a 0a ount INTEGER.**.
40d0: 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6d 6f ** Return one mo
40e0: 72 65 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 re than the numb
40f0: 65 72 20 6f 66 20 5c 6e 20 63 68 61 72 61 63 74 er of \n charact
4100: 65 72 73 20 69 6e 20 53 54 52 49 4e 47 2e 0a 2a ers in STRING..*
4110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e /.static int lin
4120: 65 63 6e 74 43 6d 64 28 73 74 72 75 63 74 20 53 ecntCmd(struct S
4130: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 ubscript *p, voi
4140: 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 d *pNotUsed){.
4150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 const char *z;.
4160: 20 69 6e 74 20 73 69 7a 65 2c 20 6e 2c 20 69 3b int size, n, i;
4170: 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 . if( SbS_Requi
4180: 72 65 53 74 61 63 6b 28 70 2c 20 31 2c 20 22 6c reStack(p, 1, "l
4190: 69 6e 65 63 6f 75 6e 74 22 29 20 29 20 72 65 74 inecount") ) ret
41a0: 75 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 53 62 53 urn 1;. z = SbS
41b0: 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 30 _StackValue(p, 0
41c0: 2c 20 26 73 69 7a 65 29 3b 0a 20 20 66 6f 72 28 , &size);. for(
41d0: 6e 3d 31 2c 20 69 3d 30 3b 20 69 3c 73 69 7a 65 n=1, i=0; i<size
41e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 ; i++){. if(
41f0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 2b 2b z[i]=='\n' ) n++
4200: 3b 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70 28 ;. }. SbS_Pop(
4210: 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f 50 75 73 p, 1);. SbS_Pus
4220: 68 49 6e 74 28 70 2c 20 6e 29 3b 0a 20 20 72 65 hInt(p, n);. re
4230: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
4240: 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 Subscript comma
4250: 6e 64 3a 20 20 20 20 20 4e 41 4d 45 20 65 78 69 nd: NAME exi
4260: 73 74 73 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a sts INTEGER.**.*
4270: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 * Return TRUE if
4280: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 4e 41 the variable NA
4290: 4d 45 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 ME exists..*/.st
42a0: 61 74 69 63 20 69 6e 74 20 65 78 69 73 74 73 43 atic int existsC
42b0: 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63 72 md(struct Subscr
42c0: 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e ipt *p, void *pN
42d0: 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 otUsed){. const
42e0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 char *z;. int
42f0: 73 69 7a 65 2c 20 78 3b 0a 20 20 69 66 28 20 53 size, x;. if( S
4300: 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 bS_RequireStack(
4310: 70 2c 20 31 2c 20 22 65 78 69 73 74 73 22 29 20 p, 1, "exists")
4320: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 ) return 1;. z
4330: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 = SbS_StackValue
4340: 28 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b 0a 20 (p, 0, &size);.
4350: 20 78 20 3d 20 73 62 73 5f 66 65 74 63 68 28 26 x = sbs_fetch(&
4360: 70 2d 3e 73 79 6d 54 61 62 2c 20 28 63 68 61 72 p->symTab, (char
4370: 2a 29 7a 2c 20 73 69 7a 65 29 21 3d 30 3b 0a 20 *)z, size)!=0;.
4380: 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a SbS_Pop(p, 1);.
4390: 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70 2c SbS_PushInt(p,
43a0: 20 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b x);. return 0;
43b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 .}../*.** Subscr
43c0: 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 ipt command:
43d0: 20 20 20 56 41 4c 55 45 20 4e 41 4d 45 20 67 65 VALUE NAME ge
43e0: 74 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 50 75 t VALUE.**.** Pu
43f0: 73 68 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 sh the value of
4400: 76 61 72 69 62 6c 65 20 4e 41 4d 45 20 6f 6e 74 varible NAME ont
4410: 6f 20 74 68 65 20 73 74 61 63 6b 20 69 66 20 69 o the stack if i
4420: 74 20 65 78 69 73 74 73 2e 0a 2a 2a 20 49 66 20 t exists..** If
4430: 4e 41 4d 45 20 64 6f 65 73 20 6e 6f 74 20 65 78 NAME does not ex
4440: 69 73 74 2c 20 70 75 74 73 20 56 41 4c 55 45 20 ist, puts VALUE
4450: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 69 onto the stack i
4460: 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 nstead..*/.stati
4470: 63 20 69 6e 74 20 67 65 74 43 6d 64 28 53 75 62 c int getCmd(Sub
4480: 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 script *p, void
4490: 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f *pNotUsed){. co
44a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b nst char *zName;
44b0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 . int nName;.
44c0: 63 6f 6e 73 74 20 53 62 53 56 61 6c 75 65 20 2a const SbSValue *
44d0: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d pVal;. int rc =
44e0: 20 30 3b 0a 20 20 0a 20 20 69 66 28 20 53 62 53 0;. . if( SbS
44f0: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c _RequireStack(p,
4500: 20 32 2c 20 22 67 65 74 22 29 20 29 20 72 65 74 2, "get") ) ret
4510: 75 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 urn SBS_ERROR;.
4520: 20 7a 4e 61 6d 65 20 3d 20 53 62 53 5f 53 74 61 zName = SbS_Sta
4530: 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c 20 26 6e ckValue(p, 0, &n
4540: 4e 61 6d 65 29 3b 0a 20 20 70 56 61 6c 20 3d 20 Name);. pVal =
4550: 73 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 sbs_fetch(&p->sy
4560: 6d 54 61 62 2c 20 28 63 68 61 72 2a 29 7a 4e 61 mTab, (char*)zNa
4570: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 me, nName);. if
4580: 28 20 70 56 61 6c 21 3d 30 20 26 26 20 28 70 56 ( pVal!=0 && (pV
4590: 61 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42 53 56 al->flags & SBSV
45a0: 41 4c 5f 53 54 52 29 21 3d 30 20 29 7b 0a 20 20 AL_STR)!=0 ){.
45b0: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 32 29 3b SbS_Pop(p, 2);
45c0: 0a 20 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75 . rc = SbS_Pu
45d0: 73 68 28 70 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 sh(p, pVal->u.st
45e0: 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 r.z, pVal->u.str
45f0: 2e 73 69 7a 65 2c 20 30 29 3b 0a 20 20 7d 65 6c .size, 0);. }el
4600: 73 65 7b 0a 20 20 20 20 53 62 53 5f 50 6f 70 28 se{. SbS_Pop(
4610: 70 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 p, 1);. }. ret
4620: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a urn rc;.}..../*.
4630: 2a 2a 20 54 72 75 65 20 69 66 20 6f 75 74 70 75 ** True if outpu
4640: 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 20 46 t is enabled. F
4650: 61 6c 73 65 20 69 66 20 64 69 73 61 62 6c 65 64 alse if disabled
4660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
4670: 65 6e 61 62 6c 65 4f 75 74 70 75 74 20 3d 20 31 enableOutput = 1
4680: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 ;../*.** Subscri
4690: 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 pt command:
46a0: 20 42 4f 4f 4c 45 41 4e 20 65 6e 61 62 6c 65 5f BOOLEAN enable_
46b0: 6f 75 74 70 75 74 0a 2a 2a 0a 2a 2a 20 45 6e 61 output.**.** Ena
46c0: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 ble or disable t
46d0: 68 65 20 70 75 74 73 20 61 6e 64 20 68 70 75 74 he puts and hput
46e0: 73 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2f 0a 73 s commands..*/.s
46f0: 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 tatic int enable
4700: 4f 75 74 70 75 74 43 6d 64 28 73 74 72 75 63 74 OutputCmd(struct
4710: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 Subscript *p, v
4720: 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a oid *pNotUsed){.
4730: 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 if( SbS_Requir
4740: 65 53 74 61 63 6b 28 70 2c 20 31 2c 20 22 65 6e eStack(p, 1, "en
4750: 61 62 6c 65 5f 6f 75 74 70 75 74 22 29 20 29 20 able_output") )
4760: 72 65 74 75 72 6e 20 31 3b 0a 20 20 65 6e 61 62 return 1;. enab
4770: 6c 65 4f 75 74 70 75 74 20 3d 20 53 62 53 5f 53 leOutput = SbS_S
4780: 74 61 63 6b 56 61 6c 75 65 49 6e 74 28 70 2c 20 tackValueInt(p,
4790: 30 29 21 3d 30 3b 0a 20 20 53 62 53 5f 50 6f 70 0)!=0;. SbS_Pop
47a0: 28 70 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e (p, 1);. return
47b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 0;.}../*.** Sub
47c0: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 script command:
47d0: 20 20 20 20 20 53 54 52 49 4e 47 20 70 75 74 73 STRING puts
47e0: 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f .** Subscript co
47f0: 6d 6d 61 6e 64 3a 20 20 20 20 20 20 53 54 52 49 mmand: STRI
4800: 4e 47 20 68 74 6d 6c 0a 2a 2a 0a 2a 2a 20 4f 75 NG html.**.** Ou
4810: 74 70 75 74 20 53 54 52 49 4e 47 20 61 73 20 48 tput STRING as H
4820: 54 4d 4c 20 28 68 74 6d 6c 29 20 6f 72 20 75 6e TML (html) or un
4830: 63 68 61 6e 67 65 64 20 28 70 75 74 73 29 2e 20 changed (puts).
4840: 20 0a 2a 2a 20 50 6f 70 20 69 74 20 66 72 6f 6d .** Pop it from
4850: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 the stack..*/.s
4860: 74 61 74 69 63 20 69 6e 74 20 70 75 74 73 43 6d tatic int putsCm
4870: 64 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 d(struct Subscri
4880: 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 43 6f pt *p, void *pCo
4890: 6e 76 65 72 74 29 7b 0a 20 20 69 6e 74 20 73 69 nvert){. int si
48a0: 7a 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 ze;. const char
48b0: 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 *z;. char *zOu
48c0: 74 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 t;. if( SbS_Req
48d0: 75 69 72 65 53 74 61 63 6b 28 70 2c 20 31 2c 20 uireStack(p, 1,
48e0: 22 70 75 74 73 22 29 20 29 20 72 65 74 75 72 6e "puts") ) return
48f0: 20 31 3b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 1;. if( enable
4900: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 7a 20 Output ){. z
4910: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 = SbS_StackValue
4920: 28 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b 0a 20 (p, 0, &size);.
4930: 20 20 20 69 66 28 20 70 43 6f 6e 76 65 72 74 20 if( pConvert
4940: 29 7b 20 20 20 20 0a 20 20 20 20 20 20 7a 4f 75 ){ . zOu
4950: 74 20 3d 20 68 74 6d 6c 69 7a 65 28 7a 2c 20 73 t = htmlize(z, s
4960: 69 7a 65 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 ize);. size
4970: 20 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b = strlen(zOut);
4980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
4990: 20 20 7a 4f 75 74 20 3d 20 28 63 68 61 72 2a 29 zOut = (char*)
49a0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 z;. }. if(
49b0: 20 67 2e 63 67 69 50 61 6e 69 63 20 29 7b 0a 20 g.cgiPanic ){.
49c0: 20 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f cgi_append_
49d0: 63 6f 6e 74 65 6e 74 28 7a 4f 75 74 2c 20 73 69 content(zOut, si
49e0: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a ze);. }else{.
49f0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 2e printf("%.
4a00: 2a 73 22 2c 20 73 69 7a 65 2c 20 7a 4f 75 74 29 *s", size, zOut)
4a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
4a20: 70 43 6f 6e 76 65 72 74 20 29 7b 0a 20 20 20 20 pConvert ){.
4a30: 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 free(zOut);.
4a40: 20 20 7d 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f }. }. SbS_Po
4a50: 70 28 70 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 p(p, 1);. retur
4a60: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 n 0;.}.../*.** A
4a70: 20 74 61 62 6c 65 20 6f 66 20 62 75 69 6c 74 2d table of built-
4a80: 69 6e 20 63 6f 6d 6d 61 6e 64 73 0a 2a 2f 0a 73 in commands.*/.s
4a90: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 tatic const stru
4aa0: 63 74 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 ct {. const cha
4ab0: 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e 74 20 28 r *zCmd;. int (
4ac0: 2a 78 43 6d 64 29 28 53 75 62 73 63 72 69 70 74 *xCmd)(Subscript
4ad0: 2a 2c 76 6f 69 64 2a 29 3b 0a 20 20 76 6f 69 64 *,void*);. void
4ae0: 20 2a 70 41 72 67 3b 0a 7d 20 61 42 75 69 6c 74 *pArg;.} aBuilt
4af0: 69 6e 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 61 64 in[] = {. { "ad
4b00: 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 d",
4b10: 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 bopCmd,
4b20: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 (void*)SBS
4b30: 4f 50 5f 41 4e 44 20 20 20 20 7d 2c 0a 20 20 7b OP_AND },. {
4b40: 20 22 61 6e 64 22 2c 20 20 20 20 20 20 20 20 20 "and",
4b50: 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 bopCmd,
4b60: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a (void*
4b70: 29 53 42 53 4f 50 5f 41 4e 44 20 20 20 20 7d 2c )SBSOP_AND },
4b80: 0a 20 20 7b 20 22 64 69 76 22 2c 20 20 20 20 20 . { "div",
4b90: 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 bopCmd,
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 (v
4bb0: 6f 69 64 2a 29 53 42 53 4f 50 5f 44 49 56 20 20 oid*)SBSOP_DIV
4bc0: 20 20 7d 2c 0a 20 20 7b 20 22 65 6e 61 62 6c 65 },. { "enable
4bd0: 5f 6f 75 74 70 75 74 22 2c 20 20 20 65 6e 61 62 _output", enab
4be0: 6c 65 4f 75 74 70 75 74 43 6d 64 2c 20 20 20 20 leOutputCmd,
4bf0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 0
4c00: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 65 78 },. { "ex
4c10: 69 73 74 73 22 2c 20 20 20 20 20 20 20 20 20 20 ists",
4c20: 65 78 69 73 74 73 43 6d 64 2c 20 20 20 20 20 20 existsCmd,
4c30: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 0,
4c40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b },. {
4c50: 20 22 67 65 74 22 2c 20 20 20 20 20 20 20 20 20 "get",
4c60: 20 20 20 20 67 65 74 43 6d 64 2c 20 20 20 20 20 getCmd,
4c70: 20 20 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 0,
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c },
4c90: 0a 20 20 7b 20 22 68 61 73 63 61 70 22 2c 20 20 . { "hascap",
4ca0: 20 20 20 20 20 20 20 20 68 61 73 63 61 70 43 6d hascapCm
4cb0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 d, 0
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4cd0: 20 20 7d 2c 0a 20 20 7b 20 22 68 74 6d 6c 22 2c },. { "html",
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 73 puts
4cf0: 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 Cmd,
4d00: 20 20 28 76 6f 69 64 2a 29 31 20 20 20 20 20 20 (void*)1
4d10: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6c 69 },. { "li
4d20: 6e 65 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 necount",
4d30: 6c 69 6e 65 63 6e 74 43 6d 64 2c 20 20 20 20 20 linecntCmd,
4d40: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 0
4d50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b },. {
4d60: 20 22 6d 61 78 22 2c 20 20 20 20 20 20 20 20 20 "max",
4d70: 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 bopCmd,
4d80: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a (void*
4d90: 29 53 42 53 4f 50 5f 4d 41 58 20 20 20 20 7d 2c )SBSOP_MAX },
4da0: 0a 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20 . { "min",
4db0: 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 bopCmd,
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 (v
4dd0: 6f 69 64 2a 29 53 42 53 4f 50 5f 4d 49 4e 20 20 oid*)SBSOP_MIN
4de0: 20 20 7d 2c 0a 20 20 7b 20 22 6d 75 6c 22 2c 20 },. { "mul",
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 bopC
4e00: 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 md,
4e10: 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 4d (void*)SBSOP_M
4e20: 55 4c 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6e 6f UL },. { "no
4e30: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 t",
4e40: 6e 6f 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 notCmd,
4e50: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 0
4e60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b },. {
4e70: 20 22 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 "or",
4e80: 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 bopCmd,
4e90: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a (void*
4ea0: 29 53 42 53 4f 50 5f 4f 52 20 20 20 20 20 7d 2c )SBSOP_OR },
4eb0: 0a 20 20 7b 20 22 70 75 74 73 22 2c 20 20 20 20 . { "puts",
4ec0: 20 20 20 20 20 20 20 20 70 75 74 73 43 6d 64 2c putsCmd,
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 0
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4ef0: 20 20 7d 2c 0a 20 20 7b 20 22 73 65 74 22 2c 20 },. { "set",
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 43 setC
4f10: 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 md,
4f20: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 0
4f30: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 75 },. { "su
4f40: 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 b",
4f50: 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 bopCmd,
4f60: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 (void*)SBS
4f70: 4f 50 5f 53 55 42 20 20 20 20 7d 2c 0a 7d 3b 0a OP_SUB },.};.
4f80: 20 20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 ../*.** Compar
4f90: 65 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 e a zero-termina
4fa0: 74 65 64 20 73 74 72 69 6e 67 20 7a 50 61 74 74 ted string zPatt
4fb0: 65 72 6e 20 61 67 61 69 6e 73 74 0a 2a 2a 20 61 ern against.** a
4fc0: 6e 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 n unterminated s
4fd0: 74 72 69 6e 67 20 7a 53 74 72 20 6f 66 20 6c 65 tring zStr of le
4fe0: 6e 67 74 68 20 6e 53 74 72 2e 0a 2a 2a 0a 2a 2a ngth nStr..**.**
4ff0: 20 52 65 74 75 72 6e 20 6c 65 73 73 20 74 68 61 Return less tha
5000: 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 n, equal to, or
5010: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 greater than zer
5020: 6f 20 69 66 0a 2a 2a 20 7a 50 61 74 74 65 72 6e o if.** zPattern
5030: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 is less than, e
5040: 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 qual to, or grea
5050: 74 65 72 20 74 68 61 6e 20 7a 53 74 72 2e 0a 2a ter than zStr..*
5060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d /.static int com
5070: 70 61 72 65 5f 63 6d 64 28 63 6f 6e 73 74 20 63 pare_cmd(const c
5080: 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20 63 har *zPattern, c
5090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c onst char *zStr,
50a0: 20 69 6e 74 20 6e 53 74 72 29 7b 0a 20 20 69 6e int nStr){. in
50b0: 74 20 63 20 3d 20 73 74 72 6e 63 6d 70 28 7a 50 t c = strncmp(zP
50c0: 61 74 74 65 72 6e 2c 20 7a 53 74 72 2c 20 6e 53 attern, zStr, nS
50d0: 74 72 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 tr);. if( c==0
50e0: 26 26 20 7a 50 61 74 74 65 72 6e 5b 6e 53 74 72 && zPattern[nStr
50f0: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 ]!=0 ){. c =
5100: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 1;. }. return
5110: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c c;.}../*.** Eval
5120: 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 uate the script
5130: 67 69 76 65 6e 20 62 79 20 74 68 65 20 66 69 72 given by the fir
5140: 73 74 20 6e 53 63 72 69 70 74 20 62 79 74 65 73 st nScript bytes
5150: 20 6f 66 20 7a 53 63 72 69 70 74 5b 5d 2e 0a 2a of zScript[]..*
5160: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 * Return 0 on su
5170: 63 63 65 73 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 ccess and non-ze
5180: 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e ro for an error.
5190: 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 45 76 61 6c .*/.int SbS_Eval
51a0: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 (struct Subscrip
51b0: 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 t *p, const char
51c0: 20 2a 7a 53 63 72 69 70 74 2c 20 69 6e 74 20 6e *zScript, int n
51d0: 53 63 72 69 70 74 29 7b 0a 20 20 69 6e 74 20 72 Script){. int r
51e0: 63 20 3d 20 53 42 53 5f 4f 4b 3b 0a 20 20 69 66 c = SBS_OK;. if
51f0: 28 20 6e 53 63 72 69 70 74 3c 30 20 29 20 6e 53 ( nScript<0 ) nS
5200: 63 72 69 70 74 20 3d 20 73 74 72 6c 65 6e 28 7a cript = strlen(z
5210: 53 63 72 69 70 74 29 3b 0a 20 20 77 68 69 6c 65 Script);. while
5220: 28 20 6e 53 63 72 69 70 74 3e 30 20 26 26 20 72 ( nScript>0 && r
5230: 63 3d 3d 53 42 53 5f 4f 4b 20 29 7b 0a 20 20 20 c==SBS_OK ){.
5240: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20 int n;. int
5250: 74 74 79 70 65 3b 0a 20 20 20 20 6e 20 3d 20 73 ttype;. n = s
5260: 62 73 5f 6e 65 78 74 5f 74 6f 6b 65 6e 28 7a 53 bs_next_token(zS
5270: 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2c 20 cript, nScript,
5280: 26 74 74 79 70 65 29 3b 0a 0a 23 69 66 20 30 0a &ttype);..#if 0.
5290: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 {. int
52a0: 69 2c 20 6e 45 6c 65 6d 3b 0a 20 20 20 20 20 20 i, nElem;.
52b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6c 65 const char *zEle
52c0: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e m;. if( p->
52d0: 6e 53 74 61 63 6b 3e 30 20 29 7b 0a 20 20 20 20 nStack>0 ){.
52e0: 20 20 20 20 70 72 69 6e 74 66 28 22 53 54 41 43 printf("STAC
52f0: 4b 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f K:");. fo
5300: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 74 61 r(i=0; i<p->nSta
5310: 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 ck; i++){.
5320: 20 20 20 20 7a 45 6c 65 6d 20 3d 20 53 62 53 5f zElem = SbS_
5330: 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 69 2c StackValue(p, i,
5340: 20 26 6e 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 &nElem);.
5350: 20 20 20 20 70 72 69 6e 74 66 28 22 20 5b 25 2e printf(" [%.
5360: 2a 73 5d 22 2c 20 6e 45 6c 65 6d 2c 20 7a 45 6c *s]", nElem, zEl
5370: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 em);. }.
5380: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c printf("\
5390: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 n");. }.
53a0: 20 20 20 70 72 69 6e 74 66 28 22 54 4f 4b 45 4e printf("TOKEN
53b0: 28 25 64 29 3a 20 5b 25 2e 2a 73 5d 5c 6e 22 2c (%d): [%.*s]\n",
53c0: 20 74 74 79 70 65 2c 20 6e 2c 20 7a 53 63 72 69 ttype, n, zScri
53d0: 70 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 pt);. }.#endi
53e0: 66 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 74 f.. switch( t
53f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 type ){. ca
5400: 73 65 20 53 42 53 54 54 5f 57 48 49 54 45 53 50 se SBSTT_WHITESP
5410: 41 43 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 ACE: {. b
5420: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
5430: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 45 case SBSTT_E
5440: 4f 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 6e 53 OF: {. nS
5450: 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 cript = 0;.
5460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
5470: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 42 53 }. case SBS
5480: 54 54 5f 49 4e 43 4f 4d 50 4c 45 54 45 3a 0a 20 TT_INCOMPLETE:.
5490: 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f case SBSTT_
54a0: 55 4e 4b 4e 4f 57 4e 3a 20 7b 0a 20 20 20 20 20 UNKNOWN: {.
54b0: 20 20 20 72 63 20 3d 20 53 42 53 5f 45 52 52 4f rc = SBS_ERRO
54c0: 52 3b 0a 20 20 20 20 20 20 20 20 6e 53 63 72 69 R;. nScri
54d0: 70 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 pt = n;.
54e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
54f0: 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f case SBSTT_
5500: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 INTEGER: {.
5510: 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 rc = SbS_Push
5520: 28 70 2c 20 28 63 68 61 72 2a 29 7a 53 63 72 69 (p, (char*)zScri
5530: 70 74 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 pt, n, 0);.
5540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
5550: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 42 53 }. case SBS
5560: 54 54 5f 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 TT_NAME: {.
5570: 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 rc = SbS_Push
5580: 28 70 2c 20 28 63 68 61 72 2a 29 26 7a 53 63 72 (p, (char*)&zScr
5590: 69 70 74 5b 31 5d 2c 20 6e 2d 31 2c 20 30 29 3b ipt[1], n-1, 0);
55a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
55b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 }. ca
55c0: 73 65 20 53 42 53 54 54 5f 53 54 52 49 4e 47 3a se SBSTT_STRING:
55d0: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 {. rc =
55e0: 53 62 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 SbS_Push(p, (cha
55f0: 72 2a 29 26 7a 53 63 72 69 70 74 5b 31 5d 2c 20 r*)&zScript[1],
5600: 6e 2d 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 n-2, 0);.
5610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
5620: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54 case SBSTT
5630: 5f 56 45 52 42 3a 20 7b 0a 20 20 20 20 20 20 20 _VERB: {.
5640: 20 2f 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 75 /* First look u
5650: 70 20 74 68 65 20 76 65 72 62 20 69 6e 20 74 68 p the verb in th
5660: 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a e hash table */.
5670: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 53 62 const Sb
5680: 53 56 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73 SValue *pVal = s
5690: 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d bs_fetch(&p->sym
56a0: 54 61 62 2c 20 28 63 68 61 72 2a 29 7a 53 63 72 Tab, (char*)zScr
56b0: 69 70 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 ipt, n);.
56c0: 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b 0a if( pVal==0 ){.
56d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 /* If
56e0: 74 68 65 20 76 65 72 62 20 69 73 20 6e 6f 74 20 the verb is not
56f0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c in the hash tabl
5700: 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 0a 20 e, look for a .
5710: 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 69 6c ** buil
5720: 74 2d 69 6e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a t-in command */.
5730: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75 70 int up
5740: 72 20 3d 20 73 69 7a 65 6f 66 28 61 42 75 69 6c r = sizeof(aBuil
5750: 74 69 6e 29 2f 73 69 7a 65 6f 66 28 61 42 75 69 tin)/sizeof(aBui
5760: 6c 74 69 6e 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 ltin[0]) - 1;.
5770: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 77 72 20 int lwr
5780: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 = 0;. r
5790: 63 20 3d 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 c = SBS_ERROR;.
57a0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 while(
57b0: 75 70 72 3e 3d 6c 77 72 20 29 7b 0a 20 20 20 20 upr>=lwr ){.
57c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 int i =
57d0: 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 (upr+lwr)/2;.
57e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 20 3d int c =
57f0: 20 63 6f 6d 70 61 72 65 5f 63 6d 64 28 61 42 75 compare_cmd(aBu
5800: 69 6c 74 69 6e 5b 69 5d 2e 7a 43 6d 64 2c 20 7a iltin[i].zCmd, z
5810: 53 63 72 69 70 74 2c 20 6e 29 3b 0a 20 20 20 20 Script, n);.
5820: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 if( c==0
5830: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
5840: 20 20 72 63 20 3d 20 61 42 75 69 6c 74 69 6e 5b rc = aBuiltin[
5850: 69 5d 2e 78 43 6d 64 28 70 2c 20 61 42 75 69 6c i].xCmd(p, aBuil
5860: 74 69 6e 5b 69 5d 2e 70 41 72 67 29 3b 0a 20 20 tin[i].pArg);.
5870: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 brea
5880: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d k;. }
5890: 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a else if( c>0 ){.
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70 up
58b0: 72 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 20 r = i-1;.
58c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
58d0: 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 lwr =
58e0: 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 i+1;.
58f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 }. }.
5900: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }else if(
5910: 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 53 pVal->flags & S
5920: 42 53 56 41 4c 5f 56 45 52 42 20 29 7b 0a 20 20 BSVAL_VERB ){.
5930: 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 56 61 rc = pVa
5940: 6c 2d 3e 75 2e 76 65 72 62 2e 78 56 65 72 62 28 l->u.verb.xVerb(
5950: 70 2c 20 70 56 61 6c 2d 3e 75 2e 76 65 72 62 2e p, pVal->u.verb.
5960: 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d pArg);. }
5970: 65 6c 73 65 20 69 66 28 20 70 56 61 6c 2d 3e 66 else if( pVal->f
5980: 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f 45 58 lags & SBSVAL_EX
5990: 45 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 EC ){.
59a0: 72 63 20 3d 20 53 62 53 5f 45 76 61 6c 28 70 2c rc = SbS_Eval(p,
59b0: 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a 2c 20 pVal->u.str.z,
59c0: 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 pVal->u.str.size
59d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 );. }else
59e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d {. rc =
59f0: 20 53 62 53 5f 50 75 73 68 28 70 2c 20 70 56 61 SbS_Push(p, pVa
5a00: 6c 2d 3e 75 2e 73 74 72 2e 7a 2c 20 70 56 61 6c l->u.str.z, pVal
5a10: 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 2c 20 30 29 ->u.str.size, 0)
5a20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
5a30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
5a40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 63 }. }. zSc
5a50: 72 69 70 74 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e ript += n;. n
5a60: 53 63 72 69 70 74 20 2d 3d 20 6e 3b 0a 20 20 7d Script -= n;. }
5a70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
5a80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 69 ./*.** The z[] i
5a90: 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 65 nput contains te
5aa0: 78 74 20 6d 69 78 65 64 20 77 69 74 68 20 73 75 xt mixed with su
5ab0: 62 73 63 72 69 70 74 20 73 63 72 69 70 74 73 2e bscript scripts.
5ac0: 0a 2a 2a 20 54 68 65 20 73 75 62 73 63 72 69 70 .** The subscrip
5ad0: 74 20 73 63 72 69 70 74 73 20 61 72 65 20 63 6f t scripts are co
5ae0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 5b ntained within [
5af0: 2e 2e 2e 5d 2e 20 20 54 68 69 73 20 72 6f 75 74 ...]. This rout
5b00: 69 6e 65 0a 2a 2a 20 70 72 6f 63 65 73 73 65 73 ine.** processes
5b10: 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 61 6e the template an
5b20: 64 20 77 72 69 74 65 73 20 74 68 65 20 72 65 73 d writes the res
5b30: 75 6c 74 73 20 6f 6e 20 65 69 74 68 65 72 0a 2a ults on either.*
5b40: 2a 20 73 74 64 6f 75 74 20 6f 72 20 69 6e 74 6f * stdout or into
5b50: 20 43 47 49 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 CGI..*/.int SbS
5b60: 5f 52 65 6e 64 65 72 28 73 74 72 75 63 74 20 53 _Render(struct S
5b70: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 63 6f 6e ubscript *p, con
5b80: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 st char *z){. i
5b90: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 nt i = 0;. int
5ba0: 72 63 20 3d 20 53 42 53 5f 4f 4b 3b 0a 20 20 77 rc = SBS_OK;. w
5bb0: 68 69 6c 65 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 hile( z[i] ){.
5bc0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5b 27 20 if( z[i]=='['
5bd0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 6e 61 ){. if( ena
5be0: 62 6c 65 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 bleOutput ){.
5bf0: 20 20 20 20 20 69 66 28 20 67 2e 63 67 69 50 61 if( g.cgiPa
5c00: 6e 69 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 nic ){.
5c10: 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 cgi_append_cont
5c20: 65 6e 74 28 7a 2c 20 69 29 3b 0a 20 20 20 20 20 ent(z, i);.
5c30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
5c40: 20 20 20 20 66 77 72 69 74 65 28 7a 2c 20 31 2c fwrite(z, 1,
5c50: 20 69 2c 20 73 74 64 6f 75 74 29 3b 0a 20 20 20 i, stdout);.
5c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
5c70: 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a 20 z += i+1;.
5c80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b for(i=0; z[
5c90: 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 5d 27 3b i] && z[i]!=']';
5ca0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 72 63 i++){}. rc
5cb0: 20 3d 20 53 62 53 5f 45 76 61 6c 28 70 2c 20 7a = SbS_Eval(p, z
5cc0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 , i);. if(
5cd0: 72 63 21 3d 53 42 53 5f 4f 4b 20 29 20 62 72 65 rc!=SBS_OK ) bre
5ce0: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b ak;. if( z[
5cf0: 69 5d 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 i] ) i++;.
5d00: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 69 20 z += i;. i
5d10: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a = 0;. }else{.
5d20: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d i++;. }
5d30: 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 . }. if( i>0 &
5d40: 26 20 65 6e 61 62 6c 65 4f 75 74 70 75 74 20 29 & enableOutput )
5d50: 7b 0a 20 20 20 20 69 66 28 20 67 2e 63 67 69 50 {. if( g.cgiP
5d60: 61 6e 69 63 20 29 7b 0a 20 20 20 20 20 20 63 67 anic ){. cg
5d70: 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 i_append_content
5d80: 28 7a 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 (z, i);. }els
5d90: 65 7b 0a 20 20 20 20 20 20 66 77 72 69 74 65 28 e{. fwrite(
5da0: 7a 2c 20 31 2c 20 69 2c 20 73 74 64 6f 75 74 29 z, 1, i, stdout)
5db0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 72 ;. }. } . r
5dc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
5dd0: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 ** COMMAND: test
5de0: 2d 73 75 62 73 63 72 69 70 74 0a 2a 2f 0a 76 6f -subscript.*/.vo
5df0: 69 64 20 74 65 73 74 5f 73 75 62 73 63 72 69 70 id test_subscrip
5e00: 74 28 76 6f 69 64 29 7b 0a 20 20 53 75 62 73 63 t(void){. Subsc
5e10: 72 69 70 74 20 2a 70 3b 0a 20 20 42 6c 6f 62 20 ript *p;. Blob
5e20: 69 6e 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 in;. if( g.argc
5e30: 3c 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28 <3 ){. usage(
5e40: 22 46 49 4c 45 22 29 3b 0a 20 20 7d 0a 20 20 62 "FILE");. }. b
5e50: 6c 6f 62 5f 7a 65 72 6f 28 26 69 6e 29 3b 0a 20 lob_zero(&in);.
5e60: 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f blob_read_from_
5e70: 66 69 6c 65 28 26 69 6e 2c 20 67 2e 61 72 67 76 file(&in, g.argv
5e80: 5b 32 5d 29 3b 0a 20 20 70 20 3d 20 53 62 53 5f [2]);. p = SbS_
5e90: 43 72 65 61 74 65 28 29 3b 0a 20 20 53 62 53 5f Create();. SbS_
5ea0: 52 65 6e 64 65 72 28 70 2c 20 62 6c 6f 62 5f 73 Render(p, blob_s
5eb0: 74 72 28 26 69 6e 29 29 3b 0a 7d 0a tr(&in));.}.