Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
#!/usr/bin/tclsh
#!/usr/bin/tclsh8.2
#!/usr/bin/tclsh8.3
#!/home/root/MTA/vtutilsh
#
# «.vcsa2pnm»		(to "vcsa2pnm")
# «.examples_of_usage»	(to "examples_of_usage")

if {[info commands setfont]==""} {
  load [file dirname [info script]]/vtutilsh.so Vtutil
}

# vtutil - modify/set Linux VC fonts, take pnm screenshots of VCs.
# Edrx, 99oct20; last changed 2001feb02
# This is a Tcl script using the vtutilsh extensions.
# (find-angg "MTA/vtutilsh.c")
# (find-angg "MTA/Makefile")
#
# vtutilsh.c defines these Tcl commands:
#
# change_char nchar chardata nchars nrows data  ->  newdata
# change_nchars    newnchars nchars nrows data  ->  newdata
# change_nrows      newnrows nchars nrows data  ->  newdata
# duplicate_rows        data                    ->  newdata
# setfont            channel nchars nrows data
# tobinary           rowdata rowdata ...        ->  chardata
# vcsa2pnmdata rgb0 rgb1 ... rgb15 nchars nrows fontdata vcsadata
#
# change_nchars and change_nrows aren't being used at this moment.

# (find-es "tcl" "mktclapp_objcom")
# (gdb "gdb -quiet -x ~/MTA/new2.gdb new2")
# (find-fline "~/MTA/")
# (find-fline "~/MTA/new2.c")
# (find-fline "~/MTA/new2.gdb")
# (find-fline "~/MTA/newtest.tcl")
# (find-fline "~/MTA/Makefile")
# (find-fline "~/MTA/test.tcl")

proc readfile {fname} {
  set channel [open $fname r]; set bigstr [read $channel]; close $channel
  return $bigstr
}
proc writefile {fname bigstr} {
  set channel [open $fname w]; puts -nonewline $channel $bigstr; close $channel
}

# Return ascii value of the first char in string
proc ord {str} {
  scan $str "%c" ord
  return $ord
}

set shuffle {}
proc shuffle {char} {
  global shuffle
  expr {$shuffle=="" ? $char : [string index $shuffle [ord $char]]}
}

proc transpose {lists} {
  set i 1
  foreach l [lindex $lists 0] {lappend is $i; incr i}
  foreach list $lists {foreach i $is elt $list {lappend T($i) $elt}}
  foreach i $is       {lappend transposed $T($i)}
  return $transposed
}
# Convert a string with many big chars into an array of bitmaps
proc crunch {str} {
  set lines [split $str "\n"]
  set blines {}
  set bitmaps {}
  foreach line $lines {
    if {[regexp {^\|(.*)\|$} $line -> line]} {
      lappend blines [split $line "|"]
    } elseif [regexp {\+--} $line] {
      if {$blines!=""} {
	eval lappend bitmaps [transpose $blines]
      }
      set blines {}
    } else {
      puts "?: $line"
      exit 1
    }
  }
  return $bitmaps
}

# Convert a row of (generally 8) chars to big chars
#
proc rowofbigchars {fontdata startchar nchars height width} {
  set charmatrices {}
  #
  # For each of the $nchars chars we're considering,
  for {set i 0} {$i<$nchars} {incr i} {
    set thischar_rows {}
    set cstart [expr ($startchar+$i)*$height]
    set bytes [string range $fontdata $cstart [expr $cstart+$height-1]]
    #
    # For each of the $height bytes this char takes in the font,
    foreach {byte} [split $bytes {}] {
      lappend thischar_rows [toasciirow $byte " " "o" 8]
    }
    lappend charmatrices $thischar_rows
  }
  set asciirows {}
  foreach {row} [transpose $charmatrices] {
    lappend asciirows "|[join $row "|"]|"
  }
  return $asciirows
}





#
# Functions callable by the user
#

proc 0..255 {} {
  for {set i 0; set s {}} {$i<256} {incr i} {append s [format %c $i]}
  puts -nonewline $s
}
proc setshuffle {fname} {
  global shuffle
  set shuffle [readfile $fname]
}
proc reorderfont {nchars nrows origfontname shufflefile newfontname} {
  setshuffle $shufflefile
  set origfont [readfile $origfontname]
  for {set i 0; set fontdata {}} {$i<$nchars} {incr i} {
    set offset [expr $nrows*[ord [shuffle [format %c $i]]]]
    append fontdata [string range $origfont $offset [expr $offset+$nrows-1]]
  }
  writefile $newfontname $fontdata
}

proc modifyfont {nchars nrows fontfname  newfontfname} {
  global charimages charchars
  set data [readfile $fontfname]
  foreach charmatrix $charimages destchar $charchars {
    if {$destchar!="."} {
      set destchar [shuffle $destchar]
      set chardata [eval tobinary $charmatrix]
      if {$nrows>=14} {set chardata [duplicate_rows $chardata]}
      # puts [string length $data]
      set data [change_char [ord $destchar] $chardata $nchars $nrows $data]
    }
  }
  writefile $newfontfname $data
}

# "setfont" sounds high-level, so we rename the C command to setfont0
rename setfont setfont0

# A hack: if we open /dev/tty or /dev/ttyn then the terminal settings
# are disturbed and "LF"s lose their implicit "CR"s... So we allow
# "file0" (stdin), "file1" (stdout) and "file2" (stderr) in place
# of the devfname, meaning: issue the ioctl on that file descriptor,
# without opening or closing anything. Edrx, 00jan28.
#
# (find-fline "/usr/include/unistd.h" "STDIN")
# (find-es "console" "avoiding_tty_reset")

proc setfont {nchars nrows fontfname  devfname} {
  if {[regexp "file" $devfname]} {
    puts "Using $devfname..."
    setfont0 $devfname $nchars $nrows [readfile $fontfname]
    return
  }
  set devfile [open $devfname {WRONLY NOCTTY NONBLOCK}]
  # I got the flags {WRONLY NOCTTY NONBLOCK} by trial and error...
  puts [string length [readfile $fontfname]]
  setfont0 $devfile $nchars $nrows [readfile $fontfname]
  close $devfile
}

# A quick hack to set 256 chars fonts
proc quicksetfont {fontfname} {
  set nrows [expr [string length [readfile $fontfname]]/256]
  setfont 256 $nrows $fontfname file0
}

proc rowsofbigchars {fontname height} {
  set delim "+--------+--------+--------+--------+--------+--------+--------+--------+"
  set bigstr "$delim\n"
  set fontdata [readfile $fontname]
  set nchars [expr [string length $fontdata]/$height]
  for {set i 0} {$i<$nchars} {incr i 8} {
    append bigstr "[join [rowofbigchars $fontdata $i 8 $height 8] "\n"]\n"
    append bigstr "$delim\n"
  }
  puts -nonewline $bigstr
}


proc composetable {} {
  global charchars charcomps
  foreach charchar $charchars charcomp $charcomps {
    if {$charchar!="." && [string length $charchar]==1} {
      regexp "(.)(.)" $charcomp -> c1 c2
      puts "compose '$c1' '$c2' to '$charchar'"
    }
  }
}

# «vcsa2pnm»  (to ".vcsa2pnm")
# (find-k22file "drivers/char/console.c" "default_red[] =")
# red[] = 00 aa 00 aa 00 aa 00 aa 55 ff 55 ff 55 ff 55 ff
# grn[] = 00 00 aa 55 00 00 aa aa 55 55 ff ff 55 55 ff ff
# blu[] = 00 00 00 00 aa aa aa aa 55 55 55 55 ff ff ff ff
#
proc vcsa2pnm {devfname  nchars nrows fontfname  pnmfname} {
  set pnmdata [vcsa2pnmdata \
    { 0 0 0} { 0 0 2} { 0 2 0} { 0 2 2} \
    { 2 0 0} { 2 0 2} { 2 1 0} { 2 2 2} \
    { 1 1 1} { 1 1 3} { 1 3 1} { 1 3 3} \
    { 3 1 1} { 3 1 3} { 3 3 1} { 3 3 3} \
    $nchars $nrows [readfile $fontfname] [readfile $devfname]]
  writefile $pnmfname "P3\n[expr 80*9] [expr 50*8] 3\n#\n$pnmdata\n"
}

# Experimental - para o meu cartÆo de visitas
#proc vcsa2pnm {devfname  nchars nrows fontfname  pnmfname} {
#  set colors [list \
#    { 0 0 0} { 0 0 2} { 0 2 0} { 0 2 2} \
#    { 2 0 0} { 2 0 2} { 2 1 0} { 2 2 2} \
#    { 1 1 1} { 1 1 3} { 1 3 1} { 1 3 3} \
#    { 3 1 1} { 3 1 3} { 3 3 1} { 3 3 3} \
#  ]
#  foreach n {0 7 15} c {{ 3 3 3} { 0 0 0} { 0 0 0}} {
#    set colors [lreplace $colors $n $n $c]
#  }
#  set pnmdata [eval vcsa2pnmdata $colors \
#    [list $nchars $nrows [readfile $fontfname] [readfile $devfname]]]
#  writefile $pnmfname "P3\n[expr 80*9] [expr 50*8] 3\n#\n$pnmdata\n"
#}





set charimages [crunch {\
+--------+--------+--------+--------+--------+--------+--------+--------+
|ooooooo |   o    |        |o     o | oooooo |        |  ooo   |  ooo   |
|o     o |  o o   | o   o  |o     o |      o |        | o   o  | o o o  |
|o     o | o   o  |  o o   | o   o  |      o |   oo   |o o o o |o  o  o |
|o     o |o     o |   o    | ooooo  |   oooo |  o  o  |o  o  o |ooooooo |
|o     o | o   o  |  o o   |  o o   |      o |  o  o  |o o o o |o  o  o |
|o     o |  o o   | o   o  |  o o   |      o |   oo   | o   o  | o o o  |
|ooooooo |   o    |        |   o    | oooooo |        |  ooo   |  ooo   |
|        |        |        |        |        |        |        |        |
+--------+--------+--------+--------+--------+--------+--------+--------+
|oo      |  ooo   |   o    |        |oo ooo  |        |        |        |
| oo     | o   o  |   o    |        | oo  oo |ooooooo |   o    |   o    |
|  oo    |ooo ooo | ooooo  |    ooo | ooo oo |   o    |   o    | ooooo  |
|  ooo   |o ooo o |        |ooooo oo|oo ooo  |   o    |   o    |   o    |
| oo oo  |ooo ooo |        |    ooo |  ooo   |   o    |   o    |   o    |
|oo   oo | o   o  |        |        | oo oo  |   o    |   o    |   o    |
|o     o |  ooo   |        |        |  ooo   |   o    |ooooooo |  o oo  |
|        |        |        |        |        |        |        |        |
+--------+--------+--------+--------+--------+--------+--------+--------+
| oo     |        |        |        |        |  ooo   |ooooooo |        |
|  oo    |  ooo   | o   o  |  ooo   |        | o   o  |oo   oo |        |
|   oo   | o      | o   o  | o   o  |        |     o  | o   o  |        |
|    oo  | oooo   | o   o  | o   o  | o o o o|  oooo  | oo oo  |        |
| ooooo  | o      | o   o  | o   o  |        | o   o  |  o o   |    ooo |
|        |  ooo   |  ooo   | o   o  |        | o   o  |  ooo   |    ooo |
| ooooo  |        |        |        |        |  ooo   |   o    |    ooo |
|        |        |        |        |        |        |        |        |
+--------+--------+--------+--------+--------+--------+--------+--------+
|        |        |  oooo  |  ooo   |        |        |        |    ooo |
|        |        | oo  oo | oo oo  |        |        |        |   oo   |
|   ooo  |  ooooo | oo  oo |oo   oo | o   o  | oooooo | o    o |    oo  |
|  o   o | oo     | oooooo |oo   oo |o o   o | o    o | o    o |  ooooo |
|  o   o | ooooo  | oo  oo |oo   oo |  o  o  | o    o | o    o | oo  oo |
|  oo  o | oo     | oo  oo | oo oo  |  o o   | o    o | o    o | oo  oo |
|  o oo  |  ooooo |  oooo  |ooo ooo |  oo    | o    o | oooooo |  oooo  |
| oo     |        |        |        |        |        |        |        |
+--------+--------+--------+--------+--------+--------+--------+--------+
|     o  | o      |    oo  |        |        |        |        |        |
|    oo  | o      |   oo o |   o    | o   o  |  o  o  |        |o       |
|ooo  o  | ooo    |   oo   |  o o   | o   o  |  o  o  | oo oo  |o       |
|     o  | o o    |   oo   |  o o   |  o o   |  o  o  |o  o  o |oo   oo |
|    ooo | ooo    |   oo   | o   o  |  o o   |  o  o  |o  o  o |o o o   |
|        |   o    |   oo   | o   o  |   o    | oooooo | oo oo  |o o oo  |
|        |   o    | o oo   |        |        |        |        |oo  o   |
|        |        |  oo    |        |        |        |        |    o   |
+--------+--------+--------+--------+--------+--------+--------+--------+
|  oooo  |  oooo  |ooo ooo |        |        |
|  o     |     o  |o     o |        |        |
|  o     |     o  |o     o |        | o   o  |
|  o     |     o  |o     o |oo oooo |o     o |
|        |        |        |o  o o o|o     o |
|        |        |        |o  o o o|o  o  o |
|        |        |        |o  o o o| oo oo  |
|        |        |        |        |        |
+--------+--------+--------+--------+--------+}]

lappend charnames  nec poss times Fa Ex comp otimes oplus
lappend charchars  �   è    �     ì  í  �    Ï      �
lappend charcomps  nn  pp   xx    fa ex oo   ox     o+

lappend charnames  lambda otimes perp lolli  par T  bot truthval
lappend charchars  �      Ï      Ñ    �      �   õ  �   .
lappend charcomps  ll     ox     pe   -o     &&  TT bo  tv

lappend charnames  >=  in cup cap dotli partial nabla block
lappend charchars  �   ×  ç   �   ö     �       �     �
lappend charcomps  >=  in cu  ca  ..    pa      na    bl

lappend charnames  rho eps theta Omega nu sqcap sqcup delta
lappend charchars             �     ê  �     Ó     
lappend charcomps  ro  ee  te    Om    nu ka    ku    dd

lappend charnames  -1  nat int land lor amalg infty bf
lappend charchars  ü   �   �       ∨        ò     
lappend charcomps  -1  bq  In  la   lo  am    88    bf

lappend charnames  ulcorn urcorn ucorns rm omega
lappend charchars  �      �      .      �  Õ
lappend charcomps  ul     ur     uc     rm ww

# (setglyphs ?\^R nil 18 ?\^E nil 5 ?\^F nil 6 ?\^T nil 20 ?\^D nil 4 ?\^^ nil 30 ?\^_ nil 31)
# (ascstr 0 255)

# cd ~/MTA; make VTUTIL="./vtutilsh vtutil" TCLVERSION=8.3; math


if {$argv==""} {
  # «examples_of_usage»  (to ".examples_of_usage")
  puts stderr "Examples of usage:

  $argv0 modifyfont 256 8 ega1.8  math1.8
  $argv0 setfont    256 8 math1.8  /dev/tty0
  (cat defkeymap850b.map; echo '#'; $argv0 composetable) > math850.map
  $argv0 vcsa2pnm   /dev/vcsa4  256 8 math1.8  /tmp/screenshot1.pnm
  $argv0 rowsofbigchars ega1.8 8
  $argv0 0..255 | tcs -f latin1-850 -t ps2 > isoto850.cmap
  $argv0 reorderfont 256 8 ega1.8 isoto850.cmap latin850.8
  $argv0 'setshuffle isoto850.cmap; modifyfont 256 8 latin850.8 latin850math.8'
"
  exit 1
} else {
  eval $argv
}

# Local Variables:
# coding:               no-conversion
# ee-anchor-format:     "«%s»"
# ee-charset-indicator: "Ñ"
# End: