aboutsummaryrefslogtreecommitdiffstats
path: root/y.tab.c
diff options
context:
space:
mode:
Diffstat (limited to 'y.tab.c')
-rw-r--r--y.tab.c418
1 files changed, 224 insertions, 194 deletions
diff --git a/y.tab.c b/y.tab.c
index 367348a..f8db50d 100644
--- 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;
}