/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
1
/*
2
 * diff-delta.c: generate a delta between two buffers
3
 *
4
 * This code was greatly inspired by parts of LibXDiff from Davide Libenzi
5
 * http://www.xmailserver.org/xdiff-lib.html
6
 *
7
 * Rewritten for GIT by Nicolas Pitre <nico@cam.org>, (C) 2005-2007
8
 *
9
 * This code is free software; you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License version 2 as
11
 * published by the Free Software Foundation.
12
 */
13
0.23.49 by John Arbash Meinel
When adding new entries to the delta index, use memcpy
14
#include <stdio.h>
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
15
#include "delta.h"
0.23.5 by John Arbash Meinel
Minor changes to get diff-delta.c and patch-delta.c to compile.
16
#include <assert.h>
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
17
18
/* maximum hash entry list for the same hash bucket */
19
#define HASH_LIMIT 64
20
21
#define RABIN_SHIFT 23
22
#define RABIN_WINDOW 16
23
24
static const unsigned int T[256] = {
25
	0x00000000, 0xab59b4d1, 0x56b369a2, 0xfdeadd73, 0x063f6795, 0xad66d344,
26
	0x508c0e37, 0xfbd5bae6, 0x0c7ecf2a, 0xa7277bfb, 0x5acda688, 0xf1941259,
27
	0x0a41a8bf, 0xa1181c6e, 0x5cf2c11d, 0xf7ab75cc, 0x18fd9e54, 0xb3a42a85,
28
	0x4e4ef7f6, 0xe5174327, 0x1ec2f9c1, 0xb59b4d10, 0x48719063, 0xe32824b2,
29
	0x1483517e, 0xbfdae5af, 0x423038dc, 0xe9698c0d, 0x12bc36eb, 0xb9e5823a,
30
	0x440f5f49, 0xef56eb98, 0x31fb3ca8, 0x9aa28879, 0x6748550a, 0xcc11e1db,
31
	0x37c45b3d, 0x9c9defec, 0x6177329f, 0xca2e864e, 0x3d85f382, 0x96dc4753,
32
	0x6b369a20, 0xc06f2ef1, 0x3bba9417, 0x90e320c6, 0x6d09fdb5, 0xc6504964,
33
	0x2906a2fc, 0x825f162d, 0x7fb5cb5e, 0xd4ec7f8f, 0x2f39c569, 0x846071b8,
34
	0x798aaccb, 0xd2d3181a, 0x25786dd6, 0x8e21d907, 0x73cb0474, 0xd892b0a5,
35
	0x23470a43, 0x881ebe92, 0x75f463e1, 0xdeadd730, 0x63f67950, 0xc8afcd81,
36
	0x354510f2, 0x9e1ca423, 0x65c91ec5, 0xce90aa14, 0x337a7767, 0x9823c3b6,
37
	0x6f88b67a, 0xc4d102ab, 0x393bdfd8, 0x92626b09, 0x69b7d1ef, 0xc2ee653e,
38
	0x3f04b84d, 0x945d0c9c, 0x7b0be704, 0xd05253d5, 0x2db88ea6, 0x86e13a77,
39
	0x7d348091, 0xd66d3440, 0x2b87e933, 0x80de5de2, 0x7775282e, 0xdc2c9cff,
40
	0x21c6418c, 0x8a9ff55d, 0x714a4fbb, 0xda13fb6a, 0x27f92619, 0x8ca092c8,
41
	0x520d45f8, 0xf954f129, 0x04be2c5a, 0xafe7988b, 0x5432226d, 0xff6b96bc,
42
	0x02814bcf, 0xa9d8ff1e, 0x5e738ad2, 0xf52a3e03, 0x08c0e370, 0xa39957a1,
43
	0x584ced47, 0xf3155996, 0x0eff84e5, 0xa5a63034, 0x4af0dbac, 0xe1a96f7d,
44
	0x1c43b20e, 0xb71a06df, 0x4ccfbc39, 0xe79608e8, 0x1a7cd59b, 0xb125614a,
45
	0x468e1486, 0xedd7a057, 0x103d7d24, 0xbb64c9f5, 0x40b17313, 0xebe8c7c2,
46
	0x16021ab1, 0xbd5bae60, 0x6cb54671, 0xc7ecf2a0, 0x3a062fd3, 0x915f9b02,
47
	0x6a8a21e4, 0xc1d39535, 0x3c394846, 0x9760fc97, 0x60cb895b, 0xcb923d8a,
48
	0x3678e0f9, 0x9d215428, 0x66f4eece, 0xcdad5a1f, 0x3047876c, 0x9b1e33bd,
49
	0x7448d825, 0xdf116cf4, 0x22fbb187, 0x89a20556, 0x7277bfb0, 0xd92e0b61,
50
	0x24c4d612, 0x8f9d62c3, 0x7836170f, 0xd36fa3de, 0x2e857ead, 0x85dcca7c,
51
	0x7e09709a, 0xd550c44b, 0x28ba1938, 0x83e3ade9, 0x5d4e7ad9, 0xf617ce08,
52
	0x0bfd137b, 0xa0a4a7aa, 0x5b711d4c, 0xf028a99d, 0x0dc274ee, 0xa69bc03f,
53
	0x5130b5f3, 0xfa690122, 0x0783dc51, 0xacda6880, 0x570fd266, 0xfc5666b7,
54
	0x01bcbbc4, 0xaae50f15, 0x45b3e48d, 0xeeea505c, 0x13008d2f, 0xb85939fe,
55
	0x438c8318, 0xe8d537c9, 0x153feaba, 0xbe665e6b, 0x49cd2ba7, 0xe2949f76,
56
	0x1f7e4205, 0xb427f6d4, 0x4ff24c32, 0xe4abf8e3, 0x19412590, 0xb2189141,
57
	0x0f433f21, 0xa41a8bf0, 0x59f05683, 0xf2a9e252, 0x097c58b4, 0xa225ec65,
58
	0x5fcf3116, 0xf49685c7, 0x033df00b, 0xa86444da, 0x558e99a9, 0xfed72d78,
59
	0x0502979e, 0xae5b234f, 0x53b1fe3c, 0xf8e84aed, 0x17bea175, 0xbce715a4,
60
	0x410dc8d7, 0xea547c06, 0x1181c6e0, 0xbad87231, 0x4732af42, 0xec6b1b93,
61
	0x1bc06e5f, 0xb099da8e, 0x4d7307fd, 0xe62ab32c, 0x1dff09ca, 0xb6a6bd1b,
62
	0x4b4c6068, 0xe015d4b9, 0x3eb80389, 0x95e1b758, 0x680b6a2b, 0xc352defa,
63
	0x3887641c, 0x93ded0cd, 0x6e340dbe, 0xc56db96f, 0x32c6cca3, 0x999f7872,
64
	0x6475a501, 0xcf2c11d0, 0x34f9ab36, 0x9fa01fe7, 0x624ac294, 0xc9137645,
65
	0x26459ddd, 0x8d1c290c, 0x70f6f47f, 0xdbaf40ae, 0x207afa48, 0x8b234e99,
66
	0x76c993ea, 0xdd90273b, 0x2a3b52f7, 0x8162e626, 0x7c883b55, 0xd7d18f84,
67
	0x2c043562, 0x875d81b3, 0x7ab75cc0, 0xd1eee811
68
};
69
70
static const unsigned int U[256] = {
71
	0x00000000, 0x7eb5200d, 0x5633f4cb, 0x2886d4c6, 0x073e5d47, 0x798b7d4a,
72
	0x510da98c, 0x2fb88981, 0x0e7cba8e, 0x70c99a83, 0x584f4e45, 0x26fa6e48,
73
	0x0942e7c9, 0x77f7c7c4, 0x5f711302, 0x21c4330f, 0x1cf9751c, 0x624c5511,
74
	0x4aca81d7, 0x347fa1da, 0x1bc7285b, 0x65720856, 0x4df4dc90, 0x3341fc9d,
75
	0x1285cf92, 0x6c30ef9f, 0x44b63b59, 0x3a031b54, 0x15bb92d5, 0x6b0eb2d8,
76
	0x4388661e, 0x3d3d4613, 0x39f2ea38, 0x4747ca35, 0x6fc11ef3, 0x11743efe,
77
	0x3eccb77f, 0x40799772, 0x68ff43b4, 0x164a63b9, 0x378e50b6, 0x493b70bb,
78
	0x61bda47d, 0x1f088470, 0x30b00df1, 0x4e052dfc, 0x6683f93a, 0x1836d937,
79
	0x250b9f24, 0x5bbebf29, 0x73386bef, 0x0d8d4be2, 0x2235c263, 0x5c80e26e,
80
	0x740636a8, 0x0ab316a5, 0x2b7725aa, 0x55c205a7, 0x7d44d161, 0x03f1f16c,
81
	0x2c4978ed, 0x52fc58e0, 0x7a7a8c26, 0x04cfac2b, 0x73e5d470, 0x0d50f47d,
82
	0x25d620bb, 0x5b6300b6, 0x74db8937, 0x0a6ea93a, 0x22e87dfc, 0x5c5d5df1,
83
	0x7d996efe, 0x032c4ef3, 0x2baa9a35, 0x551fba38, 0x7aa733b9, 0x041213b4,
84
	0x2c94c772, 0x5221e77f, 0x6f1ca16c, 0x11a98161, 0x392f55a7, 0x479a75aa,
85
	0x6822fc2b, 0x1697dc26, 0x3e1108e0, 0x40a428ed, 0x61601be2, 0x1fd53bef,
86
	0x3753ef29, 0x49e6cf24, 0x665e46a5, 0x18eb66a8, 0x306db26e, 0x4ed89263,
87
	0x4a173e48, 0x34a21e45, 0x1c24ca83, 0x6291ea8e, 0x4d29630f, 0x339c4302,
88
	0x1b1a97c4, 0x65afb7c9, 0x446b84c6, 0x3adea4cb, 0x1258700d, 0x6ced5000,
89
	0x4355d981, 0x3de0f98c, 0x15662d4a, 0x6bd30d47, 0x56ee4b54, 0x285b6b59,
90
	0x00ddbf9f, 0x7e689f92, 0x51d01613, 0x2f65361e, 0x07e3e2d8, 0x7956c2d5,
91
	0x5892f1da, 0x2627d1d7, 0x0ea10511, 0x7014251c, 0x5facac9d, 0x21198c90,
92
	0x099f5856, 0x772a785b, 0x4c921c31, 0x32273c3c, 0x1aa1e8fa, 0x6414c8f7,
93
	0x4bac4176, 0x3519617b, 0x1d9fb5bd, 0x632a95b0, 0x42eea6bf, 0x3c5b86b2,
94
	0x14dd5274, 0x6a687279, 0x45d0fbf8, 0x3b65dbf5, 0x13e30f33, 0x6d562f3e,
95
	0x506b692d, 0x2ede4920, 0x06589de6, 0x78edbdeb, 0x5755346a, 0x29e01467,
96
	0x0166c0a1, 0x7fd3e0ac, 0x5e17d3a3, 0x20a2f3ae, 0x08242768, 0x76910765,
97
	0x59298ee4, 0x279caee9, 0x0f1a7a2f, 0x71af5a22, 0x7560f609, 0x0bd5d604,
98
	0x235302c2, 0x5de622cf, 0x725eab4e, 0x0ceb8b43, 0x246d5f85, 0x5ad87f88,
99
	0x7b1c4c87, 0x05a96c8a, 0x2d2fb84c, 0x539a9841, 0x7c2211c0, 0x029731cd,
100
	0x2a11e50b, 0x54a4c506, 0x69998315, 0x172ca318, 0x3faa77de, 0x411f57d3,
101
	0x6ea7de52, 0x1012fe5f, 0x38942a99, 0x46210a94, 0x67e5399b, 0x19501996,
102
	0x31d6cd50, 0x4f63ed5d, 0x60db64dc, 0x1e6e44d1, 0x36e89017, 0x485db01a,
103
	0x3f77c841, 0x41c2e84c, 0x69443c8a, 0x17f11c87, 0x38499506, 0x46fcb50b,
104
	0x6e7a61cd, 0x10cf41c0, 0x310b72cf, 0x4fbe52c2, 0x67388604, 0x198da609,
105
	0x36352f88, 0x48800f85, 0x6006db43, 0x1eb3fb4e, 0x238ebd5d, 0x5d3b9d50,
106
	0x75bd4996, 0x0b08699b, 0x24b0e01a, 0x5a05c017, 0x728314d1, 0x0c3634dc,
107
	0x2df207d3, 0x534727de, 0x7bc1f318, 0x0574d315, 0x2acc5a94, 0x54797a99,
108
	0x7cffae5f, 0x024a8e52, 0x06852279, 0x78300274, 0x50b6d6b2, 0x2e03f6bf,
109
	0x01bb7f3e, 0x7f0e5f33, 0x57888bf5, 0x293dabf8, 0x08f998f7, 0x764cb8fa,
110
	0x5eca6c3c, 0x207f4c31, 0x0fc7c5b0, 0x7172e5bd, 0x59f4317b, 0x27411176,
111
	0x1a7c5765, 0x64c97768, 0x4c4fa3ae, 0x32fa83a3, 0x1d420a22, 0x63f72a2f,
112
	0x4b71fee9, 0x35c4dee4, 0x1400edeb, 0x6ab5cde6, 0x42331920, 0x3c86392d,
113
	0x133eb0ac, 0x6d8b90a1, 0x450d4467, 0x3bb8646a
114
};
115
116
struct index_entry {
117
	const unsigned char *ptr;
0.23.41 by John Arbash Meinel
Start moving the information about source buffers into the actual index_entry.
118
	const struct source_info *src;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
119
	unsigned int val;
120
};
121
122
struct unpacked_index_entry {
123
	struct index_entry entry;
124
	struct unpacked_index_entry *next;
125
};
126
127
struct delta_index {
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
128
	unsigned long memsize; /* Total bytes pointed to by this index */
0.23.44 by John Arbash Meinel
Remove the multi-index handling now that we have index combining instead.
129
	const struct source_info *last_src; /* Information about the referenced source */
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
130
	unsigned int hash_mask; /* val & hash_mask gives the hash index for a given
131
							   entry */
0.23.41 by John Arbash Meinel
Start moving the information about source buffers into the actual index_entry.
132
	unsigned int num_entries; /* The total number of entries in this index */
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
133
	struct index_entry *last_entry; /* Pointer to the last valid entry */
0.23.5 by John Arbash Meinel
Minor changes to get diff-delta.c and patch-delta.c to compile.
134
	struct index_entry *hash[];
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
135
};
136
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
137
static unsigned int
138
limit_hash_buckets(struct unpacked_index_entry **hash,
139
				   unsigned int *hash_count, unsigned int hsize,
140
				   unsigned int entries)
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
141
{
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
142
	struct unpacked_index_entry *entry;
143
	unsigned int i;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
144
	/*
145
	 * Determine a limit on the number of entries in the same hash
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
146
	 * bucket.	This guards us against pathological data sets causing
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
147
	 * really bad hash distribution with most entries in the same hash
148
	 * bucket that would bring us to O(m*n) computing costs (m and n
149
	 * corresponding to reference and target buffer sizes).
150
	 *
151
	 * Make sure none of the hash buckets has more entries than
152
	 * we're willing to test.  Otherwise we cull the entry list
153
	 * uniformly to still preserve a good repartition across
154
	 * the reference buffer.
155
	 */
156
	for (i = 0; i < hsize; i++) {
157
		int acc;
158
159
		if (hash_count[i] <= HASH_LIMIT)
160
			continue;
161
162
		/* We leave exactly HASH_LIMIT entries in the bucket */
163
		entries -= hash_count[i] - HASH_LIMIT;
164
165
		entry = hash[i];
166
		acc = 0;
167
168
		/*
169
		 * Assume that this loop is gone through exactly
170
		 * HASH_LIMIT times and is entered and left with
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
171
		 * acc==0.	So the first statement in the loop
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
172
		 * contributes (hash_count[i]-HASH_LIMIT)*HASH_LIMIT
173
		 * to the accumulator, and the inner loop consequently
174
		 * is run (hash_count[i]-HASH_LIMIT) times, removing
175
		 * one element from the list each time.  Since acc
176
		 * balances out to 0 at the final run, the inner loop
177
		 * body can't be left with entry==NULL.  So we indeed
178
		 * encounter entry==NULL in the outer loop only.
179
		 */
180
		do {
181
			acc += hash_count[i] - HASH_LIMIT;
182
			if (acc > 0) {
183
				struct unpacked_index_entry *keep = entry;
184
				do {
185
					entry = entry->next;
186
					acc -= HASH_LIMIT;
187
				} while (acc > 0);
188
				keep->next = entry->next;
189
			}
190
			entry = entry->next;
191
		} while (entry);
192
	}
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
193
	return entries;
194
}
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
195
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
196
static struct delta_index *
197
pack_delta_index(struct unpacked_index_entry **hash, unsigned int hsize,
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
198
				 unsigned int num_entries)
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
199
{
200
	unsigned int i, memsize;
201
	struct unpacked_index_entry *entry;
202
	struct delta_index *index;
203
	struct index_entry *packed_entry, **packed_hash;
204
	void *mem;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
205
	/*
206
	 * Now create the packed index in array form
207
	 * rather than linked lists.
208
	 */
209
	memsize = sizeof(*index)
210
		+ sizeof(*packed_hash) * (hsize+1)
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
211
		+ sizeof(*packed_entry) * num_entries;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
212
	mem = malloc(memsize);
213
	if (!mem) {
214
		return NULL;
215
	}
216
217
	index = mem;
218
	index->memsize = memsize;
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
219
	index->hash_mask = hsize - 1;
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
220
	index->num_entries = num_entries;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
221
222
	mem = index->hash;
223
	packed_hash = mem;
224
	mem = packed_hash + (hsize+1);
225
	packed_entry = mem;
226
227
	for (i = 0; i < hsize; i++) {
228
		/*
229
		 * Coalesce all entries belonging to one linked list
230
		 * into consecutive array entries.
231
		 */
232
		packed_hash[i] = packed_entry;
0.23.42 by John Arbash Meinel
Change the code around again.
233
		for (entry = hash[i]; entry; entry = entry->next)
234
			*packed_entry++ = entry->entry;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
235
	}
236
237
	/* Sentinel value to indicate the length of the last hash bucket */
238
	packed_hash[hsize] = packed_entry;
239
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
240
	assert(packed_entry - (struct index_entry *)mem == num_entries);
241
	index->last_entry = (packed_entry - 1);
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
242
	return index;
243
}
244
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
245
void include_entries_from_index(struct unpacked_index_entry **hash,
246
								unsigned int *hash_count,
247
								unsigned int hsize,
248
								struct unpacked_index_entry *entry,
249
								const struct delta_index *old)
250
{
251
	unsigned int i, hmask, masked_val;
252
	struct index_entry *old_entry;
253
254
	hmask = hsize - 1;
255
	/* Iterate backwards through the existing entries
256
	 * This is so that matches early in the file end up being the first pointer
257
	 * in the linked list.
0.23.45 by John Arbash Meinel
Add a function that updates the index for delta bytes.
258
	 * TODO: We know that all old entries are going to occur before the new
259
	 *		 entries, and that we are going to follow this with a limit and
260
	 *		 then pack step. There is probably a way we could optimize this
261
	 *		 step, so that we wouldn't have to copy everything into a new
262
	 *		 buffer, and then copy everything again into yet another buffer.
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
263
	 */
264
	for (old_entry = old->last_entry, i = 0; i < old->num_entries;
265
		 i++, old_entry--) {
266
		masked_val = old_entry->val & hmask;
267
		entry->entry = *old_entry;
268
		entry->next = hash[masked_val];
269
		hash[masked_val] = entry++;
270
		hash_count[masked_val]++;
271
	}
272
}
273
0.23.49 by John Arbash Meinel
When adding new entries to the delta index, use memcpy
274
struct delta_index *
275
create_index_from_old_and_hash(const struct delta_index *old,
276
							   struct unpacked_index_entry **hash,
277
							   unsigned int hsize,
278
							   unsigned int num_entries)
279
{
280
	unsigned int i, memsize, total_num_entries;
281
	struct unpacked_index_entry *entry;
282
	struct delta_index *index;
283
	struct index_entry *packed_entry, **packed_hash, *old_entry;
284
	size_t to_copy;
285
	void *mem;
286
	/*
287
	 * Now create the packed index in array form
288
	 * rather than linked lists.
289
	 */
290
	total_num_entries = num_entries + old->num_entries;
291
	memsize = sizeof(*index)
292
		+ sizeof(*packed_hash) * (hsize+1)
293
		+ sizeof(*packed_entry) * total_num_entries;
294
	mem = malloc(memsize);
295
	if (!mem) {
296
		return NULL;
297
	}
298
299
	index = mem;
300
	index->memsize = memsize;
301
	index->hash_mask = hsize - 1;
302
	index->num_entries = total_num_entries;
303
304
	mem = index->hash;
305
	packed_hash = mem;
306
	mem = packed_hash + (hsize+1);
307
	packed_entry = mem;
308
309
	fprintf(stderr, "copying %d entries, adding %d\n",
310
		old->num_entries, num_entries);
311
	to_copy = 0;
312
	for (i = 0; i < hsize; i++) {
313
		/*
314
		 * Coalesce all entries belonging to one linked list
315
		 * into consecutive array entries.
316
		 * The entries in old all come before the entries in hash.
317
		 */
318
		packed_hash[i] = packed_entry;
319
		old_entry = old->hash[i];
320
		to_copy = (old->hash[i+1] - old_entry);
321
		if (to_copy > 0) {
322
			memcpy(packed_entry, old_entry, to_copy * sizeof(struct index_entry));
323
			packed_entry += to_copy;
324
		}
325
		for (entry = hash[i]; entry; entry = entry->next)
326
			*packed_entry++ = entry->entry;
327
	}
328
329
	/* Sentinel value to indicate the length of the last hash bucket */
330
	packed_hash[hsize] = packed_entry;
331
332
	assert(packed_entry - (struct index_entry *)mem == total_num_entries);
333
	index->last_entry = (packed_entry - 1);
334
	return index;
335
}
336
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
337
338
struct delta_index * create_delta_index(const struct source_info *src,
339
										const struct delta_index *old)
340
{
341
	unsigned int i, hsize, hmask, num_entries, prev_val, *hash_count;
342
	unsigned int total_num_entries;
0.23.42 by John Arbash Meinel
Change the code around again.
343
	const unsigned char *data, *buffer;
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
344
	struct delta_index *index;
345
	struct unpacked_index_entry *entry, **hash;
346
	void *mem;
347
	unsigned long memsize;
348
0.23.42 by John Arbash Meinel
Change the code around again.
349
	if (!src->buf || !src->size)
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
350
		return NULL;
0.23.42 by John Arbash Meinel
Change the code around again.
351
	buffer = src->buf;
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
352
353
	/* Determine index hash size.  Note that indexing skips the
354
	   first byte to allow for optimizing the Rabin's polynomial
355
	   initialization in create_delta(). */
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
356
	num_entries = (src->size - 1)  / RABIN_WINDOW;
357
	if (old != NULL)
358
		total_num_entries = num_entries + old->num_entries;
359
	else
360
		total_num_entries = num_entries;
361
	hsize = total_num_entries / 4;
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
362
	for (i = 4; (1u << i) < hsize && i < 31; i++);
363
	hsize = 1 << i;
364
	hmask = hsize - 1;
365
366
	/* allocate lookup index */
367
	memsize = sizeof(*hash) * hsize +
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
368
		  sizeof(*entry) * total_num_entries;
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
369
	mem = malloc(memsize);
370
	if (!mem)
371
		return NULL;
372
	hash = mem;
373
	mem = hash + hsize;
374
	entry = mem;
375
376
	memset(hash, 0, hsize * sizeof(*hash));
377
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
378
	/* allocate an array to count hash num_entries */
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
379
	hash_count = calloc(hsize, sizeof(*hash_count));
380
	if (!hash_count) {
381
		free(hash);
382
		return NULL;
383
	}
384
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
385
	/* then populate the index for the new data */
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
386
	prev_val = ~0;
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
387
	for (data = buffer + num_entries * RABIN_WINDOW - RABIN_WINDOW;
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
388
		 data >= buffer;
389
		 data -= RABIN_WINDOW) {
390
		unsigned int val = 0;
391
		for (i = 1; i <= RABIN_WINDOW; i++)
392
			val = ((val << 8) | data[i]) ^ T[val >> RABIN_SHIFT];
393
		if (val == prev_val) {
394
			/* keep the lowest of consecutive identical blocks */
395
			entry[-1].entry.ptr = data + RABIN_WINDOW;
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
396
			--num_entries;
397
			--total_num_entries;
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
398
		} else {
399
			prev_val = val;
400
			i = val & hmask;
401
			entry->entry.ptr = data + RABIN_WINDOW;
402
			entry->entry.val = val;
0.23.42 by John Arbash Meinel
Change the code around again.
403
			entry->entry.src = src;
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
404
			entry->next = hash[i];
405
			hash[i] = entry++;
406
			hash_count[i]++;
407
		}
408
	}
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
409
	/* If we have an existing delta_index, we want to bring its info into the
410
	 * new structure. We assume that the existing structure's objects all occur
411
	 * before the new source, so they get first precedence in the index.
412
	 */
413
	if (old != NULL)
414
		include_entries_from_index(hash, hash_count, hsize, entry, old);
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
415
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
416
	total_num_entries = limit_hash_buckets(hash, hash_count, hsize,
417
										   total_num_entries);
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
418
	free(hash_count);
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
419
	index = pack_delta_index(hash, hsize, total_num_entries);
0.23.44 by John Arbash Meinel
Remove the multi-index handling now that we have index combining instead.
420
	index->last_src = src;
0.23.36 by John Arbash Meinel
Track down a memory leak in the refactored diff-delta.c code.
421
	free(hash);
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
422
	if (!index) {
423
		return NULL;
424
	}
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
425
	return index;
426
}
427
0.23.45 by John Arbash Meinel
Add a function that updates the index for delta bytes.
428
struct delta_index * create_delta_index_from_delta(
429
										const struct source_info *src,
430
										const struct delta_index *old)
431
{
432
	unsigned int i, hsize, hmask, num_entries, prev_val, *hash_count;
433
	unsigned int total_num_entries;
434
	const unsigned char *data, *buffer, *top;
435
	unsigned char cmd;
436
	struct delta_index *index;
437
	struct unpacked_index_entry *entry, **hash;
438
	void *mem;
439
	unsigned long memsize;
440
441
	if (!src->buf || !src->size)
442
		return NULL;
443
	buffer = src->buf;
444
	top = buffer + src->size;
445
446
	/* Determine index hash size.  Note that indexing skips the
447
	   first byte to allow for optimizing the Rabin's polynomial
448
	   initialization in create_delta().
449
	   This computes the maximum number of entries that could be held. The
450
	   actual number will be recomputed during processing.
451
	   */
452
	 
453
	num_entries = (src->size - 1)  / RABIN_WINDOW;
454
	if (old != NULL)
455
		total_num_entries = num_entries + old->num_entries;
456
	else
457
		total_num_entries = num_entries;
458
	hsize = total_num_entries / 4;
459
	for (i = 4; (1u << i) < hsize && i < 31; i++);
460
	hsize = 1 << i;
461
	hmask = hsize - 1;
462
463
	/* allocate lookup index */
464
	memsize = sizeof(*hash) * hsize +
465
		  sizeof(*entry) * total_num_entries;
466
	mem = malloc(memsize);
467
	if (!mem)
468
		return NULL;
469
	hash = mem;
470
	mem = hash + hsize;
471
	entry = mem;
472
473
	memset(hash, 0, hsize * sizeof(*hash));
474
475
	/* allocate an array to count hash num_entries */
476
	hash_count = calloc(hsize, sizeof(*hash_count));
477
	if (!hash_count) {
478
		free(hash);
479
		return NULL;
480
	}
481
482
	/* then populate the index for the new data */
483
	/* The create_delta_index code starts at the end and works backward,
484
	 * because it is easier to update the entry pointers (you always update the
485
	 * head, rather than updating the tail).
486
	 * However, we can't walk the delta structure that way.
487
	 */
488
	prev_val = ~0;
489
	data = buffer;
490
	/* source size */
491
	get_delta_hdr_size(&data, top);
492
	/* target size */
493
	get_delta_hdr_size(&data, top);
494
	num_entries = 0; /* calculate the real number of entries */
495
	while (data < top) {
496
		cmd = *data++;
497
		if (cmd & 0x80) {
498
			/* Copy instruction, skip it */
499
			if (cmd & 0x01) data++;
500
			if (cmd & 0x02) data++;
501
			if (cmd & 0x04) data++;
502
			if (cmd & 0x08) data++;
503
			if (cmd & 0x10) data++;
504
			if (cmd & 0x20) data++;
505
			if (cmd & 0x40) data++;
506
		} else if (cmd) {
507
			/* Insert instruction, we want to index these bytes */
508
			if (data + cmd > top) {
509
				/* Invalid insert, not enough bytes in the delta */
510
				break;
511
			}
512
			for (; cmd > RABIN_WINDOW; cmd -= RABIN_WINDOW,
513
									   data += RABIN_WINDOW) {
514
				unsigned int val = 0;
515
				for (i = 1; i <= RABIN_WINDOW; i++)
516
					val = ((val << 8) | data[i]) ^ T[val >> RABIN_SHIFT];
517
				if (val != prev_val) {
518
					/* Only keep the first of consecutive data */
519
					prev_val = val;
520
					i = val & hmask;
521
					entry->entry.ptr = data + RABIN_WINDOW;
522
					entry->entry.val = val;
523
					entry->entry.src = src;
524
					entry->next = NULL;
525
					/* Now we have to insert this entry at the end of the hash
526
					 * map
527
					 */
528
					if (hash[i] == NULL) {
529
						hash[i] = entry;
530
					} else {
531
						struct unpacked_index_entry *this;
0.23.46 by John Arbash Meinel
Fix a bug in create_delta_index_from_delta when inserting into a already filled hash location.
532
						for (this = hash[i];
0.23.45 by John Arbash Meinel
Add a function that updates the index for delta bytes.
533
							this->next != NULL;
534
							this = this->next) { /* No action */ }
535
						this->next = entry;
536
						this = entry;
537
					}
538
					hash_count[i]++;
539
					entry++;
540
					num_entries++;
541
				}
542
			}
543
			/* Move the data pointer by whatever remainder is left */
544
			data += cmd;
545
		} else {
546
			/*
547
			 * cmd == 0 is reserved for future encoding
548
			 * extensions. In the mean time we must fail when
549
			 * encountering them (might be data corruption).
550
			 */
551
			break;
552
		}
553
	}
554
	if (data != top) {
555
		/* Something was wrong with this delta */
556
		free(hash);
557
		free(hash_count);
558
		return NULL;
559
	}
0.23.49 by John Arbash Meinel
When adding new entries to the delta index, use memcpy
560
	if (num_entries == 0) {
561
		/** Nothing to index **/
562
		return NULL;
563
	}
0.23.45 by John Arbash Meinel
Add a function that updates the index for delta bytes.
564
	if (old != NULL) {
0.23.49 by John Arbash Meinel
When adding new entries to the delta index, use memcpy
565
		if (hmask == old->hash_mask) {
566
			/* The total hash table size didn't change, which means that
567
			 * entries will end up in the same pages. We can do bulk-copying to
568
			 * get the final output
569
			 */
570
			index = create_index_from_old_and_hash(old, hash, hsize,
571
												   num_entries);
572
			free(hash_count);
573
			free(hash);
574
			if (!index) {
575
				return NULL;
576
			}
577
			index->last_src = src;
578
			return index;
579
		} else {
580
			total_num_entries = num_entries + old->num_entries;
581
			include_entries_from_index(hash, hash_count, hsize, entry, old);
582
		}
0.23.45 by John Arbash Meinel
Add a function that updates the index for delta bytes.
583
	} else {
584
		total_num_entries = num_entries;
585
	}
586
587
	total_num_entries = limit_hash_buckets(hash, hash_count, hsize,
588
										   total_num_entries);
589
	free(hash_count);
590
	index = pack_delta_index(hash, hsize, total_num_entries);
591
	free(hash);
592
	if (!index) {
593
		return NULL;
594
	}
0.23.49 by John Arbash Meinel
When adding new entries to the delta index, use memcpy
595
	index->last_src = src;
0.23.45 by John Arbash Meinel
Add a function that updates the index for delta bytes.
596
	return index;
597
}
598
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
599
void free_delta_index(struct delta_index *index)
600
{
601
	free(index);
602
}
603
604
unsigned long sizeof_delta_index(struct delta_index *index)
605
{
606
	if (index)
607
		return index->memsize;
608
	else
609
		return 0;
610
}
611
612
/*
613
 * The maximum size for any opcode sequence, including the initial header
614
 * plus Rabin window plus biggest copy.
615
 */
616
#define MAX_OP_SIZE	(5 + 5 + 1 + RABIN_WINDOW + 7)
617
618
void *
0.23.44 by John Arbash Meinel
Remove the multi-index handling now that we have index combining instead.
619
create_delta(const struct delta_index *index,
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
620
			 const void *trg_buf, unsigned long trg_size,
621
			 unsigned long *delta_size, unsigned long max_size)
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
622
{
0.23.44 by John Arbash Meinel
Remove the multi-index handling now that we have index combining instead.
623
	unsigned int i, outpos, outsize, moff, msize, val;
0.23.41 by John Arbash Meinel
Start moving the information about source buffers into the actual index_entry.
624
	const struct source_info *msource;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
625
	int inscnt;
626
	const unsigned char *ref_data, *ref_top, *data, *top;
627
	unsigned char *out;
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
628
	unsigned long source_size;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
629
630
	if (!trg_buf || !trg_size)
631
		return NULL;
0.23.44 by John Arbash Meinel
Remove the multi-index handling now that we have index combining instead.
632
	if (index == NULL)
0.23.32 by John Arbash Meinel
Refactor the code a bit, so that I can re-use bits for a create_delta_index_from_delta.
633
		return NULL;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
634
635
	outpos = 0;
636
	outsize = 8192;
637
	if (max_size && outsize >= max_size)
638
		outsize = max_size + MAX_OP_SIZE + 1;
639
	out = malloc(outsize);
640
	if (!out)
641
		return NULL;
642
643
	/* store reference buffer size */
0.23.44 by John Arbash Meinel
Remove the multi-index handling now that we have index combining instead.
644
	source_size = index->last_src->size + index->last_src->agg_offset;
645
	i = source_size;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
646
	while (i >= 0x80) {
647
		out[outpos++] = i | 0x80;
648
		i >>= 7;
649
	}
650
	out[outpos++] = i;
651
652
	/* store target buffer size */
653
	i = trg_size;
654
	while (i >= 0x80) {
655
		out[outpos++] = i | 0x80;
656
		i >>= 7;
657
	}
658
	out[outpos++] = i;
659
660
	data = trg_buf;
661
	top = (const unsigned char *) trg_buf + trg_size;
662
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
663
	/* Start the matching by filling out with a simple 'insert' instruction, of
664
	 * the first RABIN_WINDOW bytes of the input.
665
	 */
666
	outpos++; /* leave a byte for the insert command */
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
667
	val = 0;
668
	for (i = 0; i < RABIN_WINDOW && data < top; i++, data++) {
669
		out[outpos++] = *data;
670
		val = ((val << 8) | *data) ^ T[val >> RABIN_SHIFT];
671
	}
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
672
	/* we are now setup with an insert of 'i' bytes and val contains the RABIN
673
	 * hash for those bytes, and data points to the RABIN_WINDOW+1 byte of
674
	 * input.
675
	 */
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
676
	inscnt = i;
677
678
	moff = 0;
679
	msize = 0;
0.23.41 by John Arbash Meinel
Start moving the information about source buffers into the actual index_entry.
680
	msource = NULL;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
681
	while (data < top) {
682
		if (msize < 4096) {
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
683
			/* we don't have a 'worthy enough' match yet, so let's look for
684
			 * one.
685
			 */
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
686
			struct index_entry *entry;
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
687
			/* Shift the window by one byte. */
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
688
			val ^= U[data[-RABIN_WINDOW]];
689
			val = ((val << 8) | *data) ^ T[val >> RABIN_SHIFT];
0.23.44 by John Arbash Meinel
Remove the multi-index handling now that we have index combining instead.
690
			i = val & index->hash_mask;
691
			/* TODO: When using multiple indexes like this, the hash tables
692
			 *		 mapping val => index_entry become less efficient.
693
			 *		 You end up getting a lot more collisions in the hash,
694
			 *		 which doesn't actually lead to a entry->val match.
695
			 */
696
			for (entry = index->hash[i]; entry < index->hash[i+1];
697
				 entry++) {
698
				const unsigned char *ref;
699
				const unsigned char *src;
700
				unsigned int ref_size;
701
				if (entry->val != val)
702
					continue;
703
				ref = entry->ptr;
704
				src = data;
705
				ref_data = entry->src->buf;
706
				ref_top = ref_data + entry->src->size;
707
				ref_size = ref_top - ref;
708
				/* ref_size is the longest possible match that we could make
709
				 * here. If ref_size <= msize, then we know that we cannot
710
				 * match more bytes with this location that we have already
711
				 * matched.
0.23.31 by John Arbash Meinel
Add a bit of comments about things to do.
712
				 */
0.23.44 by John Arbash Meinel
Remove the multi-index handling now that we have index combining instead.
713
				if (ref_size > top - src)
714
					ref_size = top - src;
715
				if (ref_size <= msize)
716
					break;
717
				/* See how many bytes actually match at this location. */
718
				while (ref_size-- && *src++ == *ref)
719
					ref++;
720
				if (msize < ref - entry->ptr) {
721
					/* this is our best match so far */
722
					msize = ref - entry->ptr;
723
					msource = entry->src;
724
					moff = entry->ptr - ref_data;
725
					if (msize >= 4096) /* good enough */
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
726
						break;
727
				}
728
			}
729
		}
730
731
		if (msize < 4) {
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
732
			/* The best match right now is less than 4 bytes long. So just add
733
			 * the current byte to the insert instruction. Increment the insert
734
			 * counter, and copy the byte of data into the output buffer.
735
			 */
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
736
			if (!inscnt)
737
				outpos++;
738
			out[outpos++] = *data++;
739
			inscnt++;
740
			if (inscnt == 0x7f) {
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
741
				/* We have a max length insert instruction, finalize it in the
742
				 * output.
743
				 */
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
744
				out[outpos - inscnt - 1] = inscnt;
745
				inscnt = 0;
746
			}
747
			msize = 0;
748
		} else {
749
			unsigned int left;
750
			unsigned char *op;
751
752
			if (inscnt) {
0.23.42 by John Arbash Meinel
Change the code around again.
753
				ref_data = msource->buf;
0.23.38 by John Arbash Meinel
fix the local offset problem in a slightly different way.
754
				while (moff && ref_data[moff-1] == data[-1]) {
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
755
					/* we can match one byte back */
756
					msize++;
757
					moff--;
758
					data--;
759
					outpos--;
760
					if (--inscnt)
761
						continue;
762
					outpos--;  /* remove count slot */
763
					inscnt--;  /* make it -1 */
764
					break;
765
				}
766
				out[outpos - inscnt - 1] = inscnt;
767
				inscnt = 0;
768
			}
769
770
			/* A copy op is currently limited to 64KB (pack v2) */
771
			left = (msize < 0x10000) ? 0 : (msize - 0x10000);
772
			msize -= left;
773
774
			op = out + outpos++;
775
			i = 0x80;
776
0.23.38 by John Arbash Meinel
fix the local offset problem in a slightly different way.
777
			/* moff is the offset in the local structure, for encoding, we need
778
			 * to push it into the global offset
779
			 */
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
780
			assert(moff < msource->size);
0.23.42 by John Arbash Meinel
Change the code around again.
781
			moff += msource->agg_offset;
0.23.43 by John Arbash Meinel
Change the internals to allow delta indexes to be expanded with new source data.
782
			assert(moff + msize <= source_size);
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
783
			if (moff & 0x000000ff)
784
				out[outpos++] = moff >> 0,  i |= 0x01;
785
			if (moff & 0x0000ff00)
786
				out[outpos++] = moff >> 8,  i |= 0x02;
787
			if (moff & 0x00ff0000)
788
				out[outpos++] = moff >> 16, i |= 0x04;
789
			if (moff & 0xff000000)
790
				out[outpos++] = moff >> 24, i |= 0x08;
0.23.38 by John Arbash Meinel
fix the local offset problem in a slightly different way.
791
			/* Put it back into local coordinates, in case we have multiple
792
			 * copies in a row.
793
			 */
0.23.42 by John Arbash Meinel
Change the code around again.
794
			moff -= msource->agg_offset;
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
795
796
			if (msize & 0x00ff)
797
				out[outpos++] = msize >> 0, i |= 0x10;
798
			if (msize & 0xff00)
799
				out[outpos++] = msize >> 8, i |= 0x20;
800
801
			*op = i;
802
803
			data += msize;
804
			moff += msize;
805
			msize = left;
806
807
			if (msize < 4096) {
808
				int j;
809
				val = 0;
810
				for (j = -RABIN_WINDOW; j < 0; j++)
811
					val = ((val << 8) | data[j])
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
812
						  ^ T[val >> RABIN_SHIFT];
0.23.2 by Nicolas Pitre
Add the diff-delta.c and patch-delta.c files.
813
			}
814
		}
815
816
		if (outpos >= outsize - MAX_OP_SIZE) {
817
			void *tmp = out;
818
			outsize = outsize * 3 / 2;
819
			if (max_size && outsize >= max_size)
820
				outsize = max_size + MAX_OP_SIZE + 1;
821
			if (max_size && outpos > max_size)
822
				break;
823
			out = realloc(out, outsize);
824
			if (!out) {
825
				free(tmp);
826
				return NULL;
827
			}
828
		}
829
	}
830
831
	if (inscnt)
832
		out[outpos - inscnt - 1] = inscnt;
833
834
	if (max_size && outpos > max_size) {
835
		free(out);
836
		return NULL;
837
	}
838
839
	*delta_size = outpos;
840
	return out;
841
}
0.23.24 by John Arbash Meinel
Change the code so that we can pass in multiple sources to match against.
842
0.23.36 by John Arbash Meinel
Track down a memory leak in the refactored diff-delta.c code.
843
/* vim: noet ts=4 sw=4 sts=4
844
 */