source:
patches/bash-4.3-branch_update-4.patch@
5309051
Last change on this file since 5309051 was 8e2b433, checked in by , 10 years ago | |
---|---|
|
|
File size: 70.6 KB |
-
arrayfunc.c
Submitted By: William Harrington (kb0iic at cross-lfs dot org) Date: 09-26-2014 Initial Package Version: 4.3 Origin: Upstream Upstream Status: Applied Description: Contains all upstream patches up to 4.3-026 diff -Naur bash-4.3.orig/arrayfunc.c bash-4.3/arrayfunc.c
old new 179 179 array_insert (array_cell (entry), ind, newval); 180 180 FREE (newval); 181 181 182 VUNSETATTR (entry, att_invisible); /* no longer invisible */ 182 183 return (entry); 183 184 } 184 185 … … 597 598 if (assoc_p (var)) 598 599 { 599 600 val = expand_assignment_string_to_string (val, 0); 601 if (val == 0) 602 { 603 val = (char *)xmalloc (1); 604 val[0] = '\0'; /* like do_assignment_internal */ 605 } 600 606 free_val = 1; 601 607 } 602 608 -
bashline.c
diff -Naur bash-4.3.orig/bashline.c bash-4.3/bashline.c
old new 4167 4167 int qc; 4168 4168 4169 4169 qc = rl_dispatching ? rl_completion_quote_character : 0; 4170 dfn = bash_dequote_filename ((char *)text, qc); 4170 /* If rl_completion_found_quote != 0, rl_completion_matches will call the 4171 filename dequoting function, causing the directory name to be dequoted 4172 twice. */ 4173 if (rl_dispatching && rl_completion_found_quote == 0) 4174 dfn = bash_dequote_filename ((char *)text, qc); 4175 else 4176 dfn = (char *)text; 4171 4177 m1 = rl_completion_matches (dfn, rl_filename_completion_function); 4172 free (dfn); 4178 if (dfn != text) 4179 free (dfn); 4173 4180 4174 4181 if (m1 == 0 || m1[0] == 0) 4175 4182 return m1; -
builtins/common.h
diff -Naur bash-4.3.orig/builtins/common.h bash-4.3/builtins/common.h
old new 33 33 #define SEVAL_RESETLINE 0x010 34 34 #define SEVAL_PARSEONLY 0x020 35 35 #define SEVAL_NOLONGJMP 0x040 36 #define SEVAL_FUNCDEF 0x080 /* only allow function definitions */ 37 #define SEVAL_ONECMD 0x100 /* only allow a single command */ 36 38 37 39 /* Flags for describe_command, shared between type.def and command.def */ 38 40 #define CDESC_ALL 0x001 /* type -a */ -
builtins/evalstring.c
diff -Naur bash-4.3.orig/builtins/evalstring.c bash-4.3/builtins/evalstring.c
old new 308 308 { 309 309 struct fd_bitmap *bitmap; 310 310 311 if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def) 312 { 313 internal_warning ("%s: ignoring function definition attempt", from_file); 314 should_jump_to_top_level = 0; 315 last_result = last_command_exit_value = EX_BADUSAGE; 316 break; 317 } 318 311 319 bitmap = new_fd_bitmap (FD_BITMAP_SIZE); 312 320 begin_unwind_frame ("pe_dispose"); 313 321 add_unwind_protect (dispose_fd_bitmap, bitmap); … … 368 376 dispose_command (command); 369 377 dispose_fd_bitmap (bitmap); 370 378 discard_unwind_frame ("pe_dispose"); 379 380 if (flags & SEVAL_ONECMD) 381 break; 371 382 } 372 383 } 373 384 else -
builtins/read.def
diff -Naur bash-4.3.orig/builtins/read.def bash-4.3/builtins/read.def
old new 442 442 add_unwind_protect (reset_alarm, (char *)NULL); 443 443 #if defined (READLINE) 444 444 if (edit) 445 add_unwind_protect (reset_attempted_completion_function, (char *)NULL); 445 { 446 add_unwind_protect (reset_attempted_completion_function, (char *)NULL); 447 add_unwind_protect (bashline_reset_event_hook, (char *)NULL); 448 } 446 449 #endif 447 450 falarm (tmsec, tmusec); 448 451 } … … 1021 1024 1022 1025 old_attempted_completion_function = rl_attempted_completion_function; 1023 1026 rl_attempted_completion_function = (rl_completion_func_t *)NULL; 1027 bashline_set_event_hook (); 1024 1028 if (itext) 1025 1029 { 1026 1030 old_startup_hook = rl_startup_hook; … … 1032 1036 1033 1037 rl_attempted_completion_function = old_attempted_completion_function; 1034 1038 old_attempted_completion_function = (rl_completion_func_t *)NULL; 1039 bashline_reset_event_hook (); 1035 1040 1036 1041 if (ret == 0) 1037 1042 return ret; -
execute_cmd.c
diff -Naur bash-4.3.orig/execute_cmd.c bash-4.3/execute_cmd.c
old new 2409 2409 #endif 2410 2410 lstdin = wait_for (lastpid); 2411 2411 #if defined (JOB_CONTROL) 2412 exec_result = job_exit_status (lastpipe_jid); 2412 /* If wait_for removes the job from the jobs table, use result of last 2413 command as pipeline's exit status as usual. The jobs list can get 2414 frozen and unfrozen at inconvenient times if there are multiple pipelines 2415 running simultaneously. */ 2416 if (INVALID_JOB (lastpipe_jid) == 0) 2417 exec_result = job_exit_status (lastpipe_jid); 2418 else if (pipefail_opt) 2419 exec_result = exec_result | lstdin; /* XXX */ 2420 /* otherwise we use exec_result */ 2421 2413 2422 #endif 2414 2423 unfreeze_jobs_list (); 2415 2424 } -
externs.h
diff -Naur bash-4.3.orig/externs.h bash-4.3/externs.h
old new 324 324 extern char *sh_backslash_quote __P((char *, const char *, int)); 325 325 extern char *sh_backslash_quote_for_double_quotes __P((char *)); 326 326 extern int sh_contains_shell_metas __P((char *)); 327 extern int sh_contains_quotes __P((char *)); 327 328 328 329 /* declarations for functions defined in lib/sh/spell.c */ 329 330 extern int spname __P((char *, char *)); -
bash-4.3
diff -Naur bash-4.3.orig/jobs.c bash-4.3/jobs.c
old new 3597 3597 unwind_protect_int (jobs_list_frozen); 3598 3598 unwind_protect_pointer (the_pipeline); 3599 3599 unwind_protect_pointer (subst_assign_varlist); 3600 unwind_protect_pointer (this_shell_builtin); 3600 3601 3601 3602 /* We have to add the commands this way because they will be run 3602 3603 in reverse order of adding. We don't want maybe_set_sigchld_trap () … … 4374 4375 void 4375 4376 end_job_control () 4376 4377 { 4377 if (interactive_shell ) /* XXX - should it be interactive? */4378 if (interactive_shell || job_control) /* XXX - should it be just job_control? */ 4378 4379 { 4379 4380 terminate_stopped_jobs (); 4380 4381 -
lib/glob/glob.c
diff -Naur bash-4.3.orig/lib/glob/glob.c bash-4.3/lib/glob/glob.c
old new 123 123 extern char *glob_patscan __P((char *, char *, int)); 124 124 extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int)); 125 125 126 extern char *glob_dirscan __P((char *, int)); 127 126 128 /* Compile `glob_loop.c' for single-byte characters. */ 127 129 #define CHAR unsigned char 128 130 #define INT int … … 179 181 char *pat, *dname; 180 182 int flags; 181 183 { 182 char *pp, *pe, *t ;183 int n, r ;184 char *pp, *pe, *t, *se; 185 int n, r, negate; 184 186 187 negate = *pat == '!'; 185 188 pp = pat + 2; 186 pe = pp + strlen (pp) - 1; /*(*/ 187 if (*pe != ')') 189 se = pp + strlen (pp) - 1; /* end of string */ 190 pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */ 191 /* we should check for invalid extglob pattern here */ 192 if (pe == 0) 188 193 return 0; 189 if ((t = strchr (pp, '|')) == 0) /* easy case first */ 194 195 /* if pe != se we have more of the pattern at the end of the extglob 196 pattern. Check the easy case first ( */ 197 if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0) 190 198 { 191 199 *pe = '\0'; 200 #if defined (HANDLE_MULTIBYTE) 201 r = mbskipname (pp, dname, flags); 202 #else 192 203 r = skipname (pp, dname, flags); /*(*/ 204 #endif 193 205 *pe = ')'; 194 206 return r; 195 207 } 208 209 /* check every subpattern */ 196 210 while (t = glob_patscan (pp, pe, '|')) 197 211 { 198 212 n = t[-1]; 199 213 t[-1] = '\0'; 214 #if defined (HANDLE_MULTIBYTE) 215 r = mbskipname (pp, dname, flags); 216 #else 200 217 r = skipname (pp, dname, flags); 218 #endif 201 219 t[-1] = n; 202 220 if (r == 0) /* if any pattern says not skip, we don't skip */ 203 221 return r; 204 222 pp = t; 205 223 } /*(*/ 206 224 207 if (pp == pe) /* glob_patscan might find end of pattern */ 225 /* glob_patscan might find end of pattern */ 226 if (pp == se) 208 227 return r; 209 228 210 *pe = '\0'; 211 # if defined (HANDLE_MULTIBYTE) 212 r = mbskipname (pp, dname, flags); /*(*/ 213 # else 214 r = skipname (pp, dname, flags); /*(*/ 215 # endif 216 *pe = ')'; 217 return r; 229 /* but if it doesn't then we didn't match a leading dot */ 230 return 0; 218 231 } 219 232 #endif 220 233 … … 277 290 int flags; 278 291 { 279 292 #if EXTENDED_GLOB 280 wchar_t *pp, *pe, *t, n ;281 int r ;293 wchar_t *pp, *pe, *t, n, *se; 294 int r, negate; 282 295 296 negate = *pat == L'!'; 283 297 pp = pat + 2; 284 pe = pp + wcslen (pp) - 1; /*(*/285 if (*pe != L')')286 return 0; 287 if ( (t = wcschr (pp, L'|')) == 0)298 se = pp + wcslen (pp) - 1; /*(*/ 299 pe = glob_patscan_wc (pp, se, 0); 300 301 if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0) 288 302 { 289 303 *pe = L'\0'; 290 304 r = wchkname (pp, dname); /*(*/ 291 305 *pe = L')'; 292 306 return r; 293 307 } 308 309 /* check every subpattern */ 294 310 while (t = glob_patscan_wc (pp, pe, '|')) 295 311 { 296 312 n = t[-1]; … … 305 321 if (pp == pe) /* glob_patscan_wc might find end of pattern */ 306 322 return r; 307 323 308 *pe = L'\0'; 309 r = wchkname (pp, dname); /*(*/ 310 *pe = L')'; 311 return r; 324 /* but if it doesn't then we didn't match a leading dot */ 325 return 0; 312 326 #else 313 327 return (wchkname (pat, dname)); 314 328 #endif … … 1006 1020 { 1007 1021 char **result; 1008 1022 unsigned int result_size; 1009 char *directory_name, *filename, *dname ;1023 char *directory_name, *filename, *dname, *fn; 1010 1024 unsigned int directory_len; 1011 1025 int free_dirname; /* flag */ 1012 1026 int dflags; … … 1022 1036 1023 1037 /* Find the filename. */ 1024 1038 filename = strrchr (pathname, '/'); 1039 #if defined (EXTENDED_GLOB) 1040 if (filename && extended_glob) 1041 { 1042 fn = glob_dirscan (pathname, '/'); 1043 #if DEBUG_MATCHING 1044 if (fn != filename) 1045 fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename); 1046 #endif 1047 filename = fn; 1048 } 1049 #endif 1050 1025 1051 if (filename == NULL) 1026 1052 { 1027 1053 filename = pathname; -
lib/glob/gmisc.c
diff -Naur bash-4.3.orig/lib/glob/gmisc.c bash-4.3/lib/glob/gmisc.c
old new 42 42 #define WLPAREN L'(' 43 43 #define WRPAREN L')' 44 44 45 extern char *glob_patscan __P((char *, char *, int)); 46 45 47 /* Return 1 of the first character of WSTRING could match the first 46 48 character of pattern WPAT. Wide character version. */ 47 49 int … … 210 212 case '+': 211 213 case '!': 212 214 case '@': 215 case '?': 213 216 return (pat[1] == LPAREN); 214 217 default: 215 218 return 0; … … 374 377 375 378 return matlen; 376 379 } 380 381 /* Skip characters in PAT and return the final occurrence of DIRSEP. This 382 is only called when extended_glob is set, so we have to skip over extglob 383 patterns x(...) */ 384 char * 385 glob_dirscan (pat, dirsep) 386 char *pat; 387 int dirsep; 388 { 389 char *p, *d, *pe, *se; 390 391 d = pe = se = 0; 392 for (p = pat; p && *p; p++) 393 { 394 if (extglob_pattern_p (p)) 395 { 396 if (se == 0) 397 se = p + strlen (p) - 1; 398 pe = glob_patscan (p + 2, se, 0); 399 if (pe == 0) 400 continue; 401 else if (*pe == 0) 402 break; 403 p = pe - 1; /* will do increment above */ 404 continue; 405 } 406 if (*p == dirsep) 407 d = p; 408 } 409 return d; 410 } -
lib/readline/display.c
diff -Naur bash-4.3.orig/lib/readline/display.c bash-4.3/lib/readline/display.c
old new 1637 1637 /* If we are changing the number of invisible characters in a line, and 1638 1638 the spot of first difference is before the end of the invisible chars, 1639 1639 lendiff needs to be adjusted. */ 1640 if (current_line == 0 && !_rl_horizontal_scroll_mode &&1640 if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */ 1641 1641 current_invis_chars != visible_wrap_offset) 1642 1642 { 1643 1643 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) … … 1825 1825 else 1826 1826 _rl_last_c_pos += bytes_to_insert; 1827 1827 1828 /* XXX - we only want to do this if we are at the end of the line 1829 so we move there with _rl_move_cursor_relative */ 1828 1830 if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new))) 1829 goto clear_rest_of_line; 1831 { 1832 _rl_move_cursor_relative (ne-new, new); 1833 goto clear_rest_of_line; 1834 } 1830 1835 } 1831 1836 } 1832 1837 /* Otherwise, print over the existing material. */ … … 2677 2682 { 2678 2683 if (_rl_echoing_p) 2679 2684 { 2680 _rl_move_vert (_rl_vis_botlin); 2685 if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */ 2686 _rl_move_vert (_rl_vis_botlin); 2681 2687 _rl_vis_botlin = 0; 2682 2688 fflush (rl_outstream); 2683 2689 rl_restart_output (1, 0); -
lib/readline/input.c
diff -Naur bash-4.3.orig/lib/readline/input.c bash-4.3/lib/readline/input.c
old new 534 534 return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); 535 535 else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM) 536 536 return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); 537 /* keyboard-generated signals of interest */ 537 538 else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT) 538 539 RL_CHECK_SIGNALS (); 540 /* non-keyboard-generated signals of interest */ 541 else if (_rl_caught_signal == SIGALRM 542 #if defined (SIGVTALRM) 543 || _rl_caught_signal == SIGVTALRM 544 #endif 545 ) 546 RL_CHECK_SIGNALS (); 539 547 540 548 if (rl_signal_event_hook) 541 549 (*rl_signal_event_hook) (); -
lib/readline/misc.c
diff -Naur bash-4.3.orig/lib/readline/misc.c bash-4.3/lib/readline/misc.c
old new 461 461 saved_undo_list = 0; 462 462 /* Set up rl_line_buffer and other variables from history entry */ 463 463 rl_replace_from_history (entry, 0); /* entry->line is now current */ 464 entry->data = 0; /* entry->data is now current undo list */ 464 465 /* Undo all changes to this history entry */ 465 466 while (rl_undo_list) 466 467 rl_do_undo (); … … 468 469 the timestamp. */ 469 470 FREE (entry->line); 470 471 entry->line = savestring (rl_line_buffer); 471 entry->data = 0;472 472 } 473 473 entry = previous_history (); 474 474 } -
lib/readline/readline.c
diff -Naur bash-4.3.orig/lib/readline/readline.c bash-4.3/lib/readline/readline.c
old new 744 744 r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); 745 745 746 746 RL_CHECK_SIGNALS (); 747 if (r == 0) /* success! */ 747 /* We only treat values < 0 specially to simulate recursion. */ 748 if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */ 748 749 { 749 750 _rl_keyseq_chain_dispose (); 750 751 RL_UNSETSTATE (RL_STATE_MULTIKEY); … … 964 965 #if defined (VI_MODE) 965 966 if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && 966 967 key != ANYOTHERKEY && 967 rl_key_sequence_length == 1 && /* XXX */968 _rl_dispatching_keymap == vi_movement_keymap && 968 969 _rl_vi_textmod_command (key)) 969 970 _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); 970 971 #endif -
lib/readline/readline.c.orig
diff -Naur bash-4.3.orig/lib/readline/readline.c.orig bash-4.3/lib/readline/readline.c.orig
old new 1 /* readline.c -- a general facility for reading lines of input 2 with emacs style editing and completion. */ 3 4 /* Copyright (C) 1987-2013 Free Software Foundation, Inc. 5 6 This file is part of the GNU Readline Library (Readline), a library 7 for reading lines of text with interactive input and history editing. 8 9 Readline is free software: you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation, either version 3 of the License, or 12 (at your option) any later version. 13 14 Readline is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with Readline. If not, see <http://www.gnu.org/licenses/>. 21 */ 22 23 #define READLINE_LIBRARY 24 25 #if defined (HAVE_CONFIG_H) 26 # include <config.h> 27 #endif 28 29 #include <sys/types.h> 30 #include "posixstat.h" 31 #include <fcntl.h> 32 #if defined (HAVE_SYS_FILE_H) 33 # include <sys/file.h> 34 #endif /* HAVE_SYS_FILE_H */ 35 36 #if defined (HAVE_UNISTD_H) 37 # include <unistd.h> 38 #endif /* HAVE_UNISTD_H */ 39 40 #if defined (HAVE_STDLIB_H) 41 # include <stdlib.h> 42 #else 43 # include "ansi_stdlib.h" 44 #endif /* HAVE_STDLIB_H */ 45 46 #if defined (HAVE_LOCALE_H) 47 # include <locale.h> 48 #endif 49 50 #include <stdio.h> 51 #include "posixjmp.h" 52 #include <errno.h> 53 54 #if !defined (errno) 55 extern int errno; 56 #endif /* !errno */ 57 58 /* System-specific feature definitions and include files. */ 59 #include "rldefs.h" 60 #include "rlmbutil.h" 61 62 #if defined (__EMX__) 63 # define INCL_DOSPROCESS 64 # include <os2.h> 65 #endif /* __EMX__ */ 66 67 /* Some standard library routines. */ 68 #include "readline.h" 69 #include "history.h" 70 71 #include "rlprivate.h" 72 #include "rlshell.h" 73 #include "xmalloc.h" 74 75 #ifndef RL_LIBRARY_VERSION 76 # define RL_LIBRARY_VERSION "5.1" 77 #endif 78 79 #ifndef RL_READLINE_VERSION 80 # define RL_READLINE_VERSION 0x0501 81 #endif 82 83 extern void _rl_free_history_entry PARAMS((HIST_ENTRY *)); 84 85 #if defined (COLOR_SUPPORT) 86 extern void _rl_parse_colors PARAMS((void)); /* XXX */ 87 #endif 88 89 90 /* Forward declarations used in this file. */ 91 static char *readline_internal PARAMS((void)); 92 static void readline_initialize_everything PARAMS((void)); 93 94 static void bind_arrow_keys_internal PARAMS((Keymap)); 95 static void bind_arrow_keys PARAMS((void)); 96 97 static void readline_default_bindings PARAMS((void)); 98 static void reset_default_bindings PARAMS((void)); 99 100 static int _rl_subseq_result PARAMS((int, Keymap, int, int)); 101 static int _rl_subseq_getchar PARAMS((int)); 102 103 /* **************************************************************** */ 104 /* */ 105 /* Line editing input utility */ 106 /* */ 107 /* **************************************************************** */ 108 109 const char *rl_library_version = RL_LIBRARY_VERSION; 110 111 int rl_readline_version = RL_READLINE_VERSION; 112 113 /* True if this is `real' readline as opposed to some stub substitute. */ 114 int rl_gnu_readline_p = 1; 115 116 /* A pointer to the keymap that is currently in use. 117 By default, it is the standard emacs keymap. */ 118 Keymap _rl_keymap = emacs_standard_keymap; 119 120 /* The current style of editing. */ 121 int rl_editing_mode = emacs_mode; 122 123 /* The current insert mode: input (the default) or overwrite */ 124 int rl_insert_mode = RL_IM_DEFAULT; 125 126 /* Non-zero if we called this function from _rl_dispatch(). It's present 127 so functions can find out whether they were called from a key binding 128 or directly from an application. */ 129 int rl_dispatching; 130 131 /* Non-zero if the previous command was a kill command. */ 132 int _rl_last_command_was_kill = 0; 133 134 /* The current value of the numeric argument specified by the user. */ 135 int rl_numeric_arg = 1; 136 137 /* Non-zero if an argument was typed. */ 138 int rl_explicit_arg = 0; 139 140 /* Temporary value used while generating the argument. */ 141 int rl_arg_sign = 1; 142 143 /* Non-zero means we have been called at least once before. */ 144 static int rl_initialized; 145 146 #if 0 147 /* If non-zero, this program is running in an EMACS buffer. */ 148 static int running_in_emacs; 149 #endif 150 151 /* Flags word encapsulating the current readline state. */ 152 int rl_readline_state = RL_STATE_NONE; 153 154 /* The current offset in the current input line. */ 155 int rl_point; 156 157 /* Mark in the current input line. */ 158 int rl_mark; 159 160 /* Length of the current input line. */ 161 int rl_end; 162 163 /* Make this non-zero to return the current input_line. */ 164 int rl_done; 165 166 /* The last function executed by readline. */ 167 rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL; 168 169 /* Top level environment for readline_internal (). */ 170 procenv_t _rl_top_level; 171 172 /* The streams we interact with. */ 173 FILE *_rl_in_stream, *_rl_out_stream; 174 175 /* The names of the streams that we do input and output to. */ 176 FILE *rl_instream = (FILE *)NULL; 177 FILE *rl_outstream = (FILE *)NULL; 178 179 /* Non-zero means echo characters as they are read. Defaults to no echo; 180 set to 1 if there is a controlling terminal, we can get its attributes, 181 and the attributes include `echo'. Look at rltty.c:prepare_terminal_settings 182 for the code that sets it. */ 183 int _rl_echoing_p = 0; 184 185 /* Current prompt. */ 186 char *rl_prompt = (char *)NULL; 187 int rl_visible_prompt_length = 0; 188 189 /* Set to non-zero by calling application if it has already printed rl_prompt 190 and does not want readline to do it the first time. */ 191 int rl_already_prompted = 0; 192 193 /* The number of characters read in order to type this complete command. */ 194 int rl_key_sequence_length = 0; 195 196 /* If non-zero, then this is the address of a function to call just 197 before readline_internal_setup () prints the first prompt. */ 198 rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL; 199 200 /* If non-zero, this is the address of a function to call just before 201 readline_internal_setup () returns and readline_internal starts 202 reading input characters. */ 203 rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL; 204 205 /* What we use internally. You should always refer to RL_LINE_BUFFER. */ 206 static char *the_line; 207 208 /* The character that can generate an EOF. Really read from 209 the terminal driver... just defaulted here. */ 210 int _rl_eof_char = CTRL ('D'); 211 212 /* Non-zero makes this the next keystroke to read. */ 213 int rl_pending_input = 0; 214 215 /* Pointer to a useful terminal name. */ 216 const char *rl_terminal_name = (const char *)NULL; 217 218 /* Non-zero means to always use horizontal scrolling in line display. */ 219 int _rl_horizontal_scroll_mode = 0; 220 221 /* Non-zero means to display an asterisk at the starts of history lines 222 which have been modified. */ 223 int _rl_mark_modified_lines = 0; 224 225 /* The style of `bell' notification preferred. This can be set to NO_BELL, 226 AUDIBLE_BELL, or VISIBLE_BELL. */ 227 int _rl_bell_preference = AUDIBLE_BELL; 228 229 /* String inserted into the line by rl_insert_comment (). */ 230 char *_rl_comment_begin; 231 232 /* Keymap holding the function currently being executed. */ 233 Keymap rl_executing_keymap; 234 235 /* Keymap we're currently using to dispatch. */ 236 Keymap _rl_dispatching_keymap; 237 238 /* Non-zero means to erase entire line, including prompt, on empty input lines. */ 239 int rl_erase_empty_line = 0; 240 241 /* Non-zero means to read only this many characters rather than up to a 242 character bound to accept-line. */ 243 int rl_num_chars_to_read; 244 245 /* Line buffer and maintenance. */ 246 char *rl_line_buffer = (char *)NULL; 247 int rl_line_buffer_len = 0; 248 249 /* Key sequence `contexts' */ 250 _rl_keyseq_cxt *_rl_kscxt = 0; 251 252 int rl_executing_key; 253 char *rl_executing_keyseq = 0; 254 int _rl_executing_keyseq_size = 0; 255 256 /* Timeout (specified in milliseconds) when reading characters making up an 257 ambiguous multiple-key sequence */ 258 int _rl_keyseq_timeout = 500; 259 260 #define RESIZE_KEYSEQ_BUFFER() \ 261 do \ 262 { \ 263 if (rl_key_sequence_length + 2 >= _rl_executing_keyseq_size) \ 264 { \ 265 _rl_executing_keyseq_size += 16; \ 266 rl_executing_keyseq = xrealloc (rl_executing_keyseq, _rl_executing_keyseq_size); \ 267 } \ 268 } \ 269 while (0); 270 271 /* Forward declarations used by the display, termcap, and history code. */ 272 273 /* **************************************************************** */ 274 /* */ 275 /* `Forward' declarations */ 276 /* */ 277 /* **************************************************************** */ 278 279 /* Non-zero means do not parse any lines other than comments and 280 parser directives. */ 281 unsigned char _rl_parsing_conditionalized_out = 0; 282 283 /* Non-zero means to convert characters with the meta bit set to 284 escape-prefixed characters so we can indirect through 285 emacs_meta_keymap or vi_escape_keymap. */ 286 int _rl_convert_meta_chars_to_ascii = 1; 287 288 /* Non-zero means to output characters with the meta bit set directly 289 rather than as a meta-prefixed escape sequence. */ 290 int _rl_output_meta_chars = 0; 291 292 /* Non-zero means to look at the termios special characters and bind 293 them to equivalent readline functions at startup. */ 294 int _rl_bind_stty_chars = 1; 295 296 /* Non-zero means to go through the history list at every newline (or 297 whenever rl_done is set and readline returns) and revert each line to 298 its initial state. */ 299 int _rl_revert_all_at_newline = 0; 300 301 /* Non-zero means to honor the termios ECHOCTL bit and echo control 302 characters corresponding to keyboard-generated signals. */ 303 int _rl_echo_control_chars = 1; 304 305 /* Non-zero means to prefix the displayed prompt with a character indicating 306 the editing mode: @ for emacs, : for vi-command, + for vi-insert. */ 307 int _rl_show_mode_in_prompt = 0; 308 309 /* **************************************************************** */ 310 /* */ 311 /* Top Level Functions */ 312 /* */ 313 /* **************************************************************** */ 314 315 /* Non-zero means treat 0200 bit in terminal input as Meta bit. */ 316 int _rl_meta_flag = 0; /* Forward declaration */ 317 318 /* Set up the prompt and expand it. Called from readline() and 319 rl_callback_handler_install (). */ 320 int 321 rl_set_prompt (prompt) 322 const char *prompt; 323 { 324 FREE (rl_prompt); 325 rl_prompt = prompt ? savestring (prompt) : (char *)NULL; 326 rl_display_prompt = rl_prompt ? rl_prompt : ""; 327 328 rl_visible_prompt_length = rl_expand_prompt (rl_prompt); 329 return 0; 330 } 331 332 /* Read a line of input. Prompt with PROMPT. An empty PROMPT means 333 none. A return value of NULL means that EOF was encountered. */ 334 char * 335 readline (prompt) 336 const char *prompt; 337 { 338 char *value; 339 #if 0 340 int in_callback; 341 #endif 342 343 /* If we are at EOF return a NULL string. */ 344 if (rl_pending_input == EOF) 345 { 346 rl_clear_pending_input (); 347 return ((char *)NULL); 348 } 349 350 #if 0 351 /* If readline() is called after installing a callback handler, temporarily 352 turn off the callback state to avoid ensuing messiness. Patch supplied 353 by the gdb folks. XXX -- disabled. This can be fooled and readline 354 left in a strange state by a poorly-timed longjmp. */ 355 if (in_callback = RL_ISSTATE (RL_STATE_CALLBACK)) 356 RL_UNSETSTATE (RL_STATE_CALLBACK); 357 #endif 358 359 rl_set_prompt (prompt); 360 361 rl_initialize (); 362 if (rl_prep_term_function) 363 (*rl_prep_term_function) (_rl_meta_flag); 364 365 #if defined (HANDLE_SIGNALS) 366 rl_set_signals (); 367 #endif 368 369 value = readline_internal (); 370 if (rl_deprep_term_function) 371 (*rl_deprep_term_function) (); 372 373 #if defined (HANDLE_SIGNALS) 374 rl_clear_signals (); 375 #endif 376 377 #if 0 378 if (in_callback) 379 RL_SETSTATE (RL_STATE_CALLBACK); 380 #endif 381 382 #if HAVE_DECL_AUDIT_TTY && defined (ENABLE_TTY_AUDIT_SUPPORT) 383 if (value) 384 _rl_audit_tty (value); 385 #endif 386 387 return (value); 388 } 389 390 #if defined (READLINE_CALLBACKS) 391 # define STATIC_CALLBACK 392 #else 393 # define STATIC_CALLBACK static 394 #endif 395 396 STATIC_CALLBACK void 397 readline_internal_setup () 398 { 399 char *nprompt; 400 401 _rl_in_stream = rl_instream; 402 _rl_out_stream = rl_outstream; 403 404 /* Enable the meta key only for the duration of readline(), if this 405 terminal has one and the terminal has been initialized */ 406 if (_rl_enable_meta & RL_ISSTATE (RL_STATE_TERMPREPPED)) 407 _rl_enable_meta_key (); 408 409 if (rl_startup_hook) 410 (*rl_startup_hook) (); 411 412 #if defined (VI_MODE) 413 if (rl_editing_mode == vi_mode) 414 rl_vi_insertion_mode (1, 'i'); /* don't want to reset last */ 415 #endif /* VI_MODE */ 416 417 /* If we're not echoing, we still want to at least print a prompt, because 418 rl_redisplay will not do it for us. If the calling application has a 419 custom redisplay function, though, let that function handle it. */ 420 if (_rl_echoing_p == 0 && rl_redisplay_function == rl_redisplay) 421 { 422 if (rl_prompt && rl_already_prompted == 0) 423 { 424 nprompt = _rl_strip_prompt (rl_prompt); 425 fprintf (_rl_out_stream, "%s", nprompt); 426 fflush (_rl_out_stream); 427 xfree (nprompt); 428 } 429 } 430 else 431 { 432 if (rl_prompt && rl_already_prompted) 433 rl_on_new_line_with_prompt (); 434 else 435 rl_on_new_line (); 436 (*rl_redisplay_function) (); 437 } 438 439 if (rl_pre_input_hook) 440 (*rl_pre_input_hook) (); 441 442 RL_CHECK_SIGNALS (); 443 } 444 445 STATIC_CALLBACK char * 446 readline_internal_teardown (eof) 447 int eof; 448 { 449 char *temp; 450 HIST_ENTRY *entry; 451 452 RL_CHECK_SIGNALS (); 453 454 /* Restore the original of this history line, iff the line that we 455 are editing was originally in the history, AND the line has changed. */ 456 entry = current_history (); 457 458 if (entry && rl_undo_list) 459 { 460 temp = savestring (the_line); 461 rl_revert_line (1, 0); 462 entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL); 463 _rl_free_history_entry (entry); 464 465 strcpy (the_line, temp); 466 xfree (temp); 467 } 468 469 if (_rl_revert_all_at_newline) 470 _rl_revert_all_lines (); 471 472 /* At any rate, it is highly likely that this line has an undo list. Get 473 rid of it now. */ 474 if (rl_undo_list) 475 rl_free_undo_list (); 476 477 /* Disable the meta key, if this terminal has one and we were told to use it. 478 The check whether or not we sent the enable string is in 479 _rl_disable_meta_key(); the flag is set in _rl_enable_meta_key */ 480 _rl_disable_meta_key (); 481 482 /* Restore normal cursor, if available. */ 483 _rl_set_insert_mode (RL_IM_INSERT, 0); 484 485 return (eof ? (char *)NULL : savestring (the_line)); 486 } 487 488 void 489 _rl_internal_char_cleanup () 490 { 491 #if defined (VI_MODE) 492 /* In vi mode, when you exit insert mode, the cursor moves back 493 over the previous character. We explicitly check for that here. */ 494 if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) 495 rl_vi_check (); 496 #endif /* VI_MODE */ 497 498 if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read) 499 { 500 (*rl_redisplay_function) (); 501 _rl_want_redisplay = 0; 502 rl_newline (1, '\n'); 503 } 504 505 if (rl_done == 0) 506 { 507 (*rl_redisplay_function) (); 508 _rl_want_redisplay = 0; 509 } 510 511 /* If the application writer has told us to erase the entire line if 512 the only character typed was something bound to rl_newline, do so. */ 513 if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline && 514 rl_point == 0 && rl_end == 0) 515 _rl_erase_entire_line (); 516 } 517 518 STATIC_CALLBACK int 519 #if defined (READLINE_CALLBACKS) 520 readline_internal_char () 521 #else 522 readline_internal_charloop () 523 #endif 524 { 525 static int lastc, eof_found; 526 int c, code, lk; 527 528 lastc = -1; 529 eof_found = 0; 530 531 #if !defined (READLINE_CALLBACKS) 532 while (rl_done == 0) 533 { 534 #endif 535 lk = _rl_last_command_was_kill; 536 537 #if defined (HAVE_POSIX_SIGSETJMP) 538 code = sigsetjmp (_rl_top_level, 0); 539 #else 540 code = setjmp (_rl_top_level); 541 #endif 542 543 if (code) 544 { 545 (*rl_redisplay_function) (); 546 _rl_want_redisplay = 0; 547 /* If we get here, we're not being called from something dispatched 548 from _rl_callback_read_char(), which sets up its own value of 549 _rl_top_level (saving and restoring the old, of course), so 550 we can just return here. */ 551 if (RL_ISSTATE (RL_STATE_CALLBACK)) 552 return (0); 553 } 554 555 if (rl_pending_input == 0) 556 { 557 /* Then initialize the argument and number of keys read. */ 558 _rl_reset_argument (); 559 rl_key_sequence_length = 0; 560 rl_executing_keyseq[0] = 0; 561 } 562 563 RL_SETSTATE(RL_STATE_READCMD); 564 c = rl_read_key (); 565 RL_UNSETSTATE(RL_STATE_READCMD); 566 567 /* look at input.c:rl_getc() for the circumstances under which this will 568 be returned; punt immediately on read error without converting it to 569 a newline; assume that rl_read_key has already called the signal 570 handler. */ 571 if (c == READERR) 572 { 573 #if defined (READLINE_CALLBACKS) 574 RL_SETSTATE(RL_STATE_DONE); 575 return (rl_done = 1); 576 #else 577 eof_found = 1; 578 break; 579 #endif 580 } 581 582 /* EOF typed to a non-blank line is a <NL>. If we want to change this, 583 to force any existing line to be ignored when read(2) reads EOF, 584 for example, this is the place to change. */ 585 if (c == EOF && rl_end) 586 c = NEWLINE; 587 588 /* The character _rl_eof_char typed to blank line, and not as the 589 previous character is interpreted as EOF. */ 590 if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end) 591 { 592 #if defined (READLINE_CALLBACKS) 593 RL_SETSTATE(RL_STATE_DONE); 594 return (rl_done = 1); 595 #else 596 eof_found = 1; 597 break; 598 #endif 599 } 600 601 lastc = c; 602 _rl_dispatch ((unsigned char)c, _rl_keymap); 603 RL_CHECK_SIGNALS (); 604 605 /* If there was no change in _rl_last_command_was_kill, then no kill 606 has taken place. Note that if input is pending we are reading 607 a prefix command, so nothing has changed yet. */ 608 if (rl_pending_input == 0 && lk == _rl_last_command_was_kill) 609 _rl_last_command_was_kill = 0; 610 611 _rl_internal_char_cleanup (); 612 613 #if defined (READLINE_CALLBACKS) 614 return 0; 615 #else 616 } 617 618 return (eof_found); 619 #endif 620 } 621 622 #if defined (READLINE_CALLBACKS) 623 static int 624 readline_internal_charloop () 625 { 626 int eof = 1; 627 628 while (rl_done == 0) 629 eof = readline_internal_char (); 630 return (eof); 631 } 632 #endif /* READLINE_CALLBACKS */ 633 634 /* Read a line of input from the global rl_instream, doing output on 635 the global rl_outstream. 636 If rl_prompt is non-null, then that is our prompt. */ 637 static char * 638 readline_internal () 639 { 640 int eof; 641 642 readline_internal_setup (); 643 eof = readline_internal_charloop (); 644 return (readline_internal_teardown (eof)); 645 } 646 647 void 648 _rl_init_line_state () 649 { 650 rl_point = rl_end = rl_mark = 0; 651 the_line = rl_line_buffer; 652 the_line[0] = 0; 653 } 654 655 void 656 _rl_set_the_line () 657 { 658 the_line = rl_line_buffer; 659 } 660 661 #if defined (READLINE_CALLBACKS) 662 _rl_keyseq_cxt * 663 _rl_keyseq_cxt_alloc () 664 { 665 _rl_keyseq_cxt *cxt; 666 667 cxt = (_rl_keyseq_cxt *)xmalloc (sizeof (_rl_keyseq_cxt)); 668 669 cxt->flags = cxt->subseq_arg = cxt->subseq_retval = 0; 670 671 cxt->okey = 0; 672 cxt->ocxt = _rl_kscxt; 673 cxt->childval = 42; /* sentinel value */ 674 675 return cxt; 676 } 677 678 void 679 _rl_keyseq_cxt_dispose (cxt) 680 _rl_keyseq_cxt *cxt; 681 { 682 xfree (cxt); 683 } 684 685 void 686 _rl_keyseq_chain_dispose () 687 { 688 _rl_keyseq_cxt *cxt; 689 690 while (_rl_kscxt) 691 { 692 cxt = _rl_kscxt; 693 _rl_kscxt = _rl_kscxt->ocxt; 694 _rl_keyseq_cxt_dispose (cxt); 695 } 696 } 697 #endif 698 699 static int 700 _rl_subseq_getchar (key) 701 int key; 702 { 703 int k; 704 705 if (key == ESC) 706 RL_SETSTATE(RL_STATE_METANEXT); 707 RL_SETSTATE(RL_STATE_MOREINPUT); 708 k = rl_read_key (); 709 RL_UNSETSTATE(RL_STATE_MOREINPUT); 710 if (key == ESC) 711 RL_UNSETSTATE(RL_STATE_METANEXT); 712 713 return k; 714 } 715 716 #if defined (READLINE_CALLBACKS) 717 int 718 _rl_dispatch_callback (cxt) 719 _rl_keyseq_cxt *cxt; 720 { 721 int nkey, r; 722 723 /* For now */ 724 /* The first time this context is used, we want to read input and dispatch 725 on it. When traversing the chain of contexts back `up', we want to use 726 the value from the next context down. We're simulating recursion using 727 a chain of contexts. */ 728 if ((cxt->flags & KSEQ_DISPATCHED) == 0) 729 { 730 nkey = _rl_subseq_getchar (cxt->okey); 731 if (nkey < 0) 732 { 733 _rl_abort_internal (); 734 return -1; 735 } 736 r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg); 737 cxt->flags |= KSEQ_DISPATCHED; 738 } 739 else 740 r = cxt->childval; 741 742 /* For now */ 743 if (r != -3) /* don't do this if we indicate there will be other matches */ 744 r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); 745 746 RL_CHECK_SIGNALS (); 747 /* We only treat values < 0 specially to simulate recursion. */ 748 if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */ 749 { 750 _rl_keyseq_chain_dispose (); 751 RL_UNSETSTATE (RL_STATE_MULTIKEY); 752 return r; 753 } 754 755 if (r != -3) /* magic value that says we added to the chain */ 756 _rl_kscxt = cxt->ocxt; 757 if (_rl_kscxt) 758 _rl_kscxt->childval = r; 759 if (r != -3) 760 _rl_keyseq_cxt_dispose (cxt); 761 762 return r; 763 } 764 #endif /* READLINE_CALLBACKS */ 765 766 /* Do the command associated with KEY in MAP. 767 If the associated command is really a keymap, then read 768 another key, and dispatch into that map. */ 769 int 770 _rl_dispatch (key, map) 771 register int key; 772 Keymap map; 773 { 774 _rl_dispatching_keymap = map; 775 return _rl_dispatch_subseq (key, map, 0); 776 } 777 778 int 779 _rl_dispatch_subseq (key, map, got_subseq) 780 register int key; 781 Keymap map; 782 int got_subseq; 783 { 784 int r, newkey; 785 char *macro; 786 rl_command_func_t *func; 787 #if defined (READLINE_CALLBACKS) 788 _rl_keyseq_cxt *cxt; 789 #endif 790 791 if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii) 792 { 793 if (map[ESC].type == ISKMAP) 794 { 795 if (RL_ISSTATE (RL_STATE_MACRODEF)) 796 _rl_add_macro_char (ESC); 797 RESIZE_KEYSEQ_BUFFER (); 798 rl_executing_keyseq[rl_key_sequence_length++] = ESC; 799 map = FUNCTION_TO_KEYMAP (map, ESC); 800 key = UNMETA (key); 801 return (_rl_dispatch (key, map)); 802 } 803 else 804 rl_ding (); 805 return 0; 806 } 807 808 if (RL_ISSTATE (RL_STATE_MACRODEF)) 809 _rl_add_macro_char (key); 810 811 r = 0; 812 switch (map[key].type) 813 { 814 case ISFUNC: 815 func = map[key].function; 816 if (func) 817 { 818 /* Special case rl_do_lowercase_version (). */ 819 if (func == rl_do_lowercase_version) 820 /* Should we do anything special if key == ANYOTHERKEY? */ 821 return (_rl_dispatch (_rl_to_lower (key), map)); 822 823 rl_executing_keymap = map; 824 rl_executing_key = key; 825 826 RESIZE_KEYSEQ_BUFFER(); 827 rl_executing_keyseq[rl_key_sequence_length++] = key; 828 rl_executing_keyseq[rl_key_sequence_length] = '\0'; 829 830 rl_dispatching = 1; 831 RL_SETSTATE(RL_STATE_DISPATCHING); 832 r = (*func) (rl_numeric_arg * rl_arg_sign, key); 833 RL_UNSETSTATE(RL_STATE_DISPATCHING); 834 rl_dispatching = 0; 835 836 /* If we have input pending, then the last command was a prefix 837 command. Don't change the state of rl_last_func. Otherwise, 838 remember the last command executed in this variable. */ 839 if (rl_pending_input == 0 && map[key].function != rl_digit_argument) 840 rl_last_func = map[key].function; 841 842 RL_CHECK_SIGNALS (); 843 } 844 else if (map[ANYOTHERKEY].function) 845 { 846 /* OK, there's no function bound in this map, but there is a 847 shadow function that was overridden when the current keymap 848 was created. Return -2 to note that. */ 849 if (RL_ISSTATE (RL_STATE_MACROINPUT)) 850 _rl_prev_macro_key (); 851 else 852 _rl_unget_char (key); 853 return -2; 854 } 855 else if (got_subseq) 856 { 857 /* Return -1 to note that we're in a subsequence, but we don't 858 have a matching key, nor was one overridden. This means 859 we need to back up the recursion chain and find the last 860 subsequence that is bound to a function. */ 861 if (RL_ISSTATE (RL_STATE_MACROINPUT)) 862 _rl_prev_macro_key (); 863 else 864 _rl_unget_char (key); 865 return -1; 866 } 867 else 868 { 869 #if defined (READLINE_CALLBACKS) 870 RL_UNSETSTATE (RL_STATE_MULTIKEY); 871 _rl_keyseq_chain_dispose (); 872 #endif 873 _rl_abort_internal (); 874 return -1; 875 } 876 break; 877 878 case ISKMAP: 879 if (map[key].function != 0) 880 { 881 #if defined (VI_MODE) 882 /* The only way this test will be true is if a subsequence has been 883 bound starting with ESC, generally the arrow keys. What we do is 884 check whether there's input in the queue, which there generally 885 will be if an arrow key has been pressed, and, if there's not, 886 just dispatch to (what we assume is) rl_vi_movement_mode right 887 away. This is essentially an input test with a zero timeout (by 888 default) or a timeout determined by the value of `keyseq-timeout' */ 889 /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued 890 takes microseconds, so multiply by 1000 */ 891 if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap 892 && _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0) 893 return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); 894 #endif 895 896 RESIZE_KEYSEQ_BUFFER (); 897 rl_executing_keyseq[rl_key_sequence_length++] = key; 898 _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key); 899 900 /* Allocate new context here. Use linked contexts (linked through 901 cxt->ocxt) to simulate recursion */ 902 #if defined (READLINE_CALLBACKS) 903 if (RL_ISSTATE (RL_STATE_CALLBACK)) 904 { 905 /* Return 0 only the first time, to indicate success to 906 _rl_callback_read_char. The rest of the time, we're called 907 from _rl_dispatch_callback, so we return -3 to indicate 908 special handling is necessary. */ 909 r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0; 910 cxt = _rl_keyseq_cxt_alloc (); 911 912 if (got_subseq) 913 cxt->flags |= KSEQ_SUBSEQ; 914 cxt->okey = key; 915 cxt->oldmap = map; 916 cxt->dmap = _rl_dispatching_keymap; 917 cxt->subseq_arg = got_subseq || cxt->dmap[ANYOTHERKEY].function; 918 919 RL_SETSTATE (RL_STATE_MULTIKEY); 920 _rl_kscxt = cxt; 921 922 return r; /* don't indicate immediate success */ 923 } 924 #endif 925 926 /* Tentative inter-character timeout for potential multi-key 927 sequences? If no input within timeout, abort sequence and 928 act as if we got non-matching input. */ 929 /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued 930 takes microseconds, so multiply by 1000 */ 931 if (_rl_keyseq_timeout > 0 && 932 (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && 933 _rl_pushed_input_available () == 0 && 934 _rl_dispatching_keymap[ANYOTHERKEY].function && 935 _rl_input_queued (_rl_keyseq_timeout*1000) == 0) 936 return (_rl_subseq_result (-2, map, key, got_subseq)); 937 938 newkey = _rl_subseq_getchar (key); 939 if (newkey < 0) 940 { 941 _rl_abort_internal (); 942 return -1; 943 } 944 945 r = _rl_dispatch_subseq (newkey, _rl_dispatching_keymap, got_subseq || map[ANYOTHERKEY].function); 946 return _rl_subseq_result (r, map, key, got_subseq); 947 } 948 else 949 { 950 _rl_abort_internal (); 951 return -1; 952 } 953 break; 954 955 case ISMACR: 956 if (map[key].function != 0) 957 { 958 rl_executing_keyseq[rl_key_sequence_length] = '\0'; 959 macro = savestring ((char *)map[key].function); 960 _rl_with_macro_input (macro); 961 return 0; 962 } 963 break; 964 } 965 #if defined (VI_MODE) 966 if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && 967 key != ANYOTHERKEY && 968 rl_key_sequence_length == 1 && /* XXX */ 969 _rl_vi_textmod_command (key)) 970 _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); 971 #endif 972 973 return (r); 974 } 975 976 static int 977 _rl_subseq_result (r, map, key, got_subseq) 978 int r; 979 Keymap map; 980 int key, got_subseq; 981 { 982 Keymap m; 983 int type, nt; 984 rl_command_func_t *func, *nf; 985 986 if (r == -2) 987 /* We didn't match anything, and the keymap we're indexed into 988 shadowed a function previously bound to that prefix. Call 989 the function. The recursive call to _rl_dispatch_subseq has 990 already taken care of pushing any necessary input back onto 991 the input queue with _rl_unget_char. */ 992 { 993 m = _rl_dispatching_keymap; 994 type = m[ANYOTHERKEY].type; 995 func = m[ANYOTHERKEY].function; 996 if (type == ISFUNC && func == rl_do_lowercase_version) 997 r = _rl_dispatch (_rl_to_lower (key), map); 998 else if (type == ISFUNC && func == rl_insert) 999 { 1000 /* If the function that was shadowed was self-insert, we 1001 somehow need a keymap with map[key].func == self-insert. 1002 Let's use this one. */ 1003 nt = m[key].type; 1004 nf = m[key].function; 1005 1006 m[key].type = type; 1007 m[key].function = func; 1008 r = _rl_dispatch (key, m); 1009 m[key].type = nt; 1010 m[key].function = nf; 1011 } 1012 else 1013 r = _rl_dispatch (ANYOTHERKEY, m); 1014 } 1015 else if (r && map[ANYOTHERKEY].function) 1016 { 1017 /* We didn't match (r is probably -1), so return something to 1018 tell the caller that it should try ANYOTHERKEY for an 1019 overridden function. */ 1020 if (RL_ISSTATE (RL_STATE_MACROINPUT)) 1021 _rl_prev_macro_key (); 1022 else 1023 _rl_unget_char (key); 1024 _rl_dispatching_keymap = map; 1025 return -2; 1026 } 1027 else if (r && got_subseq) 1028 { 1029 /* OK, back up the chain. */ 1030 if (RL_ISSTATE (RL_STATE_MACROINPUT)) 1031 _rl_prev_macro_key (); 1032 else 1033 _rl_unget_char (key); 1034 _rl_dispatching_keymap = map; 1035 return -1; 1036 } 1037 1038 return r; 1039 } 1040 1041 /* **************************************************************** */ 1042 /* */ 1043 /* Initializations */ 1044 /* */ 1045 /* **************************************************************** */ 1046 1047 /* Initialize readline (and terminal if not already). */ 1048 int 1049 rl_initialize () 1050 { 1051 /* If we have never been called before, initialize the 1052 terminal and data structures. */ 1053 if (!rl_initialized) 1054 { 1055 RL_SETSTATE(RL_STATE_INITIALIZING); 1056 readline_initialize_everything (); 1057 RL_UNSETSTATE(RL_STATE_INITIALIZING); 1058 rl_initialized++; 1059 RL_SETSTATE(RL_STATE_INITIALIZED); 1060 } 1061 1062 /* Initialize the current line information. */ 1063 _rl_init_line_state (); 1064 1065 /* We aren't done yet. We haven't even gotten started yet! */ 1066 rl_done = 0; 1067 RL_UNSETSTATE(RL_STATE_DONE); 1068 1069 /* Tell the history routines what is going on. */ 1070 _rl_start_using_history (); 1071 1072 /* Make the display buffer match the state of the line. */ 1073 rl_reset_line_state (); 1074 1075 /* No such function typed yet. */ 1076 rl_last_func = (rl_command_func_t *)NULL; 1077 1078 /* Parsing of key-bindings begins in an enabled state. */ 1079 _rl_parsing_conditionalized_out = 0; 1080 1081 #if defined (VI_MODE) 1082 if (rl_editing_mode == vi_mode) 1083 _rl_vi_initialize_line (); 1084 #endif 1085 1086 /* Each line starts in insert mode (the default). */ 1087 _rl_set_insert_mode (RL_IM_DEFAULT, 1); 1088 1089 return 0; 1090 } 1091 1092 #if 0 1093 #if defined (__EMX__) 1094 static void 1095 _emx_build_environ () 1096 { 1097 TIB *tibp; 1098 PIB *pibp; 1099 char *t, **tp; 1100 int c; 1101 1102 DosGetInfoBlocks (&tibp, &pibp); 1103 t = pibp->pib_pchenv; 1104 for (c = 1; *t; c++) 1105 t += strlen (t) + 1; 1106 tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *)); 1107 t = pibp->pib_pchenv; 1108 while (*t) 1109 { 1110 *tp++ = t; 1111 t += strlen (t) + 1; 1112 } 1113 *tp = 0; 1114 } 1115 #endif /* __EMX__ */ 1116 #endif 1117 1118 /* Initialize the entire state of the world. */ 1119 static void 1120 readline_initialize_everything () 1121 { 1122 #if 0 1123 #if defined (__EMX__) 1124 if (environ == 0) 1125 _emx_build_environ (); 1126 #endif 1127 #endif 1128 1129 #if 0 1130 /* Find out if we are running in Emacs -- UNUSED. */ 1131 running_in_emacs = sh_get_env_value ("EMACS") != (char *)0; 1132 #endif 1133 1134 /* Set up input and output if they are not already set up. */ 1135 if (!rl_instream) 1136 rl_instream = stdin; 1137 1138 if (!rl_outstream) 1139 rl_outstream = stdout; 1140 1141 /* Bind _rl_in_stream and _rl_out_stream immediately. These values 1142 may change, but they may also be used before readline_internal () 1143 is called. */ 1144 _rl_in_stream = rl_instream; 1145 _rl_out_stream = rl_outstream; 1146 1147 /* Allocate data structures. */ 1148 if (rl_line_buffer == 0) 1149 rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE); 1150 1151 /* Initialize the terminal interface. */ 1152 if (rl_terminal_name == 0) 1153 rl_terminal_name = sh_get_env_value ("TERM"); 1154 _rl_init_terminal_io (rl_terminal_name); 1155 1156 /* Bind tty characters to readline functions. */ 1157 readline_default_bindings (); 1158 1159 /* Initialize the function names. */ 1160 rl_initialize_funmap (); 1161 1162 /* Decide whether we should automatically go into eight-bit mode. */ 1163 _rl_init_eightbit (); 1164 1165 /* Read in the init file. */ 1166 rl_read_init_file ((char *)NULL); 1167 1168 /* XXX */ 1169 if (_rl_horizontal_scroll_mode && _rl_term_autowrap) 1170 { 1171 _rl_screenwidth--; 1172 _rl_screenchars -= _rl_screenheight; 1173 } 1174 1175 /* Override the effect of any `set keymap' assignments in the 1176 inputrc file. */ 1177 rl_set_keymap_from_edit_mode (); 1178 1179 /* Try to bind a common arrow key prefix, if not already bound. */ 1180 bind_arrow_keys (); 1181 1182 /* If the completion parser's default word break characters haven't 1183 been set yet, then do so now. */ 1184 if (rl_completer_word_break_characters == (char *)NULL) 1185 rl_completer_word_break_characters = (char *)rl_basic_word_break_characters; 1186 1187 #if defined (COLOR_SUPPORT) 1188 if (_rl_colored_stats) 1189 _rl_parse_colors (); 1190 #endif 1191 1192 rl_executing_keyseq = malloc (_rl_executing_keyseq_size = 16); 1193 if (rl_executing_keyseq) 1194 rl_executing_keyseq[0] = '\0'; 1195 } 1196 1197 /* If this system allows us to look at the values of the regular 1198 input editing characters, then bind them to their readline 1199 equivalents, iff the characters are not bound to keymaps. */ 1200 static void 1201 readline_default_bindings () 1202 { 1203 if (_rl_bind_stty_chars) 1204 rl_tty_set_default_bindings (_rl_keymap); 1205 } 1206 1207 /* Reset the default bindings for the terminal special characters we're 1208 interested in back to rl_insert and read the new ones. */ 1209 static void 1210 reset_default_bindings () 1211 { 1212 if (_rl_bind_stty_chars) 1213 { 1214 rl_tty_unset_default_bindings (_rl_keymap); 1215 rl_tty_set_default_bindings (_rl_keymap); 1216 } 1217 } 1218 1219 /* Bind some common arrow key sequences in MAP. */ 1220 static void 1221 bind_arrow_keys_internal (map) 1222 Keymap map; 1223 { 1224 Keymap xkeymap; 1225 1226 xkeymap = _rl_keymap; 1227 _rl_keymap = map; 1228 1229 #if defined (__MSDOS__) 1230 rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history); 1231 rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char); 1232 rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char); 1233 rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history); 1234 #endif 1235 1236 rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history); 1237 rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history); 1238 rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char); 1239 rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char); 1240 rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line); 1241 rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line); 1242 1243 rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history); 1244 rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history); 1245 rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char); 1246 rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char); 1247 rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line); 1248 rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line); 1249 1250 #if defined (__MINGW32__) 1251 rl_bind_keyseq_if_unbound ("\340H", rl_get_previous_history); 1252 rl_bind_keyseq_if_unbound ("\340P", rl_get_next_history); 1253 rl_bind_keyseq_if_unbound ("\340M", rl_forward_char); 1254 rl_bind_keyseq_if_unbound ("\340K", rl_backward_char); 1255 rl_bind_keyseq_if_unbound ("\340G", rl_beg_of_line); 1256 rl_bind_keyseq_if_unbound ("\340O", rl_end_of_line); 1257 rl_bind_keyseq_if_unbound ("\340S", rl_delete); 1258 rl_bind_keyseq_if_unbound ("\340R", rl_overwrite_mode); 1259 1260 /* These may or may not work because of the embedded NUL. */ 1261 rl_bind_keyseq_if_unbound ("\\000H", rl_get_previous_history); 1262 rl_bind_keyseq_if_unbound ("\\000P", rl_get_next_history); 1263 rl_bind_keyseq_if_unbound ("\\000M", rl_forward_char); 1264 rl_bind_keyseq_if_unbound ("\\000K", rl_backward_char); 1265 rl_bind_keyseq_if_unbound ("\\000G", rl_beg_of_line); 1266 rl_bind_keyseq_if_unbound ("\\000O", rl_end_of_line); 1267 rl_bind_keyseq_if_unbound ("\\000S", rl_delete); 1268 rl_bind_keyseq_if_unbound ("\\000R", rl_overwrite_mode); 1269 #endif 1270 1271 _rl_keymap = xkeymap; 1272 } 1273 1274 /* Try and bind the common arrow key prefixes after giving termcap and 1275 the inputrc file a chance to bind them and create `real' keymaps 1276 for the arrow key prefix. */ 1277 static void 1278 bind_arrow_keys () 1279 { 1280 bind_arrow_keys_internal (emacs_standard_keymap); 1281 1282 #if defined (VI_MODE) 1283 bind_arrow_keys_internal (vi_movement_keymap); 1284 /* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC 1285 in vi command mode while still allowing the arrow keys to work. */ 1286 if (vi_movement_keymap[ESC].type == ISKMAP) 1287 rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap); 1288 bind_arrow_keys_internal (vi_insertion_keymap); 1289 #endif 1290 } 1291 1292 /* **************************************************************** */ 1293 /* */ 1294 /* Saving and Restoring Readline's state */ 1295 /* */ 1296 /* **************************************************************** */ 1297 1298 int 1299 rl_save_state (sp) 1300 struct readline_state *sp; 1301 { 1302 if (sp == 0) 1303 return -1; 1304 1305 sp->point = rl_point; 1306 sp->end = rl_end; 1307 sp->mark = rl_mark; 1308 sp->buffer = rl_line_buffer; 1309 sp->buflen = rl_line_buffer_len; 1310 sp->ul = rl_undo_list; 1311 sp->prompt = rl_prompt; 1312 1313 sp->rlstate = rl_readline_state; 1314 sp->done = rl_done; 1315 sp->kmap = _rl_keymap; 1316 1317 sp->lastfunc = rl_last_func; 1318 sp->insmode = rl_insert_mode; 1319 sp->edmode = rl_editing_mode; 1320 sp->kseqlen = rl_key_sequence_length; 1321 sp->inf = rl_instream; 1322 sp->outf = rl_outstream; 1323 sp->pendingin = rl_pending_input; 1324 sp->macro = rl_executing_macro; 1325 1326 sp->catchsigs = rl_catch_signals; 1327 sp->catchsigwinch = rl_catch_sigwinch; 1328 1329 return (0); 1330 } 1331 1332 int 1333 rl_restore_state (sp) 1334 struct readline_state *sp; 1335 { 1336 if (sp == 0) 1337 return -1; 1338 1339 rl_point = sp->point; 1340 rl_end = sp->end; 1341 rl_mark = sp->mark; 1342 the_line = rl_line_buffer = sp->buffer; 1343 rl_line_buffer_len = sp->buflen; 1344 rl_undo_list = sp->ul; 1345 rl_prompt = sp->prompt; 1346 1347 rl_readline_state = sp->rlstate; 1348 rl_done = sp->done; 1349 _rl_keymap = sp->kmap; 1350 1351 rl_last_func = sp->lastfunc; 1352 rl_insert_mode = sp->insmode; 1353 rl_editing_mode = sp->edmode; 1354 rl_key_sequence_length = sp->kseqlen; 1355 rl_instream = sp->inf; 1356 rl_outstream = sp->outf; 1357 rl_pending_input = sp->pendingin; 1358 rl_executing_macro = sp->macro; 1359 1360 rl_catch_signals = sp->catchsigs; 1361 rl_catch_sigwinch = sp->catchsigwinch; 1362 1363 return (0); 1364 } -
lib/sh/shquote.c
diff -Naur bash-4.3.orig/lib/sh/shquote.c bash-4.3/lib/sh/shquote.c
old new 311 311 312 312 return (0); 313 313 } 314 315 int 316 sh_contains_quotes (string) 317 char *string; 318 { 319 char *s; 320 321 for (s = string; s && *s; s++) 322 { 323 if (*s == '\'' || *s == '"' || *s == '\\') 324 return 1; 325 } 326 return 0; 327 } -
parse.y
diff -Naur bash-4.3.orig/parse.y bash-4.3/parse.y
old new 2424 2424 not already end in an EOF character. */ 2425 2425 if (shell_input_line_terminator != EOF) 2426 2426 { 2427 if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)2427 if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size)) 2428 2428 shell_input_line = (char *)xrealloc (shell_input_line, 2429 2429 1 + (shell_input_line_size += 2)); 2430 2430 … … 2642 2642 int r; 2643 2643 2644 2644 r = 0; 2645 while (need_here_doc )2645 while (need_here_doc > 0) 2646 2646 { 2647 2647 parser_state |= PST_HEREDOC; 2648 2648 make_here_document (redir_stack[r++], line_number); … … 2953 2953 FREE (word_desc_to_read); 2954 2954 word_desc_to_read = (WORD_DESC *)NULL; 2955 2955 2956 eol_ungetc_lookahead = 0; 2957 2956 2958 current_token = '\n'; /* XXX */ 2957 2959 last_read_token = '\n'; 2958 2960 token_to_read = '\n'; … … 3398 3400 within a double-quoted ${...} construct "an even number of 3399 3401 unescaped double-quotes or single-quotes, if any, shall occur." */ 3400 3402 /* This was changed in Austin Group Interp 221 */ 3401 if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')3403 if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') 3402 3404 continue; 3403 3405 3404 3406 /* Could also check open == '`' if we want to parse grouping constructs … … 6075 6077 6076 6078 ps->expand_aliases = expand_aliases; 6077 6079 ps->echo_input_at_read = echo_input_at_read; 6080 ps->need_here_doc = need_here_doc; 6078 6081 6079 6082 ps->token = token; 6080 6083 ps->token_buffer_size = token_buffer_size; … … 6123 6126 6124 6127 expand_aliases = ps->expand_aliases; 6125 6128 echo_input_at_read = ps->echo_input_at_read; 6129 need_here_doc = ps->need_here_doc; 6126 6130 6127 6131 FREE (token); 6128 6132 token = ps->token; -
patchlevel.h
diff -Naur bash-4.3.orig/patchlevel.h bash-4.3/patchlevel.h
old new 25 25 regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh 26 26 looks for to find the patch level (for the sccs version string). */ 27 27 28 #define PATCHLEVEL 028 #define PATCHLEVEL 26 29 29 30 30 #endif /* _PATCHLEVEL_H_ */ -
pcomplete.c
diff -Naur bash-4.3.orig/pcomplete.c bash-4.3/pcomplete.c
old new 183 183 184 184 COMPSPEC *pcomp_curcs; 185 185 const char *pcomp_curcmd; 186 const char *pcomp_curtxt; 186 187 187 188 #ifdef DEBUG 188 189 /* Debugging code */ … … 753 754 quoted strings. */ 754 755 dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); 755 756 } 757 /* Intended to solve a mismatched assumption by bash-completion. If 758 the text to be completed is empty, but bash-completion turns it into 759 a quoted string ('') assuming that this code will dequote it before 760 calling readline, do the dequoting. */ 761 else if (iscompgen && iscompleting && 762 pcomp_curtxt && *pcomp_curtxt == 0 && 763 text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 && 764 rl_filename_dequoting_function) 765 dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); 766 /* Another mismatched assumption by bash-completion. If compgen is being 767 run as part of bash-completion, and the argument to compgen is not 768 the same as the word originally passed to the programmable completion 769 code, dequote the argument if it has quote characters. It's an 770 attempt to detect when bash-completion is quoting its filename 771 argument before calling compgen. */ 772 /* We could check whether gen_shell_function_matches is in the call 773 stack by checking whether the gen-shell-function-matches tag is in 774 the unwind-protect stack, but there's no function to do that yet. 775 We could simply check whether we're executing in a function by 776 checking variable_context, and may end up doing that. */ 777 else if (iscompgen && iscompleting && rl_filename_dequoting_function && 778 pcomp_curtxt && text && 779 STREQ (pcomp_curtxt, text) == 0 && 780 variable_context && 781 sh_contains_quotes (text)) /* guess */ 782 dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); 756 783 else 757 784 dfn = savestring (text); 758 785 } … … 1522 1549 COMPSPEC **lastcs; 1523 1550 { 1524 1551 COMPSPEC *cs, *oldcs; 1525 const char *oldcmd ;1552 const char *oldcmd, *oldtxt; 1526 1553 STRINGLIST *ret; 1527 1554 1528 1555 cs = progcomp_search (ocmd); … … 1545 1572 1546 1573 oldcs = pcomp_curcs; 1547 1574 oldcmd = pcomp_curcmd; 1575 oldtxt = pcomp_curtxt; 1548 1576 1549 1577 pcomp_curcs = cs; 1550 1578 pcomp_curcmd = cmd; 1579 pcomp_curtxt = word; 1551 1580 1552 1581 ret = gen_compspec_completions (cs, cmd, word, start, end, foundp); 1553 1582 1554 1583 pcomp_curcs = oldcs; 1555 1584 pcomp_curcmd = oldcmd; 1585 pcomp_curtxt = oldtxt; 1556 1586 1557 1587 /* We need to conditionally handle setting *retryp here */ 1558 1588 if (retryp) -
shell.h
diff -Naur bash-4.3.orig/shell.h bash-4.3/shell.h
old new 168 168 /* flags state affecting the parser */ 169 169 int expand_aliases; 170 170 int echo_input_at_read; 171 171 int need_here_doc; 172 172 173 } sh_parser_state_t; 173 174 174 175 typedef struct _sh_input_line_state_t { -
subst.c
diff -Naur bash-4.3.orig/subst.c bash-4.3/subst.c
old new 1192 1192 Start extracting at (SINDEX) as if we had just seen "<(". 1193 1193 Make (SINDEX) get the position of the matching ")". */ /*))*/ 1194 1194 char * 1195 extract_process_subst (string, starter, sindex )1195 extract_process_subst (string, starter, sindex, xflags) 1196 1196 char *string; 1197 1197 char *starter; 1198 1198 int *sindex; 1199 int xflags; 1199 1200 { 1201 #if 0 1200 1202 return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND)); 1203 #else 1204 xflags |= (no_longjmp_on_fatal_error ? SX_NOLONGJMP : 0); 1205 return (xparse_dolparen (string, string+*sindex, sindex, xflags)); 1206 #endif 1201 1207 } 1202 1208 #endif /* PROCESS_SUBSTITUTION */ 1203 1209 … … 1785 1791 si = i + 2; 1786 1792 if (string[si] == '\0') 1787 1793 CQ_RETURN(si); 1788 temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si );1794 temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si, 0); 1789 1795 free (temp); /* no SX_ALLOC here */ 1790 1796 i = si; 1791 1797 if (string[i] == '\0') … … 3248 3254 if (w->word == 0 || w->word[0] == '\0') 3249 3255 return ((char *)NULL); 3250 3256 3257 expand_no_split_dollar_star = 1; 3251 3258 w->flags |= W_NOSPLIT2; 3252 3259 l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0); 3260 expand_no_split_dollar_star = 0; 3253 3261 if (l) 3254 3262 { 3255 3263 if (special == 0) /* LHS */ … … 7366 7374 } 7367 7375 7368 7376 if (want_indir) 7369 tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at); 7377 { 7378 tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at); 7379 /* Turn off the W_ARRAYIND flag because there is no way for this function 7380 to return the index we're supposed to be using. */ 7381 if (tdesc && tdesc->flags) 7382 tdesc->flags &= ~W_ARRAYIND; 7383 } 7370 7384 else 7371 7385 tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS)), &ind); 7372 7386 … … 7847 7861 We also want to make sure that splitting is done no matter what -- 7848 7862 according to POSIX.2, this expands to a list of the positional 7849 7863 parameters no matter what IFS is set to. */ 7864 /* XXX - what to do when in a context where word splitting is not 7865 performed? Even when IFS is not the default, posix seems to imply 7866 that we behave like unquoted $* ? Maybe we should use PF_NOSPLIT2 7867 here. */ 7850 7868 temp = string_list_dollar_at (list, (pflags & PF_ASSIGNRHS) ? (quoted|Q_DOUBLE_QUOTES) : quoted); 7851 7869 7852 7870 tflag |= W_DOLLARAT; … … 8029 8047 8030 8048 goto return0; 8031 8049 } 8032 else if (var = find_variable_last_nameref (temp1)) 8050 else if (var && (invisible_p (var) || var_isset (var) == 0)) 8051 temp = (char *)NULL; 8052 else if ((var = find_variable_last_nameref (temp1)) && var_isset (var) && invisible_p (var) == 0) 8033 8053 { 8034 8054 temp = nameref_cell (var); 8035 8055 #if defined (ARRAY_VARS) … … 8243 8263 else 8244 8264 t_index = sindex + 1; /* skip past both '<' and LPAREN */ 8245 8265 8246 temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index ); /*))*/8266 temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index, 0); /*))*/ 8247 8267 sindex = t_index; 8248 8268 8249 8269 /* If the process substitution specification is `<()', we want to … … 8816 8836 else 8817 8837 { 8818 8838 char *ifs_chars; 8839 char *tstring; 8819 8840 8820 8841 ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL; 8821 8842 … … 8830 8851 regardless of what else has happened to IFS since the expansion. */ 8831 8852 if (split_on_spaces) 8832 8853 list = list_string (istring, " ", 1); /* XXX quoted == 1? */ 8854 /* If we have $@ (has_dollar_at != 0) and we are in a context where we 8855 don't want to split the result (W_NOSPLIT2), and we are not quoted, 8856 we have already separated the arguments with the first character of 8857 $IFS. In this case, we want to return a list with a single word 8858 with the separator possibly replaced with a space (it's what other 8859 shells seem to do). 8860 quoted_dollar_at is internal to this function and is set if we are 8861 passed an argument that is unquoted (quoted == 0) but we encounter a 8862 double-quoted $@ while expanding it. */ 8863 else if (has_dollar_at && quoted_dollar_at == 0 && ifs_chars && quoted == 0 && (word->flags & W_NOSPLIT2)) 8864 { 8865 /* Only split and rejoin if we have to */ 8866 if (*ifs_chars && *ifs_chars != ' ') 8867 { 8868 list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1); 8869 tstring = string_list (list); 8870 } 8871 else 8872 tstring = istring; 8873 tword = make_bare_word (tstring); 8874 if (tstring != istring) 8875 free (tstring); 8876 goto set_word_flags; 8877 } 8833 8878 else if (has_dollar_at && ifs_chars) 8834 8879 list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1); 8835 8880 else 8836 8881 { 8837 8882 tword = make_bare_word (istring); 8883 set_word_flags: 8838 8884 if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED)) 8839 8885 tword->flags |= W_QUOTED; 8840 8886 if (word->flags & W_ASSIGNMENT) -
subst.h
diff -Naur bash-4.3.orig/subst.h bash-4.3/subst.h
old new 82 82 /* Extract the <( or >( construct in STRING, and return a new string. 83 83 Start extracting at (SINDEX) as if we had just seen "<(". 84 84 Make (SINDEX) get the position just after the matching ")". */ 85 extern char *extract_process_subst __P((char *, char *, int * ));85 extern char *extract_process_subst __P((char *, char *, int *, int)); 86 86 #endif /* PROCESS_SUBSTITUTION */ 87 87 88 88 /* Extract the name of the variable to bind to from the assignment string. */ -
bash-4.3
diff -Naur bash-4.3.orig/test.c bash-4.3/test.c
old new 646 646 return (v && invisible_p (v) == 0 && var_isset (v) ? TRUE : FALSE); 647 647 648 648 case 'R': 649 v = find_variable (arg);650 return ( v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v) ? TRUE : FALSE);649 v = find_variable_noref (arg); 650 return ((v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v)) ? TRUE : FALSE); 651 651 } 652 652 653 653 /* We can't actually get here, but this shuts up gcc. */ … … 723 723 case 'o': case 'p': case 'r': case 's': case 't': 724 724 case 'u': case 'v': case 'w': case 'x': case 'z': 725 725 case 'G': case 'L': case 'O': case 'S': case 'N': 726 case 'R': 726 727 return (1); 727 728 } 728 729 -
bash-4.3
diff -Naur bash-4.3.orig/trap.c bash-4.3/trap.c
old new 920 920 subst_assign_varlist = 0; 921 921 922 922 #if defined (JOB_CONTROL) 923 save_pipeline (1); /* XXX only provides one save level */ 923 if (sig != DEBUG_TRAP) /* run_debug_trap does this */ 924 save_pipeline (1); /* XXX only provides one save level */ 924 925 #endif 925 926 926 927 /* If we're in a function, make sure return longjmps come here, too. */ … … 940 941 trap_exit_value = last_command_exit_value; 941 942 942 943 #if defined (JOB_CONTROL) 943 restore_pipeline (1); 944 if (sig != DEBUG_TRAP) /* run_debug_trap does this */ 945 restore_pipeline (1); 944 946 #endif 945 947 946 948 subst_assign_varlist = save_subst_varlist; -
variables.c
diff -Naur bash-4.3.orig/variables.c bash-4.3/variables.c
old new 358 358 temp_string[char_index] = ' '; 359 359 strcpy (temp_string + char_index + 1, string); 360 360 361 if (posixly_correct == 0 || legal_identifier (name)) 362 parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST); 363 364 /* Ancient backwards compatibility. Old versions of bash exported 365 functions like name()=() {...} */ 366 if (name[char_index - 1] == ')' && name[char_index - 2] == '(') 367 name[char_index - 2] = '\0'; 361 /* Don't import function names that are invalid identifiers from the 362 environment, though we still allow them to be defined as shell 363 variables. */ 364 if (legal_identifier (name)) 365 parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD); 368 366 369 367 if (temp_var = find_function (name)) 370 368 { … … 381 379 last_command_exit_value = 1; 382 380 report_error (_("error importing function definition for `%s'"), name); 383 381 } 384 385 /* ( */386 if (name[char_index - 1] == ')' && name[char_index - 2] == '\0')387 name[char_index - 2] = '('; /* ) */388 382 } 389 383 #if defined (ARRAY_VARS) 390 384 # if ARRAY_EXPORT … … 2197 2191 /* local foo; local foo; is a no-op. */ 2198 2192 old_var = find_variable (name); 2199 2193 if (old_var && local_p (old_var) && old_var->context == variable_context) 2200 { 2201 VUNSETATTR (old_var, att_invisible); /* XXX */ 2202 return (old_var); 2203 } 2194 return (old_var); 2204 2195 2205 2196 was_tmpvar = old_var && tempvar_p (old_var); 2206 2197 /* If we're making a local variable in a shell function, the temporary env -
y.tab.c
diff -Naur bash-4.3.orig/y.tab.c bash-4.3/y.tab.c
old new 4736 4736 not already end in an EOF character. */ 4737 4737 if (shell_input_line_terminator != EOF) 4738 4738 { 4739 if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)4739 if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size)) 4740 4740 shell_input_line = (char *)xrealloc (shell_input_line, 4741 4741 1 + (shell_input_line_size += 2)); 4742 4742 … … 4954 4954 int r; 4955 4955 4956 4956 r = 0; 4957 while (need_here_doc )4957 while (need_here_doc > 0) 4958 4958 { 4959 4959 parser_state |= PST_HEREDOC; 4960 4960 make_here_document (redir_stack[r++], line_number); … … 5265 5265 FREE (word_desc_to_read); 5266 5266 word_desc_to_read = (WORD_DESC *)NULL; 5267 5267 5268 eol_ungetc_lookahead = 0; 5269 5268 5270 current_token = '\n'; /* XXX */ 5269 5271 last_read_token = '\n'; 5270 5272 token_to_read = '\n'; … … 5710 5712 within a double-quoted ${...} construct "an even number of 5711 5713 unescaped double-quotes or single-quotes, if any, shall occur." */ 5712 5714 /* This was changed in Austin Group Interp 221 */ 5713 if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')5715 if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') 5714 5716 continue; 5715 5717 5716 5718 /* Could also check open == '`' if we want to parse grouping constructs … … 8387 8389 8388 8390 ps->expand_aliases = expand_aliases; 8389 8391 ps->echo_input_at_read = echo_input_at_read; 8392 ps->need_here_doc = need_here_doc; 8390 8393 8391 8394 ps->token = token; 8392 8395 ps->token_buffer_size = token_buffer_size; … … 8435 8438 8436 8439 expand_aliases = ps->expand_aliases; 8437 8440 echo_input_at_read = ps->echo_input_at_read; 8441 need_here_doc = ps->need_here_doc; 8438 8442 8439 8443 FREE (token); 8440 8444 token = ps->token; … … 8537 8541 } 8538 8542 } 8539 8543 #endif /* HANDLE_MULTIBYTE */ 8540
Note:
See TracBrowser
for help on using the repository browser.