X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=y.tab.c;h=367348a8ce3b58831ac6c0ff27e4c96285aabfee;hb=95732b497d12c98613bb3c5db16b61f377501a59;hp=bff19c4ecc86341d6613a6cc10daa0cf932f3d57;hpb=eb87367179effbe5f430236db8259006d71438b7;p=platform%2Fupstream%2Fbash.git diff --git a/y.tab.c b/y.tab.c index bff19c4..367348a 100644 --- a/y.tab.c +++ b/y.tab.c @@ -1,5 +1,5 @@ -/* A Bison parser, made from /Users/chet/src/bash/src/parse.y +/* A Bison parser, made from /usr/src/local/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 "/Users/chet/src/bash/src/parse.y" +#line 21 "/usr/src/local/chet/src/bash/src/parse.y" #include "config.h" @@ -78,6 +78,7 @@ #include "parser.h" #include "mailcheck.h" #include "test.h" +#include "builtins.h" #include "builtins/common.h" #include "builtins/builtext.h" @@ -323,7 +324,7 @@ static WORD_DESC *word_desc_to_read; static REDIRECTEE redir; -#line 299 "/Users/chet/src/bash/src/parse.y" +#line 300 "/usr/src/local/chet/src/bash/src/parse.y" typedef union { WORD_DESC *word; /* the word that we read. */ int number; /* the number that we read. */ @@ -465,20 +466,20 @@ static const short yyrhs[] = { 85, #if YYDEBUG != 0 static const short yyrline[] = { 0, - 350, 359, 366, 381, 391, 393, 397, 402, 407, 412, - 417, 422, 427, 433, 439, 444, 449, 454, 459, 464, - 469, 474, 479, 484, 489, 496, 503, 508, 513, 518, - 523, 528, 533, 538, 543, 550, 552, 554, 558, 562, - 573, 575, 579, 581, 583, 599, 603, 605, 607, 609, - 611, 613, 615, 617, 619, 621, 623, 627, 632, 637, - 642, 647, 652, 657, 662, 669, 674, 679, 684, 691, - 696, 701, 706, 711, 716, 723, 728, 733, 740, 743, - 746, 751, 753, 784, 791, 793, 795, 800, 804, 808, - 812, 814, 816, 820, 821, 825, 827, 829, 831, 835, - 836, 840, 842, 851, 859, 860, 866, 867, 874, 878, - 880, 882, 889, 891, 893, 897, 898, 901, 903, 905, - 909, 910, 919, 925, 934, 942, 944, 946, 953, 956, - 960, 962, 967, 972, 977, 982, 1002, 1005, 1009, 1011 + 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 }; #endif @@ -1292,7 +1293,7 @@ yyreduce: switch (yyn) { case 1: -#line 351 "/Users/chet/src/bash/src/parse.y" +#line 352 "/usr/src/local/chet/src/bash/src/parse.y" { /* Case of regular command. Discard the error safety net,and return the command just parsed. */ @@ -1303,7 +1304,7 @@ case 1: ; break;} case 2: -#line 360 "/Users/chet/src/bash/src/parse.y" +#line 361 "/usr/src/local/chet/src/bash/src/parse.y" { /* Case of regular command, but not a very interesting one. Return a NULL command. */ @@ -1312,7 +1313,7 @@ case 2: ; break;} case 3: -#line 367 "/Users/chet/src/bash/src/parse.y" +#line 368 "/usr/src/local/chet/src/bash/src/parse.y" { /* Error during parsing. Return NULL command. */ global_command = (COMMAND *)NULL; @@ -1329,7 +1330,7 @@ case 3: ; break;} case 4: -#line 382 "/Users/chet/src/bash/src/parse.y" +#line 383 "/usr/src/local/chet/src/bash/src/parse.y" { /* Case of EOF seen by itself. Do ignoreeof or not. */ @@ -1339,57 +1340,57 @@ case 4: ; break;} case 5: -#line 392 "/Users/chet/src/bash/src/parse.y" +#line 393 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.word_list = make_word_list (yyvsp[0].word, (WORD_LIST *)NULL); ; break;} case 6: -#line 394 "/Users/chet/src/bash/src/parse.y" +#line 395 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.word_list = make_word_list (yyvsp[0].word, yyvsp[-1].word_list); ; break;} case 7: -#line 398 "/Users/chet/src/bash/src/parse.y" +#line 399 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection (1, r_output_direction, redir); ; break;} case 8: -#line 403 "/Users/chet/src/bash/src/parse.y" +#line 404 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection (0, r_input_direction, redir); ; break;} case 9: -#line 408 "/Users/chet/src/bash/src/parse.y" +#line 409 "/usr/src/local/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 413 "/Users/chet/src/bash/src/parse.y" +#line 414 "/usr/src/local/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 418 "/Users/chet/src/bash/src/parse.y" +#line 419 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection (1, r_appending_to, redir); ; break;} case 12: -#line 423 "/Users/chet/src/bash/src/parse.y" +#line 424 "/usr/src/local/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 428 "/Users/chet/src/bash/src/parse.y" +#line 429 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection (0, r_reading_until, redir); @@ -1397,7 +1398,7 @@ case 13: ; break;} case 14: -#line 434 "/Users/chet/src/bash/src/parse.y" +#line 435 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection (yyvsp[-2].number, r_reading_until, redir); @@ -1405,77 +1406,77 @@ case 14: ; break;} case 15: -#line 440 "/Users/chet/src/bash/src/parse.y" +#line 441 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection (0, r_reading_string, redir); ; break;} case 16: -#line 445 "/Users/chet/src/bash/src/parse.y" +#line 446 "/usr/src/local/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 450 "/Users/chet/src/bash/src/parse.y" +#line 451 "/usr/src/local/chet/src/bash/src/parse.y" { redir.dest = yyvsp[0].number; yyval.redirect = make_redirection (0, r_duplicating_input, redir); ; break;} case 18: -#line 455 "/Users/chet/src/bash/src/parse.y" +#line 456 "/usr/src/local/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 460 "/Users/chet/src/bash/src/parse.y" +#line 461 "/usr/src/local/chet/src/bash/src/parse.y" { redir.dest = yyvsp[0].number; yyval.redirect = make_redirection (1, r_duplicating_output, redir); ; break;} case 20: -#line 465 "/Users/chet/src/bash/src/parse.y" +#line 466 "/usr/src/local/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 470 "/Users/chet/src/bash/src/parse.y" +#line 471 "/usr/src/local/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 475 "/Users/chet/src/bash/src/parse.y" +#line 476 "/usr/src/local/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 480 "/Users/chet/src/bash/src/parse.y" +#line 481 "/usr/src/local/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 485 "/Users/chet/src/bash/src/parse.y" +#line 486 "/usr/src/local/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 490 "/Users/chet/src/bash/src/parse.y" +#line 491 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection @@ -1484,7 +1485,7 @@ case 25: ; break;} case 26: -#line 497 "/Users/chet/src/bash/src/parse.y" +#line 498 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection @@ -1493,88 +1494,88 @@ case 26: ; break;} case 27: -#line 504 "/Users/chet/src/bash/src/parse.y" +#line 505 "/usr/src/local/chet/src/bash/src/parse.y" { redir.dest = 0; yyval.redirect = make_redirection (1, r_close_this, redir); ; break;} case 28: -#line 509 "/Users/chet/src/bash/src/parse.y" +#line 510 "/usr/src/local/chet/src/bash/src/parse.y" { redir.dest = 0; yyval.redirect = make_redirection (yyvsp[-2].number, r_close_this, redir); ; break;} case 29: -#line 514 "/Users/chet/src/bash/src/parse.y" +#line 515 "/usr/src/local/chet/src/bash/src/parse.y" { redir.dest = 0; yyval.redirect = make_redirection (0, r_close_this, redir); ; break;} case 30: -#line 519 "/Users/chet/src/bash/src/parse.y" +#line 520 "/usr/src/local/chet/src/bash/src/parse.y" { redir.dest = 0; yyval.redirect = make_redirection (yyvsp[-2].number, r_close_this, redir); ; break;} case 31: -#line 524 "/Users/chet/src/bash/src/parse.y" +#line 525 "/usr/src/local/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 529 "/Users/chet/src/bash/src/parse.y" +#line 530 "/usr/src/local/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 534 "/Users/chet/src/bash/src/parse.y" +#line 535 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection (0, r_input_output, redir); ; break;} case 34: -#line 539 "/Users/chet/src/bash/src/parse.y" +#line 540 "/usr/src/local/chet/src/bash/src/parse.y" { redir.filename = yyvsp[0].word; yyval.redirect = make_redirection (1, r_output_force, redir); ; break;} case 35: -#line 544 "/Users/chet/src/bash/src/parse.y" +#line 545 "/usr/src/local/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 551 "/Users/chet/src/bash/src/parse.y" +#line 552 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.element.word = yyvsp[0].word; yyval.element.redirect = 0; ; break;} case 37: -#line 553 "/Users/chet/src/bash/src/parse.y" +#line 554 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.element.word = yyvsp[0].word; yyval.element.redirect = 0; ; break;} case 38: -#line 555 "/Users/chet/src/bash/src/parse.y" +#line 556 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.element.redirect = yyvsp[0].redirect; yyval.element.word = 0; ; break;} case 39: -#line 559 "/Users/chet/src/bash/src/parse.y" +#line 560 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.redirect = yyvsp[0].redirect; ; break;} case 40: -#line 563 "/Users/chet/src/bash/src/parse.y" +#line 564 "/usr/src/local/chet/src/bash/src/parse.y" { register REDIRECT *t; @@ -1585,23 +1586,23 @@ case 40: ; break;} case 41: -#line 574 "/Users/chet/src/bash/src/parse.y" +#line 575 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_simple_command (yyvsp[0].element, (COMMAND *)NULL); ; break;} case 42: -#line 576 "/Users/chet/src/bash/src/parse.y" +#line 577 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_simple_command (yyvsp[0].element, yyvsp[-1].command); ; break;} case 43: -#line 580 "/Users/chet/src/bash/src/parse.y" +#line 581 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = clean_simple_command (yyvsp[0].command); ; break;} case 44: -#line 582 "/Users/chet/src/bash/src/parse.y" +#line 583 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 45: -#line 584 "/Users/chet/src/bash/src/parse.y" +#line 585 "/usr/src/local/chet/src/bash/src/parse.y" { COMMAND *tc; @@ -1619,218 +1620,218 @@ case 45: ; break;} case 46: -#line 600 "/Users/chet/src/bash/src/parse.y" +#line 601 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 47: -#line 604 "/Users/chet/src/bash/src/parse.y" +#line 605 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 48: -#line 606 "/Users/chet/src/bash/src/parse.y" +#line 607 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 49: -#line 608 "/Users/chet/src/bash/src/parse.y" +#line 609 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_while_command (yyvsp[-3].command, yyvsp[-1].command); ; break;} case 50: -#line 610 "/Users/chet/src/bash/src/parse.y" +#line 611 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_until_command (yyvsp[-3].command, yyvsp[-1].command); ; break;} case 51: -#line 612 "/Users/chet/src/bash/src/parse.y" +#line 613 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 52: -#line 614 "/Users/chet/src/bash/src/parse.y" +#line 615 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 53: -#line 616 "/Users/chet/src/bash/src/parse.y" +#line 617 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 54: -#line 618 "/Users/chet/src/bash/src/parse.y" +#line 619 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 55: -#line 620 "/Users/chet/src/bash/src/parse.y" +#line 621 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 56: -#line 622 "/Users/chet/src/bash/src/parse.y" +#line 623 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 57: -#line 624 "/Users/chet/src/bash/src/parse.y" +#line 625 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 58: -#line 628 "/Users/chet/src/bash/src/parse.y" +#line 629 "/usr/src/local/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 633 "/Users/chet/src/bash/src/parse.y" +#line 634 "/usr/src/local/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 638 "/Users/chet/src/bash/src/parse.y" +#line 639 "/usr/src/local/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 643 "/Users/chet/src/bash/src/parse.y" +#line 644 "/usr/src/local/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 648 "/Users/chet/src/bash/src/parse.y" +#line 649 "/usr/src/local/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 653 "/Users/chet/src/bash/src/parse.y" +#line 654 "/usr/src/local/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 658 "/Users/chet/src/bash/src/parse.y" +#line 659 "/usr/src/local/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 663 "/Users/chet/src/bash/src/parse.y" +#line 664 "/usr/src/local/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 670 "/Users/chet/src/bash/src/parse.y" +#line 671 "/usr/src/local/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 675 "/Users/chet/src/bash/src/parse.y" +#line 676 "/usr/src/local/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 680 "/Users/chet/src/bash/src/parse.y" +#line 681 "/usr/src/local/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 685 "/Users/chet/src/bash/src/parse.y" +#line 686 "/usr/src/local/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 692 "/Users/chet/src/bash/src/parse.y" +#line 693 "/usr/src/local/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 697 "/Users/chet/src/bash/src/parse.y" +#line 698 "/usr/src/local/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 702 "/Users/chet/src/bash/src/parse.y" +#line 703 "/usr/src/local/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 707 "/Users/chet/src/bash/src/parse.y" +#line 708 "/usr/src/local/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 712 "/Users/chet/src/bash/src/parse.y" +#line 713 "/usr/src/local/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 717 "/Users/chet/src/bash/src/parse.y" +#line 718 "/usr/src/local/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 724 "/Users/chet/src/bash/src/parse.y" +#line 725 "/usr/src/local/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 729 "/Users/chet/src/bash/src/parse.y" +#line 730 "/usr/src/local/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 734 "/Users/chet/src/bash/src/parse.y" +#line 735 "/usr/src/local/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 741 "/Users/chet/src/bash/src/parse.y" +#line 742 "/usr/src/local/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 744 "/Users/chet/src/bash/src/parse.y" +#line 745 "/usr/src/local/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 747 "/Users/chet/src/bash/src/parse.y" +#line 748 "/usr/src/local/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 752 "/Users/chet/src/bash/src/parse.y" +#line 753 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 83: -#line 754 "/Users/chet/src/bash/src/parse.y" +#line 755 "/usr/src/local/chet/src/bash/src/parse.y" { COMMAND *tc; @@ -1861,82 +1862,82 @@ case 83: ; break;} case 84: -#line 785 "/Users/chet/src/bash/src/parse.y" +#line 786 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_subshell_command (yyvsp[-1].command); yyval.command->flags |= CMD_WANT_SUBSHELL; ; break;} case 85: -#line 792 "/Users/chet/src/bash/src/parse.y" +#line 793 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_if_command (yyvsp[-3].command, yyvsp[-1].command, (COMMAND *)NULL); ; break;} case 86: -#line 794 "/Users/chet/src/bash/src/parse.y" +#line 795 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_if_command (yyvsp[-5].command, yyvsp[-3].command, yyvsp[-1].command); ; break;} case 87: -#line 796 "/Users/chet/src/bash/src/parse.y" +#line 797 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_if_command (yyvsp[-4].command, yyvsp[-2].command, yyvsp[-1].command); ; break;} case 88: -#line 801 "/Users/chet/src/bash/src/parse.y" +#line 802 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_group_command (yyvsp[-1].command); ; break;} case 89: -#line 805 "/Users/chet/src/bash/src/parse.y" +#line 806 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_arith_command (yyvsp[0].word_list); ; break;} case 90: -#line 809 "/Users/chet/src/bash/src/parse.y" +#line 810 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[-1].command; ; break;} case 91: -#line 813 "/Users/chet/src/bash/src/parse.y" +#line 814 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_if_command (yyvsp[-2].command, yyvsp[0].command, (COMMAND *)NULL); ; break;} case 92: -#line 815 "/Users/chet/src/bash/src/parse.y" +#line 816 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_if_command (yyvsp[-4].command, yyvsp[-2].command, yyvsp[0].command); ; break;} case 93: -#line 817 "/Users/chet/src/bash/src/parse.y" +#line 818 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = make_if_command (yyvsp[-3].command, yyvsp[-1].command, yyvsp[0].command); ; break;} case 95: -#line 822 "/Users/chet/src/bash/src/parse.y" +#line 823 "/usr/src/local/chet/src/bash/src/parse.y" { yyvsp[0].pattern->next = yyvsp[-1].pattern; yyval.pattern = yyvsp[0].pattern; ; break;} case 96: -#line 826 "/Users/chet/src/bash/src/parse.y" +#line 827 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.pattern = make_pattern_list (yyvsp[-2].word_list, yyvsp[0].command); ; break;} case 97: -#line 828 "/Users/chet/src/bash/src/parse.y" +#line 829 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.pattern = make_pattern_list (yyvsp[-2].word_list, (COMMAND *)NULL); ; break;} case 98: -#line 830 "/Users/chet/src/bash/src/parse.y" +#line 831 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.pattern = make_pattern_list (yyvsp[-2].word_list, yyvsp[0].command); ; break;} case 99: -#line 832 "/Users/chet/src/bash/src/parse.y" +#line 833 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.pattern = make_pattern_list (yyvsp[-2].word_list, (COMMAND *)NULL); ; break;} case 101: -#line 837 "/Users/chet/src/bash/src/parse.y" +#line 838 "/usr/src/local/chet/src/bash/src/parse.y" { yyvsp[-1].pattern->next = yyvsp[-2].pattern; yyval.pattern = yyvsp[-1].pattern; ; break;} case 102: -#line 841 "/Users/chet/src/bash/src/parse.y" +#line 842 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.word_list = make_word_list (yyvsp[0].word, (WORD_LIST *)NULL); ; break;} case 103: -#line 843 "/Users/chet/src/bash/src/parse.y" +#line 844 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.word_list = make_word_list (yyvsp[0].word, yyvsp[-2].word_list); ; break;} case 104: -#line 852 "/Users/chet/src/bash/src/parse.y" +#line 853 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; if (need_here_doc) @@ -1944,13 +1945,13 @@ case 104: ; break;} case 106: -#line 861 "/Users/chet/src/bash/src/parse.y" +#line 862 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 108: -#line 868 "/Users/chet/src/bash/src/parse.y" +#line 869 "/usr/src/local/chet/src/bash/src/parse.y" { if (yyvsp[-2].command->type == cm_connection) yyval.command = connect_async_list (yyvsp[-2].command, (COMMAND *)NULL, '&'); @@ -1959,15 +1960,15 @@ case 108: ; break;} case 110: -#line 879 "/Users/chet/src/bash/src/parse.y" +#line 880 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, AND_AND); ; break;} case 111: -#line 881 "/Users/chet/src/bash/src/parse.y" +#line 882 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, OR_OR); ; break;} case 112: -#line 883 "/Users/chet/src/bash/src/parse.y" +#line 884 "/usr/src/local/chet/src/bash/src/parse.y" { if (yyvsp[-3].command->type == cm_connection) yyval.command = connect_async_list (yyvsp[-3].command, yyvsp[0].command, '&'); @@ -1976,31 +1977,31 @@ case 112: ; break;} case 113: -#line 890 "/Users/chet/src/bash/src/parse.y" +#line 891 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, ';'); ; break;} case 114: -#line 892 "/Users/chet/src/bash/src/parse.y" +#line 893 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, ';'); ; break;} case 115: -#line 894 "/Users/chet/src/bash/src/parse.y" +#line 895 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 118: -#line 902 "/Users/chet/src/bash/src/parse.y" +#line 903 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.number = '\n'; ; break;} case 119: -#line 904 "/Users/chet/src/bash/src/parse.y" +#line 905 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.number = ';'; ; break;} case 120: -#line 906 "/Users/chet/src/bash/src/parse.y" +#line 907 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.number = yacc_EOF; ; break;} case 123: -#line 920 "/Users/chet/src/bash/src/parse.y" +#line 921 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; if (need_here_doc) @@ -2008,7 +2009,7 @@ case 123: ; break;} case 124: -#line 926 "/Users/chet/src/bash/src/parse.y" +#line 927 "/usr/src/local/chet/src/bash/src/parse.y" { if (yyvsp[-1].command->type == cm_connection) yyval.command = connect_async_list (yyvsp[-1].command, (COMMAND *)NULL, '&'); @@ -2019,7 +2020,7 @@ case 124: ; break;} case 125: -#line 935 "/Users/chet/src/bash/src/parse.y" +#line 936 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[-1].command; if (need_here_doc) @@ -2027,15 +2028,15 @@ case 125: ; break;} case 126: -#line 943 "/Users/chet/src/bash/src/parse.y" +#line 944 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, AND_AND); ; break;} case 127: -#line 945 "/Users/chet/src/bash/src/parse.y" +#line 946 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, OR_OR); ; break;} case 128: -#line 947 "/Users/chet/src/bash/src/parse.y" +#line 948 "/usr/src/local/chet/src/bash/src/parse.y" { if (yyvsp[-2].command->type == cm_connection) yyval.command = connect_async_list (yyvsp[-2].command, yyvsp[0].command, '&'); @@ -2044,47 +2045,51 @@ case 128: ; break;} case 129: -#line 954 "/Users/chet/src/bash/src/parse.y" +#line 955 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = command_connect (yyvsp[-2].command, yyvsp[0].command, ';'); ; break;} case 130: -#line 957 "/Users/chet/src/bash/src/parse.y" +#line 958 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 131: -#line 961 "/Users/chet/src/bash/src/parse.y" +#line 962 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 132: -#line 963 "/Users/chet/src/bash/src/parse.y" +#line 964 "/usr/src/local/chet/src/bash/src/parse.y" { - yyvsp[0].command->flags |= CMD_INVERT_RETURN; + if (yyvsp[0].command) + yyvsp[0].command->flags |= CMD_INVERT_RETURN; yyval.command = yyvsp[0].command; ; break;} case 133: -#line 968 "/Users/chet/src/bash/src/parse.y" +#line 970 "/usr/src/local/chet/src/bash/src/parse.y" { - yyvsp[0].command->flags |= yyvsp[-1].number; + if (yyvsp[0].command) + yyvsp[0].command->flags |= yyvsp[-1].number; yyval.command = yyvsp[0].command; ; break;} case 134: -#line 973 "/Users/chet/src/bash/src/parse.y" +#line 976 "/usr/src/local/chet/src/bash/src/parse.y" { - yyvsp[0].command->flags |= yyvsp[-2].number|CMD_INVERT_RETURN; + if (yyvsp[0].command) + yyvsp[0].command->flags |= yyvsp[-2].number|CMD_INVERT_RETURN; yyval.command = yyvsp[0].command; ; break;} case 135: -#line 978 "/Users/chet/src/bash/src/parse.y" +#line 982 "/usr/src/local/chet/src/bash/src/parse.y" { - yyvsp[0].command->flags |= yyvsp[-1].number|CMD_INVERT_RETURN; + if (yyvsp[0].command) + yyvsp[0].command->flags |= yyvsp[-1].number|CMD_INVERT_RETURN; yyval.command = yyvsp[0].command; ; break;} case 136: -#line 983 "/Users/chet/src/bash/src/parse.y" +#line 988 "/usr/src/local/chet/src/bash/src/parse.y" { ELEMENT x; @@ -2103,19 +2108,19 @@ case 136: ; break;} case 137: -#line 1004 "/Users/chet/src/bash/src/parse.y" +#line 1009 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, '|'); ; break;} case 138: -#line 1006 "/Users/chet/src/bash/src/parse.y" +#line 1011 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.command = yyvsp[0].command; ; break;} case 139: -#line 1010 "/Users/chet/src/bash/src/parse.y" +#line 1015 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.number = CMD_TIME_PIPELINE; ; break;} case 140: -#line 1012 "/Users/chet/src/bash/src/parse.y" +#line 1017 "/usr/src/local/chet/src/bash/src/parse.y" { yyval.number = CMD_TIME_PIPELINE|CMD_TIME_POSIX; ; break;} } @@ -2340,7 +2345,7 @@ yyerrhandle: } return 1; } -#line 1014 "/Users/chet/src/bash/src/parse.y" +#line 1019 "/usr/src/local/chet/src/bash/src/parse.y" /* Possible states for the parser that require it to do special things. */ @@ -2358,6 +2363,7 @@ yyerrhandle: #define PST_ALEXPAND 0x0800 /* OK to expand aliases - unused */ #define PST_CMDTOKEN 0x1000 /* command token OK - unused */ #define PST_COMPASSIGN 0x2000 /* parsing x=(...) compound assignment */ +#define PST_ASSIGNOK 0x4000 /* assignment statement ok in this context */ /* Initial size to allocate for tokens, and the amount to grow them by. */ @@ -2669,8 +2675,13 @@ yy_stream_get () result = EOF; if (bash_input.location.file) - result = getc_with_restart (bash_input.location.file); - + { + if (interactive) + interrupt_immediately++; + result = getc_with_restart (bash_input.location.file); + if (interactive) + interrupt_immediately--; + } return (result); } @@ -2983,11 +2994,11 @@ read_a_line (remove_quoted_newline) pass_next = 0; while (1) { - c = yy_getc (); - /* Allow immediate exit if interrupted during input. */ QUIT; + c = yy_getc (); + /* Ignore null bytes in input. */ if (c == 0) { @@ -3192,6 +3203,12 @@ shell_getc (remove_quoted_newline) QUIT; + if (sigwinch_received) + { + sigwinch_received = 0; + get_new_window_size (0, (int *)0, (int *)0); + } + if (eol_ungetc_lookahead) { c = eol_ungetc_lookahead; @@ -3385,14 +3402,6 @@ shell_getc (remove_quoted_newline) if (uc) shell_input_line_index++; - if MBTEST(uc == '\\' && remove_quoted_newline && shell_input_line[shell_input_line_index] == '\n') - { - if (SHOULD_PROMPT ()) - prompt_again (); - line_number++; - goto restart_read; - } - #if defined (ALIAS) || defined (DPAREN_ARITHMETIC) /* If UC is NULL, we have reached the end of the current input string. If pushed_string_list is non-empty, it's time to pop to the previous string @@ -3408,6 +3417,14 @@ shell_getc (remove_quoted_newline) } #endif /* ALIAS || DPAREN_ARITHMETIC */ + if MBTEST(uc == '\\' && remove_quoted_newline && shell_input_line[shell_input_line_index] == '\n') + { + if (SHOULD_PROMPT ()) + prompt_again (); + line_number++; + goto restart_read; + } + if (!uc && shell_input_line_terminator == EOF) return ((shell_input_line_index != 0) ? '\n' : EOF); @@ -3469,7 +3486,7 @@ execute_prompt_command (command) parse_and_execute (savestring (command), "PROMPT_COMMAND", SEVAL_NONINT|SEVAL_NOHIST); restore_parser_state (&ps); - bind_variable ("_", last_lastarg); + bind_variable ("_", last_lastarg, 0); FREE (last_lastarg); if (token_to_read == '\n') /* reset_parser was called */ @@ -3897,6 +3914,8 @@ read_token (command) parser_state &= ~PST_ALEXPNEXT; #endif /* ALIAS */ + parser_state &= ~PST_ASSIGNOK; + return (character); } @@ -3910,6 +3929,8 @@ read_token (command) parser_state &= ~PST_ALEXPNEXT; #endif /* ALIAS */ + parser_state &= ~PST_ASSIGNOK; + peek_char = shell_getc (1); if (character == peek_char) { @@ -3937,6 +3958,7 @@ read_token (command) #if defined (ALIAS) parser_state &= ~PST_ALEXPNEXT; #endif /* ALIAS */ + return (SEMI_SEMI); case '&': @@ -4017,13 +4039,13 @@ read_token (command) /* * Match a $(...) or other grouping construct. This has to handle embedded * quoted strings ('', ``, "") and nested constructs. It also must handle - * reprompting the user, if necessary, after reading a newline (unless the - * P_NONL flag is passed), and returning correct error values if it reads - * EOF. + * reprompting the user, if necessary, after reading a newline, and returning + * correct error values if it reads EOF. */ #define P_FIRSTCLOSE 0x01 #define P_ALLOWESC 0x02 #define P_DQUOTE 0x04 +#define P_COMMAND 0x08 /* parsing a command, so look for comments */ static char matched_pair_error; static char * @@ -4032,13 +4054,14 @@ parse_matched_pair (qc, open, close, lenp, flags) int open, close; int *lenp, flags; { - int count, ch, was_dollar; + int count, ch, was_dollar, in_comment, check_comment; int pass_next_character, nestlen, ttranslen, start_lineno; char *ret, *nestret, *ttrans; int retind, retsize, rflags; count = 1; - pass_next_character = was_dollar = 0; + pass_next_character = 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. */ rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE); @@ -4049,7 +4072,11 @@ 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 if (ch == EOF) { free (ret); @@ -4062,6 +4089,21 @@ parse_matched_pair (qc, open, close, lenp, flags) if (ch == '\n' && SHOULD_PROMPT ()) prompt_again (); + if (in_comment) + { + /* Add this character. */ + RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); + ret[retind++] = ch; + + if (ch == '\n') + in_comment = 0; + + continue; + } + /* Not exactly right yet */ + else if (check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind -1]))) + in_comment = 1; + if (pass_next_character) /* last char was backslash */ { pass_next_character = 0; @@ -4129,9 +4171,18 @@ parse_matched_pair (qc, open, close, lenp, flags) /* Translate $'...' here. */ ttrans = ansiexpand (nestret, 0, nestlen - 1, &ttranslen); xfree (nestret); - nestret = sh_single_quote (ttrans); - free (ttrans); - nestlen = strlen (nestret); + + if ((rflags & P_DQUOTE) == 0) + { + nestret = sh_single_quote (ttrans); + free (ttrans); + nestlen = strlen (nestret); + } + else + { + nestret = ttrans; + nestlen = ttranslen; + } retind -= 2; /* back up before the $' */ } else if MBTEST(was_dollar && ch == '"' && (extended_quote || (rflags & P_DQUOTE) == 0)) @@ -4139,13 +4190,10 @@ parse_matched_pair (qc, open, close, lenp, flags) /* Locale expand $"..." here. */ ttrans = localeexpand (nestret, 0, nestlen - 1, start_lineno, &ttranslen); xfree (nestret); - nestret = (char *)xmalloc (ttranslen + 3); - nestret[0] = '"'; - strcpy (nestret + 1, ttrans); - nestret[ttranslen + 1] = '"'; - nestret[ttranslen += 2] = '\0'; + + nestret = sh_mkdoublequoted (ttrans, ttranslen, 0); free (ttrans); - nestlen = ttranslen; + nestlen = ttranslen + 2; retind -= 2; /* back up before the $" */ } @@ -4164,6 +4212,7 @@ parse_matched_pair (qc, open, close, lenp, flags) else if MBTEST(open == '"' && ch == '`') { nestret = parse_matched_pair (0, '`', '`', &nestlen, rflags); +add_nestret: if (nestret == &matched_pair_error) { free (ret); @@ -4177,6 +4226,11 @@ parse_matched_pair (qc, open, close, lenp, flags) } FREE (nestret); } + else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0) + { + nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags); + goto add_nestret; + } else if MBTEST(was_dollar && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ /* check for $(), $[], or ${} inside quoted string. */ { @@ -4188,18 +4242,8 @@ parse_matched_pair (qc, open, close, lenp, flags) nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags); else if (ch == '[') /* ] */ nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags); - if (nestret == &matched_pair_error) - { - free (ret); - return &matched_pair_error; - } - if (nestlen) - { - RESIZE_MALLOCED_BUFFER (ret, retind, nestlen, retsize, 64); - strcpy (ret + retind, nestret); - retind += nestlen; - } - FREE (nestret); + + goto add_nestret; } was_dollar = MBTEST(ch == '$'); } @@ -4230,9 +4274,10 @@ parse_dparen (c) cmdtyp = parse_arith_cmd (&wval, 0); if (cmdtyp == 1) { + wd = alloc_word_desc (); + wd->word = wval; wd = make_word (wval); yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL); - free (wval); return (ARITH_FOR_EXPRS); } else @@ -4244,21 +4289,14 @@ parse_dparen (c) if (reserved_word_acceptable (last_read_token)) { sline = line_number; -#if 0 - cmdtyp = parse_arith_cmd (&wval, 1); -#else + cmdtyp = parse_arith_cmd (&wval, 0); -#endif if (cmdtyp == 1) /* arithmetic command */ { - wd = make_word (wval); -#if 0 - wd->flags = W_QUOTED; -#else - wd->flags = W_QUOTED|W_NOSPLIT|W_NOGLOB; -#endif + wd = alloc_word_desc (); + wd->word = wval; + wd->flags = W_QUOTED|W_NOSPLIT|W_NOGLOB|W_DQUOTE; yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL); - free (wval); /* make_word copies it */ return (ARITH_CMD); } else if (cmdtyp == 0) /* nested subshell */ @@ -4576,6 +4614,7 @@ token_is_assignment (t, i) return r; } +/* XXX - possible changes here for `+=' */ static int token_is_ident (t, i) char *t; @@ -4608,6 +4647,10 @@ read_token_word (character) /* DOLLAR_PRESENT becomes non-zero if we see a `$'. */ int dollar_present; + /* COMPOUND_ASSIGNMENT becomes non-zero if we are parsing a compound + assignment. */ + int compound_assignment; + /* QUOTED becomes non-zero if we see one of ("), ('), (`), or (\). */ int quoted; @@ -4627,7 +4670,7 @@ read_token_word (character) token_index = 0; all_digit_token = DIGIT (character); - dollar_present = quoted = pass_next_character = 0; + dollar_present = quoted = pass_next_character = compound_assignment = 0; for (;;) { @@ -4673,7 +4716,7 @@ read_token_word (character) if MBTEST(shellquote (character)) { push_delimiter (dstack, character); - ttok = parse_matched_pair (character, character, character, &ttoklen, 0); + ttok = parse_matched_pair (character, character, character, &ttoklen, (character == '`') ? P_COMMAND : 0); pop_delimiter (dstack); if (ttok == &matched_pair_error) return -1; /* Bail immediately. */ @@ -4736,7 +4779,7 @@ read_token_word (character) history literally rather than causing a possibly- incorrect `;' to be added. ) */ push_delimiter (dstack, peek_char); - ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0); + ttok = parse_matched_pair (cd, '(', ')', &ttoklen, P_COMMAND); pop_delimiter (dstack); } else @@ -4772,27 +4815,25 @@ read_token_word (character) { ttrans = ansiexpand (ttok, 0, ttoklen - 1, &ttranslen); free (ttok); + /* Insert the single quotes and correctly quote any embedded single quotes (allowed because P_ALLOWESC was passed to parse_matched_pair). */ ttok = sh_single_quote (ttrans); free (ttrans); + ttranslen = strlen (ttok); ttrans = ttok; - ttranslen = strlen (ttrans); } 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); /* Add the double quotes back */ - ttok = (char *)xmalloc (ttranslen + 3); - ttok[0] = '"'; - strcpy (ttok + 1, ttrans); - ttok[ttranslen + 1] = '"'; - ttok[ttranslen += 2] = '\0'; + ttok = sh_mkdoublequoted (ttrans, ttranslen, 0); free (ttrans); + ttranslen += 2; ttrans = ttok; } @@ -4845,7 +4886,7 @@ read_token_word (character) goto next_character; } /* Identify possible compound array variable assignment. */ - else if MBTEST(character == '=' && token_index > 0 && token_is_assignment (token, token_index)) + else if MBTEST(character == '=' && token_index > 0 && (assignment_acceptable (last_read_token) || (parser_state & PST_ASSIGNOK)) && token_is_assignment (token, token_index)) { peek_char = shell_getc (1); if MBTEST(peek_char == '(') /* ) */ @@ -4866,7 +4907,12 @@ read_token_word (character) token[token_index++] = ')'; FREE (ttok); all_digit_token = 0; + compound_assignment = 1; +#if 0 goto next_character; +#else + goto got_token; /* ksh93 seems to do this */ +#endif } else shell_ungetc (peek_char); @@ -4961,6 +5007,8 @@ got_token: the_word->flags |= W_HASDOLLAR; if (quoted) the_word->flags |= W_QUOTED; + if (compound_assignment) + 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 context-dependent, so it cannot be handled in the grammar. */ @@ -4972,6 +5020,14 @@ got_token: the_word->flags |= W_NOSPLIT; } + if (command_token_position (last_read_token)) + { + struct builtin *b; + b = builtin_address_internal (token, 0); + if (b && (b->flags & ASSIGNMENT_BUILTIN)) + parser_state |= PST_ASSIGNOK; + } + yylval.word = the_word; result = ((the_word->flags & (W_ASSIGNMENT|W_NOSPLIT)) == (W_ASSIGNMENT|W_NOSPLIT)) @@ -5129,6 +5185,8 @@ history_delimiting_chars () return " "; return ";"; } + else if (two_tokens_ago == CASE && token_before_that == WORD && (parser_state & PST_CASESTMT)) + return " "; for (i = 0; no_semi_successors[i]; i++) { @@ -5433,7 +5491,7 @@ decode_prompt_string (string) #define ROOT_PATH(x) ((x)[0] == '/' && (x)[1] == 0) #define DOUBLE_SLASH_ROOT(x) ((x)[0] == '/' && (x)[1] == '/' && (x)[2] == 0) /* Abbreviate \W as ~ if $PWD == $HOME */ - if (c == 'W' && (((t = get_string_value ("HOME")) == 0) || STREQ (t, temp) == 0)) + if (c == 'W' && (((t = get_string_value ("HOME")) == 0) || STREQ (t, t_string) == 0)) { if (ROOT_PATH (t_string) == 0 && DOUBLE_SLASH_ROOT (t_string) == 0) { @@ -5912,7 +5970,7 @@ parse_string_to_word_list (s, flags, whom) line_number = orig_line_number + line_number - 1; orig_current_token = current_token; current_token = tok; - yyerror ((char *)NULL); /* does the right thing */ + yyerror (NULL); /* does the right thing */ current_token = orig_current_token; if (wl) dispose_words (wl); @@ -5987,7 +6045,7 @@ parse_compound_assignment (retlenp) if (tok == yacc_EOF) /* ( */ parser_error (orig_line_number, _("unexpected EOF while looking for matching `)'")); else - yyerror ((char *)NULL); /* does the right thing */ + yyerror(NULL); /* does the right thing */ if (wl) dispose_words (wl); wl = &parse_string_error; @@ -6042,7 +6100,7 @@ save_parser_state (ps) #endif if (ps == 0) - ps = xmalloc (sizeof (sh_parser_state_t)); + ps = (sh_parser_state_t *)xmalloc (sizeof (sh_parser_state_t)); if (ps == 0) return ((sh_parser_state_t *)NULL);