| Current Path : /usr/share/doc/console-tools/file-formats/ |
| Current File : //usr/share/doc/console-tools/file-formats/cp |
The CP file-format
(C) 1997 Yann Dirson <dirson@debian.org>
This file documents the CP font-file-format, as understood by version 0.94
and above of the Linux console utilities ('kbd').
This file has revision number 1.0, and is dated 1997/09/02.
Any useful additionnal information on CP files would be great.
0. Changes
1998/08/20: updated author's e-mail.
1. Summary
CP files are usually generated by codepage(1) from MS-DOS CPI files.
The CP file format is an awful thing. It was intended (IMHO) to be an easy
mean of using MS-DOS CPI font-files (see "cpi" file). They are generated by
the codepage(1) program, which just copies some headers from the CPI file,
without even changing a byte of their contents, and the font data
corresponding to a given code-page.
Especially, the following things are erroneous:
- next_header_offset (should be 0, is only 0 for the last codepage in the CPI
file)
- font_offset (should be 53, which is even found in no MS-DOS-distributed
CPI, as they store all headers first, and then all font_data)
setfont(1) assumes when reading them that contain fonts of heights 08, 14
and 16, for one particular MS-DOS code-page, and wisely ignores the headers;
however, the only CP files that will be accepted by setfont(1) are those that
effectively contain the requested font sizes (setfont checks the file size
for this).
In particular, CP files generated by codepage(1) from MS-DOS'
{ega,ega2,ega3}.cpi should be OK. Those generated from iso.cpi WILL NOT, as
they will only contain size 16 (anyway, they won't be recognized as CP files
by setfont).
2. History
Unknown. But this horror probably appeared with codepage(1).
3. Known programs understanding this file-format.
The following program in the Linux console utilities can read and/or write
PSF files:
setfont (R)
codepage (R/W)
4. Technical data
The file format is described here in sort-of EBNF notation. Upper-case
WORDS represent terminal symbols, ie. C types; lower-case words represent
non-terminal symbols, ie. symbols defined in terms of other symbols.
[sym] is an optional symbol
{sym} is a symbol that can be repeated 0 or more times
{sym}*N is a symbol that must be repeated N times
Comments are introduced with a # sign.
#
cp_file =
(off = 0) cp_entry_header
(off = 28) cp_info_header
(off = 34) cp_fontdata
# All refered symbols are defined in file "cpi"
Invariants in headers of files usable by setfont provide a "magic":
offset type value
6 short+char*8 "\001\000EGA " # driver - seems the best way to detect it
0 short 28 # header size \
30 u_short 3 # nb of fonts -| these just provide more checks
32 u_short 9746 # size of font_data /