callback.c revision 21308
1/* callback.c -- functions to use readline as an X `callback' mechanism. */
2
3/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
4
5   This file is part of the GNU Readline Library, a library for
6   reading lines of text with interactive input and history editing.
7
8   The GNU Readline Library is free software; you can redistribute it
9   and/or modify it under the terms of the GNU General Public License
10   as published by the Free Software Foundation; either version 1, or
11   (at your option) any later version.
12
13   The GNU Readline Library is distributed in the hope that it will be
14   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
15   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   The GNU General Public License is often shipped with GNU software, and
19   is generally kept in a file called COPYING or LICENSE.  If you do not
20   have a copy of the license, write to the Free Software Foundation,
21   675 Mass Ave, Cambridge, MA 02139, USA. */
22#define READLINE_LIBRARY
23
24#if defined (HAVE_CONFIG_H)
25#  include <config.h>
26#endif
27
28#include "rlconf.h"
29
30#if defined (READLINE_CALLBACKS)
31
32#include <sys/types.h>
33#include <stdio.h>
34
35/* System-specific feature definitions and include files. */
36#include "rldefs.h"
37#include "readline.h"
38
39extern void readline_internal_startup ();
40extern char *readline_internal_teardown ();
41extern int readline_internal_char ();
42
43extern int _rl_meta_flag;
44extern char *rl_prompt;
45extern int rl_visible_prompt_length;
46
47/* **************************************************************** */
48/*								    */
49/*			Callback Readline Functions                 */
50/*								    */
51/* **************************************************************** */
52
53/* Allow using readline in situations where a program may have multiple
54   things to handle at once, and dispatches them via select().  Call
55   rl_callback_handler_install() with the prompt and a function to call
56   whenever a complete line of input is ready.  The user must then
57   call readline_char() every time some input is available, and
58   readline_char() will call the user's function with the complete text
59   read in at each end of line.  The terminal is kept prepped and signals
60   handled all the time, except during calls to the user's function. */
61
62VFunction *rl_linefunc;		/* user callback function */
63static int in_handler;		/* terminal_prepped and signals set? */
64
65/* Make sure the terminal is set up, initialize readline, and prompt. */
66static void
67_rl_callback_newline ()
68{
69  rl_initialize ();
70
71  if (in_handler == 0)
72    {
73      in_handler = 1;
74
75      (*rl_prep_term_function) (_rl_meta_flag);
76
77#if defined (HANDLE_SIGNALS)
78      rl_set_signals ();
79#endif
80    }
81
82  readline_internal_setup ();
83}
84
85/* Install a readline handler, set up the terminal, and issue the prompt. */
86void
87rl_callback_handler_install (prompt, linefunc)
88     char *prompt;
89     VFunction *linefunc;
90{
91  rl_prompt = prompt;
92  rl_visible_prompt_length = rl_prompt ? rl_expand_prompt (rl_prompt) : 0;
93  rl_linefunc = linefunc;
94  _rl_callback_newline ();
95}
96
97/* Read one character, and dispatch to the handler if it ends the line. */
98void
99rl_callback_read_char ()
100{
101  char *line;
102  int eof;
103
104  if (rl_linefunc == NULL)
105    {
106      fprintf (stderr, "readline: readline_callback_read_char() called with no handler!\r\n");
107      abort ();
108    }
109
110  eof = readline_internal_char ();
111
112  if (rl_done)
113    {
114      line = readline_internal_teardown (eof);
115
116      (*rl_deprep_term_function) ();
117#if defined (HANDLE_SIGNALS)
118      rl_clear_signals ();
119#endif
120      in_handler = 0;
121      (*rl_linefunc) (line);
122
123    /* Redisplay the prompt if readline_handler_{install,remove} not called. */
124      if (in_handler == 0 && rl_linefunc)
125	_rl_callback_newline ();
126    }
127}
128
129/* Remove the handler, and make sure the terminal is in its normal state. */
130void
131rl_callback_handler_remove ()
132{
133  rl_linefunc = NULL;
134  if (in_handler)
135    {
136      in_handler = 0;
137      (*rl_deprep_term_function) ();
138#if defined (HANDLE_SIGNALS)
139      rl_clear_signals ();
140#endif
141    }
142}
143
144#endif
145