Skip to content
Snippets Groups Projects
Select Git revision
  • v1.0rc3
  • passt default
  • master
  • pu
  • todo
  • next
  • maint
  • v2.8.0-rc1
  • v2.8.0-rc0
  • v2.7.2
  • v2.7.1
  • v2.7.0
  • v2.6.5
  • v2.7.0-rc3
  • v2.7.0-rc2
  • v2.7.0-rc1
  • v2.7.0-rc0
  • v2.6.4
  • v2.6.3
  • v2.6.2
  • v2.6.1
  • v2.3.10
  • v2.5.4
  • v2.4.10
  • v2.6.0
  • v2.6.0-rc3
  • v2.5.3
27 results

diff-delta.c

Blame
  • diff-delta.c 7.14 KiB
    /*
     * diff-delta.c: generate a delta between two buffers
     *
     *  Many parts of this file have been lifted from LibXDiff version 0.10.
     *  http://www.xmailserver.org/xdiff-lib.html
     *
     *  LibXDiff was written by Davide Libenzi <davidel@xmailserver.org>
     *  Copyright (C) 2003	Davide Libenzi
     *
     *  Many mods for GIT usage by Nicolas Pitre <nico@cam.org>, (C) 2005.
     *
     *  This file 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.
     *
     *  Use of this within git automatically means that the LGPL
     *  licensing gets turned into GPLv2 within this project.
     */
    
    #include <stdlib.h>
    #include "delta.h"
    
    
    /* block size: min = 16, max = 64k, power of 2 */
    #define BLK_SIZE 16
    
    #define MIN(a, b) ((a) < (b) ? (a) : (b))
    
    #define GR_PRIME 0x9e370001
    #define HASH(v, b) (((unsigned int)(v) * GR_PRIME) >> (32 - (b)))
    	
    /* largest prime smaller than 65536 */
    #define BASE 65521
    
    /* 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);
    
    static unsigned int adler32(unsigned int adler, const unsigned char *buf, int len)
    {
    	int k;
    	unsigned int s1 = adler & 0xffff;
    	unsigned int s2 = adler >> 16;
    
    	while (len > 0) {
    		k = MIN(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;
    }