commit bash-20060202 snapshot

This commit is contained in:
Chet Ramey
2011-12-03 22:44:49 -05:00
parent ac18b31230
commit 2abb725592
12 changed files with 945 additions and 75 deletions
+31
View File
@@ -13015,3 +13015,34 @@ braces.c
- make change from 1/28 dependant on CSH_BRACE_COMPAT not being
defined (since old bash behavior is what csh does, defining
CSH_BRACE_COMPAT will produce old bash behavior)
1/30
----
bashline.c
- last argument of bash_default_completion is now a flags word:
DEFCOMP_CMDPOS (in command position) is only current value
- attempt_shell_completion now computes flags before calling
bash_default_completion
- if no_empty_command_completion is set, bash does not attempt command
word completion even if not at the beginning of the line, as long
as the word to be completed is empty and start == end (catches
beginning of line and all whitespace preceding point)
2/4
---
lib/readline/display.c
- change _rl_make_prompt_for_search to use rl_prompt and append the
search character to it, so the call to expand_prompt in rl_message
will process the non-printing characters correctly. Bug reported
by Mike Stroyan <mike.stroyan@hp.com>
2/5
---
lib/readline/display.c
- fix off-by-one error when comparing against PROMPT_ENDING_INDEX,
which caused a prompt with invisible characters to be redrawn one
extra time in a multibyte locale. Change from <= to < fixes
multibyte locale, but I added 1 to single-byte definition of
PROMPT_ENDING_INDEX (worth checking) to compensate. Bug reported
by Egmont Koblinger <egmont@uhulinux.hu>
+30 -1
View File
@@ -13014,4 +13014,33 @@ test.[ch]
braces.c
- make change from 1/28 dependant on CSH_BRACE_COMPAT not being
defined (since old bash behavior is what csh does, defining
CSH_BRACE_COMPAT produces old bash behavior)
CSH_BRACE_COMPAT will produce old bash behavior)
1/30
----
bashline.c
- last argument of bash_default_completion is now a flags word:
DEFCOMP_CMDPOS (in command position) is only current value
- attempt_shell_completion now computes flags before calling
bash_default_completion
- if no_empty_command_completion is set, bash does not attempt command
word completion even if not at the beginning of the line, as long
as the word to be completed is empty and start == end (catches
beginning of line and all whitespace preceding point)
2/4
---
lib/readline/display.c
- change _rl_make_prompt_for_search to use rl_prompt and append the
search character to it, so the call to expand_prompt in rl_message
will process the non-printing characters correctly. Bug reported
by Mike Stroyan <mike.stroyan@hp.com>
2/5
---
lib/readline/display.c
- fix off-by-one error when comparing against PROMPT_ENDING_INDEX,
which caused a prompt with invisible characters to be redrawn one
extra time in a multibyte locale. Change from <= to < fixes
multibyte locale, but I added 1 to single-byte definition of
PROMPT_ENDING_INDEX (worth checking) to compensate
+17 -17
View File
@@ -17,19 +17,19 @@
{
'm4_pattern_forbid' => 1,
'AC_CONFIG_LIBOBJ_DIR' => 1,
'AC_TYPE_OFF_T' => 1,
'AC_C_VOLATILE' => 1,
'AC_TYPE_OFF_T' => 1,
'AC_FUNC_CLOSEDIR_VOID' => 1,
'AC_REPLACE_FNMATCH' => 1,
'AC_PROG_LIBTOOL' => 1,
'AC_FUNC_STAT' => 1,
'AC_FUNC_WAIT3' => 1,
'AC_HEADER_TIME' => 1,
'AM_AUTOMAKE_VERSION' => 1,
'AC_STRUCT_TM' => 1,
'AC_FUNC_WAIT3' => 1,
'AC_FUNC_LSTAT' => 1,
'AC_FUNC_GETMNTENT' => 1,
'AC_STRUCT_TM' => 1,
'AM_AUTOMAKE_VERSION' => 1,
'AC_TYPE_MODE_T' => 1,
'AC_FUNC_GETMNTENT' => 1,
'AC_FUNC_STRTOD' => 1,
'AC_CHECK_HEADERS' => 1,
'AC_FUNC_STRNLEN' => 1,
@@ -48,17 +48,17 @@
'AC_STRUCT_ST_BLOCKS' => 1,
'AC_TYPE_SIGNAL' => 1,
'AC_TYPE_UID_T' => 1,
'AC_PROG_MAKE_SET' => 1,
'AC_CONFIG_AUX_DIR' => 1,
'm4_pattern_allow' => 1,
'AC_PROG_MAKE_SET' => 1,
'sinclude' => 1,
'm4_pattern_allow' => 1,
'AC_DEFINE_TRACE_LITERAL' => 1,
'AC_FUNC_STRERROR_R' => 1,
'AC_PROG_CC' => 1,
'AC_DECL_SYS_SIGLIST' => 1,
'AC_FUNC_FORK' => 1,
'AC_FUNC_STRCOLL' => 1,
'AC_DECL_SYS_SIGLIST' => 1,
'AC_FUNC_VPRINTF' => 1,
'AC_FUNC_STRCOLL' => 1,
'AC_PROG_YACC' => 1,
'AC_INIT' => 1,
'AC_STRUCT_TIMEZONE' => 1,
@@ -80,33 +80,33 @@
'AM_MAINTAINER_MODE' => 1,
'AC_FUNC_UTIME_NULL' => 1,
'AC_FUNC_SELECT_ARGTYPES' => 1,
'AC_HEADER_STAT' => 1,
'AC_FUNC_STRFTIME' => 1,
'AC_C_INLINE' => 1,
'AC_HEADER_STAT' => 1,
'AC_PROG_CPP' => 1,
'AC_C_CONST' => 1,
'AC_PROG_LEX' => 1,
'AC_C_INLINE' => 1,
'AC_TYPE_PID_T' => 1,
'AC_PROG_LEX' => 1,
'AC_C_CONST' => 1,
'AC_CONFIG_FILES' => 1,
'include' => 1,
'AC_FUNC_SETVBUF_REVERSED' => 1,
'AC_PROG_INSTALL' => 1,
'AM_GNU_GETTEXT' => 1,
'AC_FUNC_OBSTACK' => 1,
'AC_CHECK_LIB' => 1,
'AC_FUNC_OBSTACK' => 1,
'AC_FUNC_MALLOC' => 1,
'AC_FUNC_GETGROUPS' => 1,
'AC_FUNC_GETLOADAVG' => 1,
'AH_OUTPUT' => 1,
'AC_FUNC_FSEEKO' => 1,
'AM_PROG_CC_C_O' => 1,
'AM_CONDITIONAL' => 1,
'AC_CANONICAL_SYSTEM' => 1,
'AC_FUNC_MKTIME' => 1,
'AC_CANONICAL_SYSTEM' => 1,
'AM_CONDITIONAL' => 1,
'AC_CONFIG_HEADERS' => 1,
'AC_HEADER_SYS_WAIT' => 1,
'AC_PROG_LN_S' => 1,
'AC_FUNC_MEMCMP' => 1,
'AC_PROG_LN_S' => 1,
'm4_include' => 1,
'AC_HEADER_DIRENT' => 1,
'AC_CHECK_FUNCS' => 1
+16 -6
View File
@@ -238,6 +238,9 @@ static int dot_in_path = 0;
#define COMPLETE_BSQUOTE 3
static int completion_quoting_style = COMPLETE_BSQUOTE;
/* Flag values for the final argument to bash_default_completion */
#define DEFCOMP_CMDPOS 1
/* Change the readline VI-mode keymaps into or out of Posix.2 compliance.
Called when the shell is put into or out of `posix' mode. */
void
@@ -999,7 +1002,7 @@ attempt_shell_completion (text, start, end)
const char *text;
int start, end;
{
int in_command_position, ti, saveti, qc;
int in_command_position, ti, saveti, qc, dflags;
char **matches, *command_separator_chars;
command_separator_chars = COMMAND_SEPARATORS;
@@ -1112,15 +1115,20 @@ attempt_shell_completion (text, start, end)
#endif
if (matches == 0)
matches = bash_default_completion (text, start, end, qc, in_command_position);
{
dflags = 0;
if (in_command_position)
dflags |= DEFCOMP_CMDPOS;
matches = bash_default_completion (text, start, end, qc, dflags);
}
return matches;
}
char **
bash_default_completion (text, start, end, qc, in_command_position)
bash_default_completion (text, start, end, qc, compflags)
const char *text;
int start, end, qc, in_command_position;
int start, end, qc, compflags;
{
char **matches;
@@ -1148,9 +1156,11 @@ bash_default_completion (text, start, end, qc, in_command_position)
/* And last, (but not least) if this word is in a command position, then
complete over possible command names, including aliases, functions,
and command names. */
if (!matches && in_command_position)
if (matches == 0 && (compflags & DEFCOMP_CMDPOS))
{
if (start == 0 && end == 0 && text[0] == '\0' && no_empty_command_completion)
/* If END == START and text[0] == 0, we are trying to complete an empty
command word. */
if (no_empty_command_completion && end == start && text[0] == '\0')
{
matches = (char **)NULL;
rl_ignore_some_completions_function = bash_ignore_everything;
+3 -3
View File
@@ -77,8 +77,8 @@ extern int errno;
#endif /* !errno */
#define DEFAULT_CHILD_MAX 32
#if 1
#define MAX_JOBS_IN_ARRAY 4096 /* production*/
#if !defined (DEBUG)
#define MAX_JOBS_IN_ARRAY 4096 /* production */
#else
#define MAX_JOBS_IN_ARRAY 128 /* testing */
#endif
@@ -962,7 +962,7 @@ compact_jobs_list (flags)
reap_dead_jobs ();
realloc_jobs_list ();
return (js.j_lastj);
}
+521
View File
@@ -0,0 +1,521 @@
*** ../bash-3.1/jobs.c Fri Nov 11 23:13:27 2005
--- jobs.c Wed Feb 1 13:55:38 2006
***************
*** 4,8 ****
control. */
! /* Copyright (C) 1989-2005 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
--- 4,8 ----
control. */
! /* Copyright (C) 1989-2006 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
***************
*** 78,82 ****
#define DEFAULT_CHILD_MAX 32
! #define MAX_JOBS_IN_ARRAY 4096 /* testing */
/* Take care of system dependencies that must be handled when waiting for
--- 78,90 ----
#define DEFAULT_CHILD_MAX 32
! #if !defined (DEBUG)
! #define MAX_JOBS_IN_ARRAY 4096 /* production */
! #else
! #define MAX_JOBS_IN_ARRAY 128 /* testing */
! #endif
!
! /* Flag values for second argument to delete_job */
! #define DEL_WARNSTOPPED 1 /* warn about deleting stopped jobs */
! #define DEL_NOBGPID 2 /* don't add pgrp leader to bgpids */
/* Take care of system dependencies that must be handled when waiting for
***************
*** 308,311 ****
--- 316,323 ----
static char retcode_name_buffer[64];
+ /* flags to detect pid wraparound */
+ static pid_t first_pid = NO_PID;
+ static int pid_wrap = -1;
+
#if !defined (_POSIX_VERSION)
***************
*** 329,337 ****
#endif /* !_POSIX_VERSION */
! /* Initialize the global job stats structure. */
void
init_job_stats ()
{
js = zerojs;
}
--- 341,351 ----
#endif /* !_POSIX_VERSION */
! /* Initialize the global job stats structure and other bookkeeping variables */
void
init_job_stats ()
{
js = zerojs;
+ first_pid = NO_PID;
+ pid_wrap = -1;
}
***************
*** 620,625 ****
* the parent gives it away.
*
*/
! if (job_control && newjob->pgrp)
give_terminal_to (newjob->pgrp, 0);
}
--- 634,642 ----
* the parent gives it away.
*
+ * Don't give the terminal away if this shell is an asynchronous
+ * subshell.
+ *
*/
! if (job_control && newjob->pgrp && (subshell_environment&SUBSHELL_ASYNC) == 0)
give_terminal_to (newjob->pgrp, 0);
}
***************
*** 806,810 ****
QUEUE_SIGCHLD(os);
! /* XXX could use js.j_firstj here */
for (i = 0; i < js.j_jobslots; i++)
{
--- 823,827 ----
QUEUE_SIGCHLD(os);
! /* XXX could use js.j_firstj and js.j_lastj here */
for (i = 0; i < js.j_jobslots; i++)
{
***************
*** 812,815 ****
--- 829,834 ----
if (i < js.j_firstj && jobs[i])
itrace("cleanup_dead_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
+ if (i > js.j_lastj && jobs[i])
+ itrace("cleanup_dead_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
#endif
***************
*** 838,841 ****
--- 857,884 ----
}
+ static void
+ delete_old_job (pid)
+ pid_t pid;
+ {
+ PROCESS *p;
+ int job;
+
+ job = find_job (pid, 0, &p);
+ if (job != NO_JOB)
+ {
+ #ifdef DEBUG
+ itrace ("delete_old_job: found pid %d in job %d with state %d", pid, job, jobs[job]->state);
+ #endif
+ if (JOBSTATE (job) == JDEAD)
+ delete_job (job, DEL_NOBGPID);
+ else
+ {
+ internal_warning (_("forked pid %d appears in running job %d"), pid, job);
+ if (p)
+ p->pid = 0;
+ }
+ }
+ }
+
/* Reallocate and compress the jobs list. This returns with a jobs array
whose size is a multiple of JOB_SLOTS and can hold the current number of
***************
*** 845,851 ****
{
sigset_t set, oset;
! int nsize, i, j;
JOB **nlist;
nsize = ((js.j_njobs + JOB_SLOTS - 1) / JOB_SLOTS);
nsize *= JOB_SLOTS;
--- 888,895 ----
{
sigset_t set, oset;
! int nsize, i, j, ncur, nprev;
JOB **nlist;
+ ncur = nprev = NO_JOB;
nsize = ((js.j_njobs + JOB_SLOTS - 1) / JOB_SLOTS);
nsize *= JOB_SLOTS;
***************
*** 855,869 ****
BLOCK_CHILD (set, oset);
! nlist = (JOB **) xmalloc (nsize * sizeof (JOB *));
for (i = j = 0; i < js.j_jobslots; i++)
if (jobs[i])
! nlist[j++] = jobs[i];
js.j_firstj = 0;
! js.j_lastj = (j > 0) ? j - 1: 0;
js.j_jobslots = nsize;
! free (jobs);
! jobs = nlist;
UNBLOCK_CHILD (oset);
--- 899,947 ----
BLOCK_CHILD (set, oset);
! nlist = (js.j_jobslots == nsize) ? jobs : (JOB **) xmalloc (nsize * sizeof (JOB *));
!
for (i = j = 0; i < js.j_jobslots; i++)
if (jobs[i])
! {
! if (i == js.j_current)
! ncur = j;
! if (i == js.j_previous)
! nprev = j;
! nlist[j++] = jobs[i];
! }
!
! #if defined (DEBUG)
! itrace ("realloc_jobs_list: resize jobs list from %d to %d", js.j_jobslots, nsize);
! itrace ("realloc_jobs_list: j_lastj changed from %d to %d", js.j_lastj, (j > 0) ? j - 1 : 0);
! itrace ("realloc_jobs_list: j_njobs changed from %d to %d", js.j_njobs, (j > 0) ? j - 1 : 0);
! #endif
js.j_firstj = 0;
! js.j_lastj = (j > 0) ? j - 1 : 0;
! js.j_njobs = j;
js.j_jobslots = nsize;
! /* Zero out remaining slots in new jobs list */
! for ( ; j < nsize; j++)
! nlist[j] = (JOB *)NULL;
!
! if (jobs != nlist)
! {
! free (jobs);
! jobs = nlist;
! }
!
! if (ncur != NO_JOB)
! js.j_current = ncur;
! if (nprev != NO_JOB)
! js.j_previous = nprev;
!
! /* Need to reset these */
! if (js.j_current == NO_JOB || js.j_previous == NO_JOB || js.j_current > js.j_lastj || js.j_previous > js.j_lastj)
! reset_current ();
!
! #ifdef DEBUG
! itrace ("realloc_jobs_list: reset js.j_current (%d) and js.j_previous (%d)", js.j_current, js.j_previous);
! #endif
UNBLOCK_CHILD (oset);
***************
*** 874,878 ****
the foreground process (subshell_environment != 0). Returns the first
available slot in the compacted list. If that value is js.j_jobslots, then
! the list needs to be reallocated. The jobs array is in new memory if
this returns > 0 and < js.j_jobslots. FLAGS is reserved for future use. */
static int
--- 952,956 ----
the foreground process (subshell_environment != 0). Returns the first
available slot in the compacted list. If that value is js.j_jobslots, then
! the list needs to be reallocated. The jobs array may be in new memory if
this returns > 0 and < js.j_jobslots. FLAGS is reserved for future use. */
static int
***************
*** 892,897 ****
with SIGCHLD blocked. */
void
! delete_job (job_index, warn_stopped)
! int job_index, warn_stopped;
{
register JOB *temp;
--- 970,975 ----
with SIGCHLD blocked. */
void
! delete_job (job_index, dflags)
! int job_index, dflags;
{
register JOB *temp;
***************
*** 903,918 ****
return;
! if (warn_stopped && subshell_environment == 0 && STOPPED (job_index))
internal_warning (_("deleting stopped job %d with process group %ld"), job_index+1, (long)jobs[job_index]->pgrp);
temp = jobs[job_index];
if (job_index == js.j_current || job_index == js.j_previous)
reset_current ();
! proc = find_last_proc (job_index, 0);
! /* Could do this just for J_ASYNC jobs, but we save all. */
! bgp_add (proc->pid, process_exit_status (proc->status));
jobs[job_index] = (JOB *)NULL;
-
if (temp == js.j_lastmade)
js.j_lastmade = 0;
--- 981,1001 ----
return;
! if ((dflags & DEL_WARNSTOPPED) && subshell_environment == 0 && STOPPED (job_index))
internal_warning (_("deleting stopped job %d with process group %ld"), job_index+1, (long)jobs[job_index]->pgrp);
temp = jobs[job_index];
+ if (temp == 0)
+ return;
if (job_index == js.j_current || job_index == js.j_previous)
reset_current ();
! if ((dflags & DEL_NOBGPID) == 0)
! {
! proc = find_last_proc (job_index, 0);
! /* Could do this just for J_ASYNC jobs, but we save all. */
! if (proc)
! bgp_add (proc->pid, process_exit_status (proc->status));
! }
jobs[job_index] = (JOB *)NULL;
if (temp == js.j_lastmade)
js.j_lastmade = 0;
***************
*** 1092,1095 ****
--- 1175,1180 ----
if (i < js.j_firstj && jobs[i])
itrace("map_over_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
+ if (i > js.j_lastj && jobs[i])
+ itrace("map_over_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
#endif
if (jobs[i])
***************
*** 1224,1228 ****
PROCESS *p;
! /* XXX could use js.j_firstj here */
for (i = 0; i < js.j_jobslots; i++)
{
--- 1309,1313 ----
PROCESS *p;
! /* XXX could use js.j_firstj here, and should check js.j_lastj */
for (i = 0; i < js.j_jobslots; i++)
{
***************
*** 1230,1233 ****
--- 1315,1320 ----
if (i < js.j_firstj && jobs[i])
itrace("find_job: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
+ if (i > js.j_lastj && jobs[i])
+ itrace("find_job: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
#endif
if (jobs[i])
***************
*** 1656,1660 ****
shell's process group (we could be in the middle of a
pipeline, for example). */
! if (async_p == 0 && pipeline_pgrp != shell_pgrp)
give_terminal_to (pipeline_pgrp, 0);
--- 1743,1747 ----
shell's process group (we could be in the middle of a
pipeline, for example). */
! if (async_p == 0 && pipeline_pgrp != shell_pgrp && ((subshell_environment&SUBSHELL_ASYNC) == 0))
give_terminal_to (pipeline_pgrp, 0);
***************
*** 1698,1701 ****
--- 1785,1795 ----
as the proper pgrp if this is the first child. */
+ if (first_pid == NO_PID)
+ first_pid = pid;
+ else if (pid_wrap == -1 && pid < first_pid)
+ pid_wrap = 0;
+ else if (pid_wrap == 0 && pid >= first_pid)
+ pid_wrap = 1;
+
if (job_control)
{
***************
*** 1731,1734 ****
--- 1825,1831 ----
#endif
+ if (pid_wrap > 0)
+ delete_old_job (pid);
+
#if !defined (RECYCLES_PIDS)
/* Only check for saved status if we've saved more than CHILD_MAX
***************
*** 1915,1919 ****
p = jobs[job]->pipe;
! while (p->next != jobs[job]->pipe)
p = p->next;
--- 2012,2016 ----
p = jobs[job]->pipe;
! while (p && p->next != jobs[job]->pipe)
p = p->next;
***************
*** 1999,2003 ****
/* find first running job; if none running in foreground, break */
! /* XXX could use js.j_firstj here */
for (i = 0; i < js.j_jobslots; i++)
{
--- 2096,2100 ----
/* find first running job; if none running in foreground, break */
! /* XXX could use js.j_firstj and js.j_lastj here */
for (i = 0; i < js.j_jobslots; i++)
{
***************
*** 2005,2008 ****
--- 2102,2107 ----
if (i < js.j_firstj && jobs[i])
itrace("wait_for_background_pids: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
+ if (i > js.j_lastj && jobs[i])
+ itrace("wait_for_background_pids: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
#endif
if (jobs[i] && RUNNING (i) && IS_FOREGROUND (i) == 0)
***************
*** 2199,2203 ****
wait_sigint_received = 0;
if (job_control == 0)
! old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
termination_state = last_command_exit_value;
--- 2298,2306 ----
wait_sigint_received = 0;
if (job_control == 0)
! {
! old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
! if (old_sigint_handler == SIG_IGN)
! set_signal_handler (SIGINT, old_sigint_handler);
! }
termination_state = last_command_exit_value;
***************
*** 2266,2269 ****
--- 2369,2373 ----
child->running = PS_DONE;
child->status = 0; /* XXX -- can't find true status */
+ js.c_living = 0; /* no living child processes */
if (job != NO_JOB)
{
***************
*** 2317,2321 ****
itrace("wait_for: job == NO_JOB, giving the terminal to shell_pgrp (%ld)", (long)shell_pgrp);
#endif
-
give_terminal_to (shell_pgrp, 0);
}
--- 2421,2424 ----
***************
*** 2866,2869 ****
--- 2969,2973 ----
if (sigchld || block == 0)
waitpid_flags |= WNOHANG;
+ CHECK_TERMSIG;
pid = WAITPID (-1, &status, waitpid_flags);
***************
*** 2892,2895 ****
--- 2996,3000 ----
/* If waitpid returns 0, there are running children. If it returns -1,
the only other error POSIX says it can return is EINTR. */
+ CHECK_TERMSIG;
if (pid <= 0)
continue; /* jumps right to the test */
***************
*** 2898,2902 ****
run the trap if a process is just being continued. */
if (WIFCONTINUED(status) == 0)
! children_exited++;
/* Locate our PROCESS for this pid. */
--- 3003,3010 ----
run the trap if a process is just being continued. */
if (WIFCONTINUED(status) == 0)
! {
! children_exited++;
! js.c_living--;
! }
/* Locate our PROCESS for this pid. */
***************
*** 3123,3127 ****
restore_sigint_handler ();
if (temp_handler == SIG_DFL)
! termination_unwind_protect (SIGINT);
else if (temp_handler != SIG_IGN)
(*temp_handler) (SIGINT);
--- 3231,3235 ----
restore_sigint_handler ();
if (temp_handler == SIG_DFL)
! termsig_handler (SIGINT);
else if (temp_handler != SIG_IGN)
(*temp_handler) (SIGINT);
***************
*** 3638,3644 ****
if (i < js.j_firstj && jobs[i])
itrace("delete_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
#endif
if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
! delete_job (i, 1);
}
if (running_only == 0)
--- 3746,3754 ----
if (i < js.j_firstj && jobs[i])
itrace("delete_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
+ if (i > js.j_lastj && jobs[i])
+ itrace("delete_all_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
#endif
if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
! delete_job (i, DEL_WARNSTOPPED);
}
if (running_only == 0)
***************
*** 3692,3695 ****
--- 3802,3807 ----
if (i < js.j_firstj && jobs[i])
itrace("count_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
+ if (i > js.j_lastj && jobs[i])
+ itrace("count_all_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
#endif
if (jobs[i] && DEADJOB(i) == 0)
***************
*** 3765,3768 ****
--- 3877,3882 ----
if (i < js.j_firstj && jobs[i])
itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
+ if (i > js.j_lastj && jobs[i])
+ itrace("mark_dead_jobs_as_notified: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
#endif
if (jobs[i] && DEADJOB (i))
***************
*** 3816,3819 ****
--- 3930,3935 ----
if (i < js.j_firstj && jobs[i])
itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
+ if (i > js.j_lastj && jobs[i])
+ itrace("mark_dead_jobs_as_notified: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
#endif
/* If marking this job as notified would drop us down below
+12 -22
View File
@@ -88,7 +88,7 @@ static int inv_lbsize, vis_lbsize;
current cursor position is in the middle of a prompt string containing
invisible characters. */
#define PROMPT_ENDING_INDEX \
((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible)
((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible+1)
/* **************************************************************** */
@@ -977,7 +977,11 @@ rl_redisplay ()
invisible character in the prompt string. */
nleft = prompt_visible_length + wrap_offset;
if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 &&
#if 0
_rl_last_c_pos <= PROMPT_ENDING_INDEX && local_prompt)
#else
_rl_last_c_pos < PROMPT_ENDING_INDEX && local_prompt)
#endif
{
#if defined (__MSDOS__)
putc ('\r', rl_outstream);
@@ -1997,28 +2001,14 @@ _rl_make_prompt_for_search (pchar)
rl_save_prompt ();
if (saved_local_prompt == 0)
{
len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
pmt = (char *)xmalloc (len + 2);
if (len)
strcpy (pmt, rl_prompt);
pmt[len] = pchar;
pmt[len+1] = '\0';
}
else
{
len = *saved_local_prompt ? strlen (saved_local_prompt) : 0;
pmt = (char *)xmalloc (len + 2);
if (len)
strcpy (pmt, saved_local_prompt);
pmt[len] = pchar;
pmt[len+1] = '\0';
local_prompt = savestring (pmt);
prompt_last_invisible = saved_last_invisible;
prompt_visible_length = saved_visible_length + 1;
}
len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
pmt = (char *)xmalloc (len + 2);
if (len)
strcpy (pmt, rl_prompt);
pmt[len] = pchar;
pmt[len+1] = '\0';
/* will be overwritten by expand_prompt, called from rl_message */
prompt_physical_chars = saved_physical_chars + 1;
return pmt;
+18 -24
View File
@@ -83,6 +83,14 @@ static int inv_lbsize, vis_lbsize;
by backing up or outputting a carriage return and moving forward. */
#define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new)))
/* _rl_last_c_pos is an absolute cursor position in multibyte locales and a
buffer index in others. This macro is used when deciding whether the
current cursor position is in the middle of a prompt string containing
invisible characters. */
#define PROMPT_ENDING_INDEX \
((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible)
/* **************************************************************** */
/* */
/* Display stuff */
@@ -969,7 +977,7 @@ rl_redisplay ()
invisible character in the prompt string. */
nleft = prompt_visible_length + wrap_offset;
if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 &&
_rl_last_c_pos <= prompt_last_invisible && local_prompt)
_rl_last_c_pos <= PROMPT_ENDING_INDEX && local_prompt)
{
#if defined (__MSDOS__)
putc ('\r', rl_outstream);
@@ -1166,7 +1174,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
int col_lendiff, col_temp;
#if defined (HANDLE_MULTIBYTE)
mbstate_t ps_new, ps_old;
int new_offset, old_offset, tmp;
int new_offset, old_offset;
#endif
/* If we're at the right edge of a terminal that supports xn, we're
@@ -1403,7 +1411,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
od = ofd - old; /* index of first difference in visible line */
if (current_line == 0 && !_rl_horizontal_scroll_mode &&
_rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 &&
od >= lendiff && _rl_last_c_pos <= prompt_last_invisible)
od >= lendiff && _rl_last_c_pos <= PROMPT_ENDING_INDEX)
{
#if defined (__MSDOS__)
putc ('\r', rl_outstream);
@@ -1989,28 +1997,14 @@ _rl_make_prompt_for_search (pchar)
rl_save_prompt ();
if (saved_local_prompt == 0)
{
len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
pmt = (char *)xmalloc (len + 2);
if (len)
strcpy (pmt, rl_prompt);
pmt[len] = pchar;
pmt[len+1] = '\0';
}
else
{
len = *saved_local_prompt ? strlen (saved_local_prompt) : 0;
pmt = (char *)xmalloc (len + 2);
if (len)
strcpy (pmt, saved_local_prompt);
pmt[len] = pchar;
pmt[len+1] = '\0';
local_prompt = savestring (pmt);
prompt_last_invisible = saved_last_invisible;
prompt_visible_length = saved_visible_length + 1;
}
len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
pmt = (char *)xmalloc (len + 2);
if (len)
strcpy (pmt, rl_prompt);
pmt[len] = pchar;
pmt[len+1] = '\0';
/* will be overwritten by expand_prompt, called from rl_message */
prompt_physical_chars = saved_physical_chars + 1;
return pmt;
+4 -1
View File
@@ -69,7 +69,10 @@
#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
int rl_prefer_env_winsize;
/* If the calling application sets this to a non-zero value, readline will
use the $LINES and $COLUMNS environment variables to set its idea of the
window size before interrogating the kernel. */
int rl_prefer_env_winsize = 0;
/* **************************************************************** */
/* */
+251
View File
@@ -0,0 +1,251 @@
*** ../bash-3.1/parse.y Fri Nov 11 23:14:18 2005
--- parse.y Wed Jan 25 14:55:18 2006
***************
*** 1,5 ****
/* Yacc grammar for bash. */
! /* Copyright (C) 1989-2005 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
--- 1,5 ----
/* Yacc grammar for bash. */
! /* Copyright (C) 1989-2006 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
***************
*** 119,123 ****
extern int posixly_correct;
extern int last_command_exit_value;
- extern int interrupt_immediately;
extern char *shell_name, *current_host_name;
extern char *dist_version;
--- 119,122 ----
***************
*** 1213,1220 ****
--- 1212,1221 ----
interrupt_immediately++;
}
+ terminate_immediately = 1;
current_readline_line = readline (current_readline_prompt ?
current_readline_prompt : "");
+ terminate_immediately = 0;
if (signal_is_ignored (SIGINT) == 0 && old_sigint)
{
***************
*** 1348,1355 ****
{
if (interactive)
! interrupt_immediately++;
result = getc_with_restart (bash_input.location.file);
if (interactive)
! interrupt_immediately--;
}
return (result);
--- 1349,1362 ----
{
if (interactive)
! {
! interrupt_immediately++;
! terminate_immediately++;
! }
result = getc_with_restart (bash_input.location.file);
if (interactive)
! {
! interrupt_immediately--;
! terminate_immediately--;
! }
}
return (result);
***************
*** 2743,2751 ****
while (count)
{
- #if 0
- ch = shell_getc ((qc != '\'' || (flags & P_ALLOWESC)) && pass_next_character == 0);
- #else
ch = shell_getc (qc != '\'' && pass_next_character == 0);
! #endif
if (ch == EOF)
{
--- 2750,2755 ----
while (count)
{
ch = shell_getc (qc != '\'' && pass_next_character == 0);
!
if (ch == EOF)
{
***************
*** 2772,2776 ****
}
/* Not exactly right yet */
! else if (check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind -1])))
in_comment = 1;
--- 2776,2780 ----
}
/* Not exactly right yet */
! else if MBTEST(check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind - 1])))
in_comment = 1;
***************
*** 2799,2807 ****
else if MBTEST(ch == close) /* ending delimiter */
count--;
- #if 1
/* handle nested ${...} specially. */
else if MBTEST(open != close && was_dollar && open == '{' && ch == open) /* } */
count++;
- #endif
else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && ch == open) /* nested begin */
count++;
--- 2803,2809 ----
***************
*** 2899,2903 ****
else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0)
{
! nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags);
goto add_nestret;
}
--- 2901,2909 ----
else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0)
{
! /* Add P_ALLOWESC so backslash quotes the next character and
! shell_getc does the right thing with \<newline>. We do this for
! a measure of backwards compatibility -- it's not strictly the
! right POSIX thing. */
! nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags|P_ALLOWESC);
goto add_nestret;
}
***************
*** 2908,2912 ****
count--;
if (ch == '(') /* ) */
! nestret = parse_matched_pair (0, '(', ')', &nestlen, rflags);
else if (ch == '{') /* } */
nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags);
--- 2914,2918 ----
count--;
if (ch == '(') /* ) */
! nestret = parse_matched_pair (0, '(', ')', &nestlen, rflags & ~P_DQUOTE);
else if (ch == '{') /* } */
nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags);
***************
*** 2947,2951 ****
wd = alloc_word_desc ();
wd->word = wval;
- wd = make_word (wval);
yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL);
return (ARITH_FOR_EXPRS);
--- 2953,2956 ----
***************
*** 3497,3501 ****
else
{
! /* Try to locale)-expand the converted string. */
ttrans = localeexpand (ttok, 0, ttoklen - 1, first_line, &ttranslen);
free (ttok);
--- 3502,3506 ----
else
{
! /* Try to locale-expand the converted string. */
ttrans = localeexpand (ttok, 0, ttoklen - 1, first_line, &ttranslen);
free (ttok);
***************
*** 3579,3583 ****
all_digit_token = 0;
compound_assignment = 1;
! #if 0
goto next_character;
#else
--- 3584,3588 ----
all_digit_token = 0;
compound_assignment = 1;
! #if 1
goto next_character;
#else
***************
*** 3696,3700 ****
b = builtin_address_internal (token, 0);
if (b && (b->flags & ASSIGNMENT_BUILTIN))
! parser_state |= PST_ASSIGNOK;
}
--- 3701,3707 ----
b = builtin_address_internal (token, 0);
if (b && (b->flags & ASSIGNMENT_BUILTIN))
! parser_state |= PST_ASSIGNOK;
! else if (STREQ (token, "eval") || STREQ (token, "let"))
! parser_state |= PST_ASSIGNOK;
}
***************
*** 4247,4251 ****
}
temp = (char *)xmalloc (3);
! temp[0] = '\001';
temp[1] = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
temp[2] = '\0';
--- 4254,4258 ----
}
temp = (char *)xmalloc (3);
! temp[0] = CTLESC;
temp[1] = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
temp[2] = '\0';
***************
*** 4687,4691 ****
{
WORD_LIST *wl, *rl;
! int tok, orig_line_number, orig_token_size;
char *saved_token, *ret;
--- 4694,4698 ----
{
WORD_LIST *wl, *rl;
! int tok, orig_line_number, orig_token_size, orig_last_token, assignok;
char *saved_token, *ret;
***************
*** 4693,4696 ****
--- 4700,4704 ----
orig_token_size = token_buffer_size;
orig_line_number = line_number;
+ orig_last_token = last_read_token;
last_read_token = WORD; /* WORD to allow reserved words here */
***************
*** 4699,4702 ****
--- 4707,4712 ----
token_buffer_size = 0;
+ assignok = parser_state&PST_ASSIGNOK; /* XXX */
+
wl = (WORD_LIST *)NULL; /* ( */
parser_state |= PST_COMPASSIGN;
***************
*** 4741,4745 ****
}
! last_read_token = WORD;
if (wl)
{
--- 4751,4756 ----
}
! last_read_token = orig_last_token; /* XXX - was WORD? */
!
if (wl)
{
***************
*** 4753,4756 ****
--- 4764,4771 ----
if (retlenp)
*retlenp = (ret && *ret) ? strlen (ret) : 0;
+
+ if (assignok)
+ parser_state |= PST_ASSIGNOK;
+
return ret;
}
+41
View File
@@ -0,0 +1,41 @@
*** ../bash-3.1/lib/readline/terminal.c Sat Nov 12 20:46:54 2005
--- lib/readline/terminal.c Tue Jan 31 10:57:54 2006
***************
*** 70,74 ****
#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
! int rl_prefer_env_winsize;
/* **************************************************************** */
--- 70,77 ----
#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
! /* If the calling application sets this to a non-zero value, readline will
! use the $LINES and $COLUMNS environment variables to set its idea of the
! window size before interrogating the kernel. */
! int rl_prefer_env_winsize = 0;
/* **************************************************************** */
***************
*** 123,127 ****
/* Non-zero means the terminal can auto-wrap lines. */
! int _rl_term_autowrap;
/* Non-zero means that this terminal has a meta key. */
--- 126,130 ----
/* Non-zero means the terminal can auto-wrap lines. */
! int _rl_term_autowrap = -1;
/* Non-zero means that this terminal has a meta key. */
***************
*** 275,278 ****
--- 278,284 ----
int rows, cols;
{
+ if (_rl_term_autowrap == -1)
+ _rl_init_terminal_io (rl_terminal_name);
+
if (rows > 0)
_rl_screenheight = rows;
+1 -1
View File
@@ -1,4 +1,4 @@
BUILD_DIR=/usr/local/build/bash/bash-current
BUILD_DIR=/usr/local/build/chet/bash/bash-current
THIS_SH=$BUILD_DIR/bash
PATH=$PATH:$BUILD_DIR