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 23 65 6e 64 69 66 20 >aData)..#endif
0690: 2f 2a 20 49 4e 54 45 52 46 41 43 45 20 2a 2f 0a /* INTERFACE */.
06a0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 ./*.** Make sure
06b0: 20 61 20 62 6c 6f 62 20 69 73 20 69 6e 69 74 69 a blob is initi
06c0: 61 6c 69 7a 65 64 0a 2a 2f 0a 23 64 65 66 69 6e alized.*/.#defin
06d0: 65 20 62 6c 6f 62 5f 69 73 5f 69 6e 69 74 28 78 e blob_is_init(x
06e0: 29 20 5c 0a 20 20 61 73 73 65 72 74 28 28 78 29 ) \. assert((x)
06f0: 2d 3e 78 52 65 61 6c 6c 6f 63 3d 3d 62 6c 6f 62 ->xRealloc==blob
0700: 52 65 61 6c 6c 6f 63 4d 61 6c 6c 6f 63 20 7c 7c ReallocMalloc ||
0710: 20 28 78 29 2d 3e 78 52 65 61 6c 6c 6f 63 3d 3d (x)->xRealloc==
0720: 62 6c 6f 62 52 65 61 6c 6c 6f 63 53 74 61 74 69 blobReallocStati
0730: 63 29 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 c)../*.** Make s
0740: 75 72 65 20 61 20 62 6c 6f 62 20 64 6f 65 73 20 ure a blob does
0750: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6d 61 6c 6c not contain mall
0760: 6f 63 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a oced memory..*/.
0770: 23 69 66 20 30 20 20 2f 2a 20 45 6e 61 62 6c 65 #if 0 /* Enable
0780: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f for debugging o
0790: 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 62 nly */.#define b
07a0: 6c 6f 62 5f 69 73 5f 72 65 73 65 74 28 78 29 20 lob_is_reset(x)
07b0: 5c 0a 20 20 61 73 73 65 72 74 28 28 78 29 2d 3e \. assert((x)->
07c0: 78 52 65 61 6c 6c 6f 63 21 3d 62 6c 6f 62 52 65 xRealloc!=blobRe
07d0: 61 6c 6c 6f 63 4d 61 6c 6c 6f 63 20 7c 7c 20 28 allocMalloc || (
07e0: 78 29 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 0a 23 x)->nAlloc==0).#
07f0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 62 6c 6f else.#define blo
0800: 62 5f 69 73 5f 72 65 73 65 74 28 78 29 0a 23 65 b_is_reset(x).#e
0810: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 ndif../*.** This
0820: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c routine is call
0830: 65 64 20 69 66 20 61 20 62 6c 6f 62 20 6f 70 65 ed if a blob ope
0840: 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 62 65 63 ration fails bec
0850: 61 75 73 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 ause we.** have
0860: 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 run out of memor
0870: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 y..*/.static voi
0880: 64 20 62 6c 6f 62 5f 70 61 6e 69 63 28 76 6f 69 d blob_panic(voi
0890: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e d){. static con
08a0: 73 74 20 63 68 61 72 20 7a 45 72 72 4d 73 67 5b st char zErrMsg[
08b0: 5d 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f ] = "out of memo
08c0: 72 79 5c 6e 22 3b 0a 20 20 77 72 69 74 65 28 32 ry\n";. write(2
08d0: 2c 20 7a 45 72 72 4d 73 67 2c 20 73 69 7a 65 6f , zErrMsg, sizeo
08e0: 66 28 7a 45 72 72 4d 73 67 29 2d 31 29 3b 0a 20 f(zErrMsg)-1);.
08f0: 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a exit(1);.}../*.
0900: 2a 2a 20 41 20 72 65 61 6c 6c 6f 63 61 74 69 6f ** A reallocatio
0910: 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 n function that
0920: 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 44 61 assumes that aDa
0930: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 6d 61 6c ta came from mal
0940: 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 66 loc()..** This f
0950: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 unction attempts
0960: 20 74 6f 20 72 65 73 69 7a 65 20 74 68 65 20 62 to resize the b
0970: 75 66 66 65 72 20 6f 66 20 74 68 65 20 62 6c 6f uffer of the blo
0980: 62 20 74 6f 20 68 6f 6c 64 0a 2a 2a 20 6e 65 77 b to hold.** new
0990: 53 69 7a 65 20 62 79 74 65 73 2e 20 20 0a 2a 2a Size bytes. .**
09a0: 0a 2a 2a 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 .** No attempt i
09b0: 73 20 6d 61 64 65 20 74 6f 20 72 65 63 6f 76 65 s made to recove
09c0: 72 20 66 72 6f 6d 20 61 6e 20 6f 75 74 2d 6f 66 r from an out-of
09d0: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 2e 0a 2a -memory error..*
09e0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f * If an OOM erro
09f0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 r occurs, an err
0a00: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 70 72 or message is pr
0a10: 69 6e 74 65 64 20 6f 6e 20 73 74 64 65 72 72 0a inted on stderr.
0a20: 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 67 72 ** and the progr
0a30: 61 6d 20 65 78 69 74 73 2e 0a 2a 2f 0a 76 6f 69 am exits..*/.voi
0a40: 64 20 62 6c 6f 62 52 65 61 6c 6c 6f 63 4d 61 6c d blobReallocMal
0a50: 6c 6f 63 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c loc(Blob *pBlob,
0a60: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 unsigned int ne
0a70: 77 53 69 7a 65 29 7b 0a 20 20 69 66 28 20 6e 65 wSize){. if( ne
0a80: 77 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 wSize==0 ){.
0a90: 66 72 65 65 28 70 42 6c 6f 62 2d 3e 61 44 61 74 free(pBlob->aDat
0aa0: 61 29 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 61 a);. pBlob->a
0ab0: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 42 Data = 0;. pB
0ac0: 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b lob->nAlloc = 0;
0ad0: 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 . pBlob->nUse
0ae0: 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 6c 6f 62 d = 0;. pBlob
0af0: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 ->iCursor = 0;.
0b00: 20 7d 65 6c 73 65 20 69 66 28 20 6e 65 77 53 69 }else if( newSi
0b10: 7a 65 3e 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 ze>pBlob->nAlloc
0b20: 20 7c 7c 20 6e 65 77 53 69 7a 65 3c 70 42 6c 6f || newSize<pBlo
0b30: 62 2d 3e 6e 41 6c 6c 6f 63 2d 34 30 30 30 20 29 b->nAlloc-4000 )
0b40: 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 {. char *pNew
0b50: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 = realloc(pBlob
0b60: 2d 3e 61 44 61 74 61 2c 20 6e 65 77 53 69 7a 65 ->aData, newSize
0b70: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d );. if( pNew=
0b80: 3d 30 20 29 20 62 6c 6f 62 5f 70 61 6e 69 63 28 =0 ) blob_panic(
0b90: 29 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 61 44 );. pBlob->aD
0ba0: 61 74 61 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 ata = pNew;.
0bb0: 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 pBlob->nAlloc =
0bc0: 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 newSize;. if(
0bd0: 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 3e 70 42 pBlob->nUsed>pB
0be0: 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 lob->nAlloc ){.
0bf0: 20 20 20 20 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 pBlob->nUse
0c00: 64 20 3d 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f d = pBlob->nAllo
0c10: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a c;. }. }.}..
0c20: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 69 74 69 61 6c /*.** An initial
0c30: 69 7a 65 72 20 66 6f 72 20 42 6c 6f 62 73 0a 2a izer for Blobs.*
0c40: 2f 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a /.#if INTERFACE.
0c50: 23 64 65 66 69 6e 65 20 42 4c 4f 42 5f 49 4e 49 #define BLOB_INI
0c60: 54 49 41 4c 49 5a 45 52 20 20 7b 30 2c 30 2c 30 TIALIZER {0,0,0
0c70: 2c 30 2c 62 6c 6f 62 52 65 61 6c 6c 6f 63 4d 61 ,0,blobReallocMa
0c80: 6c 6c 6f 63 7d 0a 23 65 6e 64 69 66 0a 63 6f 6e lloc}.#endif.con
0c90: 73 74 20 42 6c 6f 62 20 65 6d 70 74 79 5f 62 6c st Blob empty_bl
0ca0: 6f 62 20 3d 20 42 4c 4f 42 5f 49 4e 49 54 49 41 ob = BLOB_INITIA
0cb0: 4c 49 5a 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 LIZER;../*.** A
0cc0: 72 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e reallocation fun
0cd0: 63 74 69 6f 6e 20 66 6f 72 20 77 68 65 6e 20 74 ction for when t
0ce0: 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 69 6e he initial strin
0cf0: 67 20 69 73 20 69 6e 20 75 6e 6d 61 6e 61 67 65 g is in unmanage
0d00: 64 0a 2a 2a 20 73 70 61 63 65 2e 20 20 43 6f 70 d.** space. Cop
0d10: 79 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 y the string to
0d20: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 memory obtained
0d30: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a from malloc()..*
0d40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 6c /.static void bl
0d50: 6f 62 52 65 61 6c 6c 6f 63 53 74 61 74 69 63 28 obReallocStatic(
0d60: 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 75 6e 73 Blob *pBlob, uns
0d70: 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 53 69 7a igned int newSiz
0d80: 65 29 7b 0a 20 20 69 66 28 20 6e 65 77 53 69 7a e){. if( newSiz
0d90: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 42 6c e==0 ){. *pBl
0da0: 6f 62 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62 3b ob = empty_blob;
0db0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 . }else{. ch
0dc0: 61 72 20 2a 70 4e 65 77 20 3d 20 6d 61 6c 6c 6f ar *pNew = mallo
0dd0: 63 28 20 6e 65 77 53 69 7a 65 20 29 3b 0a 20 20 c( newSize );.
0de0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 if( pNew==0 )
0df0: 62 6c 6f 62 5f 70 61 6e 69 63 28 29 3b 0a 20 20 blob_panic();.
0e00: 20 20 69 66 28 20 70 42 6c 6f 62 2d 3e 6e 55 73 if( pBlob->nUs
0e10: 65 64 3e 6e 65 77 53 69 7a 65 20 29 20 70 42 6c ed>newSize ) pBl
0e20: 6f 62 2d 3e 6e 55 73 65 64 20 3d 20 6e 65 77 53 ob->nUsed = newS
0e30: 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 ize;. memcpy(
0e40: 70 4e 65 77 2c 20 70 42 6c 6f 62 2d 3e 61 44 61 pNew, pBlob->aDa
0e50: 74 61 2c 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 ta, pBlob->nUsed
0e60: 29 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 61 44 );. pBlob->aD
0e70: 61 74 61 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 ata = pNew;.
0e80: 70 42 6c 6f 62 2d 3e 78 52 65 61 6c 6c 6f 63 20 pBlob->xRealloc
0e90: 3d 20 62 6c 6f 62 52 65 61 6c 6c 6f 63 4d 61 6c = blobReallocMal
0ea0: 6c 6f 63 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e loc;. pBlob->
0eb0: 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77 53 69 7a 65 nAlloc = newSize
0ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 ;. }.}../*.** R
0ed0: 65 73 65 74 20 61 20 62 6c 6f 62 20 74 6f 20 62 eset a blob to b
0ee0: 65 20 61 6e 20 65 6d 70 74 79 20 63 6f 6e 74 61 e an empty conta
0ef0: 69 6e 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 62 6c iner..*/.void bl
0f00: 6f 62 5f 72 65 73 65 74 28 42 6c 6f 62 20 2a 70 ob_reset(Blob *p
0f10: 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f 69 73 Blob){. blob_is
0f20: 5f 69 6e 69 74 28 70 42 6c 6f 62 29 3b 0a 20 20 _init(pBlob);.
0f30: 70 42 6c 6f 62 2d 3e 78 52 65 61 6c 6c 6f 63 28 pBlob->xRealloc(
0f40: 70 42 6c 6f 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a pBlob, 0);.}../*
0f50: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 .** Initialize a
0f60: 20 62 6c 6f 62 20 74 6f 20 61 20 73 74 72 69 6e blob to a strin
0f70: 67 20 6f 72 20 62 79 74 65 2d 61 72 72 61 79 20 g or byte-array
0f80: 63 6f 6e 73 74 61 6e 74 20 6f 66 20 61 20 73 70 constant of a sp
0f90: 65 63 69 66 69 65 64 20 6c 65 6e 67 74 68 2e 0a ecified length..
0fa0: 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20 64 61 74 ** Any prior dat
0fb0: 61 20 69 6e 20 74 68 65 20 62 6c 6f 62 20 69 73 a in the blob is
0fc0: 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2f 0a 76 discarded..*/.v
0fd0: 6f 69 64 20 62 6c 6f 62 5f 69 6e 69 74 28 42 6c oid blob_init(Bl
0fe0: 6f 62 20 2a 70 42 6c 6f 62 2c 20 63 6f 6e 73 74 ob *pBlob, const
0ff0: 20 63 68 61 72 20 2a 7a 44 61 74 61 2c 20 69 6e char *zData, in
1000: 74 20 73 69 7a 65 29 7b 0a 20 20 62 6c 6f 62 5f t size){. blob_
1010: 69 73 5f 72 65 73 65 74 28 70 42 6c 6f 62 29 3b is_reset(pBlob);
1020: 0a 20 20 69 66 28 20 7a 44 61 74 61 3d 3d 30 20 . if( zData==0
1030: 29 7b 0a 20 20 20 20 2a 70 42 6c 6f 62 20 3d 20 ){. *pBlob =
1040: 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 7d 65 empty_blob;. }e
1050: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 73 69 7a lse{. if( siz
1060: 65 3c 3d 30 20 29 20 73 69 7a 65 20 3d 20 73 74 e<=0 ) size = st
1070: 72 6c 65 6e 28 7a 44 61 74 61 29 3b 0a 20 20 20 rlen(zData);.
1080: 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 20 3d 20 pBlob->nUsed =
1090: 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 pBlob->nAlloc =
10a0: 73 69 7a 65 3b 0a 20 20 20 20 70 42 6c 6f 62 2d size;. pBlob-
10b0: 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29 >aData = (char*)
10c0: 7a 44 61 74 61 3b 0a 20 20 20 20 70 42 6c 6f 62 zData;. pBlob
10d0: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 ->iCursor = 0;.
10e0: 20 20 20 70 42 6c 6f 62 2d 3e 78 52 65 61 6c 6c pBlob->xReall
10f0: 6f 63 20 3d 20 62 6c 6f 62 52 65 61 6c 6c 6f 63 oc = blobRealloc
1100: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f Static;. }.}../
1110: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 *.** Initialize
1120: 61 20 62 6c 6f 62 20 74 6f 20 61 20 6e 75 6c 2d a blob to a nul-
1130: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e terminated strin
1140: 67 2e 0a 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20 g..** Any prior
1150: 64 61 74 61 20 69 6e 20 74 68 65 20 62 6c 6f 62 data in the blob
1160: 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a is discarded..*
1170: 2f 0a 76 6f 69 64 20 62 6c 6f 62 5f 73 65 74 28 /.void blob_set(
1180: 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 63 6f 6e Blob *pBlob, con
1190: 73 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a st char *zStr){.
11a0: 20 20 62 6c 6f 62 5f 69 6e 69 74 28 70 42 6c 6f blob_init(pBlo
11b0: 62 2c 20 7a 53 74 72 2c 20 2d 31 29 3b 0a 7d 0a b, zStr, -1);.}.
11c0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a ./*.** Initializ
11d0: 65 20 61 20 62 6c 6f 62 20 74 6f 20 61 6e 20 65 e a blob to an e
11e0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a mpty string..*/.
11f0: 76 6f 69 64 20 62 6c 6f 62 5f 7a 65 72 6f 28 42 void blob_zero(B
1200: 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 73 lob *pBlob){. s
1210: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
1220: 20 7a 45 6d 70 74 79 5b 5d 20 3d 20 22 22 3b 0a zEmpty[] = "";.
1230: 20 20 62 6c 6f 62 5f 69 73 5f 72 65 73 65 74 28 blob_is_reset(
1240: 70 42 6c 6f 62 29 3b 0a 20 20 70 42 6c 6f 62 2d pBlob);. pBlob-
1250: 3e 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 42 >nUsed = 0;. pB
1260: 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b lob->nAlloc = 1;
1270: 0a 20 20 70 42 6c 6f 62 2d 3e 61 44 61 74 61 20 . pBlob->aData
1280: 3d 20 28 63 68 61 72 2a 29 7a 45 6d 70 74 79 3b = (char*)zEmpty;
1290: 0a 20 20 70 42 6c 6f 62 2d 3e 69 43 75 72 73 6f . pBlob->iCurso
12a0: 72 20 3d 20 30 3b 0a 20 20 70 42 6c 6f 62 2d 3e r = 0;. pBlob->
12b0: 78 52 65 61 6c 6c 6f 63 20 3d 20 62 6c 6f 62 52 xRealloc = blobR
12c0: 65 61 6c 6c 6f 63 53 74 61 74 69 63 3b 0a 7d 0a eallocStatic;.}.
12d0: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 ./*.** Append te
12e0: 78 74 20 6f 72 20 64 61 74 61 20 74 6f 20 74 68 xt or data to th
12f0: 65 20 65 6e 64 20 6f 66 20 61 20 62 6c 6f 62 2e e end of a blob.
1300: 0a 2a 2f 0a 76 6f 69 64 20 62 6c 6f 62 5f 61 70 .*/.void blob_ap
1310: 70 65 6e 64 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 pend(Blob *pBlob
1320: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 , const char *aD
1330: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b ata, int nData){
1340: 0a 20 20 62 6c 6f 62 5f 69 73 5f 69 6e 69 74 28 . blob_is_init(
1350: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 6e 44 pBlob);. if( nD
1360: 61 74 61 3c 30 20 29 20 6e 44 61 74 61 20 3d 20 ata<0 ) nData =
1370: 73 74 72 6c 65 6e 28 61 44 61 74 61 29 3b 0a 20 strlen(aData);.
1380: 20 69 66 28 20 6e 44 61 74 61 3d 3d 30 20 29 20 if( nData==0 )
1390: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 42 return;. if( pB
13a0: 6c 6f 62 2d 3e 6e 55 73 65 64 20 2b 20 6e 44 61 lob->nUsed + nDa
13b0: 74 61 20 3e 3d 20 70 42 6c 6f 62 2d 3e 6e 41 6c ta >= pBlob->nAl
13c0: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 42 6c 6f 62 loc ){. pBlob
13d0: 2d 3e 78 52 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 ->xRealloc(pBlob
13e0: 2c 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 20 2b , pBlob->nUsed +
13f0: 20 6e 44 61 74 61 20 2b 20 70 42 6c 6f 62 2d 3e nData + pBlob->
1400: 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 29 3b 0a 20 nAlloc + 100);.
1410: 20 20 20 69 66 28 20 70 42 6c 6f 62 2d 3e 6e 55 if( pBlob->nU
1420: 73 65 64 20 2b 20 6e 44 61 74 61 20 3e 3d 20 70 sed + nData >= p
1430: 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a Blob->nAlloc ){.
1440: 20 20 20 20 20 20 62 6c 6f 62 5f 70 61 6e 69 63 blob_panic
1450: 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 ();. }. }.
1460: 6d 65 6d 63 70 79 28 26 70 42 6c 6f 62 2d 3e 61 memcpy(&pBlob->a
1470: 44 61 74 61 5b 70 42 6c 6f 62 2d 3e 6e 55 73 65 Data[pBlob->nUse
1480: 64 5d 2c 20 61 44 61 74 61 2c 20 6e 44 61 74 61 d], aData, nData
1490: 29 3b 0a 20 20 70 42 6c 6f 62 2d 3e 6e 55 73 65 );. pBlob->nUse
14a0: 64 20 2b 3d 20 6e 44 61 74 61 3b 0a 20 20 70 42 d += nData;. pB
14b0: 6c 6f 62 2d 3e 61 44 61 74 61 5b 70 42 6c 6f 62 lob->aData[pBlob
14c0: 2d 3e 6e 55 73 65 64 5d 20 3d 20 30 3b 20 20 20 ->nUsed] = 0;
14d0: 2f 2a 20 42 6c 6f 62 73 20 61 72 65 20 61 6c 77 /* Blobs are alw
14e0: 61 79 73 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 ays nul-terminat
14f0: 65 64 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 ed */.}../*.** C
1500: 6f 70 79 20 61 20 62 6c 6f 62 0a 2a 2f 0a 76 6f opy a blob.*/.vo
1510: 69 64 20 62 6c 6f 62 5f 63 6f 70 79 28 42 6c 6f id blob_copy(Blo
1520: 62 20 2a 70 54 6f 2c 20 42 6c 6f 62 20 2a 70 46 b *pTo, Blob *pF
1530: 72 6f 6d 29 7b 0a 20 20 62 6c 6f 62 5f 69 73 5f rom){. blob_is_
1540: 69 6e 69 74 28 70 46 72 6f 6d 29 3b 0a 20 20 62 init(pFrom);. b
1550: 6c 6f 62 5f 69 73 5f 69 6e 69 74 28 70 54 6f 29 lob_is_init(pTo)
1560: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 54 ;. blob_zero(pT
1570: 6f 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e o);. blob_appen
1580: 64 28 70 54 6f 2c 20 62 6c 6f 62 5f 62 75 66 66 d(pTo, blob_buff
1590: 65 72 28 70 46 72 6f 6d 29 2c 20 62 6c 6f 62 5f er(pFrom), blob_
15a0: 73 69 7a 65 28 70 46 72 6f 6d 29 29 3b 0a 7d 0a size(pFrom));.}.
15b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 ./*.** Return a
15c0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c pointer to a nul
15d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 l-terminated str
15e0: 69 6e 67 20 66 6f 72 20 61 20 62 6c 6f 62 2e 0a ing for a blob..
15f0: 2a 2f 0a 63 68 61 72 20 2a 62 6c 6f 62 5f 73 74 */.char *blob_st
1600: 72 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 20 62 6c r(Blob *p){. bl
1610: 6f 62 5f 69 73 5f 69 6e 69 74 28 70 29 3b 0a 20 ob_is_init(p);.
1620: 20 69 66 28 20 70 2d 3e 61 44 61 74 61 5b 70 2d if( p->aData[p-
1630: 3e 6e 55 73 65 64 5d 21 3d 30 20 29 7b 0a 20 20 >nUsed]!=0 ){.
1640: 20 20 62 6c 6f 62 5f 6d 61 74 65 72 69 61 6c 69 blob_materiali
1650: 7a 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 ze(p);. }. ret
1660: 75 72 6e 20 70 2d 3e 61 44 61 74 61 3b 0a 7d 0a urn p->aData;.}.
1670: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 ./*.** Return a
1680: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c pointer to a nul
1690: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 l-terminated str
16a0: 69 6e 67 20 66 6f 72 20 61 20 62 6c 6f 62 2e 0a ing for a blob..
16b0: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 **.** WARNING:
16c0: 49 66 20 74 68 65 20 62 6c 6f 62 20 69 73 20 65 If the blob is e
16d0: 70 68 65 6d 65 72 61 6c 2c 20 69 74 20 6d 69 67 phemeral, it mig
16e0: 68 74 20 63 61 75 73 65 20 61 20 27 5c 30 30 30 ht cause a '\000
16f0: 27 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 74 '.** character t
1700: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e o be inserted in
1710: 74 6f 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 to the middle of
1720: 20 74 68 65 20 70 61 72 65 6e 74 20 62 6c 6f 62 the parent blob
1730: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 20 53 ..** Example: S
1740: 75 70 70 6f 73 65 20 70 20 69 73 20 61 20 74 6f uppose p is a to
1750: 6b 65 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 ken extracted fr
1760: 6f 6d 20 73 6f 6d 65 20 6c 61 72 67 65 72 0a 2a om some larger.*
1770: 2a 20 62 6c 6f 62 20 70 42 69 67 20 75 73 69 6e * blob pBig usin
1780: 67 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 29 2e 20 g blob_token().
1790: 20 49 66 20 79 6f 75 20 63 61 6c 6c 20 74 68 69 If you call thi
17a0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 20 70 2c 0a s routine on p,.
17b0: 2a 2a 20 74 68 65 6e 20 61 20 27 5c 30 30 30 27 ** then a '\000'
17c0: 20 63 68 61 72 61 63 74 65 72 20 77 69 6c 6c 20 character will
17d0: 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 74 be inserted in t
17e0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 he middle of.**
17f0: 70 42 69 67 20 69 6e 20 6f 72 64 65 72 20 74 6f pBig in order to
1800: 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20 6e cause p to be n
1810: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 ul-terminated.
1820: 49 66 20 70 42 69 67 0a 2a 2a 20 73 68 6f 75 6c If pBig.** shoul
1830: 64 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 d not be modifie
1840: 64 2c 20 74 68 65 6e 20 75 73 65 20 62 6c 6f 62 d, then use blob
1850: 5f 73 74 72 28 29 20 69 6e 73 74 65 61 64 20 6f _str() instead o
1860: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e f this.** routin
1870: 65 2e 20 20 62 6c 6f 62 5f 73 74 72 28 29 20 77 e. blob_str() w
1880: 69 6c 6c 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 ill make a copy
1890: 6f 66 20 74 68 65 20 70 20 69 66 20 6e 65 63 65 of the p if nece
18a0: 73 73 61 72 79 0a 2a 2a 20 74 6f 20 61 76 6f 69 ssary.** to avoi
18b0: 64 20 6d 6f 64 69 66 79 69 6e 67 20 70 42 69 67 d modifying pBig
18c0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 62 6c 6f 62 5f ..*/.char *blob_
18d0: 74 65 72 6d 69 6e 61 74 65 28 42 6c 6f 62 20 2a terminate(Blob *
18e0: 70 29 7b 0a 20 20 62 6c 6f 62 5f 69 73 5f 69 6e p){. blob_is_in
18f0: 69 74 28 70 29 3b 0a 20 20 70 2d 3e 61 44 61 74 it(p);. p->aDat
1900: 61 5b 70 2d 3e 6e 55 73 65 64 5d 20 3d 20 30 3b a[p->nUsed] = 0;
1910: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 61 44 61 . return p->aDa
1920: 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d ta;.}../*.** Com
1930: 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 0a pare two blobs..
1940: 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f 63 6f 6d 70 */.int blob_comp
1950: 61 72 65 28 42 6c 6f 62 20 2a 70 41 2c 20 42 6c are(Blob *pA, Bl
1960: 6f 62 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 73 ob *pB){. int s
1970: 7a 41 2c 20 73 7a 42 2c 20 73 7a 2c 20 72 63 3b zA, szB, sz, rc;
1980: 0a 20 20 62 6c 6f 62 5f 69 73 5f 69 6e 69 74 28 . blob_is_init(
1990: 70 41 29 3b 0a 20 20 62 6c 6f 62 5f 69 73 5f 69 pA);. blob_is_i
19a0: 6e 69 74 28 70 42 29 3b 0a 20 20 73 7a 41 20 3d nit(pB);. szA =
19b0: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 41 29 3b 0a blob_size(pA);.
19c0: 20 20 73 7a 42 20 3d 20 62 6c 6f 62 5f 73 69 7a szB = blob_siz
19d0: 65 28 70 42 29 3b 0a 20 20 73 7a 20 3d 20 73 7a e(pB);. sz = sz
19e0: 41 3c 73 7a 42 20 3f 20 73 7a 41 20 3a 20 73 7a A<szB ? szA : sz
19f0: 42 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 B;. rc = memcmp
1a00: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 41 29 (blob_buffer(pA)
1a10: 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 , blob_buffer(pB
1a20: 29 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 ), sz);. if( rc
1a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 ==0 ){. rc =
1a40: 73 7a 41 20 2d 20 73 7a 42 3b 0a 20 20 7d 0a 20 szA - szB;. }.
1a50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
1a60: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 61 20 62 *.** Compare a b
1a70: 6c 6f 62 20 74 6f 20 61 20 73 74 72 69 6e 67 2e lob to a string.
1a80: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 Return TRUE if
1a90: 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 2e they are equal.
1aa0: 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f 65 71 5f .*/.int blob_eq_
1ab0: 73 74 72 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c str(Blob *pBlob,
1ac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 const char *z,
1ad0: 69 6e 74 20 6e 29 7b 0a 20 20 42 6c 6f 62 20 74 int n){. Blob t
1ae0: 3b 0a 20 20 62 6c 6f 62 5f 69 73 5f 69 6e 69 74 ;. blob_is_init
1af0: 28 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 6e (pBlob);. if( n
1b00: 3c 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e <=0 ) n = strlen
1b10: 28 7a 29 3b 0a 20 20 74 2e 61 44 61 74 61 20 3d (z);. t.aData =
1b20: 20 28 63 68 61 72 2a 29 7a 3b 0a 20 20 74 2e 6e (char*)z;. t.n
1b30: 55 73 65 64 20 3d 20 6e 3b 0a 20 20 74 2e 78 52 Used = n;. t.xR
1b40: 65 61 6c 6c 6f 63 20 3d 20 62 6c 6f 62 52 65 61 ealloc = blobRea
1b50: 6c 6c 6f 63 53 74 61 74 69 63 3b 0a 20 20 72 65 llocStatic;. re
1b60: 74 75 72 6e 20 62 6c 6f 62 5f 63 6f 6d 70 61 72 turn blob_compar
1b70: 65 28 70 42 6c 6f 62 2c 20 26 74 29 3d 3d 30 3b e(pBlob, &t)==0;
1b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d .}../*.** This m
1b90: 61 63 72 6f 20 63 6f 6d 70 61 72 65 73 20 61 20 acro compares a
1ba0: 62 6c 6f 62 20 61 67 61 69 6e 73 74 20 61 20 73 blob against a s
1bb0: 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e 20 tring constant.
1bc0: 20 57 65 20 75 73 65 20 74 68 65 20 73 69 7a 65 We use the size
1bd0: 6f 66 28 29 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 of().** operator
1be0: 20 6f 6e 20 74 68 65 20 73 74 72 69 6e 67 20 63 on the string c
1bf0: 6f 6e 73 74 61 6e 74 20 74 77 69 63 65 2c 20 73 onstant twice, s
1c00: 6f 20 69 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 o it really does
1c10: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 0a 2a 2a need to be a.**
1c20: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 string literal
1c30: 6f 72 20 63 68 61 72 61 63 74 65 72 20 61 72 72 or character arr
1c40: 61 79 20 2d 20 6e 6f 74 20 61 20 63 68 61 72 61 ay - not a chara
1c50: 63 74 65 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f cter pointer..*/
1c60: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 23 .#if INTERFACE.#
1c70: 20 64 65 66 69 6e 65 20 62 6c 6f 62 5f 65 71 28 define blob_eq(
1c80: 42 2c 53 29 20 5c 0a 20 20 20 20 20 28 28 42 29 B,S) \. ((B)
1c90: 2d 3e 6e 55 73 65 64 3d 3d 73 69 7a 65 6f 66 28 ->nUsed==sizeof(
1ca0: 53 29 2d 31 20 26 26 20 6d 65 6d 63 6d 70 28 28 S)-1 && memcmp((
1cb0: 42 29 2d 3e 61 44 61 74 61 2c 53 2c 73 69 7a 65 B)->aData,S,size
1cc0: 6f 66 28 53 29 2d 31 29 3d 3d 30 29 0a 23 65 6e of(S)-1)==0).#en
1cd0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 dif.../*.** Atte
1ce0: 6d 70 74 20 74 6f 20 72 65 73 69 7a 65 20 61 20 mpt to resize a
1cf0: 62 6c 6f 62 20 73 6f 20 74 68 61 74 20 69 74 73 blob so that its
1d00: 20 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72 internal buffer
1d10: 20 69 73 20 0a 2a 2a 20 6e 42 79 74 65 20 69 6e is .** nByte in
1d20: 20 73 69 7a 65 2e 20 20 54 68 65 20 62 6c 6f 62 size. The blob
1d30: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 69 66 is truncated if
1d40: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 necessary..*/.v
1d50: 6f 69 64 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 oid blob_resize(
1d60: 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 75 6e 73 Blob *pBlob, uns
1d70: 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 53 69 7a igned int newSiz
1d80: 65 29 7b 0a 20 20 70 42 6c 6f 62 2d 3e 78 52 65 e){. pBlob->xRe
1d90: 61 6c 6c 6f 63 28 70 42 6c 6f 62 2c 20 6e 65 77 alloc(pBlob, new
1da0: 53 69 7a 65 2b 31 29 3b 0a 20 20 70 42 6c 6f 62 Size+1);. pBlob
1db0: 2d 3e 6e 55 73 65 64 20 3d 20 6e 65 77 53 69 7a ->nUsed = newSiz
1dc0: 65 3b 0a 20 20 70 42 6c 6f 62 2d 3e 61 44 61 74 e;. pBlob->aDat
1dd0: 61 5b 6e 65 77 53 69 7a 65 5d 20 3d 20 30 3b 0a a[newSize] = 0;.
1de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 }../*.** Make su
1df0: 72 65 20 61 20 62 6c 6f 62 20 69 73 20 6e 75 6c re a blob is nul
1e00: 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 -terminated and
1e10: 69 73 20 6e 6f 74 20 61 20 70 6f 69 6e 74 65 72 is not a pointer
1e20: 20 74 6f 20 75 6e 6d 61 6e 61 67 65 64 0a 2a 2a to unmanaged.**
1e30: 20 73 70 61 63 65 2e 20 20 52 65 74 75 72 6e 20 space. Return
1e40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 a pointer to the
1e50: 0a 2a 2f 0a 63 68 61 72 20 2a 62 6c 6f 62 5f 6d .*/.char *blob_m
1e60: 61 74 65 72 69 61 6c 69 7a 65 28 42 6c 6f 62 20 aterialize(Blob
1e70: 2a 70 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f *pBlob){. blob_
1e80: 72 65 73 69 7a 65 28 70 42 6c 6f 62 2c 20 70 42 resize(pBlob, pB
1e90: 6c 6f 62 2d 3e 6e 55 73 65 64 29 3b 0a 20 20 72 lob->nUsed);. r
1ea0: 65 74 75 72 6e 20 70 42 6c 6f 62 2d 3e 61 44 61 eturn pBlob->aDa
1eb0: 74 61 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 ta;.}.../*.** Ca
1ec0: 6c 6c 20 64 65 68 74 74 70 69 7a 65 20 6f 6e 20 ll dehttpize on
1ed0: 61 20 62 6c 6f 62 2e 20 20 54 68 69 73 20 63 61 a blob. This ca
1ee0: 75 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72 61 uses an ephemera
1ef0: 6c 20 62 6c 6f 62 20 74 6f 20 62 65 0a 2a 2a 20 l blob to be.**
1f00: 6d 61 74 65 72 69 61 6c 69 7a 65 64 2e 0a 2a 2f materialized..*/
1f10: 0a 76 6f 69 64 20 62 6c 6f 62 5f 64 65 68 74 74 .void blob_dehtt
1f20: 70 69 7a 65 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 pize(Blob *pBlob
1f30: 29 7b 0a 20 20 62 6c 6f 62 5f 6d 61 74 65 72 69 ){. blob_materi
1f40: 61 6c 69 7a 65 28 70 42 6c 6f 62 29 3b 0a 20 20 alize(pBlob);.
1f50: 70 42 6c 6f 62 2d 3e 6e 55 73 65 64 20 3d 20 64 pBlob->nUsed = d
1f60: 65 68 74 74 70 69 7a 65 28 70 42 6c 6f 62 2d 3e ehttpize(pBlob->
1f70: 61 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a aData);.}../*.**
1f80: 20 45 78 74 72 61 63 74 20 4e 20 62 79 74 65 73 Extract N bytes
1f90: 20 66 72 6f 6d 20 62 6c 6f 62 20 70 46 72 6f 6d from blob pFrom
1fa0: 20 61 6e 64 20 75 73 65 20 69 74 20 74 6f 20 69 and use it to i
1fb0: 6e 69 74 69 61 6c 69 7a 65 20 62 6c 6f 62 20 70 nitialize blob p
1fc0: 54 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 To..** Return th
1fd0: 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 e actual number
1fe0: 6f 66 20 62 79 74 65 73 20 65 78 74 72 61 63 74 of bytes extract
1ff0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 ed..**.** After
2000: 74 68 69 73 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 this call comple
2010: 74 65 73 2c 20 70 54 6f 20 77 69 6c 6c 20 62 65 tes, pTo will be
2020: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 6c an ephemeral bl
2030: 6f 62 2e 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f ob..*/.int blob_
2040: 65 78 74 72 61 63 74 28 42 6c 6f 62 20 2a 70 46 extract(Blob *pF
2050: 72 6f 6d 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f 62 rom, int N, Blob
2060: 20 2a 70 54 6f 29 7b 0a 20 20 62 6c 6f 62 5f 69 *pTo){. blob_i
2070: 73 5f 69 6e 69 74 28 70 46 72 6f 6d 29 3b 0a 20 s_init(pFrom);.
2080: 20 62 6c 6f 62 5f 69 73 5f 72 65 73 65 74 28 70 blob_is_reset(p
2090: 54 6f 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d To);. if( pFrom
20a0: 2d 3e 69 43 75 72 73 6f 72 20 2b 20 4e 20 3e 20 ->iCursor + N >
20b0: 70 46 72 6f 6d 2d 3e 6e 55 73 65 64 20 29 7b 0a pFrom->nUsed ){.
20c0: 20 20 20 20 4e 20 3d 20 70 46 72 6f 6d 2d 3e 6e N = pFrom->n
20d0: 55 73 65 64 20 2d 20 70 46 72 6f 6d 2d 3e 69 43 Used - pFrom->iC
20e0: 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 4e ursor;. if( N
20f0: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f <=0 ){. blo
2100: 62 5f 7a 65 72 6f 28 70 54 6f 29 3b 0a 20 20 20 b_zero(pTo);.
2110: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 return 0;.
2120: 20 7d 0a 20 20 7d 0a 20 20 70 54 6f 2d 3e 6e 55 }. }. pTo->nU
2130: 73 65 64 20 3d 20 4e 3b 0a 20 20 70 54 6f 2d 3e sed = N;. pTo->
2140: 6e 41 6c 6c 6f 63 20 3d 20 4e 3b 0a 20 20 70 54 nAlloc = N;. pT
2150: 6f 2d 3e 61 44 61 74 61 20 3d 20 26 70 46 72 6f o->aData = &pFro
2160: 6d 2d 3e 61 44 61 74 61 5b 70 46 72 6f 6d 2d 3e m->aData[pFrom->
2170: 69 43 75 72 73 6f 72 5d 3b 0a 20 20 70 54 6f 2d iCursor];. pTo-
2180: 3e 69 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 >iCursor = 0;.
2190: 70 54 6f 2d 3e 78 52 65 61 6c 6c 6f 63 20 3d 20 pTo->xRealloc =
21a0: 62 6c 6f 62 52 65 61 6c 6c 6f 63 53 74 61 74 69 blobReallocStati
21b0: 63 3b 0a 20 20 70 46 72 6f 6d 2d 3e 69 43 75 72 c;. pFrom->iCur
21c0: 73 6f 72 20 2b 3d 20 4e 3b 0a 20 20 72 65 74 75 sor += N;. retu
21d0: 72 6e 20 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 rn N;.}../*.** R
21e0: 65 77 69 6e 64 20 74 68 65 20 63 75 72 73 6f 72 ewind the cursor
21f0: 20 6f 6e 20 61 20 62 6c 6f 62 20 62 61 63 6b 20 on a blob back
2200: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 to the beginning
2210: 2e 0a 2a 2f 0a 76 6f 69 64 20 62 6c 6f 62 5f 72 ..*/.void blob_r
2220: 65 77 69 6e 64 28 42 6c 6f 62 20 2a 70 29 7b 0a ewind(Blob *p){.
2230: 20 20 70 2d 3e 69 43 75 72 73 6f 72 20 3d 20 30 p->iCursor = 0
2240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 ;.}../*.** Extra
2250: 63 74 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 ct a single line
2260: 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 70 46 of text from pF
2270: 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 rom beginning at
2280: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a the current .**
2290: 20 63 75 72 73 6f 72 20 6c 6f 63 61 74 69 6f 6e cursor location
22a0: 20 61 6e 64 20 75 73 65 20 74 68 61 74 20 6c 69 and use that li
22b0: 6e 65 20 6f 66 20 74 65 78 74 20 74 6f 20 69 6e ne of text to in
22c0: 69 74 69 61 6c 69 7a 65 20 70 54 6f 2e 0a 2a 2a itialize pTo..**
22d0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 Return the numb
22e0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 er of bytes in t
22f0: 68 65 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 he line..**.** T
2300: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 70 46 72 he cursor of pFr
2310: 6f 6d 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 om is left point
2320: 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 ing at the first
2330: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a byte past the.*
2340: 2a 20 5c 6e 20 74 68 61 74 20 74 65 72 6d 69 6e * \n that termin
2350: 61 74 65 64 20 74 68 65 20 6c 69 6e 65 2e 0a 2a ated the line..*
2360: 2a 0a 2a 2a 20 70 54 6f 20 77 69 6c 6c 20 62 65 *.** pTo will be
2370: 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c 20 62 an ephermeral b
2380: 6c 6f 62 2e 20 20 49 66 20 70 46 72 6f 6d 20 63 lob. If pFrom c
2390: 68 61 6e 67 65 73 2c 20 69 74 20 6d 69 67 68 74 hanges, it might
23a0: 20 61 6c 74 65 72 0a 2a 2a 20 70 54 6f 20 61 73 alter.** pTo as
23b0: 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 62 6c well..*/.int bl
23c0: 6f 62 5f 6c 69 6e 65 28 42 6c 6f 62 20 2a 70 46 ob_line(Blob *pF
23d0: 72 6f 6d 2c 20 42 6c 6f 62 20 2a 70 54 6f 29 7b rom, Blob *pTo){
23e0: 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d . char *aData =
23f0: 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 pFrom->aData;.
2400: 20 69 6e 74 20 6e 20 3d 20 70 46 72 6f 6d 2d 3e int n = pFrom->
2410: 6e 55 73 65 64 3b 0a 20 20 69 6e 74 20 69 20 3d nUsed;. int i =
2420: 20 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 3b pFrom->iCursor;
2430: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 6b 69 . /* Do not ski
2440: 70 20 62 6c 61 6e 6b 20 6c 69 6e 65 73 0a 20 20 p blank lines.
2450: 2a 2a 20 77 68 69 6c 65 28 20 69 3c 6e 20 26 26 ** while( i<n &&
2460: 20 61 44 61 74 61 5b 69 5d 3d 3d 27 5c 6e 27 20 aData[i]=='\n'
2470: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 2a 2a 20 70 ){ i++; }. ** p
2480: 46 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 From->iCursor =
2490: 69 3b 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 i;. */. while(
24a0: 20 69 3c 6e 20 26 26 20 61 44 61 74 61 5b 69 5d i<n && aData[i]
24b0: 21 3d 27 5c 6e 27 20 29 7b 20 69 2b 2b 3b 20 7d !='\n' ){ i++; }
24c0: 0a 20 20 62 6c 6f 62 5f 65 78 74 72 61 63 74 28 . blob_extract(
24d0: 70 46 72 6f 6d 2c 20 69 2d 70 46 72 6f 6d 2d 3e pFrom, i-pFrom->
24e0: 69 43 75 72 73 6f 72 2c 20 70 54 6f 29 3b 0a 20 iCursor, pTo);.
24f0: 20 69 66 28 20 69 3c 6e 20 26 26 20 61 44 61 74 if( i<n && aDat
2500: 61 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 20 70 46 a[i]=='\n' ){ pF
2510: 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 2b 2b 3b 20 rom->iCursor++;
2520: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 6f 2d 3e }. return pTo->
2530: 6e 55 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nUsed;.}../*.**
2540: 45 78 74 72 61 63 74 20 61 20 73 69 6e 67 6c 65 Extract a single
2550: 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 70 46 72 6f token from pFro
2560: 6d 20 61 6e 64 20 75 73 65 20 69 74 20 74 6f 20 m and use it to
2570: 69 6e 69 74 69 61 6c 69 7a 65 20 70 54 6f 2e 0a initialize pTo..
2580: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 ** Return the nu
2590: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
25a0: 20 74 68 65 20 74 6f 6b 65 6e 2e 20 20 49 66 20 the token. If
25b0: 6e 6f 20 74 6f 6b 65 6e 20 69 73 20 66 6f 75 6e no token is foun
25c0: 64 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a d,.** return 0..
25d0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 **.** The cursor
25e0: 20 6f 66 20 70 46 72 6f 6d 20 69 73 20 6c 65 66 of pFrom is lef
25f0: 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 t pointing at th
2600: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 e first characte
2610: 72 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e r past.** the en
2620: 64 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 2e 0a d of the token..
2630: 2a 2a 0a 2a 2a 20 70 54 6f 20 77 69 6c 6c 20 62 **.** pTo will b
2640: 65 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c 20 e an ephermeral
2650: 62 6c 6f 62 2e 20 20 49 66 20 70 46 72 6f 6d 20 blob. If pFrom
2660: 63 68 61 6e 67 65 73 2c 20 69 74 20 6d 69 67 68 changes, it migh
2670: 74 20 61 6c 74 65 72 0a 2a 2a 20 70 54 6f 20 61 t alter.** pTo a
2680: 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 62 s well..*/.int b
2690: 6c 6f 62 5f 74 6f 6b 65 6e 28 42 6c 6f 62 20 2a lob_token(Blob *
26a0: 70 46 72 6f 6d 2c 20 42 6c 6f 62 20 2a 70 54 6f pFrom, Blob *pTo
26b0: 29 7b 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 ){. char *aData
26c0: 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b = pFrom->aData;
26d0: 0a 20 20 69 6e 74 20 6e 20 3d 20 70 46 72 6f 6d . int n = pFrom
26e0: 2d 3e 6e 55 73 65 64 3b 0a 20 20 69 6e 74 20 69 ->nUsed;. int i
26f0: 20 3d 20 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f = pFrom->iCurso
2700: 72 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 20 r;. while( i<n
2710: 26 26 20 69 73 73 70 61 63 65 28 61 44 61 74 61 && isspace(aData
2720: 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 [i]) ){ i++; }.
2730: 20 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 20 pFrom->iCursor
2740: 3d 20 69 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c = i;. while( i<
2750: 6e 20 26 26 20 21 69 73 73 70 61 63 65 28 61 44 n && !isspace(aD
2760: 61 74 61 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 ata[i]) ){ i++;
2770: 7d 0a 20 20 62 6c 6f 62 5f 65 78 74 72 61 63 74 }. blob_extract
2780: 28 70 46 72 6f 6d 2c 20 69 2d 70 46 72 6f 6d 2d (pFrom, i-pFrom-
2790: 3e 69 43 75 72 73 6f 72 2c 20 70 54 6f 29 3b 0a >iCursor, pTo);.
27a0: 20 20 77 68 69 6c 65 28 20 69 3c 6e 20 26 26 20 while( i<n &&
27b0: 69 73 73 70 61 63 65 28 61 44 61 74 61 5b 69 5d isspace(aData[i]
27c0: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 70 46 ) ){ i++; }. pF
27d0: 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 69 rom->iCursor = i
27e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 6f 2d 3e ;. return pTo->
27f0: 6e 55 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nUsed;.}../*.**
2800: 45 78 74 72 61 63 74 20 65 76 65 72 79 74 68 69 Extract everythi
2810: 6e 67 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 ng from the curr
2820: 65 6e 74 20 63 75 72 73 6f 72 20 74 6f 20 74 68 ent cursor to th
2830: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 6c 6f e end of the blo
2840: 62 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 b.** into a new
2850: 62 6c 6f 62 2e 20 20 54 68 65 20 6e 65 77 20 62 blob. The new b
2860: 6c 6f 62 20 69 73 20 61 6e 20 65 70 68 65 6d 65 lob is an epheme
2870: 72 69 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 rial reference t
2880: 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 o the.** origina
2890: 6c 20 62 6c 6f 62 2e 20 20 54 68 65 20 63 75 72 l blob. The cur
28a0: 73 6f 72 20 6f 66 20 74 68 65 20 6f 72 69 67 69 sor of the origi
28b0: 6e 61 6c 20 62 6c 6f 62 20 69 73 20 75 6e 63 68 nal blob is unch
28c0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 62 6c anged..*/.int bl
28d0: 6f 62 5f 74 61 69 6c 28 42 6c 6f 62 20 2a 70 46 ob_tail(Blob *pF
28e0: 72 6f 6d 2c 20 42 6c 6f 62 20 2a 70 54 6f 29 7b rom, Blob *pTo){
28f0: 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d . int iCursor =
2900: 20 70 46 72 6f 6d 2d 3e 69 43 75 72 73 6f 72 3b pFrom->iCursor;
2910: 0a 20 20 62 6c 6f 62 5f 65 78 74 72 61 63 74 28 . blob_extract(
2920: 70 46 72 6f 6d 2c 20 70 46 72 6f 6d 2d 3e 6e 55 pFrom, pFrom->nU
2930: 73 65 64 2d 70 46 72 6f 6d 2d 3e 69 43 75 72 73 sed-pFrom->iCurs
2940: 6f 72 2c 20 70 54 6f 29 3b 0a 20 20 70 46 72 6f or, pTo);. pFro
2950: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 69 43 75 m->iCursor = iCu
2960: 72 73 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 rsor;. return p
2970: 54 6f 2d 3e 6e 55 73 65 64 3b 0a 7d 0a 0a 2f 2a To->nUsed;.}../*
2980: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 .** Return true
2990: 69 66 20 74 68 65 20 62 6c 6f 62 20 63 6f 6e 74 if the blob cont
29a0: 61 69 6e 73 20 61 20 76 61 6c 69 64 20 55 55 49 ains a valid UUI
29b0: 44 5f 53 49 5a 45 2d 64 69 67 69 74 20 62 61 73 D_SIZE-digit bas
29c0: 65 31 36 20 69 64 65 6e 74 69 66 69 65 72 2e 0a e16 identifier..
29d0: 2a 2f 0a 69 6e 74 20 62 6c 6f 62 5f 69 73 5f 75 */.int blob_is_u
29e0: 75 69 64 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 uid(Blob *pBlob)
29f0: 7b 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f 62 5f {. return blob_
2a00: 73 69 7a 65 28 70 42 6c 6f 62 29 3d 3d 55 55 49 size(pBlob)==UUI
2a10: 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 D_SIZE.
2a20: 26 26 20 76 61 6c 69 64 61 74 65 31 36 28 62 6c && validate16(bl
2a30: 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f 62 29 ob_buffer(pBlob)
2a40: 2c 20 55 55 49 44 5f 53 49 5a 45 29 3b 0a 7d 0a , UUID_SIZE);.}.
2a50: 69 6e 74 20 62 6c 6f 62 5f 69 73 5f 75 75 69 64 int blob_is_uuid
2a60: 5f 6e 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 _n(Blob *pBlob,
2a70: 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e int n){. return
2a80: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 blob_size(pBlob
2a90: 29 3d 3d 6e 20 26 26 20 76 61 6c 69 64 61 74 65 )==n && validate
2aa0: 31 36 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 16(blob_buffer(p
2ab0: 42 6c 6f 62 29 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a Blob), n);.}../*
2ac0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 .** Return true
2ad0: 69 66 20 74 68 65 20 62 6c 6f 62 20 63 6f 6e 74 if the blob cont
2ae0: 61 69 6e 73 20 61 20 76 61 6c 69 64 20 33 32 2d ains a valid 32-
2af0: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 53 74 bit integer. St
2b00: 6f 72 65 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 ore.** the integ
2b10: 65 72 20 76 61 6c 75 65 20 69 6e 20 2a 70 56 61 er value in *pVa
2b20: 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 62 6c 6f 62 lue..*/.int blob
2b30: 5f 69 73 5f 69 6e 74 28 42 6c 6f 62 20 2a 70 42 _is_int(Blob *pB
2b40: 6c 6f 62 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 lob, int *pValue
2b50: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
2b60: 2a 7a 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72 *z = blob_buffer
2b70: 28 70 42 6c 6f 62 29 3b 0a 20 20 69 6e 74 20 69 (pBlob);. int i
2b80: 2c 20 6e 2c 20 63 2c 20 76 3b 0a 20 20 6e 20 3d , n, c, v;. n =
2b90: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 blob_size(pBlob
2ba0: 29 3b 0a 20 20 76 20 3d 20 30 3b 0a 20 20 66 6f );. v = 0;. fo
2bb0: 72 28 69 3d 30 3b 20 69 3c 6e 20 26 26 20 28 63 r(i=0; i<n && (c
2bc0: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 69 = z[i])!=0 && i
2bd0: 73 64 69 67 69 74 28 63 29 3b 20 69 2b 2b 29 7b sdigit(c); i++){
2be0: 0a 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 . v = v*10 +
2bf0: 63 20 2d 20 27 30 27 3b 0a 20 20 7d 0a 20 20 69 c - '0';. }. i
2c00: 66 28 20 69 3d 3d 6e 20 29 7b 0a 20 20 20 20 2a f( i==n ){. *
2c10: 70 56 61 6c 75 65 20 3d 20 76 3b 0a 20 20 20 20 pValue = v;.
2c20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 return 1;. }els
2c30: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b e{. return 0;
2c40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 . }.}../*.** Ze
2c50: 72 6f 20 6f 72 20 72 65 73 65 74 20 61 6e 20 61 ro or reset an a
2c60: 72 72 61 79 20 6f 66 20 42 6c 6f 62 73 2e 0a 2a rray of Blobs..*
2c70: 2f 0a 76 6f 69 64 20 62 6c 6f 62 61 72 72 61 79 /.void blobarray
2c80: 5f 7a 65 72 6f 28 42 6c 6f 62 20 2a 61 42 6c 6f _zero(Blob *aBlo
2c90: 62 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 b, int n){. int
2ca0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 i;. for(i=0; i
2cb0: 3c 6e 3b 20 69 2b 2b 29 20 62 6c 6f 62 5f 7a 65 <n; i++) blob_ze
2cc0: 72 6f 28 26 61 42 6c 6f 62 5b 69 5d 29 3b 0a 7d ro(&aBlob[i]);.}
2cd0: 0a 76 6f 69 64 20 62 6c 6f 62 61 72 72 61 79 5f .void blobarray_
2ce0: 72 65 73 65 74 28 42 6c 6f 62 20 2a 61 42 6c 6f reset(Blob *aBlo
2cf0: 62 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 b, int n){. int
2d00: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 i;. for(i=0; i
2d10: 3c 6e 3b 20 69 2b 2b 29 20 62 6c 6f 62 5f 72 65 <n; i++) blob_re
2d20: 73 65 74 28 26 61 42 6c 6f 62 5b 69 5d 29 3b 0a set(&aBlob[i]);.
2d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 }../*.** Parse a
2d40: 20 62 6c 6f 62 20 69 6e 74 6f 20 73 70 61 63 65 blob into space
2d50: 2d 73 65 70 61 72 61 74 65 64 20 74 6f 6b 65 6e -separated token
2d60: 73 2e 20 20 53 74 6f 72 65 20 65 61 63 68 20 74 s. Store each t
2d70: 6f 6b 65 6e 20 69 6e 0a 2a 2a 20 61 6e 20 65 6c oken in.** an el
2d80: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 62 6c 6f ement of the blo
2d90: 62 61 72 72 61 79 20 61 54 6f 6b 65 6e 5b 5d 2e barray aToken[].
2da0: 20 20 61 54 6f 6b 65 6e 5b 5d 20 69 73 20 6e 54 aToken[] is nT
2db0: 6f 6b 65 6e 20 65 6c 65 6d 65 6e 74 73 20 69 6e oken elements in
2dc0: 0a 2a 2a 20 73 69 7a 65 2e 20 20 52 65 74 75 72 .** size. Retur
2dd0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
2de0: 74 6f 6b 65 6e 73 20 73 65 65 6e 2e 0a 2a 2f 0a tokens seen..*/.
2df0: 69 6e 74 20 62 6c 6f 62 5f 74 6f 6b 65 6e 69 7a int blob_tokeniz
2e00: 65 28 42 6c 6f 62 20 2a 70 49 6e 2c 20 42 6c 6f e(Blob *pIn, Blo
2e10: 62 20 2a 61 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e b *aToken, int n
2e20: 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b Token){. int i;
2e30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 . for(i=0; i<nT
2e40: 6f 6b 65 6e 20 26 26 20 62 6c 6f 62 5f 74 6f 6b oken && blob_tok
2e50: 65 6e 28 70 49 6e 2c 20 26 61 54 6f 6b 65 6e 5b en(pIn, &aToken[
2e60: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 72 65 i]); i++){}. re
2e70: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 0a 2a turn i;.}../* .*
2e80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
2e90: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 63 implements the c
2ea0: 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 76 78 70 allback from vxp
2eb0: 72 69 6e 74 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 rintf. .**.** Th
2ec0: 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 20 6e is routine add n
2ed0: 4e 65 77 43 68 61 72 20 63 68 61 72 61 63 74 65 NewChar characte
2ee0: 72 73 20 6f 66 20 74 65 78 74 20 69 6e 20 7a 4e rs of text in zN
2ef0: 65 77 54 65 78 74 20 74 6f 0a 2a 2a 20 74 68 65 ewText to.** the
2f00: 20 42 6c 6f 62 20 73 74 72 75 63 74 75 72 65 20 Blob structure
2f10: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 22 61 pointed to by "a
2f20: 72 67 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 rg"..*/.static v
2f30: 6f 69 64 20 62 6f 75 74 28 76 6f 69 64 20 2a 61 oid bout(void *a
2f40: 72 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a rg, const char *
2f50: 7a 4e 65 77 54 65 78 74 2c 20 69 6e 74 20 6e 4e zNewText, int nN
2f60: 65 77 43 68 61 72 29 7b 0a 20 20 42 6c 6f 62 20 ewChar){. Blob
2f70: 2a 70 42 6c 6f 62 20 3d 20 28 42 6c 6f 62 2a 29 *pBlob = (Blob*)
2f80: 61 72 67 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 arg;. blob_appe
2f90: 6e 64 28 70 42 6c 6f 62 2c 20 7a 4e 65 77 54 65 nd(pBlob, zNewTe
2fa0: 78 74 2c 20 6e 4e 65 77 43 68 61 72 29 3b 0a 7d xt, nNewChar);.}
2fb0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 70 72 69 6e 74 ../*.** Do print
2fc0: 66 2d 73 74 79 6c 65 20 73 74 72 69 6e 67 20 72 f-style string r
2fd0: 65 6e 64 65 72 69 6e 67 20 61 6e 64 20 61 70 70 endering and app
2fe0: 65 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 end the results
2ff0: 74 6f 20 61 20 62 6c 6f 62 2e 0a 2a 2f 0a 76 6f to a blob..*/.vo
3000: 69 64 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 id blob_appendf(
3010: 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 63 6f 6e Blob *pBlob, con
3020: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 st char *zFormat
3030: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 , ...){. va_lis
3040: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 t ap;. va_start
3050: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 (ap, zFormat);.
3060: 20 76 78 70 72 69 6e 74 66 28 62 6f 75 74 2c 20 vxprintf(bout,
3070: 70 42 6c 6f 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 pBlob, zFormat,
3080: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 ap);. va_end(ap
3090: 29 3b 0a 7d 0a 76 6f 69 64 20 62 6c 6f 62 5f 76 );.}.void blob_v
30a0: 61 70 70 65 6e 64 66 28 42 6c 6f 62 20 2a 70 42 appendf(Blob *pB
30b0: 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 lob, const char
30c0: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 *zFormat, va_lis
30d0: 74 20 61 70 29 7b 0a 20 20 76 78 70 72 69 6e 74 t ap){. vxprint
30e0: 66 28 62 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 7a f(bout, pBlob, z
30f0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 7d 0a 0a Format, ap);.}..
3100: 2f 2a 0a 2a 2a 20 49 6e 69 74 61 6c 69 7a 65 20 /*.** Initalize
3110: 61 20 62 6c 6f 62 20 74 6f 20 74 68 65 20 64 61 a blob to the da
3120: 74 61 20 6f 6e 20 61 6e 20 69 6e 70 75 74 20 63 ta on an input c
3130: 68 61 6e 6e 65 6c 2e 20 20 52 65 74 75 72 6e 20 hannel. Return
3140: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f .** the number o
3150: 66 20 62 79 74 65 73 20 72 65 61 64 20 69 6e 74 f bytes read int
3160: 6f 20 74 68 65 20 62 6c 6f 62 2e 20 20 41 6e 79 o the blob. Any
3170: 20 70 72 69 6f 72 20 63 6f 6e 74 65 6e 74 0a 2a prior content.*
3180: 2a 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 69 73 * of the blob is
3190: 20 64 69 73 63 61 72 64 65 64 2c 20 6e 6f 74 20 discarded, not
31a0: 66 72 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 62 6c freed..*/.int bl
31b0: 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 63 68 61 ob_read_from_cha
31c0: 6e 6e 65 6c 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 nnel(Blob *pBlob
31d0: 2c 20 46 49 4c 45 20 2a 69 6e 2c 20 69 6e 74 20 , FILE *in, int
31e0: 6e 54 6f 52 65 61 64 29 7b 0a 20 20 73 69 7a 65 nToRead){. size
31f0: 5f 74 20 6e 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 _t n;. blob_zer
3200: 6f 28 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 o(pBlob);. if(
3210: 6e 54 6f 52 65 61 64 3c 30 20 29 7b 0a 20 20 20 nToRead<0 ){.
3220: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 30 char zBuf[10000
3230: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 ];. while( !f
3240: 65 6f 66 28 69 6e 29 20 29 7b 0a 20 20 20 20 20 eof(in) ){.
3250: 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c n = fread(zBuf,
3260: 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 1, sizeof(zBuf)
3270: 2c 20 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 , in);. if(
3280: 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 n>0 ){.
3290: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 42 6c 6f blob_append(pBlo
32a0: 62 2c 20 7a 42 75 66 2c 20 6e 29 3b 0a 20 20 20 b, zBuf, n);.
32b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c }. }. }el
32c0: 73 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 se{. blob_res
32d0: 69 7a 65 28 70 42 6c 6f 62 2c 20 6e 54 6f 52 65 ize(pBlob, nToRe
32e0: 61 64 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 ad);. n = fre
32f0: 61 64 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 ad(blob_buffer(p
3300: 42 6c 6f 62 29 2c 20 31 2c 20 6e 54 6f 52 65 61 Blob), 1, nToRea
3310: 64 2c 20 69 6e 29 3b 0a 20 20 20 20 62 6c 6f 62 d, in);. blob
3320: 5f 72 65 73 69 7a 65 28 70 42 6c 6f 62 2c 20 6e _resize(pBlob, n
3330: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 );. }. return
3340: 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 blob_size(pBlob)
3350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 ;.}../*.** Initi
3360: 61 6c 69 7a 65 20 61 20 62 6c 6f 62 20 74 6f 20 alize a blob to
3370: 62 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f be the content o
3380: 66 20 61 20 66 69 6c 65 2e 20 20 49 66 20 74 68 f a file. If th
3390: 65 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 e filename.** is
33a0: 20 62 6c 61 6e 6b 20 6f 72 20 22 2d 22 20 74 68 blank or "-" th
33b0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61 en read from sta
33c0: 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2a 0a ndard input..**.
33d0: 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20 63 6f 6e ** Any prior con
33e0: 74 65 6e 74 20 6f 66 20 74 68 65 20 62 6c 6f 62 tent of the blob
33f0: 20 69 73 20 64 69 73 63 61 72 64 65 64 2c 20 6e is discarded, n
3400: 6f 74 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 ot freed..**.**
3410: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 Return the numbe
3420: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e r of bytes read.
3430: 20 20 52 65 74 75 72 6e 20 2d 31 20 66 6f 72 20 Return -1 for
3440: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 an error..*/.int
3450: 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f blob_read_from_
3460: 66 69 6c 65 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 file(Blob *pBlob
3470: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 , const char *zF
3480: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 ilename){. int
3490: 73 69 7a 65 2c 20 67 6f 74 3b 0a 20 20 46 49 4c size, got;. FIL
34a0: 45 20 2a 69 6e 3b 0a 20 20 69 66 28 20 7a 46 69 E *in;. if( zFi
34b0: 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 lename==0 || zFi
34c0: 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 0a 20 20 20 lename[0]==0.
34d0: 20 20 20 20 20 7c 7c 20 28 7a 46 69 6c 65 6e 61 || (zFilena
34e0: 6d 65 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 me[0]=='-' && zF
34f0: 69 6c 65 6e 61 6d 65 5b 31 5d 3d 3d 30 29 20 29 ilename[1]==0) )
3500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 6c 6f {. return blo
3510: 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 63 68 61 6e b_read_from_chan
3520: 6e 65 6c 28 70 42 6c 6f 62 2c 20 73 74 64 69 6e nel(pBlob, stdin
3530: 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 69 7a , -1);. }. siz
3540: 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65 28 7a 46 e = file_size(zF
3550: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 62 6c 6f 62 ilename);. blob
3560: 5f 7a 65 72 6f 28 70 42 6c 6f 62 29 3b 0a 20 20 _zero(pBlob);.
3570: 69 66 28 20 73 69 7a 65 3c 30 20 29 7b 0a 20 20 if( size<0 ){.
3580: 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 fossil_panic("
3590: 6e 6f 20 73 75 63 68 20 66 69 6c 65 3a 20 25 73 no such file: %s
35a0: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 ", zFilename);.
35b0: 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 3d 3d 30 }. if( size==0
35c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
35d0: 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 ;. }. blob_res
35e0: 69 7a 65 28 70 42 6c 6f 62 2c 20 73 69 7a 65 29 ize(pBlob, size)
35f0: 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a ;. in = fopen(z
3600: 46 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22 29 3b Filename, "rb");
3610: 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a . if( in==0 ){.
3620: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 fossil_panic
3630: 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 25 73 ("cannot open %s
3640: 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 7a for reading", z
3650: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 Filename);. }.
3660: 20 67 6f 74 20 3d 20 66 72 65 61 64 28 62 6c 6f got = fread(blo
3670: 62 5f 62 75 66 66 65 72 28 70 42 6c 6f 62 29 2c b_buffer(pBlob),
3680: 20 31 2c 20 73 69 7a 65 2c 20 69 6e 29 3b 0a 20 1, size, in);.
3690: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 fclose(in);. i
36a0: 66 28 20 67 6f 74 3c 73 69 7a 65 20 29 7b 0a 20 f( got<size ){.
36b0: 20 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 70 blob_resize(p
36c0: 42 6c 6f 62 2c 20 67 6f 74 29 3b 0a 20 20 7d 0a Blob, got);. }.
36d0: 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a return got;.}.
36e0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 ./*.** Write the
36f0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 62 6c content of a bl
3700: 6f 62 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 0a ob into a file..
3710: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c **.** If the fil
3720: 65 6e 61 6d 65 20 69 73 20 62 6c 61 6e 6b 20 6f ename is blank o
3730: 72 20 22 2d 22 20 74 68 65 6e 20 77 72 69 74 65 r "-" then write
3740: 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 to standard out
3750: 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 put..**.** Retur
3760: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
3770: 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a bytes written..*
3780: 2f 0a 69 6e 74 20 62 6c 6f 62 5f 77 72 69 74 65 /.int blob_write
3790: 5f 74 6f 5f 66 69 6c 65 28 42 6c 6f 62 20 2a 70 _to_file(Blob *p
37a0: 42 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 Blob, const char
37b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 *zFilename){.
37c0: 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 69 6e 74 FILE *out;. int
37d0: 20 6e 65 65 64 54 6f 43 6c 6f 73 65 3b 0a 20 20 needToClose;.
37e0: 69 6e 74 20 77 72 6f 74 65 3b 0a 0a 20 20 69 66 int wrote;.. if
37f0: 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d ( zFilename[0]==
3800: 30 20 7c 7c 20 28 7a 46 69 6c 65 6e 61 6d 65 5b 0 || (zFilename[
3810: 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65 0]=='-' && zFile
3820: 6e 61 6d 65 5b 31 5d 3d 3d 30 29 20 29 7b 0a 20 name[1]==0) ){.
3830: 20 20 20 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b out = stdout;
3840: 0a 20 20 20 20 6e 65 65 64 54 6f 43 6c 6f 73 65 . needToClose
3850: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 = 0;. }else{.
3860: 20 20 20 69 6e 74 20 69 2c 20 6e 4e 61 6d 65 3b int i, nName;
3870: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 . char *zName
3880: 2c 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 , zBuf[1000];..
3890: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 nName = strle
38a0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 n(zFilename);.
38b0: 20 20 69 66 28 20 6e 4e 61 6d 65 3e 3d 73 69 7a if( nName>=siz
38c0: 65 6f 66 28 7a 42 75 66 29 20 29 7b 0a 20 20 20 eof(zBuf) ){.
38d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 6d 70 72 69 6e zName = mprin
38e0: 74 66 28 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 tf("%s", zFilena
38f0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a me);. }else{.
3900: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 zName = zB
3910: 75 66 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 uf;. strcpy
3920: 28 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d (zName, zFilenam
3930: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e e);. }. nN
3940: 61 6d 65 20 3d 20 66 69 6c 65 5f 73 69 6d 70 6c ame = file_simpl
3950: 69 66 79 5f 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20 ify_name(zName,
3960: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 nName);. for(
3970: 69 3d 31 3b 20 69 3c 6e 4e 61 6d 65 3b 20 69 2b i=1; i<nName; i+
3980: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e +){. if( zN
3990: 61 6d 65 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 ame[i]=='/' ){.
39a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 69 5d 20 zName[i]
39b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 = 0;. if(
39c0: 20 66 69 6c 65 5f 6d 6b 64 69 72 28 7a 4e 61 6d file_mkdir(zNam
39d0: 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 e, 1) ){.
39e0: 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 fossil_panic(
39f0: 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 "unable to creat
3a00: 65 20 64 69 72 65 63 74 6f 72 79 20 25 73 22 29 e directory %s")
3a10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
3a20: 20 20 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 27 zName[i] = '
3a30: 2f 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 /';. }.
3a40: 7d 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 }. out = fope
3a50: 6e 28 7a 4e 61 6d 65 2c 20 22 77 62 22 29 3b 0a n(zName, "wb");.
3a60: 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 if( out==0 )
3a70: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 {. fossil_p
3a80: 61 6e 69 63 28 22 75 6e 61 62 6c 65 20 74 6f 20 anic("unable to
3a90: 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22 open file \"%s\"
3aa0: 20 66 6f 72 20 77 72 69 74 69 6e 67 22 2c 20 7a for writing", z
3ab0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 Name);. }.
3ac0: 20 6e 65 65 64 54 6f 43 6c 6f 73 65 20 3d 20 31 needToClose = 1
3ad0: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21 ;. if( zName!
3ae0: 3d 7a 42 75 66 20 29 20 66 72 65 65 28 7a 4e 61 =zBuf ) free(zNa
3af0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f me);. }. blob_
3b00: 69 73 5f 69 6e 69 74 28 70 42 6c 6f 62 29 3b 0a is_init(pBlob);.
3b10: 20 20 77 72 6f 74 65 20 3d 20 66 77 72 69 74 65 wrote = fwrite
3b20: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c (blob_buffer(pBl
3b30: 6f 62 29 2c 20 31 2c 20 62 6c 6f 62 5f 73 69 7a ob), 1, blob_siz
3b40: 65 28 70 42 6c 6f 62 29 2c 20 6f 75 74 29 3b 0a e(pBlob), out);.
3b50: 20 20 69 66 28 20 6e 65 65 64 54 6f 43 6c 6f 73 if( needToClos
3b60: 65 20 29 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b e ) fclose(out);
3b70: 0a 20 20 69 66 28 20 77 72 6f 74 65 21 3d 62 6c . if( wrote!=bl
3b80: 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 20 29 ob_size(pBlob) )
3b90: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e {. fossil_pan
3ba0: 69 63 28 22 73 68 6f 72 74 20 77 72 69 74 65 3a ic("short write:
3bb0: 20 25 64 20 6f 66 20 25 64 20 62 79 74 65 73 20 %d of %d bytes
3bc0: 74 6f 20 25 73 22 2c 20 77 72 6f 74 65 2c 0a 20 to %s", wrote,.
3bd0: 20 20 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65 28 blob_size(
3be0: 70 42 6c 6f 62 29 2c 20 7a 46 69 6c 65 6e 61 6d pBlob), zFilenam
3bf0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e e);. }. return
3c00: 20 77 72 6f 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a wrote;.}../*.**
3c10: 20 43 6f 6d 70 72 65 73 73 20 61 20 62 6c 6f 62 Compress a blob
3c20: 20 70 49 6e 2e 20 20 53 74 6f 72 65 20 74 68 65 pIn. Store the
3c30: 20 72 65 73 75 6c 74 20 69 6e 20 70 4f 75 74 2e result in pOut.
3c40: 20 20 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 It is ok for p
3c50: 49 6e 20 61 6e 64 0a 2a 2a 20 70 4f 75 74 20 74 In and.** pOut t
3c60: 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 62 6c o be the same bl
3c70: 6f 62 2e 20 0a 2a 2a 20 0a 2a 2a 20 70 4f 75 74 ob. .** .** pOut
3c80: 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 20 must either be
3c90: 74 68 65 20 73 61 6d 65 20 61 73 20 70 49 6e 20 the same as pIn
3ca0: 6f 72 20 65 6c 73 65 20 75 6e 69 6e 69 74 69 61 or else uninitia
3cb0: 6c 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 62 lized..*/.void b
3cc0: 6c 6f 62 5f 63 6f 6d 70 72 65 73 73 28 42 6c 6f lob_compress(Blo
3cd0: 62 20 2a 70 49 6e 2c 20 42 6c 6f 62 20 2a 70 4f b *pIn, Blob *pO
3ce0: 75 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 ut){. unsigned
3cf0: 69 6e 74 20 6e 49 6e 20 3d 20 62 6c 6f 62 5f 73 int nIn = blob_s
3d00: 69 7a 65 28 70 49 6e 29 3b 0a 20 20 75 6e 73 69 ize(pIn);. unsi
3d10: 67 6e 65 64 20 69 6e 74 20 6e 4f 75 74 20 3d 20 gned int nOut =
3d20: 31 33 20 2b 20 6e 49 6e 20 2b 20 28 6e 49 6e 2b 13 + nIn + (nIn+
3d30: 39 39 39 29 2f 31 30 30 30 3b 0a 20 20 75 6e 73 999)/1000;. uns
3d40: 69 67 6e 65 64 20 6c 6f 6e 67 20 69 6e 74 20 6e igned long int n
3d50: 4f 75 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 Out2;. unsigned
3d60: 20 63 68 61 72 20 2a 6f 75 74 42 75 66 3b 0a 20 char *outBuf;.
3d70: 20 42 6c 6f 62 20 74 65 6d 70 3b 0a 20 20 62 6c Blob temp;. bl
3d80: 6f 62 5f 7a 65 72 6f 28 26 74 65 6d 70 29 3b 0a ob_zero(&temp);.
3d90: 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 26 74 blob_resize(&t
3da0: 65 6d 70 2c 20 6e 4f 75 74 2b 34 29 3b 0a 20 20 emp, nOut+4);.
3db0: 6f 75 74 42 75 66 20 3d 20 28 75 6e 73 69 67 6e outBuf = (unsign
3dc0: 65 64 20 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75 ed char*)blob_bu
3dd0: 66 66 65 72 28 26 74 65 6d 70 29 3b 0a 20 20 6f ffer(&temp);. o
3de0: 75 74 42 75 66 5b 30 5d 20 3d 20 6e 49 6e 3e 3e utBuf[0] = nIn>>
3df0: 32 34 20 26 20 30 78 66 66 3b 0a 20 20 6f 75 74 24 & 0xff;. out
3e00: 42 75 66 5b 31 5d 20 3d 20 6e 49 6e 3e 3e 31 36 Buf[1] = nIn>>16
3e10: 20 26 20 30 78 66 66 3b 0a 20 20 6f 75 74 42 75 & 0xff;. outBu
3e20: 66 5b 32 5d 20 3d 20 6e 49 6e 3e 3e 38 20 26 20 f[2] = nIn>>8 &
3e30: 30 78 66 66 3b 0a 20 20 6f 75 74 42 75 66 5b 33 0xff;. outBuf[3
3e40: 5d 20 3d 20 6e 49 6e 20 26 20 30 78 66 66 3b 0a ] = nIn & 0xff;.
3e50: 20 20 6e 4f 75 74 32 20 3d 20 28 6c 6f 6e 67 20 nOut2 = (long
3e60: 69 6e 74 29 6e 4f 75 74 3b 0a 20 20 63 6f 6d 70 int)nOut;. comp
3e70: 72 65 73 73 28 26 6f 75 74 42 75 66 5b 34 5d 2c ress(&outBuf[4],
3e80: 20 26 6e 4f 75 74 32 2c 0a 20 20 20 20 20 20 20 &nOut2,.
3e90: 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63 68 (unsigned ch
3ea0: 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66 65 72 28 ar*)blob_buffer(
3eb0: 70 49 6e 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 pIn), blob_size(
3ec0: 70 49 6e 29 29 3b 0a 20 20 69 66 28 20 70 4f 75 pIn));. if( pOu
3ed0: 74 3d 3d 70 49 6e 20 29 20 62 6c 6f 62 5f 72 65 t==pIn ) blob_re
3ee0: 73 65 74 28 70 4f 75 74 29 3b 0a 20 20 62 6c 6f set(pOut);. blo
3ef0: 62 5f 69 73 5f 72 65 73 65 74 28 70 4f 75 74 29 b_is_reset(pOut)
3f00: 3b 0a 20 20 2a 70 4f 75 74 20 3d 20 74 65 6d 70 ;. *pOut = temp
3f10: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 ;. blob_resize(
3f20: 70 4f 75 74 2c 20 6e 4f 75 74 32 2b 34 29 3b 0a pOut, nOut2+4);.
3f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 }../*.** COMMAND
3f40: 3a 20 74 65 73 74 2d 63 6f 6d 70 72 65 73 73 0a : test-compress.
3f50: 2a 2f 0a 76 6f 69 64 20 63 6f 6d 70 72 65 73 73 */.void compress
3f60: 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 42 6c _cmd(void){. Bl
3f70: 6f 62 20 66 3b 0a 20 20 69 66 28 20 67 2e 61 72 ob f;. if( g.ar
3f80: 67 63 21 3d 34 20 29 20 75 73 61 67 65 28 22 49 gc!=4 ) usage("I
3f90: 4e 50 55 54 46 49 4c 45 20 4f 55 54 50 55 54 46 NPUTFILE OUTPUTF
3fa0: 49 4c 45 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 ILE");. blob_re
3fb0: 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 66 2c ad_from_file(&f,
3fc0: 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 62 g.argv[2]);. b
3fd0: 6c 6f 62 5f 63 6f 6d 70 72 65 73 73 28 26 66 2c lob_compress(&f,
3fe0: 20 26 66 29 3b 0a 20 20 62 6c 6f 62 5f 77 72 69 &f);. blob_wri
3ff0: 74 65 5f 74 6f 5f 66 69 6c 65 28 26 66 2c 20 67 te_to_file(&f, g
4000: 2e 61 72 67 76 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a .argv[3]);.}../*
4010: 0a 2a 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 .** Compress the
4020: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f concatenation o
4030: 66 20 61 20 62 6c 6f 62 73 20 70 49 6e 31 20 61 f a blobs pIn1 a
4040: 6e 64 20 70 49 6e 32 2e 20 20 53 74 6f 72 65 20 nd pIn2. Store
4050: 74 68 65 20 72 65 73 75 6c 74 20 0a 2a 2a 20 69 the result .** i
4060: 6e 20 70 4f 75 74 2e 20 0a 2a 2a 20 0a 2a 2a 20 n pOut. .** .**
4070: 70 4f 75 74 20 6d 75 73 74 20 62 65 20 65 69 74 pOut must be eit
4080: 68 65 72 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 her uninitialize
4090: 64 20 6f 72 20 6d 75 73 74 20 62 65 20 74 68 65 d or must be the
40a0: 20 73 61 6d 65 20 61 73 20 65 69 74 68 65 72 20 same as either
40b0: 70 49 6e 31 20 6f 72 0a 2a 2a 20 70 49 6e 32 2e pIn1 or.** pIn2.
40c0: 0a 2a 2f 0a 76 6f 69 64 20 62 6c 6f 62 5f 63 6f .*/.void blob_co
40d0: 6d 70 72 65 73 73 32 28 42 6c 6f 62 20 2a 70 49 mpress2(Blob *pI
40e0: 6e 31 2c 20 42 6c 6f 62 20 2a 70 49 6e 32 2c 20 n1, Blob *pIn2,
40f0: 42 6c 6f 62 20 2a 70 4f 75 74 29 7b 0a 20 20 75 Blob *pOut){. u
4100: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 49 6e 20 nsigned int nIn
4110: 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70 49 6e 31 = blob_size(pIn1
4120: 29 20 2b 20 62 6c 6f 62 5f 73 69 7a 65 28 70 49 ) + blob_size(pI
4130: 6e 32 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 n2);. unsigned
4140: 69 6e 74 20 6e 4f 75 74 20 3d 20 31 33 20 2b 20 int nOut = 13 +
4150: 6e 49 6e 20 2b 20 28 6e 49 6e 2b 39 39 39 29 2f nIn + (nIn+999)/
4160: 31 30 30 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 1000;. unsigned
4170: 20 63 68 61 72 20 2a 6f 75 74 42 75 66 3b 0a 20 char *outBuf;.
4180: 20 7a 5f 73 74 72 65 61 6d 20 73 74 72 65 61 6d z_stream stream
4190: 3b 0a 20 20 42 6c 6f 62 20 74 65 6d 70 3b 0a 20 ;. Blob temp;.
41a0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 65 6d 70 blob_zero(&temp
41b0: 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 );. blob_resize
41c0: 28 26 74 65 6d 70 2c 20 6e 4f 75 74 2b 34 29 3b (&temp, nOut+4);
41d0: 0a 20 20 6f 75 74 42 75 66 20 3d 20 28 75 6e 73 . outBuf = (uns
41e0: 69 67 6e 65 64 20 63 68 61 72 2a 29 62 6c 6f 62 igned char*)blob
41f0: 5f 62 75 66 66 65 72 28 26 74 65 6d 70 29 3b 0a _buffer(&temp);.
4200: 20 20 6f 75 74 42 75 66 5b 30 5d 20 3d 20 6e 49 outBuf[0] = nI
4210: 6e 3e 3e 32 34 20 26 20 30 78 66 66 3b 0a 20 20 n>>24 & 0xff;.
4220: 6f 75 74 42 75 66 5b 31 5d 20 3d 20 6e 49 6e 3e outBuf[1] = nIn>
4230: 3e 31 36 20 26 20 30 78 66 66 3b 0a 20 20 6f 75 >16 & 0xff;. ou
4240: 74 42 75 66 5b 32 5d 20 3d 20 6e 49 6e 3e 3e 38 tBuf[2] = nIn>>8
4250: 20 26 20 30 78 66 66 3b 0a 20 20 6f 75 74 42 75 & 0xff;. outBu
4260: 66 5b 33 5d 20 3d 20 6e 49 6e 20 26 20 30 78 66 f[3] = nIn & 0xf
4270: 66 3b 0a 20 20 73 74 72 65 61 6d 2e 7a 61 6c 6c f;. stream.zall
4280: 6f 63 20 3d 20 28 61 6c 6c 6f 63 5f 66 75 6e 63 oc = (alloc_func
4290: 29 30 3b 0a 20 20 73 74 72 65 61 6d 2e 7a 66 72 )0;. stream.zfr
42a0: 65 65 20 3d 20 28 66 72 65 65 5f 66 75 6e 63 29 ee = (free_func)
42b0: 30 3b 0a 20 20 73 74 72 65 61 6d 2e 6f 70 61 71 0;. stream.opaq
42c0: 75 65 20 3d 20 30 3b 0a 20 20 73 74 72 65 61 6d ue = 0;. stream
42d0: 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 6e 4f 75 .avail_out = nOu
42e0: 74 3b 0a 20 20 73 74 72 65 61 6d 2e 6e 65 78 74 t;. stream.next
42f0: 5f 6f 75 74 20 3d 20 26 6f 75 74 42 75 66 5b 34 _out = &outBuf[4
4300: 5d 3b 0a 20 20 64 65 66 6c 61 74 65 49 6e 69 74 ];. deflateInit
4310: 28 26 73 74 72 65 61 6d 2c 20 39 29 3b 0a 20 20 (&stream, 9);.
4320: 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 stream.avail_in
4330: 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70 49 6e 31 = blob_size(pIn1
4340: 29 3b 0a 20 20 73 74 72 65 61 6d 2e 6e 65 78 74 );. stream.next
4350: 5f 69 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 _in = (unsigned
4360: 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66 65 char*)blob_buffe
4370: 72 28 70 49 6e 31 29 3b 0a 20 20 64 65 66 6c 61 r(pIn1);. defla
4380: 74 65 28 26 73 74 72 65 61 6d 2c 20 30 29 3b 0a te(&stream, 0);.
4390: 20 20 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 stream.avail_i
43a0: 6e 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70 49 n = blob_size(pI
43b0: 6e 32 29 3b 0a 20 20 73 74 72 65 61 6d 2e 6e 65 n2);. stream.ne
43c0: 78 74 5f 69 6e 20 3d 20 28 75 6e 73 69 67 6e 65 xt_in = (unsigne
43d0: 64 20 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75 66 d char*)blob_buf
43e0: 66 65 72 28 70 49 6e 32 29 3b 0a 20 20 64 65 66 fer(pIn2);. def
43f0: 6c 61 74 65 28 26 73 74 72 65 61 6d 2c 20 30 29 late(&stream, 0)
4400: 3b 0a 20 20 64 65 66 6c 61 74 65 28 26 73 74 72 ;. deflate(&str
4410: 65 61 6d 2c 20 5a 5f 46 49 4e 49 53 48 29 3b 0a eam, Z_FINISH);.
4420: 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 26 74 blob_resize(&t
4430: 65 6d 70 2c 20 73 74 72 65 61 6d 2e 74 6f 74 61 emp, stream.tota
4440: 6c 5f 6f 75 74 20 2b 20 34 29 3b 0a 20 20 64 65 l_out + 4);. de
4450: 66 6c 61 74 65 45 6e 64 28 26 73 74 72 65 61 6d flateEnd(&stream
4460: 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 70 );. if( pOut==p
4470: 49 6e 31 20 29 20 62 6c 6f 62 5f 72 65 73 65 74 In1 ) blob_reset
4480: 28 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 4f (pOut);. if( pO
4490: 75 74 3d 3d 70 49 6e 32 20 29 20 62 6c 6f 62 5f ut==pIn2 ) blob_
44a0: 72 65 73 65 74 28 70 4f 75 74 29 3b 0a 20 20 62 reset(pOut);. b
44b0: 6c 6f 62 5f 69 73 5f 72 65 73 65 74 28 70 4f 75 lob_is_reset(pOu
44c0: 74 29 3b 0a 20 20 2a 70 4f 75 74 20 3d 20 74 65 t);. *pOut = te
44d0: 6d 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d mp;.}../*.** COM
44e0: 4d 41 4e 44 3a 20 74 65 73 74 2d 63 6f 6d 70 72 MAND: test-compr
44f0: 65 73 73 2d 32 0a 2a 2f 0a 76 6f 69 64 20 63 6f ess-2.*/.void co
4500: 6d 70 72 65 73 73 32 5f 63 6d 64 28 76 6f 69 64 mpress2_cmd(void
4510: 29 7b 0a 20 20 42 6c 6f 62 20 66 31 2c 20 66 32 ){. Blob f1, f2
4520: 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d ;. if( g.argc!=
4530: 35 20 29 20 75 73 61 67 65 28 22 49 4e 50 55 54 5 ) usage("INPUT
4540: 46 49 4c 45 31 20 49 4e 50 55 54 46 49 4c 45 32 FILE1 INPUTFILE2
4550: 20 4f 55 54 50 55 54 46 49 4c 45 22 29 3b 0a 20 OUTPUTFILE");.
4560: 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f blob_read_from_
4570: 66 69 6c 65 28 26 66 31 2c 20 67 2e 61 72 67 76 file(&f1, g.argv
4580: 5b 32 5d 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 61 [2]);. blob_rea
4590: 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 66 32 2c d_from_file(&f2,
45a0: 20 67 2e 61 72 67 76 5b 33 5d 29 3b 0a 20 20 62 g.argv[3]);. b
45b0: 6c 6f 62 5f 63 6f 6d 70 72 65 73 73 32 28 26 66 lob_compress2(&f
45c0: 31 2c 20 26 66 32 2c 20 26 66 31 29 3b 0a 20 20 1, &f2, &f1);.
45d0: 62 6c 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 blob_write_to_fi
45e0: 6c 65 28 26 66 31 2c 20 67 2e 61 72 67 76 5b 34 le(&f1, g.argv[4
45f0: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 63 ]);.}../*.** Unc
4600: 6f 6d 70 72 65 73 73 20 62 6c 6f 62 20 70 49 6e ompress blob pIn
4610: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 and store the r
4620: 65 73 75 6c 74 20 69 6e 20 70 4f 75 74 2e 20 20 esult in pOut.
4630: 49 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 49 6e It is ok for pIn
4640: 20 61 6e 64 0a 2a 2a 20 70 4f 75 74 20 74 6f 20 and.** pOut to
4650: 62 65 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 be the same blob
4660: 2e 0a 2a 2a 0a 2a 2a 20 70 4f 75 74 20 6d 75 73 ..**.** pOut mus
4670: 74 20 62 65 20 65 69 74 68 65 72 20 75 6e 69 6e t be either unin
4680: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 itialized or the
4690: 20 73 61 6d 65 20 61 73 20 70 49 6e 2e 0a 2a 2f same as pIn..*/
46a0: 0a 69 6e 74 20 62 6c 6f 62 5f 75 6e 63 6f 6d 70 .int blob_uncomp
46b0: 72 65 73 73 28 42 6c 6f 62 20 2a 70 49 6e 2c 20 ress(Blob *pIn,
46c0: 42 6c 6f 62 20 2a 70 4f 75 74 29 7b 0a 20 20 75 Blob *pOut){. u
46d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 4f 75 74 nsigned int nOut
46e0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 ;. unsigned cha
46f0: 72 20 2a 69 6e 42 75 66 3b 0a 20 20 75 6e 73 69 r *inBuf;. unsi
4700: 67 6e 65 64 20 69 6e 74 20 6e 49 6e 20 3d 20 62 gned int nIn = b
4710: 6c 6f 62 5f 73 69 7a 65 28 70 49 6e 29 3b 0a 20 lob_size(pIn);.
4720: 20 42 6c 6f 62 20 74 65 6d 70 3b 0a 20 20 69 6e Blob temp;. in
4730: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 t rc;. unsigned
4740: 20 6c 6f 6e 67 20 69 6e 74 20 6e 4f 75 74 32 3b long int nOut2;
4750: 0a 20 20 69 66 28 20 6e 49 6e 3c 3d 34 20 29 7b . if( nIn<=4 ){
4760: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 . return 0;.
4770: 20 7d 0a 20 20 69 6e 42 75 66 20 3d 20 28 75 6e }. inBuf = (un
4780: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 62 6c 6f signed char*)blo
4790: 62 5f 62 75 66 66 65 72 28 70 49 6e 29 3b 0a 20 b_buffer(pIn);.
47a0: 20 6e 4f 75 74 20 3d 20 28 69 6e 42 75 66 5b 30 nOut = (inBuf[0
47b0: 5d 3c 3c 32 34 29 20 2b 20 28 69 6e 42 75 66 5b ]<<24) + (inBuf[
47c0: 31 5d 3c 3c 31 36 29 20 2b 20 28 69 6e 42 75 66 1]<<16) + (inBuf
47d0: 5b 32 5d 3c 3c 38 29 20 2b 20 69 6e 42 75 66 5b [2]<<8) + inBuf[
47e0: 33 5d 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 3];. blob_zero(
47f0: 26 74 65 6d 70 29 3b 0a 20 20 62 6c 6f 62 5f 72 &temp);. blob_r
4800: 65 73 69 7a 65 28 26 74 65 6d 70 2c 20 6e 4f 75 esize(&temp, nOu
4810: 74 2b 31 29 3b 0a 20 20 6e 4f 75 74 32 20 3d 20 t+1);. nOut2 =
4820: 28 6c 6f 6e 67 20 69 6e 74 29 6e 4f 75 74 3b 0a (long int)nOut;.
4830: 20 20 72 63 20 3d 20 75 6e 63 6f 6d 70 72 65 73 rc = uncompres
4840: 73 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 s((unsigned char
4850: 2a 29 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 74 *)blob_buffer(&t
4860: 65 6d 70 29 2c 20 26 6e 4f 75 74 32 2c 20 0a 20 emp), &nOut2, .
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4880: 20 26 69 6e 42 75 66 5b 34 5d 2c 20 62 6c 6f 62 &inBuf[4], blob
4890: 5f 73 69 7a 65 28 70 49 6e 29 29 3b 0a 20 20 69 _size(pIn));. i
48a0: 66 28 20 72 63 21 3d 5a 5f 4f 4b 20 29 7b 0a 20 f( rc!=Z_OK ){.
48b0: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 74 blob_reset(&t
48c0: 65 6d 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e emp);. return
48d0: 20 31 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 1;. }. blob_r
48e0: 65 73 69 7a 65 28 26 74 65 6d 70 2c 20 6e 4f 75 esize(&temp, nOu
48f0: 74 32 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d t2);. if( pOut=
4900: 3d 70 49 6e 20 29 20 62 6c 6f 62 5f 72 65 73 65 =pIn ) blob_rese
4910: 74 28 70 4f 75 74 29 3b 0a 20 20 62 6c 6f 62 5f t(pOut);. blob_
4920: 69 73 5f 72 65 73 65 74 28 70 4f 75 74 29 3b 0a is_reset(pOut);.
4930: 20 20 2a 70 4f 75 74 20 3d 20 74 65 6d 70 3b 0a *pOut = temp;.
4940: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../
4950: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 *.** COMMAND: te
4960: 73 74 2d 75 6e 63 6f 6d 70 72 65 73 73 0a 2a 2f st-uncompress.*/
4970: 0a 76 6f 69 64 20 75 6e 63 6f 6d 70 72 65 73 73 .void uncompress
4980: 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 42 6c _cmd(void){. Bl
4990: 6f 62 20 66 3b 0a 20 20 69 66 28 20 67 2e 61 72 ob f;. if( g.ar
49a0: 67 63 21 3d 34 20 29 20 75 73 61 67 65 28 22 49 gc!=4 ) usage("I
49b0: 4e 50 55 54 46 49 4c 45 20 4f 55 54 50 55 54 46 NPUTFILE OUTPUTF
49c0: 49 4c 45 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 ILE");. blob_re
49d0: 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 66 2c ad_from_file(&f,
49e0: 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 62 g.argv[2]);. b
49f0: 6c 6f 62 5f 75 6e 63 6f 6d 70 72 65 73 73 28 26 lob_uncompress(&
4a00: 66 2c 20 26 66 29 3b 0a 20 20 62 6c 6f 62 5f 77 f, &f);. blob_w
4a10: 72 69 74 65 5f 74 6f 5f 66 69 6c 65 28 26 66 2c rite_to_file(&f,
4a20: 20 67 2e 61 72 67 76 5b 33 5d 29 3b 0a 7d 0a 0a g.argv[3]);.}..
4a30: 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 /*.** COMMAND: t
4a40: 65 73 74 2d 63 79 63 6c 65 2d 63 6f 6d 70 72 65 est-cycle-compre
4a50: 73 73 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 72 65 73 ss.**.** Compres
4a60: 73 20 61 6e 64 20 75 6e 63 6f 6d 70 72 65 73 73 s and uncompress
4a70: 20 65 61 63 68 20 66 69 6c 65 20 6e 61 6d 65 64 each file named
4a80: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 on the command
4a90: 6c 69 6e 65 2e 0a 2a 2a 20 56 65 72 69 66 79 20 line..** Verify
4aa0: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 that the origina
4ab0: 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 63 l content is rec
4ac0: 6f 76 65 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 overed..*/.void
4ad0: 74 65 73 74 5f 63 79 63 6c 65 5f 63 6f 6d 70 72 test_cycle_compr
4ae0: 65 73 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 ess(void){. int
4af0: 20 69 3b 0a 20 20 42 6c 6f 62 20 62 31 2c 20 62 i;. Blob b1, b
4b00: 32 2c 20 62 33 3b 0a 20 20 66 6f 72 28 69 3d 32 2, b3;. for(i=2
4b10: 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 ; i<g.argc; i++)
4b20: 7b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f {. blob_read_
4b30: 66 72 6f 6d 5f 66 69 6c 65 28 26 62 31 2c 20 67 from_file(&b1, g
4b40: 2e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 .argv[i]);. b
4b50: 6c 6f 62 5f 63 6f 6d 70 72 65 73 73 28 26 62 31 lob_compress(&b1
4b60: 2c 20 26 62 32 29 3b 0a 20 20 20 20 62 6c 6f 62 , &b2);. blob
4b70: 5f 75 6e 63 6f 6d 70 72 65 73 73 28 26 62 32 2c _uncompress(&b2,
4b80: 20 26 62 33 29 3b 0a 20 20 20 20 69 66 28 20 62 &b3);. if( b
4b90: 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 26 62 31 2c lob_compare(&b1,
4ba0: 20 26 62 33 29 20 29 7b 0a 20 20 20 20 20 20 66 &b3) ){. f
4bb0: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 63 6f 6d ossil_panic("com
4bc0: 70 72 65 73 73 2f 75 6e 63 6f 6d 70 72 65 73 73 press/uncompress
4bd0: 20 63 79 63 6c 65 20 66 61 69 6c 65 64 20 66 6f cycle failed fo
4be0: 72 20 25 73 22 2c 20 67 2e 61 72 67 76 5b 69 5d r %s", g.argv[i]
4bf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f );. }. blo
4c00: 62 5f 72 65 73 65 74 28 26 62 31 29 3b 0a 20 20 b_reset(&b1);.
4c10: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 62 32 blob_reset(&b2
4c20: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 );. blob_rese
4c30: 74 28 26 62 33 29 3b 0a 20 20 7d 0a 20 20 70 72 t(&b3);. }. pr
4c40: 69 6e 74 66 28 22 6f 6b 5c 6e 22 29 3b 0a 7d 0a intf("ok\n");.}.