Hex Artifact Content
Not logged in

Artifact 1af641b4b641fe5cddcf7180b5cf6f15b1e80e7a:

File src/delta.c part of check-in [522104c2cd] - Improvements to the delta generator algorthm so that it runs much faster on large files with very few similarities. There is no change to the delta format generated, so this is fully backwards and forwards compatible. by drh on 2009-03-24 22:03:56.

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 54 68 69 73 20 6d 6f 64 75  .**.** This modu
0370: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  le implements th
0380: 65 20 64 65 6c 74 61 20 63 6f 6d 70 72 65 73 73  e delta compress
0390: 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a   algorithm..**.*
03a0: 2a 20 54 68 6f 75 67 68 20 64 65 76 65 6c 6f 70  * Though develop
03b0: 65 64 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20  ed specifically 
03c0: 66 6f 72 20 66 6f 73 73 69 6c 2c 20 74 68 65 20  for fossil, the 
03d0: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
03e0: 65 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 6c 6c  e.** is generall
03f0: 79 20 61 70 70 6c 69 61 62 6c 65 20 61 6e 64 20  y appliable and 
0400: 69 73 20 74 68 75 73 20 65 61 73 69 6c 79 20 73  is thus easily s
0410: 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68  eparated from th
0420: 65 0a 2a 2a 20 66 6f 73 73 69 6c 20 73 6f 75 72  e.** fossil sour
0430: 63 65 20 63 6f 64 65 20 62 61 73 65 2e 20 20 4e  ce code base.  N
0440: 6f 74 68 69 6e 67 20 69 6e 20 74 68 69 73 20 66  othing in this f
0450: 69 6c 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 61  ile depends on a
0460: 6e 79 74 68 69 6e 67 0a 2a 2a 20 65 6c 73 65 20  nything.** else 
0470: 69 6e 20 66 6f 73 73 69 6c 2e 0a 2a 2f 0a 23 69  in fossil..*/.#i
0480: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
0490: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
04a0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
04b0: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
04c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
04d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
04e0: 75 72 6e 69 6e 67 20 64 65 62 75 67 67 69 6e 67  urning debugging
04f0: 20 70 72 69 6e 74 66 73 20 6f 6e 20 61 6e 64 20   printfs on and 
0500: 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 20 64  off.*/.#if 0.# d
0510: 65 66 69 6e 65 20 44 45 42 55 47 31 28 58 29 20  efine DEBUG1(X) 
0520: 58 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  X.#else.# define
0530: 20 44 45 42 55 47 31 28 58 29 0a 23 65 6e 64 69   DEBUG1(X).#endi
0540: 66 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20  f.#if 0.#define 
0550: 44 45 42 55 47 32 28 58 29 20 58 0a 2f 2a 0a 2a  DEBUG2(X) X./*.*
0560: 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 3a  * For debugging:
0570: 0a 2a 2a 20 50 72 69 6e 74 20 31 36 20 63 68 61  .** Print 16 cha
0580: 72 61 63 74 65 72 73 20 6f 66 20 74 65 78 74 20  racters of text 
0590: 66 72 6f 6d 20 7a 42 75 66 0a 2a 2f 0a 73 74 61  from zBuf.*/.sta
05a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
05b0: 70 72 69 6e 74 31 36 28 63 6f 6e 73 74 20 63 68  print16(const ch
05c0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
05d0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
05e0: 42 75 66 5b 32 30 5d 3b 0a 20 20 66 6f 72 28 69  Buf[20];.  for(i
05f0: 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b 0a  =0; i<16; i++){.
0600: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3e 3d 30 78      if( z[i]>=0x
0610: 32 30 20 26 26 20 7a 5b 69 5d 3c 3d 30 78 37 65  20 && z[i]<=0x7e
0620: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 69   ){.      zBuf[i
0630: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 7d 65  ] = z[i];.    }e
0640: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  lse{.      zBuf[
0650: 69 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7d 0a  i] = '.';.    }.
0660: 20 20 7d 0a 20 20 7a 42 75 66 5b 69 5d 20 3d 20    }.  zBuf[i] = 
0670: 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66  0;.  return zBuf
0680: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
0690: 6e 65 20 44 45 42 55 47 32 28 58 29 0a 23 65 6e  ne DEBUG2(X).#en
06a0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
06b0: 22 75 33 32 22 20 74 79 70 65 20 6d 75 73 74 20  "u32" type must 
06c0: 62 65 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 33  be an unsigned 3
06d0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20  2-bit integer.  
06e0: 41 64 6a 75 73 74 20 74 68 69 73 0a 2a 2f 0a 74  Adjust this.*/.t
06f0: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0700: 69 6e 74 20 75 33 32 3b 0a 0a 2f 2a 0a 2a 2a 20  int u32;../*.** 
0710: 4d 75 73 74 20 62 65 20 61 20 31 36 2d 62 69 74  Must be a 16-bit
0720: 20 76 61 6c 75 65 20 0a 2a 2f 0a 74 79 70 65 64   value .*/.typed
0730: 65 66 20 73 68 6f 72 74 20 69 6e 74 20 73 31 36  ef short int s16
0740: 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ;.typedef unsign
0750: 65 64 20 73 68 6f 72 74 20 69 6e 74 20 75 31 36  ed short int u16
0760: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 64  ;../*.** The wid
0770: 74 68 20 6f 66 20 61 20 68 61 73 68 20 77 69 6e  th of a hash win
0780: 64 6f 77 20 69 6e 20 62 79 74 65 73 2e 20 20 54  dow in bytes.  T
0790: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  he algorithm onl
07a0: 79 20 77 6f 72 6b 73 20 69 66 20 74 68 69 73 0a  y works if this.
07b0: 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ** is a power of
07c0: 20 32 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e   2..*/.#define N
07d0: 48 41 53 48 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 54  HASH 16../*.** T
07e0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
07f0: 20 6f 66 20 74 68 65 20 72 6f 6c 6c 69 6e 67 20   of the rolling 
0800: 68 61 73 68 2e 0a 2a 2a 0a 2a 2a 20 7a 5b 5d 20  hash..**.** z[] 
0810: 68 6f 6c 64 73 20 74 68 65 20 76 61 6c 75 65 73  holds the values
0820: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
0830: 68 61 73 68 65 64 2e 20 20 7a 5b 5d 20 69 73 20  hashed.  z[] is 
0840: 61 20 63 69 72 63 75 6c 61 72 20 62 75 66 66 65  a circular buffe
0850: 72 2e 0a 2a 2a 20 7a 5b 69 5d 20 69 73 20 74 68  r..** z[i] is th
0860: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 61 6e  e first entry an
0870: 64 20 7a 5b 28 69 2b 4e 48 41 53 48 2d 31 29 25  d z[(i+NHASH-1)%
0880: 4e 48 41 53 48 5d 20 69 73 20 74 68 65 20 6c 61  NHASH] is the la
0890: 73 74 20 65 6e 74 72 79 20 6f 66 20 0a 2a 2a 20  st entry of .** 
08a0: 74 68 65 20 77 69 6e 64 6f 77 2e 0a 2a 2a 0a 2a  the window..**.*
08b0: 2a 20 48 61 73 68 2e 61 20 69 73 20 74 68 65 20  * Hash.a is the 
08c0: 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6c 65 6d 65  sum of all eleme
08d0: 6e 74 73 20 6f 66 20 68 61 73 68 2e 7a 5b 5d 2e  nts of hash.z[].
08e0: 20 20 48 61 73 68 2e 62 20 69 73 20 61 20 77 65    Hash.b is a we
08f0: 69 67 68 74 65 64 0a 2a 2a 20 73 75 6d 2e 20 20  ighted.** sum.  
0900: 48 61 73 68 2e 62 20 69 73 20 7a 5b 69 5d 2a 4e  Hash.b is z[i]*N
0910: 48 41 53 48 20 2b 20 7a 5b 69 2b 31 5d 2a 28 4e  HASH + z[i+1]*(N
0920: 48 41 53 48 2d 31 29 20 2b 20 2e 2e 2e 20 2b 20  HASH-1) + ... + 
0930: 7a 5b 69 2b 4e 48 41 53 48 2d 31 5d 2a 31 2e 0a  z[i+NHASH-1]*1..
0940: 2a 2a 20 28 45 61 63 68 20 69 6e 64 65 78 20 66  ** (Each index f
0950: 6f 72 20 7a 5b 5d 20 73 68 6f 75 6c 64 20 62 65  or z[] should be
0960: 20 6d 6f 64 75 6c 65 20 4e 48 41 53 48 2c 20 6f   module NHASH, o
0970: 66 20 63 6f 75 72 73 65 2e 20 20 54 68 65 20 25  f course.  The %
0980: 4e 48 41 53 48 20 6f 70 65 72 61 74 6f 72 0a 2a  NHASH operator.*
0990: 2a 20 69 73 20 6f 6d 69 74 74 65 64 20 69 6e 20  * is omitted in 
09a0: 74 68 65 20 70 72 69 6f 72 20 65 78 70 72 65 73  the prior expres
09b0: 73 69 6f 6e 20 66 6f 72 20 62 72 65 76 69 74 79  sion for brevity
09c0: 2e 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  .).*/.typedef st
09d0: 72 75 63 74 20 68 61 73 68 20 68 61 73 68 3b 0a  ruct hash hash;.
09e0: 73 74 72 75 63 74 20 68 61 73 68 20 7b 0a 20 20  struct hash {.  
09f0: 75 31 36 20 61 2c 20 62 3b 20 20 20 20 20 20 20  u16 a, b;       
0a00: 20 20 2f 2a 20 48 61 73 68 20 76 61 6c 75 65 73    /* Hash values
0a10: 20 2a 2f 0a 20 20 75 31 36 20 69 3b 20 20 20 20   */.  u16 i;    
0a20: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
0a30: 20 6f 66 20 74 68 65 20 68 61 73 68 20 77 69 6e   of the hash win
0a40: 64 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 7a 5b  dow */.  char z[
0a50: 4e 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 54 68  NHASH];    /* Th
0a60: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 68 61  e values that ha
0a70: 76 65 20 62 65 65 6e 20 68 61 73 68 65 64 20 2a  ve been hashed *
0a80: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  /.};../*.** Init
0a90: 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 6c 6c 69  ialize the rolli
0aa0: 6e 67 20 68 61 73 68 20 75 73 69 6e 67 20 74 68  ng hash using th
0ab0: 65 20 66 69 72 73 74 20 4e 48 41 53 48 20 63 68  e first NHASH ch
0ac0: 61 72 61 63 74 65 72 73 20 6f 66 20 7a 5b 5d 0a  aracters of z[].
0ad0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
0ae0: 61 73 68 5f 69 6e 69 74 28 68 61 73 68 20 2a 70  ash_init(hash *p
0af0: 48 61 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  Hash, const char
0b00: 20 2a 7a 29 7b 0a 20 20 75 31 36 20 61 2c 20 62   *z){.  u16 a, b
0b10: 2c 20 69 3b 0a 20 20 61 20 3d 20 62 20 3d 20 30  , i;.  a = b = 0
0b20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e  ;.  for(i=0; i<N
0b30: 48 41 53 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  HASH; i++){.    
0b40: 61 20 2b 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 62  a += z[i];.    b
0b50: 20 2b 3d 20 28 4e 48 41 53 48 2d 69 29 2a 7a 5b   += (NHASH-i)*z[
0b60: 69 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e 7a  i];.    pHash->z
0b70: 5b 69 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  [i] = z[i];.  }.
0b80: 20 20 70 48 61 73 68 2d 3e 61 20 3d 20 61 20 26    pHash->a = a &
0b90: 20 30 78 66 66 66 66 3b 0a 20 20 70 48 61 73 68   0xffff;.  pHash
0ba0: 2d 3e 62 20 3d 20 62 20 26 20 30 78 66 66 66 66  ->b = b & 0xffff
0bb0: 3b 0a 20 20 70 48 61 73 68 2d 3e 69 20 3d 20 30  ;.  pHash->i = 0
0bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
0bd0: 63 65 20 74 68 65 20 72 6f 6c 6c 69 6e 67 20 68  ce the rolling h
0be0: 61 73 68 20 62 79 20 61 20 73 69 6e 67 6c 65 20  ash by a single 
0bf0: 63 68 61 72 61 63 74 65 72 20 22 63 22 0a 2a 2f  character "c".*/
0c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 73  .static void has
0c10: 68 5f 6e 65 78 74 28 68 61 73 68 20 2a 70 48 61  h_next(hash *pHa
0c20: 73 68 2c 20 69 6e 74 20 63 29 7b 0a 20 20 75 31  sh, int c){.  u1
0c30: 36 20 6f 6c 64 20 3d 20 70 48 61 73 68 2d 3e 7a  6 old = pHash->z
0c40: 5b 70 48 61 73 68 2d 3e 69 5d 3b 0a 20 20 70 48  [pHash->i];.  pH
0c50: 61 73 68 2d 3e 7a 5b 70 48 61 73 68 2d 3e 69 5d  ash->z[pHash->i]
0c60: 20 3d 20 63 3b 0a 20 20 70 48 61 73 68 2d 3e 69   = c;.  pHash->i
0c70: 20 3d 20 28 70 48 61 73 68 2d 3e 69 2b 31 29 26   = (pHash->i+1)&
0c80: 28 4e 48 41 53 48 2d 31 29 3b 0a 20 20 70 48 61  (NHASH-1);.  pHa
0c90: 73 68 2d 3e 61 20 3d 20 70 48 61 73 68 2d 3e 61  sh->a = pHash->a
0ca0: 20 2d 20 6f 6c 64 20 2b 20 63 3b 0a 20 20 70 48   - old + c;.  pH
0cb0: 61 73 68 2d 3e 62 20 3d 20 70 48 61 73 68 2d 3e  ash->b = pHash->
0cc0: 62 20 2d 20 4e 48 41 53 48 2a 6f 6c 64 20 2b 20  b - NHASH*old + 
0cd0: 70 48 61 73 68 2d 3e 61 3b 0a 7d 0a 0a 2f 2a 0a  pHash->a;.}../*.
0ce0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
0cf0: 69 74 20 68 61 73 68 20 76 61 6c 75 65 0a 2a 2f  it hash value.*/
0d00: 0a 73 74 61 74 69 63 20 75 33 32 20 68 61 73 68  .static u32 hash
0d10: 5f 33 32 62 69 74 28 68 61 73 68 20 2a 70 48 61  _32bit(hash *pHa
0d20: 73 68 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  sh){.  return (p
0d30: 48 61 73 68 2d 3e 61 20 26 20 30 78 66 66 66 66  Hash->a & 0xffff
0d40: 29 20 7c 20 28 28 28 75 33 32 29 28 70 48 61 73  ) | (((u32)(pHas
0d50: 68 2d 3e 62 20 26 20 30 78 66 66 66 66 29 29 3c  h->b & 0xffff))<
0d60: 3c 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  <16);.}../*.** W
0d70: 72 69 74 65 20 61 6e 20 62 61 73 65 2d 36 34 20  rite an base-64 
0d80: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
0d90: 20 67 69 76 65 6e 20 62 75 66 66 65 72 2e 0a 2a   given buffer..*
0da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
0db0: 74 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 69 6e  tInt(unsigned in
0dc0: 74 20 76 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b  t v, char **pz){
0dd0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0de0: 63 68 61 72 20 7a 44 69 67 69 74 73 5b 5d 20 3d  char zDigits[] =
0df0: 20 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38   .    "012345678
0e00: 39 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  9ABCDEFGHIJKLMNO
0e10: 50 51 52 53 54 55 56 57 58 59 5a 5f 61 62 63 64  PQRSTUVWXYZ_abcd
0e20: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
0e30: 75 76 77 78 79 7a 7e 22 3b 0a 20 20 2f 2a 20 20  uvwxyz~";.  /*  
0e40: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e50: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
0e60: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
0e70: 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33 20  9 123456789 123 
0e80: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
0e90: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 5d 3b 0a   char zBuf[20];.
0ea0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
0eb0: 20 20 2a 28 2a 70 7a 29 2b 2b 20 3d 20 27 30 27    *(*pz)++ = '0'
0ec0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
0ed0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 76 3e 30  }.  for(i=0; v>0
0ee0: 3b 20 69 2b 2b 2c 20 76 3e 3e 3d 36 29 7b 0a 20  ; i++, v>>=6){. 
0ef0: 20 20 20 7a 42 75 66 5b 69 5d 20 3d 20 7a 44 69     zBuf[i] = zDi
0f00: 67 69 74 73 5b 76 26 30 78 33 66 5d 3b 0a 20 20  gits[v&0x3f];.  
0f10: 7d 0a 20 20 66 6f 72 28 6a 3d 69 2d 31 3b 20 6a  }.  for(j=i-1; j
0f20: 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 2a  >=0; j--){.    *
0f30: 28 2a 70 7a 29 2b 2b 20 3d 20 7a 42 75 66 5b 6a  (*pz)++ = zBuf[j
0f40: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
0f50: 52 65 61 64 20 62 79 74 65 73 20 66 72 6f 6d 20  Read bytes from 
0f60: 2a 70 7a 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  *pz and convert 
0f70: 74 68 65 6d 20 69 6e 74 6f 20 61 20 70 6f 73 69  them into a posi
0f80: 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20 20 57  tive integer.  W
0f90: 68 65 6e 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c  hen.** finished,
0fa0: 20 6c 65 61 76 65 20 2a 70 7a 20 70 6f 69 6e 74   leave *pz point
0fb0: 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
0fc0: 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20   character past 
0fd0: 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 74 68  the end of.** th
0fe0: 65 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 20  e integer.  The 
0ff0: 2a 70 4c 65 6e 20 70 61 72 61 6d 65 74 65 72 20  *pLen parameter 
1000: 68 6f 6c 64 73 20 74 68 65 20 6c 65 6e 67 74 68  holds the length
1010: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   of the string.*
1020: 2a 20 69 6e 20 2a 70 7a 20 61 6e 64 20 69 73 20  * in *pz and is 
1030: 64 65 63 72 65 6d 65 6e 74 65 64 20 6f 6e 63 65  decremented once
1040: 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63   for each charac
1050: 74 65 72 20 69 6e 20 74 68 65 20 69 6e 74 65 67  ter in the integ
1060: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  er..*/.static un
1070: 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74 49 6e  signed int getIn
1080: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70  t(const char **p
1090: 7a 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20  z, int *pLen){. 
10a0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69   static const si
10b0: 67 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75 65  gned char zValue
10c0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d  [] = {.    -1, -
10d0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
10e0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c  1, -1, -1,   -1,
10f0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1100: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20   -1, -1, -1,.   
1110: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1120: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1130: 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d     -1, -1, -1, -
1140: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
1150: 31 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d  1,.    -1, -1, -
1160: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
1170: 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c  1, -1,   -1, -1,
1180: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
1190: 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c   -1, -1,.     0,
11a0: 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c    1,  2,  3,  4,
11b0: 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20 20    5,  6,  7,    
11c0: 38 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d  8,  9, -1, -1, -
11d0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20  1, -1, -1, -1,. 
11e0: 20 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31     -1, 10, 11, 1
11f0: 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31  2, 13, 14, 15, 1
1200: 36 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39 2c  6,   17, 18, 19,
1210: 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c   20, 21, 22, 23,
1220: 20 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c   24,.    25, 26,
1230: 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c   27, 28, 29, 30,
1240: 20 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20 33   31, 32,   33, 3
1250: 34 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d  4, 35, -1, -1, -
1260: 31 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d  1, -1, 36,.    -
1270: 31 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34  1, 37, 38, 39, 4
1280: 30 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 20  0, 41, 42, 43,  
1290: 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c   44, 45, 46, 47,
12a0: 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c   48, 49, 50, 51,
12b0: 0a 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34 2c  .    52, 53, 54,
12c0: 20 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c   55, 56, 57, 58,
12d0: 20 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20 36   59,   60, 61, 6
12e0: 32 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36  2, -1, -1, -1, 6
12f0: 33 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e  3, -1,.  };.  un
1300: 73 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20 30  signed int v = 0
1310: 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73  ;.  int c;.  uns
1320: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
1330: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1340: 2a 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *pz;.  unsigned 
1350: 63 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a  char *zStart = z
1360: 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20  ;.  while( (c = 
1370: 7a 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b  zValue[0x7f&*(z+
1380: 2b 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  +)])>=0 ){.     
1390: 76 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a  v = (v<<6) + c;.
13a0: 20 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c    }.  z--;.  *pL
13b0: 65 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74  en -= z - zStart
13c0: 3b 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a  ;.  *pz = (char*
13d0: 29 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a  )z;.  return v;.
13e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13f0: 74 68 65 20 6e 75 6d 62 65 72 20 64 69 67 69 74  the number digit
1400: 73 20 69 6e 20 74 68 65 20 62 61 73 65 2d 36 34  s in the base-64
1410: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1420: 6f 66 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e  of a positive in
1430: 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  teger.*/.static 
1440: 69 6e 74 20 64 69 67 69 74 5f 63 6f 75 6e 74 28  int digit_count(
1450: 69 6e 74 20 76 29 7b 0a 20 20 75 6e 73 69 67 6e  int v){.  unsign
1460: 65 64 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 66  ed int i, x;.  f
1470: 6f 72 28 69 3d 31 2c 20 78 3d 36 34 3b 20 76 3e  or(i=1, x=64; v>
1480: 3d 78 3b 20 69 2b 2b 2c 20 78 20 3c 3c 3d 20 36  =x; i++, x <<= 6
1490: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  ){}.  return i;.
14a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
14b0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
14c0: 75 6d 20 6f 6e 20 74 68 65 20 4e 2d 62 79 74 65  um on the N-byte
14d0: 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
14e0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a   the result..*/.
14f0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
1500: 69 6e 74 20 63 68 65 63 6b 73 75 6d 28 63 6f 6e  int checksum(con
1510: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 73 69  st char *zIn, si
1520: 7a 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e 73 74  ze_t N){.  const
1530: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1540: 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  z = (const unsig
1550: 6e 65 64 20 63 68 61 72 20 2a 29 7a 49 6e 3b 0a  ned char *)zIn;.
1560: 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 20 3d    unsigned sum =
1570: 20 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d   0;.  while(N >=
1580: 20 31 36 29 7b 0a 20 20 20 20 73 75 6d 20 2b 3d   16){.    sum +=
1590: 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d   ((unsigned)z[0]
15a0: 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b   + z[4] + z[8] +
15b0: 20 7a 5b 31 32 5d 29 20 3c 3c 20 32 34 3b 0a 20   z[12]) << 24;. 
15c0: 20 20 20 73 75 6d 20 2b 3d 20 28 28 75 6e 73 69     sum += ((unsi
15d0: 67 6e 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d  gned)z[1] + z[5]
15e0: 20 2b 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29   + z[9] + z[13])
15f0: 20 3c 3c 20 31 36 3b 0a 20 20 20 20 73 75 6d 20   << 16;.    sum 
1600: 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b  += ((unsigned)z[
1610: 32 5d 20 2b 20 7a 5b 36 5d 20 2b 20 7a 5b 31 30  2] + z[6] + z[10
1620: 5d 2b 20 7a 5b 31 34 5d 29 20 3c 3c 20 38 3b 0a  ]+ z[14]) << 8;.
1630: 20 20 20 20 73 75 6d 20 2b 3d 20 28 28 75 6e 73      sum += ((uns
1640: 69 67 6e 65 64 29 7a 5b 33 5d 20 2b 20 7a 5b 37  igned)z[3] + z[7
1650: 5d 20 2b 20 7a 5b 31 31 5d 2b 20 7a 5b 31 35 5d  ] + z[11]+ z[15]
1660: 29 3b 0a 20 20 20 20 7a 20 2b 3d 20 31 36 3b 0a  );.    z += 16;.
1670: 20 20 20 20 4e 20 2d 3d 20 31 36 3b 0a 20 20 7d      N -= 16;.  }
1680: 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 34 29  .  while(N >= 4)
1690: 7b 0a 20 20 20 20 73 75 6d 20 2b 3d 20 28 7a 5b  {.    sum += (z[
16a0: 30 5d 3c 3c 32 34 29 20 7c 20 28 7a 5b 31 5d 3c  0]<<24) | (z[1]<
16b0: 3c 31 36 29 20 7c 20 28 7a 5b 32 5d 3c 3c 38 29  <16) | (z[2]<<8)
16c0: 20 7c 20 7a 5b 33 5d 3b 0a 20 20 20 20 7a 20 2b   | z[3];.    z +
16d0: 3d 20 34 3b 0a 20 20 20 20 4e 20 2d 3d 20 34 3b  = 4;.    N -= 4;
16e0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 4e 29  .  }.  switch(N)
16f0: 7b 0a 20 20 20 20 63 61 73 65 20 33 3a 20 20 20  {.    case 3:   
1700: 73 75 6d 20 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20  sum += (z[2] << 
1710: 38 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 20  8);.    case 2: 
1720: 20 20 73 75 6d 20 2b 3d 20 28 7a 5b 31 5d 20 3c    sum += (z[1] <
1730: 3c 20 31 36 29 3b 0a 20 20 20 20 63 61 73 65 20  < 16);.    case 
1740: 31 3a 20 20 20 73 75 6d 20 2b 3d 20 28 7a 5b 30  1:   sum += (z[0
1750: 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64 65  ] << 24);.    de
1760: 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20  fault:  ;.  }.  
1770: 72 65 74 75 72 6e 20 73 75 6d 3b 0a 7d 0a 0a 2f  return sum;.}../
1780: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1790: 77 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  w delta..**.** T
17a0: 68 65 20 64 65 6c 74 61 20 69 73 20 77 72 69 74  he delta is writ
17b0: 74 65 6e 20 69 6e 74 6f 20 61 20 70 72 65 61 6c  ten into a preal
17c0: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2c 20  located buffer, 
17d0: 7a 44 65 6c 74 61 2c 20 77 68 69 63 68 20 0a 2a  zDelta, which .*
17e0: 2a 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  * should be at l
17f0: 65 61 73 74 20 36 30 20 62 79 74 65 73 20 6c 6f  east 60 bytes lo
1800: 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 74 61  nger than the ta
1810: 72 67 65 74 20 66 69 6c 65 2c 20 7a 4f 75 74 2e  rget file, zOut.
1820: 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73 74  .** The delta st
1830: 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 4e 55 4c  ring will be NUL
1840: 2d 74 65 72 6d 69 6e 61 74 65 64 2c 20 62 75 74  -terminated, but
1850: 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 63   it might also c
1860: 6f 6e 74 61 69 6e 0a 2a 2a 20 65 6d 62 65 64 64  ontain.** embedd
1870: 65 64 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72  ed NUL character
1880: 73 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  s if either the 
1890: 7a 53 72 63 20 6f 72 20 7a 4f 75 74 20 66 69 6c  zSrc or zOut fil
18a0: 65 73 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72 79  es are.** binary
18b0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
18c0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6c 65 6e   returns the len
18d0: 67 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61  gth of the delta
18e0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 62 79   string.** in by
18f0: 74 65 73 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  tes, excluding t
1900: 68 65 20 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72  he final NUL ter
1910: 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65  minator characte
1920: 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  r..**.** Output 
1930: 46 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 54 68  Format:.**.** Th
1940: 65 20 64 65 6c 74 61 20 62 65 67 69 6e 73 20 77  e delta begins w
1950: 69 74 68 20 61 20 62 61 73 65 36 34 20 6e 75 6d  ith a base64 num
1960: 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
1970: 61 20 6e 65 77 6c 69 6e 65 2e 20 20 54 68 69 73  a newline.  This
1980: 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 73 20 74 68  .** number is th
1990: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19a0: 73 20 69 6e 20 74 68 65 20 54 41 52 47 45 54 20  s in the TARGET 
19b0: 66 69 6c 65 2e 20 20 54 68 75 73 2c 20 67 69 76  file.  Thus, giv
19c0: 65 6e 20 61 0a 2a 2a 20 64 65 6c 74 61 20 66 69  en a.** delta fi
19d0: 6c 65 20 7a 2c 20 61 20 70 72 6f 67 72 61 6d 20  le z, a program 
19e0: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
19f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70  size of the outp
1a00: 75 74 20 66 69 6c 65 0a 2a 2a 20 73 69 6d 70 6c  ut file.** simpl
1a10: 79 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  y by reading the
1a20: 20 66 69 72 73 74 20 6c 69 6e 65 20 61 6e 64 20   first line and 
1a30: 64 65 63 6f 64 69 6e 67 20 74 68 65 20 62 61 73  decoding the bas
1a40: 65 2d 36 34 20 6e 75 6d 62 65 72 0a 2a 2a 20 66  e-64 number.** f
1a50: 6f 75 6e 64 20 74 68 65 72 65 2e 20 20 54 68 65  ound there.  The
1a60: 20 64 65 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69   delta_output_si
1a70: 7a 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ze() routine doe
1a80: 73 20 65 78 61 63 74 6c 79 20 74 68 69 73 2e 0a  s exactly this..
1a90: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1aa0: 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6e 75 6d  initial size num
1ab0: 62 65 72 2c 20 74 68 65 20 64 65 6c 74 61 20 63  ber, the delta c
1ac0: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65 72  onsists of a ser
1ad0: 69 65 73 20 6f 66 0a 2a 2a 20 6c 69 74 65 72 61  ies of.** litera
1ae0: 6c 20 74 65 78 74 20 73 65 67 6d 65 6e 74 73 20  l text segments 
1af0: 61 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 20  and commands to 
1b00: 63 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 53 4f  copy from the SO
1b10: 55 52 43 45 20 66 69 6c 65 2e 20 20 0a 2a 2a 20  URCE file.  .** 
1b20: 41 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 6c  A copy command l
1b30: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
1b40: 2a 2a 0a 2a 2a 20 20 20 20 20 4e 4e 4e 40 4d 4d  **.**     NNN@MM
1b50: 4d 2c 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4e  M,.**.** where N
1b60: 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
1b70: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 62 65 20   of bytes to be 
1b80: 63 6f 70 69 65 64 20 61 6e 64 20 4d 4d 4d 20 69  copied and MMM i
1b90: 73 20 74 68 65 20 6f 66 66 73 65 74 0a 2a 2a 20  s the offset.** 
1ba0: 69 6e 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  into the source 
1bb0: 66 69 6c 65 20 6f 66 20 74 68 65 20 66 69 72 73  file of the firs
1bc0: 74 20 62 79 74 65 20 28 62 6f 74 68 20 62 61 73  t byte (both bas
1bd0: 65 2d 36 34 29 2e 20 20 20 49 66 20 4e 4e 4e 20  e-64).   If NNN 
1be0: 69 73 20 30 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  is 0.** it means
1bf0: 20 63 6f 70 79 20 74 68 65 20 72 65 73 74 20 6f   copy the rest o
1c00: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
1c10: 2e 20 20 4c 69 74 65 72 61 6c 20 74 65 78 74 20  .  Literal text 
1c20: 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
1c30: 0a 2a 2a 20 20 20 20 20 4e 4e 4e 3a 54 54 54 54  .**     NNN:TTTT
1c40: 54 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4e 4e  T.**.** where NN
1c50: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1c60: 6f 66 20 62 79 74 65 73 20 6f 66 20 74 65 78 74  of bytes of text
1c70: 20 28 62 61 73 65 2d 36 34 29 20 61 6e 64 20 54   (base-64) and T
1c80: 54 54 54 54 20 69 73 20 74 68 65 20 74 65 78 74  TTTT is the text
1c90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74  ..**.** The last
1ca0: 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20   term is of the 
1cb0: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e  form.**.**     N
1cc0: 4e 4e 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  NN;.**.** In thi
1cd0: 73 20 63 61 73 65 2c 20 4e 4e 4e 20 69 73 20 61  s case, NNN is a
1ce0: 20 33 32 2d 62 69 74 20 62 69 67 65 6e 64 69 61   32-bit bigendia
1cf0: 6e 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  n checksum of th
1d00: 65 20 6f 75 74 70 75 74 20 66 69 6c 65 0a 2a 2a  e output file.**
1d10: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1d20: 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
1d30: 20 74 68 65 20 64 65 6c 74 61 20 61 70 70 6c 69   the delta appli
1d40: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 41  ed correctly.  A
1d50: 6c 6c 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 72  ll.** numbers ar
1d60: 65 20 69 6e 20 62 61 73 65 2d 36 34 2e 0a 2a 2a  e in base-64..**
1d70: 0a 2a 2a 20 50 75 72 65 20 74 65 78 74 20 66 69  .** Pure text fi
1d80: 6c 65 73 20 67 65 6e 65 72 61 74 65 20 61 20 70  les generate a p
1d90: 75 72 65 20 74 65 78 74 20 64 65 6c 74 61 2e 20  ure text delta. 
1da0: 20 42 69 6e 61 72 79 20 66 69 6c 65 73 20 67 65   Binary files ge
1db0: 6e 65 72 61 74 65 20 61 0a 2a 2a 20 64 65 6c 74  nerate a.** delt
1dc0: 61 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61  a that may conta
1dd0: 69 6e 20 73 6f 6d 65 20 62 69 6e 61 72 79 20 64  in some binary d
1de0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 41 6c 67 6f 72  ata..**.** Algor
1df0: 69 74 68 6d 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ithm:.**.** The 
1e00: 65 6e 63 6f 64 65 72 20 66 69 72 73 74 20 62 75  encoder first bu
1e10: 69 6c 64 73 20 61 20 68 61 73 68 20 74 61 62 6c  ilds a hash tabl
1e20: 65 20 74 6f 20 68 65 6c 70 20 69 74 20 66 69 6e  e to help it fin
1e30: 64 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 70 61  d matching.** pa
1e40: 74 74 65 72 6e 73 20 69 6e 20 74 68 65 20 73 6f  tterns in the so
1e50: 75 72 63 65 20 66 69 6c 65 2e 20 20 31 36 2d 62  urce file.  16-b
1e60: 79 74 65 20 63 68 75 6e 6b 73 20 6f 66 20 74 68  yte chunks of th
1e70: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 0a 2a 2a  e source file.**
1e80: 20 73 61 6d 70 6c 65 64 20 61 74 20 65 76 65 6e   sampled at even
1e90: 6c 79 20 73 70 61 63 65 64 20 69 6e 74 65 72 76  ly spaced interv
1ea0: 61 6c 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  als are used to 
1eb0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 68 61 73  populate the has
1ec0: 68 0a 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  h.** table..**.*
1ed0: 2a 20 4e 65 78 74 20 77 65 20 62 65 67 69 6e 20  * Next we begin 
1ee0: 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 74 61 72  scanning the tar
1ef0: 67 65 74 20 66 69 6c 65 20 75 73 69 6e 67 20 61  get file using a
1f00: 20 73 6c 69 64 69 6e 67 20 31 36 2d 62 79 74 65   sliding 16-byte
1f10: 0a 2a 2a 20 77 69 6e 64 6f 77 2e 20 20 54 68 65  .** window.  The
1f20: 20 68 61 73 68 20 6f 66 20 74 68 65 20 31 36 2d   hash of the 16-
1f30: 62 79 74 65 20 77 69 6e 64 6f 77 20 69 6e 20 74  byte window in t
1f40: 68 65 20 74 61 72 67 65 74 20 69 73 20 75 73 65  he target is use
1f50: 64 20 74 6f 0a 2a 2a 20 73 65 61 72 63 68 20 66  d to.** search f
1f60: 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 73 65  or a matching se
1f70: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 6f 75  ction in the sou
1f80: 72 63 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  rce file.  When 
1f90: 61 20 6d 61 74 63 68 0a 2a 2a 20 69 73 20 66 6f  a match.** is fo
1fa0: 75 6e 64 2c 20 61 20 63 6f 70 79 20 63 6f 6d 6d  und, a copy comm
1fb0: 61 6e 64 20 69 73 20 61 64 64 65 64 20 74 6f 20  and is added to 
1fc0: 74 68 65 20 64 65 6c 74 61 2e 20 20 41 6e 20 65  the delta.  An e
1fd0: 66 66 6f 72 74 20 69 73 0a 2a 2a 20 6d 61 64 65  ffort is.** made
1fe0: 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 6d   to extend the m
1ff0: 61 74 63 68 69 6e 67 20 73 65 63 74 69 6f 6e 20  atching section 
2000: 74 6f 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20  to regions that 
2010: 63 6f 6d 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  come before.** a
2020: 6e 64 20 61 66 74 65 72 20 74 68 65 20 31 36 2d  nd after the 16-
2030: 62 79 74 65 20 68 61 73 68 20 77 69 6e 64 6f 77  byte hash window
2040: 2e 20 20 41 20 63 6f 70 79 20 63 6f 6d 6d 61 6e  .  A copy comman
2050: 64 20 69 73 20 6f 6e 6c 79 20 69 73 73 75 65 64  d is only issued
2060: 0a 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c  .** if the resul
2070: 74 20 77 6f 75 6c 64 20 75 73 65 20 6c 65 73 73  t would use less
2080: 20 73 70 61 63 65 20 74 68 61 74 20 6a 75 73 74   space that just
2090: 20 71 75 6f 74 69 6e 67 20 74 68 65 20 74 65 78   quoting the tex
20a0: 74 0a 2a 2a 20 6c 69 74 65 72 61 6c 6c 79 2e 20  t.** literally. 
20b0: 4c 69 74 65 72 61 6c 20 74 65 78 74 20 69 73 20  Literal text is 
20c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 65 6c  added to the del
20d0: 74 61 20 66 6f 72 20 73 65 63 74 69 6f 6e 73 20  ta for sections 
20e0: 74 68 61 74 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20  that .** do not 
20f0: 6d 61 74 63 68 20 6f 72 20 77 68 69 63 68 20 63  match or which c
2100: 61 6e 20 6e 6f 74 20 62 65 20 65 6e 63 6f 64 65  an not be encode
2110: 64 20 65 66 66 69 63 69 65 6e 74 6c 79 20 75 73  d efficiently us
2120: 69 6e 67 20 63 6f 70 79 0a 2a 2a 20 63 6f 6d 6d  ing copy.** comm
2130: 61 6e 64 73 2e 0a 2a 2f 0a 69 6e 74 20 64 65 6c  ands..*/.int del
2140: 74 61 5f 63 72 65 61 74 65 28 0a 20 20 63 6f 6e  ta_create(.  con
2150: 73 74 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20  st char *zSrc,  
2160: 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63      /* The sourc
2170: 65 20 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c  e or pattern fil
2180: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
2190: 69 6e 74 20 6c 65 6e 53 72 63 2c 20 20 20 2f 2a  int lenSrc,   /*
21a0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   Length of the s
21b0: 6f 75 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20  ource file */.  
21c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74  const char *zOut
21d0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ,      /* The ta
21e0: 72 67 65 74 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rget file */.  u
21f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 4f  nsigned int lenO
2200: 75 74 2c 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20  ut,   /* Length 
2210: 6f 66 20 74 68 65 20 74 61 72 67 65 74 20 66 69  of the target fi
2220: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
2230: 65 6c 74 61 20 20 20 20 20 20 20 20 20 20 20 2f  elta           /
2240: 2a 20 57 72 69 74 65 20 74 68 65 20 64 65 6c 74  * Write the delt
2250: 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  a into this buff
2260: 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  er */.){.  int i
2270: 2c 20 62 61 73 65 3b 0a 20 20 63 68 61 72 20 2a  , base;.  char *
2280: 7a 4f 72 69 67 44 65 6c 74 61 20 3d 20 7a 44 65  zOrigDelta = zDe
2290: 6c 74 61 3b 0a 20 20 68 61 73 68 20 68 3b 0a 20  lta;.  hash h;. 
22a0: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22c0: 75 6d 62 65 72 20 6f 66 20 68 61 73 68 20 74 61  umber of hash ta
22d0: 62 6c 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  ble entries */. 
22e0: 20 69 6e 74 20 2a 6c 61 6e 64 6d 61 72 6b 3b 20   int *landmark; 
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2300: 72 69 6d 61 72 79 20 68 61 73 68 20 74 61 62 6c  rimary hash tabl
2310: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 63 6f 6c 6c  e */.  int *coll
2320: 69 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ide;            
2330: 20 20 2f 2a 20 43 6f 6c 6c 69 73 69 6f 6e 20 63    /* Collision c
2340: 68 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  hain */.  int la
2350: 73 74 52 65 61 64 20 3d 20 2d 31 3b 20 20 20 20  stRead = -1;    
2360: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 62 79 74       /* Last byt
2370: 65 20 6f 66 20 7a 53 72 63 20 72 65 61 64 20 62  e of zSrc read b
2380: 79 20 61 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64  y a COPY command
2390: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   */..  /* Add th
23a0: 65 20 74 61 72 67 65 74 20 66 69 6c 65 20 73 69  e target file si
23b0: 7a 65 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ze to the beginn
23c0: 69 6e 67 20 6f 66 20 74 68 65 20 64 65 6c 74 61  ing of the delta
23d0: 0a 20 20 2a 2f 0a 20 20 70 75 74 49 6e 74 28 6c  .  */.  putInt(l
23e0: 65 6e 4f 75 74 2c 20 26 7a 44 65 6c 74 61 29 3b  enOut, &zDelta);
23f0: 0a 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d  .  *(zDelta++) =
2400: 20 27 5c 6e 27 3b 0a 0a 20 20 2f 2a 20 49 66 20   '\n';..  /* If 
2410: 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20  the source file 
2420: 69 73 20 76 65 72 79 20 73 6d 61 6c 6c 2c 20 69  is very small, i
2430: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
2440: 68 61 76 65 20 6e 6f 0a 20 20 2a 2a 20 63 68 61  have no.  ** cha
2450: 6e 63 65 20 6f 66 20 65 76 65 72 20 64 6f 69 6e  nce of ever doin
2460: 67 20 61 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64  g a copy command
2470: 2e 20 20 4a 75 73 74 20 6f 75 74 70 75 74 20 61  .  Just output a
2480: 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 6c 69 74   single.  ** lit
2490: 65 72 61 6c 20 73 65 67 6d 65 6e 74 20 66 6f 72  eral segment for
24a0: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 72 67   the entire targ
24b0: 65 74 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a  et and exit..  *
24c0: 2f 0a 20 20 69 66 28 20 6c 65 6e 53 72 63 3c 3d  /.  if( lenSrc<=
24d0: 4e 48 41 53 48 20 29 7b 0a 20 20 20 20 70 75 74  NHASH ){.    put
24e0: 49 6e 74 28 6c 65 6e 4f 75 74 2c 20 26 7a 44 65  Int(lenOut, &zDe
24f0: 6c 74 61 29 3b 0a 20 20 20 20 2a 28 7a 44 65 6c  lta);.    *(zDel
2500: 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20 20 20  ta++) = ':';.   
2510: 20 6d 65 6d 63 70 79 28 7a 44 65 6c 74 61 2c 20   memcpy(zDelta, 
2520: 7a 4f 75 74 2c 20 6c 65 6e 4f 75 74 29 3b 0a 20  zOut, lenOut);. 
2530: 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20 6c 65 6e     zDelta += len
2540: 4f 75 74 3b 0a 20 20 20 20 70 75 74 49 6e 74 28  Out;.    putInt(
2550: 63 68 65 63 6b 73 75 6d 28 7a 4f 75 74 2c 20 6c  checksum(zOut, l
2560: 65 6e 4f 75 74 29 2c 20 26 7a 44 65 6c 74 61 29  enOut), &zDelta)
2570: 3b 0a 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b  ;.    *(zDelta++
2580: 29 20 3d 20 27 3b 27 3b 0a 20 20 20 20 72 65 74  ) = ';';.    ret
2590: 75 72 6e 20 7a 44 65 6c 74 61 20 2d 20 7a 4f 72  urn zDelta - zOr
25a0: 69 67 44 65 6c 74 61 3b 0a 20 20 7d 0a 0a 20 20  igDelta;.  }..  
25b0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 68  /* Compute the h
25c0: 61 73 68 20 74 61 62 6c 65 20 75 73 65 64 20 74  ash table used t
25d0: 6f 20 6c 6f 63 61 74 65 20 6d 61 74 63 68 69 6e  o locate matchin
25e0: 67 20 73 65 63 74 69 6f 6e 73 20 69 6e 20 74 68  g sections in th
25f0: 65 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69  e.  ** source fi
2600: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6e 48 61 73 68  le..  */.  nHash
2610: 20 3d 20 6c 65 6e 53 72 63 2f 4e 48 41 53 48 3b   = lenSrc/NHASH;
2620: 0a 20 20 63 6f 6c 6c 69 64 65 20 3d 20 6d 61 6c  .  collide = mal
2630: 6c 6f 63 28 20 6e 48 61 73 68 2a 32 2a 73 69 7a  loc( nHash*2*siz
2640: 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 69 66  eof(int) );.  if
2650: 28 20 63 6f 6c 6c 69 64 65 3d 3d 30 20 29 20 72  ( collide==0 ) r
2660: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 6c 61 6e 64  eturn -1;.  land
2670: 6d 61 72 6b 20 3d 20 26 63 6f 6c 6c 69 64 65 5b  mark = &collide[
2680: 6e 48 61 73 68 5d 3b 0a 20 20 6d 65 6d 73 65 74  nHash];.  memset
2690: 28 6c 61 6e 64 6d 61 72 6b 2c 20 2d 31 2c 20 6e  (landmark, -1, n
26a0: 48 61 73 68 2a 73 69 7a 65 6f 66 28 69 6e 74 29  Hash*sizeof(int)
26b0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 63 6f 6c 6c  );.  memset(coll
26c0: 69 64 65 2c 20 2d 31 2c 20 6e 48 61 73 68 2a 73  ide, -1, nHash*s
26d0: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 66  izeof(int));.  f
26e0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 53 72 63  or(i=0; i<lenSrc
26f0: 2d 4e 48 41 53 48 3b 20 69 2b 3d 4e 48 41 53 48  -NHASH; i+=NHASH
2700: 29 7b 0a 20 20 20 20 69 6e 74 20 68 76 3b 0a 20  ){.    int hv;. 
2710: 20 20 20 68 61 73 68 5f 69 6e 69 74 28 26 68 2c     hash_init(&h,
2720: 20 26 7a 53 72 63 5b 69 5d 29 3b 0a 20 20 20 20   &zSrc[i]);.    
2730: 68 76 20 3d 20 68 61 73 68 5f 33 32 62 69 74 28  hv = hash_32bit(
2740: 26 68 29 20 25 20 6e 48 61 73 68 3b 0a 20 20 20  &h) % nHash;.   
2750: 20 63 6f 6c 6c 69 64 65 5b 69 2f 4e 48 41 53 48   collide[i/NHASH
2760: 5d 20 3d 20 6c 61 6e 64 6d 61 72 6b 5b 68 76 5d  ] = landmark[hv]
2770: 3b 0a 20 20 20 20 6c 61 6e 64 6d 61 72 6b 5b 68  ;.    landmark[h
2780: 76 5d 20 3d 20 69 2f 4e 48 41 53 48 3b 0a 20 20  v] = i/NHASH;.  
2790: 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 73 63  }..  /* Begin sc
27a0: 61 6e 6e 69 6e 67 20 74 68 65 20 74 61 72 67 65  anning the targe
27b0: 74 20 66 69 6c 65 20 61 6e 64 20 67 65 6e 65 72  t file and gener
27c0: 61 74 69 6e 67 20 63 6f 70 79 20 63 6f 6d 6d 61  ating copy comma
27d0: 6e 64 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 69 74  nds and.  ** lit
27e0: 65 72 61 6c 20 73 65 63 74 69 6f 6e 73 20 6f 66  eral sections of
27f0: 20 74 68 65 20 64 65 6c 74 61 2e 0a 20 20 2a 2f   the delta..  */
2800: 0a 20 20 62 61 73 65 20 3d 20 30 3b 20 20 20 20  .  base = 0;    
2810: 2f 2a 20 57 65 20 68 61 76 65 20 61 6c 72 65 61  /* We have alrea
2820: 64 79 20 67 65 6e 65 72 61 74 65 64 20 65 76 65  dy generated eve
2830: 72 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 7a  rything before z
2840: 4f 75 74 5b 62 61 73 65 5d 20 2a 2f 0a 20 20 77  Out[base] */.  w
2850: 68 69 6c 65 28 20 62 61 73 65 2b 4e 48 41 53 48  hile( base+NHASH
2860: 3c 6c 65 6e 4f 75 74 20 29 7b 0a 20 20 20 20 69  <lenOut ){.    i
2870: 6e 74 20 69 53 72 63 2c 20 69 42 6c 6f 63 6b 3b  nt iSrc, iBlock;
2880: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
2890: 74 20 62 65 73 74 43 6e 74 2c 20 62 65 73 74 4f  t bestCnt, bestO
28a0: 66 73 74 3d 30 2c 20 62 65 73 74 4c 69 74 73 7a  fst=0, bestLitsz
28b0: 3d 30 3b 0a 20 20 20 20 68 61 73 68 5f 69 6e 69  =0;.    hash_ini
28c0: 74 28 26 68 2c 20 26 7a 4f 75 74 5b 62 61 73 65  t(&h, &zOut[base
28d0: 5d 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 20 20  ]);.    i = 0;  
28e0: 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
28f0: 6d 61 74 63 68 20 61 20 6c 61 6e 64 6d 61 72 6b  match a landmark
2900: 20 61 67 61 69 6e 73 74 20 7a 4f 75 74 5b 62 61   against zOut[ba
2910: 73 65 2b 69 5d 20 2a 2f 0a 20 20 20 20 62 65 73  se+i] */.    bes
2920: 74 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68  tCnt = 0;.    wh
2930: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
2940: 69 6e 74 20 68 76 3b 0a 20 20 20 20 20 20 69 6e  int hv;.      in
2950: 74 20 6c 69 6d 69 74 20 3d 20 32 35 30 3b 0a 0a  t limit = 250;..
2960: 20 20 20 20 20 20 68 76 20 3d 20 68 61 73 68 5f        hv = hash_
2970: 33 32 62 69 74 28 26 68 29 20 25 20 6e 48 61 73  32bit(&h) % nHas
2980: 68 3b 0a 20 20 20 20 20 20 44 45 42 55 47 32 28  h;.      DEBUG2(
2990: 20 70 72 69 6e 74 66 28 22 4c 4f 4f 4b 49 4e 47   printf("LOOKING
29a0: 3a 20 25 34 64 20 5b 25 73 5d 5c 6e 22 2c 20 62  : %4d [%s]\n", b
29b0: 61 73 65 2b 69 2c 20 70 72 69 6e 74 31 36 28 26  ase+i, print16(&
29c0: 7a 4f 75 74 5b 62 61 73 65 2b 69 5d 29 29 3b 20  zOut[base+i])); 
29d0: 29 0a 20 20 20 20 20 20 69 42 6c 6f 63 6b 20 3d  ).      iBlock =
29e0: 20 6c 61 6e 64 6d 61 72 6b 5b 68 76 5d 3b 0a 20   landmark[hv];. 
29f0: 20 20 20 20 20 77 68 69 6c 65 28 20 69 42 6c 6f       while( iBlo
2a00: 63 6b 3e 3d 30 20 26 26 20 28 6c 69 6d 69 74 2d  ck>=0 && (limit-
2a10: 2d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  -)>0 ){.        
2a20: 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  /*.        ** Th
2a30: 65 20 68 61 73 68 20 77 69 6e 64 6f 77 20 68 61  e hash window ha
2a40: 73 20 69 64 65 6e 74 69 66 69 65 64 20 61 20 70  s identified a p
2a50: 6f 74 65 6e 74 69 61 6c 20 6d 61 74 63 68 20 61  otential match a
2a60: 67 61 69 6e 73 74 20 0a 20 20 20 20 20 20 20 20  gainst .        
2a70: 2a 2a 20 6c 61 6e 64 6d 61 72 6b 20 62 6c 6f 63  ** landmark bloc
2a80: 6b 20 69 42 6c 6f 63 6b 2e 20 20 42 75 74 20 77  k iBlock.  But w
2a90: 65 20 6e 65 65 64 20 74 6f 20 69 6e 76 65 73 74  e need to invest
2aa0: 69 67 61 74 65 20 66 75 72 74 68 65 72 2e 0a 20  igate further.. 
2ab0: 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
2ac0: 20 20 20 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61     ** Look for a
2ad0: 20 72 65 67 69 6f 6e 20 69 6e 20 7a 4f 75 74 20   region in zOut 
2ae0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 7a 53 72  that matches zSr
2af0: 63 2e 20 41 6e 63 68 6f 72 20 74 68 65 20 73 65  c. Anchor the se
2b00: 61 72 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  arch.        ** 
2b10: 61 74 20 7a 53 72 63 5b 69 53 72 63 5d 20 61 6e  at zSrc[iSrc] an
2b20: 64 20 7a 4f 75 74 5b 62 61 73 65 2b 69 5d 2e 20  d zOut[base+i]. 
2b30: 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   Do not include 
2b40: 61 6e 79 74 68 69 6e 67 20 70 72 69 6f 72 20 74  anything prior t
2b50: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 4f 75  o.        ** zOu
2b60: 74 5b 62 61 73 65 5d 20 6f 72 20 61 66 74 65 72  t[base] or after
2b70: 20 7a 4f 75 74 5b 6f 75 74 4c 65 6e 5d 20 6e 6f   zOut[outLen] no
2b80: 72 20 61 6e 79 74 68 69 6e 67 20 61 66 74 65 72  r anything after
2b90: 20 7a 53 72 63 5b 73 72 63 4c 65 6e 5d 2e 0a 20   zSrc[srcLen].. 
2ba0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2bb0: 20 20 2a 2a 20 53 65 74 20 63 6e 74 20 65 71 75    ** Set cnt equ
2bc0: 61 6c 20 74 6f 20 74 68 65 20 6c 65 6e 67 74 68  al to the length
2bd0: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 20 61 6e   of the match an
2be0: 64 20 73 65 74 20 6f 66 73 74 20 73 6f 20 74 68  d set ofst so th
2bf0: 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 53  at.        ** zS
2c00: 72 63 5b 6f 66 73 74 5d 20 69 73 20 74 68 65 20  rc[ofst] is the 
2c10: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
2c20: 20 74 68 65 20 6d 61 74 63 68 2e 20 20 6c 69 74   the match.  lit
2c30: 73 7a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  sz is the number
2c40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 63  .        ** of c
2c50: 68 61 72 61 63 74 65 72 73 20 62 65 74 77 65 65  haracters betwee
2c60: 6e 20 7a 4f 75 74 5b 62 61 73 65 5d 20 61 6e 64  n zOut[base] and
2c70: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2c80: 66 20 74 68 65 20 6d 61 74 63 68 2e 0a 20 20 20  f the match..   
2c90: 20 20 20 20 20 2a 2a 20 73 7a 20 77 69 6c 6c 20       ** sz will 
2ca0: 62 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  be the overhead 
2cb0: 28 69 6e 20 62 79 74 65 73 29 20 6e 65 65 64 65  (in bytes) neede
2cc0: 64 20 74 6f 20 65 6e 63 6f 64 65 20 74 68 65 20  d to encode the 
2cd0: 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  copy.        ** 
2ce0: 63 6f 6d 6d 61 6e 64 2e 20 20 4f 6e 6c 79 20 67  command.  Only g
2cf0: 65 6e 65 72 61 74 65 20 63 6f 70 79 20 63 6f 6d  enerate copy com
2d00: 6d 61 6e 64 20 69 66 20 74 68 65 20 6f 76 65 72  mand if the over
2d10: 68 65 61 64 20 6f 66 20 74 68 65 0a 20 20 20 20  head of the.    
2d20: 20 20 20 20 2a 2a 20 63 6f 70 79 20 63 6f 6d 6d      ** copy comm
2d30: 61 6e 64 20 69 73 20 6c 65 73 73 20 74 68 61 6e  and is less than
2d40: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
2d50: 69 74 65 72 61 6c 20 74 65 78 74 20 74 6f 20 62  iteral text to b
2d60: 65 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 20 20  e copied..      
2d70: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
2d80: 20 63 6e 74 2c 20 6f 66 73 74 2c 20 6c 69 74 73   cnt, ofst, lits
2d90: 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  z;.        int j
2da0: 2c 20 6b 2c 20 78 2c 20 79 3b 0a 20 20 20 20 20  , k, x, y;.     
2db0: 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
2dc0: 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
2dd0: 20 61 74 20 69 53 72 63 2c 20 6d 61 74 63 68 20   at iSrc, match 
2de0: 66 6f 72 77 61 72 64 73 20 61 73 20 66 61 72 20  forwards as far 
2df0: 61 73 20 77 65 20 63 61 6e 2e 20 20 6a 20 63 6f  as we can.  j co
2e00: 75 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  unts.        ** 
2e10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
2e20: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 6d 61  aracters that ma
2e30: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tch */.        i
2e40: 53 72 63 20 3d 20 69 42 6c 6f 63 6b 2a 4e 48 41  Src = iBlock*NHA
2e50: 53 48 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  SH;.        for(
2e60: 6a 3d 30 2c 20 78 3d 69 53 72 63 2c 20 79 3d 62  j=0, x=iSrc, y=b
2e70: 61 73 65 2b 69 3b 20 78 3c 6c 65 6e 53 72 63 20  ase+i; x<lenSrc 
2e80: 26 26 20 79 3c 6c 65 6e 4f 75 74 3b 20 6a 2b 2b  && y<lenOut; j++
2e90: 2c 20 78 2b 2b 2c 20 79 2b 2b 29 7b 0a 20 20 20  , x++, y++){.   
2ea0: 20 20 20 20 20 20 20 69 66 28 20 7a 53 72 63 5b         if( zSrc[
2eb0: 78 5d 21 3d 7a 4f 75 74 5b 79 5d 20 29 20 62 72  x]!=zOut[y] ) br
2ec0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2ed0: 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 0a 20 20 20         j--;..   
2ee0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
2ef0: 67 20 61 74 20 69 53 72 63 2d 31 2c 20 6d 61 74  g at iSrc-1, mat
2f00: 63 68 20 62 61 63 6b 77 61 72 64 73 20 61 73 20  ch backwards as 
2f10: 66 61 72 20 61 73 20 77 65 20 63 61 6e 2e 20 20  far as we can.  
2f20: 6b 20 63 6f 75 6e 74 73 0a 20 20 20 20 20 20 20  k counts.       
2f30: 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
2f40: 66 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  f characters tha
2f50: 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  t match */.     
2f60: 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 69 53     for(k=1; k<iS
2f70: 72 63 20 26 26 20 6b 3c 3d 69 3b 20 6b 2b 2b 29  rc && k<=i; k++)
2f80: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2f90: 7a 53 72 63 5b 69 53 72 63 2d 6b 5d 21 3d 7a 4f  zSrc[iSrc-k]!=zO
2fa0: 75 74 5b 62 61 73 65 2b 69 2d 6b 5d 20 29 20 62  ut[base+i-k] ) b
2fb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2fc0: 20 20 20 20 20 20 20 20 6b 2d 2d 3b 0a 0a 20 20          k--;..  
2fd0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65        /* Compute
2fe0: 20 74 68 65 20 6f 66 66 73 65 74 20 61 6e 64 20   the offset and 
2ff0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 74 63  size of the matc
3000: 68 69 6e 67 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  hing region */. 
3010: 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20 69 53         ofst = iS
3020: 72 63 2d 6b 3b 0a 20 20 20 20 20 20 20 20 63 6e  rc-k;.        cn
3030: 74 20 3d 20 6a 2b 6b 2b 31 3b 0a 20 20 20 20 20  t = j+k+1;.     
3040: 20 20 20 6c 69 74 73 7a 20 3d 20 69 2d 6b 3b 20     litsz = i-k; 
3050: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
3060: 74 65 73 20 6f 66 20 6c 69 74 65 72 61 6c 20 74  tes of literal t
3070: 65 78 74 20 62 65 66 6f 72 65 20 74 68 65 20 63  ext before the c
3080: 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 44  opy */.        D
3090: 45 42 55 47 32 28 20 70 72 69 6e 74 66 28 22 4d  EBUG2( printf("M
30a0: 41 54 43 48 20 25 64 20 62 79 74 65 73 20 61 74  ATCH %d bytes at
30b0: 20 25 64 3a 20 5b 25 73 5d 20 6c 69 74 73 7a 3d   %d: [%s] litsz=
30c0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
30e0: 6e 74 2c 20 6f 66 73 74 2c 20 70 72 69 6e 74 31  nt, ofst, print1
30f0: 36 28 26 7a 53 72 63 5b 6f 66 73 74 5d 29 2c 20  6(&zSrc[ofst]), 
3100: 6c 69 74 73 7a 29 3b 20 29 0a 20 20 20 20 20 20  litsz); ).      
3110: 20 20 2f 2a 20 73 7a 20 77 69 6c 6c 20 68 6f 6c    /* sz will hol
3120: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3130: 62 79 74 65 73 20 6e 65 65 64 65 64 20 74 6f 20  bytes needed to 
3140: 65 6e 63 6f 64 65 20 74 68 65 20 22 69 6e 73 65  encode the "inse
3150: 72 74 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  rt".        ** c
3160: 6f 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 63  ommand and the c
3170: 6f 70 79 20 63 6f 6d 6d 61 6e 64 2c 20 6e 6f 74  opy command, not
3180: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 20 22 69   counting the "i
3190: 6e 73 65 72 74 22 20 74 65 78 74 20 2a 2f 0a 20  nsert" text */. 
31a0: 20 20 20 20 20 20 20 73 7a 20 3d 20 64 69 67 69         sz = digi
31b0: 74 5f 63 6f 75 6e 74 28 69 2d 6b 29 2b 64 69 67  t_count(i-k)+dig
31c0: 69 74 5f 63 6f 75 6e 74 28 63 6e 74 29 2b 64 69  it_count(cnt)+di
31d0: 67 69 74 5f 63 6f 75 6e 74 28 6f 66 73 74 29 2b  git_count(ofst)+
31e0: 33 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  3;.        if( c
31f0: 6e 74 3e 3d 73 7a 20 26 26 20 63 6e 74 3e 62 65  nt>=sz && cnt>be
3200: 73 74 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  stCnt ){.       
3210: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
3220: 68 69 73 20 6d 61 74 63 68 20 6f 6e 6c 79 20 69  his match only i
3230: 66 20 69 74 20 69 73 20 74 68 65 20 62 65 73 74  f it is the best
3240: 20 73 6f 20 66 61 72 20 61 6e 64 20 69 74 0a 20   so far and it. 
3250: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73           ** does
3260: 20 6e 6f 74 20 69 6e 63 72 65 61 73 65 20 74 68   not increase th
3270: 65 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  e file size */. 
3280: 20 20 20 20 20 20 20 20 20 62 65 73 74 43 6e 74           bestCnt
3290: 20 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20   = cnt;.        
32a0: 20 20 62 65 73 74 4f 66 73 74 20 3d 20 69 53 72    bestOfst = iSr
32b0: 63 2d 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  c-k;.          b
32c0: 65 73 74 4c 69 74 73 7a 20 3d 20 6c 69 74 73 7a  estLitsz = litsz
32d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 44 45 42 55  ;.          DEBU
32e0: 47 32 28 20 70 72 69 6e 74 66 28 22 2e 2e 2e 20  G2( printf("... 
32f0: 42 45 53 54 20 53 4f 20 46 41 52 5c 6e 22 29 3b  BEST SO FAR\n");
3300: 20 29 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   ).        }..  
3310: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
3320: 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
3330: 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20   block */.      
3340: 20 20 69 42 6c 6f 63 6b 20 3d 20 63 6f 6c 6c 69    iBlock = colli
3350: 64 65 5b 69 42 6c 6f 63 6b 5d 3b 0a 20 20 20 20  de[iBlock];.    
3360: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65    }..      /* We
3370: 20 68 61 76 65 20 61 20 63 6f 70 79 20 63 6f 6d   have a copy com
3380: 6d 61 6e 64 20 74 68 61 74 20 64 6f 65 73 20 6e  mand that does n
3390: 6f 74 20 63 61 75 73 65 20 74 68 65 20 64 65 6c  ot cause the del
33a0: 74 61 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ta to be larger.
33b0: 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 20        ** than a 
33c0: 6c 69 74 65 72 61 6c 20 69 6e 73 65 72 74 2e 20  literal insert. 
33d0: 20 53 6f 20 61 64 64 20 74 68 65 20 63 6f 70 79   So add the copy
33e0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 68 65 20   command to the 
33f0: 64 65 6c 74 61 2e 0a 20 20 20 20 20 20 2a 2f 0a  delta..      */.
3400: 20 20 20 20 20 20 69 66 28 20 62 65 73 74 43 6e        if( bestCn
3410: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  t>0 ){.        i
3420: 66 28 20 62 65 73 74 4c 69 74 73 7a 3e 30 20 29  f( bestLitsz>0 )
3430: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
3440: 64 64 20 61 6e 20 69 6e 73 65 72 74 20 63 6f 6d  dd an insert com
3450: 6d 61 6e 64 20 62 65 66 6f 72 65 20 74 68 65 20  mand before the 
3460: 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  copy */.        
3470: 20 20 70 75 74 49 6e 74 28 62 65 73 74 4c 69 74    putInt(bestLit
3480: 73 7a 2c 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20  sz,&zDelta);.   
3490: 20 20 20 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b         *(zDelta+
34a0: 2b 29 20 3d 20 27 3a 27 3b 0a 20 20 20 20 20 20  +) = ':';.      
34b0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65 6c 74      memcpy(zDelt
34c0: 61 2c 20 26 7a 4f 75 74 5b 62 61 73 65 5d 2c 20  a, &zOut[base], 
34d0: 62 65 73 74 4c 69 74 73 7a 29 3b 0a 20 20 20 20  bestLitsz);.    
34e0: 20 20 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20        zDelta += 
34f0: 62 65 73 74 4c 69 74 73 7a 3b 0a 20 20 20 20 20  bestLitsz;.     
3500: 20 20 20 20 20 62 61 73 65 20 2b 3d 20 62 65 73       base += bes
3510: 74 4c 69 74 73 7a 3b 0a 20 20 20 20 20 20 20 20  tLitsz;.        
3520: 20 20 44 45 42 55 47 32 28 20 70 72 69 6e 74 66    DEBUG2( printf
3530: 28 22 69 6e 73 65 72 74 20 25 64 5c 6e 22 2c 20  ("insert %d\n", 
3540: 62 65 73 74 4c 69 74 73 7a 29 3b 20 29 0a 20 20  bestLitsz); ).  
3550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3560: 62 61 73 65 20 2b 3d 20 62 65 73 74 43 6e 74 3b  base += bestCnt;
3570: 0a 20 20 20 20 20 20 20 20 70 75 74 49 6e 74 28  .        putInt(
3580: 62 65 73 74 43 6e 74 2c 20 26 7a 44 65 6c 74 61  bestCnt, &zDelta
3590: 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 7a 44 65  );.        *(zDe
35a0: 6c 74 61 2b 2b 29 20 3d 20 27 40 27 3b 0a 20 20  lta++) = '@';.  
35b0: 20 20 20 20 20 20 70 75 74 49 6e 74 28 62 65 73        putInt(bes
35c0: 74 4f 66 73 74 2c 20 26 7a 44 65 6c 74 61 29 3b  tOfst, &zDelta);
35d0: 0a 20 20 20 20 20 20 20 20 44 45 42 55 47 32 28  .        DEBUG2(
35e0: 20 70 72 69 6e 74 66 28 22 63 6f 70 79 20 25 64   printf("copy %d
35f0: 20 62 79 74 65 73 20 66 72 6f 6d 20 25 64 5c 6e   bytes from %d\n
3600: 22 2c 20 62 65 73 74 43 6e 74 2c 20 62 65 73 74  ", bestCnt, best
3610: 4f 66 73 74 29 3b 20 29 0a 20 20 20 20 20 20 20  Ofst); ).       
3620: 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20 27   *(zDelta++) = '
3630: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
3640: 62 65 73 74 4f 66 73 74 20 2b 20 62 65 73 74 43  bestOfst + bestC
3650: 6e 74 20 2d 31 20 3e 20 6c 61 73 74 52 65 61 64  nt -1 > lastRead
3660: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 61   ){.          la
3670: 73 74 52 65 61 64 20 3d 20 62 65 73 74 4f 66 73  stRead = bestOfs
3680: 74 20 2b 20 62 65 73 74 43 6e 74 20 2d 20 31 3b  t + bestCnt - 1;
3690: 0a 20 20 20 20 20 20 20 20 20 20 44 45 42 55 47  .          DEBUG
36a0: 32 28 20 70 72 69 6e 74 66 28 22 6c 61 73 74 52  2( printf("lastR
36b0: 65 61 64 20 62 65 63 6f 6d 65 73 20 25 64 5c 6e  ead becomes %d\n
36c0: 22 2c 20 6c 61 73 74 52 65 61 64 29 3b 20 29 0a  ", lastRead); ).
36d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36e0: 20 20 62 65 73 74 43 6e 74 20 3d 20 30 3b 0a 20    bestCnt = 0;. 
36f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3700: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
3710: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
3720: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
3730: 20 6e 6f 20 6d 61 74 63 68 20 69 73 20 66 6f 75   no match is fou
3740: 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
3750: 20 20 20 69 66 28 20 62 61 73 65 2b 69 2b 4e 48     if( base+i+NH
3760: 41 53 48 3e 6c 65 6e 4f 75 74 20 29 7b 0a 20 20  ASH>lenOut ){.  
3770: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
3780: 20 72 65 61 63 68 65 64 20 74 68 65 20 65 6e 64   reached the end
3790: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
37a0: 20 68 61 76 65 20 6e 6f 74 20 66 6f 75 6e 64 20   have not found 
37b0: 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  any.        ** m
37c0: 61 74 63 68 65 73 2e 20 20 44 6f 20 61 6e 20 22  atches.  Do an "
37d0: 69 6e 73 65 72 74 22 20 66 6f 72 20 65 76 65 72  insert" for ever
37e0: 79 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ything that does
37f0: 20 6e 6f 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20   not match */.  
3800: 20 20 20 20 20 20 70 75 74 49 6e 74 28 6c 65 6e        putInt(len
3810: 4f 75 74 2d 62 61 73 65 2c 20 26 7a 44 65 6c 74  Out-base, &zDelt
3820: 61 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 7a 44  a);.        *(zD
3830: 65 6c 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20  elta++) = ':';. 
3840: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44         memcpy(zD
3850: 65 6c 74 61 2c 20 26 7a 4f 75 74 5b 62 61 73 65  elta, &zOut[base
3860: 5d 2c 20 6c 65 6e 4f 75 74 2d 62 61 73 65 29 3b  ], lenOut-base);
3870: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 20  .        zDelta 
3880: 2b 3d 20 6c 65 6e 4f 75 74 2d 62 61 73 65 3b 0a  += lenOut-base;.
3890: 20 20 20 20 20 20 20 20 62 61 73 65 20 3d 20 6c          base = l
38a0: 65 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 62  enOut;.        b
38b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
38c0: 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20       /* Advance 
38d0: 74 68 65 20 68 61 73 68 20 62 79 20 6f 6e 65 20  the hash by one 
38e0: 63 68 61 72 61 63 74 65 72 2e 20 20 4b 65 65 70  character.  Keep
38f0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 6d   looking for a m
3900: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 68 61  atch */.      ha
3910: 73 68 5f 6e 65 78 74 28 26 68 2c 20 7a 4f 75 74  sh_next(&h, zOut
3920: 5b 62 61 73 65 2b 69 2b 4e 48 41 53 48 5d 29 3b  [base+i+NHASH]);
3930: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
3940: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4f 75 74 70 75  }.  }.  /* Outpu
3950: 74 20 61 20 66 69 6e 61 6c 20 22 69 6e 73 65 72  t a final "inser
3960: 74 22 20 72 65 63 6f 72 64 20 74 6f 20 67 65 74  t" record to get
3970: 20 61 6c 6c 20 74 68 65 20 74 65 78 74 20 61 74   all the text at
3980: 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 2a 2a   the end of.  **
3990: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 64   the file that d
39a0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
39b0: 79 74 68 69 6e 67 20 69 6e 20 74 68 65 20 73 6f  ything in the so
39c0: 75 72 63 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  urce file..  */.
39d0: 20 20 69 66 28 20 62 61 73 65 3c 6c 65 6e 4f 75    if( base<lenOu
39e0: 74 20 29 7b 0a 20 20 20 20 70 75 74 49 6e 74 28  t ){.    putInt(
39f0: 6c 65 6e 4f 75 74 2d 62 61 73 65 2c 20 26 7a 44  lenOut-base, &zD
3a00: 65 6c 74 61 29 3b 0a 20 20 20 20 2a 28 7a 44 65  elta);.    *(zDe
3a10: 6c 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20 20  lta++) = ':';.  
3a20: 20 20 6d 65 6d 63 70 79 28 7a 44 65 6c 74 61 2c    memcpy(zDelta,
3a30: 20 26 7a 4f 75 74 5b 62 61 73 65 5d 2c 20 6c 65   &zOut[base], le
3a40: 6e 4f 75 74 2d 62 61 73 65 29 3b 0a 20 20 20 20  nOut-base);.    
3a50: 7a 44 65 6c 74 61 20 2b 3d 20 6c 65 6e 4f 75 74  zDelta += lenOut
3a60: 2d 62 61 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a 20  -base;.  }.  /* 
3a70: 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
3a80: 20 63 68 65 63 6b 73 75 6d 20 72 65 63 6f 72 64   checksum record
3a90: 2e 20 2a 2f 0a 20 20 70 75 74 49 6e 74 28 63 68  . */.  putInt(ch
3aa0: 65 63 6b 73 75 6d 28 7a 4f 75 74 2c 20 6c 65 6e  ecksum(zOut, len
3ab0: 4f 75 74 29 2c 20 26 7a 44 65 6c 74 61 29 3b 0a  Out), &zDelta);.
3ac0: 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20    *(zDelta++) = 
3ad0: 27 3b 27 3b 0a 20 20 66 72 65 65 28 63 6f 6c 6c  ';';.  free(coll
3ae0: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
3af0: 44 65 6c 74 61 20 2d 20 7a 4f 72 69 67 44 65 6c  Delta - zOrigDel
3b00: 74 61 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ta; .}../*.** Re
3b10: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 28 69  turn the size (i
3b20: 6e 20 62 79 74 65 73 29 20 6f 66 20 74 68 65 20  n bytes) of the 
3b30: 6f 75 74 70 75 74 20 66 72 6f 6d 20 61 70 70 6c  output from appl
3b40: 79 69 6e 67 0a 2a 2a 20 61 20 64 65 6c 74 61 2e  ying.** a delta.
3b50: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
3b60: 74 69 6e 65 20 69 73 20 70 72 6f 76 69 64 65 64  tine is provided
3b70: 20 73 6f 20 74 68 61 74 20 61 6e 20 70 72 6f 63   so that an proc
3b80: 65 64 75 72 65 20 74 68 61 74 20 69 73 20 61 62  edure that is ab
3b90: 6c 65 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 64 65  le.** to call de
3ba0: 6c 74 61 5f 61 70 70 6c 79 28 29 20 63 61 6e 20  lta_apply() can 
3bb0: 6c 65 61 72 6e 20 68 6f 77 20 6d 75 63 68 20 73  learn how much s
3bc0: 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
3bd0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 75 74 70  .** for the outp
3be0: 75 74 20 61 6e 64 20 68 65 6e 63 65 20 61 6c 6c  ut and hence all
3bf0: 6f 63 61 74 65 20 6e 6f 72 20 6d 6f 72 65 20 73  ocate nor more s
3c00: 70 61 63 65 20 74 68 61 74 20 69 73 20 72 65 61  pace that is rea
3c10: 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a  lly.** needed..*
3c20: 2f 0a 69 6e 74 20 64 65 6c 74 61 5f 6f 75 74 70  /.int delta_outp
3c30: 75 74 5f 73 69 7a 65 28 63 6f 6e 73 74 20 63 68  ut_size(const ch
3c40: 61 72 20 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20  ar *zDelta, int 
3c50: 6c 65 6e 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74  lenDelta){.  int
3c60: 20 73 69 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20   size;.  size = 
3c70: 67 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20  getInt(&zDelta, 
3c80: 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66  &lenDelta);.  if
3c90: 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27 20  ( *zDelta!='\n' 
3ca0: 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a  ){.    /* ERROR:
3cb0: 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20 6e 6f   size integer no
3cc0: 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20  t terminated by 
3cd0: 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74 75  "\n" */.    retu
3ce0: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74  rn -1;.  }.  ret
3cf0: 75 72 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  urn size;.}.../*
3d00: 0a 2a 2a 20 41 70 70 6c 79 20 61 20 64 65 6c 74  .** Apply a delt
3d10: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74  a..**.** The out
3d20: 70 75 74 20 62 75 66 66 65 72 20 73 68 6f 75 6c  put buffer shoul
3d30: 64 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  d be big enough 
3d40: 74 6f 20 68 6f 6c 64 20 74 68 65 20 77 68 6f 6c  to hold the whol
3d50: 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65  e output.** file
3d60: 20 61 6e 64 20 61 20 4e 55 4c 20 74 65 72 6d 69   and a NUL termi
3d70: 6e 61 74 6f 72 20 61 74 20 74 68 65 20 65 6e 64  nator at the end
3d80: 2e 20 20 54 68 65 20 64 65 6c 74 61 5f 6f 75 74  .  The delta_out
3d90: 70 75 74 5f 73 69 7a 65 28 29 0a 2a 2a 20 72 6f  put_size().** ro
3da0: 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72  utine will deter
3db0: 6d 69 6e 65 20 74 68 69 73 20 73 69 7a 65 20 66  mine this size f
3dc0: 6f 72 20 79 6f 75 2e 0a 2a 2a 0a 2a 2a 20 54 68  or you..**.** Th
3dd0: 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 73  e delta string s
3de0: 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 2d 74 65  hould be null-te
3df0: 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
3e00: 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 0a  he delta string.
3e10: 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
3e20: 6d 62 65 64 64 65 64 20 4e 55 4c 20 63 68 61 72  mbedded NUL char
3e30: 61 63 74 65 72 73 20 28 69 66 20 74 68 65 20 69  acters (if the i
3e40: 6e 70 75 74 20 61 6e 64 20 6f 75 74 70 75 74 20  nput and output 
3e50: 61 72 65 0a 2a 2a 20 62 69 6e 61 72 79 20 66 69  are.** binary fi
3e60: 6c 65 73 29 20 73 6f 20 77 65 20 61 6c 73 6f 20  les) so we also 
3e70: 68 61 76 65 20 74 6f 20 70 61 73 73 20 69 6e 20  have to pass in 
3e80: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
3e90: 65 20 64 65 6c 74 61 20 69 6e 0a 2a 2a 20 74 68  e delta in.** th
3ea0: 65 20 6c 65 6e 44 65 6c 74 61 20 70 61 72 61 6d  e lenDelta param
3eb0: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eter..**.** This
3ec0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3ed0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
3ee0: 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20 69 6e  e output file in
3ef0: 20 62 79 74 65 73 20 28 65 78 63 6c 75 64 69 6e   bytes (excludin
3f00: 67 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 4e  g.** the final N
3f10: 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  UL terminator ch
3f20: 61 72 61 63 74 65 72 29 2e 20 20 45 78 63 65 70  aracter).  Excep
3f30: 74 2c 20 69 66 20 74 68 65 20 64 65 6c 74 61 20  t, if the delta 
3f40: 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6d 61 6c  string is.** mal
3f50: 66 6f 72 6d 65 64 20 6f 72 20 69 6e 74 65 6e 64  formed or intend
3f60: 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ed for use with 
3f70: 61 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6f 74  a source file ot
3f80: 68 65 72 20 74 68 61 6e 20 7a 53 72 63 2c 0a 2a  her than zSrc,.*
3f90: 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
3fa0: 69 6e 65 20 72 65 74 75 72 6e 73 20 2d 31 2e 0a  ine returns -1..
3fb0: 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 74  **.** Refer to t
3fc0: 68 65 20 64 65 6c 74 61 5f 63 72 65 61 74 65 28  he delta_create(
3fd0: 29 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  ) documentation 
3fe0: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
3ff0: 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ription.** of th
4000: 65 20 64 65 6c 74 61 20 66 69 6c 65 20 66 6f 72  e delta file for
4010: 6d 61 74 2e 0a 2a 2f 0a 69 6e 74 20 64 65 6c 74  mat..*/.int delt
4020: 61 5f 61 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74  a_apply(.  const
4030: 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20   char *zSrc,    
4040: 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20    /* The source 
4050: 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20  or pattern file 
4060: 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c  */.  int lenSrc,
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4080: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75  ength of the sou
4090: 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  rce file */.  co
40a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  nst char *zDelta
40b0: 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f  ,    /* Delta to
40c0: 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 70 61   apply to the pa
40d0: 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c  ttern */.  int l
40e0: 65 6e 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20  enDelta,        
40f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
4100: 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68  he delta */.  ch
4110: 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
4120: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4130: 65 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 74 68  e output into th
4140: 69 73 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20  is preallocated 
4150: 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  buffer */.){.  u
4160: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69  nsigned int limi
4170: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  t;.  unsigned in
4180: 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 63  t total = 0;.  c
4190: 68 61 72 20 2a 7a 4f 72 69 67 4f 75 74 20 3d 20  har *zOrigOut = 
41a0: 7a 4f 75 74 3b 0a 0a 20 20 6c 69 6d 69 74 20 3d  zOut;..  limit =
41b0: 20 67 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c   getInt(&zDelta,
41c0: 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69   &lenDelta);.  i
41d0: 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27  f( *zDelta!='\n'
41e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52   ){.    /* ERROR
41f0: 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20 6e  : size integer n
4200: 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  ot terminated by
4210: 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74   "\n" */.    ret
4220: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 7a 44  urn -1;.  }.  zD
4230: 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61  elta++; lenDelta
4240: 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 44  --;.  while( *zD
4250: 65 6c 74 61 20 26 26 20 6c 65 6e 44 65 6c 74 61  elta && lenDelta
4260: 3e 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  >0 ){.    unsign
4270: 65 64 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74  ed int cnt, ofst
4280: 3b 0a 20 20 20 20 63 6e 74 20 3d 20 67 65 74 49  ;.    cnt = getI
4290: 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e  nt(&zDelta, &len
42a0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 73 77 69 74  Delta);.    swit
42b0: 63 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20 29 7b  ch( zDelta[0] ){
42c0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 40 27 3a  .      case '@':
42d0: 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74   {.        zDelt
42e0: 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b  a++; lenDelta--;
42f0: 0a 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20  .        ofst = 
4300: 67 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20  getInt(&zDelta, 
4310: 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20  &lenDelta);.    
4320: 20 20 20 20 69 66 28 20 7a 44 65 6c 74 61 5b 30      if( zDelta[0
4330: 5d 21 3d 27 2c 27 20 29 7b 0a 20 20 20 20 20 20  ]!=',' ){.      
4340: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f      /* ERROR: co
4350: 70 79 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 74  py command not t
4360: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 27 2c 27  erminated by ','
4370: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
4380: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20  turn -1;.       
4390: 20 7d 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74   }.        zDelt
43a0: 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b  a++; lenDelta--;
43b0: 0a 20 20 20 20 20 20 20 20 44 45 42 55 47 31 28  .        DEBUG1(
43c0: 20 70 72 69 6e 74 66 28 22 43 4f 50 59 20 25 64   printf("COPY %d
43d0: 20 66 72 6f 6d 20 25 64 5c 6e 22 2c 20 63 6e 74   from %d\n", cnt
43e0: 2c 20 6f 66 73 74 29 3b 20 29 0a 20 20 20 20 20  , ofst); ).     
43f0: 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b     total += cnt;
4400: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 74  .        if( tot
4410: 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  al>limit ){.    
4420: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
4430: 63 6f 70 79 20 65 78 63 65 65 64 73 20 6f 75 74  copy exceeds out
4440: 70 75 74 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  put file size */
4450: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
4460: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
4470: 20 20 20 20 20 20 20 20 69 66 28 20 6f 66 73 74          if( ofst
4480: 2b 63 6e 74 20 3e 20 6c 65 6e 53 72 63 20 29 7b  +cnt > lenSrc ){
4490: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52  .          /* ER
44a0: 52 4f 52 3a 20 63 6f 70 79 20 65 78 74 65 6e 64  ROR: copy extend
44b0: 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 69 6e  s past end of in
44c0: 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  put */.         
44d0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
44e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
44f0: 6d 63 70 79 28 7a 4f 75 74 2c 20 26 7a 53 72 63  mcpy(zOut, &zSrc
4500: 5b 6f 66 73 74 5d 2c 20 63 6e 74 29 3b 0a 20 20  [ofst], cnt);.  
4510: 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e        zOut += cn
4520: 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t;.        break
4530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4540: 63 61 73 65 20 27 3a 27 3a 20 7b 0a 20 20 20 20  case ':': {.    
4550: 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65      zDelta++; le
4560: 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20  nDelta--;.      
4570: 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a    total += cnt;.
4580: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61          if( tota
4590: 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  l>limit ){.     
45a0: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20       /* ERROR:  
45b0: 69 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64 20 67  insert command g
45c0: 69 76 65 73 20 61 6e 20 6f 75 74 70 75 74 20 6c  ives an output l
45d0: 61 72 67 65 72 20 74 68 61 6e 20 70 72 65 64 69  arger than predi
45e0: 63 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  cted */.        
45f0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
4600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 44       }.        D
4610: 45 42 55 47 31 28 20 70 72 69 6e 74 66 28 22 49  EBUG1( printf("I
4620: 4e 53 45 52 54 20 25 64 5c 6e 22 2c 20 63 6e 74  NSERT %d\n", cnt
4630: 29 3b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28  ); ).        if(
4640: 20 63 6e 74 3e 6c 65 6e 44 65 6c 74 61 20 29 7b   cnt>lenDelta ){
4650: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52  .          /* ER
4660: 52 4f 52 3a 20 69 6e 73 65 72 74 20 63 6f 75 6e  ROR: insert coun
4670: 74 20 65 78 63 65 65 64 73 20 73 69 7a 65 20 6f  t exceeds size o
4680: 66 20 64 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20  f delta */.     
4690: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
46a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
46b0: 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 7a    memcpy(zOut, z
46c0: 44 65 6c 74 61 2c 20 63 6e 74 29 3b 0a 20 20 20  Delta, cnt);.   
46d0: 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e 74       zOut += cnt
46e0: 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61  ;.        zDelta
46f0: 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20   += cnt;.       
4700: 20 6c 65 6e 44 65 6c 74 61 20 2d 3d 20 63 6e 74   lenDelta -= cnt
4710: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4730: 61 73 65 20 27 3b 27 3a 20 7b 0a 20 20 20 20 20  ase ';': {.     
4740: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
4750: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
4760: 20 7a 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a 20 20   zOut[0] = 0;.  
4770: 20 20 20 20 20 20 69 66 28 20 63 6e 74 21 3d 63        if( cnt!=c
4780: 68 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75 74  hecksum(zOrigOut
4790: 2c 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20 20  , total) ){.    
47a0: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
47b0: 20 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f   bad checksum */
47c0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
47d0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
47e0: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61          if( tota
47f0: 6c 21 3d 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  l!=limit ){.    
4800: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
4810: 67 65 6e 65 72 61 74 65 64 20 73 69 7a 65 20 64  generated size d
4820: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 70 72  oes not match pr
4830: 65 64 69 63 74 65 64 20 73 69 7a 65 20 2a 2f 0a  edicted size */.
4840: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4850: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
4860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 6f         return to
4870: 74 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tal;.      }.   
4880: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4890: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
48a0: 75 6e 6b 6e 6f 77 6e 20 64 65 6c 74 61 20 6f 70  unknown delta op
48b0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
48c0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
48d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
48e0: 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 74 65 72   /* ERROR: unter
48f0: 6d 69 6e 61 74 65 64 20 64 65 6c 74 61 20 2a 2f  minated delta */
4900: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.