⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 新一代基于事件的嵌入式操作系统dyos在三星的s3c44b0的arm芯片上的完整移植代码
💻 C
📖 第 1 页 / 共 5 页
字号:
//      -->DBX_device->left_hand.io_ctrl
//      -->DBX_left_ctrl (用enum_DBX_flush命令)
//      -->__DBX_flush_file
//参数:DBX_lhdl,被操作文件所属的文件柜
//      buf,数据缓冲区指针
//      fp,被关闭的文件(目录)指针
//返回:写入存储介质的数据量
//----------------------------------------------------------------------------
uint32_t __DBX_flush_file(struct dev_handle *DBX_lhdl,struct file_rsc *fp)
{
    struct st_DBX_device_tag *DBX_device_tag;
    uint32_t result;
    DBX_device_tag =(struct st_DBX_device_tag*)
                            DBX_lhdl->dev_interfase->private_tag;
    result = DBX_device_tag->flush(fp);
    return result;
}

//----flush文件柜的所有文件----------------------------------------------------
//功能: 把文件柜中所有文件的写缓冲区的数据写入到存储器中,并清空写缓冲区。
//      调用顺序:
//      用户调用fflush
//      -->dev_ctrl
//      -->DBX_device->left_hand.io_ctrl
//      -->DBX_left_ctrl (用enum_DBX_flush_all命令)
//      -->__DBX_flush_all
//参数:DBX_lhdl,被操作文件所属的文件柜
//返回:0
//----------------------------------------------------------------------------
uint32_t __DBX_flush_all(struct dev_handle *DBX_lhdl)
{
    struct st_DBX_device_tag *DBX_device_tag;
    struct  rsc_node  *current,*start,*temp;
    struct  file_rsc *item;
    DBX_device_tag = (struct st_DBX_device_tag *)
                                        DBX_lhdl->dev_interfase->private_tag;
    start = &DBX_device_tag->opened_root->file_node;
    current = &DBX_device_tag->opened_root->file_node;
    while((temp = rsc_trave_scion(start,current)) != NULL)
    {//此循环遍历整个文件柜所有打开的文件和目录
        item = (struct file_rsc *)temp;
        if( ! item->attr.bits.folder)    //如果是文件,则刷到存储器
            __DBX_flush_file(DBX_lhdl,item);
        current = temp; //rsc_search_tree函数下次调用的起点
    }
    return 0;
}
//----文件柜设备左手控制函数-------------------------------------------------
//功能:顾名思义,执行一系列上层发下来的文件系统控制命令
//参数:DBX_lhdl,左手设备句柄指针
//      left_cmd,左手命令字,使用时转换成enum DBX_left_cmd类型
//      data1、data2,跟命令字相关的数据
//返回:与命令字相关,参见源程序注释
//-----------------------------------------------------------------------------
ptu32_t DBX_left_ctrl(struct dev_handle *DBX_lhdl,uint32_t left_cmd,
                                uint32_t data1,uint32_t data2)
{
    struct st_DBX_device_tag *DBX_device_tag = (struct st_DBX_device_tag *)
                                        (DBX_lhdl->dev_interfase->private_tag);
    struct file_rsc *root_folder;
    switch((enum DBX_left_cmd)left_cmd)
    {
        case enum_DBX_format:
        {//格式化文件柜,data1是格式化参数
            if(DBX_device_tag->format(data1,DBX_device_tag))
            {
                if(DBX_device_tag->opened_root == NULL)
                {
                    //申请根目录资源结点内存
                    root_folder = mb_malloc(pg_content_pool,0);
                    if(root_folder == NULL)
                    {
                        DBX_device_tag->formatted = false;
                        return enum_fs_create_root_folder_error;
                    }
                    memset(root_folder,0,sizeof(struct file_rsc));
                    //把新文件柜的根目录资源节点加入到文件根资源结点下,
                    rsc_add_son(&tg_opened_file_root,&root_folder->file_node,
                                  sizeof(struct file_rsc),DBX_device_tag->name);
                    //文件柜设备的打开文件的根结点指向该根资源结点。
                    DBX_device_tag->opened_root = root_folder;
                    root_folder->home_DBX = DBX_lhdl->dev_interfase;
                }
                DBX_device_tag->formatted = true;
                return enum_fs_no_error;
            }else
            {
                DBX_device_tag->formatted = false;
                return enum_fs_format_DBX_error;
            }
        }break; //for enum_DBX_format
        case enum_DBX_lookfor:
        {//查找文件,data1是文件名(目录名)
            return (ptu32_t)__djyfs_DBX_lookfor_item(DBX_lhdl,(char*)data1);
        }break; //for enum_DBX_lookfor
        case enum_DBX_open:
        {//打开文件,data1是文件名,data2是模式字符串,返回文件指针
            return (ptu32_t)__djyfs_DBX_open_file(DBX_lhdl,(char*)data1,(char*)data2);
        }break; //for enum_DBX_open
        case enum_DBX_remove:
        {//data1是文件(目录)名,data2不用
            return (ptu32_t)__djyfs_DBX_remove_item(DBX_lhdl,(char*)data1);
        }break;     //for enum_DBX_remove
        case enum_DBX_rename:
        {//data1是原文件(目录)名,data2是新文件名
            return (ptu32_t)__DBX_rename_item(DBX_lhdl,(char*)data1,(char*)data2);
        }break; //for enum_DBX_rename
        case enum_DBX_close:
        {
            return (ptu32_t)__DBX_close_item(DBX_lhdl,(struct file_rsc*)data1);
        }break; //for enum_DBX_close
        case enum_DBX_flush:
        {
            if(__DBX_flush_file(DBX_lhdl,(struct file_rsc *)data1)==0)
                return (ptu32_t)EOF;
            else
                return 0;
        } break; //for enum_DBX_flush
        case enum_DBX_seek:
        {
            return (ptu32_t)DBX_device_tag->seek_file((struct file_rsc *)data2,
                                                     (struct seek_para *)data1);
        } break; //for enum_DBX_seek
        default : break;
    }
    return 0;
}

//----文件柜设备右手控制函数-------------------------------------------------
//功能:顾名思义,执行一系列存储设备driver发出的文件系统控制命令
//参数:DBX_rhdl,右手设备句柄指针
//      right_cmd,右手命令字,使用时转换成enum DBX_right_cmd类型
//      data1、data2,跟命令字相关的数据
//返回:与命令字相关,参见源程序注释
//-----------------------------------------------------------------------------
ptu32_t DBX_right_ctrl(struct dev_handle *DBX_rhdl,uint32_t right_cmd,
                                ptu32_t data1,ptu32_t data2)
{
    switch((enum DBX_right_cmd)right_cmd)
    {
        case enum_DBX_clr_readbuf:
        {//清除文件的读缓冲区,data1是文件指针
            if(((struct file_rsc*)data1)->p_read_buf != NULL)
               ring_flush(((struct file_rsc*)data1)->p_read_buf);
            return 0;
        }break; //for enum_DBX_clr_readbuf
        case enum_DBX_clr_writebuf:
        {//清除文件的写缓冲区,data1是文件指针
            if(((struct file_rsc*)data1)->p_write_buf != NULL)
               ring_flush(((struct file_rsc*)data1)->p_write_buf);
            return 0;
        }break; //for enum_DBX_clr_writebuf
        case enum_DBX_flush_one:
        {//
            return (ptu32_t)__DBX_flush_file(DBX_rhdl,(struct file_rsc *)data1);
        }break; //for enum_DBX_flush_one
        case enum_DBX_flush_all:
        {//
            return (ptu32_t)__DBX_flush_all(DBX_rhdl);
        }break; //for enum_DBX_flush_all
        case enum_DBX_update_medium_tag:
        {//修改(设置)一个文件的媒体标记,data1为文件指针,data2为新标记
            ;
        }break; //for enum_DBX_update_medium_tag
        case enum_DBX_search_medium_tag:
        {//搜索一个文件的媒体标记,data1为该文件的媒体标记,返回文件指针
            ;
        }break; //for enum_DBX_search_medium_tag
        default:break;
    }
    return 0;
}

//----打开文件柜左手接口------------------------------------------------------
//功能: 根据文件(目录)名,打开与之对应的文件柜左手接口。
//参数: fullname,文件(目录)名指针
//返回:设备句柄,出现下列情况返回NULL:
//      1.文件柜不存在  2.fullname和pg_work_path_name均没有指定文件柜名
//----------------------------------------------------------------------------
struct dev_handle *__openum_DBX_left(char *fullname)
{
    struct  dev_handle *DBX_lhdl;
    char DBX_name[256];
    uint16_t name_len;
    name_len = __djyfs_if_contain_DBX_name(fullname);
    if(name_len != 0)
    {//fullname是包括文件柜名在内的全路径(也可以是当前文件柜)
        memcpy(DBX_name,fullname,name_len); //从参数中copy文件柜名
        DBX_name[name_len] = '\0';          //写入串结束符
    }else
    {//fullname中没有指定文件柜名,应从当前工作路径中取
        if(pg_work_path_name == NULL)
            return NULL;    //当前路径空,返回空
        //当前路径只要不是空串,就肯定是包含文件柜名的合法串。
        name_len = __djyfs_if_contain_DBX_name(pg_work_path_name);
        memcpy(DBX_name,pg_work_path_name,name_len);//从当前目录中提取文件柜名
        DBX_name[name_len] = '\0';                  //写入串结束符
    }
    DBX_lhdl = dev_open_left_scion(pg_fs_lhdl,DBX_name,0); //打开文件柜设备
    return DBX_lhdl;
}

//----从目录中取一字-----------------------------------------------------------
//功能: 从一个可能包含多级路径名和文件名的字符串curent_offset位置开始取出一个
//      由'\'分隔的word
//参数: synname,输入字符串,格式如"\aaa\bbb\ccc.txt"
//      start_offset,搜索起始位置指针
//      name,保存取得的字符串的缓冲区指针
//返回: true=成功
//      false=失败,1、已经完成最后一个目录字
//                  2、synname中根本就不包含目录字
//                  3、字长超过255字符
//      在*name中返回取得的字符串
//备注: synname应该是经过合法性检查的字符串,不会出现word超长的问题
//-----------------------------------------------------------------------------
bool_t __pick_word(char *synname,uint32_t curent_offset,char *name)
{
    uint32_t index = 0;
    //synname是已经经过字符串长度合法性检查的指针
    uint32_t name_len = strlen(synname);
    uint32_t offset = curent_offset;
    for( ; offset< name_len; offset++)
    {
        if(synname[offset] == '\\')    //遇到字符'\'
        {
            name[index] = '\0';
            return true;
        }else   //未遇到字符'\'。
        {
            if(index == cn_file_name_limit)
                return false;
            name[index] = synname[offset];     //复制当前字符到文件名串
            index++;
        }
    }
    return true;   //若正确提取目录字,程序不会运行至此
}

//----取一目录名字-------------------------------------------------------------
//功能: 从一个可能包含多级路径名和文件名的字符串中curent_offset位置开始取出一个
//      目录名
//参数: synname,输入字符串,格式如"\aaa\bbb\ccc.txt"
//      start_offset,搜索起始位置指针
//      name,保存取得的字符串的缓冲区指针
//返回: true=成功
//      false=失败,1、已经完成最后一个目录字
//                  2、synname中根本就不包含目录字
//                  3、字长超过255字符
//      在*name中返回取得的字符串
//备注: synname应该是经过合法性检查的字符串,不会出现word超长的问题
//-----------------------------------------------------------------------------
bool_t __pick_path_word(char *synname,uint32_t curent_offset,char *name)
{
    uint32_t index = 0;
    //synname是已经经过字符串长度合法性检查的指针
    uint32_t name_len = strlen(synname);
    uint32_t offset = curent_offset;
    for( ; offset< name_len; offset++)
    {
        if(synname[offset] == '\\')    //遇到字符'\'
        {
            name[index] = '\0';
            return true;
        }else   //未遇到字符'\'。
        {
            if(index == cn_file_name_limit)
                return false;
            name[index] = synname[offset];     //复制当前字符到文件名串
            index++;
        }
    }
    return false;   //若正确提取目录字,程序不会运行至此
}

//----取文件名串---------------------------------------------------------------
//功能: 从一个可能包含多级路径名和文件名的字符串中取出文件名
//参数: synname,输入字符串,格式如"\aaa\bbb\ccc.txt"
//      start_offset,搜索起始位置指针
//      name,保存取得的字符串的缓冲区指针
//返回: true=成功
//      false=失败,synname中不包含文件名
//      在*name中返回取得的字符串
//备注: synname应该是经过合法性检查的字符串,不会出现word超长的问题
//-----------------------------------------------------------------------------
bool_t __pick_filename_word(char *synname,char *name)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -