Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
/*
 *  A possible workaround for broken "consolechars". Edrx, 2001feb06.
 * (find-es "console" "RH_consolechar_bug")
 *
 * (find-angg "MTA/vtutilsh.c" "setfont")
 * (find-node "(gcc)Macro Varargs")
 * (find-node "(libc)Error Messages")
 * (find-fline "/usr/doc/console-tools/file-formats/psf" "psf_header =")
 * (find-fline "/usr/include/")
 */

/* #include <sys/types.h> */
/* #include <sys/stat.h> */
#include <sys/ioctl.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/kd.h>
#include <errno.h>
#include <stdio.h>

#define errmsg strerror(errno)
#define errorif(cond, format, args...) \
  ((cond) && (fprintf(stderr,format"\n",##args), exit(1)))

int main(int argc, char **argv) {
  unsigned char b[256 * 32 + 4 + 1], buffer[512 * 32];
  struct consolefontdesc cfd;
  int nbytes, height, i, fd = open(argv[1], O_RDONLY);
    errorif(fd==-1, "Can't open %s: %s", argv[1], errmsg);
  nbytes = read(fd, b, 256 * 32 + 4 + 1); close(fd);
    errorif(b[0]!=0x36 || b[1]!=4 || b[2]!=0 || nbytes!=((height=b[3])*256+4),
      "Bad magic of file size: %02x %02x %02x %02x   %d (=0x%x) bytes or more",
      b[0], b[1], b[2], b[3], nbytes, nbytes);
  memset(buffer, 0, 512 * 32);
  for(i=0; i<256; ++i)
    memcpy(buffer + i*32, b + 4 + i*height, height);
  cfd.charheight = height;
  cfd.charcount = 256;
  cfd.chardata = buffer;
  errorif(ioctl(STDIN_FILENO, PIO_FONTX, &cfd), "PIO_FONTX error: %s", errmsg);
  return 0;
}