Embedding PNG Images-Bin2c In PHP
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
// convert a binary file into a C source vector
//
// put into the public domain by Sandro Sigala
//
// blatantly stolen and changed by Sabri Berisha <[email protected]>
// on 3/14/2006 to work with php
//
// syntax: bin2c [-c] [-z] <input_file> <output_file>
//
// -c add the "const" keyword to definition
// -z terminate the array with a zero (useful for embedded C strings)
//
// examples:
// bin2c -c myimage.png myimage_png.cpp
// bin2c -z sometext.txt sometext_txt.cpp
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef PATH_MAX
# define PATH_MAX 1024
#endif
int useconst = 0;
int zeroterminated = 0;
int myfgetc(FILE *f)
{
int c = fgetc(f);
if (c == EOF && zeroterminated) {
zeroterminated = 0;
return 0;
}
return c;
}
void process(const char *ifname, const char *ofname)
{
FILE *ifile, *ofile;
ifile = fopen(ifname, "rb");
if (ifile == NULL) {
fprintf(stderr, "cannot open %s for reading\n", ifname);
exit(1);
}
ofile = fopen(ofname, "wb");
if (ofile == NULL) {
fprintf(stderr, "cannot open %s for writing\n", ofname);
exit(1);
}
char buf[PATH_MAX], *p;
const char *cp;
if ((cp = strrchr(ifname, '/')) != NULL)
++cp;
else {
if ((cp = strrchr(ifname, '\\')) != NULL)
++cp;
else
cp = ifname;
}
strcpy(buf, cp);
for (p = buf; *p != '\0'; ++p)
if (!isalnum(*p))
*p = '_';
fprintf(ofile, "function show_%s() {\n", buf);
fprintf(ofile, "$%s = array(\n", buf);
int c, col = 1;
while ((c = myfgetc(ifile)) != EOF) {
if (col >= 78 - 6) {
fputc('\n', ofile);
col = 1;
}
fprintf(ofile, "0x%.2x, ", c);
col += 6;
}
fprintf(ofile, ");\n");
fprintf(ofile, "foreach(%s as $out)\n",buf);
fprintf(ofile, " printf(\"\%c\",$out);\n");
fprintf(ofile, "}\n");
fclose(ifile);
fclose(ofile);
}
void usage(void)
{
fprintf(stderr, "usage: bin2c [-cz] <input_file> <output_file>\n");
exit(1);
}
int main(int argc, char **argv)
{
while (argc > 3) {
if (!strcmp(argv[1], "-c")) {
useconst = 1;
--argc;
++argv;
} else if (!strcmp(argv[1], "-z")) {
zeroterminated = 1;
--argc;
++argv;
} else {
usage();
}
}
if (argc != 3) {
usage();
}
process(argv[1], argv[2]);
return 0;
}