[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: Branko Čibej: VCDIFF patch

From: Karl Fogel <kfogel_at_galois.collab.net>
Date: 2000-10-06 18:58:20 CEST

Greg Hudson <ghudson@MIT.EDU> writes:
> So, it looks like we won't have actual vcdiff support for milestone 1.
> I've looked over the vcdiff draft and Branko's stuff, and instruction
> code sets make life kind of complicated; there's no way I could finish
> up his work today.
>
> (I'm kind of thinking that vcdiff is actually a more complicated
> encoding format than we really want, given that no one else uses it
> that we know of. This is a flip-flop from my earlier position, but I
> hadn't realized that the encoding of vcdiff instructions was such a
> complicated thing.)

I don't think we're totally wedded to vcdiff format (are we?). We
need to encode diffs reasonably efficiently; we don't need to encode
them for transmission down a 300 baud modem link across the Marianas
Trench with the fishes chewing at the wires and getting the packets
all soggy.

However, there might be good arguments for sticking with
vcdiff... (anyone? Branko? Jim?)

> I'm willing to implement partial solutions for milestone 1 if people
> can identify what work they want done.

For m1 it's probably simpler to just use the full text of the target
string (after all, it's the same as the vcdiff encoding of that one
insert instruction would be, except for a few header bytes).

But that doesn't mean that work on vcdiff (or whatever format) can't
progress! We just won't hook it up for m1.

-K

> ------- Forwarded Message
>
> Replied: Fri, 06 Oct 2000 10:33:32 -0400
> Replied: "brane@xbc.nu "
> Return-Path: <branko.cibej@hermes.si>
> Received: from MIT.EDU by po12.mit.edu (8.9.2/4.7) id JAA09151; Fri, 6 Oct 2000 09:37:31 -0400 (EDT)
> Received: from guardian.hermes.si by MIT.EDU with SMTP
> id AA20639; Fri, 6 Oct 00 09:38:07 EDT
> Received: from hermes.si (primus.hermes.si [193.77.5.98])
> by guardian.hermes.si (8.9.3/8.9.3) with ESMTP id PAA00975;
> Fri, 6 Oct 2000 15:36:19 +0200 (METDST)
> Received: (from uucp@localhost)
> by hermes.si (8.9.3/8.9.3) id PAA22876;
> Fri, 6 Oct 2000 15:36:16 +0200
> Received: from lux.hermes.si(10.17.4.137) by primus.hermes.si via smap (V2.1)
> id xma021742; Fri, 6 Oct 00 15:35:42 +0200
> Received: from hermes.si by lux.hermes.si (8.8.8+Sun/SMI-SVR4)
> id PAA22634; Fri, 6 Oct 2000 15:35:42 +0200 (MET DST)
> Message-Id: <39DDD52E.568EBF2A@hermes.si>
> Date: Fri, 06 Oct 2000 15:35:42 +0200
> From: Branko =?iso-8859-2?Q?=C8ibej?= <branko.cibej@hermes.si>
> Reply-To: brane@xbc.nu
> Organization: HERMES SoftLab
> X-Mailer: Mozilla 4.75 [en] (Windows NT 5.0; U)
> X-Accept-Language: sl,en-GB,en
> Mime-Version: 1.0
> To: ghudson@MIT.EDU
> Cc: brane@xbc.nu
> Subject: VCDIFF patch
> Content-Type: multipart/mixed;
> boundary="------------8A24BE8C29DBEB9B8DB05FC7"
>
> This is a multi-part message in MIME format.
> - --------------8A24BE8C29DBEB9B8DB05FC7
> Content-Type: text/plain; charset=iso-8859-2
> Content-Transfer-Encoding: 7bit
>
> Hi Greg,
>
> I should have done this sooner, but I've been absolutely swamped
> at work the last two weeks, and probably won't be able to do any
> more work on SVN this month.
>
> I'm sending you the VCDIFF stuff I managed to do. The basic infrastructure
> is complete, together with the vcdiff encoder. You'll have to write the
> decoder and of course hook it all up into the text delta interfaces.
>
> Oh yeah, you'll also find that comments are a bit scarce ... but I'm sure
> you'll find your way around.
>
> As you'll see from the infrastructure, I was hoping to be able to
> optimize the vcdiff stream (you'll see some magic being done about
> finding the best instruction/addressing mode pair for a copy).
>
> Obviously I should have started simpler, if I'd just copied the code
> from the vcdiff paper, it would've all been done by now. Stupid me.
> So right now I don't generate any instruction pairs in the encoder at all.
>
> One caveat: encode_address_mode (in the encoder) and decode_address_mode
> (in the decoder) should be called *exactly once* for each instruction,
> otherwise the address cache won't be updated correctly. Yes, the address
> cache is used for one window, then thrown away. This is as per spec.
>
>
> Again, I apologize for not speaking up earlier. Hope I haven't
> done too much harm by that.
>
> Brane
>
>
> P.S.: Feel free to forward this to the list, if you like.
> - --------------8A24BE8C29DBEB9B8DB05FC7
> Content-Type: text/plain; charset=iso-8859-2;
> name="vcdiff.patch"
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline;
> filename="vcdiff.patch"
>
> Index: .cvsignore
> ===================================================================
> RCS file: /cvs/subversion/subversion/libsvn_delta/.cvsignore,v
> retrieving revision 1.5
> diff -u -p -r1.5 .cvsignore
> - --- .cvsignore 2000/10/05 00:07:15 1.5
> +++ .cvsignore 2000/10/06 13:13:33
> @@ -5,3 +5,4 @@ Makefile
> *.la
> .deps
> .libs
> +vcdiff_tables.c
> Index: Makefile.am
> ===================================================================
> RCS file: /cvs/subversion/subversion/libsvn_delta/Makefile.am,v
> retrieving revision 1.11
> diff -u -p -r1.11 Makefile.am
> - --- Makefile.am 2000/10/05 00:15:55 1.11
> +++ Makefile.am 2000/10/06 13:13:33
> @@ -9,7 +9,8 @@ lib_LTLIBRARIES = libsvn_delta.la
>
> ## Sources needed to build each library (names canonicalized)
> libsvn_delta_la_SOURCES = xml_parse.c xml_output.c vcdiff_parse.c \
> - - text_delta.c vdelta.c
> + text_delta.c vdelta.c \
> + vcdiff.c vcdiff_tables.c
>
> ## Build flags ---------
>
> @@ -22,3 +23,8 @@ SUBDIRS = . tests
>
> ## Make libtool be quiet
> LIBTOOL = @LIBTOOL@ --silent
> +
> +
> +## Additional targets
> +vcdiff_tables.c: vcdiff_tables.def gen_vcdiff_tables.pl
> + perl gen_vcdiff_tables.pl > $@
>
> - --------------8A24BE8C29DBEB9B8DB05FC7
> Content-Type: application/x-unknown-content-type-hfile;
> name="vcdiff.h"
> Content-Transfer-Encoding: base64
> Content-Disposition: inline;
> filename="vcdiff.h"
>
> LyogdmNkaWZmLmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIFZDRElGRi4KICoKICogPT09PT09
> PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
> PT09PQogKiBDb3B5cmlnaHQgKGMpIDIwMDAgQ29sbGFiTmV0LiAgQWxsIHJpZ2h0cyByZXNl
> cnZlZC4KICogCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
> cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
> ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiAqIG1ldDoK
> ICogCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
> aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
> YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogCiAqIDIuIFJlZGlzdHJpYnV0aW9u
> cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAq
> IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
> Y2xhaW1lciBpbiB0aGUKICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
> IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICogCiAqIDMuIFRoZSBlbmQtdXNl
> ciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgog
> KiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAiVGhp
> cyBwcm9kdWN0IGluY2x1ZGVzCiAqIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb2xsYWJOZXQg
> KGh0dHA6Ly93d3cuQ29sbGFiLk5ldCkuIgogKiBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3ds
> ZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsIGlmCiAqIGFuZCB3
> aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBl
> YXIuCiAqIAogKiA0LiBUaGUgaG9zdGVkIHByb2plY3QgbmFtZXMgbXVzdCBub3QgYmUgdXNl
> ZCB0byBlbmRvcnNlIG9yIHByb21vdGUKICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMg
> c29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCiAqIHBlcm1pc3Npb24uIEZvciB3cml0
> dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29sbGFiLm5ldC4KICogCiAq
> IDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgdXNlIHRo
> ZSAiVGlncmlzIiBuYW1lCiAqIG5vciBtYXkgIlRpZ3JpcyIgYXBwZWFyIGluIHRoZWlyIG5h
> bWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogKiBwZXJtaXNzaW9uIG9mIENvbGxhYk5ldC4K
> ICogCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQ
> UkVTU0VEIE9SIElNUExJRUQKICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
> TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZ
> IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4K
> ICogSU4gTk8gRVZFTlQgU0hBTEwgQ09MTEFCTkVUIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
> TElBQkxFIEZPUiBBTlkKICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
> TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywg
> QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCiAqIEdPT0RT
> IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
> U1MKICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
> RiBMSUFCSUxJVFksIFdIRVRIRVIKICogSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
> IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCiAqIE9USEVSV0lTRSkgQVJJU0lO
> RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYK
> ICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqID09
> PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
> PT09PT09PT09PT09CiAqIAogKiBUaGlzIHNvZnR3YXJlIG1heSBjb25zaXN0IG9mIHZvbHVu
> dGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhh
> bGYgb2YgQ29sbGFiTmV0LgogKi8KCiNpZm5kZWYgVkNESUZGX0gKI2RlZmluZSBWQ0RJRkZf
> SAoKI2luY2x1ZGUgPGFwci5oPgoKDAovKiBBIHZjZGlmZiB3aW5kb3cgaGVhZGVyIGNhbid0
> IGJlIGxvbmdlciB0aGFuIHRoaXMuICovCiNkZWZpbmUgU1ZOX1ZDRElGRl9NQVhfSEVBREVS
> X1NJWkUgMzIKCi8qIEluc3RydWN0aW9uIGNvZGVzLiAqLwp0eXBlZGVmIGVudW0gc3ZuX3Zj
> ZGlmZl9vcF90IHsKICBzdm5fdmNkaWZmX29wX25vb3AgPSAwLAogIHN2bl92Y2RpZmZfb3Bf
> YWRkICA9IDEsCiAgc3ZuX3ZjZGlmZl9vcF9ydW4gID0gMiwKICBzdm5fdmNkaWZmX29wX2Nv
> cHkgPSAzCn0gc3ZuX3ZjZGlmZl9vcF90OwoKLyogQWRkcmVzc2luZyBtb2RlcyAqLwp0eXBl
> ZGVmIGVudW0gc3ZuX3ZjZGlmZl9hZGRyX3QgewogIHN2bl92Y2RpZmZfYWRkcl9zZWxmID0g
> MCwKICBzdm5fdmNkaWZmX2FkZHJfaGVyZSA9IDEsCiAgc3ZuX3ZjZGlmZl9hZGRyX3NhbWUg
> PSAyLAogIHN2bl92Y2RpZmZfYWRkcl9uZWFyID0gMywKCiAgLyogTnVtYmVyIG9mIGFkZHJl
> c3MgdHlwZXMgKi8KICBTVk5fVkNESUZGX0FERFJfVFlQRV9DT1VOVCA9IDQsCgogIC8qIFRo
> ZXJlIGFyZSBmb3VyIGVudHJpZXMgaW4gdGhlIE5FQVIgY2FjaGUuICovCiAgc3ZuX3ZjZGlm
> Zl9hZGRyX25lYXJfMCA9IDMsCiAgc3ZuX3ZjZGlmZl9hZGRyX25lYXJfMSA9IDQsCiAgc3Zu
> X3ZjZGlmZl9hZGRyX25lYXJfMiA9IDUsCiAgc3ZuX3ZjZGlmZl9hZGRyX25lYXJfMyA9IDYs
> CgogIC8qIE51bWJlciBvZiBhZGRyZXNzaW5nIG1vZGVzLiAqLwogIFNWTl9WQ0RJRkZfQURE
> Ul9NT0RFX0NPVU5UID0gNywKICBTVk5fVkNESUZGX0FERFJfTkVBUl9DT1VOVCA9IDQsCiAg
> CiAgLyogUGxhY2Vob2xkZXIgZm9yIFJVTiBhbmQgQUREIGluc25zLiAqLwogIHN2bl92Y2Rp
> ZmZfYWRkcl9ub25lID0gLTEKfSBzdm5fdmNkaWZmX2FkZHJfdDsKCi8qIEluc3RydWN0aW9u
> IGRlc2NyaXB0aW9uLiAqLwp0eXBlZGVmIHN0cnVjdCBzdm5fdmNkaWZmX2luc25fdCB7CiAg
> c3ZuX3ZjZGlmZl9vcF90IHR5cGU7CiAgc3ZuX3ZjZGlmZl9hZGRyX3QgbW9kZTsKICBhcHJf
> c2l6ZV90IHNpemU7ICAgICAgICAgICAgICAvKiAwIG9yIDEuLjI1NS4gKi8KfSBzdm5fdmNk
> aWZmX2luc25fdDsKCi8qIEVhY2ggZW50cnkgaW4gdGhlIGNvZGUgdGFibGUgaXMgYSBwYWly
> IG9mIGluc3RydWN0aW9ucy4gKi8KdHlwZWRlZiBzdHJ1Y3Qgc3ZuX3ZjZGlmZl9jb2RlX3Qg
> ewogIHN2bl92Y2RpZmZfaW5zbl90IGluc24xOyAgICAgIC8qIE5vdGU6IHRoaXMgY2FuJ3Qg
> YmUgTk9PUC4gKi8KICBzdm5fdmNkaWZmX2luc25fdCBpbnNuMjsKfSBzdm5fdmNkaWZmX2Nv
> ZGVfdDsKCi8qIFRoZSBjb2RlIHRhYmxlIGlzIDI1NiBpbnN0cnVjdGlvbiBwYWlycy4gKi8K
> I2RlZmluZSBTVk5fVkNESUZGX0lOU05fVEFCTEVfU0laRSAyNTYKdHlwZWRlZiBzdm5fdmNk
> aWZmX2NvZGVfdApzdm5fdmNkaWZmX2luc25fdGFibGVfdFtTVk5fVkNESUZGX0lOU05fVEFC
> TEVfU0laRV07CgoKDAovKiBJbnZlcnNlIGNvZGUgdGFibGVzLiAqLwp0eXBlZGVmIHN0cnVj
> dCBzdm5fdmNkaWZmX2ludl9jb2RlX3QgewogIGFwcl9zaXplX3Qgc2l6ZTsgICAgICAgICAg
> ICAgIC8qIFRoZSBzaXplIGVuY29kZWQgaW4gdGhpcyBpbnNuLiAqLwogIGludCBpbmRleDsg
> ICAgICAgICAgICAgICAgICAgIC8qIEluZGV4IG9mIHRoZSBpbnNuIHBhaXIgaW4gdGhlIGlu
> c24gdGFibGUuICovCn0gc3ZuX3ZjZGlmZl9pbnZfY29kZV90OwoKdHlwZWRlZiBzdHJ1Y3Qg
> c3ZuX3ZjZGlmZl9pbnZfaW5kZXhfdCB7CiAgaW50IHplcm9fc2l6ZV9pbmRleDsKICBjb25z
> dCBzdm5fdmNkaWZmX2ludl9jb2RlX3QgKmZpcnN0X3NpemU7CiAgY29uc3Qgc3ZuX3ZjZGlm
> Zl9pbnZfY29kZV90ICpsYXN0X3NpemU7Cn0gc3ZuX3ZjZGlmZl9pbnZfaW5kZXhfdDsKCnR5
> cGVkZWYgc3RydWN0IHN2bl92Y2RpZmZfaW52X2luc25fdGFibGVfdCB7CiAgc3ZuX3ZjZGlm
> Zl9pbnZfaW5kZXhfdCBhZGQ7CiAgc3ZuX3ZjZGlmZl9pbnZfaW5kZXhfdCBydW47CiAgc3Zu
> X3ZjZGlmZl9pbnZfaW5kZXhfdCBjb3B5W1NWTl9WQ0RJRkZfQUREUl9NT0RFX0NPVU5UXTsK
> fSBzdm5fdmNkaWZmX2ludl9pbnNuX3RhYmxlX3Q7CgoKLyogVGhlIGFycmF5IG9mIHN0YW5k
> YXJkIGluc3RydWN0aW9uIHRhYmxlcyAqLwojZGVmaW5lIFNWTl9WQ0RJRkZfU1REX1RBQkxF
> U19TSVpFIDgKZXh0ZXJuIGNvbnN0IHN2bl92Y2RpZmZfaW5zbl90YWJsZV90ICoKY29uc3Qg
> c3ZuX3ZjZGlmZl9zdGRfdGFibGVzW1NWTl9WQ0RJRkZfU1REX1RBQkxFU19TSVpFXTsKCmV4
> dGVybiBjb25zdCBzdm5fdmNkaWZmX2ludl9pbnNuX3RhYmxlX3QgKgpjb25zdCBzdm5fdmNk
> aWZmX3N0ZF9pbnZfdGFibGVzW1NWTl9WQ0RJRkZfU1REX1RBQkxFU19TSVpFXTsKCgoKI2Vu
> ZGlmIC8qIFZDRElGRl9IICovCgoKDAovKiAKICogbG9jYWwgdmFyaWFibGVzOgogKiBldmFs
> OiAobG9hZC1maWxlICIuLi9zdm4tZGV2LmVsIikKICogZW5kOgogKi8K
> - --------------8A24BE8C29DBEB9B8DB05FC7
> Content-Type: application/x-unknown-content-type-cfile;
> name="vcdiff.c"
> Content-Transfer-Encoding: base64
> Content-Disposition: inline;
> filename="vcdiff.c"
>
> LyogdmNkaWZmLmMgLS0gdmNkaWZmIGltcGxlbWVudGF0aW9uCiAqCiAqID09PT09PT09PT09
> PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
> ICogQ29weXJpZ2h0IChjKSAyMDAwIENvbGxhYk5ldC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
> CiAqIAogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
> cm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
> b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogKiBtZXQ6CiAqIAog
> KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
> b3ZlIGNvcHlyaWdodAogKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
> aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIAogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
> YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiBub3Rp
> Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
> ZXIgaW4gdGhlCiAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
> aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIAogKiAzLiBUaGUgZW5kLXVzZXIgZG9j
> dW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKICogYW55
> LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogIlRoaXMgcHJv
> ZHVjdCBpbmNsdWRlcwogKiBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29sbGFiTmV0IChodHRw
> Oi8vd3d3LkNvbGxhYi5OZXQpLiIKICogQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1l
> bnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLCBpZgogKiBhbmQgd2hlcmV2
> ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgog
> KiAKICogNC4gVGhlIGhvc3RlZCBwcm9qZWN0IG5hbWVzIG11c3Qgbm90IGJlIHVzZWQgdG8g
> ZW5kb3JzZSBvciBwcm9tb3RlCiAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3
> YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgogKiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBw
> ZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvbGxhYi5uZXQuCiAqIAogKiA1LiBQ
> cm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IHVzZSB0aGUgIlRp
> Z3JpcyIgbmFtZQogKiBub3IgbWF5ICJUaWdyaXMiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3
> aXRob3V0IHByaW9yIHdyaXR0ZW4KICogcGVybWlzc2lvbiBvZiBDb2xsYWJOZXQuCiAqIAog
> KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NF
> RCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
> IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQg
> RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCiAqIElO
> IE5PIEVWRU5UIFNIQUxMIENPTExBQk5FVCBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
> RSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
> RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
> T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQogKiBHT09EUyBPUiBT
> RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCiAq
> IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
> QklMSVRZLCBXSEVUSEVSCiAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
> T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgogKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
> QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCiAqIEFE
> VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKiA9PT09PT09
> PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
> PT09PT09PQogKiAKICogVGhpcyBzb2Z0d2FyZSBtYXkgY29uc2lzdCBvZiB2b2x1bnRhcnkg
> Y29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9m
> IENvbGxhYk5ldC4KICovCgojaW5jbHVkZSAic3ZuX2RlbHRhLmgiCiNpbmNsdWRlICJkZWx0
> YS5oIgojaW5jbHVkZSAidmNkaWZmLmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRl
> IDxsaW1pdHMuaD4KCgoMCi8qIFZhbHVlIGVuY29kaW5nICovCnN0YXRpYyBBUFJfSU5MSU5F
> IGFwcl9vZmZfdAplbmNvZGVfdmNkaWZmX251bSAoYXByX29mZl90IG51bSwgdW5zaWduZWQg
> Y2hhciAqYnVmLCBhcHJfc2l6ZV90IHNwYWNlKQp7CiAgdW5zaWduZWQgY2hhciBudW1fYnVm
> WyhDSEFSX0JJVCAqIHNpemVvZiAobnVtKSkgLyA3ICsgMV07CiAgdW5zaWduZWQgY2hhciAq
> cCA9ICZudW1fYnVmW3NpemVvZiAobnVtX2J1ZildOwogIGFwcl9zaXplX3QgbnVtX3NpemU7
> CgogICotLXAgPSAobnVtICYgMHg3Zik7CiAgd2hpbGUgKChudW0gPj49IDcpICE9IDApCiAg
> ICB7CiAgICAgICotLXAgPSAobnVtICYgMHg3ZikgfCAweDgwOwogICAgfQoKICBudW1fc2l6
> ZSA9ICZudW1fYnVmW3NpemVvZiAobnVtX2J1ZildIC0gcDsKICBpZiAobnVtX3NpemUgPiBz
> cGFjZSkgICAgICAgICAvKiBPb3BzLCBubyBzcGFjZSBpbiBCVUYuICovCiAgICByZXR1cm4g
> LTE7CgogIG1lbWNweSAoYnVmLCBwLCBudW1fc2l6ZSk7CiAgcmV0dXJuIG51bV9zaXplOwp9
> CgoKc3RhdGljIEFQUl9JTkxJTkUgYXByX29mZl90CmRlY29kZV92Y2RpZmZfbnVtIChhcHJf
> b2ZmX3QgKm51bSwgdW5zaWduZWQgY2hhciAqYnVmLCBhcHJfc2l6ZV90IHNwYWNlKQp7CiAg
> dW5zaWduZWQgY2hhciAqY29uc3QgZW5kID0gYnVmICsgc3BhY2U7CiAgdW5zaWduZWQgY2hh
> ciAqcCA9IGJ1ZjsKCiAgd2hpbGUgKHAgPCBlbmQpCiAgICB7CiAgICAgIGludCBjb25zdCBu
> ID0gKnAtLTsKICAgICAgKm51bSA9ICgqbnVtIDw8IDcpIHwgKG4gJiAweDdmKTsKICAgICAg
> aWYgKChuICYgMHg4MCkgPT0gMCkKICAgICAgICByZXR1cm4gKHAgLSBidWYpOwogICAgfQog
> IHJldHVybiAtMTsKfQoKCnN0YXRpYyBBUFJfSU5MSU5FIGFwcl9vZmZfdAplbmNvZGVfdmNk
> aWZmX3JhbmdlIChhcHJfb2ZmX3QgbnVtLCBhcHJfb2ZmX3QgbWF4LAogICAgICAgICAgICAg
> ICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGFwcl9zaXplX3Qgc3BhY2UpCnsKICB1bnNp
> Z25lZCBjaGFyIG51bV9idWZbKENIQVJfQklUICogc2l6ZW9mIChudW0pKSAvIDggKyAxXTsK
> ICB1bnNpZ25lZCBjaGFyICpwID0gJm51bV9idWZbc2l6ZW9mIChudW1fYnVmKV07CiAgYXBy
> X3NpemVfdCBudW1fc2l6ZTsKCiAgKi0tcCA9IChudW0gJiAweGZmKTsKICB3aGlsZSAoKG1h
> eCA+Pj0gOCkgIT0gMCkKICAgIHsKICAgICAgKi0tcCA9ICgobnVtID4+PSA4KSAmIDB4ZmYp
> OwogICAgfQoKICBudW1fc2l6ZSA9ICZudW1fYnVmW3NpemVvZiAobnVtX2J1ZildIC0gcDsK
> ICBpZiAobnVtX3NpemUgPiBzcGFjZSkgICAgICAgICAvKiBPb3BzLCBubyBzcGFjZSBpbiBC
> VUYuICovCiAgICByZXR1cm4gLTE7CgogIG1lbWNweSAoYnVmLCBwLCBudW1fc2l6ZSk7CiAg
> cmV0dXJuIG51bV9zaXplOwp9CgoKc3RhdGljIEFQUl9JTkxJTkUgYXByX29mZl90CmRlY29k
> ZV92Y2RpZmZfcmFuZ2UgKGFwcl9vZmZfdCAqbnVtLCBhcHJfb2ZmX3QgbWF4LAogICAgICAg
> ICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGFwcl9zaXplX3Qgc3BhY2UpCnsK
> ICB1bnNpZ25lZCBjaGFyICpjb25zdCBlbmQgPSBidWYgKyBzcGFjZTsKICB1bnNpZ25lZCBj
> aGFyICpwID0gYnVmOwoKICB3aGlsZSAocCA8IGVuZCkKICAgIHsKICAgICAgaW50IGNvbnN0
> IG4gPSAqcC0tOwogICAgICAqbnVtID0gKCpudW0gPDwgNykgfCAobiAmIDB4ZmYpOwogICAg
> ICBpZiAoKG1heCA+Pj0gOCkgPT0gMCkKICAgICAgICByZXR1cm4gKHAgLSBidWYpOwogICAg
> fQogIHJldHVybiAtMTsKfQoKCgwKLyogQWRkcmVzcyBjYWNoZSAqLwp0eXBlZGVmIHN0cnVj
> dCBhZGRyX2NhY2hlX3QgewogIGFwcl9vZmZfdCBzYW1lWzI1Nl07CiAgYXByX29mZl90IG5l
> YXJbNF07CiAgaW50IG5lYXJfaW5kZXg7Cn0gYWRkcl9jYWNoZV90OwoKc3RhdGljIEFQUl9J
> TkxJTkUgdm9pZAppbml0X2FkZHJlc3NfY2FjaGUgKGFkZHJfY2FjaGVfdCAqY2FjaGUpCnsK
> ICBtZW1zZXQgKGNhY2hlLCAwLCBzaXplb2YgKCpjYWNoZSkpOwp9CgpzdGF0aWMgQVBSX0lO
> TElORSB2b2lkCnVwZGF0ZV9hZGRyZXNzX2NhY2hlIChhZGRyX2NhY2hlX3QgKmNhY2hlLCBh
> cHJfb2ZmX3QgYWRkcikKewogIGNhY2hlLT5zYW1lW2FkZHIgJSAyNTZdID0gYWRkcjsKICBj
> YWNoZS0+bmVhcltjYWNoZS0+bmVhcl9pbmRleF0gPSBhZGRyOwogIGNhY2hlLT5uZWFyX2lu
> ZGV4ID0gKGNhY2hlLT5uZWFyX2luZGV4ICsgMSkgJSA0Owp9Cgp0eXBlZGVmIHN0cnVjdCBh
> ZGRyX2VuY29kZV90IHsKICBzdHJ1Y3QgewogICAgc3ZuX3ZjZGlmZl9hZGRyX3QgbW9kZTsK
> ICAgIGFwcl9vZmZfdCBjb2RlOwogIH0gdHlwZXNbU1ZOX1ZDRElGRl9BRERSX1RZUEVfQ09V
> TlRdOwp9IGFkZHJfZW5jb2RlX3Q7CgoKc3RhdGljIHZvaWQKZW5jb2RlX2FkZHJlc3NfbW9k
> ZSAoYXByX29mZl90IGFkZHIsIGFwcl9vZmZfdCBoZXJlLAogICAgICAgICAgICAgICAgICAg
> ICBhZGRyX2NhY2hlX3QgKmNhY2hlLCBhZGRyX2VuY29kZV90ICplbmNvZGVkKQp7CiAgYXBy
> X29mZl90IGNvZGU7CiAgaW50IGk7CgogIC8qIGhlcmUgKi8KICBjb2RlID0gaGVyZSAtIGFk
> ZHI7CiAgaWYgKGNvZGUgPCAyNTYpCiAgICB7CiAgICAgIGVuY29kZWQtPnR5cGVzWzBdLm1v
> ZGUgPSBzdm5fdmNkaWZmX2FkZHJfaGVyZTsKICAgICAgZW5jb2RlZC0+dHlwZXNbMF0uY29k
> ZSA9IGNvZGU7CiAgICB9CiAgZWxzZQogICAgZW5jb2RlZC0+dHlwZXNbMF0ubW9kZSA9IHN2
> bl92Y2RpZmZfYWRkcl9ub25lOwoKICAvKiBzYW1lICovCiAgY29kZSA9IGFkZHIgJiAyNTY7
> CiAgaWYgKGNhY2hlLT5zYW1lW2NvZGVdID09IGFkZHIpCiAgICB7CiAgICAgIGVuY29kZWQt
> PnR5cGVzWzFdLm1vZGUgPSBzdm5fdmNkaWZmX2FkZHJfc2FtZTsKICAgICAgZW5jb2RlZC0+
> dHlwZXNbMV0uY29kZSA9IGNvZGU7CiAgICB9CiAgZWxzZQogICAgZW5jb2RlZC0+dHlwZXNb
> MV0ubW9kZSA9IHN2bl92Y2RpZmZfYWRkcl9ub25lOwoKICAvKiBuZWFyICovCiAgZW5jb2Rl
> ZC0+dHlwZXNbMl0ubW9kZSA9IHN2bl92Y2RpZmZfYWRkcl9ub25lOwogIGZvciAoaSA9IDA7
> IFNWTl9WQ0RJRkZfQUREUl9ORUFSX0NPVU5UOyArK2kpCiAgICB7CiAgICAgIGNvZGUgPSBh
> ZGRyIC0gY2FjaGUtPm5lYXJbaV07CiAgICAgIGlmIChjb2RlID49IC0xMjcgJiYgY29kZSA8
> PSAxMjgpCiAgICAgICAgewogICAgICAgICAgZW5jb2RlZC0+dHlwZXNbMl0ubW9kZSA9IHN2
> bl92Y2RpZmZfYWRkcl9uZWFyICsgaTsKICAgICAgICAgIGVuY29kZWQtPnR5cGVzWzJdLmNv
> ZGUgPSBjb2RlICsgMTI3OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogIGlm
> IChpID09IFNWTl9WQ0RJRkZfQUREUl9ORUFSX0NPVU5UKQogICAgZW5jb2RlZC0+dHlwZXNb
> Ml0ubW9kZSA9IHN2bl92Y2RpZmZfYWRkcl9ub25lOwoKICAvKiBzZWxmICovCiAgZW5jb2Rl
> ZC0+dHlwZXNbM10ubW9kZSA9IHN2bl92Y2RpZmZfYWRkcl9zZWxmOwogIGVuY29kZWQtPnR5
> cGVzWzNdLmNvZGUgPSBjb2RlOwoKICAvKiBmaW5pc2ggKi8KICB1cGRhdGVfYWRkcmVzc19j
> YWNoZSAoY2FjaGUsIGFkZHIpOwp9CgpzdGF0aWMgYXByX29mZl90CmRlY29kZV9hZGRyZXNz
> X21vZGUgKGFwcl9vZmZfdCBjb2RlLCBhcHJfb2ZmX3QgaGVyZSwKICAgICAgICAgICAgICAg
> ICAgICAgc3ZuX3ZjZGlmZl9hZGRyX3QgbW9kZSwgYWRkcl9jYWNoZV90ICpjYWNoZSkKewog
> IGFwcl9vZmZfdCBhZGRyOwogIHN3aXRjaCAobW9kZSkKICAgIHsKICAgIGNhc2Ugc3ZuX3Zj
> ZGlmZl9hZGRyX3NlbGY6CiAgICAgIGFzc2VydCAoY29kZSA+PSAwKTsKICAgICAgYWRkciA9
> IGNvZGU7CiAgICAgIGJyZWFrOwoKICAgIGNhc2Ugc3ZuX3ZjZGlmZl9hZGRyX2hlcmU6CiAg
> ICAgIGFzc2VydCAoaGVyZSA+PSBjb2RlKTsKICAgICAgYWRkciA9IGhlcmUgLSBjb2RlOwog
> ICAgICBicmVhazsKCiAgICBjYXNlIHN2bl92Y2RpZmZfYWRkcl9zYW1lOgogICAgICBhc3Nl
> cnQgKGNvZGUgPj0gMCAmJiBjb2RlIDwgMjU2KTsKICAgICAgYWRkciA9IGNhY2hlLT5zYW1l
> W2NvZGVdOwogICAgICBicmVhazsKCiAgICBjYXNlIHN2bl92Y2RpZmZfYWRkcl9uZWFyXzA6
> CiAgICBjYXNlIHN2bl92Y2RpZmZfYWRkcl9uZWFyXzE6CiAgICBjYXNlIHN2bl92Y2RpZmZf
> YWRkcl9uZWFyXzI6CiAgICBjYXNlIHN2bl92Y2RpZmZfYWRkcl9uZWFyXzM6CiAgICAgIGFz
> c2VydCAoY29kZSA+PSAwICYmIGNvZGUgPCAyNTYpOwogICAgICBhZGRyID0gKGNhY2hlLT5u
> ZWFyW21vZGUgLSBzdm5fdmNkaWZmX2FkZHJfbmVhcl8wXQogICAgICAgICAgICAgICsgY29k
> ZSAtIDEyNyk7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIGFzc2VydCAoISJX
> cm9uZyBhZGRyZXNzaW5nIG1vZGUuIik7CiAgICB9CgogIHVwZGF0ZV9hZGRyZXNzX2NhY2hl
> IChjYWNoZSwgYWRkcik7CiAgcmV0dXJuIGFkZHI7Cn0KCgoKDAovKiBGaW5kIGluc24gKi8K
> c3RhdGljIGludApmaW5kX2luc25faW5kZXggKGNvbnN0IHN2bl92Y2RpZmZfaW52X2luZGV4
> X3QgKmludl9pbmRleCwKICAgICAgICAgICAgICAgICBhcHJfc2l6ZV90IHNpemUsIHN2bl9i
> b29sZWFuX3QgKnplcm9fc2l6ZSkKewogIGNvbnN0IHN2bl92Y2RpZmZfaW52X2NvZGVfdCAq
> YiA9IGludl9pbmRleC0+Zmlyc3Rfc2l6ZTsKICBjb25zdCBzdm5fdmNkaWZmX2ludl9jb2Rl
> X3QgKmUgPSBpbnZfaW5kZXgtPmxhc3Rfc2l6ZTsKCiAgaWYgKHNpemUgPj0gYi0+c2l6ZSAm
> JiBzaXplIDw9IGUtPnNpemUpCiAgICB7CiAgICAgIGNvbnN0IHN2bl92Y2RpZmZfaW52X2Nv
> ZGVfdCAqYzsKICAgICAgKnplcm9fc2l6ZSA9IEZBTFNFOwogICAgICBmb3IgKDs7KQogICAg
> ICAgIHsKICAgICAgICAgIGMgPSBiICsgKGUgLSBiKSAvIDI7CiAgICAgICAgICBpZiAoc2l6
> ZSA+IGMtPnNpemUpCiAgICAgICAgICAgIGIgPSBjOwogICAgICAgICAgZWxzZQogICAgICAg
> ICAgICBlID0gYzsKICAgICAgICAgIAogICAgICAgICAgaWYgKHNpemUgPT0gYi0+c2l6ZSkK
> ICAgICAgICAgICAgcmV0dXJuIGItPmluZGV4OwogICAgICAgICAgaWYgKHNpemUgPT0gZS0+
> c2l6ZSkKICAgICAgICAgICAgcmV0dXJuIGUtPmluZGV4OwogICAgICAgICAgaWYgKGUgLSBi
> IDwgMikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAqemVyb19zaXpl
> ID0gVFJVRTsKICByZXR1cm4gaW52X2luZGV4LT56ZXJvX3NpemVfaW5kZXg7Cn0KCnN0YXRp
> YyBpbnQKZmluZF9pbnNuIChjb25zdCBzdm5fdmNkaWZmX2luc25fdGFibGVfdCAqdGFibGUs
> CiAgICAgICAgICAgY29uc3Qgc3ZuX3ZjZGlmZl9pbnZfaW5zbl90YWJsZV90ICppbnZfdGFi
> bGUsCiAgICAgICAgICAgYWRkcl9jYWNoZV90ICpjYWNoZSwKICAgICAgICAgICBzdm5fdmNk
> aWZmX29wX3Qgb3Bjb2RlLAogICAgICAgICAgIGFwcl9zaXplX3Qgc2l6ZSwgYXByX29mZl90
> IGFkZHIsIGFwcl9vZmZfdCBoZXJlLAogICAgICAgICAgIGFwcl9vZmZfdCAqYWRkcl9jb2Rl
> KQp7CiAgYWRkcl9lbmNvZGVfdCBlbmNvZGVkOwogIHN2bl9ib29sZWFuX3QgemVyb19zaXpl
> OwogIGludCBpLCBpbnNuOwoKICBzd2l0Y2ggKG9wY29kZSkKICAgIHsKICAgIGNhc2Ugc3Zu
> X3ZjZGlmZl9vcF9hZGQ6CiAgICAgIHJldHVybiBmaW5kX2luc25faW5kZXggKCZpbnZfdGFi
> bGUtPmFkZCwgc2l6ZSwgJnplcm9fc2l6ZSk7CgogICAgY2FzZSBzdm5fdmNkaWZmX29wX3J1
> bjoKICAgICAgcmV0dXJuIGZpbmRfaW5zbl9pbmRleCAoJmludl90YWJsZS0+cnVuLCBzaXpl
> LCAmemVyb19zaXplKTsKCiAgICBjYXNlIHN2bl92Y2RpZmZfb3BfY29weToKICAgICAgYXNz
> ZXJ0IChhZGRyX2NvZGUgIT0gTlVMTCk7CiAgICAgIGVuY29kZV9hZGRyZXNzX21vZGUgKGFk
> ZHIsIGhlcmUsIGNhY2hlLCAmZW5jb2RlZCk7CiAgICAgIGluc24gPSAtMTsKICAgICAgZm9y
> IChpID0gMDsgaSA8IDQ7ICsraSkKICAgICAgICB7CiAgICAgICAgICBpbnQgaW5kZXggPSBm
> aW5kX2luc25faW5kZXggKCZpbnZfdGFibGUtPmNvcHlbZW5jb2RlZC50eXBlc1tpXS5tb2Rl
> XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgJnplcm9f
> c2l6ZSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkKICAgICAgICAgICAgewogICAgICAg
> ICAgICAgICphZGRyX2NvZGUgPSBlbmNvZGVkLnR5cGVzW2ldLmNvZGU7CiAgICAgICAgICAg
> ICAgaWYgKCF6ZXJvX3NpemUpCiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAg
> ICAgICAgICAgZWxzZSBpZiAoaW5zbiA8IDApCiAgICAgICAgICAgICAgICBpbnNuID0gaW5k
> ZXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVybiBpbnNuOwoKICAgIGRl
> ZmF1bHQ6CiAgICAgIGFzc2VydCAoISJXcm9uZyBWQ0RJRkYgb3Bjb2RlLiIpOwogICAgfQoK
> ICBhc3NlcnQgKCEiT29wcywgaG93IGRpZCBJIGdldCBoZXJlPyIpOwogIHJldHVybiAtMTsK
> fQoKCgwKLyogTWFrZSBWQ0RJRkYgd2luZG93IGZyb20gZGVsdGEgd2luZG93LiBBbGxvY2F0
> ZSBmcm9tIFBPT0wgKi8Kc3ZuX2Vycm9yX3QgKgpzdm5fdmNkaWZmX19lbmNvZGVfd2luZG93
> ICh1bnNpZ25lZCBjaGFyICoqdmNkaWZmX3dpbmRvdywKICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgYXByX3NpemVfdCAqdmNkaWZmX3dpbmRvd19zaXplLAogICAgICAgICAgICAgICAg
> ICAgICAgICAgICBzdm5fdHhkZWx0YV93aW5kb3dfdCAqZGVsdGFfd2luZG93LAogICAgICAg
> ICAgICAgICAgICAgICAgICAgICBhcHJfcG9vbF90ICpwb29sKQp7CiAgY29uc3Qgc3ZuX3Zj
> ZGlmZl9pbnNuX3RhYmxlX3QgKmNvbnN0IGluc25fdGFibGUgPSBzdm5fdmNkaWZmX3N0ZF90
> YWJsZXNbMF07CiAgY29uc3Qgc3ZuX3ZjZGlmZl9pbnZfaW5zbl90YWJsZV90ICpjb25zdCBp
> bnZfaW5zbl90YWJsZSA9CiAgICBzdm5fdmNkaWZmX3N0ZF9pbnZfdGFibGVzWzBdOwoKICBz
> dm5fc3RyaW5nX3QgKmluc25fc3RyZWFtID0gc3ZuX3N0cmluZ19uY3JlYXRlICgiIiwgMCwg
> cG9vbCk7CiAgYWRkcl9jYWNoZV90IGNhY2hlOwogIGludCBpLCB2Y2RpZmZfcG9zOwogIGFw
> cl9vZmZfdCBsZW47CgogIGluaXRfYWRkcmVzc19jYWNoZSgmY2FjaGUpOwogIGZvciAoaSA9
> IDA7IGkgPCBkZWx0YV93aW5kb3ctPm51bV9vcHM7ICsraSkKICAgIHsKICAgICAgY29uc3Qg
> c3ZuX3ZjZGlmZl9pbnNuX3QgKmluc247CiAgICAgIGFwcl9vZmZfdCBhZGRyLCBhZGRyX2Nv
> ZGU7CiAgICAgIGludCBpbnNuX2luZGV4OwoKICAgICAgdW5zaWduZWQgY2hhciBpbnNuX2J1
> ZlsxNl07IC8qIDkgc2hvdWxkIGluIGZhY3QgYmUgZW5vdWdoLiAqLwogICAgICBhcHJfb2Zm
> X3QgaW5zbl9wb3M7CiAgICAgIAogICAgICBzd2l0Y2ggKGRlbHRhX3dpbmRvdy0+b3BzW2ld
> LmFjdGlvbl9jb2RlKQogICAgICAgIHsKICAgICAgICBjYXNlIHN2bl90eGRlbHRhX3NvdXJj
> ZToKICAgICAgICAgIGFkZHIgPSBkZWx0YV93aW5kb3ctPm9wc1tpXS5vZmZzZXQ7CiAgICAg
> ICAgICBnb3RvIGdldF9jb3B5X2luc247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAKICAgICAgICBjYXNlIHN2bl90eGRlbHRhX3RhcmdldDoKICAgICAgICAgIGFkZHIg
> PSBkZWx0YV93aW5kb3ctPm9wc1tpXS5vZmZzZXQgKyBkZWx0YV93aW5kb3ctPnN2aWV3X2xl
> bjsKICAgICAgICBnZXRfY29weV9pbnNuOgogICAgICAgICAgaW5zbl9pbmRleCA9IGZpbmRf
> aW5zbiAoaW5zbl90YWJsZSwgaW52X2luc25fdGFibGUsCiAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAmY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICBzdm5fdmNkaWZmX29wX2NvcHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICBkZWx0YV93aW5kb3ctPm9wc1tpXS5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICBhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5z
> bl9zdHJlYW0tPmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRy
> X2NvZGUpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2Ugc3ZuX3R4ZGVsdGFfbmV3
> OgogICAgICAgICAgaW5zbl9pbmRleCA9IGZpbmRfaW5zbiAoaW5zbl90YWJsZSwgaW52X2lu
> c25fdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FjaGUsCiAg
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdm5fdmNkaWZmX29wX2FkZCwKICAg
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX3dpbmRvdy0+b3BzW2ldLmxl
> bmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwpOwog
> ICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBhc3NlcnQgKCEi
> V3JvbmcgZGVsdGEgb3Bjb2RlLiIpOwogICAgICAgIH0KCiAgICAgIGFzc2VydCAoaW5zbl9p
> bmRleCA+PSAwICYmIGluc25faW5kZXggPCBTVk5fVkNESUZGX0lOU05fVEFCTEVfU0laRSk7
> CiAgICAgIGluc24gPSAmKCppbnNuX3RhYmxlKVtpbnNuX2luZGV4XS5pbnNuMTsKICAgICAg
> aW5zbl9idWZbMF0gPSBpbnNuX2luZGV4OwogICAgICBpbnNuX3BvcyA9IDE7CgogICAgICBp
> ZiAoaW5zbi0+c2l6ZSA9PSAwKQogICAgICAgIHsKICAgICAgICAgIGxlbiA9IGVuY29kZV92
> Y2RpZmZfbnVtIChkZWx0YV93aW5kb3ctPm9wc1tpXS5sZW5ndGgsCiAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAgaW5zbl9idWYgKyBpbnNuX3BvcywKICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5zbl9idWYpIC0gaW5zbl9wb3MpOwog
> ICAgICAgICAgYXNzZXJ0IChsZW4gPiAwKTsKICAgICAgICAgIGluc25fcG9zICs9IGxlbjsK
> ICAgICAgICB9CgogICAgICBpZiAoaW5zbi0+dHlwZSA9PSBzdm5fdmNkaWZmX29wX2NvcHkp
> CiAgICAgICAgc3dpdGNoIChpbnNuLT5tb2RlKQogICAgICAgICAgewogICAgICAgICAgY2Fz
> ZSBzdm5fdmNkaWZmX2FkZHJfaGVyZToKICAgICAgICAgIGNhc2Ugc3ZuX3ZjZGlmZl9hZGRy
> X3NhbWU6CiAgICAgICAgICBjYXNlIHN2bl92Y2RpZmZfYWRkcl9uZWFyXzA6CiAgICAgICAg
> ICBjYXNlIHN2bl92Y2RpZmZfYWRkcl9uZWFyXzE6CiAgICAgICAgICBjYXNlIHN2bl92Y2Rp
> ZmZfYWRkcl9uZWFyXzI6CiAgICAgICAgICBjYXNlIHN2bl92Y2RpZmZfYWRkcl9uZWFyXzM6
> CiAgICAgICAgICAgIGxlbiA9IGVuY29kZV92Y2RpZmZfbnVtIChhZGRyX2NvZGUsCiAgICAg
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuX2J1ZiArIGluc25fcG9zLAog
> ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluc25fYnVmKSAt
> IGluc25fcG9zKTsKICAgICAgICAgICAgYXNzZXJ0IChsZW4gPiAwKTsKICAgICAgICAgICAg
> aW5zbl9wb3MgKz0gbGVuOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlIHN2
> bl92Y2RpZmZfYWRkcl9zZWxmOgogICAgICAgICAgICBsZW4gPSBlbmNvZGVfdmNkaWZmX3Jh
> bmdlIChhZGRyX2NvZGUsIGluc25fc3RyZWFtLT5sZW4sCiAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgIGluc25fYnVmICsgaW5zbl9wb3MsCiAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnNuX2J1ZikgLSBpbnNuX3Bvcyk7
> CiAgICAgICAgICAgIGFzc2VydCAobGVuID4gMCk7CiAgICAgICAgICAgIGluc25fcG9zICs9
> IGxlbjsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAg
> ICAgYXNzZXJ0ICghIkJhZCBhZGRyZXNzaW5nIG1vZGUgaW4gVkNESUZGIGluc24uIik7CiAg
> ICAgICAgICB9CgogICAgICBzdm5fc3RyaW5nX2FwcGVuZGJ5dGVzIChpbnNuX3N0cmVhbSwg
> aW5zbl9idWYsIGluc25fcG9zLCBwb29sKTsKICAgIH0KCiAgLyogU3BsaWNlIHRoZSB3aW5k
> b3cgdG9nZXRoZXIuICovCgogICp2Y2RpZmZfd2luZG93ID0gYXByX3BhbGxvYyAocG9vbCwg
> KGluc25fc3RyZWFtLT5sZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICArIGRlbHRhX3dpbmRvdy0+bmV3LT5sZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICAgICArIFNWTl9WQ0RJRkZfTUFYX0hFQURFUl9TSVpFKSk7CiAgLyogU2V0IHRo
> ZSBXUyBiaXQgaW4gdGhlIGhlYWRlciwgaWYgYXBwcm9wcmlhdGUuICovCiAgaWYgKGRlbHRh
> X3dpbmRvdy0+c3ZpZXdfbGVuID4gMCkKICAgICgqdmNkaWZmX3dpbmRvdylbMF0gPSAoMSA8
> PCAzKTsKICBlbHNlCiAgICAoKnZjZGlmZl93aW5kb3cpWzBdID0gMDsKICB2Y2RpZmZfcG9z
> ID0gMTsKCiAgLyogRW5jb2RlIHRoZSB0YXJnZXQgd2luZG93IGFuZCBkYXRhc2V0IGxlbmd0
> aHMuICovCiAgbGVuID0gZW5jb2RlX3ZjZGlmZl9udW0gKGRlbHRhX3dpbmRvdy0+dHZpZXdf
> bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKnZjZGlmZl93aW5kb3cpICsgdmNk
> aWZmX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZOX1ZDRElGRl9NQVhfSEVB
> REVSX1NJWkUgLSB2Y2RpZmZfcG9zKTsKICBhc3NlcnQgKGxlbiA+IDApOwogIHZjZGlmZl9w
> b3MgKz0gbGVuOwoKICBsZW4gPSBlbmNvZGVfdmNkaWZmX251bSAoaW5zbl9zdHJlYW0tPmxl
> biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp2Y2RpZmZfd2luZG93KSArIHZjZGlm
> Zl9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWTl9WQ0RJRkZfTUFYX0hFQURF
> Ul9TSVpFIC0gdmNkaWZmX3Bvcyk7CiAgYXNzZXJ0IChsZW4gPiAwKTsKICB2Y2RpZmZfcG9z
> ICs9IGxlbjsKCiAgbGVuID0gZW5jb2RlX3ZjZGlmZl9udW0gKGRlbHRhX3dpbmRvdy0+bmV3
> LT5sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgqdmNkaWZmX3dpbmRvdykgKyB2
> Y2RpZmZfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTVk5fVkNESUZGX01BWF9I
> RUFERVJfU0laRSAtIHZjZGlmZl9wb3MpOwogIGFzc2VydCAobGVuID4gMCk7CiAgdmNkaWZm
> X3BvcyArPSBsZW47CgogIC8qIEVuY29kZSB0aGUgc291cmNlIHNlZ21lbnQgc2l6ZSBhbmQg
> cG9zaXRpb24uICovCiAgaWYgKGRlbHRhX3dpbmRvdy0+c3ZpZXdfbGVuID4gMCkKICAgIHsK
> ICAgICAgbGVuID0gZW5jb2RlX3ZjZGlmZl9udW0gKGRlbHRhX3dpbmRvdy0+c3ZpZXdfbGVu
> LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp2Y2RpZmZfd2luZG93KSArIHZj
> ZGlmZl9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVk5fVkNESUZGX01B
> WF9IRUFERVJfU0laRSAtIHZjZGlmZl9wb3MpOwogICAgICBhc3NlcnQgKGxlbiA+IDApOwog
> ICAgICB2Y2RpZmZfcG9zICs9IGxlbjsKCiAgICAgIGxlbiA9IGVuY29kZV92Y2RpZmZfbnVt
> IChkZWx0YV93aW5kb3ctPnN2aWV3X29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAg
> ICAgICAgICgqdmNkaWZmX3dpbmRvdykgKyB2Y2RpZmZfcG9zLAogICAgICAgICAgICAgICAg
> ICAgICAgICAgICAgICAgU1ZOX1ZDRElGRl9NQVhfSEVBREVSX1NJWkUgLSB2Y2RpZmZfcG9z
> KTsKICAgICAgYXNzZXJ0IChsZW4gPiAwKTsKICAgICAgdmNkaWZmX3BvcyArPSBsZW47CiAg
> ICB9CgogIGFzc2VydCAodmNkaWZmX3BvcyA8PSBTVk5fVkNESUZGX01BWF9IRUFERVJfU0la
> RSk7CgogIC8qIENvcHkgdGhlIGluc3RydWN0aW9ucyBhbmQgZGF0YSBpbnRvIHRoZSB3aW5k
> b3cuICovCiAgbWVtY3B5ICgoKnZjZGlmZl93aW5kb3cpICsgdmNkaWZmX3BvcywgaW5zbl9z
> dHJlYW0tPmRhdGEsIGluc25fc3RyZWFtLT5sZW4pOwogIG1lbWNweSAoKCp2Y2RpZmZfd2lu
> ZG93KSArIHZjZGlmZl9wb3MgKyBpbnNuX3N0cmVhbS0+bGVuLAogICAgICAgICAgZGVsdGFf
> d2luZG93LT5uZXctPmRhdGEsIGRlbHRhX3dpbmRvdy0+bmV3LT5sZW4pOwogICp2Y2RpZmZf
> d2luZG93X3NpemUgPSB2Y2RpZmZfcG9zICsgaW5zbl9zdHJlYW0tPmxlbiArIGRlbHRhX3dp
> bmRvdy0+bmV3LT5sZW47CiAgCiAgcmV0dXJuIFNWTl9OT19FUlJPUjsKfQoKCgwKCgoKDAov
> KiAKICogbG9jYWwgdmFyaWFibGVzOgogKiBldmFsOiAobG9hZC1maWxlICIuLi9zdm4tZGV2
> LmVsIikKICogZW5kOgogKi8K
> - --------------8A24BE8C29DBEB9B8DB05FC7
> Content-Type: application/x-perl;
> name="gen_vcdiff_tables.pl"
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline;
> filename="gen_vcdiff_tables.pl"
>
> # gen_vcdiff_tables.pl -- Generate standard vcdiff (en|de)coding tables.
> #
> # ================================================================
> # Copyright (c) 2000 CollabNet. All rights reserved.
> #
> # Redistribution and use in source and binary forms, with or without
> # modification, are permitted provided that the following conditions are
> # met:
> #
> # 1. Redistributions of source code must retain the above copyright
> # notice, this list of conditions and the following disclaimer.
> #
> # 2. Redistributions in binary form must reproduce the above copyright
> # notice, this list of conditions and the following disclaimer in the
> # documentation and/or other materials provided with the distribution.
> #
> # 3. The end-user documentation included with the redistribution, if
> # any, must include the following acknowlegement: "This product includes
> # software developed by CollabNet (http://www.Collab.Net)."
> # Alternately, this acknowlegement may appear in the software itself, if
> # and wherever such third-party acknowlegements normally appear.
> #
> # 4. The hosted project names must not be used to endorse or promote
> # products derived from this software without prior written
> # permission. For written permission, please contact info@collab.net.
> #
> # 5. Products derived from this software may not use the "Tigris" name
> # nor may "Tigris" appear in their names without prior written
> # permission of CollabNet.
> #
> # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
> # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> # IN NO EVENT SHALL COLLABNET OR ITS CONTRIBUTORS BE LIABLE FOR ANY
> # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
> # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
> # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
> # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
> # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> #
> # ====================================================================
> #
> # This software may consist of voluntary contributions made by many
> # individuals on behalf of CollabNet.
>
>
> use strict;
> use integer;
>
> ########
> # "Constant" data.
>
> # Opcodes and addressing modes.
> my @opcodes = ('svn_vcdiff_op_noop',
> 'svn_vcdiff_op_add',
> 'svn_vcdiff_op_run',
> 'svn_vcdiff_op_copy');
> my @addrmodes = ('svn_vcdiff_addr_self',
> 'svn_vcdiff_addr_here',
> 'svn_vcdiff_addr_same',
> 'svn_vcdiff_addr_near_0',
> 'svn_vcdiff_addr_near_1',
> 'svn_vcdiff_addr_near_2',
> 'svn_vcdiff_addr_near_3');
> my $noaddrmode = 'svn_vcdiff_addr_none';
>
> # All addressing modes, for looping.
> my @all_modes = ('self', 'here', 'same', 'near0', 'near1', 'near2', 'near3');
>
>
> ########
> # Globals.
> my $insn_count; # Number of instructions
> my $code_count; # Number of instruction pairs
> my $table_name; # Current table name
> my @insn_table; # Data for table inverter
>
>
> ########
> # Begin an instruction table
> sub begin_table($$)
> {
> my ($name, $comment) = @_;
> $table_name = $name;
> @insn_table = ([], []);
> $insn_count = 0;
> $code_count = 0;
> print("\f\n",
> "$comment\n",
> "static const svn_vcdiff_insn_table_t $table_name =\n",
> " {\n");
> }
>
> ########
> # End an instruction table, and generate inverse table.
> sub end_table()
> {
> if ($code_count != 0) { print "\n"; }
> print " };\n\n";
>
> # Generate inv. table for first insns with noop second insn.
> my @insns = sort {
> # Sort by second insn's opcode first, so that the noops
> # stay at the front of the list.
> my $cmp = ($insn_table[1]->[$a->{index}]->{opcode}
> <=> $insn_table[1]->[$b->{index}]->{opcode});
> # Now sort by opcode, mode and size.
> ($cmp ? $cmp
> : (($cmp = $a->{opcode} <=> $b->{opcode}) ? $cmp
> : (($cmp = $a->{mode} <=> $b->{mode}) ? $cmp
> : ($cmp = $a->{size} <=> $b->{size}))));
> } @{$insn_table[0]};
>
> my %inv_table = (add => [-1, -1, -1],
> run => [-1, -1, -1],
> copy => [[-1, -1, -1],
> [-1, -1, -1],
> [-1, -1, -1],
> [-1, -1, -1],
> [-1, -1, -1],
> [-1, -1, -1],
> [-1, -1, -1]]);
>
> my $index = 0;
> print("static const svn_vcdiff_inv_code_t ${table_name}_inv_codes[] =\n",
> " {\n");
> foreach (@insns)
> {
> die "Aargh, bad insn table!" unless $_->{opcode} != 0;
> last if $insn_table[1]->[$_->{index}]->{opcode} != 0;
> print ",\n" if $index > 0;
> print " {$_->{size}, $_->{index}}";
>
>
> my $ix = ($_->{opcode} == 1 ? $inv_table{add}
> : ($_->{opcode} == 2 ? $inv_table{run}
> : $inv_table{copy}->[$_->{mode}]));
>
> if ($_->{size} == 0)
> {
> $ix->[0] = $_->{index};
> }
> else
> {
> $ix->[1] = $index unless $ix->[1] >= 0;
> $ix->[2] = $index;
> }
> ++$index;
> }
> print "\n" if $index > 0;
> print " };\n\n";
>
> print("static const svn_vcdiff_inv_insn_table_t ${table_name}_inv =\n",
> " {\n");
> foreach ($inv_table{add}, $inv_table{run})
> {
> print " {$_->[0], ";
> if ($_->[1] < 0)
> {
> print "NULL, NULL},\n";
> }
> else
> {
> print("&${table_name}_inv_codes[$_->[1]], ",
> "&${table_name}_inv_codes[$_->[2]]},\n");
> }
> }
> print " {\n";
> for (0..6)
> {
> my $ix = $inv_table{copy}->[$_];
> print ",\n" if $_ > 0;
> print " {$ix->[0], ";
> if ($ix->[1] < 0)
> {
> print "NULL, NULL}";
> }
> else
> {
> print("&${table_name}_inv_codes[$ix->[1]], ",
> "&${table_name}_inv_codes[$ix->[2]]}");
> }
> }
> print "\n }\n };\n\n";
> }
>
>
> ########
> # Emit a pair of instructions
> sub emit($$)
> {
> my ($insn1, $insn2) = @_;
> my $comma = ', ';
>
> if ($code_count != 0) { print ",\n"; }
> print ' {';
> foreach ($insn1, $insn2)
> {
> my $opcode = $opcodes[$_->{'opcode'}];
> my $addrmode = ($_->{'mode'} == -1 ? $noaddrmode
> : $addrmodes[$_->{'mode'}]);
> print "{$opcode, $addrmode, $_->{'size'}}$comma";
> $comma = '}';
> }
> ++$code_count;
> }
>
> ########
> # Single instruction generators
> sub noop()
> {
> my $insn = {index => $code_count,
> opcode => 0,
> mode => -1,
> size => 0};
> push @{$insn_table[$insn_count & 1]}, $insn;
> ++$insn_count;
> return $insn;
> }
>
> sub add($)
> {
> my ($size) = @_;
> my $insn = {index => $code_count,
> opcode => 1,
> mode => -1,
> size => $size};
> push @{$insn_table[$insn_count & 1]}, $insn;
> ++$insn_count;
> return $insn;
> }
>
> sub run($)
> {
> my ($size) = @_;
> my $insn = {index => $code_count,
> opcode => 2,
> mode => -1,
> size => $size};
> push @{$insn_table[$insn_count & 1]}, $insn;
> ++$insn_count;
> return $insn;
> }
>
> sub copy($$)
> {
> my ($size, $mode) = @_;
> my $insn_mode;
> foreach ($mode)
> {
> m/^self$/i and do { $insn_mode = 0; last; };
> m/^here$/i and do { $insn_mode = 1; last; };
> m/^same$/i and do { $insn_mode = 2; last; };
> m/^near([0-3])$/i and do { $insn_mode = 3 + $1; last; };
> die "Invalid addressing mode \`$mode\'.";
> }
> my $insn = {index => $code_count,
> opcode => 3,
> mode => $insn_mode,
> size => $size};
> push @{$insn_table[$insn_count & 1]}, $insn;
> ++$insn_count;
> return $insn;
> }
>
>
> # Print the file header.
> print '/* GENERATED FILE -- DO NOT EDIT! Make changes to vcdiff_tables.def.
> *
> * ================================================================
> * Copyright (c) 2000 CollabNet. All rights reserved.
> *
> * Redistribution and use in source and binary forms, with or without
> * modification, are permitted provided that the following conditions are
> * met:
> *
> * 1. Redistributions of source code must retain the above copyright
> * notice, this list of conditions and the following disclaimer.
> *
> * 2. Redistributions in binary form must reproduce the above copyright
> * notice, this list of conditions and the following disclaimer in the
> * documentation and/or other materials provided with the distribution.
> *
> * 3. The end-user documentation included with the redistribution, if
> * any, must include the following acknowlegement: "This product includes
> * software developed by CollabNet (http://www.Collab.Net)."
> * Alternately, this acknowlegement may appear in the software itself, if
> * and wherever such third-party acknowlegements normally appear.
> *
> * 4. The hosted project names must not be used to endorse or promote
> * products derived from this software without prior written
> * permission. For written permission, please contact info@collab.net.
> *
> * 5. Products derived from this software may not use the "Tigris" name
> * nor may "Tigris" appear in their names without prior written
> * permission of CollabNet.
> *
> * THIS SOFTWARE IS PROVIDED ``AS IS\'\' AND ANY EXPRESSED OR IMPLIED
> * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> * IN NO EVENT SHALL COLLABNET OR ITS CONTRIBUTORS BE LIABLE FOR ANY
> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
> * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
> * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
> * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> *
> * ====================================================================
> *
> * This software may consist of voluntary contributions made by many
> * individuals on behalf of CollabNet.
> */
>
> #include "vcdiff.h"
> #include <stddef.h>
>
> ';
>
> # Include the code table definitions.
> eval `cat vcdiff_tables.def`;
>
> # That's it.
>
>
> - --------------8A24BE8C29DBEB9B8DB05FC7
> Content-Type: text/plain; charset=iso-8859-2;
> name="vcdiff_tables.def"
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline;
> filename="vcdiff_tables.def"
>
> # -*- Perl -*-
>
>
> begin_table('vcdiff_table_0',
> '/* Standard code table, index 0 -- 4-byte copies. */');
> emit(run(0), noop());
> emit(add(0), noop());
> for (1..14) {
> emit(add($_), noop());
> }
> for (@all_modes) {
> emit(copy(0, $_), noop());
> }
> for my $s (4..14) {
> for my $m (@all_modes) {
> emit(copy($s, $m), noop());
> }
> }
> for my $m (@all_modes) {
> for my $s (1..4) {
> emit(copy(0, $m), add($s));
> }
> }
> for my $cs (4..7) {
> for my $m (@all_modes) {
> for my $as (1..4) {
> emit(copy($cs, $m), add($as));
> }
> }
> }
> for my $s1 (4..7) {
> for my $s2 (4..7) {
> emit(copy($s1, 'self'), copy($s2, 'self'));
> }
> }
> end_table();
>
>
> begin_table('vcdiff_table_1',
> '/* Standard code table, index 1 -- 3-byte copies. */');
> emit(run(0), noop());
> emit(add(0), noop());
> for (1..14) {
> emit(add($_), noop());
> }
> for (@all_modes) {
> emit(copy(0, $_), noop());
> }
> for my $s (3..13) {
> for my $m (@all_modes) {
> emit(copy($s, $m), noop());
> }
> }
> for my $m (@all_modes) {
> for my $s (1..4) {
> emit(copy(0, $m), add($s));
> }
> }
> for my $cs (3..6) {
> for my $m (@all_modes) {
> for my $as (1..4) {
> emit(copy($cs, $m), add($as));
> }
> }
> }
> for my $s1 (3..6) {
> for my $s2 (3..6) {
> emit(copy($s1, 'self'), copy($s2, 'self'));
> }
> }
> end_table();
>
>
> # Standard instructin tables and inverse tables.
> print ("\f\n",
> "/* Standard VCDIFF decoding tables. */\n",
> "const svn_vcdiff_insn_table_t *\n",
> "const svn_vcdiff_std_tables[SVN_VCDIFF_STD_TABLES_SIZE] = \n",
> " {\n",
> " &vcdiff_table_0,\n",
> " &vcdiff_table_1,\n",
> " NULL,\n",
> " NULL,\n",
> " NULL,\n",
> " NULL,\n",
> " NULL,\n",
> " NULL\n",
> " };\n\n",
> "/* Standard VCDIFF encoding tables. */\n",
> "const svn_vcdiff_inv_insn_table_t *\n",
> "const svn_vcdiff_std_inv_tables[SVN_VCDIFF_STD_TABLES_SIZE] = \n",
> " {\n",
> " &vcdiff_table_0_inv,\n",
> " &vcdiff_table_1_inv,\n",
> " NULL,\n",
> " NULL,\n",
> " NULL,\n",
> " NULL,\n",
> " NULL,\n",
> " NULL\n",
> " };\n\n",
> );
>
> - --------------8A24BE8C29DBEB9B8DB05FC7--
>
>
> ------- End of Forwarded Message
Received on Sat Oct 21 14:36:10 2006

This is an archived mail posted to the Subversion Dev mailing list.