X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=installer%2Fmkarchive.c;fp=installer%2Fmkarchive.c;h=0000000000000000000000000000000000000000;hb=57b37b6999c742d9749001df3e8694124f2715dc;hp=45b2a3d2740d6cb6ef321cc4494d6a9470db9354;hpb=c672a4c1f3d6c588e4fc93355f9e89cca773c02d;p=swftools.git diff --git a/installer/mkarchive.c b/installer/mkarchive.c deleted file mode 100644 index 45b2a3d..0000000 --- a/installer/mkarchive.c +++ /dev/null @@ -1,430 +0,0 @@ -/* mkarchive.c - - Part of the rfx installer (Main program). - - Copyright (c) 2004-2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include -#include -#define ZLIB_BUFFER_SIZE 16384 - -typedef struct _writer -{ - int (*write)(struct _writer*, void*data, int len); - void (*finish)(struct _writer*); - void *internal; -} writer_t; - -/* ---------------------------- file writer ------------------------------- */ - -typedef struct -{ - FILE*fi; -} filewrite_t; -static int writer_filewrite_write(writer_t*w, void* data, int len) -{ - filewrite_t * fw= (filewrite_t*)w->internal; - return fwrite(data, len, 1, fw->fi); -} -static void writer_filewrite_finish(writer_t*w) -{ - filewrite_t *mr = (filewrite_t*)w->internal; - fclose(mr->fi); - free(w->internal); - memset(w, 0, sizeof(writer_t)); -} -writer_t*writer_init_filewriter(char*filename) -{ - writer_t*w = malloc(sizeof(writer_t)); - FILE*fi = fopen(filename, "wb"); - filewrite_t *mr = (filewrite_t *)malloc(sizeof(filewrite_t)); - mr->fi = fi; - memset(w, 0, sizeof(writer_t)); - w->write = writer_filewrite_write; - w->finish = writer_filewrite_finish; - w->internal = mr; - return w; -} - -/* ---------------------------- include file filter ------------------------------- */ - -typedef struct _ifwrite -{ - FILE*fi; - int bp; - int pos; - int last; - char buf[1024]; - char*filename; -} ifwrite_t; - -static int writer_ifwrite_write(writer_t*out, void*data, int len) -{ - ifwrite_t*i = (ifwrite_t*)out->internal; - FILE*fo = i->fi; - int t; - for(t=0;tbp>=80) { - fprintf(fo, "\"%s\"\n", i->buf); - i->bp = 0; - } - if(c<=32 || c>0x7e || c=='"' || c == '\\' || c == '%' - || (i->last && c>='0' && c<='9') - || (i->last && c>='a' && c<='f') - || (i->last && c>='A' && c<='F') - ) { - i->bp += sprintf(i->buf+i->bp, "\\x%x",c); - i->last = 1; - } else { - i->buf[i->bp] = c; - i->buf[i->bp+1] = 0; - i->last = 0; - i->bp++; - } - i->pos++; - } -} -static void writer_ifwrite_finish(writer_t*w) -{ - ifwrite_t *i= (ifwrite_t*)w->internal; - fprintf(i->fi, "\"%s\"\n", i->buf); - fprintf(i->fi, ";\n"); - fprintf(i->fi, "int crndata_len = %d;\n", i->pos); - fclose(i->fi); - printf("wrote file %s\n", i->filename); - free(w->internal);w->internal = 0; -} - -writer_t*writer_init_includewriter(char*filename) -{ - writer_t*w = malloc(sizeof(writer_t)); - FILE*fi = fopen(filename, "wb"); - memset(w, 0, sizeof(writer_t)); - w->write = writer_ifwrite_write; - w->finish = writer_ifwrite_finish; - ifwrite_t*i = (ifwrite_t *)malloc(sizeof(ifwrite_t)); - i->fi = fi; - i->pos = 0; - i->bp=0; - i->last = 0; - i->filename = filename; - w->internal = i; - - fprintf(i->fi, "char* crndata =\n"); - return w; - -} - -/* ---------------------------- zlibdeflate writer -------------------------- */ - -struct zlibdeflate_t -{ - z_stream zs; - writer_t*output; - int written; - int zwritten; - unsigned char writebuffer[ZLIB_BUFFER_SIZE]; -}; - -static void zlib_error(int ret, char* msg, z_stream*zs) -{ - fprintf(stderr, "%s: zlib error (%d): last zlib error: %s\n", - msg, - ret, - zs->msg?zs->msg:"unknown"); - perror("errno:"); - exit(1); -} - -static int writer_zlibdeflate_write(writer_t*writer, void* data, int len) -{ - struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal; - int ret; - - if(!z) { - fprintf(stderr, "zlib not initialized!\n"); - return 0; - } - if(!len) - return 0; - - z->zs.next_in = (Bytef *)data; - z->zs.avail_in = len; - - while(1) { - ret = deflate(&z->zs, Z_NO_FLUSH); - - if (ret != Z_OK) zlib_error(ret, "bitio:deflate_deflate", &z->zs); - - if(z->zs.next_out != z->writebuffer) { - z->zwritten += z->zs.next_out - (Bytef*)z->writebuffer; - z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer); - z->zs.next_out = z->writebuffer; - z->zs.avail_out = ZLIB_BUFFER_SIZE; - } - - if(!z->zs.avail_in) { - break; - } - } - z->written += len; - return len; -} -static void writer_zlibdeflate_finish(writer_t*writer) -{ - struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal; - writer_t*output; - int ret; - if(!z) - return; - output= z->output; - while(1) { - ret = deflate(&z->zs, Z_FINISH); - if (ret != Z_OK && - ret != Z_STREAM_END) zlib_error(ret, "bitio:deflate_finish", &z->zs); - - if(z->zs.next_out != z->writebuffer) { - z->zwritten += z->zs.next_out - (Bytef*)z->writebuffer; - z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer); - z->zs.next_out = z->writebuffer; - z->zs.avail_out = ZLIB_BUFFER_SIZE; - } - - if (ret == Z_STREAM_END) { - break; - - } - } - ret = deflateEnd(&z->zs); - if (ret != Z_OK) zlib_error(ret, "bitio:deflate_end", &z->zs); - - if(z->written) { - printf("Compression ratio: %.2f%% (%d bytes of input data, %d bytes of output data)\n", - z->zwritten*100.0 / z->written, - z->written, z->zwritten); - } else { - printf("Compression ratio: 0%% (0 bytes of input data, %d bytes of output data)\n", z->zwritten); - } - - free(writer->internal); - memset(writer, 0, sizeof(writer_t)); - output->finish(output); -} -writer_t*writer_init_zwriter(writer_t*output) -{ - writer_t*w = malloc(sizeof(writer_t)); - struct zlibdeflate_t*z; - int ret; - memset(w, 0, sizeof(writer_t)); - z = (struct zlibdeflate_t*)malloc(sizeof(struct zlibdeflate_t)); - memset(z, 0, sizeof(struct zlibdeflate_t)); - w->internal = z; - w->write = writer_zlibdeflate_write; - w->finish = writer_zlibdeflate_finish; - z->output = output; - memset(&z->zs,0,sizeof(z_stream)); - z->zs.zalloc = Z_NULL; - z->zs.zfree = Z_NULL; - z->zs.opaque = Z_NULL; - ret = deflateInit(&z->zs, 9); - if (ret != Z_OK) zlib_error(ret, "bitio:deflate_init", &z->zs); - z->zs.next_out = z->writebuffer; - z->zs.avail_out = ZLIB_BUFFER_SIZE; - z->written = 0; - z->zwritten = 0; - return w; -} - -/* ------------------------------- main ----------- ------------------------------- */ - -static int compare_filenames(const void*_n1, const void*_n2) -{ - const char*s1 = *(const char**)_n1; - const char*s2 = *(const char**)_n2; - - char*e1 = strrchr(s1, '.'); - char*e2 = strrchr(s2, '.'); - if(!e1 && !e2) - return 0; - if(e1 && !e2) - return 1; - if(!e1 && e2) - return -1; - int c = strcasecmp(e1+1,e2+1); - if(c) - return c; - return strcasecmp(s1,s2); -} - -int main (int argn, char*argv[]) -{ - int t; - char buf[320]; - int num = 0; - - int fullsize = 0; - for(t=1;t>8; - unsigned char n3=num>>16; - unsigned char n4=num>>24; - zwriter->write(zwriter,&n1,1); - zwriter->write(zwriter,&n2,1); - zwriter->write(zwriter,&n3,1); - zwriter->write(zwriter,&n4,1); - - qsort(argv+1, argn-1, sizeof(argv[0]), compare_filenames); - - for(t=1;twrite(zwriter,id,3); - unsigned char b1=l; - unsigned char b2=l>>8; - unsigned char b3=l>>16; - unsigned char b4=l>>24; - zwriter->write(zwriter,&b1,1); - zwriter->write(zwriter,&b2,1); - zwriter->write(zwriter,&b3,1); - zwriter->write(zwriter,&b4,1); - int sl=strlen(argv[t]); - if(sl>255) { - fprintf(stderr, "Error: filename %s too long\n", argv[t]); - } - unsigned char b = sl; - zwriter->write(zwriter,&b,1); //write filename len - zwriter->write(zwriter,argv[t],sl); //write filename - zwriter->write(zwriter,buf,l); //write data - fprintf(stderr,"[%s] %s: %d bytes written.\n", id, argv[t], l); - fclose(fi); - free(buf); - } - else - { - fprintf(stderr,"%s not found.\n", argv[t]); - } - } - } - char*id_end = "END"; - zwriter->write(zwriter,id_end,3); - zwriter->finish(zwriter); - -#ifndef ZLIB - if(system("do_lzma e crnfiles.dat crnfiles.7z")&0xff00) { - perror("do_lzma"); - exit(1); - } - FILE*fi = fopen("crnfiles.7z", "rb"); - if(!fi) { - perror("crnfiles.7z"); - exit(1); - } - writer_t*w = writer_init_includewriter("crnfiles.c"); - while(!feof(fi)) { - char buf[4096]; - int len = fread(buf,1,4096,fi); - if(!len) - break; - w->write(w, buf, len); - } - w->finish(w); - fclose(fi); - if(unlink("crnfiles.dat")) { - perror("crnfiles.dat"); - exit(1); - } - if(unlink("crnfiles.7z")) { - perror("crnfiles.7z"); - exit(1); - } -#endif - - fi = fopen("crnfiles.c", "ab+"); - fprintf(fi, "\nint crn_decompressed_size=%d;\n", fullsize); - fclose(fi); - - return 0; -} -