Ejemplo n.º 1
0
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);
    }
}
Ejemplo n.º 2
0
//----------------------------------------------------------------------
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;
}