📄 enhanced_selector_prev_for_ape.c
字号:
*
* Returns :
* TRUE: success.
* FALSE: fail, detail info store in fselError.
* Notes : rewind to the last valid directory when fselDir == 0;
*
********************************************************************************/
BOOL fselPrevDir(char *strDir)
{
WORD wtemp;
if(fselDirNo[fselDirLayer] <= 1)
{
return FALSE;
}
//seek to the prev valid directory enty
wtemp = fselDirNo[fselDirLayer];
wtemp --;
if ( !ToDirEntry1(strDir, wtemp))
{
return FALSE;
}
fselDirNo[fselDirLayer] = wtemp;
return TRUE;
}
/********************************************************************************
* Description : in current dir get the last dir
*
* Arguments :
strDir:output Dir name
* Returns :
TRUE: Successful
FALSE: fail.
* Notes : None
*
********************************************************************************/
/*BOOL FS_LASTDir(char *strDir)
{
if( fselDirLayer > 7 )
return FALSE;
fselDirNo[fselDirLayer] = 0;
if ( !FS_Dir(m_szTemp1, IgnoreExt1, FS_DIR_DIR) ) // if no dir ,return error
return FALSE;
fselDirNo[fselDirLayer] = 1;
memcpy(strDir,m_szTemp1,12);
while ( FS_Dir(m_szTemp1, IgnoreExt1, FS_DIR_DIR_CONT))
{
fselDirNo[fselDirLayer]++;
memcpy(strDir,m_szTemp1,12);
}
return TRUE;
} */
/********************************************************************************
* Description : Seek to the prev file
*
* Arguments :
strFile:output file name
* Returns :
TRUE: Successful
FALSE: fail.
* Notes : 目录数检查,先子目录(子目录N -- 子目录1)再父目录.
*
********************************************************************************/
BOOL SelectPrev_8Layer(char *strFile)
{
char strDir[12];
//在当前目录向下找文件
fselError = 0;
if (fselTotal == 0)
fselTotal=GetFileTotalCur(FALSE);
if ( !SelectPrev(strFile) )
{
//检查父目录.
ParentDiragainNext:
// output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
_ClearWatchDog();
if ( FS_CD("\\"))
{
if( fselDirNo[fselDirLayer] == 0)
{
fselDirLayer--;
}
if ( fselDirLayer < 0 || fselDirLayer > 7)
{
fselError = FSEL_ERR_OUTOF; //已经返回到根目录,重新初始化
fselInit(fselType, fselMode,0,fselDiskLetter);
return FALSE;
}
if ( fselPrevDir(strDir) )
{
goto CurrentDiragainNext;
}
else
{ //当前目录下有效的文件
fselDirNo[fselDirLayer] = 0;
fselTotal=GetFileTotalCur(FALSE);
fselFileNo = 0;
fselExtNo = 0;
#ifdef __APE_SUPPORT
fselFileNo_APE = 0;
CurApe_TotalNo = 0;
#endif
if ( SelectPrev(strFile) )
{
fselError = 0;
fselDirLayer--;
return TRUE;
}
// 当前目录分支没有合适的文件,退回上级目录
goto ParentDiragainNext;
}
}
else
{
fselError = FSEL_ERR_OUTOF;
return FALSE;
}
//寻找当前目录下的所有目录
CurrentDiragainNext:
// output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
_ClearWatchDog();
FS_CD(strDir);
if (fselDirLayer > 7 )
{
FS_CD("\\");
fselDirLayer--;
fselDirNo[fselDirLayer] = 0;
goto ParentDiragainNext;
}
fselDirLayer++;
if ( FS_LASTDir(strDir) )
{
goto CurrentDiragainNext;
}
else // 寻找当前目录的下一个目录(平级寻找)
{
fselDirLayer--;
fselTotal=GetFileTotalCur(FALSE);
fselFileNo = 0;
fselExtNo = 0;
#ifdef __APE_SUPPORT
fselFileNo_APE = 0;
CurApe_TotalNo = 0;
#endif
if ( SelectPrev(strFile) )
{
fselError = 0;
return TRUE;
}
// 当前目录分支没有合适的文件,退回上级目录
goto ParentDiragainNext;
}
}
return TRUE;
}
/********************************************************************************
* Description : Select the Prev file according to type & mode, then get the name of file.
*
* Arguments :
strFile: Dos 8.3 file name of selected file.
* Returns :
TRUE: Successful.
FALSE: Fail, detail information in fselError
* Notes : None
*
********************************************************************************/
BOOL fselGetPrev( char *strFile)
{
//uchar temp, num;
char temp[12];
switch ( fselMode)
{
case FSEL_ALL_REPEATONE:
case FSEL_DIR_RANDOM:
return fselGetNext(strFile);
//break;
case FSEL_DIR_SEQUENCE:
case FSEL_DIR_INTRO:
return SelectPrev(strFile);
case FSEL_ALL_SEQUENCE:
return SelectPrev_8Layer(strFile);
case FSEL_ALL_REPEATALL:
if (SelectPrev_8Layer(strFile))
return TRUE;
else
{
fselInit(fselType, fselMode,0,fselDiskLetter);
//fselTotal = GetFileTotalCur (FALSE);
//fselFileNo = fselTotal + 1;
while(FS_LASTDir(temp))
{
FS_CD(temp);
fselDirLayer++;
// output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
_ClearWatchDog();
}
fselDirLayer--;
return SelectPrev_8Layer(strFile);
}
case FSEL_DIR_REPEATALL:
if (SelectPrev(strFile ))
return TRUE;
fselFileNo = 0;
fselExtNo = 0;
#ifdef __APE_SUPPORT
fselFileNo_APE = 0;
CurApe_TotalNo = 0;
#endif
return SelectPrev(strFile);
default:
return FALSE;
}
}
/********************************************************************************
* Description : Set the selected location which is specified by location.
*
* Arguments :
* location: store drive name, path name, file name.
* Returns :
* TRUE: Successful
* FALSE: Fail, detail information in fselError
* Notes : Should select path in the case of only file name is invalid
*
********************************************************************************/
BYTE fselSetLocationC(file_location_t *location)
{
BYTE i,iTag;
iTag = 0;
//Active the disk & file system;
if(( !DRV_ActiveDrive(location->disk, 1))
||(!FS_Init()))
{
fselError = FSEL_ERR_DISK;
return FALSE;
}
//initialize FSEL
Init1(fselType, fselMode);
fselDiskLetter= location->disk;
for(i=0; i<TOTALDIRLAYER; i++)
fselDirNo[i] = location->DirNo[i];
//output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
if (!FS_SetCurDir(location->ClusterNo))
{
fselError = FSEL_ERR_SETDIR;
return FALSE;
}
fselDirLayer = location->dirLayer;
if( fselDirNo[0] != 0)
{
FS_CD("\\");
ToDirEntry1(m_szTemp1,fselDirNo[fselDirLayer]);
FS_CD(m_szTemp1);
// output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
_ClearWatchDog();
if ( memcmp(m_szTemp1,location->path,11) != 0) //path is invalid
{
fselError = FSEL_ERR_SETDIR;
return FALSE;
}
}
else
{
if(location->path[0] != ':')
{
fselError = FSEL_ERR_SETDIR;
return FALSE;
}
FS_CD(RootName1);
}
//Select the specify file by location
if ('\0'==location->filename[0])
{
return TRUE;
}
if(0==fselTotal)
{
fselError = FSEL_ERR_SETFILE;
return FALSE;
}
fselFileNo = 0;
fselExtNo = 0;
#ifdef __APE_SUPPORT
fselFileNo_APE = 0;
CurApe_TotalNo = 0;
#endif
do {
// output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
_ClearWatchDog();
if (!SelectNext1(m_szTemp1))
{
fselError = FSEL_ERR_SETFILE;
fselFileNo = 0;
#ifdef __APE_SUPPORT
fselFileNo_APE = 0;
CurApe_TotalNo = 0;
#endif
fselExtNo = 0;
return FALSE;
}
iTag = 1;
for(i=0; i<11; i++)
{
if (m_szTemp1[i] != location->filename[i])
iTag = 0;
}
if(iTag && !memcmp(location->filename+8,APEExt1,3))
{
while(fselFileNo+CurApe_TotalNo-fselFileNo_APE<location->APE_Cur)
if(!SelectNext1(m_szTemp1))
break;
}
} while( iTag == 0 );
return TRUE;
}
/********************************************************************************
* Description : Get the selected location
*
* Arguments :
* location: the buffer to store location
* Returns :
* TRUE: Successful
* FALSE: Fail, detail information in fselError.
* Notes : None
*
********************************************************************************/
BOOL fselGetLocationC(file_location_t *location)
{
BYTE i;
long lEntry;
location->disk = fselDiskLetter;
for(i=0; i<TOTALDIRLAYER; i++)
location->DirNo[i] = fselDirNo[i];
location->ClusterNo = FS_GetCurDir();
location->dirLayer = fselDirLayer;
#ifdef __APE_SUPPORT
location->APE_Cur = fselFileNo+CurApe_TotalNo-fselFileNo_APE;
#endif
lEntry = FS_GetCurDirEntry();
if (fselFileNo != 0 )
{
if ( !fselGetByNO(location->filename, fselFileNo) )
{
location->filename[0] = 0x00;
location->path[0] = ':';
location->dirLayer = 0;
return FALSE;
}
}
else
{
location->filename[0] = 0x00;
}
// 只有在fselDirNo[0] == 0时,当前目录是根目录.
if ( fselDirLayer > 7 || fselDirNo[0] == 0)
{
m_szTemp1[0] = ':';
fselDirNo[0] = 0;
fselDirLayer = 0;
}
else
{
FS_CD("\\");
ToDirEntry1(m_szTemp1,fselDirNo[fselDirLayer]);
}
// output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
_ClearWatchDog();
memcpy(location->path, m_szTemp1, 11);
FS_CD(m_szTemp1);
FS_SetCurDirEntry(lEntry);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -