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

Branko Čibej: VCDIFF patch

From: Greg Hudson <ghudson_at_MIT.EDU>
Date: 2000-10-06 18:35:43 CEST

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'm willing to implement partial solutions for milestone 1 if people
can identify what work they want done.

------- 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.