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

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

?? fat16.c

?? 基于STM32的 模擬時序
?? C
?? 第 1 頁 / 共 5 頁
字號:
 * simple. The first eight characters are used for the filename.
 * The extension, if any, is made up of the first three characters
 * following the last dot within the long filename. If the
 * filename (without the extension) is longer than eight characters,
 * the lower byte of the cluster number replaces the last two
 * characters to avoid name clashes. In any other case, it is your
 * responsibility to avoid name clashes.
 *
 * \param[in] fs The filesystem on which to operate.
 * \param[in] dir_entry The directory entry to write.
 * \returns 0 on failure, 1 on success.
 */
u8 fat16_write_dir_entry(const struct fat16_fs_struct* fs, struct fat16_dir_entry_struct* dir_entry)
{
#if FAT16_WRITE_SUPPORT
    if(!fs || !dir_entry)
        return 0;
    
#if FAT16_DATETIME_SUPPORT
    {
        u16 year;
        u8 month;
        u8 day;
        u8 hour;
        u8 min;
        u8 sec;

        fat16_get_datetime(&year, &month, &day, &hour, &min, &sec);
        fat16_set_file_modification_date(dir_entry, year, month, day);
        fat16_set_file_modification_time(dir_entry, hour, min, sec);
    }
#endif

    device_write_t device_write = fs->partition->device_write;
    u32 offset = dir_entry->entry_offset;
    const char* name = dir_entry->long_name;
    u8 name_len = strlen(name);
    u8 lfn_entry_count = (name_len + 12) / 13;
    u8 buffer[32];

    /* write 8.3 entry */

    /* generate 8.3 file name */
    memset(&buffer[0], ' ', 11);
    char* name_ext = strrchr(name, '.');
    if(name_ext && *++name_ext)
    {
        u8 name_ext_len = strlen(name_ext);
        name_len -= name_ext_len + 1;

        if(name_ext_len > 3)
            name_ext_len = 3;
        
        memcpy(&buffer[8], name_ext, name_ext_len);
    }
    
    if(name_len <= 8)
    {
        memcpy(buffer, name, name_len);

        /* For now, we create lfn entries for all files,
         * except the "." and ".." directory references.
         * This is to avoid difficulties with capitalization,
         * as 8.3 filenames allow uppercase letters only.
         *
         * Theoretically it would be possible to leave
         * the 8.3 entry alone if the basename and the
         * extension have no mixed capitalization.
         */
        if(name[0] == '.' &&
           ((name[1] == '.' && name[2] == '\0') ||
            name[1] == '\0')
          )
            lfn_entry_count = 0;
    }
    else
    {
        memcpy(buffer, name, 8);

        /* Minimize 8.3 name clashes by appending
         * the lower byte of the cluster number.
         */
        u8 num = dir_entry->cluster & 0xff;

        buffer[6] = (num < 0xa0) ? ('0' + (num >> 4)) : ('a' + (num >> 4));
        num &= 0x0f;
        buffer[7] = (num < 0x0a) ? ('0' + num) : ('a' + num);
    }
    if(buffer[0] == FAT16_DIRENTRY_DELETED)
        buffer[0] = 0x05;

    /* fill directory entry buffer */
    memset(&buffer[11], 0, sizeof(buffer) - 11);
    buffer[0x0b] = dir_entry->attributes;
#if FAT16_DATETIME_SUPPORT
    buffer[0x16] = (dir_entry->modification_time >> 0) & 0xff;
    buffer[0x17] = (dir_entry->modification_time >> 8) & 0xff;
    buffer[0x18] = (dir_entry->modification_date >> 0) & 0xff;
    buffer[0x19] = (dir_entry->modification_date >> 8) & 0xff;
#endif
    buffer[0x1a] = (dir_entry->cluster >> 0) & 0xff;
    buffer[0x1b] = (dir_entry->cluster >> 8) & 0xff;
    buffer[0x1c] = (dir_entry->file_size >> 0) & 0xff;
    buffer[0x1d] = (dir_entry->file_size >> 8) & 0xff;
    buffer[0x1e] = (dir_entry->file_size >> 16) & 0xff;
    buffer[0x1f] = (dir_entry->file_size >> 24) & 0xff;

    /* write to disk */
    if(!device_write(offset + (u32) lfn_entry_count * 32, buffer, sizeof(buffer)))
        return 0;
    
    /* calculate checksum of 8.3 name */
    u8 checksum = buffer[0];
    for(u8 i = 1; i < 11; ++i)
        checksum = ((checksum >> 1) | (checksum << 7)) + buffer[i];
    
    /* write lfn entries */
    for(u8 lfn_entry = lfn_entry_count; lfn_entry > 0; --lfn_entry)
    {
        memset(buffer, 0xff, sizeof(buffer));
        
        /* set file name */
        const char* long_name_curr = name + (lfn_entry - 1) * 13;
        u8 i = 1;
        while(i < 0x1f)
        {
            buffer[i++] = *long_name_curr;
            buffer[i++] = 0;

            switch(i)
            {
                case 0x0b:
                    i = 0x0e;
                    break;
                case 0x1a:
                    i = 0x1c;
                    break;
            }

            if(!*long_name_curr++)
                break;
        }
        
        /* set index of lfn entry */
        buffer[0x00] = lfn_entry;
        if(lfn_entry == lfn_entry_count)
            buffer[0x00] |= FAT16_DIRENTRY_LFNLAST;

        /* mark as lfn entry */
        buffer[0x0b] = 0x0f;

        /* set 8.3 checksum */
        buffer[0x0d] = checksum;

        /* clear reserved bytes */
        buffer[0x0c] = 0;
        buffer[0x1a] = 0;
        buffer[0x1b] = 0;

        /* write entry */
        device_write(offset, buffer, sizeof(buffer));
    
        offset += sizeof(buffer);
    }
    
    return 1;

#else
    return 0;
#endif
}

/**
 * \ingroup fat16_file
 * Creates a file.
 *
 * Creates a file and obtains the directory entry of the
 * new file. If the file to create already exists, the
 * directory entry of the existing file will be returned
 * within the dir_entry parameter.
 *
 * \note The file name is not checked for invalid characters.
 *
 * \note The generation of the short 8.3 file name is quite
 * simple. The first eight characters are used for the filename.
 * The extension, if any, is made up of the first three characters
 * following the last dot within the long filename. If the
 * filename (without the extension) is longer than eight characters,
 * the lower byte of the cluster number replaces the last two
 * characters to avoid name clashes. In any other case, it is your
 * responsibility to avoid name clashes.
 *
 * \param[in] parent The handle of the directory in which to create the file.
 * \param[in] file The name of the file to create.
 * \param[out] dir_entry The directory entry to fill for the new file.
 * \returns 0 on failure, 1 on success.
 * \see fat16_delete_file
 */
u8 fat16_create_file(struct fat16_dir_struct* parent, const char* file, struct fat16_dir_entry_struct* dir_entry)
{
#if FAT16_WRITE_SUPPORT
    if(!parent || !file || !file[0] || !dir_entry)
        return 0;

    /* check if the file already exists */
    while(1)
    {
        if(!fat16_read_dir(parent, dir_entry))
            break;

        if(strcmp(file, dir_entry->long_name) == 0)
        {
            fat16_reset_dir(parent);
            return 0;
        }
    }

    struct fat16_fs_struct* fs = parent->fs;

    /* prepare directory entry with values already known */
    memset(dir_entry, 0, sizeof(*dir_entry));
    strncpy(dir_entry->long_name, file, sizeof(dir_entry->long_name) - 1);

    /* find place where to store directory entry */
    if(!(dir_entry->entry_offset = fat16_find_offset_for_dir_entry(fs, parent, dir_entry)))
        return 0;
    
    /* write directory entry to disk */
    if(!fat16_write_dir_entry(fs, dir_entry))
        return 0;
    
    return 1;
    
#else
    return 0;
#endif
}

/**
 * \ingroup fat16_file
 * Deletes a file or directory.
 *
 * If a directory is deleted without first deleting its
 * subdirectories and files, disk space occupied by these
 * files will get wasted as there is no chance to release
 * it and mark it as free.
 * 
 * \param[in] fs The filesystem on which to operate.
 * \param[in] dir_entry The directory entry of the file to delete.
 * \returns 0 on failure, 1 on success.
 * \see fat16_create_file
 */
u8 fat16_delete_file(struct fat16_fs_struct* fs, struct fat16_dir_entry_struct* dir_entry)
{
#if FAT16_WRITE_SUPPORT
    if(!fs || !dir_entry)
        return 0;

    /* get offset of the file's directory entry */
    u32 dir_entry_offset = dir_entry->entry_offset;
    if(!dir_entry_offset)
        return 0;

    u8 buffer[12];
    while(1)
    {
        /* read directory entry */
        if(!fs->partition->device_read(dir_entry_offset, buffer, sizeof(buffer)))
            return 0;
        
        /* mark the directory entry as deleted */
        buffer[0] = FAT16_DIRENTRY_DELETED;
        
        /* write back entry */
        if(!fs->partition->device_write(dir_entry_offset, buffer, sizeof(buffer)))
            return 0;

        /* check if we deleted the whole entry */
        if(buffer[11] != 0x0f)
            break;

        dir_entry_offset += 32;
    }

    /* We deleted the directory entry. The next thing to do is
     * marking all occupied clusters as free.
     */
    return (dir_entry->cluster == 0 || fat16_free_clusters(fs, dir_entry->cluster));
#else
    return 0;
#endif
}

/**
 * \ingroup fat16_dir
 * Creates a directory.
 *
 * Creates a directory and obtains its directory entry.
 * If the directory to create already exists, its
 * directory entry will be returned within the dir_entry
 * parameter.
 *
 * \note The notes which apply to fat16_create_file also
 * apply to this function.
 *
 * \param[in] parent The handle of the parent directory of the new directory.
 * \param[in] dir The name of the directory to create.
 * \param[out] dir_entry The directory entry to fill for the new directory.
 * \returns 0 on failure, 1 on success.
 * \see fat16_delete_dir
 */
u8 fat16_create_dir(struct fat16_dir_struct* parent, const char* dir, struct fat16_dir_entry_struct* dir_entry)
{
#if FAT16_WRITE_SUPPORT
    if(!parent || !dir || !dir[0] || !dir_entry)
        return 0;

    /* check if the file or directory already exists */
    while(1)
    {
        if(!fat16_read_dir(parent, dir_entry))
            break;

        if(strcmp(dir, dir_entry->long_name) == 0)
        {
            fat16_reset_dir(parent);
            return 0;
        }
    }

    struct fat16_fs_struct* fs = parent->fs;

    /* allocate cluster which will hold directory entries */
    u16 dir_cluster = fat16_append_clusters(fs, 0, 1);
    if(!dir_cluster)
        return 0;

    /* clear cluster to prevent bogus directory entries */
    fat16_clear_cluster(fs, dir_cluster);
    
    memset(dir_entry, 0, sizeof(*dir_entry));
    dir_entry->attributes = FAT16_ATTRIB_DIR;

    /* create "." directory self reference */
    dir_entry->entry_offset = fs->header.cluster_zero_offset +
                              (u32) (dir_cluster - 2) * fs->header.cluster_size;
    dir_entry->long_name[0] = '.';
    dir_entry->cluster = dir_cluster;
    if(!fat16_write_dir_entry(fs, dir_entry))
    {
        fat16_free_clusters(fs, dir_cluster);
        return 0;
    }

    /* create ".." parent directory reference */
    dir_entry->entry_offset += 32;
    dir_entry->long_name[1] = '.';
    dir_entry->cluster = parent->dir_entry.cluster;
    if(!fat16_write_dir_entry(fs, dir_entry))
    {
        fat16_free_clusters(fs, dir_cluster);
        return 0;
    }

    /* fill directory entry */
    strncpy(dir_entry->long_name, dir, sizeof(dir_entry->long_name) - 1);
    dir_entry->cluster = dir_cluster;

    /* find place where to store directory entry */
    if(!(dir_entry->entry_offset = fat16_find_offset_for_dir_entry(fs, parent, dir_entry)))
    {
        fat16_free_clusters(fs, dir_cluster);
        return 0;
    }

    /* write directory to disk */
    if(!fat16_write_dir_entry(fs, dir_entry))
    {
        fat16_free_clusters(fs, dir_cluster);
        return 0;
    }

    return 1;
    
#else
    return 0;
#endif
}

/**
 * \ingroup fat16_dir
 * Deletes a directory.
 *
 * This is just a synonym for fat16_delete_file().
 * If a directory is deleted without first deleting its
 * subdirectories and files, disk space occupied by these
 * files will get wasted as there is no chance to release
 * it and mark it as free.
 * 
 * \param[in] fs The filesystem on which to operate.
 * \param[in] dir_entry The directory entry of the directory to delete.
 * \returns 0 on failure, 1 on success.
 * \see fat16_create_dir
 */
#ifdef DOXYGEN
u8 fat16_delete_dir(struct fat16_fs_struct* fs, struct fat16_dir_entry_struct* dir_entry);
#endif

/**
 * \ingroup fat16_file
 * Returns the modification date of a file.
 *
 * \param[in] dir_entry The directory entry of which to return the modification date.
 * \param[out] year The year the file was last modified.
 * \param[out] month The month the file was last modified.
 * \param[out] day The day the file was last modified.
 */
void fat16_get_file_modification_date(const struct fat16_dir_entry_struct* dir_entry, u16* year, u8* month, u8* day)
{
#if FAT16_

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频一区二区三区在线观看| 丝袜美腿亚洲一区| 成人激情视频网站| 国产精品毛片久久久久久| 粉嫩av亚洲一区二区图片| 国产精品午夜免费| 国产高清一区日本| 一本一道综合狠狠老| 亚洲韩国一区二区三区| 欧美午夜精品理论片a级按摩| 亚洲五码中文字幕| 欧美一区二区三区在线| 麻豆freexxxx性91精品| 国产调教视频一区| 91社区在线播放| 青草国产精品久久久久久| 久久久久久亚洲综合| 99久久精品一区| 日日骚欧美日韩| 国产亚洲精品精华液| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲美女免费视频| 日韩丝袜情趣美女图片| 成人国产精品免费观看动漫| 亚洲一区二区精品视频| www成人在线观看| 欧美特级限制片免费在线观看| 九一久久久久久| 亚洲色图欧洲色图婷婷| 3751色影院一区二区三区| 成人91在线观看| 日本成人在线网站| 国产精品电影院| 日韩女优制服丝袜电影| 91美女蜜桃在线| 精品一区二区三区视频在线观看| 亚洲日本乱码在线观看| 久久毛片高清国产| 欧美色图在线观看| 成人免费看的视频| 久久超碰97中文字幕| 亚洲激情在线播放| 久久久亚洲精品一区二区三区| 在线观看免费一区| 成人三级伦理片| 精品在线免费视频| 一级做a爱片久久| 国产精品乱码一区二区三区软件 | 国产精品久久久久婷婷二区次| 欧美日本一区二区| 91在线观看视频| 风间由美一区二区三区在线观看| 免费不卡在线视频| 亚洲成a人v欧美综合天堂下载| 中文字幕在线不卡一区| 久久久久国产精品麻豆ai换脸| 91精品国产综合久久精品性色| 在线精品视频免费观看| 不卡视频一二三| 国产成人精品亚洲午夜麻豆| 免播放器亚洲一区| 人人超碰91尤物精品国产| 亚洲国产精品一区二区www| 亚洲欧洲制服丝袜| 亚洲欧洲美洲综合色网| 国产午夜精品在线观看| 26uuuu精品一区二区| 欧美成va人片在线观看| 欧美一区二区啪啪| 欧美一级黄色片| 欧美一级二级在线观看| 日韩一区二区在线免费观看| 69堂成人精品免费视频| 777欧美精品| 日韩一区二区三区视频在线| 3751色影院一区二区三区| 91精品国产乱码| 欧美一区二区三区日韩视频| 91精品在线免费| 日韩一级黄色片| 精品欧美一区二区久久 | 国产精品18久久久| 国产成人福利片| 成人性视频网站| 色综合色综合色综合| 欧美视频日韩视频| 日韩一区二区免费视频| 欧美成人乱码一区二区三区| 精品蜜桃在线看| 国产性色一区二区| 国产精品久久网站| 亚洲蜜臀av乱码久久精品| 一区二区三区四区乱视频| 香蕉久久一区二区不卡无毒影院| 日日欢夜夜爽一区| 精品一二三四区| 成人黄动漫网站免费app| 91在线视频免费观看| 欧美日韩日日夜夜| 日韩欧美一区二区免费| 久久久精品一品道一区| 亚洲男人天堂一区| 美脚の诱脚舐め脚责91| 国产不卡在线播放| 欧美中文字幕一区| 26uuu国产电影一区二区| 自拍偷拍国产精品| 视频精品一区二区| 国产一区二区三区美女| 91女厕偷拍女厕偷拍高清| 欧美精品少妇一区二区三区| 久久久精品免费免费| 亚洲综合在线免费观看| 久久成人麻豆午夜电影| 色中色一区二区| 欧美电影免费观看高清完整版在线| 欧美国产视频在线| 天堂精品中文字幕在线| 国产高清久久久| 精品污污网站免费看| 国产欧美视频在线观看| 亚洲动漫第一页| 国产激情91久久精品导航| 精品视频1区2区3区| 国产精品人妖ts系列视频 | 精品一区中文字幕| 色欧美片视频在线观看在线视频| 欧美一卡二卡在线| 亚洲免费在线视频一区 二区| 国内成人免费视频| 欧美日韩另类一区| 国产精品情趣视频| 另类小说综合欧美亚洲| 欧美日韩中文字幕精品| 中文字幕一区二区三区蜜月| 久久99精品国产麻豆婷婷| 91福利视频久久久久| 欧美国产97人人爽人人喊| 久色婷婷小香蕉久久| 欧美三电影在线| 亚洲视频一二区| www.欧美亚洲| 久久精子c满五个校花| 琪琪一区二区三区| 欧美军同video69gay| 亚洲美腿欧美偷拍| 成人激情黄色小说| 久久久久久一二三区| 精品一区二区在线观看| 欧美精品一级二级三级| 亚洲一区二区三区免费视频| 99国产欧美另类久久久精品| 精品久久久久99| 日本不卡视频在线观看| 8x福利精品第一导航| 亚洲gay无套男同| 欧美在线一区二区三区| 亚洲精品免费看| 91片黄在线观看| 国产精品久久久久永久免费观看| 国产精品综合视频| 久久先锋资源网| 国产一区二区在线免费观看| 精品日韩99亚洲| 国产乱码精品一区二区三区av| 欧美大胆一级视频| 日韩高清国产一区在线| 777精品伊人久久久久大香线蕉| 亚洲午夜精品17c| 欧美系列一区二区| 亚洲 欧美综合在线网络| 3d成人动漫网站| 久久精品久久99精品久久| 日韩精品影音先锋| 激情成人综合网| 国产欧美日韩麻豆91| 成人激情动漫在线观看| 亚洲色图制服丝袜| 欧美日产国产精品| 蜜桃视频一区二区三区| 久久久久久久综合| 99综合影院在线| 亚洲综合在线视频| 日韩亚洲欧美中文三级| 国产乱国产乱300精品| 国产精品久久久久影院老司| 在线观看网站黄不卡| 午夜久久久久久久久 | 欧美国产日产图区| 成人app网站| 午夜激情综合网| 久久久蜜桃精品| 一本色道久久综合狠狠躁的推荐| 五月天一区二区三区| 精品国产乱码久久久久久久久| 高清不卡一区二区在线| 亚洲制服欧美中文字幕中文字幕| 欧美精品v日韩精品v韩国精品v| 久久99热99| 一区二区三区四区精品在线视频 |