editstring.c File Reference

Editable strings. More...

#include <assert.h>
#include <string.h>
#include <gpxe/keys.h>
#include <gpxe/editstring.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
static void insert_delete (struct edit_string *string, size_t delete_len, const char *insert_text)
 Insert and/or delete text within an editable string.
static void insert_character (struct edit_string *string, unsigned int character)
 Insert character at current cursor position.
static void delete_character (struct edit_string *string)
 Delete character at current cursor position.
static void backspace (struct edit_string *string)
 Delete character to left of current cursor position.
static void kill_eol (struct edit_string *string)
 Delete to end of line.
int edit_string (struct edit_string *string, int key)
 Edit editable string.


Detailed Description

Editable strings.

Definition in file editstring.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

static void insert_delete ( struct edit_string string,
size_t  delete_len,
const char *  insert_text 
) [static]

Insert and/or delete text within an editable string.

Parameters:
string Editable string
delete_len Length of text to delete from current cursor position
insert_text Text to insert at current cursor position, or NULL

Definition at line 48 of file editstring.c.

References assert, edit_string::buf, edit_string::cursor, memcpy, memmove(), and strlen().

Referenced by delete_character(), insert_character(), and kill_eol().

00049                                                       {
00050         size_t old_len, max_delete_len, insert_len, max_insert_len, new_len;
00051 
00052         /* Calculate lengths */
00053         old_len = strlen ( string->buf );
00054         assert ( string->cursor <= old_len );
00055         max_delete_len = ( old_len - string->cursor );
00056         if ( delete_len > max_delete_len )
00057                 delete_len = max_delete_len;
00058         insert_len = ( insert_text ? strlen ( insert_text ) : 0 );
00059         max_insert_len = ( ( string->len - 1 ) - ( old_len - delete_len ) );
00060         if ( insert_len > max_insert_len )
00061                 insert_len = max_insert_len;
00062         new_len = ( old_len - delete_len + insert_len );
00063 
00064         /* Fill in edit history */
00065         string->mod_start = string->cursor;
00066         string->mod_end = ( ( new_len > old_len ) ? new_len : old_len );
00067 
00068         /* Move data following the cursor */
00069         memmove ( ( string->buf + string->cursor + insert_len ),
00070                   ( string->buf + string->cursor + delete_len ),
00071                   ( max_delete_len + 1 - delete_len ) );
00072 
00073         /* Copy inserted text to cursor position */
00074         memcpy ( ( string->buf + string->cursor ), insert_text, insert_len );
00075         string->cursor += insert_len;
00076 }

static void insert_character ( struct edit_string string,
unsigned int  character 
) [static]

Insert character at current cursor position.

Parameters:
string Editable string
character Character to insert

Definition at line 84 of file editstring.c.

References insert_delete().

Referenced by edit_string().

00085                                                        {
00086         char insert_text[2] = { character, '\0' };
00087         insert_delete ( string, 0, insert_text );
00088 }

static void delete_character ( struct edit_string string  )  [static]

Delete character at current cursor position.

Parameters:
string Editable string

Definition at line 95 of file editstring.c.

References insert_delete(), and NULL.

Referenced by backspace(), and edit_string().

00095                                                             {
00096         insert_delete ( string, 1, NULL );
00097 }

static void backspace ( struct edit_string string  )  [static]

Delete character to left of current cursor position.

Parameters:
string Editable string

Definition at line 104 of file editstring.c.

References edit_string::cursor, and delete_character().

Referenced by edit_string().

00104                                                      {
00105         if ( string->cursor > 0 ) {
00106                 string->cursor--;
00107                 delete_character ( string );
00108         }
00109 }

static void kill_eol ( struct edit_string string  )  [static]

Delete to end of line.

Parameters:
string Editable string

Definition at line 116 of file editstring.c.

References insert_delete(), and NULL.

Referenced by edit_string().

00116                                                     {
00117         insert_delete ( string, ~( ( size_t ) 0 ), NULL );
00118 }

int edit_string ( struct edit_string string,
int  key 
)

Edit editable string.

Parameters:
string Editable string
key Key pressed by user
Return values:
key Key returned to application, or zero
Handles keypresses and updates the content of the editable string. Basic line editing facilities (delete/insert/cursor) are supported. If edit_string() understands and uses the keypress it will return zero, otherwise it will return the original key.

This function does not update the display in any way.

The string's edit history will be updated to allow the caller to efficiently bring the display into sync with the string content.

Definition at line 137 of file editstring.c.

References backspace(), edit_string::buf, CTRL_A, CTRL_B, CTRL_D, CTRL_E, CTRL_F, CTRL_K, edit_string::cursor, delete_character(), insert_character(), KEY_BACKSPACE, KEY_DC, KEY_END, KEY_HOME, KEY_LEFT, KEY_RIGHT, kill_eol(), and strlen().

Referenced by edit_editbox(), and readline().

00137                                                         {
00138         int retval = 0;
00139         size_t len = strlen ( string->buf );
00140 
00141         /* Prepare edit history */
00142         string->last_cursor = string->cursor;
00143         string->mod_start = string->cursor;
00144         string->mod_end = string->cursor;
00145 
00146         /* Interpret key */
00147         if ( ( key >= 0x20 ) && ( key <= 0x7e ) ) {
00148                 /* Printable character; insert at current position */
00149                 insert_character ( string, key );
00150         } else switch ( key ) {
00151         case KEY_BACKSPACE:
00152                 /* Backspace */
00153                 backspace ( string );
00154                 break;
00155         case KEY_DC:
00156         case CTRL_D:
00157                 /* Delete character */
00158                 delete_character ( string );
00159                 break;
00160         case CTRL_K:
00161                 /* Delete to end of line */
00162                 kill_eol ( string );
00163                 break;
00164         case KEY_HOME:
00165         case CTRL_A:
00166                 /* Start of line */
00167                 string->cursor = 0;
00168                 break;
00169         case KEY_END:
00170         case CTRL_E:
00171                 /* End of line */
00172                 string->cursor = len;
00173                 break;
00174         case KEY_LEFT:
00175         case CTRL_B:
00176                 /* Cursor left */
00177                 if ( string->cursor > 0 )
00178                         string->cursor--;
00179                 break;
00180         case KEY_RIGHT:
00181         case CTRL_F:
00182                 /* Cursor right */
00183                 if ( string->cursor < len )
00184                         string->cursor++;
00185                 break;
00186         default:
00187                 retval = key;
00188                 break;
00189         }
00190 
00191         return retval;
00192 }


Generated on Tue Apr 6 20:01:46 2010 for gPXE by  doxygen 1.5.7.1