+/* 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>
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
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;
{
struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal;
int ret;
+
if(!z) {
fprintf(stderr, "zlib not initialized!\n");
return 0;
{
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);
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";
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);
}
}
}
+ 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;
}