diff options
Diffstat (limited to 'awkgram.c')
-rw-r--r-- | awkgram.c | 877 |
1 files changed, 477 insertions, 400 deletions
@@ -708,20 +708,20 @@ static const yytype_uint16 yyrline[] = 318, 327, 337, 339, 341, 347, 352, 353, 357, 376, 375, 409, 411, 416, 417, 430, 435, 436, 440, 442, 444, 451, 541, 583, 625, 738, 745, 752, 762, 771, - 780, 789, 804, 820, 819, 843, 855, 855, 949, 949, - 974, 997, 1003, 1004, 1010, 1011, 1018, 1023, 1035, 1049, - 1051, 1057, 1062, 1064, 1072, 1074, 1083, 1084, 1092, 1097, - 1097, 1108, 1112, 1120, 1121, 1124, 1126, 1131, 1132, 1141, - 1142, 1147, 1152, 1158, 1160, 1162, 1169, 1170, 1176, 1177, - 1182, 1184, 1189, 1191, 1193, 1195, 1201, 1208, 1210, 1212, - 1228, 1238, 1245, 1247, 1252, 1254, 1256, 1264, 1266, 1271, - 1273, 1278, 1280, 1282, 1332, 1334, 1336, 1338, 1340, 1342, - 1344, 1346, 1369, 1374, 1379, 1404, 1410, 1412, 1414, 1416, - 1418, 1420, 1425, 1429, 1460, 1462, 1468, 1474, 1487, 1488, - 1489, 1494, 1499, 1503, 1507, 1520, 1533, 1538, 1574, 1592, - 1593, 1599, 1600, 1605, 1607, 1614, 1631, 1648, 1650, 1657, - 1662, 1670, 1680, 1692, 1701, 1705, 1709, 1713, 1717, 1721, - 1724, 1726, 1730, 1734, 1738 + 780, 789, 804, 820, 819, 843, 855, 855, 953, 953, + 978, 1001, 1007, 1008, 1014, 1015, 1022, 1027, 1039, 1053, + 1055, 1063, 1068, 1070, 1078, 1080, 1089, 1090, 1098, 1103, + 1103, 1114, 1118, 1126, 1127, 1130, 1132, 1137, 1138, 1147, + 1148, 1153, 1158, 1164, 1166, 1168, 1175, 1176, 1182, 1183, + 1188, 1190, 1195, 1197, 1199, 1201, 1207, 1214, 1216, 1218, + 1234, 1244, 1251, 1253, 1258, 1260, 1262, 1270, 1272, 1277, + 1279, 1284, 1286, 1288, 1338, 1340, 1342, 1344, 1346, 1348, + 1350, 1352, 1375, 1380, 1385, 1410, 1416, 1418, 1420, 1422, + 1424, 1426, 1431, 1435, 1467, 1469, 1475, 1481, 1494, 1495, + 1496, 1501, 1506, 1510, 1514, 1529, 1542, 1547, 1583, 1601, + 1602, 1608, 1609, 1614, 1616, 1623, 1640, 1657, 1659, 1666, + 1671, 1679, 1689, 1701, 1710, 1714, 1718, 1722, 1726, 1730, + 1733, 1735, 1739, 1743, 1747 }; #endif @@ -2039,7 +2039,7 @@ yyreduce: { case 3: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 195 "awkgram.y" { rule = 0; @@ -2049,7 +2049,7 @@ yyreduce: case 5: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 201 "awkgram.y" { next_sourcefile(); @@ -2058,7 +2058,7 @@ yyreduce: case 6: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 205 "awkgram.y" { rule = 0; @@ -2072,7 +2072,7 @@ yyreduce: case 7: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 217 "awkgram.y" { (void) append_rule((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); @@ -2081,7 +2081,7 @@ yyreduce: case 8: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 221 "awkgram.y" { if (rule != Rule) { @@ -2097,7 +2097,7 @@ yyreduce: case 9: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 232 "awkgram.y" { in_function = NULL; @@ -2108,7 +2108,7 @@ yyreduce: case 10: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 238 "awkgram.y" { want_source = FALSE; @@ -2118,7 +2118,7 @@ yyreduce: case 11: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 246 "awkgram.y" { if (include_source((yyvsp[(1) - (1)])) < 0) @@ -2131,35 +2131,35 @@ yyreduce: case 12: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 254 "awkgram.y" { (yyval) = NULL; } break; case 13: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 256 "awkgram.y" { (yyval) = NULL; } break; case 14: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 261 "awkgram.y" { (yyval) = NULL; rule = Rule; } break; case 15: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 263 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); rule = Rule; } break; case 16: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 265 "awkgram.y" { INSTRUCTION *tp; @@ -2190,7 +2190,7 @@ yyreduce: case 17: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 291 "awkgram.y" { static int begin_seen = 0; @@ -2206,7 +2206,7 @@ yyreduce: case 18: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 302 "awkgram.y" { static int end_seen = 0; @@ -2222,7 +2222,7 @@ yyreduce: case 19: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 313 "awkgram.y" { (yyvsp[(1) - (1)])->in_rule = rule = BEGINFILE; @@ -2233,7 +2233,7 @@ yyreduce: case 20: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 319 "awkgram.y" { (yyvsp[(1) - (1)])->in_rule = rule = ENDFILE; @@ -2244,7 +2244,7 @@ yyreduce: case 21: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 328 "awkgram.y" { if ((yyvsp[(2) - (5)]) == NULL) @@ -2256,21 +2256,21 @@ yyreduce: case 22: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 338 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 23: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 340 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 24: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 342 "awkgram.y" { yyerror(_("`%s' is a built-in function, it cannot be redefined"), @@ -2281,14 +2281,14 @@ yyreduce: case 25: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 348 "awkgram.y" { (yyval) = (yyvsp[(2) - (2)]); } break; case 28: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 358 "awkgram.y" { (yyvsp[(1) - (6)])->source_file = source; @@ -2304,14 +2304,14 @@ yyreduce: case 29: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 376 "awkgram.y" { ++want_regexp; } break; case 30: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 378 "awkgram.y" { NODE *n, *exp; @@ -2345,21 +2345,21 @@ yyreduce: case 31: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 410 "awkgram.y" { bcfree((yyvsp[(1) - (1)])); } break; case 33: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 416 "awkgram.y" { (yyval) = NULL; } break; case 34: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 418 "awkgram.y" { if ((yyvsp[(2) - (2)]) == NULL) @@ -2377,28 +2377,28 @@ yyreduce: case 35: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 431 "awkgram.y" { (yyval) = NULL; } break; case 38: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 441 "awkgram.y" { (yyval) = NULL; } break; case 39: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 443 "awkgram.y" { (yyval) = (yyvsp[(2) - (3)]); } break; case 40: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 445 "awkgram.y" { if (do_pretty_print) @@ -2410,7 +2410,7 @@ yyreduce: case 41: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 452 "awkgram.y" { INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt; @@ -2505,7 +2505,7 @@ yyreduce: case 42: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 542 "awkgram.y" { /* @@ -2552,7 +2552,7 @@ yyreduce: case 43: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 584 "awkgram.y" { /* @@ -2599,7 +2599,7 @@ yyreduce: case 44: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 626 "awkgram.y" { INSTRUCTION *ip; @@ -2651,16 +2651,16 @@ yyreduce: } else { INSTRUCTION *tbreak, *tcont; - /* [ Op_push_array a ] - * [ Op_arrayfor_init | ib ] - * ic:[ Op_arrayfor_incr | ib ] - * [ Op_var_assign if any ] - * - * body - * - * [Op_jmp | ic ] - * ib:[Op_arrayfor_final ] - */ + /* [ Op_push_array a ] + * [ Op_arrayfor_init | ib ] + * ic:[ Op_arrayfor_incr | ib ] + * [ Op_var_assign if any ] + * + * body + * + * [Op_jmp | ic ] + * ib:[Op_arrayfor_final ] + */ regular_loop: ip = (yyvsp[(5) - (8)]); ip->nexti->opcode = Op_push_array; @@ -2717,7 +2717,7 @@ regular_loop: case 45: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 739 "awkgram.y" { (yyval) = mk_for_loop((yyvsp[(1) - (12)]), (yyvsp[(3) - (12)]), (yyvsp[(6) - (12)]), (yyvsp[(9) - (12)]), (yyvsp[(12) - (12)])); @@ -2729,7 +2729,7 @@ regular_loop: case 46: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 746 "awkgram.y" { (yyval) = mk_for_loop((yyvsp[(1) - (11)]), (yyvsp[(3) - (11)]), (INSTRUCTION *) NULL, (yyvsp[(8) - (11)]), (yyvsp[(11) - (11)])); @@ -2741,7 +2741,7 @@ regular_loop: case 47: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 753 "awkgram.y" { if (do_pretty_print) @@ -2753,7 +2753,7 @@ regular_loop: case 48: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 763 "awkgram.y" { if (! break_allowed) @@ -2767,7 +2767,7 @@ regular_loop: case 49: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 772 "awkgram.y" { if (! continue_allowed) @@ -2781,7 +2781,7 @@ regular_loop: case 50: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 781 "awkgram.y" { /* if inside function (rule = 0), resolve context at run-time */ @@ -2795,7 +2795,7 @@ regular_loop: case 51: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 790 "awkgram.y" { if (do_traditional) @@ -2815,7 +2815,7 @@ regular_loop: case 52: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 805 "awkgram.y" { /* Initialize the two possible jump targets, the actual target @@ -2835,7 +2835,7 @@ regular_loop: case 53: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 820 "awkgram.y" { if (! in_function) @@ -2845,7 +2845,7 @@ regular_loop: case 54: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 823 "awkgram.y" { if ((yyvsp[(3) - (4)]) == NULL) { @@ -2871,14 +2871,14 @@ regular_loop: case 56: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 855 "awkgram.y" { in_print = TRUE; in_parens = 0; } break; case 57: -/* Line 1806 of yacc.c */ +/* Line 1821 of yacc.c */ #line 856 "awkgram.y" { /* @@ -2892,8 +2892,7 @@ regular_loop: || ((yyvsp[(3) - (4)])->lasti->opcode == Op_field_spec && (yyvsp[(3) - (4)])->nexti->nexti->nexti == (yyvsp[(3) - (4)])->lasti && (yyvsp[(3) - (4)])->nexti->nexti->opcode == Op_push_i - && (yyvsp[(3) - (4)])->nexti->nexti->memory->type == Node_val - && (yyvsp[(3) - (4)])->nexti->nexti->memory->numbr == 0.0) + && (yyvsp[(3) - (4)])->nexti->nexti->memory->type == Node_val) ) ) { static short warned = FALSE; @@ -2907,11 +2906,16 @@ regular_loop: */ if ((yyvsp[(3) - (4)]) != NULL) { - bcfree((yyvsp[(3) - (4)])->lasti); /* Op_field_spec */ - unref((yyvsp[(3) - (4)])->nexti->nexti->memory); /* Node_val */ + NODE *n = (yyvsp[(3) - (4)])->nexti->nexti->memory; + + if (! iszero(n)) + goto regular_print; + + bcfree((yyvsp[(3) - (4)])->lasti); /* Op_field_spec */ + unref(n); /* Node_val */ bcfree((yyvsp[(3) - (4)])->nexti->nexti); /* Op_push_i */ - bcfree((yyvsp[(3) - (4)])->nexti); /* Op_list */ - bcfree((yyvsp[(3) - (4)])); /* Op_list */ + bcfree((yyvsp[(3) - (4)])->nexti); /* Op_list */ + bcfree((yyvsp[(3) - (4)])); /* Op_list */ } else { if (do_lint && (rule == BEGIN || rule == END) && ! warned) { warned = TRUE; @@ -2943,7 +2947,7 @@ regular_loop: * [$1 | NULL | redir_type | expr_count] * */ - +regular_print: if ((yyvsp[(4) - (4)]) == NULL) { /* no redirection */ if ((yyvsp[(3) - (4)]) == NULL) { /* printf without arg */ (yyvsp[(1) - (4)])->expr_count = 0; @@ -2976,15 +2980,15 @@ regular_loop: case 58: -/* Line 1806 of yacc.c */ -#line 949 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 953 "awkgram.y" { sub_counter = 0; } break; case 59: -/* Line 1806 of yacc.c */ -#line 950 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 954 "awkgram.y" { char *arr = (yyvsp[(2) - (4)])->lextok; @@ -3013,8 +3017,8 @@ regular_loop: case 60: -/* Line 1806 of yacc.c */ -#line 979 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 983 "awkgram.y" { static short warned = FALSE; char *arr = (yyvsp[(3) - (4)])->lextok; @@ -3037,36 +3041,36 @@ regular_loop: case 61: -/* Line 1806 of yacc.c */ -#line 998 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1002 "awkgram.y" { (yyval) = optimize_assignment((yyvsp[(1) - (1)])); } break; case 62: -/* Line 1806 of yacc.c */ -#line 1003 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1007 "awkgram.y" { (yyval) = NULL; } break; case 63: -/* Line 1806 of yacc.c */ -#line 1005 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1009 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 64: -/* Line 1806 of yacc.c */ -#line 1010 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1014 "awkgram.y" { (yyval) = NULL; } break; case 65: -/* Line 1806 of yacc.c */ -#line 1012 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1016 "awkgram.y" { if ((yyvsp[(1) - (2)]) == NULL) (yyval) = list_create((yyvsp[(2) - (2)])); @@ -3077,15 +3081,15 @@ regular_loop: case 66: -/* Line 1806 of yacc.c */ -#line 1019 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1023 "awkgram.y" { (yyval) = NULL; } break; case 67: -/* Line 1806 of yacc.c */ -#line 1024 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1028 "awkgram.y" { INSTRUCTION *casestmt = (yyvsp[(5) - (5)]); if ((yyvsp[(5) - (5)]) == NULL) @@ -3101,8 +3105,8 @@ regular_loop: case 68: -/* Line 1806 of yacc.c */ -#line 1036 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1040 "awkgram.y" { INSTRUCTION *casestmt = (yyvsp[(4) - (4)]); if ((yyvsp[(4) - (4)]) == NULL) @@ -3117,17 +3121,19 @@ regular_loop: case 69: -/* Line 1806 of yacc.c */ -#line 1050 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1054 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 70: -/* Line 1806 of yacc.c */ -#line 1052 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1056 "awkgram.y" { - (yyvsp[(2) - (2)])->memory->numbr = -(force_number((yyvsp[(2) - (2)])->memory)); + NODE *n = (yyvsp[(2) - (2)])->memory; + (void) force_number(n); + negate_num(n); bcfree((yyvsp[(1) - (2)])); (yyval) = (yyvsp[(2) - (2)]); } @@ -3135,8 +3141,8 @@ regular_loop: case 71: -/* Line 1806 of yacc.c */ -#line 1058 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1064 "awkgram.y" { bcfree((yyvsp[(1) - (2)])); (yyval) = (yyvsp[(2) - (2)]); @@ -3145,15 +3151,15 @@ regular_loop: case 72: -/* Line 1806 of yacc.c */ -#line 1063 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1069 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 73: -/* Line 1806 of yacc.c */ -#line 1065 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1071 "awkgram.y" { (yyvsp[(1) - (1)])->opcode = Op_push_re; (yyval) = (yyvsp[(1) - (1)]); @@ -3162,22 +3168,22 @@ regular_loop: case 74: -/* Line 1806 of yacc.c */ -#line 1073 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1079 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 75: -/* Line 1806 of yacc.c */ -#line 1075 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1081 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 77: -/* Line 1806 of yacc.c */ -#line 1085 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1091 "awkgram.y" { (yyval) = (yyvsp[(2) - (3)]); } @@ -3185,8 +3191,8 @@ regular_loop: case 78: -/* Line 1806 of yacc.c */ -#line 1092 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1098 "awkgram.y" { in_print = FALSE; in_parens = 0; @@ -3196,15 +3202,15 @@ regular_loop: case 79: -/* Line 1806 of yacc.c */ -#line 1097 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1103 "awkgram.y" { in_print = FALSE; in_parens = 0; } break; case 80: -/* Line 1806 of yacc.c */ -#line 1098 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1104 "awkgram.y" { if ((yyvsp[(1) - (3)])->redir_type == redirect_twoway && (yyvsp[(3) - (3)])->lasti->opcode == Op_K_getline_redir @@ -3216,8 +3222,8 @@ regular_loop: case 81: -/* Line 1806 of yacc.c */ -#line 1109 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1115 "awkgram.y" { (yyval) = mk_condition((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)]), (yyvsp[(6) - (6)]), NULL, NULL); } @@ -3225,8 +3231,8 @@ regular_loop: case 82: -/* Line 1806 of yacc.c */ -#line 1114 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1120 "awkgram.y" { (yyval) = mk_condition((yyvsp[(3) - (9)]), (yyvsp[(1) - (9)]), (yyvsp[(6) - (9)]), (yyvsp[(7) - (9)]), (yyvsp[(9) - (9)])); } @@ -3234,15 +3240,15 @@ regular_loop: case 87: -/* Line 1806 of yacc.c */ -#line 1131 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1137 "awkgram.y" { (yyval) = NULL; } break; case 88: -/* Line 1806 of yacc.c */ -#line 1133 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1139 "awkgram.y" { bcfree((yyvsp[(1) - (2)])); (yyval) = (yyvsp[(2) - (2)]); @@ -3251,22 +3257,22 @@ regular_loop: case 89: -/* Line 1806 of yacc.c */ -#line 1141 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1147 "awkgram.y" { (yyval) = NULL; } break; case 90: -/* Line 1806 of yacc.c */ -#line 1143 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1149 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]) ; } break; case 91: -/* Line 1806 of yacc.c */ -#line 1148 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1154 "awkgram.y" { (yyvsp[(1) - (1)])->param_count = 0; (yyval) = list_create((yyvsp[(1) - (1)])); @@ -3275,8 +3281,8 @@ regular_loop: case 92: -/* Line 1806 of yacc.c */ -#line 1153 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1159 "awkgram.y" { (yyvsp[(3) - (3)])->param_count = (yyvsp[(1) - (3)])->lasti->param_count + 1; (yyval) = list_append((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); @@ -3286,64 +3292,64 @@ regular_loop: case 93: -/* Line 1806 of yacc.c */ -#line 1159 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1165 "awkgram.y" { (yyval) = NULL; } break; case 94: -/* Line 1806 of yacc.c */ -#line 1161 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1167 "awkgram.y" { (yyval) = (yyvsp[(1) - (2)]); } break; case 95: -/* Line 1806 of yacc.c */ -#line 1163 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1169 "awkgram.y" { (yyval) = (yyvsp[(1) - (3)]); } break; case 96: -/* Line 1806 of yacc.c */ -#line 1169 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1175 "awkgram.y" { (yyval) = NULL; } break; case 97: -/* Line 1806 of yacc.c */ -#line 1171 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1177 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 98: -/* Line 1806 of yacc.c */ -#line 1176 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1182 "awkgram.y" { (yyval) = NULL; } break; case 99: -/* Line 1806 of yacc.c */ -#line 1178 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1184 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 100: -/* Line 1806 of yacc.c */ -#line 1183 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1189 "awkgram.y" { (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); } break; case 101: -/* Line 1806 of yacc.c */ -#line 1185 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1191 "awkgram.y" { (yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); yyerrok; @@ -3352,36 +3358,36 @@ regular_loop: case 102: -/* Line 1806 of yacc.c */ -#line 1190 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1196 "awkgram.y" { (yyval) = NULL; } break; case 103: -/* Line 1806 of yacc.c */ -#line 1192 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1198 "awkgram.y" { (yyval) = NULL; } break; case 104: -/* Line 1806 of yacc.c */ -#line 1194 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1200 "awkgram.y" { (yyval) = NULL; } break; case 105: -/* Line 1806 of yacc.c */ -#line 1196 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1202 "awkgram.y" { (yyval) = NULL; } break; case 106: -/* Line 1806 of yacc.c */ -#line 1202 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1208 "awkgram.y" { if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == Op_match_rec) lintwarn_ln((yyvsp[(2) - (3)])->source_line, @@ -3392,22 +3398,22 @@ regular_loop: case 107: -/* Line 1806 of yacc.c */ -#line 1209 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1215 "awkgram.y" { (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 108: -/* Line 1806 of yacc.c */ -#line 1211 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1217 "awkgram.y" { (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 109: -/* Line 1806 of yacc.c */ -#line 1213 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1219 "awkgram.y" { if ((yyvsp[(1) - (3)])->lasti->opcode == Op_match_rec) warning_ln((yyvsp[(2) - (3)])->source_line, @@ -3427,8 +3433,8 @@ regular_loop: case 110: -/* Line 1806 of yacc.c */ -#line 1229 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1235 "awkgram.y" { if (do_lint_old) warning_ln((yyvsp[(2) - (3)])->source_line, @@ -3442,8 +3448,8 @@ regular_loop: case 111: -/* Line 1806 of yacc.c */ -#line 1239 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1245 "awkgram.y" { if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == Op_match_rec) lintwarn_ln((yyvsp[(2) - (3)])->source_line, @@ -3454,36 +3460,36 @@ regular_loop: case 112: -/* Line 1806 of yacc.c */ -#line 1246 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1252 "awkgram.y" { (yyval) = mk_condition((yyvsp[(1) - (5)]), (yyvsp[(2) - (5)]), (yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)])); } break; case 113: -/* Line 1806 of yacc.c */ -#line 1248 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1254 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 114: -/* Line 1806 of yacc.c */ -#line 1253 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1259 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 115: -/* Line 1806 of yacc.c */ -#line 1255 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1261 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 116: -/* Line 1806 of yacc.c */ -#line 1257 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1263 "awkgram.y" { (yyvsp[(2) - (2)])->opcode = Op_assign_quotient; (yyval) = (yyvsp[(2) - (2)]); @@ -3492,50 +3498,50 @@ regular_loop: case 117: -/* Line 1806 of yacc.c */ -#line 1265 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1271 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 118: -/* Line 1806 of yacc.c */ -#line 1267 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1273 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 119: -/* Line 1806 of yacc.c */ -#line 1272 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1278 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 120: -/* Line 1806 of yacc.c */ -#line 1274 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1280 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 121: -/* Line 1806 of yacc.c */ -#line 1279 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1285 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 122: -/* Line 1806 of yacc.c */ -#line 1281 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1287 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 123: -/* Line 1806 of yacc.c */ -#line 1283 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1289 "awkgram.y" { int count = 2; int is_simple_var = FALSE; @@ -3586,50 +3592,50 @@ regular_loop: case 125: -/* Line 1806 of yacc.c */ -#line 1335 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1341 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 126: -/* Line 1806 of yacc.c */ -#line 1337 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1343 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 127: -/* Line 1806 of yacc.c */ -#line 1339 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1345 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 128: -/* Line 1806 of yacc.c */ -#line 1341 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1347 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 129: -/* Line 1806 of yacc.c */ -#line 1343 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1349 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 130: -/* Line 1806 of yacc.c */ -#line 1345 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1351 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 131: -/* Line 1806 of yacc.c */ -#line 1347 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1353 "awkgram.y" { /* * In BEGINFILE/ENDFILE, allow `getline var < file' @@ -3656,8 +3662,8 @@ regular_loop: case 132: -/* Line 1806 of yacc.c */ -#line 1370 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1376 "awkgram.y" { (yyvsp[(2) - (2)])->opcode = Op_postincrement; (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - (2)])); @@ -3666,8 +3672,8 @@ regular_loop: case 133: -/* Line 1806 of yacc.c */ -#line 1375 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1381 "awkgram.y" { (yyvsp[(2) - (2)])->opcode = Op_postdecrement; (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - (2)])); @@ -3676,8 +3682,8 @@ regular_loop: case 134: -/* Line 1806 of yacc.c */ -#line 1380 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1386 "awkgram.y" { if (do_lint_old) { warning_ln((yyvsp[(4) - (5)])->source_line, @@ -3701,8 +3707,8 @@ regular_loop: case 135: -/* Line 1806 of yacc.c */ -#line 1405 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1411 "awkgram.y" { (yyval) = mk_getline((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]), (yyvsp[(1) - (4)]), (yyvsp[(2) - (4)])->redir_type); bcfree((yyvsp[(2) - (4)])); @@ -3711,50 +3717,50 @@ regular_loop: case 136: -/* Line 1806 of yacc.c */ -#line 1411 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1417 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 137: -/* Line 1806 of yacc.c */ -#line 1413 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1419 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 138: -/* Line 1806 of yacc.c */ -#line 1415 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1421 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 139: -/* Line 1806 of yacc.c */ -#line 1417 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1423 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 140: -/* Line 1806 of yacc.c */ -#line 1419 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1425 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 141: -/* Line 1806 of yacc.c */ -#line 1421 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1427 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 142: -/* Line 1806 of yacc.c */ -#line 1426 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1432 "awkgram.y" { (yyval) = list_create((yyvsp[(1) - (1)])); } @@ -3762,8 +3768,8 @@ regular_loop: case 143: -/* Line 1806 of yacc.c */ -#line 1430 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1436 "awkgram.y" { if ((yyvsp[(2) - (2)])->opcode == Op_match_rec) { (yyvsp[(2) - (2)])->opcode = Op_nomatch; @@ -3774,6 +3780,7 @@ regular_loop: } else { if (do_optimize > 1 && (yyvsp[(2) - (2)])->nexti == (yyvsp[(2) - (2)])->lasti && (yyvsp[(2) - (2)])->nexti->opcode == Op_push_i + && ((yyvsp[(2) - (2)])->nexti->memory->flags & (MPFN|MPZN)) == 0 ) { NODE *n = (yyvsp[(2) - (2)])->nexti->memory; if ((n->flags & (STRCUR|STRING)) != 0) { @@ -3798,15 +3805,15 @@ regular_loop: case 144: -/* Line 1806 of yacc.c */ -#line 1461 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1468 "awkgram.y" { (yyval) = (yyvsp[(2) - (3)]); } break; case 145: -/* Line 1806 of yacc.c */ -#line 1463 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1470 "awkgram.y" { (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)])); if ((yyval) == NULL) @@ -3816,8 +3823,8 @@ regular_loop: case 146: -/* Line 1806 of yacc.c */ -#line 1469 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1476 "awkgram.y" { (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)])); if ((yyval) == NULL) @@ -3827,8 +3834,8 @@ regular_loop: case 147: -/* Line 1806 of yacc.c */ -#line 1475 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1482 "awkgram.y" { static short warned1 = FALSE; @@ -3845,8 +3852,8 @@ regular_loop: case 150: -/* Line 1806 of yacc.c */ -#line 1490 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1497 "awkgram.y" { (yyvsp[(1) - (2)])->opcode = Op_preincrement; (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - (2)])); @@ -3855,8 +3862,8 @@ regular_loop: case 151: -/* Line 1806 of yacc.c */ -#line 1495 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1502 "awkgram.y" { (yyvsp[(1) - (2)])->opcode = Op_predecrement; (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - (2)])); @@ -3865,8 +3872,8 @@ regular_loop: case 152: -/* Line 1806 of yacc.c */ -#line 1500 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1507 "awkgram.y" { (yyval) = list_create((yyvsp[(1) - (1)])); } @@ -3874,8 +3881,8 @@ regular_loop: case 153: -/* Line 1806 of yacc.c */ -#line 1504 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1511 "awkgram.y" { (yyval) = list_create((yyvsp[(1) - (1)])); } @@ -3883,13 +3890,15 @@ regular_loop: case 154: -/* Line 1806 of yacc.c */ -#line 1508 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1515 "awkgram.y" { if ((yyvsp[(2) - (2)])->lasti->opcode == Op_push_i && ((yyvsp[(2) - (2)])->lasti->memory->flags & (STRCUR|STRING)) == 0 ) { - (yyvsp[(2) - (2)])->lasti->memory->numbr = -(force_number((yyvsp[(2) - (2)])->lasti->memory)); + NODE *n = (yyvsp[(2) - (2)])->lasti->memory; + (void) force_number(n); + negate_num(n); (yyval) = (yyvsp[(2) - (2)]); bcfree((yyvsp[(1) - (2)])); } else { @@ -3901,8 +3910,8 @@ regular_loop: case 155: -/* Line 1806 of yacc.c */ -#line 1521 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1530 "awkgram.y" { /* * was: $$ = $2 @@ -3916,8 +3925,8 @@ regular_loop: case 156: -/* Line 1806 of yacc.c */ -#line 1534 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1543 "awkgram.y" { func_use((yyvsp[(1) - (1)])->lasti->func_name, FUNC_USE); (yyval) = (yyvsp[(1) - (1)]); @@ -3926,8 +3935,8 @@ regular_loop: case 157: -/* Line 1806 of yacc.c */ -#line 1539 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1548 "awkgram.y" { /* indirect function call */ INSTRUCTION *f, *t; @@ -3964,8 +3973,8 @@ regular_loop: case 158: -/* Line 1806 of yacc.c */ -#line 1575 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1584 "awkgram.y" { param_sanity((yyvsp[(3) - (4)])); (yyvsp[(1) - (4)])->opcode = Op_func_call; @@ -3983,43 +3992,43 @@ regular_loop: case 159: -/* Line 1806 of yacc.c */ -#line 1592 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1601 "awkgram.y" { (yyval) = NULL; } break; case 160: -/* Line 1806 of yacc.c */ -#line 1594 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1603 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 161: -/* Line 1806 of yacc.c */ -#line 1599 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1608 "awkgram.y" { (yyval) = NULL; } break; case 162: -/* Line 1806 of yacc.c */ -#line 1601 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1610 "awkgram.y" { (yyval) = (yyvsp[(1) - (2)]); } break; case 163: -/* Line 1806 of yacc.c */ -#line 1606 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1615 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 164: -/* Line 1806 of yacc.c */ -#line 1608 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1617 "awkgram.y" { (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); } @@ -4027,8 +4036,8 @@ regular_loop: case 165: -/* Line 1806 of yacc.c */ -#line 1615 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1624 "awkgram.y" { INSTRUCTION *ip = (yyvsp[(1) - (1)])->lasti; int count = ip->sub_count; /* # of SUBSEP-seperated expressions */ @@ -4046,8 +4055,8 @@ regular_loop: case 166: -/* Line 1806 of yacc.c */ -#line 1632 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1641 "awkgram.y" { INSTRUCTION *t = (yyvsp[(2) - (3)]); if ((yyvsp[(2) - (3)]) == NULL) { @@ -4065,15 +4074,15 @@ regular_loop: case 167: -/* Line 1806 of yacc.c */ -#line 1649 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1658 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 168: -/* Line 1806 of yacc.c */ -#line 1651 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1660 "awkgram.y" { (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); } @@ -4081,15 +4090,15 @@ regular_loop: case 169: -/* Line 1806 of yacc.c */ -#line 1658 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1667 "awkgram.y" { (yyval) = (yyvsp[(1) - (2)]); } break; case 170: -/* Line 1806 of yacc.c */ -#line 1663 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1672 "awkgram.y" { char *var_name = (yyvsp[(1) - (1)])->lextok; @@ -4101,8 +4110,8 @@ regular_loop: case 171: -/* Line 1806 of yacc.c */ -#line 1671 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1680 "awkgram.y" { char *arr = (yyvsp[(1) - (2)])->lextok; (yyvsp[(1) - (2)])->memory = variable((yyvsp[(1) - (2)])->source_line, arr, Node_var_new); @@ -4113,8 +4122,8 @@ regular_loop: case 172: -/* Line 1806 of yacc.c */ -#line 1681 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1690 "awkgram.y" { INSTRUCTION *ip = (yyvsp[(1) - (1)])->nexti; if (ip->opcode == Op_push @@ -4130,8 +4139,8 @@ regular_loop: case 173: -/* Line 1806 of yacc.c */ -#line 1693 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1702 "awkgram.y" { (yyval) = list_append((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)])); if ((yyvsp[(3) - (3)]) != NULL) @@ -4141,8 +4150,8 @@ regular_loop: case 174: -/* Line 1806 of yacc.c */ -#line 1702 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1711 "awkgram.y" { (yyvsp[(1) - (1)])->opcode = Op_postincrement; } @@ -4150,8 +4159,8 @@ regular_loop: case 175: -/* Line 1806 of yacc.c */ -#line 1706 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1715 "awkgram.y" { (yyvsp[(1) - (1)])->opcode = Op_postdecrement; } @@ -4159,50 +4168,50 @@ regular_loop: case 176: -/* Line 1806 of yacc.c */ -#line 1709 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1718 "awkgram.y" { (yyval) = NULL; } break; case 178: -/* Line 1806 of yacc.c */ -#line 1717 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1726 "awkgram.y" { yyerrok; } break; case 179: -/* Line 1806 of yacc.c */ -#line 1721 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1730 "awkgram.y" { yyerrok; } break; case 182: -/* Line 1806 of yacc.c */ -#line 1730 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1739 "awkgram.y" { yyerrok; } break; case 183: -/* Line 1806 of yacc.c */ -#line 1734 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1743 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); yyerrok; } break; case 184: -/* Line 1806 of yacc.c */ -#line 1738 "awkgram.y" +/* Line 1821 of yacc.c */ +#line 1747 "awkgram.y" { yyerrok; } break; -/* Line 1806 of yacc.c */ -#line 4218 "awkgram.c" +/* Line 1821 of yacc.c */ +#line 4227 "awkgram.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -4433,7 +4442,7 @@ yyreturn: /* Line 2067 of yacc.c */ -#line 1740 "awkgram.y" +#line 1749 "awkgram.y" struct token { @@ -4452,6 +4461,7 @@ struct token { # define CONTINUE 0x2000 /* continue allowed inside */ NODE *(*ptr)(int); /* function that implements this keyword */ + NODE *(*ptr2)(int); /* alternate arbitrary-precision function */ }; #if 'a' == 0x81 /* it's EBCDIC */ @@ -4475,81 +4485,84 @@ tokcompare(const void *l, const void *r) * Function pointers come from declarations in awk.h. */ -static const struct token tokentab[] = { -{"BEGIN", Op_rule, LEX_BEGIN, 0, 0}, -{"BEGINFILE", Op_rule, LEX_BEGINFILE, GAWKX, 0}, -{"END", Op_rule, LEX_END, 0, 0}, -{"ENDFILE", Op_rule, LEX_ENDFILE, GAWKX, 0}, -#ifdef ARRAYDEBUG -{"adump", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2), do_adump}, +#ifdef HAVE_MPFR +#define MPF(F) do_mpfr_##F +#else +#define MPF(F) 0 #endif -{"and", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_and}, + +static const struct token tokentab[] = { +{"BEGIN", Op_rule, LEX_BEGIN, 0, 0, 0}, +{"BEGINFILE", Op_rule, LEX_BEGINFILE, GAWKX, 0, 0}, +{"END", Op_rule, LEX_END, 0, 0, 0}, +{"ENDFILE", Op_rule, LEX_ENDFILE, GAWKX, 0, 0}, #ifdef ARRAYDEBUG -{"aoption", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_aoption}, +{"adump", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2), do_adump, 0}, #endif -{"asort", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2)|A(3), do_asort}, -{"asorti", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2)|A(3), do_asorti}, -{"atan2", Op_builtin, LEX_BUILTIN, NOT_OLD|A(2), do_atan2}, -{"bindtextdomain", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2), do_bindtextdomain}, -{"break", Op_K_break, LEX_BREAK, 0, 0}, -{"case", Op_K_case, LEX_CASE, GAWKX, 0}, -{"close", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1)|A(2), do_close}, -{"compl", Op_builtin, LEX_BUILTIN, GAWKX|A(1), do_compl}, -{"continue", Op_K_continue, LEX_CONTINUE, 0, 0}, -{"cos", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_cos}, -{"dcgettext", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2)|A(3), do_dcgettext}, -{"dcngettext", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2)|A(3)|A(4)|A(5), do_dcngettext}, -{"default", Op_K_default, LEX_DEFAULT, GAWKX, 0}, -{"delete", Op_K_delete, LEX_DELETE, NOT_OLD, 0}, -{"do", Op_K_do, LEX_DO, NOT_OLD|BREAK|CONTINUE, 0}, -{"else", Op_K_else, LEX_ELSE, 0, 0}, -{"eval", Op_symbol, LEX_EVAL, 0, 0}, -{"exit", Op_K_exit, LEX_EXIT, 0, 0}, -{"exp", Op_builtin, LEX_BUILTIN, A(1), do_exp}, -{"extension", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_ext}, -{"fflush", Op_builtin, LEX_BUILTIN, RESX|A(0)|A(1), do_fflush}, -{"for", Op_K_for, LEX_FOR, BREAK|CONTINUE, 0}, -{"func", Op_func, LEX_FUNCTION, NOT_POSIX|NOT_OLD, 0}, -{"function",Op_func, LEX_FUNCTION, NOT_OLD, 0}, -{"gensub", Op_sub_builtin, LEX_BUILTIN, GAWKX|A(3)|A(4), 0}, -{"getline", Op_K_getline_redir, LEX_GETLINE, NOT_OLD, 0}, -{"gsub", Op_sub_builtin, LEX_BUILTIN, NOT_OLD|A(2)|A(3), 0}, -{"if", Op_K_if, LEX_IF, 0, 0}, -{"in", Op_symbol, LEX_IN, 0, 0}, -{"include", Op_symbol, LEX_INCLUDE, GAWKX, 0}, -{"index", Op_builtin, LEX_BUILTIN, A(2), do_index}, -{"int", Op_builtin, LEX_BUILTIN, A(1), do_int}, -{"isarray", Op_builtin, LEX_BUILTIN, GAWKX|A(1), do_isarray}, -{"length", Op_builtin, LEX_LENGTH, A(0)|A(1), do_length}, -{"log", Op_builtin, LEX_BUILTIN, A(1), do_log}, -{"lshift", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_lshift}, -{"match", Op_builtin, LEX_BUILTIN, NOT_OLD|A(2)|A(3), do_match}, -{"mktime", Op_builtin, LEX_BUILTIN, GAWKX|A(1), do_mktime}, -{"next", Op_K_next, LEX_NEXT, 0, 0}, -{"nextfile", Op_K_nextfile, LEX_NEXTFILE, GAWKX, 0}, -{"or", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_or}, -{"patsplit", Op_builtin, LEX_BUILTIN, GAWKX|A(2)|A(3)|A(4), do_patsplit}, -{"print", Op_K_print, LEX_PRINT, 0, 0}, -{"printf", Op_K_printf, LEX_PRINTF, 0, 0}, -{"rand", Op_builtin, LEX_BUILTIN, NOT_OLD|A(0), do_rand}, -{"return", Op_K_return, LEX_RETURN, NOT_OLD, 0}, -{"rshift", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_rshift}, -{"sin", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_sin}, -{"split", Op_builtin, LEX_BUILTIN, A(2)|A(3)|A(4), do_split}, -{"sprintf", Op_builtin, LEX_BUILTIN, 0, do_sprintf}, -{"sqrt", Op_builtin, LEX_BUILTIN, A(1), do_sqrt}, -{"srand", Op_builtin, LEX_BUILTIN, NOT_OLD|A(0)|A(1), do_srand}, -{"strftime", Op_builtin, LEX_BUILTIN, GAWKX|A(0)|A(1)|A(2)|A(3), do_strftime}, -{"strtonum", Op_builtin, LEX_BUILTIN, GAWKX|A(1), do_strtonum}, -{"sub", Op_sub_builtin, LEX_BUILTIN, NOT_OLD|A(2)|A(3), 0}, -{"substr", Op_builtin, LEX_BUILTIN, A(2)|A(3), do_substr}, -{"switch", Op_K_switch, LEX_SWITCH, GAWKX|BREAK, 0}, -{"system", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_system}, -{"systime", Op_builtin, LEX_BUILTIN, GAWKX|A(0), do_systime}, -{"tolower", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_tolower}, -{"toupper", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_toupper}, -{"while", Op_K_while, LEX_WHILE, BREAK|CONTINUE, 0}, -{"xor", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_xor}, +{"and", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_and, MPF(and)}, +{"asort", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2)|A(3), do_asort, 0}, +{"asorti", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2)|A(3), do_asorti, 0}, +{"atan2", Op_builtin, LEX_BUILTIN, NOT_OLD|A(2), do_atan2, MPF(atan2)}, +{"bindtextdomain", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2), do_bindtextdomain, 0}, +{"break", Op_K_break, LEX_BREAK, 0, 0, 0}, +{"case", Op_K_case, LEX_CASE, GAWKX, 0, 0}, +{"close", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1)|A(2), do_close, 0}, +{"compl", Op_builtin, LEX_BUILTIN, GAWKX|A(1), do_compl, MPF(compl)}, +{"continue", Op_K_continue, LEX_CONTINUE, 0, 0, 0}, +{"cos", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_cos, MPF(cos)}, +{"dcgettext", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2)|A(3), do_dcgettext, 0}, +{"dcngettext", Op_builtin, LEX_BUILTIN, GAWKX|A(1)|A(2)|A(3)|A(4)|A(5), do_dcngettext, 0}, +{"default", Op_K_default, LEX_DEFAULT, GAWKX, 0, 0}, +{"delete", Op_K_delete, LEX_DELETE, NOT_OLD, 0, 0}, +{"do", Op_K_do, LEX_DO, NOT_OLD|BREAK|CONTINUE, 0, 0}, +{"else", Op_K_else, LEX_ELSE, 0, 0, 0}, +{"eval", Op_symbol, LEX_EVAL, 0, 0, 0}, +{"exit", Op_K_exit, LEX_EXIT, 0, 0, 0}, +{"exp", Op_builtin, LEX_BUILTIN, A(1), do_exp, MPF(exp)}, +{"extension", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_ext, 0}, +{"fflush", Op_builtin, LEX_BUILTIN, RESX|A(0)|A(1), do_fflush, 0}, +{"for", Op_K_for, LEX_FOR, BREAK|CONTINUE, 0, 0}, +{"func", Op_func, LEX_FUNCTION, NOT_POSIX|NOT_OLD, 0, 0}, +{"function",Op_func, LEX_FUNCTION, NOT_OLD, 0, 0}, +{"gensub", Op_sub_builtin, LEX_BUILTIN, GAWKX|A(3)|A(4), 0, 0}, +{"getline", Op_K_getline_redir, LEX_GETLINE, NOT_OLD, 0, 0}, +{"gsub", Op_sub_builtin, LEX_BUILTIN, NOT_OLD|A(2)|A(3), 0, 0}, +{"if", Op_K_if, LEX_IF, 0, 0, 0}, +{"in", Op_symbol, LEX_IN, 0, 0, 0}, +{"include", Op_symbol, LEX_INCLUDE, GAWKX, 0, 0}, +{"index", Op_builtin, LEX_BUILTIN, A(2), do_index, 0}, +{"int", Op_builtin, LEX_BUILTIN, A(1), do_int, MPF(int)}, +{"isarray", Op_builtin, LEX_BUILTIN, GAWKX|A(1), do_isarray, 0}, +{"length", Op_builtin, LEX_LENGTH, A(0)|A(1), do_length, 0}, +{"log", Op_builtin, LEX_BUILTIN, A(1), do_log, MPF(log)}, +{"lshift", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_lshift, MPF(lshift)}, +{"match", Op_builtin, LEX_BUILTIN, NOT_OLD|A(2)|A(3), do_match, 0}, +{"mktime", Op_builtin, LEX_BUILTIN, GAWKX|A(1), do_mktime, 0}, +{"next", Op_K_next, LEX_NEXT, 0, 0, 0}, +{"nextfile", Op_K_nextfile, LEX_NEXTFILE, GAWKX, 0, 0}, +{"or", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_or, MPF(or)}, +{"patsplit", Op_builtin, LEX_BUILTIN, GAWKX|A(2)|A(3)|A(4), do_patsplit, 0}, +{"print", Op_K_print, LEX_PRINT, 0, 0, 0}, +{"printf", Op_K_printf, LEX_PRINTF, 0, 0, 0}, +{"rand", Op_builtin, LEX_BUILTIN, NOT_OLD|A(0), do_rand, MPF(rand)}, +{"return", Op_K_return, LEX_RETURN, NOT_OLD, 0, 0}, +{"rshift", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_rshift, MPF(rhift)}, +{"sin", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_sin, MPF(sin)}, +{"split", Op_builtin, LEX_BUILTIN, A(2)|A(3)|A(4), do_split, 0}, +{"sprintf", Op_builtin, LEX_BUILTIN, 0, do_sprintf, 0}, +{"sqrt", Op_builtin, LEX_BUILTIN, A(1), do_sqrt, MPF(sqrt)}, +{"srand", Op_builtin, LEX_BUILTIN, NOT_OLD|A(0)|A(1), do_srand, MPF(srand)}, +{"strftime", Op_builtin, LEX_BUILTIN, GAWKX|A(0)|A(1)|A(2)|A(3), do_strftime, 0}, +{"strtonum", Op_builtin, LEX_BUILTIN, GAWKX|A(1), do_strtonum, MPF(strtonum)}, +{"sub", Op_sub_builtin, LEX_BUILTIN, NOT_OLD|A(2)|A(3), 0, 0}, +{"substr", Op_builtin, LEX_BUILTIN, A(2)|A(3), do_substr, 0}, +{"switch", Op_K_switch, LEX_SWITCH, GAWKX|BREAK, 0, 0}, +{"system", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_system, 0}, +{"systime", Op_builtin, LEX_BUILTIN, GAWKX|A(0), do_systime, 0}, +{"tolower", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_tolower, 0}, +{"toupper", Op_builtin, LEX_BUILTIN, NOT_OLD|A(1), do_toupper, 0}, +{"while", Op_K_while, LEX_WHILE, BREAK|CONTINUE, 0, 0}, +{"xor", Op_builtin, LEX_BUILTIN, GAWKX|A(2), do_xor, MPF(xor)}, }; #if MBS_SUPPORT @@ -4585,6 +4598,23 @@ getfname(NODE *(*fptr)(int)) return NULL; } +/* negate_num --- negate a number in NODE */ + +void +negate_num(NODE *n) +{ +#ifdef HAVE_MPFR + if (is_mpg_float(n)) { + int tval; + tval = mpfr_neg(n->mpg_numbr, n->mpg_numbr, ROUND_MODE); + IEEE_FMT(n->mpg_numbr, tval); + } else if (is_mpg_integer(n)) { + mpz_neg(n->mpg_i, n->mpg_i); + } else +#endif + n->numbr = -n->numbr; +} + /* print_included_from --- print `Included from ..' file names and locations */ static void @@ -5486,6 +5516,7 @@ yylex(void) int seen_point = FALSE; int esc_seen; /* for literal strings */ int mid; + int base; static int did_newline = FALSE; char *tokkey; int inhex = FALSE; @@ -6054,17 +6085,42 @@ retry: tokadd('\0'); yylval = GET_INSTRUCTION(Op_push_i); - if (! do_traditional && isnondecimal(tokstart, FALSE)) { + + base = 10; + if (! do_traditional) { + base = get_numbase(tokstart, FALSE); if (do_lint) { - if (isdigit((unsigned char) tokstart[1])) /* not an 'x' or 'X' */ + if (base == 8) lintwarn("numeric constant `%.*s' treated as octal", (int) strlen(tokstart)-1, tokstart); - else if (tokstart[1] == 'x' || tokstart[1] == 'X') + else if (base == 16) lintwarn("numeric constant `%.*s' treated as hexadecimal", (int) strlen(tokstart)-1, tokstart); } + } + +#ifdef HAVE_MPFR + if (do_mpfr) { + NODE *r; + + if (! seen_point && ! seen_e) { + r = mpg_integer(); + mpg_strtoui(r->mpg_i, tokstart, strlen(tokstart), NULL, base); + errno = 0; + } else { + int tval; + r = mpg_float(); + tval = mpfr_strtofr(r->mpg_numbr, tokstart, NULL, base, ROUND_MODE); + errno = 0; + IEEE_FMT(r->mpg_numbr, tval); + } + yylval->memory = r; + return lasttok = YNUMBER; + } +#endif + if (base != 10) d = nondec2awknum(tokstart, strlen(tokstart)); - } else + else d = atof(tokstart); yylval->memory = make_number(d); if (d <= INT32_MAX && d >= INT32_MIN && d == (int32_t) d) @@ -6350,7 +6406,13 @@ snode(INSTRUCTION *subn, INSTRUCTION *r) } } - r->builtin = tokentab[idx].ptr; +#ifdef HAVE_MPFR + /* N.B.: There isn't any special processing for an alternate function below */ + if (do_mpfr && tokentab[idx].ptr2) + r->builtin = tokentab[idx].ptr2; + else +#endif + r->builtin = tokentab[idx].ptr; /* special case processing for a few builtins */ @@ -6556,14 +6618,28 @@ valinfo(NODE *n, Func_print print_func, FILE *fp) else if (n->flags & STRING) { pp_string_fp(print_func, fp, n->stptr, n->stlen, '"', FALSE); print_func(fp, "\n"); - } else if (n->flags & NUMBER) + } else if (n->flags & NUMBER) { +#ifdef HAVE_MPFR + if (is_mpg_float(n)) + print_func(fp, "%s\n", mpg_fmt("%.17R*g", ROUND_MODE, n->mpg_numbr)); + else if (is_mpg_integer(n)) + print_func(fp, "%s\n", mpg_fmt("%Zd", n->mpg_i)); + else +#endif print_func(fp, "%.17g\n", n->numbr); - else if (n->flags & STRCUR) { + } else if (n->flags & STRCUR) { pp_string_fp(print_func, fp, n->stptr, n->stlen, '"', FALSE); print_func(fp, "\n"); - } else if (n->flags & NUMCUR) + } else if (n->flags & NUMCUR) { +#ifdef HAVE_MPFR + if (is_mpg_float(n)) + print_func(fp, "%s\n", mpg_fmt("%.17R*g", ROUND_MODE, n->mpg_numbr)); + else if (is_mpg_integer(n)) + print_func(fp, "%s\n", mpg_fmt("%Zd", n->mpg_i)); + else +#endif print_func(fp, "%.17g\n", n->numbr); - else + } else print_func(fp, "?? flags %s\n", flags2str(n->flags)); } @@ -7110,11 +7186,11 @@ mk_binary(INSTRUCTION *s1, INSTRUCTION *s2, INSTRUCTION *op) ip1 = s1->nexti; if (do_optimize > 1 && ip1 == s1->lasti && ip1->opcode == Op_push_i - && (ip1->memory->flags & (STRCUR|STRING)) == 0 - && (ip2->memory->flags & (STRCUR|STRING)) == 0 + && (ip1->memory->flags & (MPFN|MPZN|STRCUR|STRING)) == 0 + && (ip2->memory->flags & (MPFN|MPZN|STRCUR|STRING)) == 0 ) { NODE *n1 = ip1->memory, *n2 = ip2->memory; - res = force_number(n1); + res = force_number(n1)->numbr; (void) force_number(n2); switch (op->opcode) { case Op_times: @@ -8066,3 +8142,4 @@ one_line_close(int fd) } + |