X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=installer%2Fmkarchive.c;h=7dab4e02afad8c0a4f2080caaaa88f10dddcc8a8;hp=c9c0d4919d2bb532d72bdfea16a4114e8c0dad40;hb=c63b2bf21dc1df9a736f0b4c08f6cba828cdab92;hpb=600a954f3e432f54de728242eebf564cd13c0f48 diff --git a/installer/mkarchive.c b/installer/mkarchive.c index c9c0d49..7dab4e0 100644 --- a/installer/mkarchive.c +++ b/installer/mkarchive.c @@ -1,3 +1,23 @@ +/* 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 @@ -14,6 +34,41 @@ typedef 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"); + if(!fi) { + perror(filename); + return 0; + } + 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 @@ -58,6 +113,7 @@ 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; @@ -108,6 +164,7 @@ 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; @@ -227,9 +284,42 @@ 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); @@ -255,6 +345,7 @@ int main (int argn, char*argv[]) else if(strstr(argv[t],".jpeg")) id="PIC"; else if(strstr(argv[t],".jpg")) id="PIC"; else if(strstr(argv[t],".tif")) id="PIC"; + else if(strstr(argv[t],".ico")) id="PIC"; else if(strstr(argv[t],".c")) id="SRC"; else if(strstr(argv[t],".cc")) id="SRC"; else if(strstr(argv[t],".cpp")) id="SRC"; @@ -268,14 +359,27 @@ int main (int argn, char*argv[]) else if(strstr(argv[t],".afm")) id="FON"; else if(strstr(argv[t],".1")) id="DOC"; else if(strstr(argv[t],".doc")) id="DOC"; + else if(strstr(argv[t],".txt")) id="TXT"; else if(strstr(argv[t],".hlp")) id="DOC"; else if(strstr(argv[t],".dll")) id="DLL"; fread(buf,l,1,fi); zwriter->write(zwriter,id,3); - zwriter->write(zwriter,&l,4); + 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]); - zwriter->write(zwriter,argv[t],sl+1); //write filename + 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); @@ -287,6 +391,44 @@ int main (int argn, char*argv[]) } } } + 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; }