bool operator==(const Pixel& p) { return Equ(p); }
bool operator!=(const Pixel& p) { return !Equ(p); }
void DoDir(const char *dir1, const char *dir2, const char *name) { int i1, i2, n1, n2, i; struct dirent **nl1, **nl2; char *buf1 = alloca(strlen(dir1) + strlen(name) + 4); char *buf2 = alloca(strlen(dir2) + strlen(name) + 4); strcpy(buf1, dir1); strcat(buf1, "/"); strcat(buf1, name); strcpy(buf2, dir2); strcat(buf2, "/"); strcat(buf2, name); n1 = scandir(buf1, &nl1, dirselect, alphasort); n2 = scandir(buf2, &nl2, dirselect, alphasort); i1 = i2 = -1; GetNext(&i1, &n1, nl1, dir1, name, &s1_ignored, &s1_bogus, &s1_wrong); GetNext(&i2, &n2, nl2, dir2, name, &s2_ignored, &s2_bogus, &s2_wrong); for (;i1 < n1 || i2 < n2;) { if (damage_limit && damage > damage_limit) break; /* Get next item from list 1 */ if (i1 < n1 && !nl1[i1]) GetNext(&i1, &n1, nl1, dir1, name, &s1_ignored, &s1_bogus, &s1_wrong); /* Get next item from list 2 */ if (i2 < n2 && !nl2[i2]) GetNext(&i2, &n2, nl2, dir2, name, &s2_ignored, &s2_bogus, &s2_wrong); if (i1 >= n1 && i2 >= n2) { /* Done */ break; } else if (i1 >= n1 && i2 < n2) { /* end of list 1, add anything left on list 2 */ Add(dir1, dir2, name, nl2[i2]); free(nl2[i2]); nl2[i2] = 0; } else if (i1 < n1 && i2 >= n2) { /* end of list 2, delete anything left on list 1 */ Del(dir1, dir2, name, nl1[i1]); free(nl1[i1]); nl1[i1] = 0; } else if (!(i = strcmp(nl1[i1]->d_name, nl2[i2]->d_name))) { /* Identical names */ if (nl1[i1]->d_type == nl2[i2]->d_type) { /* same type */ Equ(dir1, dir2, name, nl1[i1]); } else { /* different types */ Del(dir1, dir2, name, nl1[i1]); Add(dir1, dir2, name, nl2[i2]); } free(nl1[i1]); nl1[i1] = 0; free(nl2[i2]); nl2[i2] = 0; } else if (i < 0) { /* Something extra in list 1, delete it */ Del(dir1, dir2, name, nl1[i1]); free(nl1[i1]); nl1[i1] = 0; } else { /* Something extra in list 2, add it */ Add(dir1, dir2, name, nl2[i2]); free(nl2[i2]); nl2[i2] = 0; } } if (n1 >= 0) free(nl1); if (n2 >= 0) free(nl2); }