kbd(7) kbd(7)
NAME
kbd - generalized string translation module
DESCRIPTION
The STREAMS module kbd is a programmable string translation
module. It performs two types of operations on an input
stream: the first type is simple byte-swapping via a lookup
table, the second is string translation. It is useful for
code set conversion and compose-key or dead-key character
production on terminals and production of overstriking
sequences on printers. It also can be used for minor types of
key-rebinding, expansion of abbreviations, and keyboard re-
arrangement (an example of the latter would be swapping the
positions of the Y and Z keys, required for German keyboards,
or providing Dvorak keyboard emulation for QWERTY keyboards).
The kbdcomp(1M) manual page discusses table construction, the
input language, and contains sample uses. It is intended
mainly to aid administrators in configuring the module on a
particular system; the user interface to the module is only
through the commands kbdload(1M) and kbdset(1).
The kbd module works by changing an input stream according to
instructions embodied in tables. It has no built in default
tables. Some tables may be loaded when the system is first
brought up by pushing the module and loading standard or
often-used tables [see kbdload(1M)] that are retained in
main-memory across invocations and made available to all
users. These are called public tables. Users may also load
private tables at any time; these tables do not remain
resident.
With the kbdset command, users may query the module for a list
of available and attached tables, attach various tables, and
set the optional per-user hotkey, hot-key mode, and verbose
string for their particular invocation.
When a user attaches more than one table, the user's hot-key
may be used to cycle to the next table in the list. If only
one table is specified, the hot-key may be used to toggle
translation on and off. When multiple tables are in use, the
hot-key may be used to cycle through the list of tables. [See
kbdset(1) for a description of the available modes.]
In its initial state, kbd scans input for occurrences of bytes
beginning a translation sequence. When receiving such a byte,
kbd attempts to match subsequent bytes of the input to
Copyright 1994 Novell, Inc. Page 1
kbd(7) kbd(7)
programmed sequences. Input is buffered beginning with the
byte that caused the state change and is released if a match
is not found. When a match fails, the first byte of the
invalid sequence is sent upstream, the buffered input is
shifted, and the scan begins again with the resulting input
sequence. If the current table contains an error entry, its
value (one or more bytes) is substituted for the offending
input byte. When a sequence is found to be valid, the entire
sequence is replaced with the result string specified for it.
The kbd module may be used in either the read or write
directions, or both simultaneously. Maps and hot-keys may be
specified independently for input and output.
The kbd also supports the use of external kernel-resident
functions as if they were tables; once declared and attached
(via kbdload and kbdset respectively) they may be used as
simple tables or members of composites. To accomplish this,
kbd understands the registration functions of the alp module
and can access any function registered with that module.
Further information on external functions and their definition
is contained in alp(7). External functions are especially
useful in supporting multibyte code set conversions that would
be difficult or impossible with normal kbd tables.
Limitations
It is not an error to attach multiple tables without defining
a hot-key, but the tables will not all be accessible. It is
recommended that the user's hot-key be set before loading and
attaching tables to avoid unpleasant side effects when an
unfamiliar arrangement is first loaded.
Each user has a limitation on the amount of memory that may be
used for private and attached tables. This ``quota'' is
controlled by the kbd_umem variable described below. When a
user that is not a privileged user attempts to load a table or
create a composite table, the quota is checked, and the load
will fail if it would cause the quota to be exceeded. When a
composite table is attached, the space for attachment (which
requires more space than the composite table itself) is
charged against this quota (attachment of simple tables is not
charged against the quota). The quota is enforced only when
loading new tables. Detaching temporarily from unneeded
composite tables may reduce the current allocation enough to
load a table that would otherwise fail because of quota
enforcement. To minimize chances of failure while loading
Copyright 1994 Novell, Inc. Page 2
kbd(7) kbd(7)
tables, it is advisable to load all required tables and make
all required composite tables before attaching any of them.
Configuration Parameters
The master (or space.c) file contains configurable parameters.
NKBDU is the maximum number of tables that may be attached by
a single user. The number should be large enough to cover
uncommon cases, and must be at least 2. Default is 6.
ZUMEM, from which the variable kbd_umem is assigned, is the
maximum number of bytes that a user (other than a privileged
user) may have allocated to private tables (that is, the
quota). Default is 4096.
KBDTIME is the default timer value for timeout mode. It is
the number of clock ticks allowed before timing out. The
value of one clock tick depends on the hardware, but is
usually 1/100 or 1/60 of a second. A timeout value of 20 is
1/5 second at 100Hz; with a 60Hz clock, a value of 12 produces
a 1/5 second timeout. Values from 5 to 400 inclusive are
allowed by the module; if the value set for KBDTIME is outside
this range, the module forces it to the nearest limit. (This
value is only a default; users may change their particular
stream to use a different value depending on their own
preferences, terminal baud-rate, and typing speed.)
FILES
/usr/lib/kbd - directory containing system standard table files.
/usr/lib/kbd/*.map - source for some system table files.
REFERENCES
alp(7), kbdcomp(1M), kbdload(1M), kbdset(1)
NOTICES
NULL characters may not be used in result or input strings,
because they are used as string delimiters.
Copyright 1994 Novell, Inc. Page 3