diff options
Diffstat (limited to 'awkgram.c')
-rw-r--r-- | awkgram.c | 591 |
1 files changed, 343 insertions, 248 deletions
@@ -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) } + |