1 #ifndef _IPXE_ANSIESC_H 2 #define _IPXE_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 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); 30 31 struct ansiesc_context; 32 33 /** A handler for an escape sequence */ 34 struct ansiesc_handler { 35 /** The control function identifier 36 * 37 * The control function identifier consists of the 38 * Intermediate Bytes (if any) and the Final Byte. In 39 * practice, no more than one immediate byte is ever used, so 40 * the byte combination can be efficiently expressed as a 41 * single integer, in the obvious way (with the Final Byte 42 * being the least significant byte). 43 */ 44 unsigned int function; 45 /** Handle escape sequence 46 * 47 * @v ctx ANSI escape context 48 * @v count Parameter count 49 * @v params Parameter list 50 * 51 * A negative parameter value indicates that the parameter was 52 * omitted and that the default value for this control 53 * function should be used. 54 * 55 * Since all parameters are optional, there is no way to 56 * distinguish between "zero parameters" and "single parameter 57 * omitted". Consequently, the parameter list will always 58 * contain at least one item. 59 */ 60 void ( * handle ) ( struct ansiesc_context *ctx, unsigned int count, 61 int params[] ); 62 }; 63 64 /** Maximum number of parameters within a single escape sequence */ 65 #define ANSIESC_MAX_PARAMS 5 66 67 /** 68 * ANSI escape sequence context 69 * 70 * This provides temporary storage for processing escape sequences, 71 * and points to the list of escape sequence handlers. 72 */ 73 struct ansiesc_context { 74 /** Array of handlers 75 * 76 * Must be terminated by a handler with @c function set to 77 * zero. 78 */ 79 struct ansiesc_handler *handlers; 80 /** Parameter count 81 * 82 * Will be zero when not currently in an escape sequence. 83 */ 84 unsigned int count; 85 /** Parameter list */ 86 int params[ANSIESC_MAX_PARAMS]; 87 /** Control function identifier */ 88 unsigned int function; 89 }; 90 91 /** Escape character */ 92 #define ESC 0x1b 93 94 /** Control Sequence Introducer */ 95 #define CSI "\033[" 96 97 /** 98 * @defgroup ansifuncs ANSI escape sequence function identifiers 99 * @{ 100 */ 101 102 /** Cursor position */ 103 #define ANSIESC_CUP 'H' 104 105 /** Erase in page */ 106 #define ANSIESC_ED 'J' 107 108 /** Erase from cursor to end of page */ 109 #define ANSIESC_ED_TO_END 0 110 111 /** Erase from start of page to cursor */ 112 #define ANSIESC_ED_FROM_START 1 113 114 /** Erase whole page */ 115 #define ANSIESC_ED_ALL 2 116 117 /** Select graphic rendition */ 118 #define ANSIESC_SGR 'm' 119 120 /** Explicit log message priority 121 * 122 * This is an iPXE private sequence identifier. (The range 'p' to '~' 123 * is reserved for private sequences.) 124 */ 125 #define ANSIESC_LOG_PRIORITY 'p' 126 127 /** Show cursor */ 128 #define ANSIESC_DECTCEM_SET ( ( '?' << 8 ) | 'h' ) 129 130 /** Hide cursor */ 131 #define ANSIESC_DECTCEM_RESET ( ( '?' << 8 ) | 'l' ) 132 133 /** @} */ 134 135 extern int ansiesc_process ( struct ansiesc_context *ctx, int c ); 136 137 #endif /* _IPXE_ANSIESC_H */ 138