Bash  5.0-beta2
Bash - Bourne Again shell
callback.c File Reference
#include "rlconf.h"
#include <sys/types.h>
#include "ansi_stdlib.h"
#include <stdio.h>
#include "rldefs.h"
#include "readline.h"
#include "rlprivate.h"
#include "xmalloc.h"

Go to the source code of this file.

Macros

#define READLINE_LIBRARY
 
#define CALLBACK_READ_RETURN()
 

Functions

static void _rl_callback_newline (void)
 
void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *linefunc)
 
void rl_callback_read_char (void)
 
void rl_callback_handler_remove (void)
 
_rl_callback_generic_arg_rl_callback_data_alloc (int count)
 
void _rl_callback_data_dispose (_rl_callback_generic_arg *arg)
 
void rl_callback_sigcleanup (void)
 

Variables

_rl_callback_func_t_rl_callback_func = 0
 
_rl_callback_generic_arg_rl_callback_data = 0
 
int rl_persistent_signal_handlers = 0
 
rl_vcpfunc_t * rl_linefunc
 
static int in_handler
 

Macro Definition Documentation

◆ READLINE_LIBRARY

#define READLINE_LIBRARY

Definition at line 22 of file callback.c.

◆ CALLBACK_READ_RETURN

#define CALLBACK_READ_RETURN ( )
Value:
do { \
rl_clear_signals (); \
return; \
} while (0)
int rl_persistent_signal_handlers
Definition: callback.c:59

Definition at line 115 of file callback.c.

Referenced by rl_callback_read_char().

Function Documentation

◆ _rl_callback_newline()

static void _rl_callback_newline ( void  )
static

Definition at line 83 of file callback.c.

References _rl_meta_flag, in_handler, readline_internal_setup(), RL_CHECK_SIGNALS, rl_initialize(), rl_persistent_signal_handlers, rl_prep_term_function, and rl_set_signals().

Referenced by rl_callback_handler_install(), and rl_callback_read_char().

84 {
85  rl_initialize ();
86 
87  if (in_handler == 0)
88  {
89  in_handler = 1;
90 
92  (*rl_prep_term_function) (_rl_meta_flag);
93 
94 #if defined (HANDLE_SIGNALS)
96  rl_set_signals ();
97 #endif
98  }
99 
101  RL_CHECK_SIGNALS ();
102 }
int rl_initialize(void)
Definition: readline.c:1093
rl_vintfunc_t * rl_prep_term_function
Definition: rltty.c:52
void readline_internal_setup(void)
Definition: readline.c:405
int rl_persistent_signal_handlers
Definition: callback.c:59
int rl_set_signals(void)
Definition: signals.c:396
#define RL_CHECK_SIGNALS()
Definition: rlprivate.h:41
static int in_handler
Definition: callback.c:79
int _rl_meta_flag
Definition: readline.c:326
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rl_callback_handler_install()

void rl_callback_handler_install ( const char *  prompt,
rl_vcpfunc_t *  linefunc 
)

Definition at line 106 of file callback.c.

References _rl_callback_newline(), rl_linefunc, rl_set_prompt(), RL_SETSTATE, and RL_STATE_CALLBACK.

Referenced by change_prompt(), and main().

107 {
110  rl_linefunc = linefunc;
112 }
static void _rl_callback_newline(void)
Definition: callback.c:83
#define RL_STATE_CALLBACK
Definition: readline.h:891
int prompt
Definition: excallback.c:96
rl_vcpfunc_t * rl_linefunc
Definition: callback.c:78
int rl_set_prompt(const char *prompt)
Definition: readline.c:331
#define RL_SETSTATE(x)
Definition: readline.h:900
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rl_callback_read_char()

void rl_callback_read_char ( void  )

Definition at line 127 of file callback.c.

References _rl_arg_callback(), _rl_argcxt, _rl_callback_data, _rl_callback_data_dispose(), _rl_callback_func, _rl_callback_newline(), _rl_dispatch_callback(), _rl_errmsg(), _rl_init_line_state(), _rl_internal_char_cleanup(), _rl_iscxt, _rl_isearch_callback(), _rl_kscxt, _rl_nscxt, _rl_nsearch_callback(), _rl_pushed_input_available(), _rl_top_level, _rl_vi_domove_callback(), _rl_vi_domove_motion_cleanup(), _rl_vimvcxt, _rl_want_redisplay, abort(), CALLBACK_READ_RETURN, __rl_keyseq_context::flags, __rl_callback_generic_arg::i2, in_handler, KSEQ_DISPATCHED, NULL, procenv_t, readline_internal_char(), readline_internal_teardown(), RL_CHECK_SIGNALS, rl_clear_signals(), rl_deprep_term_function, rl_done, RL_ISSTATE, rl_line_buffer, rl_linefunc, rl_pending_input, rl_persistent_signal_handlers, rl_set_signals(), RL_STATE_CHARSEARCH, RL_STATE_INPUTPENDING, RL_STATE_ISEARCH, RL_STATE_MACROINPUT, RL_STATE_MULTIKEY, RL_STATE_NSEARCH, RL_STATE_NUMERICARG, and RL_STATE_VIMOTION.

Referenced by main().

128 {
129  char *line;
130  int eof, jcode;
131  static procenv_t olevel;
132 
133  if (rl_linefunc == NULL)
134  {
135  _rl_errmsg ("readline_callback_read_char() called with no handler!");
136  abort ();
137  }
138 
139  memcpy ((void *)olevel, (void *)_rl_top_level, sizeof (procenv_t));
140 #if defined (HAVE_POSIX_SIGSETJMP)
141  jcode = sigsetjmp (_rl_top_level, 0);
142 #else
143  jcode = setjmp (_rl_top_level);
144 #endif
145  if (jcode)
146  {
147  (*rl_redisplay_function) ();
148  _rl_want_redisplay = 0;
149  memcpy ((void *)_rl_top_level, (void *)olevel, sizeof (procenv_t));
151  }
152 
153 #if defined (HANDLE_SIGNALS)
154  /* Install signal handlers only when readline has control. */
156  rl_set_signals ();
157 #endif
158 
159  do
160  {
161  RL_CHECK_SIGNALS ();
163  {
165  if (eof == 0 && (RL_ISSTATE (RL_STATE_ISEARCH) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING))
167 
169  }
170  else if (RL_ISSTATE (RL_STATE_NSEARCH))
171  {
173 
175  }
176 #if defined (VI_MODE)
177  /* States that can occur while in state VIMOTION have to be checked
178  before RL_STATE_VIMOTION */
179  else if (RL_ISSTATE (RL_STATE_CHARSEARCH))
180  {
181  int k;
182 
183  k = _rl_callback_data->i2;
184 
185  eof = (*_rl_callback_func) (_rl_callback_data);
186  /* If the function `deregisters' itself, make sure the data is
187  cleaned up. */
188  if (_rl_callback_func == 0) /* XXX - just sanity check */
189  {
190  if (_rl_callback_data)
191  {
193  _rl_callback_data = 0;
194  }
195  }
196 
197  /* Messy case where vi motion command can be char search */
199  {
203  }
204 
206  }
207  else if (RL_ISSTATE (RL_STATE_VIMOTION))
208  {
210  /* Should handle everything, including cleanup, numeric arguments,
211  and turning off RL_STATE_VIMOTION */
212  if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)
214 
216  }
217 #endif
218  else if (RL_ISSTATE (RL_STATE_NUMERICARG))
219  {
221  if (eof == 0 && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING))
223  /* XXX - this should handle _rl_last_command_was_kill better */
224  else if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)
226 
228  }
229  else if (RL_ISSTATE (RL_STATE_MULTIKEY))
230  {
231  eof = _rl_dispatch_callback (_rl_kscxt); /* For now */
232  while ((eof == -1 || eof == -2) && RL_ISSTATE (RL_STATE_MULTIKEY) && _rl_kscxt && (_rl_kscxt->flags & KSEQ_DISPATCHED))
234  if (RL_ISSTATE (RL_STATE_MULTIKEY) == 0)
235  {
237  _rl_want_redisplay = 1;
238  }
239  }
240  else if (_rl_callback_func)
241  {
242  /* This allows functions that simply need to read an additional
243  character (like quoted-insert) to register a function to be
244  called when input is available. _rl_callback_data is a
245  pointer to a struct that has the argument count originally
246  passed to the registering function and space for any additional
247  parameters. */
248  eof = (*_rl_callback_func) (_rl_callback_data);
249  /* If the function `deregisters' itself, make sure the data is
250  cleaned up. */
251  if (_rl_callback_func == 0)
252  {
253  if (_rl_callback_data)
254  {
256  _rl_callback_data = 0;
257  }
259  }
260  }
261  else
262  eof = readline_internal_char ();
263 
264  RL_CHECK_SIGNALS ();
265  if (rl_done == 0 && _rl_want_redisplay)
266  {
267  (*rl_redisplay_function) ();
268  _rl_want_redisplay = 0;
269  }
270 
271  if (rl_done)
272  {
273  line = readline_internal_teardown (eof);
274 
276  (*rl_deprep_term_function) ();
277 #if defined (HANDLE_SIGNALS)
278  rl_clear_signals ();
279 #endif
280  in_handler = 0;
281  (*rl_linefunc) (line);
282 
283  /* If the user did not clear out the line, do it for him. */
284  if (rl_line_buffer[0])
286 
287  /* Redisplay the prompt if readline_handler_{install,remove}
288  not called. */
289  if (in_handler == 0 && rl_linefunc)
291  }
292  }
294 
296 }
void _rl_internal_char_cleanup(void)
Definition: readline.c:499
static void _rl_callback_newline(void)
Definition: callback.c:83
void abort()
#define RL_STATE_MULTIKEY
Definition: readline.h:893
int _rl_isearch_callback(_rl_search_cxt *cxt)
Definition: isearch.c:819
int _rl_arg_callback(_rl_arg_cxt cxt)
Definition: misc.c:259
#define RL_STATE_ISEARCH
Definition: readline.h:879
_rl_callback_func_t * _rl_callback_func
Definition: callback.c:50
char * readline_internal_teardown(int eof)
Definition: readline.c:457
_rl_arg_cxt _rl_argcxt
Definition: misc.c:66
int _rl_nsearch_callback()
int _rl_pushed_input_available(void)
Definition: input.c:152
char * rl_line_buffer
Definition: readline.c:251
int _rl_vi_domove_callback()
_rl_search_cxt * _rl_iscxt
Definition: isearch.c:60
#define RL_ISSTATE(x)
Definition: readline.h:902
int rl_done
Definition: readline.c:166
int rl_pending_input
Definition: readline.c:215
rl_voidfunc_t * rl_deprep_term_function
Definition: rltty.c:53
#define procenv_t
Definition: posixjmp.h:37
int _rl_vi_domove_motion_cleanup()
jmp_buf _rl_top_level
Definition: readline.c:172
void _rl_callback_data_dispose(_rl_callback_generic_arg *arg)
Definition: callback.c:330
#define RL_STATE_NUMERICARG
Definition: readline.h:882
void _rl_errmsg()
int rl_persistent_signal_handlers
Definition: callback.c:59
rl_vcpfunc_t * rl_linefunc
Definition: callback.c:78
#define RL_STATE_INPUTPENDING
Definition: readline.h:889
#define RL_STATE_CHARSEARCH
Definition: readline.h:895
void rl_callback_read_char(void)
Definition: callback.c:127
int rl_clear_signals(void)
Definition: signals.c:502
#define NULL
Definition: general.h:53
int rl_set_signals(void)
Definition: signals.c:396
int readline_internal_char(void)
Definition: readline.c:530
_rl_callback_generic_arg * _rl_callback_data
Definition: callback.c:51
#define CALLBACK_READ_RETURN()
Definition: callback.c:115
#define RL_CHECK_SIGNALS()
Definition: rlprivate.h:41
_rl_vimotion_cxt * _rl_vimvcxt
Definition: vi_mode.c:83
int _rl_dispatch_callback(_rl_keyseq_cxt *cxt)
Definition: readline.c:744
static int in_handler
Definition: callback.c:79
#define RL_STATE_NSEARCH
Definition: readline.h:880
#define RL_STATE_MACROINPUT
Definition: readline.h:883
#define RL_STATE_VIMOTION
Definition: readline.h:892
_rl_search_cxt * _rl_nscxt
Definition: search.c:56
int _rl_want_redisplay
Definition: display.c:179
void _rl_init_line_state(void)
Definition: readline.c:676
#define KSEQ_DISPATCHED
Definition: rlprivate.h:121
_rl_keyseq_cxt * _rl_kscxt
Definition: readline.c:255
Here is the caller graph for this function:

◆ rl_callback_handler_remove()

void rl_callback_handler_remove ( void  )

Definition at line 300 of file callback.c.

References in_handler, NULL, RL_CHECK_SIGNALS, rl_clear_signals(), rl_deprep_term_function, rl_linefunc, RL_STATE_CALLBACK, and RL_UNSETSTATE.

Referenced by cb_linehandler(), and main().

301 {
302  rl_linefunc = NULL;
304  RL_CHECK_SIGNALS ();
305  if (in_handler)
306  {
307  in_handler = 0;
309  (*rl_deprep_term_function) ();
310 #if defined (HANDLE_SIGNALS)
311  rl_clear_signals ();
312 #endif
313  }
314 }
#define RL_UNSETSTATE(x)
Definition: readline.h:901
#define RL_STATE_CALLBACK
Definition: readline.h:891
rl_voidfunc_t * rl_deprep_term_function
Definition: rltty.c:53
rl_vcpfunc_t * rl_linefunc
Definition: callback.c:78
int rl_clear_signals(void)
Definition: signals.c:502
#define NULL
Definition: general.h:53
#define RL_CHECK_SIGNALS()
Definition: rlprivate.h:41
static int in_handler
Definition: callback.c:79
Here is the call graph for this function:
Here is the caller graph for this function:

◆ _rl_callback_data_alloc()

_rl_callback_generic_arg* _rl_callback_data_alloc ( int  count)

Definition at line 317 of file callback.c.

References __rl_callback_generic_arg::count, __rl_callback_generic_arg::i1, __rl_callback_generic_arg::i2, and xmalloc().

Referenced by rl_backward_char_search(), rl_char_search(), rl_quoted_insert(), rl_vi_change_char(), and rl_vi_char_search().

318 {
320 
322  arg->count = count;
323 
324  arg->i1 = arg->i2 = 0;
325 
326  return arg;
327 }
static char * xmalloc()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ _rl_callback_data_dispose()

void _rl_callback_data_dispose ( _rl_callback_generic_arg arg)

Definition at line 330 of file callback.c.

References xfree().

Referenced by rl_callback_read_char().

331 {
332  xfree (arg);
333 }
void xfree(char *string)
Definition: xmalloc.c:89
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rl_callback_sigcleanup()

void rl_callback_sigcleanup ( void  )

Definition at line 337 of file callback.c.

References _rl_argcxt, _rl_callback_func, _rl_iscxt, _rl_isearch_cleanup(), _rl_nscxt, _rl_nsearch_cleanup(), RL_ISSTATE, RL_STATE_CALLBACK, RL_STATE_CHARSEARCH, RL_STATE_ISEARCH, RL_STATE_MULTIKEY, RL_STATE_NSEARCH, RL_STATE_NUMERICARG, RL_STATE_VIMOTION, and RL_UNSETSTATE.

Referenced by _rl_handle_signal().

338 {
339  if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
340  return;
341 
344  else if (RL_ISSTATE (RL_STATE_NSEARCH))
346  else if (RL_ISSTATE (RL_STATE_VIMOTION))
348  else if (RL_ISSTATE (RL_STATE_NUMERICARG))
349  {
350  _rl_argcxt = 0;
352  }
353  else if (RL_ISSTATE (RL_STATE_MULTIKEY))
357 
358  _rl_callback_func = 0;
359 }
int _rl_nsearch_cleanup()
#define RL_UNSETSTATE(x)
Definition: readline.h:901
#define RL_STATE_MULTIKEY
Definition: readline.h:893
#define RL_STATE_CALLBACK
Definition: readline.h:891
#define RL_STATE_ISEARCH
Definition: readline.h:879
_rl_callback_func_t * _rl_callback_func
Definition: callback.c:50
_rl_arg_cxt _rl_argcxt
Definition: misc.c:66
_rl_search_cxt * _rl_iscxt
Definition: isearch.c:60
#define RL_ISSTATE(x)
Definition: readline.h:902
#define RL_STATE_NUMERICARG
Definition: readline.h:882
#define RL_STATE_CHARSEARCH
Definition: readline.h:895
#define RL_STATE_NSEARCH
Definition: readline.h:880
#define RL_STATE_VIMOTION
Definition: readline.h:892
_rl_search_cxt * _rl_nscxt
Definition: search.c:56
int _rl_isearch_cleanup(_rl_search_cxt *cxt, int r)
Definition: isearch.c:764
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ _rl_callback_func

◆ _rl_callback_data

◆ rl_persistent_signal_handlers

int rl_persistent_signal_handlers = 0

Definition at line 59 of file callback.c.

Referenced by _rl_callback_newline(), and rl_callback_read_char().

◆ rl_linefunc

rl_vcpfunc_t* rl_linefunc

◆ in_handler

int in_handler
static