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 64 65 66 69 _ERROR 1.#defi
09d0: 6e 65 20 53 42 53 5f 52 45 54 55 52 4e 20 20 32 ne SBS_RETURN 2
09e0: 0a 23 64 65 66 69 6e 65 20 53 42 53 5f 42 52 45 .#define SBS_BRE
09f0: 41 4b 20 20 20 33 0a 23 65 6e 64 69 66 0a 0a 2f AK 3.#endif../
0a00: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 *.** Configurati
0a10: 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 0a 2a 2f 0a on constants.*/.
0a20: 23 64 65 66 69 6e 65 20 53 42 53 43 4f 4e 46 49 #define SBSCONFI
0a30: 47 5f 4e 48 41 53 48 20 20 20 20 34 31 20 20 20 G_NHASH 41
0a40: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 /* Size of
0a50: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 the hash table
0a60: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43 4f */.#define SBSCO
0a70: 4e 46 49 47 5f 4e 53 54 41 43 4b 20 20 20 31 30 NFIG_NSTACK 10
0a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 /* Maxi
0a90: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20 mum stack depth
0aa0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 43 4f */.#define SBSCO
0ab0: 4e 46 49 47 5f 45 52 52 53 49 5a 45 20 20 31 30 NFIG_ERRSIZE 10
0ac0: 30 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 0 /* Maxi
0ad0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 mum size of an e
0ae0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a rror message */.
0af0: 0a 2f 2a 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65 ./*.** Available
0b00: 20 74 6f 6b 65 6e 20 74 79 70 65 73 3a 0a 2a 2f token types:.*/
0b10: 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 57 .#define SBSTT_W
0b20: 48 49 54 45 53 50 41 43 45 20 20 31 20 20 20 20 HITESPACE 1
0b30: 2f 2a 20 65 78 3a 20 20 20 5c 30 34 30 20 20 20 /* ex: \040
0b40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 */.#define SBSTT
0b50: 5f 4e 41 4d 45 20 20 20 20 20 20 20 20 32 20 20 _NAME 2
0b60: 20 20 2f 2a 20 65 78 3a 20 20 20 2f 61 62 63 64 /* ex: /abcd
0b70: 65 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 e */.#define SB
0b80: 53 54 54 5f 56 45 52 42 20 20 20 20 20 20 20 20 STT_VERB
0b90: 33 20 20 20 20 2f 2a 20 65 78 3a 20 20 20 61 62 3 /* ex: ab
0ba0: 63 64 65 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 cde */.#define
0bb0: 20 53 42 53 54 54 5f 53 54 52 49 4e 47 20 20 20 SBSTT_STRING
0bc0: 20 20 20 34 20 20 20 20 2f 2a 20 65 78 3a 20 20 4 /* ex:
0bd0: 20 7b 2e 2e 2e 7d 20 20 20 2a 2f 0a 23 64 65 66 {...} */.#def
0be0: 69 6e 65 20 53 42 53 54 54 5f 49 4e 54 45 47 45 ine SBSTT_INTEGE
0bf0: 52 20 20 20 20 20 35 20 20 20 20 2f 2a 20 49 6e R 5 /* In
0c00: 74 65 67 65 72 20 69 6e 63 6c 75 64 69 6e 67 20 teger including
0c10: 6f 70 74 69 6f 6e 20 73 69 67 6e 20 2a 2f 0a 23 option sign */.#
0c20: 64 65 66 69 6e 65 20 53 42 53 54 54 5f 49 4e 43 define SBSTT_INC
0c30: 4f 4d 50 4c 45 54 45 20 20 36 20 20 20 20 2f 2a OMPLETE 6 /*
0c40: 20 55 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74 Unterminated st
0c50: 72 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 23 64 ring token */.#d
0c60: 65 66 69 6e 65 20 53 42 53 54 54 5f 55 4e 4b 4e efine SBSTT_UNKN
0c70: 4f 57 4e 20 20 20 20 20 37 20 20 20 20 2f 2a 20 OWN 7 /*
0c80: 55 6e 6b 6e 6f 77 6e 20 74 6f 6b 65 6e 20 2a 2f Unknown token */
0c90: 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f 45 .#define SBSTT_E
0ca0: 4f 46 20 20 20 20 20 20 20 20 20 38 20 20 20 20 OF 8
0cb0: 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75 74 20 /* End of input
0cc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 */../*.** Values
0cd0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 are stored in t
0ce0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 73 he hash table as
0cf0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 instances of th
0d00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 e following.** s
0d10: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 tructure..*/.typ
0d20: 65 64 65 66 20 73 74 72 75 63 74 20 53 62 53 56 edef struct SbSV
0d30: 61 6c 75 65 20 53 62 53 56 61 6c 75 65 3b 0a 73 alue SbSValue;.s
0d40: 74 72 75 63 74 20 53 62 53 56 61 6c 75 65 20 7b truct SbSValue {
0d50: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 . int flags;
0d60: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 /* Bitmask
0d70: 6f 66 20 53 42 53 56 41 4c 5f 2a 20 76 61 6c 75 of SBSVAL_* valu
0d80: 65 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a es */. union {.
0d90: 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20 struct {.
0da0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 int size;
0db0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
0dc0: 20 62 79 74 65 73 20 69 6e 20 73 74 72 69 6e 67 bytes in string
0dd0: 2c 20 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 66 , not counting f
0de0: 69 6e 61 6c 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 inal zero */.
0df0: 20 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 char *z;
0e00: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 /* Pointer t
0e10: 6f 20 73 74 72 69 6e 67 20 63 6f 6e 74 65 6e 74 o string content
0e20: 20 2a 2f 0a 20 20 20 20 7d 20 73 74 72 3b 20 20 */. } str;
0e30: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 /* Value
0e40: 20 69 66 20 53 42 53 56 41 4c 5f 53 54 52 20 2a if SBSVAL_STR *
0e50: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20 /. struct {.
0e60: 20 20 20 20 20 69 6e 74 20 28 2a 78 56 65 72 62 int (*xVerb
0e70: 29 28 53 75 62 73 63 72 69 70 74 2a 2c 20 76 6f )(Subscript*, vo
0e80: 69 64 2a 29 3b 20 20 20 20 20 2f 2a 20 46 75 6e id*); /* Fun
0e90: 63 74 69 6f 6e 20 74 6f 20 64 6f 20 74 68 65 20 ction to do the
0ea0: 77 6f 72 6b 20 2a 2f 0a 20 20 20 20 20 20 76 6f work */. vo
0eb0: 69 64 20 2a 70 41 72 67 3b 20 20 20 20 20 20 20 id *pArg;
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ed0: 20 20 20 2f 2a 20 32 6e 64 20 70 61 72 61 6d 65 /* 2nd parame
0ee0: 74 65 72 20 74 6f 20 78 56 65 72 62 20 2a 2f 0a ter to xVerb */.
0ef0: 20 20 20 20 7d 20 76 65 72 62 3b 20 20 20 20 20 } verb;
0f00: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 66 20 /* Value if
0f10: 53 42 53 56 41 4c 5f 56 45 52 42 20 2a 2f 0a 20 SBSVAL_VERB */.
0f20: 20 7d 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 } u;
0f30: 20 20 20 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 .};.#define S
0f40: 42 53 56 41 4c 5f 56 45 52 42 20 20 20 20 30 78 BSVAL_VERB 0x
0f50: 30 30 30 31 20 20 20 20 20 20 2f 2a 20 56 61 6c 0001 /* Val
0f60: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 76 ue stored in u.v
0f70: 65 72 62 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 erb */.#define S
0f80: 42 53 56 41 4c 5f 53 54 52 20 20 20 20 20 30 78 BSVAL_STR 0x
0f90: 30 30 30 32 20 20 20 20 20 20 2f 2a 20 56 61 6c 0002 /* Val
0fa0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 73 ue stored in u.s
0fb0: 74 72 20 2a 2f 20 0a 23 64 65 66 69 6e 65 20 53 tr */ .#define S
0fc0: 42 53 56 41 4c 5f 44 59 4e 20 20 20 20 20 30 78 BSVAL_DYN 0x
0fd0: 30 30 30 34 20 20 20 20 20 20 2f 2a 20 75 2e 73 0004 /* u.s
0fe0: 74 72 2e 7a 20 69 73 20 64 79 6e 61 6d 69 63 61 tr.z is dynamica
0ff0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f lly allocated */
1000: 0a 23 64 65 66 69 6e 65 20 53 42 53 56 41 4c 5f .#define SBSVAL_
1010: 45 58 45 43 20 20 20 20 30 78 30 30 30 38 20 20 EXEC 0x0008
1020: 20 20 20 20 2f 2a 20 75 2e 73 74 72 2e 7a 20 69 /* u.str.z i
1030: 73 20 61 20 73 63 72 69 70 74 20 2a 2f 0a 0a 2f s a script */../
1040: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 69 6e *.** An entry in
1050: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 the hash table
1060: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f is an instance o
1070: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 f this structure
1080: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 ..*/.typedef str
1090: 75 63 74 20 53 62 73 48 61 73 68 45 6e 74 72 79 uct SbsHashEntry
10a0: 20 53 62 73 48 61 73 68 45 6e 74 72 79 3b 0a 73 SbsHashEntry;.s
10b0: 74 72 75 63 74 20 53 62 73 48 61 73 68 45 6e 74 truct SbsHashEnt
10c0: 72 79 20 7b 0a 20 20 53 62 73 48 61 73 68 45 6e ry {. SbsHashEn
10d0: 74 72 79 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 try *pNext;
10e0: 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 /* Next entry wi
10f0: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 th the same hash
1100: 20 6f 6e 20 7a 4b 65 79 20 2a 2f 0a 20 20 53 62 on zKey */. Sb
1110: 53 56 61 6c 75 65 20 76 61 6c 3b 20 20 20 20 20 SValue val;
1120: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 /* The pa
1130: 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e yload */. int n
1140: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 Key;
1150: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 /* Length of
1160: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 the key */. cha
1170: 72 20 7a 4b 65 79 5b 31 5d 3b 20 20 20 20 20 20 r zKey[1];
1180: 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 /* The key
1190: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 */.};../*.** A h
11a0: 61 73 68 20 74 61 62 6c 65 20 69 73 20 61 6e 20 ash table is an
11b0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 instance of the
11c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 following struct
11d0: 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 ure..*/.typedef
11e0: 73 74 72 75 63 74 20 53 62 73 48 61 73 68 54 61 struct SbsHashTa
11f0: 62 20 53 62 73 48 61 73 68 54 61 62 3b 0a 73 74 b SbsHashTab;.st
1200: 72 75 63 74 20 53 62 73 48 61 73 68 54 61 62 20 ruct SbsHashTab
1210: 7b 0a 20 20 53 62 73 48 61 73 68 45 6e 74 72 79 {. SbsHashEntry
1220: 20 2a 61 48 61 73 68 5b 53 42 53 43 4f 4e 46 49 *aHash[SBSCONFI
1230: 47 5f 4e 48 41 53 48 5d 3b 20 20 2f 2a 20 54 68 G_NHASH]; /* Th
1240: 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a e hash table */.
1250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 };../*.** An ins
1260: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62 tance of the Sub
1270: 73 63 72 69 70 74 20 69 6e 74 65 72 70 72 65 74 script interpret
1280: 65 72 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 62 er.*/.struct Sub
1290: 73 63 72 69 70 74 20 7b 0a 20 20 69 6e 74 20 6e script {. int n
12a0: 53 74 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 Stack;
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
12c0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 Number of entri
12d0: 65 73 20 6f 6e 20 73 74 61 63 6b 20 2a 2f 0a 20 es on stack */.
12e0: 20 53 62 73 48 61 73 68 54 61 62 20 73 79 6d 54 SbsHashTab symT
12f0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ab;
1300: 20 20 20 20 2f 2a 20 54 68 65 20 73 79 6d 62 6f /* The symbo
1310: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 l table */. cha
1320: 72 20 7a 45 72 72 4d 73 67 5b 53 42 53 43 4f 4e r zErrMsg[SBSCON
1330: 46 49 47 5f 45 52 52 53 49 5a 45 5d 3b 20 20 20 FIG_ERRSIZE];
1340: 2f 2a 20 53 70 61 63 65 20 74 6f 20 77 72 69 74 /* Space to writ
1350: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 e an error messa
1360: 67 65 20 2a 2f 0a 20 20 53 62 53 56 61 6c 75 65 ge */. SbSValue
1370: 20 61 53 74 61 63 6b 5b 53 42 53 43 4f 4e 46 49 aStack[SBSCONFI
1380: 47 5f 4e 53 54 41 43 4b 5d 3b 20 2f 2a 20 54 68 G_NSTACK]; /* Th
1390: 65 20 73 74 61 63 6b 20 2a 2f 0a 7d 3b 0a 0a 0a e stack */.};...
13a0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 69 /*.** Given an i
13b0: 6e 70 75 74 20 73 74 72 69 6e 67 20 7a 20 6f 66 nput string z of
13c0: 20 6c 65 6e 67 74 68 20 6e 2c 20 69 64 65 6e 74 length n, ident
13d0: 69 66 79 20 74 68 65 20 74 6f 6b 65 6e 20 74 68 ify the token th
13e0: 61 74 0a 2a 2a 20 73 74 61 72 74 73 20 61 74 20 at.** starts at
13f0: 7a 5b 30 5d 2e 20 20 57 72 69 74 65 20 74 68 65 z[0]. Write the
1400: 20 74 6f 6b 65 6e 20 74 79 70 65 20 69 6e 74 6f token type into
1410: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 61 6e 64 *pTokenType and
1420: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6c .** return the l
1430: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 74 6f 6b ength of the tok
1440: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e en..*/.static in
1450: 74 20 73 62 73 5f 6e 65 78 74 5f 74 6f 6b 65 6e t sbs_next_token
1460: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 (const char *z,
1470: 69 6e 74 20 6e 2c 20 69 6e 74 20 2a 70 54 6f 6b int n, int *pTok
1480: 65 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 63 enType){. int c
1490: 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 7c 7c 20 ;. if( n<=0 ||
14a0: 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2a z[0]==0 ){. *
14b0: 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 pTokenType = SBS
14c0: 54 54 5f 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 TT_EOF;. retu
14d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 20 3d 20 rn 0;. }. c =
14e0: 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 69 73 73 70 z[0];. if( issp
14f0: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 69 6e ace(c) ){. in
1500: 74 20 69 3b 0a 20 20 20 20 2a 70 54 6f 6b 65 6e t i;. *pToken
1510: 54 79 70 65 20 3d 20 53 42 53 54 54 5f 57 48 49 Type = SBSTT_WHI
1520: 54 45 53 50 41 43 45 3b 0a 20 20 20 20 66 6f 72 TESPACE;. for
1530: 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 69 73 73 (i=1; i<n && iss
1540: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 pace(z[i]); i++)
1550: 7b 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b {}. return i;
1560: 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 23 . }. if( c=='#
1570: 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a ' ){. int i;.
1580: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e for(i=1; i<n
1590: 20 26 26 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 2d && z[i] && z[i-
15a0: 31 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 1]!='\n'; i++){}
15b0: 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 . *pTokenType
15c0: 20 3d 20 53 42 53 54 54 5f 57 48 49 54 45 53 50 = SBSTT_WHITESP
15d0: 41 43 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 ACE;. return
15e0: 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d i;. }. if( c==
15f0: 27 7b 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 '{' ){. int d
1600: 65 70 74 68 20 3d 20 31 3b 0a 20 20 20 20 69 6e epth = 1;. in
1610: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 t i;. for(i=1
1620: 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d 3b 20 69 ; i<n && z[i]; i
1630: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a ++){. if( z
1640: 5b 69 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 [i]=='{' ){.
1650: 20 20 20 20 64 65 70 74 68 2b 2b 3b 0a 20 20 20 depth++;.
1660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 }else if( z[i
1670: 5d 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 20 20 ]=='}' ){.
1680: 20 20 64 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20 depth--;.
1690: 20 20 20 69 66 28 20 64 65 70 74 68 3d 3d 30 20 if( depth==0
16a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b ){. i++
16b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ;. brea
16c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 k;. }.
16d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 }. }. i
16e0: 66 28 20 64 65 70 74 68 20 29 7b 0a 20 20 20 20 f( depth ){.
16f0: 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 *pTokenType =
1700: 53 42 53 54 54 5f 49 4e 43 4f 4d 50 4c 45 54 45 SBSTT_INCOMPLETE
1710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
1720: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d *pTokenType =
1730: 20 53 42 53 54 54 5f 53 54 52 49 4e 47 3b 0a 20 SBSTT_STRING;.
1740: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
1750: 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d i;. }. if( c==
1760: 27 2f 27 20 26 26 20 6e 3e 3d 32 20 26 26 20 69 '/' && n>=2 && i
1770: 73 61 6c 70 68 61 28 7a 5b 31 5d 29 20 29 7b 0a salpha(z[1]) ){.
1780: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 int i;. f
1790: 6f 72 28 69 3d 32 3b 20 69 3c 6e 20 26 26 20 28 or(i=2; i<n && (
17a0: 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 7c 7c isalnum(z[i]) ||
17b0: 20 7a 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2b 2b z[i]=='_'); i++
17c0: 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 ){}. *pTokenT
17d0: 79 70 65 20 3d 20 53 42 53 54 54 5f 4e 41 4d 45 ype = SBSTT_NAME
17e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a ;. return i;.
17f0: 20 20 7d 0a 20 20 69 66 28 20 69 73 61 6c 70 68 }. if( isalph
1800: 61 28 63 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 a(c) ){. int
1810: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 i;. for(i=1;
1820: 69 3c 6e 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 i<n && (isalnum(
1830: 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 z[i]) || z[i]=='
1840: 5f 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 _'); i++){}.
1850: 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 *pTokenType = SB
1860: 53 54 54 5f 56 45 52 42 3b 0a 20 20 20 20 72 65 STT_VERB;. re
1870: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 turn i;. }. if
1880: 28 20 69 73 64 69 67 69 74 28 63 29 20 7c 7c 20 ( isdigit(c) ||
1890: 28 28 63 3d 3d 27 2d 27 20 7c 7c 20 63 3d 3d 27 ((c=='-' || c=='
18a0: 2b 27 29 20 26 26 20 6e 3e 3d 32 20 26 26 20 69 +') && n>=2 && i
18b0: 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b sdigit(z[1])) ){
18c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 . int i;.
18d0: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 for(i=1; i<n &&
18e0: 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 3b 20 69 isdigit(z[i]); i
18f0: 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65 ++){}. *pToke
1900: 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 49 4e nType = SBSTT_IN
1910: 54 45 47 45 52 3b 0a 20 20 20 20 72 65 74 75 72 TEGER;. retur
1920: 6e 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 54 6f 6b n i;. }. *pTok
1930: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 55 enType = SBSTT_U
1940: 4e 4b 4e 4f 57 4e 3b 0a 20 20 72 65 74 75 72 6e NKNOWN;. return
1950: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 1;.}.../*.** Re
1960: 6c 65 61 73 65 20 61 6e 79 20 6d 65 6d 6f 72 79 lease any memory
1970: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 allocated by a
1980: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 value..*/.static
1990: 20 76 6f 69 64 20 73 62 73 5f 76 61 6c 75 65 5f void sbs_value_
19a0: 72 65 73 65 74 28 53 62 53 56 61 6c 75 65 20 2a reset(SbSValue *
19b0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 p){. if( p->fla
19c0: 67 73 20 26 20 53 42 53 56 41 4c 5f 44 59 4e 20 gs & SBSVAL_DYN
19d0: 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 75 ){. free(p->u
19e0: 2e 73 74 72 2e 7a 29 3b 0a 20 20 20 20 70 2d 3e .str.z);. p->
19f0: 66 6c 61 67 73 20 3d 20 53 42 53 56 41 4c 5f 53 flags = SBSVAL_S
1a00: 54 52 3b 0a 20 20 20 20 70 2d 3e 75 2e 73 74 72 TR;. p->u.str
1a10: 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20 70 2d 3e .z = "";. p->
1a20: 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20 30 3b 0a u.str.size = 0;.
1a30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d }.}../*.** Com
1a40: 70 75 74 65 20 61 20 68 61 73 68 20 6f 6e 20 61 pute a hash on a
1a50: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 string..*/.stat
1a60: 69 63 20 69 6e 74 20 73 62 73 5f 68 61 73 68 28 ic int sbs_hash(
1a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 const char *z, i
1a80: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d nt n){. int h =
1a90: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 0;. int i;. f
1aa0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b or(i=0; i<n; i++
1ab0: 29 7b 0a 20 20 20 20 68 20 5e 3d 20 28 68 3c 3c ){. h ^= (h<<
1ac0: 31 29 20 7c 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 1) | z[i];. }.
1ad0: 20 68 20 26 3d 20 30 78 37 66 66 66 66 66 66 3b h &= 0x7ffffff;
1ae0: 0a 20 20 72 65 74 75 72 6e 20 68 20 25 20 53 42 . return h % SB
1af0: 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 3b 0a 7d SCONFIG_NHASH;.}
1b00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20 ../*.** Look up
1b10: 61 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 a value in the h
1b20: 61 73 68 20 74 61 62 6c 65 2e 20 20 52 65 74 75 ash table. Retu
1b30: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 rn a pointer to
1b40: 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 52 65 the value..** Re
1b50: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 turn NULL if not
1b60: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 found..*/.stati
1b70: 63 20 63 6f 6e 73 74 20 53 62 53 56 61 6c 75 65 c const SbSValue
1b80: 20 2a 73 62 73 5f 66 65 74 63 68 28 0a 20 20 53 *sbs_fetch(. S
1b90: 62 73 48 61 73 68 54 61 62 20 2a 70 48 61 73 68 bsHashTab *pHash
1ba0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 , . const char
1bb0: 2a 7a 4b 65 79 2c 20 0a 20 20 69 6e 74 20 6e 4b *zKey, . int nK
1bc0: 65 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 ey.){. int h;.
1bd0: 20 53 62 73 48 61 73 68 45 6e 74 72 79 20 2a 70 SbsHashEntry *p
1be0: 3b 0a 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30 20 ;.. if( nKey<0
1bf0: 29 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 ) nKey = strlen(
1c00: 7a 4b 65 79 29 3b 0a 20 20 68 20 3d 20 73 62 73 zKey);. h = sbs
1c10: 5f 68 61 73 68 28 7a 4b 65 79 2c 20 6e 4b 65 79 _hash(zKey, nKey
1c20: 29 3b 0a 20 20 66 6f 72 28 70 20 3d 20 70 48 61 );. for(p = pHa
1c30: 73 68 2d 3e 61 48 61 73 68 5b 68 5d 3b 20 70 3b sh->aHash[h]; p;
1c40: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 p=p->pNext){.
1c50: 20 20 69 66 28 20 70 2d 3e 6e 4b 65 79 3d 3d 6e if( p->nKey==n
1c60: 4b 65 79 20 26 26 20 6d 65 6d 63 6d 70 28 70 2d Key && memcmp(p-
1c70: 3e 7a 4b 65 79 2c 7a 4b 65 79 2c 6e 4b 65 79 29 >zKey,zKey,nKey)
1c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 ==0 ){. ret
1c90: 75 72 6e 20 26 70 2d 3e 76 61 6c 3b 0a 20 20 20 urn &p->val;.
1ca0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 }. }. return
1cb0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72 0;.}../*.** Stor
1cc0: 65 20 61 20 76 61 6c 75 65 20 69 6e 20 74 68 65 e a value in the
1cd0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4f 76 hash table. Ov
1ce0: 65 72 77 72 69 74 65 20 61 6e 79 20 70 72 69 6f erwrite any prio
1cf0: 72 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a 2a r value stored.*
1d00: 2a 20 75 6e 64 65 72 20 74 68 65 20 73 61 6d 65 * under the same
1d10: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 name..**.** If
1d20: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 the value in the
1d30: 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6e 65 4th argument ne
1d40: 65 64 73 20 74 6f 20 62 65 20 72 65 73 65 74 20 eds to be reset
1d50: 6f 72 20 66 72 65 65 64 2c 0a 2a 2a 20 74 68 65 or freed,.** the
1d60: 20 68 61 73 68 20 74 61 62 6c 65 20 77 69 6c 6c hash table will
1d70: 20 74 61 6b 65 20 6f 76 65 72 20 72 65 73 70 6f take over respo
1d80: 6e 73 69 62 69 6c 69 69 74 79 20 66 6f 72 20 64 nsibiliity for d
1d90: 6f 69 6e 67 20 73 6f 2e 0a 2a 2f 0a 73 74 61 74 oing so..*/.stat
1da0: 69 63 20 69 6e 74 20 73 62 73 5f 73 74 6f 72 65 ic int sbs_store
1db0: 28 0a 20 20 53 62 73 48 61 73 68 54 61 62 20 2a (. SbsHashTab *
1dc0: 70 48 61 73 68 2c 20 20 20 20 20 20 20 2f 2a 20 pHash, /*
1dd0: 49 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 69 73 Insert into this
1de0: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 hash table */.
1df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 const char *zKe
1e00: 79 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 y, /* The
1e10: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b key */. int nK
1e20: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ey,
1e30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 /* Size of th
1e40: 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 e key */. const
1e50: 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 75 SbSValue *pValu
1e60: 65 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 e /* The value
1e70: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 2a 2f to be stored */
1e80: 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 53 .){. int h;. S
1e90: 62 73 48 61 73 68 45 6e 74 72 79 20 2a 70 2c 20 bsHashEntry *p,
1ea0: 2a 70 4e 65 77 3b 0a 0a 20 20 69 66 28 20 6e 4b *pNew;.. if( nK
1eb0: 65 79 3c 30 20 29 20 6e 4b 65 79 20 3d 20 73 74 ey<0 ) nKey = st
1ec0: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 68 20 rlen(zKey);. h
1ed0: 3d 20 73 62 73 5f 68 61 73 68 28 7a 4b 65 79 2c = sbs_hash(zKey,
1ee0: 20 6e 4b 65 79 29 3b 0a 20 20 66 6f 72 28 70 20 nKey);. for(p
1ef0: 3d 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b 68 = pHash->aHash[h
1f00: 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 ]; p; p=p->pNext
1f10: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4b ){. if( p->nK
1f20: 65 79 3d 3d 6e 4b 65 79 20 26 26 20 6d 65 6d 63 ey==nKey && memc
1f30: 6d 70 28 70 2d 3e 7a 4b 65 79 2c 7a 4b 65 79 2c mp(p->zKey,zKey,
1f40: 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 nKey)==0 ){.
1f50: 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65 sbs_value_rese
1f60: 74 28 26 70 2d 3e 76 61 6c 29 3b 0a 20 20 20 20 t(&p->val);.
1f70: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 76 61 6c memcpy(&p->val
1f80: 2c 20 70 56 61 6c 75 65 2c 20 73 69 7a 65 6f 66 , pValue, sizeof
1f90: 28 70 2d 3e 76 61 6c 29 29 3b 0a 20 20 20 20 20 (p->val));.
1fa0: 20 72 65 74 75 72 6e 20 53 42 53 5f 4f 4b 3b 0a return SBS_OK;.
1fb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 }. }. pNew
1fc0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f = malloc( sizeo
1fd0: 66 28 2a 70 4e 65 77 29 20 2b 20 6e 4b 65 79 20 f(*pNew) + nKey
1fe0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b );. if( pNew ){
1ff0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4b 65 79 20 . pNew->nKey
2000: 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6d 65 6d 63 = nKey;. memc
2010: 70 79 28 70 4e 65 77 2d 3e 7a 4b 65 79 2c 20 7a py(pNew->zKey, z
2020: 4b 65 79 2c 20 6e 4b 65 79 2b 31 29 3b 0a 20 20 Key, nKey+1);.
2030: 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e memcpy(&pNew->
2040: 76 61 6c 2c 20 70 56 61 6c 75 65 2c 20 73 69 7a val, pValue, siz
2050: 65 6f 66 28 70 4e 65 77 2d 3e 76 61 6c 29 29 3b eof(pNew->val));
2060: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 . pNew->pNext
2070: 20 3d 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b = pHash->aHash[
2080: 68 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e 61 h];. pHash->a
2090: 48 61 73 68 5b 68 5d 20 3d 20 70 4e 65 77 3b 0a Hash[h] = pNew;.
20a0: 20 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f 4f return SBS_O
20b0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 K;. }. return
20c0: 53 42 53 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a SBS_ERROR;.}../*
20d0: 0a 2a 2a 20 52 65 73 65 74 20 61 20 68 61 73 68 .** Reset a hash
20e0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 table..*/.stati
20f0: 63 20 76 6f 69 64 20 73 62 73 5f 68 61 73 68 5f c void sbs_hash_
2100: 72 65 73 65 74 28 53 62 73 48 61 73 68 54 61 62 reset(SbsHashTab
2110: 20 2a 70 48 61 73 68 29 7b 0a 20 20 69 6e 74 20 *pHash){. int
2120: 69 3b 0a 20 20 53 62 73 48 61 73 68 45 6e 74 72 i;. SbsHashEntr
2130: 79 20 2a 70 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 y *p, *pNext;.
2140: 66 6f 72 28 69 3d 30 3b 20 69 3c 53 42 53 43 4f for(i=0; i<SBSCO
2150: 4e 46 49 47 5f 4e 48 41 53 48 3b 20 69 2b 2b 29 NFIG_NHASH; i++)
2160: 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 48 61 73 {. for(p=pHas
2170: 68 2d 3e 61 48 61 73 68 5b 69 5d 3b 20 70 3b 20 h->aHash[i]; p;
2180: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 p=pNext){.
2190: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 pNext = p->pNext
21a0: 3b 0a 20 20 20 20 20 20 73 62 73 5f 76 61 6c 75 ;. sbs_valu
21b0: 65 5f 72 65 73 65 74 28 26 70 2d 3e 76 61 6c 29 e_reset(&p->val)
21c0: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 70 29 3b ;. free(p);
21d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d . }. }. mem
21e0: 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20 73 69 set(pHash, 0, si
21f0: 7a 65 6f 66 28 2a 70 48 61 73 68 29 29 3b 0a 7d zeof(*pHash));.}
2200: 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20 76 ../*.** Push a v
2210: 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73 74 alue onto the st
2220: 61 63 6b 20 6f 66 20 61 6e 20 69 6e 74 65 72 70 ack of an interp
2230: 72 65 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 reter.*/.static
2240: 69 6e 74 20 73 62 73 5f 70 75 73 68 28 53 75 62 int sbs_push(Sub
2250: 73 63 72 69 70 74 20 2a 70 2c 20 53 62 53 56 61 script *p, SbSVa
2260: 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 66 lue *pVal){. if
2270: 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 53 42 53 ( p->nStack>=SBS
2280: 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20 29 7b CONFIG_NSTACK ){
2290: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 . sqlite3_snp
22a0: 72 69 6e 74 66 28 53 42 53 43 4f 4e 46 49 47 5f rintf(SBSCONFIG_
22b0: 45 52 52 53 49 5a 45 2c 20 70 2d 3e 7a 45 72 72 ERRSIZE, p->zErr
22c0: 4d 73 67 2c 20 22 73 74 61 63 6b 20 6f 76 65 72 Msg, "stack over
22d0: 66 6c 6f 77 22 29 3b 0a 20 20 20 20 72 65 74 75 flow");. retu
22e0: 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 rn SBS_ERROR;.
22f0: 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d }. p->aStack[p-
2300: 3e 6e 53 74 61 63 6b 2b 2b 5d 20 3d 20 2a 70 56 >nStack++] = *pV
2310: 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 42 53 al;. return SBS
2320: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 _OK;.}../*.** Cr
2330: 65 61 74 65 20 61 20 6e 65 77 20 73 75 62 73 63 eate a new subsc
2340: 72 69 70 74 20 69 6e 74 65 72 70 72 65 74 65 72 ript interpreter
2350: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e . Return a poin
2360: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 ter to the.** ne
2370: 77 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 6f w interpreter, o
2380: 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 r return NULL if
2390: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a malloc fails..*
23a0: 2f 0a 73 74 72 75 63 74 20 53 75 62 73 63 72 69 /.struct Subscri
23b0: 70 74 20 2a 53 62 53 5f 43 72 65 61 74 65 28 76 pt *SbS_Create(v
23c0: 6f 69 64 29 7b 0a 20 20 53 75 62 73 63 72 69 70 oid){. Subscrip
23d0: 74 20 2a 70 3b 0a 20 20 70 20 3d 20 6d 61 6c 6c t *p;. p = mall
23e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 oc( sizeof(*p) )
23f0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 ;. if( p ){.
2400: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 memset(p, 0, si
2410: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7d 0a 20 zeof(*p));. }.
2420: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a return p;.}../*
2430: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 61 6e 20 73 .** Destroy an s
2440: 75 62 73 63 72 69 70 74 20 69 6e 74 65 72 70 72 ubscript interpr
2450: 65 74 65 72 0a 2a 2f 0a 76 6f 69 64 20 53 62 53 eter.*/.void SbS
2460: 5f 44 65 73 74 72 6f 79 28 73 74 72 75 63 74 20 _Destroy(struct
2470: 53 75 62 73 63 72 69 70 74 20 2a 70 29 7b 0a 20 Subscript *p){.
2480: 20 69 6e 74 20 69 3b 0a 20 20 73 62 73 5f 68 61 int i;. sbs_ha
2490: 73 68 5f 72 65 73 65 74 28 26 70 2d 3e 73 79 6d sh_reset(&p->sym
24a0: 54 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b Tab);. for(i=0;
24b0: 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69 2b i<p->nStack; i+
24c0: 2b 29 7b 0a 20 20 20 20 73 62 73 5f 76 61 6c 75 +){. sbs_valu
24d0: 65 5f 72 65 73 65 74 28 26 70 2d 3e 61 53 74 61 e_reset(&p->aSta
24e0: 63 6b 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 72 ck[i]);. }. fr
24f0: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ee(p);.}../*.**
2500: 53 65 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65 Set the error me
2510: 73 73 61 67 65 20 66 6f 72 20 61 6e 20 69 6e 74 ssage for an int
2520: 65 72 70 72 65 74 65 72 2e 20 20 56 65 72 62 20 erpreter. Verb
2530: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a implementations.
2540: 2a 2a 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 ** use this rout
2550: 69 6e 65 20 77 68 65 6e 20 74 68 65 79 20 65 6e ine when they en
2560: 63 6f 75 6e 74 65 72 20 61 6e 20 65 72 72 6f 72 counter an error
2570: 2e 0a 2a 2f 0a 76 6f 69 64 20 53 62 53 5f 53 65 ..*/.void SbS_Se
2580: 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73 74 tErrorMessage(st
2590: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a ruct Subscript *
25a0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a p, const char *z
25b0: 45 72 72 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 Err, ...){. int
25c0: 20 6e 45 72 72 3b 0a 20 20 63 68 61 72 20 2a 7a nErr;. char *z
25d0: 4d 73 67 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 Msg;. va_list a
25e0: 70 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 p;.. va_start(a
25f0: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7a 4d 73 67 p, zErr);. zMsg
2600: 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 45 72 72 = vmprintf(zErr
2610: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 , ap);. va_end(
2620: 61 70 29 3b 0a 20 20 6e 45 72 72 20 3d 20 73 74 ap);. nErr = st
2630: 72 6c 65 6e 28 7a 4d 73 67 29 3b 0a 20 20 69 66 rlen(zMsg);. if
2640: 28 20 6e 45 72 72 3e 73 69 7a 65 6f 66 28 70 2d ( nErr>sizeof(p-
2650: 3e 7a 45 72 72 4d 73 67 29 2d 31 20 29 7b 0a 20 >zErrMsg)-1 ){.
2660: 20 20 20 6e 45 72 72 20 3d 20 73 69 7a 65 6f 66 nErr = sizeof
2670: 28 70 2d 3e 7a 45 72 72 4d 73 67 29 2d 31 3b 0a (p->zErrMsg)-1;.
2680: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e }. memcpy(p->
2690: 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 2c 20 6e zErrMsg, zMsg, n
26a0: 45 72 72 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d Err);. p->zErrM
26b0: 73 67 5b 6e 45 72 72 5d 20 3d 20 30 3b 0a 20 20 sg[nErr] = 0;.
26c0: 66 72 65 65 28 7a 4d 73 67 29 3b 0a 7d 0a 0a 2f free(zMsg);.}../
26d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f *.** Return a po
26e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 75 72 inter to the cur
26f0: 72 65 6e 74 20 65 72 72 6f 72 20 6d 65 73 73 61 rent error messa
2700: 67 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e ge for the.** in
2710: 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 63 6f terpreter..*/.co
2720: 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 47 65 nst char *SbS_Ge
2730: 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73 74 tErrorMessage(st
2740: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a ruct Subscript *
2750: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e p){. return p->
2760: 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a zErrMsg;.}../*.*
2770: 2a 20 41 64 64 20 61 20 6e 65 77 20 76 65 72 62 * Add a new verb
2780: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 74 65 72 the given inter
2790: 70 72 65 74 65 72 0a 2a 2f 0a 69 6e 74 20 53 62 preter.*/.int Sb
27a0: 53 5f 41 64 64 56 65 72 62 28 0a 20 20 73 74 72 S_AddVerb(. str
27b0: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 uct Subscript *p
27c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ,. const char *
27d0: 7a 56 65 72 62 2c 0a 20 20 69 6e 74 20 28 2a 78 zVerb,. int (*x
27e0: 56 65 72 62 29 28 73 74 72 75 63 74 20 53 75 62 Verb)(struct Sub
27f0: 73 63 72 69 70 74 2a 2c 76 6f 69 64 2a 29 2c 0a script*,void*),.
2800: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a void *pArg.){.
2810: 20 20 53 62 53 56 61 6c 75 65 20 76 3b 0a 20 20 SbSValue v;.
2820: 76 2e 66 6c 61 67 73 20 3d 20 53 42 53 56 41 4c v.flags = SBSVAL
2830: 5f 56 45 52 42 3b 0a 20 20 76 2e 75 2e 76 65 72 _VERB;. v.u.ver
2840: 62 2e 78 56 65 72 62 20 3d 20 78 56 65 72 62 3b b.xVerb = xVerb;
2850: 0a 20 20 76 2e 75 2e 76 65 72 62 2e 70 41 72 67 . v.u.verb.pArg
2860: 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72 = pArg;. retur
2870: 6e 20 73 62 73 5f 73 74 6f 72 65 28 26 70 2d 3e n sbs_store(&p->
2880: 73 79 6d 54 61 62 2c 20 7a 56 65 72 62 2c 20 2d symTab, zVerb, -
2890: 31 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 1, &v);.}../*.**
28a0: 20 53 74 6f 72 65 20 61 20 76 61 6c 75 65 20 69 Store a value i
28b0: 6e 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 n an interpreter
28c0: 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69 6e variable..*/.in
28d0: 74 20 53 62 53 5f 53 74 6f 72 65 28 0a 20 20 73 t SbS_Store(. s
28e0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
28f0: 2a 70 2c 20 20 20 2f 2a 20 53 74 6f 72 65 20 69 *p, /* Store i
2900: 6e 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72 nto this interpr
2910: 65 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 eter */. const
2920: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 char *zName,
2930: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 /* Name of the
2940: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 63 6f variable */. co
2950: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 nst char *zValue
2960: 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 , /* Value of
2970: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 2a 2f the variable */
2980: 0a 20 20 69 6e 74 20 70 65 72 73 69 73 74 65 6e . int persisten
2990: 63 65 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 ce /* 0:
29a0: 73 74 61 74 69 63 2e 20 20 31 3a 20 65 70 68 65 static. 1: ephe
29b0: 6d 65 72 61 6c 2e 20 20 32 3a 20 64 79 6e 61 6d meral. 2: dynam
29c0: 69 63 20 2a 2f 0a 29 7b 0a 20 20 53 62 53 56 61 ic */.){. SbSVa
29d0: 6c 75 65 20 76 3b 0a 20 20 76 2e 66 6c 61 67 73 lue v;. v.flags
29e0: 20 3d 20 53 42 53 56 41 4c 5f 53 54 52 3b 0a 20 = SBSVAL_STR;.
29f0: 20 76 2e 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20 v.u.str.size =
2a00: 73 74 72 6c 65 6e 28 7a 56 61 6c 75 65 29 3b 0a strlen(zValue);.
2a10: 20 20 69 66 28 20 70 65 72 73 69 73 74 65 6e 63 if( persistenc
2a20: 65 3d 3d 31 20 29 7b 0a 20 20 20 20 76 2e 75 2e e==1 ){. v.u.
2a30: 73 74 72 2e 7a 20 3d 20 6d 70 72 69 6e 74 66 28 str.z = mprintf(
2a40: 22 25 73 22 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 "%s", zValue);.
2a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2e 75 2e }else{. v.u.
2a60: 73 74 72 2e 7a 20 3d 20 28 63 68 61 72 2a 29 7a str.z = (char*)z
2a70: 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 69 66 28 Value;. }. if(
2a80: 20 70 65 72 73 69 73 74 65 6e 63 65 3e 30 20 29 persistence>0 )
2a90: 7b 0a 20 20 20 20 76 2e 66 6c 61 67 73 20 7c 3d {. v.flags |=
2aa0: 20 53 42 53 56 41 4c 5f 44 59 4e 3b 0a 20 20 7d SBSVAL_DYN;. }
2ab0: 0a 20 20 72 65 74 75 72 6e 20 73 62 73 5f 73 74 . return sbs_st
2ac0: 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62 2c 20 ore(&p->symTab,
2ad0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 26 76 29 3b 0a zName, -1, &v);.
2ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20 }../*.** Push a
2af0: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 6e 74 string value ont
2b00: 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a o the stack..**.
2b10: 2a 2a 20 49 66 20 74 68 65 20 34 74 68 20 70 61 ** If the 4th pa
2b20: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 rameter is 0, th
2b30: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 en the string is
2b40: 20 73 74 61 74 69 63 2e 0a 2a 2a 20 49 66 20 74 static..** If t
2b50: 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72 he 4th parameter
2b60: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 is non-zero the
2b70: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 77 61 73 n the string was
2b80: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f obtained.** fro
2b90: 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 53 75 62 m malloc and Sub
2ba0: 73 63 72 69 70 74 20 77 69 6c 6c 20 74 61 6b 65 script will take
2bb0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 responsibility
2bc0: 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 69 for freeing.** i
2bd0: 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 t..**.** Return
2be0: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 0 on success and
2bf0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 non-zero if the
2c00: 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a re is an error..
2c10: 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75 73 68 28 */.int SbS_Push(
2c20: 0a 20 20 73 74 72 75 63 74 20 53 75 62 73 63 72 . struct Subscr
2c30: 69 70 74 20 2a 70 2c 20 20 2f 2a 20 50 75 73 68 ipt *p, /* Push
2c40: 20 6f 6e 74 6f 20 74 68 69 73 20 69 6e 74 65 72 onto this inter
2c50: 70 72 65 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 preter */. char
2c60: 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 *z,
2c70: 20 20 2f 2a 20 53 74 72 69 6e 67 20 76 61 6c 75 /* String valu
2c80: 65 20 74 6f 20 70 75 73 68 20 2a 2f 0a 20 20 69 e to push */. i
2c90: 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 nt n,
2ca0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f /* Length o
2cb0: 66 20 74 68 65 20 73 74 72 69 6e 67 2c 20 6f 72 f the string, or
2cc0: 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 64 79 6e -1 */. int dyn
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
2ce0: 2a 20 49 66 20 74 72 75 65 2c 20 7a 20 77 61 73 * If true, z was
2cf0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d obtained from m
2d00: 61 6c 6c 6f 63 20 2a 2f 0a 29 7b 0a 20 20 53 62 alloc */.){. Sb
2d10: 53 56 61 6c 75 65 20 76 3b 0a 20 20 76 2e 66 6c SValue v;. v.fl
2d20: 61 67 73 20 3d 20 53 42 53 56 41 4c 5f 53 54 52 ags = SBSVAL_STR
2d30: 3b 0a 20 20 69 66 28 20 64 79 6e 20 29 7b 0a 20 ;. if( dyn ){.
2d40: 20 20 20 76 2e 66 6c 61 67 73 20 7c 3d 20 53 42 v.flags |= SB
2d50: 53 56 41 4c 5f 44 59 4e 3b 0a 20 20 7d 0a 20 20 SVAL_DYN;. }.
2d60: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 73 74 if( n<0 ) n = st
2d70: 72 6c 65 6e 28 7a 29 3b 0a 20 20 76 2e 75 2e 73 rlen(z);. v.u.s
2d80: 74 72 2e 73 69 7a 65 20 3d 20 6e 3b 0a 20 20 76 tr.size = n;. v
2d90: 2e 75 2e 73 74 72 2e 7a 20 3d 20 7a 3b 0a 20 20 .u.str.z = z;.
2da0: 72 65 74 75 72 6e 20 73 62 73 5f 70 75 73 68 28 return sbs_push(
2db0: 70 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a p, &v);.}../*.**
2dc0: 20 50 75 73 68 20 61 6e 20 69 6e 74 65 67 65 72 Push an integer
2dd0: 20 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 value onto the
2de0: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 stack..**.** Thi
2df0: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 6c 6c 79 s routine really
2e00: 20 6a 75 73 74 20 63 6f 6e 76 65 72 74 73 20 74 just converts t
2e10: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 he integer into
2e20: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 65 6e a string.** then
2e30: 20 63 61 6c 6c 73 20 53 62 53 5f 50 75 73 68 2e calls SbS_Push.
2e40: 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75 73 68 .*/.int SbS_Push
2e50: 49 6e 74 28 73 74 72 75 63 74 20 53 75 62 73 63 Int(struct Subsc
2e60: 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 69 56 61 ript *p, int iVa
2e70: 6c 29 7b 0a 20 20 69 66 28 20 69 56 61 6c 3d 3d l){. if( iVal==
2e80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 0 ){. return
2e90: 53 62 53 5f 50 75 73 68 28 70 2c 20 22 30 22 2c SbS_Push(p, "0",
2ea0: 20 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 1, 0);. }else
2eb0: 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20 if( iVal==1 ){.
2ec0: 20 20 20 72 65 74 75 72 6e 20 53 62 53 5f 50 75 return SbS_Pu
2ed0: 73 68 28 70 2c 20 22 31 22 2c 20 31 2c 20 30 29 sh(p, "1", 1, 0)
2ee0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 ;. }else{. c
2ef0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 har *z;. int
2f00: 6e 3b 0a 20 20 20 20 63 68 61 72 20 7a 56 61 6c n;. char zVal
2f10: 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 [50];. sprint
2f20: 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20 69 56 f(zVal, "%d", iV
2f30: 61 6c 29 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 al);. n = str
2f40: 6c 65 6e 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7a len(zVal);. z
2f50: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 = malloc( n+1 )
2f60: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 ;. if( z ){.
2f70: 20 20 20 20 20 73 74 72 63 70 79 28 7a 2c 20 7a strcpy(z, z
2f80: 56 61 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 Val);. retu
2f90: 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c 20 7a rn SbS_Push(p, z
2fa0: 2c 20 6e 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c , n, 1);. }el
2fb0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e se{. return
2fc0: 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 SBS_ERROR;.
2fd0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 }. }.}../*.** P
2fe0: 6f 70 20 61 6e 64 20 64 65 73 74 72 6f 79 20 7a op and destroy z
2ff0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 ero or more valu
3000: 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 es from the stac
3010: 6b 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 k..** Return the
3020: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75 65 number of value
3030: 73 20 72 65 6d 61 69 6e 69 6e 67 20 6f 6e 20 74 s remaining on t
3040: 68 65 20 73 74 61 63 6b 20 61 66 74 65 72 0a 2a he stack after.*
3050: 2a 20 74 68 65 20 70 6f 70 73 20 6f 63 63 75 72 * the pops occur
3060: 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 6f 70 ..*/.int SbS_Pop
3070: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 (struct Subscrip
3080: 74 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 t *p, int N){.
3090: 77 68 69 6c 65 28 20 4e 3e 30 20 26 26 20 70 2d while( N>0 && p-
30a0: 3e 6e 53 74 61 63 6b 3e 30 20 29 7b 0a 20 20 20 >nStack>0 ){.
30b0: 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b 0a 20 20 p->nStack--;.
30c0: 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 65 sbs_value_rese
30d0: 74 28 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e t(&p->aStack[p->
30e0: 6e 53 74 61 63 6b 5d 29 3b 0a 20 20 20 20 4e 2d nStack]);. N-
30f0: 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 -;. }. return
3100: 70 2d 3e 6e 53 74 61 63 6b 3b 0a 7d 0a 0a 2f 2a p->nStack;.}../*
3110: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e .** Return the N
3120: 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 -th element of t
3130: 68 65 20 73 74 61 63 6b 2e 20 20 30 20 69 73 20 he stack. 0 is
3140: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 the top of the s
3150: 74 61 63 6b 2e 0a 2a 2a 20 31 20 69 73 20 74 68 tack..** 1 is th
3160: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 e first element
3170: 64 6f 77 6e 2e 20 20 32 20 69 73 20 74 68 65 20 down. 2 is the
3180: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 2e 20 second element.
3190: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a And so forth..*
31a0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 * Return NULL if
31b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e 2d 74 there is no N-t
31c0: 68 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a h element..**.**
31d0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 The pointer ret
31e0: 75 72 6e 65 64 20 69 73 20 6f 6e 6c 79 20 76 61 urned is only va
31f0: 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 76 61 lid until the va
3200: 6c 75 65 20 69 73 20 70 6f 70 70 65 64 0a 2a 2a lue is popped.**
3210: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e from the stack.
3220: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a .*/.const char *
3230: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 73 SbS_StackValue(s
3240: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
3250: 2a 70 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 2a *p, int N, int *
3260: 70 53 69 7a 65 29 7b 0a 20 20 53 62 53 56 61 6c pSize){. SbSVal
3270: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 66 28 20 ue *pVal;. if(
3280: 4e 3c 30 20 7c 7c 20 4e 3e 3d 70 2d 3e 6e 53 74 N<0 || N>=p->nSt
3290: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ack ){. retur
32a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 56 61 6c 20 n 0;. }. pVal
32b0: 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e = &p->aStack[p->
32c0: 6e 53 74 61 63 6b 2d 4e 2d 31 5d 3b 0a 20 20 69 nStack-N-1];. i
32d0: 66 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 f( (pVal->flags
32e0: 26 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d 30 & SBSVAL_STR)==0
32f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
3300: 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d ;. }. *pSize =
3310: 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a pVal->u.str.siz
3320: 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c e;. return pVal
3330: 2d 3e 75 2e 73 74 72 2e 7a 3b 0a 7d 0a 0a 2f 2a ->u.str.z;.}../*
3340: 0a 2a 2a 20 41 20 63 6f 6e 76 65 6e 69 65 6e 63 .** A convenienc
3350: 65 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 78 e routine for ex
3360: 74 72 61 63 74 69 6e 67 20 61 6e 20 69 6e 74 65 tracting an inte
3370: 67 65 72 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 ger value from t
3380: 68 65 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a he.** stack..*/.
3390: 69 6e 74 20 53 62 53 5f 53 74 61 63 6b 56 61 6c int SbS_StackVal
33a0: 75 65 49 6e 74 28 73 74 72 75 63 74 20 53 75 62 ueInt(struct Sub
33b0: 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 4e script *p, int N
33c0: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 76 3b 0a 20 ){. int n, v;.
33d0: 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a int isNeg = 0;.
33e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 const char *z
33f0: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 = SbS_StackValue
3400: 28 70 2c 20 4e 2c 20 26 6e 29 3b 0a 20 20 76 20 (p, N, &n);. v
3410: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 = 0;. if( n==0
3420: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 ) return 0;. if
3430: 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 ( z[0]=='-' ){.
3440: 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20 isNeg = 1;.
3450: 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a z++;. n--;.
3460: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d }else if( z[0]
3470: 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 2b 2b =='+' ){. z++
3480: 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 ;. n--;. }.
3490: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 69 while( n>0 && i
34a0: 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b 0a sdigit(z[0]) ){.
34b0: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a v = v*10 + z
34c0: 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 7a [0] - '0';. z
34d0: 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d ++;. n--;. }
34e0: 0a 20 20 69 66 28 20 69 73 4e 65 67 20 29 7b 0a . if( isNeg ){.
34f0: 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20 7d 0a v = -v;. }.
3500: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f return v;.}../
3510: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 74 68 *.** Retrieve th
3520: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 76 61 72 e value of a var
3530: 69 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 iable from the i
3540: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 52 65 74 nterpreter. Ret
3550: 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 6e urn.** NULL if n
3560: 6f 20 73 75 63 68 20 76 61 72 69 61 62 6c 65 20 o such variable
3570: 69 73 20 64 65 66 69 6e 65 64 2e 20 20 0a 2a 2a is defined. .**
3580: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 .** The returned
3590: 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 6e string is not n
35a0: 65 63 65 73 73 61 72 69 6c 79 20 28 70 72 6f 62 ecessarily (prob
35b0: 61 62 6c 79 20 6e 6f 74 29 20 7a 65 72 6f 2d 74 ably not) zero-t
35c0: 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 54 68 erminated..** Th
35d0: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 e string may be
35e0: 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 deallocated the
35f0: 6e 65 78 74 20 74 69 6d 65 20 61 6e 79 74 68 69 next time anythi
3600: 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 0a 2a 2a ng is done to.**
3610: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
3620: 2e 20 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 69 . Make a copy i
3630: 66 20 79 6f 75 20 6e 65 65 64 20 69 74 20 74 6f f you need it to
3640: 20 70 65 72 73 69 73 74 2e 0a 2a 2f 0a 63 6f 6e persist..*/.con
3650: 73 74 20 63 68 61 72 20 2a 53 62 53 5f 46 65 74 st char *SbS_Fet
3660: 63 68 28 0a 20 20 73 74 72 75 63 74 20 53 75 62 ch(. struct Sub
3670: 73 63 72 69 70 74 20 2a 70 2c 20 20 20 2f 2a 20 script *p, /*
3680: 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 The interpreter
3690: 77 65 20 61 72 65 20 69 6e 74 65 72 72 6f 67 61 we are interroga
36a0: 74 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 ting */. const
36b0: 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20 char *zKey,
36c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
36d0: 65 20 76 61 72 69 61 62 6c 65 2e 20 20 43 61 73 e variable. Cas
36e0: 65 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a 20 e sensitive */.
36f0: 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 int nKey,
3700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e /* Len
3710: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 20 2a gth of the key *
3720: 2f 0a 20 20 69 6e 74 20 2a 70 4c 65 6e 67 74 68 /. int *pLength
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
3740: 57 72 69 74 65 20 74 68 65 20 6c 65 6e 67 74 68 Write the length
3750: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f here */.){. co
3760: 6e 73 74 20 53 62 53 56 61 6c 75 65 20 2a 70 56 nst SbSValue *pV
3770: 61 6c 3b 0a 0a 20 20 70 56 61 6c 20 3d 20 73 62 al;.. pVal = sb
3780: 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d 54 s_fetch(&p->symT
3790: 61 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b ab, zKey, nKey);
37a0: 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 7c . if( pVal==0 |
37b0: 7c 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 | (pVal->flags &
37c0: 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d 30 20 SBSVAL_STR)==0
37d0: 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 67 74 68 20 ){. *pLength
37e0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 = 0;. return
37f0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0;. }else{.
3800: 2a 70 4c 65 6e 67 74 68 20 3d 20 70 56 61 6c 2d *pLength = pVal-
3810: 3e 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 20 >u.str.size;.
3820: 20 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 75 2e return pVal->u.
3830: 73 74 72 2e 7a 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a str.z;. }.}../*
3840: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 .** Generate an
3850: 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e error and return
3860: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 non-zero if the
3870: 20 73 74 61 63 6b 20 68 61 73 0a 2a 2a 20 66 65 stack has.** fe
3880: 77 65 72 20 74 68 61 6e 20 4e 20 65 6c 65 6d 65 wer than N eleme
3890: 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 74 nts. This is ut
38a0: 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75 73 ility routine us
38b0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6d 70 ed in.** the imp
38c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 76 lementation of v
38d0: 65 72 62 73 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 erbs..*/.int SbS
38e0: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 73 74 _RequireStack(st
38f0: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a ruct Subscript *
3900: 70 2c 20 69 6e 74 20 4e 2c 20 63 6f 6e 73 74 20 p, int N, const
3910: 63 68 61 72 20 2a 7a 43 6d 64 29 7b 0a 20 20 69 char *zCmd){. i
3920: 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 4e 20 f( p->nStack>=N
3930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 ) return 0;. sq
3940: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 lite3_snprintf(s
3950: 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 72 4d 73 67 izeof(p->zErrMsg
3960: 29 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20 ), p->zErrMsg,.
3970: 20 20 20 20 22 5c 22 25 73 5c 22 20 72 65 71 75 "\"%s\" requ
3980: 69 72 65 73 20 61 74 20 6c 65 61 73 74 20 25 64 ires at least %d
3990: 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 73 20 stack elements
39a0: 2d 20 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 64 22 - only found %d"
39b0: 2c 0a 20 20 20 20 20 7a 43 6d 64 2c 20 4e 2c 20 ,. zCmd, N,
39c0: 70 2d 3e 6e 53 74 61 63 6b 29 3b 0a 20 20 72 65 p->nStack);. re
39d0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 1;.}../*.**
39e0: 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 Subscript comma
39f0: 6e 64 3a 20 20 20 20 20 20 20 53 54 52 49 4e 47 nd: STRING
3a00: 20 4e 41 4d 45 20 73 65 74 0a 2a 2a 0a 2a 2a 20 NAME set.**.**
3a10: 57 72 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 Write the value
3a20: 6f 66 20 53 54 52 49 4e 47 20 69 6e 74 6f 20 76 of STRING into v
3a30: 61 72 69 61 62 6c 65 20 63 61 6c 6c 65 64 20 4e ariable called N
3a40: 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 AME..*/.static i
3a50: 6e 74 20 73 65 74 43 6d 64 28 53 75 62 73 63 72 nt setCmd(Subscr
3a60: 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e ipt *p, void *pN
3a70: 6f 74 55 73 65 64 29 7b 0a 20 20 53 62 53 56 61 otUsed){. SbSVa
3a80: 6c 75 65 20 2a 70 54 6f 73 3b 0a 20 20 53 62 53 lue *pTos;. SbS
3a90: 56 61 6c 75 65 20 2a 70 4e 6f 73 3b 0a 20 20 69 Value *pNos;. i
3aa0: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 f( SbS_RequireSt
3ab0: 61 63 6b 28 70 2c 20 32 2c 20 22 73 65 74 22 29 ack(p, 2, "set")
3ac0: 20 29 20 72 65 74 75 72 6e 20 53 42 53 5f 45 52 ) return SBS_ER
3ad0: 52 4f 52 3b 0a 20 20 70 54 6f 73 20 3d 20 26 70 ROR;. pTos = &p
3ae0: 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e 6e 53 ->aStack[--p->nS
3af0: 74 61 63 6b 5d 3b 0a 20 20 70 4e 6f 73 20 3d 20 tack];. pNos =
3b00: 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e &p->aStack[--p->
3b10: 6e 53 74 61 63 6b 5d 3b 0a 20 20 73 62 73 5f 73 nStack];. sbs_s
3b20: 74 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62 2c tore(&p->symTab,
3b30: 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 7a 2c 20 pTos->u.str.z,
3b40: 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 pTos->u.str.size
3b50: 2c 20 70 4e 6f 73 29 3b 0a 20 20 73 62 73 5f 76 , pNos);. sbs_v
3b60: 61 6c 75 65 5f 72 65 73 65 74 28 70 54 6f 73 29 alue_reset(pTos)
3b70: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a ;. return 0;.}.
3b80: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 ./*.** Subscript
3b90: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 49 command: I
3ba0: 4e 54 45 47 45 52 20 6e 6f 74 20 49 4e 54 45 47 NTEGER not INTEG
3bb0: 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 ER.*/.static int
3bc0: 20 6e 6f 74 43 6d 64 28 73 74 72 75 63 74 20 53 notCmd(struct S
3bd0: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 ubscript *p, voi
3be0: 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 d *pNotUsed){.
3bf0: 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 53 62 53 int n;. if( SbS
3c00: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c _RequireStack(p,
3c10: 20 31 2c 20 22 6e 6f 74 22 29 20 29 20 72 65 74 1, "not") ) ret
3c20: 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20 53 62 53 urn 1;. n = SbS
3c30: 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 28 70 _StackValueInt(p
3c40: 2c 20 30 29 3b 0a 20 20 53 62 53 5f 50 6f 70 28 , 0);. SbS_Pop(
3c50: 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f 50 75 73 p, 1);. SbS_Pus
3c60: 68 49 6e 74 28 70 2c 20 21 6e 29 3b 0a 20 20 72 hInt(p, !n);. r
3c70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 64 65 66 eturn 0;.}..#def
3c80: 69 6e 65 20 53 42 53 4f 50 5f 41 44 44 20 20 20 ine SBSOP_ADD
3c90: 31 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 1.#define SBSOP_
3ca0: 53 55 42 20 20 20 32 0a 23 64 65 66 69 6e 65 20 SUB 2.#define
3cb0: 53 42 53 4f 50 5f 4d 55 4c 20 20 20 33 0a 23 64 SBSOP_MUL 3.#d
3cc0: 65 66 69 6e 65 20 53 42 53 4f 50 5f 44 49 56 20 efine SBSOP_DIV
3cd0: 20 20 34 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 4.#define SBSO
3ce0: 50 5f 41 4e 44 20 20 20 35 0a 23 64 65 66 69 6e P_AND 5.#defin
3cf0: 65 20 53 42 53 4f 50 5f 4f 52 20 20 20 20 36 0a e SBSOP_OR 6.
3d00: 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 4d 49 #define SBSOP_MI
3d10: 4e 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 42 N 7.#define SB
3d20: 53 4f 50 5f 4d 41 58 20 20 20 38 0a 0a 2f 2a 0a SOP_MAX 8../*.
3d30: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d ** Subscript com
3d40: 6d 61 6e 64 3a 20 20 20 20 20 20 49 4e 54 45 47 mand: INTEG
3d50: 45 52 20 49 4e 54 45 47 45 52 20 3c 62 69 6e 61 ER INTEGER <bina
3d60: 72 79 2d 6f 70 3e 20 49 4e 54 45 47 45 52 0a 2a ry-op> INTEGER.*
3d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 70 /.static int bop
3d80: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63 Cmd(struct Subsc
3d90: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 ript *p, void *p
3da0: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 2c 20 62 2c Op){. int a, b,
3db0: 20 63 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 c;. if( SbS_Re
3dc0: 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20 32 2c quireStack(p, 2,
3dd0: 20 22 42 49 4e 41 52 59 2d 4f 50 22 29 20 29 20 "BINARY-OP") )
3de0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 20 3d 20 return 1;. a =
3df0: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e SbS_StackValueIn
3e00: 74 28 70 2c 20 30 29 3b 0a 20 20 62 20 3d 20 53 t(p, 0);. b = S
3e10: 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 bS_StackValueInt
3e20: 28 70 2c 20 31 29 3b 0a 20 20 73 77 69 74 63 68 (p, 1);. switch
3e30: 28 20 28 69 6e 74 29 70 4f 70 20 29 7b 0a 20 20 ( (int)pOp ){.
3e40: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 41 44 44 case SBSOP_ADD
3e50: 3a 20 20 63 20 3d 20 61 2b 62 3b 20 20 20 20 20 : c = a+b;
3e60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3e70: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 53 55 42 case SBSOP_SUB
3e80: 3a 20 20 63 20 3d 20 61 2d 62 3b 20 20 20 20 20 : c = a-b;
3e90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3ea0: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 55 4c case SBSOP_MUL
3eb0: 3a 20 20 63 20 3d 20 61 2a 62 3b 20 20 20 20 20 : c = a*b;
3ec0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3ed0: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 44 49 56 case SBSOP_DIV
3ee0: 3a 20 20 63 20 3d 20 62 21 3d 30 20 3f 20 61 2f : c = b!=0 ? a/
3ef0: 62 20 3a 20 30 3b 20 62 72 65 61 6b 3b 0a 20 20 b : 0; break;.
3f00: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 41 4e 44 case SBSOP_AND
3f10: 3a 20 20 63 20 3d 20 61 20 26 26 20 62 3b 20 20 : c = a && b;
3f20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3f30: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4f 52 3a case SBSOP_OR:
3f40: 20 20 20 63 20 3d 20 61 20 7c 7c 20 62 3b 20 20 c = a || b;
3f50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3f60: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 49 4e case SBSOP_MIN
3f70: 3a 20 20 63 20 3d 20 61 3c 62 20 3f 20 61 20 3a : c = a<b ? a :
3f80: 20 62 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 b; break;.
3f90: 20 20 63 61 73 65 20 53 42 53 4f 50 5f 4d 41 58 case SBSOP_MAX
3fa0: 3a 20 20 63 20 3d 20 61 3c 62 20 3f 20 62 20 3a : c = a<b ? b :
3fb0: 20 61 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 a; break;.
3fc0: 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 32 }. SbS_Pop(p, 2
3fd0: 29 3b 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 );. SbS_PushInt
3fe0: 28 70 2c 20 63 29 3b 0a 20 20 72 65 74 75 72 6e (p, c);. return
3ff0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 0;.}../*.** Sub
4000: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 script command:
4010: 20 20 20 20 53 54 52 49 4e 47 20 68 61 73 63 61 STRING hasca
4020: 70 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 p INTEGER.**.**
4030: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 Return true if t
4040: 68 65 20 75 73 65 72 20 68 61 73 20 61 6c 6c 20 he user has all
4050: 6f 66 20 74 68 65 20 63 61 70 61 62 69 6c 69 74 of the capabilit
4060: 69 65 73 20 6c 69 73 74 65 64 2e 0a 2a 2f 0a 73 ies listed..*/.s
4070: 74 61 74 69 63 20 69 6e 74 20 68 61 73 63 61 70 tatic int hascap
4080: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63 Cmd(struct Subsc
4090: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 ript *p, void *p
40a0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 NotUsed){. cons
40b0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 t char *z;. int
40c0: 20 6e 2c 20 61 3b 0a 20 20 69 66 28 20 53 62 53 n, a;. if( SbS
40d0: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c _RequireStack(p,
40e0: 20 31 2c 20 22 68 61 73 63 61 70 22 29 20 29 20 1, "hascap") )
40f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 return 1;. z =
4100: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 SbS_StackValue(p
4110: 2c 20 30 2c 20 26 6e 29 3b 0a 20 20 61 20 3d 20 , 0, &n);. a =
4120: 6c 6f 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69 login_has_capabi
4130: 6c 69 74 79 28 7a 2c 20 6e 29 3b 0a 20 20 53 62 lity(z, n);. Sb
4140: 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 S_Pop(p, 1);. S
4150: 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 61 29 bS_PushInt(p, a)
4160: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a ;. return 0;.}.
4170: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 ./*.** Subscript
4180: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 53 54 command: ST
4190: 52 49 4e 47 20 6c 69 6e 65 63 6f 75 6e 74 20 49 RING linecount I
41a0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 74 NTEGER.**.** Ret
41b0: 75 72 6e 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 urn one more tha
41c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
41d0: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 20 69 6e \n characters in
41e0: 20 53 54 52 49 4e 47 2e 0a 2a 2f 0a 73 74 61 74 STRING..*/.stat
41f0: 69 63 20 69 6e 74 20 6c 69 6e 65 63 6e 74 43 6d ic int linecntCm
4200: 64 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 d(struct Subscri
4210: 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f pt *p, void *pNo
4220: 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 tUsed){. const
4230: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 73 char *z;. int s
4240: 69 7a 65 2c 20 6e 2c 20 69 3b 0a 20 20 69 66 28 ize, n, i;. if(
4250: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 SbS_RequireStac
4260: 6b 28 70 2c 20 31 2c 20 22 6c 69 6e 65 63 6f 75 k(p, 1, "linecou
4270: 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b nt") ) return 1;
4280: 0a 20 20 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b . z = SbS_Stack
4290: 56 61 6c 75 65 28 70 2c 20 30 2c 20 26 73 69 7a Value(p, 0, &siz
42a0: 65 29 3b 0a 20 20 66 6f 72 28 6e 3d 31 2c 20 69 e);. for(n=1, i
42b0: 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 =0; i<size; i++)
42c0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d {. if( z[i]==
42d0: 27 5c 6e 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a '\n' ) n++;. }.
42e0: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b SbS_Pop(p, 1);
42f0: 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70 . SbS_PushInt(p
4300: 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 , n);. return 0
4310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 ;.}../*.** Subsc
4320: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 ript command:
4330: 20 20 4e 41 4d 45 20 65 78 69 73 74 73 20 49 4e NAME exists IN
4340: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 74 75 TEGER.**.** Retu
4350: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 76 rn TRUE if the v
4360: 61 72 69 61 62 6c 65 20 4e 41 4d 45 20 65 78 69 ariable NAME exi
4370: 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 sts..*/.static i
4380: 6e 74 20 65 78 69 73 74 73 43 6d 64 28 73 74 72 nt existsCmd(str
4390: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 uct Subscript *p
43a0: 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 , void *pNotUsed
43b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
43c0: 2a 7a 3b 0a 20 20 69 6e 74 20 73 69 7a 65 2c 20 *z;. int size,
43d0: 78 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 x;. if( SbS_Req
43e0: 75 69 72 65 53 74 61 63 6b 28 70 2c 20 31 2c 20 uireStack(p, 1,
43f0: 22 65 78 69 73 74 73 22 29 20 29 20 72 65 74 75 "exists") ) retu
4400: 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 53 62 53 5f rn 1;. z = SbS_
4410: 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c StackValue(p, 0,
4420: 20 26 73 69 7a 65 29 3b 0a 20 20 78 20 3d 20 73 &size);. x = s
4430: 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d bs_fetch(&p->sym
4440: 54 61 62 2c 20 28 63 68 61 72 2a 29 7a 2c 20 73 Tab, (char*)z, s
4450: 69 7a 65 29 21 3d 30 3b 0a 20 20 53 62 53 5f 50 ize)!=0;. SbS_P
4460: 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f op(p, 1);. SbS_
4470: 50 75 73 68 49 6e 74 28 70 2c 20 78 29 3b 0a 20 PushInt(p, x);.
4480: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
4490: 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f .** Subscript co
44a0: 6d 6d 61 6e 64 3a 20 20 20 20 20 20 20 56 41 4c mmand: VAL
44b0: 55 45 20 4e 41 4d 45 20 67 65 74 20 56 41 4c 55 UE NAME get VALU
44c0: 45 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20 74 68 65 E.**.** Push the
44d0: 20 76 61 6c 75 65 20 6f 66 20 76 61 72 69 62 6c value of varibl
44e0: 65 20 4e 41 4d 45 20 6f 6e 74 6f 20 74 68 65 20 e NAME onto the
44f0: 73 74 61 63 6b 20 69 66 20 69 74 20 65 78 69 73 stack if it exis
4500: 74 73 2e 0a 2a 2a 20 49 66 20 4e 41 4d 45 20 64 ts..** If NAME d
4510: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 70 oes not exist, p
4520: 75 74 73 20 56 41 4c 55 45 20 6f 6e 74 6f 20 74 uts VALUE onto t
4530: 68 65 20 73 74 61 63 6b 20 69 6e 73 74 65 61 64 he stack instead
4540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
4550: 67 65 74 43 6d 64 28 53 75 62 73 63 72 69 70 74 getCmd(Subscript
4560: 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 *p, void *pNotU
4570: 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 sed){. const ch
4580: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 ar *zName;. int
4590: 20 6e 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 nName;. const
45a0: 53 62 53 56 61 6c 75 65 20 2a 70 56 61 6c 3b 0a SbSValue *pVal;.
45b0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 int rc = 0;.
45c0: 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 . if( SbS_Requi
45d0: 72 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 67 reStack(p, 2, "g
45e0: 65 74 22 29 20 29 20 72 65 74 75 72 6e 20 53 42 et") ) return SB
45f0: 53 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 S_ERROR;. zName
4600: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 = SbS_StackValu
4610: 65 28 70 2c 20 30 2c 20 26 6e 4e 61 6d 65 29 3b e(p, 0, &nName);
4620: 0a 20 20 70 56 61 6c 20 3d 20 73 62 73 5f 66 65 . pVal = sbs_fe
4630: 74 63 68 28 26 70 2d 3e 73 79 6d 54 61 62 2c 20 tch(&p->symTab,
4640: 28 63 68 61 72 2a 29 7a 4e 61 6d 65 2c 20 6e 4e (char*)zName, nN
4650: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 61 6c ame);. if( pVal
4660: 21 3d 30 20 26 26 20 28 70 56 61 6c 2d 3e 66 6c !=0 && (pVal->fl
4670: 61 67 73 20 26 20 53 42 53 56 41 4c 5f 53 54 52 ags & SBSVAL_STR
4680: 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 62 53 5f )!=0 ){. SbS_
4690: 50 6f 70 28 70 2c 20 32 29 3b 0a 20 20 20 20 72 Pop(p, 2);. r
46a0: 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70 2c 20 c = SbS_Push(p,
46b0: 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a 2c 20 70 pVal->u.str.z, p
46c0: 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 2c Val->u.str.size,
46d0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0);. }else{.
46e0: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b SbS_Pop(p, 1);
46f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 . }. return rc
4700: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 ;.}..../*.** Tru
4710: 65 20 69 66 20 6f 75 74 70 75 74 20 69 73 20 65 e if output is e
4720: 6e 61 62 6c 65 64 2e 20 20 46 61 6c 73 65 20 69 nabled. False i
4730: 66 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73 f disabled..*/.s
4740: 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 tatic int enable
4750: 4f 75 74 70 75 74 20 3d 20 31 3b 0a 0a 2f 2a 0a Output = 1;../*.
4760: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d ** Subscript com
4770: 6d 61 6e 64 3a 20 20 20 20 20 20 42 4f 4f 4c 45 mand: BOOLE
4780: 41 4e 20 65 6e 61 62 6c 65 5f 6f 75 74 70 75 74 AN enable_output
4790: 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 .**.** Enable or
47a0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 70 75 74 disable the put
47b0: 73 20 61 6e 64 20 68 70 75 74 73 20 63 6f 6d 6d s and hputs comm
47c0: 61 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ands..*/.static
47d0: 69 6e 74 20 65 6e 61 62 6c 65 4f 75 74 70 75 74 int enableOutput
47e0: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63 Cmd(struct Subsc
47f0: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 ript *p, void *p
4800: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 66 28 20 NotUsed){. if(
4810: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b SbS_RequireStack
4820: 28 70 2c 20 31 2c 20 22 65 6e 61 62 6c 65 5f 6f (p, 1, "enable_o
4830: 75 74 70 75 74 22 29 20 29 20 72 65 74 75 72 6e utput") ) return
4840: 20 31 3b 0a 20 20 65 6e 61 62 6c 65 4f 75 74 70 1;. enableOutp
4850: 75 74 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 ut = SbS_StackVa
4860: 6c 75 65 49 6e 74 28 70 2c 20 30 29 21 3d 30 3b lueInt(p, 0)!=0;
4870: 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 . SbS_Pop(p, 1)
4880: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a ;. return 0;.}.
4890: 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 74 65 78 74 ./*.** Send text
48a0: 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 to the appropri
48b0: 61 74 65 20 6f 75 74 70 75 74 3a 20 20 45 69 74 ate output: Eit
48c0: 68 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 73 6f her to the conso
48d0: 6c 65 0a 2a 2a 20 6f 72 20 74 6f 20 74 68 65 20 le.** or to the
48e0: 43 47 49 20 72 65 70 6c 79 20 62 75 66 66 65 72 CGI reply buffer
48f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
4900: 20 73 65 6e 64 54 65 78 74 28 63 6f 6e 73 74 20 sendText(const
4910: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b char *z, int n){
4920: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 4f 75 74 . if( enableOut
4930: 70 75 74 20 26 26 20 6e 20 29 7b 0a 20 20 20 20 put && n ){.
4940: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 73 74 if( n<0 ) n = st
4950: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 rlen(z);. if(
4960: 20 67 2e 63 67 69 50 61 6e 69 63 20 29 7b 0a 20 g.cgiPanic ){.
4970: 20 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f cgi_append_
4980: 63 6f 6e 74 65 6e 74 28 7a 2c 20 6e 29 3b 0a 20 content(z, n);.
4990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
49a0: 66 77 72 69 74 65 28 7a 2c 20 31 2c 20 6e 2c 20 fwrite(z, 1, n,
49b0: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 stdout);. }.
49c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 }.}../*.** Subs
49d0: 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 cript command:
49e0: 20 20 20 20 53 54 52 49 4e 47 20 70 75 74 73 0a STRING puts.
49f0: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d ** Subscript com
4a00: 6d 61 6e 64 3a 20 20 20 20 20 20 53 54 52 49 4e mand: STRIN
4a10: 47 20 68 74 6d 6c 0a 2a 2a 0a 2a 2a 20 4f 75 74 G html.**.** Out
4a20: 70 75 74 20 53 54 52 49 4e 47 20 61 73 20 48 54 put STRING as HT
4a30: 4d 4c 20 28 68 74 6d 6c 29 20 6f 72 20 75 6e 63 ML (html) or unc
4a40: 68 61 6e 67 65 64 20 28 70 75 74 73 29 2e 20 20 hanged (puts).
4a50: 0a 2a 2a 20 50 6f 70 20 69 74 20 66 72 6f 6d 20 .** Pop it from
4a60: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 the stack..*/.st
4a70: 61 74 69 63 20 69 6e 74 20 70 75 74 73 43 6d 64 atic int putsCmd
4a80: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 (struct Subscrip
4a90: 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 43 6f 6e t *p, void *pCon
4aa0: 76 65 72 74 29 7b 0a 20 20 69 6e 74 20 73 69 7a vert){. int siz
4ab0: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 e;. const char
4ac0: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 *z;. char *zOut
4ad0: 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 ;. if( SbS_Requ
4ae0: 69 72 65 53 74 61 63 6b 28 70 2c 20 31 2c 20 22 ireStack(p, 1, "
4af0: 70 75 74 73 22 29 20 29 20 72 65 74 75 72 6e 20 puts") ) return
4b00: 31 3b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 4f 1;. if( enableO
4b10: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 7a 20 3d utput ){. z =
4b20: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 SbS_StackValue(
4b30: 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b 0a 20 20 p, 0, &size);.
4b40: 20 20 69 66 28 20 70 43 6f 6e 76 65 72 74 20 29 if( pConvert )
4b50: 7b 20 20 20 20 0a 20 20 20 20 20 20 7a 4f 75 74 { . zOut
4b60: 20 3d 20 68 74 6d 6c 69 7a 65 28 7a 2c 20 73 69 = htmlize(z, si
4b70: 7a 65 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 ze);. size
4b80: 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a = strlen(zOut);.
4b90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
4ba0: 20 7a 4f 75 74 20 3d 20 28 63 68 61 72 2a 29 7a zOut = (char*)z
4bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6e 64 ;. }. send
4bc0: 54 65 78 74 28 7a 4f 75 74 2c 20 73 69 7a 65 29 Text(zOut, size)
4bd0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 76 65 ;. if( pConve
4be0: 72 74 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 rt ){. free
4bf0: 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 (zOut);. }.
4c00: 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 }. SbS_Pop(p, 1
4c10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d );. return 0;.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 ../*.** Subscrip
4c30: 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 t command:
4c40: 53 54 52 49 4e 47 20 77 69 6b 69 0a 2a 2a 0a 2a STRING wiki.**.*
4c50: 2a 20 52 65 6e 64 65 72 20 74 68 65 20 69 6e 70 * Render the inp
4c60: 75 74 20 73 74 72 69 6e 67 20 61 73 20 77 69 6b ut string as wik
4c70: 69 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 i..*/.static int
4c80: 20 77 69 6b 69 43 6d 64 28 73 74 72 75 63 74 20 wikiCmd(struct
4c90: 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f Subscript *p, vo
4ca0: 69 64 20 2a 70 43 6f 6e 76 65 72 74 29 7b 0a 20 id *pConvert){.
4cb0: 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 63 6f 6e int size;. con
4cc0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 st char *z;. if
4cd0: 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 ( SbS_RequireSta
4ce0: 63 6b 28 70 2c 20 31 2c 20 22 77 69 6b 69 22 29 ck(p, 1, "wiki")
4cf0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 ) return 1;. i
4d00: 66 28 20 65 6e 61 62 6c 65 4f 75 74 70 75 74 20 f( enableOutput
4d10: 29 7b 0a 20 20 20 20 42 6c 6f 62 20 73 72 63 3b ){. Blob src;
4d20: 0a 20 20 20 20 7a 20 3d 20 53 62 53 5f 53 74 61 . z = SbS_Sta
4d30: 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c 20 26 73 ckValue(p, 0, &s
4d40: 69 7a 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 69 ize);. blob_i
4d50: 6e 69 74 28 26 73 72 63 2c 20 7a 2c 20 73 69 7a nit(&src, z, siz
4d60: 65 29 3b 0a 20 20 20 20 77 69 6b 69 5f 63 6f 6e e);. wiki_con
4d70: 76 65 72 74 28 26 73 72 63 2c 20 30 2c 20 57 49 vert(&src, 0, WI
4d80: 4b 49 5f 49 4e 4c 49 4e 45 29 3b 0a 20 20 20 20 KI_INLINE);.
4d90: 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 72 63 29 blob_reset(&src)
4da0: 3b 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70 28 ;. }. SbS_Pop(
4db0: 70 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 p, 1);. return
4dc0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 0;.}../*.** Subs
4dd0: 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 cript command:
4de0: 20 4e 41 4d 45 20 54 45 58 54 2d 4c 49 53 54 20 NAME TEXT-LIST
4df0: 4e 55 4d 4c 49 4e 45 53 20 63 6f 6d 62 6f 62 6f NUMLINES combobo
4e00: 78 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 x.**.** Generate
4e10: 20 61 6e 20 48 54 4d 4c 20 63 6f 6d 62 6f 62 6f an HTML combobo
4e20: 78 2e 20 20 4e 41 4d 45 20 69 73 20 62 6f 74 68 x. NAME is both
4e30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 the name of the
4e40: 0a 2a 2a 20 43 47 49 20 70 61 72 61 6d 65 74 65 .** CGI paramete
4e50: 72 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f r and the name o
4e60: 66 20 61 20 76 61 72 69 61 62 6c 65 20 74 68 61 f a variable tha
4e70: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a t contains the.*
4e80: 2a 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 * currently sele
4e90: 63 74 65 64 20 76 61 6c 75 65 2e 20 20 54 45 58 cted value. TEX
4ea0: 54 2d 4c 49 53 54 20 69 73 20 61 20 6c 69 73 74 T-LIST is a list
4eb0: 20 6f 66 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 of possible.**
4ec0: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 63 values for the c
4ed0: 6f 6d 62 6f 62 6f 78 2e 20 20 4e 55 4d 4c 49 4e ombobox. NUMLIN
4ee0: 45 53 20 69 73 20 31 20 66 6f 72 20 61 20 74 72 ES is 1 for a tr
4ef0: 75 65 20 63 6f 6d 62 6f 62 6f 78 2e 0a 2a 2a 20 ue combobox..**
4f00: 49 66 20 4e 55 4d 4c 49 4e 45 53 20 69 73 20 67 If NUMLINES is g
4f10: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 6e 65 20 reater than one
4f20: 74 68 65 6e 20 74 68 65 20 64 69 73 70 6c 61 79 then the display
4f30: 20 69 73 20 61 20 6c 69 73 74 62 6f 78 0a 2a 2a is a listbox.**
4f40: 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72 with the number
4f50: 20 6f 66 20 6c 69 6e 65 73 20 67 69 76 65 6e 2e of lines given.
4f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 .*/.static int c
4f70: 6f 6d 62 6f 62 6f 78 43 6d 64 28 73 74 72 75 63 omboboxCmd(struc
4f80: 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 t Subscript *p,
4f90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a void *NotUsed){.
4fa0: 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 if( SbS_Requir
4fb0: 65 53 74 61 63 6b 28 70 2c 20 33 2c 20 22 63 6f eStack(p, 3, "co
4fc0: 6d 62 6f 62 6f 78 22 29 20 29 20 72 65 74 75 72 mbobox") ) retur
4fd0: 6e 20 31 3b 0a 20 20 69 66 28 20 65 6e 61 62 6c n 1;. if( enabl
4fe0: 65 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 69 eOutput ){. i
4ff0: 6e 74 20 68 65 69 67 68 74 3b 0a 20 20 20 20 42 nt height;. B
5000: 6c 6f 62 20 6c 69 73 74 2c 20 65 6c 65 6d 3b 0a lob list, elem;.
5010: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c char *zName,
5020: 20 2a 7a 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 *zList;. int
5030: 20 6e 4e 61 6d 65 2c 20 6e 4c 69 73 74 2c 20 6e nName, nList, n
5040: 56 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 Value;. const
5050: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b 0a 20 char *zValue;.
5060: 20 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 48 3b char *z, *zH;
5070: 0a 0a 20 20 20 20 68 65 69 67 68 74 20 3d 20 53 .. height = S
5080: 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 bS_StackValueInt
5090: 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 4c 69 73 (p, 0);. zLis
50a0: 74 20 3d 20 28 63 68 61 72 2a 29 53 62 53 5f 53 t = (char*)SbS_S
50b0: 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 31 2c 20 tackValue(p, 1,
50c0: 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 62 6c 6f &nList);. blo
50d0: 62 5f 69 6e 69 74 28 26 6c 69 73 74 2c 20 7a 4c b_init(&list, zL
50e0: 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 20 ist, nList);.
50f0: 20 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 zName = (char*)
5100: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 SbS_StackValue(p
5110: 2c 20 32 2c 20 26 6e 4e 61 6d 65 29 3b 0a 20 20 , 2, &nName);.
5120: 20 20 7a 56 61 6c 75 65 20 3d 20 53 62 53 5f 46 zValue = SbS_F
5130: 65 74 63 68 28 70 2c 20 7a 4e 61 6d 65 2c 20 6e etch(p, zName, n
5140: 4e 61 6d 65 2c 20 26 6e 56 61 6c 75 65 29 3b 0a Name, &nValue);.
5150: 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 z = mprintf(
5160: 22 3c 73 65 6c 65 63 74 20 6e 61 6d 65 3d 5c 22 "<select name=\"
5170: 25 7a 5c 22 20 73 69 7a 65 3d 5c 22 25 64 5c 22 %z\" size=\"%d\"
5180: 3e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 >", .
5190: 20 20 20 20 20 20 68 74 6d 6c 69 7a 65 28 7a 4e htmlize(zN
51a0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 2c 20 68 65 69 ame, nName), hei
51b0: 67 68 74 29 3b 0a 20 20 20 20 73 65 6e 64 54 65 ght);. sendTe
51c0: 78 74 28 7a 2c 20 2d 31 29 3b 0a 20 20 20 20 66 xt(z, -1);. f
51d0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c ree(z);. whil
51e0: 65 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c e( blob_token(&l
51f0: 69 73 74 2c 20 26 65 6c 65 6d 29 20 29 7b 0a 20 ist, &elem) ){.
5200: 20 20 20 20 20 7a 48 20 3d 20 68 74 6d 6c 69 7a zH = htmliz
5210: 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 65 e(blob_buffer(&e
5220: 6c 65 6d 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 lem), blob_size(
5230: 26 65 6c 65 6d 29 29 3b 0a 20 20 20 20 20 20 69 &elem));. i
5240: 66 28 20 7a 56 61 6c 75 65 20 26 26 20 62 6c 6f f( zValue && blo
5250: 62 5f 73 69 7a 65 28 26 65 6c 65 6d 29 3d 3d 6e b_size(&elem)==n
5260: 56 61 6c 75 65 20 0a 20 20 20 20 20 20 20 20 20 Value .
5270: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 7a 56 && memcmp(zV
5280: 61 6c 75 65 2c 20 62 6c 6f 62 5f 62 75 66 66 65 alue, blob_buffe
5290: 72 28 26 65 6c 65 6d 29 2c 20 6e 56 61 6c 75 65 r(&elem), nValue
52a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )==0 ){.
52b0: 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 3c 6f 70 z = mprintf("<op
52c0: 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22 25 73 5c tion value=\"%s\
52d0: 22 20 73 65 6c 65 63 74 65 64 3e 25 73 3c 2f 6f " selected>%s</o
52e0: 70 74 69 6f 6e 3e 22 2c 20 7a 48 2c 20 7a 48 29 ption>", zH, zH)
52f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
5300: 20 20 20 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e z = mprin
5310: 74 66 28 22 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 tf("<option valu
5320: 65 3d 5c 22 25 73 5c 22 3e 25 73 3c 2f 6f 70 74 e=\"%s\">%s</opt
5330: 69 6f 6e 3e 22 2c 20 7a 48 2c 20 7a 48 29 3b 0a ion>", zH, zH);.
5340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 }. fr
5350: 65 65 28 7a 48 29 3b 0a 20 20 20 20 20 20 73 65 ee(zH);. se
5360: 6e 64 54 65 78 74 28 7a 2c 20 2d 31 29 3b 0a 20 ndText(z, -1);.
5370: 20 20 20 20 20 66 72 65 65 28 7a 29 3b 0a 20 20 free(z);.
5380: 20 20 7d 0a 20 20 20 20 73 65 6e 64 54 65 78 74 }. sendText
5390: 28 22 3c 2f 73 65 6c 65 63 74 3e 22 2c 20 2d 31 ("</select>", -1
53a0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 );. blob_rese
53b0: 74 28 26 6c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 t(&list);. }.
53c0: 53 62 53 5f 50 6f 70 28 70 2c 20 33 29 3b 0a 20 SbS_Pop(p, 3);.
53d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f return 0;.}.../
53e0: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 *.** A table of
53f0: 62 75 69 6c 74 2d 69 6e 20 63 6f 6d 6d 61 6e 64 built-in command
5400: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 s.*/.static cons
5410: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 63 6f 6e t struct {. con
5420: 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 st char *zCmd;.
5430: 20 69 6e 74 20 28 2a 78 43 6d 64 29 28 53 75 62 int (*xCmd)(Sub
5440: 73 63 72 69 70 74 2a 2c 76 6f 69 64 2a 29 3b 0a script*,void*);.
5450: 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 0a 7d 20 void *pArg;.}
5460: 61 42 75 69 6c 74 69 6e 5b 5d 20 3d 20 7b 0a 20 aBuiltin[] = {.
5470: 20 7b 20 22 61 64 64 22 2c 20 20 20 20 20 20 20 { "add",
5480: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20 bopCmd,
5490: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 (voi
54a0: 64 2a 29 53 42 53 4f 50 5f 41 4e 44 20 20 20 20 d*)SBSOP_AND
54b0: 7d 2c 0a 20 20 7b 20 22 61 6e 64 22 2c 20 20 20 },. { "and",
54c0: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64 bopCmd
54d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
54e0: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 41 4e 44 (void*)SBSOP_AND
54f0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6d 62 },. { "comb
5500: 6f 62 6f 78 22 2c 20 20 20 20 20 20 20 20 63 6f obox", co
5510: 6d 62 6f 62 6f 78 43 6d 64 2c 20 20 20 20 20 20 mboboxCmd,
5520: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
5530: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 },. { "
5540: 64 69 76 22 2c 20 20 20 20 20 20 20 20 20 20 20 div",
5550: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 bopCmd,
5560: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 (void*)S
5570: 42 53 4f 50 5f 44 49 56 20 20 20 20 7d 2c 0a 20 BSOP_DIV },.
5580: 20 7b 20 22 65 6e 61 62 6c 65 5f 6f 75 74 70 75 { "enable_outpu
5590: 74 22 2c 20 20 20 65 6e 61 62 6c 65 4f 75 74 70 t", enableOutp
55a0: 75 74 43 6d 64 2c 20 20 20 20 20 20 30 20 20 20 utCmd, 0
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
55c0: 7d 2c 0a 20 20 7b 20 22 65 78 69 73 74 73 22 2c },. { "exists",
55d0: 20 20 20 20 20 20 20 20 20 20 65 78 69 73 74 73 exists
55e0: 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 Cmd,
55f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
5600: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 67 65 74 22 },. { "get"
5610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 , ge
5620: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 tCmd,
5630: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
5640: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 },. { "
5650: 68 61 73 63 61 70 22 2c 20 20 20 20 20 20 20 20 hascap",
5660: 20 20 68 61 73 63 61 70 43 6d 64 2c 20 20 20 20 hascapCmd,
5670: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 0
5680: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 },.
5690: 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20 20 20 20 { "html",
56a0: 20 20 20 20 20 20 70 75 74 73 43 6d 64 2c 20 20 putsCmd,
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 (voi
56c0: 64 2a 29 31 20 20 20 20 20 20 20 20 20 20 20 20 d*)1
56d0: 7d 2c 0a 20 20 7b 20 22 6c 69 6e 65 63 6f 75 6e },. { "linecoun
56e0: 74 22 2c 20 20 20 20 20 20 20 6c 69 6e 65 63 6e t", linecn
56f0: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 tCmd,
5700: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0
5710: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6d 61 78 22 },. { "max"
5720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f , bo
5730: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 pCmd,
5740: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50 (void*)SBSOP
5750: 5f 4d 41 58 20 20 20 20 7d 2c 0a 20 20 7b 20 22 _MAX },. { "
5760: 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 min",
5770: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 bopCmd,
5780: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 (void*)S
5790: 42 53 4f 50 5f 4d 49 4e 20 20 20 20 7d 2c 0a 20 BSOP_MIN },.
57a0: 20 7b 20 22 6d 75 6c 22 2c 20 20 20 20 20 20 20 { "mul",
57b0: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20 bopCmd,
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 (voi
57d0: 64 2a 29 53 42 53 4f 50 5f 4d 55 4c 20 20 20 20 d*)SBSOP_MUL
57e0: 7d 2c 0a 20 20 7b 20 22 6e 6f 74 22 2c 20 20 20 },. { "not",
57f0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 43 6d 64 notCmd
5800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
5810: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0
5820: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6f 72 22 2c },. { "or",
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f bo
5840: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 pCmd,
5850: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50 (void*)SBSOP
5860: 5f 4f 52 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 _OR },. { "
5870: 70 75 74 73 22 2c 20 20 20 20 20 20 20 20 20 20 puts",
5880: 20 20 70 75 74 73 43 6d 64 2c 20 20 20 20 20 20 putsCmd,
5890: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 0
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 },.
58b0: 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20 20 { "set",
58c0: 20 20 20 20 20 20 73 65 74 43 6d 64 2c 20 20 20 setCmd,
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 0
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58f0: 7d 2c 0a 20 20 7b 20 22 73 75 62 22 2c 20 20 20 },. { "sub",
5900: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64 bopCmd
5910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
5920: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 53 55 42 (void*)SBSOP_SUB
5930: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 77 69 6b 69 },. { "wiki
5940: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 77 69 ", wi
5950: 6b 69 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 kiCmd,
5960: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
5970: 20 20 20 20 20 20 20 20 7d 2c 0a 7d 3b 0a 20 20 },.};.
5980: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 ../*.** Compare
5990: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 a zero-terminate
59a0: 64 20 73 74 72 69 6e 67 20 7a 50 61 74 74 65 72 d string zPatter
59b0: 6e 20 61 67 61 69 6e 73 74 0a 2a 2a 20 61 6e 20 n against.** an
59c0: 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 unterminated str
59d0: 69 6e 67 20 7a 53 74 72 20 6f 66 20 6c 65 6e 67 ing zStr of leng
59e0: 74 68 20 6e 53 74 72 2e 0a 2a 2a 0a 2a 2a 20 52 th nStr..**.** R
59f0: 65 74 75 72 6e 20 6c 65 73 73 20 74 68 61 6e 2c eturn less than,
5a00: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 equal to, or gr
5a10: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 20 eater than zero
5a20: 69 66 0a 2a 2a 20 7a 50 61 74 74 65 72 6e 20 69 if.** zPattern i
5a30: 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 s less than, equ
5a40: 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 al to, or greate
5a50: 72 20 74 68 61 6e 20 7a 53 74 72 2e 0a 2a 2f 0a r than zStr..*/.
5a60: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 61 static int compa
5a70: 72 65 5f 63 6d 64 28 63 6f 6e 73 74 20 63 68 61 re_cmd(const cha
5a80: 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20 63 6f 6e r *zPattern, con
5a90: 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 69 st char *zStr, i
5aa0: 6e 74 20 6e 53 74 72 29 7b 0a 20 20 69 6e 74 20 nt nStr){. int
5ab0: 63 20 3d 20 73 74 72 6e 63 6d 70 28 7a 50 61 74 c = strncmp(zPat
5ac0: 74 65 72 6e 2c 20 7a 53 74 72 2c 20 6e 53 74 72 tern, zStr, nStr
5ad0: 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 26 26 );. if( c==0 &&
5ae0: 20 7a 50 61 74 74 65 72 6e 5b 6e 53 74 72 5d 21 zPattern[nStr]!
5af0: 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 31 3b =0 ){. c = 1;
5b00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b . }. return c;
5b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 .}../*.** Evalua
5b20: 74 65 20 74 68 65 20 73 63 72 69 70 74 20 67 69 te the script gi
5b30: 76 65 6e 20 62 79 20 74 68 65 20 66 69 72 73 74 ven by the first
5b40: 20 6e 53 63 72 69 70 74 20 62 79 74 65 73 20 6f nScript bytes o
5b50: 66 20 7a 53 63 72 69 70 74 5b 5d 2e 0a 2a 2a 20 f zScript[]..**
5b60: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 Return 0 on succ
5b70: 65 73 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f ess and non-zero
5b80: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 2a for an error..*
5b90: 2f 0a 69 6e 74 20 53 62 53 5f 45 76 61 6c 28 73 /.int SbS_Eval(s
5ba0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
5bb0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a *p, const char *
5bc0: 7a 53 63 72 69 70 74 2c 20 69 6e 74 20 6e 53 63 zScript, int nSc
5bd0: 72 69 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 ript){. int rc
5be0: 3d 20 53 42 53 5f 4f 4b 3b 0a 20 20 69 66 28 20 = SBS_OK;. if(
5bf0: 6e 53 63 72 69 70 74 3c 30 20 29 20 6e 53 63 72 nScript<0 ) nScr
5c00: 69 70 74 20 3d 20 73 74 72 6c 65 6e 28 7a 53 63 ipt = strlen(zSc
5c10: 72 69 70 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 ript);. while(
5c20: 6e 53 63 72 69 70 74 3e 30 20 26 26 20 72 63 3d nScript>0 && rc=
5c30: 3d 53 42 53 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 =SBS_OK ){. i
5c40: 6e 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20 74 74 nt n;. int tt
5c50: 79 70 65 3b 0a 20 20 20 20 6e 20 3d 20 73 62 73 ype;. n = sbs
5c60: 5f 6e 65 78 74 5f 74 6f 6b 65 6e 28 7a 53 63 72 _next_token(zScr
5c70: 69 70 74 2c 20 6e 53 63 72 69 70 74 2c 20 26 74 ipt, nScript, &t
5c80: 74 79 70 65 29 3b 0a 0a 23 69 66 20 30 0a 20 20 type);..#if 0.
5c90: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c {. int i,
5ca0: 20 6e 45 6c 65 6d 3b 0a 20 20 20 20 20 20 63 6f nElem;. co
5cb0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6c 65 6d 3b nst char *zElem;
5cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 . if( p->nS
5cd0: 74 61 63 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 tack>0 ){.
5ce0: 20 20 70 72 69 6e 74 66 28 22 53 54 41 43 4b 3a printf("STACK:
5cf0: 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 ");. for(
5d00: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 74 61 63 6b i=0; i<p->nStack
5d10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; i++){.
5d20: 20 20 7a 45 6c 65 6d 20 3d 20 53 62 53 5f 53 74 zElem = SbS_St
5d30: 61 63 6b 56 61 6c 75 65 28 70 2c 20 69 2c 20 26 ackValue(p, i, &
5d40: 6e 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 nElem);.
5d50: 20 20 70 72 69 6e 74 66 28 22 20 5b 25 2e 2a 73 printf(" [%.*s
5d60: 5d 22 2c 20 6e 45 6c 65 6d 2c 20 7a 45 6c 65 6d ]", nElem, zElem
5d70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
5d80: 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 printf("\n"
5d90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
5da0: 20 70 72 69 6e 74 66 28 22 54 4f 4b 45 4e 28 25 printf("TOKEN(%
5db0: 64 29 3a 20 5b 25 2e 2a 73 5d 5c 6e 22 2c 20 74 d): [%.*s]\n", t
5dc0: 74 79 70 65 2c 20 6e 2c 20 7a 53 63 72 69 70 74 type, n, zScript
5dd0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
5de0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 74 74 79 . switch( tty
5df0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 pe ){. case
5e00: 20 53 42 53 54 54 5f 57 48 49 54 45 53 50 41 43 SBSTT_WHITESPAC
5e10: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 E: {. bre
5e20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
5e30: 20 20 63 61 73 65 20 53 42 53 54 54 5f 45 4f 46 case SBSTT_EOF
5e40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 6e 53 63 72 : {. nScr
5e50: 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 ipt = 0;.
5e60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
5e70: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54 case SBSTT
5e80: 5f 49 4e 43 4f 4d 50 4c 45 54 45 3a 0a 20 20 20 _INCOMPLETE:.
5e90: 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 55 4e case SBSTT_UN
5ea0: 4b 4e 4f 57 4e 3a 20 7b 0a 20 20 20 20 20 20 20 KNOWN: {.
5eb0: 20 72 63 20 3d 20 53 42 53 5f 45 52 52 4f 52 3b rc = SBS_ERROR;
5ec0: 0a 20 20 20 20 20 20 20 20 6e 53 63 72 69 70 74 . nScript
5ed0: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 = n;. br
5ee0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
5ef0: 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 49 4e case SBSTT_IN
5f00: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 TEGER: {.
5f10: 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70 rc = SbS_Push(p
5f20: 2c 20 28 63 68 61 72 2a 29 7a 53 63 72 69 70 74 , (char*)zScript
5f30: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 , n, 0);.
5f40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
5f50: 20 20 20 20 20 20 63 61 73 65 20 53 42 53 54 54 case SBSTT
5f60: 5f 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 20 _NAME: {.
5f70: 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70 rc = SbS_Push(p
5f80: 2c 20 28 63 68 61 72 2a 29 26 7a 53 63 72 69 70 , (char*)&zScrip
5f90: 74 5b 31 5d 2c 20 6e 2d 31 2c 20 30 29 3b 0a 20 t[1], n-1, 0);.
5fa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
5fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
5fc0: 20 53 42 53 54 54 5f 53 54 52 49 4e 47 3a 20 7b SBSTT_STRING: {
5fd0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 62 . rc = Sb
5fe0: 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 72 2a S_Push(p, (char*
5ff0: 29 26 7a 53 63 72 69 70 74 5b 31 5d 2c 20 6e 2d )&zScript[1], n-
6000: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 2, 0);. b
6010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
6020: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 56 case SBSTT_V
6030: 45 52 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f ERB: {. /
6040: 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 75 70 20 * First look up
6050: 74 68 65 20 76 65 72 62 20 69 6e 20 74 68 65 20 the verb in the
6060: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 hash table */.
6070: 20 20 20 20 20 20 63 6f 6e 73 74 20 53 62 53 56 const SbSV
6080: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73 62 73 alue *pVal = sbs
6090: 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d 54 61 _fetch(&p->symTa
60a0: 62 2c 20 28 63 68 61 72 2a 29 7a 53 63 72 69 70 b, (char*)zScrip
60b0: 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 t, n);. i
60c0: 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 f( pVal==0 ){.
60d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 /* If th
60e0: 65 20 76 65 72 62 20 69 73 20 6e 6f 74 20 69 6e e verb is not in
60f0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2c the hash table,
6100: 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 0a 20 20 20 look for a .
6110: 20 20 20 20 20 20 20 2a 2a 20 62 75 69 6c 74 2d ** built-
6120: 69 6e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 in command */.
6130: 20 20 20 20 20 20 20 20 69 6e 74 20 75 70 72 20 int upr
6140: 3d 20 73 69 7a 65 6f 66 28 61 42 75 69 6c 74 69 = sizeof(aBuilti
6150: 6e 29 2f 73 69 7a 65 6f 66 28 61 42 75 69 6c 74 n)/sizeof(aBuilt
6160: 69 6e 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 in[0]) - 1;.
6170: 20 20 20 20 20 20 69 6e 74 20 6c 77 72 20 3d 20 int lwr =
6180: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 0;. rc
6190: 3d 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 = SBS_ERROR;.
61a0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 75 70 while( up
61b0: 72 3e 3d 6c 77 72 20 29 7b 0a 20 20 20 20 20 20 r>=lwr ){.
61c0: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 28 75 int i = (u
61d0: 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 20 pr+lwr)/2;.
61e0: 20 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 63 int c = c
61f0: 6f 6d 70 61 72 65 5f 63 6d 64 28 61 42 75 69 6c ompare_cmd(aBuil
6200: 74 69 6e 5b 69 5d 2e 7a 43 6d 64 2c 20 7a 53 63 tin[i].zCmd, zSc
6210: 72 69 70 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 ript, n);.
6220: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 if( c==0 )
6230: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
6240: 72 63 20 3d 20 61 42 75 69 6c 74 69 6e 5b 69 5d rc = aBuiltin[i]
6250: 2e 78 43 6d 64 28 70 2c 20 61 42 75 69 6c 74 69 .xCmd(p, aBuilti
6260: 6e 5b 69 5d 2e 70 41 72 67 29 3b 0a 20 20 20 20 n[i].pArg);.
6270: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
6280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c . }el
6290: 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 se if( c>0 ){.
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 72 20 upr
62b0: 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 = i-1;.
62c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
62d0: 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 2b lwr = i+
62e0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 1;. }
62f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
6300: 20 20 20 20 20 20 20 69 66 28 20 75 70 72 3c 6c if( upr<l
6310: 77 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 wr ){.
6320: 20 20 53 62 53 5f 53 65 74 45 72 72 6f 72 4d 65 SbS_SetErrorMe
6330: 73 73 61 67 65 28 70 2c 20 22 75 6e 6b 6e 6f 77 ssage(p, "unknow
6340: 6e 20 76 65 72 62 3a 20 25 2e 2a 73 22 2c 20 6e n verb: %.*s", n
6350: 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 , zScript);.
6360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
6370: 7d 65 6c 73 65 20 69 66 28 20 70 56 61 6c 2d 3e }else if( pVal->
6380: 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f 56 flags & SBSVAL_V
6390: 45 52 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ERB ){.
63a0: 20 72 63 20 3d 20 70 56 61 6c 2d 3e 75 2e 76 65 rc = pVal->u.ve
63b0: 72 62 2e 78 56 65 72 62 28 70 2c 20 70 56 61 6c rb.xVerb(p, pVal
63c0: 2d 3e 75 2e 76 65 72 62 2e 70 41 72 67 29 3b 0a ->u.verb.pArg);.
63d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 }else if
63e0: 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 ( pVal->flags &
63f0: 53 42 53 56 41 4c 5f 45 58 45 43 20 29 7b 0a 20 SBSVAL_EXEC ){.
6400: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 62 rc = Sb
6410: 53 5f 45 76 61 6c 28 70 2c 20 70 56 61 6c 2d 3e S_Eval(p, pVal->
6420: 75 2e 73 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75 u.str.z, pVal->u
6430: 2e 73 74 72 2e 73 69 7a 65 29 3b 0a 20 20 20 20 .str.size);.
6440: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
6450: 20 20 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75 rc = SbS_Pu
6460: 73 68 28 70 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 sh(p, pVal->u.st
6470: 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 r.z, pVal->u.str
6480: 2e 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 .size, 0);.
6490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 }. bre
64a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
64b0: 7d 0a 20 20 20 20 7a 53 63 72 69 70 74 20 2b 3d }. zScript +=
64c0: 20 6e 3b 0a 20 20 20 20 6e 53 63 72 69 70 74 20 n;. nScript
64d0: 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 -= n;. }. retu
64e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 rn rc;.}../*.**
64f0: 54 68 65 20 7a 5b 5d 20 69 6e 70 75 74 20 63 6f The z[] input co
6500: 6e 74 61 69 6e 73 20 74 65 78 74 20 6d 69 78 65 ntains text mixe
6510: 64 20 77 69 74 68 20 73 75 62 73 63 72 69 70 74 d with subscript
6520: 20 73 63 72 69 70 74 73 2e 0a 2a 2a 20 54 68 65 scripts..** The
6530: 20 73 75 62 73 63 72 69 70 74 20 73 63 72 69 70 subscript scrip
6540: 74 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 ts are contained
6550: 20 77 69 74 68 69 6e 20 5b 2e 2e 2e 5d 2e 20 20 within [...].
6560: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 This routine.**
6570: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 74 65 processes the te
6580: 6d 70 6c 61 74 65 20 61 6e 64 20 77 72 69 74 65 mplate and write
6590: 73 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e s the results on
65a0: 20 65 69 74 68 65 72 0a 2a 2a 20 73 74 64 6f 75 either.** stdou
65b0: 74 20 6f 72 20 69 6e 74 6f 20 43 47 49 2e 0a 2a t or into CGI..*
65c0: 2f 0a 69 6e 74 20 53 62 53 5f 52 65 6e 64 65 72 /.int SbS_Render
65d0: 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 (struct Subscrip
65e0: 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 t *p, const char
65f0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 *z){. int i =
6600: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 42 0;. int rc = SB
6610: 53 5f 4f 4b 3b 0a 20 20 77 68 69 6c 65 28 20 7a S_OK;. while( z
6620: 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 7a [i] ){. if( z
6630: 5b 69 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 [i]=='[' ){.
6640: 20 20 73 65 6e 64 54 65 78 74 28 7a 2c 20 69 29 sendText(z, i)
6650: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 ;. z += i+1
6660: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b ;. for(i=0;
6670: 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 z[i] && z[i]!='
6680: 5d 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 ]'; i++){}.
6690: 20 72 63 20 3d 20 53 62 53 5f 45 76 61 6c 28 70 rc = SbS_Eval(p
66a0: 2c 20 7a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 , z, i);. i
66b0: 66 28 20 72 63 21 3d 53 42 53 5f 4f 4b 20 29 20 f( rc!=SBS_OK )
66c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 break;. if(
66d0: 20 7a 5b 69 5d 20 29 20 69 2b 2b 3b 0a 20 20 20 z[i] ) i++;.
66e0: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 z += i;.
66f0: 20 69 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 i = 0;. }els
6700: 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 e{. i++;.
6710: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 }. }. if( rc
6720: 3d 3d 53 42 53 5f 45 52 52 4f 52 20 29 7b 0a 20 ==SBS_ERROR ){.
6730: 20 20 20 73 65 6e 64 54 65 78 74 28 22 3c 68 72 sendText("<hr
6740: 3e 3c 70 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d ><p><font color=
6750: 5c 22 72 65 64 5c 22 3e 3c 62 3e 45 52 52 4f 52 \"red\"><b>ERROR
6760: 3a 20 22 2c 20 2d 31 29 3b 0a 20 20 20 20 73 65 : ", -1);. se
6770: 6e 64 54 65 78 74 28 53 62 53 5f 47 65 74 45 72 ndText(SbS_GetEr
6780: 72 6f 72 4d 65 73 73 61 67 65 28 70 29 2c 20 2d rorMessage(p), -
6790: 31 29 3b 0a 20 20 20 20 73 65 6e 64 54 65 78 74 1);. sendText
67a0: 28 22 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 70 ("</b></font></p
67b0: 3e 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 >", -1);. }else
67c0: 7b 0a 20 20 20 20 73 65 6e 64 54 65 78 74 28 7a {. sendText(z
67d0: 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 , i);. }. retu
67e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 rn rc;.}../*.**
67f0: 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 73 75 COMMAND: test-su
6800: 62 73 63 72 69 70 74 0a 2a 2f 0a 76 6f 69 64 20 bscript.*/.void
6810: 74 65 73 74 5f 73 75 62 73 63 72 69 70 74 28 76 test_subscript(v
6820: 6f 69 64 29 7b 0a 20 20 53 75 62 73 63 72 69 70 oid){. Subscrip
6830: 74 20 2a 70 3b 0a 20 20 42 6c 6f 62 20 69 6e 3b t *p;. Blob in;
6840: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3c 33 20 . if( g.argc<3
6850: 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 46 49 ){. usage("FI
6860: 4c 45 22 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 LE");. }. blob
6870: 5f 7a 65 72 6f 28 26 69 6e 29 3b 0a 20 20 62 6c _zero(&in);. bl
6880: 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c ob_read_from_fil
6890: 65 28 26 69 6e 2c 20 67 2e 61 72 67 76 5b 32 5d e(&in, g.argv[2]
68a0: 29 3b 0a 20 20 70 20 3d 20 53 62 53 5f 43 72 65 );. p = SbS_Cre
68b0: 61 74 65 28 29 3b 0a 20 20 53 62 53 5f 52 65 6e ate();. SbS_Ren
68c0: 64 65 72 28 70 2c 20 62 6c 6f 62 5f 73 74 72 28 der(p, blob_str(
68d0: 26 69 6e 29 29 3b 0a 7d 0a &in));.}.