blob: 80bc83308ff611c2a17b7065de7d91ff04bd2a4c (
plain) (
tree)
|
|
#ifndef _IPXE_ANSIESC_H
#define _IPXE_ANSIESC_H
/** @file
*
* ANSI escape sequences
*
* ANSI X3.64 (aka ECMA-48 or ISO/IEC 6429, available from
* http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)
* defines escape sequences consisting of:
*
* A Control Sequence Introducer (CSI)
*
* Zero or more Parameter Bytes (P)
*
* Zero or more Intermediate Bytes (I)
*
* A Final Byte (F)
*
* The CSI consists of ESC (0x1b) followed by "[" (0x5b). The
* Parameter Bytes, for a standardised (i.e. not private or
* experimental) sequence, consist of a list of ASCII decimal integers
* separated by semicolons. The Intermediate Bytes (in the range 0x20
* to 0x2f) and the Final Byte (in the range 0x40 to 0x4f) determine
* the control function.
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
struct ansiesc_context;
/** A handler for an escape sequence */
struct ansiesc_handler {
/** The control function identifier
*
* The control function identifier consists of the
* Intermediate Bytes (if any) and the Final Byte. In
* practice, no more than one immediate byte is ever used, so
* the byte combination can be efficiently expressed as a
* single integer, in the obvious way (with the Final Byte
* being the least significant byte).
*/
unsigned int function;
/** Handle escape sequence
*
* @v ctx ANSI escape context
* @v count Parameter count
* @v params Parameter list
*
* A negative parameter value indicates that the parameter was
* omitted and that the default value for this control
* function should be used.
*
* Since all parameters are optional, there is no way to
* distinguish between "zero parameters" and "single parameter
* omitted". Consequently, the parameter list will always
* contain at least one item.
*/
void ( * handle ) ( struct ansiesc_context *ctx, unsigned int count,
int params[] );
};
/** Maximum number of parameters within a single escape sequence */
#define ANSIESC_MAX_PARAMS 5
/**
* ANSI escape sequence context
*
* This provides temporary storage for processing escape sequences,
* and points to the list of escape sequence handlers.
*/
struct ansiesc_context {
/** Array of handlers
*
* Must be terminated by a handler with @c function set to
* zero.
*/
struct ansiesc_handler *handlers;
/** Parameter count
*
* Will be zero when not currently in an escape sequence.
*/
unsigned int count;
/** Parameter list */
int params[ANSIESC_MAX_PARAMS];
/** Control function identifier */
unsigned int function;
};
/** Escape character */
#define ESC 0x1b
/** Control Sequence Introducer */
#define CSI "\033["
/**
* @defgroup ansifuncs ANSI escape sequence function identifiers
* @{
*/
/** Cursor position */
#define ANSIESC_CUP 'H'
/** Erase in page */
#define ANSIESC_ED 'J'
/** Erase from cursor to end of page */
#define ANSIESC_ED_TO_END 0
/** Erase from start of page to cursor */
#define ANSIESC_ED_FROM_START 1
/** Erase whole page */
#define ANSIESC_ED_ALL 2
/** Select graphic rendition */
#define ANSIESC_SGR 'm'
/** Explicit log message priority
*
* This is an iPXE private sequence identifier. (The range 'p' to '~'
* is reserved for private sequences.)
*/
#define ANSIESC_LOG_PRIORITY 'p'
/** Show cursor */
#define ANSIESC_DECTCEM_SET ( ( '?' << 8 ) | 'h' )
/** Hide cursor */
#define ANSIESC_DECTCEM_RESET ( ( '?' << 8 ) | 'l' )
/** @} */
extern int ansiesc_process ( struct ansiesc_context *ctx, int c );
#endif /* _IPXE_ANSIESC_H */
|