fixed bug in jpeg2000 decoding
[swftools.git] / installer / mkarchive.c
index c9c0d49..7dab4e0 100644 (file)
@@ -1,3 +1,23 @@
+/* mkarchive.c
+
+   Part of the rfx installer (Main program).
+   
+   Copyright (c) 2004-2008 Matthias Kramm <kramm@quiss.org> 
+   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 <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -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<argn;t++)
+    {
+       if(argv[t][0]!='-')
+       {
+           FILE*fi=fopen(argv[t],"rb");
+           if(fi) {
+               fseek(fi,0,SEEK_END);
+               long l=ftell(fi);
+               fclose(fi);
+               fullsize += l;
+               num++;
+           }
+       }
+    }
+
 
+#ifdef ZLIB
     writer_t*include_writer = writer_init_includewriter("crnfiles.c");
     writer_t*zwriter = writer_init_zwriter(include_writer);
+#else //LZMA
+    unlink("crnfiles.dat");
+    unlink("crnfiles.7z");
+    unlink("crnfiles.c");
+    writer_t*zwriter = writer_init_filewriter("crnfiles.dat");
+#endif
+    unsigned char n1=num;
+    unsigned char n2=num>>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;
 }