static void loadnewfont(int fd, char *ifil, int iunit, int hwunit, int no_m, int no_u) { lkfile_t fp; char defname[20]; int height, width, bytewidth, def = 0; char *inbuf, *fontbuf; int inputlth, fontbuflth, fontsize, offset; struct unicode_list *uclistheads; if (!*ifil) { /* try to find some default file */ def = 1; /* maybe also load default unimap */ if (iunit < 0 || iunit > 32) iunit = 0; if (iunit == 0) { if (findfont(ifil = "default", &fp) && findfont(ifil = "default8x16", &fp) && findfont(ifil = "default8x14", &fp) && findfont(ifil = "default8x8", &fp)) { fprintf(stderr, _("Cannot find default font\n")); exit(EX_NOINPUT); } } else { sprintf(defname, "default8x%d", iunit); if (findfont(ifil = defname, &fp) && findfont(ifil = "default", &fp)) { fprintf(stderr, _("Cannot find %s font\n"), ifil); exit(EX_NOINPUT); } } } else { if (findfont(ifil, &fp)) { fprintf(stderr, _("Cannot open font file %s\n"), ifil); exit(EX_NOINPUT); } } if (verbose > 1) printf(_("Reading font file %s\n"), ifil); inbuf = fontbuf = NULL; inputlth = fontbuflth = fontsize = 0; width = 8; uclistheads = NULL; if(readpsffont(fp.fd, &inbuf, &inputlth, &fontbuf, &fontbuflth, &width, &fontsize, 0, no_u ? NULL : &uclistheads) == 0) { lk_fpclose(&fp); /* we've got a psf font */ bytewidth = (width+7) / 8; height = fontbuflth / (bytewidth * fontsize); do_loadfont(fd, fontbuf, width, height, hwunit, fontsize, fp.pathname); if (uclistheads && !no_u) do_loadtable(fd, uclistheads, fontsize); #if 1 if (!uclistheads && !no_u && def) loadunicodemap(fd, "def.uni"); #endif return; } lk_fpclose(&fp); // avoid zombies, [email protected] (#88501) /* instructions to combine fonts? */ { char *combineheader = "# combine partial fonts\n"; int chlth = strlen(combineheader); char *p, *q; if (inputlth >= chlth && !strncmp(inbuf, combineheader, chlth)) { char *ifiles[MAXIFILES]; int ifilct = 0; q = inbuf + chlth; while(q < inbuf + inputlth) { p = q; while (q < inbuf+inputlth && *q != '\n') q++; if (q == inbuf+inputlth) { fprintf(stderr, _("No final newline in combine file\n")); exit(EX_DATAERR); } *q++ = 0; if (ifilct == MAXIFILES) { fprintf(stderr, _("Too many files to combine\n")); exit(EX_DATAERR); } ifiles[ifilct++] = p; } /* recursive call */ loadnewfonts(fd, ifiles, ifilct, iunit, hwunit, no_m, no_u); return; } } /* file with three code pages? */ if (inputlth == 9780) { offset = position_codepage(iunit); height = iunit; fontsize = 256; width = 8; } else if (inputlth == 32768) { /* restorefont -w writes a SVGA font to file restorefont -r restores it These fonts have size 32768, for two 512-char fonts. In fact, when BROKEN_GRAPHICS_PROGRAMS is defined, and it always is, there is no default font that is saved, so probably the second half is always garbage. */ fprintf(stderr, _("Hmm - a font from restorefont? " "Using the first half.\n")); inputlth = 16384; /* ignore rest */ fontsize = 512; offset = 0; width = 8; height = 32; if (!hwunit) hwunit = 16; } else { int rem = (inputlth % 256); if (rem == 0 || rem == 40) { /* 0: bare code page bitmap */ /* 40: preceded by .cp header */ /* we might check some header details */ offset = rem; } else { fprintf(stderr, _("Bad input file size\n")); exit(EX_DATAERR); } fontsize = 256; width = 8; height = inputlth/256; } do_loadfont(fd, inbuf+offset, width, height, hwunit, fontsize, fp.pathname); }
int main(int argc, char **argv) { const char *ifname, *ofname, *itname, *otname; FILE *ifil, *ofil, *itab, *otab; int psftype, charsize, fontlen, hastable, notable; int i; int width = 8, bytewidth, height; char *inbuf, *fontbuf; int inbuflth, fontbuflth; set_progname(argv[0]); setlocale(LC_ALL, ""); bindtextdomain(PACKAGE_NAME, LOCALEDIR); textdomain(PACKAGE_NAME); if (argc == 2 && !strcmp(argv[1], "-V")) print_version_and_exit(); ifil = ofil = itab = otab = NULL; ifname = ofname = itname = otname = NULL; fontbuf = NULL; notable = 0; if (!strcmp(get_progname(), "psfaddtable")) { /* Do not send binary data to stdout without explicit "-" */ if (argc != 4) { char *u = _("Usage:\n\t%s infont intable outfont\n"); fprintf(stderr, u, get_progname()); exit(EX_USAGE); } ifname = argv[1]; itname = argv[2]; ofname = argv[3]; } else if (!strcmp(get_progname(), "psfgettable")) { if (argc < 2 || argc > 3) { char *u = _("Usage:\n\t%s infont [outtable]\n"); fprintf(stderr, u, get_progname()); exit(EX_USAGE); } ifname = argv[1]; otname = (argc == 3) ? argv[2] : "-"; } else if (!strcmp(get_progname(), "psfstriptable")) { /* Do not send binary data to stdout without explicit "-" */ if (argc != 3) { char *u = _("Usage:\n\t%s infont outfont\n"); fprintf(stderr, u, get_progname()); exit(EX_USAGE); } ifname = argv[1]; ofname = argv[2]; notable = 1; } else { for (i = 1; i < argc; i++) { if ((!strcmp(argv[i], "-i") || !strcmp(argv[i], "-if")) && i < argc - 1) ifname = argv[++i]; else if ((!strcmp(argv[i], "-o") || !strcmp(argv[i], "-of")) && i < argc - 1) ofname = argv[++i]; else if (!strcmp(argv[i], "-it") && i < argc - 1) itname = argv[++i]; else if (!strcmp(argv[i], "-ot") && i < argc - 1) otname = argv[++i]; else if (!strcmp(argv[i], "-nt")) notable = 1; else break; } if (i < argc || argc <= 1) { char *u = _("Usage:\n\t%s [-i infont] [-o outfont] " "[-it intable] [-ot outtable] [-nt]\n"); fprintf(stderr, u, get_progname()); exit(EX_USAGE); } } if (!ifname) ifname = "-"; if (!strcmp(ifname, "-")) ifil = stdin; else { ifil = fopen(ifname, "r"); if (!ifil) { perror(ifname); exit(EX_NOINPUT); } } if (!itname) /* nothing */; else if (!strcmp(itname, "-")) itab = stdin; else { itab = fopen(itname, "r"); if (!itab) { perror(itname); exit(EX_NOINPUT); } } /* Refuse ifil == itab == stdin ? Perhaps not. */ if (!ofname) /* nothing */; else if (!strcmp(ofname, "-")) ofil = stdout; else { ofil = fopen(ofname, "w"); if (!ofil) { perror(ofname); exit(EX_CANTCREAT); } } if (!otname) /* nothing */; else if (!strcmp(otname, "-")) otab = stdout; else { otab = fopen(otname, "w"); if (!otab) { perror(otname); exit(EX_CANTCREAT); } } if (readpsffont(ifil, &inbuf, &inbuflth, &fontbuf, &fontbuflth, &width, &fontlen, 0, itab ? NULL : &uclistheads) == -1) { char *u = _("%s: Bad magic number on %s\n"); fprintf(stderr, u, get_progname(), ifname); exit(EX_DATAERR); } fclose(ifil); charsize = fontbuflth / fontlen; bytewidth = (width + 7) / 8; if (!bytewidth) bytewidth = 1; height = charsize / bytewidth; hastable = (uclistheads != NULL); if (PSF1_MAGIC_OK((unsigned char *)inbuf)) { psftype = 1; } else if (PSF2_MAGIC_OK((unsigned char *)inbuf)) { psftype = 2; } else { char *u = _("%s: psf file with unknown magic\n"); fprintf(stderr, u, get_progname()); exit(EX_DATAERR); } if (itab) { read_itable(itab, fontlen, &uclistheads); fclose(itab); } if (otab) { struct unicode_list *ul; struct unicode_seq *us; const char *sep; if (!hastable) { char *u = _("%s: input font does not have an index\n"); fprintf(stderr, u, get_progname()); exit(EX_DATAERR); } fprintf(otab, "#\n# Character table extracted from font %s\n#\n", ifname); for (i = 0; i < fontlen; i++) { fprintf(otab, "0x%03x\t", i); sep = ""; ul = uclistheads[i].next; while (ul) { us = ul->seq; while (us) { fprintf(otab, "%sU+%04x", sep, us->uc); us = us->next; sep = ", "; } ul = ul->next; sep = " "; } fprintf(otab, "\n"); } fclose(otab); } if (ofil) { writepsffont(ofil, fontbuf, width, height, fontlen, psftype, notable ? NULL : uclistheads); fclose(ofil); } return EX_OK; }
static void loadnewfonts(int fd, char **ifiles, int ifilct, int iunit, int hwunit, int no_m, int no_u) { char *ifil, *inbuf, *fontbuf, *bigfontbuf; int inputlth, fontbuflth, fontsize, height, width, bytewidth; int bigfontbuflth, bigfontsize, bigheight, bigwidth; struct unicode_list *uclistheads; int i; lkfile_t fp; if (ifilct == 1) { loadnewfont(fd, ifiles[0], iunit, hwunit, no_m, no_u); return; } /* several fonts that must be merged */ /* We just concatenate the bitmaps - only allow psf fonts */ bigfontbuf = NULL; bigfontbuflth = 0; bigfontsize = 0; uclistheads = NULL; bigheight = 0; bigwidth = 0; for (i=0; i<ifilct; i++) { ifil = ifiles[i]; if (findfont(ifil, &fp) && findpartialfont(ifil, &fp)) { fprintf(stderr, _("Cannot open font file %s\n"), ifil); exit(EX_NOINPUT); } inbuf = fontbuf = NULL; inputlth = fontbuflth = 0; fontsize = 0; if(readpsffont(fp.fd, &inbuf, &inputlth, &fontbuf, &fontbuflth, &width, &fontsize, bigfontsize, no_u ? NULL : &uclistheads)) { fprintf(stderr, _("When loading several fonts, all " "must be psf fonts - %s isn't\n"), fp.pathname); lk_fpclose(&fp); exit(EX_DATAERR); } lk_fpclose(&fp); // avoid zombies, [email protected] (#88501) bytewidth = (width+7) / 8; height = fontbuflth / (bytewidth * fontsize); if (verbose) printf(_("Read %d-char %dx%d font from file %s\n"), fontsize, width, height, fp.pathname); if (bigheight == 0) bigheight = height; else if (bigheight != height) { fprintf(stderr, _("When loading several fonts, all " "must have the same height\n")); exit(EX_DATAERR); } if (bigwidth == 0) bigwidth = width; else if (bigwidth != width) { fprintf(stderr, _("When loading several fonts, all " "must have the same width\n")); exit(EX_DATAERR); } bigfontsize += fontsize; bigfontbuflth += fontbuflth; bigfontbuf = xrealloc(bigfontbuf, bigfontbuflth); memcpy(bigfontbuf+bigfontbuflth-fontbuflth, fontbuf, fontbuflth); } do_loadfont(fd, bigfontbuf, bigwidth, bigheight, hwunit, bigfontsize, NULL); if (uclistheads && !no_u) do_loadtable(fd, uclistheads, bigfontsize); }