iPXE
Data Structures | Macros | Functions
readline.h File Reference

Minmal readline. More...

Go to the source code of this file.

Data Structures

struct  readline_history_entry
 A readline history entry. More...
 
struct  readline_history
 A readline history buffer. More...
 

Macros

#define READLINE_HISTORY_MAX_DEPTH   ( ( 1 << 3 ) - 1 )
 Maximum depth of a readline history buffer. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
void history_free (struct readline_history *history)
 Free history buffer. More...
 
int readline_history (const char *prompt, const char *prefill, struct readline_history *history, char **line)
 Read line from console (with history) More...
 
char *__malloc readline (const char *prompt)
 Read line from console. More...
 

Detailed Description

Minmal readline.

Definition in file readline.h.

Macro Definition Documentation

◆ READLINE_HISTORY_MAX_DEPTH

#define READLINE_HISTORY_MAX_DEPTH   ( ( 1 << 3 ) - 1 )

Maximum depth of a readline history buffer.

Must be one less than a power of two.

Definition at line 28 of file readline.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ history_free()

void history_free ( struct readline_history history)

Free history buffer.

Parameters
historyHistory buffer

Definition at line 232 of file readline.c.

232  {
234  unsigned int i;
235 
236  /* Discard any temporary strings */
237  for ( i = 0 ; i < ( sizeof ( history->entries ) /
238  sizeof ( history->entries[0] ) ) ; i++ ) {
239  entry = &history->entries[i];
240  assert ( entry->temp == NULL );
241  free ( entry->string );
242  }
243 }
struct readline_history_entry entries[READLINE_HISTORY_MAX_DEPTH+1]
History entries.
Definition: readline.h:38
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
union aes_table_entry entry[256]
Table entries, indexed by S(N)
Definition: aes.c:26
A readline history entry.
Definition: readline.h:13
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References assert(), readline_history::entries, entry, free, and NULL.

Referenced by shell().

◆ readline_history()

int readline_history ( const char *  prompt,
const char *  prefill,
struct readline_history history,
char **  line 
)

Read line from console (with history)

Parameters
promptPrompt string
prefillPrefill string, or NULL for no prefill
historyHistory buffer, or NULL for no history
Return values
lineLine read from console (excluding terminating newline)
rcReturn status code

The returned line is allocated with malloc(); the caller must eventually call free() to release the storage.

Definition at line 257 of file readline.c.

258  {
259  char buf[READLINE_MAX];
260  struct edit_string string;
261  int key;
262  int move_by;
263  const char *new_string;
264  int rc;
265 
266  /* Avoid returning uninitialised data on error */
267  *line = NULL;
268 
269  /* Display prompt, if applicable */
270  if ( prompt )
271  printf ( "%s", prompt );
272 
273  /* Ensure cursor is visible */
274  printf ( "\033[?25h" );
275 
276  /* Initialise editable string */
277  memset ( &string, 0, sizeof ( string ) );
278  init_editstring ( &string, buf, sizeof ( buf ) );
279  buf[0] = '\0';
280 
281  /* Prefill string, if applicable */
282  if ( prefill ) {
283  replace_string ( &string, prefill );
284  sync_console ( &string );
285  }
286 
287  while ( 1 ) {
288  /* Handle keypress */
289  key = edit_string ( &string, getkey ( 0 ) );
290  sync_console ( &string );
291  move_by = 0;
292  switch ( key ) {
293  case CR:
294  case LF:
295  *line = strdup ( buf );
296  rc = ( ( *line ) ? 0 : -ENOMEM );
297  goto done;
298  case CTRL_C:
299  rc = -ECANCELED;
300  goto done;
301  case KEY_UP:
302  move_by = 1;
303  break;
304  case KEY_DOWN:
305  move_by = -1;
306  break;
307  default:
308  /* Do nothing */
309  break;
310  }
311 
312  /* Handle history movement, if applicable */
313  if ( move_by && history ) {
314  new_string = history_move ( history, move_by, buf );
315  if ( new_string ) {
316  replace_string ( &string, new_string );
317  sync_console ( &string );
318  }
319  }
320  }
321 
322  done:
323  putchar ( '\n' );
324  if ( history ) {
325  if ( *line && (*line)[0] )
326  history_append ( history, *line );
327  history_cleanup ( history );
328  }
329  assert ( ( rc == 0 ) ^ ( *line == NULL ) );
330  return rc;
331 }
int getkey(unsigned long timeout)
Get single keypress.
Definition: getkey.c:71
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
static const char * history_move(struct readline_history *history, int offset, const char *old_string)
Move to new history depth.
Definition: readline.c:151
void replace_string(struct edit_string *string, const char *replacement)
Replace editable string.
Definition: editstring.c:173
static void history_cleanup(struct readline_history *history)
Clean up history after editing.
Definition: readline.c:207
int edit_string(struct edit_string *string, int key)
Edit editable string.
Definition: editstring.c:195
uint32_t string
Definition: multiboot.h:14
void putchar(int character)
Write a single character to each console device.
Definition: console.c:27
#define ECANCELED
Operation canceled.
Definition: errno.h:343
#define KEY_DOWN
Down arrow.
Definition: keys.h:66
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define KEY_UP
Up arrow.
Definition: keys.h:65
static void sync_console(struct edit_string *string)
Synchronise console with edited string.
Definition: readline.c:48
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void init_editstring(struct edit_string *string, char *buf, size_t len)
Initialise editable string.
Definition: editstring.h:38
#define CTRL_C
Definition: keys.h:20
char * strdup(const char *src)
Duplicate string.
Definition: string.c:350
int prompt(const char *text, unsigned long timeout, int key)
Prompt for keypress.
Definition: prompt.c:48
#define LF
Definition: keys.h:47
static void history_append(struct readline_history *history, const char *string)
Append new history entry.
Definition: readline.c:178
An editable string.
Definition: editstring.h:13
#define CR
Definition: keys.h:48
#define READLINE_MAX
Definition: readline.c:41
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
struct bofm_section_header done
Definition: bofm_test.c:46
union @375 key
Sense key.
Definition: scsi.h:18
void * memset(void *dest, int character, size_t len) __nonnull
char * buf
Buffer for string.
Definition: editstring.h:15

References assert(), edit_string::buf, CR, CTRL_C, done, ECANCELED, edit_string(), ENOMEM, getkey(), history_append(), history_cleanup(), history_move(), init_editstring(), key, KEY_DOWN, KEY_UP, LF, memset(), NULL, printf(), prompt(), putchar(), rc, READLINE_MAX, replace_string(), strdup(), string, and sync_console().

Referenced by readline(), and shell().

◆ readline()

char* __malloc readline ( const char *  prompt)

Read line from console.

Parameters
promptPrompt string
Return values
lineLine read from console (excluding terminating newline)

The returned line is allocated with malloc(); the caller must eventually call free() to release the storage.

Definition at line 342 of file readline.c.

342  {
343  char *line;
344 
345  readline_history ( prompt, NULL, NULL, &line );
346  return line;
347 }
int readline_history(const char *prompt, const char *prefill, struct readline_history *history, char **line)
Read line from console (with history)
Definition: readline.c:257
int prompt(const char *text, unsigned long timeout, int key)
Prompt for keypress.
Definition: prompt.c:48
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References NULL, prompt(), and readline_history().