|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * routines to handle compressed file automatically ! 5: * ! 6: * (c) 1996 Samuel Devulder ! 7: */ ! 8: ! 9: #include "sysconfig.h" ! 10: #include "sysdeps.h" ! 11: ! 12: #include "config.h" ! 13: #include "options.h" ! 14: #include "zfile.h" ! 15: ! 16: #ifdef USE_ZFILE ! 17: ! 18: static struct zfile ! 19: { ! 20: struct zfile *next; ! 21: FILE *f; ! 22: char name[L_tmpnam]; ! 23: } *zlist; ! 24: ! 25: /* ! 26: * called on exit() ! 27: */ ! 28: void zfile_exit(void) ! 29: { ! 30: struct zfile *l; ! 31: ! 32: while((l = zlist)) ! 33: { ! 34: zlist = l->next; ! 35: fclose(l->f); ! 36: free(l); ! 37: } ! 38: } ! 39: ! 40: /* ! 41: * fclose() but for a compressed file ! 42: */ ! 43: int zfile_close(FILE *f) ! 44: { ! 45: struct zfile *pl = NULL, ! 46: *l = zlist; ! 47: int ret; ! 48: ! 49: while(l && l->f!=f) {pl = l;l=l->next;} ! 50: if(!l) return fclose(f); ! 51: ret = fclose(l->f); ! 52: ! 53: if(!pl) zlist = l->next; ! 54: else pl->next = l->next; ! 55: free(l); ! 56: ! 57: return ret; ! 58: } ! 59: ! 60: /* ! 61: * gzip decompression ! 62: */ ! 63: static int gunzip(char *src,char *dst) ! 64: { ! 65: char cmd[1024]; ! 66: if(!dst) return 1; ! 67: sprintf(cmd,"gzip -d -c %s >%s",src,dst); ! 68: return !system(cmd); ! 69: } ! 70: ! 71: /* ! 72: * lha decompression ! 73: */ ! 74: static int lha(char *src,char *dst) ! 75: { ! 76: char cmd[1024]; ! 77: if(!dst) return 1; ! 78: sprintf(cmd,"lha -q -N p %s >%s",src,dst); ! 79: return !system(cmd); ! 80: } ! 81: ! 82: /* ! 83: * decompresses the file (or check if dest is null) ! 84: */ ! 85: static int uncompress(char *name,char *dest) ! 86: { ! 87: char *ext = strrchr(name, '.'); ! 88: char nam[1024]; ! 89: ! 90: if (ext != NULL && access(name,0) >= 0) { ! 91: ext++; ! 92: if(!strcmp(ext,"z") || ! 93: !strcmp(ext,"Z") || ! 94: !strcmp(ext,"gz") || ! 95: !strcmp(ext,"GZ") || ! 96: 0) return gunzip(name,dest); ! 97: if(!strcmp(ext,"lha") || ! 98: !strcmp(ext,"LHA") || ! 99: !strcmp(ext,"lzh") || ! 100: !strcmp(ext,"LZH") || ! 101: 0) return lha(name,dest); ! 102: } ! 103: ! 104: if(access(strcat(strcpy(nam,name),".z"),0)>=0 || ! 105: access(strcat(strcpy(nam,name),".Z"),0)>=0 || ! 106: access(strcat(strcpy(nam,name),".gz"),0)>=0 || ! 107: access(strcat(strcpy(nam,name),".GZ"),0)>=0 || ! 108: 0) return gunzip(nam,dest); ! 109: ! 110: if(access(strcat(strcpy(nam,name),".lha"),0)>=0 || ! 111: access(strcat(strcpy(nam,name),".LHA"),0)>=0 || ! 112: access(strcat(strcpy(nam,name),".lzh"),0)>=0 || ! 113: access(strcat(strcpy(nam,name),".LZH"),0)>=0 || ! 114: 0) return lha(nam,dest); ! 115: ! 116: return 0; ! 117: } ! 118: ! 119: /* ! 120: * fopen() for a compressed file ! 121: */ ! 122: FILE *zfile_open(char *name,char *mode) ! 123: { ! 124: struct zfile *l; ! 125: int fd; ! 126: ! 127: if(!uncompress(name,NULL)) return fopen(name,mode); ! 128: ! 129: if(!(l = malloc(sizeof(*l)))) return NULL; ! 130: ! 131: tmpnam(l->name); ! 132: fd = creat(l->name, 0666); ! 133: if (fd < 0) ! 134: return NULL; ! 135: ! 136: if(!uncompress(name,l->name)) ! 137: { ! 138: free(l); close (fd); unlink(l->name); return NULL; ! 139: } ! 140: ! 141: l->f=fopen(l->name,mode); ! 142: ! 143: /* Deleting the file now will cause the space for it to be freed ! 144: * as soon as we fclose() it. This saves bookkeeping work. ! 145: */ ! 146: unlink (l->name); ! 147: ! 148: close (fd); ! 149: ! 150: if (l->f == NULL) { ! 151: free(l); ! 152: return NULL; ! 153: } ! 154: ! 155: l->next = zlist; ! 156: zlist = l; ! 157: ! 158: return l->f; ! 159: } ! 160: ! 161: #else ! 162: ! 163: /* ! 164: * Stubs for machines that this doesn't work on. ! 165: */ ! 166: ! 167: void zfile_exit(void) ! 168: { ! 169: } ! 170: ! 171: int zfile_close(FILE *f) ! 172: { ! 173: return fclose(f); ! 174: } ! 175: ! 176: FILE *zfile_open(char *name,char *mode) ! 177: { ! 178: return fopen(name, mode); ! 179: } ! 180: ! 181: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.