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 32 30 NFIG_NSTACK 20
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 51 55 4f 54 45 44 ine SBSTT_QUOTED
0bf0: 20 20 20 20 20 20 35 20 20 20 20 2f 2a 20 65 78 5 /* ex
0c00: 3a 20 20 20 22 2e 2e 2e 5c 6e 2e 2e 2e 22 20 2a : "...\n..." *
0c10: 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 54 5f /.#define SBSTT_
0c20: 49 4e 54 45 47 45 52 20 20 20 20 20 36 20 20 20 INTEGER 6
0c30: 20 2f 2a 20 49 6e 74 65 67 65 72 20 69 6e 63 6c /* Integer incl
0c40: 75 64 69 6e 67 20 6f 70 74 69 6f 6e 20 73 69 67 uding option sig
0c50: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 n */.#define SBS
0c60: 54 54 5f 49 4e 43 4f 4d 50 4c 45 54 45 20 20 37 TT_INCOMPLETE 7
0c70: 20 20 20 20 2f 2a 20 55 6e 74 65 72 6d 69 6e 61 /* Untermina
0c80: 74 65 64 20 73 74 72 69 6e 67 20 74 6f 6b 65 6e ted string token
0c90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 42 53 54 */.#define SBST
0ca0: 54 5f 55 4e 4b 4e 4f 57 4e 20 20 20 20 20 38 20 T_UNKNOWN 8
0cb0: 20 20 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20 74 6f /* Unknown to
0cc0: 6b 65 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 ken */.#define S
0cd0: 42 53 54 54 5f 45 4f 46 20 20 20 20 20 20 20 20 BSTT_EOF
0ce0: 20 39 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 9 /* End of
0cf0: 69 6e 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 input */../*.**
0d00: 56 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 Values are store
0d10: 64 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 d in the hash ta
0d20: 62 6c 65 20 61 73 20 69 6e 73 74 61 6e 63 65 73 ble as instances
0d30: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
0d40: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a g.** structure..
0d50: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 */.typedef struc
0d60: 74 20 53 62 53 56 61 6c 75 65 20 53 62 53 56 61 t SbSValue SbSVa
0d70: 6c 75 65 3b 0a 73 74 72 75 63 74 20 53 62 53 56 lue;.struct SbSV
0d80: 61 6c 75 65 20 7b 0a 20 20 69 6e 74 20 66 6c 61 alue {. int fla
0d90: 67 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 69 gs; /* Bi
0da0: 74 6d 61 73 6b 20 6f 66 20 53 42 53 56 41 4c 5f tmask of SBSVAL_
0db0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 6e * values */. un
0dc0: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74 ion {. struct
0dd0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a {. int siz
0de0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d e; /* Num
0df0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 ber of bytes in
0e00: 73 74 72 69 6e 67 2c 20 6e 6f 74 20 63 6f 75 6e string, not coun
0e10: 74 69 6e 67 20 66 69 6e 61 6c 20 7a 65 72 6f 20 ting final zero
0e20: 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a */. char *z
0e30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 ; /* Poi
0e40: 6e 74 65 72 20 74 6f 20 73 74 72 69 6e 67 20 63 nter to string c
0e50: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 20 ontent */. }
0e60: 73 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a str; /*
0e70: 20 56 61 6c 75 65 20 69 66 20 53 42 53 56 41 4c Value if SBSVAL
0e80: 5f 53 54 52 20 2a 2f 0a 20 20 20 20 73 74 72 75 _STR */. stru
0e90: 63 74 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 28 ct {. int (
0ea0: 2a 78 56 65 72 62 29 28 53 75 62 73 63 72 69 70 *xVerb)(Subscrip
0eb0: 74 2a 2c 20 76 6f 69 64 2a 29 3b 20 20 20 20 20 t*, void*);
0ec0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 64 /* Function to d
0ed0: 6f 20 74 68 65 20 77 6f 72 6b 20 2a 2f 0a 20 20 o the work */.
0ee0: 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 3b 20 void *pArg;
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20 /* 2nd
0f10: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 56 65 parameter to xVe
0f20: 72 62 20 2a 2f 0a 20 20 20 20 7d 20 76 65 72 62 rb */. } verb
0f30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c ; /* Val
0f40: 75 65 20 69 66 20 53 42 53 56 41 4c 5f 56 45 52 ue if SBSVAL_VER
0f50: 42 20 2a 2f 0a 20 20 7d 20 75 3b 20 20 20 20 20 B */. } u;
0f60: 20 20 20 20 20 20 20 20 20 0a 7d 3b 0a 23 64 65 .};.#de
0f70: 66 69 6e 65 20 53 42 53 56 41 4c 5f 56 45 52 42 fine SBSVAL_VERB
0f80: 20 20 20 20 30 78 30 30 30 31 20 20 20 20 20 20 0x0001
0f90: 2f 2a 20 56 61 6c 75 65 20 73 74 6f 72 65 64 20 /* Value stored
0fa0: 69 6e 20 75 2e 76 65 72 62 20 2a 2f 0a 23 64 65 in u.verb */.#de
0fb0: 66 69 6e 65 20 53 42 53 56 41 4c 5f 53 54 52 20 fine SBSVAL_STR
0fc0: 20 20 20 20 30 78 30 30 30 32 20 20 20 20 20 20 0x0002
0fd0: 2f 2a 20 56 61 6c 75 65 20 73 74 6f 72 65 64 20 /* Value stored
0fe0: 69 6e 20 75 2e 73 74 72 20 2a 2f 20 0a 23 64 65 in u.str */ .#de
0ff0: 66 69 6e 65 20 53 42 53 56 41 4c 5f 44 59 4e 20 fine SBSVAL_DYN
1000: 20 20 20 20 30 78 30 30 30 34 20 20 20 20 20 20 0x0004
1010: 2f 2a 20 75 2e 73 74 72 2e 7a 20 69 73 20 64 79 /* u.str.z is dy
1020: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 namically alloca
1030: 74 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 ted */.#define S
1040: 42 53 56 41 4c 5f 45 58 45 43 20 20 20 20 30 78 BSVAL_EXEC 0x
1050: 30 30 30 38 20 20 20 20 20 20 2f 2a 20 75 2e 73 0008 /* u.s
1060: 74 72 2e 7a 20 69 73 20 61 20 73 63 72 69 70 74 tr.z is a script
1070: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 6e */../*.** An en
1080: 74 72 79 20 69 6e 20 74 68 65 20 68 61 73 68 20 try in the hash
1090: 74 61 62 6c 65 20 69 73 20 61 6e 20 69 6e 73 74 table is an inst
10a0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 ance of this str
10b0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 ucture..*/.typed
10c0: 65 66 20 73 74 72 75 63 74 20 53 62 73 48 61 73 ef struct SbsHas
10d0: 68 45 6e 74 72 79 20 53 62 73 48 61 73 68 45 6e hEntry SbsHashEn
10e0: 74 72 79 3b 0a 73 74 72 75 63 74 20 53 62 73 48 try;.struct SbsH
10f0: 61 73 68 45 6e 74 72 79 20 7b 0a 20 20 53 62 73 ashEntry {. Sbs
1100: 48 61 73 68 45 6e 74 72 79 20 2a 70 4e 65 78 74 HashEntry *pNext
1110: 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e ; /* Next en
1120: 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d try with the sam
1130: 65 20 68 61 73 68 20 6f 6e 20 7a 4b 65 79 20 2a e hash on zKey *
1140: 2f 0a 20 20 53 62 53 56 61 6c 75 65 20 76 61 6c /. SbSValue val
1150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
1160: 54 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 The payload */.
1170: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 int nKey;
1180: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 /* Leng
1190: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f th of the key */
11a0: 0a 20 20 63 68 61 72 20 7a 4b 65 79 5b 31 5d 3b . char zKey[1];
11b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
11c0: 65 20 6b 65 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a e key */.};../*.
11d0: 2a 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 ** A hash table
11e0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f is an instance o
11f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 f the following
1200: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 structure..*/.ty
1210: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 62 73 pedef struct Sbs
1220: 48 61 73 68 54 61 62 20 53 62 73 48 61 73 68 54 HashTab SbsHashT
1230: 61 62 3b 0a 73 74 72 75 63 74 20 53 62 73 48 61 ab;.struct SbsHa
1240: 73 68 54 61 62 20 7b 0a 20 20 53 62 73 48 61 73 shTab {. SbsHas
1250: 68 45 6e 74 72 79 20 2a 61 48 61 73 68 5b 53 42 hEntry *aHash[SB
1260: 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 5d 3b 20 SCONFIG_NHASH];
1270: 20 2f 2a 20 54 68 65 20 68 61 73 68 20 74 61 62 /* The hash tab
1280: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 le */.};../*.**
1290: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 An instance of t
12a0: 68 65 20 53 75 62 73 63 72 69 70 74 20 69 6e 74 he Subscript int
12b0: 65 72 70 72 65 74 65 72 0a 2a 2f 0a 73 74 72 75 erpreter.*/.stru
12c0: 63 74 20 53 75 62 73 63 72 69 70 74 20 7b 0a 20 ct Subscript {.
12d0: 20 69 6e 74 20 6e 53 74 61 63 6b 3b 20 20 20 20 int nStack;
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
1300: 20 65 6e 74 72 69 65 73 20 6f 6e 20 73 74 61 63 entries on stac
1310: 6b 20 2a 2f 0a 20 20 53 62 73 48 61 73 68 54 61 k */. SbsHashTa
1320: 62 20 73 79 6d 54 61 62 3b 20 20 20 20 20 20 20 b symTab;
1330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
1340: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 2a 2f symbol table */
1350: 0a 20 20 63 68 61 72 20 7a 45 72 72 4d 73 67 5b . char zErrMsg[
1360: 53 42 53 43 4f 4e 46 49 47 5f 45 52 52 53 49 5a SBSCONFIG_ERRSIZ
1370: 45 5d 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 74 E]; /* Space t
1380: 6f 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 o write an error
1390: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 53 62 message */. Sb
13a0: 53 56 61 6c 75 65 20 61 53 74 61 63 6b 5b 53 42 SValue aStack[SB
13b0: 53 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 5d 3b SCONFIG_NSTACK];
13c0: 20 2f 2a 20 54 68 65 20 73 74 61 63 6b 20 2a 2f /* The stack */
13d0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 .};.../*.** Give
13e0: 6e 20 61 6e 20 69 6e 70 75 74 20 73 74 72 69 6e n an input strin
13f0: 67 20 7a 20 6f 66 20 6c 65 6e 67 74 68 20 6e 2c g z of length n,
1400: 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 74 6f identify the to
1410: 6b 65 6e 20 74 68 61 74 0a 2a 2a 20 73 74 61 72 ken that.** star
1420: 74 73 20 61 74 20 7a 5b 30 5d 2e 20 20 57 72 69 ts at z[0]. Wri
1430: 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 74 79 70 te the token typ
1440: 65 20 69 6e 74 6f 20 2a 70 54 6f 6b 65 6e 54 79 e into *pTokenTy
1450: 70 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e pe and.** return
1460: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 the length of t
1470: 68 65 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 he token..*/.sta
1480: 74 69 63 20 69 6e 74 20 73 62 73 5f 6e 65 78 74 tic int sbs_next
1490: 5f 74 6f 6b 65 6e 28 63 6f 6e 73 74 20 63 68 61 _token(const cha
14a0: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 r *z, int n, int
14b0: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 29 7b 0a 20 *pTokenType){.
14c0: 20 69 6e 74 20 63 3b 0a 20 20 69 66 28 20 6e 3c int c;. if( n<
14d0: 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 20 29 7b =0 || z[0]==0 ){
14e0: 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 . *pTokenType
14f0: 20 3d 20 53 42 53 54 54 5f 45 4f 46 3b 0a 20 20 = SBSTT_EOF;.
1500: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
1510: 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 c = z[0];. if
1520: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 7b 0a ( isspace(c) ){.
1530: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a int i;. *
1540: 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 pTokenType = SBS
1550: 54 54 5f 57 48 49 54 45 53 50 41 43 45 3b 0a 20 TT_WHITESPACE;.
1560: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 for(i=1; i<n
1570: 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 && isspace(z[i])
1580: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 72 65 74 ; i++){}. ret
1590: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 urn i;. }. if(
15a0: 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 69 c=='#' ){. i
15b0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d nt i;. for(i=
15c0: 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d 20 26 1; i<n && z[i] &
15d0: 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 3b 20 & z[i-1]!='\n';
15e0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b i++){}. *pTok
15f0: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 57 enType = SBSTT_W
1600: 48 49 54 45 53 50 41 43 45 3b 0a 20 20 20 20 72 HITESPACE;. r
1610: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 eturn i;. }. i
1620: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 f( c=='"' ){.
1630: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 int i;. for(
1640: 69 3d 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d i=1; i<n && z[i]
1650: 20 26 26 20 7a 5b 69 5d 21 3d 27 22 27 3b 20 69 && z[i]!='"'; i
1660: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69 66 28 20 ++){. if(
1670: 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 26 26 20 69 3c z[i]=='\\' && i<
1680: 6e 2d 31 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 n-1 ){ i++; }.
1690: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d }. if( z[i]
16a0: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 2a =='"' ){. *
16b0: 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 pTokenType = SBS
16c0: 54 54 5f 51 55 4f 54 45 44 3b 0a 20 20 20 20 20 TT_QUOTED;.
16d0: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 return i+1;.
16e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 }else{. *p
16f0: 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54 TokenType = SBST
1700: 54 5f 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 T_INCOMPLETE;.
1710: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 return i;.
1720: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d }. }. if( c=
1730: 3d 27 7b 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 ='{' ){. int
1740: 64 65 70 74 68 20 3d 20 31 3b 0a 20 20 20 20 69 depth = 1;. i
1750: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d nt i;. for(i=
1760: 31 3b 20 69 3c 6e 20 26 26 20 7a 5b 69 5d 3b 20 1; i<n && z[i];
1770: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 i++){. if(
1780: 7a 5b 69 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 z[i]=='{' ){.
1790: 20 20 20 20 20 64 65 70 74 68 2b 2b 3b 0a 20 20 depth++;.
17a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b }else if( z[
17b0: 69 5d 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 20 i]=='}' ){.
17c0: 20 20 20 64 65 70 74 68 2d 2d 3b 0a 20 20 20 20 depth--;.
17d0: 20 20 20 20 69 66 28 20 64 65 70 74 68 3d 3d 30 if( depth==0
17e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b ){. i+
17f0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 +;. bre
1800: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ak;. }.
1810: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }. }.
1820: 69 66 28 20 64 65 70 74 68 20 29 7b 0a 20 20 20 if( depth ){.
1830: 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d *pTokenType =
1840: 20 53 42 53 54 54 5f 49 4e 43 4f 4d 50 4c 45 54 SBSTT_INCOMPLET
1850: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 E;. }else{.
1860: 20 20 20 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 *pTokenType
1870: 3d 20 53 42 53 54 54 5f 53 54 52 49 4e 47 3b 0a = SBSTT_STRING;.
1880: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
1890: 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d i;. }. if( c=
18a0: 3d 27 2f 27 20 26 26 20 6e 3e 3d 32 20 26 26 20 ='/' && n>=2 &&
18b0: 69 73 61 6c 70 68 61 28 7a 5b 31 5d 29 20 29 7b isalpha(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 32 3b 20 69 3c 6e 20 26 26 20 for(i=2; i<n &&
18e0: 28 69 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 20 7c (isalnum(z[i]) |
18f0: 7c 20 7a 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2b | z[i]=='_'); i+
1900: 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b 65 6e +){}. *pToken
1910: 54 79 70 65 20 3d 20 53 42 53 54 54 5f 4e 41 4d Type = SBSTT_NAM
1920: 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b E;. return i;
1930: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 61 6c 70 . }. if( isalp
1940: 68 61 28 63 29 20 29 7b 0a 20 20 20 20 69 6e 74 ha(c) ){. int
1950: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b i;. for(i=1;
1960: 20 69 3c 6e 20 26 26 20 28 69 73 61 6c 6e 75 6d i<n && (isalnum
1970: 28 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d (z[i]) || z[i]==
1980: 27 5f 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 '_'); i++){}.
1990: 20 2a 70 54 6f 6b 65 6e 54 79 70 65 20 3d 20 53 *pTokenType = S
19a0: 42 53 54 54 5f 56 45 52 42 3b 0a 20 20 20 20 72 BSTT_VERB;. r
19b0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 69 eturn i;. }. i
19c0: 66 28 20 69 73 64 69 67 69 74 28 63 29 20 7c 7c f( isdigit(c) ||
19d0: 20 28 28 63 3d 3d 27 2d 27 20 7c 7c 20 63 3d 3d ((c=='-' || c==
19e0: 27 2b 27 29 20 26 26 20 6e 3e 3d 32 20 26 26 20 '+') && n>=2 &&
19f0: 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 isdigit(z[1])) )
1a00: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 {. int i;.
1a10: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 for(i=1; i<n &&
1a20: 20 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 3b 20 isdigit(z[i]);
1a30: 69 2b 2b 29 7b 7d 0a 20 20 20 20 2a 70 54 6f 6b i++){}. *pTok
1a40: 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f 49 enType = SBSTT_I
1a50: 4e 54 45 47 45 52 3b 0a 20 20 20 20 72 65 74 75 NTEGER;. retu
1a60: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 54 6f rn i;. }. *pTo
1a70: 6b 65 6e 54 79 70 65 20 3d 20 53 42 53 54 54 5f kenType = SBSTT_
1a80: 55 4e 4b 4e 4f 57 4e 3b 0a 20 20 72 65 74 75 72 UNKNOWN;. retur
1a90: 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 n 1;.}.../*.** R
1aa0: 65 6c 65 61 73 65 20 61 6e 79 20 6d 65 6d 6f 72 elease any memor
1ab0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 y allocated by a
1ac0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 value..*/.stati
1ad0: 63 20 76 6f 69 64 20 73 62 73 5f 76 61 6c 75 65 c void sbs_value
1ae0: 5f 72 65 73 65 74 28 53 62 53 56 61 6c 75 65 20 _reset(SbSValue
1af0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c *p){. if( p->fl
1b00: 61 67 73 20 26 20 53 42 53 56 41 4c 5f 44 59 4e ags & SBSVAL_DYN
1b10: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e ){. free(p->
1b20: 75 2e 73 74 72 2e 7a 29 3b 0a 20 20 20 20 70 2d u.str.z);. p-
1b30: 3e 66 6c 61 67 73 20 3d 20 53 42 53 56 41 4c 5f >flags = SBSVAL_
1b40: 53 54 52 3b 0a 20 20 20 20 70 2d 3e 75 2e 73 74 STR;. p->u.st
1b50: 72 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20 70 2d r.z = "";. p-
1b60: 3e 75 2e 73 74 72 2e 73 69 7a 65 20 3d 20 30 3b >u.str.size = 0;
1b70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f . }.}../*.** Co
1b80: 6d 70 75 74 65 20 61 20 68 61 73 68 20 6f 6e 20 mpute a hash on
1b90: 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 a string..*/.sta
1ba0: 74 69 63 20 69 6e 74 20 73 62 73 5f 68 61 73 68 tic int sbs_hash
1bb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 (const char *z,
1bc0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 int n){. int h
1bd0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 = 0;. int i;.
1be0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b for(i=0; i<n; i+
1bf0: 2b 29 7b 0a 20 20 20 20 68 20 5e 3d 20 28 68 3c +){. h ^= (h<
1c00: 3c 31 29 20 7c 20 7a 5b 69 5d 3b 0a 20 20 7d 0a <1) | z[i];. }.
1c10: 20 20 68 20 26 3d 20 30 78 37 66 66 66 66 66 66 h &= 0x7ffffff
1c20: 3b 0a 20 20 72 65 74 75 72 6e 20 68 20 25 20 53 ;. return h % S
1c30: 42 53 43 4f 4e 46 49 47 5f 4e 48 41 53 48 3b 0a BSCONFIG_NHASH;.
1c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 }../*.** Look up
1c50: 20 61 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 a value in the
1c60: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 52 65 74 hash table. Ret
1c70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f urn a pointer to
1c80: 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 52 the value..** R
1c90: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f eturn NULL if no
1ca0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 t found..*/.stat
1cb0: 69 63 20 63 6f 6e 73 74 20 53 62 53 56 61 6c 75 ic const SbSValu
1cc0: 65 20 2a 73 62 73 5f 66 65 74 63 68 28 0a 20 20 e *sbs_fetch(.
1cd0: 53 62 73 48 61 73 68 54 61 62 20 2a 70 48 61 73 SbsHashTab *pHas
1ce0: 68 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 h, . const char
1cf0: 20 2a 7a 4b 65 79 2c 20 0a 20 20 69 6e 74 20 6e *zKey, . int n
1d00: 4b 65 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a Key.){. int h;.
1d10: 20 20 53 62 73 48 61 73 68 45 6e 74 72 79 20 2a SbsHashEntry *
1d20: 70 3b 0a 0a 20 20 69 66 28 20 6e 4b 65 79 3c 30 p;.. if( nKey<0
1d30: 20 29 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e ) nKey = strlen
1d40: 28 7a 4b 65 79 29 3b 0a 20 20 68 20 3d 20 73 62 (zKey);. h = sb
1d50: 73 5f 68 61 73 68 28 7a 4b 65 79 2c 20 6e 4b 65 s_hash(zKey, nKe
1d60: 79 29 3b 0a 20 20 66 6f 72 28 70 20 3d 20 70 48 y);. for(p = pH
1d70: 61 73 68 2d 3e 61 48 61 73 68 5b 68 5d 3b 20 70 ash->aHash[h]; p
1d80: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 ; p=p->pNext){.
1d90: 20 20 20 69 66 28 20 70 2d 3e 6e 4b 65 79 3d 3d if( p->nKey==
1da0: 6e 4b 65 79 20 26 26 20 6d 65 6d 63 6d 70 28 70 nKey && memcmp(p
1db0: 2d 3e 7a 4b 65 79 2c 7a 4b 65 79 2c 6e 4b 65 79 ->zKey,zKey,nKey
1dc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 )==0 ){. re
1dd0: 74 75 72 6e 20 26 70 2d 3e 76 61 6c 3b 0a 20 20 turn &p->val;.
1de0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e }. }. return
1df0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 0;.}../*.** Sto
1e00: 72 65 20 61 20 76 61 6c 75 65 20 69 6e 20 74 68 re a value in th
1e10: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4f e hash table. O
1e20: 76 65 72 77 72 69 74 65 20 61 6e 79 20 70 72 69 verwrite any pri
1e30: 6f 72 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a or value stored.
1e40: 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 73 61 6d ** under the sam
1e50: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 e name..**.** If
1e60: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 the value in th
1e70: 65 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6e e 4th argument n
1e80: 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 65 74 eeds to be reset
1e90: 20 6f 72 20 66 72 65 65 64 2c 0a 2a 2a 20 74 68 or freed,.** th
1ea0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 77 69 6c e hash table wil
1eb0: 6c 20 74 61 6b 65 20 6f 76 65 72 20 72 65 73 70 l take over resp
1ec0: 6f 6e 73 69 62 69 6c 69 69 74 79 20 66 6f 72 20 onsibiliity for
1ed0: 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2f 0a 73 74 61 doing so..*/.sta
1ee0: 74 69 63 20 69 6e 74 20 73 62 73 5f 73 74 6f 72 tic int sbs_stor
1ef0: 65 28 0a 20 20 53 62 73 48 61 73 68 54 61 62 20 e(. SbsHashTab
1f00: 2a 70 48 61 73 68 2c 20 20 20 20 20 20 20 2f 2a *pHash, /*
1f10: 20 49 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 69 Insert into thi
1f20: 73 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a s hash table */.
1f30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b const char *zK
1f40: 65 79 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 ey, /* Th
1f50: 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e e key */. int n
1f60: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 Key,
1f70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 /* Size of t
1f80: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 he key */. cons
1f90: 74 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61 6c t SbSValue *pVal
1fa0: 75 65 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 ue /* The valu
1fb0: 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 2a e to be stored *
1fc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 /.){. int h;.
1fd0: 53 62 73 48 61 73 68 45 6e 74 72 79 20 2a 70 2c SbsHashEntry *p,
1fe0: 20 2a 70 4e 65 77 3b 0a 0a 20 20 69 66 28 20 6e *pNew;.. if( n
1ff0: 4b 65 79 3c 30 20 29 20 6e 4b 65 79 20 3d 20 73 Key<0 ) nKey = s
2000: 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 68 trlen(zKey);. h
2010: 20 3d 20 73 62 73 5f 68 61 73 68 28 7a 4b 65 79 = sbs_hash(zKey
2020: 2c 20 6e 4b 65 79 29 3b 0a 20 20 66 6f 72 28 70 , nKey);. for(p
2030: 20 3d 20 70 48 61 73 68 2d 3e 61 48 61 73 68 5b = pHash->aHash[
2040: 68 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 h]; p; p=p->pNex
2050: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e t){. if( p->n
2060: 4b 65 79 3d 3d 6e 4b 65 79 20 26 26 20 6d 65 6d Key==nKey && mem
2070: 63 6d 70 28 70 2d 3e 7a 4b 65 79 2c 7a 4b 65 79 cmp(p->zKey,zKey
2080: 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 ,nKey)==0 ){.
2090: 20 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 sbs_value_res
20a0: 65 74 28 26 70 2d 3e 76 61 6c 29 3b 0a 20 20 20 et(&p->val);.
20b0: 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 76 61 memcpy(&p->va
20c0: 6c 2c 20 70 56 61 6c 75 65 2c 20 73 69 7a 65 6f l, pValue, sizeo
20d0: 66 28 70 2d 3e 76 61 6c 29 29 3b 0a 20 20 20 20 f(p->val));.
20e0: 20 20 72 65 74 75 72 6e 20 53 42 53 5f 4f 4b 3b return SBS_OK;
20f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 . }. }. pNe
2100: 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 w = malloc( size
2110: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 4b 65 79 of(*pNew) + nKey
2120: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 );. if( pNew )
2130: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4b 65 79 {. pNew->nKey
2140: 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6d 65 6d = nKey;. mem
2150: 63 70 79 28 70 4e 65 77 2d 3e 7a 4b 65 79 2c 20 cpy(pNew->zKey,
2160: 7a 4b 65 79 2c 20 6e 4b 65 79 2b 31 29 3b 0a 20 zKey, nKey+1);.
2170: 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d memcpy(&pNew-
2180: 3e 76 61 6c 2c 20 70 56 61 6c 75 65 2c 20 73 69 >val, pValue, si
2190: 7a 65 6f 66 28 70 4e 65 77 2d 3e 76 61 6c 29 29 zeof(pNew->val))
21a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 ;. pNew->pNex
21b0: 74 20 3d 20 70 48 61 73 68 2d 3e 61 48 61 73 68 t = pHash->aHash
21c0: 5b 68 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e [h];. pHash->
21d0: 61 48 61 73 68 5b 68 5d 20 3d 20 70 4e 65 77 3b aHash[h] = pNew;
21e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f . return SBS_
21f0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e OK;. }. return
2200: 20 53 42 53 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f SBS_ERROR;.}../
2210: 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 68 61 73 *.** Reset a has
2220: 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 h table..*/.stat
2230: 69 63 20 76 6f 69 64 20 73 62 73 5f 68 61 73 68 ic void sbs_hash
2240: 5f 72 65 73 65 74 28 53 62 73 48 61 73 68 54 61 _reset(SbsHashTa
2250: 62 20 2a 70 48 61 73 68 29 7b 0a 20 20 69 6e 74 b *pHash){. int
2260: 20 69 3b 0a 20 20 53 62 73 48 61 73 68 45 6e 74 i;. SbsHashEnt
2270: 72 79 20 2a 70 2c 20 2a 70 4e 65 78 74 3b 0a 20 ry *p, *pNext;.
2280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 42 53 43 for(i=0; i<SBSC
2290: 4f 4e 46 49 47 5f 4e 48 41 53 48 3b 20 69 2b 2b ONFIG_NHASH; i++
22a0: 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 48 61 ){. for(p=pHa
22b0: 73 68 2d 3e 61 48 61 73 68 5b 69 5d 3b 20 70 3b sh->aHash[i]; p;
22c0: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 p=pNext){.
22d0: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 pNext = p->pNex
22e0: 74 3b 0a 20 20 20 20 20 20 73 62 73 5f 76 61 6c t;. sbs_val
22f0: 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 76 61 6c ue_reset(&p->val
2300: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 70 29 );. free(p)
2310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 ;. }. }. me
2320: 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20 73 mset(pHash, 0, s
2330: 69 7a 65 6f 66 28 2a 70 48 61 73 68 29 29 3b 0a izeof(*pHash));.
2340: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 20 }../*.** Push a
2350: 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20 73 value onto the s
2360: 74 61 63 6b 20 6f 66 20 61 6e 20 69 6e 74 65 72 tack of an inter
2370: 70 72 65 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63 preter.*/.static
2380: 20 69 6e 74 20 73 62 73 5f 70 75 73 68 28 53 75 int sbs_push(Su
2390: 62 73 63 72 69 70 74 20 2a 70 2c 20 53 62 53 56 bscript *p, SbSV
23a0: 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 alue *pVal){. i
23b0: 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 53 42 f( p->nStack>=SB
23c0: 53 43 4f 4e 46 49 47 5f 4e 53 54 41 43 4b 20 29 SCONFIG_NSTACK )
23d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e {. sqlite3_sn
23e0: 70 72 69 6e 74 66 28 53 42 53 43 4f 4e 46 49 47 printf(SBSCONFIG
23f0: 5f 45 52 52 53 49 5a 45 2c 20 70 2d 3e 7a 45 72 _ERRSIZE, p->zEr
2400: 72 4d 73 67 2c 20 22 73 74 61 63 6b 20 6f 76 65 rMsg, "stack ove
2410: 72 66 6c 6f 77 22 29 3b 0a 20 20 20 20 72 65 74 rflow");. ret
2420: 75 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 urn SBS_ERROR;.
2430: 20 7d 0a 20 20 70 2d 3e 61 53 74 61 63 6b 5b 70 }. p->aStack[p
2440: 2d 3e 6e 53 74 61 63 6b 2b 2b 5d 20 3d 20 2a 70 ->nStack++] = *p
2450: 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 42 Val;. return SB
2460: 53 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 S_OK;.}../*.** C
2470: 72 65 61 74 65 20 61 20 6e 65 77 20 73 75 62 73 reate a new subs
2480: 63 72 69 70 74 20 69 6e 74 65 72 70 72 65 74 65 cript interprete
2490: 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 r. Return a poi
24a0: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6e nter to the.** n
24b0: 65 77 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 ew interpreter,
24c0: 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 or return NULL i
24d0: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a f malloc fails..
24e0: 2a 2f 0a 73 74 72 75 63 74 20 53 75 62 73 63 72 */.struct Subscr
24f0: 69 70 74 20 2a 53 62 53 5f 43 72 65 61 74 65 28 ipt *SbS_Create(
2500: 76 6f 69 64 29 7b 0a 20 20 53 75 62 73 63 72 69 void){. Subscri
2510: 70 74 20 2a 70 3b 0a 20 20 70 20 3d 20 6d 61 6c pt *p;. p = mal
2520: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 loc( sizeof(*p)
2530: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 );. if( p ){.
2540: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 memset(p, 0, s
2550: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7d 0a izeof(*p));. }.
2560: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f return p;.}../
2570: 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 61 6e 20 *.** Destroy an
2580: 73 75 62 73 63 72 69 70 74 20 69 6e 74 65 72 70 subscript interp
2590: 72 65 74 65 72 0a 2a 2f 0a 76 6f 69 64 20 53 62 reter.*/.void Sb
25a0: 53 5f 44 65 73 74 72 6f 79 28 73 74 72 75 63 74 S_Destroy(struct
25b0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 29 7b 0a Subscript *p){.
25c0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 62 73 5f 68 int i;. sbs_h
25d0: 61 73 68 5f 72 65 73 65 74 28 26 70 2d 3e 73 79 ash_reset(&p->sy
25e0: 6d 54 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 mTab);. for(i=0
25f0: 3b 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69 ; i<p->nStack; i
2600: 2b 2b 29 7b 0a 20 20 20 20 73 62 73 5f 76 61 6c ++){. sbs_val
2610: 75 65 5f 72 65 73 65 74 28 26 70 2d 3e 61 53 74 ue_reset(&p->aSt
2620: 61 63 6b 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 ack[i]);. }. f
2630: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ree(p);.}../*.**
2640: 20 53 65 74 20 74 68 65 20 65 72 72 6f 72 20 6d Set the error m
2650: 65 73 73 61 67 65 20 66 6f 72 20 61 6e 20 69 6e essage for an in
2660: 74 65 72 70 72 65 74 65 72 2e 20 20 56 65 72 62 terpreter. Verb
2670: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 implementations
2680: 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 72 6f 75 .** use this rou
2690: 74 69 6e 65 20 77 68 65 6e 20 74 68 65 79 20 65 tine when they e
26a0: 6e 63 6f 75 6e 74 65 72 20 61 6e 20 65 72 72 6f ncounter an erro
26b0: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 53 62 53 5f 53 r..*/.void SbS_S
26c0: 65 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73 etErrorMessage(s
26d0: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
26e0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a *p, const char *
26f0: 7a 45 72 72 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e zErr, ...){. in
2700: 74 20 6e 45 72 72 3b 0a 20 20 63 68 61 72 20 2a t nErr;. char *
2710: 7a 4d 73 67 3b 0a 20 20 76 61 5f 6c 69 73 74 20 zMsg;. va_list
2720: 61 70 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 ap;.. va_start(
2730: 61 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7a 4d 73 ap, zErr);. zMs
2740: 67 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 45 72 g = vmprintf(zEr
2750: 72 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 r, ap);. va_end
2760: 28 61 70 29 3b 0a 20 20 6e 45 72 72 20 3d 20 73 (ap);. nErr = s
2770: 74 72 6c 65 6e 28 7a 4d 73 67 29 3b 0a 20 20 69 trlen(zMsg);. i
2780: 66 28 20 6e 45 72 72 3e 73 69 7a 65 6f 66 28 70 f( nErr>sizeof(p
2790: 2d 3e 7a 45 72 72 4d 73 67 29 2d 31 20 29 7b 0a ->zErrMsg)-1 ){.
27a0: 20 20 20 20 6e 45 72 72 20 3d 20 73 69 7a 65 6f nErr = sizeo
27b0: 66 28 70 2d 3e 7a 45 72 72 4d 73 67 29 2d 31 3b f(p->zErrMsg)-1;
27c0: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d . }. memcpy(p-
27d0: 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 2c 20 >zErrMsg, zMsg,
27e0: 6e 45 72 72 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 nErr);. p->zErr
27f0: 4d 73 67 5b 6e 45 72 72 5d 20 3d 20 30 3b 0a 20 Msg[nErr] = 0;.
2800: 20 66 72 65 65 28 7a 4d 73 67 29 3b 0a 7d 0a 0a free(zMsg);.}..
2810: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 /*.** Return a p
2820: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 75 ointer to the cu
2830: 72 72 65 6e 74 20 65 72 72 6f 72 20 6d 65 73 73 rrent error mess
2840: 61 67 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 age for the.** i
2850: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 63 nterpreter..*/.c
2860: 6f 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 47 onst char *SbS_G
2870: 65 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28 73 etErrorMessage(s
2880: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
2890: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d *p){. return p-
28a0: 3e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a >zErrMsg;.}../*.
28b0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 76 65 72 ** Add a new ver
28c0: 62 20 74 68 65 20 67 69 76 65 6e 20 69 6e 74 65 b the given inte
28d0: 72 70 72 65 74 65 72 0a 2a 2f 0a 69 6e 74 20 53 rpreter.*/.int S
28e0: 62 53 5f 41 64 64 56 65 72 62 28 0a 20 20 73 74 bS_AddVerb(. st
28f0: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a ruct Subscript *
2900: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 p,. const char
2910: 2a 7a 56 65 72 62 2c 0a 20 20 69 6e 74 20 28 2a *zVerb,. int (*
2920: 78 56 65 72 62 29 28 73 74 72 75 63 74 20 53 75 xVerb)(struct Su
2930: 62 73 63 72 69 70 74 2a 2c 76 6f 69 64 2a 29 2c bscript*,void*),
2940: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b . void *pArg.){
2950: 0a 20 20 53 62 53 56 61 6c 75 65 20 76 3b 0a 20 . SbSValue v;.
2960: 20 76 2e 66 6c 61 67 73 20 3d 20 53 42 53 56 41 v.flags = SBSVA
2970: 4c 5f 56 45 52 42 3b 0a 20 20 76 2e 75 2e 76 65 L_VERB;. v.u.ve
2980: 72 62 2e 78 56 65 72 62 20 3d 20 78 56 65 72 62 rb.xVerb = xVerb
2990: 3b 0a 20 20 76 2e 75 2e 76 65 72 62 2e 70 41 72 ;. v.u.verb.pAr
29a0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 g = pArg;. retu
29b0: 72 6e 20 73 62 73 5f 73 74 6f 72 65 28 26 70 2d rn sbs_store(&p-
29c0: 3e 73 79 6d 54 61 62 2c 20 7a 56 65 72 62 2c 20 >symTab, zVerb,
29d0: 2d 31 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a -1, &v);.}../*.*
29e0: 2a 20 53 74 6f 72 65 20 61 20 76 61 6c 75 65 20 * Store a value
29f0: 69 6e 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 in an interprete
2a00: 72 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69 r variable..*/.i
2a10: 6e 74 20 53 62 53 5f 53 74 6f 72 65 28 0a 20 20 nt SbS_Store(.
2a20: 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 struct Subscript
2a30: 20 2a 70 2c 20 20 20 2f 2a 20 53 74 6f 72 65 20 *p, /* Store
2a40: 69 6e 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 into this interp
2a50: 72 65 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 reter */. const
2a60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 char *zName,
2a70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 /* Name of the
2a80: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 63 variable */. c
2a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 onst char *zValu
2aa0: 65 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f e, /* Value o
2ab0: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 2a f the variable *
2ac0: 2f 0a 20 20 69 6e 74 20 70 65 72 73 69 73 74 65 /. int persiste
2ad0: 6e 63 65 20 20 20 20 20 20 20 20 2f 2a 20 30 3a nce /* 0:
2ae0: 20 73 74 61 74 69 63 2e 20 20 31 3a 20 65 70 68 static. 1: eph
2af0: 65 6d 65 72 61 6c 2e 20 20 32 3a 20 64 79 6e 61 emeral. 2: dyna
2b00: 6d 69 63 20 2a 2f 0a 29 7b 0a 20 20 53 62 53 56 mic */.){. SbSV
2b10: 61 6c 75 65 20 76 3b 0a 20 20 76 2e 66 6c 61 67 alue v;. v.flag
2b20: 73 20 3d 20 53 42 53 56 41 4c 5f 53 54 52 3b 0a s = SBSVAL_STR;.
2b30: 20 20 76 2e 75 2e 73 74 72 2e 73 69 7a 65 20 3d v.u.str.size =
2b40: 20 73 74 72 6c 65 6e 28 7a 56 61 6c 75 65 29 3b strlen(zValue);
2b50: 0a 20 20 69 66 28 20 70 65 72 73 69 73 74 65 6e . if( persisten
2b60: 63 65 3d 3d 31 20 29 7b 0a 20 20 20 20 76 2e 75 ce==1 ){. v.u
2b70: 2e 73 74 72 2e 7a 20 3d 20 6d 70 72 69 6e 74 66 .str.z = mprintf
2b80: 28 22 25 73 22 2c 20 7a 56 61 6c 75 65 29 3b 0a ("%s", zValue);.
2b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2e 75 }else{. v.u
2ba0: 2e 73 74 72 2e 7a 20 3d 20 28 63 68 61 72 2a 29 .str.z = (char*)
2bb0: 7a 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 69 66 zValue;. }. if
2bc0: 28 20 70 65 72 73 69 73 74 65 6e 63 65 3e 30 20 ( persistence>0
2bd0: 29 7b 0a 20 20 20 20 76 2e 66 6c 61 67 73 20 7c ){. v.flags |
2be0: 3d 20 53 42 53 56 41 4c 5f 44 59 4e 3b 0a 20 20 = SBSVAL_DYN;.
2bf0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 62 73 5f 73 }. return sbs_s
2c00: 74 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62 2c tore(&p->symTab,
2c10: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 26 76 29 3b zName, -1, &v);
2c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 73 68 20 61 .}../*.** Push a
2c30: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 6e string value on
2c40: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a to the stack..**
2c50: 0a 2a 2a 20 49 66 20 74 68 65 20 34 74 68 20 70 .** If the 4th p
2c60: 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 arameter is 0, t
2c70: 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 69 hen the string i
2c80: 73 20 73 74 61 74 69 63 2e 0a 2a 2a 20 49 66 20 s static..** If
2c90: 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 the 4th paramete
2ca0: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 r is non-zero th
2cb0: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 77 61 en the string wa
2cc0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 s obtained.** fr
2cd0: 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 53 75 om malloc and Su
2ce0: 62 73 63 72 69 70 74 20 77 69 6c 6c 20 74 61 6b bscript will tak
2cf0: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 e responsibility
2d00: 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 for freeing.**
2d10: 69 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e it..**.** Return
2d20: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 0 on success an
2d30: 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 d non-zero if th
2d40: 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e ere is an error.
2d50: 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75 73 68 .*/.int SbS_Push
2d60: 28 0a 20 20 73 74 72 75 63 74 20 53 75 62 73 63 (. struct Subsc
2d70: 72 69 70 74 20 2a 70 2c 20 20 2f 2a 20 50 75 73 ript *p, /* Pus
2d80: 68 20 6f 6e 74 6f 20 74 68 69 73 20 69 6e 74 65 h onto this inte
2d90: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 63 68 61 rpreter */. cha
2da0: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 r *z,
2db0: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 76 61 6c /* String val
2dc0: 75 65 20 74 6f 20 70 75 73 68 20 2a 2f 0a 20 20 ue to push */.
2dd0: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 int n,
2de0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 /* Length
2df0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 2c 20 6f of the string, o
2e00: 72 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 64 79 r -1 */. int dy
2e10: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n
2e20: 2f 2a 20 49 66 20 74 72 75 65 2c 20 7a 20 77 61 /* If true, z wa
2e30: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 s obtained from
2e40: 6d 61 6c 6c 6f 63 20 2a 2f 0a 29 7b 0a 20 20 53 malloc */.){. S
2e50: 62 53 56 61 6c 75 65 20 76 3b 0a 20 20 76 2e 66 bSValue v;. v.f
2e60: 6c 61 67 73 20 3d 20 53 42 53 56 41 4c 5f 53 54 lags = SBSVAL_ST
2e70: 52 3b 0a 20 20 69 66 28 20 64 79 6e 20 29 7b 0a R;. if( dyn ){.
2e80: 20 20 20 20 76 2e 66 6c 61 67 73 20 7c 3d 20 53 v.flags |= S
2e90: 42 53 56 41 4c 5f 44 59 4e 3b 0a 20 20 7d 0a 20 BSVAL_DYN;. }.
2ea0: 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 73 if( n<0 ) n = s
2eb0: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 76 2e 75 2e trlen(z);. v.u.
2ec0: 73 74 72 2e 73 69 7a 65 20 3d 20 6e 3b 0a 20 20 str.size = n;.
2ed0: 76 2e 75 2e 73 74 72 2e 7a 20 3d 20 7a 3b 0a 20 v.u.str.z = z;.
2ee0: 20 72 65 74 75 72 6e 20 73 62 73 5f 70 75 73 68 return sbs_push
2ef0: 28 70 2c 20 26 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a (p, &v);.}../*.*
2f00: 2a 20 50 75 73 68 20 61 6e 20 69 6e 74 65 67 65 * Push an intege
2f10: 72 20 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 r value onto the
2f20: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 stack..**.** Th
2f30: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 6c 6c is routine reall
2f40: 79 20 6a 75 73 74 20 63 6f 6e 76 65 72 74 73 20 y just converts
2f50: 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 74 6f the integer into
2f60: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 65 a string.** the
2f70: 6e 20 63 61 6c 6c 73 20 53 62 53 5f 50 75 73 68 n calls SbS_Push
2f80: 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 75 73 ..*/.int SbS_Pus
2f90: 68 49 6e 74 28 73 74 72 75 63 74 20 53 75 62 73 hInt(struct Subs
2fa0: 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 69 56 cript *p, int iV
2fb0: 61 6c 29 7b 0a 20 20 69 66 28 20 69 56 61 6c 3d al){. if( iVal=
2fc0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e =0 ){. return
2fd0: 20 53 62 53 5f 50 75 73 68 28 70 2c 20 22 30 22 SbS_Push(p, "0"
2fe0: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 , 1, 0);. }else
2ff0: 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a if( iVal==1 ){.
3000: 20 20 20 20 72 65 74 75 72 6e 20 53 62 53 5f 50 return SbS_P
3010: 75 73 68 28 70 2c 20 22 31 22 2c 20 31 2c 20 30 ush(p, "1", 1, 0
3020: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
3030: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 char *z;. int
3040: 20 6e 3b 0a 20 20 20 20 63 68 61 72 20 7a 56 61 n;. char zVa
3050: 6c 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e l[50];. sprin
3060: 74 66 28 7a 56 61 6c 2c 20 22 25 64 22 2c 20 69 tf(zVal, "%d", i
3070: 56 61 6c 29 3b 0a 20 20 20 20 6e 20 3d 20 73 74 Val);. n = st
3080: 72 6c 65 6e 28 7a 56 61 6c 29 3b 0a 20 20 20 20 rlen(zVal);.
3090: 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 z = malloc( n+1
30a0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a );. if( z ){.
30b0: 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 2c 20 strcpy(z,
30c0: 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 zVal);. ret
30d0: 75 72 6e 20 53 62 53 5f 50 75 73 68 28 70 2c 20 urn SbS_Push(p,
30e0: 7a 2c 20 6e 2c 20 31 29 3b 0a 20 20 20 20 7d 65 z, n, 1);. }e
30f0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 lse{. retur
3100: 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 n SBS_ERROR;.
3110: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 }. }.}../*.**
3120: 50 6f 70 20 61 6e 64 20 64 65 73 74 72 6f 79 20 Pop and destroy
3130: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c zero or more val
3140: 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 ues from the sta
3150: 63 6b 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ck..** Return th
3160: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75 e number of valu
3170: 65 73 20 72 65 6d 61 69 6e 69 6e 67 20 6f 6e 20 es remaining on
3180: 74 68 65 20 73 74 61 63 6b 20 61 66 74 65 72 0a the stack after.
3190: 2a 2a 20 74 68 65 20 70 6f 70 73 20 6f 63 63 75 ** the pops occu
31a0: 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62 53 5f 50 6f r..*/.int SbS_Po
31b0: 70 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 p(struct Subscri
31c0: 70 74 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 pt *p, int N){.
31d0: 20 77 68 69 6c 65 28 20 4e 3e 30 20 26 26 20 70 while( N>0 && p
31e0: 2d 3e 6e 53 74 61 63 6b 3e 30 20 29 7b 0a 20 20 ->nStack>0 ){.
31f0: 20 20 70 2d 3e 6e 53 74 61 63 6b 2d 2d 3b 0a 20 p->nStack--;.
3200: 20 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 sbs_value_res
3210: 65 74 28 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d et(&p->aStack[p-
3220: 3e 6e 53 74 61 63 6b 5d 29 3b 0a 20 20 20 20 4e >nStack]);. N
3230: 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e --;. }. return
3240: 20 70 2d 3e 6e 53 74 61 63 6b 3b 0a 7d 0a 0a 2f p->nStack;.}../
3250: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
3260: 4e 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 N-th element of
3270: 74 68 65 20 73 74 61 63 6b 2e 20 20 30 20 69 73 the stack. 0 is
3280: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 the top of the
3290: 73 74 61 63 6b 2e 0a 2a 2a 20 31 20 69 73 20 74 stack..** 1 is t
32a0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 he first element
32b0: 20 64 6f 77 6e 2e 20 20 32 20 69 73 20 74 68 65 down. 2 is the
32c0: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 2e second element.
32d0: 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a And so forth..
32e0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 ** Return NULL i
32f0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e 2d f there is no N-
3300: 74 68 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a th element..**.*
3310: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 * The pointer re
3320: 74 75 72 6e 65 64 20 69 73 20 6f 6e 6c 79 20 76 turned is only v
3330: 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 76 alid until the v
3340: 61 6c 75 65 20 69 73 20 70 6f 70 70 65 64 0a 2a alue is popped.*
3350: 2a 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b * from the stack
3360: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 ..*/.const char
3370: 2a 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 *SbS_StackValue(
3380: 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 struct Subscript
3390: 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 *p, int N, int
33a0: 2a 70 53 69 7a 65 29 7b 0a 20 20 53 62 53 56 61 *pSize){. SbSVa
33b0: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 66 28 lue *pVal;. if(
33c0: 20 4e 3c 30 20 7c 7c 20 4e 3e 3d 70 2d 3e 6e 53 N<0 || N>=p->nS
33d0: 74 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 tack ){. retu
33e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 56 61 6c rn 0;. }. pVal
33f0: 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d = &p->aStack[p-
3400: 3e 6e 53 74 61 63 6b 2d 4e 2d 31 5d 3b 0a 20 20 >nStack-N-1];.
3410: 69 66 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 if( (pVal->flags
3420: 20 26 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d & SBSVAL_STR)==
3430: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 0 ){. return
3440: 30 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 0;. }. *pSize
3450: 3d 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 = pVal->u.str.si
3460: 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 61 ze;. return pVa
3470: 6c 2d 3e 75 2e 73 74 72 2e 7a 3b 0a 7d 0a 0a 2f l->u.str.z;.}../
3480: 2a 0a 2a 2a 20 41 20 63 6f 6e 76 65 6e 69 65 6e *.** A convenien
3490: 63 65 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 ce routine for e
34a0: 78 74 72 61 63 74 69 6e 67 20 61 6e 20 69 6e 74 xtracting an int
34b0: 65 67 65 72 20 76 61 6c 75 65 20 66 72 6f 6d 20 eger value from
34c0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f the.** stack..*/
34d0: 0a 69 6e 74 20 53 62 53 5f 53 74 61 63 6b 56 61 .int SbS_StackVa
34e0: 6c 75 65 49 6e 74 28 73 74 72 75 63 74 20 53 75 lueInt(struct Su
34f0: 62 73 63 72 69 70 74 20 2a 70 2c 20 69 6e 74 20 bscript *p, int
3500: 4e 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 76 3b 0a N){. int n, v;.
3510: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b int isNeg = 0;
3520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
3530: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 = SbS_StackValu
3540: 65 28 70 2c 20 4e 2c 20 26 6e 29 3b 0a 20 20 76 e(p, N, &n);. v
3550: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 = 0;. if( n==0
3560: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 ) return 0;. i
3570: 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a f( z[0]=='-' ){.
3580: 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 isNeg = 1;.
3590: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b z++;. n--;
35a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 . }else if( z[0
35b0: 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 2b ]=='+' ){. z+
35c0: 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a +;. n--;. }.
35d0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 while( n>0 &&
35e0: 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b isdigit(z[0]) ){
35f0: 0a 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 . v = v*10 +
3600: 7a 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 z[0] - '0';.
3610: 7a 2b 2b 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 z++;. n--;.
3620: 7d 0a 20 20 69 66 28 20 69 73 4e 65 67 20 29 7b }. if( isNeg ){
3630: 0a 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20 7d . v = -v;. }
3640: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a . return v;.}..
3650: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 74 /*.** Retrieve t
3660: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 76 61 he value of a va
3670: 72 69 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 riable from the
3680: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 52 65 interpreter. Re
3690: 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 turn.** NULL if
36a0: 6e 6f 20 73 75 63 68 20 76 61 72 69 61 62 6c 65 no such variable
36b0: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 0a 2a is defined. .*
36c0: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 *.** The returne
36d0: 64 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 d string is not
36e0: 6e 65 63 65 73 73 61 72 69 6c 79 20 28 70 72 6f necessarily (pro
36f0: 62 61 62 6c 79 20 6e 6f 74 29 20 7a 65 72 6f 2d bably not) zero-
3700: 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 54 terminated..** T
3710: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 he string may be
3720: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 deallocated the
3730: 20 6e 65 78 74 20 74 69 6d 65 20 61 6e 79 74 68 next time anyth
3740: 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 0a 2a ing is done to.*
3750: 2a 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 * the interprete
3760: 72 2e 20 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 r. Make a copy
3770: 69 66 20 79 6f 75 20 6e 65 65 64 20 69 74 20 74 if you need it t
3780: 6f 20 70 65 72 73 69 73 74 2e 0a 2a 2f 0a 63 6f o persist..*/.co
3790: 6e 73 74 20 63 68 61 72 20 2a 53 62 53 5f 46 65 nst char *SbS_Fe
37a0: 74 63 68 28 0a 20 20 73 74 72 75 63 74 20 53 75 tch(. struct Su
37b0: 62 73 63 72 69 70 74 20 2a 70 2c 20 20 20 2f 2a bscript *p, /*
37c0: 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 The interpreter
37d0: 20 77 65 20 61 72 65 20 69 6e 74 65 72 72 6f 67 we are interrog
37e0: 61 74 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 ating */. const
37f0: 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 char *zKey,
3800: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 /* Name of t
3810: 68 65 20 76 61 72 69 61 62 6c 65 2e 20 20 43 61 he variable. Ca
3820: 73 65 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a se sensitive */.
3830: 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 int nKey,
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 /* Le
3850: 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 20 ngth of the key
3860: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4c 65 6e 67 74 */. int *pLengt
3870: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a h /*
3880: 20 57 72 69 74 65 20 74 68 65 20 6c 65 6e 67 74 Write the lengt
3890: 68 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 h here */.){. c
38a0: 6f 6e 73 74 20 53 62 53 56 61 6c 75 65 20 2a 70 onst SbSValue *p
38b0: 56 61 6c 3b 0a 0a 20 20 70 56 61 6c 20 3d 20 73 Val;.. pVal = s
38c0: 62 73 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d bs_fetch(&p->sym
38d0: 54 61 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 Tab, zKey, nKey)
38e0: 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 ;. if( pVal==0
38f0: 7c 7c 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 || (pVal->flags
3900: 26 20 53 42 53 56 41 4c 5f 53 54 52 29 3d 3d 30 & SBSVAL_STR)==0
3910: 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 67 74 68 ){. *pLength
3920: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e = 0;. return
3930: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 0;. }else{.
3940: 20 2a 70 4c 65 6e 67 74 68 20 3d 20 70 56 61 6c *pLength = pVal
3950: 2d 3e 75 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 ->u.str.size;.
3960: 20 20 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 75 return pVal->u
3970: 2e 73 74 72 2e 7a 3b 0a 20 20 7d 0a 7d 0a 0a 2f .str.z;. }.}../
3980: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e *.** Generate an
3990: 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 error and retur
39a0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 n non-zero if th
39b0: 65 20 73 74 61 63 6b 20 68 61 73 0a 2a 2a 20 66 e stack has.** f
39c0: 65 77 65 72 20 74 68 61 6e 20 4e 20 65 6c 65 6d ewer than N elem
39d0: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 ents. This is u
39e0: 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75 tility routine u
39f0: 73 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6d sed in.** the im
3a00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 plementation of
3a10: 76 65 72 62 73 2e 0a 2a 2f 0a 69 6e 74 20 53 62 verbs..*/.int Sb
3a20: 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 73 S_RequireStack(s
3a30: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
3a40: 2a 70 2c 20 69 6e 74 20 4e 2c 20 63 6f 6e 73 74 *p, int N, const
3a50: 20 63 68 61 72 20 2a 7a 43 6d 64 29 7b 0a 20 20 char *zCmd){.
3a60: 69 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 3d 4e if( p->nStack>=N
3a70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 ) return 0;. s
3a80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
3a90: 73 69 7a 65 6f 66 28 70 2d 3e 7a 45 72 72 4d 73 sizeof(p->zErrMs
3aa0: 67 29 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 0a g), p->zErrMsg,.
3ab0: 20 20 20 20 20 22 5c 22 25 73 5c 22 20 72 65 71 "\"%s\" req
3ac0: 75 69 72 65 73 20 61 74 20 6c 65 61 73 74 20 25 uires at least %
3ad0: 64 20 73 74 61 63 6b 20 65 6c 65 6d 65 6e 74 73 d stack elements
3ae0: 20 2d 20 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 64 - only found %d
3af0: 22 2c 0a 20 20 20 20 20 7a 43 6d 64 2c 20 4e 2c ",. zCmd, N,
3b00: 20 70 2d 3e 6e 53 74 61 63 6b 29 3b 0a 20 20 72 p->nStack);. r
3b10: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 1;.}../*.*
3b20: 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d * Subscript comm
3b30: 61 6e 64 3a 20 20 20 20 20 20 20 53 54 52 49 4e and: STRIN
3b40: 47 20 4e 41 4d 45 20 73 65 74 0a 2a 2a 0a 2a 2a G NAME set.**.**
3b50: 20 57 72 69 74 65 20 74 68 65 20 76 61 6c 75 65 Write the value
3b60: 20 6f 66 20 53 54 52 49 4e 47 20 69 6e 74 6f 20 of STRING into
3b70: 76 61 72 69 61 62 6c 65 20 63 61 6c 6c 65 64 20 variable called
3b80: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 NAME..*/.static
3b90: 69 6e 74 20 73 65 74 43 6d 64 28 53 75 62 73 63 int setCmd(Subsc
3ba0: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 ript *p, void *p
3bb0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 53 62 53 56 NotUsed){. SbSV
3bc0: 61 6c 75 65 20 2a 70 54 6f 73 3b 0a 20 20 53 62 alue *pTos;. Sb
3bd0: 53 56 61 6c 75 65 20 2a 70 4e 6f 73 3b 0a 20 20 SValue *pNos;.
3be0: 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 if( SbS_RequireS
3bf0: 74 61 63 6b 28 70 2c 20 32 2c 20 22 73 65 74 22 tack(p, 2, "set"
3c00: 29 20 29 20 72 65 74 75 72 6e 20 53 42 53 5f 45 ) ) return SBS_E
3c10: 52 52 4f 52 3b 0a 20 20 70 54 6f 73 20 3d 20 26 RROR;. pTos = &
3c20: 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d 3e 6e p->aStack[--p->n
3c30: 53 74 61 63 6b 5d 3b 0a 20 20 70 4e 6f 73 20 3d Stack];. pNos =
3c40: 20 26 70 2d 3e 61 53 74 61 63 6b 5b 2d 2d 70 2d &p->aStack[--p-
3c50: 3e 6e 53 74 61 63 6b 5d 3b 0a 20 20 73 62 73 5f >nStack];. sbs_
3c60: 73 74 6f 72 65 28 26 70 2d 3e 73 79 6d 54 61 62 store(&p->symTab
3c70: 2c 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 7a 2c , pTos->u.str.z,
3c80: 20 70 54 6f 73 2d 3e 75 2e 73 74 72 2e 73 69 7a pTos->u.str.siz
3c90: 65 2c 20 70 4e 6f 73 29 3b 0a 20 20 73 62 73 5f e, pNos);. sbs_
3ca0: 76 61 6c 75 65 5f 72 65 73 65 74 28 70 54 6f 73 value_reset(pTos
3cb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d );. return 0;.}
3cc0: 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 ../*.** Subscrip
3cd0: 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 t command:
3ce0: 49 4e 54 45 47 45 52 20 6e 6f 74 20 49 4e 54 45 INTEGER not INTE
3cf0: 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e GER.*/.static in
3d00: 74 20 6e 6f 74 43 6d 64 28 73 74 72 75 63 74 20 t notCmd(struct
3d10: 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f Subscript *p, vo
3d20: 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 id *pNotUsed){.
3d30: 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 53 62 int n;. if( Sb
3d40: 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 S_RequireStack(p
3d50: 2c 20 31 2c 20 22 6e 6f 74 22 29 20 29 20 72 65 , 1, "not") ) re
3d60: 74 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20 53 62 turn 1;. n = Sb
3d70: 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 6e 74 28 S_StackValueInt(
3d80: 70 2c 20 30 29 3b 0a 20 20 53 62 53 5f 50 6f 70 p, 0);. SbS_Pop
3d90: 28 70 2c 20 31 29 3b 0a 20 20 53 62 53 5f 50 75 (p, 1);. SbS_Pu
3da0: 73 68 49 6e 74 28 70 2c 20 21 6e 29 3b 0a 20 20 shInt(p, !n);.
3db0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 64 65 return 0;.}..#de
3dc0: 66 69 6e 65 20 53 42 53 4f 50 5f 41 44 44 20 20 fine SBSOP_ADD
3dd0: 20 31 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50 1.#define SBSOP
3de0: 5f 53 55 42 20 20 20 32 0a 23 64 65 66 69 6e 65 _SUB 2.#define
3df0: 20 53 42 53 4f 50 5f 4d 55 4c 20 20 20 33 0a 23 SBSOP_MUL 3.#
3e00: 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 44 49 56 define SBSOP_DIV
3e10: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 53 42 53 4.#define SBS
3e20: 4f 50 5f 41 4e 44 20 20 20 35 0a 23 64 65 66 69 OP_AND 5.#defi
3e30: 6e 65 20 53 42 53 4f 50 5f 4f 52 20 20 20 20 36 ne SBSOP_OR 6
3e40: 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 4d .#define SBSOP_M
3e50: 49 4e 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 IN 7.#define S
3e60: 42 53 4f 50 5f 4d 41 58 20 20 20 38 0a 23 64 65 BSOP_MAX 8.#de
3e70: 66 69 6e 65 20 53 42 53 4f 50 5f 45 51 20 20 20 fine SBSOP_EQ
3e80: 20 39 0a 23 64 65 66 69 6e 65 20 53 42 53 4f 50 9.#define SBSOP
3e90: 5f 4e 45 20 20 20 31 30 0a 23 64 65 66 69 6e 65 _NE 10.#define
3ea0: 20 53 42 53 4f 50 5f 4c 54 20 20 20 31 31 0a 23 SBSOP_LT 11.#
3eb0: 64 65 66 69 6e 65 20 53 42 53 4f 50 5f 47 54 20 define SBSOP_GT
3ec0: 20 20 31 32 0a 23 64 65 66 69 6e 65 20 53 42 53 12.#define SBS
3ed0: 4f 50 5f 4c 45 20 20 20 31 33 0a 23 64 65 66 69 OP_LE 13.#defi
3ee0: 6e 65 20 53 42 53 4f 50 5f 47 45 20 20 20 31 34 ne SBSOP_GE 14
3ef0: 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 ../*.** Subscrip
3f00: 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 t command:
3f10: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 INTEGER INTEGER
3f20: 3c 62 69 6e 61 72 79 2d 6f 70 3e 20 49 4e 54 45 <binary-op> INTE
3f30: 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e GER.*/.static in
3f40: 74 20 62 6f 70 43 6d 64 28 73 74 72 75 63 74 20 t bopCmd(struct
3f50: 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f Subscript *p, vo
3f60: 69 64 20 2a 70 4f 70 29 7b 0a 20 20 69 6e 74 20 id *pOp){. int
3f70: 61 2c 20 62 2c 20 63 3b 0a 20 20 69 66 28 20 53 a, b, c;. if( S
3f80: 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 bS_RequireStack(
3f90: 70 2c 20 32 2c 20 22 42 49 4e 41 52 59 2d 4f 50 p, 2, "BINARY-OP
3fa0: 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 ") ) return 1;.
3fb0: 20 61 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 a = SbS_StackVa
3fc0: 6c 75 65 49 6e 74 28 70 2c 20 31 29 3b 0a 20 20 lueInt(p, 1);.
3fd0: 62 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c b = SbS_StackVal
3fe0: 75 65 49 6e 74 28 70 2c 20 30 29 3b 0a 20 20 73 ueInt(p, 0);. s
3ff0: 77 69 74 63 68 28 20 28 69 6e 74 29 70 4f 70 20 witch( (int)pOp
4000: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f ){. case SBSO
4010: 50 5f 45 51 3a 20 20 20 63 20 3d 20 61 3d 3d 62 P_EQ: c = a==b
4020: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ; brea
4030: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4040: 50 5f 4e 45 3a 20 20 20 63 20 3d 20 61 21 3d 62 P_NE: c = a!=b
4050: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ; brea
4060: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4070: 50 5f 4c 54 3a 20 20 20 63 20 3d 20 61 3c 62 3b P_LT: c = a<b;
4080: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 brea
4090: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
40a0: 50 5f 4c 45 3a 20 20 20 63 20 3d 20 61 3c 3d 62 P_LE: c = a<=b
40b0: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ; brea
40c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
40d0: 50 5f 47 54 3a 20 20 20 63 20 3d 20 61 3e 62 3b P_GT: c = a>b;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 brea
40f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4100: 50 5f 47 45 3a 20 20 20 63 20 3d 20 61 3e 3d 62 P_GE: c = a>=b
4110: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ; brea
4120: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4130: 50 5f 41 44 44 3a 20 20 63 20 3d 20 61 2b 62 3b P_ADD: c = a+b;
4140: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 brea
4150: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4160: 50 5f 53 55 42 3a 20 20 63 20 3d 20 61 2d 62 3b P_SUB: c = a-b;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 brea
4180: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4190: 50 5f 4d 55 4c 3a 20 20 63 20 3d 20 61 2a 62 3b P_MUL: c = a*b;
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 brea
41b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
41c0: 50 5f 44 49 56 3a 20 20 63 20 3d 20 62 21 3d 30 P_DIV: c = b!=0
41d0: 20 3f 20 61 2f 62 20 3a 20 30 3b 20 62 72 65 61 ? a/b : 0; brea
41e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
41f0: 50 5f 41 4e 44 3a 20 20 63 20 3d 20 61 20 26 26 P_AND: c = a &&
4200: 20 62 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 b; brea
4210: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4220: 50 5f 4f 52 3a 20 20 20 63 20 3d 20 61 20 7c 7c P_OR: c = a ||
4230: 20 62 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 b; brea
4240: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4250: 50 5f 4d 49 4e 3a 20 20 63 20 3d 20 61 3c 62 20 P_MIN: c = a<b
4260: 3f 20 61 20 3a 20 62 3b 20 20 20 20 62 72 65 61 ? a : b; brea
4270: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 42 53 4f k;. case SBSO
4280: 50 5f 4d 41 58 3a 20 20 63 20 3d 20 61 3c 62 20 P_MAX: c = a<b
4290: 3f 20 62 20 3a 20 61 3b 20 20 20 20 62 72 65 61 ? b : a; brea
42a0: 6b 3b 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70 k;. }. SbS_Pop
42b0: 28 70 2c 20 32 29 3b 0a 20 20 53 62 53 5f 50 75 (p, 2);. SbS_Pu
42c0: 73 68 49 6e 74 28 70 2c 20 63 29 3b 0a 20 20 72 shInt(p, c);. r
42d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
42e0: 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d * Subscript comm
42f0: 61 6e 64 3a 20 20 20 20 20 20 53 54 52 49 4e 47 and: STRING
4300: 20 53 54 52 49 4e 47 20 73 74 72 65 71 20 49 4e STRING streq IN
4310: 54 45 47 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 TEGER.*/.static
4320: 69 6e 74 20 73 74 72 65 71 43 6d 64 28 73 74 72 int streqCmd(str
4330: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 uct Subscript *p
4340: 2c 20 76 6f 69 64 20 2a 70 4f 70 29 7b 0a 20 20 , void *pOp){.
4350: 69 6e 74 20 63 2c 20 6e 41 2c 20 6e 42 3b 0a 20 int c, nA, nB;.
4360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 41 2c 20 const char *A,
4370: 2a 42 3b 0a 20 20 0a 20 20 69 66 28 20 53 62 53 *B;. . if( SbS
4380: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c _RequireStack(p,
4390: 20 32 2c 20 22 42 49 4e 41 52 59 2d 4f 50 22 29 2, "BINARY-OP")
43a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 41 ) return 1;. A
43b0: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 = SbS_StackValu
43c0: 65 28 70 2c 20 31 2c 20 26 6e 41 29 3b 0a 20 20 e(p, 1, &nA);.
43d0: 42 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c B = SbS_StackVal
43e0: 75 65 28 70 2c 20 30 2c 20 26 6e 42 29 3b 0a 20 ue(p, 0, &nB);.
43f0: 20 63 20 3d 20 6e 41 3d 3d 6e 42 20 26 26 20 6d c = nA==nB && m
4400: 65 6d 63 6d 70 28 41 2c 42 2c 6e 41 29 3d 3d 30 emcmp(A,B,nA)==0
4410: 3b 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 32 ;. SbS_Pop(p, 2
4420: 29 3b 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 );. SbS_PushInt
4430: 28 70 2c 20 63 29 3b 0a 20 20 72 65 74 75 72 6e (p, c);. return
4440: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 0;.}../*.** Sub
4450: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 script command:
4460: 20 20 20 20 53 54 52 49 4e 47 20 68 61 73 63 61 STRING hasca
4470: 70 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 p INTEGER.**.**
4480: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 Return true if t
4490: 68 65 20 75 73 65 72 20 68 61 73 20 61 6c 6c 20 he user has all
44a0: 6f 66 20 74 68 65 20 63 61 70 61 62 69 6c 69 74 of the capabilit
44b0: 69 65 73 20 6c 69 73 74 65 64 2e 0a 2a 2f 0a 73 ies listed..*/.s
44c0: 74 61 74 69 63 20 69 6e 74 20 68 61 73 63 61 70 tatic int hascap
44d0: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63 Cmd(struct Subsc
44e0: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 ript *p, void *p
44f0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 NotUsed){. cons
4500: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 t char *z;. int
4510: 20 6e 2c 20 61 3b 0a 20 20 69 66 28 20 53 62 53 n, a;. if( SbS
4520: 5f 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c _RequireStack(p,
4530: 20 31 2c 20 22 68 61 73 63 61 70 22 29 20 29 20 1, "hascap") )
4540: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 return 1;. z =
4550: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 SbS_StackValue(p
4560: 2c 20 30 2c 20 26 6e 29 3b 0a 20 20 61 20 3d 20 , 0, &n);. a =
4570: 6c 6f 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69 login_has_capabi
4580: 6c 69 74 79 28 7a 2c 20 6e 29 3b 0a 20 20 53 62 lity(z, n);. Sb
4590: 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 S_Pop(p, 1);. S
45a0: 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 61 29 bS_PushInt(p, a)
45b0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a ;. return 0;.}.
45c0: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 ./*.** Subscript
45d0: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 53 54 command: ST
45e0: 52 49 4e 47 20 6c 69 6e 65 63 6f 75 6e 74 20 49 RING linecount I
45f0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 74 NTEGER.**.** Ret
4600: 75 72 6e 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 urn one more tha
4610: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
4620: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 20 69 6e \n characters in
4630: 20 53 54 52 49 4e 47 2e 0a 2a 2f 0a 73 74 61 74 STRING..*/.stat
4640: 69 63 20 69 6e 74 20 6c 69 6e 65 63 6e 74 43 6d ic int linecntCm
4650: 64 28 73 74 72 75 63 74 20 53 75 62 73 63 72 69 d(struct Subscri
4660: 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f pt *p, void *pNo
4670: 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 tUsed){. const
4680: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 73 char *z;. int s
4690: 69 7a 65 2c 20 6e 2c 20 69 3b 0a 20 20 69 66 28 ize, n, i;. if(
46a0: 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 SbS_RequireStac
46b0: 6b 28 70 2c 20 31 2c 20 22 6c 69 6e 65 63 6f 75 k(p, 1, "linecou
46c0: 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b nt") ) return 1;
46d0: 0a 20 20 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b . z = SbS_Stack
46e0: 56 61 6c 75 65 28 70 2c 20 30 2c 20 26 73 69 7a Value(p, 0, &siz
46f0: 65 29 3b 0a 20 20 66 6f 72 28 6e 3d 31 2c 20 69 e);. for(n=1, i
4700: 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 =0; i<size; i++)
4710: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d {. if( z[i]==
4720: 27 5c 6e 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a '\n' ) n++;. }.
4730: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b SbS_Pop(p, 1);
4740: 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70 . SbS_PushInt(p
4750: 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 , n);. return 0
4760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 ;.}../*.** Subsc
4770: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 ript command:
4780: 20 20 53 54 52 49 4e 47 20 6c 65 6e 67 74 68 20 STRING length
4790: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 INTEGER.**.** Re
47a0: 74 75 72 6e 20 6f 6e 65 20 6d 6f 72 65 20 74 68 turn one more th
47b0: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 63 68 an the number ch
47c0: 61 72 61 63 74 65 72 73 20 69 6e 20 53 54 52 49 aracters in STRI
47d0: 4e 47 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e NG..*/.static in
47e0: 74 20 6c 65 6e 67 74 68 43 6d 64 28 73 74 72 75 t lengthCmd(stru
47f0: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c ct Subscript *p,
4800: 20 76 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 void *pNotUsed)
4810: 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 {. int size;.
4820: 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 if( SbS_RequireS
4830: 74 61 63 6b 28 70 2c 20 31 2c 20 22 6c 65 6e 67 tack(p, 1, "leng
4840: 74 68 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b th") ) return 1;
4850: 0a 20 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 . SbS_StackValu
4860: 65 28 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b 0a e(p, 0, &size);.
4870: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b SbS_Pop(p, 1);
4880: 0a 20 20 53 62 53 5f 50 75 73 68 49 6e 74 28 70 . SbS_PushInt(p
4890: 2c 20 73 69 7a 65 29 3b 0a 20 20 72 65 74 75 72 , size);. retur
48a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 n 0;.}../*.** Su
48b0: 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a bscript command:
48c0: 20 20 20 20 20 4e 41 4d 45 20 65 78 69 73 74 73 NAME exists
48d0: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 INTEGER.**.** R
48e0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 eturn TRUE if th
48f0: 65 20 76 61 72 69 61 62 6c 65 20 4e 41 4d 45 20 e variable NAME
4900: 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 exists..*/.stati
4910: 63 20 69 6e 74 20 65 78 69 73 74 73 43 6d 64 28 c int existsCmd(
4920: 73 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 struct Subscript
4930: 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 55 *p, void *pNotU
4940: 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 sed){. const ch
4950: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 73 69 7a ar *z;. int siz
4960: 65 2c 20 78 3b 0a 20 20 69 66 28 20 53 62 53 5f e, x;. if( SbS_
4970: 52 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20 RequireStack(p,
4980: 31 2c 20 22 65 78 69 73 74 73 22 29 20 29 20 72 1, "exists") ) r
4990: 65 74 75 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 53 eturn 1;. z = S
49a0: 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 2c bS_StackValue(p,
49b0: 20 30 2c 20 26 73 69 7a 65 29 3b 0a 20 20 78 20 0, &size);. x
49c0: 3d 20 73 62 73 5f 66 65 74 63 68 28 26 70 2d 3e = sbs_fetch(&p->
49d0: 73 79 6d 54 61 62 2c 20 28 63 68 61 72 2a 29 7a symTab, (char*)z
49e0: 2c 20 73 69 7a 65 29 21 3d 30 3b 0a 20 20 53 62 , size)!=0;. Sb
49f0: 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 53 S_Pop(p, 1);. S
4a00: 62 53 5f 50 75 73 68 49 6e 74 28 70 2c 20 78 29 bS_PushInt(p, x)
4a10: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a ;. return 0;.}.
4a20: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 ./*.** Subscript
4a30: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 20 command:
4a40: 56 41 4c 55 45 20 4e 41 4d 45 20 67 65 74 20 56 VALUE NAME get V
4a50: 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 50 75 73 68 20 ALUE.**.** Push
4a60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 76 61 72 the value of var
4a70: 69 62 6c 65 20 4e 41 4d 45 20 6f 6e 74 6f 20 74 ible NAME onto t
4a80: 68 65 20 73 74 61 63 6b 20 69 66 20 69 74 20 65 he stack if it e
4a90: 78 69 73 74 73 2e 0a 2a 2a 20 49 66 20 4e 41 4d xists..** If NAM
4aa0: 45 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 E does not exist
4ab0: 2c 20 70 75 74 73 20 56 41 4c 55 45 20 6f 6e 74 , puts VALUE ont
4ac0: 6f 20 74 68 65 20 73 74 61 63 6b 20 69 6e 73 74 o the stack inst
4ad0: 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ead..*/.static i
4ae0: 6e 74 20 67 65 74 43 6d 64 28 53 75 62 73 63 72 nt getCmd(Subscr
4af0: 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 4e ipt *p, void *pN
4b00: 6f 74 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 otUsed){. const
4b10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 char *zName;.
4b20: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 63 6f 6e int nName;. con
4b30: 73 74 20 53 62 53 56 61 6c 75 65 20 2a 70 56 61 st SbSValue *pVa
4b40: 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b l;. int rc = 0;
4b50: 0a 20 20 0a 20 20 69 66 28 20 53 62 53 5f 52 65 . . if( SbS_Re
4b60: 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20 32 2c quireStack(p, 2,
4b70: 20 22 67 65 74 22 29 20 29 20 72 65 74 75 72 6e "get") ) return
4b80: 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e SBS_ERROR;. zN
4b90: 61 6d 65 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 ame = SbS_StackV
4ba0: 61 6c 75 65 28 70 2c 20 30 2c 20 26 6e 4e 61 6d alue(p, 0, &nNam
4bb0: 65 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 62 73 e);. pVal = sbs
4bc0: 5f 66 65 74 63 68 28 26 70 2d 3e 73 79 6d 54 61 _fetch(&p->symTa
4bd0: 62 2c 20 28 63 68 61 72 2a 29 7a 4e 61 6d 65 2c b, (char*)zName,
4be0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 nName);. if( p
4bf0: 56 61 6c 21 3d 30 20 26 26 20 28 70 56 61 6c 2d Val!=0 && (pVal-
4c00: 3e 66 6c 61 67 73 20 26 20 53 42 53 56 41 4c 5f >flags & SBSVAL_
4c10: 53 54 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 STR)!=0 ){. S
4c20: 62 53 5f 50 6f 70 28 70 2c 20 32 29 3b 0a 20 20 bS_Pop(p, 2);.
4c30: 20 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 28 rc = SbS_Push(
4c40: 70 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 7a p, pVal->u.str.z
4c50: 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 69 , pVal->u.str.si
4c60: 7a 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b ze, 0);. }else{
4c70: 0a 20 20 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 . SbS_Pop(p,
4c80: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 1);. }. return
4c90: 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 rc;.}..../*.**
4ca0: 54 72 75 65 20 69 66 20 6f 75 74 70 75 74 20 69 True if output i
4cb0: 73 20 65 6e 61 62 6c 65 64 2e 20 20 46 61 6c 73 s enabled. Fals
4cc0: 65 20 69 66 20 64 69 73 61 62 6c 65 64 2e 0a 2a e if disabled..*
4cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e 61 /.static int ena
4ce0: 62 6c 65 4f 75 74 70 75 74 20 3d 20 31 3b 0a 0a bleOutput = 1;..
4cf0: 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 /*.** Subscript
4d00: 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 42 4f command: BO
4d10: 4f 4c 45 41 4e 20 65 6e 61 62 6c 65 5f 6f 75 74 OLEAN enable_out
4d20: 70 75 74 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 put.**.** Enable
4d30: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 or disable the
4d40: 70 75 74 73 20 61 6e 64 20 68 70 75 74 73 20 63 puts and hputs c
4d50: 6f 6d 6d 61 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 ommands..*/.stat
4d60: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 4f 75 74 ic int enableOut
4d70: 70 75 74 43 6d 64 28 73 74 72 75 63 74 20 53 75 putCmd(struct Su
4d80: 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 bscript *p, void
4d90: 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 *pNotUsed){. i
4da0: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 f( SbS_RequireSt
4db0: 61 63 6b 28 70 2c 20 31 2c 20 22 65 6e 61 62 6c ack(p, 1, "enabl
4dc0: 65 5f 6f 75 74 70 75 74 22 29 20 29 20 72 65 74 e_output") ) ret
4dd0: 75 72 6e 20 31 3b 0a 20 20 65 6e 61 62 6c 65 4f urn 1;. enableO
4de0: 75 74 70 75 74 20 3d 20 53 62 53 5f 53 74 61 63 utput = SbS_Stac
4df0: 6b 56 61 6c 75 65 49 6e 74 28 70 2c 20 30 29 21 kValueInt(p, 0)!
4e00: 3d 30 3b 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c =0;. SbS_Pop(p,
4e10: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 1);. return 0;
4e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 74 .}../*.** Send t
4e30: 65 78 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f ext to the appro
4e40: 70 72 69 61 74 65 20 6f 75 74 70 75 74 3a 20 20 priate output:
4e50: 45 69 74 68 65 72 20 74 6f 20 74 68 65 20 63 6f Either to the co
4e60: 6e 73 6f 6c 65 0a 2a 2a 20 6f 72 20 74 6f 20 74 nsole.** or to t
4e70: 68 65 20 43 47 49 20 72 65 70 6c 79 20 62 75 66 he CGI reply buf
4e80: 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 fer..*/.static v
4e90: 6f 69 64 20 73 65 6e 64 54 65 78 74 28 63 6f 6e oid sendText(con
4ea0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 st char *z, int
4eb0: 6e 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 n){. if( enable
4ec0: 4f 75 74 70 75 74 20 26 26 20 6e 20 29 7b 0a 20 Output && n ){.
4ed0: 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d if( n<0 ) n =
4ee0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 strlen(z);.
4ef0: 69 66 28 20 67 2e 63 67 69 50 61 6e 69 63 20 29 if( g.cgiPanic )
4f00: 7b 0a 20 20 20 20 20 20 63 67 69 5f 61 70 70 65 {. cgi_appe
4f10: 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a 2c 20 6e 29 nd_content(z, n)
4f20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
4f30: 20 20 20 66 77 72 69 74 65 28 7a 2c 20 31 2c 20 fwrite(z, 1,
4f40: 6e 2c 20 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 n, stdout);.
4f50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 }. }.}../*.** S
4f60: 75 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 ubscript command
4f70: 3a 20 20 20 20 20 20 53 54 52 49 4e 47 20 70 75 : STRING pu
4f80: 74 73 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 20 ts.** Subscript
4f90: 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 20 53 54 command: ST
4fa0: 52 49 4e 47 20 68 74 6d 6c 0a 2a 2a 0a 2a 2a 20 RING html.**.**
4fb0: 4f 75 74 70 75 74 20 53 54 52 49 4e 47 20 61 73 Output STRING as
4fc0: 20 48 54 4d 4c 20 28 68 74 6d 6c 29 20 6f 72 20 HTML (html) or
4fd0: 75 6e 63 68 61 6e 67 65 64 20 28 70 75 74 73 29 unchanged (puts)
4fe0: 2e 20 20 0a 2a 2a 20 50 6f 70 20 69 74 20 66 72 . .** Pop it fr
4ff0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f om the stack..*/
5000: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 74 73 .static int puts
5010: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63 Cmd(struct Subsc
5020: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 ript *p, void *p
5030: 43 6f 6e 76 65 72 74 29 7b 0a 20 20 69 6e 74 20 Convert){. int
5040: 73 69 7a 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 size;. const ch
5050: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a ar *z;. char *z
5060: 4f 75 74 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 Out;. if( SbS_R
5070: 65 71 75 69 72 65 53 74 61 63 6b 28 70 2c 20 31 equireStack(p, 1
5080: 2c 20 22 70 75 74 73 22 29 20 29 20 72 65 74 75 , "puts") ) retu
5090: 72 6e 20 31 3b 0a 20 20 69 66 28 20 65 6e 61 62 rn 1;. if( enab
50a0: 6c 65 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 leOutput ){.
50b0: 7a 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c z = SbS_StackVal
50c0: 75 65 28 70 2c 20 30 2c 20 26 73 69 7a 65 29 3b ue(p, 0, &size);
50d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 76 65 72 . if( pConver
50e0: 74 20 29 7b 20 20 20 20 0a 20 20 20 20 20 20 7a t ){ . z
50f0: 4f 75 74 20 3d 20 68 74 6d 6c 69 7a 65 28 7a 2c Out = htmlize(z,
5100: 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 73 69 size);. si
5110: 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4f 75 74 ze = strlen(zOut
5120: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
5130: 20 20 20 20 7a 4f 75 74 20 3d 20 28 63 68 61 72 zOut = (char
5140: 2a 29 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 *)z;. }. s
5150: 65 6e 64 54 65 78 74 28 7a 4f 75 74 2c 20 73 69 endText(zOut, si
5160: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f ze);. if( pCo
5170: 6e 76 65 72 74 20 29 7b 0a 20 20 20 20 20 20 66 nvert ){. f
5180: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d ree(zOut);. }
5190: 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70 . }. SbS_Pop(p
51a0: 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 , 1);. return 0
51b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 ;.}../*.** Subsc
51c0: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 ript command:
51d0: 20 20 20 53 54 52 49 4e 47 20 77 69 6b 69 0a 2a STRING wiki.*
51e0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 74 68 65 20 *.** Render the
51f0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 61 73 20 input string as
5200: 77 69 6b 69 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 wiki..*/.static
5210: 69 6e 74 20 77 69 6b 69 43 6d 64 28 73 74 72 75 int wikiCmd(stru
5220: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c ct Subscript *p,
5230: 20 76 6f 69 64 20 2a 70 43 6f 6e 76 65 72 74 29 void *pConvert)
5240: 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 {. int size;.
5250: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 const char *z;.
5260: 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 if( SbS_Require
5270: 53 74 61 63 6b 28 70 2c 20 31 2c 20 22 77 69 6b Stack(p, 1, "wik
5280: 69 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a i") ) return 1;.
5290: 20 20 69 66 28 20 65 6e 61 62 6c 65 4f 75 74 70 if( enableOutp
52a0: 75 74 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 73 ut ){. Blob s
52b0: 72 63 3b 0a 20 20 20 20 7a 20 3d 20 53 62 53 5f rc;. z = SbS_
52c0: 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c StackValue(p, 0,
52d0: 20 26 73 69 7a 65 29 3b 0a 20 20 20 20 62 6c 6f &size);. blo
52e0: 62 5f 69 6e 69 74 28 26 73 72 63 2c 20 7a 2c 20 b_init(&src, z,
52f0: 73 69 7a 65 29 3b 0a 20 20 20 20 77 69 6b 69 5f size);. wiki_
5300: 63 6f 6e 76 65 72 74 28 26 73 72 63 2c 20 30 2c convert(&src, 0,
5310: 20 57 49 4b 49 5f 49 4e 4c 49 4e 45 29 3b 0a 20 WIKI_INLINE);.
5320: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 blob_reset(&s
5330: 72 63 29 3b 0a 20 20 7d 0a 20 20 53 62 53 5f 50 rc);. }. SbS_P
5340: 6f 70 28 70 2c 20 31 29 3b 0a 20 20 72 65 74 75 op(p, 1);. retu
5350: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 rn 0;.}../*.** S
5360: 75 62 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 ubscript command
5370: 3a 20 20 20 4e 41 4d 45 20 54 45 58 54 2d 4c 49 : NAME TEXT-LI
5380: 53 54 20 4e 55 4d 4c 49 4e 45 53 20 63 6f 6d 62 ST NUMLINES comb
5390: 6f 62 6f 78 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 obox.**.** Gener
53a0: 61 74 65 20 61 6e 20 48 54 4d 4c 20 63 6f 6d 62 ate an HTML comb
53b0: 6f 62 6f 78 2e 20 20 4e 41 4d 45 20 69 73 20 62 obox. NAME is b
53c0: 6f 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 oth the name of
53d0: 74 68 65 0a 2a 2a 20 43 47 49 20 70 61 72 61 6d the.** CGI param
53e0: 65 74 65 72 20 61 6e 64 20 74 68 65 20 6e 61 6d eter and the nam
53f0: 65 20 6f 66 20 61 20 76 61 72 69 61 62 6c 65 20 e of a variable
5400: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 that contains th
5410: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 73 e.** currently s
5420: 65 6c 65 63 74 65 64 20 76 61 6c 75 65 2e 20 20 elected value.
5430: 54 45 58 54 2d 4c 49 53 54 20 69 73 20 61 20 6c TEXT-LIST is a l
5440: 69 73 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 0a ist of possible.
5450: 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 ** values for th
5460: 65 20 63 6f 6d 62 6f 62 6f 78 2e 20 20 4e 55 4d e combobox. NUM
5470: 4c 49 4e 45 53 20 69 73 20 31 20 66 6f 72 20 61 LINES is 1 for a
5480: 20 74 72 75 65 20 63 6f 6d 62 6f 62 6f 78 2e 0a true combobox..
5490: 2a 2a 20 49 66 20 4e 55 4d 4c 49 4e 45 53 20 69 ** If NUMLINES i
54a0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f s greater than o
54b0: 6e 65 20 74 68 65 6e 20 74 68 65 20 64 69 73 70 ne then the disp
54c0: 6c 61 79 20 69 73 20 61 20 6c 69 73 74 62 6f 78 lay is a listbox
54d0: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 75 6d .** with the num
54e0: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 67 69 76 ber of lines giv
54f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e en..*/.static in
5500: 74 20 63 6f 6d 62 6f 62 6f 78 43 6d 64 28 73 74 t comboboxCmd(st
5510: 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a ruct Subscript *
5520: 70 2c 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 p, void *NotUsed
5530: 29 7b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 71 ){. if( SbS_Req
5540: 75 69 72 65 53 74 61 63 6b 28 70 2c 20 33 2c 20 uireStack(p, 3,
5550: 22 63 6f 6d 62 6f 62 6f 78 22 29 20 29 20 72 65 "combobox") ) re
5560: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 65 6e turn 1;. if( en
5570: 61 62 6c 65 4f 75 74 70 75 74 20 29 7b 0a 20 20 ableOutput ){.
5580: 20 20 69 6e 74 20 68 65 69 67 68 74 3b 0a 20 20 int height;.
5590: 20 20 42 6c 6f 62 20 6c 69 73 74 2c 20 65 6c 65 Blob list, ele
55a0: 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 m;. char *zNa
55b0: 6d 65 2c 20 2a 7a 4c 69 73 74 3b 0a 20 20 20 20 me, *zList;.
55c0: 69 6e 74 20 6e 4e 61 6d 65 2c 20 6e 4c 69 73 74 int nName, nList
55d0: 2c 20 6e 56 61 6c 75 65 3b 0a 20 20 20 20 63 6f , nValue;. co
55e0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 nst char *zValue
55f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 2c 20 2a ;. char *z, *
5600: 7a 48 3b 0a 0a 20 20 20 20 68 65 69 67 68 74 20 zH;.. height
5610: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 = SbS_StackValue
5620: 49 6e 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a Int(p, 0);. z
5630: 4c 69 73 74 20 3d 20 28 63 68 61 72 2a 29 53 62 List = (char*)Sb
5640: 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 S_StackValue(p,
5650: 31 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 1, &nList);.
5660: 62 6c 6f 62 5f 69 6e 69 74 28 26 6c 69 73 74 2c blob_init(&list,
5670: 20 7a 4c 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a zList, nList);.
5680: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 28 63 68 61 zName = (cha
5690: 72 2a 29 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 r*)SbS_StackValu
56a0: 65 28 70 2c 20 32 2c 20 26 6e 4e 61 6d 65 29 3b e(p, 2, &nName);
56b0: 0a 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 53 62 . zValue = Sb
56c0: 53 5f 46 65 74 63 68 28 70 2c 20 7a 4e 61 6d 65 S_Fetch(p, zName
56d0: 2c 20 6e 4e 61 6d 65 2c 20 26 6e 56 61 6c 75 65 , nName, &nValue
56e0: 29 3b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e );. z = mprin
56f0: 74 66 28 22 3c 73 65 6c 65 63 74 20 6e 61 6d 65 tf("<select name
5700: 3d 5c 22 25 7a 5c 22 20 73 69 7a 65 3d 5c 22 25 =\"%z\" size=\"%
5710: 64 5c 22 3e 22 2c 20 0a 20 20 20 20 20 20 20 20 d\">", .
5720: 20 20 20 20 20 20 20 20 20 68 74 6d 6c 69 7a 65 htmlize
5730: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 2c 20 (zName, nName),
5740: 68 65 69 67 68 74 29 3b 0a 20 20 20 20 73 65 6e height);. sen
5750: 64 54 65 78 74 28 7a 2c 20 2d 31 29 3b 0a 20 20 dText(z, -1);.
5760: 20 20 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 77 free(z);. w
5770: 68 69 6c 65 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e hile( blob_token
5780: 28 26 6c 69 73 74 2c 20 26 65 6c 65 6d 29 20 29 (&list, &elem) )
5790: 7b 0a 20 20 20 20 20 20 7a 48 20 3d 20 68 74 6d {. zH = htm
57a0: 6c 69 7a 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 lize(blob_buffer
57b0: 28 26 65 6c 65 6d 29 2c 20 62 6c 6f 62 5f 73 69 (&elem), blob_si
57c0: 7a 65 28 26 65 6c 65 6d 29 29 3b 0a 20 20 20 20 ze(&elem));.
57d0: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 if( zValue &&
57e0: 62 6c 6f 62 5f 73 69 7a 65 28 26 65 6c 65 6d 29 blob_size(&elem)
57f0: 3d 3d 6e 56 61 6c 75 65 20 0a 20 20 20 20 20 20 ==nValue .
5800: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 && memcmp
5810: 28 7a 56 61 6c 75 65 2c 20 62 6c 6f 62 5f 62 75 (zValue, blob_bu
5820: 66 66 65 72 28 26 65 6c 65 6d 29 2c 20 6e 56 61 ffer(&elem), nVa
5830: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 lue)==0 ){.
5840: 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 z = mprintf("
5850: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22 <option value=\"
5860: 25 73 5c 22 20 73 65 6c 65 63 74 65 64 3e 25 73 %s\" selected>%s
5870: 3c 2f 6f 70 74 69 6f 6e 3e 22 2c 20 7a 48 2c 20 </option>", zH,
5880: 7a 48 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 zH);. }else
5890: 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 6d 70 {. z = mp
58a0: 72 69 6e 74 66 28 22 3c 6f 70 74 69 6f 6e 20 76 rintf("<option v
58b0: 61 6c 75 65 3d 5c 22 25 73 5c 22 3e 25 73 3c 2f alue=\"%s\">%s</
58c0: 6f 70 74 69 6f 6e 3e 22 2c 20 7a 48 2c 20 7a 48 option>", zH, zH
58d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
58e0: 20 66 72 65 65 28 7a 48 29 3b 0a 20 20 20 20 20 free(zH);.
58f0: 20 73 65 6e 64 54 65 78 74 28 7a 2c 20 2d 31 29 sendText(z, -1)
5900: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 29 3b ;. free(z);
5910: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6e 64 54 . }. sendT
5920: 65 78 74 28 22 3c 2f 73 65 6c 65 63 74 3e 22 2c ext("</select>",
5930: 20 2d 31 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 -1);. blob_r
5940: 65 73 65 74 28 26 6c 69 73 74 29 3b 0a 20 20 7d eset(&list);. }
5950: 0a 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 33 29 . SbS_Pop(p, 3)
5960: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a ;. return 0;.}.
5970: 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 69 70 74 ./*.** Subscript
5980: 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 20 20 53 54 command: ST
5990: 52 49 4e 47 20 42 4f 4f 4c 45 41 4e 20 69 66 0a RING BOOLEAN if.
59a0: 2a 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 53 **.** Evaluate S
59b0: 54 52 49 4e 47 20 61 73 20 61 20 73 63 72 69 70 TRING as a scrip
59c0: 74 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 t if BOOLEAN is
59d0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 true..*/.static
59e0: 69 6e 74 20 69 66 43 6d 64 28 73 74 72 75 63 74 int ifCmd(struct
59f0: 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 Subscript *p, v
5a00: 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a oid *pNotUsed){.
5a10: 20 20 69 6e 74 20 63 6f 6e 64 3b 0a 20 20 69 6e int cond;. in
5a20: 74 20 72 63 20 3d 20 53 42 53 5f 4f 4b 3b 0a 0a t rc = SBS_OK;..
5a30: 20 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 if( SbS_Requir
5a40: 65 53 74 61 63 6b 28 70 2c 20 32 2c 20 22 69 66 eStack(p, 2, "if
5a50: 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 ") ) return 1;.
5a60: 20 63 6f 6e 64 20 3d 20 53 62 53 5f 53 74 61 63 cond = SbS_Stac
5a70: 6b 56 61 6c 75 65 49 6e 74 28 70 2c 20 30 29 3b kValueInt(p, 0);
5a80: 0a 20 20 69 66 28 20 63 6f 6e 64 20 29 7b 0a 20 . if( cond ){.
5a90: 20 20 20 53 62 53 56 61 6c 75 65 20 73 63 72 69 SbSValue scri
5aa0: 70 74 20 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 70 pt = p->aStack[p
5ab0: 2d 3e 6e 53 74 61 63 6b 2d 32 5d 3b 0a 20 20 20 ->nStack-2];.
5ac0: 20 70 2d 3e 61 53 74 61 63 6b 5b 70 2d 3e 6e 53 p->aStack[p->nS
5ad0: 74 61 63 6b 2d 32 5d 2e 66 6c 61 67 73 20 3d 20 tack-2].flags =
5ae0: 30 3b 0a 20 20 20 20 53 62 53 5f 50 6f 70 28 70 0;. SbS_Pop(p
5af0: 2c 20 32 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 , 2);. rc = S
5b00: 62 53 5f 45 76 61 6c 28 70 2c 20 73 63 72 69 70 bS_Eval(p, scrip
5b10: 74 2e 75 2e 73 74 72 2e 7a 2c 20 73 63 72 69 70 t.u.str.z, scrip
5b20: 74 2e 75 2e 73 74 72 2e 73 69 7a 65 29 3b 0a 20 t.u.str.size);.
5b30: 20 20 20 73 62 73 5f 76 61 6c 75 65 5f 72 65 73 sbs_value_res
5b40: 65 74 28 26 73 63 72 69 70 74 29 3b 0a 20 20 7d et(&script);. }
5b50: 65 6c 73 65 7b 0a 20 20 20 20 53 62 53 5f 50 6f else{. SbS_Po
5b60: 70 28 70 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 72 p(p, 2);. }. r
5b70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
5b80: 2a 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d ** Subscript com
5b90: 6d 61 6e 64 3a 20 20 20 20 20 2e 2e 2e 20 53 54 mand: ... ST
5ba0: 52 49 4e 47 20 43 4f 55 4e 54 20 63 6f 6e 63 61 RING COUNT conca
5bb0: 74 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 t STRING.**.** C
5bc0: 6f 6e 63 61 74 65 6e 61 74 65 20 43 4f 55 4e 54 oncatenate COUNT
5bd0: 20 73 74 72 69 6e 67 73 20 69 6e 74 6f 20 61 20 strings into a
5be0: 73 69 6e 67 6c 65 20 73 74 72 69 6e 67 20 61 6e single string an
5bf0: 64 20 6c 65 61 76 65 0a 2a 2a 20 74 68 65 20 63 d leave.** the c
5c00: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 6e 20 oncatenation on
5c10: 74 68 65 20 73 74 61 63 6b 2e 20 0a 2a 2f 0a 73 the stack. .*/.s
5c20: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 63 61 74 tatic int concat
5c30: 43 6d 64 28 73 74 72 75 63 74 20 53 75 62 73 63 Cmd(struct Subsc
5c40: 72 69 70 74 20 2a 70 2c 20 76 6f 69 64 20 2a 70 ript *p, void *p
5c50: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20 NotUsed){. int
5c60: 63 6f 75 6e 74 3b 0a 20 20 69 6e 74 20 6e 42 79 count;. int nBy
5c70: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 te;. char *z;.
5c80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66 int i, j;.. if
5c90: 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 ( SbS_RequireSta
5ca0: 63 6b 28 70 2c 20 31 2c 20 22 63 6f 6e 63 61 74 ck(p, 1, "concat
5cb0: 22 29 20 29 20 72 65 74 75 72 6e 20 53 42 53 5f ") ) return SBS_
5cc0: 45 52 52 4f 52 3b 0a 20 20 63 6f 75 6e 74 20 3d ERROR;. count =
5cd0: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 49 SbS_StackValueI
5ce0: 6e 74 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 nt(p, 0);. if(
5cf0: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b SbS_RequireStack
5d00: 28 70 2c 20 63 6f 75 6e 74 2b 31 2c 20 22 63 6f (p, count+1, "co
5d10: 6e 63 61 74 22 29 20 29 20 72 65 74 75 72 6e 20 ncat") ) return
5d20: 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 53 62 53 SBS_ERROR;. SbS
5d30: 5f 50 6f 70 28 70 2c 20 31 29 3b 0a 20 20 6e 42 _Pop(p, 1);. nB
5d40: 79 74 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 yte = 1;. for(i
5d50: 3d 70 2d 3e 6e 53 74 61 63 6b 2d 63 6f 75 6e 74 =p->nStack-count
5d60: 3b 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69 ; i<p->nStack; i
5d70: 2b 2b 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b ++){. nByte +
5d80: 3d 20 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 75 = p->aStack[i].u
5d90: 2e 73 74 72 2e 73 69 7a 65 3b 0a 20 20 7d 0a 20 .str.size;. }.
5da0: 20 7a 20 3d 20 6d 61 6c 6c 6f 63 28 6e 42 79 74 z = malloc(nByt
5db0: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 e);. if( z==0 )
5dc0: 7b 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 { fossil_panic("
5dd0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b out of memory");
5de0: 20 7d 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 69 3d }. for(j=0, i=
5df0: 70 2d 3e 6e 53 74 61 63 6b 2d 63 6f 75 6e 74 3b p->nStack-count;
5e00: 20 69 3c 70 2d 3e 6e 53 74 61 63 6b 3b 20 69 2b i<p->nStack; i+
5e10: 2b 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 +){. nByte =
5e20: 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 2e 75 2e 73 p->aStack[i].u.s
5e30: 74 72 2e 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d tr.size;. mem
5e40: 63 70 79 28 26 7a 5b 6a 5d 2c 20 70 2d 3e 61 53 cpy(&z[j], p->aS
5e50: 74 61 63 6b 5b 69 5d 2e 75 2e 73 74 72 2e 7a 2c tack[i].u.str.z,
5e60: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 6a 20 2b nByte);. j +
5e70: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 7a = nByte;. }. z
5e80: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 53 62 53 5f 50 [j] = 0;. SbS_P
5e90: 6f 70 28 70 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 op(p, count);.
5ea0: 53 62 53 5f 50 75 73 68 28 70 2c 20 7a 2c 20 6a SbS_Push(p, z, j
5eb0: 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 , 1);. return S
5ec0: 42 53 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a BS_OK;.}.../*.**
5ed0: 20 41 20 74 61 62 6c 65 20 6f 66 20 62 75 69 6c A table of buil
5ee0: 74 2d 69 6e 20 63 6f 6d 6d 61 6e 64 73 0a 2a 2f t-in commands.*/
5ef0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 .static const st
5f00: 72 75 63 74 20 7b 0a 20 20 63 6f 6e 73 74 20 63 ruct {. const c
5f10: 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 6e 74 har *zCmd;. int
5f20: 20 28 2a 78 43 6d 64 29 28 53 75 62 73 63 72 69 (*xCmd)(Subscri
5f30: 70 74 2a 2c 76 6f 69 64 2a 29 3b 0a 20 20 76 6f pt*,void*);. vo
5f40: 69 64 20 2a 70 41 72 67 3b 0a 7d 20 61 42 75 69 id *pArg;.} aBui
5f50: 6c 74 69 6e 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 ltin[] = {. { "
5f60: 61 64 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 add",
5f70: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 bopCmd,
5f80: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 (void*)S
5f90: 42 53 4f 50 5f 41 4e 44 20 20 20 20 7d 2c 0a 20 BSOP_AND },.
5fa0: 20 7b 20 22 61 6e 64 22 2c 20 20 20 20 20 20 20 { "and",
5fb0: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20 bopCmd,
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 (voi
5fd0: 64 2a 29 53 42 53 4f 50 5f 41 4e 44 20 20 20 20 d*)SBSOP_AND
5fe0: 7d 2c 0a 20 20 7b 20 22 63 6f 6d 62 6f 62 6f 78 },. { "combobox
5ff0: 22 2c 20 20 20 20 20 20 20 20 63 6f 6d 62 6f 62 ", combob
6000: 6f 78 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 oxCmd,
6010: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
6020: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6e 63 },. { "conc
6030: 61 74 22 2c 20 20 20 20 20 20 20 20 20 20 63 6f at", co
6040: 6e 63 61 74 43 6d 64 2c 20 20 20 20 20 20 20 20 ncatCmd,
6050: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
6060: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 },. { "
6070: 64 69 76 22 2c 20 20 20 20 20 20 20 20 20 20 20 div",
6080: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 bopCmd,
6090: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 (void*)S
60a0: 42 53 4f 50 5f 44 49 56 20 20 20 20 7d 2c 0a 20 BSOP_DIV },.
60b0: 20 7b 20 22 65 6e 61 62 6c 65 5f 6f 75 74 70 75 { "enable_outpu
60c0: 74 22 2c 20 20 20 65 6e 61 62 6c 65 4f 75 74 70 t", enableOutp
60d0: 75 74 43 6d 64 2c 20 20 20 20 20 20 30 20 20 20 utCmd, 0
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
60f0: 7d 2c 0a 20 20 7b 20 22 65 71 22 2c 20 20 20 20 },. { "eq",
6100: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64 bopCmd
6110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
6120: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 45 51 20 (void*)SBSOP_EQ
6130: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 65 78 69 73 },. { "exis
6140: 74 73 22 2c 20 20 20 20 20 20 20 20 20 20 65 78 ts", ex
6150: 69 73 74 73 43 6d 64 2c 20 20 20 20 20 20 20 20 istsCmd,
6160: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
6170: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 },. { "
6180: 67 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 get",
6190: 20 20 67 65 74 43 6d 64 2c 20 20 20 20 20 20 20 getCmd,
61a0: 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 0,
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 },.
61c0: 20 7b 20 22 68 61 73 63 61 70 22 2c 20 20 20 20 { "hascap",
61d0: 20 20 20 20 20 20 68 61 73 63 61 70 43 6d 64 2c hascapCmd,
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 0
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6200: 7d 2c 0a 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20 },. { "html",
6210: 20 20 20 20 20 20 20 20 20 20 70 75 74 73 43 6d putsCm
6220: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d,
6230: 28 76 6f 69 64 2a 29 31 20 20 20 20 20 20 20 20 (void*)1
6240: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 69 66 22 2c },. { "if",
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 if
6260: 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 Cmd,
6270: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 0,
6280: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 },. { "
6290: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 le",
62a0: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 bopCmd,
62b0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 (void*)S
62c0: 42 53 4f 50 5f 4c 45 20 20 20 20 20 7d 2c 0a 20 BSOP_LE },.
62d0: 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 { "length",
62e0: 20 20 20 20 20 20 6c 65 6e 67 74 68 43 6d 64 2c lengthCmd,
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 0
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6310: 7d 2c 0a 20 20 7b 20 22 6c 69 6e 65 63 6f 75 6e },. { "linecoun
6320: 74 22 2c 20 20 20 20 20 20 20 6c 69 6e 65 63 6e t", linecn
6330: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 tCmd,
6340: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0
6350: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6c 74 22 2c },. { "lt",
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f bo
6370: 70 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 pCmd,
6380: 20 20 20 20 28 76 6f 69 64 2a 29 53 42 53 4f 50 (void*)SBSOP
6390: 5f 4c 54 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 _LT },. { "
63a0: 6d 61 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 max",
63b0: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 bopCmd,
63c0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 (void*)S
63d0: 42 53 4f 50 5f 4d 41 58 20 20 20 20 7d 2c 0a 20 BSOP_MAX },.
63e0: 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 { "min",
63f0: 20 20 20 20 20 20 62 6f 70 43 6d 64 2c 20 20 20 bopCmd,
6400: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 (voi
6410: 64 2a 29 53 42 53 4f 50 5f 4d 49 4e 20 20 20 20 d*)SBSOP_MIN
6420: 7d 2c 0a 20 20 7b 20 22 6d 75 6c 22 2c 20 20 20 },. { "mul",
6430: 20 20 20 20 20 20 20 20 20 20 62 6f 70 43 6d 64 bopCmd
6440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
6450: 28 76 6f 69 64 2a 29 53 42 53 4f 50 5f 4d 55 4c (void*)SBSOP_MUL
6460: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6e 6f 74 22 },. { "not"
6470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f , no
6480: 74 43 6d 64 2c 20 20 20 20 20 20 20 20 20 20 20 tCmd,
6490: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 0
64a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 },. { "
64b0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 or",
64c0: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 bopCmd,
64d0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 (void*)S
64e0: 42 53 4f 50 5f 4f 52 20 20 20 20 20 7d 2c 0a 20 BSOP_OR },.
64f0: 20 7b 20 22 70 75 74 73 22 2c 20 20 20 20 20 20 { "puts",
6500: 20 20 20 20 20 20 70 75 74 73 43 6d 64 2c 20 20 putsCmd,
6510: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 0
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6530: 7d 2c 0a 20 20 7b 20 22 73 65 74 22 2c 20 20 20 },. { "set",
6540: 20 20 20 20 20 20 20 20 20 20 73 65 74 43 6d 64 setCmd
6550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
6560: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0
6570: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 74 72 65 },. { "stre
6580: 71 22 2c 20 20 20 20 20 20 20 20 20 20 20 73 74 q", st
6590: 72 65 71 43 6d 64 2c 20 20 20 20 20 20 20 20 20 reqCmd,
65a0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 0
65b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 },. { "
65c0: 73 75 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 sub",
65d0: 20 20 62 6f 70 43 6d 64 2c 20 20 20 20 20 20 20 bopCmd,
65e0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 53 (void*)S
65f0: 42 53 4f 50 5f 53 55 42 20 20 20 20 7d 2c 0a 20 BSOP_SUB },.
6600: 20 7b 20 22 77 69 6b 69 22 2c 20 20 20 20 20 20 { "wiki",
6610: 20 20 20 20 20 20 77 69 6b 69 43 6d 64 2c 20 20 wikiCmd,
6620: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 20 0,
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6640: 7d 2c 0a 7d 3b 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 },.};. ../*.**
6650: 43 6f 6d 70 61 72 65 20 61 20 7a 65 72 6f 2d 74 Compare a zero-t
6660: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 erminated string
6670: 20 7a 50 61 74 74 65 72 6e 20 61 67 61 69 6e 73 zPattern agains
6680: 74 0a 2a 2a 20 61 6e 20 75 6e 74 65 72 6d 69 6e t.** an untermin
6690: 61 74 65 64 20 73 74 72 69 6e 67 20 7a 53 74 72 ated string zStr
66a0: 20 6f 66 20 6c 65 6e 67 74 68 20 6e 53 74 72 2e of length nStr.
66b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6c 65 .**.** Return le
66c0: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 ss than, equal t
66d0: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 o, or greater th
66e0: 61 6e 20 7a 65 72 6f 20 69 66 0a 2a 2a 20 7a 50 an zero if.** zP
66f0: 61 74 74 65 72 6e 20 69 73 20 6c 65 73 73 20 74 attern is less t
6700: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f han, equal to, o
6710: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a r greater than z
6720: 53 74 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 Str..*/.static i
6730: 6e 74 20 63 6f 6d 70 61 72 65 5f 63 6d 64 28 63 nt compare_cmd(c
6740: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 onst char *zPatt
6750: 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ern, const char
6760: 2a 7a 53 74 72 2c 20 69 6e 74 20 6e 53 74 72 29 *zStr, int nStr)
6770: 7b 0a 20 20 69 6e 74 20 63 20 3d 20 73 74 72 6e {. int c = strn
6780: 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 20 7a 53 cmp(zPattern, zS
6790: 74 72 2c 20 6e 53 74 72 29 3b 0a 20 20 69 66 28 tr, nStr);. if(
67a0: 20 63 3d 3d 30 20 26 26 20 7a 50 61 74 74 65 72 c==0 && zPatter
67b0: 6e 5b 6e 53 74 72 5d 21 3d 30 20 29 7b 0a 20 20 n[nStr]!=0 ){.
67c0: 20 20 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 c = 1;. }. r
67d0: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn c;.}../*.*
67e0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 * Evaluate the s
67f0: 63 72 69 70 74 20 67 69 76 65 6e 20 62 79 20 74 cript given by t
6800: 68 65 20 66 69 72 73 74 20 6e 53 63 72 69 70 74 he first nScript
6810: 20 62 79 74 65 73 20 6f 66 20 7a 53 63 72 69 70 bytes of zScrip
6820: 74 5b 5d 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 t[]..** Return 0
6830: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 on success and
6840: 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 non-zero for an
6850: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 53 62 error..*/.int Sb
6860: 53 5f 45 76 61 6c 28 73 74 72 75 63 74 20 53 75 S_Eval(struct Su
6870: 62 73 63 72 69 70 74 20 2a 70 2c 20 63 6f 6e 73 bscript *p, cons
6880: 74 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 2c t char *zScript,
6890: 20 69 6e 74 20 6e 53 63 72 69 70 74 29 7b 0a 20 int nScript){.
68a0: 20 69 6e 74 20 72 63 20 3d 20 53 42 53 5f 4f 4b int rc = SBS_OK
68b0: 3b 0a 20 20 69 66 28 20 6e 53 63 72 69 70 74 3c ;. if( nScript<
68c0: 30 20 29 20 6e 53 63 72 69 70 74 20 3d 20 73 74 0 ) nScript = st
68d0: 72 6c 65 6e 28 7a 53 63 72 69 70 74 29 3b 0a 20 rlen(zScript);.
68e0: 20 77 68 69 6c 65 28 20 6e 53 63 72 69 70 74 3e while( nScript>
68f0: 30 20 26 26 20 72 63 3d 3d 53 42 53 5f 4f 4b 20 0 && rc==SBS_OK
6900: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 ){. int n;.
6910: 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 int ttype;.
6920: 20 6e 20 3d 20 73 62 73 5f 6e 65 78 74 5f 74 6f n = sbs_next_to
6930: 6b 65 6e 28 7a 53 63 72 69 70 74 2c 20 6e 53 63 ken(zScript, nSc
6940: 72 69 70 74 2c 20 26 74 74 79 70 65 29 3b 0a 0a ript, &ttype);..
6950: 23 69 66 20 30 0a 20 20 20 20 7b 0a 20 20 20 20 #if 0. {.
6960: 20 20 69 6e 74 20 69 2c 20 6e 45 6c 65 6d 3b 0a int i, nElem;.
6970: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 const char
6980: 20 2a 7a 45 6c 65 6d 3b 0a 20 20 20 20 20 20 69 *zElem;. i
6990: 66 28 20 70 2d 3e 6e 53 74 61 63 6b 3e 30 20 29 f( p->nStack>0 )
69a0: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 {. printf
69b0: 28 22 53 54 41 43 4b 3a 22 29 3b 0a 20 20 20 20 ("STACK:");.
69c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 for(i=0; i<p
69d0: 2d 3e 6e 53 74 61 63 6b 3b 20 69 2b 2b 29 7b 0a ->nStack; i++){.
69e0: 20 20 20 20 20 20 20 20 20 20 7a 45 6c 65 6d 20 zElem
69f0: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 = SbS_StackValue
6a00: 28 70 2c 20 69 2c 20 26 6e 45 6c 65 6d 29 3b 0a (p, i, &nElem);.
6a10: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 printf
6a20: 28 22 20 5b 25 2e 2a 73 5d 22 2c 20 6e 45 6c 65 (" [%.*s]", nEle
6a30: 6d 2c 20 7a 45 6c 65 6d 29 3b 0a 20 20 20 20 20 m, zElem);.
6a40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 72 69 }. pri
6a50: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 ntf("\n");.
6a60: 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 }. printf(
6a70: 22 54 4f 4b 45 4e 28 25 64 29 3a 20 5b 25 2e 2a "TOKEN(%d): [%.*
6a80: 73 5d 5c 6e 22 2c 20 74 74 79 70 65 2c 20 6e 2c s]\n", ttype, n,
6a90: 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d zScript);. }
6aa0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 .#endif.. swi
6ab0: 74 63 68 28 20 74 74 79 70 65 20 29 7b 0a 20 20 tch( ttype ){.
6ac0: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 57 case SBSTT_W
6ad0: 48 49 54 45 53 50 41 43 45 3a 20 7b 0a 20 20 20 HITESPACE: {.
6ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
6af0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 }. case S
6b00: 42 53 54 54 5f 45 4f 46 3a 20 7b 0a 20 20 20 20 BSTT_EOF: {.
6b10: 20 20 20 20 6e 53 63 72 69 70 74 20 3d 20 30 3b nScript = 0;
6b20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
6b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 }. ca
6b40: 73 65 20 53 42 53 54 54 5f 49 4e 43 4f 4d 50 4c se SBSTT_INCOMPL
6b50: 45 54 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20 ETE:. case
6b60: 53 42 53 54 54 5f 55 4e 4b 4e 4f 57 4e 3a 20 7b SBSTT_UNKNOWN: {
6b70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 42 . rc = SB
6b80: 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 S_ERROR;.
6b90: 20 6e 53 63 72 69 70 74 20 3d 20 6e 3b 0a 20 20 nScript = n;.
6ba0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
6bb0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 }. case
6bc0: 53 42 53 54 54 5f 49 4e 54 45 47 45 52 3a 20 7b SBSTT_INTEGER: {
6bd0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 62 . rc = Sb
6be0: 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 72 2a S_Push(p, (char*
6bf0: 29 7a 53 63 72 69 70 74 2c 20 6e 2c 20 30 29 3b )zScript, n, 0);
6c00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
6c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 }. ca
6c20: 73 65 20 53 42 53 54 54 5f 4e 41 4d 45 3a 20 7b se SBSTT_NAME: {
6c30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 62 . rc = Sb
6c40: 53 5f 50 75 73 68 28 70 2c 20 28 63 68 61 72 2a S_Push(p, (char*
6c50: 29 26 7a 53 63 72 69 70 74 5b 31 5d 2c 20 6e 2d )&zScript[1], n-
6c60: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 1, 0);. b
6c70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
6c80: 20 20 20 20 63 61 73 65 20 53 42 53 54 54 5f 53 case SBSTT_S
6c90: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 20 TRING: {.
6ca0: 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 28 70 rc = SbS_Push(p
6cb0: 2c 20 28 63 68 61 72 2a 29 26 7a 53 63 72 69 70 , (char*)&zScrip
6cc0: 74 5b 31 5d 2c 20 6e 2d 32 2c 20 30 29 3b 0a 20 t[1], n-2, 0);.
6cd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
6ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
6cf0: 20 53 42 53 54 54 5f 51 55 4f 54 45 44 3a 20 7b SBSTT_QUOTED: {
6d00: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a . char *z
6d10: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 = mprintf("%.*s
6d20: 22 2c 20 6e 2d 32 2c 20 26 7a 53 63 72 69 70 74 ", n-2, &zScript
6d30: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e [1]);. in
6d40: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 20 20 t i, j;.
6d50: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b for(i=j=0; z[i];
6d60: 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 i++, j++){.
6d70: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b int c = z[
6d80: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 i];. if
6d90: 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 ( c=='\\' && z[i
6da0: 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 +1] ){.
6db0: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 c = z[++i];.
6dc0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 if( c
6dd0: 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 =='n' ){.
6de0: 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b c = '\n';
6df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c . }el
6e00: 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 se if( c>='0' &&
6e10: 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 c<='7' ){.
6e20: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a int k;.
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20 c
6e40: 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 -= '0';.
6e50: 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b for(k=1; k
6e60: 3c 33 20 26 26 20 7a 5b 69 2b 6b 5d 3e 3d 27 30 <3 && z[i+k]>='0
6e70: 27 20 26 26 20 7a 5b 69 2b 6b 5d 3c 3d 27 37 27 ' && z[i+k]<='7'
6e80: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; k++){.
6e90: 20 20 20 20 20 20 20 20 63 20 3d 20 63 2a 38 20 c = c*8
6ea0: 2b 20 7a 5b 69 2b 6b 5d 20 2d 20 27 30 27 3b 0a + z[i+k] - '0';.
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a }.
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 20 i
6ed0: 2b 3d 20 6b 2d 31 3b 0a 20 20 20 20 20 20 20 20 += k-1;.
6ee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
6ef0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 5d }. z[j]
6f00: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a = c;. }.
6f10: 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 z[j] = 0
6f20: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 ;. rc = S
6f30: 62 53 5f 50 75 73 68 28 70 2c 20 7a 2c 20 6a 2c bS_Push(p, z, j,
6f40: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 1);. bre
6f50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
6f60: 20 20 63 61 73 65 20 53 42 53 54 54 5f 56 45 52 case SBSTT_VER
6f70: 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 B: {. /*
6f80: 46 69 72 73 74 20 6c 6f 6f 6b 20 75 70 20 74 68 First look up th
6f90: 65 20 76 65 72 62 20 69 6e 20 74 68 65 20 68 61 e verb in the ha
6fa0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 sh table */.
6fb0: 20 20 20 20 63 6f 6e 73 74 20 53 62 53 56 61 6c const SbSVal
6fc0: 75 65 20 2a 70 56 61 6c 20 3d 20 73 62 73 5f 66 ue *pVal = sbs_f
6fd0: 65 74 63 68 28 26 70 2d 3e 73 79 6d 54 61 62 2c etch(&p->symTab,
6fe0: 20 28 63 68 61 72 2a 29 7a 53 63 72 69 70 74 2c (char*)zScript,
6ff0: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 n);. if(
7000: 20 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 pVal==0 ){.
7010: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 /* If the
7020: 76 65 72 62 20 69 73 20 6e 6f 74 20 69 6e 20 74 verb is not in t
7030: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2c 20 6c he hash table, l
7040: 6f 6f 6b 20 66 6f 72 20 61 20 0a 20 20 20 20 20 ook for a .
7050: 20 20 20 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e ** built-in
7060: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 command */.
7070: 20 20 20 20 20 20 69 6e 74 20 75 70 72 20 3d 20 int upr =
7080: 73 69 7a 65 6f 66 28 61 42 75 69 6c 74 69 6e 29 sizeof(aBuiltin)
7090: 2f 73 69 7a 65 6f 66 28 61 42 75 69 6c 74 69 6e /sizeof(aBuiltin
70a0: 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 [0]) - 1;.
70b0: 20 20 20 20 69 6e 74 20 6c 77 72 20 3d 20 30 3b int lwr = 0;
70c0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
70d0: 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 SBS_ERROR;.
70e0: 20 20 20 20 20 77 68 69 6c 65 28 20 75 70 72 3e while( upr>
70f0: 3d 6c 77 72 20 29 7b 0a 20 20 20 20 20 20 20 20 =lwr ){.
7100: 20 20 20 20 69 6e 74 20 69 20 3d 20 28 75 70 72 int i = (upr
7110: 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 20 20 20 +lwr)/2;.
7120: 20 20 20 20 20 69 6e 74 20 63 20 3d 20 63 6f 6d int c = com
7130: 70 61 72 65 5f 63 6d 64 28 61 42 75 69 6c 74 69 pare_cmd(aBuilti
7140: 6e 5b 69 5d 2e 7a 43 6d 64 2c 20 7a 53 63 72 69 n[i].zCmd, zScri
7150: 70 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 pt, n);.
7160: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a if( c==0 ){.
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 rc
7180: 20 3d 20 61 42 75 69 6c 74 69 6e 5b 69 5d 2e 78 = aBuiltin[i].x
7190: 43 6d 64 28 70 2c 20 61 42 75 69 6c 74 69 6e 5b Cmd(p, aBuiltin[
71a0: 69 5d 2e 70 41 72 67 29 3b 0a 20 20 20 20 20 20 i].pArg);.
71b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
71c0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 }else
71d0: 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 if( c>0 ){.
71e0: 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 upr =
71f0: 69 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 i-1;.
7200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
7210: 20 20 20 20 20 20 6c 77 72 20 3d 20 69 2b 31 3b lwr = i+1;
7220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 . }.
7230: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
7240: 20 20 20 20 20 69 66 28 20 75 70 72 3c 6c 77 72 if( upr<lwr
7250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
7260: 53 62 53 5f 53 65 74 45 72 72 6f 72 4d 65 73 73 SbS_SetErrorMess
7270: 61 67 65 28 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 age(p, "unknown
7280: 76 65 72 62 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20 verb: %.*s", n,
7290: 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20 zScript);.
72a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 }. }e
72b0: 6c 73 65 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c lse if( pVal->fl
72c0: 61 67 73 20 26 20 53 42 53 56 41 4c 5f 56 45 52 ags & SBSVAL_VER
72d0: 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 B ){. r
72e0: 63 20 3d 20 70 56 61 6c 2d 3e 75 2e 76 65 72 62 c = pVal->u.verb
72f0: 2e 78 56 65 72 62 28 70 2c 20 70 56 61 6c 2d 3e .xVerb(p, pVal->
7300: 75 2e 76 65 72 62 2e 70 41 72 67 29 3b 0a 20 20 u.verb.pArg);.
7310: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
7320: 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 53 42 pVal->flags & SB
7330: 53 56 41 4c 5f 45 58 45 43 20 29 7b 0a 20 20 20 SVAL_EXEC ){.
7340: 20 20 20 20 20 20 20 72 63 20 3d 20 53 62 53 5f rc = SbS_
7350: 45 76 61 6c 28 70 2c 20 70 56 61 6c 2d 3e 75 2e Eval(p, pVal->u.
7360: 73 74 72 2e 7a 2c 20 70 56 61 6c 2d 3e 75 2e 73 str.z, pVal->u.s
7370: 74 72 2e 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 tr.size);.
7380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
7390: 20 20 20 72 63 20 3d 20 53 62 53 5f 50 75 73 68 rc = SbS_Push
73a0: 28 70 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e (p, pVal->u.str.
73b0: 7a 2c 20 70 56 61 6c 2d 3e 75 2e 73 74 72 2e 73 z, pVal->u.str.s
73c0: 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 ize, 0);.
73d0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b }. break
73e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
73f0: 20 20 20 20 7a 53 63 72 69 70 74 20 2b 3d 20 6e zScript += n
7400: 3b 0a 20 20 20 20 6e 53 63 72 69 70 74 20 2d 3d ;. nScript -=
7410: 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e n;. }. return
7420: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 rc;.}../*.** Th
7430: 65 20 7a 5b 5d 20 69 6e 70 75 74 20 63 6f 6e 74 e z[] input cont
7440: 61 69 6e 73 20 74 65 78 74 20 6d 69 78 65 64 20 ains text mixed
7450: 77 69 74 68 20 73 75 62 73 63 72 69 70 74 20 73 with subscript s
7460: 63 72 69 70 74 73 2e 0a 2a 2a 20 54 68 65 20 73 cripts..** The s
7470: 75 62 73 63 72 69 70 74 20 73 63 72 69 70 74 73 ubscript scripts
7480: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 are contained w
7490: 69 74 68 69 6e 20 5b 2e 2e 2e 5d 2e 20 20 54 68 ithin [...]. Th
74a0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 70 72 is routine.** pr
74b0: 6f 63 65 73 73 65 73 20 74 68 65 20 74 65 6d 70 ocesses the temp
74c0: 6c 61 74 65 20 61 6e 64 20 77 72 69 74 65 73 20 late and writes
74d0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e 20 65 the results on e
74e0: 69 74 68 65 72 0a 2a 2a 20 73 74 64 6f 75 74 20 ither.** stdout
74f0: 6f 72 20 69 6e 74 6f 20 43 47 49 2e 0a 2a 2f 0a or into CGI..*/.
7500: 69 6e 74 20 53 62 53 5f 52 65 6e 64 65 72 28 73 int SbS_Render(s
7510: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20 truct Subscript
7520: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a *p, const char *
7530: 7a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b z){. int i = 0;
7540: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 42 53 5f . int rc = SBS_
7550: 4f 4b 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 OK;. while( z[i
7560: 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 ] ){. if( z[i
7570: 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 ]=='[' ){.
7580: 73 65 6e 64 54 65 78 74 28 7a 2c 20 69 29 3b 0a sendText(z, i);.
7590: 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a z += i+1;.
75a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a for(i=0; z
75b0: 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 5d 27 [i] && z[i]!=']'
75c0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 72 ; i++){}. r
75d0: 63 20 3d 20 53 62 53 5f 45 76 61 6c 28 70 2c 20 c = SbS_Eval(p,
75e0: 7a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 z, i);. if(
75f0: 20 72 63 21 3d 53 42 53 5f 4f 4b 20 29 20 62 72 rc!=SBS_OK ) br
7600: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a eak;. if( z
7610: 5b 69 5d 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 [i] ) i++;.
7620: 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 69 z += i;. i
7630: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b = 0;. }else{
7640: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 . i++;.
7650: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d }. }. if( rc==
7660: 53 42 53 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 SBS_ERROR ){.
7670: 20 73 65 6e 64 54 65 78 74 28 22 3c 68 72 3e 3c sendText("<hr><
7680: 70 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 p><font color=\"
7690: 72 65 64 5c 22 3e 3c 62 3e 45 52 52 4f 52 3a 20 red\"><b>ERROR:
76a0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 73 65 6e 64 ", -1);. send
76b0: 54 65 78 74 28 53 62 53 5f 47 65 74 45 72 72 6f Text(SbS_GetErro
76c0: 72 4d 65 73 73 61 67 65 28 70 29 2c 20 2d 31 29 rMessage(p), -1)
76d0: 3b 0a 20 20 20 20 73 65 6e 64 54 65 78 74 28 22 ;. sendText("
76e0: 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 22 </b></font></p>"
76f0: 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a , -1);. }else{.
7700: 20 20 20 20 73 65 6e 64 54 65 78 74 28 7a 2c 20 sendText(z,
7710: 69 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e i);. }. return
7720: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f rc;.}../*.** CO
7730: 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 73 75 62 73 MMAND: test-subs
7740: 63 72 69 70 74 0a 2a 2f 0a 76 6f 69 64 20 74 65 cript.*/.void te
7750: 73 74 5f 73 75 62 73 63 72 69 70 74 28 76 6f 69 st_subscript(voi
7760: 64 29 7b 0a 20 20 53 75 62 73 63 72 69 70 74 20 d){. Subscript
7770: 2a 70 3b 0a 20 20 42 6c 6f 62 20 69 6e 3b 0a 20 *p;. Blob in;.
7780: 20 69 66 28 20 67 2e 61 72 67 63 3c 33 20 29 7b if( g.argc<3 ){
7790: 0a 20 20 20 20 75 73 61 67 65 28 22 46 49 4c 45 . usage("FILE
77a0: 22 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a ");. }. blob_z
77b0: 65 72 6f 28 26 69 6e 29 3b 0a 20 20 62 6c 6f 62 ero(&in);. blob
77c0: 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 _read_from_file(
77d0: 26 69 6e 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b &in, g.argv[2]);
77e0: 0a 20 20 70 20 3d 20 53 62 53 5f 43 72 65 61 74 . p = SbS_Creat
77f0: 65 28 29 3b 0a 20 20 53 62 53 5f 52 65 6e 64 65 e();. SbS_Rende
7800: 72 28 70 2c 20 62 6c 6f 62 5f 73 74 72 28 26 69 r(p, blob_str(&i
7810: 6e 29 29 3b 0a 7d 0a n));.}.