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