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

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

?? fat16.c

?? 基于STM32的 模擬時序
?? C
?? 第 1 頁 / 共 5 頁
字號:
    /* seek to the n-th entry */
    struct fat16_read_callback_arg arg;
    memset(&arg, 0, sizeof(arg));
    arg.entry_num = entry_num;
    if(!device_read_interval(header->root_dir_offset,
                             buffer,
                             sizeof(buffer),
                             header->cluster_zero_offset - header->root_dir_offset,
                             fat16_dir_entry_seek_callback,
                             &arg) ||
       arg.entry_offset == 0
      )
        return 0;

    /* read entry */
    memset(dir_entry, 0, sizeof(*dir_entry));
    if(!device_read_interval(arg.entry_offset,
                             buffer,
                             sizeof(buffer),
                             arg.byte_count,
                             fat16_dir_entry_read_callback,
                             dir_entry))
        return 0;

    return dir_entry->long_name[0] != '\0' ? 1 : 0;
}

/**
 * \ingroup fat16_fs
 * Reads a directory entry of a given parent directory.
 *
 * \param[in] fs Descriptor of file system to use.
 * \param[in] entry_num The index of the directory entry to read.
 * \param[in] parent Directory entry descriptor in which to read directory entry.
 * \param[out] dir_entry Directory entry descriptor which will get filled.
 * \returns 0 on failure, 1 on success
 * \see fat16_read_root_dir_entry, fat16_read_dir_entry_by_path
 */
u8 fat16_read_sub_dir_entry(const struct fat16_fs_struct* fs, u16 entry_num, const struct fat16_dir_entry_struct* parent, struct fat16_dir_entry_struct* dir_entry)
{
    if(!fs || !parent || !dir_entry)
        return 0;

    /* we are in a parent directory and want to search within its directory entry table */
    if(!(parent->attributes & FAT16_ATTRIB_DIR))
        return 0;
	
    /* loop through all clusters of the directory */
    u8 buffer[32];
    u32 cluster_offset;
    u16 cluster_size = fs->header.cluster_size;
    u16 cluster_num = parent->cluster;
    struct fat16_read_callback_arg arg;

    while(1)
    { 
        /* calculate new cluster offset */
        cluster_offset = fs->header.cluster_zero_offset + (u32) (cluster_num - 2) * cluster_size;

        /* seek to the n-th entry */
        memset(&arg, 0, sizeof(arg));
        arg.entry_num = entry_num;
        if(!fs->partition->device_read_interval(cluster_offset,
                                                buffer,
                                                sizeof(buffer),
                                                cluster_size,
                                                fat16_dir_entry_seek_callback,
                                                &arg)
          )
        return 0;
		
        /* check if we found the entry */
        if(arg.entry_offset)
		    break;
		
        /* get number of next cluster */
        if(!(cluster_num = fat16_get_next_cluster(fs, cluster_num)))
            return 0; /* directory entry not found */
    }

    memset(dir_entry, 0, sizeof(*dir_entry));

    /* read entry */
    if(!fs->partition->device_read_interval(arg.entry_offset,
                                            buffer,
                                            sizeof(buffer),
                                            arg.byte_count,
                                            fat16_dir_entry_read_callback,
                                            dir_entry))
        return 0;

    return dir_entry->long_name[0] != '\0' ? 1 : 0;
}

/**
 * \ingroup fat16_fs
 * Callback function for seeking through subdirectory entries.
 */
u8 fat16_dir_entry_seek_callback(u8* buffer, u32 offset, void* p)
{
    struct fat16_read_callback_arg* arg = p;

    /* skip deleted or empty entries */
    if(buffer[0] == FAT16_DIRENTRY_DELETED || !buffer[0])
        return 1;

    if(arg->entry_cur == arg->entry_num)
    {
        arg->entry_offset = offset;
        arg->byte_count = buffer[11] == 0x0f ?
                          ((buffer[0] & FAT16_DIRENTRY_LFNSEQMASK) + 1) * 32 :
                          32;
        return 0;
    }

    /* if we read a 8.3 entry, we reached a new directory entry */
    if(buffer[11] != 0x0f)
        ++arg->entry_cur;

    return 1;
}

/**
 * \ingroup fat16_fs
 * Callback function for reading a directory entry.
 */
u8 fat16_dir_entry_read_callback(u8* buffer, u32 offset, void* p)
{
    struct fat16_dir_entry_struct* dir_entry = p;

    /* there should not be any deleted or empty entries */
    if(buffer[0] == FAT16_DIRENTRY_DELETED || !buffer[0])
        return 0;

    if(!dir_entry->entry_offset)
        dir_entry->entry_offset = offset;
    
    switch(fat16_interpret_dir_entry(dir_entry, buffer))
    {
        case 0: /* failure */
            return 0;
        case 1: /* buffer successfully parsed, continue */
            return 1;
        case 2: /* directory entry complete, finish */
            return 0;
    }

    return 0;
}

/**
 * \ingroup fat16_fs
 * Interprets a raw directory entry and puts the contained
 * information into the directory entry.
 * 
 * For a single file there may exist multiple directory
 * entries. All except the last one are lfn entries, which
 * contain parts of the long filename. The last directory
 * entry is a traditional 8.3 style one. It contains all
 * other information like size, cluster, date and time.
 * 
 * \param[in,out] dir_entry The directory entry to fill.
 * \param[in] raw_entry A pointer to 32 bytes of raw data.
 * \returns 0 on failure, 1 on success and 2 if the
 *          directory entry is complete.
 */
u8 fat16_interpret_dir_entry(struct fat16_dir_entry_struct* dir_entry, const u8* raw_entry)
{
    if(!dir_entry || !raw_entry || !raw_entry[0])
        return 0;

    char* long_name = dir_entry->long_name;
    if(raw_entry[11] == 0x0f)
    {
        u16 char_offset = ((raw_entry[0] & 0x3f) - 1) * 13;

        if(char_offset + 12 < sizeof(dir_entry->long_name))
        {
            /* Lfn supports unicode, but we do not, for now.
             * So we assume pure ascii and read only every
             * second byte.
             */
            long_name[char_offset + 0] = raw_entry[1];
            long_name[char_offset + 1] = raw_entry[3];
            long_name[char_offset + 2] = raw_entry[5];
            long_name[char_offset + 3] = raw_entry[7];
            long_name[char_offset + 4] = raw_entry[9];
            long_name[char_offset + 5] = raw_entry[14];
            long_name[char_offset + 6] = raw_entry[16];
            long_name[char_offset + 7] = raw_entry[18];
            long_name[char_offset + 8] = raw_entry[20];
            long_name[char_offset + 9] = raw_entry[22];
            long_name[char_offset + 10] = raw_entry[24];
            long_name[char_offset + 11] = raw_entry[28];
            long_name[char_offset + 12] = raw_entry[30];
        }

        return 1;
    }
    else
    {
        /* if we do not have a long name, take the short one */
        if(long_name[0] == '\0')
        {
            u8 i;
            for(i = 0; i < 8; ++i)
            {
                if(raw_entry[i] == ' ')
                    break;
                long_name[i] = raw_entry[i];
            }
            if(long_name[0] == 0x05)
                long_name[0] = (char) FAT16_DIRENTRY_DELETED;

            if(raw_entry[8] != ' ')
            {
                long_name[i++] = '.';

                u8 j = 8;
                for(; j < 11; ++j)
                {
                    if(raw_entry[j] != ' ')
                    {
                        long_name[i++] = raw_entry[j];
                    }
                    else
                    {
                        break;
                    }
                }
            } 

            long_name[i] = '\0';
        }
        
        /* extract properties of file and store them within the structure */
        dir_entry->attributes = raw_entry[11];
        dir_entry->cluster = ((u16) raw_entry[26]) |
                             ((u16) raw_entry[27] << 8);
        dir_entry->file_size = ((u32) raw_entry[28]) |
                               ((u32) raw_entry[29] << 8) |
                               ((u32) raw_entry[30] << 16) |
                               ((u32) raw_entry[31] << 24);

#if FAT16_DATETIME_SUPPORT
        dir_entry->modification_time = ((u16) raw_entry[22]) |
                                       ((u16) raw_entry[23] << 8);
        dir_entry->modification_date = ((u16) raw_entry[24]) |
                                       ((u16) raw_entry[25] << 8);
#endif

        return 2;
    }
}

/**
 * \ingroup fat16_file
 * Retrieves the directory entry of a path.
 *
 * The given path may both describe a file or a directory.
 *
 * \param[in] fs The FAT16 filesystem on which to search.
 * \param[in] path The path of which to read the directory entry.
 * \param[out] dir_entry The directory entry to fill.
 * \returns 0 on failure, 1 on success.
 * \see fat16_read_dir
 */
u8 fat16_get_dir_entry_of_path(struct fat16_fs_struct* fs, const char* path, struct fat16_dir_entry_struct* dir_entry)
{
    if(!fs || !path || path[0] == '\0' || !dir_entry)
        return 0;

    if(path[0] == '/')
        ++path;

    /* begin with the root directory */
    memset(dir_entry, 0, sizeof(*dir_entry));
    dir_entry->attributes = FAT16_ATTRIB_DIR;

    if(path[0] == '\0')
        return 1;

    while(1)
    {
        struct fat16_dir_struct* dd = fat16_open_dir(fs, dir_entry);
        if(!dd)
            break;

        /* extract the next hierarchy we will search for */
        const char* sep_pos = strchr(path, '/');
        if(!sep_pos)
            sep_pos = path + strlen(path);
        u8 length_to_sep = sep_pos - path;
        
        /* read directory entries */
        while(fat16_read_dir(dd, dir_entry))
        {
            /* check if we have found the next hierarchy */
            if((strlen(dir_entry->long_name) != length_to_sep ||
                strncmp(path, dir_entry->long_name, length_to_sep) != 0))
                continue;

            fat16_close_dir(dd);
            dd = 0;

            if(path[length_to_sep] == '\0')
                /* we iterated through the whole path and have found the file */
                return 1;

            if(dir_entry->attributes & FAT16_ATTRIB_DIR)
            {
                /* we found a parent directory of the file we are searching for */
                path = sep_pos + 1;
                break;
            }

            /* a parent of the file exists, but not the file itself */
            return 0;
        }

        fat16_close_dir(dd);
    }
    
    return 0;
}

/**
 * \ingroup fat16_fs
 * Retrieves the next following cluster of a given cluster.
 *
 * Using the filesystem file allocation table, this function returns
 * the number of the cluster containing the data directly following
 * the data within the cluster with the given number.
 *
 * \param[in] fs The filesystem for which to determine the next cluster.
 * \param[in] cluster_num The number of the cluster for which to determine its successor.
 * \returns The wanted cluster number, or 0 on error.
 */
u16 fat16_get_next_cluster(const struct fat16_fs_struct* fs, u16 cluster_num)
{
    if(!fs || cluster_num < 2)
        return 0;

    /* read appropriate fat entry */
    u8 fat_entry[2];
    if(!fs->partition->device_read(fs->header.fat_offset + 2 * cluster_num, fat_entry, 2))
        return 0;

    /* determine next cluster from fat */
    cluster_num = ((u16) fat_entry[0]) |
                  ((u16) fat_entry[1] << 8);
    
    if(cluster_num == FAT16_CLUSTER_FREE ||
       cluster_num == FAT16_CLUSTER_BAD ||
       (cluster_num >= FAT16_CLUSTER_RESERVED_MIN && cluster_num <= FAT16_CLUSTER_RESERVED_MAX) ||
       (cluster_num >= FAT16_CLUSTER_LAST_MIN && cluster_num <= FAT16_CLUSTER_LAST_MAX))
        return 0;
    
    return cluster_num;
}

/**
 * \ingroup fat16_fs
 * Appends a new cluster chain to an existing one.
 *
 * Set cluster_num to zero to create a completely new one.
 *
 * \param[in] fs The file system on which to operate.
 * \param[in] cluster_num The cluster to which to append the new chain.
 * \param[in] count The number of clusters to allocate.
 * \returns 0 on failure, the number of the first new cluster on success.
 */
u16 fat16_append_clusters(const struct fat16_fs_struct* fs, u16 cluster_num, u16 count)
{
#if FAT16_WRITE_SUPPORT
    if(!fs)
        return 0;

    device_read_t device_read = fs->partition->device_read;
    device_write_t device_write = fs->partition->device_write;
    u32 fat_offset = fs->header.fat_offset;
    u16 cluster_max = fs->header.fat_size / 2;
    u16 cluster_next = 0;
    u16 count_left = count;
    u8 buffer[2];

    for(u16 cluster_new = 0; cluster_new < cluster_max; ++cluster_new)
    {
        if(!device_read(fat_offset + 2 * cluster_new, buffer, sizeof(buffer)))
            return 0;

        /* check if this is a free cluster */
        if(buffer[0] == (FAT16_CLUSTER_FREE & 0xff) &&
           buffer[1] == ((FAT16_CLUSTER_FREE >> 8) & 0xff))
        {
            /* allocate cluster */
            if(count_left == count)
            {
                buffer[0] = FAT16_CLUSTER_LAST_MAX & 0xff;
                buffer[1] = (FAT16_CLUSTER_LAST_MAX >> 8) & 0xff;
            }
            else
            {
                buffer[0] = cluster_next & 0xff;
                buffer[1] = (cluster_next >> 8) & 0xff;
            }

            if(!device_write(fat_offset + 2 * cluster_new, buffer, sizeof(buffer)))
                break;

            cluster_next = cluster_new;
            if(--count_left == 0)
                break;
        }
    }

    do
    {
        if(count_left > 0)
            break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆精品国产91久久久久久| 666欧美在线视频| 欧美人体做爰大胆视频| 久久久亚洲午夜电影| 一区二区三区国产精华| 国产高清在线精品| 欧美丰满一区二区免费视频| 国产精品剧情在线亚洲| 精品亚洲porn| 6080国产精品一区二区| 亚洲制服丝袜av| 91麻豆成人久久精品二区三区| 精品入口麻豆88视频| 亚洲国产成人porn| 91视视频在线观看入口直接观看www| 精品国产91乱码一区二区三区 | 久久精品国产亚洲高清剧情介绍 | 亚洲精品精品亚洲| 国产成人精品影院| 久久只精品国产| 蜜桃视频一区二区| 日韩欧美国产wwwww| 蜜臀99久久精品久久久久久软件| 在线观看一区二区视频| 亚洲免费在线电影| 日本久久电影网| 一区二区三区在线免费视频| 91免费版在线看| 综合网在线视频| 一本大道久久a久久综合| 亚洲品质自拍视频| 色999日韩国产欧美一区二区| 亚洲人精品一区| 色伊人久久综合中文字幕| 一区二区在线电影| 欧美天堂一区二区三区| 天天操天天综合网| 欧美成人r级一区二区三区| 久久精品国产99久久6| 久久综合成人精品亚洲另类欧美 | 国产精品电影一区二区三区| 99这里只有精品| 亚洲激情自拍视频| 在线不卡的av| 狠狠色丁香久久婷婷综| 国产精品色婷婷| 一本色道亚洲精品aⅴ| 天天综合网 天天综合色| 日韩欧美你懂的| 成人免费毛片片v| 亚洲天堂av老司机| 欧美精品一卡二卡| 国产成人a级片| 亚洲一区二区三区四区中文字幕| 91麻豆精品国产自产在线 | 久久精品二区亚洲w码| 久久影视一区二区| 99精品久久免费看蜜臀剧情介绍| 亚洲综合另类小说| 亚洲精品在线电影| 91蝌蚪porny成人天涯| 午夜欧美在线一二页| 国产日韩精品一区二区三区 | 成人av资源站| 午夜精品成人在线| 国产欧美1区2区3区| 欧美老肥妇做.爰bbww| 国产大陆a不卡| 亚洲二区在线观看| 欧美激情一区二区三区在线| 欧美日免费三级在线| 国产精品99久久久久久有的能看| 亚洲曰韩产成在线| 欧美激情中文字幕一区二区| 91精品婷婷国产综合久久性色| 成人性色生活片| 青青草国产成人99久久| 最近日韩中文字幕| 久久久久久久精| 欧美一区二区三区免费视频 | 91精品国产综合久久久久| 国产成人在线视频网站| 日韩电影一二三区| 亚洲免费色视频| 国产精品动漫网站| 久久久精品免费免费| 制服.丝袜.亚洲.中文.综合| 一本一道久久a久久精品综合蜜臀| 精东粉嫩av免费一区二区三区| 视频一区国产视频| 一区二区三区四区av| 欧美极品美女视频| 国产亚洲午夜高清国产拍精品| 5566中文字幕一区二区电影| 日本韩国欧美国产| 色婷婷综合久久久中文字幕| 国产成人精品一区二| 国产一区 二区 三区一级| 久久精品国产77777蜜臀| 日av在线不卡| 日日摸夜夜添夜夜添国产精品 | 久久精品免费看| 亚洲成人免费影院| 亚洲综合免费观看高清完整版在线 | 中文字幕在线不卡视频| 欧美国产综合色视频| 日本一区二区三区久久久久久久久不 | 国产日产亚洲精品系列| 久久久精品tv| 久久亚洲精华国产精华液| 日韩欧美的一区| 久久亚洲精品小早川怜子| 久久久久久久久久久久久久久99| 国产三级欧美三级日产三级99| 久久久久高清精品| 国产精品精品国产色婷婷| 一区视频在线播放| 一区二区三区欧美视频| 亚洲第一综合色| 热久久久久久久| 韩国毛片一区二区三区| 国产一区二区看久久| 成人国产精品免费网站| 色老头久久综合| 欧美三级在线播放| 日韩免费高清av| 国产午夜精品一区二区| 亚洲欧美偷拍卡通变态| 亚洲国产精品影院| 蜜臀av性久久久久蜜臀aⅴ流畅 | 欧美午夜寂寞影院| 91精品国产色综合久久不卡电影| 欧美一区二视频| 久久久久久麻豆| 伊人夜夜躁av伊人久久| 视频一区欧美日韩| 豆国产96在线|亚洲| 在线看一区二区| 日韩一区二区在线看| 欧美激情综合五月色丁香小说| 亚洲天堂久久久久久久| 人人爽香蕉精品| 99久久综合色| 欧美一区二区三区四区视频| 国产欧美一区二区三区在线看蜜臀 | 欧美三级三级三级| 久久综合九色综合欧美就去吻 | 最新日韩av在线| 日本一不卡视频| 国产超碰在线一区| 欧美日韩在线电影| 亚洲国产成人午夜在线一区| 亚洲一区二区三区四区在线免费观看| 青娱乐精品在线视频| 91在线观看下载| 日韩免费观看高清完整版| 亚洲精品视频自拍| 精久久久久久久久久久| 欧美日韩一区不卡| 国产精品美女久久久久久久久久久| 亚洲国产婷婷综合在线精品| 国产成人亚洲综合a∨婷婷| 欧美男男青年gay1069videost| 国产三区在线成人av| 蜜桃视频一区二区三区在线观看 | 亚洲图片一区二区| 丰满亚洲少妇av| 欧美变态凌虐bdsm| 天天爽夜夜爽夜夜爽精品视频| 99免费精品在线| 国产欧美一区二区三区在线老狼| 日本aⅴ亚洲精品中文乱码| 91久久精品一区二区三区| 国产精品麻豆欧美日韩ww| 激情五月婷婷综合网| 欧美一卡二卡三卡| 亚洲国产精品久久久久秋霞影院 | 日韩不卡一区二区三区| 91久久精品一区二区| 国产精品午夜在线观看| 国产精品综合一区二区三区| 91精品福利在线一区二区三区| 亚洲综合精品自拍| 色婷婷国产精品综合在线观看| 中文字幕一区二区三区在线不卡 | 国产精品美女久久久久久| 国产一区二区三区在线看麻豆| 日韩欧美电影一区| 久久国产麻豆精品| 日韩视频免费观看高清完整版在线观看 | 亚洲日本一区二区| 91视频在线观看| 一区二区三区久久久| 欧日韩精品视频| 一卡二卡欧美日韩| 在线观看91精品国产入口| 亚洲精品乱码久久久久久日本蜜臀| 91在线精品一区二区| 一区二区三区 在线观看视频| 91成人免费电影|