From fd61616c03682e1aaf07b9a981200cae227e7fb1 Mon Sep 17 00:00:00 2001 From: Dylan Knutson Date: Mon, 21 Jul 2025 21:19:28 +0000 Subject: [PATCH] remove xdiff/diffy/rb-bsdiff --- .devcontainer/Dockerfile.devcontainer | 34 +- .gitignore | 3 - Dockerfile | 23 - Gemfile | 6 - Gemfile.lock | 14 - gems/rb-bsdiff/Gemfile | 5 - gems/rb-bsdiff/Gemfile.lock | 24 - gems/rb-bsdiff/LICENSE | 27 - gems/rb-bsdiff/README | 6 - gems/rb-bsdiff/Rakefile | 25 - gems/rb-bsdiff/ext/b0 | Bin 12260 -> 0 bytes gems/rb-bsdiff/ext/b1 | Bin 12488 -> 0 bytes gems/rb-bsdiff/ext/bsdiff.c | 417 ------- gems/rb-bsdiff/ext/bsdiff.h | 6 - gems/rb-bsdiff/ext/bspatch.c | 203 --- gems/rb-bsdiff/ext/bspatch.h | 6 - gems/rb-bsdiff/ext/extconf.rb | 10 - gems/rb-bsdiff/ext/rb_bsdiff.c | 30 - gems/rb-bsdiff/rb-bsdiff.gemspec | 33 - gems/rb-bsdiff/test.rb | 34 - gems/xdiff-rb/Gemfile | 5 - gems/xdiff-rb/Gemfile.lock | 26 - gems/xdiff-rb/Rakefile | 34 - gems/xdiff-rb/ext/xdiff/extconf.rb | 55 - gems/xdiff-rb/ext/xdiff/extension.cc | 188 --- gems/xdiff-rb/ext/xdiff/xdiff.tar.gz | Bin 88964 -> 0 bytes gems/xdiff-rb/ext/xdiff/xdiff/AUTHORS | 2 - gems/xdiff-rb/ext/xdiff/xdiff/CMakeLists.txt | 122 -- gems/xdiff-rb/ext/xdiff/xdiff/COPYING | 504 -------- gems/xdiff-rb/ext/xdiff/xdiff/ChangeLog | 5 - gems/xdiff-rb/ext/xdiff/xdiff/README | 34 - gems/xdiff-rb/ext/xdiff/xdiff/config.h.in | 34 - .../ext/xdiff/xdiff/man/xdiff-lib.html | 105 -- gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.3 | 871 ------------- gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.html | 1109 ----------------- gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.pdf | Bin 26597 -> 0 bytes gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.txt | 611 --------- .../ext/xdiff/xdiff/test/xdiff_test.c | 202 --- .../ext/xdiff/xdiff/test/xregression.c | 132 -- .../ext/xdiff/xdiff/test/xtestutils.c | 631 ---------- .../ext/xdiff/xdiff/test/xtestutils.h | 57 - gems/xdiff-rb/ext/xdiff/xdiff/tools/xrabin.c | 296 ----- .../xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.c | 70 -- .../xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.h | 34 - gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xalloc.c | 51 - gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.c | 315 ----- gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.h | 40 - .../xdiff-rb/ext/xdiff/xdiff/xdiff/xbpatchi.c | 336 ----- gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiff.h | 144 --- gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.c | 556 --------- gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.h | 60 - gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.c | 132 -- gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.h | 34 - .../xdiff-rb/ext/xdiff/xdiff/xdiff/xinclude.h | 71 -- gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmacros.h | 51 - gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmerge3.c | 66 - .../xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.c | 92 -- .../xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.h | 56 - gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xpatchi.c | 641 ---------- .../xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.c | 456 ------- .../xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.h | 35 - .../xdiff-rb/ext/xdiff/xdiff/xdiff/xrabdiff.c | 381 ------ gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabply.c | 298 ----- gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xtypes.h | 68 - gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.c | 580 --------- gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.h | 47 - .../xdiff-rb/ext/xdiff/xdiff/xdiff/xversion.c | 27 - gems/xdiff-rb/lib/xdiff.rb | 28 - gems/xdiff-rb/test/xdiff_test.rb | 33 - gems/xdiff-rb/xdiff.gemspec | 23 - sorbet/rbi/gems/diffy@3.4.3.rbi | 184 --- sorbet/rbi/gems/rb-bsdiff@0.1.0.rbi | 9 - sorbet/rbi/gems/xdiff@0.0.1.rbi | 33 - 73 files changed, 6 insertions(+), 10874 deletions(-) delete mode 100644 gems/rb-bsdiff/Gemfile delete mode 100644 gems/rb-bsdiff/Gemfile.lock delete mode 100644 gems/rb-bsdiff/LICENSE delete mode 100644 gems/rb-bsdiff/README delete mode 100644 gems/rb-bsdiff/Rakefile delete mode 100644 gems/rb-bsdiff/ext/b0 delete mode 100644 gems/rb-bsdiff/ext/b1 delete mode 100644 gems/rb-bsdiff/ext/bsdiff.c delete mode 100644 gems/rb-bsdiff/ext/bsdiff.h delete mode 100644 gems/rb-bsdiff/ext/bspatch.c delete mode 100644 gems/rb-bsdiff/ext/bspatch.h delete mode 100644 gems/rb-bsdiff/ext/extconf.rb delete mode 100644 gems/rb-bsdiff/ext/rb_bsdiff.c delete mode 100644 gems/rb-bsdiff/rb-bsdiff.gemspec delete mode 100644 gems/rb-bsdiff/test.rb delete mode 100644 gems/xdiff-rb/Gemfile delete mode 100644 gems/xdiff-rb/Gemfile.lock delete mode 100644 gems/xdiff-rb/Rakefile delete mode 100644 gems/xdiff-rb/ext/xdiff/extconf.rb delete mode 100644 gems/xdiff-rb/ext/xdiff/extension.cc delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff.tar.gz delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/AUTHORS delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/CMakeLists.txt delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/COPYING delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/ChangeLog delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/README delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/config.h.in delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff-lib.html delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.3 delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.html delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.pdf delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.txt delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/test/xdiff_test.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/test/xregression.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/test/xtestutils.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/test/xtestutils.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/tools/xrabin.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xalloc.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbpatchi.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiff.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xinclude.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmacros.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmerge3.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xpatchi.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabdiff.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabply.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xtypes.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.c delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.h delete mode 100644 gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xversion.c delete mode 100644 gems/xdiff-rb/lib/xdiff.rb delete mode 100644 gems/xdiff-rb/test/xdiff_test.rb delete mode 100644 gems/xdiff-rb/xdiff.gemspec delete mode 100644 sorbet/rbi/gems/diffy@3.4.3.rbi delete mode 100644 sorbet/rbi/gems/rb-bsdiff@0.1.0.rbi delete mode 100644 sorbet/rbi/gems/xdiff@0.0.1.rbi diff --git a/.devcontainer/Dockerfile.devcontainer b/.devcontainer/Dockerfile.devcontainer index abf0cb1b..1af34197 100644 --- a/.devcontainer/Dockerfile.devcontainer +++ b/.devcontainer/Dockerfile.devcontainer @@ -1,23 +1,3 @@ -FROM ruby:3.2 AS native-gems -RUN rm -f /etc/apt/apt.conf.d/docker-clean; \ - echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache -RUN \ - --mount=type=cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,target=/var/lib/apt,sharing=locked \ - apt-get update && \ - apt-get install --no-install-recommends --no-install-suggests -y \ - cmake - -WORKDIR /usr/src/app -RUN gem install bundler -v '2.4.5' -COPY gems gems -WORKDIR /usr/src/app/gems/xdiff-rb -RUN bundle install -RUN rake compile -WORKDIR /usr/src/app/gems/rb-bsdiff -RUN bundle install -RUN rake compile - # Primary image FROM mcr.microsoft.com/devcontainers/ruby:1-3.2-bookworm @@ -75,15 +55,13 @@ RUN wget -O- https://github.com/dandavison/delta/releases/download/0.18.2/git-de RUN git config --system core.pager "delta" && \ git config --system interactive.diffFilter "delta --color-only" && \ - git config --system delta.navigate true && \ - git config --system delta.dark true && \ - git config --system delta.side-by-side true && \ + git config --system delta.navigate "true" && \ + git config --system delta.dark "true" && \ + git config --system delta.side-by-side "true" && \ git config --system merge.conflictstyle "zdiff3" && \ - git config --system core.editor "cursor --wait" - -# Install native gems -COPY --from=native-gems /usr/src/app/gems/xdiff-rb /gems/xdiff-rb -COPY --from=native-gems /usr/src/app/gems/rb-bsdiff /gems/rb-bsdiff + git config --system core.editor "cursor --wait" && \ + git config --system diff.algorithm "histogram" && \ + git config --system diff.colorMoved "default" ENV RAILS_ENV development diff --git a/.gitignore b/.gitignore index 6f5a45ec..7a224916 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,6 @@ build tmp core *.bundle -lib/xdiff -ext/xdiff/Makefile -ext/xdiff/xdiff user_scripts/dist migrated_files.txt diff --git a/Dockerfile b/Dockerfile index a6df10c0..5323eb58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,3 @@ -FROM ruby:3.2.6 AS native-gems -RUN rm -f /etc/apt/apt.conf.d/docker-clean; \ - echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache -RUN \ - --mount=type=cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,target=/var/lib/apt,sharing=locked \ - apt-get update && \ - apt-get install --no-install-recommends --no-install-suggests -y \ - cmake - -WORKDIR /usr/src/app -RUN gem install bundler -v '2.6.2' -COPY gems gems -WORKDIR /usr/src/app/gems/xdiff-rb -RUN bundle install -RUN rake compile -WORKDIR /usr/src/app/gems/rb-bsdiff -RUN bundle install -RUN rake compile - # Primary image FROM ruby:3.2.6 USER root @@ -64,9 +44,6 @@ RUN \ pdftohtml \ libreoffice -COPY --from=native-gems /usr/src/app/gems/xdiff-rb /gems/xdiff-rb -COPY --from=native-gems /usr/src/app/gems/rb-bsdiff /gems/rb-bsdiff - WORKDIR /usr/src/app COPY Gemfile Gemfile.lock ./ RUN echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config diff --git a/Gemfile b/Gemfile index 6d75be7e..ae7f95f3 100644 --- a/Gemfile +++ b/Gemfile @@ -106,12 +106,6 @@ group :test, :development do gem "spring-commands-parallel-tests" end -gem "xdiff", path: "/gems/xdiff-rb" - -# for legacy import -gem "diffy" -gem "rb-bsdiff", path: "/gems/rb-bsdiff" - gem "addressable" gem "colorize" gem "concurrent-ruby-edge", require: "concurrent-edge" diff --git a/Gemfile.lock b/Gemfile.lock index b81ef31a..ac951a6a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -24,16 +24,6 @@ GIT railties websocket-driver -PATH - remote: /gems/rb-bsdiff - specs: - rb-bsdiff (0.1.0) - -PATH - remote: /gems/xdiff-rb - specs: - xdiff (0.0.1) - GIT remote: ssh://git@git.dy.mk:2221/dymk/has_aux_table.git revision: fb7912e3536c339cba55af54c3e647f69f5997f3 @@ -178,7 +168,6 @@ GEM dhash-vips (0.2.3.0) ruby-vips (~> 2.0, != 2.1.1, != 2.1.0) diff-lcs (1.5.1) - diffy (3.4.3) discard (1.4.0) activerecord (>= 4.2, < 9.0) disco (0.5.1) @@ -693,7 +682,6 @@ DEPENDENCIES debug (~> 1.10) devise (~> 4.9) dhash-vips - diffy discard disco docx @@ -731,7 +719,6 @@ DEPENDENCIES rails-controller-testing rails_live_reload! rails_semantic_logger (~> 4.17) - rb-bsdiff! react_on_rails ripcord rouge @@ -769,7 +756,6 @@ DEPENDENCIES unicode_plot web-console webdrivers - xdiff! zstd-ruby RUBY VERSION diff --git a/gems/rb-bsdiff/Gemfile b/gems/rb-bsdiff/Gemfile deleted file mode 100644 index d2fceab5..00000000 --- a/gems/rb-bsdiff/Gemfile +++ /dev/null @@ -1,5 +0,0 @@ -source "https://rubygems.org" - -git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } - -gemspec diff --git a/gems/rb-bsdiff/Gemfile.lock b/gems/rb-bsdiff/Gemfile.lock deleted file mode 100644 index cf438db8..00000000 --- a/gems/rb-bsdiff/Gemfile.lock +++ /dev/null @@ -1,24 +0,0 @@ -PATH - remote: . - specs: - rb-bsdiff (0.1.0) - -GEM - remote: https://rubygems.org/ - specs: - minitest (5.18.0) - rake (13.0.6) - rake-compiler (1.2.1) - rake - -PLATFORMS - arm64-darwin-21 - -DEPENDENCIES - minitest - rake (>= 1.9.1) - rake-compiler (>= 0.8.3) - rb-bsdiff! - -BUNDLED WITH - 2.4.1 diff --git a/gems/rb-bsdiff/LICENSE b/gems/rb-bsdiff/LICENSE deleted file mode 100644 index a88dd58a..00000000 --- a/gems/rb-bsdiff/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012, Todd Fisher -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. All advertising materials mentioning features or use of this software - must display the following acknowledgement: - This product includes software developed by the . -4. Neither the name of the nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY ''AS IS'' AND ANY -EXPRESS 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 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. diff --git a/gems/rb-bsdiff/README b/gems/rb-bsdiff/README deleted file mode 100644 index 3c498553..00000000 --- a/gems/rb-bsdiff/README +++ /dev/null @@ -1,6 +0,0 @@ -Ruby bindings to bsdiff and bspatch - - BSDiff.diff('ext/b0', 'ext/b1', 'p0') - - # apply patch to bspatch.o as bspatch2.o - BSDiff.patch('ext/b0', 'b3', 'p0') diff --git a/gems/rb-bsdiff/Rakefile b/gems/rb-bsdiff/Rakefile deleted file mode 100644 index 16ebdce9..00000000 --- a/gems/rb-bsdiff/Rakefile +++ /dev/null @@ -1,25 +0,0 @@ -require "rake/clean" -require "rake/testtask" -require "rake/extensiontask" - -gemspec = Gem::Specification.load("rb-bsdiff.gemspec") -Rake::ExtensionTask.new do |ext| - ext.name = "bsdiff" - ext.source_pattern = "*.{c,cc,h}" - ext.ext_dir = "ext" - ext.lib_dir = "lib" - ext.gem_spec = gemspec -end -task :default => [:compile, :test] - -CLEAN.include([ - "pkg/", - "tmp/", - "ext/Makefile", - "lib/bsdiff.so", -]) - -Rake::TestTask.new(:test) do |t| - t.libs << "lib" - t.test_files = FileList["test.rb"] -end diff --git a/gems/rb-bsdiff/ext/b0 b/gems/rb-bsdiff/ext/b0 deleted file mode 100644 index d737dcc966893fab514b463f3a5482cdc951b51e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12260 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 E048T+DgXcg diff --git a/gems/rb-bsdiff/ext/bsdiff.c b/gems/rb-bsdiff/ext/bsdiff.c deleted file mode 100644 index f2deeba2..00000000 --- a/gems/rb-bsdiff/ext/bsdiff.c +++ /dev/null @@ -1,417 +0,0 @@ -/*- - * Copyright 2003-2005 Colin Percival - * All rights reserved - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted providing 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 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 THE AUTHOR 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. - */ - -#if 0 -__FBSDID("$FreeBSD: src/usr.bin/bsdiff/bsdiff/bsdiff.c,v 1.1 2005/08/06 01:59:05 cperciva Exp $"); -#endif - -#include - -#include -#include -#include -#include -#include -#include - -#include - -#define MIN(x,y) (((x)<(y)) ? (x) : (y)) - -static void split(off_t *I,off_t *V,off_t start,off_t len,off_t h) -{ - off_t i,j,k,x,tmp,jj,kk; - - if(len<16) { - for(k=start;kstart) split(I,V,start,jj-start,h); - - for(i=0;ikk) split(I,V,kk,start+len-kk,h); -} - -static void qsufsort(off_t *I,off_t *V,u_char *old,off_t oldsize) -{ - off_t buckets[256]; - off_t i,h,len; - - for(i=0;i<256;i++) buckets[i]=0; - for(i=0;i0;i--) buckets[i]=buckets[i-1]; - buckets[0]=0; - - for(i=0;iy) { - *pos=I[st]; - return x; - } else { - *pos=I[en]; - return y; - } - }; - - x=st+(en-st)/2; - if(memcmp(old+I[x],new,MIN(oldsize-I[x],newsize))<0) { - return search(I,old,oldsize,new,newsize,x,en,pos); - } else { - return search(I,old,oldsize,new,newsize,st,x,pos); - }; -} - -static void offtout(off_t x,u_char *buf) -{ - off_t y; - - if(x<0) y=-x; else y=x; - - buf[0]=y%256;y-=buf[0]; - y=y/256;buf[1]=y%256;y-=buf[1]; - y=y/256;buf[2]=y%256;y-=buf[2]; - y=y/256;buf[3]=y%256;y-=buf[3]; - y=y/256;buf[4]=y%256;y-=buf[4]; - y=y/256;buf[5]=y%256;y-=buf[5]; - y=y/256;buf[6]=y%256;y-=buf[6]; - y=y/256;buf[7]=y%256; - - if(x<0) buf[7]|=0x80; -} - -/* create a patch file from oldfile diff'ed by newfile */ -int bsdiff_files(const char *oldfile, const char *newfile, const char *patchfile) -{ - int fd; - u_char *old,*new; - off_t oldsize,newsize; - off_t *I,*V; - off_t scan,pos=0,len; - off_t lastscan,lastpos,lastoffset; - off_t oldscore,scsc; - off_t s,Sf,lenf,Sb,lenb; - off_t overlap,Ss,lens; - off_t i; - off_t dblen,eblen; - u_char *db,*eb; - u_char buf[8]; - u_char header[32]; - FILE * pf; - BZFILE * pfbz2; - int bz2err; - - /* Allocate oldsize+1 bytes instead of oldsize bytes to ensure - that we never try to malloc(0) and get a NULL pointer */ - if(((fd=open(oldfile,O_RDONLY,0))<0) || - ((oldsize=lseek(fd,0,SEEK_END))==-1) || - ((old=malloc(oldsize+1))==NULL) || - (lseek(fd,0,SEEK_SET)!=0) || - (read(fd,old,oldsize)!=oldsize) || - (close(fd)==-1)) { - rb_raise(rb_eRuntimeError, "%s",oldfile); - } - - if(((I=malloc((oldsize+1)*sizeof(off_t)))==NULL) || - ((V=malloc((oldsize+1)*sizeof(off_t)))==NULL)) rb_raise(rb_eRuntimeError, "malloc error"); - - qsufsort(I,V,old,oldsize); - - free(V); - - /* Allocate newsize+1 bytes instead of newsize bytes to ensure - that we never try to malloc(0) and get a NULL pointer */ - if(((fd=open(newfile,O_RDONLY,0))<0) || - ((newsize=lseek(fd,0,SEEK_END))==-1) || - ((new=malloc(newsize+1))==NULL) || - (lseek(fd,0,SEEK_SET)!=0) || - (read(fd,new,newsize)!=newsize) || - (close(fd)==-1)) rb_raise(rb_eRuntimeError, "%s",newfile); - - if(((db=malloc(newsize+1))==NULL) || - ((eb=malloc(newsize+1))==NULL)) rb_raise(rb_eRuntimeError,"malloc error"); - dblen=0; - eblen=0; - - /* Create the patch file */ - if ((pf = fopen(patchfile, "w")) == NULL) - rb_raise(rb_eRuntimeError, "%s", patchfile); - - /* Header is - 0 8 "BSDIFF40" - 8 8 length of bzip2ed ctrl block - 16 8 length of bzip2ed diff block - 24 8 length of new file */ - /* File is - 0 32 Header - 32 ?? Bzip2ed ctrl block - ?? ?? Bzip2ed diff block - ?? ?? Bzip2ed extra block */ - memcpy(header,"BSDIFF40",8); - offtout(0, header + 8); - offtout(0, header + 16); - offtout(newsize, header + 24); - if (fwrite(header, 32, 1, pf) != 1) - rb_raise(rb_eRuntimeError, "fwrite(%s)", patchfile); - - /* Compute the differences, writing ctrl as we go */ - if ((pfbz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)) == NULL) - rb_raise(rb_eRuntimeError, "BZ2_bzWriteOpen, bz2err = %d", bz2err); - scan=0;len=0; - lastscan=0;lastpos=0;lastoffset=0; - while(scanoldscore+8)) break; - - if((scan+lastoffsetSf*2-lenf) { Sf=s; lenf=i; }; - }; - - lenb=0; - if(scan=lastscan+i)&&(pos>=i);i++) { - if(old[pos-i]==new[scan-i]) s++; - if(s*2-i>Sb*2-lenb) { Sb=s; lenb=i; }; - }; - }; - - if(lastscan+lenf>scan-lenb) { - overlap=(lastscan+lenf)-(scan-lenb); - s=0;Ss=0;lens=0; - for(i=0;iSs) { Ss=s; lens=i+1; }; - }; - - lenf+=lens-overlap; - lenb-=lens; - }; - - for(i=0;i -#include -#include -#include -#include -#include - -#include - -static off_t offtin(u_char *buf) -{ - off_t y; - - y=buf[7]&0x7F; - y=y*256;y+=buf[6]; - y=y*256;y+=buf[5]; - y=y*256;y+=buf[4]; - y=y*256;y+=buf[3]; - y=y*256;y+=buf[2]; - y=y*256;y+=buf[1]; - y=y*256;y+=buf[0]; - - if(buf[7]&0x80) y=-y; - - return y; -} - -int bspatch_files(const char *oldfile, const char *newfile, const char *patchfile) -{ - FILE * f, * cpf, * dpf, * epf; - BZFILE * cpfbz2, * dpfbz2, * epfbz2; - int cbz2err, dbz2err, ebz2err; - int fd; - ssize_t oldsize,newsize; - ssize_t bzctrllen,bzdatalen; - u_char header[32],buf[8]; - u_char *old, *new; - off_t oldpos,newpos; - off_t ctrl[3]; - off_t lenread; - off_t i; - - /* Open patch file */ - if ((f = fopen(patchfile, "r")) == NULL) - rb_raise(rb_eRuntimeError, "fopen(%s)", patchfile); - - /* - File format: - 0 8 "BSDIFF40" - 8 8 X - 16 8 Y - 24 8 sizeof(newfile) - 32 X bzip2(control block) - 32+X Y bzip2(diff block) - 32+X+Y ??? bzip2(extra block) - with control block a set of triples (x,y,z) meaning "add x bytes - from oldfile to x bytes from the diff block; copy y bytes from the - extra block; seek forwards in oldfile by z bytes". - */ - - /* Read header */ - if (fread(header, 1, 32, f) < 32) { - if (feof(f)) - rb_raise(rb_eRuntimeError,"Corrupt patch\n"); - rb_raise(rb_eRuntimeError, "fread(%s)", patchfile); - } - - /* Check for appropriate magic */ - if (memcmp(header, "BSDIFF40", 8) != 0) - rb_raise(rb_eRuntimeError, "Corrupt patch\n"); - - /* Read lengths from header */ - bzctrllen=offtin(header+8); - bzdatalen=offtin(header+16); - newsize=offtin(header+24); - if((bzctrllen<0) || (bzdatalen<0) || (newsize<0)) - rb_raise(rb_eRuntimeError,"Corrupt patch\n"); - - /* Close patch file and re-open it via libbzip2 at the right places */ - if (fclose(f)) - rb_raise(rb_eRuntimeError, "fclose(%s)", patchfile); - if ((cpf = fopen(patchfile, "r")) == NULL) - rb_raise(rb_eRuntimeError, "fopen(%s)", patchfile); - if (fseeko(cpf, 32, SEEK_SET)) - rb_raise(rb_eRuntimeError, "fseeko(%s, %lld)", patchfile, - (long long)32); - if ((cpfbz2 = BZ2_bzReadOpen(&cbz2err, cpf, 0, 0, NULL, 0)) == NULL) - rb_raise(rb_eRuntimeError, "BZ2_bzReadOpen, bz2err = %d", cbz2err); - if ((dpf = fopen(patchfile, "r")) == NULL) - rb_raise(rb_eRuntimeError, "fopen(%s)", patchfile); - if (fseeko(dpf, 32 + bzctrllen, SEEK_SET)) - rb_raise(rb_eRuntimeError, "fseeko(%s, %lld)", patchfile, - (long long)(32 + bzctrllen)); - if ((dpfbz2 = BZ2_bzReadOpen(&dbz2err, dpf, 0, 0, NULL, 0)) == NULL) - rb_raise(rb_eRuntimeError, "BZ2_bzReadOpen, bz2err = %d", dbz2err); - if ((epf = fopen(patchfile, "r")) == NULL) - rb_raise(rb_eRuntimeError, "fopen(%s)", patchfile); - if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET)) - rb_raise(rb_eRuntimeError, "fseeko(%s, %lld)", patchfile, - (long long)(32 + bzctrllen + bzdatalen)); - if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL) - rb_raise(rb_eRuntimeError, "BZ2_bzReadOpen, bz2err = %d", ebz2err); - - if(((fd=open(oldfile,O_RDONLY,0))<0) || - ((oldsize=lseek(fd,0,SEEK_END))==-1) || - ((old=malloc(oldsize+1))==NULL) || - (lseek(fd,0,SEEK_SET)!=0) || - (read(fd,old,oldsize)!=oldsize) || - (close(fd)==-1)) rb_raise(rb_eRuntimeError,"%s",oldfile); - if((new=malloc(newsize+1))==NULL) rb_raise(rb_eRuntimeError,"malloc"); - - oldpos=0;newpos=0; - while(newposnewsize) - rb_raise(rb_eRuntimeError,"Corrupt patch\n"); - - /* Read diff string */ - lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]); - if ((lenread < ctrl[0]) || - ((dbz2err != BZ_OK) && (dbz2err != BZ_STREAM_END))) - rb_raise(rb_eRuntimeError, "Corrupt patch\n"); - - /* Add old data to diff string */ - for(i=0;i=0) && (oldpos+inewsize) - rb_raise(rb_eRuntimeError,"Corrupt patch\n"); - - /* Read extra string */ - lenread = BZ2_bzRead(&ebz2err, epfbz2, new + newpos, ctrl[1]); - if ((lenread < ctrl[1]) || - ((ebz2err != BZ_OK) && (ebz2err != BZ_STREAM_END))) - rb_raise(rb_eRuntimeError, "Corrupt patch\n"); - - /* Adjust pointers */ - newpos+=ctrl[1]; - oldpos+=ctrl[2]; - }; - - /* Clean up the bzip2 reads */ - BZ2_bzReadClose(&cbz2err, cpfbz2); - BZ2_bzReadClose(&dbz2err, dpfbz2); - BZ2_bzReadClose(&ebz2err, epfbz2); - if (fclose(cpf) || fclose(dpf) || fclose(epf)) - rb_raise(rb_eRuntimeError, "fclose(%s)", patchfile); - - /* Write the new file */ - if(((fd=open(newfile,O_CREAT|O_TRUNC|O_WRONLY,0666))<0) || - (write(fd,new,newsize)!=newsize) || (close(fd)==-1)) - rb_raise(rb_eRuntimeError,"%s",newfile); - - free(new); - free(old); - - return 0; -} diff --git a/gems/rb-bsdiff/ext/bspatch.h b/gems/rb-bsdiff/ext/bspatch.h deleted file mode 100644 index d47fcee7..00000000 --- a/gems/rb-bsdiff/ext/bspatch.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef BS_PATCH_H -#define BS_PATCH_H - -int bspatch_files(const char *oldfile, const char *newfile, const char *patchfile); - -#endif diff --git a/gems/rb-bsdiff/ext/extconf.rb b/gems/rb-bsdiff/ext/extconf.rb deleted file mode 100644 index 4417e528..00000000 --- a/gems/rb-bsdiff/ext/extconf.rb +++ /dev/null @@ -1,10 +0,0 @@ -require "mkmf" - -dir_config("bsdiff") -fail unless have_header("unistd.h") -fail unless have_header("bzlib.h") -fail unless have_library("bz2") -fail unless have_func("BZ2_bzWrite", "bzlib.h") -fail unless have_macro("BZ_OK", "bzlib.h") -create_header("bsdiff_config.h") -create_makefile("bsdiff") diff --git a/gems/rb-bsdiff/ext/rb_bsdiff.c b/gems/rb-bsdiff/ext/rb_bsdiff.c deleted file mode 100644 index d6408331..00000000 --- a/gems/rb-bsdiff/ext/rb_bsdiff.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include "bsdiff.h" -#include "bspatch.h" - -VALUE BSDiff; - -static VALUE bsdiff_diff(VALUE mod, VALUE oldfile, VALUE newfile, VALUE patchfile) -{ - if( bsdiff_files(StringValuePtr(oldfile), StringValuePtr(newfile), StringValuePtr(patchfile)) ) { - return Qfalse; - } - return Qtrue; -} - -static VALUE bsdiff_patch(VALUE mod, VALUE oldfile, VALUE newfile, VALUE patchfile) -{ - if( bspatch_files(StringValuePtr(oldfile), StringValuePtr(newfile), StringValuePtr(patchfile)) ) { - return Qfalse; - } - return Qtrue; -} - -/* main entry point */ -void Init_bsdiff() -{ - BSDiff = rb_define_module("BSDiff"); - - rb_define_singleton_method(BSDiff, "diff", bsdiff_diff, 3); - rb_define_singleton_method(BSDiff, "patch", bsdiff_patch, 3); -} diff --git a/gems/rb-bsdiff/rb-bsdiff.gemspec b/gems/rb-bsdiff/rb-bsdiff.gemspec deleted file mode 100644 index 92012cf1..00000000 --- a/gems/rb-bsdiff/rb-bsdiff.gemspec +++ /dev/null @@ -1,33 +0,0 @@ -# -*- encoding: utf-8 -*- - -Gem::Specification.new do |s| - s.name = %q{rb-bsdiff} - s.version = "0.1.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.authors = ["Todd Fisher"] - s.date = %q{2009-07-19} - s.description = %q{Ruby bindings to bindary diff tools bsdiff and bspatch} - s.email = %q{todd.fisher@gmail.com} - s.extensions = ["ext/extconf.rb"] - s.files = [ - "README", "Rakefile", "rb-bsdiff.gemspec", "test.rb", "ext/b0", - "ext/b1", "ext/bsdiff.c", "ext/bsdiff.h", "ext/bspatch.c", - "ext/bspatch.h", "ext/extconf.rb", "ext/rb_bsdiff.c", - ] - s.homepage = %q{http://github.com/taf2/rb-bsdiff} - s.rdoc_options = ["--inline-source", "--charset=UTF-8"] - s.require_paths = ["lib"] - s.rubyforge_project = %q{rb-bsdiff} - s.rubygems_version = %q{1.3.0} - s.summary = %q{Ruby bindings to bindary diff tools bsdiff and bspatch} - - if s.respond_to? :specification_version - current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION - s.specification_version = 2 - end - - s.add_development_dependency "rake", ">= 1.9.1" - s.add_development_dependency "rake-compiler", ">= 0.8.3" - s.add_development_dependency "minitest" -end diff --git a/gems/rb-bsdiff/test.rb b/gems/rb-bsdiff/test.rb deleted file mode 100644 index f7754b4b..00000000 --- a/gems/rb-bsdiff/test.rb +++ /dev/null @@ -1,34 +0,0 @@ -require "openssl" -require "test/unit" -require "bsdiff" - -class TestPatch < Test::Unit::TestCase - def setup - File.unlink("b3") if File.exist?("b3") - File.unlink("p0") if File.exist?("p0") - end - - def teardown - File.unlink("b3") if File.exist?("b3") - File.unlink("p0") if File.exist?("p0") - end - - def test_diff_and_patch - #../bsdiff b0 b1 p0 - #../bspatch b0 b3 p0 - - b0_chk = OpenSSL::Digest::MD5.hexdigest(File.read("ext/b0")) - b1_chk = OpenSSL::Digest::MD5.hexdigest(File.read("ext/b1")) - - # create patch file from bspatch.o to bsdiff.o - BSDiff.diff("ext/b0", "ext/b1", "p0") - - # apply patch to bspatch.o as bspatch2.o - BSDiff.patch("ext/b0", "b3", "p0") - - b3_chk = OpenSSL::Digest::MD5.hexdigest(File.read("b3")) - - # bspatch2.o should equal bsdiff.o - assert_equal(b1_chk, b3_chk) - end -end diff --git a/gems/xdiff-rb/Gemfile b/gems/xdiff-rb/Gemfile deleted file mode 100644 index 5f8acc7e..00000000 --- a/gems/xdiff-rb/Gemfile +++ /dev/null @@ -1,5 +0,0 @@ -source "https://rubygems.org" - -git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } - -gemspec \ No newline at end of file diff --git a/gems/xdiff-rb/Gemfile.lock b/gems/xdiff-rb/Gemfile.lock deleted file mode 100644 index 45c0f021..00000000 --- a/gems/xdiff-rb/Gemfile.lock +++ /dev/null @@ -1,26 +0,0 @@ -PATH - remote: . - specs: - xdiff (0.0.1) - -GEM - remote: https://rubygems.org/ - specs: - minitest (5.17.0) - rake (13.0.6) - rake-compiler (1.2.1) - rake - -PLATFORMS - aarch64-linux - arm64-darwin-22 - x86_64-linux - -DEPENDENCIES - minitest - rake (>= 1.9.1) - rake-compiler (>= 0.8.3) - xdiff! - -BUNDLED WITH - 2.4.5 diff --git a/gems/xdiff-rb/Rakefile b/gems/xdiff-rb/Rakefile deleted file mode 100644 index fdd090c5..00000000 --- a/gems/xdiff-rb/Rakefile +++ /dev/null @@ -1,34 +0,0 @@ -require "bundler/gem_tasks" -require "rake/testtask" -require "rake/extensiontask" -require "rake/clean" - -Rake::TestTask.new(:test) do |t| - t.libs << "test" - t.libs << "lib" - t.test_files = FileList["test/**/*_test.rb"] -end - -gemspec = Gem::Specification.load("xdiff.gemspec") -Rake::ExtensionTask.new do |ext| - ext.name = "extension" - ext.source_pattern = "*.{c,cc,h}" - ext.ext_dir = "ext/xdiff" - ext.lib_dir = "lib/xdiff" - ext.gem_spec = gemspec -end - -task :benchmark_patch do - require "xdiff" - XDiff::Native.patch(nil, nil) -end - -task :default => [:compile, :test] -CLEAN.include([ - "pkg/", - "tmp/", - "ext/xdiff/xdiff", - "ext/xdiff/xdiff_build", - "ext/xdiff/Makefile", - "lib/xdiff/*.so", -]) diff --git a/gems/xdiff-rb/ext/xdiff/extconf.rb b/gems/xdiff-rb/ext/xdiff/extconf.rb deleted file mode 100644 index 8160a0e3..00000000 --- a/gems/xdiff-rb/ext/xdiff/extconf.rb +++ /dev/null @@ -1,55 +0,0 @@ -# typed: false -require "mkmf" -require "timeout" - -BASE_DIR = File.absolute_path(File.dirname(__FILE__)) - -# append_cppflags "-std=c++17 -O3" -# append_cppflags "-I#{BASE_DIR}/xdiff/xdiff" -$CXXFLAGS += " -std=c++17 -O3 " -$CXXFLAGS += " -I#{BASE_DIR}/xdiff/xdiff " - -abort "ERROR: cmake is required." if !find_executable("cmake") - -abort "ERROR: make is required." if !find_executable("make") - -def sys(cmd) - puts "(#{Dir.pwd}) -- #{cmd}" - unless ret = xsystem(cmd) - raise "ERROR: '#{cmd}' failed" - end - ret -end - -# helper to invoke cmake -def run_cmake(timeout, args) - # Set to process group so we can kill it and its children - pgroup = Gem.win_platform? ? :new_pgroup : :pgroup - pid = Process.spawn("cmake #{args}", pgroup => true) - - Timeout.timeout(timeout) { Process.waitpid(pid) } -rescue Timeout::Error - # Kill it, #detach is essentially a background wait, since we don't actually - # care about waiting for it now - Process.kill(-9, pid) - Process.detach(pid) - raise StandardError.new("cmake has exceeded its timeout of #{timeout}s") -end - -Dir.chdir("#{BASE_DIR}") do - sys("tar -xzf xdiff.tar.gz") unless Dir.exist?("xdiff") - Dir.mkdir("xdiff_build") unless Dir.exist?("xdiff_build") - Dir.chdir("xdiff_build") do - run_cmake( - 30, - "#{BASE_DIR}/xdiff -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=C++17" - ) - sys("make") - end -end - -$srcs = ["extension.cc"] -append_ldflags "-L#{BASE_DIR}/xdiff_build" -append_ldflags "-lxdiff" - -create_makefile "xdiff/extension" diff --git a/gems/xdiff-rb/ext/xdiff/extension.cc b/gems/xdiff-rb/ext/xdiff/extension.cc deleted file mode 100644 index 98d5d253..00000000 --- a/gems/xdiff-rb/ext/xdiff/extension.cc +++ /dev/null @@ -1,188 +0,0 @@ -#include "ruby/ruby.h" -#include "xdiff.h" - -#include -#include - -namespace { -class scope_guard { -public: - template - scope_guard(Callable && undo_func) try : f(std::forward(undo_func)) { - } catch(...) { - undo_func(); - throw; - } - - scope_guard(scope_guard && other) : f(std::move(other.f)) { - other.f = nullptr; - } - - ~scope_guard() { - if(f) f(); // must not throw - } - - void dismiss() noexcept { - f = nullptr; - } - - scope_guard(const scope_guard&) = delete; - void operator = (const scope_guard&) = delete; - -private: - std::function f; -}; - - -void* wrap_malloc(void* priv, unsigned int size) { - return malloc(size); -} - -void wrap_free(void* priv, void* ptr) { - free(ptr); -} - -void* wrap_realloc(void* priv, void* ptr, unsigned int size) { - return realloc(ptr, size); -} - -bool initialized = false; -VALUE init(VALUE self) { - if (initialized) { - return Qnil; - } - initialized = true; - memallocator_t malt; - malt.priv = NULL; - malt.malloc = wrap_malloc; - malt.free = wrap_free; - malt.realloc = wrap_realloc; - xdl_set_allocator(&malt); - return Qnil; -} - -struct DiffWriter { - std::string accum; - - static int write(void* writer_, mmbuffer_t* bufs, int bufsize) { - assert(bufsize > 0); - DiffWriter* writer = reinterpret_cast(writer_); - - for (auto i = 0; i < bufsize; i++) { - writer->accumulate_buf(bufs[i].ptr, bufs[i].size); - } - - return 0; - } - - void accumulate_buf(const char* str, size_t len) { - accum.append(str, len); - } -}; - -std::string get_diff( - char* base, - size_t base_len, - char* against, - size_t against_len - ) { - mmbuffer_t base_mm; - base_mm.ptr = base; - base_mm.size = base_len; - - mmbuffer_t against_mm; - against_mm.ptr = against; - against_mm.size = against_len; - - bdiffparam_t bdp; - bdp.bsize = 16; - - DiffWriter writer; - xdemitcb_t ecb; - ecb.priv = &writer; - ecb.outf = DiffWriter::write; - - int err = xdl_bdiff_mb(&base_mm, &against_mm, &bdp, &ecb); - if (err < 0) { - return std::string("(error)"); - } - - return std::move(writer.accum); -} - - -std::string get_patched( - char *base, - size_t base_len, - char *patch, - size_t patch_len - ) { - mmfile_t base_mm; - mmfile_t patch_mm; - - int ret; - if ((ret = xdl_init_mmfile(&base_mm, base_len, XDL_MMF_ATOMIC))) { - return "(xdl_init_mmfile error - base)"; - } - - auto free_base_guard = scope_guard([&] { xdl_free_mmfile(&base_mm); }); - - if ((ret = xdl_init_mmfile(&patch_mm, patch_len, XDL_MMF_ATOMIC))) { - return "(xdl_init_mmfile error - patch)"; - } - - auto free_patch_guard = scope_guard([&] { xdl_free_mmfile(&patch_mm); }); - - if (xdl_write_mmfile(&base_mm, base, base_len) != base_len) { - return "(xdl_write_mmfile error - base)"; - } - if (xdl_write_mmfile(&patch_mm, patch, patch_len) != patch_len) { - return "(xdl_write_mmfile error - patch)"; - } - - DiffWriter writer; - xdemitcb_t ecb; - ecb.priv = &writer; - ecb.outf = DiffWriter::write; - - auto err = xdl_bpatch(&base_mm, &patch_mm, &ecb); - if (err != 0) { - return "(xdl_bpatch error)"; - } - - return std::move(writer.accum); -} -VALUE diff(VALUE self, VALUE base, VALUE against) { - std::string patch = get_diff( - StringValuePtr(base), - RSTRING_LEN(base), - StringValuePtr(against), - RSTRING_LEN(against) - ); - - return rb_str_new(patch.c_str(), patch.size()); -} - -VALUE patch(VALUE self, VALUE base, VALUE patch) { - std::string patched = get_patched( - StringValuePtr(base), - RSTRING_LEN(base), - StringValuePtr(patch), - RSTRING_LEN(patch) - ); - - return rb_str_new(patched.c_str(), patched.size()); -} -} - -extern "C" void Init_extension(void) { -#ifdef RB_EXT_RACTOR_SAFE - rb_ext_ractor_safe(true); -#endif - - VALUE XDiff = rb_define_module("XDiff"); - VALUE Native = rb_define_class_under(XDiff, "Native", rb_cObject); - rb_define_singleton_method(Native, "patch", patch, 2); - rb_define_singleton_method(Native, "diff", diff, 2); - rb_define_singleton_method(Native, "init", init, 0); -} \ No newline at end of file diff --git a/gems/xdiff-rb/ext/xdiff/xdiff.tar.gz b/gems/xdiff-rb/ext/xdiff/xdiff.tar.gz deleted file mode 100644 index 66db5217c122b56e490fa605f87d16a1879fe72c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88964 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 z%0D+F1!A{{_ctN+JE)63<O)6aiBjeiyR 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

5gpU= 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 TMm_JY`&a*jb=MV!09FP7xqyZW diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/AUTHORS b/gems/xdiff-rb/ext/xdiff/xdiff/AUTHORS deleted file mode 100644 index 32e63cbc..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/AUTHORS +++ /dev/null @@ -1,2 +0,0 @@ -Davide Libenzi - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/CMakeLists.txt b/gems/xdiff-rb/ext/xdiff/xdiff/CMakeLists.txt deleted file mode 100644 index e87070e6..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/CMakeLists.txt +++ /dev/null @@ -1,122 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 3.2) - -# Project definition - -PROJECT(LibXDiff) - -# Package name and version - -SET(PACKAGE_NAME xdiff) - -SET(PACKAGE_MAJOR_VERSION 0) -SET(PACKAGE_VERSION "${PACKAGE_MAJOR_VERSION}.23") - -# Some options to customise the build - -OPTION(ENABLE_TESTS "Enable the tests to be built" OFF) -OPTION(ENABLE_TOOLS "Enable the tools to be built" OFF) - -# Check for some include files and functions - -INCLUDE(CheckIncludeFiles) -INCLUDE(CheckFunctionExists) - -CHECK_INCLUDE_FILES(limits.h HAVE_LIMITS_H) -CHECK_FUNCTION_EXISTS(memchr HAVE_MEMCHR) -CHECK_FUNCTION_EXISTS(memcmp HAVE_MEMCMP) -CHECK_FUNCTION_EXISTS(memcpy HAVE_MEMCPY) -CHECK_FUNCTION_EXISTS(memset HAVE_MEMSET) -CHECK_INCLUDE_FILES(stdio.h HAVE_STDIO_H) -CHECK_INCLUDE_FILES(stdlib.h HAVE_STDLIB_H) -CHECK_INCLUDE_FILES(string.h HAVE_STRING_H) -CHECK_FUNCTION_EXISTS(strlen HAVE_STRLEN) -CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H) - -# Configure LibXDiff - -CONFIGURE_FILE(config.h.in config.h) - -ADD_DEFINITIONS(-DHAVE_CONFIG_H) - -INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) - -# Build LibXDiff - -IF(WIN32) - ADD_DEFINITIONS(-DLIBXDIFF_DLL_EXPORT) -ENDIF() - -ADD_LIBRARY(${PACKAGE_NAME} STATIC - xdiff/xadler32.c - xdiff/xalloc.c - xdiff/xbdiff.c - xdiff/xbpatchi.c - xdiff/xdiffi.c - xdiff/xemit.c - xdiff/xmerge3.c - xdiff/xmissing.c - xdiff/xpatchi.c - xdiff/xprepare.c - xdiff/xrabdiff.c - xdiff/xrabply.c - xdiff/xutils.c - xdiff/xversion.c -) - -SET_TARGET_PROPERTIES(${PACKAGE_NAME} PROPERTIES VERSION ${PACKAGE_VERSION}) -SET_TARGET_PROPERTIES(${PACKAGE_NAME} PROPERTIES SOVERSION ${PACKAGE_MAJOR_VERSION}) - -# Install LibXDiff - -INSTALL(TARGETS ${PACKAGE_NAME} - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) - -INSTALL(FILES xdiff/xdiff.h - DESTINATION include) - -# Set the RPATH information on Linux and macOS - -IF(ENABLE_TESTS OR ENABLE_TOOLS) - IF(APPLE) - SET(CMAKE_INSTALL_RPATH "@executable_path/../lib") - ELSEIF(NOT WIN32) - SET(CMAKE_INSTALL_RPATH "$ORIGIN/../lib") - ENDIF() -ENDIF() - -# Build the tests, if requested - -IF(ENABLE_TESTS) - INCLUDE_DIRECTORIES(xdiff) - - ADD_EXECUTABLE(xdiff_test - test/xdiff_test.c - test/xtestutils.c - ) - - TARGET_LINK_LIBRARIES(xdiff_test ${PACKAGE_NAME}) - - ADD_EXECUTABLE(xregression - test/xregression.c - test/xtestutils.c - ) - - TARGET_LINK_LIBRARIES(xregression ${PACKAGE_NAME}) - - INSTALL(TARGETS xregression - RUNTIME DESTINATION bin) -ENDIF() - -# Build the tools, if requested - -IF(ENABLE_TOOLS) - ADD_EXECUTABLE(xrabin - tools/xrabin.c - ) - - INSTALL(TARGETS xrabin - RUNTIME DESTINATION bin) -ENDIF() diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/COPYING b/gems/xdiff-rb/ext/xdiff/xdiff/COPYING deleted file mode 100644 index 0d3dec19..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/COPYING +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/ChangeLog b/gems/xdiff-rb/ext/xdiff/xdiff/ChangeLog deleted file mode 100644 index a46dafb0..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/ChangeLog +++ /dev/null @@ -1,5 +0,0 @@ - -* Sun, Mar 26 2006 - Davide Libenzi - - Fixed the missing end of line problem for text diff and patch. - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/README b/gems/xdiff-rb/ext/xdiff/xdiff/README deleted file mode 100644 index 07e92925..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/README +++ /dev/null @@ -1,34 +0,0 @@ -LibXDiff 0.23 (http://www.xmailserver.org/xdiff-lib.html) - -The LibXDiff library implements basic and yet complete functionalities to create -file differences/patches to both binary and text files. The library uses memory -files as file abstraction to achieve both performance and portability. For -binary files, LibXDiff implements both (with some modification) the algorithm -described in File System Support for Delta Compression by Joshua P. MacDonald, -and the algorithm described in Fingerprinting By Random Polynomials by Michael -O. Rabin. While for text files it follows directives described in An O(ND) -Difference Algorithm and Its Variations by Eugene W. Myers. Memory files used by -the library are basically a collection of buffers that store the file content. -There are two different requirements for memory files when passed to diff/patch -functions. Text files for diff/patch functions require that a single line do not -have to spawn across two different memory file blocks. Binary diff/patch -functions require memory files to be compact. A compact memory files is a file -whose content is stored inside a single block. Functionalities inside the -library are available to satisfy these rules. Using the XDL_MMF_ATOMIC memory -file flag it is possible to make writes to not split the written record across -different blocks, while the functions xdl_mmfile_iscompact() , -xdl_mmfile_compact() and xdl_mmfile_writeallocate() are usefull to test if the -file is compact and to create a compacted version of the file itself. The text -file differential output uses the raw unified output format, by omitting the -file header since the result is always relative to a single compare operation -(between two files). The output format of the binary patch file is proprietary -(and binary) and it is basically a collection of copy and insert commands, like -described inside the MacDonald paper. The library is compatible with almost -every Unix implementation (configure script) and it is also compatible with -Windows through custom (nmake) make files. Examples are available inside the -test subdirectory of the distribution tarball that show how to use the library. -Also, inside the same subdirectory, a regression test in available that tests -the library with random data by requiring a diff followed by a patch and -comparing results. Regression tests ran successfully for days on my Linux, -Solaris, FreeBSD and Windows boxes, and this makes me believe that the library -itself is completely ready for production (despite the version number). diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/config.h.in b/gems/xdiff-rb/ext/xdiff/xdiff/config.h.in deleted file mode 100644 index e06e1346..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/config.h.in +++ /dev/null @@ -1,34 +0,0 @@ -/* config.h.in. Generated from configure.in by autoheader. */ - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_LIMITS_H 1 - -/* Define to 1 if you have the `memchr' function. */ -#cmakedefine HAVE_MEMCHR 1 - -/* Define to 1 if you have the `memcmp' function. */ -#cmakedefine HAVE_MEMCMP 1 - -/* Define to 1 if you have the `memcpy' function. */ -#cmakedefine HAVE_MEMCPY 1 - -/* Define to 1 if you have the `memset' function. */ -#cmakedefine HAVE_MEMSET 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDIO_H 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRING_H 1 - -/* Define to 1 if you have the `strlen' function. */ -#cmakedefine HAVE_STRLEN 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UNISTD_H 1 - -/* Define to the version of this package. */ -#cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff-lib.html b/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff-lib.html deleted file mode 100644 index df7d2267..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff-lib.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - LibXDiff Home Page - - -

LibXDiff
-

-

 
-The LibXDiff library implements basic and yet complete -functionalities to create file differences/patches to both binary and -text files. The library uses memory files as file abstraction to -achieve -both performance and portability. For binary files, LibXDiff -implements both (with some modification) the algorithm described in File -System Support for Delta Compression by Joshua P. MacDonald, -and the algorithm described in Fingerprinting -By Random Polynomials by Michael -O. Rabin. While for text files it follows directives described -in An O(ND) -Difference Algorithm and Its Variations by Eugene W. Myers. -Memory files used by the library are basically a collection of buffers -that store the file content. There are two different requirements for -memory files when passed to diff/patch functions. Text files for -diff/patch functions require that a single line do not have to spawn -across two different memory file blocks. Binary diff/patch functions -require memory files to be compact. A compact memory files is a file -whose content is stored inside a single block. Functionalities inside -the library are available to satisfy these rules. Using the XDL_MMF_ATOMIC -memory file flag it is possible to make writes to not split the written -record across different blocks, while the functions xdl_mmfile_iscompact() -, xdl_mmfile_compact() and xdl_mmfile_writeallocate() -are usefull to test if the file is compact and to create a compacted -version of the file itself. The text file differential output uses the -raw unified output format, by omitting the file header since the result -is always relative to a single compare operation (between two files). -The output format of the binary patch file is proprietary (and binary) -and it is basically a collection of copy and insert commands, like -described inside the MacDonald paper. The library is compatible with -almost every Unix implementation (configure script) and it is also -compatible with Windows through custom (nmake) make files. Examples are -available inside the test -subdirectory of the distribution tarball that show how to use the -library. Also, inside the same subdirectory, a regression test in -available that tests the library with random data by requiring a diff -followed by a patch and comparing results. Regression tests ran -successfully for days on my Linux, Solaris, FreeBSD and Windows boxes, -and this makes me believe that the library itself is completely ready -for production (despite the version number).
-

-


-

-

Documentation
-

-
-

License -and Software

-

LibXDiff  -is made available through the GNU LGPL license -together with the complete sources. Please read carefully the license before -using -the software. The latest library package is available here :

-

Version -0.23

-


-

-

Links And Docs
-

- - - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.3 b/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.3 deleted file mode 100644 index ca0ebbd7..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.3 +++ /dev/null @@ -1,871 +0,0 @@ -.\" -.\" LibXDiff by Davide Libenzi ( File Differential Library ) -.\" Copyright (C) 2003 Davide Libenzi -.\" -.\" This library is free software; you can redistribute it and/or -.\" modify it under the terms of the GNU Lesser General Public -.\" License as published by the Free Software Foundation; either -.\" version 2.1 of the License, or (at your option) any later version. -.\" -.\" This library is distributed in the hope that it will be useful, -.\" but WITHOUT ANY WARRANTY; without even the implied warranty of -.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -.\" Lesser General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program; if not, write to the Free Software -.\" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -.\" -.\" Davide Libenzi -.\" -.na -.TH LibXDiff 3 "0.23" "GNU" "File Differential Library" -.SH NAME - -xdl_set_allocator, xdl_malloc, xdl_free, xdl_realloc, xdl_init_mmfile, xdl_free_mmfile, -xdl_mmfile_iscompact, xdl_seek_mmfile, xdl_read_mmfile, xdl_write_mmfile, xdl_writem_mmfile, -xdl_mmfile_writeallocate, xdl_mmfile_ptradd, xdl_mmfile_first, xdl_mmfile_next, xdl_mmfile_size, xdl_mmfile_cmp, -xdl_mmfile_compact, xdl_diff, xdl_patch, xdl_merge3, xdl_bdiff_mb, xdl_bdiff, xdl_rabdiff_mb, xdl_rabdiff, -xdl_bdiff_tgsize, xdl_bpatch \- File Differential Library support functions - -.SH SYNOPSIS -.nf -.B #include -.sp -.BI "int xdl_set_allocator(memallocator_t const *" malt ");" -.nl -.BI "void *xdl_malloc(unsigned int " size ");" -.nl -.BI "void xdl_free(void *" ptr ");" -.nl -.BI "void *xdl_realloc(void *" ptr ", unsigned int " nsize ");" -.nl -.BI "int xdl_init_mmfile(mmfile_t *" mmf ", long " bsize ", unsigned long " flags ");" -.nl -.BI "void xdl_free_mmfile(mmfile_t *" mmf ");" -.nl -.BI "int xdl_mmfile_iscompact(mmfile_t *" mmf ");" -.nl -.BI "int xdl_seek_mmfile(mmfile_t *" mmf ", long " off ");" -.nl -.BI "long xdl_read_mmfile(mmfile_t *" mmf ", void *" data ", long " size ");" -.nl -.BI "long xdl_write_mmfile(mmfile_t *" mmf ", void const *" data ", long " size ");" -.nl -.BI "long xdl_writem_mmfile(mmfile_t *" mmf ", mmbuffer_t *" mb ", int " nbuf ");" -.nl -.BI "void *xdl_mmfile_writeallocate(mmfile_t *" mmf ", long " size ");" -.nl -.BI "long xdl_mmfile_ptradd(mmfile_t *" mmf ", char *" ptr ", long " size ", unsigned long " flags ");" -.nl -.BI "void *xdl_mmfile_first(mmfile_t *" mmf ", long *" size ");" -.nl -.BI "void *xdl_mmfile_next(mmfile_t *" mmf ", long *" size ");" -.nl -.BI "long xdl_mmfile_size(mmfile_t *" mmf ");" -.nl -.BI "int xdl_mmfile_cmp(mmfile_t *" mmf1 ", mmfile_t *" mmf2 ");" -.nl -.BI "int xdl_mmfile_compact(mmfile_t *" mmfo ", mmfile_t *" mmfc ", long " bsize ", unsigned long " flags ");" -.nl -.BI "int xdl_diff(mmfile_t *" mmf1 ", mmfile_t *" mmf2 ", xpparam_t const *" xpp ", xdemitconf_t const *" xecfg ", xdemitcb_t *" ecb ");" -.nl -.BI "int xdl_patch(mmfile_t *" mmf ", mmfile_t *" mmfp ", int " mode ", xdemitcb_t *" ecb ", xdemitcb_t *" rjecb ");" -.nl -.BI "int xdl_merge3(mmfile_t *" mmfo ", mmfile_t *" mmf1 ", mmfile_t *" mmf2 ", xdemitcb_t *" ecb ", xdemitcb_t *" rjecb ");" -.nl -.BI "int xdl_bdiff_mb(mmbuffer_t *" mmb1 ", mmbuffer_t *" mmb2 ", bdiffparam_t const *" bdp ", xdemitcb_t *" ecb ");" -.nl -.BI "int xdl_bdiff(mmfile_t *" mmf1 ", mmfile_t *" mmf2 ", bdiffparam_t const *" bdp ", xdemitcb_t *" ecb ");" -.nl -.BI "int xdl_rabdiff_mb(mmbuffer_t *" mmb1 ", mmbuffer_t *" mmb2 ", xdemitcb_t *" ecb ");" -.nl -.BI "int xdl_rabdiff(mmfile_t *" mmf1 ", mmfile_t *" mmf2 ", xdemitcb_t *" ecb ");" -.nl -.BI "long xdl_bdiff_tgsize(mmfile_t *" mmfp ");" -.nl -.BI "int xdl_bpatch(mmfile_t *" mmf ", mmfile_t *" mmfp ", xdemitcb_t *" ecb ");" - -.SH DESCRIPTION -The -.B LibXDiff -library implements basic and yet complete functionalities to create -file differences/patches to both binary and text files. The library -uses memory files as file abstraction to achieve both performance and -portability. For binary files, -.B LibXDiff -implements both (with some modification) the algorithm described in -.IR "File System Support for Delta Compression" " by " "Joshua P. MacDonald" , -and the method described in -.IR "Fingerprinting by Random Polynomials" " by " "Michael O. Rabin" "." -While for text files it follows directives described in -.IR "An O(ND) Difference Algorithm and Its Variations" " by " "Eugene W. Myers" . -Memory files used by the library are basically a collection of buffers -that store the file content. There are two different requirements for memory -files when passed to diff/patch functions. Text files for diff/patch functions -require that a single line do not have to spawn across two different memory -file blocks. Binary diff/patch functions require memory files to be compact. -A compact memory files is a file whose content is stored inside a single block. -Functionalities inside the library are available to satisfy these rules. -Using the -.B XDL_MMF_ATOMIC -memory file flag it is possible to make writes to not split the written -record across different blocks, while the functions -.BR xdl_mmfile_iscompact () -, -.BR xdl_mmfile_compact () -and -.BR xdl_mmfile_writeallocate () -are usefull to test if the file is compact and to create a compacted version -of the file itself. The text file differential output uses the raw unified output -format, by omitting the file header since the result is always relative to -a single compare operation (between two files). The output format of the binary -patch file is proprietary (and binary) and it is basically a collection of -copy and insert commands, like described inside the MacDonald paper. - - -.SS Functions -The following functions are defined: -.TP -.BI "int xdl_set_allocator(memallocator_t const *" malt ");" - -The -.B LibXDiff -library enable the user to set its own memory allocator, that will be used -for all the following memory requests. The allocator must be set before -to start calling the -.B LibXDiff -library with a call to -.BR xdl_set_allocator (). -The memory allocator structure contains the following members: -.nf - - typedef struct s_memallocator { - void *priv; - void *(*malloc)(void *priv, unsigned int size); - void (*free)(void *priv, void *ptr); - void *(*realloc)(void *priv, void *ptr, unsigned int nsize); - } memallocator_t; - -.fi -The -.BR malloc () -function pointer will be used by -.B LibXDiff -to request a memory block of -.I size -bytes. The -.BR free () -function pointer will be called to free a previously allocated block -.I ptr -, while the -.BR realloc () -will be used to resize the -.I ptr -to a new -.I nsize -size in bytes. The -.B priv -structure member will be passed to the -.BR malloc (), free (), realloc () -functions as first parameter. The -.B LibXDiff -user must call -.BR xdl_set_allocator () -before starting using the library, otherwise -.B LibXDiff -functions will fail due to the lack of memory allocation support. -A typical initialization sequence for -.B POSIX -systems will use the standard -.BR malloc (3), -.BR free (3), -.BR realloc (3) -and will look like: -.nf - - void *wrap_malloc(void *priv, unsigned int size) { - return malloc(size); - } - - void wrap_free(void *priv, void *ptr) { - free(ptr); - } - - void *wrap_realloc(void *priv, void *ptr, unsigned int size) { - return realloc(ptr, size); - } - - void my_init_xdiff(void) { - memallocator_t malt; - - malt.priv = NULL; - malt.malloc = wrap_malloc; - malt.free = wrap_free; - malt.realloc = wrap_realloc; - xdl_set_allocator(&malt); - } - -.fi - -.TP -.BI "void *xdl_malloc(unsigned int " size ");" - -Allocates a memory block of -.I size -bytes using the -.B LibXDiff -memory allocator. The user can specify its own allocator using the -.BR xdl_set_allocator () -function. The -.BR xdl_malloc () -return a pointer to the newly allocated block, or -.B NULL -in case of failure. - -.TP -.BI "void xdl_free(void *" ptr ");" - -Free a previously allocated memory block pointed by -.IR ptr . -The -.I ptr -block must has been allocated using either -.BR xdl_malloc () -or -.BR xdl_realloc (). - -.TP -.BI "void *xdl_realloc(void *" ptr ", unsigned int " nsize ");" - -Resizes the memory block pointed by -.I ptr -to a new size -.IR nsize . -Return the resized block if successful, or -.B NULL -in case the reallocation fails. After a successful reallocation, the old -.I ptr -block is to be considered no more valid. - -.TP -.BI "int xdl_init_mmfile(mmfile_t *" mmf ", long " bsize ", unsigned long " flags ");" - -Initialize the memory file -.I mmf -by requiring an internal block size of -.IR bsize . -The -.I flags -parameter is a combination of the following flags : -.br -.IP -.B XDL_MMF_ATOMIC -Writes on the memory file will be atomic. That is, the data will not be split -on two or more different blocks. - -Once an -.BR xdl_init_mmfile () -succeeded, a matching -.BR xdl_free_mmfile () -must be called when the user has done using the memory file, otherwise serious -memory leaks will happen. -The function return 0 if succeed or -1 if an error is encountered. - -.TP -.BI "void xdl_free_mmfile(mmfile_t *" mmf ");" - -Free all the data associated with the -.I mmf -memory file. - -.TP -.BI "int xdl_mmfile_iscompact(mmfile_t *" mmf ");" - -Returns an integer different from 0 if the -.I mmf -memory file is compact, 0 otherwise. A compact memory file is one that have -the whole content stored inside a single block. - -.TP -.BI "int xdl_seek_mmfile(mmfile_t *" mmf ", long " off ");" - -Set the current data pointer of the memory file -.I mmf -to the specified offset -.I off -from the beginning of the file itself. Returns 0 if successful or -1 if an error -happened. - -.TP -.BI "long xdl_read_mmfile(mmfile_t *" mmf ", void *" data ", long " size ");" - -Request to read -.I size -bytes from the memory file -.I mmf -by storing the data inside the -.I data -buffer. Returns the number of bytes read into the -.I data -buffer. The amount of data read can be lower than the specified -.IR size . -The function returns -1 if an error happened. - -.TP -.BI "long xdl_write_mmfile(mmfile_t *" mmf ", void const *" data ", long " size ");" - -Request to write -.I size -bytes from the specified buffer -.I data -into the memory file -.IR mmf . -If the memory file has been created using the -.B XDL_MMF_ATOMIC -flag, the write request will not be split across different blocks. -Note that all write operations done on memory files do append data at the end -the file, and writes in the middle of it are allowed. This is because the library -memory file abstraction does not need this functionality to be available. -The function returns the number of bytes written or a number lower than -.I size -if an error happened. - -.TP -.BI "long xdl_writem_mmfile(mmfile_t *" mmf ", mmbuffer_t *" mb ", int " nbuf ");" - -Request to sequentially write -.I nbuf -memory buffers passed inside the array -.I mb -into the memory file -.IR mmf . -The memory buffer structure is defined as : -.nf - - typedef struct s_mmbuffer { - char *ptr; - long size; - } mmbuffer_t; - -.fi -The -.I ptr -field is a pointer to the user data, whose size is specified inside the -.I size -structure field. The function returns the total number of bytes written -or a lower number if an error happened. - -.TP -.BI "void *xdl_mmfile_writeallocate(mmfile_t *" mmf ", long " size ");" - -The function request to allocate a write buffer of -.I size -bytes in the -.I mmf -memory file and returns the pointer to the allocated buffer. The user will -have the responsibility to store -.I size -bytes (no more, no less) inside the memory region pointed to by the returned pointer. -The files size will grow of -.I size -bytes as a consequence of this operation. The function will return -.B NULL -if an error happened. - -.TP -.BI "long xdl_mmfile_ptradd(mmfile_t *" mmf ", char *" ptr ", long " size ", unsigned long " flags ");" - -The function adds a user specified block to the end of the memory file -.IR mmf . -The block first byte is pointed to by -.I ptr -and its length is -.I size -bytes. The -.I flags -parameter can be used to specify attributes of the user memory block. Currently -supported attributes are: -.br -.IP -.B XDL_MMB_READONLY -Specify that the added memory block must be treated as read-only, and -every attempt to write on it should result in a failure of the memory file -writing functions. - -The purpose of this function is basically to avoid copying memory around, -by helping the library to not drain the CPU cache. The function returns -.I size -in case of success, or -1 in case of error. - -.TP -.BI "void *xdl_mmfile_first(mmfile_t *" mmf ", long *" size ");" - -The function is used to return the first block of the -.I mmf -memory file block chain. The -.I size -parameter will receive the size of the block, while the function will return -the pointer the the first byte of the block itself. The function returns -.B NULL -if the file is empty. - -.TP -.BI "void *xdl_mmfile_next(mmfile_t *" mmf ", long *" size ");" - -The function is used to return the next block of the -.I mmf -memory file block chain. The -.I size -parameter will receive the size of the block, while the function will return -the pointer the the first byte of the block itself. The function returns -.B NULL -if the current block is the last one of the chain. - -.TP -.BI "long xdl_mmfile_size(mmfile_t *" mmf ");" - -The function returns the size of the specified memory file -.IR mmf . - -.TP -.BI "int xdl_mmfile_cmp(mmfile_t *" mmf1 ", mmfile_t *" mmf2 ");" - -Request to compare two memory files -.IR mmf1 " and " mmf2 -and returns 0 if files are identical, or a value different from 0 if -files are different. - -.TP -.BI "int xdl_mmfile_compact(mmfile_t *" mmfo ", mmfile_t *" mmfc ", long " bsize ", unsigned long " flags ");" - -Request to create a compact version of the memory file -.I mmfo -into the (uninitialized) memory file -.IR mmfc . -The -.I bsize -parameter specify the requested block size and -.I flags -specify flags to be used to create the new -.I mmfc -memory file (see -.BR xdl_init_mmfile () -). The function returns 0 if succedded or -1 if an error happened. - -.TP -.BI "int xdl_diff(mmfile_t *" mmf1 ", mmfile_t *" mmf2 ", xpparam_t const *" xpp ", xdemitconf_t const *" xecfg ", xdemitcb_t *" ecb ");" - -Request to create the difference between the two text memory files -.IR mmf1 " and " mmf2 . -The -.I mmf1 -memory files is considered the "old" file while -.I mmf2 -is considered the "new" file. So the function will create a patch file -that once applied to -.I mmf1 -will give -.I mmf2 -as result. Files -.IR mmf1 " and " mmf2 -must be atomic from a line point of view (or, as an extreme, compact), that -means that a single test line cannot spread among different memory file blocks. -The -.I xpp -parameter is a pointer to a structure : -.nf - - typedef struct s_xpparam { - unsigned long flags; - } xpparam_t; - -.fi -that is used to specify parameters to be used by the file differential algorithm. -The -.I flags -field is a combination of the following flags : - -.IP -.B XDF_NEED_MINIMAL -Requires the minimal edit script to be found by the algorithm (may be slow). - -The -.I xecfg -parameter point to a structure : -.nf - - typedef struct s_xdemitconf { - long ctxlen; - } xdemitconf_t; - -.fi -that is used to configure the algorithm responsible of the creation the the -differential file from an edit script. The -.I ctxlen -field is used to specify the amount of context to be emitted inside the -differential file (the value 3 is suggested for normal operations). -The parameter -.I ecb -is a pointer to a structure : -.nf - - typedef struct s_xdemitcb { - void *priv; - int (*outf)(void *, mmbuffer_t *, int); - } xdemitcb_t; - -.fi -that is used by the differential file creation algorithm to emit the created -data. The -.I priv -field is an opaque pointer to a user specified data, while the -.I outf -field point to a callback function that is called internally to emit algorithm -generated data rappresenting the differential file. The first parameter of the -callback is the same -.I priv -field specified inside the -.B xdemitcb_t -structure. The second parameter point to an array of -.B mmbuffer_t -(see above for a definition of the structure) whose element count is specified -inside the last parameter of the callback itself. The callback will always be -called with entire records (lines) and never a record (line) will be emitted -using two different callback calls. This is important because if the called will -use another memory file to store the result, by creating the target memory file with -.B XDL_MMF_ATOMIC -will guarantee the "atomicity" of the memory file itself. -The function returns 0 if succeeded or -1 if an error occurred. - -.TP -.BI "int xdl_patch(mmfile_t *" mmf ", mmfile_t *" mmfp ", int " mode ", xdemitcb_t *" ecb ", xdemitcb_t *" rjecb ");" - -Request to patch the memory file -.I mmf -using the patch file stored in -.IR mmfp . -The -.I mmf -memory file -.B is not -changed during the operation and can be considered as read only. -The -.I mode -parameter can be one of the following values : -.IP -.B XDL_PATCH_NORMAL -Perform standard patching like if the patch memory file -.I mmfp -has been created using -.I mmf -as "old" file. -.IP -.B XDL_PATCH_REVERSE -Apply the reverse patch. That means that the -.I mmf -memory file has to be considered as if it was specified as "new" file during -the differential operation ( -.BR xdl_diff () -). The result of the operation will then be the file content that was used -as "old" file during the differential operation. - -The following flags can be specified (by or-ing them) to one of the above: -.IP -.B XDL_PATCH_IGNOREBSPACE -Ignore the whitespace at the beginning and the end of the line. - -The -.I ecb -will be used by the patch algorithm to create the result file while the -.I rjecb -will be used to emit all differential chunks that cannot be applied. -Like explained above, callbacks are always called with entire records to guarantee -atomicity of the resulting output. -The function returns 0 if succeeded without performing any fuzzy hunk detection, -a positive value if it secceeded with fuzzy hunk detection or -1 if an error occurred -during the patch operation. - -.TP -.BI "int xdl_merge3(mmfile_t *" mmfo ", mmfile_t *" mmf1 ", mmfile_t *" mmf2 ", xdemitcb_t *" ecb ", xdemitcb_t *" rjecb ");" - -Merges three files together. The -.I mmfo -file is the original one, while -.IR mmf1 " and " mmf2 -are two modified versions of -.IR mmfo . -The function works by creating a differential between -.IR mmfo " and " mmf2 -and by applying the resulting patch to -.IR mmf1 . -Because of this sequence, -.I mmf1 -changes will be privileged against the ones of -.IR mmf2 . -The -.I ecb -will be used by the patch algorithm to create the result file while the -.I rjecb -will be used to emit all differential chunks that cannot be applied. -Like explained above, callbacks are always called with entire records to guarantee -atomicity of the resulting output. -The function returns 0 if succeeded or -1 if an error occurred during the patch operation. - -.TP -.BI "int xdl_bdiff(mmfile_t *" mmf1 ", mmfile_t *" mmf2 ", bdiffparam_t const *" bdp ", xdemitcb_t *" ecb ");" - -Request to create the difference between the two text memory files -.IR mmf1 " and " mmf2 . -The -.I mmf1 -memory files is considered the "old" file while -.I mmf2 -is considered the "new" file. So the function will create a patch file -that once applied to -.I mmf1 -will give -.I mmf2 -as result. Files -.IR mmf1 " and " mmf2 -must be compact to make it easy and faster to perform the difference operation. -Functions are available to check for compactness ( -.BR xdl_mmfile_iscompact () -) and to make compact a non-compact file ( -.BR xdl_mmfile_compact () -). An example of how to create a compact memory file (described inside the test -subdirectory) is : -.nf - - int xdlt_load_mmfile(char const *fname, mmfile_t *mf, int binmode) { - char cc; - int fd; - long size, bsize; - char *blk; - - if (xdl_init_mmfile(mf, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) - return -1; - if ((fd = open(fname, O_RDONLY)) == -1) { - perror(fname); - xdl_free_mmfile(mf); - return -1; - } - if ((size = bsize = lseek(fd, 0, SEEK_END)) > 0 && !binmode) { - if (lseek(fd, -1, SEEK_END) != (off_t) -1 && - read(fd, &cc, 1) && cc != '\\n') - bsize++; - } - lseek(fd, 0, SEEK_SET); - if (!(blk = (char *) xdl_mmfile_writeallocate(mf, bsize))) { - xdl_free_mmfile(mf); - close(fd); - return -1; - } - if (read(fd, blk, (size_t) size) != (size_t) size) { - perror(fname); - xdl_free_mmfile(mf); - close(fd); - return -1; - } - close(fd); - if (bsize > size) - blk[size] = '\\n'; - return 0; - } - -.fi -The -.I bdp -parameter points to a structure : -.nf - - typedef struct s_bdiffparam { - long bsize; - } bdiffparam_t; - -.fi -that is used to pass information to the binary file differential algorithm. -The -.I bsize -parameter specify the size of the block that will be used to decompose -.I mmf1 -during the block classification phase of the algorithm (see MacDonald paper). -Suggested values go from 16 to 64, with a preferred power of two characteristic. -The -.I ecb -parameter is used to pass the emission callback to the algorithm responsible -of the output file creation. -The function returns 0 if succeede or -1 if an error is occurred. - -.TP -.BI "int xdl_bdiff_mb(mmbuffer_t *" mmb1 ", mmbuffer_t *" mmb2 ", bdiffparam_t const *" bdp ", xdemitcb_t *" ecb ");" - -Same as -.BR xdl_bdiff () -but it works on memory buffer directly. The -.BR xdl_bdiff () -is implemented internally with a -.BR xdl_bdiff_mb () -after having setup the two memory buffers from the passed memory files (that must be compact, -as described above). The memory buffer structure is defined as : -.nf - - typedef struct s_mmbuffer { - char *ptr; - long size; - } mmbuffer_t; - -.fi -An empty memory buffer is specified by setting the -.I ptr -member as -.B NULL -and the -.I size -member as zero. The reason of having this function is to avoid the memory file -preparation, that might involve copying memory from other sources. Using -the -.BR xdl_bdiff_mb (), -the caller can setup the two memory buffer by using, for example, -.BR mmap (2), -and hence avoiding unnecessary memory copies. The other parameters and the return value -of the function -.BR xdl_bdiff_mb () -are the same as the ones already described in -.BR xdl_bdiff (). - -.TP -.BI "int xdl_rabdiff(mmfile_t *" mmf1 ", mmfile_t *" mmf2 ", xdemitcb_t *" ecb ");" - -Request to create the difference between the two text memory files -.IR mmf1 " and " mmf2 -using the Rabin's polynomial fingerprinting algorithm. This algorithm typically -performs faster and produces smaller deltas, when compared to the XDelta-like one. -The -.I mmf1 -memory files is considered the "old" file while -.I mmf2 -is considered the "new" file. So the function will create a patch file -that once applied to -.I mmf1 -will give -.I mmf2 -as result. Files -.IR mmf1 " and " mmf2 -must be compact to make it easy and faster to perform the difference operation. -Functions are available to check for compactness ( -.BR xdl_mmfile_iscompact () -) and to make compact a non-compact file ( -.BR xdl_mmfile_compact () -). The -.I ecb -parameter is used to pass the emission callback to the algorithm responsible -of the output file creation. -The function returns 0 if succeede or -1 if an error is occurred. - -.TP -.BI "int xdl_rabdiff_mb(mmbuffer_t *" mmb1 ", mmbuffer_t *" mmb2 ", xdemitcb_t *" ecb ");" - -Same as -.BR xdl_rabdiff () -but it works on memory buffer directly. The memory buffer structure is defined as : -.nf - - typedef struct s_mmbuffer { - char *ptr; - long size; - } mmbuffer_t; - -.fi -An empty memory buffer is specified by setting the -.I ptr -member as -.B NULL -and the -.I size -member as zero. The reason of having this function is to avoid the memory file -preparation, that might involve copying memory from other sources. Using -the -.BR xdl_rabdiff_mb (), -the caller can setup the two memory buffer by using, for example, -.BR mmap (2), -and hence avoiding unnecessary memory copies. The other parameters and the return value -of the function -.BR xdl_rabdiff_mb () -are the same as the ones already described in -.BR xdl_rabdiff (). - -.TP -.BI "long xdl_bdiff_tgsize(mmfile_t *" mmfp ");" - -Given a binary memory file patch, it returns the size that the result file -will have once the patch is applied to the target file. It can be used to -pre-allocate (or write-allocate) a memory block to store the patch result -so that a compact file will be available at the end of the operation. The -function returns the requested size, or -1 if an error occurred during the operation. - -.TP -.BI "int xdl_bpatch(mmfile_t *" mmf ", mmfile_t *" mmfp ", xdemitcb_t *" ecb ");" - -Request to patch the binary memory file -.I mmf -using the binary patch file stored in -.IR mmfp . -The -.I mmf -memory file -.B is not -changed during the operation and can be considered as read only. The binary -patch algorithm has no notion of context, so the patch operation cannot be -partial (either success or failure). The -.I ecb -parameter contain the callabck (see above for description) used by the binary -patch algorithm to emit the result file. The function returns 0 if succeeded -or -1 if an error occurred during the patch operation. - -.SH SEE ALSO -Two papers drove the content of this library and these are : -.br -.IP o -.IR "File System Support for Delta Compression" " by " "Joshua P. MacDonald" -.BR http://www.xmailserver.org/xdfs.pdf -.br -.IP o -.IR "Fingerprinting by Random Polynomials" " by " "Michael O. Rabin" -.BR http://www.xmailserver.org/rabin.pdf -.br -.IP o -.IR "An O(ND) Difference Algorithm and Its Variations" " by " "Eugene W. Myers" -.BR http://www.xmailserver.org/diff2.pdf -.PP - -Also usefull information can be looked up inside the -.B diffutil -GNU package : - -.BR http://www.gnu.org/software/diffutils/diffutils.html - -.SH LICENSE -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. -A copy of the license is available at : - -.BR http://www.gnu.org/copyleft/lesser.html - -.SH AUTHOR -Developed by Davide Libenzi -.RB < davidel@xmailserver.org > - -.SH AVAILABILITY -The latest version of -.B LibXDiff -can be found at : - -.BR http://www.xmailserver.org/xdiff-lib.html - -.SH BUGS -There are no known bugs. Bug reports and comments to Davide Libenzi -.RB < davidel@xmailserver.org > - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.html b/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.html deleted file mode 100644 index 5f38f3be..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.html +++ /dev/null @@ -1,1109 +0,0 @@ - -Man page of LibXDiff - -

LibXDiff

-Section: File Differential Library (3)
Updated: 0.23
Index -Return to Main Contents
- -  -

NAME

- -

-xdl_set_allocator, xdl_malloc, xdl_free, xdl_realloc, xdl_init_mmfile, xdl_free_mmfile, -xdl_mmfile_iscompact, xdl_seek_mmfile, xdl_read_mmfile, xdl_write_mmfile, xdl_writem_mmfile, -xdl_mmfile_writeallocate, xdl_mmfile_ptradd, xdl_mmfile_first, xdl_mmfile_next, xdl_mmfile_size, xdl_mmfile_cmp, -xdl_mmfile_compact, xdl_diff, xdl_patch, xdl_merge3, xdl_bdiff_mb, xdl_bdiff, xdl_rabdiff_mb, xdl_rabdiff, -xdl_bdiff_tgsize, xdl_bpatch - File Differential Library support functions -

-  -

SYNOPSIS

- -
-#include <xdiff.h>
-
-int xdl_set_allocator(memallocator_t const *malt);
-void *xdl_malloc(unsigned int size);
-void xdl_free(void *ptr);
-void *xdl_realloc(void *ptr, unsigned int nsize);
-int xdl_init_mmfile(mmfile_t *mmf, long bsize, unsigned long flags);
-void xdl_free_mmfile(mmfile_t *mmf);
-int xdl_mmfile_iscompact(mmfile_t *mmf);
-int xdl_seek_mmfile(mmfile_t *mmf, long off);
-long xdl_read_mmfile(mmfile_t *mmf, void *data, long size);
-long xdl_write_mmfile(mmfile_t *mmf, void const *data, long size);
-long xdl_writem_mmfile(mmfile_t *mmf, mmbuffer_t *mb, int nbuf);
-void *xdl_mmfile_writeallocate(mmfile_t *mmf, long size);
-long xdl_mmfile_ptradd(mmfile_t *mmf, char *ptr, long size, unsigned long flags);
-void *xdl_mmfile_first(mmfile_t *mmf, long *size);
-void *xdl_mmfile_next(mmfile_t *mmf, long *size);
-long xdl_mmfile_size(mmfile_t *mmf);
-int xdl_mmfile_cmp(mmfile_t *mmf1, mmfile_t *mmf2);
-int xdl_mmfile_compact(mmfile_t *mmfo, mmfile_t *mmfc, long bsize, unsigned long flags);
-int xdl_diff(mmfile_t *mmf1, mmfile_t *mmf2, xpparam_t const *xpp, xdemitconf_t const *xecfg, xdemitcb_t *ecb);
-int xdl_patch(mmfile_t *mmf, mmfile_t *mmfp, int mode, xdemitcb_t *ecb, xdemitcb_t *rjecb);
-int xdl_merge3(mmfile_t *mmfo, mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb, xdemitcb_t *rjecb);
-int xdl_bdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, bdiffparam_t const *bdp, xdemitcb_t *ecb);
-int xdl_bdiff(mmfile_t *mmf1, mmfile_t *mmf2, bdiffparam_t const *bdp, xdemitcb_t *ecb);
-int xdl_rabdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, xdemitcb_t *ecb);
-int xdl_rabdiff(mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb);
-long xdl_bdiff_tgsize(mmfile_t *mmfp);
-int xdl_bpatch(mmfile_t *mmf, mmfile_t *mmfp, xdemitcb_t *ecb);
-
-
  -

DESCRIPTION

- -The -LibXDiff - -library implements basic and yet complete functionalities to create -file differences/patches to both binary and text files. The library -uses memory files as file abstraction to achieve both performance and -portability. For binary files, -LibXDiff - -implements both (with some modification) the algorithm described in -File System Support for Delta Compression by Joshua P. MacDonald, - -and the method described in -Fingerprinting by Random Polynomials by Michael O. Rabin. - -While for text files it follows directives described in -An O(ND) Difference Algorithm and Its Variations by Eugene W. Myers. - -Memory files used by the library are basically a collection of buffers -that store the file content. There are two different requirements for memory -files when passed to diff/patch functions. Text files for diff/patch functions -require that a single line do not have to spawn across two different memory -file blocks. Binary diff/patch functions require memory files to be compact. -A compact memory files is a file whose content is stored inside a single block. -Functionalities inside the library are available to satisfy these rules. -Using the -XDL_MMF_ATOMIC - -memory file flag it is possible to make writes to not split the written -record across different blocks, while the functions -xdl_mmfile_iscompact() - -, -xdl_mmfile_compact() - -and -xdl_mmfile_writeallocate() - -are usefull to test if the file is compact and to create a compacted version -of the file itself. The text file differential output uses the raw unified output -format, by omitting the file header since the result is always relative to -a single compare operation (between two files). The output format of the binary -patch file is proprietary (and binary) and it is basically a collection of -copy and insert commands, like described inside the MacDonald paper. -

-

-  -

Functions

- -The following functions are defined: -
-
int xdl_set_allocator(memallocator_t const *malt); - -
-

-The -LibXDiff - -library enable the user to set its own memory allocator, that will be used -for all the following memory requests. The allocator must be set before -to start calling the -LibXDiff - -library with a call to -xdl_set_allocator(). - -The memory allocator structure contains the following members: -

-
-        typedef struct s_memallocator {
-                void *priv;
-                void *(*malloc)(void *priv, unsigned int size);
-                void (*free)(void *priv, void *ptr);
-                void *(*realloc)(void *priv, void *ptr, unsigned int nsize);
-        } memallocator_t;
-
-
- -The -malloc() - -function pointer will be used by -LibXDiff - -to request a memory block of -size - -bytes. The -free() - -function pointer will be called to free a previously allocated block -ptr - -, while the -realloc() - -will be used to resize the -ptr - -to a new -nsize - -size in bytes. The -priv - -structure member will be passed to the -malloc(),free(),realloc() - -functions as first parameter. The -LibXDiff - -user must call -xdl_set_allocator() - -before starting using the library, otherwise -LibXDiff - -functions will fail due to the lack of memory allocation support. -A typical initialization sequence for -POSIX - -systems will use the standard -malloc(3), - -free(3), - -realloc(3) - -and will look like: -
-
-        void *wrap_malloc(void *priv, unsigned int size) {
-                return malloc(size);
-        }
-
-        void wrap_free(void *priv, void *ptr) {
-                free(ptr);
-        }
-
-        void *wrap_realloc(void *priv, void *ptr, unsigned int size) {
-                return realloc(ptr, size);
-        }
-
-        void my_init_xdiff(void) {
-                memallocator_t malt;
-
-                malt.priv = NULL;
-                malt.malloc = wrap_malloc;
-                malt.free = wrap_free;
-                malt.realloc = wrap_realloc;
-                xdl_set_allocator(&malt);
-        }
-
-
- -

-

void *xdl_malloc(unsigned int size); - -
-

-Allocates a memory block of -size - -bytes using the -LibXDiff - -memory allocator. The user can specify its own allocator using the -xdl_set_allocator() - -function. The -xdl_malloc() - -return a pointer to the newly allocated block, or -NULL - -in case of failure. -

-

void xdl_free(void *ptr); - -
-

-Free a previously allocated memory block pointed by -ptr. - -The -ptr - -block must has been allocated using either -xdl_malloc() - -or -xdl_realloc(). - -

-

void *xdl_realloc(void *ptr, unsigned int nsize); - -
-

-Resizes the memory block pointed by -ptr - -to a new size -nsize. - -Return the resized block if successful, or -NULL - -in case the reallocation fails. After a successful reallocation, the old -ptr - -block is to be considered no more valid. -

-

int xdl_init_mmfile(mmfile_t *mmf, long bsize, unsigned long flags); - -
-

-Initialize the memory file -mmf - -by requiring an internal block size of -bsize. - -The -flags - -parameter is a combination of the following flags : -
- -

-XDL_MMF_ATOMIC - -Writes on the memory file will be atomic. That is, the data will not be split -on two or more different blocks. -

-Once an -xdl_init_mmfile() - -succeeded, a matching -xdl_free_mmfile() - -must be called when the user has done using the memory file, otherwise serious -memory leaks will happen. -The function return 0 if succeed or -1 if an error is encountered. -

-

void xdl_free_mmfile(mmfile_t *mmf); - -
-

-Free all the data associated with the -mmf - -memory file. -

-

int xdl_mmfile_iscompact(mmfile_t *mmf); - -
-

-Returns an integer different from 0 if the -mmf - -memory file is compact, 0 otherwise. A compact memory file is one that have -the whole content stored inside a single block. -

-

int xdl_seek_mmfile(mmfile_t *mmf, long off); - -
-

-Set the current data pointer of the memory file -mmf - -to the specified offset -off - -from the beginning of the file itself. Returns 0 if successful or -1 if an error -happened. -

-

long xdl_read_mmfile(mmfile_t *mmf, void *data, long size); - -
-

-Request to read -size - -bytes from the memory file -mmf - -by storing the data inside the -data - -buffer. Returns the number of bytes read into the -data - -buffer. The amount of data read can be lower than the specified -size. - -The function returns -1 if an error happened. -

-

long xdl_write_mmfile(mmfile_t *mmf, void const *data, long size); - -
-

-Request to write -size - -bytes from the specified buffer -data - -into the memory file -mmf. - -If the memory file has been created using the -XDL_MMF_ATOMIC - -flag, the write request will not be split across different blocks. -Note that all write operations done on memory files do append data at the end -the file, and writes in the middle of it are allowed. This is because the library -memory file abstraction does not need this functionality to be available. -The function returns the number of bytes written or a number lower than -size - -if an error happened. -

-

long xdl_writem_mmfile(mmfile_t *mmf, mmbuffer_t *mb, int nbuf); - -
-

-Request to sequentially write -nbuf - -memory buffers passed inside the array -mb - -into the memory file -mmf. - -The memory buffer structure is defined as : -

-
-        typedef struct s_mmbuffer {
-                char *ptr;
-                long size;
-        } mmbuffer_t;
-
-
- -The -ptr - -field is a pointer to the user data, whose size is specified inside the -size - -structure field. The function returns the total number of bytes written -or a lower number if an error happened. -

-

void *xdl_mmfile_writeallocate(mmfile_t *mmf, long size); - -
-

-The function request to allocate a write buffer of -size - -bytes in the -mmf - -memory file and returns the pointer to the allocated buffer. The user will -have the responsibility to store -size - -bytes (no more, no less) inside the memory region pointed to by the returned pointer. -The files size will grow of -size - -bytes as a consequence of this operation. The function will return -NULL - -if an error happened. -

-

long xdl_mmfile_ptradd(mmfile_t *mmf, char *ptr, long size, unsigned long flags); - -
-

-The function adds a user specified block to the end of the memory file -mmf. - -The block first byte is pointed to by -ptr - -and its length is -size - -bytes. The -flags - -parameter can be used to specify attributes of the user memory block. Currently -supported attributes are: -
- -

-XDL_MMB_READONLY - -Specify that the added memory block must be treated as read-only, and -every attempt to write on it should result in a failure of the memory file -writing functions. -

-The purpose of this function is basically to avoid copying memory around, -by helping the library to not drain the CPU cache. The function returns -size - -in case of success, or -1 in case of error. -

-

void *xdl_mmfile_first(mmfile_t *mmf, long *size); - -
-

-The function is used to return the first block of the -mmf - -memory file block chain. The -size - -parameter will receive the size of the block, while the function will return -the pointer the the first byte of the block itself. The function returns -NULL - -if the file is empty. -

-

void *xdl_mmfile_next(mmfile_t *mmf, long *size); - -
-

-The function is used to return the next block of the -mmf - -memory file block chain. The -size - -parameter will receive the size of the block, while the function will return -the pointer the the first byte of the block itself. The function returns -NULL - -if the current block is the last one of the chain. -

-

long xdl_mmfile_size(mmfile_t *mmf); - -
-

-The function returns the size of the specified memory file -mmf. - -

-

int xdl_mmfile_cmp(mmfile_t *mmf1, mmfile_t *mmf2); - -
-

-Request to compare two memory files -mmf1 and mmf2 - -and returns 0 if files are identical, or a value different from 0 if -files are different. -

-

int xdl_mmfile_compact(mmfile_t *mmfo, mmfile_t *mmfc, long bsize, unsigned long flags); - -
-

-Request to create a compact version of the memory file -mmfo - -into the (uninitialized) memory file -mmfc. - -The -bsize - -parameter specify the requested block size and -flags - -specify flags to be used to create the new -mmfc - -memory file (see -xdl_init_mmfile() - -). The function returns 0 if succedded or -1 if an error happened. -

-

int xdl_diff(mmfile_t *mmf1, mmfile_t *mmf2, xpparam_t const *xpp, xdemitconf_t const *xecfg, xdemitcb_t *ecb); - -
-

-Request to create the difference between the two text memory files -mmf1 and mmf2. - -The -mmf1 - -memory files is considered the "old" file while -mmf2 - -is considered the "new" file. So the function will create a patch file -that once applied to -mmf1 - -will give -mmf2 - -as result. Files -mmf1 and mmf2 - -must be atomic from a line point of view (or, as an extreme, compact), that -means that a single test line cannot spread among different memory file blocks. -The -xpp - -parameter is a pointer to a structure : -

-
-        typedef struct s_xpparam {
-                unsigned long flags;
-        } xpparam_t;
-
-
- -that is used to specify parameters to be used by the file differential algorithm. -The -flags - -field is a combination of the following flags : -

-

-XDF_NEED_MINIMAL - -Requires the minimal edit script to be found by the algorithm (may be slow). -

-The -xecfg - -parameter point to a structure : -

-
-        typedef struct s_xdemitconf {
-                long ctxlen;
-        } xdemitconf_t;
-
-
- -that is used to configure the algorithm responsible of the creation the the -differential file from an edit script. The -ctxlen - -field is used to specify the amount of context to be emitted inside the -differential file (the value 3 is suggested for normal operations). -The parameter -ecb - -is a pointer to a structure : -
-
-        typedef struct s_xdemitcb {
-                void *priv;
-                int (*outf)(void *, mmbuffer_t *, int);
-        } xdemitcb_t;
-
-
- -that is used by the differential file creation algorithm to emit the created -data. The -priv - -field is an opaque pointer to a user specified data, while the -outf - -field point to a callback function that is called internally to emit algorithm -generated data rappresenting the differential file. The first parameter of the -callback is the same -priv - -field specified inside the -xdemitcb_t - -structure. The second parameter point to an array of -mmbuffer_t - -(see above for a definition of the structure) whose element count is specified -inside the last parameter of the callback itself. The callback will always be -called with entire records (lines) and never a record (line) will be emitted -using two different callback calls. This is important because if the called will -use another memory file to store the result, by creating the target memory file with -XDL_MMF_ATOMIC - -will guarantee the "atomicity" of the memory file itself. -The function returns 0 if succeeded or -1 if an error occurred. -

-

int xdl_patch(mmfile_t *mmf, mmfile_t *mmfp, int mode, xdemitcb_t *ecb, xdemitcb_t *rjecb); - -
-

-Request to patch the memory file -mmf - -using the patch file stored in -mmfp. - -The -mmf - -memory file -is not - -changed during the operation and can be considered as read only. -The -mode - -parameter can be one of the following values : -

-XDL_PATCH_NORMAL - -Perform standard patching like if the patch memory file -mmfp - -has been created using -mmf - -as "old" file. -
-XDL_PATCH_REVERSE - -Apply the reverse patch. That means that the -mmf - -memory file has to be considered as if it was specified as "new" file during -the differential operation ( -xdl_diff() - -). The result of the operation will then be the file content that was used -as "old" file during the differential operation. -

-The following flags can be specified (by or-ing them) to one of the above: -

-XDL_PATCH_IGNOREBSPACE - -Ignore the whitespace at the beginning and the end of the line. -

-The -ecb - -will be used by the patch algorithm to create the result file while the -rjecb - -will be used to emit all differential chunks that cannot be applied. -Like explained above, callbacks are always called with entire records to guarantee -atomicity of the resulting output. -The function returns 0 if succeeded without performing any fuzzy hunk detection, -a positive value if it secceeded with fuzzy hunk detection or -1 if an error occurred -during the patch operation. -

-

int xdl_merge3(mmfile_t *mmfo, mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb, xdemitcb_t *rjecb); - -
-

-Merges three files together. The -mmfo - -file is the original one, while -mmf1 and mmf2 - -are two modified versions of -mmfo. - -The function works by creating a differential between -mmfo and mmf2 - -and by applying the resulting patch to -mmf1. - -Because of this sequence, -mmf1 - -changes will be privileged against the ones of -mmf2. - -The -ecb - -will be used by the patch algorithm to create the result file while the -rjecb - -will be used to emit all differential chunks that cannot be applied. -Like explained above, callbacks are always called with entire records to guarantee -atomicity of the resulting output. -The function returns 0 if succeeded or -1 if an error occurred during the patch operation. -

-

int xdl_bdiff(mmfile_t *mmf1, mmfile_t *mmf2, bdiffparam_t const *bdp, xdemitcb_t *ecb); - -
-

-Request to create the difference between the two text memory files -mmf1 and mmf2. - -The -mmf1 - -memory files is considered the "old" file while -mmf2 - -is considered the "new" file. So the function will create a patch file -that once applied to -mmf1 - -will give -mmf2 - -as result. Files -mmf1 and mmf2 - -must be compact to make it easy and faster to perform the difference operation. -Functions are available to check for compactness ( -xdl_mmfile_iscompact() - -) and to make compact a non-compact file ( -xdl_mmfile_compact() - -). An example of how to create a compact memory file (described inside the test -subdirectory) is : -

-
-        int xdlt_load_mmfile(char const *fname, mmfile_t *mf, int binmode) {
-                char cc;
-                int fd;
-                long size, bsize;
-                char *blk;
-
-                if (xdl_init_mmfile(mf, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0)
-                        return -1;
-                if ((fd = open(fname, O_RDONLY)) == -1) {
-                        perror(fname);
-                        xdl_free_mmfile(mf);
-                        return -1;
-                }
-                if ((size = bsize = lseek(fd, 0, SEEK_END)) > 0 && !binmode) {
-                        if (lseek(fd, -1, SEEK_END) != (off_t) -1 &&
-                            read(fd, &cc, 1) && cc != '\n')
-                                bsize++;
-                }
-                lseek(fd, 0, SEEK_SET);
-                if (!(blk = (char *) xdl_mmfile_writeallocate(mf, bsize))) {
-                        xdl_free_mmfile(mf);
-                        close(fd);
-                        return -1;
-                }
-                if (read(fd, blk, (size_t) size) != (size_t) size) {
-                        perror(fname);
-                        xdl_free_mmfile(mf);
-                        close(fd);
-                        return -1;
-                }
-                close(fd);
-                if (bsize > size)
-                        blk[size] = '\n';
-                return 0;
-        }
-
-
- -The -bdp - -parameter points to a structure : -
-
-        typedef struct s_bdiffparam {
-                long bsize;
-        } bdiffparam_t;
-
-
- -that is used to pass information to the binary file differential algorithm. -The -bsize - -parameter specify the size of the block that will be used to decompose -mmf1 - -during the block classification phase of the algorithm (see MacDonald paper). -Suggested values go from 16 to 64, with a preferred power of two characteristic. -The -ecb - -parameter is used to pass the emission callback to the algorithm responsible -of the output file creation. -The function returns 0 if succeede or -1 if an error is occurred. -

-

int xdl_bdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, bdiffparam_t const *bdp, xdemitcb_t *ecb); - -
-

-Same as -xdl_bdiff() - -but it works on memory buffer directly. The -xdl_bdiff() - -is implemented internally with a -xdl_bdiff_mb() - -after having setup the two memory buffers from the passed memory files (that must be compact, -as described above). The memory buffer structure is defined as : -

-
-        typedef struct s_mmbuffer {
-                char *ptr;
-                long size;
-        } mmbuffer_t;
-
-
- -An empty memory buffer is specified by setting the -ptr - -member as -NULL - -and the -size - -member as zero. The reason of having this function is to avoid the memory file -preparation, that might involve copying memory from other sources. Using -the -xdl_bdiff_mb(), - -the caller can setup the two memory buffer by using, for example, -mmap(2), - -and hence avoiding unnecessary memory copies. The other parameters and the return value -of the function -xdl_bdiff_mb() - -are the same as the ones already described in -xdl_bdiff(). - -

-

int xdl_rabdiff(mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb); - -
-

-Request to create the difference between the two text memory files -mmf1 and mmf2 - -using the Rabin's polynomial fingerprinting algorithm. This algorithm typically -performs faster and produces smaller deltas, when compared to the XDelta-like one. -The -mmf1 - -memory files is considered the "old" file while -mmf2 - -is considered the "new" file. So the function will create a patch file -that once applied to -mmf1 - -will give -mmf2 - -as result. Files -mmf1 and mmf2 - -must be compact to make it easy and faster to perform the difference operation. -Functions are available to check for compactness ( -xdl_mmfile_iscompact() - -) and to make compact a non-compact file ( -xdl_mmfile_compact() - -). The -ecb - -parameter is used to pass the emission callback to the algorithm responsible -of the output file creation. -The function returns 0 if succeede or -1 if an error is occurred. -

-

int xdl_rabdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, xdemitcb_t *ecb); - -
-

-Same as -xdl_rabdiff() - -but it works on memory buffer directly. The memory buffer structure is defined as : -

-
-        typedef struct s_mmbuffer {
-                char *ptr;
-                long size;
-        } mmbuffer_t;
-
-
- -An empty memory buffer is specified by setting the -ptr - -member as -NULL - -and the -size - -member as zero. The reason of having this function is to avoid the memory file -preparation, that might involve copying memory from other sources. Using -the -xdl_rabdiff_mb(), - -the caller can setup the two memory buffer by using, for example, -mmap(2), - -and hence avoiding unnecessary memory copies. The other parameters and the return value -of the function -xdl_rabdiff_mb() - -are the same as the ones already described in -xdl_rabdiff(). - -

-

long xdl_bdiff_tgsize(mmfile_t *mmfp); - -
-

-Given a binary memory file patch, it returns the size that the result file -will have once the patch is applied to the target file. It can be used to -pre-allocate (or write-allocate) a memory block to store the patch result -so that a compact file will be available at the end of the operation. The -function returns the requested size, or -1 if an error occurred during the operation. -

-

int xdl_bpatch(mmfile_t *mmf, mmfile_t *mmfp, xdemitcb_t *ecb); - -
-

-Request to patch the binary memory file -mmf - -using the binary patch file stored in -mmfp. - -The -mmf - -memory file -is not - -changed during the operation and can be considered as read only. The binary -patch algorithm has no notion of context, so the patch operation cannot be -partial (either success or failure). The -ecb - -parameter contain the callabck (see above for description) used by the binary -patch algorithm to emit the result file. The function returns 0 if succeeded -or -1 if an error occurred during the patch operation. -

-

-  -

SEE ALSO

- -Two papers drove the content of this library and these are : -
- -
-
o
-File System Support for Delta Compression by Joshua P. MacDonald - -http://www.xmailserver.org/xdfs.pdf - -
- -
o
-Fingerprinting by Random Polynomials by Michael O. Rabin - -http://www.xmailserver.org/rabin.pdf - -
- -
o
-An O(ND) Difference Algorithm and Its Variations by Eugene W. Myers - -http://www.xmailserver.org/diff2.pdf - -
-

- -

-Also usefull information can be looked up inside the -diffutil - -GNU package : -

-http://www.gnu.org/software/diffutils/diffutils.html - -

-  -

LICENSE

- -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. -A copy of the license is available at : -

-http://www.gnu.org/copyleft/lesser.html - -

-  -

AUTHOR

- -Developed by Davide Libenzi -<davidel@xmailserver.org> - -

-  -

AVAILABILITY

- -The latest version of -LibXDiff - -can be found at : -

-http://www.xmailserver.org/xdiff-lib.html - -

-  -

BUGS

- -There are no known bugs. Bug reports and comments to Davide Libenzi -<davidel@xmailserver.org> - -

-

- -


- 

Index

-
-
NAME
-
SYNOPSIS
-
DESCRIPTION
-
-
Functions
-
-
SEE ALSO
-
LICENSE
-
AUTHOR
-
AVAILABILITY
-
BUGS
-
-
-This document was created by -man2html, -using the manual pages.
-Time: 21:26:59 GMT, November 12, 2008 - - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.pdf b/gems/xdiff-rb/ext/xdiff/xdiff/man/xdiff.pdf deleted file mode 100644 index d1694f661235f22cbb59c7d1240010e3835c57e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26597 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 jY+zw*Vn - - int xdl_set_allocator(memallocator_t const *malt); - void *xdl_malloc(unsigned int size); - void xdl_free(void *ptr); - void *xdl_realloc(void *ptr, unsigned int nsize); - int xdl_init_mmfile(mmfile_t *mmf, long bsize, unsigned long flags); - void xdl_free_mmfile(mmfile_t *mmf); - int xdl_mmfile_iscompact(mmfile_t *mmf); - int xdl_seek_mmfile(mmfile_t *mmf, long off); - long xdl_read_mmfile(mmfile_t *mmf, void *data, long size); - long xdl_write_mmfile(mmfile_t *mmf, void const *data, long size); - long xdl_writem_mmfile(mmfile_t *mmf, mmbuffer_t *mb, int nbuf); - void *xdl_mmfile_writeallocate(mmfile_t *mmf, long size); - long xdl_mmfile_ptradd(mmfile_t *mmf, char *ptr, long size, unsigned long flags); - void *xdl_mmfile_first(mmfile_t *mmf, long *size); - void *xdl_mmfile_next(mmfile_t *mmf, long *size); - long xdl_mmfile_size(mmfile_t *mmf); - int xdl_mmfile_cmp(mmfile_t *mmf1, mmfile_t *mmf2); - int xdl_mmfile_compact(mmfile_t *mmfo, mmfile_t *mmfc, long bsize, unsigned long flags); - int xdl_diff(mmfile_t *mmf1, mmfile_t *mmf2, xpparam_t const *xpp, xdemitconf_t const *xecfg, xdemitcb_t *ecb); - int xdl_patch(mmfile_t *mmf, mmfile_t *mmfp, int mode, xdemitcb_t *ecb, xdemitcb_t *rjecb); - int xdl_merge3(mmfile_t *mmfo, mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb, xdemitcb_t *rjecb); - int xdl_bdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, bdiffparam_t const *bdp, xdemitcb_t *ecb); - int xdl_bdiff(mmfile_t *mmf1, mmfile_t *mmf2, bdiffparam_t const *bdp, xdemitcb_t *ecb); - int xdl_rabdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, xdemitcb_t *ecb); - int xdl_rabdiff(mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb); - long xdl_bdiff_tgsize(mmfile_t *mmfp); - int xdl_bpatch(mmfile_t *mmf, mmfile_t *mmfp, xdemitcb_t *ecb); - - -DESCRIPTION - The LibXDiff library implements basic and yet complete functionalities - to create file differences/patches to both binary and text files. The - library uses memory files as file abstraction to achieve both perfor- - mance and portability. For binary files, LibXDiff implements both (with - some modification) the algorithm described in File System Support for - Delta Compression by Joshua P. MacDonald, and the method described in - Fingerprinting by Random Polynomials by Michael O. Rabin. While for - text files it follows directives described in An O(ND) Difference Algo- - rithm and Its Variations by Eugene W. Myers. Memory files used by the - library are basically a collection of buffers that store the file con- - tent. There are two different requirements for memory files when passed - to diff/patch functions. Text files for diff/patch functions require - that a single line do not have to spawn across two different memory - file blocks. Binary diff/patch functions require memory files to be - compact. A compact memory files is a file whose content is stored - inside a single block. Functionalities inside the library are avail- - able to satisfy these rules. Using the XDL_MMF_ATOMIC memory file flag - it is possible to make writes to not split the written record across - different blocks, while the functions xdl_mmfile_iscompact() , - xdl_mmfile_compact() and xdl_mmfile_writeallocate() are usefull to test - if the file is compact and to create a compacted version of the file - itself. The text file differential output uses the raw unified output - format, by omitting the file header since the result is always relative - to a single compare operation (between two files). The output format of - the binary patch file is proprietary (and binary) and it is basically a - collection of copy and insert commands, like described inside the Mac- - Donald paper. - - - - Functions - The following functions are defined: - - int xdl_set_allocator(memallocator_t const *malt); - - The LibXDiff library enable the user to set its own memory allo- - cator, that will be used for all the following memory requests. - The allocator must be set before to start calling the LibXDiff - library with a call to xdl_set_allocator(). The memory alloca- - tor structure contains the following members: - - typedef struct s_memallocator { - void *priv; - void *(*malloc)(void *priv, unsigned int size); - void (*free)(void *priv, void *ptr); - void *(*realloc)(void *priv, void *ptr, unsigned int nsize); - } memallocator_t; - - The malloc() function pointer will be used by LibXDiff to - request a memory block of size bytes. The free() function - pointer will be called to free a previously allocated block ptr - , while the realloc() will be used to resize the ptr to a new - nsize size in bytes. The priv structure member will be passed to - the malloc(),free(),realloc() functions as first parameter. The - LibXDiff user must call xdl_set_allocator() before starting - using the library, otherwise LibXDiff functions will fail due to - the lack of memory allocation support. A typical initialization - sequence for POSIX systems will use the standard malloc(3), - free(3), realloc(3) and will look like: - - void *wrap_malloc(void *priv, unsigned int size) { - return malloc(size); - } - - void wrap_free(void *priv, void *ptr) { - free(ptr); - } - - void *wrap_realloc(void *priv, void *ptr, unsigned int size) { - return realloc(ptr, size); - } - - void my_init_xdiff(void) { - memallocator_t malt; - - malt.priv = NULL; - malt.malloc = wrap_malloc; - malt.free = wrap_free; - malt.realloc = wrap_realloc; - xdl_set_allocator(&malt); - } - - - - void *xdl_malloc(unsigned int size); - - Allocates a memory block of size bytes using the LibXDiff memory - allocator. The user can specify its own allocator using the - xdl_set_allocator() function. The xdl_malloc() return a pointer - to the newly allocated block, or NULL in case of failure. - - - void xdl_free(void *ptr); - - Free a previously allocated memory block pointed by ptr. The - ptr block must has been allocated using either xdl_malloc() or - xdl_realloc(). - - - void *xdl_realloc(void *ptr, unsigned int nsize); - - Resizes the memory block pointed by ptr to a new size nsize. - Return the resized block if successful, or NULL in case the - reallocation fails. After a successful reallocation, the old ptr - block is to be considered no more valid. - - - int xdl_init_mmfile(mmfile_t *mmf, long bsize, unsigned long flags); - - Initialize the memory file mmf by requiring an internal block - size of bsize. The flags parameter is a combination of the fol- - lowing flags : - - XDL_MMF_ATOMIC Writes on the memory file will be atomic. That - is, the data will not be split on two or more different blocks. - - Once an xdl_init_mmfile() succeeded, a matching - xdl_free_mmfile() must be called when the user has done using - the memory file, otherwise serious memory leaks will happen. - The function return 0 if succeed or -1 if an error is encoun- - tered. - - - void xdl_free_mmfile(mmfile_t *mmf); - - Free all the data associated with the mmf memory file. - - - int xdl_mmfile_iscompact(mmfile_t *mmf); - - Returns an integer different from 0 if the mmf memory file is - compact, 0 otherwise. A compact memory file is one that have the - whole content stored inside a single block. - - - int xdl_seek_mmfile(mmfile_t *mmf, long off); - - Set the current data pointer of the memory file mmf to the spec- - ified offset off from the beginning of the file itself. Returns - 0 if successful or -1 if an error happened. - - - long xdl_read_mmfile(mmfile_t *mmf, void *data, long size); - - Request to read size bytes from the memory file mmf by storing - the data inside the data buffer. Returns the number of bytes - read into the data buffer. The amount of data read can be lower - than the specified size. The function returns -1 if an error - happened. - - - long xdl_write_mmfile(mmfile_t *mmf, void const *data, long size); - - Request to write size bytes from the specified buffer data into - the memory file mmf. If the memory file has been created using - the XDL_MMF_ATOMIC flag, the write request will not be split - across different blocks. Note that all write operations done on - memory files do append data at the end the file, and writes in - the middle of it are allowed. This is because the library memory - file abstraction does not need this functionality to be avail- - able. The function returns the number of bytes written or a - number lower than size if an error happened. - - - long xdl_writem_mmfile(mmfile_t *mmf, mmbuffer_t *mb, int nbuf); - - Request to sequentially write nbuf memory buffers passed inside - the array mb into the memory file mmf. The memory buffer struc- - ture is defined as : - - typedef struct s_mmbuffer { - char *ptr; - long size; - } mmbuffer_t; - - The ptr field is a pointer to the user data, whose size is spec- - ified inside the size structure field. The function returns the - total number of bytes written or a lower number if an error hap- - pened. - - - void *xdl_mmfile_writeallocate(mmfile_t *mmf, long size); - - The function request to allocate a write buffer of size bytes in - the mmf memory file and returns the pointer to the allocated - buffer. The user will have the responsibility to store size - bytes (no more, no less) inside the memory region pointed to by - the returned pointer. The files size will grow of size bytes as - a consequence of this operation. The function will return NULL - if an error happened. - - - long xdl_mmfile_ptradd(mmfile_t *mmf, char *ptr, long size, unsigned - long flags); - - The function adds a user specified block to the end of the mem- - ory file mmf. The block first byte is pointed to by ptr and its - length is size bytes. The flags parameter can be used to specify - attributes of the user memory block. Currently supported - attributes are: - - XDL_MMB_READONLY Specify that the added memory block must be - treated as read-only, and every attempt to write on it should - result in a failure of the memory file writing functions. - - The purpose of this function is basically to avoid copying mem- - ory around, by helping the library to not drain the CPU cache. - The function returns size in case of success, or -1 in case of - error. - - - void *xdl_mmfile_first(mmfile_t *mmf, long *size); - - The function is used to return the first block of the mmf memory - file block chain. The size parameter will receive the size of - the block, while the function will return the pointer the the - first byte of the block itself. The function returns NULL if the - file is empty. - - - void *xdl_mmfile_next(mmfile_t *mmf, long *size); - - The function is used to return the next block of the mmf memory - file block chain. The size parameter will receive the size of - the block, while the function will return the pointer the the - first byte of the block itself. The function returns NULL if the - current block is the last one of the chain. - - - long xdl_mmfile_size(mmfile_t *mmf); - - The function returns the size of the specified memory file mmf. - - - int xdl_mmfile_cmp(mmfile_t *mmf1, mmfile_t *mmf2); - - Request to compare two memory files mmf1 and mmf2 and returns 0 - if files are identical, or a value different from 0 if files are - different. - - - int xdl_mmfile_compact(mmfile_t *mmfo, mmfile_t *mmfc, long bsize, - unsigned long flags); - - Request to create a compact version of the memory file mmfo into - the (uninitialized) memory file mmfc. The bsize parameter spec- - ify the requested block size and flags specify flags to be used - to create the new mmfc memory file (see xdl_init_mmfile() ). The - function returns 0 if succedded or -1 if an error happened. - - - int xdl_diff(mmfile_t *mmf1, mmfile_t *mmf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg, xdemitcb_t *ecb); - - Request to create the difference between the two text memory - files mmf1 and mmf2. The mmf1 memory files is considered the - "old" file while mmf2 is considered the "new" file. So the func- - tion will create a patch file that once applied to mmf1 will - give mmf2 as result. Files mmf1 and mmf2 must be atomic from a - line point of view (or, as an extreme, compact), that means that - a single test line cannot spread among different memory file - blocks. The xpp parameter is a pointer to a structure : - - typedef struct s_xpparam { - unsigned long flags; - } xpparam_t; - - that is used to specify parameters to be used by the file dif- - ferential algorithm. The flags field is a combination of the - following flags : - - - XDF_NEED_MINIMAL Requires the minimal edit script to be found by - the algorithm (may be slow). - - The xecfg parameter point to a structure : - - typedef struct s_xdemitconf { - long ctxlen; - } xdemitconf_t; - - that is used to configure the algorithm responsible of the - creation the the differential file from an edit script. The - ctxlen field is used to specify the amount of context to be - emitted inside the differential file (the value 3 is suggested - for normal operations). The parameter ecb is a pointer to a - structure : - - typedef struct s_xdemitcb { - void *priv; - int (*outf)(void *, mmbuffer_t *, int); - } xdemitcb_t; - - that is used by the differential file creation algorithm to emit - the created data. The priv field is an opaque pointer to a user - specified data, while the outf field point to a callback func- - tion that is called internally to emit algorithm generated data - rappresenting the differential file. The first parameter of the - callback is the same priv field specified inside the xdemitcb_t - structure. The second parameter point to an array of mmbuffer_t - (see above for a definition of the structure) whose element - count is specified inside the last parameter of the callback - itself. The callback will always be called with entire records - (lines) and never a record (line) will be emitted using two dif- - ferent callback calls. This is important because if the called - will use another memory file to store the result, by creating - the target memory file with XDL_MMF_ATOMIC will guarantee the - "atomicity" of the memory file itself. The function returns 0 - if succeeded or -1 if an error occurred. - - - int xdl_patch(mmfile_t *mmf, mmfile_t *mmfp, int mode, xdemitcb_t *ecb, - xdemitcb_t *rjecb); - - Request to patch the memory file mmf using the patch file stored - in mmfp. The mmf memory file is not changed during the opera- - tion and can be considered as read only. The mode parameter can - be one of the following values : - - XDL_PATCH_NORMAL Perform standard patching like if the patch - memory file mmfp has been created using mmf as "old" file. - - XDL_PATCH_REVERSE Apply the reverse patch. That means that the - mmf memory file has to be considered as if it was specified as - "new" file during the differential operation ( xdl_diff() ). The - result of the operation will then be the file content that was - used as "old" file during the differential operation. - - The following flags can be specified (by or-ing them) to one of - the above: - - XDL_PATCH_IGNOREBSPACE Ignore the whitespace at the beginning - and the end of the line. - - The ecb will be used by the patch algorithm to create the result - file while the rjecb will be used to emit all differential - chunks that cannot be applied. Like explained above, callbacks - are always called with entire records to guarantee atomicity of - the resulting output. The function returns 0 if succeeded with- - out performing any fuzzy hunk detection, a positive value if it - secceeded with fuzzy hunk detection or -1 if an error occurred - during the patch operation. - - - int xdl_merge3(mmfile_t *mmfo, mmfile_t *mmf1, mmfile_t *mmf2, - xdemitcb_t *ecb, xdemitcb_t *rjecb); - - Merges three files together. The mmfo file is the original one, - while mmf1 and mmf2 are two modified versions of mmfo. The - function works by creating a differential between mmfo and mmf2 - and by applying the resulting patch to mmf1. Because of this - sequence, mmf1 changes will be privileged against the ones of - mmf2. The ecb will be used by the patch algorithm to create the - result file while the rjecb will be used to emit all differen- - tial chunks that cannot be applied. Like explained above, call- - backs are always called with entire records to guarantee atomic- - ity of the resulting output. The function returns 0 if suc- - ceeded or -1 if an error occurred during the patch operation. - - - int xdl_bdiff(mmfile_t *mmf1, mmfile_t *mmf2, bdiffparam_t const *bdp, - xdemitcb_t *ecb); - - Request to create the difference between the two text memory - files mmf1 and mmf2. The mmf1 memory files is considered the - "old" file while mmf2 is considered the "new" file. So the func- - tion will create a patch file that once applied to mmf1 will - give mmf2 as result. Files mmf1 and mmf2 must be compact to make - it easy and faster to perform the difference operation. Func- - tions are available to check for compactness ( xdl_mmfile_iscom- - pact() ) and to make compact a non-compact file ( - xdl_mmfile_compact() ). An example of how to create a compact - memory file (described inside the test subdirectory) is : - - int xdlt_load_mmfile(char const *fname, mmfile_t *mf, int binmode) { - char cc; - int fd; - long size, bsize; - char *blk; - - if (xdl_init_mmfile(mf, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) - return -1; - if ((fd = open(fname, O_RDONLY)) == -1) { - perror(fname); - xdl_free_mmfile(mf); - return -1; - } - if ((size = bsize = lseek(fd, 0, SEEK_END)) > 0 && !binmode) { - if (lseek(fd, -1, SEEK_END) != (off_t) -1 && - read(fd, &cc, 1) && cc != '\n') - bsize++; - } - lseek(fd, 0, SEEK_SET); - if (!(blk = (char *) xdl_mmfile_writeallocate(mf, bsize))) { - xdl_free_mmfile(mf); - close(fd); - return -1; - } - if (read(fd, blk, (size_t) size) != (size_t) size) { - perror(fname); - xdl_free_mmfile(mf); - close(fd); - return -1; - } - close(fd); - if (bsize > size) - blk[size] = '\n'; - return 0; - } - - The bdp parameter points to a structure : - - typedef struct s_bdiffparam { - long bsize; - } bdiffparam_t; - - that is used to pass information to the binary file differential - algorithm. The bsize parameter specify the size of the block - that will be used to decompose mmf1 during the block classifica- - tion phase of the algorithm (see MacDonald paper). Suggested - values go from 16 to 64, with a preferred power of two charac- - teristic. The ecb parameter is used to pass the emission call- - back to the algorithm responsible of the output file creation. - The function returns 0 if succeede or -1 if an error is - occurred. - - - int xdl_bdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, bdiffparam_t const - *bdp, xdemitcb_t *ecb); - - Same as xdl_bdiff() but it works on memory buffer directly. The - xdl_bdiff() is implemented internally with a xdl_bdiff_mb() - after having setup the two memory buffers from the passed memory - files (that must be compact, as described above). The memory - buffer structure is defined as : - - typedef struct s_mmbuffer { - char *ptr; - long size; - } mmbuffer_t; - - An empty memory buffer is specified by setting the ptr member as - NULL and the size member as zero. The reason of having this - function is to avoid the memory file preparation, that might - involve copying memory from other sources. Using the - xdl_bdiff_mb(), the caller can setup the two memory buffer by - using, for example, mmap(2), and hence avoiding unnecessary mem- - ory copies. The other parameters and the return value of the - function xdl_bdiff_mb() are the same as the ones already - described in xdl_bdiff(). - - - int xdl_rabdiff(mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb); - - Request to create the difference between the two text memory - files mmf1 and mmf2 using the Rabin's polynomial fingerprinting - algorithm. This algorithm typically performs faster and produces - smaller deltas, when compared to the XDelta-like one. The mmf1 - memory files is considered the "old" file while mmf2 is consid- - ered the "new" file. So the function will create a patch file - that once applied to mmf1 will give mmf2 as result. Files mmf1 - and mmf2 must be compact to make it easy and faster to perform - the difference operation. Functions are available to check for - compactness ( xdl_mmfile_iscompact() ) and to make compact a - non-compact file ( xdl_mmfile_compact() ). The ecb parameter is - used to pass the emission callback to the algorithm responsible - of the output file creation. The function returns 0 if succeede - or -1 if an error is occurred. - - - int xdl_rabdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, xdemitcb_t - *ecb); - - Same as xdl_rabdiff() but it works on memory buffer directly. - The memory buffer structure is defined as : - - typedef struct s_mmbuffer { - char *ptr; - long size; - } mmbuffer_t; - - An empty memory buffer is specified by setting the ptr member as - NULL and the size member as zero. The reason of having this - function is to avoid the memory file preparation, that might - involve copying memory from other sources. Using the xdl_rabd- - iff_mb(), the caller can setup the two memory buffer by using, - for example, mmap(2), and hence avoiding unnecessary memory - copies. The other parameters and the return value of the func- - tion xdl_rabdiff_mb() are the same as the ones already described - in xdl_rabdiff(). - - - long xdl_bdiff_tgsize(mmfile_t *mmfp); - - Given a binary memory file patch, it returns the size that the - result file will have once the patch is applied to the target - file. It can be used to pre-allocate (or write-allocate) a mem- - ory block to store the patch result so that a compact file will - be available at the end of the operation. The function returns - the requested size, or -1 if an error occurred during the opera- - tion. - - - int xdl_bpatch(mmfile_t *mmf, mmfile_t *mmfp, xdemitcb_t *ecb); - - Request to patch the binary memory file mmf using the binary - patch file stored in mmfp. The mmf memory file is not changed - during the operation and can be considered as read only. The - binary patch algorithm has no notion of context, so the patch - operation cannot be partial (either success or failure). The ecb - parameter contain the callabck (see above for description) used - by the binary patch algorithm to emit the result file. The func- - tion returns 0 if succeeded or -1 if an error occurred during - the patch operation. - - -SEE ALSO - Two papers drove the content of this library and these are : - - o File System Support for Delta Compression by Joshua P. MacDonald - http://www.xmailserver.org/xdfs.pdf - - o Fingerprinting by Random Polynomials by Michael O. Rabin - http://www.xmailserver.org/rabin.pdf - - o An O(ND) Difference Algorithm and Its Variations by Eugene W. - Myers http://www.xmailserver.org/diff2.pdf - - - Also usefull information can be looked up inside the diffutil GNU pack- - age : - - http://www.gnu.org/software/diffutils/diffutils.html - - -LICENSE - This library is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. A copy of the license is available - at : - - http://www.gnu.org/copyleft/lesser.html - - -AUTHOR - Developed by Davide Libenzi - - -AVAILABILITY - The latest version of LibXDiff can be found at : - - http://www.xmailserver.org/xdiff-lib.html - - -BUGS - There are no known bugs. Bug reports and comments to Davide Libenzi - - - - - -GNU 0.23 LibXDiff(3) diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/test/xdiff_test.c b/gems/xdiff-rb/ext/xdiff/xdiff/test/xdiff_test.c deleted file mode 100644 index 65a9cdd9..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/test/xdiff_test.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "xdiff.h" -#include "xtestutils.h" - - - - - -static int xdlt_outf(void *priv, mmbuffer_t *mb, int nbuf) { - int i; - - for (i = 0; i < nbuf; i++) - if (!fwrite(mb[i].ptr, mb[i].size, 1, (FILE *) priv)) - return -1; - - return 0; -} - - -void usage(char const *prg) { - - fprintf(stderr, - "use: %s --diff [-C N] from-file to-file\n" - " %s --patch orig-file patch-file\n" - " %s --bdiff [-B N] from-file to-file\n" - " %s --rabdiff from-file to-file\n" - " %s --bpatch orig-file patch-file\n", - prg, prg, prg, prg, prg); -} - - -static void *wrap_malloc(void *priv, unsigned int size) { - - return malloc(size); -} - - -static void wrap_free(void *priv, void *ptr) { - - free(ptr); -} - - -static void *wrap_realloc(void *priv, void *ptr, unsigned int size) { - - return realloc(ptr, size); -} - - -int main(int argc, char *argv[]) { - int i = 1, ctxlen = 3, bsize = 16, do_diff, do_patch, do_bdiff, do_bpatch, do_rabdiff; - memallocator_t malt; - mmfile_t mf1, mf2; - xpparam_t xpp; - xdemitconf_t xecfg; - bdiffparam_t bdp; - xdemitcb_t ecb, rjecb; - - if (argc < 4) { - usage(argv[0]); - return 1; - } - malt.priv = NULL; - malt.malloc = wrap_malloc; - malt.free = wrap_free; - malt.realloc = wrap_realloc; - xdl_set_allocator(&malt); - - do_diff = do_patch = do_bdiff = do_bpatch = do_rabdiff = 0; - if (!strcmp(argv[i], "--diff")) { - i++; - do_diff = 1; - for (; i < argc; i++) { - if (strcmp(argv[i], "-C") == 0) { - if (++i < argc) - ctxlen = atoi(argv[i]); - } else - break; - } - } else if (!strcmp(argv[i], "--patch")) { - i++; - do_patch = 1; - } else if (!strcmp(argv[i], "--bdiff")) { - i++; - do_bdiff = 1; - for (; i < argc; i++) { - if (strcmp(argv[i], "-B") == 0) { - if (++i < argc) - bsize = atoi(argv[i]); - } else - break; - } - } else if (!strcmp(argv[i], "--rabdiff")) { - i++; - do_rabdiff = 1; - } else if (!strcmp(argv[i], "--bpatch")) { - i++; - do_bpatch = 1; - } else { - usage(argv[0]); - return 1; - } - if (argc - i < 2) { - usage(argv[0]); - return 1; - } - - xpp.flags = 0; - xecfg.ctxlen = ctxlen; - bdp.bsize = bsize; - if (xdlt_load_mmfile(argv[i], &mf1, do_bdiff || do_bpatch) < 0) { - - return 2; - } - if (xdlt_load_mmfile(argv[i + 1], &mf2, do_bdiff || do_bpatch) < 0) { - - xdl_free_mmfile(&mf1); - return 2; - } - if (do_diff) { - ecb.priv = stdout; - ecb.outf = xdlt_outf; - - if (xdl_diff(&mf1, &mf2, &xpp, &xecfg, &ecb) < 0) { - - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - return 3; - } - } else if (do_bdiff) { - ecb.priv = stdout; - ecb.outf = xdlt_outf; - if (xdl_bdiff(&mf1, &mf2, &bdp, &ecb) < 0) { - - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - return 4; - } - } else if (do_rabdiff) { - ecb.priv = stdout; - ecb.outf = xdlt_outf; - if (xdl_rabdiff(&mf1, &mf2, &ecb) < 0) { - - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - return 4; - } - } else if (do_bpatch) { - ecb.priv = stdout; - ecb.outf = xdlt_outf; - if (xdl_bpatch(&mf1, &mf2, &ecb) < 0) { - - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - return 5; - } - } else if (do_patch) { - ecb.priv = stdout; - ecb.outf = xdlt_outf; - rjecb.priv = stderr; - rjecb.outf = xdlt_outf; - if (xdl_patch(&mf1, &mf2, XDL_PATCH_NORMAL, &ecb, &rjecb) < 0) { - - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - return 6; - } - } - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - - return 0; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/test/xregression.c b/gems/xdiff-rb/ext/xdiff/xdiff/test/xregression.c deleted file mode 100644 index 9ac16d8f..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/test/xregression.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include -#include -#include -#include -#include -#include -#include "xdiff.h" -#include "xtestutils.h" - - - -static void *wrap_malloc(void *priv, unsigned int size) { - - return malloc(size); -} - - -static void wrap_free(void *priv, void *ptr) { - - free(ptr); -} - - -static void *wrap_realloc(void *priv, void *ptr, unsigned int size) { - - return realloc(ptr, size); -} - - -int main(int argc, char *argv[]) { - int i, chmax = 64; - long size = 1024 * 100; - double rmod = 0.1; - xpparam_t xpp; - xdemitconf_t xecfg; - bdiffparam_t bdp; - memallocator_t malt; - - malt.priv = NULL; - malt.malloc = wrap_malloc; - malt.free = wrap_free; - malt.realloc = wrap_realloc; - xdl_set_allocator(&malt); - - xpp.flags = 0; - xecfg.ctxlen = 3; - bdp.bsize = 16; - - for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "--size")) { - if (++i < argc) - size = atol(argv[i]); - } else if (!strcmp(argv[i], "--rmod")) { - if (++i < argc) - rmod = atof(argv[i]); - } else if (!strcmp(argv[i], "--ctxlen")) { - if (++i < argc) - xecfg.ctxlen = atol(argv[i]); - } else if (!strcmp(argv[i], "--chmax")) { - if (++i < argc) - chmax = atoi(argv[i]); - } - } - - srand(time(NULL)); - for (i = 0;; i++) { - fprintf(stderr, "Running TEXT test : %d ... ", i); - if (xdlt_auto_regress(&xpp, &xecfg, size, rmod, chmax) < 0) { - - fprintf(stderr, "FAIL\n"); - break; - } else { - - fprintf(stderr, "OK\n"); - } - - fprintf(stderr, "Running BIN test : %d ... ", i); - if (xdlt_auto_binregress(&bdp, size, rmod, chmax) < 0) { - - fprintf(stderr, "FAIL\n"); - break; - } else { - - fprintf(stderr, "OK\n"); - } - - fprintf(stderr, "Running RBIN test : %d ... ", i); - if (xdlt_auto_rabinregress(size, rmod, chmax) < 0) { - - fprintf(stderr, "FAIL\n"); - break; - } else { - - fprintf(stderr, "OK\n"); - } - - fprintf(stderr, "Running MBIN test : %d ... ", i); - if (xdlt_auto_mbinregress(&bdp, size, rmod, chmax, 32) != 0) { - - fprintf(stderr, "FAIL\n"); - break; - } else { - - fprintf(stderr, "OK\n"); - } - } - - return 0; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/test/xtestutils.c b/gems/xdiff-rb/ext/xdiff/xdiff/test/xtestutils.c deleted file mode 100644 index a9a6785d..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/test/xtestutils.c +++ /dev/null @@ -1,631 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#if defined(WIN32) || defined(_WIN32) - -#include - -#define write _write -#define read _read -#define lseek _lseek -#define close _close -#define O_CREAT _O_CREAT -#define O_WRONLY _O_WRONLY -#define O_RDONLY _O_RDONLY -#define off_t long -#define size_t int - -#else /* #if defined(WIN32) || defined(_WIN32) */ - -#include - -#endif /* #if defined(WIN32) || defined(_WIN32) */ - -#include "xmacros.h" -#include "xdiff.h" -#include "xtestutils.h" - - - -#define XDLT_STD_BLKSIZE (1024 * 8) -#define XDLT_MAX_LINE_SIZE 80 - - - - -static int xdlt_mmfile_outf(void *priv, mmbuffer_t *mb, int nbuf); - - - - - -int xdlt_dump_mmfile(char const *fname, mmfile_t *mmf) { - int fd; - long size; - char *blk; - - if ((fd = open(fname, O_CREAT | O_WRONLY, 0644)) == -1) { - perror(fname); - return -1; - } - - if ((blk = (char *) xdl_mmfile_first(mmf, &size)) != NULL) { - do { - if (write(fd, blk, (size_t) size) != (size_t) size) { - perror(fname); - close(fd); - return -1; - } - } while ((blk = (char *) xdl_mmfile_next(mmf, &size)) != NULL); - } - - close(fd); - - return 0; -} - - -int xdlt_load_mmfile(char const *fname, mmfile_t *mf, int binmode) { - char cc; - int fd; - long size; - char *blk; - - if (xdl_init_mmfile(mf, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - if ((fd = open(fname, O_RDONLY)) == -1) { - perror(fname); - xdl_free_mmfile(mf); - return -1; - } - size = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); - if (!(blk = (char *) xdl_mmfile_writeallocate(mf, size))) { - xdl_free_mmfile(mf); - close(fd); - return -1; - } - if (read(fd, blk, (size_t) size) != (size_t) size) { - perror(fname); - xdl_free_mmfile(mf); - close(fd); - return -1; - } - close(fd); - - return 0; -} - - -static int xdlt_mmfile_outf(void *priv, mmbuffer_t *mb, int nbuf) { - mmfile_t *mmf = priv; - - if (xdl_writem_mmfile(mmf, mb, nbuf) < 0) { - - return -1; - } - - return 0; -} - - -int xdlt_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg, mmfile_t *mfp) { - xdemitcb_t ecb; - - if (xdl_init_mmfile(mfp, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - ecb.priv = mfp; - ecb.outf = xdlt_mmfile_outf; - if (xdl_diff(mf1, mf2, xpp, xecfg, &ecb) < 0) { - - xdl_free_mmfile(mfp); - return -1; - } - - return 0; -} - - -int xdlt_do_patch(mmfile_t *mfo, mmfile_t *mfp, int mode, mmfile_t *mfr) { - xdemitcb_t ecb, rjecb; - mmfile_t mmfrj; - - if (xdl_init_mmfile(mfr, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - if (xdl_init_mmfile(&mmfrj, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - xdl_free_mmfile(mfr); - return -1; - } - ecb.priv = mfr; - ecb.outf = xdlt_mmfile_outf; - rjecb.priv = &mmfrj; - rjecb.outf = xdlt_mmfile_outf; - if (xdl_patch(mfo, mfp, mode, &ecb, &rjecb) < 0) { - - xdl_free_mmfile(&mmfrj); - xdl_free_mmfile(mfr); - return -1; - } - - if (mmfrj.fsize > 0) { - -#if 1 - xdlt_dump_mmfile("xregr.orig", mfo); - xdlt_dump_mmfile("xregr.patch", mfp); - xdlt_dump_mmfile("xregr.rej", &mmfrj); -#endif - - xdl_free_mmfile(&mmfrj); - xdl_free_mmfile(mfr); - return -1; - } - xdl_free_mmfile(&mmfrj); - - return 0; -} - - -int xdlt_do_regress(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg) { - mmfile_t mfp, mfr; - - if (xdlt_do_diff(mf1, mf2, xpp, xecfg, &mfp) < 0) { - - return -1; - } - if (xdlt_do_patch(mf1, &mfp, XDL_PATCH_NORMAL, &mfr) < 0) { - - xdl_free_mmfile(&mfp); - return -1; - } - if (xdl_mmfile_cmp(&mfr, mf2)) { - - xdl_free_mmfile(&mfr); - xdl_free_mmfile(&mfp); - return -1; - } - xdl_free_mmfile(&mfr); - if (xdlt_do_patch(mf2, &mfp, XDL_PATCH_REVERSE, &mfr) < 0) { - - xdl_free_mmfile(&mfp); - return -1; - } - if (xdl_mmfile_cmp(&mfr, mf1)) { - - xdl_free_mmfile(&mfr); - xdl_free_mmfile(&mfp); - return -1; - } - xdl_free_mmfile(&mfr); - xdl_free_mmfile(&mfp); - - return 0; -} - - -long xdlt_gen_line(char *buf, long msize) { - long i, size; - static const char ab[] = - "zxcvbnmlkjhgfdsaqwertyuiop" - "ZXCVBNMLKJHGFDSAQWERTYUIOP" - "0123456789 "; - static const int absize = sizeof(ab) - 1; - - if (msize > 0) - size = rand() % (msize - 1); - else - size = -msize - 1; - for (i = 0; i < size; i++) - buf[i] = ab[rand() % absize]; - buf[i] = '\n'; - return size + 1; -} - - -int xdlt_create_file(mmfile_t *mf, long size) { - long lnsize, csize; - char *data; - - if (xdl_init_mmfile(mf, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - if (!(data = xdl_mmfile_writeallocate(mf, size))) { - - xdl_free_mmfile(mf); - return -1; - } - for (csize = 0; size - csize > XDLT_MAX_LINE_SIZE;) { - lnsize = xdlt_gen_line(data, XDLT_MAX_LINE_SIZE); - data += lnsize; - csize += lnsize; - } - if (csize < size) - xdlt_gen_line(data, -(size - csize)); - - return 0; -} - - -int xdlt_change_file(mmfile_t *mfo, mmfile_t *mfr, double rmod, - int chmax) { - long skipln, lnsize, bsize; - char const *blk, *cur, *top, *eol; - char lnbuf[XDLT_MAX_LINE_SIZE + 1]; - - if (xdl_init_mmfile(mfr, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - if ((blk = xdl_mmfile_first(mfo, &bsize)) != NULL) { - for (cur = blk, top = blk + bsize, skipln = 0;;) { - if (cur >= top) { - if ((blk = xdl_mmfile_next(mfo, &bsize)) == NULL) - break; - cur = blk; - top = blk + bsize; - } - if (!(eol = memchr(cur, '\n', top - cur))) - eol = top; - if (!skipln) { - if (DBL_RAND() < rmod) { - skipln = rand() % chmax; - if (rand() & 1) { - for (; skipln > 0; skipln--) { - lnsize = xdlt_gen_line(lnbuf, XDLT_MAX_LINE_SIZE); - if (xdl_write_mmfile(mfr, lnbuf, lnsize) != lnsize) { - - xdl_free_mmfile(mfr); - return -1; - } - } - } - } else { - lnsize = (eol - cur) + 1; - if (xdl_write_mmfile(mfr, cur, lnsize) != lnsize) { - - xdl_free_mmfile(mfr); - return -1; - } - } - } else - skipln--; - - cur = eol + 1; - } - } - - return 0; -} - - -int xdlt_auto_regress(xpparam_t const *xpp, xdemitconf_t const *xecfg, long size, - double rmod, int chmax) { - mmfile_t mf1, mf2; - - if (xdlt_create_file(&mf1, size) < 0) { - - return -1; - } - if (xdlt_change_file(&mf1, &mf2, rmod, chmax) < 0) { - - xdl_free_mmfile(&mf1); - return -1; - } - if (xdlt_do_regress(&mf1, &mf2, xpp, xecfg) < 0) { - - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - return -1; - } - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - - return 0; -} - - -int xdlt_do_bindiff(mmfile_t *mf1, mmfile_t *mf2, bdiffparam_t const *bdp, mmfile_t *mfp) { - xdemitcb_t ecb; - - if (xdl_init_mmfile(mfp, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - ecb.priv = mfp; - ecb.outf = xdlt_mmfile_outf; - if (xdl_bdiff(mf1, mf2, bdp, &ecb) < 0) { - - xdl_free_mmfile(mfp); - return -1; - } - - return 0; -} - - -int xdlt_do_rabdiff(mmfile_t *mf1, mmfile_t *mf2, mmfile_t *mfp) { - xdemitcb_t ecb; - - if (xdl_init_mmfile(mfp, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - ecb.priv = mfp; - ecb.outf = xdlt_mmfile_outf; - if (xdl_rabdiff(mf1, mf2, &ecb) < 0) { - - xdl_free_mmfile(mfp); - return -1; - } - - return 0; -} - - -int xdlt_do_binpatch(mmfile_t *mf, mmfile_t *mfp, mmfile_t *mfr) { - xdemitcb_t ecb; - - if (xdl_init_mmfile(mfr, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - ecb.priv = mfr; - ecb.outf = xdlt_mmfile_outf; - if (xdl_bpatch(mf, mfp, &ecb) < 0) { - - xdl_free_mmfile(mfr); - return -1; - } - - return 0; -} - - -int xdlt_do_binregress(mmfile_t *mf1, mmfile_t *mf2, bdiffparam_t const *bdp) { - mmfile_t mfp, mfr; - - if (xdlt_do_bindiff(mf1, mf2, bdp, &mfp) < 0) { - - return -1; - } - if (xdlt_do_binpatch(mf1, &mfp, &mfr) < 0) { - - xdl_free_mmfile(&mfp); - return -1; - } - if (xdl_mmfile_cmp(&mfr, mf2)) { - - xdl_free_mmfile(&mfr); - xdl_free_mmfile(&mfp); - return -1; - } - xdl_free_mmfile(&mfr); - xdl_free_mmfile(&mfp); - - return 0; -} - - -int xdlt_do_rabinregress(mmfile_t *mf1, mmfile_t *mf2) { - mmfile_t mfp, mfr; - - if (xdlt_do_rabdiff(mf1, mf2, &mfp) < 0) { - - return -1; - } - if (xdlt_do_binpatch(mf1, &mfp, &mfr) < 0) { - - xdl_free_mmfile(&mfp); - return -1; - } - if (xdl_mmfile_cmp(&mfr, mf2)) { - - xdl_free_mmfile(&mfr); - xdl_free_mmfile(&mfp); - return -1; - } - xdl_free_mmfile(&mfr); - xdl_free_mmfile(&mfp); - - return 0; -} - - -int xdlt_auto_binregress(bdiffparam_t const *bdp, long size, - double rmod, int chmax) { - mmfile_t mf1, mf2, mf2c; - - if (xdlt_create_file(&mf1, size) < 0) { - - return -1; - } - if (xdlt_change_file(&mf1, &mf2, rmod, chmax) < 0) { - - xdl_free_mmfile(&mf1); - return -1; - } - if (xdl_mmfile_compact(&mf2, &mf2c, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - return -1; - } - xdl_free_mmfile(&mf2); - if (xdlt_do_binregress(&mf1, &mf2c, bdp) < 0) { - - xdl_free_mmfile(&mf2c); - xdl_free_mmfile(&mf1); - return -1; - } - xdl_free_mmfile(&mf2c); - xdl_free_mmfile(&mf1); - - return 0; -} - - -int xdlt_auto_rabinregress(long size, double rmod, int chmax) { - mmfile_t mf1, mf2, mf2c; - - if (xdlt_create_file(&mf1, size) < 0) { - - return -1; - } - if (xdlt_change_file(&mf1, &mf2, rmod, chmax) < 0) { - - xdl_free_mmfile(&mf1); - return -1; - } - if (xdl_mmfile_compact(&mf2, &mf2c, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - xdl_free_mmfile(&mf2); - xdl_free_mmfile(&mf1); - return -1; - } - xdl_free_mmfile(&mf2); - if (xdlt_do_rabinregress(&mf1, &mf2c) < 0) { - - xdl_free_mmfile(&mf2c); - xdl_free_mmfile(&mf1); - return -1; - } - xdl_free_mmfile(&mf2c); - xdl_free_mmfile(&mf1); - - return 0; -} - - -int xdlt_auto_mbinregress(bdiffparam_t const *bdp, long size, - double rmod, int chmax, int n) { - int i, res; - mmbuffer_t *mbb; - mmfile_t *mf, *mfc, *mfx; - mmfile_t mfn, mff, mfd, mfb; - xdemitcb_t ecb; - - if ((mbb = (mmbuffer_t *) xdl_malloc((n + 2) * sizeof(mmbuffer_t))) == NULL) { - - return -1; - } - if ((mf = mfc = (mmfile_t *) xdl_malloc((n + 2) * sizeof(mmfile_t))) == NULL) { - - xdl_free(mbb); - return -1; - } - if (xdlt_create_file(mfc, size) < 0) { - - xdl_free(mf); - xdl_free(mbb); - return -1; - } - mbb[0].ptr = (char *) xdl_mmfile_first(mfc, &mbb[0].size); - mfc++; - mfx = mf; - for (i = 0; i < n; i++) { - if (xdlt_change_file(mfx, &mfn, rmod, chmax) < 0) { - - if (mfx != mf) xdl_free_mmfile(mfx); - for (; i >= 0; i--) - xdl_free_mmfile(mf + i); - xdl_free(mf); - xdl_free(mbb); - return -1; - } - if (xdl_mmfile_compact(&mfn, &mff, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - xdl_free_mmfile(&mfn); - if (mfx != mf) xdl_free_mmfile(mfx); - for (; i >= 0; i--) - xdl_free_mmfile(mf + i); - xdl_free(mf); - xdl_free(mbb); - return -1; - } - xdl_free_mmfile(&mfn); - if (xdlt_do_bindiff(mfx, &mff, bdp, &mfd) < 0) { - - xdl_free_mmfile(&mff); - if (mfx != mf) xdl_free_mmfile(mfx); - for (; i >= 0; i--) - xdl_free_mmfile(mf + i); - xdl_free(mf); - xdl_free(mbb); - return -1; - } - if (mfx != mf) xdl_free_mmfile(mfx); - mfx = &mfb; - *mfx = mff; - if (xdl_mmfile_compact(&mfd, mfc, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - xdl_free_mmfile(&mfd); - xdl_free_mmfile(mfx); - for (; i >= 0; i--) - xdl_free_mmfile(mf + i); - xdl_free(mf); - xdl_free(mbb); - return -1; - } - mbb[i + 1].ptr = (char *) xdl_mmfile_first(mfc, &mbb[i + 1].size); - mfc++; - xdl_free_mmfile(&mfd); - } - if (xdl_init_mmfile(mfc, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - xdl_free_mmfile(mfx); - for (i = n; i >= 0; i--) - xdl_free_mmfile(mf + i); - xdl_free(mf); - xdl_free(mbb); - return -1; - } - ecb.priv = mfc; - ecb.outf = xdlt_mmfile_outf; - if ((res = xdl_bpatch_multi(&mbb[0], &mbb[1], n, &ecb)) == 0) - res = xdl_mmfile_cmp(mfx, mfc); - - xdl_free_mmfile(mfx); - for (i = n + 1; i >= 0; i--) - xdl_free_mmfile(mf + i); - xdl_free(mf); - xdl_free(mbb); - - return res; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/test/xtestutils.h b/gems/xdiff-rb/ext/xdiff/xdiff/test/xtestutils.h deleted file mode 100644 index 20feb49b..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/test/xtestutils.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XTESTUTILS_H) -#define XTESTUTILS_H - - - -#define DBL_RAND() (((double) rand()) / (1.0 + (double) RAND_MAX)) - - - -int xdlt_dump_mmfile(char const *fname, mmfile_t *mmf); -int xdlt_load_mmfile(char const *fname, mmfile_t *mf, int binmode); -int xdlt_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg, mmfile_t *mfp); -int xdlt_do_patch(mmfile_t *mfo, mmfile_t *mfp, int mode, mmfile_t *mfr); -int xdlt_do_regress(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg); -long xdlt_gen_line(char *buf, long msize); -int xdlt_create_file(mmfile_t *mf, long size); -int xdlt_change_file(mmfile_t *mfo, mmfile_t *mfr, double rmod, int chmax); -int xdlt_auto_regress(xpparam_t const *xpp, xdemitconf_t const *xecfg, long size, - double rmod, int chmax); -int xdlt_do_bindiff(mmfile_t *mf1, mmfile_t *mf2, bdiffparam_t const *bdp, mmfile_t *mfp); -int xdlt_do_rabdiff(mmfile_t *mf1, mmfile_t *mf2, mmfile_t *mfp); -int xdlt_do_binpatch(mmfile_t *mf, mmfile_t *mfp, mmfile_t *mfr); -int xdlt_do_binregress(mmfile_t *mf1, mmfile_t *mf2, bdiffparam_t const *bdp); -int xdlt_do_rabinregress(mmfile_t *mf1, mmfile_t *mf2); -int xdlt_auto_binregress(bdiffparam_t const *bdp, long size, - double rmod, int chmax); -int xdlt_auto_rabinregress(long size, double rmod, int chmax); -int xdlt_auto_mbinregress(bdiffparam_t const *bdp, long size, - double rmod, int chmax, int n); - - -#endif /* #if !defined(XTESTUTILS_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/tools/xrabin.c b/gems/xdiff-rb/ext/xdiff/xdiff/tools/xrabin.c deleted file mode 100644 index ccee8190..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/tools/xrabin.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * xrabin by Davide Libenzi (Rabin's polynomial generator) - * Copyright (C) 2006 Davide Libenzi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - * - * Hints, ideas and code for the implementation came from: - * - * Rabin's original paper: http://www.xmailserver.org/rabin.pdf - * Chan & Lu's paper: http://www.xmailserver.org/rabin_impl.pdf - * Broder's paper: http://www.xmailserver.org/rabin_apps.pdf - * LBFS source code: http://www.fs.net/sfswww/lbfs/ - * Geert Bosch's post: http://marc.theaimsgroup.com/?l=git&m=114565424620771&w=2 - * - */ - -#include -#include -#include -#include - - - -#if defined(WIN32) -#define strtoll _strtoi64 -#endif - - -#if !defined(XRAB_WORD_TYPE) -#if defined(WIN32) -#define XRAB_WORD_TYPE __int64 - -#else /* #if defined(WIN32) */ -#define XRAB_WORD_TYPE long long - -#endif /* #if defined(WIN32) */ -#endif /* #if !defined(XRAB_WORD_TYPE) */ - -#if !defined(XRAB_WORD_PFMT) -#if defined(WIN32) -#define XRAB_WORD_PFMT "0x%I64x" - -#else /* #if defined(WIN32) */ -#define XRAB_WORD_PFMT "0x%llx" - -#endif /* #if defined(WIN32) */ -#endif /* #if !defined(XRAB_WORD_PFMT) */ - -#define XPLYW_BITS (sizeof(xply_word) * 8) -#define XPLYW_MSB ((xply_word) 1 << (sizeof(xply_word) * 8 - 1)) - - - -typedef unsigned XRAB_WORD_TYPE xply_word; - - - - -static int xrab_isprime(int n) { - - if (n > 3) { - if (n & 1) { - int i, hn = n / 2; - - for (i = 3; i < hn; i += 2) - if (!(n % i)) - return 0; - } else - return 0; - } - - return 1; -} - -static int xrab_fls(xply_word v) { - int r, s; - xply_word mask = ~(((xply_word) 1 << (XPLYW_BITS / 2)) - 1); - - if (v == 0) - return 0; - for (r = XPLYW_BITS, s = r / 2; s != 0;) { - if ((v & mask) == 0) { - v <<= s; - r -= s; - } - s /= 2; - mask <<= s; - } - - return r; -} - -static xply_word xrab_polymod(xply_word nh, xply_word nl, xply_word d) { - int i, k = xrab_fls(d) - 1; - - d <<= (XPLYW_BITS - 1) - k; - if (nh) { - if (nh & XPLYW_MSB) - nh ^= d; - for (i = XPLYW_BITS - 2; i >= 0; i--) - if (nh & ((xply_word) 1) << i) { - nh ^= d >> (XPLYW_BITS - 1) - i; - nl ^= d << i + 1; - } - } - for (i = XPLYW_BITS - 1; i >= k; i--) - if (nl & ((xply_word) 1 << i)) - nl ^= d >> (XPLYW_BITS - 1) - i; - - return nl; -} - -static xply_word xrab_polygcd(xply_word x, xply_word y) { - - for (;;) { - if (!y) - return x; - x = xrab_polymod(0, x, y); - if (!x) - return y; - y = xrab_polymod(0, y, x); - } -} - -static void xrab_polymult(xply_word *php, xply_word *plp, xply_word x, - xply_word y) { - int i; - xply_word ph = 0, pl = 0; - - if (x & 1) - pl = y; - for (i = 1; i < XPLYW_BITS; i++) - if (x & (((xply_word) 1) << i)) { - ph ^= y >> (XPLYW_BITS - i); - pl ^= y << i; - } - if (php) - *php = ph; - if (plp) - *plp = pl; -} - -static xply_word xrab_polymmult(xply_word x, xply_word y, xply_word d) { - xply_word h, l; - - xrab_polymult(&h, &l, x, y); - - return xrab_polymod(h, l, d); -} - -static int xrab_polyirreducible(xply_word f) { - xply_word u = 2; - int i, m = (xrab_fls(f) - 1) >> 1; - - for (i = 0; i < m; i++) { - u = xrab_polymmult(u, u, f); - if (xrab_polygcd(f, u ^ 2) != 1) - return 0; - } - - return 1; -} - -static void xrab_rndgen(xply_word *f) { - unsigned int i; - xply_word g; - - for (i = 0, g = 0; i < sizeof(xply_word); i++) - g ^= (g << 11) + (unsigned int) rand() + (g >> 7); - *f = g; -} - -static int xrab_polygen(int degree, xply_word *ply) { - xply_word msb, mask, f; - - if (degree <= 0 || degree >= XPLYW_BITS) - return -1; - msb = ((xply_word) 1) << degree; - mask = msb - 1; - srand(time(NULL)); - do { - xrab_rndgen(&f); - f = (f & mask) | msb; - } while (!xrab_polyirreducible(f)); - *ply = f; - - return 0; -} - -static int xarb_calc_tu(xply_word poly, int size, xply_word *t, xply_word *u) { - int j, xshift, shift; - xply_word t1, ssh; - - xshift = xrab_fls(poly) - 1; - shift = xshift - 8; - if (shift < 0) - return -1; - t1 = xrab_polymod(0, ((xply_word) 1) << xshift, poly); - for (j = 0; j < 256; j++) - t[j] = xrab_polymmult(j, t1, poly) | ((xply_word) j << xshift); - for (j = 1, ssh = 1; j < size; j++) - ssh = (ssh << 8) ^ t[ssh >> shift]; - for (j = 0; j < 256; j++) - u[j] = xrab_polymmult(j, ssh, poly); - - return 0; -} - -int main(int ac, char **av) { - int i, size = 20, degree = 0, shift; - xply_word ply = 0, t[256], u[256]; - - for (i = 1; i < ac; i++) { - if (strcmp(av[i], "-s") == 0) { - if (++i < ac) - size = atol(av[i]); - } else if (strcmp(av[i], "-p") == 0) { - if (++i < ac) - ply = (xply_word) strtoll(av[i], NULL, 16); - } else if (strcmp(av[i], "-d") == 0) { - if (++i < ac) - degree = atol(av[i]); - } - } - if (degree && (degree < 8 || degree >= XPLYW_BITS)) { - fprintf(stderr, "degree (%d) out of bound for the poly word size (8..%u)\n", - degree, XPLYW_BITS); - return 1; - } - if (degree == 0) - for (degree = XPLYW_BITS - 1; !xrab_isprime(degree); degree--); - if (ply == 0 && xrab_polygen(degree, &ply) < 0) - return 2; - shift = (xrab_fls(ply) - 1) - 8; - fprintf(stderr, "found poly = " XRAB_WORD_PFMT " (shift %d)\n", - ply, shift); - if (xarb_calc_tu(ply, size, t, u) < 0) - return 3; - - fprintf(stdout, "#if defined(XRABPLY_TYPE%d)\n\n", XPLYW_BITS); - fprintf(stdout, "#if !defined(XV%d)\n", XPLYW_BITS); - fprintf(stdout, "#define XV%d(v) ((xply_word) v ## ULL)\n", XPLYW_BITS); - fprintf(stdout, "#endif\n\n"); - fprintf(stdout, "#define XRAB_ROOTPOLY XV%d(" XRAB_WORD_PFMT ")\n\n", - XPLYW_BITS, ply); - fprintf(stdout, "#define XRAB_SHIFT %d\n", shift); - fprintf(stdout, "#define XRAB_WNDSIZE %d\n\n", size); - fprintf(stdout, "typedef unsigned XRABPLY_TYPE%d xply_word;\n\n", XPLYW_BITS); - fprintf(stdout, "static const xply_word T[256] = {\n"); - for (i = 0; i < 256; i++) { - if (i) { - fputs(",", stdout); - if (i % 4 == 0) - fputs("\n\t", stdout); - else - fputs(" ", stdout); - } else - fputs("\t", stdout); - fprintf(stdout, "XV%d(" XRAB_WORD_PFMT ")", XPLYW_BITS, t[i]); - } - fprintf(stdout, "\n};\n\n"); - - fprintf(stdout, "static const xply_word U[256] = {\n"); - for (i = 0; i < 256; i++) { - if (i) { - fputs(",", stdout); - if (i % 4 == 0) - fputs("\n\t", stdout); - else - fputs(" ", stdout); - } else - fputs("\t", stdout); - fprintf(stdout, "XV%d(" XRAB_WORD_PFMT ")", XPLYW_BITS, u[i]); - } - fprintf(stdout, "\n};\n\n"); - - fprintf(stdout, "#endif /* if defined(XRABPLY_TYPE%d) */\n\n", XPLYW_BITS); - - return 0; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.c deleted file mode 100644 index 88024847..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - -/* largest prime smaller than 65536 */ -#define BASE 65521L - -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ -#define NMAX 5552 - - -#define DO1(buf, i) { s1 += buf[i]; s2 += s1; } -#define DO2(buf, i) DO1(buf, i); DO1(buf, i + 1); -#define DO4(buf, i) DO2(buf, i); DO2(buf, i + 2); -#define DO8(buf, i) DO4(buf, i); DO4(buf, i + 4); -#define DO16(buf) DO8(buf, 0); DO8(buf, 8); - - - -unsigned long xdl_adler32(unsigned long adler, unsigned char const *buf, - unsigned int len) { - int k; - unsigned long s1 = adler & 0xffff; - unsigned long s2 = (adler >> 16) & 0xffff; - - if (!buf) - return 1; - - while (len > 0) { - k = len < NMAX ? len :NMAX; - len -= k; - while (k >= 16) { - DO16(buf); - buf += 16; - k -= 16; - } - if (k != 0) - do { - s1 += *buf++; - s2 += s1; - } while (--k); - s1 %= BASE; - s2 %= BASE; - } - - return (s2 << 16) | s1; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.h deleted file mode 100644 index e67e2b25..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xadler32.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XADLER32_H) -#define XADLER32_H - - - -unsigned long xdl_adler32(unsigned long adler, unsigned char const *buf, - unsigned int len); - - - -#endif /* #if !defined(XADLER32_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xalloc.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xalloc.c deleted file mode 100644 index b084d295..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xalloc.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - -static memallocator_t xmalt = {NULL, NULL, NULL}; - - - -int xdl_set_allocator(memallocator_t const *malt) { - xmalt = *malt; - return 0; -} - - -void *xdl_malloc(unsigned int size) { - return xmalt.malloc ? xmalt.malloc(xmalt.priv, size): NULL; -} - - -void xdl_free(void *ptr) { - if (xmalt.free) - xmalt.free(xmalt.priv, ptr); -} - - -void *xdl_realloc(void *ptr, unsigned int size) { - return xmalt.realloc ? xmalt.realloc(xmalt.priv, ptr, size): NULL; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.c deleted file mode 100644 index 3ef28c94..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - -typedef struct s_bdrecord { - struct s_bdrecord *next; - unsigned long fp; - char const *ptr; -} bdrecord_t; - -typedef struct s_bdfile { - char const *data, *top; - chastore_t cha; - unsigned int fphbits; - bdrecord_t **fphash; -} bdfile_t; - - - -static int xdl_prepare_bdfile(mmbuffer_t *mmb, long fpbsize, bdfile_t *bdf) { - unsigned int fphbits; - long i, size, hsize; - char const *base, *data, *top; - bdrecord_t *brec; - bdrecord_t **fphash; - - fphbits = xdl_hashbits((unsigned int) (mmb->size / fpbsize) + 1); - hsize = 1 << fphbits; - if (!(fphash = (bdrecord_t **) xdl_malloc(hsize * sizeof(bdrecord_t *)))) { - - return -1; - } - for (i = 0; i < hsize; i++) - fphash[i] = NULL; - - if (xdl_cha_init(&bdf->cha, sizeof(bdrecord_t), hsize / 4 + 1) < 0) { - - xdl_free(fphash); - return -1; - } - - if (!(size = mmb->size)) { - bdf->data = bdf->top = NULL; - } else { - bdf->data = data = base = mmb->ptr; - bdf->top = top = mmb->ptr + mmb->size; - - if ((data += (size / fpbsize) * fpbsize) == top) - data -= fpbsize; - - for (; data >= base; data -= fpbsize) { - if (!(brec = (bdrecord_t *) xdl_cha_alloc(&bdf->cha))) { - - xdl_cha_free(&bdf->cha); - xdl_free(fphash); - return -1; - } - - brec->fp = xdl_adler32(0, (unsigned char const *) data, - XDL_MIN(fpbsize, (long) (top - data))); - brec->ptr = data; - - i = (long) XDL_HASHLONG(brec->fp, fphbits); - brec->next = fphash[i]; - fphash[i] = brec; - } - } - - bdf->fphbits = fphbits; - bdf->fphash = fphash; - - return 0; -} - - -static void xdl_free_bdfile(bdfile_t *bdf) { - - xdl_free(bdf->fphash); - xdl_cha_free(&bdf->cha); -} - - -unsigned long xdl_mmb_adler32(mmbuffer_t *mmb) { - - return mmb->size ? xdl_adler32(0, (unsigned char const *) mmb->ptr, mmb->size): 0; -} - - -unsigned long xdl_mmf_adler32(mmfile_t *mmf) { - unsigned long fp = 0; - long size; - char const *blk; - - if ((blk = (char const *) xdl_mmfile_first(mmf, &size)) != NULL) { - do { - fp = xdl_adler32(fp, (unsigned char const *) blk, size); - } while ((blk = (char const *) xdl_mmfile_next(mmf, &size)) != NULL); - } - return fp; -} - - -int xdl_bdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, bdiffparam_t const *bdp, xdemitcb_t *ecb) { - long i, rsize, size, bsize, csize, msize, moff; - unsigned long fp; - char const *blk, *base, *data, *top, *ptr1, *ptr2; - bdrecord_t *brec; - bdfile_t bdf; - mmbuffer_t mb[2]; - unsigned char cpybuf[32]; - - if ((bsize = bdp->bsize) < XDL_MIN_BLKSIZE) - bsize = XDL_MIN_BLKSIZE; - if (xdl_prepare_bdfile(mmb1, bsize, &bdf) < 0) { - - return -1; - } - - /* - * Prepare and emit the binary patch file header. It will be used - * to verify that that file being patched matches in size and fingerprint - * the one that generated the patch. - */ - fp = xdl_mmb_adler32(mmb1); - size = mmb1->size; - XDL_LE32_PUT(cpybuf, fp); - XDL_LE32_PUT(cpybuf + 4, size); - - mb[0].ptr = (char *) cpybuf; - mb[0].size = 4 + 4; - - if (ecb->outf(ecb->priv, mb, 1) < 0) { - - xdl_free_bdfile(&bdf); - return -1; - } - - if ((blk = (char const *) mmb2->ptr) != NULL) { - size = mmb2->size; - for (base = data = blk, top = data + size; data < top;) { - rsize = XDL_MIN(bsize, (long) (top - data)); - fp = xdl_adler32(0, (unsigned char const *) data, rsize); - - i = (long) XDL_HASHLONG(fp, bdf.fphbits); - for (msize = 0, brec = bdf.fphash[i]; brec; brec = brec->next) - if (brec->fp == fp) { - csize = XDL_MIN((long) (top - data), (long) (bdf.top - brec->ptr)); - for (ptr1 = brec->ptr, ptr2 = data; csize && *ptr1 == *ptr2; - csize--, ptr1++, ptr2++); - - if ((csize = (long) (ptr1 - brec->ptr)) > msize) { - moff = (long) (brec->ptr - bdf.data); - msize = csize; - } - } - - if (msize < XDL_COPYOP_SIZE) { - data++; - } else { - if (data > base) { - i = (long) (data - base); - if (i > 255) { - cpybuf[0] = XDL_BDOP_INSB; - XDL_LE32_PUT(cpybuf + 1, i); - - mb[0].ptr = (char *) cpybuf; - mb[0].size = XDL_INSBOP_SIZE; - } else { - cpybuf[0] = XDL_BDOP_INS; - cpybuf[1] = (unsigned char) i; - - mb[0].ptr = (char *) cpybuf; - mb[0].size = 2; - } - mb[1].ptr = (char *) base; - mb[1].size = i; - - if (ecb->outf(ecb->priv, mb, 2) < 0) { - - xdl_free_bdfile(&bdf); - return -1; - } - } - - data += msize; - - cpybuf[0] = XDL_BDOP_CPY; - XDL_LE32_PUT(cpybuf + 1, moff); - XDL_LE32_PUT(cpybuf + 5, msize); - - mb[0].ptr = (char *) cpybuf; - mb[0].size = XDL_COPYOP_SIZE; - - if (ecb->outf(ecb->priv, mb, 1) < 0) { - - xdl_free_bdfile(&bdf); - return -1; - } - base = data; - } - } - if (data > base) { - i = (long) (data - base); - if (i > 255) { - cpybuf[0] = XDL_BDOP_INSB; - XDL_LE32_PUT(cpybuf + 1, i); - - mb[0].ptr = (char *) cpybuf; - mb[0].size = XDL_INSBOP_SIZE; - } else { - cpybuf[0] = XDL_BDOP_INS; - cpybuf[1] = (unsigned char) i; - - mb[0].ptr = (char *) cpybuf; - mb[0].size = 2; - } - mb[1].ptr = (char *) base; - mb[1].size = i; - - if (ecb->outf(ecb->priv, mb, 2) < 0) { - - xdl_free_bdfile(&bdf); - return -1; - } - } - } - - xdl_free_bdfile(&bdf); - - return 0; -} - - -int xdl_bdiff(mmfile_t *mmf1, mmfile_t *mmf2, bdiffparam_t const *bdp, xdemitcb_t *ecb) { - mmbuffer_t mmb1, mmb2; - - if (!xdl_mmfile_iscompact(mmf1) || !xdl_mmfile_iscompact(mmf2)) { - - return -1; - } - - if ((mmb1.ptr = (char *) xdl_mmfile_first(mmf1, &mmb1.size)) == NULL) - mmb1.size = 0; - if ((mmb2.ptr = (char *) xdl_mmfile_first(mmf2, &mmb2.size)) == NULL) - mmb2.size = 0; - - return xdl_bdiff_mb(&mmb1, &mmb2, bdp, ecb); -} - - -long xdl_bdiff_tgsize(mmfile_t *mmfp) { - long tgsize = 0, size, off, csize; - char const *blk; - unsigned char const *data, *top; - - if ((blk = (char const *) xdl_mmfile_first(mmfp, &size)) == NULL || - size < XDL_BPATCH_HDR_SIZE) { - - return -1; - } - blk += XDL_BPATCH_HDR_SIZE; - size -= XDL_BPATCH_HDR_SIZE; - - do { - for (data = (unsigned char const *) blk, top = data + size; - data < top;) { - if (*data == XDL_BDOP_INS) { - data++; - csize = (long) *data++; - tgsize += csize; - data += csize; - } else if (*data == XDL_BDOP_INSB) { - data++; - XDL_LE32_GET(data, csize); - data += 4; - tgsize += csize; - data += csize; - } else if (*data == XDL_BDOP_CPY) { - data++; - XDL_LE32_GET(data, off); - data += 4; - XDL_LE32_GET(data, csize); - data += 4; - tgsize += csize; - } else { - - return -1; - } - } - } while ((blk = (char const *) xdl_mmfile_next(mmfp, &size)) != NULL); - - return tgsize; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.h deleted file mode 100644 index ff9da8d6..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbdiff.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XBDIFF_H) -#define XBDIFF_H - - -#define XDL_BPATCH_HDR_SIZE (4 + 4) -#define XDL_MIN_BLKSIZE 16 -#define XDL_INSBOP_SIZE (1 + 4) -#define XDL_COPYOP_SIZE (1 + 4 + 4) - - - -unsigned long xdl_mmb_adler32(mmbuffer_t *mmb); -unsigned long xdl_mmf_adler32(mmfile_t *mmf); - - - -#endif /* #if !defined(XBDIFF_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbpatchi.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbpatchi.c deleted file mode 100644 index 4497b387..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xbpatchi.c +++ /dev/null @@ -1,336 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - -#define XDL_MOBF_MINALLOC 128 - - -typedef struct s_mmoffbuffer { - long off, size; - char *ptr; -} mmoffbuffer_t; - - - -static int xdl_copy_range(mmfile_t *mmf, long off, long size, xdemitcb_t *ecb) { - if (xdl_seek_mmfile(mmf, off) < 0) { - - return -1; - } - if (xdl_copy_mmfile(mmf, size, ecb) != size) { - - return -1; - } - - return 0; -} - - -int xdl_bpatch(mmfile_t *mmf, mmfile_t *mmfp, xdemitcb_t *ecb) { - long size, off, csize, osize; - unsigned long fp, ofp; - char const *blk; - unsigned char const *data, *top; - mmbuffer_t mb; - - if ((blk = (char const *) xdl_mmfile_first(mmfp, &size)) == NULL || - size < XDL_BPATCH_HDR_SIZE) { - - return -1; - } - ofp = xdl_mmf_adler32(mmf); - osize = xdl_mmfile_size(mmf); - XDL_LE32_GET(blk, fp); - XDL_LE32_GET(blk + 4, csize); - if (fp != ofp || csize != osize) { - - return -1; - } - - blk += XDL_BPATCH_HDR_SIZE; - size -= XDL_BPATCH_HDR_SIZE; - - do { - for (data = (unsigned char const *) blk, top = data + size; - data < top;) { - if (*data == XDL_BDOP_INS) { - data++; - - mb.size = (long) *data++; - mb.ptr = (char *) data; - data += mb.size; - - if (ecb->outf(ecb->priv, &mb, 1) < 0) { - - return -1; - } - } else if (*data == XDL_BDOP_INSB) { - data++; - XDL_LE32_GET(data, csize); - data += 4; - - mb.size = csize; - mb.ptr = (char *) data; - data += mb.size; - - if (ecb->outf(ecb->priv, &mb, 1) < 0) { - - return -1; - } - } else if (*data == XDL_BDOP_CPY) { - data++; - XDL_LE32_GET(data, off); - data += 4; - XDL_LE32_GET(data, csize); - data += 4; - - if (xdl_copy_range(mmf, off, csize, ecb) < 0) { - - return -1; - } - } else { - - return -1; - } - } - } while ((blk = (char const *) xdl_mmfile_next(mmfp, &size)) != NULL); - - return 0; -} - - -static unsigned long xdl_mmob_adler32(mmoffbuffer_t *obf, int n) { - unsigned long ha; - - for (ha = 0; n > 0; n--, obf++) - ha = xdl_adler32(ha, (unsigned char const *) obf->ptr, obf->size); - - return ha; -} - - -static long xdl_mmob_size(mmoffbuffer_t *obf, int n) { - - return n > 0 ? obf[n - 1].off + obf[n - 1].size: 0; -} - - -static mmoffbuffer_t *xdl_mmob_new(mmoffbuffer_t **probf, int *pnobf, int *paobf) { - int aobf; - mmoffbuffer_t *cobf, *rrobf; - - if (*pnobf >= *paobf) { - aobf = 2 * (*paobf) + 1; - if ((rrobf = (mmoffbuffer_t *) - xdl_realloc(*probf, aobf * sizeof(mmoffbuffer_t))) == NULL) { - - return NULL; - } - *probf = rrobf; - *paobf = aobf; - } - cobf = (*probf) + (*pnobf); - (*pnobf)++; - - return cobf; -} - - -static int xdl_mmob_find_cntr(mmoffbuffer_t *obf, int n, long off) { - int i, lo, hi; - - for (lo = -1, hi = n; hi - lo > 1;) { - i = (hi + lo) / 2; - if (off < obf[i].off) - hi = i; - else - lo = i; - } - - return (lo >= 0 && off >= obf[lo].off && off < obf[lo].off + obf[lo].size) ? lo: -1; -} - - -static int xdl_bmerge(mmoffbuffer_t *obf, int n, mmbuffer_t *mbfp, mmoffbuffer_t **probf, - int *pnobf) { - int i, aobf, nobf; - long ooff, off, csize; - unsigned long fp, ofp; - unsigned char const *data, *top; - mmoffbuffer_t *robf, *cobf; - - if (mbfp->size < XDL_BPATCH_HDR_SIZE) { - - return -1; - } - data = (unsigned char const *) mbfp->ptr; - top = data + mbfp->size; - - ofp = xdl_mmob_adler32(obf, n); - XDL_LE32_GET(data, fp); - data += 4; - XDL_LE32_GET(data, csize); - data += 4; - if (fp != ofp || csize != xdl_mmob_size(obf, n)) { - - return -1; - } - aobf = XDL_MOBF_MINALLOC; - nobf = 0; - if ((robf = (mmoffbuffer_t *) xdl_malloc(aobf * sizeof(mmoffbuffer_t))) == NULL) { - - return -1; - } - - for (ooff = 0; data < top;) { - if (*data == XDL_BDOP_INS) { - data++; - - if ((cobf = xdl_mmob_new(&robf, &nobf, &aobf)) == NULL) { - - xdl_free(robf); - return -1; - } - cobf->off = ooff; - cobf->size = (long) *data++; - cobf->ptr = (char *) data; - - data += cobf->size; - ooff += cobf->size; - } else if (*data == XDL_BDOP_INSB) { - data++; - XDL_LE32_GET(data, csize); - data += 4; - - if ((cobf = xdl_mmob_new(&robf, &nobf, &aobf)) == NULL) { - - xdl_free(robf); - return -1; - } - cobf->off = ooff; - cobf->size = csize; - cobf->ptr = (char *) data; - - data += cobf->size; - ooff += cobf->size; - } else if (*data == XDL_BDOP_CPY) { - data++; - XDL_LE32_GET(data, off); - data += 4; - XDL_LE32_GET(data, csize); - data += 4; - - if ((i = xdl_mmob_find_cntr(obf, n, off)) < 0) { - - xdl_free(robf); - return -1; - } - off -= obf[i].off; - for (; i < n && csize > 0; i++, off = 0) { - if ((cobf = xdl_mmob_new(&robf, &nobf, &aobf)) == NULL) { - - xdl_free(robf); - return -1; - } - cobf->off = ooff; - cobf->size = XDL_MIN(csize, obf[i].size - off); - cobf->ptr = obf[i].ptr + off; - - ooff += cobf->size; - csize -= cobf->size; - } - if (csize > 0) { - - xdl_free(robf); - return -1; - } - } else { - - xdl_free(robf); - return -1; - } - } - *probf = robf; - *pnobf = nobf; - - return 0; -} - - -static int xdl_bmerge_synt(mmoffbuffer_t *obf, int n, xdemitcb_t *ecb) { - int i; - mmbuffer_t *mb; - - if ((mb = (mmbuffer_t *) xdl_malloc(n * sizeof(mmbuffer_t))) == NULL) { - - return -1; - } - for (i = 0; i < n; i++) { - mb[i].ptr = obf[i].ptr; - mb[i].size = obf[i].size; - } - if (ecb->outf(ecb->priv, mb, n) < 0) { - - xdl_free(mb); - return -1; - } - xdl_free(mb); - - return 0; -} - - -int xdl_bpatch_multi(mmbuffer_t *base, mmbuffer_t *mbpch, int n, xdemitcb_t *ecb) { - int i, nobf, fnobf; - mmoffbuffer_t *obf, *fobf; - - nobf = 1; - if ((obf = (mmoffbuffer_t *) xdl_malloc(nobf * sizeof(mmoffbuffer_t))) == NULL) { - - return -1; - } - obf->off = 0; - obf->ptr = base->ptr; - obf->size = base->size; - for (i = 0; i < n; i++) { - if (xdl_bmerge(obf, nobf, &mbpch[i], &fobf, &fnobf) < 0) { - - xdl_free(obf); - return -1; - } - xdl_free(obf); - - obf = fobf; - nobf = fnobf; - } - if (xdl_bmerge_synt(obf, nobf, ecb) < 0) { - - xdl_free(obf); - return -1; - } - xdl_free(obf); - - return 0; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiff.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiff.h deleted file mode 100644 index 9e42492e..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiff.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XDIFF_H) -#define XDIFF_H - -#ifdef __cplusplus -extern "C" { -#endif /* #ifdef __cplusplus */ - -#ifdef _WIN32 - #ifdef LIBXDIFF_DLL_EXPORT - #define LIBXDIFF_EXPORT __declspec(dllexport) - #else - #define LIBXDIFF_EXPORT __declspec(dllimport) - #endif -#else - #define LIBXDIFF_EXPORT -#endif - -#define XDF_NEED_MINIMAL (1 << 1) - -#define XDL_PATCH_NORMAL '-' -#define XDL_PATCH_REVERSE '+' -#define XDL_PATCH_MODEMASK ((1 << 8) - 1) -#define XDL_PATCH_IGNOREBSPACE (1 << 8) - -#define XDL_MMB_READONLY (1 << 0) - -#define XDL_MMF_ATOMIC (1 << 0) - -#define XDL_BDOP_INS 1 -#define XDL_BDOP_CPY 2 -#define XDL_BDOP_INSB 3 - - - -LIBXDIFF_EXPORT typedef struct s_memallocator { - void *priv; - void *(*malloc)(void *, unsigned int); - void (*free)(void *, void *); - void *(*realloc)(void *, void *, unsigned int); -} memallocator_t; - -LIBXDIFF_EXPORT typedef struct s_mmblock { - struct s_mmblock *next; - unsigned long flags; - long size, bsize; - char *ptr; -} mmblock_t; - -LIBXDIFF_EXPORT typedef struct s_mmfile { - unsigned long flags; - mmblock_t *head, *tail; - long bsize, fsize, rpos; - mmblock_t *rcur, *wcur; -} mmfile_t; - -LIBXDIFF_EXPORT typedef struct s_mmbuffer { - char *ptr; - long size; -} mmbuffer_t; - -LIBXDIFF_EXPORT typedef struct s_xpparam { - unsigned long flags; -} xpparam_t; - -LIBXDIFF_EXPORT typedef struct s_xdemitcb { - void *priv; - int (*outf)(void *, mmbuffer_t *, int); -} xdemitcb_t; - -LIBXDIFF_EXPORT typedef struct s_xdemitconf { - long ctxlen; -} xdemitconf_t; - -LIBXDIFF_EXPORT typedef struct s_bdiffparam { - long bsize; -} bdiffparam_t; - - -LIBXDIFF_EXPORT int xdl_set_allocator(memallocator_t const *malt); -LIBXDIFF_EXPORT void *xdl_malloc(unsigned int size); -LIBXDIFF_EXPORT void xdl_free(void *ptr); -LIBXDIFF_EXPORT void *xdl_realloc(void *ptr, unsigned int size); - -LIBXDIFF_EXPORT int xdl_init_mmfile(mmfile_t *mmf, long bsize, unsigned long flags); -LIBXDIFF_EXPORT void xdl_free_mmfile(mmfile_t *mmf); -LIBXDIFF_EXPORT int xdl_mmfile_iscompact(mmfile_t *mmf); -LIBXDIFF_EXPORT int xdl_seek_mmfile(mmfile_t *mmf, long off); -LIBXDIFF_EXPORT long xdl_read_mmfile(mmfile_t *mmf, void *data, long size); -LIBXDIFF_EXPORT long xdl_write_mmfile(mmfile_t *mmf, void const *data, long size); -LIBXDIFF_EXPORT long xdl_writem_mmfile(mmfile_t *mmf, mmbuffer_t *mb, int nbuf); -LIBXDIFF_EXPORT void *xdl_mmfile_writeallocate(mmfile_t *mmf, long size); -LIBXDIFF_EXPORT long xdl_mmfile_ptradd(mmfile_t *mmf, char *ptr, long size, unsigned long flags); -LIBXDIFF_EXPORT long xdl_copy_mmfile(mmfile_t *mmf, long size, xdemitcb_t *ecb); -LIBXDIFF_EXPORT void *xdl_mmfile_first(mmfile_t *mmf, long *size); -LIBXDIFF_EXPORT void *xdl_mmfile_next(mmfile_t *mmf, long *size); -LIBXDIFF_EXPORT long xdl_mmfile_size(mmfile_t *mmf); -LIBXDIFF_EXPORT int xdl_mmfile_cmp(mmfile_t *mmf1, mmfile_t *mmf2); -LIBXDIFF_EXPORT int xdl_mmfile_compact(mmfile_t *mmfo, mmfile_t *mmfc, long bsize, unsigned long flags); - -LIBXDIFF_EXPORT int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg, xdemitcb_t *ecb); -LIBXDIFF_EXPORT int xdl_patch(mmfile_t *mf, mmfile_t *mfp, int mode, xdemitcb_t *ecb, - xdemitcb_t *rjecb); - -LIBXDIFF_EXPORT int xdl_merge3(mmfile_t *mmfo, mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb, - xdemitcb_t *rjecb); - -LIBXDIFF_EXPORT int xdl_bdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, bdiffparam_t const *bdp, xdemitcb_t *ecb); -LIBXDIFF_EXPORT int xdl_bdiff(mmfile_t *mmf1, mmfile_t *mmf2, bdiffparam_t const *bdp, xdemitcb_t *ecb); -LIBXDIFF_EXPORT int xdl_rabdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, xdemitcb_t *ecb); -LIBXDIFF_EXPORT int xdl_rabdiff(mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb); -LIBXDIFF_EXPORT long xdl_bdiff_tgsize(mmfile_t *mmfp); -LIBXDIFF_EXPORT int xdl_bpatch(mmfile_t *mmf, mmfile_t *mmfp, xdemitcb_t *ecb); -LIBXDIFF_EXPORT int xdl_bpatch_multi(mmbuffer_t *base, mmbuffer_t *mbpch, int n, xdemitcb_t *ecb); - - -#ifdef __cplusplus -} -#endif /* #ifdef __cplusplus */ - -#endif /* #if !defined(XDIFF_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.c deleted file mode 100644 index 8537bc95..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - -#define XDL_MAX_COST_MIN 256 -#define XDL_HEUR_MIN_COST 256 -#define XDL_LINE_MAX (long)((1UL << (8 * sizeof(long) - 1)) - 1) -#define XDL_SNAKE_CNT 20 -#define XDL_K_HEUR 4 - - - -typedef struct s_xdpsplit { - long i1, i2; - int min_lo, min_hi; -} xdpsplit_t; - - - -/* - * See "An O(ND) Difference Algorithm and its Variations", by Eugene Myers. - * Basically considers a "box" (off1, off2, lim1, lim2) and scan from both - * the forward diagonal starting from (off1, off2) and the backward diagonal - * starting from (lim1, lim2). If the K values on the same diagonal crosses - * returns the furthest point of reach. We might end up having to expensive - * cases using this algorithm is full, so a little bit of heuristic is needed - * to cut the search and to return a suboptimal point. - */ -static long xdl_split(unsigned long const *ha1, long off1, long lim1, - unsigned long const *ha2, long off2, long lim2, - long *kvdf, long *kvdb, int need_min, xdpsplit_t *spl, - xdalgoenv_t *xenv) { - long dmin = off1 - lim2, dmax = lim1 - off2; - long fmid = off1 - off2, bmid = lim1 - lim2; - long odd = (fmid - bmid) & 1; - long fmin = fmid, fmax = fmid; - long bmin = bmid, bmax = bmid; - long ec, d, i1, i2, prev1, best, dd, v, k; - - /* - * Set initial diagonal values for both forward and backward path. - */ - kvdf[fmid] = off1; - kvdb[bmid] = lim1; - - for (ec = 1;; ec++) { - int got_snake = 0; - - /* - * We need to extent the diagonal "domain" by one. If the next - * values exits the box boundaries we need to change it in the - * opposite direction because (max - min) must be a power of two. - * Also we initialize the extenal K value to -1 so that we can - * avoid extra conditions check inside the core loop. - */ - if (fmin > dmin) - kvdf[--fmin - 1] = -1; - else - ++fmin; - if (fmax < dmax) - kvdf[++fmax + 1] = -1; - else - --fmax; - - for (d = fmax; d >= fmin; d -= 2) { - if (kvdf[d - 1] >= kvdf[d + 1]) - i1 = kvdf[d - 1] + 1; - else - i1 = kvdf[d + 1]; - prev1 = i1; - i2 = i1 - d; - for (; i1 < lim1 && i2 < lim2 && ha1[i1] == ha2[i2]; i1++, i2++); - if (i1 - prev1 > xenv->snake_cnt) - got_snake = 1; - kvdf[d] = i1; - if (odd && bmin <= d && d <= bmax && kvdb[d] <= i1) { - spl->i1 = i1; - spl->i2 = i2; - spl->min_lo = spl->min_hi = 1; - return ec; - } - } - - /* - * We need to extent the diagonal "domain" by one. If the next - * values exits the box boundaries we need to change it in the - * opposite direction because (max - min) must be a power of two. - * Also we initialize the extenal K value to -1 so that we can - * avoid extra conditions check inside the core loop. - */ - if (bmin > dmin) - kvdb[--bmin - 1] = XDL_LINE_MAX; - else - ++bmin; - if (bmax < dmax) - kvdb[++bmax + 1] = XDL_LINE_MAX; - else - --bmax; - - for (d = bmax; d >= bmin; d -= 2) { - if (kvdb[d - 1] < kvdb[d + 1]) - i1 = kvdb[d - 1]; - else - i1 = kvdb[d + 1] - 1; - prev1 = i1; - i2 = i1 - d; - for (; i1 > off1 && i2 > off2 && ha1[i1 - 1] == ha2[i2 - 1]; i1--, i2--); - if (prev1 - i1 > xenv->snake_cnt) - got_snake = 1; - kvdb[d] = i1; - if (!odd && fmin <= d && d <= fmax && i1 <= kvdf[d]) { - spl->i1 = i1; - spl->i2 = i2; - spl->min_lo = spl->min_hi = 1; - return ec; - } - } - - if (need_min) - continue; - - /* - * If the edit cost is above the heuristic trigger and if - * we got a good snake, we sample current diagonals to see - * if some of the, have reached an "interesting" path. Our - * measure is a function of the distance from the diagonal - * corner (i1 + i2) penalized with the distance from the - * mid diagonal itself. If this value is above the current - * edit cost times a magic factor (XDL_K_HEUR) we consider - * it interesting. - */ - if (got_snake && ec > xenv->heur_min) { - for (best = 0, d = fmax; d >= fmin; d -= 2) { - dd = d > fmid ? d - fmid: fmid - d; - i1 = kvdf[d]; - i2 = i1 - d; - v = (i1 - off1) + (i2 - off2) - dd; - - if (v > XDL_K_HEUR * ec && v > best && - off1 + xenv->snake_cnt <= i1 && i1 < lim1 && - off2 + xenv->snake_cnt <= i2 && i2 < lim2) { - for (k = 1; ha1[i1 - k] == ha2[i2 - k]; k++) - if (k == xenv->snake_cnt) { - best = v; - spl->i1 = i1; - spl->i2 = i2; - break; - } - } - } - if (best > 0) { - spl->min_lo = 1; - spl->min_hi = 0; - return ec; - } - - for (best = 0, d = bmax; d >= bmin; d -= 2) { - dd = d > bmid ? d - bmid: bmid - d; - i1 = kvdb[d]; - i2 = i1 - d; - v = (lim1 - i1) + (lim2 - i2) - dd; - - if (v > XDL_K_HEUR * ec && v > best && - off1 < i1 && i1 <= lim1 - xenv->snake_cnt && - off2 < i2 && i2 <= lim2 - xenv->snake_cnt) { - for (k = 0; ha1[i1 + k] == ha2[i2 + k]; k++) - if (k == xenv->snake_cnt - 1) { - best = v; - spl->i1 = i1; - spl->i2 = i2; - break; - } - } - } - if (best > 0) { - spl->min_lo = 0; - spl->min_hi = 1; - return ec; - } - } - - /* - * Enough is enough. We spent too much time here and now we collect - * the furthest reaching path using the (i1 + i2) measure. - */ - if (ec >= xenv->mxcost) { - long fbest, fbest1, bbest, bbest1; - - fbest = -1; - for (d = fmax; d >= fmin; d -= 2) { - i1 = XDL_MIN(kvdf[d], lim1); - i2 = i1 - d; - if (lim2 < i2) - i1 = lim2 + d, i2 = lim2; - if (fbest < i1 + i2) { - fbest = i1 + i2; - fbest1 = i1; - } - } - - bbest = XDL_LINE_MAX; - for (d = bmax; d >= bmin; d -= 2) { - i1 = XDL_MAX(off1, kvdb[d]); - i2 = i1 - d; - if (i2 < off2) - i1 = off2 + d, i2 = off2; - if (i1 + i2 < bbest) { - bbest = i1 + i2; - bbest1 = i1; - } - } - - if ((lim1 + lim2) - bbest < fbest - (off1 + off2)) { - spl->i1 = fbest1; - spl->i2 = fbest - fbest1; - spl->min_lo = 1; - spl->min_hi = 0; - } else { - spl->i1 = bbest1; - spl->i2 = bbest - bbest1; - spl->min_lo = 0; - spl->min_hi = 1; - } - return ec; - } - } - - return -1; -} - - -/* - * Rule: "Divide et Impera". Recursively split the box in sub-boxes by calling - * the box splitting function. Note that the real job (marking changed lines) - * is done in the two boundary reaching checks. - */ -int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1, - diffdata_t *dd2, long off2, long lim2, - long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv) { - unsigned long const *ha1 = dd1->ha, *ha2 = dd2->ha; - - /* - * Shrink the box by walking through each diagonal snake (SW and NE). - */ - for (; off1 < lim1 && off2 < lim2 && ha1[off1] == ha2[off2]; off1++, off2++); - for (; off1 < lim1 && off2 < lim2 && ha1[lim1 - 1] == ha2[lim2 - 1]; lim1--, lim2--); - - /* - * If one dimension is empty, then all records on the other one must - * be obviously changed. - */ - if (off1 == lim1) { - char *rchg2 = dd2->rchg; - long *rindex2 = dd2->rindex; - - for (; off2 < lim2; off2++) - rchg2[rindex2[off2]] = 1; - } else if (off2 == lim2) { - char *rchg1 = dd1->rchg; - long *rindex1 = dd1->rindex; - - for (; off1 < lim1; off1++) - rchg1[rindex1[off1]] = 1; - } else { - long ec; - xdpsplit_t spl; - - /* - * Divide ... - */ - if ((ec = xdl_split(ha1, off1, lim1, ha2, off2, lim2, kvdf, kvdb, - need_min, &spl, xenv)) < 0) { - - return -1; - } - - /* - * ... et Impera. - */ - if (xdl_recs_cmp(dd1, off1, spl.i1, dd2, off2, spl.i2, - kvdf, kvdb, spl.min_lo, xenv) < 0 || - xdl_recs_cmp(dd1, spl.i1, lim1, dd2, spl.i2, lim2, - kvdf, kvdb, spl.min_hi, xenv) < 0) { - - return -1; - } - } - - return 0; -} - - -int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *xe) { - long ndiags; - long *kvd, *kvdf, *kvdb; - xdalgoenv_t xenv; - diffdata_t dd1, dd2; - - if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0) { - - return -1; - } - - /* - * Allocate and setup K vectors to be used by the differential algorithm. - * One is to store the forward path and one to store the backward path. - */ - ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3; - if (!(kvd = (long *) xdl_malloc((2 * ndiags + 2) * sizeof(long)))) { - - xdl_free_env(xe); - return -1; - } - kvdf = kvd; - kvdb = kvdf + ndiags; - kvdf += xe->xdf2.nreff + 1; - kvdb += xe->xdf2.nreff + 1; - - xenv.mxcost = xdl_bogosqrt(ndiags); - if (xenv.mxcost < XDL_MAX_COST_MIN) - xenv.mxcost = XDL_MAX_COST_MIN; - xenv.snake_cnt = XDL_SNAKE_CNT; - xenv.heur_min = XDL_HEUR_MIN_COST; - - dd1.nrec = xe->xdf1.nreff; - dd1.ha = xe->xdf1.ha; - dd1.rchg = xe->xdf1.rchg; - dd1.rindex = xe->xdf1.rindex; - dd2.nrec = xe->xdf2.nreff; - dd2.ha = xe->xdf2.ha; - dd2.rchg = xe->xdf2.rchg; - dd2.rindex = xe->xdf2.rindex; - - if (xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec, - kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0, &xenv) < 0) { - - xdl_free(kvd); - xdl_free_env(xe); - return -1; - } - - xdl_free(kvd); - - return 0; -} - - -static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1, long chg2) { - xdchange_t *xch; - - if (!(xch = (xdchange_t *) xdl_malloc(sizeof(xdchange_t)))) - return NULL; - - xch->next = xscr; - xch->i1 = i1; - xch->i2 = i2; - xch->chg1 = chg1; - xch->chg2 = chg2; - - return xch; -} - - -static int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo) { - long ix, ixo, ixs, ixref, grpsiz, nrec = xdf->nrec; - char *rchg = xdf->rchg, *rchgo = xdfo->rchg; - xrecord_t **recs = xdf->recs; - - /* - * This is the same of what GNU diff does. Move back and forward - * change groups for a consistent and pretty diff output. This also - * helps in finding joineable change groups and reduce the diff size. - */ - for (ix = ixo = 0;;) { - /* - * Find the first changed line in the to-be-compacted file. - * We need to keep track of both indexes, so if we find a - * changed lines group on the other file, while scanning the - * to-be-compacted file, we need to skip it properly. Note - * that loops that are testing for changed lines on rchg* do - * not need index bounding since the array is prepared with - * a zero at position -1 and N. - */ - for (; ix < nrec && !rchg[ix]; ix++) - while (rchgo[ixo++]); - if (ix == nrec) - break; - - /* - * Record the start of a changed-group in the to-be-compacted file - * and find the end of it, on both to-be-compacted and other file - * indexes (ix and ixo). - */ - ixs = ix; - for (ix++; rchg[ix]; ix++); - for (; rchgo[ixo]; ixo++); - - do { - grpsiz = ix - ixs; - - /* - * If the line before the current change group, is equal to - * the last line of the current change group, shift backward - * the group. - */ - while (ixs > 0 && recs[ixs - 1]->ha == recs[ix - 1]->ha && - XDL_RECMATCH(recs[ixs - 1], recs[ix - 1])) { - rchg[--ixs] = 1; - rchg[--ix] = 0; - - /* - * This change might have joined two change groups, - * so we try to take this scenario in account by moving - * the start index accordingly (and so the other-file - * end-of-group index). - */ - for (; rchg[ixs - 1]; ixs--); - while (rchgo[--ixo]); - } - - /* - * Record the end-of-group position in case we are matched - * with a group of changes in the other file (that is, the - * change record before the enf-of-group index in the other - * file is set). - */ - ixref = rchgo[ixo - 1] ? ix: nrec; - - /* - * If the first line of the current change group, is equal to - * the line next of the current change group, shift forward - * the group. - */ - while (ix < nrec && recs[ixs]->ha == recs[ix]->ha && - XDL_RECMATCH(recs[ixs], recs[ix])) { - rchg[ixs++] = 0; - rchg[ix++] = 1; - - /* - * This change might have joined two change groups, - * so we try to take this scenario in account by moving - * the start index accordingly (and so the other-file - * end-of-group index). Keep tracking the reference - * index in case we are shifting together with a - * corresponding group of changes in the other file. - */ - for (; rchg[ix]; ix++); - while (rchgo[++ixo]) - ixref = ix; - } - } while (grpsiz != ix - ixs); - - /* - * Try to move back the possibly merged group of changes, to match - * the recorded postion in the other file. - */ - while (ixref < ix) { - rchg[--ixs] = 1; - rchg[--ix] = 0; - while (rchgo[--ixo]); - } - } - - return 0; -} - - -int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) { - xdchange_t *cscr = NULL, *xch; - char *rchg1 = xe->xdf1.rchg, *rchg2 = xe->xdf2.rchg; - long i1, i2, l1, l2; - - /* - * Trivial. Collects "groups" of changes and creates an edit script. - */ - for (i1 = xe->xdf1.nrec, i2 = xe->xdf2.nrec; i1 >= 0 || i2 >= 0; i1--, i2--) - if (rchg1[i1 - 1] || rchg2[i2 - 1]) { - for (l1 = i1; rchg1[i1 - 1]; i1--); - for (l2 = i2; rchg2[i2 - 1]; i2--); - - if (!(xch = xdl_add_change(cscr, i1, i2, l1 - i1, l2 - i2))) { - xdl_free_script(cscr); - return -1; - } - cscr = xch; - } - - *xscr = cscr; - - return 0; -} - - -void xdl_free_script(xdchange_t *xscr) { - xdchange_t *xch; - - while ((xch = xscr) != NULL) { - xscr = xscr->next; - xdl_free(xch); - } -} - - -int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdemitconf_t const *xecfg, xdemitcb_t *ecb) { - xdchange_t *xscr; - xdfenv_t xe; - - if (xdl_do_diff(mf1, mf2, xpp, &xe) < 0) { - - return -1; - } - if (xdl_change_compact(&xe.xdf1, &xe.xdf2) < 0 || - xdl_change_compact(&xe.xdf2, &xe.xdf1) < 0 || - xdl_build_script(&xe, &xscr) < 0) { - - xdl_free_env(&xe); - return -1; - } - if (xscr) { - if (xdl_emit_diff(&xe, xscr, ecb, xecfg) < 0) { - - xdl_free_script(xscr); - xdl_free_env(&xe); - return -1; - } - xdl_free_script(xscr); - } - xdl_free_env(&xe); - - return 0; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.h deleted file mode 100644 index dd8f3c98..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xdiffi.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XDIFFI_H) -#define XDIFFI_H - - -typedef struct s_diffdata { - long nrec; - unsigned long const *ha; - long *rindex; - char *rchg; -} diffdata_t; - -typedef struct s_xdalgoenv { - long mxcost; - long snake_cnt; - long heur_min; -} xdalgoenv_t; - -typedef struct s_xdchange { - struct s_xdchange *next; - long i1, i2; - long chg1, chg2; -} xdchange_t; - - - -int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1, - diffdata_t *dd2, long off2, long lim2, - long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv); -int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *xe); -int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr); -void xdl_free_script(xdchange_t *xscr); -int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg); - - -#endif /* #if !defined(XDIFFI_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.c deleted file mode 100644 index 51580aa6..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - -static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec) { - - *rec = xdf->recs[ri]->ptr; - - return xdf->recs[ri]->size; -} - - -static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb) { - long size, psize = strlen(pre); - char const *rec; - - size = xdl_get_rec(xdf, ri, &rec); - if (xdl_emit_diffrec(rec, size, pre, psize, ecb) < 0) { - - return -1; - } - - return 0; -} - - -/* - * Starting at the passed change atom, find the latest change atom to be included - * inside the differential hunk according to the specified configuration. - */ -static xdchange_t *xdl_get_hunk(xdchange_t *xscr, xdemitconf_t const *xecfg) { - xdchange_t *xch, *xchp; - - for (xchp = xscr, xch = xscr->next; xch; xchp = xch, xch = xch->next) - if (xch->i1 - (xchp->i1 + xchp->chg1) > 2 * xecfg->ctxlen) - break; - - return xchp; -} - - -int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg) { - long s1, s2, e1, e2, lctx; - xdchange_t *xch, *xche; - - for (xch = xche = xscr; xch; xch = xche->next) { - xche = xdl_get_hunk(xch, xecfg); - - s1 = XDL_MAX(xch->i1 - xecfg->ctxlen, 0); - s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0); - - lctx = xecfg->ctxlen; - lctx = XDL_MIN(lctx, xe->xdf1.nrec - (xche->i1 + xche->chg1)); - lctx = XDL_MIN(lctx, xe->xdf2.nrec - (xche->i2 + xche->chg2)); - - e1 = xche->i1 + xche->chg1 + lctx; - e2 = xche->i2 + xche->chg2 + lctx; - - /* - * Emit current hunk header. - */ - if (xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2, ecb) < 0) - return -1; - - /* - * Emit pre-context. - */ - for (; s1 < xch->i1; s1++) - if (xdl_emit_record(&xe->xdf1, s1, " ", ecb) < 0) - return -1; - - for (s1 = xch->i1, s2 = xch->i2;; xch = xch->next) { - /* - * Merge previous with current change atom. - */ - for (; s1 < xch->i1 && s2 < xch->i2; s1++, s2++) - if (xdl_emit_record(&xe->xdf1, s1, " ", ecb) < 0) - return -1; - - /* - * Removes lines from the first file. - */ - for (s1 = xch->i1; s1 < xch->i1 + xch->chg1; s1++) - if (xdl_emit_record(&xe->xdf1, s1, "-", ecb) < 0) - return -1; - - /* - * Adds lines from the second file. - */ - for (s2 = xch->i2; s2 < xch->i2 + xch->chg2; s2++) - if (xdl_emit_record(&xe->xdf2, s2, "+", ecb) < 0) - return -1; - - if (xch == xche) - break; - s1 = xch->i1 + xch->chg1; - s2 = xch->i2 + xch->chg2; - } - - /* - * Emit post-context. - */ - for (s1 = xche->i1 + xche->chg1; s1 < e1; s1++) - if (xdl_emit_record(&xe->xdf1, s1, " ", ecb) < 0) - return -1; - } - - return 0; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.h deleted file mode 100644 index e629417d..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xemit.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XEMIT_H) -#define XEMIT_H - - - -int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg); - - - -#endif /* #if !defined(XEMIT_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xinclude.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xinclude.h deleted file mode 100644 index bd22cd22..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xinclude.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XINCLUDE_H) -#define XINCLUDE_H - - -#if defined(HAVE_WINCONFIG_H) -#include "winconfig.h" -#endif /* #if defined(HAVE_CONFIG_H) */ - -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif /* #if defined(HAVE_CONFIG_H) */ - -#if defined(HAVE_STDIO_H) -#include -#endif /* #if defined(HAVE_STDIO_H) */ - -#if defined(HAVE_STDLIB_H) -#include -#endif /* #if defined(HAVE_STDLIB_H) */ - -#if defined(HAVE_UNISTD_H) -#include -#endif /* #if defined(HAVE_UNISTD_H) */ - -#if defined(HAVE_STRING_H) -#include -#endif /* #if defined(HAVE_STRING_H) */ - -#if defined(HAVE_LIMITS_H) -#include -#endif /* #if defined(HAVE_LIMITS_H) */ - - - -#include "xmacros.h" -#include "xmissing.h" -#include "xdiff.h" -#include "xtypes.h" -#include "xutils.h" -#include "xadler32.h" -#include "xprepare.h" -#include "xdiffi.h" -#include "xemit.h" -#include "xbdiff.h" - - - -#endif /* #if !defined(XINCLUDE_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmacros.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmacros.h deleted file mode 100644 index 43607f17..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmacros.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XMACROS_H) -#define XMACROS_H - - -#define XDL_MIN(a, b) ((a) < (b) ? (a): (b)) -#define XDL_MAX(a, b) ((a) > (b) ? (a): (b)) -#define XDL_ABS(v) ((v) >= 0 ? (v): -(v)) -#define XDL_ISDIGIT(c) ((c) >= '0' && (c) <= '9') -#define XDL_ADDBITS(v, b) ((v) + ((v) >> (b))) -#define XDL_MASKBITS(b) ((1UL << (b)) - 1) -#define XDL_HASHLONG(v, b) (XDL_ADDBITS((unsigned long) (v), b) & XDL_MASKBITS(b)) -#define XDL_PTRFREE(p) do { if (p) { xdl_free(p); (p) = NULL; } } while (0) -#define XDL_RECMATCH(r1, r2) ((r1)->size == (r2)->size && memcmp((r1)->ptr, (r2)->ptr, (r1)->size) == 0) -#define XDL_LE32_PUT(p, v) do { \ - unsigned char *__p = (unsigned char *) (p); \ - *__p++ = (unsigned char) (v); \ - *__p++ = (unsigned char) ((v) >> 8); \ - *__p++ = (unsigned char) ((v) >> 16); \ - *__p = (unsigned char) ((v) >> 24); \ -} while (0) -#define XDL_LE32_GET(p, v) do { \ - unsigned char const *__p = (unsigned char const *) (p); \ - (v) = (unsigned long) __p[0] | ((unsigned long) __p[1]) << 8 | \ - ((unsigned long) __p[2]) << 16 | ((unsigned long) __p[3]) << 24; \ -} while (0) - - -#endif /* #if !defined(XMACROS_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmerge3.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmerge3.c deleted file mode 100644 index 6f7cf7b7..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmerge3.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - -#define XDL_MERGE3_BLKSIZE (1024 * 8) -#define XDL_MERGE3_CTXLEN 3 - - - -int xdl_merge3(mmfile_t *mmfo, mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb, - xdemitcb_t *rjecb) { - xpparam_t xpp; - xdemitconf_t xecfg; - xdemitcb_t xecb; - mmfile_t mmfp; - - if (xdl_init_mmfile(&mmfp, XDL_MERGE3_BLKSIZE, XDL_MMF_ATOMIC) < 0) { - - return -1; - } - - xpp.flags = 0; - - xecfg.ctxlen = XDL_MERGE3_CTXLEN; - - xecb.priv = &mmfp; - xecb.outf = xdl_mmfile_outf; - - if (xdl_diff(mmfo, mmf2, &xpp, &xecfg, &xecb) < 0) { - - xdl_free_mmfile(&mmfp); - return -1; - } - - if (xdl_patch(mmf1, &mmfp, XDL_PATCH_NORMAL, ecb, rjecb) < 0) { - - xdl_free_mmfile(&mmfp); - return -1; - } - - xdl_free_mmfile(&mmfp); - - return 0; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.c deleted file mode 100644 index cefe3362..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - -#if !defined(HAVE_MEMCHR) - -void *memchr(void const *p, int c, long n) { - char const *pc = p; - - for (; n; n--, pc++) - if (*pc == (char) c) - return pc; - return NULL; -} - -#endif /* #if !defined(HAVE_MEMCHR) */ - - -#if !defined(HAVE_MEMCMP) - -int memcmp(void const *p1, void const *p2, long n) { - char const *pc1 = p1, *pc2 = p2; - - for (; n; n--, pc1++, pc2++) - if (*pc1 != *pc2) - return *pc1 - *pc2; - return 0; -} - -#endif /* #if !defined(HAVE_MEMCMP) */ - - -#if !defined(HAVE_MEMCPY) - -void *memcpy(void *d, void const *s, long n) { - char *dc = d; - char const *sc = s; - - for (; n; n--, dc++, sc++) - *dc = *sc; - return d; -} - -#endif /* #if !defined(HAVE_MEMCPY) */ - - -#if !defined(HAVE_MEMSET) - -void *memset(void *d, int c, long n) { - char *dc = d; - - for (; n; n--, dc++) - *dc = (char) c; - return d; -} - -#endif /* #if !defined(HAVE_MEMSET) */ - - -#if !defined(HAVE_STRLEN) - -long strlen(char const *s) { - char const *tmp; - - for (tmp = s; *s; s++); - return (long) (s - tmp); -} - -#endif /* #if !defined(HAVE_STRLEN) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.h deleted file mode 100644 index 8fcb050e..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xmissing.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XMISSING_H) -#define XMISSING_H - - -#if !defined(CHAR_BIT) -#define CHAR_BIT 8 -#endif /* #if !defined(CHAR_BIT) */ - - - -#if !defined(HAVE_MEMCHR) -void *memchr(void const *p, int c, long n); -#endif /* #if !defined(HAVE_MEMCHR) */ - -#if !defined(HAVE_MEMCMP) -int memcmp(void const *p1, void const *p2, long n); -#endif /* #if !defined(HAVE_MEMCMP) */ - -#if !defined(HAVE_MEMCPY) -void *memcpy(void *d, void const *s, long n); -#endif /* #if !defined(HAVE_MEMCPY) */ - -#if !defined(HAVE_MEMSET) -void *memset(void *d, int c, long n); -#endif /* #if !defined(HAVE_MEMSET) */ - -#if !defined(HAVE_STRLEN) -long strlen(char const *s); -#endif /* #if !defined(HAVE_STRLEN) */ - - - -#endif /* #if !defined(XMISSING_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xpatchi.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xpatchi.c deleted file mode 100644 index dc984f83..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xpatchi.c +++ /dev/null @@ -1,641 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - -#define XDL_MAX_FUZZ 3 -#define XDL_MIN_SYNCLINES 4 - - - -typedef struct s_recinfo { - char const *ptr; - long size; -} recinfo_t; - -typedef struct s_recfile { - mmfile_t *mf; - long nrec; - recinfo_t *recs; -} recfile_t; - -typedef struct s_hunkinfo { - long s1, s2; - long c1, c2; - long cmn, radd, rdel, pctx, sctx; -} hunkinfo_t; - -typedef struct s_patchstats { - long adds, dels; -} patchstats_t; - -typedef struct s_patch { - recfile_t rf; - hunkinfo_t hi; - long hkrec; - long hklen; - long flags; - patchstats_t ps; - int fuzzies; -} patch_t; - - - - -static int xdl_load_hunk_info(char const *line, long size, hunkinfo_t *hki); -static int xdl_init_recfile(mmfile_t *mf, int ispatch, recfile_t *rf); -static void xdl_free_recfile(recfile_t *rf); -static char const *xdl_recfile_get(recfile_t *rf, long irec, long *size); -static int xdl_init_patch(mmfile_t *mf, long flags, patch_t *pch); -static void xdl_free_patch(patch_t *pch); -static int xdl_load_hunk(patch_t *pch, long hkrec); -static int xdl_first_hunk(patch_t *pch); -static int xdl_next_hunk(patch_t *pch); -static int xdl_line_match(patch_t *pch, const char *s, long ns, char const *m, long nm); -static int xdl_hunk_match(recfile_t *rf, long irec, patch_t *pch, int mode, int fuzz); -static int xdl_find_hunk(recfile_t *rf, long ibase, patch_t *pch, int mode, - int fuzz, long *hkpos, int *exact); -static int xdl_emit_rfile_line(recfile_t *rf, long line, xdemitcb_t *ecb); -static int xdl_flush_section(recfile_t *rf, long start, long top, xdemitcb_t *ecb); -static int xdl_apply_hunk(recfile_t *rf, long hkpos, patch_t *pch, int mode, - long *ibase, xdemitcb_t *ecb); -static int xdl_reject_hunk(recfile_t *rf, patch_t *pch, int mode, - xdemitcb_t *rjecb); -static int xdl_process_hunk(recfile_t *rff, patch_t *pch, long *ibase, int mode, - xdemitcb_t *ecb, xdemitcb_t *rjecb); - - - - -static int xdl_load_hunk_info(char const *line, long size, hunkinfo_t *hki) { - char const *next; - - /* - * The diff header format should be: - * - * @@ -OP,OC +NP,NC @@ - * - * Unfortunately some software avoid to emit OP or/and NP in case - * of not existing old or new file (it should be mitted as zero). - * We need to handle both syntaxes. - */ - if (memcmp(line, "@@ -", 4)) - return -1; - line += 4; - size -= 4; - - if (!size || !XDL_ISDIGIT(*line)) - return -1; - hki->s1 = xdl_atol(line, &next); - size -= next - line; - line = next; - if (!size) - return -1; - if (*line == ',') { - size--, line++; - if (!size || !XDL_ISDIGIT(*line)) - return -1; - hki->c1 = xdl_atol(line, &next); - size -= next - line; - line = next; - if (!size || *line != ' ') - return -1; - size--, line++; - } else if (*line == ' ') { - size--, line++; - hki->c1 = hki->s1; - hki->s1 = 0; - } else - return -1; - - if (!size || *line != '+') - return -1; - size--, line++; - if (!size || !XDL_ISDIGIT(*line)) - return -1; - hki->s2 = xdl_atol(line, &next); - size -= next - line; - line = next; - if (!size) - return -1; - if (*line == ',') { - size--, line++; - if (!size || !XDL_ISDIGIT(*line)) - return -1; - hki->c2 = xdl_atol(line, &next); - size -= next - line; - line = next; - if (!size || *line != ' ') - return -1; - size--, line++; - } else if (*line == ' ') { - size--, line++; - hki->c2 = hki->s2; - hki->s2 = 0; - } else - return -1; - if (size < 2 || memcmp(line, "@@", 2) != 0) - return -1; - - /* - * We start from zero, so decrement by one unless it's the special position - * '0' inside the unified diff (new or deleted file). - */ - if (hki->s1 > 0 && hki->c1 > 0) - hki->s1--; - if (hki->s2 > 0 && hki->c2 > 0) - hki->s2--; - - return 0; -} - - -static int xdl_init_recfile(mmfile_t *mf, int ispatch, recfile_t *rf) { - long narec, nrec, bsize; - recinfo_t *recs, *rrecs; - char const *blk, *cur, *top, *eol; - - narec = xdl_guess_lines(mf); - if (!(recs = (recinfo_t *) xdl_malloc(narec * sizeof(recinfo_t)))) { - - return -1; - } - nrec = 0; - if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) { - for (top = blk + bsize;;) { - if (cur >= top) { - if (!(cur = blk = xdl_mmfile_next(mf, &bsize))) - break; - top = blk + bsize; - } - if (nrec >= narec) { - narec *= 2; - if (!(rrecs = (recinfo_t *) - xdl_realloc(recs, narec * sizeof(recinfo_t)))) { - - xdl_free(recs); - return -1; - } - recs = rrecs; - } - recs[nrec].ptr = cur; - if (!(eol = memchr(cur, '\n', top - cur))) - eol = top - 1; - recs[nrec].size = (long) (eol - cur) + 1; - if (ispatch && *cur == '\\' && nrec > 0 && recs[nrec - 1].size > 0 && - recs[nrec - 1].ptr[recs[nrec - 1].size - 1] == '\n') - recs[nrec - 1].size--; - else - nrec++; - cur = eol + 1; - } - } - rf->mf = mf; - rf->nrec = nrec; - rf->recs = recs; - - return 0; -} - - -static void xdl_free_recfile(recfile_t *rf) { - - xdl_free(rf->recs); -} - - -static char const *xdl_recfile_get(recfile_t *rf, long irec, long *size) { - - if (irec < 0 || irec >= rf->nrec) - return NULL; - *size = rf->recs[irec].size; - - return rf->recs[irec].ptr; -} - - -static int xdl_init_patch(mmfile_t *mf, long flags, patch_t *pch) { - - if (xdl_init_recfile(mf, 1, &pch->rf) < 0) { - - return -1; - } - pch->hkrec = 0; - pch->hklen = 0; - pch->flags = flags; - pch->ps.adds = pch->ps.dels = 0; - pch->fuzzies = 0; - - return 0; -} - - -static void xdl_free_patch(patch_t *pch) { - - xdl_free_recfile(&pch->rf); -} - - -static int xdl_load_hunk(patch_t *pch, long hkrec) { - long size, i, nb; - char const *line; - - for (;; hkrec++) { - pch->hkrec = hkrec; - if (!(line = xdl_recfile_get(&pch->rf, pch->hkrec, &size))) - return 0; - if (*line == '@') - break; - } - if (xdl_load_hunk_info(line, size, &pch->hi) < 0) { - - return -1; - } - pch->hi.cmn = pch->hi.radd = pch->hi.rdel = pch->hi.pctx = pch->hi.sctx = 0; - for (i = pch->hkrec + 1, nb = 0; - (line = xdl_recfile_get(&pch->rf, i, &size)) != NULL; i++) { - if (*line == '@' || *line == '\n') - break; - if (*line == ' ') { - nb++; - pch->hi.cmn++; - } else if (*line == '+') { - if (pch->hi.radd + pch->hi.rdel == 0) - pch->hi.pctx = nb; - nb = 0; - pch->hi.radd++; - } else if (*line == '-') { - if (pch->hi.radd + pch->hi.rdel == 0) - pch->hi.pctx = nb; - nb = 0; - pch->hi.rdel++; - } else { - - return -1; - } - } - pch->hi.sctx = nb; - if (pch->hi.cmn + pch->hi.radd != pch->hi.c2 || - pch->hi.cmn + pch->hi.rdel != pch->hi.c1) { - - return -1; - } - pch->hklen = i - pch->hkrec - 1; - - return 1; -} - - -static int xdl_first_hunk(patch_t *pch) { - - return xdl_load_hunk(pch, 0); -} - - -static int xdl_next_hunk(patch_t *pch) { - - return xdl_load_hunk(pch, pch->hkrec + pch->hklen + 1); -} - - -static int xdl_line_match(patch_t *pch, const char *s, long ns, char const *m, long nm) { - - for (; ns > 0 && (s[ns - 1] == '\r' || s[ns - 1] == '\n'); ns--); - for (; nm > 0 && (m[nm - 1] == '\r' || m[nm - 1] == '\n'); nm--); - if (pch->flags & XDL_PATCH_IGNOREBSPACE) { - for (; ns > 0 && (*s == ' ' || *s == '\t'); ns--, s++); - for (; ns > 0 && (s[ns - 1] == ' ' || s[ns - 1] == '\t'); ns--); - for (; nm > 0 && (*m == ' ' || *m == '\t'); nm--, m++); - for (; nm > 0 && (m[nm - 1] == ' ' || m[nm - 1] == '\t'); nm--); - } - - return ns == nm && memcmp(s, m, ns) == 0; -} - - -static int xdl_hunk_match(recfile_t *rf, long irec, patch_t *pch, int mode, int fuzz) { - long i, j, z, fsize, psize, ptop, pfuzz, sfuzz, misses; - char const *fline, *pline; - - /* - * Limit fuzz to not be greater than the prefix and suffix context. - */ - pfuzz = fuzz < pch->hi.pctx ? fuzz: pch->hi.pctx; - sfuzz = fuzz < pch->hi.sctx ? fuzz: pch->hi.sctx; - - /* - * First loop through the prefix fuzz area. In this loop we simply - * note mismatching lines. We allow missing lines here, that is, - * some prefix context lines are missing. - */ - for (z = pfuzz, misses = 0, i = irec, j = pch->hkrec + 1, - ptop = pch->hkrec + 1 + pch->hklen - sfuzz; - z > 0 && i < rf->nrec && j < ptop; i++, j++, z--) { - if (!(pline = xdl_recfile_get(&pch->rf, j, &psize))) - return 0; - if (!(fline = xdl_recfile_get(rf, i, &fsize)) || - !xdl_line_match(pch, fline, fsize, pline + 1, psize - 1)) - misses++; - } - if (misses > fuzz) - return 0; - - /* - * Strict match loop. - */ - for (; i < rf->nrec && j < ptop; i++, j++) { - for (; j < ptop; j++) { - if (!(pline = xdl_recfile_get(&pch->rf, j, &psize))) - return 0; - if (*pline == ' ' || *pline == mode) - break; - } - if (j == ptop) - break; - if (!(fline = xdl_recfile_get(rf, i, &fsize)) || - !xdl_line_match(pch, fline, fsize, pline + 1, psize - 1)) - return 0; - } - for (; j < ptop; j++) - if (!(pline = xdl_recfile_get(&pch->rf, j, &psize)) || - *pline == ' ' || *pline == mode) - return 0; - - /* - * Finally loop through the suffix fuzz area. In this loop we simply - * note mismatching lines. We allow missing lines here, that is, - * some suffix context lines are missing. - */ - for (z = sfuzz; z > 0 && i < rf->nrec; i++, j++, z--) { - if (!(pline = xdl_recfile_get(&pch->rf, j, &psize))) - return 0; - if (!(fline = xdl_recfile_get(rf, i, &fsize)) || - !xdl_line_match(pch, fline, fsize, pline + 1, psize - 1)) - misses++; - } - - return misses <= fuzz; -} - - -static int xdl_find_hunk(recfile_t *rf, long ibase, patch_t *pch, int mode, - int fuzz, long *hkpos, int *exact) { - long hpos, hlen, i, j; - long pos[2]; - - hpos = mode == '-' ? pch->hi.s1: pch->hi.s2; - hlen = mode == '-' ? pch->hi.cmn + pch->hi.rdel: pch->hi.cmn + pch->hi.radd; - if (xdl_hunk_match(rf, hpos, pch, mode, fuzz)) { - *hkpos = hpos; - *exact = 1; - return 1; - } - for (i = 1;; i++) { - /* - * We allow a negative starting hunk position, up to the - * number of prefix context lines. - */ - j = 0; - if (hpos - i >= ibase - pch->hi.pctx) - pos[j++] = hpos - i; - if (hpos + i + hlen <= rf->nrec) - pos[j++] = hpos + i; - if (!j) - break; - for (j--; j >= 0; j--) - if (xdl_hunk_match(rf, pos[j], pch, mode, fuzz)) { - *hkpos = pos[j]; - *exact = 0; - return 1; - } - } - - return 0; -} - - -static int xdl_emit_rfile_line(recfile_t *rf, long line, xdemitcb_t *ecb) { - mmbuffer_t mb; - - if (!(mb.ptr = (char *) xdl_recfile_get(rf, line, &mb.size)) || - ecb->outf(ecb->priv, &mb, 1) < 0) { - - return -1; - } - - return 0; -} - - -static int xdl_flush_section(recfile_t *rf, long start, long top, xdemitcb_t *ecb) { - long i; - - for (i = start; i <= top; i++) { - if (xdl_emit_rfile_line(rf, i, ecb) < 0) { - - return -1; - } - } - - return 0; -} - - -static int xdl_apply_hunk(recfile_t *rf, long hkpos, patch_t *pch, int mode, - long *ibase, xdemitcb_t *ecb) { - long j, psize, ptop; - char const *pline; - mmbuffer_t mb; - - /* - * The hunk starting position (hkpos) can be negative, up to the number - * of prefix context lines. Since this function only emit the core of - * the hunk (the remaining lines are flushed by xdl_flush_section() calls) - * we need to normalize it by adding the number of prefix context lines. - * The normalized value of the starting position is then greater/equal - * to zero. - */ - hkpos += pch->hi.pctx; - if (xdl_flush_section(rf, *ibase, hkpos - 1, ecb) < 0) { - - return -1; - } - *ibase = hkpos; - for (j = pch->hkrec + 1 + pch->hi.pctx, - ptop = pch->hkrec + 1 + pch->hklen - pch->hi.sctx; j < ptop; j++) { - if (!(pline = xdl_recfile_get(&pch->rf, j, &psize))) { - - return -1; - } - if (*pline == ' ') { - if (xdl_emit_rfile_line(rf, *ibase, ecb) < 0) { - - return -1; - } - (*ibase)++; - } else if (*pline != mode) { - mb.ptr = (char *) pline + 1; - mb.size = psize - 1; - if (ecb->outf(ecb->priv, &mb, 1) < 0) { - - return -1; - } - pch->ps.adds++; - } else { - (*ibase)++; - pch->ps.dels++; - } - } - - return 0; -} - - -static int xdl_reject_hunk(recfile_t *rf, patch_t *pch, int mode, - xdemitcb_t *rjecb) { - long i, size, s1, s2, c1, c2; - char const *line, *pre; - mmbuffer_t mb; - - if (mode == '-') { - s1 = pch->hi.s1; - s2 = pch->hi.s2; - c1 = pch->hi.c1; - c2 = pch->hi.c2; - } else { - s1 = pch->hi.s2; - s2 = pch->hi.s1; - c1 = pch->hi.c2; - c2 = pch->hi.c1; - } - s1 += pch->ps.adds - pch->ps.dels; - if (xdl_emit_hunk_hdr(s1 + 1, c1, s2 + 1, c2, rjecb) < 0) { - - return -1; - } - for (i = pch->hkrec + 1; - (line = xdl_recfile_get(&pch->rf, i, &size)) != NULL; i++) { - if (*line == '@' || *line == '\n') - break; - if (mode == '-' || *line == ' ') { - mb.ptr = (char *) line; - mb.size = size; - if (rjecb->outf(rjecb->priv, &mb, 1) < 0) { - - return -1; - } - } else { - pre = *line == '+' ? "-": "+"; - if (xdl_emit_diffrec(line + 1, size - 1, pre, strlen(pre), - rjecb) < 0) { - - return -1; - } - } - } - - return 0; -} - - -static int xdl_process_hunk(recfile_t *rff, patch_t *pch, long *ibase, int mode, - xdemitcb_t *ecb, xdemitcb_t *rjecb) { - int fuzz, exact, hlen, maxfuzz; - long hkpos; - - hlen = mode == '-' ? pch->hi.cmn + pch->hi.rdel: pch->hi.cmn + pch->hi.radd; - maxfuzz = XDL_MAX_FUZZ; - if (hlen - maxfuzz < XDL_MIN_SYNCLINES) - maxfuzz = hlen - XDL_MIN_SYNCLINES; - if (maxfuzz < 0) - maxfuzz = 0; - for (fuzz = 0; fuzz <= maxfuzz; fuzz++) { - if (xdl_find_hunk(rff, *ibase, pch, mode, fuzz, - &hkpos, &exact)) { - if (xdl_apply_hunk(rff, hkpos, pch, mode, - ibase, ecb) < 0) { - - return -1; - } - if (!exact || fuzz) - pch->fuzzies++; - - return 0; - } - } - if (xdl_reject_hunk(rff, pch, mode, rjecb) < 0) { - - return -1; - } - - return 0; -} - - -int xdl_patch(mmfile_t *mf, mmfile_t *mfp, int mode, xdemitcb_t *ecb, - xdemitcb_t *rjecb) { - int hkres, exact; - long hkpos, ibase; - recfile_t rff; - patch_t pch; - - if (xdl_init_recfile(mf, 0, &rff) < 0) { - - return -1; - } - if (xdl_init_patch(mfp, mode & ~XDL_PATCH_MODEMASK, &pch) < 0) { - - xdl_free_recfile(&rff); - return -1; - } - mode &= XDL_PATCH_MODEMASK; - ibase = 0; - if ((hkres = xdl_first_hunk(&pch)) > 0) { - do { - if (xdl_process_hunk(&rff, &pch, &ibase, mode, - ecb, rjecb) < 0) { - xdl_free_patch(&pch); - xdl_free_recfile(&rff); - return -1; - } - } while ((hkres = xdl_next_hunk(&pch)) > 0); - } - if (hkres < 0) { - - xdl_free_patch(&pch); - xdl_free_recfile(&rff); - return -1; - } - if (xdl_flush_section(&rff, ibase, rff.nrec - 1, ecb) < 0) { - - xdl_free_patch(&pch); - xdl_free_recfile(&rff); - return -1; - } - xdl_free_patch(&pch); - xdl_free_recfile(&rff); - - return pch.fuzzies; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.c deleted file mode 100644 index 3ebd87c1..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.c +++ /dev/null @@ -1,456 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - -#define XDL_KPDIS_RUN 4 -#define XDL_MAX_EQLIMIT 1024 -#define XDL_SIMSCAN_WINDOWN 100 - - -typedef struct s_xdlclass { - struct s_xdlclass *next; - unsigned long ha; - char const *line; - long size; - long idx; -} xdlclass_t; - -typedef struct s_xdlclassifier { - unsigned int hbits; - long hsize; - xdlclass_t **rchash; - chastore_t ncha; - long count; -} xdlclassifier_t; - - - -static int xdl_init_classifier(xdlclassifier_t *cf, long size) { - long i; - - cf->hbits = xdl_hashbits((unsigned int) size); - cf->hsize = 1 << cf->hbits; - - if (xdl_cha_init(&cf->ncha, sizeof(xdlclass_t), size / 4 + 1) < 0) { - - return -1; - } - if (!(cf->rchash = (xdlclass_t **) xdl_malloc(cf->hsize * sizeof(xdlclass_t *)))) { - - xdl_cha_free(&cf->ncha); - return -1; - } - for (i = 0; i < cf->hsize; i++) - cf->rchash[i] = NULL; - - cf->count = 0; - - return 0; -} - - -static void xdl_free_classifier(xdlclassifier_t *cf) { - xdl_free(cf->rchash); - xdl_cha_free(&cf->ncha); -} - - -static int xdl_classify_record(xdlclassifier_t *cf, xrecord_t **rhash, unsigned int hbits, - xrecord_t *rec) { - long hi; - char const *line; - xdlclass_t *rcrec; - - line = rec->ptr; - hi = (long) XDL_HASHLONG(rec->ha, cf->hbits); - for (rcrec = cf->rchash[hi]; rcrec; rcrec = rcrec->next) - if (rcrec->ha == rec->ha && rcrec->size == rec->size && - !memcmp(line, rcrec->line, rec->size)) - break; - - if (!rcrec) { - if (!(rcrec = xdl_cha_alloc(&cf->ncha))) { - - return -1; - } - rcrec->idx = cf->count++; - rcrec->line = line; - rcrec->size = rec->size; - rcrec->ha = rec->ha; - rcrec->next = cf->rchash[hi]; - cf->rchash[hi] = rcrec; - } - - rec->ha = (unsigned long) rcrec->idx; - - hi = (long) XDL_HASHLONG(rec->ha, hbits); - rec->next = rhash[hi]; - rhash[hi] = rec; - - return 0; -} - - -static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp, - xdlclassifier_t *cf, xdfile_t *xdf) { - unsigned int hbits; - long i, nrec, hsize, bsize; - unsigned long hav; - char const *blk, *cur, *top, *prev; - xrecord_t *crec; - xrecord_t **recs, **rrecs; - xrecord_t **rhash; - unsigned long *ha; - char *rchg; - long *rindex; - - if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0) { - - return -1; - } - if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *)))) { - - xdl_cha_free(&xdf->rcha); - return -1; - } - - hbits = xdl_hashbits((unsigned int) narec); - hsize = 1 << hbits; - if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *)))) { - - xdl_free(recs); - xdl_cha_free(&xdf->rcha); - return -1; - } - for (i = 0; i < hsize; i++) - rhash[i] = NULL; - - nrec = 0; - if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) { - for (top = blk + bsize;;) { - if (cur >= top) { - if (!(cur = blk = xdl_mmfile_next(mf, &bsize))) - break; - top = blk + bsize; - } - prev = cur; - hav = xdl_hash_record(&cur, top); - if (nrec >= narec) { - narec *= 2; - if (!(rrecs = (xrecord_t **) xdl_realloc(recs, narec * sizeof(xrecord_t *)))) { - - xdl_free(rhash); - xdl_free(recs); - xdl_cha_free(&xdf->rcha); - return -1; - } - recs = rrecs; - } - if (!(crec = xdl_cha_alloc(&xdf->rcha))) { - - xdl_free(rhash); - xdl_free(recs); - xdl_cha_free(&xdf->rcha); - return -1; - } - crec->ptr = prev; - crec->size = (long) (cur - prev); - crec->ha = hav; - recs[nrec++] = crec; - - if (xdl_classify_record(cf, rhash, hbits, crec) < 0) { - - xdl_free(rhash); - xdl_free(recs); - xdl_cha_free(&xdf->rcha); - return -1; - } - } - } - - if (!(rchg = (char *) xdl_malloc(nrec + 2))) { - - xdl_free(rhash); - xdl_free(recs); - xdl_cha_free(&xdf->rcha); - return -1; - } - memset(rchg, 0, nrec + 2); - - if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long)))) { - - xdl_free(rchg); - xdl_free(rhash); - xdl_free(recs); - xdl_cha_free(&xdf->rcha); - return -1; - } - if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long)))) { - - xdl_free(rindex); - xdl_free(rchg); - xdl_free(rhash); - xdl_free(recs); - xdl_cha_free(&xdf->rcha); - return -1; - } - - xdf->nrec = nrec; - xdf->recs = recs; - xdf->hbits = hbits; - xdf->rhash = rhash; - xdf->rchg = rchg + 1; - xdf->rindex = rindex; - xdf->nreff = 0; - xdf->ha = ha; - xdf->dstart = 0; - xdf->dend = nrec - 1; - - return 0; -} - - -static void xdl_free_ctx(xdfile_t *xdf) { - xdl_free(xdf->rhash); - xdl_free(xdf->rindex); - xdl_free(xdf->rchg - 1); - xdl_free(xdf->ha); - xdl_free(xdf->recs); - xdl_cha_free(&xdf->rcha); -} - - -static int xdl_clean_mmatch(char const *dis, long i, long s, long e) { - long r, rdis0, rpdis0, rdis1, rpdis1; - - /* - * Limits the window the is examined during the similar-lines - * scan. The loops below stops when dis[i - r] == 1 (line that - * has no match), but there are corner cases where the loop - * proceed all the way to the extremities by causing huge - * performance penalties in case of big files. - */ - if (i - s > XDL_SIMSCAN_WINDOWN) - s = i - XDL_SIMSCAN_WINDOWN; - if (e - i > XDL_SIMSCAN_WINDOWN) - e = i + XDL_SIMSCAN_WINDOWN; - - /* - * Scans the lines before 'i' to find a run of lines that either - * have no match (dis[j] == 0) or have multiple matches (dis[j] > 1). - * Note that we always call this function with dis[i] > 1, so the - * current line (i) is already a multimatch line. - */ - for (r = 1, rdis0 = 0, rpdis0 = 1; (i - r) >= s; r++) { - if (!dis[i - r]) - rdis0++; - else if (dis[i - r] == 2) - rpdis0++; - else - break; - } - /* - * If the run before the line 'i' found only multimatch lines, we - * return 0 and hence we don't make the current line (i) discarded. - * We want to discard multimatch lines only when they appear in the - * middle of runs with nomatch lines (dis[j] == 0). - */ - if (rdis0 == 0) - return 0; - for (r = 1, rdis1 = 0, rpdis1 = 1; (i + r) <= e; r++) { - if (!dis[i + r]) - rdis1++; - else if (dis[i + r] == 2) - rpdis1++; - else - break; - } - /* - * If the run after the line 'i' found only multimatch lines, we - * return 0 and hence we don't make the current line (i) discarded. - */ - if (rdis1 == 0) - return 0; - rdis1 += rdis0; - rpdis1 += rpdis0; - - return rpdis1 * XDL_KPDIS_RUN < (rpdis1 + rdis1); -} - - -/* - * Try to reduce the problem complexity, discard records that have no - * matches on the other file. Also, lines that have multiple matches - * might be potentially discarded if they happear in a run of discardable. - */ -static int xdl_cleanup_records(xdfile_t *xdf1, xdfile_t *xdf2) { - long i, nm, rhi, nreff, mlim; - unsigned long hav; - xrecord_t **recs; - xrecord_t *rec; - char *dis, *dis1, *dis2; - - if (!(dis = (char *) xdl_malloc(xdf1->nrec + xdf2->nrec + 2))) { - - return -1; - } - memset(dis, 0, xdf1->nrec + xdf2->nrec + 2); - dis1 = dis; - dis2 = dis1 + xdf1->nrec + 1; - - if ((mlim = xdl_bogosqrt(xdf1->nrec)) > XDL_MAX_EQLIMIT) - mlim = XDL_MAX_EQLIMIT; - for (i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; i <= xdf1->dend; i++, recs++) { - hav = (*recs)->ha; - rhi = (long) XDL_HASHLONG(hav, xdf2->hbits); - for (nm = 0, rec = xdf2->rhash[rhi]; rec; rec = rec->next) - if (rec->ha == hav && ++nm == mlim) - break; - dis1[i] = (nm == 0) ? 0: (nm >= mlim) ? 2: 1; - } - - if ((mlim = xdl_bogosqrt(xdf2->nrec)) > XDL_MAX_EQLIMIT) - mlim = XDL_MAX_EQLIMIT; - for (i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart]; i <= xdf2->dend; i++, recs++) { - hav = (*recs)->ha; - rhi = (long) XDL_HASHLONG(hav, xdf1->hbits); - for (nm = 0, rec = xdf1->rhash[rhi]; rec; rec = rec->next) - if (rec->ha == hav && ++nm == mlim) - break; - dis2[i] = (nm == 0) ? 0: (nm >= mlim) ? 2: 1; - } - - for (nreff = 0, i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; - i <= xdf1->dend; i++, recs++) { - if (dis1[i] == 1 || - (dis1[i] == 2 && !xdl_clean_mmatch(dis1, i, xdf1->dstart, xdf1->dend))) { - xdf1->rindex[nreff] = i; - xdf1->ha[nreff] = (*recs)->ha; - nreff++; - } else - xdf1->rchg[i] = 1; - } - xdf1->nreff = nreff; - - for (nreff = 0, i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart]; - i <= xdf2->dend; i++, recs++) { - if (dis2[i] == 1 || - (dis2[i] == 2 && !xdl_clean_mmatch(dis2, i, xdf2->dstart, xdf2->dend))) { - xdf2->rindex[nreff] = i; - xdf2->ha[nreff] = (*recs)->ha; - nreff++; - } else - xdf2->rchg[i] = 1; - } - xdf2->nreff = nreff; - - xdl_free(dis); - - return 0; -} - - -/* - * Early trim initial and terminal matching records. - */ -static int xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2) { - long i, lim; - xrecord_t **recs1, **recs2; - - recs1 = xdf1->recs; - recs2 = xdf2->recs; - for (i = 0, lim = XDL_MIN(xdf1->nrec, xdf2->nrec); i < lim; - i++, recs1++, recs2++) - if ((*recs1)->ha != (*recs2)->ha) - break; - - xdf1->dstart = xdf2->dstart = i; - - recs1 = xdf1->recs + xdf1->nrec - 1; - recs2 = xdf2->recs + xdf2->nrec - 1; - for (lim -= i, i = 0; i < lim; i++, recs1--, recs2--) - if ((*recs1)->ha != (*recs2)->ha) - break; - - xdf1->dend = xdf1->nrec - i - 1; - xdf2->dend = xdf2->nrec - i - 1; - - return 0; -} - - -static int xdl_optimize_ctxs(xdfile_t *xdf1, xdfile_t *xdf2) { - if (xdl_trim_ends(xdf1, xdf2) < 0 || - xdl_cleanup_records(xdf1, xdf2) < 0) { - - return -1; - } - - return 0; -} - - -int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *xe) { - long enl1, enl2; - xdlclassifier_t cf; - - enl1 = xdl_guess_lines(mf1) + 1; - enl2 = xdl_guess_lines(mf2) + 1; - - if (xdl_init_classifier(&cf, enl1 + enl2 + 1) < 0) { - - return -1; - } - - if (xdl_prepare_ctx(mf1, enl1, xpp, &cf, &xe->xdf1) < 0) { - - xdl_free_classifier(&cf); - return -1; - } - if (xdl_prepare_ctx(mf2, enl2, xpp, &cf, &xe->xdf2) < 0) { - - xdl_free_ctx(&xe->xdf1); - xdl_free_classifier(&cf); - return -1; - } - - xdl_free_classifier(&cf); - - if (xdl_optimize_ctxs(&xe->xdf1, &xe->xdf2) < 0) { - - xdl_free_ctx(&xe->xdf2); - xdl_free_ctx(&xe->xdf1); - return -1; - } - - return 0; -} - - -void xdl_free_env(xdfenv_t *xe) { - xdl_free_ctx(&xe->xdf2); - xdl_free_ctx(&xe->xdf1); -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.h deleted file mode 100644 index 344c569e..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xprepare.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XPREPARE_H) -#define XPREPARE_H - - - -int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, - xdfenv_t *xe); -void xdl_free_env(xdfenv_t *xe); - - - -#endif /* #if !defined(XPREPARE_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabdiff.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabdiff.c deleted file mode 100644 index 586d9837..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabdiff.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - * xrabdiff by Davide Libenzi (Rabin's polynomial fingerprint based delta generator) - * Copyright (C) 2006 Davide Libenzi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - * - * Hints, ideas and code for the implementation came from: - * - * Rabin's original paper: http://www.xmailserver.org/rabin.pdf - * Chan & Lu's paper: http://www.xmailserver.org/rabin_impl.pdf - * Broder's paper: http://www.xmailserver.org/rabin_apps.pdf - * LBFS source code: http://www.fs.net/sfswww/lbfs/ - * Geert Bosch's post: http://marc.theaimsgroup.com/?l=git&m=114565424620771&w=2 - * - */ - -#include "xinclude.h" - - -#if !defined(XRABPLY_TYPE32) && !defined(XRABPLY_TYPE64) -#define XRABPLY_TYPE64 long long -#define XV64(v) ((xply_word) v ## ULL) -#endif - -#include "xrabply.c" - - - -#define XRAB_SLIDE(v, c) do { \ - if (++wpos == XRAB_WNDSIZE) wpos = 0; \ - v ^= U[wbuf[wpos]]; \ - wbuf[wpos] = (c); \ - v = ((v << 8) | (c)) ^ T[v >> XRAB_SHIFT]; \ - } while (0) - - -#define XRAB_MINCPYSIZE 12 -#define XRAB_WBITS (sizeof(xply_word) * 8) - - - -typedef struct s_xrabctx { - long idxsize; - long *idx; - unsigned char const *data; - long size; -} xrabctx_t; - -typedef struct s_xrabcpyi { - long src; - long tgt; - long len; -} xrabcpyi_t; - -typedef struct s_xrabcpyi_arena { - long cnt, size; - xrabcpyi_t *acpy; -} xrabcpyi_arena_t; - - - -static void xrab_init_cpyarena(xrabcpyi_arena_t *aca) { - aca->cnt = aca->size = 0; - aca->acpy = NULL; -} - - -static void xrab_free_cpyarena(xrabcpyi_arena_t *aca) { - xdl_free(aca->acpy); -} - - -static int xrab_add_cpy(xrabcpyi_arena_t *aca, xrabcpyi_t const *rcpy) { - long size; - xrabcpyi_t *acpy; - - if (aca->cnt >= aca->size) { - size = 2 * aca->size + 1024; - if ((acpy = (xrabcpyi_t *) - xdl_realloc(aca->acpy, size * sizeof(xrabcpyi_t))) == NULL) - return -1; - aca->acpy = acpy; - aca->size = size; - } - aca->acpy[aca->cnt++] = *rcpy; - - return 0; -} - - -static long xrab_cmnseq(unsigned char const *data, long start, long size) { - unsigned char ch = data[start]; - unsigned char const *ptr, *top; - - for (ptr = data + start + 1, top = data + size; ptr < top && ch == *ptr; ptr++); - - return (long) (ptr - (data + start + 1)); -} - - -static int xrab_build_ctx(unsigned char const *data, long size, xrabctx_t *ctx) { - long i, isize, idxsize, seq, wpos = 0; - xply_word fp = 0, mask; - unsigned char ch; - unsigned char const *ptr, *eot; - long *idx; - unsigned char wbuf[XRAB_WNDSIZE]; - long maxoffs[256]; - long maxseq[256]; - xply_word maxfp[256]; - - memset(wbuf, 0, sizeof(wbuf)); - memset(maxseq, 0, sizeof(maxseq)); - isize = 2 * (size / XRAB_WNDSIZE); - for (idxsize = 1; idxsize < isize; idxsize <<= 1); - mask = (xply_word) (idxsize - 1); - if ((idx = (long *) xdl_malloc(idxsize * sizeof(long))) == NULL) - return -1; - memset(idx, 0, idxsize * sizeof(long)); - for (i = 0; i + XRAB_WNDSIZE < size; i += XRAB_WNDSIZE) { - /* - * Generate a brand new hash for the current window. Here we could - * try to perform pseudo-loop unroll by 4 blocks if necessary, and - * if we force XRAB_WNDSIZE to be a multiple of 4, we could reduce - * the branch occurence inside XRAB_SLIDE by a factor of 4. - */ - for (ptr = data + i, eot = ptr + XRAB_WNDSIZE; ptr < eot; ptr++) - XRAB_SLIDE(fp, *ptr); - - /* - * Try to scan for single value scans, and store them in the - * array according to the longest one. Before we do a fast check - * to avoid calling xrab_cmnseq() when not necessary. - */ - if ((ch = data[i]) == data[i + XRAB_WNDSIZE - 1] && - (seq = xrab_cmnseq(data, i, size)) > XRAB_WNDSIZE && - seq > maxseq[ch]) { - maxseq[ch] = seq; - maxfp[ch] = fp; - maxoffs[ch] = i + XRAB_WNDSIZE; - seq = (seq / XRAB_WNDSIZE) * XRAB_WNDSIZE; - i += seq - XRAB_WNDSIZE; - } else - idx[fp & mask] = i + XRAB_WNDSIZE; - } - - /* - * Restore back the logest sequences by overwriting target hash buckets. - */ - for (i = 0; i < 256; i++) - if (maxseq[i]) - idx[maxfp[i] & mask] = maxoffs[i]; - ctx->idxsize = idxsize; - ctx->idx = idx; - ctx->data = data; - ctx->size = size; - - return 0; -} - - -static void xrab_free_ctx(xrabctx_t *ctx) { - - xdl_free(ctx->idx); -} - - -static int xrab_diff(unsigned char const *data, long size, xrabctx_t *ctx, - xrabcpyi_arena_t *aca) { - long i, offs, ssize, src, tgt, esrc, etgt, wpos = 0; - xply_word fp = 0, mask; - long const *idx; - unsigned char const *sdata; - xrabcpyi_t rcpy; - unsigned char wbuf[XRAB_WNDSIZE]; - - xrab_init_cpyarena(aca); - memset(wbuf, 0, sizeof(wbuf)); - for (i = 0; i < XRAB_WNDSIZE - 1 && i < size; i++) - XRAB_SLIDE(fp, data[i]); - idx = ctx->idx; - sdata = ctx->data; - ssize = ctx->size; - mask = (xply_word) (ctx->idxsize - 1); - while (i < size) { - unsigned char ch = data[i++]; - - XRAB_SLIDE(fp, ch); - offs = idx[fp & mask]; - - /* - * Fast check here to probabilistically reduce false positives - * that would trigger the slow path below. - */ - if (offs == 0 || ch != sdata[offs - 1]) - continue; - - /* - * Stretch the match both sides as far as possible. - */ - src = offs - 1; - tgt = i - 1; - for (; tgt > 0 && src > 0 && data[tgt - 1] == sdata[src - 1]; - tgt--, src--); - esrc = offs; - etgt = i; - for (; etgt < size && esrc < ssize && data[etgt] == sdata[esrc]; - etgt++, esrc++); - - /* - * Avoid considering copies smaller than the XRAB_MINCPYSIZE - * threshold. - */ - if (etgt - tgt >= XRAB_MINCPYSIZE) { - rcpy.src = src; - rcpy.tgt = tgt; - rcpy.len = etgt - tgt; - if (xrab_add_cpy(aca, &rcpy) < 0) { - xrab_free_cpyarena(aca); - return -1; - } - - /* - * Fill up the new window and exit with 'i' properly set on exit. - */ - for (i = etgt - XRAB_WNDSIZE; i < etgt; i++) - XRAB_SLIDE(fp, data[i]); - } - } - - return 0; -} - - -static int xrab_tune_cpyarena(unsigned char const *data, long size, xrabctx_t *ctx, - xrabcpyi_arena_t *aca) { - long i, cpos; - xrabcpyi_t *rcpy; - - for (cpos = size, i = aca->cnt - 1; i >= 0; i--) { - rcpy = aca->acpy + i; - if (rcpy->tgt >= cpos) - rcpy->len = 0; - else if (rcpy->tgt + rcpy->len > cpos) { - if ((rcpy->len = cpos - rcpy->tgt) >= XRAB_MINCPYSIZE) - cpos = rcpy->tgt; - else - rcpy->len = 0; - } else - cpos = rcpy->tgt; - } - - return 0; -} - - -int xdl_rabdiff_mb(mmbuffer_t *mmb1, mmbuffer_t *mmb2, xdemitcb_t *ecb) { - long i, cpos, size; - unsigned long fp; - xrabcpyi_t *rcpy; - xrabctx_t ctx; - xrabcpyi_arena_t aca; - mmbuffer_t mb[2]; - unsigned char cpybuf[32]; - - fp = xdl_mmb_adler32(mmb1); - if (xrab_build_ctx((unsigned char const *) mmb1->ptr, mmb1->size, - &ctx) < 0) - return -1; - if (xrab_diff((unsigned char const *) mmb2->ptr, mmb2->size, &ctx, - &aca) < 0) { - xrab_free_ctx(&ctx); - return -1; - } - xrab_tune_cpyarena((unsigned char const *) mmb2->ptr, mmb2->size, &ctx, - &aca); - xrab_free_ctx(&ctx); - - /* - * Prepare and emit the binary patch file header. It will be used - * to verify that that file being patched matches in size and fingerprint - * the one that generated the patch. - */ - size = mmb1->size; - XDL_LE32_PUT(cpybuf, fp); - XDL_LE32_PUT(cpybuf + 4, size); - - mb[0].ptr = (char *) cpybuf; - mb[0].size = 4 + 4; - if (ecb->outf(ecb->priv, mb, 1) < 0) { - xrab_free_cpyarena(&aca); - return -1; - } - for (cpos = 0, i = 0; i < aca.cnt; i++) { - rcpy = aca.acpy + i; - if (rcpy->len == 0) - continue; - if (cpos < rcpy->tgt) { - size = rcpy->tgt - cpos; - if (size > 255) { - cpybuf[0] = XDL_BDOP_INSB; - XDL_LE32_PUT(cpybuf + 1, size); - mb[0].ptr = (char *) cpybuf; - mb[0].size = XDL_INSBOP_SIZE; - } else { - cpybuf[0] = XDL_BDOP_INS; - cpybuf[1] = (unsigned char) size; - mb[0].ptr = (char *) cpybuf; - mb[0].size = 2; - } - mb[1].ptr = mmb2->ptr + cpos; - mb[1].size = size; - if (ecb->outf(ecb->priv, mb, 2) < 0) { - xrab_free_cpyarena(&aca); - return -1; - } - cpos = rcpy->tgt; - } - cpybuf[0] = XDL_BDOP_CPY; - XDL_LE32_PUT(cpybuf + 1, rcpy->src); - XDL_LE32_PUT(cpybuf + 5, rcpy->len); - mb[0].ptr = (char *) cpybuf; - mb[0].size = XDL_COPYOP_SIZE; - if (ecb->outf(ecb->priv, mb, 1) < 0) { - xrab_free_cpyarena(&aca); - return -1; - } - cpos += rcpy->len; - } - xrab_free_cpyarena(&aca); - if (cpos < mmb2->size) { - size = mmb2->size - cpos; - if (size > 255) { - cpybuf[0] = XDL_BDOP_INSB; - XDL_LE32_PUT(cpybuf + 1, size); - mb[0].ptr = (char *) cpybuf; - mb[0].size = XDL_INSBOP_SIZE; - } else { - cpybuf[0] = XDL_BDOP_INS; - cpybuf[1] = (unsigned char) size; - mb[0].ptr = (char *) cpybuf; - mb[0].size = 2; - } - mb[1].ptr = mmb2->ptr + cpos; - mb[1].size = size; - if (ecb->outf(ecb->priv, mb, 2) < 0) - return -1; - } - - return 0; -} - - -int xdl_rabdiff(mmfile_t *mmf1, mmfile_t *mmf2, xdemitcb_t *ecb) { - mmbuffer_t mmb1, mmb2; - - if (!xdl_mmfile_iscompact(mmf1) || !xdl_mmfile_iscompact(mmf2)) - return -1; - if ((mmb1.ptr = (char *) xdl_mmfile_first(mmf1, &mmb1.size)) == NULL) - mmb1.size = 0; - if ((mmb2.ptr = (char *) xdl_mmfile_first(mmf2, &mmb2.size)) == NULL) - mmb2.size = 0; - - return xdl_rabdiff_mb(&mmb1, &mmb2, ecb); -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabply.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabply.c deleted file mode 100644 index daaabdaa..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xrabply.c +++ /dev/null @@ -1,298 +0,0 @@ -#if defined(XRABPLY_TYPE64) - -#if !defined(XV64) -#define XV64(v) ((xply_word) v ## ULL) -#endif - -#define XRAB_ROOTPOLY XV64(0x36f7381af4d70d33) - -#define XRAB_SHIFT 53 -#define XRAB_WNDSIZE 20 - -typedef unsigned XRABPLY_TYPE64 xply_word; - -static const xply_word T[256] = { - XV64(0x0), XV64(0x36f7381af4d70d33), XV64(0x5b19482f1d791755), XV64(0x6dee7035e9ae1a66), - XV64(0x80c5a844ce252399), XV64(0xb632905e3af22eaa), XV64(0xdbdce06bd35c34cc), XV64(0xed2bd871278b39ff), - XV64(0x18b50899c4a4732), XV64(0x377c6893689d4a01), XV64(0x5a9218a681335067), XV64(0x6c6520bc75e45d54), - XV64(0x814ef8cd526f64ab), XV64(0xb7b9c0d7a6b86998), XV64(0xda57b0e24f1673fe), XV64(0xeca088f8bbc17ecd), - XV64(0x316a11338948e64), XV64(0x35e19909cc438357), XV64(0x580fe93c25ed9931), XV64(0x6ef8d126d13a9402), - XV64(0x83d30957f6b1adfd), XV64(0xb524314d0266a0ce), XV64(0xd8ca4178ebc8baa8), XV64(0xee3d79621f1fb79b), - XV64(0x29df19aa4dec956), XV64(0x346ac9805009c465), XV64(0x5984b9b5b9a7de03), XV64(0x6f7381af4d70d330), - XV64(0x825859de6afbeacf), XV64(0xb4af61c49e2ce7fc), XV64(0xd94111f17782fd9a), XV64(0xefb629eb8355f0a9), - XV64(0x62d422671291cc8), XV64(0x30da7a3c85fe11fb), XV64(0x5d340a096c500b9d), XV64(0x6bc33213988706ae), - XV64(0x86e8ea62bf0c3f51), XV64(0xb01fd2784bdb3262), XV64(0xddf1a24da2752804), XV64(0xeb069a5756a22537), - XV64(0x7a612afed635bfa), XV64(0x31512ab519b456c9), XV64(0x5cbf5a80f01a4caf), XV64(0x6a48629a04cd419c), - XV64(0x8763baeb23467863), XV64(0xb19482f1d7917550), XV64(0xdc7af2c43e3f6f36), XV64(0xea8dcadecae86205), - XV64(0x53be33549bd92ac), XV64(0x33ccdb2fbd6a9f9f), XV64(0x5e22ab1a54c485f9), XV64(0x68d59300a01388ca), - XV64(0x85fe4b718798b135), XV64(0xb309736b734fbc06), XV64(0xdee7035e9ae1a660), XV64(0xe8103b446e36ab53), - XV64(0x4b0b3bcd5f7d59e), XV64(0x32478ba62120d8ad), XV64(0x5fa9fb93c88ec2cb), XV64(0x695ec3893c59cff8), - XV64(0x84751bf81bd2f607), XV64(0xb28223e2ef05fb34), XV64(0xdf6c53d706abe152), XV64(0xe99b6bcdf27cec61), - XV64(0xc5a844ce2523990), XV64(0x3aadbc56168534a3), XV64(0x5743cc63ff2b2ec5), XV64(0x61b4f4790bfc23f6), - XV64(0x8c9f2c082c771a09), XV64(0xba681412d8a0173a), XV64(0xd7866427310e0d5c), XV64(0xe1715c3dc5d9006f), - XV64(0xdd1d4c57e187ea2), XV64(0x3b26ecdf8acf7391), XV64(0x56c89cea636169f7), XV64(0x603fa4f097b664c4), - XV64(0x8d147c81b03d5d3b), XV64(0xbbe3449b44ea5008), XV64(0xd60d34aead444a6e), XV64(0xe0fa0cb45993475d), - XV64(0xf4c255fdac6b7f4), XV64(0x39bb1d452e11bac7), XV64(0x54556d70c7bfa0a1), XV64(0x62a2556a3368ad92), - XV64(0x8f898d1b14e3946d), XV64(0xb97eb501e034995e), XV64(0xd490c534099a8338), XV64(0xe267fd2efd4d8e0b), - XV64(0xec775d6468cf0c6), XV64(0x38304dccb25bfdf5), XV64(0x55de3df95bf5e793), XV64(0x632905e3af22eaa0), - XV64(0x8e02dd9288a9d35f), XV64(0xb8f5e5887c7ede6c), XV64(0xd51b95bd95d0c40a), XV64(0xe3ecada76107c939), - XV64(0xa77c66a937b2558), XV64(0x3c80fe7067ac286b), XV64(0x516e8e458e02320d), XV64(0x6799b65f7ad53f3e), - XV64(0x8ab26e2e5d5e06c1), XV64(0xbc455634a9890bf2), XV64(0xd1ab260140271194), XV64(0xe75c1e1bb4f01ca7), - XV64(0xbfc96e30f31626a), XV64(0x3d0baef9fbe66f59), XV64(0x50e5decc1248753f), XV64(0x6612e6d6e69f780c), - XV64(0x8b393ea7c11441f3), XV64(0xbdce06bd35c34cc0), XV64(0xd0207688dc6d56a6), XV64(0xe6d74e9228ba5b95), - XV64(0x9616779abefab3c), XV64(0x3f965f635f38a60f), XV64(0x52782f56b696bc69), XV64(0x648f174c4241b15a), - XV64(0x89a4cf3d65ca88a5), XV64(0xbf53f727911d8596), XV64(0xd2bd871278b39ff0), XV64(0xe44abf088c6492c3), - XV64(0x8ea37f037a5ec0e), XV64(0x3e1d0feac372e13d), XV64(0x53f37fdf2adcfb5b), XV64(0x650447c5de0bf668), - XV64(0x882f9fb4f980cf97), XV64(0xbed8a7ae0d57c2a4), XV64(0xd336d79be4f9d8c2), XV64(0xe5c1ef81102ed5f1), - XV64(0x18b50899c4a47320), XV64(0x2e42308330737e13), XV64(0x43ac40b6d9dd6475), XV64(0x755b78ac2d0a6946), - XV64(0x9870a0dd0a8150b9), XV64(0xae8798c7fe565d8a), XV64(0xc369e8f217f847ec), XV64(0xf59ed0e8e32f4adf), - XV64(0x193e581058ee3412), XV64(0x2fc9600aac393921), XV64(0x4227103f45972347), XV64(0x74d02825b1402e74), - XV64(0x99fbf05496cb178b), XV64(0xaf0cc84e621c1ab8), XV64(0xc2e2b87b8bb200de), XV64(0xf41580617f650ded), - XV64(0x1ba3a98afc30fd44), XV64(0x2d54919008e7f077), XV64(0x40bae1a5e149ea11), XV64(0x764dd9bf159ee722), - XV64(0x9b6601ce3215dedd), XV64(0xad9139d4c6c2d3ee), XV64(0xc07f49e12f6cc988), XV64(0xf68871fbdbbbc4bb), - XV64(0x1a28f903607aba76), XV64(0x2cdfc11994adb745), XV64(0x4131b12c7d03ad23), XV64(0x77c6893689d4a010), - XV64(0x9aed5147ae5f99ef), XV64(0xac1a695d5a8894dc), XV64(0xc1f41968b3268eba), XV64(0xf703217247f18389), - XV64(0x1e984abfb58d6fe8), XV64(0x286f72a5415a62db), XV64(0x45810290a8f478bd), XV64(0x73763a8a5c23758e), - XV64(0x9e5de2fb7ba84c71), XV64(0xa8aadae18f7f4142), XV64(0xc544aad466d15b24), XV64(0xf3b392ce92065617), - XV64(0x1f131a3629c728da), XV64(0x29e4222cdd1025e9), XV64(0x440a521934be3f8f), XV64(0x72fd6a03c06932bc), - XV64(0x9fd6b272e7e20b43), XV64(0xa9218a6813350670), XV64(0xc4cffa5dfa9b1c16), XV64(0xf238c2470e4c1125), - XV64(0x1d8eebac8d19e18c), XV64(0x2b79d3b679ceecbf), XV64(0x4697a3839060f6d9), XV64(0x70609b9964b7fbea), - XV64(0x9d4b43e8433cc215), XV64(0xabbc7bf2b7ebcf26), XV64(0xc6520bc75e45d540), XV64(0xf0a533ddaa92d873), - XV64(0x1c05bb251153a6be), XV64(0x2af2833fe584ab8d), XV64(0x471cf30a0c2ab1eb), XV64(0x71ebcb10f8fdbcd8), - XV64(0x9cc01361df768527), XV64(0xaa372b7b2ba18814), XV64(0xc7d95b4ec20f9272), XV64(0xf12e635436d89f41), - XV64(0x14ef8cd526f64ab0), XV64(0x2218b4cfd2214783), XV64(0x4ff6c4fa3b8f5de5), XV64(0x7901fce0cf5850d6), - XV64(0x942a2491e8d36929), XV64(0xa2dd1c8b1c04641a), XV64(0xcf336cbef5aa7e7c), XV64(0xf9c454a4017d734f), - XV64(0x1564dc5cbabc0d82), XV64(0x2393e4464e6b00b1), XV64(0x4e7d9473a7c51ad7), XV64(0x788aac69531217e4), - XV64(0x95a1741874992e1b), XV64(0xa3564c02804e2328), XV64(0xceb83c3769e0394e), XV64(0xf84f042d9d37347d), - XV64(0x17f92dc61e62c4d4), XV64(0x210e15dceab5c9e7), XV64(0x4ce065e9031bd381), XV64(0x7a175df3f7ccdeb2), - XV64(0x973c8582d047e74d), XV64(0xa1cbbd982490ea7e), XV64(0xcc25cdadcd3ef018), XV64(0xfad2f5b739e9fd2b), - XV64(0x16727d4f822883e6), XV64(0x2085455576ff8ed5), XV64(0x4d6b35609f5194b3), XV64(0x7b9c0d7a6b869980), - XV64(0x96b7d50b4c0da07f), XV64(0xa040ed11b8daad4c), XV64(0xcdae9d245174b72a), XV64(0xfb59a53ea5a3ba19), - XV64(0x12c2cef357df5678), XV64(0x2435f6e9a3085b4b), XV64(0x49db86dc4aa6412d), XV64(0x7f2cbec6be714c1e), - XV64(0x920766b799fa75e1), XV64(0xa4f05ead6d2d78d2), XV64(0xc91e2e98848362b4), XV64(0xffe9168270546f87), - XV64(0x13499e7acb95114a), XV64(0x25bea6603f421c79), XV64(0x4850d655d6ec061f), XV64(0x7ea7ee4f223b0b2c), - XV64(0x938c363e05b032d3), XV64(0xa57b0e24f1673fe0), XV64(0xc8957e1118c92586), XV64(0xfe62460bec1e28b5), - XV64(0x11d46fe06f4bd81c), XV64(0x272357fa9b9cd52f), XV64(0x4acd27cf7232cf49), XV64(0x7c3a1fd586e5c27a), - XV64(0x9111c7a4a16efb85), XV64(0xa7e6ffbe55b9f6b6), XV64(0xca088f8bbc17ecd0), XV64(0xfcffb79148c0e1e3), - XV64(0x105f3f69f3019f2e), XV64(0x26a8077307d6921d), XV64(0x4b467746ee78887b), XV64(0x7db14f5c1aaf8548), - XV64(0x909a972d3d24bcb7), XV64(0xa66daf37c9f3b184), XV64(0xcb83df02205dabe2), XV64(0xfd74e718d48aa6d1) -}; - -static const xply_word U[256] = { - XV64(0x0), XV64(0x1c3eb44b122426b2), XV64(0xe8a508cd09f4057), XV64(0x12b4e4c7c2bb66e5), - XV64(0x1d14a119a13e80ae), XV64(0x12a1552b31aa61c), XV64(0x139ef19571a1c0f9), XV64(0xfa045de6385e64b), - XV64(0xcde7a29b6aa0c6f), XV64(0x10e0ce62a48e2add), XV64(0x2542aa566354c38), XV64(0x1e6a9eee74116a8a), - XV64(0x11cadb3017948cc1), XV64(0xdf46f7b05b0aa73), XV64(0x1f408bbcc70bcc96), XV64(0x37e3ff7d52fea24), - XV64(0x19bcf4536d5418de), XV64(0x58240187f703e6c), XV64(0x1736a4dfbdcb5889), XV64(0xb081094afef7e3b), - XV64(0x4a8554acc6a9870), XV64(0x1896e101de4ebec2), XV64(0xa2205c61cf5d827), XV64(0x161cb18d0ed1fe95), - XV64(0x15628e7adbfe14b1), XV64(0x95c3a31c9da3203), XV64(0x1be8def60b6154e6), XV64(0x7d66abd19457254), - XV64(0x8762f637ac0941f), XV64(0x14489b2868e4b2ad), XV64(0x6fc7fefaa5fd448), XV64(0x1ac2cba4b87bf2fa), - XV64(0x58ed0bc2e7f3c8f), XV64(0x19b064f73c5b1a3d), XV64(0xb048030fee07cd8), XV64(0x173a347becc45a6a), - XV64(0x189a71a58f41bc21), XV64(0x4a4c5ee9d659a93), XV64(0x161021295fdefc76), XV64(0xa2e95624dfadac4), - XV64(0x950aa9598d530e0), XV64(0x156e1ede8af11652), XV64(0x7dafa19484a70b7), XV64(0x1be44e525a6e5605), - XV64(0x14440b8c39ebb04e), XV64(0x87abfc72bcf96fc), XV64(0x1ace5b00e974f019), XV64(0x6f0ef4bfb50d6ab), - XV64(0x1c3224ef432b2451), XV64(0xc90a4510f02e3), XV64(0x12b8746393b46406), XV64(0xe86c028819042b4), - XV64(0x12685f6e215a4ff), XV64(0x1d1831bdf031824d), XV64(0xfacd57a328ae4a8), XV64(0x1392613120aec21a), - XV64(0x10ec5ec6f581283e), XV64(0xcd2ea8de7a50e8c), XV64(0x1e660e4a251e6869), XV64(0x258ba01373a4edb), - XV64(0xdf8ffdf54bfa890), XV64(0x11c64b94469b8e22), XV64(0x372af538420e8c7), XV64(0x1f4c1b189604ce75), - XV64(0xb1da1785cfe791e), XV64(0x172315334eda5fac), XV64(0x597f1f48c613949), XV64(0x19a945bf9e451ffb), - XV64(0x16090061fdc0f9b0), XV64(0xa37b42aefe4df02), XV64(0x188350ed2d5fb9e7), XV64(0x4bde4a63f7b9f55), - XV64(0x7c3db51ea547571), XV64(0x1bfd6f1af87053c3), XV64(0x9498bdd3acb3526), XV64(0x15773f9628ef1394), - XV64(0x1ad77a484b6af5df), XV64(0x6e9ce03594ed36d), XV64(0x145d2ac49bf5b588), XV64(0x8639e8f89d1933a), - XV64(0x12a1552b31aa61c0), XV64(0xe9fe160238e4772), XV64(0x1c2b05a7e1352197), XV64(0x15b1ecf3110725), - XV64(0xfb5f4329094e16e), XV64(0x138b407982b0c7dc), XV64(0x13fa4be400ba139), XV64(0x1d0110f5522f878b), - XV64(0x1e7f2f0287006daf), XV64(0x2419b4995244b1d), XV64(0x10f57f8e579f2df8), XV64(0xccbcbc545bb0b4a), - XV64(0x36b8e1b263eed01), XV64(0x1f553a50341acbb3), XV64(0xde1de97f6a1ad56), XV64(0x11df6adce4858be4), - XV64(0xe9371c472814591), XV64(0x12adc58f60a56323), XV64(0x192148a21e05c6), XV64(0x1c279503b03a2374), - XV64(0x1387d0ddd3bfc53f), XV64(0xfb96496c19be38d), XV64(0x1d0d805103208568), XV64(0x133341a1104a3da), - XV64(0x24d0bedc42b49fe), XV64(0x1e73bfa6d60f6f4c), XV64(0xcc75b6114b409a9), XV64(0x10f9ef2a06902f1b), - XV64(0x1f59aaf46515c950), XV64(0x3671ebf7731efe2), XV64(0x11d3fa78b58a8907), XV64(0xded4e33a7aeafb5), - XV64(0x172f85971fd55d4f), XV64(0xb1131dc0df17bfd), XV64(0x19a5d51bcf4a1d18), XV64(0x59b6150dd6e3baa), - XV64(0xa3b248ebeebdde1), XV64(0x160590c5accffb53), XV64(0x4b174026e749db6), XV64(0x188fc0497c50bb04), - XV64(0x1bf1ffbea97f5120), XV64(0x7cf4bf5bb5b7792), XV64(0x157baf3279e01177), XV64(0x9451b796bc437c5), - XV64(0x6e55ea70841d18e), XV64(0x1adbeaec1a65f73c), XV64(0x86f0e2bd8de91d9), XV64(0x1451ba60cafab76b), - XV64(0x163b42f0b9fcf23c), XV64(0xa05f6bbabd8d48e), XV64(0x18b1127c6963b26b), XV64(0x48fa6377b4794d9), - XV64(0xb2fe3e918c27292), XV64(0x171157a20ae65420), XV64(0x5a5b365c85d32c5), XV64(0x199b072eda791477), - XV64(0x1ae538d90f56fe53), XV64(0x6db8c921d72d8e1), XV64(0x146f6855dfc9be04), XV64(0x851dc1ecded98b6), - XV64(0x7f199c0ae687efd), XV64(0x1bcf2d8bbc4c584f), XV64(0x97bc94c7ef73eaa), XV64(0x15457d076cd31818), - XV64(0xf87b6a3d4a8eae2), XV64(0x13b902e8c68ccc50), XV64(0x10de62f0437aab5), XV64(0x1d33526416138c07), - XV64(0x129317ba75966a4c), XV64(0xeada3f167b24cfe), XV64(0x1c194736a5092a1b), XV64(0x27f37db72d0ca9), - XV64(0x359cc8a6202e68d), XV64(0x1f6778c17026c03f), XV64(0xdd39c06b29da6da), XV64(0x11ed284da0b98068), - XV64(0x1e4d6d93c33c6623), XV64(0x273d9d8d1184091), XV64(0x10c73d1f13a32674), XV64(0xcf98954018700c6), - XV64(0x13b5924c9783ceb3), XV64(0xf8b260785a7e801), XV64(0x1d3fc2c0471c8ee4), XV64(0x101768b5538a856), - XV64(0xea1335536bd4e1d), XV64(0x129f871e249968af), XV64(0x2b63d9e6220e4a), XV64(0x1c15d792f40628f8), - XV64(0x1f6be8652129c2dc), XV64(0x3555c2e330de46e), XV64(0x11e1b8e9f1b6828b), XV64(0xddf0ca2e392a439), - XV64(0x27f497c80174272), XV64(0x1e41fd37923364c0), XV64(0xcf519f050880225), XV64(0x10cbadbb42ac2497), - XV64(0xa09661ffad7d66d), XV64(0x1637d254e8f3f0df), XV64(0x48336932a48963a), XV64(0x18bd82d8386cb088), - XV64(0x171dc7065be956c3), XV64(0xb23734d49cd7071), XV64(0x1997978a8b761694), XV64(0x5a923c199523026), - XV64(0x6d71c364c7dda02), XV64(0x1ae9a87d5e59fcb0), XV64(0x85d4cba9ce29a55), XV64(0x1463f8f18ec6bce7), - XV64(0x1bc3bd2fed435aac), XV64(0x7fd0964ff677c1e), XV64(0x1549eda33ddc1afb), XV64(0x97759e82ff83c49), - XV64(0x1d26e388e5028b22), XV64(0x11857c3f726ad90), XV64(0x13acb304359dcb75), XV64(0xf92074f27b9edc7), - XV64(0x324291443c0b8c), XV64(0x1c0cf6da56182d3e), XV64(0xeb8121d94a34bdb), XV64(0x1286a65686876d69), - XV64(0x11f899a153a8874d), XV64(0xdc62dea418ca1ff), XV64(0x1f72c92d8337c71a), XV64(0x34c7d669113e1a8), - XV64(0xcec38b8f29607e3), XV64(0x10d28cf3e0b22151), XV64(0x2666834220947b4), XV64(0x1e58dc7f302d6106), - XV64(0x49a17db885693fc), XV64(0x18a4a3909a72b54e), XV64(0xa10475758c9d3ab), XV64(0x162ef31c4aedf519), - XV64(0x198eb6c229681352), XV64(0x5b002893b4c35e0), XV64(0x1704e64ef9f75305), XV64(0xb3a5205ebd375b7), - XV64(0x8446df23efc9f93), XV64(0x147ad9b92cd8b921), XV64(0x6ce3d7eee63dfc4), XV64(0x1af08935fc47f976), - XV64(0x1550cceb9fc21f3d), XV64(0x96e78a08de6398f), XV64(0x1bda9c674f5d5f6a), XV64(0x7e4282c5d7979d8), - XV64(0x18a83334cb7db7ad), XV64(0x496877fd959911f), XV64(0x162263b81be2f7fa), XV64(0xa1cd7f309c6d148), - XV64(0x5bc922d6a433703), XV64(0x19822666786711b1), XV64(0xb36c2a1badc7754), XV64(0x170876eaa8f851e6), - XV64(0x1476491d7dd7bbc2), XV64(0x848fd566ff39d70), XV64(0x1afc1991ad48fb95), XV64(0x6c2addabf6cdd27), - XV64(0x962e804dce93b6c), XV64(0x155c5c4fcecd1dde), XV64(0x7e8b8880c767b3b), XV64(0x1bd60cc31e525d89), - XV64(0x114c767a629af73), XV64(0x1d2a732cb40d89c1), XV64(0xf9e97eb76b6ef24), XV64(0x13a023a06492c996), - XV64(0x1c00667e07172fdd), XV64(0x3ed2351533096f), XV64(0x128a36f2d7886f8a), XV64(0xeb482b9c5ac4938), - XV64(0xdcabd4e1083a31c), XV64(0x11f4090502a785ae), XV64(0x340edc2c01ce34b), XV64(0x1f7e5989d238c5f9), - XV64(0x10de1c57b1bd23b2), XV64(0xce0a81ca3990500), XV64(0x1e544cdb612263e5), XV64(0x26af89073064557) -}; - -#endif /* if defined(XRABPLY_TYPE64) */ - -#if defined(XRABPLY_TYPE32) - -#if !defined(XV32) -#define XV32(v) ((xply_word) v ## ULL) -#endif - -#define XRAB_ROOTPOLY XV32(0xabd1f37b) - -#define XRAB_SHIFT 23 -#define XRAB_WNDSIZE 20 - -typedef unsigned XRABPLY_TYPE32 xply_word; - -static const xply_word T[256] = { - XV32(0x0), XV32(0xabd1f37b), XV32(0x57a3e6f6), XV32(0xfc72158d), - XV32(0x4963e97), XV32(0xaf47cdec), XV32(0x5335d861), XV32(0xf8e42b1a), - XV32(0x92c7d2e), XV32(0xa2fd8e55), XV32(0x5e8f9bd8), XV32(0xf55e68a3), - XV32(0xdba43b9), XV32(0xa66bb0c2), XV32(0x5a19a54f), XV32(0xf1c85634), - XV32(0x1258fa5c), XV32(0xb9890927), XV32(0x45fb1caa), XV32(0xee2aefd1), - XV32(0x16cec4cb), XV32(0xbd1f37b0), XV32(0x416d223d), XV32(0xeabcd146), - XV32(0x1b748772), XV32(0xb0a57409), XV32(0x4cd76184), XV32(0xe70692ff), - XV32(0x1fe2b9e5), XV32(0xb4334a9e), XV32(0x48415f13), XV32(0xe390ac68), - XV32(0x24b1f4b8), XV32(0x8f6007c3), XV32(0x7312124e), XV32(0xd8c3e135), - XV32(0x2027ca2f), XV32(0x8bf63954), XV32(0x77842cd9), XV32(0xdc55dfa2), - XV32(0x2d9d8996), XV32(0x864c7aed), XV32(0x7a3e6f60), XV32(0xd1ef9c1b), - XV32(0x290bb701), XV32(0x82da447a), XV32(0x7ea851f7), XV32(0xd579a28c), - XV32(0x36e90ee4), XV32(0x9d38fd9f), XV32(0x614ae812), XV32(0xca9b1b69), - XV32(0x327f3073), XV32(0x99aec308), XV32(0x65dcd685), XV32(0xce0d25fe), - XV32(0x3fc573ca), XV32(0x941480b1), XV32(0x6866953c), XV32(0xc3b76647), - XV32(0x3b534d5d), XV32(0x9082be26), XV32(0x6cf0abab), XV32(0xc72158d0), - XV32(0x4963e970), XV32(0xe2b21a0b), XV32(0x1ec00f86), XV32(0xb511fcfd), - XV32(0x4df5d7e7), XV32(0xe624249c), XV32(0x1a563111), XV32(0xb187c26a), - XV32(0x404f945e), XV32(0xeb9e6725), XV32(0x17ec72a8), XV32(0xbc3d81d3), - XV32(0x44d9aac9), XV32(0xef0859b2), XV32(0x137a4c3f), XV32(0xb8abbf44), - XV32(0x5b3b132c), XV32(0xf0eae057), XV32(0xc98f5da), XV32(0xa74906a1), - XV32(0x5fad2dbb), XV32(0xf47cdec0), XV32(0x80ecb4d), XV32(0xa3df3836), - XV32(0x52176e02), XV32(0xf9c69d79), XV32(0x5b488f4), XV32(0xae657b8f), - XV32(0x56815095), XV32(0xfd50a3ee), XV32(0x122b663), XV32(0xaaf34518), - XV32(0x6dd21dc8), XV32(0xc603eeb3), XV32(0x3a71fb3e), XV32(0x91a00845), - XV32(0x6944235f), XV32(0xc295d024), XV32(0x3ee7c5a9), XV32(0x953636d2), - XV32(0x64fe60e6), XV32(0xcf2f939d), XV32(0x335d8610), XV32(0x988c756b), - XV32(0x60685e71), XV32(0xcbb9ad0a), XV32(0x37cbb887), XV32(0x9c1a4bfc), - XV32(0x7f8ae794), XV32(0xd45b14ef), XV32(0x28290162), XV32(0x83f8f219), - XV32(0x7b1cd903), XV32(0xd0cd2a78), XV32(0x2cbf3ff5), XV32(0x876ecc8e), - XV32(0x76a69aba), XV32(0xdd7769c1), XV32(0x21057c4c), XV32(0x8ad48f37), - XV32(0x7230a42d), XV32(0xd9e15756), XV32(0x259342db), XV32(0x8e42b1a0), - XV32(0x3916219b), XV32(0x92c7d2e0), XV32(0x6eb5c76d), XV32(0xc5643416), - XV32(0x3d801f0c), XV32(0x9651ec77), XV32(0x6a23f9fa), XV32(0xc1f20a81), - XV32(0x303a5cb5), XV32(0x9bebafce), XV32(0x6799ba43), XV32(0xcc484938), - XV32(0x34ac6222), XV32(0x9f7d9159), XV32(0x630f84d4), XV32(0xc8de77af), - XV32(0x2b4edbc7), XV32(0x809f28bc), XV32(0x7ced3d31), XV32(0xd73cce4a), - XV32(0x2fd8e550), XV32(0x8409162b), XV32(0x787b03a6), XV32(0xd3aaf0dd), - XV32(0x2262a6e9), XV32(0x89b35592), XV32(0x75c1401f), XV32(0xde10b364), - XV32(0x26f4987e), XV32(0x8d256b05), XV32(0x71577e88), XV32(0xda868df3), - XV32(0x1da7d523), XV32(0xb6762658), XV32(0x4a0433d5), XV32(0xe1d5c0ae), - XV32(0x1931ebb4), XV32(0xb2e018cf), XV32(0x4e920d42), XV32(0xe543fe39), - XV32(0x148ba80d), XV32(0xbf5a5b76), XV32(0x43284efb), XV32(0xe8f9bd80), - XV32(0x101d969a), XV32(0xbbcc65e1), XV32(0x47be706c), XV32(0xec6f8317), - XV32(0xfff2f7f), XV32(0xa42edc04), XV32(0x585cc989), XV32(0xf38d3af2), - XV32(0xb6911e8), XV32(0xa0b8e293), XV32(0x5ccaf71e), XV32(0xf71b0465), - XV32(0x6d35251), XV32(0xad02a12a), XV32(0x5170b4a7), XV32(0xfaa147dc), - XV32(0x2456cc6), XV32(0xa9949fbd), XV32(0x55e68a30), XV32(0xfe37794b), - XV32(0x7075c8eb), XV32(0xdba43b90), XV32(0x27d62e1d), XV32(0x8c07dd66), - XV32(0x74e3f67c), XV32(0xdf320507), XV32(0x2340108a), XV32(0x8891e3f1), - XV32(0x7959b5c5), XV32(0xd28846be), XV32(0x2efa5333), XV32(0x852ba048), - XV32(0x7dcf8b52), XV32(0xd61e7829), XV32(0x2a6c6da4), XV32(0x81bd9edf), - XV32(0x622d32b7), XV32(0xc9fcc1cc), XV32(0x358ed441), XV32(0x9e5f273a), - XV32(0x66bb0c20), XV32(0xcd6aff5b), XV32(0x3118ead6), XV32(0x9ac919ad), - XV32(0x6b014f99), XV32(0xc0d0bce2), XV32(0x3ca2a96f), XV32(0x97735a14), - XV32(0x6f97710e), XV32(0xc4468275), XV32(0x383497f8), XV32(0x93e56483), - XV32(0x54c43c53), XV32(0xff15cf28), XV32(0x367daa5), XV32(0xa8b629de), - XV32(0x505202c4), XV32(0xfb83f1bf), XV32(0x7f1e432), XV32(0xac201749), - XV32(0x5de8417d), XV32(0xf639b206), XV32(0xa4ba78b), XV32(0xa19a54f0), - XV32(0x597e7fea), XV32(0xf2af8c91), XV32(0xedd991c), XV32(0xa50c6a67), - XV32(0x469cc60f), XV32(0xed4d3574), XV32(0x113f20f9), XV32(0xbaeed382), - XV32(0x420af898), XV32(0xe9db0be3), XV32(0x15a91e6e), XV32(0xbe78ed15), - XV32(0x4fb0bb21), XV32(0xe461485a), XV32(0x18135dd7), XV32(0xb3c2aeac), - XV32(0x4b2685b6), XV32(0xe0f776cd), XV32(0x1c856340), XV32(0xb754903b) -}; - -static const xply_word U[256] = { - XV32(0x0), XV32(0x5ce33923), XV32(0x1217813d), XV32(0x4ef4b81e), - XV32(0x242f027a), XV32(0x78cc3b59), XV32(0x36388347), XV32(0x6adbba64), - XV32(0x485e04f4), XV32(0x14bd3dd7), XV32(0x5a4985c9), XV32(0x6aabcea), - XV32(0x6c71068e), XV32(0x30923fad), XV32(0x7e6687b3), XV32(0x2285be90), - XV32(0x3b6dfa93), XV32(0x678ec3b0), XV32(0x297a7bae), XV32(0x7599428d), - XV32(0x1f42f8e9), XV32(0x43a1c1ca), XV32(0xd5579d4), XV32(0x51b640f7), - XV32(0x7333fe67), XV32(0x2fd0c744), XV32(0x61247f5a), XV32(0x3dc74679), - XV32(0x571cfc1d), XV32(0xbffc53e), XV32(0x450b7d20), XV32(0x19e84403), - XV32(0x76dbf526), XV32(0x2a38cc05), XV32(0x64cc741b), XV32(0x382f4d38), - XV32(0x52f4f75c), XV32(0xe17ce7f), XV32(0x40e37661), XV32(0x1c004f42), - XV32(0x3e85f1d2), XV32(0x6266c8f1), XV32(0x2c9270ef), XV32(0x707149cc), - XV32(0x1aaaf3a8), XV32(0x4649ca8b), XV32(0x8bd7295), XV32(0x545e4bb6), - XV32(0x4db60fb5), XV32(0x11553696), XV32(0x5fa18e88), XV32(0x342b7ab), - XV32(0x69990dcf), XV32(0x357a34ec), XV32(0x7b8e8cf2), XV32(0x276db5d1), - XV32(0x5e80b41), XV32(0x590b3262), XV32(0x17ff8a7c), XV32(0x4b1cb35f), - XV32(0x21c7093b), XV32(0x7d243018), XV32(0x33d08806), XV32(0x6f33b125), - XV32(0x46661937), XV32(0x1a852014), XV32(0x5471980a), XV32(0x892a129), - XV32(0x62491b4d), XV32(0x3eaa226e), XV32(0x705e9a70), XV32(0x2cbda353), - XV32(0xe381dc3), XV32(0x52db24e0), XV32(0x1c2f9cfe), XV32(0x40cca5dd), - XV32(0x2a171fb9), XV32(0x76f4269a), XV32(0x38009e84), XV32(0x64e3a7a7), - XV32(0x7d0be3a4), XV32(0x21e8da87), XV32(0x6f1c6299), XV32(0x33ff5bba), - XV32(0x5924e1de), XV32(0x5c7d8fd), XV32(0x4b3360e3), XV32(0x17d059c0), - XV32(0x3555e750), XV32(0x69b6de73), XV32(0x2742666d), XV32(0x7ba15f4e), - XV32(0x117ae52a), XV32(0x4d99dc09), XV32(0x36d6417), XV32(0x5f8e5d34), - XV32(0x30bdec11), XV32(0x6c5ed532), XV32(0x22aa6d2c), XV32(0x7e49540f), - XV32(0x1492ee6b), XV32(0x4871d748), XV32(0x6856f56), XV32(0x5a665675), - XV32(0x78e3e8e5), XV32(0x2400d1c6), XV32(0x6af469d8), XV32(0x361750fb), - XV32(0x5cccea9f), XV32(0x2fd3bc), XV32(0x4edb6ba2), XV32(0x12385281), - XV32(0xbd01682), XV32(0x57332fa1), XV32(0x19c797bf), XV32(0x4524ae9c), - XV32(0x2fff14f8), XV32(0x731c2ddb), XV32(0x3de895c5), XV32(0x610bace6), - XV32(0x438e1276), XV32(0x1f6d2b55), XV32(0x5199934b), XV32(0xd7aaa68), - XV32(0x67a1100c), XV32(0x3b42292f), XV32(0x75b69131), XV32(0x2955a812), - XV32(0x271dc115), XV32(0x7bfef836), XV32(0x350a4028), XV32(0x69e9790b), - XV32(0x332c36f), XV32(0x5fd1fa4c), XV32(0x11254252), XV32(0x4dc67b71), - XV32(0x6f43c5e1), XV32(0x33a0fcc2), XV32(0x7d5444dc), XV32(0x21b77dff), - XV32(0x4b6cc79b), XV32(0x178ffeb8), XV32(0x597b46a6), XV32(0x5987f85), - XV32(0x1c703b86), XV32(0x409302a5), XV32(0xe67babb), XV32(0x52848398), - XV32(0x385f39fc), XV32(0x64bc00df), XV32(0x2a48b8c1), XV32(0x76ab81e2), - XV32(0x542e3f72), XV32(0x8cd0651), XV32(0x4639be4f), XV32(0x1ada876c), - XV32(0x70013d08), XV32(0x2ce2042b), XV32(0x6216bc35), XV32(0x3ef58516), - XV32(0x51c63433), XV32(0xd250d10), XV32(0x43d1b50e), XV32(0x1f328c2d), - XV32(0x75e93649), XV32(0x290a0f6a), XV32(0x67feb774), XV32(0x3b1d8e57), - XV32(0x199830c7), XV32(0x457b09e4), XV32(0xb8fb1fa), XV32(0x576c88d9), - XV32(0x3db732bd), XV32(0x61540b9e), XV32(0x2fa0b380), XV32(0x73438aa3), - XV32(0x6aabcea0), XV32(0x3648f783), XV32(0x78bc4f9d), XV32(0x245f76be), - XV32(0x4e84ccda), XV32(0x1267f5f9), XV32(0x5c934de7), XV32(0x7074c4), - XV32(0x22f5ca54), XV32(0x7e16f377), XV32(0x30e24b69), XV32(0x6c01724a), - XV32(0x6dac82e), XV32(0x5a39f10d), XV32(0x14cd4913), XV32(0x482e7030), - XV32(0x617bd822), XV32(0x3d98e101), XV32(0x736c591f), XV32(0x2f8f603c), - XV32(0x4554da58), XV32(0x19b7e37b), XV32(0x57435b65), XV32(0xba06246), - XV32(0x2925dcd6), XV32(0x75c6e5f5), XV32(0x3b325deb), XV32(0x67d164c8), - XV32(0xd0adeac), XV32(0x51e9e78f), XV32(0x1f1d5f91), XV32(0x43fe66b2), - XV32(0x5a1622b1), XV32(0x6f51b92), XV32(0x4801a38c), XV32(0x14e29aaf), - XV32(0x7e3920cb), XV32(0x22da19e8), XV32(0x6c2ea1f6), XV32(0x30cd98d5), - XV32(0x12482645), XV32(0x4eab1f66), XV32(0x5fa778), XV32(0x5cbc9e5b), - XV32(0x3667243f), XV32(0x6a841d1c), XV32(0x2470a502), XV32(0x78939c21), - XV32(0x17a02d04), XV32(0x4b431427), XV32(0x5b7ac39), XV32(0x5954951a), - XV32(0x338f2f7e), XV32(0x6f6c165d), XV32(0x2198ae43), XV32(0x7d7b9760), - XV32(0x5ffe29f0), XV32(0x31d10d3), XV32(0x4de9a8cd), XV32(0x110a91ee), - XV32(0x7bd12b8a), XV32(0x273212a9), XV32(0x69c6aab7), XV32(0x35259394), - XV32(0x2ccdd797), XV32(0x702eeeb4), XV32(0x3eda56aa), XV32(0x62396f89), - XV32(0x8e2d5ed), XV32(0x5401ecce), XV32(0x1af554d0), XV32(0x46166df3), - XV32(0x6493d363), XV32(0x3870ea40), XV32(0x7684525e), XV32(0x2a676b7d), - XV32(0x40bcd119), XV32(0x1c5fe83a), XV32(0x52ab5024), XV32(0xe486907) -}; - -#endif /* if defined(XRABPLY_TYPE32) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xtypes.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xtypes.h deleted file mode 100644 index 3593a664..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xtypes.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XTYPES_H) -#define XTYPES_H - - - -typedef struct s_chanode { - struct s_chanode *next; - long icurr; -} chanode_t; - -typedef struct s_chastore { - chanode_t *head, *tail; - long isize, nsize; - chanode_t *ancur; - chanode_t *sncur; - long scurr; -} chastore_t; - -typedef struct s_xrecord { - struct s_xrecord *next; - char const *ptr; - long size; - unsigned long ha; -} xrecord_t; - -typedef struct s_xdfile { - chastore_t rcha; - long nrec; - unsigned int hbits; - xrecord_t **rhash; - long dstart, dend; - xrecord_t **recs; - char *rchg; - long *rindex; - long nreff; - unsigned long *ha; -} xdfile_t; - -typedef struct s_xdfenv { - xdfile_t xdf1, xdf2; -} xdfenv_t; - - - -#endif /* #if !defined(XTYPES_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.c deleted file mode 100644 index e1b0bc27..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.c +++ /dev/null @@ -1,580 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - - -#define XDL_GUESS_NLINES 256 - - - - -long xdl_bogosqrt(long n) { - long i; - - /* - * Classical integer square root approximation using shifts. - */ - for (i = 1; n > 0; n >>= 2) - i <<= 1; - - return i; -} - - -int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize, - xdemitcb_t *ecb) { - int i = 2; - mmbuffer_t mb[3]; - - mb[0].ptr = (char *) pre; - mb[0].size = psize; - mb[1].ptr = (char *) rec; - mb[1].size = size; - if (size > 0 && rec[size - 1] != '\n') { - mb[2].ptr = (char *) "\n\\ No newline at end of file\n"; - mb[2].size = strlen(mb[2].ptr); - i++; - } - if (ecb->outf(ecb->priv, mb, i) < 0) { - - return -1; - } - - return 0; -} - - -int xdl_init_mmfile(mmfile_t *mmf, long bsize, unsigned long flags) { - - mmf->flags = flags; - mmf->head = mmf->tail = NULL; - mmf->bsize = bsize; - mmf->fsize = 0; - mmf->rcur = mmf->wcur = NULL; - mmf->rpos = 0; - - return 0; -} - - -void xdl_free_mmfile(mmfile_t *mmf) { - mmblock_t *cur, *tmp; - - for (cur = mmf->head; (tmp = cur) != NULL;) { - cur = cur->next; - xdl_free(tmp); - } -} - - -int xdl_mmfile_iscompact(mmfile_t *mmf) { - - return mmf->head == mmf->tail; -} - - -int xdl_seek_mmfile(mmfile_t *mmf, long off) { - long bsize; - - if (xdl_mmfile_first(mmf, &bsize)) { - do { - if (off < bsize) { - mmf->rpos = off; - return 0; - } - off -= bsize; - } while (xdl_mmfile_next(mmf, &bsize)); - } - - return -1; -} - - -long xdl_read_mmfile(mmfile_t *mmf, void *data, long size) { - long rsize, csize; - char *ptr = data; - mmblock_t *rcur; - - for (rsize = 0, rcur = mmf->rcur; rcur && rsize < size;) { - if (mmf->rpos >= rcur->size) { - if (!(mmf->rcur = rcur = rcur->next)) - break; - mmf->rpos = 0; - } - csize = XDL_MIN(size - rsize, rcur->size - mmf->rpos); - memcpy(ptr, rcur->ptr + mmf->rpos, csize); - rsize += csize; - ptr += csize; - mmf->rpos += csize; - } - - return rsize; -} - - -long xdl_write_mmfile(mmfile_t *mmf, void const *data, long size) { - long wsize, bsize, csize; - mmblock_t *wcur; - - for (wsize = 0; wsize < size;) { - wcur = mmf->wcur; - if (wcur && (wcur->flags & XDL_MMB_READONLY)) - return wsize; - if (!wcur || wcur->size == wcur->bsize || - (mmf->flags & XDL_MMF_ATOMIC && wcur->size + size > wcur->bsize)) { - bsize = XDL_MAX(mmf->bsize, size); - if (!(wcur = (mmblock_t *) xdl_malloc(sizeof(mmblock_t) + bsize))) { - - return wsize; - } - wcur->flags = 0; - wcur->ptr = (char *) wcur + sizeof(mmblock_t); - wcur->size = 0; - wcur->bsize = bsize; - wcur->next = NULL; - if (!mmf->head) - mmf->head = wcur; - if (mmf->tail) - mmf->tail->next = wcur; - mmf->tail = wcur; - mmf->wcur = wcur; - } - csize = XDL_MIN(size - wsize, wcur->bsize - wcur->size); - memcpy(wcur->ptr + wcur->size, (char const *) data + wsize, csize); - wsize += csize; - wcur->size += csize; - mmf->fsize += csize; - } - - return size; -} - - -long xdl_writem_mmfile(mmfile_t *mmf, mmbuffer_t *mb, int nbuf) { - int i; - long size; - char *data; - - for (i = 0, size = 0; i < nbuf; i++) - size += mb[i].size; - if (!(data = (char *) xdl_mmfile_writeallocate(mmf, size))) - return -1; - for (i = 0; i < nbuf; i++) { - memcpy(data, mb[i].ptr, mb[i].size); - data += mb[i].size; - } - - return size; -} - - -void *xdl_mmfile_writeallocate(mmfile_t *mmf, long size) { - long bsize; - mmblock_t *wcur; - char *blk; - - if (!(wcur = mmf->wcur) || wcur->size + size > wcur->bsize) { - bsize = XDL_MAX(mmf->bsize, size); - if (!(wcur = (mmblock_t *) xdl_malloc(sizeof(mmblock_t) + bsize))) { - - return NULL; - } - wcur->flags = 0; - wcur->ptr = (char *) wcur + sizeof(mmblock_t); - wcur->size = 0; - wcur->bsize = bsize; - wcur->next = NULL; - if (!mmf->head) - mmf->head = wcur; - if (mmf->tail) - mmf->tail->next = wcur; - mmf->tail = wcur; - mmf->wcur = wcur; - } - - blk = wcur->ptr + wcur->size; - wcur->size += size; - mmf->fsize += size; - - return blk; -} - - -long xdl_mmfile_ptradd(mmfile_t *mmf, char *ptr, long size, unsigned long flags) { - mmblock_t *wcur; - - if (!(wcur = (mmblock_t *) xdl_malloc(sizeof(mmblock_t)))) { - - return -1; - } - wcur->flags = flags; - wcur->ptr = ptr; - wcur->size = wcur->bsize = size; - wcur->next = NULL; - if (!mmf->head) - mmf->head = wcur; - if (mmf->tail) - mmf->tail->next = wcur; - mmf->tail = wcur; - mmf->wcur = wcur; - - mmf->fsize += size; - - return size; -} - - -long xdl_copy_mmfile(mmfile_t *mmf, long size, xdemitcb_t *ecb) { - long rsize, csize; - mmblock_t *rcur; - mmbuffer_t mb; - - for (rsize = 0, rcur = mmf->rcur; rcur && rsize < size;) { - if (mmf->rpos >= rcur->size) { - if (!(mmf->rcur = rcur = rcur->next)) - break; - mmf->rpos = 0; - } - csize = XDL_MIN(size - rsize, rcur->size - mmf->rpos); - mb.ptr = rcur->ptr + mmf->rpos; - mb.size = csize; - if (ecb->outf(ecb->priv, &mb, 1) < 0) { - - return rsize; - } - rsize += csize; - mmf->rpos += csize; - } - - return rsize; -} - - -void *xdl_mmfile_first(mmfile_t *mmf, long *size) { - - if (!(mmf->rcur = mmf->head)) - return NULL; - - *size = mmf->rcur->size; - - return mmf->rcur->ptr; -} - - -void *xdl_mmfile_next(mmfile_t *mmf, long *size) { - - if (!mmf->rcur || !(mmf->rcur = mmf->rcur->next)) - return NULL; - - *size = mmf->rcur->size; - - return mmf->rcur->ptr; -} - - -long xdl_mmfile_size(mmfile_t *mmf) { - - return mmf->fsize; -} - - -int xdl_mmfile_cmp(mmfile_t *mmf1, mmfile_t *mmf2) { - int cres; - long size, bsize1, bsize2, size1, size2; - char const *blk1, *cur1, *top1; - char const *blk2, *cur2, *top2; - - if ((cur1 = blk1 = xdl_mmfile_first(mmf1, &bsize1)) != NULL) - top1 = blk1 + bsize1; - if ((cur2 = blk2 = xdl_mmfile_first(mmf2, &bsize2)) != NULL) - top2 = blk2 + bsize2; - if (!cur1) { - if (!cur2 || xdl_mmfile_size(mmf2) == 0) - return 0; - return -*cur2; - } else if (!cur2) - return xdl_mmfile_size(mmf1) ? *cur1: 0; - for (;;) { - if (cur1 >= top1) { - if ((cur1 = blk1 = xdl_mmfile_next(mmf1, &bsize1)) != NULL) - top1 = blk1 + bsize1; - } - if (cur2 >= top2) { - if ((cur2 = blk2 = xdl_mmfile_next(mmf2, &bsize2)) != NULL) - top2 = blk2 + bsize2; - } - if (!cur1) { - if (!cur2) - break; - return -*cur2; - } else if (!cur2) - return *cur1; - size1 = top1 - cur1; - size2 = top2 - cur2; - size = XDL_MIN(size1, size2); - if ((cres = memcmp(cur1, cur2, size)) != 0) - return cres; - cur1 += size; - cur2 += size; - } - - return 0; -} - - -int xdl_mmfile_compact(mmfile_t *mmfo, mmfile_t *mmfc, long bsize, unsigned long flags) { - long fsize = xdl_mmfile_size(mmfo), size; - char *data; - char const *blk; - - if (xdl_init_mmfile(mmfc, bsize, flags) < 0) { - - return -1; - } - if (!(data = (char *) xdl_mmfile_writeallocate(mmfc, fsize))) { - - xdl_free_mmfile(mmfc); - return -1; - } - if ((blk = (char const *) xdl_mmfile_first(mmfo, &size)) != NULL) { - do { - memcpy(data, blk, size); - data += size; - } while ((blk = (char const *) xdl_mmfile_next(mmfo, &size)) != NULL); - } - - return 0; -} - - -int xdl_mmfile_outf(void *priv, mmbuffer_t *mb, int nbuf) { - mmfile_t *mmf = priv; - - if (xdl_writem_mmfile(mmf, mb, nbuf) < 0) { - - return -1; - } - - return 0; -} - - -int xdl_cha_init(chastore_t *cha, long isize, long icount) { - - cha->head = cha->tail = NULL; - cha->isize = isize; - cha->nsize = icount * isize; - cha->ancur = cha->sncur = NULL; - cha->scurr = 0; - - return 0; -} - - -void xdl_cha_free(chastore_t *cha) { - chanode_t *cur, *tmp; - - for (cur = cha->head; (tmp = cur) != NULL;) { - cur = cur->next; - xdl_free(tmp); - } -} - - -void *xdl_cha_alloc(chastore_t *cha) { - chanode_t *ancur; - void *data; - - if (!(ancur = cha->ancur) || ancur->icurr == cha->nsize) { - if (!(ancur = (chanode_t *) xdl_malloc(sizeof(chanode_t) + cha->nsize))) { - - return NULL; - } - ancur->icurr = 0; - ancur->next = NULL; - if (cha->tail) - cha->tail->next = ancur; - if (!cha->head) - cha->head = ancur; - cha->tail = ancur; - cha->ancur = ancur; - } - - data = (char *) ancur + sizeof(chanode_t) + ancur->icurr; - ancur->icurr += cha->isize; - - return data; -} - - -void *xdl_cha_first(chastore_t *cha) { - chanode_t *sncur; - - if (!(cha->sncur = sncur = cha->head)) - return NULL; - - cha->scurr = 0; - - return (char *) sncur + sizeof(chanode_t) + cha->scurr; -} - - -void *xdl_cha_next(chastore_t *cha) { - chanode_t *sncur; - - if (!(sncur = cha->sncur)) - return NULL; - cha->scurr += cha->isize; - if (cha->scurr == sncur->icurr) { - if (!(sncur = cha->sncur = sncur->next)) - return NULL; - cha->scurr = 0; - } - - return (char *) sncur + sizeof(chanode_t) + cha->scurr; -} - - -long xdl_guess_lines(mmfile_t *mf) { - long nl = 0, size, tsize = 0; - char const *data, *cur, *top; - - if ((cur = data = xdl_mmfile_first(mf, &size)) != NULL) { - for (top = data + size; nl < XDL_GUESS_NLINES;) { - if (cur >= top) { - tsize += (long) (cur - data); - if (!(cur = data = xdl_mmfile_next(mf, &size))) - break; - top = data + size; - } - nl++; - if (!(cur = memchr(cur, '\n', top - cur))) - cur = top; - else - cur++; - } - tsize += (long) (cur - data); - } - - if (nl && tsize) - nl = xdl_mmfile_size(mf) / (tsize / nl); - - return nl + 1; -} - - -unsigned long xdl_hash_record(char const **data, char const *top) { - unsigned long ha = 5381; - char const *ptr = *data; - - for (; ptr < top && *ptr != '\n'; ptr++) { - ha += (ha << 5); - ha ^= (unsigned long) *ptr; - } - *data = ptr < top ? ptr + 1: ptr; - - return ha; -} - - -unsigned int xdl_hashbits(unsigned int size) { - unsigned int val = 1, bits = 0; - - for (; val < size && bits < CHAR_BIT * sizeof(unsigned int); val <<= 1, bits++); - return bits ? bits: 1; -} - - -int xdl_num_out(char *out, long val) { - char *ptr, *str = out; - char buf[32]; - - ptr = buf + sizeof(buf) - 1; - *ptr = '\0'; - if (val < 0) { - *--ptr = '-'; - val = -val; - } - for (; val && ptr > buf; val /= 10) - *--ptr = "0123456789"[val % 10]; - if (*ptr) - for (; *ptr; ptr++, str++) - *str = *ptr; - else - *str++ = '0'; - *str = '\0'; - - return str - out; -} - - -long xdl_atol(char const *str, char const **next) { - long val, base; - char const *top; - - for (top = str; XDL_ISDIGIT(*top); top++); - if (next) - *next = top; - for (val = 0, base = 1, top--; top >= str; top--, base *= 10) - val += base * (long)(*top - '0'); - return val; -} - - -int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, xdemitcb_t *ecb) { - int nb = 0; - mmbuffer_t mb; - char buf[128]; - - memcpy(buf, "@@ -", 4); - nb += 4; - - nb += xdl_num_out(buf + nb, c1 ? s1: s1 - 1); - - memcpy(buf + nb, ",", 1); - nb += 1; - - nb += xdl_num_out(buf + nb, c1); - - memcpy(buf + nb, " +", 2); - nb += 2; - - nb += xdl_num_out(buf + nb, c2 ? s2: s2 - 1); - - memcpy(buf + nb, ",", 1); - nb += 1; - - nb += xdl_num_out(buf + nb, c2); - - memcpy(buf + nb, " @@\n", 4); - nb += 4; - - mb.ptr = buf; - mb.size = nb; - if (ecb->outf(ecb->priv, &mb, 1) < 0) - return -1; - - return 0; -} - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.h b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.h deleted file mode 100644 index 4ceae33f..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xutils.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#if !defined(XUTILS_H) -#define XUTILS_H - - - -long xdl_bogosqrt(long n); -int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize, - xdemitcb_t *ecb); -int xdl_mmfile_outf(void *priv, mmbuffer_t *mb, int nbuf); -int xdl_cha_init(chastore_t *cha, long isize, long icount); -void xdl_cha_free(chastore_t *cha); -void *xdl_cha_alloc(chastore_t *cha); -void *xdl_cha_first(chastore_t *cha); -void *xdl_cha_next(chastore_t *cha); -long xdl_guess_lines(mmfile_t *mf); -unsigned long xdl_hash_record(char const **data, char const *top); -unsigned int xdl_hashbits(unsigned int size); -int xdl_num_out(char *out, long val); -long xdl_atol(char const *str, char const **next); -int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, xdemitcb_t *ecb); - - - -#endif /* #if !defined(XUTILS_H) */ - diff --git a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xversion.c b/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xversion.c deleted file mode 100644 index d3184392..00000000 --- a/gems/xdiff-rb/ext/xdiff/xdiff/xdiff/xversion.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - * LibXDiff by Davide Libenzi ( File Differential Library ) - * Copyright (C) 2003 Davide Libenzi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Davide Libenzi - * - */ - -#include "xinclude.h" - - -char libxdiff_version[] = "LibXDiff v" PACKAGE_VERSION " by Davide Libenzi "; - diff --git a/gems/xdiff-rb/lib/xdiff.rb b/gems/xdiff-rb/lib/xdiff.rb deleted file mode 100644 index 6bd0aedc..00000000 --- a/gems/xdiff-rb/lib/xdiff.rb +++ /dev/null @@ -1,28 +0,0 @@ -# typed: true -module XDiff - VERSION = "0.0.1" - - def self.validate_arg(method, name, arg) - raise ArgumentError.new("(#{method}) '#{name}' cannot be nil") if arg.nil? - unless arg.is_a?(String) - raise ArgumentError.new( - "(#{method}) '#{name}' must be String (is #{arg.class})" - ) - end - end - - def self.diff(a, b) - validate_arg("diff", "a", a) - validate_arg("diff", "b", b) - Native.diff(a, b) - end - def self.patch(a, b) - validate_arg("patch", "a", a) - validate_arg("patch", "b", b) - Native.patch(a, b) - end -end - -# XDiff::Native methods defined by extension.cc -require "xdiff/extension" -XDiff::Native.init diff --git a/gems/xdiff-rb/test/xdiff_test.rb b/gems/xdiff-rb/test/xdiff_test.rb deleted file mode 100644 index 4e104be3..00000000 --- a/gems/xdiff-rb/test/xdiff_test.rb +++ /dev/null @@ -1,33 +0,0 @@ -# typed: true -require "minitest/autorun" -require "xdiff" - -class TestXDiff < Minitest::Test - def assert_patches(a, b) - diff = XDiff.diff(a, b) - - diff_hex = diff.unpack("H*").first - puts "diff (#{diff.size}): #{diff_hex}" - - refute_equal "", diff - stitched = XDiff.patch(a, diff) - assert_equal b, stitched - end - - def test_raises - assert_raises(ArgumentError) { XDiff.patch(nil, "") } - assert_raises(ArgumentError) { XDiff.patch("", nil) } - assert_raises(ArgumentError) { XDiff.patch("", 123) } - assert_raises(ArgumentError) { XDiff.patch(123, "") } - end - - def test_patch - assert_patches("foo bar", "foo bar") - assert_patches("", "") - assert_patches("foo", "") - assert_patches("", "foo") - assert_patches("abc\x00123", "123") - assert_patches("abc\x00123", "\x00") - assert_patches("\x00", "\x00") - end -end diff --git a/gems/xdiff-rb/xdiff.gemspec b/gems/xdiff-rb/xdiff.gemspec deleted file mode 100644 index fb9623fd..00000000 --- a/gems/xdiff-rb/xdiff.gemspec +++ /dev/null @@ -1,23 +0,0 @@ -require "rake" - -Gem::Specification.new do |s| - s.name = "xdiff" - s.version = "0.0.1" - s.summary = "libxdiff bindings" - s.description = "A simple hello world gem" - s.authors = ["Dylan Knutson"] - s.email = "dymk@dymk.co" - s.files = FileList[ - "lib/xdiff.rb", - "ext/xdiff/extconf.rb", - "ext/xdiff/extension.cc", - "ext/xdiff/xdiff.tar.gz", - ] - s.homepage = - "https://rubygems.org/gems/xdiff" - s.license = "MIT" - s.extensions = %w[ext/xdiff/extconf.rb] - s.add_development_dependency "rake", ">= 1.9.1" - s.add_development_dependency "rake-compiler", ">= 0.8.3" - s.add_development_dependency "minitest" -end diff --git a/sorbet/rbi/gems/diffy@3.4.3.rbi b/sorbet/rbi/gems/diffy@3.4.3.rbi deleted file mode 100644 index a1a30ab6..00000000 --- a/sorbet/rbi/gems/diffy@3.4.3.rbi +++ /dev/null @@ -1,184 +0,0 @@ -# typed: true - -# DO NOT EDIT MANUALLY -# This is an autogenerated file for types exported from the `diffy` gem. -# Please instead update this file by running `bin/tapioca gem diffy`. - - -# source://diffy//lib/diffy.rb#6 -module Diffy; end - -# source://diffy//lib/diffy/css.rb#2 -Diffy::CSS = T.let(T.unsafe(nil), String) - -# source://diffy//lib/diffy/css.rb#18 -Diffy::CSS_COLORBLIND_1 = T.let(T.unsafe(nil), String) - -# source://diffy//lib/diffy/diff.rb#2 -class Diffy::Diff - include ::Enumerable - - # supported options - # +:diff+:: A cli options string passed to diff - # +:source+:: Either _strings_ or _files_. Determines whether string1 - # and string2 should be interpreted as strings or file paths. - # +:include_diff_info+:: Include diff header info - # +:include_plus_and_minus_in_html+:: Show the +, -, ' ' at the - # beginning of lines in html output. - # - # @return [Diff] a new instance of Diff - # - # source://diffy//lib/diffy/diff.rb#35 - def initialize(string1, string2, options = T.unsafe(nil)); end - - # source://diffy//lib/diffy/diff.rb#43 - def diff; end - - # source://diffy//lib/diffy/diff.rb#79 - def each; end - - # source://diffy//lib/diffy/diff.rb#102 - def each_chunk; end - - # Returns the value of attribute options. - # - # source://diffy//lib/diffy/diff.rb#26 - def options; end - - # Returns the value of attribute string1. - # - # source://diffy//lib/diffy/diff.rb#26 - def string1; end - - # Returns the value of attribute string2. - # - # source://diffy//lib/diffy/diff.rb#26 - def string2; end - - # source://diffy//lib/diffy/diff.rb#122 - def tempfile(string); end - - # source://diffy//lib/diffy/diff.rb#134 - def to_s(format = T.unsafe(nil)); end - - private - - # source://diffy//lib/diffy/diff.rb#149 - def diff_bin; end - - # options pass to diff program - # - # source://diffy//lib/diffy/diff.rb#170 - def diff_options; end - - class << self - # source://diffy//lib/diffy/diff.rb#14 - def default_format; end - - # Sets the attribute default_format - # - # @param value the value to set the attribute default_format to. - # - # source://diffy//lib/diffy/diff.rb#13 - def default_format=(_arg0); end - - # source://diffy//lib/diffy/diff.rb#20 - def default_options; end - - # default options passed to new Diff objects - # - # source://diffy//lib/diffy/diff.rb#19 - def default_options=(_arg0); end - end -end - -# source://diffy//lib/diffy/diff.rb#3 -Diffy::Diff::ORIGINAL_DEFAULT_OPTIONS = T.let(T.unsafe(nil), Hash) - -# source://diffy//lib/diffy/format.rb#2 -module Diffy::Format - # ANSI color output suitable for terminal output - # - # source://diffy//lib/diffy/format.rb#4 - def color; end - - # Html output which does inline highlighting of changes between two lines. - # - # source://diffy//lib/diffy/format.rb#33 - def html; end - - # Basic html output which does not attempt to highlight the changes - # between lines, and is more performant. - # - # source://diffy//lib/diffy/format.rb#28 - def html_simple; end - - # Basic text output - # - # source://diffy//lib/diffy/format.rb#22 - def text; end -end - -# source://diffy//lib/diffy/html_formatter.rb#2 -class Diffy::HtmlFormatter - # @return [HtmlFormatter] a new instance of HtmlFormatter - # - # source://diffy//lib/diffy/html_formatter.rb#4 - def initialize(diff, options = T.unsafe(nil)); end - - # source://diffy//lib/diffy/html_formatter.rb#9 - def to_s; end - - private - - # remove +/- or wrap in html - # - # source://diffy//lib/diffy/html_formatter.rb#35 - def clean_line(line); end - - # source://diffy//lib/diffy/html_formatter.rb#124 - def highlight(lines); end - - # source://diffy//lib/diffy/html_formatter.rb#51 - def highlighted_words; end - - # source://diffy//lib/diffy/html_formatter.rb#104 - def reconstruct_characters(line_diff, type); end - - # source://diffy//lib/diffy/html_formatter.rb#91 - def split_characters(chunk); end - - # source://diffy//lib/diffy/html_formatter.rb#18 - def wrap_line(line); end - - # source://diffy//lib/diffy/html_formatter.rb#43 - def wrap_lines(lines); end -end - -# source://diffy//lib/diffy/split_diff.rb#2 -class Diffy::SplitDiff - # @return [SplitDiff] a new instance of SplitDiff - # - # source://diffy//lib/diffy/split_diff.rb#3 - def initialize(left, right, options = T.unsafe(nil)); end - - # source://diffy//lib/diffy/split_diff.rb#16 - def left; end - - # source://diffy//lib/diffy/split_diff.rb#16 - def right; end - - private - - # source://diffy//lib/diffy/split_diff.rb#23 - def split; end - - # source://diffy//lib/diffy/split_diff.rb#27 - def split_left; end - - # source://diffy//lib/diffy/split_diff.rb#38 - def split_right; end -end - -# source://diffy//lib/diffy.rb#7 -Diffy::WINDOWS = T.let(T.unsafe(nil), T.untyped) diff --git a/sorbet/rbi/gems/rb-bsdiff@0.1.0.rbi b/sorbet/rbi/gems/rb-bsdiff@0.1.0.rbi deleted file mode 100644 index 40757e88..00000000 --- a/sorbet/rbi/gems/rb-bsdiff@0.1.0.rbi +++ /dev/null @@ -1,9 +0,0 @@ -# typed: strict - -# DO NOT EDIT MANUALLY -# This is an autogenerated file for types exported from the `rb-bsdiff` gem. -# Please instead update this file by running `bin/tapioca gem rb-bsdiff`. - - -# THIS IS AN EMPTY RBI FILE. -# see https://github.com/Shopify/tapioca#manually-requiring-parts-of-a-gem diff --git a/sorbet/rbi/gems/xdiff@0.0.1.rbi b/sorbet/rbi/gems/xdiff@0.0.1.rbi deleted file mode 100644 index 664bf080..00000000 --- a/sorbet/rbi/gems/xdiff@0.0.1.rbi +++ /dev/null @@ -1,33 +0,0 @@ -# typed: strict - -# DO NOT EDIT MANUALLY -# This is an autogenerated file for types exported from the `xdiff` gem. -# Please instead update this file by running `bin/tapioca gem xdiff`. - - -# source://xdiff//../../xdiff-rb/lib/xdiff.rb#1 -module XDiff - class << self - # source://xdiff//../../xdiff-rb/lib/xdiff.rb#13 - def diff(a, b); end - - # source://xdiff//../../xdiff-rb/lib/xdiff.rb#18 - def patch(a, b); end - - # @raise [ArgumentError] - # - # source://xdiff//../../xdiff-rb/lib/xdiff.rb#4 - def validate_arg(method, name, arg); end - end -end - -class XDiff::Native - class << self - def diff(_arg0, _arg1); end - def init; end - def patch(_arg0, _arg1); end - end -end - -# source://xdiff//../../xdiff-rb/lib/xdiff.rb#2 -XDiff::VERSION = T.let(T.unsafe(nil), String)