From: Chet Ramey Date: Tue, 2 Jul 2024 18:34:40 +0000 (-0400) Subject: updates for several readline examples; update examples in readline documentation... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dbff8b786ed573081469babb963255a3b7665612;p=thirdparty%2Fbash.git updates for several readline examples; update examples in readline documentation; update documentation for --rcfile option --- diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index b716927a..c68cbbba 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -9721,3 +9721,16 @@ lib/readline/funmap.c All from a report by Siteshwar Vashisht + 6/29 + ---- +lib/readline/examples/histexamp.c,lib/readline/examples/manexamp.c, +lib/readline/examples/rl-callbacktest.c,lib/readline/examples/rl-callbacktest2.c, +lib/readline/examples/excallback.c,lib/readline/examples/rlptytest.c + - small changes to fix warnings + From a report by Hiroo Hayashi + + 7/1 + --- +execute_cmd.c: + - ADJUST_LINE_NUMBER: encapsulate code that adjusts line_number in + shell functions executed in interactive shells into a macro diff --git a/doc/bash.1 b/doc/bash.1 index c1df3754..07c0f404 100644 --- a/doc/bash.1 +++ b/doc/bash.1 @@ -5,14 +5,14 @@ .\" Case Western Reserve University .\" chet.ramey@case.edu .\" -.\" Last Change: Wed Jun 12 10:31:44 PDT 2024 +.\" Last Change: Mon Jul 1 09:46:16 EDT 2024 .\" .\" bash_builtins, strip all but Built-Ins section .\" avoid a warning about an undefined register .\" .if !rzY .nr zY 0 .if \n(zZ=1 .ig zZ .if \n(zY=1 .ig zY -.TH BASH 1 "2024 June 12" "GNU Bash 5.3" +.TH BASH 1 "2024 July 1" "GNU Bash 5.3" .\" .ie \n(.g \{\ .ds ' \(aq @@ -351,9 +351,9 @@ reads and executes commands from \fI\*~/.bashrc\fP, if that file exists. This may be inhibited by using the .B \-\-norc option. -The \fB\-\-rcfile\fP \fIfile\fP option will force +The \fB\-\-rcfile\fP \fIfile\fP option will cause .B bash -to read and execute commands from \fIfile\fP instead of \fI\*~/.bashrc\fP. +to replace \fI\*~/.bashrc\fP with \fIfile\fP. .PP When .B bash @@ -448,7 +448,8 @@ The .B \-\-norc option may be used to inhibit this behavior, and the .B \-\-rcfile -option may be used to force another file to be read, but neither +option will make \fBbash\fP replace \fI\*~/.bashrc\fP with a different file, +but neither \fIrshd\fP nor \fIsshd\fP generally invoke the shell with those options or allow them to be specified. .PP diff --git a/doc/bashref.texi b/doc/bashref.texi index 2e52db8f..cd2e7b28 100644 --- a/doc/bashref.texi +++ b/doc/bashref.texi @@ -7368,8 +7368,9 @@ the file @file{~/.bash_logout}, if it exists. When an interactive shell that is not a login shell is started, Bash reads and executes commands from @file{~/.bashrc}, if that file exists. This may be inhibited by using the @option{--norc} option. -The @option{--rcfile @var{file}} option will force Bash to read and -execute commands from @var{file} instead of @file{~/.bashrc}. +The @option{--rcfile @var{file}} option will +cause Bash to +replace @file{~/.bashrc} with @var{file}. So, typically, your @file{~/.bash_profile} contains the line @example @@ -7441,8 +7442,10 @@ it reads and executes commands from @file{~/.bashrc}, if that file exists and is readable. It will not do this if invoked as @code{sh}. The @option{--norc} option may be used to inhibit this behavior, and the -@option{--rcfile} option may be used to force another file to be read, but -neither @code{rshd} nor @code{sshd} generally invoke the shell with those +@option{--rcfile} option +will make Bash replace @file{~/.bashrc} with a different file, +but neither +@code{rshd} nor @code{sshd} generally invoke the shell with those options or allow them to be specified. @subsubheading Invoked with unequal effective and real @sc{uid/gid}s diff --git a/doc/version.texi b/doc/version.texi index a4c26ca4..bef2da69 100644 --- a/doc/version.texi +++ b/doc/version.texi @@ -2,10 +2,10 @@ Copyright (C) 1988-2024 Free Software Foundation, Inc. @end ignore -@set LASTCHANGE Wed Jun 12 10:34:52 PDT 2024 +@set LASTCHANGE Mon Jul 1 09:45:45 EDT 2024 @set EDITION 5.3 @set VERSION 5.3 -@set UPDATED 12 June 2024 -@set UPDATED-MONTH June 2024 +@set UPDATED 1 July 2024 +@set UPDATED-MONTH July 2024 diff --git a/execute_cmd.c b/execute_cmd.c index 1596eae1..0142d3d9 100644 --- a/execute_cmd.c +++ b/execute_cmd.c @@ -307,6 +307,19 @@ do { \ ? line_number_for_err_trap \ : executing_line_number () +/* We adjust the line number when executing shell functions in an interactive + shell. */ +#define ADJUST_LINE_NUMBER() \ +do { \ + if (variable_context && interactive_shell && sourcelevel == 0) \ + { \ + /* line numbers in a function start at 1 */ \ + line_number -= function_line_number - 1; \ + if (line_number <= 0) \ + line_number = 1; \ + } \ +} while (0) + /* A sort of function nesting level counter */ int funcnest = 0; int funcnest_max = 0; @@ -3196,13 +3209,7 @@ execute_arith_for_command (ARITH_FOR_COM *arith_for_command) line_number before executing each expression -- for $LINENO and the DEBUG trap. */ line_number = arith_lineno = arith_for_command->line; - if (variable_context && interactive_shell && sourcelevel == 0) - { - /* line numbers in a function start at 1 */ - line_number -= function_line_number - 1; - if (line_number <= 0) - line_number = 1; - } + ADJUST_LINE_NUMBER (); /* Evaluate the initialization expression. */ expresult = eval_arith_for_expr (arith_for_command->init, &expok); @@ -3871,13 +3878,7 @@ execute_arith_command (ARITH_COM *arith_command) this_command_name = "(("; /* )) */ SET_LINE_NUMBER (arith_command->line); /* If we're in a function, update the line number information. */ - if (variable_context && interactive_shell && sourcelevel == 0) - { - /* line numbers in a function start at 1 */ - line_number -= function_line_number - 1; - if (line_number <= 0) - line_number = 1; - } + ADJUST_LINE_NUMBER (); command_string_index = 0; print_arith_command (arith_command->exp); @@ -4111,13 +4112,8 @@ execute_cond_command (COND_COM *cond_command) SET_LINE_NUMBER (cond_command->line); /* If we're in a function, update the line number information. */ - if (variable_context && interactive_shell && sourcelevel == 0) - { - /* line numbers in a function start at 1 */ - line_number -= function_line_number - 1; - if (line_number <= 0) - line_number = 1; - } + ADJUST_LINE_NUMBER (); + command_string_index = 0; print_cond_command (cond_command); @@ -4458,13 +4454,7 @@ execute_simple_command (SIMPLE_COM *simple_command, int pipe_in, int pipe_out, i QUIT; /* If we're in a function, update the line number information. */ - if (variable_context && interactive_shell && sourcelevel == 0) - { - /* line numbers in a function start at 1 */ - line_number -= function_line_number - 1; - if (line_number <= 0) - line_number = 1; - } + ADJUST_LINE_NUMBER (); /* Remember what this command line looks like at invocation. */ command_string_index = 0; @@ -4916,23 +4906,6 @@ execute_from_filesystem: pipe_in, pipe_out, async, fds_to_close, cmdflags); -#if 0 -/* If we forked but still have to fork again to run the disk command, we - did so because we created FIFOs. We can't just execve the command in case - it dies of a signal without a chance to clean up the FIFOs, so we fork - again, then make sure we wait for the child from execute_disk_command(), - unlink the FIFOs we created, and exit ourselves. */ -if (dofork && already_forked && (cmdflags & CMD_NO_FORK) == 0) - { - result = wait_for (last_made_pid, 0); -#if defined (PROCESS_SUBSTITUTION) - if (fifos_pending ()) - unlink_fifo_list (); -#endif - sh_exit (result & 0xFF); - } -#endif - return_result: bind_lastarg (lastarg); FREE (command_line); diff --git a/lib/readline/doc/rltech.texi b/lib/readline/doc/rltech.texi index 497cd4d1..56519d53 100644 --- a/lib/readline/doc/rltech.texi +++ b/lib/readline/doc/rltech.texi @@ -1526,16 +1526,8 @@ invert_case_line (count, key) if (rl_point >= rl_end) return (0); - if (count < 0) - @{ - direction = -1; - count = -count; - @} - else - direction = 1; - /* Find the end of the range to modify. */ - end = start + (count * direction); + end = start + count; /* Force it to be within range. */ if (end > rl_end) @@ -1546,6 +1538,11 @@ invert_case_line (count, key) if (start == end) return (0); + /* For positive arguments, put point after the last changed character. For + negative arguments, put point before the last changed character. */ + rl_point = end; + + /* Swap start and end if we are moving backwards */ if (start > end) @{ int temp = start; @@ -1564,8 +1561,7 @@ invert_case_line (count, key) else if (_rl_lowercase_p (rl_line_buffer[i])) rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]); @} - /* Move point to on top of the last character changed. */ - rl_point = (direction == 1) ? end - 1 : start; + return (0); @} @end example @@ -1583,7 +1579,6 @@ It understands the EOF character or "exit" to exit the program. #include #include #include -#include /* Used for select(2) */ #include @@ -1591,12 +1586,19 @@ It understands the EOF character or "exit" to exit the program. #include +#include #include +#include + /* Standard readline include files. */ #include #include +#if !defined (errno) +extern int errno; +#endif + static void cb_linehandler (char *); static void sighandler (int); @@ -1664,7 +1666,7 @@ main (int c, char **v) while (running) @{ FD_ZERO (&fds); - FD_SET (fileno (rl_instream), &fds); + FD_SET (fileno (rl_instream), &fds); r = select (FD_SETSIZE, &fds, NULL, NULL, NULL); if (r < 0 && errno != EINTR) diff --git a/lib/readline/examples/excallback.c b/lib/readline/examples/excallback.c index e8839d26..3f2744ee 100644 --- a/lib/readline/examples/excallback.c +++ b/lib/readline/examples/excallback.c @@ -54,8 +54,10 @@ Copyright (C) 1999 Jeff Solomon #ifdef READLINE_LIBRARY # include "readline.h" +# include "history.h" #else # include +# include #endif #ifndef STDIN_FILENO @@ -92,7 +94,7 @@ Copyright (C) 1999 Jeff Solomon */ void process_line(char *line); -int change_prompt(void); +int change_prompt(int, int); char *get_prompt(void); int prompt = 1; @@ -101,7 +103,7 @@ tcflag_t old_lflag; cc_t old_vtime; struct termios term; -int +int main(int c, char **v) { fd_set fds; @@ -170,31 +172,20 @@ process_line(char *line) } int -change_prompt(void) +change_prompt(int count, int key) { /* toggle the prompt variable */ prompt = !prompt; - /* save away the current contents of the line */ - strcpy(line_buf, rl_line_buffer); - - /* install a new handler which will change the prompt and erase the current line */ - rl_callback_handler_install(get_prompt(), process_line); - - /* insert the old text on the new line */ - rl_insert_text(line_buf); - - /* redraw the current line - this is an undocumented function. It invokes the - * redraw-current-line command. - */ - rl_refresh_line(0, 0); + rl_set_prompt (get_prompt ()); + return 0; } char * get_prompt(void) { /* The prompts can even be different lengths! */ - sprintf(prompt_buf, "%s", + sprintf(prompt_buf, "%s", prompt ? "Hit ctrl-t to toggle prompt> " : "Pretty cool huh?> "); return prompt_buf; } diff --git a/lib/readline/examples/rl-callbacktest.c b/lib/readline/examples/rl-callbacktest.c index 7febacd1..b6b38e8e 100644 --- a/lib/readline/examples/rl-callbacktest.c +++ b/lib/readline/examples/rl-callbacktest.c @@ -23,12 +23,15 @@ # include #endif +#if !defined (errno) extern int errno; +#endif static void cb_linehandler (char *); static void signandler (int); -int running, sigwinch_received; +int running; +int sigwinch_received; const char *prompt = "rltest$ "; /* Handle SIGWINCH and window size changes when readline is not active and @@ -73,9 +76,11 @@ main (int c, char **v) fd_set fds; int r; + /* Set the default locale values according to environment variables. */ setlocale (LC_ALL, ""); - /* Handle SIGWINCH */ + /* Handle window size changes when readline is not active and reading + characters. */ signal (SIGWINCH, sighandler); /* Install the line handler. */ diff --git a/lib/readline/examples/rl-callbacktest2.c b/lib/readline/examples/rl-callbacktest2.c index 0bf0641c..84904d53 100644 --- a/lib/readline/examples/rl-callbacktest2.c +++ b/lib/readline/examples/rl-callbacktest2.c @@ -6,13 +6,14 @@ /* Used for select(2) */ #include #include -#include #include -#include +#include #include +#include + /* Standard readline include files. */ #if defined (READLINE_LIBRARY) # include "readline.h" @@ -22,6 +23,10 @@ # include #endif +#if !defined (errno) +extern int errno; +#endif + static void cb_linehandler (char *); static void sigint_sighandler (int); static int sigint_handler (int); @@ -51,18 +56,18 @@ cb_readline (void) fd_set fds; int r, err; char *not_done = ""; - + /* Install the line handler. */ rl_callback_handler_install (prompt, cb_linehandler); -if (RL_ISSTATE (RL_STATE_ISEARCH)) - fprintf(stderr, "cb_readline: after handler install, state (ISEARCH) = %d", rl_readline_state); -else if (RL_ISSTATE (RL_STATE_NSEARCH)) - fprintf(stderr, "cb_readline: after handler install, state (NSEARCH) = %d", rl_readline_state); -/* MULTIKEY VIMOTION NUMERICARG _rl_callback_func */ + if (RL_ISSTATE (RL_STATE_ISEARCH)) + fprintf(stderr, "cb_readline: after handler install, state (ISEARCH) = %lu", rl_readline_state); + else if (RL_ISSTATE (RL_STATE_NSEARCH)) + fprintf(stderr, "cb_readline: after handler install, state (NSEARCH) = %lu", rl_readline_state); + /* MULTIKEY VIMOTION NUMERICARG _rl_callback_func */ FD_ZERO (&fds); - FD_SET (fileno (rl_instream), &fds); + FD_SET (fileno (rl_instream), &fds); input_string = not_done; @@ -76,10 +81,10 @@ else if (RL_ISSTATE (RL_STATE_NSEARCH)) while (r == 0) { struct timeval timeout = {0, 100000}; - struct timeval *timeoutp = NULL; + struct timeval *timeoutp = NULL; timeoutp = &timeout; - FD_SET (fileno (rl_instream), &fds); + FD_SET (fileno (rl_instream), &fds); r = select (FD_SETSIZE, &fds, NULL, NULL, timeoutp); err = errno; } @@ -115,7 +120,6 @@ sigint_handler (int s) rl_cleanup_after_signal (); rl_callback_handler_remove (); saw_signal = 0; -fprintf(stderr, "sigint_handler: readline state = %d\r\n", rl_readline_state); return s; } diff --git a/lib/readline/examples/rlptytest.c b/lib/readline/examples/rlptytest.c index 021a868b..22644412 100644 --- a/lib/readline/examples/rlptytest.c +++ b/lib/readline/examples/rlptytest.c @@ -19,6 +19,7 @@ #include +/* Need a configure check here to turn this into a real application. */ #if 1 /* LINUX */ #include #else @@ -31,10 +32,14 @@ #ifdef READLINE_LIBRARY # include "readline.h" +# include "history.h" #else # include +# include #endif +int tty_reset(int fd); + /** * Master/Slave PTY used to keep readline off of stdin/stdout. */ @@ -301,7 +306,8 @@ tty_off_xon_xoff (int fd) * * Returns: 0 on success, -1 on error */ -int tty_reset(int fd) +int +tty_reset(int fd) { if(ttystate != TCBREAK) return (0);