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 36 20 44 2e 20 52 69 63 68 (c) 2006 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 41 20 42 6c 6f 62 20 69 73 .**.** A Blob is
0370: 20 61 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 a variable-leng
0380: 74 68 20 63 6f 6e 74 61 69 6e 65 72 73 20 66 6f th containers fo
0390: 72 20 61 72 62 69 74 72 61 72 79 20 73 74 72 69 r arbitrary stri
03a0: 6e 67 0a 2a 2a 20 6f 72 20 62 69 6e 61 72 79 20 ng.** or binary
03b0: 64 61 74 61 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 data..*/.#includ
03c0: 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e e "config.h".#in
03d0: 63 6c 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 clude <zlib.h>.#
03e0: 69 6e 63 6c 75 64 65 20 22 62 6c 6f 62 2e 68 22 include "blob.h"
03f0: 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a ..#if INTERFACE.
0400: 2f 2a 0a 2a 2a 20 41 20 42 6c 6f 62 20 63 61 6e /*.** A Blob can
0410: 20 68 6f 6c 64 20 61 20 73 74 72 69 6e 67 20 6f hold a string o
0420: 72 20 61 20 62 69 6e 61 72 79 20 6f 62 6a 65 63 r a binary objec
0430: 74 20 6f 66 20 61 72 62 69 74 72 61 72 79 20 73 t of arbitrary s
0440: 69 7a 65 2e 20 20 54 68 65 0a 2a 2a 20 73 69 7a ize. The.** siz
0450: 65 20 63 68 61 6e 67 65 73 20 61 73 20 6e 65 63 e changes as nec
0460: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 essary..*/.struc
0470: 74 20 42 6c 6f 62 20 7b 0a 20 20 75 6e 73 69 67 t Blob {. unsig
0480: 6e 65 64 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 ned int nUsed;
0490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
04a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 75 73 65 ber of bytes use
04b0: 64 20 69 6e 20 61 44 61 74 61 5b 5d 20 2a 2f 0a d in aData[] */.
04c0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e unsigned int n
04d0: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 Alloc;
04e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
04f0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f tes allocated fo
0500: 72 20 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 r aData[] */. u
0510: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43 75 72 nsigned int iCur
0520: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a sor; /*
0530: 20 4e 65 78 74 20 63 68 61 72 61 63 74 65 72 20 Next character
0540: 6f 66 20 69 6e 70 75 74 20 74 6f 20 70 61 72 73 of input to pars
0550: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 e */. char *aDa
0560: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ta;
0570: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 /* Where t
0580: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 he information i
0590: 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 76 6f s stored */. vo
05a0: 69 64 20 28 2a 78 52 65 61 6c 6c 6f 63 29 28 42 id (*xRealloc)(B
05b0: 6c 6f 62 2a 2c 20 75 6e 73 69 67 6e 65 64 20 69 lob*, unsigned i
05c0: 6e 74 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e nt); /* Function
05d0: 20 74 6f 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 to reallocate t
05e0: 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 7d 3b 0a he buffer */.};.
05f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 ./*.** The curre
0600: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 42 6c 6f nt size of a Blo
0610: 62 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 62 6c 6f b.*/.#define blo
0620: 62 5f 73 69 7a 65 28 58 29 20 20 28 28 58 29 2d b_size(X) ((X)-
0630: 3e 6e 55 73 65 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 >nUsed)../*.** T
0640: 68 65 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e he buffer holdin
0650: 67 20 74 68 65 20 62 6c 6f 62 20 64 61 74 61 0a g the blob data.
0660: 2a 2f 0a 23 64 65 66 69 6e 65 20 62 6c 6f 62 5f */.#define blob_
0670: 62 75 66 66 65 72 28 58 29 20 20 28 28 58 29 2d buffer(X) ((X)-
0680: 3e 61 44 61 74 61 29 0a 0a 2f 2a 0a 2a 2a 20 53 >aData)../*.** S
0690: 65 65 6b 20 77 68 65 6e 63 65 20 70 61 72 61 6d eek whence param
06a0: 65 74 65 72 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 eter values.*/.#
06b0: 64 65 66 69 6e 65 20 42 4c 4f 42 5f 53 45 45 4b define BLOB_SEEK
06c0: 5f 53 45 54 20 31 0a 23 64 65 66 69 6e 65 20 42 _SET 1.#define B
06d0: 4c 4f 42 5f 53 45 45 4b 5f 43 55 52 20 32 0a 23 LOB_SEEK_CUR 2.#
06e0: 64 65 66 69 6e 65 20 42 4c 4f 42 5f 53 45 45 4b define BLOB_SEEK
06f0: 5f 45 4e 44 20 33 0a 0a 23 65 6e 64 69 66 20 2f _END 3..#endif /
0700: 2a 20 49 4e 54 45 52 46 41 43 45 20 2a 2f 0a 0a * INTERFACE */..
0710: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 /*.** Make sure
0720: 61 20 62 6c 6f 62 20 69 73 20 69 6e 69 74 69 61 a blob is initia
0730: 6c 69 7a 65 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 lized.*/.#define
0740: 20 62 6c 6f 62 5f 69 73 5f 69 6e 69 74 28 78 29 blob_is_init(x)
0750: 20 5c 0a 20 20 61 73 73 65 72 74 28 28 78 29 2d \. assert((x)-
0760: 3e 78 52 65 61 6c 6c 6f 63 3d 3d 62 6c 6f 62 52 >xRealloc==blobR
0770: 65 61 6c 6c 6f 63 4d 61 6c 6c 6f 63 20 7c 7c 20 eallocMalloc ||
0780: 28 78 29 2d 3e 78 52 65 61 6c 6c 6f 63 3d 3d 62 (x)->xRealloc==b
0790: 6c 6f 62 52 65 61 6c 6c 6f 63 53 74 61 74 69 63 lobReallocStatic
07a0: 29 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 )../*.** Make su
07b0: 72 65 20 61 20 62 6c 6f 62 20 64 6f 65 73 20 6e re a blob does n
07c0: 6f 74 20 63 6f 6e 74 61 69 6e 20 6d 61 6c 6c 6f ot contain mallo
07d0: 63 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 23 ced memory..*/.#
07e0: 69 66 20 30 20 20 2f 2a 20 45 6e 61 62 6c 65 20 if 0 /* Enable
07f0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e for debugging on
0800: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 62 6c ly */.#define bl
0810: 6f 62 5f 69 73 5f 72 65 73 65 74 28 78 29 20 5c ob_is_reset(x) \
0820: 0a 20 20 61 73 73 65 72 74 28 28 78 29 2d 3e 78 . assert((x)->x
0830: 52 65 61 6c 6c 6f 63 21 3d 62 6c 6f 62 52 65 61 Realloc!=blobRea
0840: 6c 6c 6f 63 4d 61 6c 6c 6f 63 20 7c 7c 20 28 78 llocMalloc || (x
0850: 29 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 0a 23 65 )->nAlloc==0).#e
0860: 6c 73 65 0a 23 64 65 66 69 6e 65 20 62 6c 6f 62 lse.#define blob
0870: 5f 69 73 5f 72 65 73 65 74 28 78 29 0a 23 65 6e _is_reset(x).#en
0880: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 dif../*.** This
0890: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 routine is calle
08a0: 64 20 69 66 20 61 20 62 6c 6f 62 20 6f 70 65 72 d if a blob oper
08b0: 61 74 69 6f 6e 20 66 61 69 6c 73 20 62 65 63 61 ation fails beca
08c0: 75 73 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 72 use we.** have r
08d0: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 un out of memory
08e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
08f0: 20 62 6c 6f 62 5f 70 61 6e 69 63 28 76 6f 69 64 blob_panic(void
0900: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 ){. static cons
0910: 74 20 63 68 61 72 20 7a 45 72 72 4d 73 67 5b 5d t char zErrMsg[]
0920: 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 = "out of memor
0930: 79 5c 6e 22 3b 0a 20 20 77 72 69 74 65 28 32 2c y\n";. write(2,
0940: 20 7a 45 72 72 4d 73 67 2c 20 73 69 7a 65 6f 66 zErrMsg, sizeof
0950: 28 7a 45 72 72 4d 73 67 29 2d 31 29 3b 0a 20 20 (zErrMsg)-1);.
0960: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a exit(1);.}../*.*
0970: 2a 20 41 20 72 65 61 6c 6c 6f 63 61 74 69 6f 6e * A reallocation
0980: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 function that a
0990: 73 73 75 6d 65 73 20 74 68 61 74 20 61 44 61 74 ssumes that aDat
09a0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 6d 61 6c 6c a came from mall
09b0: 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 66 75 oc()..** This fu
09c0: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 nction attempts
09d0: 74 6f 20 72 65 73 69 7a 65 20 74 68 65 20 62 75 to resize the bu
09e0: 66 66 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 62 ffer of the blob
09f0: 20 74 6f 20 68 6f 6c 64 0a 2a 2a 20 6e 65 77 53 to hold.** newS
0a00: 69 7a 65 20 62 79 74 65 73 2e 20 20 0a 2a 2a 0a ize bytes. .**.
0a10: 2a 2a 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 ** No attempt is
0a20: 20 6d 61 64 65 20 74 6f 20 72 65 63 6f 76 65 72 made to recover
0a30: 20 66 72 6f 6d 20 61 6e 20 6f 75 74 2d 6f 66 2d from an out-of-
0a40: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 2e 0a 2a 2a memory error..**
0a50: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 If an OOM error
0a60: 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f occurs, an erro
0a70: 72 20 6d 65 73 73 61 67 65 20 69 73 20 70 72 69 r message is pri
0a80: 6e 74 65 64 20 6f 6e 20 73 74 64 65 72 72 0a 2a nted on stderr.*
0a90: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 67 72 61 * and the progra
0aa0: 6d 20 65 78 69 74 73 2e 0a 2a 2f 0a 76 6f 69 64 m exits..*/.void
0ab0: 20 62 6c 6f 62 52 65 61 6c 6c 6f 63 4d 61 6c 6c blobReallocMall
0ac0: 6f 63 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 oc(Blob *pBlob,
0ad0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 unsigned int new
0ae0: 53 69 7a 65 29 7b 0a 20 20 69 66 28 20 6e 65 77 Size){. if( new
0af0: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 Size==0 ){. f
0b00: 72 65 65 28 70 42 6c 6f 62 2d 3e 61 44 61 74 61 ree(pBlob->aData
0b10: 29 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 61 44 );. pBlob->aD
0b20: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 42 6c ata = 0;. pBl
0b30: 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a ob->nAlloc = 0;.
0b40: 20 20 20 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 pBlob->nUsed
0b50: 20 3d 20 30 3b 0a 20 20 20 20 70 42 6c 6f 62 2d = 0;. pBlob-
0b60: 3e 69 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 >iCursor = 0;.
0b70: 7d 65 6c 73 65 20 69 66 28 20 6e 65 77 53 69 7a }else if( newSiz
0b80: 65 3e 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 e>pBlob->nAlloc
0b90: 7c 7c 20 6e 65 77 53 69 7a 65 3c 70 42 6c 6f 62 || newSize<pBlob
0ba0: 2d 3e 6e 41 6c 6c 6f 63 2d 34 30 30 30 20 29 7b ->nAlloc-4000 ){
0bb0: 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 . char *pNew
0bc0: 3d 20 72 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2d = realloc(pBlob-
0bd0: 3e 61 44 61 74 61 2c 20 6e 65 77 53 69 7a 65 29 >aData, newSize)
0be0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d ;. if( pNew==
0bf0: 30 20 29 20 62 6c 6f 62 5f 70 61 6e 69 63 28 29 0 ) blob_panic()
0c00: 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 61 44 61 ;. pBlob->aDa
0c10: 74 61 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 ta = pNew;. p
0c20: 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e Blob->nAlloc = n
0c30: 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 ewSize;. if(
0c40: 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 3e 70 42 6c pBlob->nUsed>pBl
0c50: 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 ob->nAlloc ){.
0c60: 20 20 20 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 pBlob->nUsed
0c70: 20 3d 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 = pBlob->nAlloc
0c80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f ;. }. }.}../
0c90: 2a 0a 2a 2a 20 41 6e 20 69 6e 69 74 69 61 6c 69 *.** An initiali
0ca0: 7a 65 72 20 66 6f 72 20 42 6c 6f 62 73 0a 2a 2f zer for Blobs.*/
0cb0: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 23 .#if INTERFACE.#
0cc0: 64 65 66 69 6e 65 20 42 4c 4f 42 5f 49 4e 49 54 define BLOB_INIT
0cd0: 49 41 4c 49 5a 45 52 20 20 7b 30 2c 30 2c 30 2c IALIZER {0,0,0,
0ce0: 30 2c 62 6c 6f 62 52 65 61 6c 6c 6f 63 4d 61 6c 0,blobReallocMal
0cf0: 6c 6f 63 7d 0a 23 65 6e 64 69 66 0a 63 6f 6e 73 loc}.#endif.cons
0d00: 74 20 42 6c 6f 62 20 65 6d 70 74 79 5f 62 6c 6f t Blob empty_blo
0d10: 62 20 3d 20 42 4c 4f 42 5f 49 4e 49 54 49 41 4c b = BLOB_INITIAL
0d20: 49 5a 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 IZER;../*.** A r
0d30: 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 eallocation func
0d40: 74 69 6f 6e 20 66 6f 72 20 77 68 65 6e 20 74 68 tion for when th
0d50: 65 20 69 6e 69 74 69 61 6c 20 73 74 72 69 6e 67 e initial string
0d60: 20 69 73 20 69 6e 20 75 6e 6d 61 6e 61 67 65 64 is in unmanaged
0d70: 0a 2a 2a 20 73 70 61 63 65 2e 20 20 43 6f 70 79 .** space. Copy
0d80: 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 6d the string to m
0d90: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 emory obtained f
0da0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f rom malloc()..*/
0db0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 6c 6f .static void blo
0dc0: 62 52 65 61 6c 6c 6f 63 53 74 61 74 69 63 28 42 bReallocStatic(B
0dd0: 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 75 6e 73 69 lob *pBlob, unsi
0de0: 67 6e 65 64 20 69 6e 74 20 6e 65 77 53 69 7a 65 gned int newSize
0df0: 29 7b 0a 20 20 69 66 28 20 6e 65 77 53 69 7a 65 ){. if( newSize
0e00: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 42 6c 6f ==0 ){. *pBlo
0e10: 62 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a b = empty_blob;.
0e20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 }else{. cha
0e30: 72 20 2a 70 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 r *pNew = malloc
0e40: 28 20 6e 65 77 53 69 7a 65 20 29 3b 0a 20 20 20 ( newSize );.
0e50: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 if( pNew==0 ) b
0e60: 6c 6f 62 5f 70 61 6e 69 63 28 29 3b 0a 20 20 20 lob_panic();.
0e70: 20 69 66 28 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 if( pBlob->nUse
0e80: 64 3e 6e 65 77 53 69 7a 65 20 29 20 70 42 6c 6f d>newSize ) pBlo
0e90: 62 2d 3e 6e 55 73 65 64 20 3d 20 6e 65 77 53 69 b->nUsed = newSi
0ea0: 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 ze;. memcpy(p
0eb0: 4e 65 77 2c 20 70 42 6c 6f 62 2d 3e 61 44 61 74 New, pBlob->aDat
0ec0: 61 2c 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 29 a, pBlob->nUsed)
0ed0: 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 61 44 61 ;. pBlob->aDa
0ee0: 74 61 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 ta = pNew;. p
0ef0: 42 6c 6f 62 2d 3e 78 52 65 61 6c 6c 6f 63 20 3d Blob->xRealloc =
0f00: 20 62 6c 6f 62 52 65 61 6c 6c 6f 63 4d 61 6c 6c blobReallocMall
0f10: 6f 63 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 6e oc;. pBlob->n
0f20: 41 6c 6c 6f 63 20 3d 20 6e 65 77 53 69 7a 65 3b Alloc = newSize;
0f30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 . }.}../*.** Re
0f40: 73 65 74 20 61 20 62 6c 6f 62 20 74 6f 20 62 65 set a blob to be
0f50: 20 61 6e 20 65 6d 70 74 79 20 63 6f 6e 74 61 69 an empty contai
0f60: 6e 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 62 6c 6f ner..*/.void blo
0f70: 62 5f 72 65 73 65 74 28 42 6c 6f 62 20 2a 70 42 b_reset(Blob *pB
0f80: 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f 69 73 5f lob){. blob_is_
0f90: 69 6e 69 74 28 70 42 6c 6f 62 29 3b 0a 20 20 70 init(pBlob);. p
0fa0: 42 6c 6f 62 2d 3e 78 52 65 61 6c 6c 6f 63 28 70 Blob->xRealloc(p
0fb0: 42 6c 6f 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a Blob, 0);.}../*.
0fc0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 ** Initialize a
0fd0: 62 6c 6f 62 20 74 6f 20 61 20 73 74 72 69 6e 67 blob to a string
0fe0: 20 6f 72 20 62 79 74 65 2d 61 72 72 61 79 20 63 or byte-array c
0ff0: 6f 6e 73 74 61 6e 74 20 6f 66 20 61 20 73 70 65 onstant of a spe
1000: 63 69 66 69 65 64 20 6c 65 6e 67 74 68 2e 0a 2a cified length..*
1010: 2a 20 41 6e 79 20 70 72 69 6f 72 20 64 61 74 61 * Any prior data
1020: 20 69 6e 20 74 68 65 20 62 6c 6f 62 20 69 73 20 in the blob is
1030: 64 69 73 63 61 72 64 65 64 2e 0a 2a 2f 0a 76 6f discarded..*/.vo
1040: 69 64 20 62 6c 6f 62 5f 69 6e 69 74 28 42 6c 6f id blob_init(Blo
1050: 62 20 2a 70 42 6c 6f 62 2c 20 63 6f 6e 73 74 20 b *pBlob, const
1060: 63 68 61 72 20 2a 7a 44 61 74 61 2c 20 69 6e 74 char *zData, int
1070: 20 73 69 7a 65 29 7b 0a 20 20 62 6c 6f 62 5f 69 size){. blob_i
1080: 73 5f 72 65 73 65 74 28 70 42 6c 6f 62 29 3b 0a s_reset(pBlob);.
1090: 20 20 69 66 28 20 7a 44 61 74 61 3d 3d 30 20 29 if( zData==0 )
10a0: 7b 0a 20 20 20 20 2a 70 42 6c 6f 62 20 3d 20 65 {. *pBlob = e
10b0: 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 7d 65 6c mpty_blob;. }el
10c0: 73 65 7b 0a 20 20 20 20 69 66 28 20 73 69 7a 65 se{. if( size
10d0: 3c 3d 30 20 29 20 73 69 7a 65 20 3d 20 73 74 72 <=0 ) size = str
10e0: 6c 65 6e 28 7a 44 61 74 61 29 3b 0a 20 20 20 20 len(zData);.
10f0: 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 20 3d 20 70 pBlob->nUsed = p
1100: 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 Blob->nAlloc = s
1110: 69 7a 65 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e ize;. pBlob->
1120: 61 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29 7a aData = (char*)z
1130: 44 61 74 61 3b 0a 20 20 20 20 70 42 6c 6f 62 2d Data;. pBlob-
1140: 3e 69 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 >iCursor = 0;.
1150: 20 20 70 42 6c 6f 62 2d 3e 78 52 65 61 6c 6c 6f pBlob->xReallo
1160: 63 20 3d 20 62 6c 6f 62 52 65 61 6c 6c 6f 63 53 c = blobReallocS
1170: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a tatic;. }.}../*
1180: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 .** Initialize a
1190: 20 62 6c 6f 62 20 74 6f 20 61 20 6e 75 6c 2d 74 blob to a nul-t
11a0: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 erminated string
11b0: 2e 0a 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20 64 ..** Any prior d
11c0: 61 74 61 20 69 6e 20 74 68 65 20 62 6c 6f 62 20 ata in the blob
11d0: 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2f is discarded..*/
11e0: 0a 76 6f 69 64 20 62 6c 6f 62 5f 73 65 74 28 42 .void blob_set(B
11f0: 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 63 6f 6e 73 lob *pBlob, cons
1200: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 t char *zStr){.
1210: 20 62 6c 6f 62 5f 69 6e 69 74 28 70 42 6c 6f 62 blob_init(pBlob
1220: 2c 20 7a 53 74 72 2c 20 2d 31 29 3b 0a 7d 0a 0a , zStr, -1);.}..
1230: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /*.** Initialize
1240: 20 61 20 62 6c 6f 62 20 74 6f 20 61 6e 20 65 6d a blob to an em
1250: 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 pty string..*/.v
1260: 6f 69 64 20 62 6c 6f 62 5f 7a 65 72 6f 28 42 6c oid blob_zero(Bl
1270: 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 73 74 ob *pBlob){. st
1280: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
1290: 7a 45 6d 70 74 79 5b 5d 20 3d 20 22 22 3b 0a 20 zEmpty[] = "";.
12a0: 20 62 6c 6f 62 5f 69 73 5f 72 65 73 65 74 28 70 blob_is_reset(p
12b0: 42 6c 6f 62 29 3b 0a 20 20 70 42 6c 6f 62 2d 3e Blob);. pBlob->
12c0: 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 42 6c nUsed = 0;. pBl
12d0: 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a ob->nAlloc = 1;.
12e0: 20 20 70 42 6c 6f 62 2d 3e 61 44 61 74 61 20 3d pBlob->aData =
12f0: 20 28 63 68 61 72 2a 29 7a 45 6d 70 74 79 3b 0a (char*)zEmpty;.
1300: 20 20 70 42 6c 6f 62 2d 3e 69 43 75 72 73 6f 72 pBlob->iCursor
1310: 20 3d 20 30 3b 0a 20 20 70 42 6c 6f 62 2d 3e 78 = 0;. pBlob->x
1320: 52 65 61 6c 6c 6f 63 20 3d 20 62 6c 6f 62 52 65 Realloc = blobRe
1330: 61 6c 6c 6f 63 53 74 61 74 69 63 3b 0a 7d 0a 0a allocStatic;.}..
1340: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 /*.** Append tex
1350: 74 20 6f 72 20 64 61 74 61 20 74 6f 20 74 68 65 t or data to the
1360: 20 65 6e 64 20 6f 66 20 61 20 62 6c 6f 62 2e 0a end of a blob..
1370: 2a 2f 0a 76 6f 69 64 20 62 6c 6f 62 5f 61 70 70 */.void blob_app
1380: 65 6e 64 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c end(Blob *pBlob,
1390: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61 const char *aDa
13a0: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a ta, int nData){.
13b0: 20 20 62 6c 6f 62 5f 69 73 5f 69 6e 69 74 28 70 blob_is_init(p
13c0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 6e 44 61 Blob);. if( nDa
13d0: 74 61 3c 30 20 29 20 6e 44 61 74 61 20 3d 20 73 ta<0 ) nData = s
13e0: 74 72 6c 65 6e 28 61 44 61 74 61 29 3b 0a 20 20 trlen(aData);.
13f0: 69 66 28 20 6e 44 61 74 61 3d 3d 30 20 29 20 72 if( nData==0 ) r
1400: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 42 6c eturn;. if( pBl
1410: 6f 62 2d 3e 6e 55 73 65 64 20 2b 20 6e 44 61 74 ob->nUsed + nDat
1420: 61 20 3e 3d 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c a >= pBlob->nAll
1430: 6f 63 20 29 7b 0a 20 20 20 20 70 42 6c 6f 62 2d oc ){. pBlob-
1440: 3e 78 52 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2c >xRealloc(pBlob,
1450: 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 20 2b 20 pBlob->nUsed +
1460: 6e 44 61 74 61 20 2b 20 70 42 6c 6f 62 2d 3e 6e nData + pBlob->n
1470: 41 6c 6c 6f 63 20 2b 20 31 30 30 29 3b 0a 20 20 Alloc + 100);.
1480: 20 20 69 66 28 20 70 42 6c 6f 62 2d 3e 6e 55 73 if( pBlob->nUs
1490: 65 64 20 2b 20 6e 44 61 74 61 20 3e 3d 20 70 42 ed + nData >= pB
14a0: 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 lob->nAlloc ){.
14b0: 20 20 20 20 20 62 6c 6f 62 5f 70 61 6e 69 63 28 blob_panic(
14c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d );. }. }. m
14d0: 65 6d 63 70 79 28 26 70 42 6c 6f 62 2d 3e 61 44 emcpy(&pBlob->aD
14e0: 61 74 61 5b 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 ata[pBlob->nUsed
14f0: 5d 2c 20 61 44 61 74 61 2c 20 6e 44 61 74 61 29 ], aData, nData)
1500: 3b 0a 20 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 ;. pBlob->nUsed
1510: 20 2b 3d 20 6e 44 61 74 61 3b 0a 20 20 70 42 6c += nData;. pBl
1520: 6f 62 2d 3e 61 44 61 74 61 5b 70 42 6c 6f 62 2d ob->aData[pBlob-
1530: 3e 6e 55 73 65 64 5d 20 3d 20 30 3b 20 20 20 2f >nUsed] = 0; /
1540: 2a 20 42 6c 6f 62 73 20 61 72 65 20 61 6c 77 61 * Blobs are alwa
1550: 79 73 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 ys nul-terminate
1560: 64 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f d */.}../*.** Co
1570: 70 79 20 61 20 62 6c 6f 62 0a 2a 2f 0a 76 6f 69 py a blob.*/.voi
1580: 64 20 62 6c 6f 62 5f 63 6f 70 79 28 42 6c 6f 62 d blob_copy(Blob
1590: 20 2a 70 54 6f 2c 20 42 6c 6f 62 20 2a 70 46 72 *pTo, Blob *pFr
15a0: 6f 6d 29 7b 0a 20 20 62 6c 6f 62 5f 69 73 5f 69 om){. blob_is_i
15b0: 6e 69 74 28 70 46 72 6f 6d 29 3b 0a 20 20 62 6c nit(pFrom);. bl
15c0: 6f 62 5f 69 73 5f 69 6e 69 74 28 70 54 6f 29 3b ob_is_init(pTo);
15d0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 54 6f . blob_zero(pTo
15e0: 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 );. blob_append
15f0: 28 70 54 6f 2c 20 62 6c 6f 62 5f 62 75 66 66 65 (pTo, blob_buffe
1600: 72 28 70 46 72 6f 6d 29 2c 20 62 6c 6f 62 5f 73 r(pFrom), blob_s
1610: 69 7a 65 28 70 46 72 6f 6d 29 29 3b 0a 7d 0a 0a ize(pFrom));.}..
1620: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 /*.** Return a p
1630: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 6c ointer to a null
1640: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 -terminated stri
1650: 6e 67 20 66 6f 72 20 61 20 62 6c 6f 62 2e 0a 2a ng for a blob..*
1660: 2f 0a 63 68 61 72 20 2a 62 6c 6f 62 5f 73 74 72 /.char *blob_str
1670: 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 20 62 6c 6f (Blob *p){. blo
1680: 62 5f 69 73 5f 69 6e 69 74 28 70 29 3b 0a 20 20 b_is_init(p);.
1690: 69 66 28 20 70 2d 3e 6e 55 73 65 64 3d 3d 30 20 if( p->nUsed==0
16a0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 ){. blob_appe
16b0: 6e 64 28 70 2c 20 22 22 2c 20 31 29 3b 0a 20 20 nd(p, "", 1);.
16c0: 20 20 70 2d 3e 6e 55 73 65 64 20 3d 20 30 3b 0a p->nUsed = 0;.
16d0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 44 61 }. if( p->aDa
16e0: 74 61 5b 70 2d 3e 6e 55 73 65 64 5d 21 3d 30 20 ta[p->nUsed]!=0
16f0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 6d 61 74 65 ){. blob_mate
1700: 72 69 61 6c 69 7a 65 28 70 29 3b 0a 20 20 7d 0a rialize(p);. }.
1710: 20 20 72 65 74 75 72 6e 20 70 2d 3e 61 44 61 74 return p->aDat
1720: 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 a;.}../*.** Retu
1730: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 rn a pointer to
1740: 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 a null-terminate
1750: 64 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 62 d string for a b
1760: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 lob..**.** WARNI
1770: 4e 47 3a 20 20 49 66 20 74 68 65 20 62 6c 6f 62 NG: If the blob
1780: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 69 is ephemeral, i
1790: 74 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 t might cause a
17a0: 27 5c 30 30 30 27 0a 2a 2a 20 63 68 61 72 61 63 '\000'.** charac
17b0: 74 65 72 20 74 6f 20 62 65 20 69 6e 73 65 72 74 ter to be insert
17c0: 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 69 64 64 ed into the midd
17d0: 6c 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 le of the parent
17e0: 20 62 6c 6f 62 2e 0a 2a 2a 20 45 78 61 6d 70 6c blob..** Exampl
17f0: 65 3a 20 20 53 75 70 70 6f 73 65 20 70 20 69 73 e: Suppose p is
1800: 20 61 20 74 6f 6b 65 6e 20 65 78 74 72 61 63 74 a token extract
1810: 65 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6c 61 72 ed from some lar
1820: 67 65 72 0a 2a 2a 20 62 6c 6f 62 20 70 42 69 67 ger.** blob pBig
1830: 20 75 73 69 6e 67 20 62 6c 6f 62 5f 74 6f 6b 65 using blob_toke
1840: 6e 28 29 2e 20 20 49 66 20 79 6f 75 20 63 61 6c n(). If you cal
1850: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f l this routine o
1860: 6e 20 70 2c 0a 2a 2a 20 74 68 65 6e 20 61 20 27 n p,.** then a '
1870: 5c 30 30 30 27 20 63 68 61 72 61 63 74 65 72 20 \000' character
1880: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 will be inserted
1890: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f in the middle o
18a0: 66 0a 2a 2a 20 70 42 69 67 20 69 6e 20 6f 72 64 f.** pBig in ord
18b0: 65 72 20 74 6f 20 63 61 75 73 65 20 70 20 74 6f er to cause p to
18c0: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 be nul-terminat
18d0: 65 64 2e 20 20 49 66 20 70 42 69 67 0a 2a 2a 20 ed. If pBig.**
18e0: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 6f should not be mo
18f0: 64 69 66 69 65 64 2c 20 74 68 65 6e 20 75 73 65 dified, then use
1900: 20 62 6c 6f 62 5f 73 74 72 28 29 20 69 6e 73 74 blob_str() inst
1910: 65 61 64 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 ead of this.** r
1920: 6f 75 74 69 6e 65 2e 20 20 62 6c 6f 62 5f 73 74 outine. blob_st
1930: 72 28 29 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 r() will make a
1940: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 20 69 66 copy of the p if
1950: 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 74 6f necessary.** to
1960: 20 61 76 6f 69 64 20 6d 6f 64 69 66 79 69 6e 67 avoid modifying
1970: 20 70 42 69 67 2e 0a 2a 2f 0a 63 68 61 72 20 2a pBig..*/.char *
1980: 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 42 blob_terminate(B
1990: 6c 6f 62 20 2a 70 29 7b 0a 20 20 62 6c 6f 62 5f lob *p){. blob_
19a0: 69 73 5f 69 6e 69 74 28 70 29 3b 0a 20 20 69 66 is_init(p);. if
19b0: 28 20 70 2d 3e 6e 55 73 65 64 3d 3d 30 20 29 20 ( p->nUsed==0 )
19c0: 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 70 2d 3e return "";. p->
19d0: 61 44 61 74 61 5b 70 2d 3e 6e 55 73 65 64 5d 20 aData[p->nUsed]
19e0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d = 0;. return p-
19f0: 3e 61 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a >aData;.}../*.**
1a00: 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f Compare two blo
1a10: 62 73 2e 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f bs..*/.int blob_
1a20: 63 6f 6d 70 61 72 65 28 42 6c 6f 62 20 2a 70 41 compare(Blob *pA
1a30: 2c 20 42 6c 6f 62 20 2a 70 42 29 7b 0a 20 20 69 , Blob *pB){. i
1a40: 6e 74 20 73 7a 41 2c 20 73 7a 42 2c 20 73 7a 2c nt szA, szB, sz,
1a50: 20 72 63 3b 0a 20 20 62 6c 6f 62 5f 69 73 5f 69 rc;. blob_is_i
1a60: 6e 69 74 28 70 41 29 3b 0a 20 20 62 6c 6f 62 5f nit(pA);. blob_
1a70: 69 73 5f 69 6e 69 74 28 70 42 29 3b 0a 20 20 73 is_init(pB);. s
1a80: 7a 41 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70 zA = blob_size(p
1a90: 41 29 3b 0a 20 20 73 7a 42 20 3d 20 62 6c 6f 62 A);. szB = blob
1aa0: 5f 73 69 7a 65 28 70 42 29 3b 0a 20 20 73 7a 20 _size(pB);. sz
1ab0: 3d 20 73 7a 41 3c 73 7a 42 20 3f 20 73 7a 41 20 = szA<szB ? szA
1ac0: 3a 20 73 7a 42 3b 0a 20 20 72 63 20 3d 20 6d 65 : szB;. rc = me
1ad0: 6d 63 6d 70 28 62 6c 6f 62 5f 62 75 66 66 65 72 mcmp(blob_buffer
1ae0: 28 70 41 29 2c 20 62 6c 6f 62 5f 62 75 66 66 65 (pA), blob_buffe
1af0: 72 28 70 42 29 2c 20 73 7a 29 3b 0a 20 20 69 66 r(pB), sz);. if
1b00: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 ( rc==0 ){. r
1b10: 63 20 3d 20 73 7a 41 20 2d 20 73 7a 42 3b 0a 20 c = szA - szB;.
1b20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a }. return rc;.
1b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 }../*.** Compare
1b40: 20 61 20 62 6c 6f 62 20 74 6f 20 61 20 73 74 72 a blob to a str
1b50: 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 54 52 55 ing. Return TRU
1b60: 45 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71 E if they are eq
1b70: 75 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 ual..*/.int blob
1b80: 5f 65 71 5f 73 74 72 28 42 6c 6f 62 20 2a 70 42 _eq_str(Blob *pB
1b90: 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 lob, const char
1ba0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42 6c *z, int n){. Bl
1bb0: 6f 62 20 74 3b 0a 20 20 62 6c 6f 62 5f 69 73 5f ob t;. blob_is_
1bc0: 69 6e 69 74 28 70 42 6c 6f 62 29 3b 0a 20 20 69 init(pBlob);. i
1bd0: 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d 20 73 74 f( n<=0 ) n = st
1be0: 72 6c 65 6e 28 7a 29 3b 0a 20 20 74 2e 61 44 61 rlen(z);. t.aDa
1bf0: 74 61 20 3d 20 28 63 68 61 72 2a 29 7a 3b 0a 20 ta = (char*)z;.
1c00: 20 74 2e 6e 55 73 65 64 20 3d 20 6e 3b 0a 20 20 t.nUsed = n;.
1c10: 74 2e 78 52 65 61 6c 6c 6f 63 20 3d 20 62 6c 6f t.xRealloc = blo
1c20: 62 52 65 61 6c 6c 6f 63 53 74 61 74 69 63 3b 0a bReallocStatic;.
1c30: 20 20 72 65 74 75 72 6e 20 62 6c 6f 62 5f 63 6f return blob_co
1c40: 6d 70 61 72 65 28 70 42 6c 6f 62 2c 20 26 74 29 mpare(pBlob, &t)
1c50: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 ==0;.}../*.** Th
1c60: 69 73 20 6d 61 63 72 6f 20 63 6f 6d 70 61 72 65 is macro compare
1c70: 73 20 61 20 62 6c 6f 62 20 61 67 61 69 6e 73 74 s a blob against
1c80: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 a string consta
1c90: 6e 74 2e 20 20 57 65 20 75 73 65 20 74 68 65 20 nt. We use the
1ca0: 73 69 7a 65 6f 66 28 29 0a 2a 2a 20 6f 70 65 72 sizeof().** oper
1cb0: 61 74 6f 72 20 6f 6e 20 74 68 65 20 73 74 72 69 ator on the stri
1cc0: 6e 67 20 63 6f 6e 73 74 61 6e 74 20 74 77 69 63 ng constant twic
1cd0: 65 2c 20 73 6f 20 69 74 20 72 65 61 6c 6c 79 20 e, so it really
1ce0: 64 6f 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 does need to be
1cf0: 61 0a 2a 2a 20 73 74 72 69 6e 67 20 6c 69 74 65 a.** string lite
1d00: 72 61 6c 20 6f 72 20 63 68 61 72 61 63 74 65 72 ral or character
1d10: 20 61 72 72 61 79 20 2d 20 6e 6f 74 20 61 20 63 array - not a c
1d20: 68 61 72 61 63 74 65 72 20 70 6f 69 6e 74 65 72 haracter pointer
1d30: 2e 0a 2a 2f 0a 23 69 66 20 49 4e 54 45 52 46 41 ..*/.#if INTERFA
1d40: 43 45 0a 23 20 64 65 66 69 6e 65 20 62 6c 6f 62 CE.# define blob
1d50: 5f 65 71 28 42 2c 53 29 20 5c 0a 20 20 20 20 20 _eq(B,S) \.
1d60: 28 28 42 29 2d 3e 6e 55 73 65 64 3d 3d 73 69 7a ((B)->nUsed==siz
1d70: 65 6f 66 28 53 29 2d 31 20 26 26 20 6d 65 6d 63 eof(S)-1 && memc
1d80: 6d 70 28 28 42 29 2d 3e 61 44 61 74 61 2c 53 2c mp((B)->aData,S,
1d90: 73 69 7a 65 6f 66 28 53 29 2d 31 29 3d 3d 30 29 sizeof(S)-1)==0)
1da0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 .#endif.../*.**
1db0: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 73 69 7a Attempt to resiz
1dc0: 65 20 61 20 62 6c 6f 62 20 73 6f 20 74 68 61 74 e a blob so that
1dd0: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 62 75 its internal bu
1de0: 66 66 65 72 20 69 73 20 0a 2a 2a 20 6e 42 79 74 ffer is .** nByt
1df0: 65 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 65 20 e in size. The
1e00: 62 6c 6f 62 20 69 73 20 74 72 75 6e 63 61 74 65 blob is truncate
1e10: 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a d if necessary..
1e20: 2a 2f 0a 76 6f 69 64 20 62 6c 6f 62 5f 72 65 73 */.void blob_res
1e30: 69 7a 65 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c ize(Blob *pBlob,
1e40: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 unsigned int ne
1e50: 77 53 69 7a 65 29 7b 0a 20 20 70 42 6c 6f 62 2d wSize){. pBlob-
1e60: 3e 78 52 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2c >xRealloc(pBlob,
1e70: 20 6e 65 77 53 69 7a 65 2b 31 29 3b 0a 20 20 70 newSize+1);. p
1e80: 42 6c 6f 62 2d 3e 6e 55 73 65 64 20 3d 20 6e 65 Blob->nUsed = ne
1e90: 77 53 69 7a 65 3b 0a 20 20 70 42 6c 6f 62 2d 3e wSize;. pBlob->
1ea0: 61 44 61 74 61 5b 6e 65 77 53 69 7a 65 5d 20 3d aData[newSize] =
1eb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 0;.}../*.** Mak
1ec0: 65 20 73 75 72 65 20 61 20 62 6c 6f 62 20 69 73 e sure a blob is
1ed0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 nul-terminated
1ee0: 61 6e 64 20 69 73 20 6e 6f 74 20 61 20 70 6f 69 and is not a poi
1ef0: 6e 74 65 72 20 74 6f 20 75 6e 6d 61 6e 61 67 65 nter to unmanage
1f00: 64 0a 2a 2a 20 73 70 61 63 65 2e 20 20 52 65 74 d.** space. Ret
1f10: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f urn a pointer to
1f20: 20 74 68 65 0a 2a 2f 0a 63 68 61 72 20 2a 62 6c the.*/.char *bl
1f30: 6f 62 5f 6d 61 74 65 72 69 61 6c 69 7a 65 28 42 ob_materialize(B
1f40: 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 62 lob *pBlob){. b
1f50: 6c 6f 62 5f 72 65 73 69 7a 65 28 70 42 6c 6f 62 lob_resize(pBlob
1f60: 2c 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 29 3b , pBlob->nUsed);
1f70: 0a 20 20 72 65 74 75 72 6e 20 70 42 6c 6f 62 2d . return pBlob-
1f80: 3e 61 44 61 74 61 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a >aData;.}.../*.*
1f90: 2a 20 43 61 6c 6c 20 64 65 68 74 74 70 69 7a 65 * Call dehttpize
1fa0: 20 6f 6e 20 61 20 62 6c 6f 62 2e 20 20 54 68 69 on a blob. Thi
1fb0: 73 20 63 61 75 73 65 73 20 61 6e 20 65 70 68 65 s causes an ephe
1fc0: 6d 65 72 61 6c 20 62 6c 6f 62 20 74 6f 20 62 65 meral blob to be
1fd0: 0a 2a 2a 20 6d 61 74 65 72 69 61 6c 69 7a 65 64 .** materialized
1fe0: 2e 0a 2a 2f 0a 76 6f 69 64 20 62 6c 6f 62 5f 64 ..*/.void blob_d
1ff0: 65 68 74 74 70 69 7a 65 28 42 6c 6f 62 20 2a 70 ehttpize(Blob *p
2000: 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f 6d 61 Blob){. blob_ma
2010: 74 65 72 69 61 6c 69 7a 65 28 70 42 6c 6f 62 29 terialize(pBlob)
2020: 3b 0a 20 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 ;. pBlob->nUsed
2030: 20 3d 20 64 65 68 74 74 70 69 7a 65 28 70 42 6c = dehttpize(pBl
2040: 6f 62 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 0a 2f ob->aData);.}../
2050: 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 4e 20 62 *.** Extract N b
2060: 79 74 65 73 20 66 72 6f 6d 20 62 6c 6f 62 20 70 ytes from blob p
2070: 46 72 6f 6d 20 61 6e 64 20 75 73 65 20 69 74 20 From and use it
2080: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 62 6c to initialize bl
2090: 6f 62 20 70 54 6f 2e 0a 2a 2a 20 52 65 74 75 72 ob pTo..** Retur
20a0: 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d n the actual num
20b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 65 78 74 ber of bytes ext
20c0: 72 61 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 racted..**.** Af
20d0: 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 63 6f ter this call co
20e0: 6d 70 6c 65 74 65 73 2c 20 70 54 6f 20 77 69 6c mpletes, pTo wil
20f0: 6c 20 62 65 20 61 6e 20 65 70 68 65 6d 65 72 61 l be an ephemera
2100: 6c 20 62 6c 6f 62 2e 0a 2a 2f 0a 69 6e 74 20 62 l blob..*/.int b
2110: 6c 6f 62 5f 65 78 74 72 61 63 74 28 42 6c 6f 62 lob_extract(Blob
2120: 20 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 4e 2c 20 *pFrom, int N,
2130: 42 6c 6f 62 20 2a 70 54 6f 29 7b 0a 20 20 62 6c Blob *pTo){. bl
2140: 6f 62 5f 69 73 5f 69 6e 69 74 28 70 46 72 6f 6d ob_is_init(pFrom
2150: 29 3b 0a 20 20 62 6c 6f 62 5f 69 73 5f 72 65 73 );. blob_is_res
2160: 65 74 28 70 54 6f 29 3b 0a 20 20 69 66 28 20 70 et(pTo);. if( p
2170: 46 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 20 2b 20 From->iCursor +
2180: 4e 20 3e 20 70 46 72 6f 6d 2d 3e 6e 55 73 65 64 N > pFrom->nUsed
2190: 20 29 7b 0a 20 20 20 20 4e 20 3d 20 70 46 72 6f ){. N = pFro
21a0: 6d 2d 3e 6e 55 73 65 64 20 2d 20 70 46 72 6f 6d m->nUsed - pFrom
21b0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 ->iCursor;. i
21c0: 66 28 20 4e 3c 3d 30 20 29 7b 0a 20 20 20 20 20 f( N<=0 ){.
21d0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 54 6f 29 3b blob_zero(pTo);
21e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b . return 0;
21f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 6f . }. }. pTo
2200: 2d 3e 6e 55 73 65 64 20 3d 20 4e 3b 0a 20 20 70 ->nUsed = N;. p
2210: 54 6f 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 4e 3b 0a To->nAlloc = N;.
2220: 20 20 70 54 6f 2d 3e 61 44 61 74 61 20 3d 20 26 pTo->aData = &
2230: 70 46 72 6f 6d 2d 3e 61 44 61 74 61 5b 70 46 72 pFrom->aData[pFr
2240: 6f 6d 2d 3e 69 43 75 72 73 6f 72 5d 3b 0a 20 20 om->iCursor];.
2250: 70 54 6f 2d 3e 69 43 75 72 73 6f 72 20 3d 20 30 pTo->iCursor = 0
2260: 3b 0a 20 20 70 54 6f 2d 3e 78 52 65 61 6c 6c 6f ;. pTo->xReallo
2270: 63 20 3d 20 62 6c 6f 62 52 65 61 6c 6c 6f 63 53 c = blobReallocS
2280: 74 61 74 69 63 3b 0a 20 20 70 46 72 6f 6d 2d 3e tatic;. pFrom->
2290: 69 43 75 72 73 6f 72 20 2b 3d 20 4e 3b 0a 20 20 iCursor += N;.
22a0: 72 65 74 75 72 6e 20 4e 3b 0a 7d 0a 0a 2f 2a 0a return N;.}../*.
22b0: 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 63 75 ** Rewind the cu
22c0: 72 73 6f 72 20 6f 6e 20 61 20 62 6c 6f 62 20 62 rsor on a blob b
22d0: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e ack to the begin
22e0: 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 62 6c ning..*/.void bl
22f0: 6f 62 5f 72 65 77 69 6e 64 28 42 6c 6f 62 20 2a ob_rewind(Blob *
2300: 70 29 7b 0a 20 20 70 2d 3e 69 43 75 72 73 6f 72 p){. p->iCursor
2310: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 = 0;.}../*.** S
2320: 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 eek the cursor i
2330: 6e 20 61 20 62 6c 6f 62 20 74 6f 20 74 68 65 20 n a blob to the
2340: 69 6e 64 69 63 61 74 65 64 20 6f 66 66 73 65 74 indicated offset
2350: 2e 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f 73 65 ..*/.int blob_se
2360: 65 6b 28 42 6c 6f 62 20 2a 70 2c 20 69 6e 74 20 ek(Blob *p, int
2370: 6f 66 66 73 65 74 2c 20 69 6e 74 20 77 68 65 6e offset, int when
2380: 63 65 29 7b 0a 20 20 69 66 28 20 77 68 65 6e 63 ce){. if( whenc
2390: 65 3d 3d 42 4c 4f 42 5f 53 45 45 4b 5f 53 45 54 e==BLOB_SEEK_SET
23a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 43 75 72 73 ){. p->iCurs
23b0: 6f 72 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 7d or = offset;. }
23c0: 65 6c 73 65 20 69 66 28 20 77 68 65 6e 63 65 3d else if( whence=
23d0: 3d 42 4c 4f 42 5f 53 45 45 4b 5f 43 55 52 20 29 =BLOB_SEEK_CUR )
23e0: 7b 0a 20 20 20 20 70 2d 3e 69 43 75 72 73 6f 72 {. p->iCursor
23f0: 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 7d 65 += offset;. }e
2400: 6c 73 65 20 69 66 28 20 77 68 65 6e 63 65 3d 3d lse if( whence==
2410: 42 4c 4f 42 5f 53 45 45 4b 5f 45 4e 44 20 29 7b BLOB_SEEK_END ){
2420: 0a 20 20 20 20 70 2d 3e 69 43 75 72 73 6f 72 20 . p->iCursor
2430: 3d 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6f 66 66 = p->nUsed + off
2440: 73 65 74 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 69 set - 1;. }. i
2450: 66 28 20 70 2d 3e 69 43 75 72 73 6f 72 3c 30 20 f( p->iCursor<0
2460: 29 7b 0a 20 20 20 20 70 2d 3e 69 43 75 72 73 6f ){. p->iCurso
2470: 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 r = 0;. }. if(
2480: 20 70 2d 3e 69 43 75 72 73 6f 72 3e 70 2d 3e 6e p->iCursor>p->n
2490: 55 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 69 Used ){. p->i
24a0: 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 55 73 65 Cursor = p->nUse
24b0: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 d;. }. return
24c0: 70 2d 3e 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f p->iCursor;.}../
24d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
24e0: 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 current offset i
24f0: 6e 74 6f 20 74 68 65 20 62 6c 6f 62 0a 2a 2f 0a nto the blob.*/.
2500: 69 6e 74 20 62 6c 6f 62 5f 74 65 6c 6c 28 42 6c int blob_tell(Bl
2510: 6f 62 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e ob *p){. return
2520: 20 70 2d 3e 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a p->iCursor;.}..
2530: 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 61 20 /*.** Extract a
2540: 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 74 single line of t
2550: 65 78 74 20 66 72 6f 6d 20 70 46 72 6f 6d 20 62 ext from pFrom b
2560: 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 68 65 20 eginning at the
2570: 63 75 72 72 65 6e 74 20 0a 2a 2a 20 63 75 72 73 current .** curs
2580: 6f 72 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 or location and
2590: 75 73 65 20 74 68 61 74 20 6c 69 6e 65 20 6f 66 use that line of
25a0: 20 74 65 78 74 20 74 6f 20 69 6e 69 74 69 61 6c text to initial
25b0: 69 7a 65 20 70 54 6f 2e 0a 2a 2a 20 70 54 6f 20 ize pTo..** pTo
25c0: 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 74 68 65 will include the
25d0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 5c 6e 2e terminating \n.
25e0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d Return the num
25f0: 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 ber of bytes.**
2600: 69 6e 20 74 68 65 20 6c 69 6e 65 20 69 6e 63 6c in the line incl
2610: 75 64 69 6e 67 20 74 68 65 20 5c 6e 20 61 74 20 uding the \n at
2620: 74 68 65 20 65 6e 64 2e 20 20 30 20 69 73 20 72 the end. 0 is r
2630: 65 74 75 72 6e 65 64 20 61 74 0a 2a 2a 20 65 6e eturned at.** en
2640: 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a d-of-file..**.**
2650: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 70 The cursor of p
2660: 46 72 6f 6d 20 69 73 20 6c 65 66 74 20 70 6f 69 From is left poi
2670: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 nting at the fir
2680: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 st byte past the
2690: 0a 2a 2a 20 5c 6e 20 74 68 61 74 20 74 65 72 6d .** \n that term
26a0: 69 6e 61 74 65 64 20 74 68 65 20 6c 69 6e 65 2e inated the line.
26b0: 0a 2a 2a 0a 2a 2a 20 70 54 6f 20 77 69 6c 6c 20 .**.** pTo will
26c0: 62 65 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c be an ephermeral
26d0: 20 62 6c 6f 62 2e 20 20 49 66 20 70 46 72 6f 6d blob. If pFrom
26e0: 20 63 68 61 6e 67 65 73 2c 20 69 74 20 6d 69 67 changes, it mig
26f0: 68 74 20 61 6c 74 65 72 0a 2a 2a 20 70 54 6f 20 ht alter.** pTo
2700: 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 as well..*/.int
2710: 62 6c 6f 62 5f 6c 69 6e 65 28 42 6c 6f 62 20 2a blob_line(Blob *
2720: 70 46 72 6f 6d 2c 20 42 6c 6f 62 20 2a 70 54 6f pFrom, Blob *pTo
2730: 29 7b 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 ){. char *aData
2740: 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b = pFrom->aData;
2750: 0a 20 20 69 6e 74 20 6e 20 3d 20 70 46 72 6f 6d . int n = pFrom
2760: 2d 3e 6e 55 73 65 64 3b 0a 20 20 69 6e 74 20 69 ->nUsed;. int i
2770: 20 3d 20 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f = pFrom->iCurso
2780: 72 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e r;.. while( i<n
2790: 20 26 26 20 61 44 61 74 61 5b 69 5d 21 3d 27 5c && aData[i]!='\
27a0: 6e 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 69 n' ){ i++; }. i
27b0: 66 28 20 69 3c 6e 20 29 7b 0a 20 20 20 20 61 73 f( i<n ){. as
27c0: 73 65 72 74 28 20 61 44 61 74 61 5b 69 5d 3d 3d sert( aData[i]==
27d0: 27 5c 6e 27 20 29 3b 0a 20 20 20 20 69 2b 2b 3b '\n' );. i++;
27e0: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 65 78 74 72 . }. blob_extr
27f0: 61 63 74 28 70 46 72 6f 6d 2c 20 69 2d 70 46 72 act(pFrom, i-pFr
2800: 6f 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 54 6f om->iCursor, pTo
2810: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 6f 2d );. return pTo-
2820: 3e 6e 55 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a >nUsed;.}../*.**
2830: 20 54 72 69 6d 20 77 68 69 74 65 73 70 61 63 65 Trim whitespace
2840: 20 6f 66 66 20 6f 66 20 74 68 65 20 65 6e 64 20 off of the end
2850: 6f 66 20 61 20 62 6c 6f 62 2e 20 20 52 65 74 75 of a blob. Retu
2860: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a rn the number.**
2870: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 72 of characters r
2880: 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 emaining..**.**
2890: 41 6c 6c 20 74 68 69 73 20 64 6f 65 73 20 69 73 All this does is
28a0: 20 72 65 64 75 63 65 20 74 68 65 20 6c 65 6e 67 reduce the leng
28b0: 74 68 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 th counter. Thi
28c0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 0a 2a s routine does.*
28d0: 2a 20 6e 6f 74 20 69 6e 73 65 72 74 20 61 20 6e * not insert a n
28e0: 65 77 20 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 ew zero terminat
28f0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f or..*/.int blob_
2900: 74 72 69 6d 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 trim(Blob *p){.
2910: 20 63 68 61 72 20 2a 7a 20 3d 20 70 2d 3e 61 44 char *z = p->aD
2920: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 ata;. int n = p
2930: 2d 3e 6e 55 73 65 64 3b 0a 20 20 77 68 69 6c 65 ->nUsed;. while
2940: 28 20 6e 3e 30 20 26 26 20 69 73 73 70 61 63 65 ( n>0 && isspace
2950: 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b (z[n-1]) ){ n--;
2960: 20 7d 0a 20 20 70 2d 3e 6e 55 73 65 64 20 3d 20 }. p->nUsed =
2970: 6e 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d n;. return n;.}
2980: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 ../*.** Extract
2990: 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 66 a single token f
29a0: 72 6f 6d 20 70 46 72 6f 6d 20 61 6e 64 20 75 73 rom pFrom and us
29b0: 65 20 69 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 e it to initiali
29c0: 7a 65 20 70 54 6f 2e 0a 2a 2a 20 52 65 74 75 72 ze pTo..** Retur
29d0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
29e0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 74 6f 6b bytes in the tok
29f0: 65 6e 2e 20 20 49 66 20 6e 6f 20 74 6f 6b 65 6e en. If no token
2a00: 20 69 73 20 66 6f 75 6e 64 2c 0a 2a 2a 20 72 65 is found,.** re
2a10: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 41 20 turn 0..**.** A
2a20: 74 6f 6b 65 6e 20 63 6f 6e 73 69 73 74 73 20 6f token consists o
2a30: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f f one or more no
2a40: 6e 2d 73 70 61 63 65 20 63 68 61 72 61 63 74 65 n-space characte
2a50: 72 73 2e 20 20 4c 65 61 64 69 6e 67 0a 2a 2a 20 rs. Leading.**
2a60: 77 68 69 74 65 73 70 61 63 65 20 69 73 20 69 67 whitespace is ig
2a70: 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 nored..**.** The
2a80: 20 63 75 72 73 6f 72 20 6f 66 20 70 46 72 6f 6d cursor of pFrom
2a90: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e is left pointin
2aa0: 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20 63 g at the first c
2ab0: 68 61 72 61 63 74 65 72 20 70 61 73 74 0a 2a 2a haracter past.**
2ac0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 the end of the
2ad0: 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 70 54 6f token..**.** pTo
2ae0: 20 77 69 6c 6c 20 62 65 20 61 6e 20 65 70 68 65 will be an ephe
2af0: 72 6d 65 72 61 6c 20 62 6c 6f 62 2e 20 20 49 66 rmeral blob. If
2b00: 20 70 46 72 6f 6d 20 63 68 61 6e 67 65 73 2c 20 pFrom changes,
2b10: 69 74 20 6d 69 67 68 74 20 61 6c 74 65 72 0a 2a it might alter.*
2b20: 2a 20 70 54 6f 20 61 73 20 77 65 6c 6c 2e 0a 2a * pTo as well..*
2b30: 2f 0a 69 6e 74 20 62 6c 6f 62 5f 74 6f 6b 65 6e /.int blob_token
2b40: 28 42 6c 6f 62 20 2a 70 46 72 6f 6d 2c 20 42 6c (Blob *pFrom, Bl
2b50: 6f 62 20 2a 70 54 6f 29 7b 0a 20 20 63 68 61 72 ob *pTo){. char
2b60: 20 2a 61 44 61 74 61 20 3d 20 70 46 72 6f 6d 2d *aData = pFrom-
2b70: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 >aData;. int n
2b80: 3d 20 70 46 72 6f 6d 2d 3e 6e 55 73 65 64 3b 0a = pFrom->nUsed;.
2b90: 20 20 69 6e 74 20 69 20 3d 20 70 46 72 6f 6d 2d int i = pFrom-
2ba0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c >iCursor;. whil
2bb0: 65 28 20 69 3c 6e 20 26 26 20 69 73 73 70 61 63 e( i<n && isspac
2bc0: 65 28 61 44 61 74 61 5b 69 5d 29 20 29 7b 20 69 e(aData[i]) ){ i
2bd0: 2b 2b 3b 20 7d 0a 20 20 70 46 72 6f 6d 2d 3e 69 ++; }. pFrom->i
2be0: 43 75 72 73 6f 72 20 3d 20 69 3b 0a 20 20 77 68 Cursor = i;. wh
2bf0: 69 6c 65 28 20 69 3c 6e 20 26 26 20 21 69 73 73 ile( i<n && !iss
2c00: 70 61 63 65 28 61 44 61 74 61 5b 69 5d 29 20 29 pace(aData[i]) )
2c10: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 62 6c 6f 62 5f { i++; }. blob_
2c20: 65 78 74 72 61 63 74 28 70 46 72 6f 6d 2c 20 69 extract(pFrom, i
2c30: 2d 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 2c -pFrom->iCursor,
2c40: 20 70 54 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 pTo);. while(
2c50: 69 3c 6e 20 26 26 20 69 73 73 70 61 63 65 28 61 i<n && isspace(a
2c60: 44 61 74 61 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b Data[i]) ){ i++;
2c70: 20 7d 0a 20 20 70 46 72 6f 6d 2d 3e 69 43 75 72 }. pFrom->iCur
2c80: 73 6f 72 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 sor = i;. retur
2c90: 6e 20 70 54 6f 2d 3e 6e 55 73 65 64 3b 0a 7d 0a n pTo->nUsed;.}.
2ca0: 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 65 ./*.** Extract e
2cb0: 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d 20 74 verything from t
2cc0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f he current curso
2cd0: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 r to the end of
2ce0: 74 68 65 20 62 6c 6f 62 0a 2a 2a 20 69 6e 74 6f the blob.** into
2cf0: 20 61 20 6e 65 77 20 62 6c 6f 62 2e 20 20 54 68 a new blob. Th
2d00: 65 20 6e 65 77 20 62 6c 6f 62 20 69 73 20 61 6e e new blob is an
2d10: 20 65 70 68 65 6d 65 72 69 61 6c 20 72 65 66 65 ephemerial refe
2d20: 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 rence to the.**
2d30: 6f 72 69 67 69 6e 61 6c 20 62 6c 6f 62 2e 20 20 original blob.
2d40: 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 The cursor of th
2d50: 65 20 6f 72 69 67 69 6e 61 6c 20 62 6c 6f 62 20 e original blob
2d60: 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f is unchanged..*/
2d70: 0a 69 6e 74 20 62 6c 6f 62 5f 74 61 69 6c 28 42 .int blob_tail(B
2d80: 6c 6f 62 20 2a 70 46 72 6f 6d 2c 20 42 6c 6f 62 lob *pFrom, Blob
2d90: 20 2a 70 54 6f 29 7b 0a 20 20 69 6e 74 20 69 43 *pTo){. int iC
2da0: 75 72 73 6f 72 20 3d 20 70 46 72 6f 6d 2d 3e 69 ursor = pFrom->i
2db0: 43 75 72 73 6f 72 3b 0a 20 20 62 6c 6f 62 5f 65 Cursor;. blob_e
2dc0: 78 74 72 61 63 74 28 70 46 72 6f 6d 2c 20 70 46 xtract(pFrom, pF
2dd0: 72 6f 6d 2d 3e 6e 55 73 65 64 2d 70 46 72 6f 6d rom->nUsed-pFrom
2de0: 2d 3e 69 43 75 72 73 6f 72 2c 20 70 54 6f 29 3b ->iCursor, pTo);
2df0: 0a 20 20 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f . pFrom->iCurso
2e00: 72 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 72 r = iCursor;. r
2e10: 65 74 75 72 6e 20 70 54 6f 2d 3e 6e 55 73 65 64 eturn pTo->nUsed
2e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 ;.}../*.** Copy
2e30: 4e 20 6c 69 6e 65 73 20 6f 66 20 74 65 78 74 20 N lines of text
2e40: 66 72 6f 6d 20 70 46 72 6f 6d 20 69 6e 74 6f 20 from pFrom into
2e50: 70 54 6f 2e 20 20 54 68 65 20 63 6f 70 79 20 62 pTo. The copy b
2e60: 65 67 69 6e 73 20 61 74 20 74 68 65 0a 2a 2a 20 egins at the.**
2e70: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 current cursor p
2e80: 6f 73 69 74 69 6f 6e 20 6f 66 20 70 49 6e 2e 20 osition of pIn.
2e90: 20 54 68 65 20 70 49 6e 20 63 75 72 73 6f 72 20 The pIn cursor
2ea0: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 is left pointing
2eb0: 0a 2a 2a 20 61 74 20 74 68 65 20 66 69 72 73 74 .** at the first
2ec0: 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20 character past
2ed0: 74 68 65 20 6c 61 73 74 20 5c 6e 20 63 6f 70 69 the last \n copi
2ee0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 6f ed..**.** If pTo
2ef0: 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 74 68 69 73 ==NULL then this
2f00: 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 routine simply
2f10: 73 6b 69 70 73 20 6f 76 65 72 20 4e 20 6c 69 6e skips over N lin
2f20: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 62 6c 6f 62 es..*/.void blob
2f30: 5f 63 6f 70 79 5f 6c 69 6e 65 73 28 42 6c 6f 62 _copy_lines(Blob
2f40: 20 2a 70 54 6f 2c 20 42 6c 6f 62 20 2a 70 46 72 *pTo, Blob *pFr
2f50: 6f 6d 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 om, int N){. ch
2f60: 61 72 20 2a 7a 20 3d 20 70 46 72 6f 6d 2d 3e 61 ar *z = pFrom->a
2f70: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 20 3d 20 Data;. int i =
2f80: 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a pFrom->iCursor;.
2f90: 20 20 69 6e 74 20 6e 20 3d 20 70 46 72 6f 6d 2d int n = pFrom-
2fa0: 3e 6e 55 73 65 64 3b 0a 20 20 69 6e 74 20 63 6e >nUsed;. int cn
2fb0: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 4e 3d t = 0;.. if( N=
2fc0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 =0 ) return;. w
2fd0: 68 69 6c 65 28 20 69 3c 6e 20 29 7b 0a 20 20 20 hile( i<n ){.
2fe0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 if( z[i]=='\n'
2ff0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a ){. cnt++;.
3000: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 4e if( cnt==N
3010: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b ){. i++;
3020: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
3030: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
3040: 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 i++;. }. if(
3050: 20 70 54 6f 20 29 7b 0a 20 20 20 20 62 6c 6f 62 pTo ){. blob
3060: 5f 61 70 70 65 6e 64 28 70 54 6f 2c 20 26 70 46 _append(pTo, &pF
3070: 72 6f 6d 2d 3e 61 44 61 74 61 5b 70 46 72 6f 6d rom->aData[pFrom
3080: 2d 3e 69 43 75 72 73 6f 72 5d 2c 20 69 20 2d 20 ->iCursor], i -
3090: 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 29 3b pFrom->iCursor);
30a0: 0a 20 20 7d 0a 20 20 70 46 72 6f 6d 2d 3e 69 43 . }. pFrom->iC
30b0: 75 72 73 6f 72 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a ursor = i;.}../*
30c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 .** Return true
30d0: 69 66 20 74 68 65 20 62 6c 6f 62 20 63 6f 6e 74 if the blob cont
30e0: 61 69 6e 73 20 61 20 76 61 6c 69 64 20 55 55 49 ains a valid UUI
30f0: 44 5f 53 49 5a 45 2d 64 69 67 69 74 20 62 61 73 D_SIZE-digit bas
3100: 65 31 36 20 69 64 65 6e 74 69 66 69 65 72 2e 0a e16 identifier..
3110: 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f 69 73 5f 75 */.int blob_is_u
3120: 75 69 64 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 uid(Blob *pBlob)
3130: 7b 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f 62 5f {. return blob_
3140: 73 69 7a 65 28 70 42 6c 6f 62 29 3d 3d 55 55 49 size(pBlob)==UUI
3150: 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 D_SIZE.
3160: 26 26 20 76 61 6c 69 64 61 74 65 31 36 28 62 6c && validate16(bl
3170: 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f 62 29 ob_buffer(pBlob)
3180: 2c 20 55 55 49 44 5f 53 49 5a 45 29 3b 0a 7d 0a , UUID_SIZE);.}.
3190: 69 6e 74 20 62 6c 6f 62 5f 69 73 5f 75 75 69 64 int blob_is_uuid
31a0: 5f 6e 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 _n(Blob *pBlob,
31b0: 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e int n){. return
31c0: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 blob_size(pBlob
31d0: 29 3d 3d 6e 20 26 26 20 76 61 6c 69 64 61 74 65 )==n && validate
31e0: 31 36 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 16(blob_buffer(p
31f0: 42 6c 6f 62 29 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a Blob), n);.}../*
3200: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 .** Return true
3210: 69 66 20 74 68 65 20 62 6c 6f 62 20 63 6f 6e 74 if the blob cont
3220: 61 69 6e 73 20 61 20 76 61 6c 69 64 20 33 32 2d ains a valid 32-
3230: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 53 74 bit integer. St
3240: 6f 72 65 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 ore.** the integ
3250: 65 72 20 76 61 6c 75 65 20 69 6e 20 2a 70 56 61 er value in *pVa
3260: 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 lue..*/.int blob
3270: 5f 69 73 5f 69 6e 74 28 42 6c 6f 62 20 2a 70 42 _is_int(Blob *pB
3280: 6c 6f 62 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 lob, int *pValue
3290: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
32a0: 2a 7a 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72 *z = blob_buffer
32b0: 28 70 42 6c 6f 62 29 3b 0a 20 20 69 6e 74 20 69 (pBlob);. int i
32c0: 2c 20 6e 2c 20 63 2c 20 76 3b 0a 20 20 6e 20 3d , n, c, v;. n =
32d0: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 blob_size(pBlob
32e0: 29 3b 0a 20 20 76 20 3d 20 30 3b 0a 20 20 66 6f );. v = 0;. fo
32f0: 72 28 69 3d 30 3b 20 69 3c 6e 20 26 26 20 28 63 r(i=0; i<n && (c
3300: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 69 = z[i])!=0 && i
3310: 73 64 69 67 69 74 28 63 29 3b 20 69 2b 2b 29 7b sdigit(c); i++){
3320: 0a 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 . v = v*10 +
3330: 63 20 2d 20 27 30 27 3b 0a 20 20 7d 0a 20 20 69 c - '0';. }. i
3340: 66 28 20 69 3d 3d 6e 20 29 7b 0a 20 20 20 20 2a f( i==n ){. *
3350: 70 56 61 6c 75 65 20 3d 20 76 3b 0a 20 20 20 20 pValue = v;.
3360: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 return 1;. }els
3370: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b e{. return 0;
3380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 . }.}../*.** Ze
3390: 72 6f 20 6f 72 20 72 65 73 65 74 20 61 6e 20 61 ro or reset an a
33a0: 72 72 61 79 20 6f 66 20 42 6c 6f 62 73 2e 0a 2a rray of Blobs..*
33b0: 2f 0a 76 6f 69 64 20 62 6c 6f 62 61 72 72 61 79 /.void blobarray
33c0: 5f 7a 65 72 6f 28 42 6c 6f 62 20 2a 61 42 6c 6f _zero(Blob *aBlo
33d0: 62 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 b, int n){. int
33e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 i;. for(i=0; i
33f0: 3c 6e 3b 20 69 2b 2b 29 20 62 6c 6f 62 5f 7a 65 <n; i++) blob_ze
3400: 72 6f 28 26 61 42 6c 6f 62 5b 69 5d 29 3b 0a 7d ro(&aBlob[i]);.}
3410: 0a 76 6f 69 64 20 62 6c 6f 62 61 72 72 61 79 5f .void blobarray_
3420: 72 65 73 65 74 28 42 6c 6f 62 20 2a 61 42 6c 6f reset(Blob *aBlo
3430: 62 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 b, int n){. int
3440: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 i;. for(i=0; i
3450: 3c 6e 3b 20 69 2b 2b 29 20 62 6c 6f 62 5f 72 65 <n; i++) blob_re
3460: 73 65 74 28 26 61 42 6c 6f 62 5b 69 5d 29 3b 0a set(&aBlob[i]);.
3470: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 }../*.** Parse a
3480: 20 62 6c 6f 62 20 69 6e 74 6f 20 73 70 61 63 65 blob into space
3490: 2d 73 65 70 61 72 61 74 65 64 20 74 6f 6b 65 6e -separated token
34a0: 73 2e 20 20 53 74 6f 72 65 20 65 61 63 68 20 74 s. Store each t
34b0: 6f 6b 65 6e 20 69 6e 0a 2a 2a 20 61 6e 20 65 6c oken in.** an el
34c0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 62 6c 6f ement of the blo
34d0: 62 61 72 72 61 79 20 61 54 6f 6b 65 6e 5b 5d 2e barray aToken[].
34e0: 20 20 61 54 6f 6b 65 6e 5b 5d 20 69 73 20 6e 54 aToken[] is nT
34f0: 6f 6b 65 6e 20 65 6c 65 6d 65 6e 74 73 20 69 6e oken elements in
3500: 0a 2a 2a 20 73 69 7a 65 2e 20 20 52 65 74 75 72 .** size. Retur
3510: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
3520: 74 6f 6b 65 6e 73 20 73 65 65 6e 2e 0a 2a 2f 0a tokens seen..*/.
3530: 69 6e 74 20 62 6c 6f 62 5f 74 6f 6b 65 6e 69 7a int blob_tokeniz
3540: 65 28 42 6c 6f 62 20 2a 70 49 6e 2c 20 42 6c 6f e(Blob *pIn, Blo
3550: 62 20 2a 61 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e b *aToken, int n
3560: 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b Token){. int i;
3570: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 . for(i=0; i<nT
3580: 6f 6b 65 6e 20 26 26 20 62 6c 6f 62 5f 74 6f 6b oken && blob_tok
3590: 65 6e 28 70 49 6e 2c 20 26 61 54 6f 6b 65 6e 5b en(pIn, &aToken[
35a0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 72 65 i]); i++){}. re
35b0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn i;.}../*.**
35c0: 20 44 6f 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 Do printf-style
35d0: 20 73 74 72 69 6e 67 20 72 65 6e 64 65 72 69 6e string renderin
35e0: 67 20 61 6e 64 20 61 70 70 65 6e 64 20 74 68 65 g and append the
35f0: 20 72 65 73 75 6c 74 73 20 74 6f 20 61 20 62 6c results to a bl
3600: 6f 62 2e 0a 2a 2f 0a 76 6f 69 64 20 62 6c 6f 62 ob..*/.void blob
3610: 5f 61 70 70 65 6e 64 66 28 42 6c 6f 62 20 2a 70 _appendf(Blob *p
3620: 42 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 Blob, const char
3630: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
3640: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
3650: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 va_start(ap, zF
3660: 6f 72 6d 61 74 29 3b 0a 20 20 76 78 70 72 69 6e ormat);. vxprin
3670: 74 66 28 70 42 6c 6f 62 2c 20 7a 46 6f 72 6d 61 tf(pBlob, zForma
3680: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 t, ap);. va_end
3690: 28 61 70 29 3b 0a 7d 0a 76 6f 69 64 20 62 6c 6f (ap);.}.void blo
36a0: 62 5f 76 61 70 70 65 6e 64 66 28 42 6c 6f 62 20 b_vappendf(Blob
36b0: 2a 70 42 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 *pBlob, const ch
36c0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f ar *zFormat, va_
36d0: 6c 69 73 74 20 61 70 29 7b 0a 20 20 76 78 70 72 list ap){. vxpr
36e0: 69 6e 74 66 28 70 42 6c 6f 62 2c 20 7a 46 6f 72 intf(pBlob, zFor
36f0: 6d 61 74 2c 20 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a mat, ap);.}../*.
3700: 2a 2a 20 49 6e 69 74 61 6c 69 7a 65 20 61 20 62 ** Initalize a b
3710: 6c 6f 62 20 74 6f 20 74 68 65 20 64 61 74 61 20 lob to the data
3720: 6f 6e 20 61 6e 20 69 6e 70 75 74 20 63 68 61 6e on an input chan
3730: 6e 65 6c 2e 20 20 52 65 74 75 72 6e 20 0a 2a 2a nel. Return .**
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
3750: 79 74 65 73 20 72 65 61 64 20 69 6e 74 6f 20 74 ytes read into t
3760: 68 65 20 62 6c 6f 62 2e 20 20 41 6e 79 20 70 72 he blob. Any pr
3770: 69 6f 72 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f ior content.** o
3780: 66 20 74 68 65 20 62 6c 6f 62 20 69 73 20 64 69 f the blob is di
3790: 73 63 61 72 64 65 64 2c 20 6e 6f 74 20 66 72 65 scarded, not fre
37a0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f ed..*/.int blob_
37b0: 72 65 61 64 5f 66 72 6f 6d 5f 63 68 61 6e 6e 65 read_from_channe
37c0: 6c 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 46 l(Blob *pBlob, F
37d0: 49 4c 45 20 2a 69 6e 2c 20 69 6e 74 20 6e 54 6f ILE *in, int nTo
37e0: 52 65 61 64 29 7b 0a 20 20 73 69 7a 65 5f 74 20 Read){. size_t
37f0: 6e 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 n;. blob_zero(p
3800: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 6e 54 6f Blob);. if( nTo
3810: 52 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 63 68 Read<0 ){. ch
3820: 61 72 20 7a 42 75 66 5b 31 30 30 30 30 5d 3b 0a ar zBuf[10000];.
3830: 20 20 20 20 77 68 69 6c 65 28 20 21 66 65 6f 66 while( !feof
3840: 28 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 6e 20 (in) ){. n
3850: 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c = fread(zBuf, 1,
3860: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 sizeof(zBuf), i
3870: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e n);. if( n>
3880: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 0 ){. blo
3890: 62 5f 61 70 70 65 6e 64 28 70 42 6c 6f 62 2c 20 b_append(pBlob,
38a0: 7a 42 75 66 2c 20 6e 29 3b 0a 20 20 20 20 20 20 zBuf, n);.
38b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b }. }. }else{
38c0: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 . blob_resize
38d0: 28 70 42 6c 6f 62 2c 20 6e 54 6f 52 65 61 64 29 (pBlob, nToRead)
38e0: 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 ;. n = fread(
38f0: 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f blob_buffer(pBlo
3900: 62 29 2c 20 31 2c 20 6e 54 6f 52 65 61 64 2c 20 b), 1, nToRead,
3910: 69 6e 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 in);. blob_re
3920: 73 69 7a 65 28 70 42 6c 6f 62 2c 20 6e 29 3b 0a size(pBlob, n);.
3930: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f }. return blo
3940: 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 3b 0a 7d b_size(pBlob);.}
3950: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 ../*.** Initiali
3960: 7a 65 20 61 20 62 6c 6f 62 20 74 6f 20 62 65 20 ze a blob to be
3970: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 the content of a
3980: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 66 file. If the f
3990: 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 62 6c ilename.** is bl
39a0: 61 6e 6b 20 6f 72 20 22 2d 22 20 74 68 65 6e 20 ank or "-" then
39b0: 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 read from standa
39c0: 72 64 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 rd input..**.**
39d0: 41 6e 79 20 70 72 69 6f 72 20 63 6f 6e 74 65 6e Any prior conten
39e0: 74 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 69 73 t of the blob is
39f0: 20 64 69 73 63 61 72 64 65 64 2c 20 6e 6f 74 20 discarded, not
3a00: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 freed..**.** Ret
3a10: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f urn the number o
3a20: 66 20 62 79 74 65 73 20 72 65 61 64 2e 20 20 52 f bytes read. R
3a30: 65 74 75 72 6e 20 2d 31 20 66 6f 72 20 61 6e 20 eturn -1 for an
3a40: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 62 6c error..*/.int bl
3a50: 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c ob_read_from_fil
3a60: 65 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 63 e(Blob *pBlob, c
3a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 onst char *zFile
3a80: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 73 69 7a name){. int siz
3a90: 65 2c 20 67 6f 74 3b 0a 20 20 46 49 4c 45 20 2a e, got;. FILE *
3aa0: 69 6e 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e in;. if( zFilen
3ab0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e ame==0 || zFilen
3ac0: 61 6d 65 5b 30 5d 3d 3d 30 0a 20 20 20 20 20 20 ame[0]==0.
3ad0: 20 20 7c 7c 20 28 7a 46 69 6c 65 6e 61 6d 65 5b || (zFilename[
3ae0: 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65 0]=='-' && zFile
3af0: 6e 61 6d 65 5b 31 5d 3d 3d 30 29 20 29 7b 0a 20 name[1]==0) ){.
3b00: 20 20 20 72 65 74 75 72 6e 20 62 6c 6f 62 5f 72 return blob_r
3b10: 65 61 64 5f 66 72 6f 6d 5f 63 68 61 6e 6e 65 6c ead_from_channel
3b20: 28 70 42 6c 6f 62 2c 20 73 74 64 69 6e 2c 20 2d (pBlob, stdin, -
3b30: 31 29 3b 0a 20 20 7d 0a 20 20 73 69 7a 65 20 3d 1);. }. size =
3b40: 20 66 69 6c 65 5f 73 69 7a 65 28 7a 46 69 6c 65 file_size(zFile
3b50: 6e 61 6d 65 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 name);. blob_ze
3b60: 72 6f 28 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 ro(pBlob);. if(
3b70: 20 73 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 66 size<0 ){. f
3b80: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 20 ossil_panic("no
3b90: 73 75 63 68 20 66 69 6c 65 3a 20 25 73 22 2c 20 such file: %s",
3ba0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a zFilename);. }.
3bb0: 20 20 69 66 28 20 73 69 7a 65 3d 3d 30 20 29 7b if( size==0 ){
3bc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 . return 0;.
3bd0: 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 }. blob_resize
3be0: 28 70 42 6c 6f 62 2c 20 73 69 7a 65 29 3b 0a 20 (pBlob, size);.
3bf0: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c in = fopen(zFil
3c00: 65 6e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 ename, "rb");.
3c10: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 if( in==0 ){.
3c20: 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 63 fossil_panic("c
3c30: 61 6e 6e 6f 74 20 6f 70 65 6e 20 25 73 20 66 6f annot open %s fo
3c40: 72 20 72 65 61 64 69 6e 67 22 2c 20 7a 46 69 6c r reading", zFil
3c50: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 67 6f ename);. }. go
3c60: 74 20 3d 20 66 72 65 61 64 28 62 6c 6f 62 5f 62 t = fread(blob_b
3c70: 75 66 66 65 72 28 70 42 6c 6f 62 29 2c 20 31 2c uffer(pBlob), 1,
3c80: 20 73 69 7a 65 2c 20 69 6e 29 3b 0a 20 20 66 63 size, in);. fc
3c90: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 lose(in);. if(
3ca0: 67 6f 74 3c 73 69 7a 65 20 29 7b 0a 20 20 20 20 got<size ){.
3cb0: 62 6c 6f 62 5f 72 65 73 69 7a 65 28 70 42 6c 6f blob_resize(pBlo
3cc0: 62 2c 20 67 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 b, got);. }. r
3cd0: 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a eturn got;.}../*
3ce0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f .** Write the co
3cf0: 6e 74 65 6e 74 20 6f 66 20 61 20 62 6c 6f 62 20 ntent of a blob
3d00: 69 6e 74 6f 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a into a file..**.
3d10: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 6e 61 ** If the filena
3d20: 6d 65 20 69 73 20 62 6c 61 6e 6b 20 6f 72 20 22 me is blank or "
3d30: 2d 22 20 74 68 65 6e 20 77 72 69 74 65 20 74 6f -" then write to
3d40: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 standard output
3d50: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ..**.** Return t
3d60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
3d70: 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 es written..*/.i
3d80: 6e 74 20 62 6c 6f 62 5f 77 72 69 74 65 5f 74 6f nt blob_write_to
3d90: 5f 66 69 6c 65 28 42 6c 6f 62 20 2a 70 42 6c 6f _file(Blob *pBlo
3da0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a b, const char *z
3db0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 46 49 4c Filename){. FIL
3dc0: 45 20 2a 6f 75 74 3b 0a 20 20 69 6e 74 20 6e 65 E *out;. int ne
3dd0: 65 64 54 6f 43 6c 6f 73 65 3b 0a 20 20 69 6e 74 edToClose;. int
3de0: 20 77 72 6f 74 65 3b 0a 0a 20 20 69 66 28 20 7a wrote;.. if( z
3df0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 7c Filename[0]==0 |
3e00: 7c 20 28 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d | (zFilename[0]=
3e10: 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65 6e 61 6d ='-' && zFilenam
3e20: 65 5b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 e[1]==0) ){.
3e30: 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 out = stdout;.
3e40: 20 20 6e 65 65 64 54 6f 43 6c 6f 73 65 20 3d 20 needToClose =
3e50: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0;. }else{.
3e60: 69 6e 74 20 69 2c 20 6e 4e 61 6d 65 3b 0a 20 20 int i, nName;.
3e70: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 7a char *zName, z
3e80: 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 20 20 Buf[1000];..
3e90: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a nName = strlen(z
3ea0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 Filename);. i
3eb0: 66 28 20 6e 4e 61 6d 65 3e 3d 73 69 7a 65 6f 66 f( nName>=sizeof
3ec0: 28 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 20 20 (zBuf) ){.
3ed0: 7a 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 zName = mprintf(
3ee0: 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 "%s", zFilename)
3ef0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
3f00: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b zName = zBuf;
3f10: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 4e . strcpy(zN
3f20: 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b ame, zFilename);
3f30: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e 61 6d 65 . }. nName
3f40: 20 3d 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79 = file_simplify
3f50: 5f 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20 6e 4e 61 _name(zName, nNa
3f60: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 me);. for(i=1
3f70: 3b 20 69 3c 6e 4e 61 6d 65 3b 20 69 2b 2b 29 7b ; i<nName; i++){
3f80: 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 . if( zName
3f90: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 [i]=='/' ){.
3fa0: 20 20 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 zName[i] = 0
3fb0: 3b 0a 23 69 66 64 65 66 20 5f 5f 4d 49 4e 47 57 ;.#ifdef __MINGW
3fc0: 33 32 5f 5f 0a 20 20 20 20 20 20 20 20 2f 2a 0a 32__. /*.
3fd0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 6e 20 57 69 ** On Wi
3fe0: 6e 64 6f 77 73 2c 20 6c 6f 63 61 6c 20 70 61 74 ndows, local pat
3ff0: 68 20 6c 6f 6f 6b 73 20 6c 69 6b 65 3a 20 43 3a h looks like: C:
4000: 2f 64 65 76 65 6c 6f 70 2f 70 72 6f 6a 65 63 74 /develop/project
4010: 2f 66 69 6c 65 2e 74 78 74 0a 20 20 20 20 20 20 /file.txt.
4020: 20 20 2a 2a 20 54 68 65 20 69 66 20 73 74 6f 70 ** The if stop
4030: 73 20 75 73 20 66 72 6f 6d 20 74 72 79 69 6e 67 s us from trying
4040: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 69 72 to create a dir
4050: 65 63 74 6f 72 79 20 6f 66 20 61 20 64 72 69 76 ectory of a driv
4060: 65 20 6c 65 74 74 65 72 0a 20 20 20 20 20 20 20 e letter.
4070: 20 2a 2a 20 43 3a 20 69 6e 20 74 68 69 73 20 65 ** C: in this e
4080: 78 61 6d 70 6c 65 2e 0a 20 20 20 20 20 20 20 20 xample..
4090: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 */. if( !
40a0: 28 69 3d 3d 32 20 26 26 20 7a 4e 61 6d 65 5b 31 (i==2 && zName[1
40b0: 5d 3d 3d 27 3a 27 29 20 29 7b 0a 23 65 6e 64 69 ]==':') ){.#endi
40c0: 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 f. if(
40d0: 66 69 6c 65 5f 6d 6b 64 69 72 28 7a 4e 61 6d 65 file_mkdir(zName
40e0: 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 , 1) ){.
40f0: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 fossil_panic
4100: 28 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 ("unable to crea
4110: 74 65 20 64 69 72 65 63 74 6f 72 79 20 25 73 22 te directory %s"
4120: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 , zName);.
4130: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 5f 5f 4d }.#ifdef __M
4140: 49 4e 47 57 33 32 5f 5f 0a 20 20 20 20 20 20 20 INGW32__.
4150: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 }.#endif.
4160: 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 27 2f 27 zName[i] = '/'
4170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
4180: 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 out = fopen(
4190: 7a 4e 61 6d 65 2c 20 22 77 62 22 29 3b 0a 20 20 zName, "wb");.
41a0: 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a if( out==0 ){.
41b0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e fossil_pan
41c0: 69 63 28 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 ic("unable to op
41d0: 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22 20 66 en file \"%s\" f
41e0: 6f 72 20 77 72 69 74 69 6e 67 22 2c 20 7a 4e 61 or writing", zNa
41f0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e me);. }. n
4200: 65 65 64 54 6f 43 6c 6f 73 65 20 3d 20 31 3b 0a eedToClose = 1;.
4210: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21 3d 7a if( zName!=z
4220: 42 75 66 20 29 20 66 72 65 65 28 7a 4e 61 6d 65 Buf ) free(zName
4230: 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 69 73 );. }. blob_is
4240: 5f 69 6e 69 74 28 70 42 6c 6f 62 29 3b 0a 20 20 _init(pBlob);.
4250: 77 72 6f 74 65 20 3d 20 66 77 72 69 74 65 28 62 wrote = fwrite(b
4260: 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f 62 lob_buffer(pBlob
4270: 29 2c 20 31 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 ), 1, blob_size(
4280: 70 42 6c 6f 62 29 2c 20 6f 75 74 29 3b 0a 20 20 pBlob), out);.
4290: 69 66 28 20 6e 65 65 64 54 6f 43 6c 6f 73 65 20 if( needToClose
42a0: 29 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 ) fclose(out);.
42b0: 20 69 66 28 20 77 72 6f 74 65 21 3d 62 6c 6f 62 if( wrote!=blob
42c0: 5f 73 69 7a 65 28 70 42 6c 6f 62 29 20 29 7b 0a _size(pBlob) ){.
42d0: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 fossil_panic
42e0: 28 22 73 68 6f 72 74 20 77 72 69 74 65 3a 20 25 ("short write: %
42f0: 64 20 6f 66 20 25 64 20 62 79 74 65 73 20 74 6f d of %d bytes to
4300: 20 25 73 22 2c 20 77 72 6f 74 65 2c 0a 20 20 20 %s", wrote,.
4310: 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 blob_size(pB
4320: 6c 6f 62 29 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 lob), zFilename)
4330: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 77 ;. }. return w
4340: 72 6f 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 rote;.}../*.** C
4350: 6f 6d 70 72 65 73 73 20 61 20 62 6c 6f 62 20 70 ompress a blob p
4360: 49 6e 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 In. Store the r
4370: 65 73 75 6c 74 20 69 6e 20 70 4f 75 74 2e 20 20 esult in pOut.
4380: 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 49 6e It is ok for pIn
4390: 20 61 6e 64 0a 2a 2a 20 70 4f 75 74 20 74 6f 20 and.** pOut to
43a0: 62 65 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 be the same blob
43b0: 2e 20 0a 2a 2a 20 0a 2a 2a 20 70 4f 75 74 20 6d . .** .** pOut m
43c0: 75 73 74 20 65 69 74 68 65 72 20 62 65 20 74 68 ust either be th
43d0: 65 20 73 61 6d 65 20 61 73 20 70 49 6e 20 6f 72 e same as pIn or
43e0: 20 65 6c 73 65 20 75 6e 69 6e 69 74 69 61 6c 69 else uninitiali
43f0: 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 62 6c 6f zed..*/.void blo
4400: 62 5f 63 6f 6d 70 72 65 73 73 28 42 6c 6f 62 20 b_compress(Blob
4410: 2a 70 49 6e 2c 20 42 6c 6f 62 20 2a 70 4f 75 74 *pIn, Blob *pOut
4420: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e ){. unsigned in
4430: 74 20 6e 49 6e 20 3d 20 62 6c 6f 62 5f 73 69 7a t nIn = blob_siz
4440: 65 28 70 49 6e 29 3b 0a 20 20 75 6e 73 69 67 6e e(pIn);. unsign
4450: 65 64 20 69 6e 74 20 6e 4f 75 74 20 3d 20 31 33 ed int nOut = 13
4460: 20 2b 20 6e 49 6e 20 2b 20 28 6e 49 6e 2b 39 39 + nIn + (nIn+99
4470: 39 29 2f 31 30 30 30 3b 0a 20 20 75 6e 73 69 67 9)/1000;. unsig
4480: 6e 65 64 20 6c 6f 6e 67 20 69 6e 74 20 6e 4f 75 ned long int nOu
4490: 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 t2;. unsigned c
44a0: 68 61 72 20 2a 6f 75 74 42 75 66 3b 0a 20 20 42 har *outBuf;. B
44b0: 6c 6f 62 20 74 65 6d 70 3b 0a 20 20 62 6c 6f 62 lob temp;. blob
44c0: 5f 7a 65 72 6f 28 26 74 65 6d 70 29 3b 0a 20 20 _zero(&temp);.
44d0: 62 6c 6f 62 5f 72 65 73 69 7a 65 28 26 74 65 6d blob_resize(&tem
44e0: 70 2c 20 6e 4f 75 74 2b 34 29 3b 0a 20 20 6f 75 p, nOut+4);. ou
44f0: 74 42 75 66 20 3d 20 28 75 6e 73 69 67 6e 65 64 tBuf = (unsigned
4500: 20 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66 char*)blob_buff
4510: 65 72 28 26 74 65 6d 70 29 3b 0a 20 20 6f 75 74 er(&temp);. out
4520: 42 75 66 5b 30 5d 20 3d 20 6e 49 6e 3e 3e 32 34 Buf[0] = nIn>>24
4530: 20 26 20 30 78 66 66 3b 0a 20 20 6f 75 74 42 75 & 0xff;. outBu
4540: 66 5b 31 5d 20 3d 20 6e 49 6e 3e 3e 31 36 20 26 f[1] = nIn>>16 &
4550: 20 30 78 66 66 3b 0a 20 20 6f 75 74 42 75 66 5b 0xff;. outBuf[
4560: 32 5d 20 3d 20 6e 49 6e 3e 3e 38 20 26 20 30 78 2] = nIn>>8 & 0x
4570: 66 66 3b 0a 20 20 6f 75 74 42 75 66 5b 33 5d 20 ff;. outBuf[3]
4580: 3d 20 6e 49 6e 20 26 20 30 78 66 66 3b 0a 20 20 = nIn & 0xff;.
4590: 6e 4f 75 74 32 20 3d 20 28 6c 6f 6e 67 20 69 6e nOut2 = (long in
45a0: 74 29 6e 4f 75 74 3b 0a 20 20 63 6f 6d 70 72 65 t)nOut;. compre
45b0: 73 73 28 26 6f 75 74 42 75 66 5b 34 5d 2c 20 26 ss(&outBuf[4], &
45c0: 6e 4f 75 74 32 2c 0a 20 20 20 20 20 20 20 20 20 nOut2,.
45d0: 20 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 (unsigned char
45e0: 2a 29 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 49 *)blob_buffer(pI
45f0: 6e 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 70 49 n), blob_size(pI
4600: 6e 29 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d n));. if( pOut=
4610: 3d 70 49 6e 20 29 20 62 6c 6f 62 5f 72 65 73 65 =pIn ) blob_rese
4620: 74 28 70 4f 75 74 29 3b 0a 20 20 62 6c 6f 62 5f t(pOut);. blob_
4630: 69 73 5f 72 65 73 65 74 28 70 4f 75 74 29 3b 0a is_reset(pOut);.
4640: 20 20 2a 70 4f 75 74 20 3d 20 74 65 6d 70 3b 0a *pOut = temp;.
4650: 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 70 4f blob_resize(pO
4660: 75 74 2c 20 6e 4f 75 74 32 2b 34 29 3b 0a 7d 0a ut, nOut2+4);.}.
4670: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 ./*.** COMMAND:
4680: 74 65 73 74 2d 63 6f 6d 70 72 65 73 73 0a 2a 2f test-compress.*/
4690: 0a 76 6f 69 64 20 63 6f 6d 70 72 65 73 73 5f 63 .void compress_c
46a0: 6d 64 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 md(void){. Blob
46b0: 20 66 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 f;. if( g.argc
46c0: 21 3d 34 20 29 20 75 73 61 67 65 28 22 49 4e 50 !=4 ) usage("INP
46d0: 55 54 46 49 4c 45 20 4f 55 54 50 55 54 46 49 4c UTFILE OUTPUTFIL
46e0: 45 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 61 64 E");. blob_read
46f0: 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 66 2c 20 67 _from_file(&f, g
4700: 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 62 6c 6f .argv[2]);. blo
4710: 62 5f 63 6f 6d 70 72 65 73 73 28 26 66 2c 20 26 b_compress(&f, &
4720: 66 29 3b 0a 20 20 62 6c 6f 62 5f 77 72 69 74 65 f);. blob_write
4730: 5f 74 6f 5f 66 69 6c 65 28 26 66 2c 20 67 2e 61 _to_file(&f, g.a
4740: 72 67 76 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a rgv[3]);.}../*.*
4750: 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 63 * Compress the c
4760: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 oncatenation of
4770: 61 20 62 6c 6f 62 73 20 70 49 6e 31 20 61 6e 64 a blobs pIn1 and
4780: 20 70 49 6e 32 2e 20 20 53 74 6f 72 65 20 74 68 pIn2. Store th
4790: 65 20 72 65 73 75 6c 74 20 0a 2a 2a 20 69 6e 20 e result .** in
47a0: 70 4f 75 74 2e 20 0a 2a 2a 20 0a 2a 2a 20 70 4f pOut. .** .** pO
47b0: 75 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 ut must be eithe
47c0: 72 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 r uninitialized
47d0: 6f 72 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 or must be the s
47e0: 61 6d 65 20 61 73 20 65 69 74 68 65 72 20 70 49 ame as either pI
47f0: 6e 31 20 6f 72 0a 2a 2a 20 70 49 6e 32 2e 0a 2a n1 or.** pIn2..*
4800: 2f 0a 76 6f 69 64 20 62 6c 6f 62 5f 63 6f 6d 70 /.void blob_comp
4810: 72 65 73 73 32 28 42 6c 6f 62 20 2a 70 49 6e 31 ress2(Blob *pIn1
4820: 2c 20 42 6c 6f 62 20 2a 70 49 6e 32 2c 20 42 6c , Blob *pIn2, Bl
4830: 6f 62 20 2a 70 4f 75 74 29 7b 0a 20 20 75 6e 73 ob *pOut){. uns
4840: 69 67 6e 65 64 20 69 6e 74 20 6e 49 6e 20 3d 20 igned int nIn =
4850: 62 6c 6f 62 5f 73 69 7a 65 28 70 49 6e 31 29 20 blob_size(pIn1)
4860: 2b 20 62 6c 6f 62 5f 73 69 7a 65 28 70 49 6e 32 + blob_size(pIn2
4870: 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e );. unsigned in
4880: 74 20 6e 4f 75 74 20 3d 20 31 33 20 2b 20 6e 49 t nOut = 13 + nI
4890: 6e 20 2b 20 28 6e 49 6e 2b 39 39 39 29 2f 31 30 n + (nIn+999)/10
48a0: 30 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 00;. unsigned c
48b0: 68 61 72 20 2a 6f 75 74 42 75 66 3b 0a 20 20 7a har *outBuf;. z
48c0: 5f 73 74 72 65 61 6d 20 73 74 72 65 61 6d 3b 0a _stream stream;.
48d0: 20 20 42 6c 6f 62 20 74 65 6d 70 3b 0a 20 20 62 Blob temp;. b
48e0: 6c 6f 62 5f 7a 65 72 6f 28 26 74 65 6d 70 29 3b lob_zero(&temp);
48f0: 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 26 . blob_resize(&
4900: 74 65 6d 70 2c 20 6e 4f 75 74 2b 34 29 3b 0a 20 temp, nOut+4);.
4910: 20 6f 75 74 42 75 66 20 3d 20 28 75 6e 73 69 67 outBuf = (unsig
4920: 6e 65 64 20 63 68 61 72 2a 29 62 6c 6f 62 5f 62 ned char*)blob_b
4930: 75 66 66 65 72 28 26 74 65 6d 70 29 3b 0a 20 20 uffer(&temp);.
4940: 6f 75 74 42 75 66 5b 30 5d 20 3d 20 6e 49 6e 3e outBuf[0] = nIn>
4950: 3e 32 34 20 26 20 30 78 66 66 3b 0a 20 20 6f 75 >24 & 0xff;. ou
4960: 74 42 75 66 5b 31 5d 20 3d 20 6e 49 6e 3e 3e 31 tBuf[1] = nIn>>1
4970: 36 20 26 20 30 78 66 66 3b 0a 20 20 6f 75 74 42 6 & 0xff;. outB
4980: 75 66 5b 32 5d 20 3d 20 6e 49 6e 3e 3e 38 20 26 uf[2] = nIn>>8 &
4990: 20 30 78 66 66 3b 0a 20 20 6f 75 74 42 75 66 5b 0xff;. outBuf[
49a0: 33 5d 20 3d 20 6e 49 6e 20 26 20 30 78 66 66 3b 3] = nIn & 0xff;
49b0: 0a 20 20 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 . stream.zalloc
49c0: 20 3d 20 28 61 6c 6c 6f 63 5f 66 75 6e 63 29 30 = (alloc_func)0
49d0: 3b 0a 20 20 73 74 72 65 61 6d 2e 7a 66 72 65 65 ;. stream.zfree
49e0: 20 3d 20 28 66 72 65 65 5f 66 75 6e 63 29 30 3b = (free_func)0;
49f0: 0a 20 20 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 . stream.opaque
4a00: 20 3d 20 30 3b 0a 20 20 73 74 72 65 61 6d 2e 61 = 0;. stream.a
4a10: 76 61 69 6c 5f 6f 75 74 20 3d 20 6e 4f 75 74 3b vail_out = nOut;
4a20: 0a 20 20 73 74 72 65 61 6d 2e 6e 65 78 74 5f 6f . stream.next_o
4a30: 75 74 20 3d 20 26 6f 75 74 42 75 66 5b 34 5d 3b ut = &outBuf[4];
4a40: 0a 20 20 64 65 66 6c 61 74 65 49 6e 69 74 28 26 . deflateInit(&
4a50: 73 74 72 65 61 6d 2c 20 39 29 3b 0a 20 20 73 74 stream, 9);. st
4a60: 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d 20 ream.avail_in =
4a70: 62 6c 6f 62 5f 73 69 7a 65 28 70 49 6e 31 29 3b blob_size(pIn1);
4a80: 0a 20 20 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 . stream.next_i
4a90: 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 n = (unsigned ch
4aa0: 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66 65 72 28 ar*)blob_buffer(
4ab0: 70 49 6e 31 29 3b 0a 20 20 64 65 66 6c 61 74 65 pIn1);. deflate
4ac0: 28 26 73 74 72 65 61 6d 2c 20 30 29 3b 0a 20 20 (&stream, 0);.
4ad0: 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 stream.avail_in
4ae0: 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70 49 6e 32 = blob_size(pIn2
4af0: 29 3b 0a 20 20 73 74 72 65 61 6d 2e 6e 65 78 74 );. stream.next
4b00: 5f 69 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 _in = (unsigned
4b10: 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66 65 char*)blob_buffe
4b20: 72 28 70 49 6e 32 29 3b 0a 20 20 64 65 66 6c 61 r(pIn2);. defla
4b30: 74 65 28 26 73 74 72 65 61 6d 2c 20 30 29 3b 0a te(&stream, 0);.
4b40: 20 20 64 65 66 6c 61 74 65 28 26 73 74 72 65 61 deflate(&strea
4b50: 6d 2c 20 5a 5f 46 49 4e 49 53 48 29 3b 0a 20 20 m, Z_FINISH);.
4b60: 62 6c 6f 62 5f 72 65 73 69 7a 65 28 26 74 65 6d blob_resize(&tem
4b70: 70 2c 20 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f p, stream.total_
4b80: 6f 75 74 20 2b 20 34 29 3b 0a 20 20 64 65 66 6c out + 4);. defl
4b90: 61 74 65 45 6e 64 28 26 73 74 72 65 61 6d 29 3b ateEnd(&stream);
4ba0: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 70 49 6e . if( pOut==pIn
4bb0: 31 20 29 20 62 6c 6f 62 5f 72 65 73 65 74 28 70 1 ) blob_reset(p
4bc0: 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 Out);. if( pOut
4bd0: 3d 3d 70 49 6e 32 20 29 20 62 6c 6f 62 5f 72 65 ==pIn2 ) blob_re
4be0: 73 65 74 28 70 4f 75 74 29 3b 0a 20 20 62 6c 6f set(pOut);. blo
4bf0: 62 5f 69 73 5f 72 65 73 65 74 28 70 4f 75 74 29 b_is_reset(pOut)
4c00: 3b 0a 20 20 2a 70 4f 75 74 20 3d 20 74 65 6d 70 ;. *pOut = temp
4c10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 ;.}../*.** COMMA
4c20: 4e 44 3a 20 74 65 73 74 2d 63 6f 6d 70 72 65 73 ND: test-compres
4c30: 73 2d 32 0a 2a 2f 0a 76 6f 69 64 20 63 6f 6d 70 s-2.*/.void comp
4c40: 72 65 73 73 32 5f 63 6d 64 28 76 6f 69 64 29 7b ress2_cmd(void){
4c50: 0a 20 20 42 6c 6f 62 20 66 31 2c 20 66 32 3b 0a . Blob f1, f2;.
4c60: 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 35 20 if( g.argc!=5
4c70: 29 20 75 73 61 67 65 28 22 49 4e 50 55 54 46 49 ) usage("INPUTFI
4c80: 4c 45 31 20 49 4e 50 55 54 46 49 4c 45 32 20 4f LE1 INPUTFILE2 O
4c90: 55 54 50 55 54 46 49 4c 45 22 29 3b 0a 20 20 62 UTPUTFILE");. b
4ca0: 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 lob_read_from_fi
4cb0: 6c 65 28 26 66 31 2c 20 67 2e 61 72 67 76 5b 32 le(&f1, g.argv[2
4cc0: 5d 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 61 64 5f ]);. blob_read_
4cd0: 66 72 6f 6d 5f 66 69 6c 65 28 26 66 32 2c 20 67 from_file(&f2, g
4ce0: 2e 61 72 67 76 5b 33 5d 29 3b 0a 20 20 62 6c 6f .argv[3]);. blo
4cf0: 62 5f 63 6f 6d 70 72 65 73 73 32 28 26 66 31 2c b_compress2(&f1,
4d00: 20 26 66 32 2c 20 26 66 31 29 3b 0a 20 20 62 6c &f2, &f1);. bl
4d10: 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 6c 65 ob_write_to_file
4d20: 28 26 66 31 2c 20 67 2e 61 72 67 76 5b 34 5d 29 (&f1, g.argv[4])
4d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 63 6f 6d ;.}../*.** Uncom
4d40: 70 72 65 73 73 20 62 6c 6f 62 20 70 49 6e 20 61 press blob pIn a
4d50: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 nd store the res
4d60: 75 6c 74 20 69 6e 20 70 4f 75 74 2e 20 20 49 74 ult in pOut. It
4d70: 20 69 73 20 6f 6b 20 66 6f 72 20 70 49 6e 20 61 is ok for pIn a
4d80: 6e 64 0a 2a 2a 20 70 4f 75 74 20 74 6f 20 62 65 nd.** pOut to be
4d90: 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 2e 0a the same blob..
4da0: 2a 2a 0a 2a 2a 20 70 4f 75 74 20 6d 75 73 74 20 **.** pOut must
4db0: 62 65 20 65 69 74 68 65 72 20 75 6e 69 6e 69 74 be either uninit
4dc0: 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73 ialized or the s
4dd0: 61 6d 65 20 61 73 20 70 49 6e 2e 0a 2a 2f 0a 69 ame as pIn..*/.i
4de0: 6e 74 20 62 6c 6f 62 5f 75 6e 63 6f 6d 70 72 65 nt blob_uncompre
4df0: 73 73 28 42 6c 6f 62 20 2a 70 49 6e 2c 20 42 6c ss(Blob *pIn, Bl
4e00: 6f 62 20 2a 70 4f 75 74 29 7b 0a 20 20 75 6e 73 ob *pOut){. uns
4e10: 69 67 6e 65 64 20 69 6e 74 20 6e 4f 75 74 3b 0a igned int nOut;.
4e20: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
4e30: 2a 69 6e 42 75 66 3b 0a 20 20 75 6e 73 69 67 6e *inBuf;. unsign
4e40: 65 64 20 69 6e 74 20 6e 49 6e 20 3d 20 62 6c 6f ed int nIn = blo
4e50: 62 5f 73 69 7a 65 28 70 49 6e 29 3b 0a 20 20 42 b_size(pIn);. B
4e60: 6c 6f 62 20 74 65 6d 70 3b 0a 20 20 69 6e 74 20 lob temp;. int
4e70: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c rc;. unsigned l
4e80: 6f 6e 67 20 69 6e 74 20 6e 4f 75 74 32 3b 0a 20 ong int nOut2;.
4e90: 20 69 66 28 20 6e 49 6e 3c 3d 34 20 29 7b 0a 20 if( nIn<=4 ){.
4ea0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
4eb0: 0a 20 20 69 6e 42 75 66 20 3d 20 28 75 6e 73 69 . inBuf = (unsi
4ec0: 67 6e 65 64 20 63 68 61 72 2a 29 62 6c 6f 62 5f gned char*)blob_
4ed0: 62 75 66 66 65 72 28 70 49 6e 29 3b 0a 20 20 6e buffer(pIn);. n
4ee0: 4f 75 74 20 3d 20 28 69 6e 42 75 66 5b 30 5d 3c Out = (inBuf[0]<
4ef0: 3c 32 34 29 20 2b 20 28 69 6e 42 75 66 5b 31 5d <24) + (inBuf[1]
4f00: 3c 3c 31 36 29 20 2b 20 28 69 6e 42 75 66 5b 32 <<16) + (inBuf[2
4f10: 5d 3c 3c 38 29 20 2b 20 69 6e 42 75 66 5b 33 5d ]<<8) + inBuf[3]
4f20: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 ;. blob_zero(&t
4f30: 65 6d 70 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 emp);. blob_res
4f40: 69 7a 65 28 26 74 65 6d 70 2c 20 6e 4f 75 74 2b ize(&temp, nOut+
4f50: 31 29 3b 0a 20 20 6e 4f 75 74 32 20 3d 20 28 6c 1);. nOut2 = (l
4f60: 6f 6e 67 20 69 6e 74 29 6e 4f 75 74 3b 0a 20 20 ong int)nOut;.
4f70: 72 63 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28 rc = uncompress(
4f80: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 (unsigned char*)
4f90: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 74 65 6d blob_buffer(&tem
4fa0: 70 29 2c 20 26 6e 4f 75 74 32 2c 20 0a 20 20 20 p), &nOut2, .
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 &
4fc0: 69 6e 42 75 66 5b 34 5d 2c 20 62 6c 6f 62 5f 73 inBuf[4], blob_s
4fd0: 69 7a 65 28 70 49 6e 29 29 3b 0a 20 20 69 66 28 ize(pIn));. if(
4fe0: 20 72 63 21 3d 5a 5f 4f 4b 20 29 7b 0a 20 20 20 rc!=Z_OK ){.
4ff0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 74 65 6d blob_reset(&tem
5000: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 p);. return 1
5010: 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 ;. }. blob_res
5020: 69 7a 65 28 26 74 65 6d 70 2c 20 6e 4f 75 74 32 ize(&temp, nOut2
5030: 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 70 );. if( pOut==p
5040: 49 6e 20 29 20 62 6c 6f 62 5f 72 65 73 65 74 28 In ) blob_reset(
5050: 70 4f 75 74 29 3b 0a 20 20 62 6c 6f 62 5f 69 73 pOut);. blob_is
5060: 5f 72 65 73 65 74 28 70 4f 75 74 29 3b 0a 20 20 _reset(pOut);.
5070: 2a 70 4f 75 74 20 3d 20 74 65 6d 70 3b 0a 20 20 *pOut = temp;.
5080: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
5090: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 ** COMMAND: test
50a0: 2d 75 6e 63 6f 6d 70 72 65 73 73 0a 2a 2f 0a 76 -uncompress.*/.v
50b0: 6f 69 64 20 75 6e 63 6f 6d 70 72 65 73 73 5f 63 oid uncompress_c
50c0: 6d 64 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 md(void){. Blob
50d0: 20 66 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 f;. if( g.argc
50e0: 21 3d 34 20 29 20 75 73 61 67 65 28 22 49 4e 50 !=4 ) usage("INP
50f0: 55 54 46 49 4c 45 20 4f 55 54 50 55 54 46 49 4c UTFILE OUTPUTFIL
5100: 45 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 61 64 E");. blob_read
5110: 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 66 2c 20 67 _from_file(&f, g
5120: 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 62 6c 6f .argv[2]);. blo
5130: 62 5f 75 6e 63 6f 6d 70 72 65 73 73 28 26 66 2c b_uncompress(&f,
5140: 20 26 66 29 3b 0a 20 20 62 6c 6f 62 5f 77 72 69 &f);. blob_wri
5150: 74 65 5f 74 6f 5f 66 69 6c 65 28 26 66 2c 20 67 te_to_file(&f, g
5160: 2e 61 72 67 76 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a .argv[3]);.}../*
5170: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 .** COMMAND: tes
5180: 74 2d 63 79 63 6c 65 2d 63 6f 6d 70 72 65 73 73 t-cycle-compress
5190: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 72 65 73 73 20 .**.** Compress
51a0: 61 6e 64 20 75 6e 63 6f 6d 70 72 65 73 73 20 65 and uncompress e
51b0: 61 63 68 20 66 69 6c 65 20 6e 61 6d 65 64 20 6f ach file named o
51c0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 n the command li
51d0: 6e 65 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 ne..** Verify th
51e0: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 at the original
51f0: 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 63 6f 76 content is recov
5200: 65 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65 ered..*/.void te
5210: 73 74 5f 63 79 63 6c 65 5f 63 6f 6d 70 72 65 73 st_cycle_compres
5220: 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 s(void){. int i
5230: 3b 0a 20 20 42 6c 6f 62 20 62 31 2c 20 62 32 2c ;. Blob b1, b2,
5240: 20 62 33 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 b3;. for(i=2;
5250: 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a i<g.argc; i++){.
5260: 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 blob_read_fr
5270: 6f 6d 5f 66 69 6c 65 28 26 62 31 2c 20 67 2e 61 om_file(&b1, g.a
5280: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 6c 6f rgv[i]);. blo
5290: 62 5f 63 6f 6d 70 72 65 73 73 28 26 62 31 2c 20 b_compress(&b1,
52a0: 26 62 32 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 75 &b2);. blob_u
52b0: 6e 63 6f 6d 70 72 65 73 73 28 26 62 32 2c 20 26 ncompress(&b2, &
52c0: 62 33 29 3b 0a 20 20 20 20 69 66 28 20 62 6c 6f b3);. if( blo
52d0: 62 5f 63 6f 6d 70 61 72 65 28 26 62 31 2c 20 26 b_compare(&b1, &
52e0: 62 33 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 b3) ){. fos
52f0: 73 69 6c 5f 70 61 6e 69 63 28 22 63 6f 6d 70 72 sil_panic("compr
5300: 65 73 73 2f 75 6e 63 6f 6d 70 72 65 73 73 20 63 ess/uncompress c
5310: 79 63 6c 65 20 66 61 69 6c 65 64 20 66 6f 72 20 ycle failed for
5320: 25 73 22 2c 20 67 2e 61 72 67 76 5b 69 5d 29 3b %s", g.argv[i]);
5330: 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f . }. blob_
5340: 72 65 73 65 74 28 26 62 31 29 3b 0a 20 20 20 20 reset(&b1);.
5350: 62 6c 6f 62 5f 72 65 73 65 74 28 26 62 32 29 3b blob_reset(&b2);
5360: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 . blob_reset(
5370: 26 62 33 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e &b3);. }. prin
5380: 74 66 28 22 6f 6b 5c 6e 22 29 3b 0a 7d 0a tf("ok\n");.}.