#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. | |
Definition in file editstring.c.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.
| string | Editable string | |
| key | Key pressed by user |
| key | Key returned to application, or zero |
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 }
1.5.7.1