It's almost always -1.
function old new delta
read_line_input 3902 3912 +10
new_line_input_t 24 31 +7
pgetc 583 585 +2
save_command_ps_at_cur_history 80 78 -2
read_line 76 74 -2
fgetc_interactive 246 244 -2
addLines 84 82 -2
doCommands 2226 2222 -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/5 up/down: 19/-12) Total: 7 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
* 0 on ctrl-C,
* >0 length of input string, including terminating '\n'
*/
- len = read_line_input(NULL, "", buf, sizeof(buf), /*timeout*/ -1);
+ len = read_line_input(NULL, "", buf, sizeof(buf));
if (len <= 0) {
/* Previously, ctrl-C was exiting to shell.
* Now we exit to ed prompt. Is in important? */
* 0 on ctrl-C,
* >0 length of input string, including terminating '\n'
*/
- len = read_line_input(NULL, ": ", buf, sizeof(buf), /*timeout*/ -1);
+ len = read_line_input(NULL, ": ", buf, sizeof(buf));
if (len <= 0)
return;
while (len && isspace(buf[--len]))
}
if (!dirty)
return;
- len = read_line_input(NULL, "Really quit? ", buf, 16, /*timeout*/ -1);
+ len = read_line_input(NULL, "Really quit? ", buf, 16);
/* read error/EOF - no way to continue */
if (len < 0)
return;
* buffer[0] is used as a counter of buffered chars and must be 0
* on first call.
* timeout:
- * -2: do not poll for input;
- * -1: poll(-1) (i.e. block);
- * >=0: poll for TIMEOUT milliseconds, return -1/EAGAIN on timeout
+ * -2: do not poll(-1) for input - read() it, return on EAGAIN at once
+ * -1: poll(-1) (i.e. block even on NONBLOCKed fd)
+ * >=0: poll() for TIMEOUT milliseconds, return -1/EAGAIN on timeout
*/
int64_t read_key(int fd, char *buffer, int timeout) FAST_FUNC;
void read_key_ungets(char *buffer, const char *str, unsigned len) FAST_FUNC;
# endif
typedef struct line_input_t {
int flags;
+ int timeout;
const char *path_lookup;
# if MAX_HISTORY
int cnt_history;
* 0 on ctrl-C (the line entered is still returned in 'command'),
* >0 length of input string, including terminating '\n'
*/
-int read_line_input(line_input_t *st, const char *prompt, char *command, int maxsize, int timeout) FAST_FUNC;
+int read_line_input(line_input_t *st, const char *prompt, char *command, int maxsize) FAST_FUNC;
void show_history(const line_input_t *st) FAST_FUNC;
# if ENABLE_FEATURE_EDITING_SAVE_ON_EXIT
void save_history(line_input_t *st);
#else
#define MAX_HISTORY 0
int read_line_input(const char* prompt, char* command, int maxsize) FAST_FUNC;
-#define read_line_input(state, prompt, command, maxsize, timeout) \
+#define read_line_input(state, prompt, command, maxsize) \
read_line_input(prompt, command, maxsize)
#endif
{
line_input_t *n = xzalloc(sizeof(*n));
n->flags = flags;
+ n->timeout = -1;
#if MAX_HISTORY > 0
n->max_history = MAX_HISTORY;
#endif
* Backspace deletes last matched char.
* Control keys exit search and return to normal editing (at current history line).
*/
-static int32_t reverse_i_search(void)
+static int32_t reverse_i_search(int timeout)
{
char match_buf[128]; /* for user input */
char read_key_buffer[KEYCODE_BUFFER_SIZE];
int h;
unsigned match_buf_len = strlen(match_buf);
-//FIXME: correct timeout?
- ic = lineedit_read_key(read_key_buffer, -1);
+//FIXME: correct timeout? (i.e. count it down?)
+ ic = lineedit_read_key(read_key_buffer, timeout);
switch (ic) {
case CTRL('R'): /* searching for the next match */
* (in both cases the cursor remains on the input line, '\n' is not printed)
* >0 length of input string, including terminating '\n'
*/
-int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *command, int maxsize, int timeout)
+int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *command, int maxsize)
{
int len;
+ int timeout;
#if ENABLE_FEATURE_TAB_COMPLETION
smallint lastWasTab = 0;
#endif
maxsize = MAX_LINELEN;
S.maxsize = maxsize;
- /* With zero flags, no other fields are ever used */
- state = st ? st : (line_input_t*) &const_int_0;
+ timeout = -1;
+ /* Make state->flags == 0 if st is NULL.
+ * With zeroed flags, no other fields are ever referenced.
+ */
+ state = (line_input_t*) &const_int_0;
+ if (st) {
+ state = st;
+ timeout = st->timeout;
+ }
#if MAX_HISTORY > 0
# if ENABLE_FEATURE_EDITING_SAVEHISTORY
if (state->hist_file)
}
#if ENABLE_FEATURE_REVERSE_SEARCH
case CTRL('R'):
- ic = ic_raw = reverse_i_search();
+ ic = ic_raw = reverse_i_search(timeout);
goto again;
#endif
if (!iflag || g_parsefile->pf_fd != STDIN_FILENO)
nr = nonblock_immune_read(g_parsefile->pf_fd, buf, IBUFSIZ - 1);
else {
- int timeout = -1;
# if ENABLE_ASH_IDLE_TIMEOUT
+ int timeout = -1;
if (iflag) {
const char *tmout_var = lookupvar("TMOUT");
if (tmout_var) {
timeout = -1;
}
}
+ line_input_state->timeout = timeout;
# endif
# if ENABLE_FEATURE_TAB_COMPLETION
line_input_state->path_lookup = pathval();
# endif
reinit_unicode_for_ash();
- nr = read_line_input(line_input_state, cmdedit_prompt, buf, IBUFSIZ, timeout);
+ nr = read_line_input(line_input_state, cmdedit_prompt, buf, IBUFSIZ);
if (nr == 0) {
/* ^C pressed, "convert" to SIGINT */
write(STDOUT_FILENO, "^C", 2);
/* buglet: SIGINT will not make new prompt to appear _at once_,
* only after <Enter>. (^C works immediately) */
r = read_line_input(G.line_input_state, prompt_str,
- G.user_input_buf, CONFIG_FEATURE_EDITING_MAX_LEN-1,
- /*timeout*/ -1
+ G.user_input_buf, CONFIG_FEATURE_EDITING_MAX_LEN-1
);
/* read_line_input intercepts ^C, "convert" it to SIGINT */
if (r == 0)
{
int sz;
- sz = read_line_input(NULL, prompt, line_buffer, sizeof(line_buffer), /*timeout*/ -1);
+ sz = read_line_input(NULL, prompt, line_buffer, sizeof(line_buffer));
if (sz <= 0)
exit(EXIT_SUCCESS); /* Ctrl-D or Ctrl-C */