CDirEntry *FilesFind2(U8 *files_find_mask,I64 fuf_flags)
{
  CDrv *dv=Fs->cur_dv;
  CDirEntry *res=NULL;
  DrvChk(dv);
  switch (dv->fs_type) {
    case FSt_REDSEA:
      res=RedSeaFilesFind(files_find_mask,fuf_flags);
      break;
    case FSt_FAT32:
      res=FAT32FilesFind(files_find_mask,fuf_flags);
      break;
    default:
      PrintErr("File System Not Supported\n");
      res=NULL;
  }
  if (res) {
    DirFilesSort(&res,SK_NAME);
    if (fuf_flags&(FUF_FLATTEN_TREE|FUF_JUST_FILES))
      DirFilesFlatten(res,&res,fuf_flags);
    if (fuf_flags&FUF_CLUS_ORDER)
      DirFilesSort(&res,SK_CLUS);
  }
  return res;
}

CDirEntry *FilesFind(U8 *files_find_mask,I64 fuf_flags=0)
{/* See ::/Doc/FileUtils.DD.

Find files and make a directory tree in memory.

When done, you free with DirEntryDel(),DirEntryDel2(),
DirTreeDel() or DirTreeDel2().

*/
  CDirEntry *res;
  CDirContext *dirc;
  if (fuf_flags&~FUG_FILES_FIND)
    throw('FUF');
  if (fuf_flags&FUF_SINGLE) {
    res=MAlloc(sizeof(CDirEntry));
    if (!FileFind(files_find_mask,res)) {
      Free(res);
      return NULL;
    }
  } else if (dirc=DirContextNew(files_find_mask,TRUE)) {
    res=FilesFind2(dirc->mask,fuf_flags);
    DirContextDel(dirc);
  } else
    return NULL;
  return res;
}

Bool FileFind(U8 *filename,CDirEntry *_de=NULL,I64 fuf_flags=0)
{//FUF_JUST_DIRS, FUF_JUST_FILES, FUF_Z_OR_NOT_Z, FUF_SCAN_PARENTS
//If you pass _de, you must Free(_de->full_name);
  I64 i,j,cur_dir_clus;
  U8 *altname,*curname,*full_name=NULL;
  CDirEntry de;
  CDirContext *dirc;
  Bool res=FALSE,old_silent;
  if (fuf_flags&~FUG_FILE_FIND)
    throw('FUF');
  if (!filename || *filename && filename[1]==':' && !Let2Drv(*filename,FALSE))
    return FALSE;
  altname=ToggleZorNotZ(filename);
  if (fuf_flags&FUF_Z_OR_NOT_Z)
    j=2;
  else
    j=1;
  for (i=0;i<j && !res;i++) {
    if (!i)
      curname=filename;
    else
      curname=altname;
    old_silent=Silent;
    if (!(dirc=DirContextNew(curname)))
      Silent(old_silent);
    else {
      Silent(old_silent);
      cur_dir_clus=Name2DirClus(dirc->dv,Fs->cur_dir);
      switch (dirc->dv->fs_type) {
        case FSt_REDSEA:
          res=RedSeaFileFind(dirc->dv,cur_dir_clus,dirc->mask,
                &de,fuf_flags);
          break;
        case FSt_FAT32:
          res=FAT32FileFind(dirc->dv,cur_dir_clus,dirc->mask,
                &de,fuf_flags);
          break;
        default:
          PrintErr("File System Not Supported\n");
      }
      if (res && _de) {
        if (StrCmp(Fs->cur_dir,"/"))
          full_name=MStrPrint("%C:%s/%s",
                Drv2Let(Fs->cur_dv),Fs->cur_dir,de.name);
        else
          full_name=MStrPrint("%C:/%s",Drv2Let(Fs->cur_dv),de.name);
      }
      DirContextDel(dirc);
    }
  }
  for (i=0;i<j && !res && fuf_flags&FUF_SCAN_PARENTS;i++) {
    if (!i)
      curname=filename;
    else
      curname=altname;
    old_silent=Silent;
    if (!(dirc=DirContextNew(curname)))
      Silent(old_silent);
    else {
      Silent(old_silent);
      cur_dir_clus=Name2DirClus(dirc->dv,Fs->cur_dir);
      while (!res && StrCmp(Fs->cur_dir,"/")) {
        Cd("..");
        cur_dir_clus=Name2DirClus(dirc->dv,Fs->cur_dir);
        switch (dirc->dv->fs_type) {
          case FSt_REDSEA:
            res=RedSeaFileFind(dirc->dv,cur_dir_clus,
                  dirc->mask,&de,fuf_flags);
            break;
          case FSt_FAT32:
            res=FAT32FileFind(dirc->dv,cur_dir_clus,
                  dirc->mask,&de,fuf_flags);
            break;
          default:
            PrintErr("File System Not Supported\n");
        }
      }
      if (res && _de) {
        if (StrCmp(Fs->cur_dir,"/"))
          full_name=MStrPrint("%C:%s/%s",
                Drv2Let(Fs->cur_dv),Fs->cur_dir,de.name);
        else
          full_name=MStrPrint("%C:/%s",
                Drv2Let(Fs->cur_dv),de.name);
      }
      DirContextDel(dirc);
    }
  }
  if (_de) {
    if (res) {
      MemCpy(_de,&de,sizeof(CDirEntry));
      _de->full_name=full_name;
    } else
      MemSet(_de,0,sizeof(CDirEntry));
  }
  Free(altname);
  return res;
}