aboutsummaryrefslogtreecommitdiffstats
path: root/awkgram.c
diff options
context:
space:
mode:
Diffstat (limited to 'awkgram.c')
-rw-r--r--awkgram.c877
1 files changed, 477 insertions, 400 deletions
diff --git a/awkgram.c b/awkgram.c
index 4e62f98d..07de29e4 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -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)
}
+