这个函数中存在很大问题,用了不少goto 用的时候很爽,可阅读代码就傻逼了
提供下修改思路吧
{
//在当前目录向下找文件
uint16 temp_file_num;
if (0 == file_total)
{
file_total = total_file_cur(NULL, 0);
file_no = 0;
}
current_file_play:
if (FALSE == dir_next(strfile))
{
//处理到文件夹最后一首歌曲的情况
switch(last_song_in_folder(dir_total, file_total))
{
case ROOT_FILE_END :
//fsel_vital_print("cfp",0,0);
return FALSE;
break;
case NON_ROOT_FILE_END :
return FALSE;
//fsel_vital_print("cdir",0,0);
break;
case PRENT_ :
goto ParentDiragainNext;
break;
default:
break;
}
CurrentDiragain:
if (dir_layer > (DIRLAYER_MAX - 1))
{
goto ParentDiragainNext;
}
//寻找该目录的第一个子文件夹
if((dir_total > 0 )||(file_total > 0))
{
fsel_close_object();
if(FALSE==dirlist_deal_file_open_objective()){return FALSE;}
dirlist_cur_file_folder_index = 1;
set_dirlist_file_index_tbl(dir_layer, dirlist_cur_file_folder_index);
temp_file_num = fsellist_get_file_index_by_no(dirlist_file_index_offset, 0, dirlist_cur_file_folder_index);
temp_file_num++;
//文件夹下面没有子文件夹的情况
if(dir_total==0)
{
if(sel_first_song_in_folder(strfile))
{
return TRUE;
}
}
//第八级目录下,不进入子文件,直接选择第一首歌曲播放,没有歌曲直接返回上一级目录
if(dir_layer == DIRLAYER_MAX -1)
{
if(sel_first_song_in_folder(strfile))
{
return TRUE;
}
else
{
goto ParentDiragainNext;
}
}
if (FALSE != fsel_dir_set_dirpos(EH_GET_EXT_DIR, temp_file_num))//进入选中的目录子文件夹
{
fsel_close_object();//关闭上一个打开的lib文件
if (FALSE == vfs_cd(vfs_mount, CD_SUB, NULL))
{
return FALSE;
}
//进入子文件夹,获得该子文件夹的文件总数
dir_layer++;
// 检查当前目录是否有合适的文件
if(FALSE==dirlist_deal_file_open_objective()){goto ParentDiragainNext;}
file_total = total_file_cur(NULL, 0);
file_no = 0;
//还有子文件夹,一直找到没有子文件夹为止
if(dir_total!=0)
{
goto CurrentDiragain;
}
if(sel_first_song_in_folder(strfile))
{
return TRUE;
}
else
{
goto ParentDiragainNext;
}
}
else //出错了
{
g_file_index =0;
fsel_error = FSEL_ERR_EXCEPTION;
return FALSE;
}
}
//如果没有子文件夹,则向上跳一层,寻找当前目录的下一个目录(平级寻找)
else
{
ParentDiragainNext:
if (0 == dir_layer)
{
//init_fsel_sysdata();
if(file_total==0)
{
//loop_flag=TRUE;
set_dirlist_file_index_tbl(0, 0);
fsel_error = FSEL_ERR_OUTOF;
//fsel_vital_print("pdn",0,0);
}
return FALSE;
}
if (FALSE != vfs_cd(vfs_mount, CD_BACK, NULL))
{
// 打开父目录的lib文件
dir_layer--;
if (0 != vfs_dir(vfs_mount, DIR_NEXT, NULL, EH_GET_EXT_DIR))
fsel_close_object();
if(FALSE==dirlist_deal_file_open_objective()){return FALSE;}
dirlist_cur_file_folder_index = get_dirlist_file_index_tbl(dir_layer);
//文件夹切完需要切到歌曲了或者没有歌曲往上在跳一层
if(dirlist_cur_file_folder_index == dir_total)
{
if(file_total > 0)
{
goto current_file_play;
}
else
//父目录所在文件夹下仅有文件夹的情况,需要向上再跳一层
{
goto ParentDiragainNext;
}
}
//进入对应层级选中的下一个平级文件夹
dirlist_cur_file_folder_index++;
set_dirlist_file_index_tbl(dir_layer, dirlist_cur_file_folder_index);
temp_file_num = fsellist_get_file_index_by_no(dirlist_file_index_offset, 0, dirlist_cur_file_folder_index);
temp_file_num++;
if (FALSE != fsel_dir_set_dirpos(EH_GET_EXT_DIR, temp_file_num))
{
if (FALSE == vfs_cd(vfs_mount, CD_SUB, NULL)){return FALSE;}
dir_layer++;
fsel_close_object();
//如果打开为空文件夹那么返回父目录重新选择
if(FALSE==dirlist_deal_file_open_objective()){ goto ParentDiragainNext;}
file_total = total_file_cur(NULL, 0);
file_no = 0;
//查找并播放该文件夹下第一首歌曲
if(dir_total == 0)
{
if (file_total > 0)
{
g_file_index =0;
goto current_file_play;
}
else
{
// 检查子目录.
goto ParentDiragainNext;
}
}
else
{
//查找并进入第一个子文件夹
goto CurrentDiragain;
}
}
else
{
goto ParentDiragainNext;
}
}
else
{
//异常出错
init_fsel_sysdata();
fsel_error = FSEL_ERR_EXCEPTION;
return FALSE;
}
}
}
return TRUE;
}
写好注释,做好详细说明,对没有必要分离的代码不是用goto
把goto里面的操作可以写成函数来表示。。。这样更代码简介。。。