Hex Artifact Content
Not logged in

Artifact 41eca571fc06f0aeb9a1f53332a2f6d0129535cd:


0000: 5c 20 62 64 65 6c 74 61 20 62 69 6e 64 69 6e 67  \ bdelta binding
0010: 73 20 61 6e 64 20 69 6e 76 6f 63 61 74 69 6f 6e  s and invocation
0020: 0a 0a 5c 20 43 6f 70 79 72 69 67 68 74 20 28 43  ..\ Copyright (C
0030: 29 20 32 30 31 36 20 20 20 42 65 72 6e 64 20 50  ) 2016   Bernd P
0040: 61 79 73 61 6e 0a 0a 5c 20 54 68 69 73 20 70 72  aysan..\ This pr
0050: 6f 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f  ogram is free so
0060: 66 74 77 61 72 65 3a 20 79 6f 75 20 63 61 6e 20  ftware: you can 
0070: 72 65 64 69 73 74 72 69 62 75 74 65 20 69 74 20  redistribute it 
0080: 61 6e 64 2f 6f 72 20 6d 6f 64 69 66 79 0a 5c 20  and/or modify.\ 
0090: 69 74 20 75 6e 64 65 72 20 74 68 65 20 74 65 72  it under the ter
00a0: 6d 73 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66  ms of the GNU Af
00b0: 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62  fero General Pub
00c0: 6c 69 63 20 4c 69 63 65 6e 73 65 20 61 73 20 70  lic License as p
00d0: 75 62 6c 69 73 68 65 64 20 62 79 0a 5c 20 74 68  ublished by.\ th
00e0: 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20  e Free Software 
00f0: 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 65 69 74 68  Foundation, eith
0100: 65 72 20 76 65 72 73 69 6f 6e 20 33 20 6f 66 20  er version 3 of 
0110: 74 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f 72 0a  the License, or.
0120: 5c 20 28 61 74 20 79 6f 75 72 20 6f 70 74 69 6f  \ (at your optio
0130: 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76 65 72  n) any later ver
0140: 73 69 6f 6e 2e 0a 0a 5c 20 54 68 69 73 20 70 72  sion...\ This pr
0150: 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62  ogram is distrib
0160: 75 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65  uted in the hope
0170: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
0180: 20 75 73 65 66 75 6c 2c 0a 5c 20 62 75 74 20 57   useful,.\ but W
0190: 49 54 48 4f 55 54 20 41 4e 59 20 57 41 52 52 41  ITHOUT ANY WARRA
01a0: 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 65 76 65  NTY; without eve
01b0: 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 20 77 61  n the implied wa
01c0: 72 72 61 6e 74 79 20 6f 66 0a 5c 20 4d 45 52 43  rranty of.\ MERC
01d0: 48 41 4e 54 41 42 49 4c 49 54 59 20 6f 72 20 46  HANTABILITY or F
01e0: 49 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52  ITNESS FOR A PAR
01f0: 54 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 2e  TICULAR PURPOSE.
0200: 20 20 53 65 65 20 74 68 65 0a 5c 20 47 4e 55 20    See the.\ GNU 
0210: 41 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 50  Affero General P
0220: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
0230: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
0240: 0a 5c 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61  .\ You should ha
0250: 76 65 20 72 65 63 65 69 76 65 64 20 61 20 63 6f  ve received a co
0260: 70 79 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66  py of the GNU Af
0270: 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62  fero General Pub
0280: 6c 69 63 20 4c 69 63 65 6e 73 65 0a 5c 20 61 6c  lic License.\ al
0290: 6f 6e 67 20 77 69 74 68 20 74 68 69 73 20 70 72  ong with this pr
02a0: 6f 67 72 61 6d 2e 20 20 49 66 20 6e 6f 74 2c 20  ogram.  If not, 
02b0: 73 65 65 20 3c 68 74 74 70 3a 2f 2f 77 77 77 2e  see <http://www.
02c0: 67 6e 75 2e 6f 72 67 2f 6c 69 63 65 6e 73 65 73  gnu.org/licenses
02d0: 2f 3e 2e 0a 0a 5c 20 54 68 69 73 20 66 69 6c 65  />...\ This file
02e0: 20 68 61 73 20 62 65 65 6e 20 70 61 72 74 6c 79   has been partly
02f0: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
0300: 20 53 57 49 47 20 61 6e 64 20 66 73 69 2c 0a 5c   SWIG and fsi,.\
0310: 20 61 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20   and is already 
0320: 70 6c 61 74 66 6f 72 6d 20 64 65 70 65 6e 64 65  platform depende
0330: 6e 74 2c 20 73 65 61 72 63 68 20 66 6f 72 20 74  nt, search for t
0340: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
0350: 0a 5c 20 66 73 69 2d 66 69 6c 65 20 74 6f 20 63  .\ fsi-file to c
0360: 6f 6d 70 69 6c 65 20 69 74 20 77 68 65 72 65 20  ompile it where 
0370: 6e 6f 20 6f 6e 65 20 68 61 73 20 63 6f 6d 70 69  no one has compi
0380: 6c 65 64 20 69 74 20 62 65 66 6f 72 65 20 3b 29  led it before ;)
0390: 0a 5c 20 47 46 6f 72 74 68 20 68 61 73 20 69 74  .\ GForth has it
03a0: 73 20 6f 77 6e 20 64 79 6e 61 6d 69 63 20 6c 6f  s own dynamic lo
03b0: 61 64 65 72 20 61 6e 64 20 64 6f 65 73 6e 27 74  ader and doesn't
03c0: 20 6e 65 65 64 20 61 64 64 69 6f 6e 61 6c 20 43   need addional C
03d0: 2d 43 6f 64 65 2e 0a 5c 20 54 68 61 74 27 73 20  -Code..\ That's 
03e0: 77 68 79 20 74 68 69 73 20 66 69 6c 65 20 63 6f  why this file co
03f0: 6e 74 61 69 6e 73 20 6e 6f 72 6d 61 6c 20 47 66  ntains normal Gf
0400: 6f 72 74 68 2d 63 6f 64 65 28 20 76 65 72 73 69  orth-code( versi
0410: 6f 6e 20 30 2e 36 2e 39 20 6f 72 20 68 69 67 68  on 0.6.9 or high
0420: 65 72 20 29 0a 5c 20 61 6e 64 20 63 6f 75 6c 64  er ).\ and could
0430: 20 62 65 20 75 73 65 64 20 64 69 72 65 63 74 6c   be used directl
0440: 79 20 77 69 74 68 20 69 6e 63 6c 75 64 65 20 6f  y with include o
0450: 72 20 72 65 71 75 69 72 65 2e 0a 5c 20 41 73 20  r require..\ As 
0460: 61 6c 6c 20 63 6f 6d 6d 65 6e 74 73 20 61 72 65  all comments are
0470: 20 73 74 72 69 70 70 65 64 20 64 75 72 69 6e 67   stripped during
0480: 20 74 68 65 20 63 6f 6d 70 69 6c 61 74 69 6f 6e   the compilation
0490: 2c 20 70 6c 65 61 73 65 0a 5c 20 69 6e 73 65 72  , please.\ inser
04a0: 74 20 74 68 65 20 63 6f 70 79 72 69 67 68 74 20  t the copyright 
04b0: 6e 6f 74 69 63 65 20 6f 66 20 74 68 65 20 6f 72  notice of the or
04c0: 69 67 69 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  iginal file here
04d0: 2e 0a 0a 5b 49 46 44 45 46 5d 20 61 6e 64 72 6f  ...[IFDEF] andro
04e0: 69 64 0a 20 20 20 20 73 22 20 6c 69 62 62 64 65  id.    s" libbde
04f0: 6c 74 61 2e 73 6f 22 20 63 2d 6c 69 62 3a 6f 70  lta.so" c-lib:op
0500: 65 6e 2d 70 61 74 68 2d 6c 69 62 20 64 72 6f 70  en-path-lib drop
0510: 0a 5b 54 48 45 4e 5d 0a 0a 63 2d 6c 69 62 72 61  .[THEN]..c-libra
0520: 72 79 20 62 64 65 6c 74 61 0a 20 20 20 20 5c 63  ry bdelta.    \c
0530: 20 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6e   #include <stdin
0540: 74 2e 68 3e 0a 20 20 20 20 5c 63 20 23 69 6e 63  t.h>.    \c #inc
0550: 6c 75 64 65 20 3c 62 64 65 6c 74 61 2e 68 3e 0a  lude <bdelta.h>.
0560: 20 20 20 20 73 22 20 62 64 65 6c 74 61 22 20 61      s" bdelta" a
0570: 64 64 2d 6c 69 62 0a 0a 5c 20 2d 2d 2d 2d 3d 3d  dd-lib..\ ----==
0580: 3d 3c 20 69 6e 74 20 63 6f 6e 73 74 61 6e 74 73  =< int constants
0590: 20 3d 3d 3d 3e 2d 2d 2d 2d 2d 0a 31 09 63 6f 6e   ===>-----.1.con
05a0: 73 74 61 6e 74 20 42 44 45 4c 54 41 5f 47 4c 4f  stant BDELTA_GLO
05b0: 42 41 4c 0a 32 09 63 6f 6e 73 74 61 6e 74 20 42  BAL.2.constant B
05c0: 44 45 4c 54 41 5f 53 49 44 45 53 5f 4f 52 44 45  DELTA_SIDES_ORDE
05d0: 52 45 44 0a 31 09 63 6f 6e 73 74 61 6e 74 20 42  RED.1.constant B
05e0: 44 45 4c 54 41 5f 52 45 4d 4f 56 45 5f 4f 56 45  DELTA_REMOVE_OVE
05f0: 52 4c 41 50 0a 0a 5c 20 2d 2d 2d 2d 2d 2d 2d 2d  RLAP..\ --------
0600: 3d 3d 3d 3c 20 65 6e 75 6d 73 20 3e 3d 3d 3d 2d  ===< enums >===-
0610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 30 09 63 6f 6e 73 74  --------.0.const
0620: 61 6e 74 20 42 44 45 4c 54 41 5f 4f 4b 0a 2d 31  ant BDELTA_OK.-1
0630: 09 63 6f 6e 73 74 61 6e 74 20 42 44 45 4c 54 41  .constant BDELTA
0640: 5f 4d 45 4d 5f 45 52 52 4f 52 0a 2d 32 09 63 6f  _MEM_ERROR.-2.co
0650: 6e 73 74 61 6e 74 20 42 44 45 4c 54 41 5f 52 45  nstant BDELTA_RE
0660: 41 44 5f 45 52 52 4f 52 0a 0a 5c 20 2d 2d 2d 2d  AD_ERROR..\ ----
0670: 2d 2d 3d 3d 3d 3c 20 66 75 6e 63 74 69 6f 6e 73  --===< functions
0680: 20 3e 3d 3d 3d 2d 2d 2d 2d 2d 2d 2d 0a 63 2d 66   >===-------.c-f
0690: 75 6e 63 74 69 6f 6e 20 62 64 65 6c 74 61 5f 69  unction bdelta_i
06a0: 6e 69 74 5f 61 6c 67 20 62 64 65 6c 74 61 5f 69  nit_alg bdelta_i
06b0: 6e 69 74 5f 61 6c 67 20 61 20 64 20 61 20 64 20  nit_alg a d a d 
06c0: 2d 2d 20 61 0a 63 2d 66 75 6e 63 74 69 6f 6e 20  -- a.c-function 
06d0: 62 64 65 6c 74 61 5f 64 6f 6e 65 5f 61 6c 67 20  bdelta_done_alg 
06e0: 62 64 65 6c 74 61 5f 64 6f 6e 65 5f 61 6c 67 20  bdelta_done_alg 
06f0: 61 20 2d 2d 20 76 6f 69 64 0a 63 2d 66 75 6e 63  a -- void.c-func
0700: 74 69 6f 6e 20 62 64 65 6c 74 61 5f 70 61 73 73  tion bdelta_pass
0710: 20 62 64 65 6c 74 61 5f 70 61 73 73 20 61 20 75   bdelta_pass a u
0720: 20 75 20 64 20 75 20 2d 2d 20 76 6f 69 64 0a 63   u d u -- void.c
0730: 2d 66 75 6e 63 74 69 6f 6e 20 62 64 65 6c 74 61  -function bdelta
0740: 5f 73 77 61 70 5f 69 6e 70 75 74 73 20 62 64 65  _swap_inputs bde
0750: 6c 74 61 5f 73 77 61 70 5f 69 6e 70 75 74 73 20  lta_swap_inputs 
0760: 61 20 2d 2d 20 76 6f 69 64 0a 63 2d 66 75 6e 63  a -- void.c-func
0770: 74 69 6f 6e 20 62 64 65 6c 74 61 5f 63 6c 65 61  tion bdelta_clea
0780: 6e 5f 6d 61 74 63 68 65 73 20 62 64 65 6c 74 61  n_matches bdelta
0790: 5f 63 6c 65 61 6e 5f 6d 61 74 63 68 65 73 20 61  _clean_matches a
07a0: 20 75 20 2d 2d 20 76 6f 69 64 0a 63 2d 66 75 6e   u -- void.c-fun
07b0: 63 74 69 6f 6e 20 62 64 65 6c 74 61 5f 6e 75 6d  ction bdelta_num
07c0: 4d 61 74 63 68 65 73 20 62 64 65 6c 74 61 5f 6e  Matches bdelta_n
07d0: 75 6d 4d 61 74 63 68 65 73 20 61 20 2d 2d 20 75  umMatches a -- u
07e0: 0a 63 2d 66 75 6e 63 74 69 6f 6e 20 62 64 65 6c  .c-function bdel
07f0: 74 61 5f 67 65 74 4d 61 74 63 68 20 62 64 65 6c  ta_getMatch bdel
0800: 74 61 5f 67 65 74 4d 61 74 63 68 20 61 20 75 20  ta_getMatch a u 
0810: 61 20 61 20 61 20 2d 2d 20 76 6f 69 64 0a 63 2d  a a a -- void.c-
0820: 66 75 6e 63 74 69 6f 6e 20 62 64 65 6c 74 61 5f  function bdelta_
0830: 67 65 74 45 72 72 6f 72 20 62 64 65 6c 74 61 5f  getError bdelta_
0840: 67 65 74 45 72 72 6f 72 20 61 20 2d 2d 20 6e 0a  getError a -- n.
0850: 63 2d 66 75 6e 63 74 69 6f 6e 20 62 64 65 6c 74  c-function bdelt
0860: 61 5f 73 68 6f 77 4d 61 74 63 68 65 73 20 62 64  a_showMatches bd
0870: 65 6c 74 61 5f 73 68 6f 77 4d 61 74 63 68 65 73  elta_showMatches
0880: 20 61 20 2d 2d 20 76 6f 69 64 0a 0a 65 6e 64 2d   a -- void..end-
0890: 63 2d 6c 69 62 72 61 72 79 0a 0a 5b 49 46 55 4e  c-library..[IFUN
08a0: 44 45 46 5d 20 65 6e 75 6d 20 62 79 65 20 5b 54  DEF] enum bye [T
08b0: 48 45 4e 5d 20 5c 20 73 74 6f 70 20 68 65 72 65  HEN] \ stop here
08c0: 20 69 66 20 6c 69 62 63 6f 6d 70 69 6c 65 20 6f   if libcompile o
08d0: 6e 6c 79 0a 0a 56 61 72 69 61 62 6c 65 20 62 66  nly..Variable bf
08e0: 69 6c 65 31 24 0a 56 61 72 69 61 62 6c 65 20 62  ile1$.Variable b
08f0: 66 69 6c 65 32 24 0a 0a 3a 20 62 73 6c 75 72 70  file2$..: bslurp
0900: 20 28 20 61 64 64 72 31 20 75 31 20 61 64 64 72   ( addr1 u1 addr
0910: 32 20 75 32 20 2d 2d 20 61 20 62 20 29 0a 20 20  2 u2 -- a b ).  
0920: 20 20 62 66 69 6c 65 32 24 20 24 73 6c 75 72 70    bfile2$ $slurp
0930: 2d 66 69 6c 65 20 20 62 66 69 6c 65 31 24 20 24  -file  bfile1$ $
0940: 73 6c 75 72 70 2d 66 69 6c 65 0a 20 20 20 20 62  slurp-file.    b
0950: 66 69 6c 65 31 24 20 62 66 69 6c 65 32 24 20 3b  file1$ bfile2$ ;
0960: 0a 0a 3a 20 62 64 65 6c 74 61 2d 69 6e 69 74 20  ..: bdelta-init 
0970: 7b 20 61 20 62 20 2d 2d 20 6f 20 7d 0a 20 20 20  { a b -- o }.   
0980: 20 61 20 24 40 20 30 20 20 62 20 24 40 20 30 20   a $@ 0  b $@ 0 
0990: 20 62 64 65 6c 74 61 5f 69 6e 69 74 5f 61 6c 67   bdelta_init_alg
09a0: 20 3b 0a 0a 3a 20 62 64 2d 70 61 73 73 20 7b 20   ;..: bd-pass { 
09b0: 62 73 20 66 6c 61 67 73 20 2d 2d 20 7d 20 28 20  bs flags -- } ( 
09c0: 6f 3a 62 20 29 0a 20 20 20 20 6f 20 62 73 20 64  o:b ).    o bs d
09d0: 75 70 20 32 2a 20 23 30 2e 20 66 6c 61 67 73 20  up 2* #0. flags 
09e0: 62 64 65 6c 74 61 5f 70 61 73 73 0a 20 20 20 20  bdelta_pass.    
09f0: 6f 20 42 44 45 4c 54 41 5f 52 45 4d 4f 56 45 5f  o BDELTA_REMOVE_
0a00: 4f 56 45 52 4c 41 50 20 62 64 65 6c 74 61 5f 63  OVERLAP bdelta_c
0a10: 6c 65 61 6e 5f 6d 61 74 63 68 65 73 20 3b 0a 0a  lean_matches ;..
0a20: 3a 20 62 64 2d 70 61 73 73 65 73 20 28 20 6f 3a  : bd-passes ( o:
0a30: 62 20 2d 2d 20 29 0a 5c 20 20 20 20 39 39 37 20  b -- ).\    997 
0a40: 30 20 62 64 2d 70 61 73 73 0a 5c 20 20 20 20 35  0 bd-pass.\    5
0a50: 30 33 20 30 20 62 64 2d 70 61 73 73 0a 20 20 20  03 0 bd-pass.   
0a60: 20 31 32 37 20 30 20 62 64 2d 70 61 73 73 0a 20   127 0 bd-pass. 
0a70: 20 20 20 30 33 31 20 30 20 62 64 2d 70 61 73 73     031 0 bd-pass
0a80: 0a 20 20 20 20 30 30 37 20 30 20 62 64 2d 70 61  .    007 0 bd-pa
0a90: 73 73 0a 20 20 20 20 30 30 35 20 30 20 62 64 2d  ss.    005 0 bd-
0aa0: 70 61 73 73 0a 20 20 20 20 30 30 33 20 30 20 62  pass.    003 0 b
0ab0: 64 2d 70 61 73 73 0a 20 20 20 20 30 31 33 20 42  d-pass.    013 B
0ac0: 44 45 4c 54 41 5f 47 4c 4f 42 41 4c 20 62 64 2d  DELTA_GLOBAL bd-
0ad0: 70 61 73 73 0a 20 20 20 20 30 30 37 20 30 20 62  pass.    007 0 b
0ae0: 64 2d 70 61 73 73 0a 20 20 20 20 30 30 35 20 30  d-pass.    005 0
0af0: 20 62 64 2d 70 61 73 73 20 3b 0a 0a 31 30 20 62   bd-pass ;..10 b
0b00: 75 66 66 65 72 3a 20 70 2d 74 6d 70 0a 0a 3a 20  uffer: p-tmp..: 
0b10: 2e 70 20 28 20 78 36 34 20 2d 2d 20 29 0a 20 20  .p ( x64 -- ).  
0b20: 20 20 70 2d 74 6d 70 20 70 21 2b 20 70 2d 74 6d    p-tmp p!+ p-tm
0b30: 70 20 74 75 63 6b 20 2d 20 74 79 70 65 20 3b 0a  p tuck - type ;.
0b40: 3a 20 2e 70 73 20 28 20 78 36 34 20 2d 2d 20 29  : .ps ( x64 -- )
0b50: 0a 20 20 20 20 70 2d 74 6d 70 20 70 73 21 2b 20  .    p-tmp ps!+ 
0b60: 70 2d 74 6d 70 20 74 75 63 6b 20 2d 20 74 79 70  p-tmp tuck - typ
0b70: 65 20 3b 0a 0a 3a 20 2e 64 69 66 66 20 28 20 62  e ;..: .diff ( b
0b80: 20 6f 3a 62 20 2d 2d 20 29 20 7b 20 62 20 7d 0a   o:b -- ) { b }.
0b90: 20 20 20 20 30 20 64 75 70 20 64 75 70 20 36 34      0 dup dup 64
0ba0: 23 30 20 36 34 64 75 70 20 36 34 64 75 70 0a 20  #0 64dup 64dup. 
0bb0: 20 20 20 7b 20 70 31 27 20 70 32 27 20 66 70 20     { p1' p2' fp 
0bc0: 36 34 5e 20 70 31 20 36 34 5e 20 70 32 20 36 34  64^ p1 64^ p2 64
0bd0: 5e 20 6e 75 6d 72 20 7d 0a 20 20 20 20 6f 20 62  ^ numr }.    o b
0be0: 64 65 6c 74 61 5f 6e 75 6d 4d 61 74 63 68 65 73  delta_numMatches
0bf0: 20 30 20 3f 44 4f 0a 09 6f 20 69 20 70 31 20 70   0 ?DO..o i p1 p
0c00: 32 20 6e 75 6d 72 20 62 64 65 6c 74 61 5f 67 65  2 numr bdelta_ge
0c10: 74 4d 61 74 63 68 0a 09 70 32 20 36 34 40 20 70  tMatch..p2 64@ p
0c20: 32 27 20 6e 3e 36 34 20 36 34 2d 20 36 34 64 75  2' n>64 64- 64du
0c30: 70 20 2e 70 20 36 34 3e 6e 20 3e 72 0a 09 62 20  p .p 64>n >r..b 
0c40: 24 40 20 66 70 20 73 61 66 65 2f 73 74 72 69 6e  $@ fp safe/strin
0c50: 67 20 72 3e 20 75 6d 69 6e 20 64 75 70 20 3e 72  g r> umin dup >r
0c60: 20 74 79 70 65 20 72 3e 20 2b 74 6f 20 66 70 0a   type r> +to fp.
0c70: 09 70 31 20 36 34 40 20 70 31 27 20 6e 3e 36 34  .p1 64@ p1' n>64
0c80: 20 36 34 2d 20 2e 70 73 0a 09 6e 75 6d 72 20 36   64- .ps..numr 6
0c90: 34 40 20 36 34 64 75 70 20 2e 70 0a 09 36 34 64  4@ 64dup .p..64d
0ca0: 75 70 20 36 34 3e 6e 20 2b 74 6f 20 66 70 0a 09  up 64>n +to fp..
0cb0: 36 34 64 75 70 20 70 31 20 36 34 40 20 36 34 2b  64dup p1 64@ 64+
0cc0: 20 36 34 3e 6e 20 74 6f 20 70 31 27 0a 09 70 32   64>n to p1'..p2
0cd0: 20 36 34 40 20 36 34 2b 20 36 34 3e 6e 20 74 6f   64@ 64+ 64>n to
0ce0: 20 70 32 27 0a 20 20 20 20 4c 4f 4f 50 0a 20 20   p2'.    LOOP.  
0cf0: 20 20 62 20 24 40 20 66 70 20 2f 73 74 72 69 6e    b $@ fp /strin
0d00: 67 20 64 75 70 20 49 46 0a 09 64 75 70 20 6e 3e  g dup IF..dup n>
0d10: 36 34 20 2e 70 20 74 79 70 65 0a 20 20 20 20 45  64 .p type.    E
0d20: 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48 45 4e  LSE  2drop  THEN
0d30: 20 3b 0a 0a 56 61 72 69 61 62 6c 65 20 62 64 65   ;..Variable bde
0d40: 6c 74 61 24 0a 0a 3a 20 62 24 66 72 65 65 20 28  lta$..: b$free (
0d50: 20 2d 2d 20 29 0a 20 20 20 20 62 66 69 6c 65 31   -- ).    bfile1
0d60: 24 20 24 66 72 65 65 20 62 66 69 6c 65 32 24 20  $ $free bfile2$ 
0d70: 24 66 72 65 65 20 20 62 64 65 6c 74 61 24 20 24  $free  bdelta$ $
0d80: 66 72 65 65 20 3b 0a 0a 3a 20 62 64 65 6c 74 61  free ;..: bdelta
0d90: 24 32 20 28 20 61 24 20 62 24 20 2d 2d 20 29 0a  $2 ( a$ b$ -- ).
0da0: 20 20 20 20 74 75 63 6b 20 62 64 65 6c 74 61 2d      tuck bdelta-
0db0: 69 6e 69 74 20 3e 6f 20 62 64 2d 70 61 73 73 65  init >o bd-passe
0dc0: 73 20 2e 64 69 66 66 20 6f 20 62 64 65 6c 74 61  s .diff o bdelta
0dd0: 5f 64 6f 6e 65 5f 61 6c 67 20 6f 3e 20 3b 0a 0a  _done_alg o> ;..
0de0: 3a 20 62 64 65 6c 74 61 20 28 20 61 64 64 72 31  : bdelta ( addr1
0df0: 20 75 31 20 61 64 64 72 32 20 75 32 20 2d 2d 20   u1 addr2 u2 -- 
0e00: 61 64 64 72 33 20 75 33 20 29 20 62 73 6c 75 72  addr3 u3 ) bslur
0e10: 70 20 62 64 65 6c 74 61 24 20 24 66 72 65 65 0a  p bdelta$ $free.
0e20: 20 20 20 20 5b 27 5d 20 62 64 65 6c 74 61 24 32      ['] bdelta$2
0e30: 20 62 64 65 6c 74 61 24 20 24 65 78 65 63 20 62   bdelta$ $exec b
0e40: 64 65 6c 74 61 24 20 24 40 20 3b 0a 0a 3a 20 62  delta$ $@ ;..: b
0e50: 70 61 74 63 68 24 32 20 28 20 61 24 20 64 69 66  patch$2 ( a$ dif
0e60: 66 24 20 2d 2d 20 29 0a 20 20 20 20 30 20 7b 20  f$ -- ).    0 { 
0e70: 66 70 20 7d 0a 20 20 20 20 24 40 20 62 6f 75 6e  fp }.    $@ boun
0e80: 64 73 20 55 2b 44 4f 0a 09 49 20 70 40 2b 20 3e  ds U+DO..I p@+ >
0e90: 72 20 36 34 3e 6e 20 72 3e 20 73 77 61 70 20 32  r 64>n r> swap 2
0ea0: 64 75 70 20 74 79 70 65 20 2b 0a 09 64 75 70 20  dup type +..dup 
0eb0: 49 27 20 75 3c 20 49 46 0a 09 20 20 20 20 70 73  I' u< IF..    ps
0ec0: 40 2b 20 3e 72 20 36 34 3e 6e 20 2b 74 6f 20 66  @+ >r 64>n +to f
0ed0: 70 0a 09 20 20 20 20 64 75 70 20 24 40 20 66 70  p..    dup $@ fp
0ee0: 20 73 61 66 65 2f 73 74 72 69 6e 67 0a 09 20 20   safe/string..  
0ef0: 20 20 72 3e 20 70 40 2b 20 3e 72 20 36 34 3e 6e    r> p@+ >r 64>n
0f00: 20 64 75 70 20 2b 74 6f 20 66 70 20 75 6d 69 6e   dup +to fp umin
0f10: 20 74 79 70 65 20 72 3e 0a 09 54 48 45 4e 0a 20   type r>..THEN. 
0f20: 20 20 20 49 20 2d 20 2b 4c 4f 4f 50 20 20 64 72     I - +LOOP  dr
0f30: 6f 70 20 3b 0a 0a 3a 20 62 70 61 74 63 68 24 6c  op ;..: bpatch$l
0f40: 65 6e 20 28 20 64 69 66 66 24 20 2d 2d 20 36 34  en ( diff$ -- 64
0f50: 6c 65 6e 20 29 0a 20 20 20 20 3e 72 20 36 34 23  len ).    >r 64#
0f60: 30 20 72 3e 20 24 40 20 62 6f 75 6e 64 73 20 55  0 r> $@ bounds U
0f70: 2b 44 4f 0a 09 49 20 70 40 2b 20 3e 72 20 36 34  +DO..I p@+ >r 64
0f80: 64 75 70 20 36 34 3e 6e 20 72 3e 20 2b 20 3e 72  dup 64>n r> + >r
0f90: 20 36 34 2b 20 72 3e 0a 09 64 75 70 20 49 27 20   64+ r>..dup I' 
0fa0: 75 3c 20 49 46 0a 09 20 20 20 20 70 73 40 2b 20  u< IF..    ps@+ 
0fb0: 3e 72 20 36 34 64 72 6f 70 20 72 3e 20 70 40 2b  >r 64drop r> p@+
0fc0: 20 3e 72 20 36 34 2b 20 72 3e 0a 09 54 48 45 4e   >r 64+ r>..THEN
0fd0: 0a 20 20 20 20 49 20 2d 20 2b 4c 4f 4f 50 20 20  .    I - +LOOP  
0fe0: 3b 0a 0a 23 38 30 20 43 6f 6e 73 74 61 6e 74 20  ;..#80 Constant 
0ff0: 6d 61 78 2d 73 68 6f 72 74 65 64 23 0a 0a 3a 20  max-shorted#..: 
1000: 3c 23 63 6f 70 79 3e 20 24 42 36 30 32 20 61 74  <#copy> $B602 at
1010: 74 72 21 20 3b 0a 3a 20 3c 23 6f 6d 69 74 3e 20  tr! ;.: <#omit> 
1020: 24 39 36 30 32 20 61 74 74 72 21 20 3b 0a 3a 20  $9602 attr! ;.: 
1030: 3c 23 6e 65 77 3e 20 20 24 44 36 30 32 20 61 74  <#new>  $D602 at
1040: 74 72 21 20 28 20 66 6f 72 20 63 6f 6c 6f 72 20  tr! ( for color 
1050: 62 6c 69 6e 64 3a 20 24 44 36 30 38 20 29 20 3b  blind: $D608 ) ;
1060: 0a 3a 20 3c 23 64 65 6c 3e 20 20 24 45 36 31 30  .: <#del>  $E610
1070: 20 61 74 74 72 21 20 3b 0a 0a 3a 20 74 79 70 65   attr! ;..: type
1080: 2d 73 68 6f 72 74 65 64 20 28 20 61 64 64 72 20  -shorted ( addr 
1090: 75 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20 5b  u -- ).    dup [
10a0: 20 6d 61 78 2d 73 68 6f 72 74 65 64 23 20 35 20   max-shorted# 5 
10b0: 32 20 2a 2f 20 5d 4c 20 75 3e 0a 20 20 20 20 49  2 */ ]L u>.    I
10c0: 46 20 20 6f 76 65 72 20 6d 61 78 2d 73 68 6f 72  F  over max-shor
10d0: 74 65 64 23 20 74 79 70 65 0a 09 3c 23 6f 6d 69  ted# type..<#omi
10e0: 74 3e 20 27 5b 27 20 65 6d 69 74 20 64 75 70 20  t> '[' emit dup 
10f0: 6d 61 78 2d 73 68 6f 72 74 65 64 23 20 32 2a 20  max-shorted# 2* 
1100: 2d 20 30 20 2e 72 20 2e 22 20 20 63 68 61 72 73  - 0 .r ."  chars
1110: 2e 2e 2e 5d 22 20 3c 64 65 66 61 75 6c 74 3e 0a  ...]" <default>.
1120: 09 64 75 70 20 6d 61 78 2d 73 68 6f 72 74 65 64  .dup max-shorted
1130: 23 20 2d 20 2f 73 74 72 69 6e 67 0a 20 20 20 20  # - /string.    
1140: 54 48 45 4e 20 20 74 79 70 65 20 3b 0a 0a 3a 20  THEN  type ;..: 
1150: 63 6f 6c 6f 72 2d 62 70 61 74 63 68 24 32 20 28  color-bpatch$2 (
1160: 20 61 24 20 64 69 66 66 24 20 2d 2d 20 29 0a 20   a$ diff$ -- ). 
1170: 20 20 20 30 20 30 20 7b 20 66 70 20 6f 66 66 74     0 0 { fp offt
1180: 20 7d 0a 20 20 20 20 24 40 20 62 6f 75 6e 64 73   }.    $@ bounds
1190: 20 55 2b 44 4f 0a 09 49 20 70 40 2b 20 3e 72 20   U+DO..I p@+ >r 
11a0: 36 34 3e 6e 20 72 3e 20 73 77 61 70 20 32 64 75  64>n r> swap 2du
11b0: 70 20 3c 23 6e 65 77 3e 20 74 79 70 65 20 3c 64  p <#new> type <d
11c0: 65 66 61 75 6c 74 3e 20 2b 0a 09 64 75 70 20 49  efault> +..dup I
11d0: 27 20 75 3c 20 49 46 0a 09 20 20 20 20 70 73 40  ' u< IF..    ps@
11e0: 2b 20 3e 72 20 36 34 3e 6e 20 64 75 70 20 3e 72  + >r 64>n dup >r
11f0: 20 2b 74 6f 20 66 70 0a 09 20 20 20 20 72 40 20   +to fp..    r@ 
1200: 30 3e 3d 20 49 46 0a 09 09 64 75 70 20 24 40 20  0>= IF...dup $@ 
1210: 66 70 20 72 40 20 2d 20 73 61 66 65 2f 73 74 72  fp r@ - safe/str
1220: 69 6e 67 20 20 6f 66 66 74 20 6e 65 67 61 74 65  ing  offt negate
1230: 20 72 40 20 75 6d 69 6e 20 73 61 66 65 2f 73 74   r@ umin safe/st
1240: 72 69 6e 67 0a 09 09 72 3e 20 75 6d 69 6e 20 3c  ring...r> umin <
1250: 23 64 65 6c 3e 20 74 79 70 65 20 3c 64 65 66 61  #del> type <defa
1260: 75 6c 74 3e 20 30 20 3e 72 20 20 54 48 45 4e 0a  ult> 0 >r  THEN.
1270: 09 20 20 20 20 72 3e 20 74 6f 20 6f 66 66 74 0a  .    r> to offt.
1280: 09 20 20 20 20 64 75 70 20 24 40 20 66 70 20 73  .    dup $@ fp s
1290: 61 66 65 2f 73 74 72 69 6e 67 0a 09 20 20 20 20  afe/string..    
12a0: 72 3e 20 70 40 2b 20 3e 72 20 36 34 3e 6e 20 64  r> p@+ >r 64>n d
12b0: 75 70 20 2b 74 6f 20 66 70 20 75 6d 69 6e 0a 09  up +to fp umin..
12c0: 20 20 20 20 6f 66 66 74 20 30 3c 20 49 46 20 20      offt 0< IF  
12d0: 32 64 75 70 20 6f 66 66 74 20 6e 65 67 61 74 65  2dup offt negate
12e0: 20 75 6d 69 6e 20 3c 23 63 6f 70 79 3e 20 74 79   umin <#copy> ty
12f0: 70 65 20 3c 64 65 66 61 75 6c 74 3e 0a 09 09 6f  pe <default>...o
1300: 66 66 74 20 6e 65 67 61 74 65 20 2f 73 74 72 69  fft negate /stri
1310: 6e 67 20 64 75 70 20 30 20 6d 69 6e 20 74 6f 20  ng dup 0 min to 
1320: 6f 66 66 74 20 30 20 6d 61 78 0a 09 20 20 20 20  offt 0 max..    
1330: 54 48 45 4e 20 20 74 79 70 65 2d 73 68 6f 72 74  THEN  type-short
1340: 65 64 20 72 3e 0a 09 54 48 45 4e 0a 20 20 20 20  ed r>..THEN.    
1350: 49 20 2d 20 2b 4c 4f 4f 50 20 20 64 72 6f 70 20  I - +LOOP  drop 
1360: 3b 0a 0a 3a 20 23 74 79 70 65 20 28 20 61 64 64  ;..: #type ( add
1370: 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 6e 69 70  r u -- ).    nip
1380: 20 3f 64 75 70 2d 49 46 20 20 68 65 78 2e 20 20   ?dup-IF  hex.  
1390: 54 48 45 4e 20 3b 0a 0a 3a 20 63 6f 6c 6f 72 2d  THEN ;..: color-
13a0: 62 70 61 74 63 68 23 20 28 20 61 24 20 64 69 66  bpatch# ( a$ dif
13b0: 66 24 20 2d 2d 20 29 0a 20 20 20 20 30 20 30 20  f$ -- ).    0 0 
13c0: 7b 20 66 70 20 6f 66 66 74 20 7d 0a 20 20 20 20  { fp offt }.    
13d0: 24 40 20 62 6f 75 6e 64 73 20 55 2b 44 4f 0a 09  $@ bounds U+DO..
13e0: 49 20 70 40 2b 20 3e 72 20 36 34 3e 6e 20 72 3e  I p@+ >r 64>n r>
13f0: 20 73 77 61 70 20 32 64 75 70 20 3c 23 6e 65 77   swap 2dup <#new
1400: 3e 20 23 74 79 70 65 20 3c 64 65 66 61 75 6c 74  > #type <default
1410: 3e 20 2b 0a 09 64 75 70 20 49 27 20 75 3c 20 49  > +..dup I' u< I
1420: 46 0a 09 20 20 20 20 70 73 40 2b 20 3e 72 20 36  F..    ps@+ >r 6
1430: 34 3e 6e 20 64 75 70 20 3e 72 20 2b 74 6f 20 66  4>n dup >r +to f
1440: 70 0a 09 20 20 20 20 72 40 20 30 3e 3d 20 49 46  p..    r@ 0>= IF
1450: 0a 09 09 64 75 70 20 24 40 20 66 70 20 72 40 20  ...dup $@ fp r@ 
1460: 2d 20 73 61 66 65 2f 73 74 72 69 6e 67 20 20 6f  - safe/string  o
1470: 66 66 74 20 6e 65 67 61 74 65 20 72 40 20 75 6d  fft negate r@ um
1480: 69 6e 20 73 61 66 65 2f 73 74 72 69 6e 67 0a 09  in safe/string..
1490: 09 72 3e 20 75 6d 69 6e 20 3c 23 64 65 6c 3e 20  .r> umin <#del> 
14a0: 23 74 79 70 65 20 3c 64 65 66 61 75 6c 74 3e 20  #type <default> 
14b0: 30 20 3e 72 20 20 54 48 45 4e 0a 09 20 20 20 20  0 >r  THEN..    
14c0: 72 3e 20 74 6f 20 6f 66 66 74 0a 09 20 20 20 20  r> to offt..    
14d0: 64 75 70 20 24 40 20 66 70 20 73 61 66 65 2f 73  dup $@ fp safe/s
14e0: 74 72 69 6e 67 0a 09 20 20 20 20 72 3e 20 70 40  tring..    r> p@
14f0: 2b 20 3e 72 20 36 34 3e 6e 20 64 75 70 20 2b 74  + >r 64>n dup +t
1500: 6f 20 66 70 20 75 6d 69 6e 0a 09 20 20 20 20 6f  o fp umin..    o
1510: 66 66 74 20 30 3c 20 49 46 20 20 32 64 75 70 20  fft 0< IF  2dup 
1520: 6f 66 66 74 20 6e 65 67 61 74 65 20 75 6d 69 6e  offt negate umin
1530: 20 3c 23 63 6f 70 79 3e 20 23 74 79 70 65 20 3c   <#copy> #type <
1540: 64 65 66 61 75 6c 74 3e 0a 09 09 6f 66 66 74 20  default>...offt 
1550: 6e 65 67 61 74 65 20 2f 73 74 72 69 6e 67 20 64  negate /string d
1560: 75 70 20 30 20 6d 69 6e 20 74 6f 20 6f 66 66 74  up 0 min to offt
1570: 20 30 20 6d 61 78 0a 09 20 20 20 20 54 48 45 4e   0 max..    THEN
1580: 20 20 23 74 79 70 65 20 72 3e 0a 09 54 48 45 4e    #type r>..THEN
1590: 0a 20 20 20 20 49 20 2d 20 2b 4c 4f 4f 50 20 20  .    I - +LOOP  
15a0: 64 72 6f 70 20 3b 0a 0a 3a 20 62 70 61 74 63 68  drop ;..: bpatch
15b0: 20 28 20 61 64 64 72 31 20 75 31 20 61 64 64 72   ( addr1 u1 addr
15c0: 32 20 75 32 20 2d 2d 20 61 64 64 72 33 20 75 33  2 u2 -- addr3 u3
15d0: 20 29 0a 20 20 20 20 62 64 65 6c 74 61 24 20 24   ).    bdelta$ $
15e0: 66 72 65 65 0a 20 20 20 20 62 73 6c 75 72 70 20  free.    bslurp 
15f0: 5b 27 5d 20 62 70 61 74 63 68 24 32 20 62 64 65  ['] bpatch$2 bde
1600: 6c 74 61 24 20 24 65 78 65 63 0a 20 20 20 20 62  lta$ $exec.    b
1610: 64 65 6c 74 61 24 20 24 40 20 3b 0a 0a 3a 20 73  delta$ $@ ;..: s
1620: 70 69 74 2d 66 69 6c 65 20 28 20 61 64 64 72 31  pit-file ( addr1
1630: 20 75 31 20 66 69 6c 65 61 64 64 72 32 20 75 32   u1 fileaddr2 u2
1640: 20 2d 2d 20 29 0a 20 20 20 20 72 2f 77 20 63 72   -- ).    r/w cr
1650: 65 61 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 20  eate-file throw 
1660: 3e 72 20 72 40 20 77 72 69 74 65 2d 66 69 6c 65  >r r@ write-file
1670: 0a 20 20 20 20 72 3e 20 63 6c 6f 73 65 2d 66 69  .    r> close-fi
1680: 6c 65 20 74 68 72 6f 77 20 74 68 72 6f 77 20 3b  le throw throw ;
1690: 0a                                               .