aboutsummaryrefslogtreecommitdiffstats
path: root/awkgram.c
diff options
context:
space:
mode:
Diffstat (limited to 'awkgram.c')
-rw-r--r--awkgram.c591
1 files changed, 343 insertions, 248 deletions
diff --git a/awkgram.c b/awkgram.c
index 5a92e8d4..f580307c 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -713,19 +713,19 @@ static const yytype_uint16 yyrline[] =
373, 374, 378, 397, 396, 430, 432, 437, 438, 451,
456, 457, 461, 463, 465, 472, 562, 604, 646, 759,
766, 773, 783, 792, 801, 810, 825, 841, 840, 864,
- 876, 876, 970, 970, 995, 1018, 1024, 1025, 1031, 1032,
- 1039, 1044, 1056, 1070, 1072, 1078, 1083, 1085, 1093, 1095,
- 1104, 1105, 1113, 1118, 1118, 1129, 1133, 1141, 1142, 1145,
- 1147, 1152, 1153, 1162, 1163, 1168, 1173, 1179, 1181, 1183,
- 1190, 1191, 1197, 1198, 1203, 1205, 1210, 1212, 1214, 1216,
- 1222, 1229, 1231, 1233, 1249, 1259, 1266, 1268, 1273, 1275,
- 1277, 1285, 1287, 1292, 1294, 1299, 1301, 1303, 1353, 1355,
- 1357, 1359, 1361, 1363, 1365, 1367, 1390, 1395, 1400, 1425,
- 1431, 1433, 1435, 1437, 1439, 1441, 1446, 1450, 1481, 1483,
- 1489, 1495, 1508, 1509, 1510, 1515, 1520, 1524, 1528, 1541,
- 1554, 1559, 1595, 1613, 1614, 1620, 1621, 1626, 1628, 1635,
- 1652, 1669, 1671, 1678, 1683, 1691, 1701, 1713, 1722, 1726,
- 1730, 1734, 1738, 1742, 1745, 1747, 1751, 1755, 1759
+ 876, 876, 974, 974, 999, 1022, 1028, 1029, 1035, 1036,
+ 1043, 1048, 1060, 1074, 1076, 1084, 1089, 1091, 1099, 1101,
+ 1110, 1111, 1119, 1124, 1124, 1135, 1139, 1147, 1148, 1151,
+ 1153, 1158, 1159, 1168, 1169, 1174, 1179, 1185, 1187, 1189,
+ 1196, 1197, 1203, 1204, 1209, 1211, 1216, 1218, 1220, 1222,
+ 1228, 1235, 1237, 1239, 1255, 1265, 1272, 1274, 1279, 1281,
+ 1283, 1291, 1293, 1298, 1300, 1305, 1307, 1309, 1359, 1361,
+ 1363, 1365, 1367, 1369, 1371, 1373, 1396, 1401, 1406, 1431,
+ 1437, 1439, 1441, 1443, 1445, 1447, 1452, 1456, 1488, 1490,
+ 1496, 1502, 1515, 1516, 1517, 1522, 1527, 1531, 1535, 1550,
+ 1563, 1568, 1604, 1622, 1623, 1629, 1630, 1635, 1637, 1644,
+ 1661, 1678, 1680, 1687, 1692, 1700, 1710, 1722, 1731, 1735,
+ 1739, 1743, 1747, 1751, 1754, 1756, 1760, 1764, 1768
};
#endif
@@ -2695,16 +2695,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;
@@ -2936,8 +2936,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;
@@ -2951,11 +2950,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;
@@ -2967,7 +2971,7 @@ regular_loop:
(yyvsp[(1) - (4)])->expr_count = 0;
(yyvsp[(1) - (4)])->opcode = Op_K_print_rec;
if ((yyvsp[(4) - (4)]) == NULL) { /* no redircetion */
- (yyvsp[(1) - (4)])->redir_type = 0;
+ (yyvsp[(1) - (4)])->redir_type = redirect_none;
(yyval) = list_create((yyvsp[(1) - (4)]));
} else {
INSTRUCTION *ip;
@@ -2987,16 +2991,16 @@ 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;
- (yyvsp[(1) - (4)])->redir_type = 0;
+ (yyvsp[(1) - (4)])->redir_type = redirect_none;
(yyval) = list_create((yyvsp[(1) - (4)]));
} else {
INSTRUCTION *t = (yyvsp[(3) - (4)]);
(yyvsp[(1) - (4)])->expr_count = count_expressions(&t, FALSE);
- (yyvsp[(1) - (4)])->redir_type = 0;
+ (yyvsp[(1) - (4)])->redir_type = redirect_none;
(yyval) = list_append(t, (yyvsp[(1) - (4)]));
}
} else {
@@ -3021,14 +3025,14 @@ regular_loop:
case 62:
/* Line 1806 of yacc.c */
-#line 970 "awkgram.y"
+#line 974 "awkgram.y"
{ sub_counter = 0; }
break;
case 63:
/* Line 1806 of yacc.c */
-#line 971 "awkgram.y"
+#line 975 "awkgram.y"
{
char *arr = (yyvsp[(2) - (4)])->lextok;
@@ -3058,7 +3062,7 @@ regular_loop:
case 64:
/* Line 1806 of yacc.c */
-#line 1000 "awkgram.y"
+#line 1004 "awkgram.y"
{
static short warned = FALSE;
char *arr = (yyvsp[(3) - (4)])->lextok;
@@ -3082,35 +3086,35 @@ regular_loop:
case 65:
/* Line 1806 of yacc.c */
-#line 1019 "awkgram.y"
+#line 1023 "awkgram.y"
{ (yyval) = optimize_assignment((yyvsp[(1) - (1)])); }
break;
case 66:
/* Line 1806 of yacc.c */
-#line 1024 "awkgram.y"
+#line 1028 "awkgram.y"
{ (yyval) = NULL; }
break;
case 67:
/* Line 1806 of yacc.c */
-#line 1026 "awkgram.y"
+#line 1030 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 68:
/* Line 1806 of yacc.c */
-#line 1031 "awkgram.y"
+#line 1035 "awkgram.y"
{ (yyval) = NULL; }
break;
case 69:
/* Line 1806 of yacc.c */
-#line 1033 "awkgram.y"
+#line 1037 "awkgram.y"
{
if ((yyvsp[(1) - (2)]) == NULL)
(yyval) = list_create((yyvsp[(2) - (2)]));
@@ -3122,14 +3126,14 @@ regular_loop:
case 70:
/* Line 1806 of yacc.c */
-#line 1040 "awkgram.y"
+#line 1044 "awkgram.y"
{ (yyval) = NULL; }
break;
case 71:
/* Line 1806 of yacc.c */
-#line 1045 "awkgram.y"
+#line 1049 "awkgram.y"
{
INSTRUCTION *casestmt = (yyvsp[(5) - (5)]);
if ((yyvsp[(5) - (5)]) == NULL)
@@ -3146,7 +3150,7 @@ regular_loop:
case 72:
/* Line 1806 of yacc.c */
-#line 1057 "awkgram.y"
+#line 1061 "awkgram.y"
{
INSTRUCTION *casestmt = (yyvsp[(4) - (4)]);
if ((yyvsp[(4) - (4)]) == NULL)
@@ -3162,16 +3166,18 @@ regular_loop:
case 73:
/* Line 1806 of yacc.c */
-#line 1071 "awkgram.y"
+#line 1075 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 74:
/* Line 1806 of yacc.c */
-#line 1073 "awkgram.y"
+#line 1077 "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)]);
}
@@ -3180,7 +3186,7 @@ regular_loop:
case 75:
/* Line 1806 of yacc.c */
-#line 1079 "awkgram.y"
+#line 1085 "awkgram.y"
{
bcfree((yyvsp[(1) - (2)]));
(yyval) = (yyvsp[(2) - (2)]);
@@ -3190,14 +3196,14 @@ regular_loop:
case 76:
/* Line 1806 of yacc.c */
-#line 1084 "awkgram.y"
+#line 1090 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 77:
/* Line 1806 of yacc.c */
-#line 1086 "awkgram.y"
+#line 1092 "awkgram.y"
{
(yyvsp[(1) - (1)])->opcode = Op_push_re;
(yyval) = (yyvsp[(1) - (1)]);
@@ -3207,21 +3213,21 @@ regular_loop:
case 78:
/* Line 1806 of yacc.c */
-#line 1094 "awkgram.y"
+#line 1100 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 79:
/* Line 1806 of yacc.c */
-#line 1096 "awkgram.y"
+#line 1102 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 81:
/* Line 1806 of yacc.c */
-#line 1106 "awkgram.y"
+#line 1112 "awkgram.y"
{
(yyval) = (yyvsp[(2) - (3)]);
}
@@ -3230,7 +3236,7 @@ regular_loop:
case 82:
/* Line 1806 of yacc.c */
-#line 1113 "awkgram.y"
+#line 1119 "awkgram.y"
{
in_print = FALSE;
in_parens = 0;
@@ -3241,14 +3247,14 @@ regular_loop:
case 83:
/* Line 1806 of yacc.c */
-#line 1118 "awkgram.y"
+#line 1124 "awkgram.y"
{ in_print = FALSE; in_parens = 0; }
break;
case 84:
/* Line 1806 of yacc.c */
-#line 1119 "awkgram.y"
+#line 1125 "awkgram.y"
{
if ((yyvsp[(1) - (3)])->redir_type == redirect_twoway
&& (yyvsp[(3) - (3)])->lasti->opcode == Op_K_getline_redir
@@ -3261,7 +3267,7 @@ regular_loop:
case 85:
/* Line 1806 of yacc.c */
-#line 1130 "awkgram.y"
+#line 1136 "awkgram.y"
{
(yyval) = mk_condition((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)]), (yyvsp[(6) - (6)]), NULL, NULL);
}
@@ -3270,7 +3276,7 @@ regular_loop:
case 86:
/* Line 1806 of yacc.c */
-#line 1135 "awkgram.y"
+#line 1141 "awkgram.y"
{
(yyval) = mk_condition((yyvsp[(3) - (9)]), (yyvsp[(1) - (9)]), (yyvsp[(6) - (9)]), (yyvsp[(7) - (9)]), (yyvsp[(9) - (9)]));
}
@@ -3279,14 +3285,14 @@ regular_loop:
case 91:
/* Line 1806 of yacc.c */
-#line 1152 "awkgram.y"
+#line 1158 "awkgram.y"
{ (yyval) = NULL; }
break;
case 92:
/* Line 1806 of yacc.c */
-#line 1154 "awkgram.y"
+#line 1160 "awkgram.y"
{
bcfree((yyvsp[(1) - (2)]));
(yyval) = (yyvsp[(2) - (2)]);
@@ -3296,21 +3302,21 @@ regular_loop:
case 93:
/* Line 1806 of yacc.c */
-#line 1162 "awkgram.y"
+#line 1168 "awkgram.y"
{ (yyval) = NULL; }
break;
case 94:
/* Line 1806 of yacc.c */
-#line 1164 "awkgram.y"
+#line 1170 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]) ; }
break;
case 95:
/* Line 1806 of yacc.c */
-#line 1169 "awkgram.y"
+#line 1175 "awkgram.y"
{
(yyvsp[(1) - (1)])->param_count = 0;
(yyval) = list_create((yyvsp[(1) - (1)]));
@@ -3320,7 +3326,7 @@ regular_loop:
case 96:
/* Line 1806 of yacc.c */
-#line 1174 "awkgram.y"
+#line 1180 "awkgram.y"
{
(yyvsp[(3) - (3)])->param_count = (yyvsp[(1) - (3)])->lasti->param_count + 1;
(yyval) = list_append((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]));
@@ -3331,63 +3337,63 @@ regular_loop:
case 97:
/* Line 1806 of yacc.c */
-#line 1180 "awkgram.y"
+#line 1186 "awkgram.y"
{ (yyval) = NULL; }
break;
case 98:
/* Line 1806 of yacc.c */
-#line 1182 "awkgram.y"
+#line 1188 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (2)]); }
break;
case 99:
/* Line 1806 of yacc.c */
-#line 1184 "awkgram.y"
+#line 1190 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (3)]); }
break;
case 100:
/* Line 1806 of yacc.c */
-#line 1190 "awkgram.y"
+#line 1196 "awkgram.y"
{ (yyval) = NULL; }
break;
case 101:
/* Line 1806 of yacc.c */
-#line 1192 "awkgram.y"
+#line 1198 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 102:
/* Line 1806 of yacc.c */
-#line 1197 "awkgram.y"
+#line 1203 "awkgram.y"
{ (yyval) = NULL; }
break;
case 103:
/* Line 1806 of yacc.c */
-#line 1199 "awkgram.y"
+#line 1205 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 104:
/* Line 1806 of yacc.c */
-#line 1204 "awkgram.y"
+#line 1210 "awkgram.y"
{ (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); }
break;
case 105:
/* Line 1806 of yacc.c */
-#line 1206 "awkgram.y"
+#line 1212 "awkgram.y"
{
(yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]));
yyerrok;
@@ -3397,35 +3403,35 @@ regular_loop:
case 106:
/* Line 1806 of yacc.c */
-#line 1211 "awkgram.y"
+#line 1217 "awkgram.y"
{ (yyval) = NULL; }
break;
case 107:
/* Line 1806 of yacc.c */
-#line 1213 "awkgram.y"
+#line 1219 "awkgram.y"
{ (yyval) = NULL; }
break;
case 108:
/* Line 1806 of yacc.c */
-#line 1215 "awkgram.y"
+#line 1221 "awkgram.y"
{ (yyval) = NULL; }
break;
case 109:
/* Line 1806 of yacc.c */
-#line 1217 "awkgram.y"
+#line 1223 "awkgram.y"
{ (yyval) = NULL; }
break;
case 110:
/* Line 1806 of yacc.c */
-#line 1223 "awkgram.y"
+#line 1229 "awkgram.y"
{
if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == Op_match_rec)
lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@ -3437,21 +3443,21 @@ regular_loop:
case 111:
/* Line 1806 of yacc.c */
-#line 1230 "awkgram.y"
+#line 1236 "awkgram.y"
{ (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 112:
/* Line 1806 of yacc.c */
-#line 1232 "awkgram.y"
+#line 1238 "awkgram.y"
{ (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 113:
/* Line 1806 of yacc.c */
-#line 1234 "awkgram.y"
+#line 1240 "awkgram.y"
{
if ((yyvsp[(1) - (3)])->lasti->opcode == Op_match_rec)
warning_ln((yyvsp[(2) - (3)])->source_line,
@@ -3472,7 +3478,7 @@ regular_loop:
case 114:
/* Line 1806 of yacc.c */
-#line 1250 "awkgram.y"
+#line 1256 "awkgram.y"
{
if (do_lint_old)
warning_ln((yyvsp[(2) - (3)])->source_line,
@@ -3487,7 +3493,7 @@ regular_loop:
case 115:
/* Line 1806 of yacc.c */
-#line 1260 "awkgram.y"
+#line 1266 "awkgram.y"
{
if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == Op_match_rec)
lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@ -3499,35 +3505,35 @@ regular_loop:
case 116:
/* Line 1806 of yacc.c */
-#line 1267 "awkgram.y"
+#line 1273 "awkgram.y"
{ (yyval) = mk_condition((yyvsp[(1) - (5)]), (yyvsp[(2) - (5)]), (yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)])); }
break;
case 117:
/* Line 1806 of yacc.c */
-#line 1269 "awkgram.y"
+#line 1275 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 118:
/* Line 1806 of yacc.c */
-#line 1274 "awkgram.y"
+#line 1280 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 119:
/* Line 1806 of yacc.c */
-#line 1276 "awkgram.y"
+#line 1282 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 120:
/* Line 1806 of yacc.c */
-#line 1278 "awkgram.y"
+#line 1284 "awkgram.y"
{
(yyvsp[(2) - (2)])->opcode = Op_assign_quotient;
(yyval) = (yyvsp[(2) - (2)]);
@@ -3537,49 +3543,49 @@ regular_loop:
case 121:
/* Line 1806 of yacc.c */
-#line 1286 "awkgram.y"
+#line 1292 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 122:
/* Line 1806 of yacc.c */
-#line 1288 "awkgram.y"
+#line 1294 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 123:
/* Line 1806 of yacc.c */
-#line 1293 "awkgram.y"
+#line 1299 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 124:
/* Line 1806 of yacc.c */
-#line 1295 "awkgram.y"
+#line 1301 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 125:
/* Line 1806 of yacc.c */
-#line 1300 "awkgram.y"
+#line 1306 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 126:
/* Line 1806 of yacc.c */
-#line 1302 "awkgram.y"
+#line 1308 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 127:
/* Line 1806 of yacc.c */
-#line 1304 "awkgram.y"
+#line 1310 "awkgram.y"
{
int count = 2;
int is_simple_var = FALSE;
@@ -3631,49 +3637,49 @@ regular_loop:
case 129:
/* Line 1806 of yacc.c */
-#line 1356 "awkgram.y"
+#line 1362 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 130:
/* Line 1806 of yacc.c */
-#line 1358 "awkgram.y"
+#line 1364 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 131:
/* Line 1806 of yacc.c */
-#line 1360 "awkgram.y"
+#line 1366 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 132:
/* Line 1806 of yacc.c */
-#line 1362 "awkgram.y"
+#line 1368 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 133:
/* Line 1806 of yacc.c */
-#line 1364 "awkgram.y"
+#line 1370 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 134:
/* Line 1806 of yacc.c */
-#line 1366 "awkgram.y"
+#line 1372 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 135:
/* Line 1806 of yacc.c */
-#line 1368 "awkgram.y"
+#line 1374 "awkgram.y"
{
/*
* In BEGINFILE/ENDFILE, allow `getline var < file'
@@ -3701,7 +3707,7 @@ regular_loop:
case 136:
/* Line 1806 of yacc.c */
-#line 1391 "awkgram.y"
+#line 1397 "awkgram.y"
{
(yyvsp[(2) - (2)])->opcode = Op_postincrement;
(yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - (2)]));
@@ -3711,7 +3717,7 @@ regular_loop:
case 137:
/* Line 1806 of yacc.c */
-#line 1396 "awkgram.y"
+#line 1402 "awkgram.y"
{
(yyvsp[(2) - (2)])->opcode = Op_postdecrement;
(yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - (2)]));
@@ -3721,7 +3727,7 @@ regular_loop:
case 138:
/* Line 1806 of yacc.c */
-#line 1401 "awkgram.y"
+#line 1407 "awkgram.y"
{
if (do_lint_old) {
warning_ln((yyvsp[(4) - (5)])->source_line,
@@ -3746,7 +3752,7 @@ regular_loop:
case 139:
/* Line 1806 of yacc.c */
-#line 1426 "awkgram.y"
+#line 1432 "awkgram.y"
{
(yyval) = mk_getline((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]), (yyvsp[(1) - (4)]), (yyvsp[(2) - (4)])->redir_type);
bcfree((yyvsp[(2) - (4)]));
@@ -3756,49 +3762,49 @@ regular_loop:
case 140:
/* Line 1806 of yacc.c */
-#line 1432 "awkgram.y"
+#line 1438 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 141:
/* Line 1806 of yacc.c */
-#line 1434 "awkgram.y"
+#line 1440 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 142:
/* Line 1806 of yacc.c */
-#line 1436 "awkgram.y"
+#line 1442 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 143:
/* Line 1806 of yacc.c */
-#line 1438 "awkgram.y"
+#line 1444 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 144:
/* Line 1806 of yacc.c */
-#line 1440 "awkgram.y"
+#line 1446 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 145:
/* Line 1806 of yacc.c */
-#line 1442 "awkgram.y"
+#line 1448 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); }
break;
case 146:
/* Line 1806 of yacc.c */
-#line 1447 "awkgram.y"
+#line 1453 "awkgram.y"
{
(yyval) = list_create((yyvsp[(1) - (1)]));
}
@@ -3807,7 +3813,7 @@ regular_loop:
case 147:
/* Line 1806 of yacc.c */
-#line 1451 "awkgram.y"
+#line 1457 "awkgram.y"
{
if ((yyvsp[(2) - (2)])->opcode == Op_match_rec) {
(yyvsp[(2) - (2)])->opcode = Op_nomatch;
@@ -3818,6 +3824,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) {
@@ -3843,14 +3850,14 @@ regular_loop:
case 148:
/* Line 1806 of yacc.c */
-#line 1482 "awkgram.y"
+#line 1489 "awkgram.y"
{ (yyval) = (yyvsp[(2) - (3)]); }
break;
case 149:
/* Line 1806 of yacc.c */
-#line 1484 "awkgram.y"
+#line 1491 "awkgram.y"
{
(yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
if ((yyval) == NULL)
@@ -3861,7 +3868,7 @@ regular_loop:
case 150:
/* Line 1806 of yacc.c */
-#line 1490 "awkgram.y"
+#line 1497 "awkgram.y"
{
(yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
if ((yyval) == NULL)
@@ -3872,7 +3879,7 @@ regular_loop:
case 151:
/* Line 1806 of yacc.c */
-#line 1496 "awkgram.y"
+#line 1503 "awkgram.y"
{
static short warned1 = FALSE;
@@ -3890,7 +3897,7 @@ regular_loop:
case 154:
/* Line 1806 of yacc.c */
-#line 1511 "awkgram.y"
+#line 1518 "awkgram.y"
{
(yyvsp[(1) - (2)])->opcode = Op_preincrement;
(yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - (2)]));
@@ -3900,7 +3907,7 @@ regular_loop:
case 155:
/* Line 1806 of yacc.c */
-#line 1516 "awkgram.y"
+#line 1523 "awkgram.y"
{
(yyvsp[(1) - (2)])->opcode = Op_predecrement;
(yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - (2)]));
@@ -3910,7 +3917,7 @@ regular_loop:
case 156:
/* Line 1806 of yacc.c */
-#line 1521 "awkgram.y"
+#line 1528 "awkgram.y"
{
(yyval) = list_create((yyvsp[(1) - (1)]));
}
@@ -3919,7 +3926,7 @@ regular_loop:
case 157:
/* Line 1806 of yacc.c */
-#line 1525 "awkgram.y"
+#line 1532 "awkgram.y"
{
(yyval) = list_create((yyvsp[(1) - (1)]));
}
@@ -3928,12 +3935,14 @@ regular_loop:
case 158:
/* Line 1806 of yacc.c */
-#line 1529 "awkgram.y"
+#line 1536 "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 {
@@ -3946,7 +3955,7 @@ regular_loop:
case 159:
/* Line 1806 of yacc.c */
-#line 1542 "awkgram.y"
+#line 1551 "awkgram.y"
{
/*
* was: $$ = $2
@@ -3961,7 +3970,7 @@ regular_loop:
case 160:
/* Line 1806 of yacc.c */
-#line 1555 "awkgram.y"
+#line 1564 "awkgram.y"
{
func_use((yyvsp[(1) - (1)])->lasti->func_name, FUNC_USE);
(yyval) = (yyvsp[(1) - (1)]);
@@ -3971,7 +3980,7 @@ regular_loop:
case 161:
/* Line 1806 of yacc.c */
-#line 1560 "awkgram.y"
+#line 1569 "awkgram.y"
{
/* indirect function call */
INSTRUCTION *f, *t;
@@ -4009,7 +4018,7 @@ regular_loop:
case 162:
/* Line 1806 of yacc.c */
-#line 1596 "awkgram.y"
+#line 1605 "awkgram.y"
{
param_sanity((yyvsp[(3) - (4)]));
(yyvsp[(1) - (4)])->opcode = Op_func_call;
@@ -4028,42 +4037,42 @@ regular_loop:
case 163:
/* Line 1806 of yacc.c */
-#line 1613 "awkgram.y"
+#line 1622 "awkgram.y"
{ (yyval) = NULL; }
break;
case 164:
/* Line 1806 of yacc.c */
-#line 1615 "awkgram.y"
+#line 1624 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 165:
/* Line 1806 of yacc.c */
-#line 1620 "awkgram.y"
+#line 1629 "awkgram.y"
{ (yyval) = NULL; }
break;
case 166:
/* Line 1806 of yacc.c */
-#line 1622 "awkgram.y"
+#line 1631 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (2)]); }
break;
case 167:
/* Line 1806 of yacc.c */
-#line 1627 "awkgram.y"
+#line 1636 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 168:
/* Line 1806 of yacc.c */
-#line 1629 "awkgram.y"
+#line 1638 "awkgram.y"
{
(yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
}
@@ -4072,7 +4081,7 @@ regular_loop:
case 169:
/* Line 1806 of yacc.c */
-#line 1636 "awkgram.y"
+#line 1645 "awkgram.y"
{
INSTRUCTION *ip = (yyvsp[(1) - (1)])->lasti;
int count = ip->sub_count; /* # of SUBSEP-seperated expressions */
@@ -4091,7 +4100,7 @@ regular_loop:
case 170:
/* Line 1806 of yacc.c */
-#line 1653 "awkgram.y"
+#line 1662 "awkgram.y"
{
INSTRUCTION *t = (yyvsp[(2) - (3)]);
if ((yyvsp[(2) - (3)]) == NULL) {
@@ -4110,14 +4119,14 @@ regular_loop:
case 171:
/* Line 1806 of yacc.c */
-#line 1670 "awkgram.y"
+#line 1679 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 172:
/* Line 1806 of yacc.c */
-#line 1672 "awkgram.y"
+#line 1681 "awkgram.y"
{
(yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
}
@@ -4126,14 +4135,14 @@ regular_loop:
case 173:
/* Line 1806 of yacc.c */
-#line 1679 "awkgram.y"
+#line 1688 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (2)]); }
break;
case 174:
/* Line 1806 of yacc.c */
-#line 1684 "awkgram.y"
+#line 1693 "awkgram.y"
{
char *var_name = (yyvsp[(1) - (1)])->lextok;
@@ -4146,7 +4155,7 @@ regular_loop:
case 175:
/* Line 1806 of yacc.c */
-#line 1692 "awkgram.y"
+#line 1701 "awkgram.y"
{
char *arr = (yyvsp[(1) - (2)])->lextok;
(yyvsp[(1) - (2)])->memory = variable((yyvsp[(1) - (2)])->source_line, arr, Node_var_new);
@@ -4158,7 +4167,7 @@ regular_loop:
case 176:
/* Line 1806 of yacc.c */
-#line 1702 "awkgram.y"
+#line 1711 "awkgram.y"
{
INSTRUCTION *ip = (yyvsp[(1) - (1)])->nexti;
if (ip->opcode == Op_push
@@ -4175,7 +4184,7 @@ regular_loop:
case 177:
/* Line 1806 of yacc.c */
-#line 1714 "awkgram.y"
+#line 1723 "awkgram.y"
{
(yyval) = list_append((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)]));
if ((yyvsp[(3) - (3)]) != NULL)
@@ -4186,7 +4195,7 @@ regular_loop:
case 178:
/* Line 1806 of yacc.c */
-#line 1723 "awkgram.y"
+#line 1732 "awkgram.y"
{
(yyvsp[(1) - (1)])->opcode = Op_postincrement;
}
@@ -4195,7 +4204,7 @@ regular_loop:
case 179:
/* Line 1806 of yacc.c */
-#line 1727 "awkgram.y"
+#line 1736 "awkgram.y"
{
(yyvsp[(1) - (1)])->opcode = Op_postdecrement;
}
@@ -4204,49 +4213,49 @@ regular_loop:
case 180:
/* Line 1806 of yacc.c */
-#line 1730 "awkgram.y"
+#line 1739 "awkgram.y"
{ (yyval) = NULL; }
break;
case 182:
/* Line 1806 of yacc.c */
-#line 1738 "awkgram.y"
+#line 1747 "awkgram.y"
{ yyerrok; }
break;
case 183:
/* Line 1806 of yacc.c */
-#line 1742 "awkgram.y"
+#line 1751 "awkgram.y"
{ yyerrok; }
break;
case 186:
/* Line 1806 of yacc.c */
-#line 1751 "awkgram.y"
+#line 1760 "awkgram.y"
{ yyerrok; }
break;
case 187:
/* Line 1806 of yacc.c */
-#line 1755 "awkgram.y"
+#line 1764 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); yyerrok; }
break;
case 188:
/* Line 1806 of yacc.c */
-#line 1759 "awkgram.y"
+#line 1768 "awkgram.y"
{ yyerrok; }
break;
/* Line 1806 of yacc.c */
-#line 4262 "awkgram.c"
+#line 4271 "awkgram.c"
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -4477,7 +4486,7 @@ yyreturn:
/* Line 2067 of yacc.c */
-#line 1761 "awkgram.y"
+#line 1770 "awkgram.y"
struct token {
@@ -4496,6 +4505,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 */
@@ -4519,82 +4529,85 @@ 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},
-{"load", Op_symbol, LEX_LOAD, GAWKX, 0},
-{"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},
+{"load", Op_symbol, LEX_LOAD, GAWKX, 0, 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
@@ -4630,6 +4643,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
@@ -5534,6 +5564,32 @@ allow_newline(void)
}
}
+/* newline_eof --- return newline or EOF as needed and adjust variables */
+
+/*
+ * This routine used to be a macro, however GCC 4.6.2 warned about
+ * the result of a computation not being used. Converting to a function
+ * removes the warnings.
+ */
+
+static int newline_eof()
+{
+ /* NB: a newline at end does not start a source line. */
+ if (lasttok != NEWLINE) {
+ pushback();
+ if (do_lint && ! eof_warned) {
+ lintwarn(_("source file does not end in newline"));
+ eof_warned = TRUE;
+ }
+ sourceline++;
+ return NEWLINE;
+ }
+
+ sourceline--;
+ eof_warned = FALSE;
+ return LEX_EOF;
+}
+
/* yylex --- Read the input and turn it into tokens. */
static int
@@ -5544,6 +5600,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;
@@ -5552,15 +5609,7 @@ yylex(void)
#define GET_INSTRUCTION(op) bcalloc(op, 1, sourceline)
- /* NB: a newline at end does not start a source line. */
-
-#define NEWLINE_EOF \
- (lasttok != NEWLINE ? \
- (pushback(), do_lint && ! eof_warned && \
- (lintwarn(_("source file does not end in newline")), \
- eof_warned = TRUE), sourceline++, NEWLINE) : \
- (sourceline--, eof_warned = FALSE, LEX_EOF))
-
+#define NEWLINE_EOF newline_eof()
yylval = (INSTRUCTION *) NULL;
if (lasttok == SUBSCRIPT) {
@@ -6120,17 +6169,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)
@@ -6417,7 +6491,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 */
@@ -6623,14 +6703,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));
}
@@ -7177,11 +7271,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:
@@ -7764,7 +7858,7 @@ mk_getline(INSTRUCTION *op, INSTRUCTION *var, INSTRUCTION *redir, int redirtype)
else
ip = list_create(op);
op->into_var = (var != NULL);
- op->redir_type = (redir != NULL) ? redirtype : 0;
+ op->redir_type = (redir != NULL) ? redirtype : redirect_none;
return (asgn == NULL ? ip : list_append(ip, asgn));
}
@@ -8133,3 +8227,4 @@ one_line_close(int fd)
}
+