diff options
Diffstat (limited to 'src/icont/newhdr.c')
-rw-r--r-- | src/icont/newhdr.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/icont/newhdr.c b/src/icont/newhdr.c new file mode 100644 index 0000000..7e23edb --- /dev/null +++ b/src/icont/newhdr.c @@ -0,0 +1,90 @@ +/* + * Intermediate program to convert iconx.hdr into a header file for inclusion + * in icont. This eliminates a compile-time file search on Unix systems. + * Definition of BinaryHeader activates the inclusion. + */ + +#include "../h/gsupport.h" + +void putbyte(FILE *fout, int b); + +int main(int argc, char *argv[]) + { + static const char Usage[] = "Usage %s [Filename]\n"; + int b, n; + char *ifile = NULL; + char *ofile = NULL; + FILE *fin, *fout; + + n = 1; + if (((n + 1) < argc) && !strcmp(argv[n], "-o")) { + ofile = argv[++n]; + ++n; + } + if (n < argc) + ifile = argv[n++]; + + if (ifile == NULL) + fin = stdin; + else if ((fin = fopen(ifile, "rb")) == NULL) { + fprintf(stderr, "Cannot open \"%s\" for input\n\n", ifile); + fprintf(stderr, Usage, argv[0]); + return EXIT_FAILURE; + } + + if (ofile == NULL) + fout = stdout; + else if ((fout = fopen(ofile, "w")) == NULL) { + fprintf(stderr, "Cannot open \"%s\" for output\n\n", ofile); + fprintf(stderr, Usage, argv[0]); + return EXIT_FAILURE; + } + + /* + * Create an array large enough to hold iconx.hdr (+1 for luck) + * This array shall be included by link.c (and is nominally called + * hdr.h) + */ + fprintf(fout, "static unsigned char iconxhdr[MaxHdr+1] = {\n"); + + /* + * Recreate iconx.hdr as a series of hex constants, padded with zero bytes. + */ + for (n = 0; (b = getc(fin)) != EOF; n++) + putbyte(fout, b); + + /* + * If header is to be used, make sure it fits. + */ + #ifdef BinaryHeader + if (n > MaxHdr) { + fprintf(stderr, "%s: file size is %d bytes but MaxHdr is only %d\n", + argv[0], n, MaxHdr); + if (ofile != NULL) { + fclose(fout); + unlink(ofile); + } + return EXIT_FAILURE; + } + #endif /* BinaryHeader */ + + while (n++ < MaxHdr) + putbyte(fout, 0); + fprintf(fout,"0x00};\n"); /* one more, sans comma, and finish */ + + return EXIT_SUCCESS; + } + +/* + * putbyte(b) - output byte b as two hex digits + */ +void putbyte(FILE *fout, int b) + { + static int n = 0; + + fprintf(fout, "0x%02x,", b & 0xFF); + if (++n == 16) { + fprintf(fout, "\n"); + n = 0; + } + } |