void sortDir(DirToWrite* dir, int filenameType) { BaseToWrite* child; BaseToWrite** outerPtr; BaseToWrite** innerPtr; child = dir->children; while(child != NULL) { if(IS_DIR(child->posixFileMode)) sortDir(DIRTW_PTR(child), filenameType); child = child->next; } outerPtr = &(dir->children); while(*outerPtr != NULL) { innerPtr = &((*outerPtr)->next); while(*innerPtr != NULL) { if( (filenameType & FNTYPE_JOLIET && rightIsBigger((*innerPtr)->nameJoliet, (*outerPtr)->nameJoliet)) || (filenameType & FNTYPE_9660 && rightIsBigger((*innerPtr)->name9660, (*outerPtr)->name9660)) ) { BaseToWrite* outer = *outerPtr; BaseToWrite* inner = *innerPtr; if( (*outerPtr)->next != *innerPtr ) { BaseToWrite* oldInnerNext = inner->next; *outerPtr = inner; *innerPtr = outer; inner->next = outer->next; outer->next = oldInnerNext; } else { BaseToWrite* oldInnerNext = inner->next; *outerPtr = inner; innerPtr = &(inner->next); inner->next = outer; outer->next = oldInnerNext; } } innerPtr = &((*innerPtr)->next); } outerPtr = &((*outerPtr)->next); } }
//---------------------------------------------------------------------- int FFileDialog::readDir() { const char* const dir = directory.c_str(); directory_stream = opendir(dir); if ( ! directory_stream ) { FMessageBox::error (this, "Can't open directory\n" + directory); return -1; } clear(); while ( true ) { errno = 0; struct dirent* next = readdir(directory_stream); if ( next ) { // Continue if name = "." (current directory) if ( next->d_name[0] == '.' && next->d_name[1] == '\0' ) continue; // Skip hidden entries if ( ! show_hidden && next->d_name[0] == '.' && next->d_name[1] != '\0' && next->d_name[1] != '.' ) continue; // Skip ".." for the root directory if ( dir[0] == '/' && dir[1] == '\0' && std::strcmp(next->d_name, "..") == 0 ) continue; getEntry(dir, next); } else if ( errno != 0 ) { FMessageBox::error (this, "Reading directory\n" + directory); if ( errno == EOVERFLOW ) // Value too large to be stored in data type break; } else break; } // end while if ( closedir(directory_stream) != 0 ) { FMessageBox::error (this, "Closing directory\n" + directory); return -2; } sortDir(); // Insert directory entries into the list dirEntriesToList(); return 0; }