循环依赖的函数解决goto带来的阅读问题

这个函数中存在很大问题,用了不少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里面的操作可以写成函数来表示。。。这样更代码简介。。。