+ /* image compress */
+ if (compression != COMP_NONE) {
+ const char *errstr = NULL;
+ unsigned char *compressed;
+ const char *comp_name;
+ struct stat st;
+ FILE *compfp;
+ size_t filename_len = strlen(filename);
+ char *compfilename = xmalloc(filename_len + 20);
+ char *compcmd = xmalloc(filename_len + 50);
+
+ sprintf(compfilename, "%s.bin", filename);
+ switch (compression) {
+ case COMP_GZIP:
+ strcpy(compcmd, "gzip");
+ comp_name = "GZIP";
+ break;
+ case COMP_LZMA:
+ strcpy(compcmd, "lzma");
+ comp_name = "LZMA";
+ break;
+ default:
+ errstr = "\nerror: unknown compression method";
+ goto done;
+ }
+ strcat(compcmd, " > ");
+ strcat(compcmd, compfilename);
+ compfp = popen(compcmd, "w");
+ if (!compfp) {
+ errstr = "\nerror: popen() failed";
+ goto done;
+ }
+ if (fwrite(image->data, image->size, 1, compfp) != 1) {
+ errstr = "\nerror: writing data to gzip failed";
+ goto done;
+ }
+ if (pclose(compfp)) {
+ errstr = "\nerror: gzip process failed";
+ goto done;
+ }
+
+ compfp = fopen(compfilename, "r");
+ if (!compfp) {
+ errstr = "\nerror: open() on gzip data failed";
+ goto done;
+ }
+ if (stat(compfilename, &st)) {
+ errstr = "\nerror: stat() on gzip file failed";
+ goto done;
+ }
+ compressed = xmalloc(st.st_size);
+ if (fread(compressed, st.st_size, 1, compfp) != 1) {
+ errstr = "\nerror: reading gzip data failed";
+ goto done;
+ }
+ fclose(compfp);
+
+ unlink(compfilename);
+
+ dataptr = compressed;
+ count = st.st_size;
+ fprintf(file, "#define EASYLOGO_ENABLE_%s %i\n\n", comp_name, count);
+ if (bss_storage)
+ fprintf (file, "static unsigned char EASYLOGO_DECOMP_BUFFER[%i];\n\n", image->size);
+
+ done:
+ free(compfilename);
+ free(compcmd);
+
+ if (errstr) {
+ perror (errstr);
+ return -1;
+ }
+ }
+