source: bootcd/isolinux/syslinux-6.03/gpxe/src/core/ansiesc.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 3.3 KB
Line 
1/*
2 * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19FILE_LICENCE ( GPL2_OR_LATER );
20
21#include <string.h>
22#include <assert.h>
23#include <gpxe/ansiesc.h>
24
25/** @file
26 *
27 * ANSI escape sequences
28 *
29 */
30
31/**
32 * Call ANSI escape sequence handler
33 *
34 * @v handlers          List of escape sequence handlers
35 * @v function          Control function identifier
36 * @v count             Parameter count
37 * @v params            Parameter list
38 */
39static void ansiesc_call_handler ( struct ansiesc_handler *handlers,
40                                   unsigned int function, int count,
41                                   int params[] ) {
42        struct ansiesc_handler *handler;
43
44        for ( handler = handlers ; handler->function ; handler++ ) {
45                if ( handler->function == function ) {
46                        handler->handle ( count, params );
47                        break;
48                }
49        }
50}
51
52/**
53 * Process character that may be part of ANSI escape sequence
54 *
55 * @v ctx               ANSI escape sequence context
56 * @v c                 Character
57 * @ret c               Original character if not part of escape sequence
58 * @ret <0              Character was part of escape sequence
59 *
60 * ANSI escape sequences will be plucked out of the character stream
61 * and interpreted; once complete they will be passed to the
62 * appropriate handler if one exists in this ANSI escape sequence
63 * context.
64 *
65 * In the interests of code size, we are rather liberal about the
66 * sequences we are prepared to accept as valid.
67 */
68int ansiesc_process ( struct ansiesc_context *ctx, int c ) {
69        if ( ctx->count == 0 ) {
70                if ( c == ESC ) {
71                        /* First byte of CSI : begin escape sequence */
72                        ctx->count = 1;
73                        memset ( ctx->params, 0xff, sizeof ( ctx->params ) );
74                        ctx->function = 0;
75                        return -1;
76                } else {
77                        /* Normal character */
78                        return c;
79                }
80        } else {
81                if ( c == '[' ) {
82                        /* Second byte of CSI : do nothing */
83                } else if ( ( c >= '0' ) && ( c <= '9' ) ) {
84                        /* Parameter Byte : part of a parameter value */
85                        int *param = &ctx->params[ctx->count - 1];
86                        if ( *param < 0 )
87                                *param = 0;
88                        *param = ( ( *param * 10 ) + ( c - '0' ) );
89                } else if ( c == ';' ) {
90                        /* Parameter Byte : parameter delimiter */
91                        ctx->count++;
92                        if ( ctx->count > ( sizeof ( ctx->params ) /
93                                            sizeof ( ctx->params[0] ) ) ) {
94                                /* Excessive parameters : abort sequence */
95                                ctx->count = 0;
96                                DBG ( "Too many parameters in ANSI escape "
97                                      "sequence\n" );
98                        }
99                } else if ( ( c >= 0x20 ) && ( c <= 0x2f ) ) {
100                        /* Intermediate Byte */
101                        ctx->function <<= 8;
102                        ctx->function |= c;
103                } else {
104                        /* Treat as Final Byte.  Zero ctx->count before
105                         * calling handler to avoid potential infinite loops.
106                         */
107                        int count = ctx->count;
108                        ctx->count = 0;
109                        ctx->function <<= 8;
110                        ctx->function |= c;
111                        ansiesc_call_handler ( ctx->handlers, ctx->function,
112                                               count, ctx->params );
113                }
114                return -1;
115        }
116}
Note: See TracBrowser for help on using the repository browser.