/* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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 #include #include // Convert input files to .h files consisting of hex arrays int main(int argc, char *argv[]) { if(argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); fprintf(stderr, " Convert 'file.png' file to C table 'file_png.h'.\n"); return 1; } for(argc--; argc > 0; argc--) { FILE *in; FILE *out; char variable[1024], header_fn[1024], output_fn[1024], *suffix, *prefix; int i; int bytes_per_row = 16; char row[1024], byte[1024]; struct stat st; long total_bytes; in = fopen(argv[argc], "rb"); if(!in) continue; stat(argv[argc], &st); total_bytes = (long)st.st_size; // Replace . with _png and append .h to filename strcpy(output_fn, argv[argc]); suffix = strrchr(output_fn, '.'); if(suffix) *suffix = '_'; strcat(output_fn, ".h"); // Strip leading directories for variable and header prefix = strrchr(output_fn, '/'); if(!prefix) prefix = output_fn; else prefix++; out = fopen(prefix, "w"); if(!out) { fclose(in); fprintf(stderr, "error: unable to write to %s: %s\n", prefix, strerror(errno)); continue; } strcpy(header_fn, prefix); for(i = 0; i < strlen(header_fn); i++) { // Replace leading digits if(i == 0 && isdigit(header_fn[i])) { int k; for(k = strlen(header_fn); k >= 0; k--) { header_fn[k + 1] = header_fn[k]; } header_fn[0] = '_'; } // Replace . with _ for header if(header_fn[i] == '.') header_fn[i] = '_'; else header_fn[i] = toupper(header_fn[i]); } // Strip .h for variable strcpy(variable, prefix); suffix = strrchr(variable, '.'); if(suffix) *suffix = 0; // Replace leading digits if(isdigit(variable[0])) { int k; for(k = strlen(variable); k >= 0; k--) { variable[k + 1] = variable[k]; } variable[0] = '_'; } // Print the header fprintf(out, "#ifndef %s\n" "#define %s\n" "\n" "static unsigned char %s[] =\n{\n", header_fn, header_fn, variable); // Print the size of the file fprintf(out, "\t0x%02x, 0x%02x, 0x%02x, 0x%02x,\n", (int)(total_bytes >> 24) & 0xff, (int)(total_bytes >> 16) & 0xff, (int)(total_bytes >> 8) & 0xff, (int)(total_bytes & 0xff)); while(total_bytes > 0) { sprintf(row, "\t"); for(i = 0; i < bytes_per_row && total_bytes > 0; i++) { if(i == 0) sprintf(byte, "0x%02x", fgetc(in)); else sprintf(byte, ", 0x%02x", fgetc(in)); strcat(row, byte); total_bytes--; } if(total_bytes > 0) sprintf(byte, ",\n"); else sprintf(byte, "\n"); fprintf(out, "%s%s", row, byte); } fprintf(out, "};\n\n#endif\n"); fclose(out); fclose(in); } }