iPXE
ansiesc.c File Reference

ANSI escape sequences. More...

#include <string.h>
#include <assert.h>
#include <ipxe/ansiesc.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static void ansiesc_call_handler (struct ansiesc_context *ctx, unsigned int function, int count, int params[])
 Call ANSI escape sequence handler.
int ansiesc_process (struct ansiesc_context *ctx, int c)
 Process character that may be part of ANSI escape sequence.

Detailed Description

ANSI escape sequences.

Definition in file ansiesc.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ ansiesc_call_handler()

void ansiesc_call_handler ( struct ansiesc_context * ctx,
unsigned int function,
int count,
int params[] )
static

Call ANSI escape sequence handler.

Parameters
ctxANSI escape sequence context
functionControl function identifier
countParameter count
paramsParameter list

Definition at line 45 of file ansiesc.c.

47 {
48 struct ansiesc_handler *handlers = ctx->handlers;
49 struct ansiesc_handler *handler;
50
51 for ( handler = handlers ; handler->function ; handler++ ) {
52 if ( handler->function == function ) {
53 handler->handle ( ctx, count, params );
54 break;
55 }
56 }
57}
struct golan_eq_context ctx
Definition CIB_PRM.h:0
uint8_t function
Function.
Definition edd.h:5
static unsigned int count
Number of entries.
Definition dwmac.h:220
A handler for an escape sequence.
Definition ansiesc.h:35
void(* handle)(struct ansiesc_context *ctx, unsigned int count, int params[])
Handle escape sequence.
Definition ansiesc.h:61
unsigned int function
The control function identifier.
Definition ansiesc.h:45

References count, ctx, ansiesc_handler::function, function, and ansiesc_handler::handle.

Referenced by ansiesc_process().

◆ ansiesc_process()

int ansiesc_process ( struct ansiesc_context * ctx,
int c )

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}
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
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().