#ifndef __FILEIO
#define __FILEIO


#define kFileErr -1
#define kMaxFiles 32768
#define kMaxFileNameLength	32

typedef char tOpaqueFileSystemLocator[272]; //size of this is platform specific
typedef int tFileRef;

typedef struct{
	int loaded;
	int parsed;
	int tagged;
	int size;
	void *data;
	void *parsedData;
	tOpaqueFileSystemLocator fsLoc;
	char name[kMaxFileNameLength];
} tFileTableEntry;

#define kFileTypeRAW ".raw"
#define kFileTypeRAW3d ".raw3d"
#define kFileTypeGrayscaleRAW ".graw"
#define kFileTypeSGI ".sgi"
#define kFileTypeWaveFront ".obj"
#define kFileTypeWAV ".wav"
#define kFileTypeModel ".mdl"
#define kFileTypeSolidEntity ".ent"
#define kFileTypeCarDefinition ".car"
#define kFileTypeMapDefinition ".mapinfo"
#define kFileTypeEnvironmentDefinition ".env"
#define kFileTypePackageFile ".redplug"
#define kFileTypeImageURL ".url"
#define kFileTypeCompressedTexture ".txr"
#define kFileTypeLog ".redlog"

extern int gFileTableSize;
extern int gFileTampered;
extern tFileTableEntry *gFileTable;

static inline int _stricmp(const char *s1, const char *s2)
{
    char c1, c2;
    while (1)
    {
    	c1 = *s1++;
    	c2 = *s2++;
		if(c1>='A'&&c1<='Z')c1+=0x20;
		if(c2>='A'&&c2<='Z')c2+=0x20;
        if (c1 < c2) return -1;
        if (c1 > c2) return 1;
        if (c1 == 0) return 0;
    }
}

#include "parser.h"

extern int gFileErrorReporting;

tFileRef FileGetReference(char *name);
tFileRef FileGetIndexedReference(tFileRef base,int i);
tFileRef FileGetBaseReference(tFileRef ref);
void FileAppendData(tFileRef fileRef,void *data,int size);
void *FileGetPartialDataPtr(tFileRef fileRef,int offset,int size);
void *FileGetDataPtr(tFileRef reference);
void FileSetData(tFileRef reference,void *data);
void FileReleaseData(int reference);
void FileInitIO();
void FileRescanDirectory();
char *FileGetExtension(tFileRef reference);
char *FileGetName(tFileRef reference);
int FileGetSize(tFileRef reference);
void* FileGetParsedDataPtr(tFileRef reference, int parserType, int dataSize);
unsigned int FileGetChecksum(tFileRef reference);

#endif