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

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

?? fat16.c

?? 基于STM32的 模擬時序
?? C
?? 第 1 頁 / 共 5 頁
字號:
            first_cluster_offset = 0;
        }

        fd->pos_cluster = cluster_num;

    } while(buffer_left > 0); /* check if we are done */

    /* update directory entry */
    if(fd->pos > fd->dir_entry.file_size)
    {
        u32 size_old = fd->dir_entry.file_size;

        /* update file size */
        fd->dir_entry.file_size = fd->pos;
        /* write directory entry */
        if(!fat16_write_dir_entry(fd->fs, &fd->dir_entry))
        {
            /* We do not return an error here since we actually wrote
             * some data to disk. So we calculate the amount of data
             * we wrote to disk and which lies within the old file size.
             */
            buffer_left = fd->pos - size_old;
            fd->pos = size_old;
        }
    }

    return buffer_len - buffer_left;

#else
    return -1;
#endif
}

/**
 * \ingroup fat16_file
 * Repositions the read/write file offset.
 *
 * Changes the file offset where the next call to fat16_read_file()
 * or fat16_write_file() starts reading/writing.
 *
 * If the new offset is beyond the end of the file, fat16_resize_file()
 * is implicitly called, i.e. the file is expanded.
 *
 * The new offset can be given in different ways determined by
 * the \c whence parameter:
 * - \b FAT16_SEEK_SET: \c *offset is relative to the beginning of the file.
 * - \b FAT16_SEEK_CUR: \c *offset is relative to the current file position.
 * - \b FAT16_SEEK_END: \c *offset is relative to the end of the file.
 *
 * The resulting absolute offset is written to the location the \c offset
 * parameter points to.
 * 
 * \param[in] fd The file decriptor of the file on which to seek.
 * \param[in,out] offset A pointer to the new offset, as affected by the \c whence
 *                   parameter. The function writes the new absolute offset
 *                   to this location before it returns.
 * \param[in] whence Affects the way \c offset is interpreted, see above.
 * \returns 0 on failure, 1 on success.
 */
u8 fat16_seek_file(struct fat16_file_struct* fd, s32* offset, u8 whence)
{
    if(!fd || !offset)
        return 0;

    u32 new_pos = fd->pos;
    switch(whence)
    {
        case FAT16_SEEK_SET:
            new_pos = *offset;
            break;
        case FAT16_SEEK_CUR:
            new_pos += *offset;
            break;
        case FAT16_SEEK_END:
            new_pos = fd->dir_entry.file_size + *offset;
            break;
        default:
            return 0;
    }

    if(new_pos > fd->dir_entry.file_size && !fat16_resize_file(fd, new_pos))
        return 0;

    fd->pos = new_pos;
    fd->pos_cluster = 0;

    *offset = new_pos;
    return 1;
}

/**
 * \ingroup fat16_file
 * Resizes a file to have a specific size.
 *
 * Enlarges or shrinks the file pointed to by the file descriptor to have
 * exactly the specified size.
 *
 * If the file is truncated, all bytes having an equal or larger offset
 * than the given size are lost. If the file is expanded, the additional
 * bytes are allocated.
 *
 * \note Please be aware that this function just allocates or deallocates disk
 * space, it does not explicitely clear it. To avoid data leakage, this
 * must be done manually.
 *
 * \param[in] fd The file decriptor of the file which to resize.
 * \param[in] size The new size of the file.
 * \returns 0 on failure, 1 on success.
 */
u8 fat16_resize_file(struct fat16_file_struct* fd, u32 size)
{
#if FAT16_WRITE_SUPPORT
    if(!fd)
        return 0;

    u16 cluster_num = fd->dir_entry.cluster;
    u16 cluster_size = fd->fs->header.cluster_size;
    u32 size_new = size;

    do
    {
        if(cluster_num == 0 && size_new == 0)
            /* the file stays empty */
            break;

        /* seek to the next cluster as long as we need the space */
        while(size_new > cluster_size)
        {
            /* get next cluster of file */
            u16 cluster_num_next = fat16_get_next_cluster(fd->fs, cluster_num);
            if(cluster_num_next)
            {
                cluster_num = cluster_num_next;
                size_new -= cluster_size;
            }
            else
            {
                break;
            }
        }

        if(size_new > cluster_size || cluster_num == 0)
        {
            /* Allocate new cluster chain and append
             * it to the existing one, if available.
             */
            u16 cluster_count = size_new / cluster_size;
            if((u32) cluster_count * cluster_size < size_new)
                ++cluster_count;
            u16 cluster_new_chain = fat16_append_clusters(fd->fs, cluster_num, cluster_count);
            if(!cluster_new_chain)
                return 0;

            if(!cluster_num)
            {
                cluster_num = cluster_new_chain;
                fd->dir_entry.cluster = cluster_num;
            }
        }

        /* write new directory entry */
        fd->dir_entry.file_size = size;
        if(size == 0)
            fd->dir_entry.cluster = 0;
        if(!fat16_write_dir_entry(fd->fs, &fd->dir_entry))
            return 0;

        if(size == 0)
        {
            /* free all clusters of file */
            fat16_free_clusters(fd->fs, cluster_num);
        }
        else if(size_new <= cluster_size)
        {
            /* free all clusters no longer needed */
            fat16_terminate_clusters(fd->fs, cluster_num);
        }

    } while(0);

    /* correct file position */
    if(size < fd->pos)
    {
        fd->pos = size;
        fd->pos_cluster = 0;
    }

    return 1;
#else
    return 0;
#endif
}

/**
 * \ingroup fat16_dir
 * Opens a directory.
 *
 * \param[in] fs The filesystem on which the directory to open resides.
 * \param[in] dir_entry The directory entry which stands for the directory to open.
 * \returns An opaque directory descriptor on success, 0 on failure.
 * \see fat16_close_dir
 */
struct fat16_dir_struct* fat16_open_dir(struct fat16_fs_struct* fs, const struct fat16_dir_entry_struct* dir_entry)
{
    if(!fs || !dir_entry || !(dir_entry->attributes & FAT16_ATTRIB_DIR))
        return 0;

#if USE_DYNAMIC_MEMORY
    struct fat16_dir_struct* dd = malloc(sizeof(*dd));
    if(!dd)
        return 0;
#else
    struct fat16_dir_struct* dd = fat16_dir_handlers;
    u8 i;
    for(i = 0; i < FAT16_DIR_COUNT; ++i)
    {
        if(!dd->fs)
            break;

        ++dd;
    }
    if(i >= FAT16_DIR_COUNT)
        return 0;
#endif
    
    memcpy(&dd->dir_entry, dir_entry, sizeof(*dir_entry));
    dd->fs = fs;
    dd->entry_next = 0;

    return dd;
}

/**
 * \ingroup fat16_dir
 * Closes a directory descriptor.
 *
 * This function destroys a directory descriptor which was
 * previously obtained by calling fat16_open_dir(). When this
 * function returns, the given descriptor will be invalid.
 *
 * \param[in] dd The directory descriptor to close.
 * \see fat16_open_dir
 */
void fat16_close_dir(struct fat16_dir_struct* dd)
{
    if(dd)
#if USE_DYNAMIC_MEMORY
        free(dd);
#else
        dd->fs = 0;
#endif
}

/**
 * \ingroup fat16_dir
 * Reads the next directory entry contained within a parent directory.
 *
 * \param[in] dd The descriptor of the parent directory from which to read the entry.
 * \param[out] dir_entry Pointer to a buffer into which to write the directory entry information.
 * \returns 0 on failure, 1 on success.
 * \see fat16_reset_dir
 */
u8 fat16_read_dir(struct fat16_dir_struct* dd, struct fat16_dir_entry_struct* dir_entry)
{
    if(!dd || !dir_entry)
        return 0;

    if(dd->dir_entry.cluster == 0)
    {
        /* read entry from root directory */
        if(fat16_read_root_dir_entry(dd->fs, dd->entry_next, dir_entry))
        {
            ++dd->entry_next;
            return 1;
        }
    }
    else
    { 
        /* read entry from a subdirectory */
        if(fat16_read_sub_dir_entry(dd->fs, dd->entry_next, &dd->dir_entry, dir_entry))
        {
            ++dd->entry_next;
            return 1;
        }
    }

    /* restart reading */
    dd->entry_next = 0;

    return 0;
}

/**
 * \ingroup fat16_dir
 * Resets a directory handle.
 *
 * Resets the directory handle such that reading restarts
 * with the first directory entry.
 *
 * \param[in] dd The directory handle to reset.
 * \returns 0 on failure, 1 on success.
 * \see fat16_read_dir
 */
u8 fat16_reset_dir(struct fat16_dir_struct* dd)
{
    if(!dd)
        return 0;

    dd->entry_next = 0;
    return 1;
}

/**
 * \ingroup fat16_fs
 * Searches for space where to store a directory entry.
 *
 * \param[in] fs The filesystem on which to operate.
 * \param[in] dir_entry The directory entry for which to search space.
 * \returns 0 on failure, a device offset on success.
 */
u32 fat16_find_offset_for_dir_entry(const struct fat16_fs_struct* fs, const struct fat16_dir_struct* parent, const struct fat16_dir_entry_struct* dir_entry)
{
#if FAT16_WRITE_SUPPORT
    if(!fs || !dir_entry)
        return 0;

    /* search for a place where to write the directory entry to disk */
    u8 free_dir_entries_needed = (strlen(dir_entry->long_name) + 12) / 13 + 1;
    u8 free_dir_entries_found = 0;
    u16 cluster_num = parent->dir_entry.cluster;
    u32 dir_entry_offset = 0;
    u32 offset = 0;
    u32 offset_to = 0;

    if(cluster_num == 0)
    {
        /* we read/write from the root directory entry */
        offset = fs->header.root_dir_offset;
        offset_to = fs->header.cluster_zero_offset;
        dir_entry_offset = offset;
    }
    
    while(1)
    {
        if(offset == offset_to)
        {
            if(cluster_num == 0)
                /* We iterated through the whole root directory entry
                 * and could not find enough space for the directory entry.
                 */
                return 0;

            if(offset)
            {
                /* We reached a cluster boundary and have to
                 * switch to the next cluster.
                 */

                u16 cluster_next = fat16_get_next_cluster(fs, cluster_num);
                if(!cluster_next)
                {
                    cluster_next = fat16_append_clusters(fs, cluster_num, 1);
                    if(!cluster_next)
                        return 0;

                    /* we appended a new cluster and know it is free */
                    dir_entry_offset = fs->header.cluster_zero_offset +
                                       (u32) (cluster_next - 2) * fs->header.cluster_size;

                    /* clear cluster to avoid garbage directory entries */
                    fat16_clear_cluster(fs, cluster_next);

                    break;
                }
                cluster_num = cluster_next;
            }

            offset = fs->header.cluster_zero_offset +
                     (u32) (cluster_num - 2) * fs->header.cluster_size;
            offset_to = offset + fs->header.cluster_size;
            dir_entry_offset = offset;
            free_dir_entries_found = 0;
        }
        
        /* read next lfn or 8.3 entry */
        u8 first_char;
        if(!fs->partition->device_read(offset, &first_char, sizeof(first_char)))
            return 0;

        /* check if we found a free directory entry */
        if(first_char == FAT16_DIRENTRY_DELETED || !first_char)
        {
            /* check if we have the needed number of available entries */
            ++free_dir_entries_found;
            if(free_dir_entries_found >= free_dir_entries_needed)
                break;

            offset += 32;
        }
        else
        {
            offset += 32;
            dir_entry_offset = offset;
            free_dir_entries_found = 0;
        }
    }

    return dir_entry_offset;

#else
    return 0;
#endif
}

/**
 * \ingroup fat16_fs
 * Writes a directory entry to disk.
 *
 * \note The file name is not checked for invalid characters.
 *
 * \note The generation of the short 8.3 file name is quite

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
综合在线观看色| 日本欧美肥老太交大片| 中文字幕在线免费不卡| 亚洲天堂免费看| 午夜精品成人在线视频| 国产乱码精品一区二区三区五月婷| 成人做爰69片免费看网站| 激情伊人五月天久久综合| 欧美在线999| 久久久综合激的五月天| 亚洲乱码中文字幕| 成人一道本在线| 69av一区二区三区| 亚洲男人的天堂av| 成人深夜视频在线观看| 日韩一区二区视频在线观看| 久久精品视频在线看| 免费成人av在线| 在线精品视频免费观看| 欧美电影免费观看高清完整版在线 | 香蕉av福利精品导航| 国产电影一区二区三区| 成人影视亚洲图片在线| 久久看人人爽人人| 免费精品视频最新在线| 欧美日韩国产欧美日美国产精品| 中文字幕欧美日韩一区| 精品一区二区三区的国产在线播放| 日本国产一区二区| 最新国产精品久久精品| 国产白丝网站精品污在线入口| 精品欧美一区二区在线观看| 亚洲一区二区三区在线| 一道本成人在线| 亚洲精品视频在线观看免费| 高清不卡一二三区| 久久精品亚洲国产奇米99| 国产精品系列在线播放| 精品免费国产二区三区| 亚洲一区免费视频| 欧美区视频在线观看| 亚洲国产毛片aaaaa无费看 | 欧美区一区二区三区| 亚洲风情在线资源站| 欧美日韩一区二区欧美激情| 一区二区三区四区在线免费观看| 欧美性色综合网| 午夜视频在线观看一区二区| 欧美精品在线观看播放| 麻豆国产一区二区| 精品国产a毛片| 久久精品国产精品青草| 国产女主播一区| 成人精品免费网站| 亚洲国产精品欧美一二99| 在线播放视频一区| 免费在线观看精品| 国产精品国产三级国产普通话蜜臀 | 久久国产精品99久久久久久老狼 | 91久久线看在观草草青青| 亚洲综合一区二区| 911精品国产一区二区在线| 天天色综合天天| 欧美韩国一区二区| 日本福利一区二区| 亚洲电影中文字幕在线观看| 久久综合久久综合亚洲| 国产精品亚洲视频| 亚洲欧美偷拍卡通变态| 91精品久久久久久久99蜜桃| 国内精品伊人久久久久av影院| 专区另类欧美日韩| 日韩丝袜美女视频| 久久99国内精品| 亚洲成人精品影院| 久久久久国产免费免费 | 一区二区三区四区不卡在线| 91网站最新地址| 亚洲免费视频成人| 日韩一二三区视频| 色综合天天综合在线视频| 精品亚洲porn| 一区二区三区在线免费观看| 日韩美女一区二区三区| 欧美色偷偷大香| 国产美女在线精品| 亚洲日本丝袜连裤袜办公室| 日韩精品一区二区三区视频在线观看 | 粉嫩av一区二区三区粉嫩| 亚洲美女区一区| 久久免费午夜影院| 欧美一区二区精品| 99精品欧美一区| 久久国产精品99久久久久久老狼| 亚洲国产一区视频| 国产精品每日更新| 久久日一线二线三线suv| 色美美综合视频| 国产99久久久国产精品免费看| 麻豆精品一区二区三区| 国产精品久久国产精麻豆99网站| 91精品国产91久久久久久一区二区| 99精品一区二区三区| 精品一区二区三区免费视频| 亚洲色图在线播放| 亚洲欧美乱综合| 日本一区二区三区四区 | 免费看欧美女人艹b| 日韩一区二区高清| 欧美日韩一级片网站| 成人免费看片app下载| 精久久久久久久久久久| 日本亚洲视频在线| 日韩高清欧美激情| 亚洲成人一区二区| 亚洲黄色小说网站| 亚洲精品高清在线| 一区视频在线播放| 亚洲另类色综合网站| 国产精品欧美一区喷水| 中文字幕日韩精品一区 | 在线不卡免费av| 欧美一级精品大片| 日韩欧美在线1卡| 久久综合视频网| 欧美国产在线观看| 国产精品美女视频| ...av二区三区久久精品| 国产精品免费观看视频| 欧美激情一区二区在线| 亚洲乱码中文字幕综合| 一区二区免费视频| 亚洲午夜精品在线| 久久精品国产精品亚洲综合| 精品无人区卡一卡二卡三乱码免费卡| 有码一区二区三区| 亚洲国产一二三| 亚洲人成精品久久久久| 亚洲香肠在线观看| 日韩国产成人精品| 国产美女视频一区| 国产麻豆91精品| 成av人片一区二区| 欧美日韩不卡一区| 亚洲精品一区二区三区影院 | 色哟哟在线观看一区二区三区| 色哟哟亚洲精品| 欧美一区二区三区视频在线观看| 欧美一区中文字幕| 精品国一区二区三区| 亚洲视频免费观看| 丝袜美腿高跟呻吟高潮一区| 精品一区二区三区在线播放视频| 国产精品性做久久久久久| 成人免费高清在线| 337p亚洲精品色噜噜噜| 久久美女高清视频| 亚洲mv大片欧洲mv大片精品| 美国十次综合导航| 麻豆国产欧美日韩综合精品二区 | 日韩一级片在线播放| 欧美久久久久久蜜桃| 精品久久久久久久久久久久久久久| 久久精品一区四区| 亚洲成人自拍网| 91视频你懂的| 欧美一区二区三区系列电影| 亚洲色图一区二区| 国产在线精品一区二区夜色 | 欧美成人精品二区三区99精品| 久久精品一级爱片| 无码av中文一区二区三区桃花岛| 国产乱妇无码大片在线观看| 精品制服美女久久| 91麻豆精品国产综合久久久久久| www久久精品| 久久精品国产精品亚洲综合| 91在线观看免费视频| 日本一区二区三区四区| 婷婷开心久久网| 成人永久免费视频| 久久久亚洲综合| 日韩经典中文字幕一区| 在线观看av不卡| 久久这里都是精品| 精品中文字幕一区二区| 欧美体内she精高潮| 精品国产免费人成在线观看| 日本不卡123| 欧美性极品少妇| 亚洲最色的网站| 成人福利视频网站| 久久精品视频一区二区| 日本伊人午夜精品| www.欧美日韩国产在线| 久久久久久99精品| 蜜臀av一区二区在线观看| 欧美一级日韩不卡播放免费| 亚洲一区在线观看免费| 在线观看亚洲成人|