亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? file.c

?? 新一代基于事件的嵌入式操作系統dyos在三星的s3c44b0的arm芯片上的完整移植代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
//----------------------------------------------------
//Copyright (C), 2004-2009,  lst.
//版權所有 (C), 2004-2009,   lst.
//所屬模塊:文件系統
//作者:lst
//版本:V1.0.0
//文件描述:文件系統與存儲介質無關的部分
//其他說明:
//修訂歷史:
//    2. ...
//    1. 日期:
//       作者:
//       新版本號:
//       修改說明:
//------------------------------------------------------
#include "inc_os.h"
#include <ctype.h>
#include <string.h>

//ansi c standard 支持的文件輸入輸出操作

//— The wide-character input functions — those functions described in 7.24 that perform
//input into wide characters and wide strings: fgetwc, fgetws, getwc, getwchar,
//fwscanf, wscanf, vfwscanf, and vwscanf.

//— The wide-character output functions — those functions described in 7.24 that
//perform output from wide characters and wide strings: fputwc, fputws, putwc,
//putwchar, fwprintf, wprintf, vfwprintf, and vwprintf.

//— The wide-character input/output functions — the union of the ungetwc function,
//the wide-character input functions, and the wide-character output functions.

//— The byte input/output functions — those functions described in this subclause that
//perform input/output: fgetc, fgets, fprintf, fputc, fputs, djyfs_fread,
//fscanf, djyfs_fwrite, getc, getchar, gets, printf, putc, putchar, puts,
//scanf, ungetc, vfprintf, vfscanf, vprintf, and vscanf.

//Operations on files,文件操作函數
//int djyfs_remove(const char *filename);
//int djyfs_rename(const char *old, const char *new);
//FILE *tmpfile(void);
//char *tmpnam(char *s);
//
//File access functions,文件訪問函數
//int djyfs_fclose(FILE *stream);
//int djyfs_fflush(FILE *stream);
//FILE *djyfs_fopen(const char * filename,const char * mode);
//FILE *freopen(const char * filename,const char * mode,FILE * restrict stream);
//void setbuf(FILE * restrict stream,char * restrict buf);
//int setvbuf(FILE * restrict stream,char * restrict buf,int mode, size_t size);
//
//Formatted input/output functions,格式化輸入輸出函數
//int fprintf(FILE * restrict stream,const char * restrict format, ...);
//int fscanf(FILE * restrict stream,const char * restrict format, ...);
//int printf(const char * restrict format, ...);
//int scanf(const char * restrict format, ...);
//int snprintf(char * restrict s, size_t n,const char * restrict format, ...);
//int sprintf(char * restrict s,const char * restrict format, ...);
//int sscanf(const char * restrict s,const char * restrict format, ...);
//int vfprintf(FILE * restrict stream,const char * restrict format,va_list arg);#include <stdarg.h>
//int vfscanf(FILE * restrict stream,const char * restrict format,va_list arg);
//int vprintf(const char * restrict format,va_list arg);
//int vscanf(const char * restrict format,va_list arg);
//int vsnprintf(char * restrict s, size_t n,const char * restrict format,va_list arg);
//int vsprintf(char * restrict s,const char * restrict format,va_list arg);
//int vsscanf(const char * restrict s,const char * restrict format,va_list arg);
//
//Character input/output functions,字符輸入輸出函數
//int fgetc(FILE *stream);
//char *fgets(char * restrict s, int n,FILE * restrict stream);
//int fputc(int c, FILE *stream);
//int fputs(const char * restrict s,FILE * restrict stream);
//int getc(FILE *stream);
//int getchar(void);
//char *gets(char *s);
//int putc(int c, FILE *stream);
//int putchar(int c);
//int puts(const char *s);
//int ungetc(int c, FILE *stream);
//
//Direct input/output functions,直接輸入輸出函數
//size_t djyfs_fread(void * restrict ptr,size_t size, size_t nmemb,FILE * restrict stream);
//size_t djyfs_fwrite(const void * restrict ptr,size_t size, size_t nmemb,FILE * restrict stream);
//
//File positioning functions,文件讀寫位置函數
//int fgetpos(FILE * restrict stream,fpos_t * restrict pos);
//int djyfs_fseek(FILE *stream, long int offset, int whence);
//int fsetpos(FILE *stream, const fpos_t *pos);
//long int ftell(FILE *stream);
//void rewind(FILE *stream);
//
//Error-handling functions,出錯處理函數
//void clearerr(FILE *stream);
//int feof(FILE *stream);
//int ferror(FILE *stream);
//void perror(const char *s);

//文件(目錄)變量命名規范:
//在"a:\aaa\bbb\ccc"中:
//1."a"被命名為DBX_name
//2."aaa"、"bbb"為spathname
//3."ccc"被命名為filename
//4."aaa"、"bbb"、"ccc"統稱為word
//5.整串或可能是整串時,命名為fullname
//6."a:\aaa\bbb\"被命名為fullpath
//7."\aaa\bbb\"被命名為abspath
//8."aaa\bbb\"稱為relativepath
//9."\aaa\bbb\ccc"命名為synname
//10."aaa\bbb\ccc"命名為relativename(相對于當前路徑)

static struct  pan_device *pg_fs_dev;       //文件系統設備指針(非句柄)
static struct file_rsc tg_content_buf[cn_opened_fsnode_limit];//定義目錄項內存池
static struct mem_cell_pool *pg_content_pool;              //內存池頭指針。
//設定一個工作路徑,相當于windows/dos的當前路徑
static char *pg_work_path_name = NULL;
static struct file_rsc *pg_work_path = NULL;    //工作路徑設備指針
struct dev_handle *pg_fs_lhdl;      //db test_flash_file函數用完后,static。
static struct rsc_node tg_opened_file_root; //打開的文件資源的根節點。

bool_t module_init_djyfs(void)
{
    //建立文件系統設備,文件系統設備本身沒有讀寫函數,所有對文件系統的讀寫操作
    //都是針對它的子設備--文件柜(俗稱磁盤)進行的。
    //ctrl函數用于設定文件系統的工作路徑、增加/刪除文件柜等。
    pg_fs_dev = dev_add_root_device("fs",
                                    NULL,NULL,  //無信號量保護
                                    (dev_write_func) NULL_func ,
                                    (dev_read_func ) NULL_func,
                                    (dev_ctrl_func ) djyfs_fs_right_ctrl ,
                                    (dev_write_func ) NULL_func ,
                                    (dev_read_func  ) NULL_func ,
                                    (dev_ctrl_func  ) djyfs_fs_left_ctrl
                                    );    //"fs"是一個根設備
    if(pg_fs_dev == NULL)
        return false;   //建立文件系統設備失敗
    pg_fs_dev->private_tag = 0;     //不使用私有標簽
    //在資源鏈表中建立一個根結點,所有打開的文件和目錄都建立在此結點下。
    //初始化文件柜時,為每個立即添加的該文件柜的根目錄結點為此結點的子結點。
    rsc_add_root_node(&tg_opened_file_root,sizeof(struct  file_rsc),"opened file");
    //建立目錄項內存池,每個打開的文件算一項,每個目錄也算一項,如果是多級目錄,
    //則每級單獨計算,如果打開的多個文件的路徑有重合,重合部分不單獨占用目錄項。
    pg_content_pool = mb_create(tg_content_buf,
                                cn_opened_fsnode_limit,
                                sizeof(struct file_rsc),
                                "打開的目錄項內存池");
    pg_fs_lhdl = dev_open_left("fs",0);  //打開文件系統設備左手接口
    return true;
}

//----查找文件----------------------------------------------------------------
//功能: 由文件系統設備的ctrl函數調用的一個函數,用于在文件系統中查找一個文件(
//      目錄)是否存在。函數調用文件柜的lookfor_item函數完成任務,只返回查找
//      結果,并不返回被查找目標的信息。
//參數: DBX_lhdl,被操作的文件柜
//      synname,文件名或者目錄名字符串,
//返回: 找到則返回true,找不到返回false
//-----------------------------------------------------------------------------
bool_t __djyfs_DBX_lookfor_item(struct dev_handle *DBX_lhdl,char *synname)
{
    struct st_DBX_device_tag *DBX_device_tag;
    DBX_device_tag = (struct st_DBX_device_tag *)
                                        (DBX_lhdl->dev_interfase->private_tag);
    struct file_rsc *parent,*son;
    struct file_rsc temp_fp;
    uint16_t next_char_off;
    char    name[256];
    DBX_device_tag = (struct st_DBX_device_tag*)
                        (DBX_lhdl->dev_interfase->private_tag);

    if(__djyfs_if_abs_path(synname))  //synname中已經去掉了文件柜名,無需再判斷
    {
        parent = DBX_device_tag->opened_root;  //從根目錄開始操作
        next_char_off = 1;
    }else
    {
        parent = pg_work_path;  //從當前路徑開始操作
        next_char_off = 0;
    }

    while(__pick_word(synname,next_char_off,name))
    {//沿路徑逐級打開目錄,但不會打開文件
        //name是模塊內部提供的字符串指針,已經經過字符串長度合法性檢查
        next_char_off += strlen(name) +1;    //+1是為跳過字符'\'
        if((son = (struct file_rsc *)rsc_search_son(&parent->file_node,name))
                    != NULL)
        {//目標已經打開
            parent = son;   //以當前打開的目錄為下次使用的父目錄
        }else
        {//目標文件(目錄)尚未打開
            //查找目標并初始化文件數據結構
            if(DBX_device_tag->lookfor_item(name,parent,&temp_fp))
            {//目標存在,并且已經初始化目錄信息
                son = &temp_fp;   //以當前打開的目標為下次使用的父目錄
                parent = son;
            }else       //目錄不存在,返回false
            {
                return false;
            }
        }
        if(next_char_off >= strlen(synname))
            return true;
    }
    return true;
}

//----打開文件柜中的文件-------------------------------------------------
//功能: 由文件柜設備的ctrl函數調用的一個函數,打開該文件柜中的一個文件。函數首先
//      調用文件柜的lookfor_item確定目標文件是否存在,然后沿路徑逐個打開目錄,
//      為每一個目錄分配 struct file_rsc 結構內存,并把他掛到資源鏈表上。最后打
//      開文件,也掛到資源鏈表上。
//參數: DBX_lhdl,被操作的文件柜
//      synname,文件名或者目錄名字符串,文件和目錄統稱item
//      mode,文件打開模式
//返回: 找到則返回true,找不到返回false
//-----------------------------------------------------------------------------
djyfs_file *__djyfs_DBX_open_file(struct dev_handle *DBX_lhdl,
                                char *synname,char *mode)
{
    struct st_DBX_device_tag *DBX_device_tag;
    struct file_rsc *parent,*son;
    struct file_rsc *opened = NULL;   //保存最后一個已經打開的目錄項
    uint32_t open_result;
    uint16_t next_char_off;
    char    name[256];
    union file_attrs attr;
    enum file_open_mode my_mode;
    bool_t need_to_creat = true;    //表示當文件不存在時,是否需要創建
    DBX_device_tag = (struct st_DBX_device_tag*)
                        (DBX_lhdl->dev_interfase->private_tag);
    if((strcmp(mode,"r")==0) || (strcmp(mode,"rb")==0))
    {
        need_to_creat = false;
        my_mode = enum_r_rb;
    }else if((strcmp(mode,"w")==0) || (strcmp(mode,"wb")==0))
        my_mode = enum_w_wb;
    else if((strcmp(mode,"a")==0) || (strcmp(mode,"ab")==0))
        my_mode = enum_a_ab;
    else if((strcmp(mode,"r+")==0)||(strcmp(mode,"rb+")==0)
                            ||(strcmp(mode,"r+b")==0))
    {
        need_to_creat = false;
        my_mode = enum_r_rb_plus;
    }else if((strcmp(mode,"w+")==0) || (strcmp(mode,"wb+")==0)
                            || (strcmp(mode,"w+b")==0))
        my_mode = enum_w_wb_plus;
    else if((strcmp(mode,"a+")==0) || (strcmp(mode,"ab+")==0)
                            || (strcmp(mode,"a+b")==0))
        my_mode = enum_a_ab_plus;
    else
        return NULL;
    if(__djyfs_if_abs_path(synname))  //synname中已經去掉了文件柜名,無需再判斷
    {
        parent = DBX_device_tag->opened_root;  //從根目錄開始操作
        next_char_off = 1;
    }else
    {
        parent = pg_work_path;  //從當前路徑開始操作
        next_char_off = 0;
    }

    while(__pick_path_word(synname,next_char_off,name))
    {//沿路徑逐級打開目錄,但不會打開文件
        //name是模塊內部提供的字符串指針,已經經過字符串長度合法性檢查
        next_char_off += strlen(name) +1;    //+1是為跳過字符'\'
        if((son = (struct file_rsc *)rsc_search_son(&parent->file_node,name))
                    != NULL)
        {//目標已經打開
            opened = son;
            if(son->open_counter != cn_limit_uint32)
                son->open_counter ++;
        }else
        {//目標文件(目錄)尚未打開
            if(!(son = mb_malloc(pg_content_pool,0)))
                goto exit_open_err;    //分配內存失敗
            son->home_DBX = parent->home_DBX;
            //查找目錄并初始化文件數據結構
            open_result = DBX_device_tag->open_item(name,parent,son,my_mode);
            if(open_result == cn_fs_open_success)
            {//目錄存在,并且已經初始化目錄信息
                //打開目錄,實際上就是把目錄結點掛到打開的文件資源樹上。
                rsc_add_eldest_son(&parent->file_node,&son->file_node,
                                sizeof(struct file_rsc),son->name);
                if(DBX_device_tag->opened_sum != cn_limit_uint32)
                    DBX_device_tag->opened_sum ++;
                son->open_counter = 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91一区在线观看| 婷婷国产v国产偷v亚洲高清| 国产成人免费视频一区| 久久久精品人体av艺术| 国产一区二区成人久久免费影院| 久久女同互慰一区二区三区| 国产成人一区在线| 综合久久一区二区三区| 色婷婷国产精品| 亚洲成人在线观看视频| 欧美一区二区三区免费观看视频| 美女视频第一区二区三区免费观看网站| 日韩欧美一级二级三级久久久| 久久激情五月婷婷| 国产女主播视频一区二区| 色综合久久九月婷婷色综合| 亚洲成人激情自拍| 精品国产伦一区二区三区观看方式| 国产成人免费高清| 伊人开心综合网| 欧美一区二区三级| 高清成人在线观看| 亚洲国产一区二区视频| 精品欧美一区二区在线观看| 成人精品视频.| 亚洲国产成人porn| 国产亚洲欧洲997久久综合| 色婷婷久久综合| 美女网站在线免费欧美精品| 欧美国产一区二区在线观看| 在线观看亚洲专区| 国内精品视频666| 亚洲免费在线电影| 亚洲精品一区二区三区影院| 日本高清不卡视频| 黄色成人免费在线| 一区二区不卡在线播放| 久久九九国产精品| 欧美久久久久久久久| 成人性生交大片免费看中文| 日韩高清不卡一区二区| 亚洲欧美综合色| 精品国精品自拍自在线| 欧美性大战xxxxx久久久| 国产真实乱偷精品视频免| 亚洲国产精品自拍| 国产精品久久久久aaaa樱花 | 中文字幕一区二区三区在线不卡 | 欧美美女直播网站| 国产成人精品免费在线| 日韩av高清在线观看| 亚洲欧美影音先锋| 久久久亚洲欧洲日产国码αv| 欧美性大战xxxxx久久久| 大白屁股一区二区视频| 蜜臀精品久久久久久蜜臀| 亚洲乱码日产精品bd| 中文字幕国产精品一区二区| 日韩欧美一级在线播放| 欧美日韩一卡二卡三卡| 色综合中文综合网| 一区在线播放视频| 久久久午夜精品理论片中文字幕| 欧美日韩第一区日日骚| 91捆绑美女网站| 成人aa视频在线观看| 国产一区二区三区视频在线播放| 偷拍一区二区三区四区| 亚洲综合成人在线| 亚洲三级视频在线观看| 国产精品久久看| 国产亚洲精品中文字幕| 精品国产乱码久久久久久图片 | 91精品欧美福利在线观看| 精品视频一区三区九区| 欧美午夜影院一区| 欧美亚洲国产怡红院影院| 97se亚洲国产综合自在线观| 北条麻妃国产九九精品视频| 国产精品综合视频| 国产高清亚洲一区| 国产精品18久久久久久久久久久久 | 国产精品短视频| 国产精品每日更新在线播放网址| 精品精品欲导航| 久久一区二区三区四区| 久久日韩粉嫩一区二区三区 | 欧美日韩国产综合视频在线观看| 欧美制服丝袜第一页| 欧美日韩在线三级| 7777精品伊人久久久大香线蕉的 | 亚洲chinese男男1069| 亚洲第一主播视频| 成人av网站在线观看免费| 成人久久久精品乱码一区二区三区| 粉嫩13p一区二区三区| 91视视频在线观看入口直接观看www| 成人av电影免费观看| 日本高清不卡一区| 91精品欧美久久久久久动漫 | 8x福利精品第一导航| 日韩三级高清在线| 国产女主播一区| 亚洲猫色日本管| 日韩国产欧美在线播放| 久久99精品久久久久久久久久久久| 国产美女在线观看一区| 成人黄色在线网站| 欧美在线视频日韩| 欧美大白屁股肥臀xxxxxx| 久久精品一二三| 一区二区三区产品免费精品久久75| 亚洲网友自拍偷拍| 国产露脸91国语对白| 色天使色偷偷av一区二区| 91麻豆精品国产91久久久使用方法 | 激情综合亚洲精品| av午夜一区麻豆| 91精品国产入口在线| 中文字幕第一区二区| 午夜视频在线观看一区二区| 激情国产一区二区| 日本国产一区二区| 久久久夜色精品亚洲| 亚洲国产精品久久久男人的天堂 | 欧美日韩成人在线| 日本一区二区三区久久久久久久久不 | 黑人巨大精品欧美一区| 日本道在线观看一区二区| 久久综合999| 亚洲综合999| 成人一区二区三区在线观看| 在线播放中文字幕一区| 国产精品久久久久久久久免费樱桃| 视频一区欧美精品| 色偷偷一区二区三区| 久久久久久久精| 美女一区二区在线观看| 在线观看网站黄不卡| 国产精品女主播av| 国产呦萝稀缺另类资源| 欧美精品电影在线播放| 亚洲精品国久久99热| 国产成人av一区二区三区在线| 欧美一区二区女人| 亚洲国产wwwccc36天堂| 色婷婷久久99综合精品jk白丝| 久久久www免费人成精品| 蜜乳av一区二区三区| 欧美日韩国产首页| 亚洲一二三区在线观看| 91首页免费视频| 中文字幕在线不卡一区二区三区| 国产一区免费电影| 欧美mv和日韩mv国产网站| 视频一区二区三区入口| 日本高清免费不卡视频| **性色生活片久久毛片| 国产福利视频一区二区三区| 4438成人网| 中文字幕乱码亚洲精品一区| 国产激情精品久久久第一区二区| 欧美丰满嫩嫩电影| 伊人色综合久久天天| 色婷婷综合中文久久一本| 久久婷婷久久一区二区三区| 丝袜亚洲另类欧美综合| 日本高清无吗v一区| 亚洲精品视频观看| 99精品视频中文字幕| 国产婷婷色一区二区三区| 激情文学综合网| 久久免费偷拍视频| 精品一区二区三区久久| 欧美一区二区人人喊爽| 亚洲丝袜精品丝袜在线| 成人av资源下载| 国产精品毛片久久久久久| 国产成人欧美日韩在线电影| 国产欧美日韩中文久久| 国产成人综合网| 久久久久久9999| 欧美视频一区二区三区| 亚洲欧美偷拍三级| 91欧美一区二区| 欧美精品一区二区三区久久久 | 国产成人精品一区二区三区四区 | 国产精品三级av| 粉嫩aⅴ一区二区三区四区| 国产欧美日产一区| 国产福利一区二区三区在线视频| 国产精品久久久久久久久图文区 | 日韩国产成人精品| 日韩一区二区免费电影| 极品尤物av久久免费看| 中国av一区二区三区| 99久久精品国产观看| 亚洲精品日日夜夜| 8v天堂国产在线一区二区| 国产999精品久久久久久|