📄 cache1d.c
字号:
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 + -