Пример #1
0
/*\
|*| Check if the two file lists a and b match.
|*|  File lists match if they are equal,
|*|   only counting files which are stored in the parity volume.
\*/
static int
files_match(pfile_t *a, pfile_t *b, int part)
{
	if (part) {
		/*\ Check if the lists overlap \*/
		pfile_t *p;

		for (; a; a = a->next) {
			if (!USE_FILE(a)) continue;
			for (p = b; p; p = p->next) {
				if (!USE_FILE(p)) continue;
				if (a->file_size != b->file_size) continue;
				if (!CMP_MD5(a->hash, b->hash)) continue;
				return 1;
			}
		}
		return 0;
	}
	/*\ Check if the lists match \*/
	while (a || b) {
		if (a && !USE_FILE(a)) {
			a = a->next;
			continue;
		}
		if (b && !USE_FILE(b)) {
			b = b->next;
			continue;
		}
		if (!a || !b) return 0;
		if (a->file_size != b->file_size) return 0;
		if (!CMP_MD5(a->hash, b->hash)) return 0;
		a = a->next; b = b->next;
	}
	return 1;
}
Пример #2
0
u16 *
file_numbers(pfile_t **list, pfile_t **files)
{
	int i, j;
	pfile_t *p, **qq;
	u16 *fnrs;

	for (i = 0, p = *files; p; p = p->next)
		if (USE_FILE(p))
			i++;
	NEW(fnrs, i + 1);
	for (i = 0; *files; ) {
		/*\ Look for a match \*/
		for (j = 1, qq = list; *qq; qq = &((*qq)->next), j++) {
			if ((*files)->file_size != (*qq)->file_size) continue;
			if (!CMP_MD5((*files)->hash, (*qq)->hash)) continue;
			break;
		}
		if (USE_FILE(*files))
			fnrs[i++] = j;
		/*\ No match ? Move the file entry to the tail of the list \*/
		if (!*qq) {
			*qq = *files;
			*files = (*files)->next;
			(*qq)->next = 0;
		} else {
			files = &((*files)->next);
		}
	}
	fnrs[i] = 0;
	return fnrs;
}
Пример #3
0
int main()
{
	USE_FILE( creation );
	USE_FILE( basics );
	USE_FILE( synthesis );
	USE_FILE( invariance );
	
	tester::run( "", "" );
}