iPXE
ansiesc.h File Reference

ANSI escape sequences. More...

Go to the source code of this file.

Data Structures

struct  ansiesc_handler
 A handler for an escape sequence. More...
struct  ansiesc_context
 ANSI escape sequence context. More...

Macros

#define ANSIESC_MAX_PARAMS   5
 Maximum number of parameters within a single escape sequence.
#define ESC   0x1b
 Escape character.
#define CSI   "\033["
 Control Sequence Introducer.
#define ANSIESC_CUP   'H'
 Cursor position.
#define ANSIESC_ED   'J'
 Erase in page.
#define ANSIESC_ED_TO_END   0
 Erase from cursor to end of page.
#define ANSIESC_ED_FROM_START   1
 Erase from start of page to cursor.
#define ANSIESC_ED_ALL   2
 Erase whole page.
#define ANSIESC_SGR   'm'
 Select graphic rendition.
#define ANSIESC_LOG_PRIORITY   'p'
 Explicit log message priority.
#define ANSIESC_DECTCEM_SET   ( ( '?' << 8 ) | 'h' )
 Show cursor.
#define ANSIESC_DECTCEM_RESET   ( ( '?' << 8 ) | 'l' )
 Hide cursor.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
int ansiesc_process (struct ansiesc_context *ctx, int c)
 Process character that may be part of ANSI escape sequence.

Detailed Description

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.

Definition in file ansiesc.h.

Macro Definition Documentation

◆ ANSIESC_MAX_PARAMS

#define ANSIESC_MAX_PARAMS   5

Maximum number of parameters within a single escape sequence.

Definition at line 66 of file ansiesc.h.

◆ ESC

#define ESC   0x1b

Escape character.

Definition at line 93 of file ansiesc.h.

Referenced by ansiesc_process(), form_loop(), getkey(), menu_loop(), pxe_menu_prompt_and_select(), pxe_menu_select(), and usbkbd_map().

◆ CSI

#define CSI   "\033["

Control Sequence Introducer.

Definition at line 96 of file ansiesc.h.

Referenced by ansicol_set(), and console_exec().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ ansiesc_process()

int ansiesc_process ( struct ansiesc_context * ctx,
int c )
extern

Process character that may be part of ANSI escape sequence.

Parameters
ctxANSI escape sequence context
cCharacter
Return values
cOriginal character if not part of escape sequence
<0Character was part of escape sequence

ANSI escape sequences will be plucked out of the character stream and interpreted; once complete they will be passed to the appropriate handler if one exists in this ANSI escape sequence context.

In the interests of code size, we are rather liberal about the sequences we are prepared to accept as valid.

Definition at line 75 of file ansiesc.c.

75 {
76
77 if ( ctx->count == 0 ) {
78 if ( c == ESC ) {
79 /* First byte of CSI : begin escape sequence */
80 ctx->count = 1;
81 memset ( ctx->params, 0xff, sizeof ( ctx->params ) );
82 ctx->function = 0;
83 return -1;
84 } else {
85 /* Normal character */
86 return c;
87 }
88 } else {
89 if ( c == '[' ) {
90 /* Second byte of CSI : do nothing */
91 } else if ( ( c >= '0' ) && ( c <= '9' ) ) {
92 /* Parameter Byte : part of a parameter value */
93 int *param = &ctx->params[ctx->count - 1];
94 if ( *param < 0 )
95 *param = 0;
96 *param = ( ( *param * 10 ) + ( c - '0' ) );
97 } else if ( c == ';' ) {
98 /* Parameter Byte : parameter delimiter */
99 ctx->count++;
100 if ( ctx->count > ( sizeof ( ctx->params ) /
101 sizeof ( ctx->params[0] ) ) ) {
102 /* Excessive parameters : abort sequence */
103 ctx->count = 0;
104 DBG ( "Too many parameters in ANSI escape "
105 "sequence\n" );
106 }
107 } else if ( ( ( c >= 0x20 ) && ( c <= 0x2f ) ) ||
108 ( c == '?' ) ) {
109 /* Intermediate Byte */
110 ctx->function <<= 8;
111 ctx->function |= c;
112 } else {
113 /* Treat as Final Byte. Zero ctx->count before
114 * calling handler to avoid potential infinite loops.
115 */
116 int count = ctx->count;
117 ctx->count = 0;
118 ctx->function <<= 8;
119 ctx->function |= c;
120 ansiesc_call_handler ( ctx, ctx->function,
121 count, ctx->params );
122 }
123 return -1;
124 }
125}
struct golan_eq_context ctx
Definition CIB_PRM.h:0
static void ansiesc_call_handler(struct ansiesc_context *ctx, unsigned int function, int count, int params[])
Call ANSI escape sequence handler.
Definition ansiesc.c:45
#define ESC
Escape character.
Definition ansiesc.h:93
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
static unsigned int count
Number of entries.
Definition dwmac.h:220
struct hv_monitor_parameter param[4][32]
Parameters.
Definition hyperv.h:13
void * memset(void *dest, int character, size_t len) __nonnull

References ansiesc_call_handler(), count, ctx, DBG, ESC, memset(), and param.

Referenced by bios_putchar(), efi_putchar(), fbcon_putchar(), and line_putchar().