|
|
KBD tables, which are used by the KBD STREAMS module and the iconv(1) command, are created and managed as follows:
The KBD table provides a means of defining mappings that can be compiled and downloaded into the KBD STREAMS module. The input file to kbdcomp(1M) has a defined syntax consisting of a series of map declarations. Within each map declaration are a number of definitions and functions.
A map declaration is of the form:
map(<name>) {
<expressions>
}
The <expressions> contained in the map declaration are one of the following
forms:
define(<word> <value>)
<word>(<extension> <result>)
The definition statement, <define>, allows a mnemonic, <word> to be associated with <value>. It is useful for replacing character sequences with mnemonics to make the file more readable.
The assignment statement, <word>, results in <value> and <extension> being a valid combination. When this combination is encountered on input, it is mapped to <result>.
For a complete description of the syntax of this file see kbdcomp(1M).
For example, consider the file, German.map. shown in ``German.map KBD map''.
# # Sample mapping for a-umlaut, o-umlaut and u-umlaut # map(German) { define(umlaut, '\042') umlaut(a 'ä') umlaut(o 'ö') umlaut(u 'ü') umlaut(' ' '"') }
German.map KBD map
In this example we have defined the double quote character (octal 42) as a dead key. Whenever this key is followed by an a, o or u, this key will produce an a-umlaut, ä, o-umlaut, ö, or u-umlaut, ü respectively. Entering a double quote followed by a space will produce a double quote (") on the output.
``PC 437 to ISO 8859-1 KBD map'' shows part of the code set mapping table for PC 437 to ISO 8859-1 using the default mapping type.
map full (437.88591.d) { string(\200 \307) string(\201 \374) string(\202 \351) string(\203 \342)string(\300 '_') string(\301 '_') string(\302 '_') string(\303 '_') }
PC 437 to ISO 8859-1 KBD map
In this example we have declared a map called 437.88591.d. The full keyword means that the table will be indexed, rather than being linearly searched, when looking for a match. This makes the mapping more efficient. The string keyword is used to define a mapping of an input string to an output string. In this case, all strings are one character long, for example, C cedilla which is octal 201 in the PC 437 code set is mapped to octal 307, which is the code in ISO 8859-1. Characters that have no equivalent in ISO 8859-1, such as graphics characters, are mapped to an underscore, in this example the characters 300, 301, 302 and 303 octal.
The example shown in
``German.map KBD map''
is compiled by entering:
kbdcomp -o German German.map
For more information see kbdcomp(1M).
If the table that has been created is to be used by the iconv command, an entry must be placed in the /usr/lib/iconv/iconv_data file. Each entry in this file consists of a line with five fields. The first two fields are the names of the code sets being mapped to and from respectively. These abbreviations are used for the -f and -t arguments when using iconv. The third and fourth fields are the names of the map and the file to use for this mapping; these names are normally the same. The fifth field is the mapping type, that is, d for default, b for best fit, and so on.
For example, the default mapping type entry in iconv_data for mapping PC 437 to ISO 8859-1 characters is shown in ``iconv_data entry for PC 437 to ISO 8859-1 mapping''.
PC437 88591 437.88591.d 437.88591.d d
iconv_data entry for PC 437 to ISO 8859-1 mapping
If you wish to make the table available to all users for attaching to the KBD module, it must be loaded as a public table.
This can be achieved by entering:
kbdload -p 437.88591.d
Alternatively, by editing the /etc/rc2 and /etc/rc3 files, the table can be made publicly available when the machine is booted. To do this, add the following lines to the end of these files:
strchg -h kbd /usr/lbin/kbdload -p /usr/lib/kbd/asc.88591.d
To unload a KBD table use the kbdload command with the -u flag. Make sure that, before doing this, there are no users who have this table attached.
For example, to unload the 88591.cpz map:
kbdload -u 88591.cpz