Artifact
41eca571fc06f0aeb9a1f53332a2f6d0129535cd:
- File
bdelta.fs
— part of check-in
[9abcfa97a4]
at
2018-08-20 23:27:51
on branch trunk
— Some fixes, e.g. for bdelta
(user:
bernd
size: 5777)
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 .