Added support for interpreting ANSI escape sequences on behalf of
[people/mcb30/gpxe.git] / src / include / gpxe / ansiesc.h
1 #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
29 /** A handler for an escape sequence */
30 struct ansiesc_handler {
31         /** The control function identifier
32          *
33          * The control function identifier consists of the
34          * Intermediate Bytes (if any) and the Final Byte.  In
35          * practice, no more than one immediate byte is ever used, so
36          * the byte combination can be efficiently expressed as a
37          * single integer, in the obvious way (with the Final Byte
38          * being the least significant byte).
39          */
40         unsigned int function;
41         /** Handle escape sequence
42          *
43          * @v count             Parameter count
44          * @v params            Parameter list
45          *
46          * A negative parameter value indicates that the parameter was
47          * omitted and that the default value for this control
48          * function should be used.
49          *
50          * Since all parameters are optional, there is no way to
51          * distinguish between "zero parameters" and "single parameter
52          * omitted".  Consequently, the parameter list will always
53          * contain at least one item.
54          */
55         void ( * handle ) ( unsigned int count, int params[] );
56 };
57
58 /** Maximum number of parameters within a single escape sequence */
59 #define ANSIESC_MAX_PARAMS 4
60
61 /**
62  * ANSI escape sequence context
63  *
64  * This provides temporary storage for processing escape sequences,
65  * and points to the list of escape sequence handlers.
66  */
67 struct ansiesc_context {
68         /** Array of handlers
69          *
70          * Must be terminated by a handler with @c function set to
71          * zero.
72          */
73         struct ansiesc_handler *handlers;
74         /** Parameter count
75          *
76          * Will be zero when not currently in an escape sequence.
77          */
78         unsigned int count;
79         /** Parameter list */ 
80         int params[ANSIESC_MAX_PARAMS];
81         /** Control function identifier */
82         unsigned int function;
83 };
84
85 /** Escape character */
86 #define ESC 0x1b
87
88 /** Control Sequence Introducer */
89 #define CSI "\033["
90
91 /**
92  * @defgroup ansifuncs ANSI escape sequence function identifiers
93  * @{
94  */
95
96 /** Character and line position */
97 #define ANSIESC_HVP 'f'
98
99 /** @} */
100
101 extern int ansiesc_process ( struct ansiesc_context *ctx, int c );
102
103 #endif /* _GPXE_ANSIESC_H */