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

📄 grp.c

📁 嵌入式环境下的GUI
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * GRP support routines for PhysicsFS. * * This driver handles BUILD engine archives ("groupfiles"). This format *  (but not this driver) was put together by Ken Silverman. * * The format is simple enough. In Ken's words: * *    What's the .GRP file format? * *     The ".grp" file format is just a collection of a lot of files stored *     into 1 big one. I tried to make the format as simple as possible: The *     first 12 bytes contains my name, "KenSilverman". The next 4 bytes is *     the number of files that were compacted into the group file. Then for *     each file, there is a 16 byte structure, where the first 12 bytes are *     the filename, and the last 4 bytes are the file's size. The rest of *     the group file is just the raw data packed one after the other in the *     same order as the list of files. * * (That info is from http://www.advsys.net/ken/build.htm ...) * * Please see the file LICENSE in the source's root directory. * *  This file written by Ryan C. Gordon. */#if HAVE_CONFIG_H#  include <config.h>#endif#if (defined PHYSFS_SUPPORTS_GRP)#include <stdio.h>#include <stdlib.h>#include <string.h>#include "physfs.h"#define __PHYSICSFS_INTERNAL__#include "physfs_internal.h"typedef struct{    char name[13];    PHYSFS_uint32 startPos;    PHYSFS_uint32 size;} GRPentry;typedef struct{    char *filename;    PHYSFS_sint64 last_mod_time;    PHYSFS_uint32 entryCount;    GRPentry *entries;} GRPinfo;typedef struct{    void *handle;    GRPentry *entry;    PHYSFS_uint32 curPos;} GRPfileinfo;static void GRP_dirClose(DirHandle *h);static PHYSFS_sint64 GRP_read(FileHandle *handle, void *buffer,                              PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);static PHYSFS_sint64 GRP_write(FileHandle *handle, const void *buffer,                               PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);static int GRP_eof(FileHandle *handle);static PHYSFS_sint64 GRP_tell(FileHandle *handle);static int GRP_seek(FileHandle *handle, PHYSFS_uint64 offset);static PHYSFS_sint64 GRP_fileLength(FileHandle *handle);static int GRP_fileClose(FileHandle *handle);static int GRP_isArchive(const char *filename, int forWriting);static DirHandle *GRP_openArchive(const char *name, int forWriting);static LinkedStringList *GRP_enumerateFiles(DirHandle *h,                                            const char *dirname,                                            int omitSymLinks);static int GRP_exists(DirHandle *h, const char *name);static int GRP_isDirectory(DirHandle *h, const char *name, int *fileExists);static int GRP_isSymLink(DirHandle *h, const char *name, int *fileExists);static PHYSFS_sint64 GRP_getLastModTime(DirHandle *h, const char *n, int *e);static FileHandle *GRP_openRead(DirHandle *h, const char *name, int *exist);static FileHandle *GRP_openWrite(DirHandle *h, const char *name);static FileHandle *GRP_openAppend(DirHandle *h, const char *name);static int GRP_remove(DirHandle *h, const char *name);static int GRP_mkdir(DirHandle *h, const char *name);const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_GRP ={    "GRP",    GRP_ARCHIVE_DESCRIPTION,    "Ryan C. Gordon <icculus@clutteredmind.org>",    "http://icculus.org/physfs/",};static const FileFunctions __PHYSFS_FileFunctions_GRP ={    GRP_read,       /* read() method       */    GRP_write,      /* write() method      */    GRP_eof,        /* eof() method        */    GRP_tell,       /* tell() method       */    GRP_seek,       /* seek() method       */    GRP_fileLength, /* fileLength() method */    GRP_fileClose   /* fileClose() method  */};const DirFunctions __PHYSFS_DirFunctions_GRP ={    &__PHYSFS_ArchiveInfo_GRP,    GRP_isArchive,          /* isArchive() method      */    GRP_openArchive,        /* openArchive() method    */    GRP_enumerateFiles,     /* enumerateFiles() method */    GRP_exists,             /* exists() method         */    GRP_isDirectory,        /* isDirectory() method    */    GRP_isSymLink,          /* isSymLink() method      */    GRP_getLastModTime,     /* getLastModTime() method */    GRP_openRead,           /* openRead() method       */    GRP_openWrite,          /* openWrite() method      */    GRP_openAppend,         /* openAppend() method     */    GRP_remove,             /* remove() method         */    GRP_mkdir,              /* mkdir() method          */    GRP_dirClose            /* dirClose() method       */};static void GRP_dirClose(DirHandle *h){    GRPinfo *info = ((GRPinfo *) h->opaque);    free(info->filename);    free(info->entries);    free(info);    free(h);} /* GRP_dirClose */static PHYSFS_sint64 GRP_read(FileHandle *handle, void *buffer,                              PHYSFS_uint32 objSize, PHYSFS_uint32 objCount){    GRPfileinfo *finfo = (GRPfileinfo *) (handle->opaque);    GRPentry *entry = finfo->entry;    PHYSFS_uint32 bytesLeft = entry->size - finfo->curPos;    PHYSFS_uint32 objsLeft = (bytesLeft / objSize);    PHYSFS_sint64 rc;    if (objsLeft < objCount)        objCount = objsLeft;    rc = __PHYSFS_platformRead(finfo->handle, buffer, objSize, objCount);    if (rc > 0)        finfo->curPos += (PHYSFS_uint32) (rc * objSize);    return(rc);} /* GRP_read */static PHYSFS_sint64 GRP_write(FileHandle *handle, const void *buffer,                               PHYSFS_uint32 objSize, PHYSFS_uint32 objCount){    BAIL_MACRO(ERR_NOT_SUPPORTED, -1);} /* GRP_write */static int GRP_eof(FileHandle *handle){    GRPfileinfo *finfo = (GRPfileinfo *) (handle->opaque);    GRPentry *entry = finfo->entry;    return(finfo->curPos >= entry->size);} /* GRP_eof */static PHYSFS_sint64 GRP_tell(FileHandle *handle){    return(((GRPfileinfo *) (handle->opaque))->curPos);} /* GRP_tell */static int GRP_seek(FileHandle *handle, PHYSFS_uint64 offset){    GRPfileinfo *finfo = (GRPfileinfo *) (handle->opaque);    GRPentry *entry = finfo->entry;    int rc;    BAIL_IF_MACRO(offset < 0, ERR_INVALID_ARGUMENT, 0);    BAIL_IF_MACRO(offset >= entry->size, ERR_PAST_EOF, 0);    rc = __PHYSFS_platformSeek(finfo->handle, entry->startPos + offset);    if (rc)        finfo->curPos = (PHYSFS_uint32) offset;    return(rc);} /* GRP_seek */static PHYSFS_sint64 GRP_fileLength(FileHandle *handle){    GRPfileinfo *finfo = ((GRPfileinfo *) handle->opaque);    return((PHYSFS_sint64) finfo->entry->size);} /* GRP_fileLength */static int GRP_fileClose(FileHandle *handle){    GRPfileinfo *finfo = ((GRPfileinfo *) handle->opaque);    BAIL_IF_MACRO(!__PHYSFS_platformClose(finfo->handle), NULL, 0);    free(finfo);    free(handle);    return(1);} /* GRP_fileClose */static int grp_open(const char *filename, int forWriting,                    void **fh, PHYSFS_uint32 *count){    PHYSFS_uint8 buf[12];    *fh = NULL;    BAIL_IF_MACRO(forWriting, ERR_ARC_IS_READ_ONLY, 0);    *fh = __PHYSFS_platformOpenRead(filename);    BAIL_IF_MACRO(*fh == NULL, NULL, 0);        if (__PHYSFS_platformRead(*fh, buf, 12, 1) != 1)        goto openGrp_failed;    if (memcmp(buf, "KenSilverman", 12) != 0)    {        __PHYSFS_setError(ERR_UNSUPPORTED_ARCHIVE);        goto openGrp_failed;    } /* if */    if (__PHYSFS_platformRead(*fh, count, sizeof (PHYSFS_uint32), 1) != 1)        goto openGrp_failed;    *count = PHYSFS_swapULE32(*count);    return(1);openGrp_failed:    if (*fh != NULL)        __PHYSFS_platformClose(*fh);    *count = -1;    *fh = NULL;    return(0);} /* grp_open */static int GRP_isArchive(const char *filename, int forWriting){    void *fh;    PHYSFS_uint32 fileCount;    int retval = grp_open(filename, forWriting, &fh, &fileCount);    if (fh != NULL)        __PHYSFS_platformClose(fh);    return(retval);} /* GRP_isArchive */static int grp_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two){    GRPentry *a = (GRPentry *) _a;    return(strcmp(a[one].name, a[two].name));

⌨️ 快捷键说明

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