blob: 85f7a9f329eaba572c9de09bbba5f9b48aaf56bf [file] [log] [blame]
Greg Hartman76d05dc2016-11-23 15:51:27 -08001#ifndef _GPXE_ANSIESC_H
2#define _GPXE_ANSIESC_H
3
4/** @file
5 *
6 * ANSI escape sequences
7 *
8 * ANSI X3.64 (aka ECMA-48 or ISO/IEC 6429, available from
9 * http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)
10 * defines escape sequences consisting of:
11 *
12 * A Control Sequence Introducer (CSI)
13 *
14 * Zero or more Parameter Bytes (P)
15 *
16 * Zero or more Intermediate Bytes (I)
17 *
18 * A Final Byte (F)
19 *
20 * The CSI consists of ESC (0x1b) followed by "[" (0x5b). The
21 * Parameter Bytes, for a standardised (i.e. not private or
22 * experimental) sequence, consist of a list of ASCII decimal integers
23 * separated by semicolons. The Intermediate Bytes (in the range 0x20
24 * to 0x2f) and the Final Byte (in the range 0x40 to 0x4f) determine
25 * the control function.
26 *
27 */
28
29FILE_LICENCE ( GPL2_OR_LATER );
30
31/** A handler for an escape sequence */
32struct ansiesc_handler {
33 /** The control function identifier
34 *
35 * The control function identifier consists of the
36 * Intermediate Bytes (if any) and the Final Byte. In
37 * practice, no more than one immediate byte is ever used, so
38 * the byte combination can be efficiently expressed as a
39 * single integer, in the obvious way (with the Final Byte
40 * being the least significant byte).
41 */
42 unsigned int function;
43 /** Handle escape sequence
44 *
45 * @v count Parameter count
46 * @v params Parameter list
47 *
48 * A negative parameter value indicates that the parameter was
49 * omitted and that the default value for this control
50 * function should be used.
51 *
52 * Since all parameters are optional, there is no way to
53 * distinguish between "zero parameters" and "single parameter
54 * omitted". Consequently, the parameter list will always
55 * contain at least one item.
56 */
57 void ( * handle ) ( unsigned int count, int params[] );
58};
59
60/** Maximum number of parameters within a single escape sequence */
61#define ANSIESC_MAX_PARAMS 4
62
63/**
64 * ANSI escape sequence context
65 *
66 * This provides temporary storage for processing escape sequences,
67 * and points to the list of escape sequence handlers.
68 */
69struct ansiesc_context {
70 /** Array of handlers
71 *
72 * Must be terminated by a handler with @c function set to
73 * zero.
74 */
75 struct ansiesc_handler *handlers;
76 /** Parameter count
77 *
78 * Will be zero when not currently in an escape sequence.
79 */
80 unsigned int count;
81 /** Parameter list */
82 int params[ANSIESC_MAX_PARAMS];
83 /** Control function identifier */
84 unsigned int function;
85};
86
87/** Escape character */
88#define ESC 0x1b
89
90/** Control Sequence Introducer */
91#define CSI "\033["
92
93/**
94 * @defgroup ansifuncs ANSI escape sequence function identifiers
95 * @{
96 */
97
98/** Cursor position */
99#define ANSIESC_CUP 'H'
100
101/** Erase in page */
102#define ANSIESC_ED 'J'
103
104/** Erase from cursor to end of page */
105#define ANSIESC_ED_TO_END 0
106
107/** Erase from start of page to cursor */
108#define ANSIESC_ED_FROM_START 1
109
110/** Erase whole page */
111#define ANSIESC_ED_ALL 2
112
113/** Select graphic rendition */
114#define ANSIESC_SGR 'm'
115
116/** @} */
117
118extern int ansiesc_process ( struct ansiesc_context *ctx, int c );
119
120#endif /* _GPXE_ANSIESC_H */