summaryrefslogtreecommitdiff
path: root/src/icont/newhdr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/icont/newhdr.c')
-rw-r--r--src/icont/newhdr.c90
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;
+ }
+ }