123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- /*****************************************
- *
- * GOB File System
- *
- * Here's what Merriam-Webster says about "gob": --Chuck
- * Entry: gob
- * Function: noun
- * Etymology: Middle English gobbe, from Middle French gobe large piece of food,
- * back-formation from gobet
- * Date: 14th century
- * 1 : LUMP
- * 2 : a large amount -- usually used in plural <gobs of money>
- *
- * Purpose: Provide fast, efficient disk access on a variety of platforms.
- *
- * Implementation:
- * The GOB system maintains two files -- GOB and GFC. The GOB file is actually
- * an archive of many files split into variable size, compressed blocks. The GFC,
- * GOB File Control, contains 3 tables -- a block table, basic file table, and
- * extended file table. The block table is analogous to a DOS FAT. The basic
- * file table contains a minimal set of file information to handle basic reading
- * tasks. The extended file table is optionally loaded and contains additional
- * file information. File names are case insensitive.
- *
- * Files can be read in a normal manner. Open, read, seek and close
- * operations are all provided. Files can only be written in a single
- * contiguous chunk of blocks at the end of an archive. Reads are processed
- * through a configurable number of read ahead buffers to in an effort to
- * minimize both reads and seeks. Other operations including delete, verify,
- * access, and get size are also supported on files inside an archive.
- *
- * The system supports read profiling. By supplying a file read callback
- * function, the library will output the block number of each read. This can
- * be used rearrange block in the archive to minimize seek times. The
- * GOBRearrange sorts files in an archive.
- *
- * Supports block based caching. Primarily aimed at caching files off a DVD/CD
- * to a faster hard disk.
- *
- * Future Work:
- *
- * Dependencies: vvInt, snprintf, zlib
- * Owner: Chris McEvoy
- * History:
- * 09/23/2001 Original version
- * 10/28/2002 Merged into vvtech
- *
- * Copyright (C) 2002, Vicarious Visions, Inc. All Rights Reserved.
- *
- * UNPUBLISHED -- Rights reserved under the copyright laws of the
- * United States. Use of a copyright notice is precautionary only and
- * does not imply publication or disclosure.
- *
- * THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
- * OF VICARIOUS VISIONS, INC. ANY DUPLICATION, MODIFICATION,
- * DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
- * EXPRESS WRITTEN PERMISSION OF VICARIOUS VISIONS, INC.
- *
- *****************************************/
- /*
- This is an unofficial branch of GOB, for Jedi Academy
- Maintainer: Brian Osman
- */
- #ifndef GOBLIB_H__
- #define GOBLIB_H__
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define GOB_MAGIC_IDENTIFIER 0x8008
- #define GOB_MAX_FILE_NAME_LEN 96
- #define GOB_MAX_OPEN_FILES 16
- #define GOB_MAX_CODECS 2
- #define GOB_INFINITE_RATIO 1000
- #define GOB_READ_RETRYS 3
- #define GOB_MAX_FILES (16*1024)
- #define GOB_MAX_BLOCKS 32767
- #define GOB_BLOCK_SIZE (64*1024)
- #define GOB_BLOCK_ALIGNMENT 2048
- #define GOB_MEM_ALIGNMENT 64
- #define GOB_COMPRESS_OVERHEAD 1024
- #define GOB_INVALID_SIZE 0xFFFFFFFF
- #define GOB_INVALID_BLOCK 0xFFFFFFFF
- #define GOB_TRUE 1
- #define GOB_FALSE 0
- #define GOBERR_OK 0
- #define GOBERR_NOT_INIT 1
- #define GOBERR_FILE_NOT_FOUND 2
- #define GOBERR_FILE_READ 3
- #define GOBERR_FILE_WRITE 4
- #define GOBERR_NO_MEMORY 5
- #define GOBERR_ALREADY_INIT 6
- #define GOBERR_ALREADY_OPEN 7
- #define GOBERR_INVALID_ACCESS 8
- #define GOBERR_NOT_GOB_FILE 9
- #define GOBERR_NOT_OPEN 10
- #define GOBERR_CANNOT_CREATE 11
- #define GOBERR_TOO_MANY_OPEN 12
- #define GOBERR_INVALID_SEEK 13
- #define GOBERR_TOO_MANY_FILES 14
- #define GOBERR_FILE_RENAME 15
- #define GOBERR_PROFILE_OFF 16
- #define GOBERR_PROFILE_ON 17
- #define GOBERR_NO_EXTENDED 18
- #define GOBERR_DUP_HASH 19
- #define GOBERR_TOO_MANY_BLOCKS 20
- #define GOBERR_COMPRESS_FAIL 21
- #define GOBERR_NO_SUITABLE_CODEC 22
- #define GOBACCESS_READ 0
- #define GOBACCESS_WRITE 1
- #define GOBACCESS_RW 2
- #define GOBSEEK_START 0
- #define GOBSEEK_CURRENT 1
- #define GOBSEEK_END 2
- #define GOB_CODEC_MASK(n) ((GOBUInt32)(1u<<(n)))
- #define GOB_CODEC_MASK_ANY ((GOBUInt32)(-1))
- #define GOBMARKER_STARTBLOCK ('L' | 'B' << 8 | 'T' << 16 | 'S' << 24)
- #define GOBMARKER_ENDBLOCK ('L' | 'B' << 8 | 'N' << 16 | 'E' << 24)
- typedef int int32;
- typedef unsigned int uint32;
- //#define bool int
- //#define false 0
- //#define true 1
- typedef unsigned long ulong;
- typedef unsigned char byte;
- typedef int32 GOBInt32;
- typedef uint32 GOBUInt32;
- typedef char GOBChar;
- typedef bool GOBBool;
- typedef int32 GOBError;
- typedef int32 GOBSeekType;
- typedef int32 GOBHandle;
- typedef int32 GOBAccessType;
- typedef void* GOBFSHandle;
- typedef void GOBVoid;
- typedef GOBFSHandle (*GOBFileSysOpenFunc)(GOBChar*, GOBAccessType);
- typedef GOBBool (*GOBFileSysCloseFunc)(GOBFSHandle*);
- typedef GOBInt32 (*GOBFileSysReadFunc)(GOBFSHandle, GOBVoid*, GOBInt32);
- typedef GOBInt32 (*GOBFileSysWriteFunc)(GOBFSHandle, GOBVoid*, GOBInt32);
- typedef GOBInt32 (*GOBFileSysSeekFunc)(GOBFSHandle, GOBInt32, GOBSeekType);
- typedef GOBInt32 (*GOBFileSysRenameFunc)(GOBChar*, GOBChar*);
- typedef GOBVoid* (*GOBMemAllocFunc)(GOBUInt32);
- typedef GOBVoid (*GOBMemFreeFunc)(GOBVoid*);
- typedef GOBInt32 (*GOBCompressFunc)(GOBVoid*, GOBUInt32, GOBVoid*, GOBUInt32*);
- typedef GOBInt32 (*GOBDecompressFunc)(GOBVoid*, GOBUInt32, GOBVoid*, GOBUInt32*);
- typedef GOBBool (*GOBCacheFileOpenFunc)(GOBUInt32);
- typedef GOBBool (*GOBCacheFileCloseFunc)(GOBVoid);
- typedef GOBInt32 (*GOBCacheFileReadFunc)(GOBVoid*, GOBInt32);
- typedef GOBInt32 (*GOBCacheFileWriteFunc)(GOBVoid*, GOBInt32);
- typedef GOBInt32 (*GOBCacheFileSeekFunc)(GOBInt32);
- struct GOBBlockTableEntry
- {
- GOBUInt32 size; // compressed size
- GOBUInt32 offset;
- GOBUInt32 next;
- };
- struct GOBFileTableBasicEntry
- {
- GOBUInt32 hash;
- GOBUInt32 size; // decompressed size
- GOBUInt32 block;
- };
- struct GOBFileTableExtEntry
- {
- GOBChar name[GOB_MAX_FILE_NAME_LEN];
- GOBUInt32 crc;
- GOBUInt32 time;
- };
- struct GOBMemoryFuncSet
- {
- GOBMemAllocFunc alloc;
- GOBMemFreeFunc free;
- };
- struct GOBSingleCodecDesc
- {
- GOBChar tag;
- GOBInt32 max_ratio;
- GOBCompressFunc compress;
- GOBDecompressFunc decompress;
- };
- struct GOBCodecFuncSet
- {
- GOBInt32 codecs;
- struct GOBSingleCodecDesc codec[GOB_MAX_CODECS];
- };
- struct GOBFileSysFuncSet
- {
- GOBFileSysOpenFunc open;
- GOBFileSysCloseFunc close;
- GOBFileSysReadFunc read;
- GOBFileSysWriteFunc write;
- GOBFileSysSeekFunc seek;
- };
- struct GOBCacheFileFuncSet
- {
- GOBCacheFileOpenFunc open;
- GOBCacheFileCloseFunc close;
- GOBCacheFileReadFunc read;
- GOBCacheFileWriteFunc write;
- GOBCacheFileSeekFunc seek;
- };
- struct GOBReadStats
- {
- GOBUInt32 bufferUsed;
- GOBUInt32 bytesRead;
- GOBUInt32 cacheBytesRead;
- GOBUInt32 cacheBytesWrite;
- GOBUInt32 totalSeeks;
- GOBUInt32 farSeeks;
- GOBUInt32 filesOpened;
- };
- extern GOBError GOBInit(struct GOBMemoryFuncSet* mem,
- struct GOBFileSysFuncSet* file,
- struct GOBCodecFuncSet* codec,
- struct GOBCacheFileFuncSet* cache);
- extern GOBError GOBShutdown(GOBVoid);
- extern GOBError GOBArchiveCreate(const GOBChar* file);
- extern GOBError GOBArchiveOpen(const GOBChar* file, GOBAccessType atype,
- GOBBool extended, GOBBool safe);
- extern GOBError GOBArchiveClose(GOBVoid);
- extern GOBError GOBArchiveCheckMarkers(GOBVoid);
- extern GOBError GOBOpen(GOBChar* file, GOBHandle* handle);
- extern GOBError GOBOpenCode(GOBInt32 code, GOBHandle* handle);
- extern GOBError GOBClose(GOBHandle handle);
- extern GOBUInt32 GOBRead(GOBVoid* buffer, GOBUInt32 size, GOBHandle handle);
- extern GOBError GOBSeek(GOBHandle handle, GOBUInt32 offset, GOBSeekType type, GOBUInt32* pos);
- extern GOBError GOBWrite(GOBVoid* buffer, GOBUInt32 size, GOBUInt32 mtime, const GOBChar* file, GOBUInt32 codec_mask);
- extern GOBError GOBDelete(const GOBChar* file);
- extern GOBError GOBRearrange(const GOBChar* file, const GOBUInt32* xlat, GOBFileSysRenameFunc _rename);
- extern GOBError GOBVerify(const GOBChar* file, GOBBool* status);
- extern GOBError GOBGetSize(const GOBChar* file, GOBUInt32* decomp, GOBUInt32* comp, GOBUInt32* slack);
- extern GOBError GOBGetTime(const GOBChar* file, GOBUInt32* time);
- extern GOBError GOBGetCRC(const GOBChar* file, GOBUInt32* crc);
- extern GOBError GOBAccess(const GOBChar* file, GOBBool* status);
- extern GOBInt32 GOBGetFileCode(const GOBChar* file);
- extern GOBError GOBGetFileTables(struct GOBFileTableBasicEntry** basic, struct GOBFileTableExtEntry** ext);
- extern GOBError GOBGetBlockTable(struct GOBBlockTableEntry** table, GOBUInt32* num);
- extern GOBUInt32 GOBGetSlack(GOBUInt32 x);
- extern GOBError GOBSetCacheSize(GOBUInt32 num);
- extern GOBError GOBSetReadBufferSize(GOBUInt32 size);
- extern struct GOBReadStats GOBGetReadStats(GOBVoid);
- typedef GOBVoid (*GOBProfileReadFunc)(GOBUInt32);
- struct GOBProfileFuncSet
- {
- GOBProfileReadFunc read;
- };
- extern GOBVoid GOBSetProfileFuncs(struct GOBProfileFuncSet* fset);
- extern GOBError GOBStartProfile(GOBVoid);
- extern GOBError GOBStopProfile(GOBVoid);
- #ifdef __cplusplus
- } /* extern "C" */
- #endif
- #endif /* GOBLIB_H__ */
|