Imported from ../bash-3.2.tar.gz.
[platform/upstream/bash.git] / y.tab.c
diff --git a/y.tab.c b/y.tab.c
index 367348a..f8db50d 100644 (file)
--- a/y.tab.c
+++ b/y.tab.c
@@ -1,5 +1,5 @@
 
-/*  A Bison parser, made from /usr/src/local/chet/src/bash/src/parse.y
+/*  A Bison parser, made from /Users/chet/src/bash/src/parse.y
     by GNU Bison version 1.28  */
 
 #define YYBISON 1  /* Identify Bison output.  */
@@ -45,7 +45,7 @@
 #define        GREATER_BAR     295
 #define        yacc_EOF        296
 
-#line 21 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 21 "/Users/chet/src/bash/src/parse.y"
 
 #include "config.h"
 
@@ -146,7 +146,6 @@ extern int current_command_number;
 extern int sourcelevel;
 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;
 extern int patch_level;
@@ -234,10 +233,6 @@ static void reset_readline_prompt __P((void));
 #endif
 static void print_prompt __P((void));
 
-#if defined (HISTORY)
-char *history_delimiting_chars __P((void));
-#endif
-
 #if defined (HANDLE_MULTIBYTE)
 static void set_line_mbstate __P((void));
 static char *shell_input_line_property = NULL;
@@ -324,7 +319,7 @@ static WORD_DESC *word_desc_to_read;
 
 static REDIRECTEE redir;
 
-#line 300 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 295 "/Users/chet/src/bash/src/parse.y"
 typedef union {
   WORD_DESC *word;             /* the word that we read. */
   int number;                  /* the number that we read. */
@@ -466,20 +461,20 @@ static const short yyrhs[] = {    85,
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-   351,   360,   367,   382,   392,   394,   398,   403,   408,   413,
-   418,   423,   428,   434,   440,   445,   450,   455,   460,   465,
-   470,   475,   480,   485,   490,   497,   504,   509,   514,   519,
-   524,   529,   534,   539,   544,   551,   553,   555,   559,   563,
-   574,   576,   580,   582,   584,   600,   604,   606,   608,   610,
-   612,   614,   616,   618,   620,   622,   624,   628,   633,   638,
-   643,   648,   653,   658,   663,   670,   675,   680,   685,   692,
-   697,   702,   707,   712,   717,   724,   729,   734,   741,   744,
-   747,   752,   754,   785,   792,   794,   796,   801,   805,   809,
-   813,   815,   817,   821,   822,   826,   828,   830,   832,   836,
-   837,   841,   843,   852,   860,   861,   867,   868,   875,   879,
-   881,   883,   890,   892,   894,   898,   899,   902,   904,   906,
-   910,   911,   920,   926,   935,   943,   945,   947,   954,   957,
-   961,   963,   969,   975,   981,   987,  1007,  1010,  1014,  1016
+   346,   355,   362,   377,   387,   389,   393,   398,   403,   408,
+   413,   418,   423,   429,   435,   440,   445,   450,   455,   460,
+   465,   470,   475,   480,   485,   492,   499,   504,   509,   514,
+   519,   524,   529,   534,   539,   546,   548,   550,   554,   558,
+   569,   571,   575,   577,   579,   595,   599,   601,   603,   605,
+   607,   609,   611,   613,   615,   617,   619,   623,   628,   633,
+   638,   643,   648,   653,   658,   665,   670,   675,   680,   687,
+   692,   697,   702,   707,   712,   719,   724,   729,   736,   739,
+   742,   747,   749,   780,   787,   789,   791,   796,   800,   804,
+   808,   810,   812,   816,   817,   821,   823,   825,   827,   831,
+   832,   836,   838,   847,   855,   856,   862,   863,   870,   874,
+   876,   878,   885,   887,   889,   893,   894,   897,   899,   901,
+   905,   906,   915,   921,   930,   938,   940,   942,   949,   952,
+   956,   958,   964,   970,   976,   982,  1002,  1005,  1009,  1011
 };
 #endif
 
@@ -1293,7 +1288,7 @@ yyreduce:
   switch (yyn) {
 
 case 1:
-#line 352 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 347 "/Users/chet/src/bash/src/parse.y"
 {
                          /* Case of regular command.  Discard the error
                             safety net,and return the command just parsed. */
@@ -1304,7 +1299,7 @@ case 1:
                        ;
     break;}
 case 2:
-#line 361 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 356 "/Users/chet/src/bash/src/parse.y"
 {
                          /* Case of regular command, but not a very
                             interesting one.  Return a NULL command. */
@@ -1313,7 +1308,7 @@ case 2:
                        ;
     break;}
 case 3:
-#line 368 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 363 "/Users/chet/src/bash/src/parse.y"
 {
                          /* Error during parsing.  Return NULL command. */
                          global_command = (COMMAND *)NULL;
@@ -1330,7 +1325,7 @@ case 3:
                        ;
     break;}
 case 4:
-#line 383 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 378 "/Users/chet/src/bash/src/parse.y"
 {
                          /* Case of EOF seen by itself.  Do ignoreeof or
                             not. */
@@ -1340,57 +1335,57 @@ case 4:
                        ;
     break;}
 case 5:
-#line 393 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 388 "/Users/chet/src/bash/src/parse.y"
 { yyval.word_list = make_word_list (yyvsp[0].word, (WORD_LIST *)NULL); ;
     break;}
 case 6:
-#line 395 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 390 "/Users/chet/src/bash/src/parse.y"
 { yyval.word_list = make_word_list (yyvsp[0].word, yyvsp[-1].word_list); ;
     break;}
 case 7:
-#line 399 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 394 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (1, r_output_direction, redir);
                        ;
     break;}
 case 8:
-#line 404 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 399 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (0, r_input_direction, redir);
                        ;
     break;}
 case 9:
-#line 409 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 404 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_output_direction, redir);
                        ;
     break;}
 case 10:
-#line 414 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 409 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_input_direction, redir);
                        ;
     break;}
 case 11:
-#line 419 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 414 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (1, r_appending_to, redir);
                        ;
     break;}
 case 12:
-#line 424 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 419 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_appending_to, redir);
                        ;
     break;}
 case 13:
-#line 429 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 424 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (0, r_reading_until, redir);
@@ -1398,7 +1393,7 @@ case 13:
                        ;
     break;}
 case 14:
-#line 435 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 430 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_reading_until, redir);
@@ -1406,77 +1401,77 @@ case 14:
                        ;
     break;}
 case 15:
-#line 441 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 436 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (0, r_reading_string, redir);
                        ;
     break;}
 case 16:
-#line 446 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 441 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_reading_string, redir);
                        ;
     break;}
 case 17:
-#line 451 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 446 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.dest = yyvsp[0].number;
                          yyval.redirect = make_redirection (0, r_duplicating_input, redir);
                        ;
     break;}
 case 18:
-#line 456 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 451 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.dest = yyvsp[0].number;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_duplicating_input, redir);
                        ;
     break;}
 case 19:
-#line 461 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 456 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.dest = yyvsp[0].number;
                          yyval.redirect = make_redirection (1, r_duplicating_output, redir);
                        ;
     break;}
 case 20:
-#line 466 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 461 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.dest = yyvsp[0].number;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_duplicating_output, redir);
                        ;
     break;}
 case 21:
-#line 471 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 466 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (0, r_duplicating_input_word, redir);
                        ;
     break;}
 case 22:
-#line 476 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 471 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_duplicating_input_word, redir);
                        ;
     break;}
 case 23:
-#line 481 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 476 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (1, r_duplicating_output_word, redir);
                        ;
     break;}
 case 24:
-#line 486 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 481 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_duplicating_output_word, redir);
                        ;
     break;}
 case 25:
-#line 491 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 486 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection
@@ -1485,7 +1480,7 @@ case 25:
                        ;
     break;}
 case 26:
-#line 498 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 493 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection
@@ -1494,88 +1489,88 @@ case 26:
                        ;
     break;}
 case 27:
-#line 505 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 500 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.dest = 0;
                          yyval.redirect = make_redirection (1, r_close_this, redir);
                        ;
     break;}
 case 28:
-#line 510 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 505 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.dest = 0;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_close_this, redir);
                        ;
     break;}
 case 29:
-#line 515 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 510 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.dest = 0;
                          yyval.redirect = make_redirection (0, r_close_this, redir);
                        ;
     break;}
 case 30:
-#line 520 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 515 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.dest = 0;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_close_this, redir);
                        ;
     break;}
 case 31:
-#line 525 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 520 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (1, r_err_and_out, redir);
                        ;
     break;}
 case 32:
-#line 530 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 525 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_input_output, redir);
                        ;
     break;}
 case 33:
-#line 535 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 530 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (0, r_input_output, redir);
                        ;
     break;}
 case 34:
-#line 540 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 535 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (1, r_output_force, redir);
                        ;
     break;}
 case 35:
-#line 545 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 540 "/Users/chet/src/bash/src/parse.y"
 {
                          redir.filename = yyvsp[0].word;
                          yyval.redirect = make_redirection (yyvsp[-2].number, r_output_force, redir);
                        ;
     break;}
 case 36:
-#line 552 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 547 "/Users/chet/src/bash/src/parse.y"
 { yyval.element.word = yyvsp[0].word; yyval.element.redirect = 0; ;
     break;}
 case 37:
-#line 554 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 549 "/Users/chet/src/bash/src/parse.y"
 { yyval.element.word = yyvsp[0].word; yyval.element.redirect = 0; ;
     break;}
 case 38:
-#line 556 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 551 "/Users/chet/src/bash/src/parse.y"
 { yyval.element.redirect = yyvsp[0].redirect; yyval.element.word = 0; ;
     break;}
 case 39:
-#line 560 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 555 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.redirect = yyvsp[0].redirect;
                        ;
     break;}
 case 40:
-#line 564 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 559 "/Users/chet/src/bash/src/parse.y"
 {
                          register REDIRECT *t;
 
@@ -1586,23 +1581,23 @@ case 40:
                        ;
     break;}
 case 41:
-#line 575 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 570 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_simple_command (yyvsp[0].element, (COMMAND *)NULL); ;
     break;}
 case 42:
-#line 577 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 572 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_simple_command (yyvsp[0].element, yyvsp[-1].command); ;
     break;}
 case 43:
-#line 581 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 576 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = clean_simple_command (yyvsp[0].command); ;
     break;}
 case 44:
-#line 583 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 578 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 45:
-#line 585 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 580 "/Users/chet/src/bash/src/parse.y"
 {
                          COMMAND *tc;
 
@@ -1620,218 +1615,218 @@ case 45:
                        ;
     break;}
 case 46:
-#line 601 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 596 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 47:
-#line 605 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 600 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 48:
-#line 607 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 602 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 49:
-#line 609 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 604 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_while_command (yyvsp[-3].command, yyvsp[-1].command); ;
     break;}
 case 50:
-#line 611 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 606 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_until_command (yyvsp[-3].command, yyvsp[-1].command); ;
     break;}
 case 51:
-#line 613 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 608 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 52:
-#line 615 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 610 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 53:
-#line 617 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 612 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 54:
-#line 619 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 614 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 55:
-#line 621 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 616 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 56:
-#line 623 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 618 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 57:
-#line 625 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 620 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 58:
-#line 629 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 624 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_for_command (yyvsp[-4].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 59:
-#line 634 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 629 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_for_command (yyvsp[-4].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 60:
-#line 639 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 634 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_for_command (yyvsp[-5].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 61:
-#line 644 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 639 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_for_command (yyvsp[-5].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 62:
-#line 649 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 644 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_for_command (yyvsp[-8].word, REVERSE_LIST (yyvsp[-5].word_list, WORD_LIST *), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 63:
-#line 654 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 649 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_for_command (yyvsp[-8].word, REVERSE_LIST (yyvsp[-5].word_list, WORD_LIST *), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 64:
-#line 659 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 654 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_for_command (yyvsp[-7].word, (WORD_LIST *)NULL, yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 65:
-#line 664 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 659 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_for_command (yyvsp[-7].word, (WORD_LIST *)NULL, yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 66:
-#line 671 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 666 "/Users/chet/src/bash/src/parse.y"
 {
                                  yyval.command = make_arith_for_command (yyvsp[-5].word_list, yyvsp[-1].command, arith_for_lineno);
                                  if (word_top > 0) word_top--;
                                ;
     break;}
 case 67:
-#line 676 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 671 "/Users/chet/src/bash/src/parse.y"
 {
                                  yyval.command = make_arith_for_command (yyvsp[-5].word_list, yyvsp[-1].command, arith_for_lineno);
                                  if (word_top > 0) word_top--;
                                ;
     break;}
 case 68:
-#line 681 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 676 "/Users/chet/src/bash/src/parse.y"
 {
                                  yyval.command = make_arith_for_command (yyvsp[-3].word_list, yyvsp[-1].command, arith_for_lineno);
                                  if (word_top > 0) word_top--;
                                ;
     break;}
 case 69:
-#line 686 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 681 "/Users/chet/src/bash/src/parse.y"
 {
                                  yyval.command = make_arith_for_command (yyvsp[-3].word_list, yyvsp[-1].command, arith_for_lineno);
                                  if (word_top > 0) word_top--;
                                ;
     break;}
 case 70:
-#line 693 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 688 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_select_command (yyvsp[-4].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 71:
-#line 698 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 693 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_select_command (yyvsp[-4].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 72:
-#line 703 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 698 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_select_command (yyvsp[-5].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 73:
-#line 708 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 703 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_select_command (yyvsp[-5].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 74:
-#line 713 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 708 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_select_command (yyvsp[-8].word, REVERSE_LIST (yyvsp[-5].word_list, WORD_LIST *), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 75:
-#line 718 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 713 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_select_command (yyvsp[-8].word, REVERSE_LIST (yyvsp[-5].word_list, WORD_LIST *), yyvsp[-1].command, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 76:
-#line 725 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 720 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_case_command (yyvsp[-4].word, (PATTERN_LIST *)NULL, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 77:
-#line 730 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 725 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_case_command (yyvsp[-5].word, yyvsp[-2].pattern, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 78:
-#line 735 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 730 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_case_command (yyvsp[-4].word, yyvsp[-1].pattern, word_lineno[word_top]);
                          if (word_top > 0) word_top--;
                        ;
     break;}
 case 79:
-#line 742 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 737 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_function_def (yyvsp[-4].word, yyvsp[0].command, function_dstart, function_bstart); ;
     break;}
 case 80:
-#line 745 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 740 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_function_def (yyvsp[-4].word, yyvsp[0].command, function_dstart, function_bstart); ;
     break;}
 case 81:
-#line 748 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 743 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_function_def (yyvsp[-2].word, yyvsp[0].command, function_dstart, function_bstart); ;
     break;}
 case 82:
-#line 753 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 748 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 83:
-#line 755 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 750 "/Users/chet/src/bash/src/parse.y"
 {
                          COMMAND *tc;
 
@@ -1862,82 +1857,82 @@ case 83:
                        ;
     break;}
 case 84:
-#line 786 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 781 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = make_subshell_command (yyvsp[-1].command);
                          yyval.command->flags |= CMD_WANT_SUBSHELL;
                        ;
     break;}
 case 85:
-#line 793 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 788 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_if_command (yyvsp[-3].command, yyvsp[-1].command, (COMMAND *)NULL); ;
     break;}
 case 86:
-#line 795 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 790 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_if_command (yyvsp[-5].command, yyvsp[-3].command, yyvsp[-1].command); ;
     break;}
 case 87:
-#line 797 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 792 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_if_command (yyvsp[-4].command, yyvsp[-2].command, yyvsp[-1].command); ;
     break;}
 case 88:
-#line 802 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 797 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_group_command (yyvsp[-1].command); ;
     break;}
 case 89:
-#line 806 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 801 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_arith_command (yyvsp[0].word_list); ;
     break;}
 case 90:
-#line 810 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 805 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[-1].command; ;
     break;}
 case 91:
-#line 814 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 809 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_if_command (yyvsp[-2].command, yyvsp[0].command, (COMMAND *)NULL); ;
     break;}
 case 92:
-#line 816 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 811 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_if_command (yyvsp[-4].command, yyvsp[-2].command, yyvsp[0].command); ;
     break;}
 case 93:
-#line 818 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 813 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = make_if_command (yyvsp[-3].command, yyvsp[-1].command, yyvsp[0].command); ;
     break;}
 case 95:
-#line 823 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 818 "/Users/chet/src/bash/src/parse.y"
 { yyvsp[0].pattern->next = yyvsp[-1].pattern; yyval.pattern = yyvsp[0].pattern; ;
     break;}
 case 96:
-#line 827 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 822 "/Users/chet/src/bash/src/parse.y"
 { yyval.pattern = make_pattern_list (yyvsp[-2].word_list, yyvsp[0].command); ;
     break;}
 case 97:
-#line 829 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 824 "/Users/chet/src/bash/src/parse.y"
 { yyval.pattern = make_pattern_list (yyvsp[-2].word_list, (COMMAND *)NULL); ;
     break;}
 case 98:
-#line 831 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 826 "/Users/chet/src/bash/src/parse.y"
 { yyval.pattern = make_pattern_list (yyvsp[-2].word_list, yyvsp[0].command); ;
     break;}
 case 99:
-#line 833 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 828 "/Users/chet/src/bash/src/parse.y"
 { yyval.pattern = make_pattern_list (yyvsp[-2].word_list, (COMMAND *)NULL); ;
     break;}
 case 101:
-#line 838 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 833 "/Users/chet/src/bash/src/parse.y"
 { yyvsp[-1].pattern->next = yyvsp[-2].pattern; yyval.pattern = yyvsp[-1].pattern; ;
     break;}
 case 102:
-#line 842 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 837 "/Users/chet/src/bash/src/parse.y"
 { yyval.word_list = make_word_list (yyvsp[0].word, (WORD_LIST *)NULL); ;
     break;}
 case 103:
-#line 844 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 839 "/Users/chet/src/bash/src/parse.y"
 { yyval.word_list = make_word_list (yyvsp[0].word, yyvsp[-2].word_list); ;
     break;}
 case 104:
-#line 853 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 848 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = yyvsp[0].command;
                          if (need_here_doc)
@@ -1945,13 +1940,13 @@ case 104:
                         ;
     break;}
 case 106:
-#line 862 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 857 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = yyvsp[0].command;
                        ;
     break;}
 case 108:
-#line 869 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 864 "/Users/chet/src/bash/src/parse.y"
 {
                          if (yyvsp[-2].command->type == cm_connection)
                            yyval.command = connect_async_list (yyvsp[-2].command, (COMMAND *)NULL, '&');
@@ -1960,15 +1955,15 @@ case 108:
                        ;
     break;}
 case 110:
-#line 880 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 875 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, AND_AND); ;
     break;}
 case 111:
-#line 882 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 877 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, OR_OR); ;
     break;}
 case 112:
-#line 884 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 879 "/Users/chet/src/bash/src/parse.y"
 {
                          if (yyvsp[-3].command->type == cm_connection)
                            yyval.command = connect_async_list (yyvsp[-3].command, yyvsp[0].command, '&');
@@ -1977,31 +1972,31 @@ case 112:
                        ;
     break;}
 case 113:
-#line 891 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 886 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, ';'); ;
     break;}
 case 114:
-#line 893 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 888 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, ';'); ;
     break;}
 case 115:
-#line 895 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 890 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 118:
-#line 903 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 898 "/Users/chet/src/bash/src/parse.y"
 { yyval.number = '\n'; ;
     break;}
 case 119:
-#line 905 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 900 "/Users/chet/src/bash/src/parse.y"
 { yyval.number = ';'; ;
     break;}
 case 120:
-#line 907 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 902 "/Users/chet/src/bash/src/parse.y"
 { yyval.number = yacc_EOF; ;
     break;}
 case 123:
-#line 921 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 916 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = yyvsp[0].command;
                          if (need_here_doc)
@@ -2009,7 +2004,7 @@ case 123:
                        ;
     break;}
 case 124:
-#line 927 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 922 "/Users/chet/src/bash/src/parse.y"
 {
                          if (yyvsp[-1].command->type == cm_connection)
                            yyval.command = connect_async_list (yyvsp[-1].command, (COMMAND *)NULL, '&');
@@ -2020,7 +2015,7 @@ case 124:
                        ;
     break;}
 case 125:
-#line 936 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 931 "/Users/chet/src/bash/src/parse.y"
 {
                          yyval.command = yyvsp[-1].command;
                          if (need_here_doc)
@@ -2028,15 +2023,15 @@ case 125:
                        ;
     break;}
 case 126:
-#line 944 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 939 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, AND_AND); ;
     break;}
 case 127:
-#line 946 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 941 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, OR_OR); ;
     break;}
 case 128:
-#line 948 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 943 "/Users/chet/src/bash/src/parse.y"
 {
                          if (yyvsp[-2].command->type == cm_connection)
                            yyval.command = connect_async_list (yyvsp[-2].command, yyvsp[0].command, '&');
@@ -2045,19 +2040,19 @@ case 128:
                        ;
     break;}
 case 129:
-#line 955 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 950 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = command_connect (yyvsp[-2].command, yyvsp[0].command, ';'); ;
     break;}
 case 130:
-#line 958 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 953 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 131:
-#line 962 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 957 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 132:
-#line 964 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 959 "/Users/chet/src/bash/src/parse.y"
 {
                          if (yyvsp[0].command)
                            yyvsp[0].command->flags |= CMD_INVERT_RETURN;
@@ -2065,7 +2060,7 @@ case 132:
                        ;
     break;}
 case 133:
-#line 970 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 965 "/Users/chet/src/bash/src/parse.y"
 {
                          if (yyvsp[0].command)
                            yyvsp[0].command->flags |= yyvsp[-1].number;
@@ -2073,7 +2068,7 @@ case 133:
                        ;
     break;}
 case 134:
-#line 976 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 971 "/Users/chet/src/bash/src/parse.y"
 {
                          if (yyvsp[0].command)
                            yyvsp[0].command->flags |= yyvsp[-2].number|CMD_INVERT_RETURN;
@@ -2081,7 +2076,7 @@ case 134:
                        ;
     break;}
 case 135:
-#line 982 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 977 "/Users/chet/src/bash/src/parse.y"
 {
                          if (yyvsp[0].command)
                            yyvsp[0].command->flags |= yyvsp[-1].number|CMD_INVERT_RETURN;
@@ -2089,7 +2084,7 @@ case 135:
                        ;
     break;}
 case 136:
-#line 988 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 983 "/Users/chet/src/bash/src/parse.y"
 {
                          ELEMENT x;
 
@@ -2108,19 +2103,19 @@ case 136:
                        ;
     break;}
 case 137:
-#line 1009 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 1004 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, '|'); ;
     break;}
 case 138:
-#line 1011 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 1006 "/Users/chet/src/bash/src/parse.y"
 { yyval.command = yyvsp[0].command; ;
     break;}
 case 139:
-#line 1015 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 1010 "/Users/chet/src/bash/src/parse.y"
 { yyval.number = CMD_TIME_PIPELINE; ;
     break;}
 case 140:
-#line 1017 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 1012 "/Users/chet/src/bash/src/parse.y"
 { yyval.number = CMD_TIME_PIPELINE|CMD_TIME_POSIX; ;
     break;}
 }
@@ -2345,7 +2340,7 @@ yyerrhandle:
     }
   return 1;
 }
-#line 1019 "/usr/src/local/chet/src/bash/src/parse.y"
+#line 1014 "/Users/chet/src/bash/src/parse.y"
 
 
 /* Possible states for the parser that require it to do special things. */
@@ -2542,10 +2537,12 @@ yy_readline_get ()
          old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler);
          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)
        {
          interrupt_immediately--;
@@ -2677,10 +2674,16 @@ yy_stream_get ()
   if (bash_input.location.file)
     {
       if (interactive)
-       interrupt_immediately++;
+       {
+         interrupt_immediately++;
+         terminate_immediately++;
+       }
       result = getc_with_restart (bash_input.location.file);
       if (interactive)
-       interrupt_immediately--;
+       {
+         interrupt_immediately--;
+         terminate_immediately--;
+       }
     }
   return (result);
 }
@@ -3199,7 +3202,6 @@ shell_getc (remove_quoted_newline)
   register int i;
   int c;
   unsigned char uc;
-  static int mustpop = 0;
 
   QUIT;
 
@@ -3472,8 +3474,8 @@ discard_until (character)
 }
 
 void
-execute_prompt_command (command)
-     char *command;
+execute_variable_command (command, vname)
+     char *command, *vname;
 {
   char *last_lastarg;
   sh_parser_state_t ps;
@@ -3483,7 +3485,7 @@ execute_prompt_command (command)
   if (last_lastarg)
     last_lastarg = savestring (last_lastarg);
 
-  parse_and_execute (savestring (command), "PROMPT_COMMAND", SEVAL_NONINT|SEVAL_NOHIST);
+  parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST);
 
   restore_parser_state (&ps);
   bind_variable ("_", last_lastarg, 0);
@@ -3886,7 +3888,7 @@ read_token (command)
 #endif /* ALIAS */
 
   /* Read a single word from input.  Start by skipping blanks. */
-  while ((character = shell_getc (1)) != EOF && whitespace (character))
+  while ((character = shell_getc (1)) != EOF && shellblank (character))
     ;
 
   if (character == EOF)
@@ -4046,6 +4048,7 @@ read_token (command)
 #define P_ALLOWESC     0x02
 #define P_DQUOTE       0x04
 #define P_COMMAND      0x08    /* parsing a command, so look for comments */
+#define P_BACKQUOTE    0x10    /* parsing a backquoted command substitution */
 
 static char matched_pair_error;
 static char *
@@ -4055,12 +4058,13 @@ parse_matched_pair (qc, open, close, lenp, flags)
      int *lenp, flags;
 {
   int count, ch, was_dollar, in_comment, check_comment;
-  int pass_next_character, nestlen, ttranslen, start_lineno;
+  int pass_next_character, backq_backslash, nestlen, ttranslen, start_lineno;
   char *ret, *nestret, *ttrans;
   int retind, retsize, rflags;
 
+/* itrace("parse_matched_pair: open = %c close = %c", open, close); */
   count = 1;
-  pass_next_character = was_dollar = in_comment = 0;
+  pass_next_character = backq_backslash = was_dollar = in_comment = 0;
   check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
 
   /* RFLAGS is the set of flags we want to pass to recursive calls. */
@@ -4072,11 +4076,8 @@ parse_matched_pair (qc, open, close, lenp, flags)
   start_lineno = line_number;
   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
+      ch = shell_getc (qc != '\'' && pass_next_character == 0 && backq_backslash == 0);
+
       if (ch == EOF)
        {
          free (ret);
@@ -4100,10 +4101,19 @@ parse_matched_pair (qc, open, close, lenp, flags)
 
          continue;
        }
-      /* Not exactly right yet */
-      else if (check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind -1])))
+      /* Not exactly right yet, should handle shell metacharacters, too.  If
+        any changes are made to this test, make analogous changes to subst.c:
+        extract_delimited_string(). */
+      else if MBTEST(check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind - 1])))
        in_comment = 1;
 
+      /* last char was backslash inside backquoted command substitution */
+      if (backq_backslash)
+       {
+         backq_backslash = 0;
+         /* Placeholder for adding special characters */
+       }
+
       if (pass_next_character)         /* last char was backslash */
        {
          pass_next_character = 0;
@@ -4128,11 +4138,9 @@ parse_matched_pair (qc, open, close, lenp, flags)
        }
       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++;
 
@@ -4144,6 +4152,10 @@ parse_matched_pair (qc, open, close, lenp, flags)
        {
          if MBTEST((flags & P_ALLOWESC) && ch == '\\')
            pass_next_character++;
+#if 0
+         else if MBTEST((flags & P_BACKQUOTE) && ch == '\\')
+           backq_backslash++;
+#endif
          continue;
        }
 
@@ -4226,18 +4238,24 @@ add_nestret:
            }
          FREE (nestret);
        }
+#if 0
       else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0)
        {
-         nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags);
+         /* Add P_BACKQUOTE 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_BACKQUOTE);
          goto add_nestret;
        }
-      else if MBTEST(was_dollar && (ch == '(' || ch == '{' || ch == '['))      /* ) } ] */
+#endif
+      else if MBTEST(open != '`' && was_dollar && (ch == '(' || ch == '{' || ch == '['))       /* ) } ] */
        /* check for $(), $[], or ${} inside quoted string. */
        {
          if (open == ch)       /* undo previous increment */
            count--;
          if (ch == '(')                /* ) */
-           nestret = parse_matched_pair (0, '(', ')', &nestlen, rflags);
+           nestret = parse_matched_pair (0, '(', ')', &nestlen, rflags & ~P_DQUOTE);
          else if (ch == '{')           /* } */
            nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags);
          else if (ch == '[')           /* ] */
@@ -4263,8 +4281,8 @@ static int
 parse_dparen (c)
      int c;
 {
-  int cmdtyp, len, sline;
-  char *wval, *wv2;
+  int cmdtyp, sline;
+  char *wval;
   WORD_DESC *wd;
 
 #if defined (ARITH_FOR_COMMAND)
@@ -4276,7 +4294,6 @@ parse_dparen (c)
        {
          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);
        }
@@ -4826,7 +4843,7 @@ read_token_word (character)
                }
              else
                {
-                 /* Try to locale)-expand the converted string. */
+                 /* Try to locale-expand the converted string. */
                  ttrans = localeexpand (ttok, 0, ttoklen - 1, first_line, &ttranslen);
                  free (ttok);
 
@@ -4908,7 +4925,7 @@ read_token_word (character)
              FREE (ttok);
              all_digit_token = 0;
              compound_assignment = 1;
-#if 0
+#if 1
              goto next_character;
 #else
              goto got_token;           /* ksh93 seems to do this */
@@ -5006,8 +5023,8 @@ got_token:
   if (dollar_present)
     the_word->flags |= W_HASDOLLAR;
   if (quoted)
-    the_word->flags |= W_QUOTED;
-  if (compound_assignment)
+    the_word->flags |= W_QUOTED;               /*(*/
+  if (compound_assignment && token[token_index-1] == ')')
     the_word->flags |= W_COMPASSIGN;
   /* A word is an assignment if it appears at the beginning of a
      simple command, or after another assignment word.  This is
@@ -5025,7 +5042,9 @@ got_token:
       struct builtin *b;
       b = builtin_address_internal (token, 0);
       if (b && (b->flags & ASSIGNMENT_BUILTIN))
-        parser_state |= PST_ASSIGNOK;
+       parser_state |= PST_ASSIGNOK;
+      else if (STREQ (token, "eval") || STREQ (token, "let"))
+       parser_state |= PST_ASSIGNOK;
     }
 
   yylval.word = the_word;
@@ -5304,7 +5323,7 @@ decode_prompt_string (string)
   int last_exit_value;
 #if defined (PROMPT_STRING_DECODE)
   int result_size, result_index;
-  int c, n;
+  int c, n, i;
   char *temp, octal_string[4];
   struct tm *tm;  
   time_t the_time;
@@ -5466,7 +5485,7 @@ decode_prompt_string (string)
            case 'W':
              {
                /* Use the value of PWD because it is much more efficient. */
-               char t_string[PATH_MAX], *t;
+               char t_string[PATH_MAX];
                int tlen;
 
                temp = get_string_value ("PWD");
@@ -5576,9 +5595,12 @@ decode_prompt_string (string)
                  break;
                }
              temp = (char *)xmalloc (3);
-             temp[0] = '\001';
-             temp[1] = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
-             temp[2] = '\0';
+             n = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
+             i = 0;
+             if (n == CTLESC || n == CTLNUL)
+               temp[i++] = CTLESC;
+             temp[i++] = n;
+             temp[i] = '\0';
              goto add_string;
 #endif /* READLINE */
 
@@ -5674,15 +5696,15 @@ yyerror (msg)
 }
 
 static char *
-error_token_from_token (token)
-     int token;
+error_token_from_token (tok)
+     int tok;
 {
   char *t;
 
-  if (t = find_token_in_alist (token, word_token_alist, 0))
+  if (t = find_token_in_alist (tok, word_token_alist, 0))
     return t;
 
-  if (t = find_token_in_alist (token, other_token_alist, 0))
+  if (t = find_token_in_alist (tok, other_token_alist, 0))
     return t;
 
   t = (char *)NULL;
@@ -6016,18 +6038,21 @@ parse_compound_assignment (retlenp)
      int *retlenp;
 {
   WORD_LIST *wl, *rl;
-  int tok, orig_line_number, orig_token_size;
+  int tok, orig_line_number, orig_token_size, orig_last_token, assignok;
   char *saved_token, *ret;
 
   saved_token = token;
   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 */
 
   token = (char *)NULL;
   token_buffer_size = 0;
 
+  assignok = parser_state&PST_ASSIGNOK;                /* XXX */
+
   wl = (WORD_LIST *)NULL;      /* ( */
   parser_state |= PST_COMPASSIGN;
 
@@ -6070,7 +6095,8 @@ parse_compound_assignment (retlenp)
        jump_to_top_level (DISCARD);
     }
 
-  last_read_token = WORD;
+  last_read_token = orig_last_token;           /* XXX - was WORD? */
+
   if (wl)
     {
       rl = REVERSE_LIST (wl, WORD_LIST *);
@@ -6082,6 +6108,10 @@ parse_compound_assignment (retlenp)
 
   if (retlenp)
     *retlenp = (ret && *ret) ? strlen (ret) : 0;
+
+  if (assignok)
+    parser_state |= PST_ASSIGNOK;
+
   return ret;
 }