/* * fontconv converts a byte-aligned font file into a psf file. */ #include #include #include "psf.h" PSF_header header = { PSF_MAGIC, PSF_MODE, 0 }; int isize = -1; /* # scanlines in input charset */ int osize = -1; /* # scanlines in output charset */ int offset = 0; /* offset input character into output cell */ int fill = 0; /* fill past eof with nulls instead of death */ int pad = 0; /* prefix with null characters */ enum filetype { font=0,psf=1,ascii=2 } ; enum filetype ifmt = font; enum filetype ofmt = psf; FILE *input = stdin; FILE *output = stdout; FILE * openfile(char *name, char *mode) { FILE *tmp; if (tmp = fopen(name, mode)) return tmp; fprintf(stderr, "fontconv: cannot open %s (mode %s)\n", name, mode); exit(3); } enum filetype format(char *fmt) { if (strcasecmp(fmt, "font") == 0) return font; else if (strcasecmp(fmt, "psf") == 0) return psf; else if (strcasecmp(fmt, "ascii") == 0) return ascii; fprintf(stderr, "fontconv: can't handle font format %s\n", fmt); exit(3); } int yesno(char *fmt) { if (strcasecmp(fmt, "yes") == 0 || strcasecmp(fmt, "true") == 0) return 1; else if (strcasecmp(fmt, "no") == 0 || strcasecmp(fmt, "false") == 0) return 0; fprintf(stderr, "fontconv: fill must be either YES or NO\n"); exit(3); } readchar(char* character, int isize, FILE* input) { int x, y; char bfr[80]; switch (ifmt) { case ascii: do { if (fgets(bfr, 80, input) == 0) return 0; } while (bfr[0] != '%'); x = 0; do { if (x < isize) { character[x] = 0; for (y=0; y<8; y++) if (bfr[(y+y)+2] == '@' || bfr[(y+y)+2] == '#') character[x] |= (1<= isize); default: return fread(character, isize, 1, input) == 1; } } writechar(char *character, int osize, FILE* output) { int x, y; char bfr[80]; switch (ofmt) { case ascii: putc('\n', output); for (x=0; x psf-font\n"); exit(1); } for (i=1; i 32) { fprintf(stderr, "fontconv: dubious isize -- bailing out\n"); exit(2); } if (osize < 0) osize = isize; else if (osize > 32) { fprintf(stderr, "fontconv: dubious osize -- bailing out\n"); exit(2); } if (ofmt == psf) { header.size = osize; fwrite(&header, sizeof header, 1, output); } memset(character, 0, osize); for (i=0; i-offset; --j) character[j] = character[j+offset]; for (j=0; j <= -offset; ) character[j++] = 0; } else if (offset > 0) { int j; for (j=0; i