/*\ |*| 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; }
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; }
int main() { USE_FILE( creation ); USE_FILE( basics ); USE_FILE( synthesis ); USE_FILE( invariance ); tester::run( "", "" ); }