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

📄 cache1d.c

📁 小型游戏引擎
💻 C
📖 第 1 页 / 共 2 页
字号:
    return(-1);#else	long i, j, k, fil, newhandle;	unsigned char bad;	char *gfileptr;	newhandle = MAXOPENFILES-1;	while (filehan[newhandle] != -1)	{		newhandle--;		if (newhandle < 0)		{			printf("TOO MANY FILES OPEN IN FILE GROUPING SYSTEM!");			exit(0);		}	}	if (searchfirst == 0)		if ((fil = open(filename,O_BINARY|O_RDONLY)) != -1)		{			filegrp[newhandle] = 255;			filehan[newhandle] = fil;			filepos[newhandle] = 0;			return(newhandle);		}	for(k=numgroupfiles-1;k>=0;k--)	{		if (searchfirst != 0) k = 0;		if (groupfil[k] != -1)		{			for(i=gnumfiles[k]-1;i>=0;i--)			{				gfileptr = (char *)&gfilelist[k][i<<4];				bad = 0;				for(j=0;j<13;j++)				{					if (!filename[j]) break;					if (toupperlookup[(int) filename[j]] != toupperlookup[(int) gfileptr[j]])						{ bad = 1; break; }				}				if (bad) continue;				filegrp[newhandle] = (unsigned char) k;				filehan[newhandle] = i;				filepos[newhandle] = 0;				return(newhandle);			}		}	}	return(-1);#endif}long kread(long handle, void *buffer, long leng){#if (defined USE_PHYSICSFS)    return(PHYSFS_read(filehan[handle], buffer, 1, leng));return(leng);#else	long i, filenum, groupnum;	filenum = filehan[handle];	groupnum = filegrp[handle];	if (groupnum == 255) return(read(filenum,buffer,leng));	if (groupfil[groupnum] != -1)	{		i = gfileoffs[groupnum][filenum]+filepos[handle];		if (i != groupfilpos[groupnum])		{			lseek(groupfil[groupnum],i+((gnumfiles[groupnum]+1)<<4),SEEK_SET);			groupfilpos[groupnum] = i;		}		leng = min(leng,(gfileoffs[groupnum][filenum+1]-gfileoffs[groupnum][filenum])-filepos[handle]);		leng = read(groupfil[groupnum],buffer,leng);		filepos[handle] += leng;		groupfilpos[groupnum] += leng;		return(leng);	}	return(0);#endif}long klseek(long handle, long offset, long whence){#if (defined USE_PHYSICSFS)    if (whence == SEEK_END)    {        printf("UNSUPPORTED SEEK SEMANTIC!\n");        exit(42);    } /* if */    if (whence == SEEK_CUR)        offset += PHYSFS_tell(filehan[handle]);    if (!PHYSFS_seek(filehan[handle], offset))        return(-1);    return(offset);#else	long i, groupnum;	groupnum = filegrp[handle];	if (groupnum == 255) return(lseek(filehan[handle],offset,whence));	if (groupfil[groupnum] != -1)	{		switch(whence)		{			case SEEK_SET: filepos[handle] = offset; break;			case SEEK_END: i = filehan[handle];								filepos[handle] = (gfileoffs[groupnum][i+1]-gfileoffs[groupnum][i])+offset;								break;			case SEEK_CUR: filepos[handle] += offset; break;		}		return(filepos[handle]);	}	return(-1);#endif}long kfilelength(long handle){#if (defined USE_PHYSICSFS)    return(PHYSFS_fileLength(filehan[handle]));#else	long i, groupnum;	groupnum = filegrp[handle];	if (groupnum == 255) return(filelength(filehan[handle]));	i = filehan[handle];	return(gfileoffs[groupnum][i+1]-gfileoffs[groupnum][i]);#endif}void kclose(long handle){#if (defined USE_PHYSICSFS)    if (filehan[handle] != NULL)    {        PHYSFS_close(filehan[handle]);        filehan[handle] = NULL;    } /* if */#else	if (handle < 0) return;	if (filegrp[handle] == 255) close(filehan[handle]);	filehan[handle] = -1;#endif}	/* Internal LZW variables */#define LZWSIZE 16384           /* Watch out for shorts! */static char *lzwbuf1, *lzwbuf4, *lzwbuf5;static unsigned char lzwbuflock[5];static short *lzwbuf2, *lzwbuf3;void kdfread(void *buffer, size_t dasizeof, size_t count, long fil){	size_t i, j;	long k, kgoal;	short leng;	char *ptr;	lzwbuflock[0] = lzwbuflock[1] = lzwbuflock[2] = lzwbuflock[3] = lzwbuflock[4] = 200;	if (lzwbuf1 == NULL) allocache((long *)&lzwbuf1,LZWSIZE+(LZWSIZE>>4),&lzwbuflock[0]);	if (lzwbuf2 == NULL) allocache((long *)&lzwbuf2,(LZWSIZE+(LZWSIZE>>4))*2,&lzwbuflock[1]);	if (lzwbuf3 == NULL) allocache((long *)&lzwbuf3,(LZWSIZE+(LZWSIZE>>4))*2,&lzwbuflock[2]);	if (lzwbuf4 == NULL) allocache((long *)&lzwbuf4,LZWSIZE,&lzwbuflock[3]);	if (lzwbuf5 == NULL) allocache((long *)&lzwbuf5,LZWSIZE+(LZWSIZE>>4),&lzwbuflock[4]);	if (dasizeof > LZWSIZE) { count *= dasizeof; dasizeof = 1; }	ptr = (char *)buffer;	kread(fil,&leng,2); kread(fil,lzwbuf5,(long)leng);	k = 0;	kgoal = uncompress(lzwbuf5,(long)leng,lzwbuf4);	copybufbyte(lzwbuf4,ptr,(long)dasizeof);	k += (long)dasizeof;	for(i=1;i<count;i++)	{		if (k >= kgoal)		{			kread(fil,&leng,2); kread(fil,lzwbuf5,(long)leng);			k = 0; kgoal = uncompress(lzwbuf5,(long)leng,lzwbuf4);		}		for(j=0;j<dasizeof;j++) ptr[j+dasizeof] = (unsigned char) ((ptr[j]+lzwbuf4[j+k])&255);		k += dasizeof;		ptr += dasizeof;	}	lzwbuflock[0] = lzwbuflock[1] = lzwbuflock[2] = lzwbuflock[3] = lzwbuflock[4] = 1;}void dfread(void *buffer, size_t dasizeof, size_t count, FILE *fil){	size_t i, j;	long k, kgoal;	short leng;	char *ptr;	lzwbuflock[0] = lzwbuflock[1] = lzwbuflock[2] = lzwbuflock[3] = lzwbuflock[4] = 200;	if (lzwbuf1 == NULL) allocache((long *)&lzwbuf1,LZWSIZE+(LZWSIZE>>4),&lzwbuflock[0]);	if (lzwbuf2 == NULL) allocache((long *)&lzwbuf2,(LZWSIZE+(LZWSIZE>>4))*2,&lzwbuflock[1]);	if (lzwbuf3 == NULL) allocache((long *)&lzwbuf3,(LZWSIZE+(LZWSIZE>>4))*2,&lzwbuflock[2]);	if (lzwbuf4 == NULL) allocache((long *)&lzwbuf4,LZWSIZE,&lzwbuflock[3]);	if (lzwbuf5 == NULL) allocache((long *)&lzwbuf5,LZWSIZE+(LZWSIZE>>4),&lzwbuflock[4]);	if (dasizeof > LZWSIZE) { count *= dasizeof; dasizeof = 1; }	ptr = (char *)buffer;	fread(&leng,2,1,fil); fread(lzwbuf5,(long)leng,1,fil);	k = 0; kgoal = uncompress(lzwbuf5,(long)leng,lzwbuf4);	copybufbyte(lzwbuf4,ptr,(long)dasizeof);	k += (long)dasizeof;	for(i=1;i<count;i++)	{		if (k >= kgoal)		{			fread(&leng,2,1,fil); fread(lzwbuf5,(long)leng,1,fil);			k = 0; kgoal = uncompress(lzwbuf5,(long)leng,lzwbuf4);		}		for(j=0;j<dasizeof;j++) ptr[j+dasizeof] = (unsigned char) ((ptr[j]+lzwbuf4[j+k])&255);		k += dasizeof;		ptr += dasizeof;	}	lzwbuflock[0] = lzwbuflock[1] = lzwbuflock[2] = lzwbuflock[3] = lzwbuflock[4] = 1;}void dfwrite(void *buffer, size_t dasizeof, size_t count, FILE *fil){	size_t i, j, k;	short leng;	char *ptr;	lzwbuflock[0] = lzwbuflock[1] = lzwbuflock[2] = lzwbuflock[3] = lzwbuflock[4] = 200;	if (lzwbuf1 == NULL) allocache((long *)&lzwbuf1,LZWSIZE+(LZWSIZE>>4),&lzwbuflock[0]);	if (lzwbuf2 == NULL) allocache((long *)&lzwbuf2,(LZWSIZE+(LZWSIZE>>4))*2,&lzwbuflock[1]);	if (lzwbuf3 == NULL) allocache((long *)&lzwbuf3,(LZWSIZE+(LZWSIZE>>4))*2,&lzwbuflock[2]);	if (lzwbuf4 == NULL) allocache((long *)&lzwbuf4,LZWSIZE,&lzwbuflock[3]);	if (lzwbuf5 == NULL) allocache((long *)&lzwbuf5,LZWSIZE+(LZWSIZE>>4),&lzwbuflock[4]);	if (dasizeof > LZWSIZE) { count *= dasizeof; dasizeof = 1; }	ptr = (char *)buffer;	copybufbyte(ptr,lzwbuf4,(long)dasizeof);	k = dasizeof;	if (k > LZWSIZE-dasizeof)	{		leng = (short)compress(lzwbuf4,k,lzwbuf5); k = 0;		fwrite(&leng,2,1,fil); fwrite(lzwbuf5,(long)leng,1,fil);	}	for(i=1;i<count;i++)	{		for(j=0;j<dasizeof;j++) lzwbuf4[j+k] = (unsigned char) ((ptr[j+dasizeof]-ptr[j])&255);		k += dasizeof;		if (k > LZWSIZE-dasizeof)		{			leng = (short)compress(lzwbuf4,k,lzwbuf5); k = 0;			fwrite(&leng,2,1,fil); fwrite(lzwbuf5,(long)leng,1,fil);		}		ptr += dasizeof;	}	if (k > 0)	{		leng = (short)compress(lzwbuf4,k,lzwbuf5);		fwrite(&leng,2,1,fil); fwrite(lzwbuf5,(long)leng,1,fil);	}	lzwbuflock[0] = lzwbuflock[1] = lzwbuflock[2] = lzwbuflock[3] = lzwbuflock[4] = 1;}long compress(char *lzwinbuf, long uncompleng, char *lzwoutbuf){	long i, addr, newaddr, addrcnt, zx, *longptr;	long bytecnt1, bitcnt, numbits, oneupnumbits;	short *shortptr;	for(i=255;i>=0;i--) { lzwbuf1[i] = (char) i; lzwbuf3[i] = (short) ((i+1)&255); }	clearbuf((void *) FP_OFF(lzwbuf2),256>>1,0xffffffff);	clearbuf((void *) FP_OFF(lzwoutbuf),((uncompleng+15)+3)>>2,0L);	addrcnt = 256; bytecnt1 = 0; bitcnt = (4<<3);	numbits = 8; oneupnumbits = (1<<8);	do	{		addr = lzwinbuf[bytecnt1];		do		{			bytecnt1++;			if (bytecnt1 == uncompleng) break;			if (lzwbuf2[addr] < 0) {lzwbuf2[addr] = (short) addrcnt; break;}			newaddr = lzwbuf2[addr];			while (lzwbuf1[newaddr] != lzwinbuf[bytecnt1])			{				zx = lzwbuf3[newaddr];				if (zx < 0) {lzwbuf3[newaddr] = (short) addrcnt; break;}				newaddr = zx;			}			if (lzwbuf3[newaddr] == addrcnt) break;			addr = newaddr;		} while (addr >= 0);		lzwbuf1[addrcnt] = lzwinbuf[bytecnt1];		lzwbuf2[addrcnt] = -1;		lzwbuf3[addrcnt] = -1;		longptr = (long *)&lzwoutbuf[bitcnt>>3];		longptr[0] |= (addr<<(bitcnt&7));		bitcnt += numbits;		if ((addr&((oneupnumbits>>1)-1)) > ((addrcnt-1)&((oneupnumbits>>1)-1)))			bitcnt--;		addrcnt++;		if (addrcnt > oneupnumbits) { numbits++; oneupnumbits <<= 1; }	} while ((bytecnt1 < uncompleng) && (bitcnt < (uncompleng<<3)));	longptr = (long *)&lzwoutbuf[bitcnt>>3];	longptr[0] |= (addr<<(bitcnt&7));	bitcnt += numbits;	if ((addr&((oneupnumbits>>1)-1)) > ((addrcnt-1)&((oneupnumbits>>1)-1)))		bitcnt--;	shortptr = (short *)lzwoutbuf;	shortptr[0] = (short)uncompleng;	if (((bitcnt+7)>>3) < uncompleng)	{		shortptr[1] = (short)addrcnt;		return((bitcnt+7)>>3);	}	shortptr[1] = (short)0;	for(i=0;i<uncompleng;i++) lzwoutbuf[i+4] = lzwinbuf[i];	return(uncompleng+4);}long uncompress(char *lzwinbuf, long compleng, char *lzwoutbuf){	long strtot, currstr, numbits, oneupnumbits;	long i, dat, leng, bitcnt, outbytecnt, *longptr;	short *shortptr;	shortptr = (short *)lzwinbuf;	strtot = (long)shortptr[1];	if (strtot == 0)	{		copybuf((void *)(FP_OFF(lzwinbuf)+4),(void *)(FP_OFF(lzwoutbuf)),((compleng-4)+3)>>2);		return((long)shortptr[0]); /* uncompleng */	}	for(i=255;i>=0;i--) { lzwbuf2[i] = (short) i; lzwbuf3[i] = (short) i; }	currstr = 256; bitcnt = (4<<3); outbytecnt = 0;	numbits = 8; oneupnumbits = (1<<8);	do	{		longptr = (long *)&lzwinbuf[bitcnt>>3];		dat = ((longptr[0]>>(bitcnt&7)) & (oneupnumbits-1));		bitcnt += numbits;		if ((dat&((oneupnumbits>>1)-1)) > ((currstr-1)&((oneupnumbits>>1)-1)))			{ dat &= ((oneupnumbits>>1)-1); bitcnt--; }		lzwbuf3[currstr] = (short) dat;		for(leng=0;dat>=256;leng++,dat=lzwbuf3[dat])			lzwbuf1[leng] = (char) lzwbuf2[dat];		lzwoutbuf[outbytecnt++] = (char) dat;		for(i=leng-1;i>=0;i--) lzwoutbuf[outbytecnt++] = lzwbuf1[i];		lzwbuf2[currstr-1] = (short) dat; lzwbuf2[currstr] = (short) dat;		currstr++;		if (currstr > oneupnumbits) { numbits++; oneupnumbits <<= 1; }	} while (currstr < strtot);	return((long)shortptr[0]); /* uncompleng */}

⌨️ 快捷键说明

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