1*6b445a62SJohn Marino /* input.c -- character input functions for readline. */ 2*6b445a62SJohn Marino 3*6b445a62SJohn Marino /* Copyright (C) 1994-2010 Free Software Foundation, Inc. 4*6b445a62SJohn Marino 5*6b445a62SJohn Marino This file is part of the GNU Readline Library (Readline), a library 6*6b445a62SJohn Marino for reading lines of text with interactive input and history editing. 7*6b445a62SJohn Marino 8*6b445a62SJohn Marino Readline is free software: you can redistribute it and/or modify 9*6b445a62SJohn Marino it under the terms of the GNU General Public License as published by 10*6b445a62SJohn Marino the Free Software Foundation, either version 3 of the License, or 11*6b445a62SJohn Marino (at your option) any later version. 12*6b445a62SJohn Marino 13*6b445a62SJohn Marino Readline is distributed in the hope that it will be useful, 14*6b445a62SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of 15*6b445a62SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*6b445a62SJohn Marino GNU General Public License for more details. 17*6b445a62SJohn Marino 18*6b445a62SJohn Marino You should have received a copy of the GNU General Public License 19*6b445a62SJohn Marino along with Readline. If not, see <http://www.gnu.org/licenses/>. 20*6b445a62SJohn Marino */ 21*6b445a62SJohn Marino 22*6b445a62SJohn Marino #define READLINE_LIBRARY 23*6b445a62SJohn Marino 24*6b445a62SJohn Marino #if defined (__TANDEM) 25*6b445a62SJohn Marino # include <floss.h> 26*6b445a62SJohn Marino #endif 27*6b445a62SJohn Marino 28*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H) 29*6b445a62SJohn Marino # include <config.h> 30*6b445a62SJohn Marino #endif 31*6b445a62SJohn Marino 32*6b445a62SJohn Marino #include <sys/types.h> 33*6b445a62SJohn Marino #include <fcntl.h> 34*6b445a62SJohn Marino #if defined (HAVE_SYS_FILE_H) 35*6b445a62SJohn Marino # include <sys/file.h> 36*6b445a62SJohn Marino #endif /* HAVE_SYS_FILE_H */ 37*6b445a62SJohn Marino 38*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H) 39*6b445a62SJohn Marino # include <unistd.h> 40*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */ 41*6b445a62SJohn Marino 42*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H) 43*6b445a62SJohn Marino # include <stdlib.h> 44*6b445a62SJohn Marino #else 45*6b445a62SJohn Marino # include "ansi_stdlib.h" 46*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */ 47*6b445a62SJohn Marino 48*6b445a62SJohn Marino #include "posixselect.h" 49*6b445a62SJohn Marino 50*6b445a62SJohn Marino #if defined (FIONREAD_IN_SYS_IOCTL) 51*6b445a62SJohn Marino # include <sys/ioctl.h> 52*6b445a62SJohn Marino #endif 53*6b445a62SJohn Marino 54*6b445a62SJohn Marino #include <stdio.h> 55*6b445a62SJohn Marino #include <errno.h> 56*6b445a62SJohn Marino 57*6b445a62SJohn Marino #if !defined (errno) 58*6b445a62SJohn Marino extern int errno; 59*6b445a62SJohn Marino #endif /* !errno */ 60*6b445a62SJohn Marino 61*6b445a62SJohn Marino /* System-specific feature definitions and include files. */ 62*6b445a62SJohn Marino #include "rldefs.h" 63*6b445a62SJohn Marino #include "rlmbutil.h" 64*6b445a62SJohn Marino 65*6b445a62SJohn Marino /* Some standard library routines. */ 66*6b445a62SJohn Marino #include "readline.h" 67*6b445a62SJohn Marino 68*6b445a62SJohn Marino #include "rlprivate.h" 69*6b445a62SJohn Marino #include "rlshell.h" 70*6b445a62SJohn Marino #include "xmalloc.h" 71*6b445a62SJohn Marino 72*6b445a62SJohn Marino /* What kind of non-blocking I/O do we have? */ 73*6b445a62SJohn Marino #if !defined (O_NDELAY) && defined (O_NONBLOCK) 74*6b445a62SJohn Marino # define O_NDELAY O_NONBLOCK /* Posix style */ 75*6b445a62SJohn Marino #endif 76*6b445a62SJohn Marino 77*6b445a62SJohn Marino /* Non-null means it is a pointer to a function to run while waiting for 78*6b445a62SJohn Marino character input. */ 79*6b445a62SJohn Marino rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL; 80*6b445a62SJohn Marino 81*6b445a62SJohn Marino rl_getc_func_t *rl_getc_function = rl_getc; 82*6b445a62SJohn Marino 83*6b445a62SJohn Marino static int _keyboard_input_timeout = 100000; /* 0.1 seconds; it's in usec */ 84*6b445a62SJohn Marino 85*6b445a62SJohn Marino static int ibuffer_space PARAMS((void)); 86*6b445a62SJohn Marino static int rl_get_char PARAMS((int *)); 87*6b445a62SJohn Marino static int rl_gather_tyi PARAMS((void)); 88*6b445a62SJohn Marino 89*6b445a62SJohn Marino /* **************************************************************** */ 90*6b445a62SJohn Marino /* */ 91*6b445a62SJohn Marino /* Character Input Buffering */ 92*6b445a62SJohn Marino /* */ 93*6b445a62SJohn Marino /* **************************************************************** */ 94*6b445a62SJohn Marino 95*6b445a62SJohn Marino static int pop_index, push_index; 96*6b445a62SJohn Marino static unsigned char ibuffer[512]; 97*6b445a62SJohn Marino static int ibuffer_len = sizeof (ibuffer) - 1; 98*6b445a62SJohn Marino 99*6b445a62SJohn Marino #define any_typein (push_index != pop_index) 100*6b445a62SJohn Marino 101*6b445a62SJohn Marino int 102*6b445a62SJohn Marino _rl_any_typein () 103*6b445a62SJohn Marino { 104*6b445a62SJohn Marino return any_typein; 105*6b445a62SJohn Marino } 106*6b445a62SJohn Marino 107*6b445a62SJohn Marino /* Return the amount of space available in the buffer for stuffing 108*6b445a62SJohn Marino characters. */ 109*6b445a62SJohn Marino static int 110*6b445a62SJohn Marino ibuffer_space () 111*6b445a62SJohn Marino { 112*6b445a62SJohn Marino if (pop_index > push_index) 113*6b445a62SJohn Marino return (pop_index - push_index - 1); 114*6b445a62SJohn Marino else 115*6b445a62SJohn Marino return (ibuffer_len - (push_index - pop_index)); 116*6b445a62SJohn Marino } 117*6b445a62SJohn Marino 118*6b445a62SJohn Marino /* Get a key from the buffer of characters to be read. 119*6b445a62SJohn Marino Return the key in KEY. 120*6b445a62SJohn Marino Result is KEY if there was a key, or 0 if there wasn't. */ 121*6b445a62SJohn Marino static int 122*6b445a62SJohn Marino rl_get_char (key) 123*6b445a62SJohn Marino int *key; 124*6b445a62SJohn Marino { 125*6b445a62SJohn Marino if (push_index == pop_index) 126*6b445a62SJohn Marino return (0); 127*6b445a62SJohn Marino 128*6b445a62SJohn Marino *key = ibuffer[pop_index++]; 129*6b445a62SJohn Marino #if 0 130*6b445a62SJohn Marino if (pop_index >= ibuffer_len) 131*6b445a62SJohn Marino #else 132*6b445a62SJohn Marino if (pop_index > ibuffer_len) 133*6b445a62SJohn Marino #endif 134*6b445a62SJohn Marino pop_index = 0; 135*6b445a62SJohn Marino 136*6b445a62SJohn Marino return (1); 137*6b445a62SJohn Marino } 138*6b445a62SJohn Marino 139*6b445a62SJohn Marino /* Stuff KEY into the *front* of the input buffer. 140*6b445a62SJohn Marino Returns non-zero if successful, zero if there is 141*6b445a62SJohn Marino no space left in the buffer. */ 142*6b445a62SJohn Marino int 143*6b445a62SJohn Marino _rl_unget_char (key) 144*6b445a62SJohn Marino int key; 145*6b445a62SJohn Marino { 146*6b445a62SJohn Marino if (ibuffer_space ()) 147*6b445a62SJohn Marino { 148*6b445a62SJohn Marino pop_index--; 149*6b445a62SJohn Marino if (pop_index < 0) 150*6b445a62SJohn Marino pop_index = ibuffer_len; 151*6b445a62SJohn Marino ibuffer[pop_index] = key; 152*6b445a62SJohn Marino return (1); 153*6b445a62SJohn Marino } 154*6b445a62SJohn Marino return (0); 155*6b445a62SJohn Marino } 156*6b445a62SJohn Marino 157*6b445a62SJohn Marino int 158*6b445a62SJohn Marino _rl_pushed_input_available () 159*6b445a62SJohn Marino { 160*6b445a62SJohn Marino return (push_index != pop_index); 161*6b445a62SJohn Marino } 162*6b445a62SJohn Marino 163*6b445a62SJohn Marino /* If a character is available to be read, then read it and stuff it into 164*6b445a62SJohn Marino IBUFFER. Otherwise, just return. Returns number of characters read 165*6b445a62SJohn Marino (0 if none available) and -1 on error (EIO). */ 166*6b445a62SJohn Marino static int 167*6b445a62SJohn Marino rl_gather_tyi () 168*6b445a62SJohn Marino { 169*6b445a62SJohn Marino int tty; 170*6b445a62SJohn Marino register int tem, result; 171*6b445a62SJohn Marino int chars_avail, k; 172*6b445a62SJohn Marino char input; 173*6b445a62SJohn Marino #if defined(HAVE_SELECT) 174*6b445a62SJohn Marino fd_set readfds, exceptfds; 175*6b445a62SJohn Marino struct timeval timeout; 176*6b445a62SJohn Marino #endif 177*6b445a62SJohn Marino 178*6b445a62SJohn Marino chars_avail = 0; 179*6b445a62SJohn Marino tty = fileno (rl_instream); 180*6b445a62SJohn Marino 181*6b445a62SJohn Marino #if defined (HAVE_SELECT) 182*6b445a62SJohn Marino FD_ZERO (&readfds); 183*6b445a62SJohn Marino FD_ZERO (&exceptfds); 184*6b445a62SJohn Marino FD_SET (tty, &readfds); 185*6b445a62SJohn Marino FD_SET (tty, &exceptfds); 186*6b445a62SJohn Marino USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout); 187*6b445a62SJohn Marino result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout); 188*6b445a62SJohn Marino if (result <= 0) 189*6b445a62SJohn Marino return 0; /* Nothing to read. */ 190*6b445a62SJohn Marino #endif 191*6b445a62SJohn Marino 192*6b445a62SJohn Marino result = -1; 193*6b445a62SJohn Marino #if defined (FIONREAD) 194*6b445a62SJohn Marino errno = 0; 195*6b445a62SJohn Marino result = ioctl (tty, FIONREAD, &chars_avail); 196*6b445a62SJohn Marino if (result == -1 && errno == EIO) 197*6b445a62SJohn Marino return -1; 198*6b445a62SJohn Marino #endif 199*6b445a62SJohn Marino 200*6b445a62SJohn Marino #if defined (O_NDELAY) 201*6b445a62SJohn Marino if (result == -1) 202*6b445a62SJohn Marino { 203*6b445a62SJohn Marino tem = fcntl (tty, F_GETFL, 0); 204*6b445a62SJohn Marino 205*6b445a62SJohn Marino fcntl (tty, F_SETFL, (tem | O_NDELAY)); 206*6b445a62SJohn Marino chars_avail = read (tty, &input, 1); 207*6b445a62SJohn Marino 208*6b445a62SJohn Marino fcntl (tty, F_SETFL, tem); 209*6b445a62SJohn Marino if (chars_avail == -1 && errno == EAGAIN) 210*6b445a62SJohn Marino return 0; 211*6b445a62SJohn Marino if (chars_avail == 0) /* EOF */ 212*6b445a62SJohn Marino { 213*6b445a62SJohn Marino rl_stuff_char (EOF); 214*6b445a62SJohn Marino return (0); 215*6b445a62SJohn Marino } 216*6b445a62SJohn Marino } 217*6b445a62SJohn Marino #endif /* O_NDELAY */ 218*6b445a62SJohn Marino 219*6b445a62SJohn Marino #if defined (__MINGW32__) 220*6b445a62SJohn Marino /* Use getch/_kbhit to check for available console input, in the same way 221*6b445a62SJohn Marino that we read it normally. */ 222*6b445a62SJohn Marino chars_avail = isatty (tty) ? _kbhit () : 0; 223*6b445a62SJohn Marino result = 0; 224*6b445a62SJohn Marino #endif 225*6b445a62SJohn Marino 226*6b445a62SJohn Marino /* If there's nothing available, don't waste time trying to read 227*6b445a62SJohn Marino something. */ 228*6b445a62SJohn Marino if (chars_avail <= 0) 229*6b445a62SJohn Marino return 0; 230*6b445a62SJohn Marino 231*6b445a62SJohn Marino tem = ibuffer_space (); 232*6b445a62SJohn Marino 233*6b445a62SJohn Marino if (chars_avail > tem) 234*6b445a62SJohn Marino chars_avail = tem; 235*6b445a62SJohn Marino 236*6b445a62SJohn Marino /* One cannot read all of the available input. I can only read a single 237*6b445a62SJohn Marino character at a time, or else programs which require input can be 238*6b445a62SJohn Marino thwarted. If the buffer is larger than one character, I lose. 239*6b445a62SJohn Marino Damn! */ 240*6b445a62SJohn Marino if (tem < ibuffer_len) 241*6b445a62SJohn Marino chars_avail = 0; 242*6b445a62SJohn Marino 243*6b445a62SJohn Marino if (result != -1) 244*6b445a62SJohn Marino { 245*6b445a62SJohn Marino while (chars_avail--) 246*6b445a62SJohn Marino { 247*6b445a62SJohn Marino RL_CHECK_SIGNALS (); 248*6b445a62SJohn Marino k = (*rl_getc_function) (rl_instream); 249*6b445a62SJohn Marino if (rl_stuff_char (k) == 0) 250*6b445a62SJohn Marino break; /* some problem; no more room */ 251*6b445a62SJohn Marino if (k == NEWLINE || k == RETURN) 252*6b445a62SJohn Marino break; 253*6b445a62SJohn Marino } 254*6b445a62SJohn Marino } 255*6b445a62SJohn Marino else 256*6b445a62SJohn Marino { 257*6b445a62SJohn Marino if (chars_avail) 258*6b445a62SJohn Marino rl_stuff_char (input); 259*6b445a62SJohn Marino } 260*6b445a62SJohn Marino 261*6b445a62SJohn Marino return 1; 262*6b445a62SJohn Marino } 263*6b445a62SJohn Marino 264*6b445a62SJohn Marino int 265*6b445a62SJohn Marino rl_set_keyboard_input_timeout (u) 266*6b445a62SJohn Marino int u; 267*6b445a62SJohn Marino { 268*6b445a62SJohn Marino int o; 269*6b445a62SJohn Marino 270*6b445a62SJohn Marino o = _keyboard_input_timeout; 271*6b445a62SJohn Marino if (u >= 0) 272*6b445a62SJohn Marino _keyboard_input_timeout = u; 273*6b445a62SJohn Marino return (o); 274*6b445a62SJohn Marino } 275*6b445a62SJohn Marino 276*6b445a62SJohn Marino /* Is there input available to be read on the readline input file 277*6b445a62SJohn Marino descriptor? Only works if the system has select(2) or FIONREAD. 278*6b445a62SJohn Marino Uses the value of _keyboard_input_timeout as the timeout; if another 279*6b445a62SJohn Marino readline function wants to specify a timeout and not leave it up to 280*6b445a62SJohn Marino the user, it should use _rl_input_queued(timeout_value_in_microseconds) 281*6b445a62SJohn Marino instead. */ 282*6b445a62SJohn Marino int 283*6b445a62SJohn Marino _rl_input_available () 284*6b445a62SJohn Marino { 285*6b445a62SJohn Marino #if defined(HAVE_SELECT) 286*6b445a62SJohn Marino fd_set readfds, exceptfds; 287*6b445a62SJohn Marino struct timeval timeout; 288*6b445a62SJohn Marino #endif 289*6b445a62SJohn Marino #if !defined (HAVE_SELECT) && defined(FIONREAD) 290*6b445a62SJohn Marino int chars_avail; 291*6b445a62SJohn Marino #endif 292*6b445a62SJohn Marino int tty; 293*6b445a62SJohn Marino 294*6b445a62SJohn Marino tty = fileno (rl_instream); 295*6b445a62SJohn Marino 296*6b445a62SJohn Marino #if defined (HAVE_SELECT) 297*6b445a62SJohn Marino FD_ZERO (&readfds); 298*6b445a62SJohn Marino FD_ZERO (&exceptfds); 299*6b445a62SJohn Marino FD_SET (tty, &readfds); 300*6b445a62SJohn Marino FD_SET (tty, &exceptfds); 301*6b445a62SJohn Marino timeout.tv_sec = 0; 302*6b445a62SJohn Marino timeout.tv_usec = _keyboard_input_timeout; 303*6b445a62SJohn Marino return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0); 304*6b445a62SJohn Marino #else 305*6b445a62SJohn Marino 306*6b445a62SJohn Marino #if defined (FIONREAD) 307*6b445a62SJohn Marino if (ioctl (tty, FIONREAD, &chars_avail) == 0) 308*6b445a62SJohn Marino return (chars_avail); 309*6b445a62SJohn Marino #endif 310*6b445a62SJohn Marino 311*6b445a62SJohn Marino #endif 312*6b445a62SJohn Marino 313*6b445a62SJohn Marino #if defined (__MINGW32__) 314*6b445a62SJohn Marino if (isatty (tty)) 315*6b445a62SJohn Marino return (_kbhit ()); 316*6b445a62SJohn Marino #endif 317*6b445a62SJohn Marino 318*6b445a62SJohn Marino return 0; 319*6b445a62SJohn Marino } 320*6b445a62SJohn Marino 321*6b445a62SJohn Marino int 322*6b445a62SJohn Marino _rl_input_queued (t) 323*6b445a62SJohn Marino int t; 324*6b445a62SJohn Marino { 325*6b445a62SJohn Marino int old_timeout, r; 326*6b445a62SJohn Marino 327*6b445a62SJohn Marino old_timeout = rl_set_keyboard_input_timeout (t); 328*6b445a62SJohn Marino r = _rl_input_available (); 329*6b445a62SJohn Marino rl_set_keyboard_input_timeout (old_timeout); 330*6b445a62SJohn Marino return r; 331*6b445a62SJohn Marino } 332*6b445a62SJohn Marino 333*6b445a62SJohn Marino void 334*6b445a62SJohn Marino _rl_insert_typein (c) 335*6b445a62SJohn Marino int c; 336*6b445a62SJohn Marino { 337*6b445a62SJohn Marino int key, t, i; 338*6b445a62SJohn Marino char *string; 339*6b445a62SJohn Marino 340*6b445a62SJohn Marino i = key = 0; 341*6b445a62SJohn Marino string = (char *)xmalloc (ibuffer_len + 1); 342*6b445a62SJohn Marino string[i++] = (char) c; 343*6b445a62SJohn Marino 344*6b445a62SJohn Marino while ((t = rl_get_char (&key)) && 345*6b445a62SJohn Marino _rl_keymap[key].type == ISFUNC && 346*6b445a62SJohn Marino _rl_keymap[key].function == rl_insert) 347*6b445a62SJohn Marino string[i++] = key; 348*6b445a62SJohn Marino 349*6b445a62SJohn Marino if (t) 350*6b445a62SJohn Marino _rl_unget_char (key); 351*6b445a62SJohn Marino 352*6b445a62SJohn Marino string[i] = '\0'; 353*6b445a62SJohn Marino rl_insert_text (string); 354*6b445a62SJohn Marino xfree (string); 355*6b445a62SJohn Marino } 356*6b445a62SJohn Marino 357*6b445a62SJohn Marino /* Add KEY to the buffer of characters to be read. Returns 1 if the 358*6b445a62SJohn Marino character was stuffed correctly; 0 otherwise. */ 359*6b445a62SJohn Marino int 360*6b445a62SJohn Marino rl_stuff_char (key) 361*6b445a62SJohn Marino int key; 362*6b445a62SJohn Marino { 363*6b445a62SJohn Marino if (ibuffer_space () == 0) 364*6b445a62SJohn Marino return 0; 365*6b445a62SJohn Marino 366*6b445a62SJohn Marino if (key == EOF) 367*6b445a62SJohn Marino { 368*6b445a62SJohn Marino key = NEWLINE; 369*6b445a62SJohn Marino rl_pending_input = EOF; 370*6b445a62SJohn Marino RL_SETSTATE (RL_STATE_INPUTPENDING); 371*6b445a62SJohn Marino } 372*6b445a62SJohn Marino ibuffer[push_index++] = key; 373*6b445a62SJohn Marino #if 0 374*6b445a62SJohn Marino if (push_index >= ibuffer_len) 375*6b445a62SJohn Marino #else 376*6b445a62SJohn Marino if (push_index > ibuffer_len) 377*6b445a62SJohn Marino #endif 378*6b445a62SJohn Marino push_index = 0; 379*6b445a62SJohn Marino 380*6b445a62SJohn Marino return 1; 381*6b445a62SJohn Marino } 382*6b445a62SJohn Marino 383*6b445a62SJohn Marino /* Make C be the next command to be executed. */ 384*6b445a62SJohn Marino int 385*6b445a62SJohn Marino rl_execute_next (c) 386*6b445a62SJohn Marino int c; 387*6b445a62SJohn Marino { 388*6b445a62SJohn Marino rl_pending_input = c; 389*6b445a62SJohn Marino RL_SETSTATE (RL_STATE_INPUTPENDING); 390*6b445a62SJohn Marino return 0; 391*6b445a62SJohn Marino } 392*6b445a62SJohn Marino 393*6b445a62SJohn Marino /* Clear any pending input pushed with rl_execute_next() */ 394*6b445a62SJohn Marino int 395*6b445a62SJohn Marino rl_clear_pending_input () 396*6b445a62SJohn Marino { 397*6b445a62SJohn Marino rl_pending_input = 0; 398*6b445a62SJohn Marino RL_UNSETSTATE (RL_STATE_INPUTPENDING); 399*6b445a62SJohn Marino return 0; 400*6b445a62SJohn Marino } 401*6b445a62SJohn Marino 402*6b445a62SJohn Marino /* **************************************************************** */ 403*6b445a62SJohn Marino /* */ 404*6b445a62SJohn Marino /* Character Input */ 405*6b445a62SJohn Marino /* */ 406*6b445a62SJohn Marino /* **************************************************************** */ 407*6b445a62SJohn Marino 408*6b445a62SJohn Marino /* Read a key, including pending input. */ 409*6b445a62SJohn Marino int 410*6b445a62SJohn Marino rl_read_key () 411*6b445a62SJohn Marino { 412*6b445a62SJohn Marino int c; 413*6b445a62SJohn Marino 414*6b445a62SJohn Marino rl_key_sequence_length++; 415*6b445a62SJohn Marino 416*6b445a62SJohn Marino if (rl_pending_input) 417*6b445a62SJohn Marino { 418*6b445a62SJohn Marino c = rl_pending_input; 419*6b445a62SJohn Marino rl_clear_pending_input (); 420*6b445a62SJohn Marino } 421*6b445a62SJohn Marino else 422*6b445a62SJohn Marino { 423*6b445a62SJohn Marino /* If input is coming from a macro, then use that. */ 424*6b445a62SJohn Marino if (c = _rl_next_macro_key ()) 425*6b445a62SJohn Marino return (c); 426*6b445a62SJohn Marino 427*6b445a62SJohn Marino /* If the user has an event function, then call it periodically. */ 428*6b445a62SJohn Marino if (rl_event_hook) 429*6b445a62SJohn Marino { 430*6b445a62SJohn Marino while (rl_event_hook) 431*6b445a62SJohn Marino { 432*6b445a62SJohn Marino if (rl_gather_tyi () < 0) /* XXX - EIO */ 433*6b445a62SJohn Marino { 434*6b445a62SJohn Marino rl_done = 1; 435*6b445a62SJohn Marino return ('\n'); 436*6b445a62SJohn Marino } 437*6b445a62SJohn Marino RL_CHECK_SIGNALS (); 438*6b445a62SJohn Marino if (rl_get_char (&c) != 0) 439*6b445a62SJohn Marino break; 440*6b445a62SJohn Marino if (rl_done) /* XXX - experimental */ 441*6b445a62SJohn Marino return ('\n'); 442*6b445a62SJohn Marino (*rl_event_hook) (); 443*6b445a62SJohn Marino } 444*6b445a62SJohn Marino } 445*6b445a62SJohn Marino else 446*6b445a62SJohn Marino { 447*6b445a62SJohn Marino if (rl_get_char (&c) == 0) 448*6b445a62SJohn Marino c = (*rl_getc_function) (rl_instream); 449*6b445a62SJohn Marino RL_CHECK_SIGNALS (); 450*6b445a62SJohn Marino } 451*6b445a62SJohn Marino } 452*6b445a62SJohn Marino 453*6b445a62SJohn Marino return (c); 454*6b445a62SJohn Marino } 455*6b445a62SJohn Marino 456*6b445a62SJohn Marino int 457*6b445a62SJohn Marino rl_getc (stream) 458*6b445a62SJohn Marino FILE *stream; 459*6b445a62SJohn Marino { 460*6b445a62SJohn Marino int result; 461*6b445a62SJohn Marino unsigned char c; 462*6b445a62SJohn Marino 463*6b445a62SJohn Marino while (1) 464*6b445a62SJohn Marino { 465*6b445a62SJohn Marino RL_CHECK_SIGNALS (); 466*6b445a62SJohn Marino 467*6b445a62SJohn Marino #if defined (__MINGW32__) 468*6b445a62SJohn Marino if (isatty (fileno (stream))) 469*6b445a62SJohn Marino return (getch ()); 470*6b445a62SJohn Marino #endif 471*6b445a62SJohn Marino result = read (fileno (stream), &c, sizeof (unsigned char)); 472*6b445a62SJohn Marino 473*6b445a62SJohn Marino if (result == sizeof (unsigned char)) 474*6b445a62SJohn Marino return (c); 475*6b445a62SJohn Marino 476*6b445a62SJohn Marino /* If zero characters are returned, then the file that we are 477*6b445a62SJohn Marino reading from is empty! Return EOF in that case. */ 478*6b445a62SJohn Marino if (result == 0) 479*6b445a62SJohn Marino return (EOF); 480*6b445a62SJohn Marino 481*6b445a62SJohn Marino #if defined (__BEOS__) 482*6b445a62SJohn Marino if (errno == EINTR) 483*6b445a62SJohn Marino continue; 484*6b445a62SJohn Marino #endif 485*6b445a62SJohn Marino 486*6b445a62SJohn Marino #if defined (EWOULDBLOCK) 487*6b445a62SJohn Marino # define X_EWOULDBLOCK EWOULDBLOCK 488*6b445a62SJohn Marino #else 489*6b445a62SJohn Marino # define X_EWOULDBLOCK -99 490*6b445a62SJohn Marino #endif 491*6b445a62SJohn Marino 492*6b445a62SJohn Marino #if defined (EAGAIN) 493*6b445a62SJohn Marino # define X_EAGAIN EAGAIN 494*6b445a62SJohn Marino #else 495*6b445a62SJohn Marino # define X_EAGAIN -99 496*6b445a62SJohn Marino #endif 497*6b445a62SJohn Marino 498*6b445a62SJohn Marino if (errno == X_EWOULDBLOCK || errno == X_EAGAIN) 499*6b445a62SJohn Marino { 500*6b445a62SJohn Marino if (sh_unset_nodelay_mode (fileno (stream)) < 0) 501*6b445a62SJohn Marino return (EOF); 502*6b445a62SJohn Marino continue; 503*6b445a62SJohn Marino } 504*6b445a62SJohn Marino 505*6b445a62SJohn Marino #undef X_EWOULDBLOCK 506*6b445a62SJohn Marino #undef X_EAGAIN 507*6b445a62SJohn Marino 508*6b445a62SJohn Marino /* If the error that we received was SIGINT, then try again, 509*6b445a62SJohn Marino this is simply an interrupted system call to read (). 510*6b445a62SJohn Marino Otherwise, some error ocurred, also signifying EOF. */ 511*6b445a62SJohn Marino if (errno != EINTR) 512*6b445a62SJohn Marino return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); 513*6b445a62SJohn Marino } 514*6b445a62SJohn Marino } 515*6b445a62SJohn Marino 516*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE) 517*6b445a62SJohn Marino /* read multibyte char */ 518*6b445a62SJohn Marino int 519*6b445a62SJohn Marino _rl_read_mbchar (mbchar, size) 520*6b445a62SJohn Marino char *mbchar; 521*6b445a62SJohn Marino int size; 522*6b445a62SJohn Marino { 523*6b445a62SJohn Marino int mb_len, c; 524*6b445a62SJohn Marino size_t mbchar_bytes_length; 525*6b445a62SJohn Marino wchar_t wc; 526*6b445a62SJohn Marino mbstate_t ps, ps_back; 527*6b445a62SJohn Marino 528*6b445a62SJohn Marino memset(&ps, 0, sizeof (mbstate_t)); 529*6b445a62SJohn Marino memset(&ps_back, 0, sizeof (mbstate_t)); 530*6b445a62SJohn Marino 531*6b445a62SJohn Marino mb_len = 0; 532*6b445a62SJohn Marino while (mb_len < size) 533*6b445a62SJohn Marino { 534*6b445a62SJohn Marino RL_SETSTATE(RL_STATE_MOREINPUT); 535*6b445a62SJohn Marino c = rl_read_key (); 536*6b445a62SJohn Marino RL_UNSETSTATE(RL_STATE_MOREINPUT); 537*6b445a62SJohn Marino 538*6b445a62SJohn Marino if (c < 0) 539*6b445a62SJohn Marino break; 540*6b445a62SJohn Marino 541*6b445a62SJohn Marino mbchar[mb_len++] = c; 542*6b445a62SJohn Marino 543*6b445a62SJohn Marino mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps); 544*6b445a62SJohn Marino if (mbchar_bytes_length == (size_t)(-1)) 545*6b445a62SJohn Marino break; /* invalid byte sequence for the current locale */ 546*6b445a62SJohn Marino else if (mbchar_bytes_length == (size_t)(-2)) 547*6b445a62SJohn Marino { 548*6b445a62SJohn Marino /* shorted bytes */ 549*6b445a62SJohn Marino ps = ps_back; 550*6b445a62SJohn Marino continue; 551*6b445a62SJohn Marino } 552*6b445a62SJohn Marino else if (mbchar_bytes_length == 0) 553*6b445a62SJohn Marino { 554*6b445a62SJohn Marino mbchar[0] = '\0'; /* null wide character */ 555*6b445a62SJohn Marino mb_len = 1; 556*6b445a62SJohn Marino break; 557*6b445a62SJohn Marino } 558*6b445a62SJohn Marino else if (mbchar_bytes_length > (size_t)(0)) 559*6b445a62SJohn Marino break; 560*6b445a62SJohn Marino } 561*6b445a62SJohn Marino 562*6b445a62SJohn Marino return mb_len; 563*6b445a62SJohn Marino } 564*6b445a62SJohn Marino 565*6b445a62SJohn Marino /* Read a multibyte-character string whose first character is FIRST into 566*6b445a62SJohn Marino the buffer MB of length MLEN. Returns the last character read, which 567*6b445a62SJohn Marino may be FIRST. Used by the search functions, among others. Very similar 568*6b445a62SJohn Marino to _rl_read_mbchar. */ 569*6b445a62SJohn Marino int 570*6b445a62SJohn Marino _rl_read_mbstring (first, mb, mlen) 571*6b445a62SJohn Marino int first; 572*6b445a62SJohn Marino char *mb; 573*6b445a62SJohn Marino int mlen; 574*6b445a62SJohn Marino { 575*6b445a62SJohn Marino int i, c; 576*6b445a62SJohn Marino mbstate_t ps; 577*6b445a62SJohn Marino 578*6b445a62SJohn Marino c = first; 579*6b445a62SJohn Marino memset (mb, 0, mlen); 580*6b445a62SJohn Marino for (i = 0; c >= 0 && i < mlen; i++) 581*6b445a62SJohn Marino { 582*6b445a62SJohn Marino mb[i] = (char)c; 583*6b445a62SJohn Marino memset (&ps, 0, sizeof (mbstate_t)); 584*6b445a62SJohn Marino if (_rl_get_char_len (mb, &ps) == -2) 585*6b445a62SJohn Marino { 586*6b445a62SJohn Marino /* Read more for multibyte character */ 587*6b445a62SJohn Marino RL_SETSTATE (RL_STATE_MOREINPUT); 588*6b445a62SJohn Marino c = rl_read_key (); 589*6b445a62SJohn Marino RL_UNSETSTATE (RL_STATE_MOREINPUT); 590*6b445a62SJohn Marino } 591*6b445a62SJohn Marino else 592*6b445a62SJohn Marino break; 593*6b445a62SJohn Marino } 594*6b445a62SJohn Marino return c; 595*6b445a62SJohn Marino } 596*6b445a62SJohn Marino #endif /* HANDLE_MULTIBYTE */ 597