/* infochar.c V1.1
 *
 * Display Infocom character font.
 *
 * Only used with Beyond Zork. Font file is appended to story file. Define
 * BYTESWAPPED if the font file came from a byteswapped machine.
 *
 * Usage: infochar font-file-name
 *
 * Mark Howell 26 August 1992 howell_ma@movies.enet.dec.com
 *
 * History:
 *    Remove initial size word and add byteswapped support
 *
 */

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

#define COLUMNS 4

typedef struct header {
    short glyphs;
    short offset;
    char width;
    char height;
    unsigned char filler [26];
} header_t;

#ifdef __STDC__
int main (int argc, char *argv[])
#else
int main (argc, argv)
int argc;
char *argv[];
#endif
{
    FILE *fp;
    unsigned char *data;
    header_t header;
    int glyph, i, j, k;

    if (argc != 2) {
        printf ("Usage: %s file-name\n", argv [0]);
        exit (EXIT_FAILURE);
    }

    if ((fp = fopen (argv [1], "rb")) == NULL) {
        perror (argv [0]);
        exit (EXIT_FAILURE);
    }

    if (fread (&header, sizeof (header), 1, fp) != 1) {
        printf ("%s: header read failed\n", argv [0]);
        exit (EXIT_FAILURE);
    }
#if defined(BYTESWAPPED)
    header.glyphs = ((header.glyphs & 0xff) << 8) + ((header.glyphs >> 8) & 0xff);
    header.offset = ((header.offset & 0xff) << 8) + ((header.offset >> 8) & 0xff);
#endif
    if (header.width != 8) {
        printf ("%s: glyphs of width (%d) not equal to 8 are not handled\n", argv [0], header.width);
        exit (EXIT_FAILURE);
    }

    data = (unsigned char *) malloc (header.glyphs * header.height);
    if (data == NULL) {
        printf ("%s: cannot allocate memory\n", argv [0]);
        exit (EXIT_FAILURE);
    }

    if (fread (data, header.glyphs * header.height, 1, fp) != 1) {
        printf ("%s: file read failed\n", argv [0]);
        exit (EXIT_FAILURE);
    }

    printf ("%d (%dx%d) glyphs loaded at offset %d\n\n",
            header.glyphs, header.width, header.height, header.offset);

    for (glyph = 0; glyph < header.glyphs; glyph += COLUMNS) {
        for (i = -1; i < header.height; i++) {
            for (j = 0; j < COLUMNS; j++) {
                if (j)
                    printf ("  ");
                if (i < 0) {
                    printf ("%3.0d(", glyph + j + header.offset);
                    if (isprint (glyph + j + header.offset))
                        printf ("%c):  76543210", glyph + j + header.offset);
                    else
                        printf (" ):  76543210");
                } else {
                    printf ("        %1.0d", i);
                    for (k = 0; k < header.width; k++) {
                        if (*(data + (j * header.height) + i) & (unsigned char) (1 << (header.width - k - 1)))
                            printf ("*");
                        else
                            printf (" ");
                    }
                }
            }
            printf ("\n");
        }
        data += header.height * COLUMNS;
    }
    free (data);
    fclose (fp);

    exit (EXIT_SUCCESS);
    return (0);

}/* main */
