8 #define ZLIB_BUFFER_SIZE 16384
10 typedef struct _writer
12 int (*write)(struct _writer*, void*data, int len);
13 void (*finish)(struct _writer*);
17 /* ---------------------------- file writer ------------------------------- */
23 static int writer_filewrite_write(writer_t*w, void* data, int len)
25 filewrite_t * fw= (filewrite_t*)w->internal;
26 return fwrite(data, len, 1, fw->fi);
28 static void writer_filewrite_finish(writer_t*w)
30 filewrite_t *mr = (filewrite_t*)w->internal;
33 memset(w, 0, sizeof(writer_t));
35 writer_t*writer_init_filewriter(char*filename)
37 writer_t*w = malloc(sizeof(writer_t));
38 FILE*fi = fopen(filename, "wb");
39 filewrite_t *mr = (filewrite_t *)malloc(sizeof(filewrite_t));
41 memset(w, 0, sizeof(writer_t));
42 w->write = writer_filewrite_write;
43 w->finish = writer_filewrite_finish;
48 /* ---------------------------- include file filter ------------------------------- */
50 typedef struct _ifwrite
60 static int writer_ifwrite_write(writer_t*out, void*data, int len)
62 ifwrite_t*i = (ifwrite_t*)out->internal;
66 unsigned char c = ((unsigned char*)data)[t];
68 fprintf(fo, "\"%s\"\n", i->buf);
71 if(c<=32 || c>0x7e || c=='"' || c == '\\' || c == '%'
72 || (i->last && c>='0' && c<='9')
73 || (i->last && c>='a' && c<='f')
74 || (i->last && c>='A' && c<='F')
76 i->bp += sprintf(i->buf+i->bp, "\\x%x",c);
87 static void writer_ifwrite_finish(writer_t*w)
89 ifwrite_t *i= (ifwrite_t*)w->internal;
90 fprintf(i->fi, "\"%s\"\n", i->buf);
91 fprintf(i->fi, ";\n");
92 fprintf(i->fi, "int crndata_len = %d;\n", i->pos);
94 printf("wrote file %s\n", i->filename);
95 free(w->internal);w->internal = 0;
98 writer_t*writer_init_includewriter(char*filename)
100 writer_t*w = malloc(sizeof(writer_t));
101 FILE*fi = fopen(filename, "wb");
102 memset(w, 0, sizeof(writer_t));
103 w->write = writer_ifwrite_write;
104 w->finish = writer_ifwrite_finish;
105 ifwrite_t*i = (ifwrite_t *)malloc(sizeof(ifwrite_t));
110 i->filename = filename;
113 fprintf(i->fi, "char* crndata =\n");
118 /* ---------------------------- zlibdeflate writer -------------------------- */
126 unsigned char writebuffer[ZLIB_BUFFER_SIZE];
129 static void zlib_error(int ret, char* msg, z_stream*zs)
131 fprintf(stderr, "%s: zlib error (%d): last zlib error: %s\n",
134 zs->msg?zs->msg:"unknown");
139 static int writer_zlibdeflate_write(writer_t*writer, void* data, int len)
141 struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal;
145 fprintf(stderr, "zlib not initialized!\n");
151 z->zs.next_in = (Bytef *)data;
152 z->zs.avail_in = len;
155 ret = deflate(&z->zs, Z_NO_FLUSH);
157 if (ret != Z_OK) zlib_error(ret, "bitio:deflate_deflate", &z->zs);
159 if(z->zs.next_out != z->writebuffer) {
160 z->zwritten += z->zs.next_out - (Bytef*)z->writebuffer;
161 z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer);
162 z->zs.next_out = z->writebuffer;
163 z->zs.avail_out = ZLIB_BUFFER_SIZE;
166 if(!z->zs.avail_in) {
173 static void writer_zlibdeflate_finish(writer_t*writer)
175 struct zlibdeflate_t*z = (struct zlibdeflate_t*)writer->internal;
182 ret = deflate(&z->zs, Z_FINISH);
184 ret != Z_STREAM_END) zlib_error(ret, "bitio:deflate_finish", &z->zs);
186 if(z->zs.next_out != z->writebuffer) {
187 z->zwritten += z->zs.next_out - (Bytef*)z->writebuffer;
188 z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer);
189 z->zs.next_out = z->writebuffer;
190 z->zs.avail_out = ZLIB_BUFFER_SIZE;
193 if (ret == Z_STREAM_END) {
198 ret = deflateEnd(&z->zs);
199 if (ret != Z_OK) zlib_error(ret, "bitio:deflate_end", &z->zs);
202 printf("Compression ratio: %.2f%% (%d bytes of input data, %d bytes of output data)\n",
203 z->zwritten*100.0 / z->written,
204 z->written, z->zwritten);
206 printf("Compression ratio: 0%% (0 bytes of input data, %d bytes of output data)\n", z->zwritten);
209 free(writer->internal);
210 memset(writer, 0, sizeof(writer_t));
211 output->finish(output);
213 writer_t*writer_init_zwriter(writer_t*output)
215 writer_t*w = malloc(sizeof(writer_t));
216 struct zlibdeflate_t*z;
218 memset(w, 0, sizeof(writer_t));
219 z = (struct zlibdeflate_t*)malloc(sizeof(struct zlibdeflate_t));
220 memset(z, 0, sizeof(struct zlibdeflate_t));
222 w->write = writer_zlibdeflate_write;
223 w->finish = writer_zlibdeflate_finish;
225 memset(&z->zs,0,sizeof(z_stream));
226 z->zs.zalloc = Z_NULL;
227 z->zs.zfree = Z_NULL;
228 z->zs.opaque = Z_NULL;
229 ret = deflateInit(&z->zs, 9);
230 if (ret != Z_OK) zlib_error(ret, "bitio:deflate_init", &z->zs);
231 z->zs.next_out = z->writebuffer;
232 z->zs.avail_out = ZLIB_BUFFER_SIZE;
238 /* ------------------------------- main ----------- ------------------------------- */
240 static int compare_filenames(const void*_n1, const void*_n2)
242 const char*s1 = *(const char**)_n1;
243 const char*s2 = *(const char**)_n2;
245 char*e1 = strrchr(s1, '.');
246 char*e2 = strrchr(s2, '.');
253 int c = strcasecmp(e1+1,e2+1);
256 return strcasecmp(s1,s2);
259 int main (int argn, char*argv[])
270 FILE*fi=fopen(argv[t],"rb");
272 fseek(fi,0,SEEK_END);
283 writer_t*include_writer = writer_init_includewriter("crnfiles.c");
284 writer_t*zwriter = writer_init_zwriter(include_writer);
286 unlink("crnfiles.dat");
287 unlink("crnfiles.7z");
288 unlink("crnfiles.c");
289 writer_t*zwriter = writer_init_filewriter("crnfiles.dat");
291 unsigned char n1=num;
292 unsigned char n2=num>>8;
293 unsigned char n3=num>>16;
294 unsigned char n4=num>>24;
295 zwriter->write(zwriter,&n1,1);
296 zwriter->write(zwriter,&n2,1);
297 zwriter->write(zwriter,&n3,1);
298 zwriter->write(zwriter,&n4,1);
300 qsort(argv+1, argn-1, sizeof(argv[0]), compare_filenames);
306 FILE*fi=fopen(argv[t],"rb");
309 fseek(fi,0,SEEK_END);
311 fseek(fi,0,SEEK_SET);
313 char*buf=(char*)malloc(l);
316 fstat(fileno(fi),&st);
317 if(S_ISDIR(st.st_mode)) {id ="DIR";l=0;}
318 else if(strstr(argv[t],".swf")) id="SWF";
319 else if(strstr(argv[t],".gif")) id="PIC";
320 else if(strstr(argv[t],".png")) id="PIC";
321 else if(strstr(argv[t],".jpeg")) id="PIC";
322 else if(strstr(argv[t],".jpg")) id="PIC";
323 else if(strstr(argv[t],".tif")) id="PIC";
324 else if(strstr(argv[t],".c")) id="SRC";
325 else if(strstr(argv[t],".cc")) id="SRC";
326 else if(strstr(argv[t],".cpp")) id="SRC";
327 else if(strstr(argv[t],".h")) id="SRC";
328 else if(strstr(argv[t],".class")) id="CLA";
329 else if(strstr(argv[t],".java")) id="SRC";
330 else if(strstr(argv[t],".exe")) id="EXE";
331 else if(strstr(argv[t],".ttf")) id="FON";
332 else if(strstr(argv[t],".pfa")) id="FON";
333 else if(strstr(argv[t],".pfb")) id="FON";
334 else if(strstr(argv[t],".afm")) id="FON";
335 else if(strstr(argv[t],".1")) id="DOC";
336 else if(strstr(argv[t],".doc")) id="DOC";
337 else if(strstr(argv[t],".hlp")) id="DOC";
338 else if(strstr(argv[t],".dll")) id="DLL";
341 zwriter->write(zwriter,id,3);
343 unsigned char b2=l>>8;
344 unsigned char b3=l>>16;
345 unsigned char b4=l>>24;
346 zwriter->write(zwriter,&b1,1);
347 zwriter->write(zwriter,&b2,1);
348 zwriter->write(zwriter,&b3,1);
349 zwriter->write(zwriter,&b4,1);
350 int sl=strlen(argv[t]);
352 fprintf(stderr, "Error: filename %s too long\n", argv[t]);
354 unsigned char b = sl;
355 zwriter->write(zwriter,&b,1); //write filename len
356 zwriter->write(zwriter,argv[t],sl); //write filename
357 zwriter->write(zwriter,buf,l); //write data
358 fprintf(stderr,"[%s] %s: %d bytes written.\n", id, argv[t], l);
364 fprintf(stderr,"%s not found.\n", argv[t]);
369 zwriter->write(zwriter,id_end,3);
370 zwriter->finish(zwriter);
373 if(system("do_lzma e crnfiles.dat crnfiles.7z")&0xff00) {
377 FILE*fi = fopen("crnfiles.7z", "rb");
379 perror("crnfiles.7z");
382 writer_t*w = writer_init_includewriter("crnfiles.c");
385 int len = fread(buf,1,4096,fi);
388 w->write(w, buf, len);
392 if(unlink("crnfiles.dat")) {
393 perror("crnfiles.dat");
396 if(unlink("crnfiles.7z")) {
397 perror("crnfiles.7z");
402 fi = fopen("crnfiles.c", "ab+");
403 fprintf(fi, "\nint crn_decompressed_size=%d;\n", fullsize);