gawk-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gawk-diffs] [SCM] gawk branch, master, updated. cec0cbdbda6a8b27d3f69eb


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, master, updated. cec0cbdbda6a8b27d3f69eb5e2984d87b55f78fb
Date: Sun, 23 Dec 2012 13:59:18 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".

The branch, master has been updated
       via  cec0cbdbda6a8b27d3f69eb5e2984d87b55f78fb (commit)
       via  b0648b574c42f1d56253938a46f5299c95eef702 (commit)
       via  649dc73b0a3b2e55c24563d9bc082ececce5ce55 (commit)
       via  01d2f6e3cb4cfdfeaa98f6ec589f65825bd6bbdb (commit)
       via  3af9d688bb752a8865329d0a50a27ab959235f6b (commit)
       via  a105a111175f499c1c3f9d9b6fa91758e90794fb (commit)
       via  cfa30992be7c98184d68c3afbb489d47dddcf0fa (commit)
       via  15e58aea1441250cb85f760e644f97cd6efed35f (commit)
      from  ed17f7f9d71310c6418ba10a81bb35792f46cb08 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=cec0cbdbda6a8b27d3f69eb5e2984d87b55f78fb

commit cec0cbdbda6a8b27d3f69eb5e2984d87b55f78fb
Merge: ed17f7f b0648b5
Author: Arnold D. Robbins <address@hidden>
Date:   Sun Dec 23 15:58:52 2012 +0200

    Merge branch 'gawk-4.0-stable'

diff --cc ChangeLog
index cb0e2d9,bf81411..485c2e1
--- a/ChangeLog
+++ b/ChangeLog
@@@ -1,50 -1,19 +1,66 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
+ 2011-12-23         John Haque      <address@hidden>
+ 
+       * awkgram.y (is_deferred_variable): New function.
+       (func_install): Call it.
+       * eval.c (r_interpret): Op_push_arg. Check for uninitialized scalar.
+ 
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * awkgram.y (tokentab): Whitespace fix for "include".
+       * builtin.c (printf_common): Do a fatal error if no args to printf()
+       or sprintf().
+ 
 +2012-12-19         Arnold D. Robbins     <address@hidden>
 +
 +      * bootstrap.sh: Touch extension/aclocal.m4 also.
 +
 +      Unrelated: Extend input parser API:
 +
 +      * awk.h (IOBUF): Remove read_func pointer.
 +      * gawkapi.h (awk_input_buf_t): Move it to here.
 +      * io.c (iop_alloc, get_a_record, get_read_timeout): Adjust code.
 +
 +      Unrelated: Make sure that variables like NF, NR, FNR are
 +      accessable correctly both through SYMTAB and through API.
 +
 +      * gawkapi.c (api_sym_lookup): Call update_global_values().
 +      (api_sym_lookup_scalar): Ditto.
 +      * interpret.h (Op_subscript, Op_subscript_lhs): Ditto.
 +      * main.c (update_global_values): Adjust comment.
 +
 +      Unrelated: Fix --disable-lint so that everything compiles.
 +
 +      * main.c (main): Move case lable inside ifdef.
 +      * awkgram.y (isnoeffect): Add ifdefs around declaration, use,
 +      and function body.
 +
 +      Unrelated: Restore building with tcc.
 +
 +      * awk.h (AFUNC): Move to array.c which is the only place its used.
 +      (ainit_ind, atypeof_ind, etc.): New macros for use in array.c
 +      * array.c (AFUNC): Change to use F##_ind. Works with tcc and other
 +      compilers.
 +      * configure.ac: Only add -export-dynamic flag if compiling with gcc.
 +
 +2012-12-18         Andrew J. Schorr     <address@hidden>
 +
 +      * gawkapi.c (sym_update_real): If setting a scalar variable that exists
 +      already in an undefined state with type set to Node_var_new, we must
 +      update the type to Node_var if the new value is not undefined.
 +
 +2012-12-18         Arnold D. Robbins     <address@hidden>
 +
 +      * awkgram.y (tokentab): "extension" needs to be inside ifdef DYNAMIC.
 +      Thanks to Anders Wallin for finding this.
 +
 +2012-12-16         Arnold D. Robbins     <address@hidden>
 +
 +      * debug.c (do_set_var): Fix last remaining `*assoc_lookup() = x'.
 +
  2012-12-15         Arnold D. Robbins     <address@hidden>
  
        Infrastructure Updates:
diff --cc README_d/ChangeLog
index 0310bd8,c5c8f14..0e16413
--- a/README_d/ChangeLog
+++ b/README_d/ChangeLog
@@@ -1,11 -1,7 +1,15 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
 +2012-04-11         John Haque      <address@hidden>
 +
 +      * README.hacking: New file.
 +
 +2012-04-01         John Haque      <address@hidden>
 +
 +      * README.mpfr: New file.
 +
  2012-03-28         Arnold D. Robbins     <address@hidden>
  
        * 4.0.1: Release tar ball made.
diff --cc awkgram.c
index 9fd1156,dd891b3..228fd66
--- a/awkgram.c
+++ b/awkgram.c
@@@ -94,10 -95,11 +94,11 @@@ static int isnoeffect(OPCODE type)
  static INSTRUCTION *make_assignable(INSTRUCTION *ip);
  static void dumpintlstr(const char *str, size_t len);
  static void dumpintlstr2(const char *str1, size_t len1, const char *str2, 
size_t len2);
 -static int isarray(NODE *n);
  static int include_source(INSTRUCTION *file);
 +static int load_library(INSTRUCTION *file);
  static void next_sourcefile(void);
  static char *tokexpand(void);
 -static int is_deferred_variable(const char *name);
++static bool is_deferred_variable(const char *name);
  
  #define instruction(t)        bcalloc(t, 1, 0)
  
@@@ -195,10 -207,18 +196,10 @@@ extern double fmod(double x, double y)
  
  #define YYSTYPE INSTRUCTION *
  
 +#define is_identchar(c)               (isalnum(c) || (c) == '_')
 +
  /* Line 371 of yacc.c  */
- #line 202 "awkgram.c"
 -#line 222 "awkgram.c"
++#line 203 "awkgram.c"
  
  # ifndef YY_NULL
  #  if defined __cplusplus && 201103L <= __cplusplus
@@@ -367,7 -385,7 +368,7 @@@ int yyparse ()
  /* Copy the second part of user declarations.  */
  
  /* Line 390 of yacc.c  */
- #line 371 "awkgram.c"
 -#line 389 "awkgram.c"
++#line 372 "awkgram.c"
  
  #ifdef short
  # undef short
@@@ -731,25 -748,25 +732,25 @@@ static const yytype_int16 yyrhs[] 
  /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
  static const yytype_uint16 yyrline[] =
  {
-        0,   199,   199,   201,   206,   207,   213,   225,   229,   240,
-      246,   251,   259,   267,   269,   274,   282,   284,   290,   291,
-      293,   319,   330,   341,   347,   356,   366,   368,   370,   376,
-      381,   382,   386,   405,   404,   438,   440,   445,   446,   459,
-      464,   465,   469,   471,   473,   480,   570,   612,   654,   767,
-      774,   781,   791,   800,   809,   818,   829,   845,   844,   868,
-      880,   880,   978,   978,  1011,  1041,  1047,  1048,  1054,  1055,
-     1062,  1067,  1079,  1093,  1095,  1103,  1108,  1110,  1118,  1120,
-     1129,  1130,  1138,  1143,  1143,  1154,  1158,  1166,  1167,  1170,
-     1172,  1177,  1178,  1187,  1188,  1193,  1198,  1204,  1206,  1208,
-     1215,  1216,  1222,  1223,  1228,  1230,  1235,  1237,  1239,  1241,
-     1247,  1254,  1256,  1258,  1274,  1284,  1291,  1293,  1298,  1300,
-     1302,  1310,  1312,  1317,  1319,  1324,  1326,  1328,  1378,  1380,
-     1382,  1384,  1386,  1388,  1390,  1392,  1415,  1420,  1425,  1450,
-     1456,  1458,  1460,  1462,  1464,  1466,  1471,  1475,  1507,  1509,
-     1515,  1521,  1534,  1535,  1536,  1541,  1546,  1550,  1554,  1569,
-     1582,  1587,  1623,  1641,  1642,  1648,  1649,  1654,  1656,  1663,
-     1680,  1697,  1699,  1706,  1711,  1719,  1729,  1741,  1750,  1754,
-     1758,  1762,  1766,  1770,  1773,  1775,  1779,  1783,  1787
 -       0,   219,   219,   221,   226,   227,   231,   243,   247,   258,
 -     266,   274,   282,   284,   290,   291,   293,   319,   330,   341,
 -     347,   356,   366,   368,   370,   381,   386,   387,   392,   391,
 -     421,   420,   453,   455,   460,   461,   474,   479,   480,   484,
 -     486,   488,   495,   585,   627,   669,   782,   789,   796,   806,
 -     815,   824,   833,   844,   860,   859,   871,   883,   883,   979,
 -     979,  1005,  1028,  1034,  1035,  1041,  1042,  1049,  1054,  1066,
 -    1080,  1082,  1088,  1093,  1095,  1103,  1105,  1114,  1115,  1123,
 -    1128,  1128,  1139,  1143,  1151,  1152,  1155,  1157,  1162,  1163,
 -    1170,  1172,  1176,  1182,  1189,  1191,  1193,  1200,  1201,  1207,
 -    1208,  1213,  1215,  1220,  1222,  1224,  1226,  1232,  1239,  1241,
 -    1243,  1259,  1269,  1276,  1278,  1283,  1285,  1287,  1295,  1297,
 -    1302,  1304,  1309,  1311,  1313,  1366,  1368,  1370,  1372,  1374,
 -    1376,  1378,  1380,  1403,  1408,  1413,  1438,  1444,  1446,  1448,
 -    1450,  1452,  1454,  1459,  1463,  1494,  1496,  1502,  1508,  1521,
 -    1522,  1523,  1528,  1533,  1537,  1541,  1553,  1566,  1571,  1607,
 -    1625,  1626,  1632,  1633,  1638,  1640,  1647,  1664,  1681,  1683,
 -    1690,  1695,  1703,  1717,  1729,  1738,  1742,  1746,  1750,  1754,
 -    1758,  1761,  1763,  1767,  1771,  1775
++       0,   200,   200,   202,   207,   208,   214,   226,   230,   241,
++     247,   252,   260,   268,   270,   275,   283,   285,   291,   292,
++     294,   320,   331,   342,   348,   357,   367,   369,   371,   377,
++     382,   383,   387,   406,   405,   439,   441,   446,   447,   460,
++     465,   466,   470,   472,   474,   481,   571,   613,   655,   768,
++     775,   782,   792,   801,   810,   819,   830,   846,   845,   869,
++     881,   881,   979,   979,  1012,  1042,  1048,  1049,  1055,  1056,
++    1063,  1068,  1080,  1094,  1096,  1104,  1109,  1111,  1119,  1121,
++    1130,  1131,  1139,  1144,  1144,  1155,  1159,  1167,  1168,  1171,
++    1173,  1178,  1179,  1188,  1189,  1194,  1199,  1205,  1207,  1209,
++    1216,  1217,  1223,  1224,  1229,  1231,  1236,  1238,  1240,  1242,
++    1248,  1255,  1257,  1259,  1275,  1285,  1292,  1294,  1299,  1301,
++    1303,  1311,  1313,  1318,  1320,  1325,  1327,  1329,  1379,  1381,
++    1383,  1385,  1387,  1389,  1391,  1393,  1416,  1421,  1426,  1451,
++    1457,  1459,  1461,  1463,  1465,  1467,  1472,  1476,  1508,  1510,
++    1516,  1522,  1535,  1536,  1537,  1542,  1547,  1551,  1555,  1570,
++    1583,  1588,  1624,  1642,  1643,  1649,  1650,  1655,  1657,  1664,
++    1681,  1698,  1700,  1707,  1712,  1720,  1730,  1742,  1751,  1755,
++    1759,  1763,  1767,  1771,  1774,  1776,  1780,  1784,  1788
  };
  #endif
  
@@@ -2036,7 -2050,7 +2037,7 @@@ yyreduce
      {
          case 3:
  /* Line 1792 of yacc.c  */
- #line 202 "awkgram.y"
 -#line 222 "awkgram.y"
++#line 203 "awkgram.y"
      {
                rule = 0;
                yyerrok;
@@@ -2045,17 -2059,15 +2046,17 @@@
  
    case 5:
  /* Line 1792 of yacc.c  */
- #line 208 "awkgram.y"
 -#line 228 "awkgram.y"
++#line 209 "awkgram.y"
      {
                next_sourcefile();
 +              if (sourcefile == srcfiles)
 +                      process_deferred();
          }
      break;
  
    case 6:
  /* Line 1792 of yacc.c  */
- #line 214 "awkgram.y"
 -#line 232 "awkgram.y"
++#line 215 "awkgram.y"
      {
                rule = 0;
                /*
@@@ -2068,7 -2080,7 +2069,7 @@@
  
    case 7:
  /* Line 1792 of yacc.c  */
- #line 226 "awkgram.y"
 -#line 244 "awkgram.y"
++#line 227 "awkgram.y"
      {
                (void) append_rule((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
@@@ -2076,7 -2088,7 +2077,7 @@@
  
    case 8:
  /* Line 1792 of yacc.c  */
- #line 230 "awkgram.y"
 -#line 248 "awkgram.y"
++#line 231 "awkgram.y"
      {
                if (rule != Rule) {
                        msg(_("%s blocks must have an action part"), 
ruletab[rule]);
@@@ -2091,35 -2103,28 +2092,35 @@@
  
    case 9:
  /* Line 1792 of yacc.c  */
- #line 241 "awkgram.y"
 -#line 259 "awkgram.y"
++#line 242 "awkgram.y"
      {
 -              can_return = FALSE;
 -              if ((yyvsp[(1) - (2)]) && func_install((yyvsp[(1) - (2)]), 
(yyvsp[(2) - (2)])) < 0)
 -                      YYABORT;
 -              func_params = NULL;
 +              in_function = NULL;
 +              (void) mk_function((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
                yyerrok;
          }
      break;
  
    case 10:
  /* Line 1792 of yacc.c  */
- #line 247 "awkgram.y"
 -#line 267 "awkgram.y"
++#line 248 "awkgram.y"
      {
 -              want_source = FALSE;
 +              want_source = false;
                yyerrok;
          }
      break;
  
    case 11:
  /* Line 1792 of yacc.c  */
- #line 252 "awkgram.y"
 -#line 275 "awkgram.y"
++#line 253 "awkgram.y"
 +    {
 +              want_source = false;
 +              yyerrok;
 +        }
 +    break;
 +
 +  case 12:
 +/* Line 1792 of yacc.c  */
- #line 260 "awkgram.y"
++#line 261 "awkgram.y"
      {
                if (include_source((yyvsp[(1) - (1)])) < 0)
                        YYABORT;
@@@ -2129,57 -2134,33 +2130,57 @@@
          }
      break;
  
 -  case 12:
 +  case 13:
  /* Line 1792 of yacc.c  */
- #line 268 "awkgram.y"
 -#line 283 "awkgram.y"
++#line 269 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 13:
 +  case 14:
  /* Line 1792 of yacc.c  */
- #line 270 "awkgram.y"
 -#line 285 "awkgram.y"
++#line 271 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 14:
 +  case 15:
 +/* Line 1792 of yacc.c  */
- #line 275 "awkgram.y"
++#line 276 "awkgram.y"
 +    {
 +              if (load_library((yyvsp[(1) - (1)])) < 0)
 +                      YYABORT;
 +              efree((yyvsp[(1) - (1)])->lextok);
 +              bcfree((yyvsp[(1) - (1)]));
 +              (yyval) = NULL;
 +        }
 +    break;
 +
 +  case 16:
 +/* Line 1792 of yacc.c  */
- #line 283 "awkgram.y"
++#line 284 "awkgram.y"
 +    { (yyval) = NULL; }
 +    break;
 +
 +  case 17:
 +/* Line 1792 of yacc.c  */
- #line 285 "awkgram.y"
++#line 286 "awkgram.y"
 +    { (yyval) = NULL; }
 +    break;
 +
 +  case 18:
  /* Line 1792 of yacc.c  */
--#line 290 "awkgram.y"
++#line 291 "awkgram.y"
      { (yyval) = NULL; rule = Rule; }
      break;
  
 -  case 15:
 +  case 19:
  /* Line 1792 of yacc.c  */
--#line 292 "awkgram.y"
++#line 293 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); rule = Rule; }
      break;
  
 -  case 16:
 +  case 20:
  /* Line 1792 of yacc.c  */
--#line 294 "awkgram.y"
++#line 295 "awkgram.y"
      {
                INSTRUCTION *tp;
  
@@@ -2207,9 -2188,9 +2208,9 @@@
          }
      break;
  
 -  case 17:
 +  case 21:
  /* Line 1792 of yacc.c  */
--#line 320 "awkgram.y"
++#line 321 "awkgram.y"
      {
                static int begin_seen = 0;
                if (do_lint_old && ++begin_seen == 2)
@@@ -2222,9 -2203,9 +2223,9 @@@
          }
      break;
  
 -  case 18:
 +  case 22:
  /* Line 1792 of yacc.c  */
--#line 331 "awkgram.y"
++#line 332 "awkgram.y"
      {
                static int end_seen = 0;
                if (do_lint_old && ++end_seen == 2)
@@@ -2237,9 -2218,9 +2238,9 @@@
          }
      break;
  
 -  case 19:
 +  case 23:
  /* Line 1792 of yacc.c  */
--#line 342 "awkgram.y"
++#line 343 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->in_rule = rule = BEGINFILE;
                (yyvsp[(1) - (1)])->source_file = source;
@@@ -2247,9 -2228,9 +2248,9 @@@
          }
      break;
  
 -  case 20:
 +  case 24:
  /* Line 1792 of yacc.c  */
--#line 348 "awkgram.y"
++#line 349 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->in_rule = rule = ENDFILE;
                (yyvsp[(1) - (1)])->source_file = source;
@@@ -2257,9 -2238,9 +2258,9 @@@
          }
      break;
  
 -  case 21:
 +  case 25:
  /* Line 1792 of yacc.c  */
--#line 357 "awkgram.y"
++#line 358 "awkgram.y"
      {
                if ((yyvsp[(2) - (5)]) == NULL)
                        (yyval) = list_create(instruction(Op_no_op));
@@@ -2268,58 -2249,78 +2269,58 @@@
          }
      break;
  
 -  case 22:
 +  case 26:
  /* Line 1792 of yacc.c  */
--#line 367 "awkgram.y"
++#line 368 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 23:
 +  case 27:
  /* Line 1792 of yacc.c  */
--#line 369 "awkgram.y"
++#line 370 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 24:
 +  case 28:
  /* Line 1792 of yacc.c  */
--#line 371 "awkgram.y"
++#line 372 "awkgram.y"
      {
                yyerror(_("`%s' is a built-in function, it cannot be 
redefined"),
 -                      tokstart);
 -              (yyvsp[(1) - (1)])->opcode = Op_symbol; /* Op_symbol instead of 
Op_token so that
 -                                       * free_bc_internal does not try to 
free it
 -                                       */
 -              (yyvsp[(1) - (1)])->lextok = builtin_func;
 -              (yyval) = (yyvsp[(1) - (1)]);
 -              /* yyerrok; */
 +                                      tokstart);
 +              YYABORT;
          }
      break;
  
 -  case 25:
 +  case 29:
  /* Line 1792 of yacc.c  */
- #line 377 "awkgram.y"
 -#line 382 "awkgram.y"
++#line 378 "awkgram.y"
      { (yyval) = (yyvsp[(2) - (2)]); }
      break;
  
 -  case 28:
 +  case 32:
  /* Line 1792 of yacc.c  */
- #line 387 "awkgram.y"
 -#line 392 "awkgram.y"
++#line 388 "awkgram.y"
      {
 -              param_counter = 0;
 -              func_params = NULL;
 +              (yyvsp[(1) - (6)])->source_file = source;
 +              if (install_function((yyvsp[(2) - (6)])->lextok, (yyvsp[(1) - 
(6)]), (yyvsp[(4) - (6)])) < 0)
 +                      YYABORT;
 +              in_function = (yyvsp[(2) - (6)])->lextok;
 +              (yyvsp[(2) - (6)])->lextok = NULL;
 +              bcfree((yyvsp[(2) - (6)]));
 +              /* $4 already free'd in install_function */
 +              (yyval) = (yyvsp[(1) - (6)]);
          }
      break;
  
 -  case 29:
 -/* Line 1792 of yacc.c  */
 -#line 397 "awkgram.y"
 -    {
 -                      NODE *t;
 -
 -                      (yyvsp[(1) - (7)])->source_file = source;
 -                      t = make_param((yyvsp[(3) - (7)])->lextok);
 -                      (yyvsp[(3) - (7)])->lextok = NULL;
 -                      bcfree((yyvsp[(3) - (7)]));
 -                      t->flags |= FUNC;
 -                      t->rnode = func_params;
 -                      func_params = t;
 -                      (yyval) = (yyvsp[(1) - (7)]);
 -                      can_return = TRUE;
 -                      /* check for duplicate parameter names */
 -                      if (dup_parms((yyvsp[(1) - (7)]), t))
 -                              errcount++;
 -              }
 -    break;
 -
 -  case 30:
 +  case 33:
  /* Line 1792 of yacc.c  */
- #line 405 "awkgram.y"
 -#line 421 "awkgram.y"
 -    { ++want_regexp; }
++#line 406 "awkgram.y"
 +    { want_regexp = true; }
      break;
  
 -  case 31:
 +  case 34:
  /* Line 1792 of yacc.c  */
- #line 407 "awkgram.y"
 -#line 423 "awkgram.y"
++#line 408 "awkgram.y"
      {
                  NODE *n, *exp;
                  char *re;
@@@ -2350,21 -2350,21 +2351,21 @@@
                }
      break;
  
 -  case 32:
 +  case 35:
  /* Line 1792 of yacc.c  */
- #line 439 "awkgram.y"
 -#line 454 "awkgram.y"
++#line 440 "awkgram.y"
      { bcfree((yyvsp[(1) - (1)])); }
      break;
  
 -  case 34:
 +  case 37:
  /* Line 1792 of yacc.c  */
- #line 445 "awkgram.y"
 -#line 460 "awkgram.y"
++#line 446 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 35:
 +  case 38:
  /* Line 1792 of yacc.c  */
- #line 447 "awkgram.y"
 -#line 462 "awkgram.y"
++#line 448 "awkgram.y"
      {
                if ((yyvsp[(2) - (2)]) == NULL)
                        (yyval) = (yyvsp[(1) - (2)]);
@@@ -2379,38 -2379,38 +2380,38 @@@
          }
      break;
  
 -  case 36:
 +  case 39:
  /* Line 1792 of yacc.c  */
- #line 460 "awkgram.y"
 -#line 475 "awkgram.y"
++#line 461 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 39:
 +  case 42:
  /* Line 1792 of yacc.c  */
- #line 470 "awkgram.y"
 -#line 485 "awkgram.y"
++#line 471 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 40:
 +  case 43:
  /* Line 1792 of yacc.c  */
- #line 472 "awkgram.y"
 -#line 487 "awkgram.y"
++#line 473 "awkgram.y"
      { (yyval) = (yyvsp[(2) - (3)]); }
      break;
  
 -  case 41:
 +  case 44:
  /* Line 1792 of yacc.c  */
- #line 474 "awkgram.y"
 -#line 489 "awkgram.y"
++#line 475 "awkgram.y"
      {
 -              if (do_profiling)
 +              if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[(1) - (1)]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[(1) - (1)]);
          }
      break;
  
 -  case 42:
 +  case 45:
  /* Line 1792 of yacc.c  */
- #line 481 "awkgram.y"
 -#line 496 "awkgram.y"
++#line 482 "awkgram.y"
      {
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
                INSTRUCTION *ip, *nextc, *tbreak;
@@@ -2502,9 -2502,9 +2503,9 @@@
          }
      break;
  
 -  case 43:
 +  case 46:
  /* Line 1792 of yacc.c  */
- #line 571 "awkgram.y"
 -#line 586 "awkgram.y"
++#line 572 "awkgram.y"
      { 
                /*
                 *    -----------------
@@@ -2548,9 -2548,9 +2549,9 @@@
          }
      break;
  
 -  case 44:
 +  case 47:
  /* Line 1792 of yacc.c  */
- #line 613 "awkgram.y"
 -#line 628 "awkgram.y"
++#line 614 "awkgram.y"
      {
                /*
                 *    -----------------
@@@ -2594,9 -2594,9 +2595,9 @@@
          }
      break;
  
 -  case 45:
 +  case 48:
  /* Line 1792 of yacc.c  */
- #line 655 "awkgram.y"
 -#line 670 "awkgram.y"
++#line 656 "awkgram.y"
      {
                INSTRUCTION *ip;
                char *var_name = (yyvsp[(3) - (8)])->lextok;
@@@ -2711,9 -2711,9 +2712,9 @@@ regular_loop
          }
      break;
  
 -  case 46:
 +  case 49:
  /* Line 1792 of yacc.c  */
- #line 768 "awkgram.y"
 -#line 783 "awkgram.y"
++#line 769 "awkgram.y"
      {
                (yyval) = mk_for_loop((yyvsp[(1) - (12)]), (yyvsp[(3) - (12)]), 
(yyvsp[(6) - (12)]), (yyvsp[(9) - (12)]), (yyvsp[(12) - (12)]));
  
@@@ -2722,9 -2722,9 +2723,9 @@@
          }
      break;
  
 -  case 47:
 +  case 50:
  /* Line 1792 of yacc.c  */
- #line 775 "awkgram.y"
 -#line 790 "awkgram.y"
++#line 776 "awkgram.y"
      {
                (yyval) = mk_for_loop((yyvsp[(1) - (11)]), (yyvsp[(3) - (11)]), 
(INSTRUCTION *) NULL, (yyvsp[(8) - (11)]), (yyvsp[(11) - (11)]));
  
@@@ -2733,20 -2733,20 +2734,20 @@@
          }
      break;
  
 -  case 48:
 +  case 51:
  /* Line 1792 of yacc.c  */
- #line 782 "awkgram.y"
 -#line 797 "awkgram.y"
++#line 783 "awkgram.y"
      {
 -              if (do_profiling)
 +              if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[(1) - (1)]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[(1) - (1)]);
          }
      break;
  
 -  case 49:
 +  case 52:
  /* Line 1792 of yacc.c  */
- #line 792 "awkgram.y"
 -#line 807 "awkgram.y"
++#line 793 "awkgram.y"
      { 
                if (! break_allowed)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@@ -2757,9 -2757,9 +2758,9 @@@
          }
      break;
  
 -  case 50:
 +  case 53:
  /* Line 1792 of yacc.c  */
- #line 801 "awkgram.y"
 -#line 816 "awkgram.y"
++#line 802 "awkgram.y"
      {
                if (! continue_allowed)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@@ -2770,9 -2770,9 +2771,9 @@@
          }
      break;
  
 -  case 51:
 +  case 54:
  /* Line 1792 of yacc.c  */
- #line 810 "awkgram.y"
 -#line 825 "awkgram.y"
++#line 811 "awkgram.y"
      {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@@ -2783,9 -2783,9 +2784,9 @@@
          }
      break;
  
 -  case 52:
 +  case 55:
  /* Line 1792 of yacc.c  */
- #line 819 "awkgram.y"
 -#line 834 "awkgram.y"
++#line 820 "awkgram.y"
      {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule == BEGIN || rule == END || rule == ENDFILE)
@@@ -2798,9 -2798,9 +2799,9 @@@
          }
      break;
  
 -  case 53:
 +  case 56:
  /* Line 1792 of yacc.c  */
- #line 830 "awkgram.y"
 -#line 845 "awkgram.y"
++#line 831 "awkgram.y"
      {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time. 
@@@ -2817,18 -2817,18 +2818,18 @@@
          }
      break;
  
 -  case 54:
 +  case 57:
  /* Line 1792 of yacc.c  */
- #line 845 "awkgram.y"
 -#line 860 "awkgram.y"
++#line 846 "awkgram.y"
      {
 -              if (! can_return)
 +              if (! in_function)
                        yyerror(_("`return' used outside function context"));
          }
      break;
  
 -  case 55:
 +  case 58:
  /* Line 1792 of yacc.c  */
- #line 848 "awkgram.y"
 -#line 863 "awkgram.y"
++#line 849 "awkgram.y"
      {
                if ((yyvsp[(3) - (4)]) == NULL) {
                        (yyval) = list_create((yyvsp[(1) - (4)]));
@@@ -2851,15 -2839,15 +2852,15 @@@
          }
      break;
  
 -  case 57:
 +  case 60:
  /* Line 1792 of yacc.c  */
- #line 880 "awkgram.y"
 -#line 883 "awkgram.y"
 -    { in_print = TRUE; in_parens = 0; }
++#line 881 "awkgram.y"
 +    { in_print = true; in_parens = 0; }
      break;
  
 -  case 58:
 +  case 61:
  /* Line 1792 of yacc.c  */
- #line 881 "awkgram.y"
 -#line 884 "awkgram.y"
++#line 882 "awkgram.y"
      {
                /*
                 * Optimization: plain `print' has no expression list, so $3 is 
null.
@@@ -2958,15 -2944,15 +2959,15 @@@ regular_print
          }
      break;
  
 -  case 59:
 +  case 62:
  /* Line 1792 of yacc.c  */
- #line 978 "awkgram.y"
+ #line 979 "awkgram.y"
      { sub_counter = 0; }
      break;
  
 -  case 60:
 +  case 63:
  /* Line 1792 of yacc.c  */
- #line 979 "awkgram.y"
+ #line 980 "awkgram.y"
      {
                char *arr = (yyvsp[(2) - (4)])->lextok;
  
@@@ -3001,11 -2980,11 +3002,11 @@@
          }
      break;
  
 -  case 61:
 +  case 64:
  /* Line 1792 of yacc.c  */
- #line 1016 "awkgram.y"
 -#line 1010 "awkgram.y"
++#line 1017 "awkgram.y"
      {
 -              static short warned = FALSE;
 +              static bool warned = false;
                char *arr = (yyvsp[(3) - (4)])->lextok;
  
                if (do_lint && ! warned) {
@@@ -3031,33 -3003,33 +3032,33 @@@
          }
      break;
  
 -  case 62:
 +  case 65:
  /* Line 1792 of yacc.c  */
- #line 1042 "awkgram.y"
 -#line 1029 "awkgram.y"
++#line 1043 "awkgram.y"
      { (yyval) = optimize_assignment((yyvsp[(1) - (1)])); }
      break;
  
 -  case 63:
 +  case 66:
  /* Line 1792 of yacc.c  */
- #line 1047 "awkgram.y"
 -#line 1034 "awkgram.y"
++#line 1048 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 64:
 +  case 67:
  /* Line 1792 of yacc.c  */
- #line 1049 "awkgram.y"
 -#line 1036 "awkgram.y"
++#line 1050 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 65:
 +  case 68:
  /* Line 1792 of yacc.c  */
- #line 1054 "awkgram.y"
 -#line 1041 "awkgram.y"
++#line 1055 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 66:
 +  case 69:
  /* Line 1792 of yacc.c  */
- #line 1056 "awkgram.y"
 -#line 1043 "awkgram.y"
++#line 1057 "awkgram.y"
      {
                if ((yyvsp[(1) - (2)]) == NULL)
                        (yyval) = list_create((yyvsp[(2) - (2)]));
@@@ -3066,15 -3038,15 +3067,15 @@@
          }
      break;
  
 -  case 67:
 +  case 70:
  /* Line 1792 of yacc.c  */
- #line 1063 "awkgram.y"
 -#line 1050 "awkgram.y"
++#line 1064 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 68:
 +  case 71:
  /* Line 1792 of yacc.c  */
- #line 1068 "awkgram.y"
 -#line 1055 "awkgram.y"
++#line 1069 "awkgram.y"
      {
                INSTRUCTION *casestmt = (yyvsp[(5) - (5)]);
                if ((yyvsp[(5) - (5)]) == NULL)
@@@ -3088,9 -3060,9 +3089,9 @@@
          }
      break;
  
 -  case 69:
 +  case 72:
  /* Line 1792 of yacc.c  */
- #line 1080 "awkgram.y"
 -#line 1067 "awkgram.y"
++#line 1081 "awkgram.y"
      {
                INSTRUCTION *casestmt = (yyvsp[(4) - (4)]);
                if ((yyvsp[(4) - (4)]) == NULL)
@@@ -3103,87 -3075,85 +3104,87 @@@
          }
      break;
  
 -  case 70:
 +  case 73:
  /* Line 1792 of yacc.c  */
- #line 1094 "awkgram.y"
 -#line 1081 "awkgram.y"
++#line 1095 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 71:
 +  case 74:
  /* Line 1792 of yacc.c  */
- #line 1096 "awkgram.y"
 -#line 1083 "awkgram.y"
++#line 1097 "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)]);
          }
      break;
  
 -  case 72:
 +  case 75:
  /* Line 1792 of yacc.c  */
- #line 1104 "awkgram.y"
 -#line 1089 "awkgram.y"
++#line 1105 "awkgram.y"
      {
                bcfree((yyvsp[(1) - (2)]));
                (yyval) = (yyvsp[(2) - (2)]);
          }
      break;
  
 -  case 73:
 +  case 76:
  /* Line 1792 of yacc.c  */
- #line 1109 "awkgram.y"
 -#line 1094 "awkgram.y"
++#line 1110 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 74:
 +  case 77:
  /* Line 1792 of yacc.c  */
- #line 1111 "awkgram.y"
 -#line 1096 "awkgram.y"
++#line 1112 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->opcode = Op_push_re;
                (yyval) = (yyvsp[(1) - (1)]);
          }
      break;
  
 -  case 75:
 +  case 78:
  /* Line 1792 of yacc.c  */
- #line 1119 "awkgram.y"
 -#line 1104 "awkgram.y"
++#line 1120 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 76:
 +  case 79:
  /* Line 1792 of yacc.c  */
- #line 1121 "awkgram.y"
 -#line 1106 "awkgram.y"
++#line 1122 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 78:
 +  case 81:
  /* Line 1792 of yacc.c  */
- #line 1131 "awkgram.y"
 -#line 1116 "awkgram.y"
++#line 1132 "awkgram.y"
      {
                (yyval) = (yyvsp[(2) - (3)]);
          }
      break;
  
 -  case 79:
 +  case 82:
  /* Line 1792 of yacc.c  */
- #line 1138 "awkgram.y"
 -#line 1123 "awkgram.y"
++#line 1139 "awkgram.y"
      {
 -              in_print = FALSE;
 +              in_print = false;
                in_parens = 0;
                (yyval) = NULL;
          }
      break;
  
 -  case 80:
 +  case 83:
  /* Line 1792 of yacc.c  */
- #line 1143 "awkgram.y"
 -#line 1128 "awkgram.y"
 -    { in_print = FALSE; in_parens = 0; }
++#line 1144 "awkgram.y"
 +    { in_print = false; in_parens = 0; }
      break;
  
 -  case 81:
 +  case 84:
  /* Line 1792 of yacc.c  */
- #line 1144 "awkgram.y"
 -#line 1129 "awkgram.y"
++#line 1145 "awkgram.y"
      {
                if ((yyvsp[(1) - (3)])->redir_type == redirect_twoway
                        && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_K_getline_redir
@@@ -3193,175 -3163,165 +3194,175 @@@
          }
      break;
  
 -  case 82:
 +  case 85:
  /* Line 1792 of yacc.c  */
- #line 1155 "awkgram.y"
 -#line 1140 "awkgram.y"
++#line 1156 "awkgram.y"
      {
                (yyval) = mk_condition((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)]), 
(yyvsp[(6) - (6)]), NULL, NULL);
          }
      break;
  
 -  case 83:
 +  case 86:
  /* Line 1792 of yacc.c  */
- #line 1160 "awkgram.y"
 -#line 1145 "awkgram.y"
++#line 1161 "awkgram.y"
      {
                (yyval) = mk_condition((yyvsp[(3) - (9)]), (yyvsp[(1) - (9)]), 
(yyvsp[(6) - (9)]), (yyvsp[(7) - (9)]), (yyvsp[(9) - (9)]));
          }
      break;
  
 -  case 88:
 +  case 91:
  /* Line 1792 of yacc.c  */
- #line 1177 "awkgram.y"
 -#line 1162 "awkgram.y"
++#line 1178 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 89:
 +  case 92:
  /* Line 1792 of yacc.c  */
- #line 1179 "awkgram.y"
 -#line 1164 "awkgram.y"
++#line 1180 "awkgram.y"
      {
                bcfree((yyvsp[(1) - (2)]));
                (yyval) = (yyvsp[(2) - (2)]);
          }
      break;
  
 -  case 92:
 -/* Line 1792 of yacc.c  */
 -#line 1177 "awkgram.y"
 -    {
 -              append_param((yyvsp[(1) - (1)])->lextok);
 -              (yyvsp[(1) - (1)])->lextok = NULL;
 -              bcfree((yyvsp[(1) - (1)]));
 -        }
 -    break;
 -
    case 93:
  /* Line 1792 of yacc.c  */
- #line 1187 "awkgram.y"
 -#line 1183 "awkgram.y"
 -    {
 -              append_param((yyvsp[(3) - (3)])->lextok);
 -              (yyvsp[(3) - (3)])->lextok = NULL;
 -              bcfree((yyvsp[(3) - (3)]));
 -              yyerrok;
 -        }
++#line 1188 "awkgram.y"
 +    { (yyval) = NULL; }
      break;
  
    case 94:
  /* Line 1792 of yacc.c  */
- #line 1189 "awkgram.y"
+ #line 1190 "awkgram.y"
 -    { /* func_params = NULL; */ }
 +    { (yyval) = (yyvsp[(1) - (1)]) ; }
      break;
  
    case 95:
  /* Line 1792 of yacc.c  */
- #line 1194 "awkgram.y"
 -#line 1192 "awkgram.y"
 -    { /* func_params = NULL; */ }
++#line 1195 "awkgram.y"
 +    {
 +              (yyvsp[(1) - (1)])->param_count = 0;
 +              (yyval) = list_create((yyvsp[(1) - (1)]));
 +        }
      break;
  
    case 96:
  /* Line 1792 of yacc.c  */
- #line 1199 "awkgram.y"
 -#line 1194 "awkgram.y"
 -    { /* func_params = NULL; */ }
++#line 1200 "awkgram.y"
 +    {
 +              (yyvsp[(3) - (3)])->param_count =  (yyvsp[(1) - 
(3)])->lasti->param_count + 1;
 +              (yyval) = list_append((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]));
 +              yyerrok;
 +        }
      break;
  
    case 97:
  /* Line 1792 of yacc.c  */
- #line 1205 "awkgram.y"
 -#line 1200 "awkgram.y"
++#line 1206 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
    case 98:
  /* Line 1792 of yacc.c  */
- #line 1207 "awkgram.y"
 -#line 1202 "awkgram.y"
 -    { (yyval) = (yyvsp[(1) - (1)]); }
++#line 1208 "awkgram.y"
 +    { (yyval) = (yyvsp[(1) - (2)]); }
      break;
  
    case 99:
  /* Line 1792 of yacc.c  */
- #line 1209 "awkgram.y"
 -#line 1207 "awkgram.y"
 -    { (yyval) = NULL; }
++#line 1210 "awkgram.y"
 +    { (yyval) = (yyvsp[(1) - (3)]); }
      break;
  
    case 100:
  /* Line 1792 of yacc.c  */
- #line 1215 "awkgram.y"
 -#line 1209 "awkgram.y"
 -    { (yyval) = (yyvsp[(1) - (1)]); }
++#line 1216 "awkgram.y"
 +    { (yyval) = NULL; }
      break;
  
    case 101:
  /* Line 1792 of yacc.c  */
- #line 1217 "awkgram.y"
 -#line 1214 "awkgram.y"
 -    { (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); }
++#line 1218 "awkgram.y"
 +    { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 102:
  /* Line 1792 of yacc.c  */
- #line 1222 "awkgram.y"
 -#line 1216 "awkgram.y"
 -    {
 -              (yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - 
(3)]));
 -              yyerrok;
 -        }
++#line 1223 "awkgram.y"
 +    { (yyval) = NULL; }
      break;
  
    case 103:
  /* Line 1792 of yacc.c  */
- #line 1224 "awkgram.y"
 -#line 1221 "awkgram.y"
 -    { (yyval) = NULL; }
++#line 1225 "awkgram.y"
 +    { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 104:
  /* Line 1792 of yacc.c  */
- #line 1229 "awkgram.y"
 -#line 1223 "awkgram.y"
 -    { (yyval) = NULL; }
++#line 1230 "awkgram.y"
 +    { (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); }
      break;
  
    case 105:
  /* Line 1792 of yacc.c  */
- #line 1231 "awkgram.y"
 -#line 1225 "awkgram.y"
 -    { (yyval) = NULL; }
++#line 1232 "awkgram.y"
 +    {
 +              (yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - 
(3)]));
 +              yyerrok;
 +        }
      break;
  
    case 106:
  /* Line 1792 of yacc.c  */
- #line 1236 "awkgram.y"
 -#line 1227 "awkgram.y"
++#line 1237 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
    case 107:
  /* Line 1792 of yacc.c  */
- #line 1238 "awkgram.y"
 -#line 1233 "awkgram.y"
 -    {
 -              if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
++#line 1239 "awkgram.y"
 +    { (yyval) = NULL; }
 +    break;
 +
 +  case 108:
 +/* Line 1792 of yacc.c  */
- #line 1240 "awkgram.y"
++#line 1241 "awkgram.y"
 +    { (yyval) = NULL; }
 +    break;
 +
 +  case 109:
 +/* Line 1792 of yacc.c  */
- #line 1242 "awkgram.y"
++#line 1243 "awkgram.y"
 +    { (yyval) = NULL; }
 +    break;
 +
 +  case 110:
 +/* Line 1792 of yacc.c  */
- #line 1248 "awkgram.y"
++#line 1249 "awkgram.y"
 +    {
 +              if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
                        lintwarn_ln((yyvsp[(2) - (3)])->source_line,
                                _("regular expression on right of assignment"));
                (yyval) = mk_assignment((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), 
(yyvsp[(2) - (3)]));
          }
      break;
  
 -  case 108:
 +  case 111:
  /* Line 1792 of yacc.c  */
- #line 1255 "awkgram.y"
 -#line 1240 "awkgram.y"
++#line 1256 "awkgram.y"
      { (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 109:
 +  case 112:
  /* Line 1792 of yacc.c  */
- #line 1257 "awkgram.y"
 -#line 1242 "awkgram.y"
++#line 1258 "awkgram.y"
      { (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 110:
 +  case 113:
  /* Line 1792 of yacc.c  */
- #line 1259 "awkgram.y"
 -#line 1244 "awkgram.y"
++#line 1260 "awkgram.y"
      {
                if ((yyvsp[(1) - (3)])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[(2) - (3)])->source_line,
@@@ -3379,12 -3339,12 +3380,12 @@@
          }
      break;
  
 -  case 111:
 +  case 114:
  /* Line 1792 of yacc.c  */
- #line 1275 "awkgram.y"
 -#line 1260 "awkgram.y"
++#line 1276 "awkgram.y"
      {
                if (do_lint_old)
 -                warning_ln((yyvsp[(2) - (3)])->source_line,
 +                      warning_ln((yyvsp[(2) - (3)])->source_line,
                                _("old awk does not support the keyword `in' 
except after `for'"));
                (yyvsp[(3) - (3)])->nexti->opcode = Op_push_array;
                (yyvsp[(2) - (3)])->opcode = Op_in_array;
@@@ -3393,9 -3353,9 +3394,9 @@@
          }
      break;
  
 -  case 112:
 +  case 115:
  /* Line 1792 of yacc.c  */
- #line 1285 "awkgram.y"
 -#line 1270 "awkgram.y"
++#line 1286 "awkgram.y"
      {
                if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
                        lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@@ -3404,81 -3364,81 +3405,81 @@@
          }
      break;
  
 -  case 113:
 +  case 116:
  /* Line 1792 of yacc.c  */
- #line 1292 "awkgram.y"
 -#line 1277 "awkgram.y"
++#line 1293 "awkgram.y"
      { (yyval) = mk_condition((yyvsp[(1) - (5)]), (yyvsp[(2) - (5)]), 
(yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)])); }
      break;
  
 -  case 114:
 +  case 117:
  /* Line 1792 of yacc.c  */
- #line 1294 "awkgram.y"
 -#line 1279 "awkgram.y"
++#line 1295 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 115:
 +  case 118:
  /* Line 1792 of yacc.c  */
- #line 1299 "awkgram.y"
 -#line 1284 "awkgram.y"
++#line 1300 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 116:
 +  case 119:
  /* Line 1792 of yacc.c  */
- #line 1301 "awkgram.y"
 -#line 1286 "awkgram.y"
++#line 1302 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 117:
 +  case 120:
  /* Line 1792 of yacc.c  */
- #line 1303 "awkgram.y"
 -#line 1288 "awkgram.y"
++#line 1304 "awkgram.y"
      { 
                (yyvsp[(2) - (2)])->opcode = Op_assign_quotient;
                (yyval) = (yyvsp[(2) - (2)]);
          }
      break;
  
 -  case 118:
 +  case 121:
  /* Line 1792 of yacc.c  */
- #line 1311 "awkgram.y"
 -#line 1296 "awkgram.y"
++#line 1312 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 119:
 +  case 122:
  /* Line 1792 of yacc.c  */
- #line 1313 "awkgram.y"
 -#line 1298 "awkgram.y"
++#line 1314 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 120:
 +  case 123:
  /* Line 1792 of yacc.c  */
- #line 1318 "awkgram.y"
 -#line 1303 "awkgram.y"
++#line 1319 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 121:
 +  case 124:
  /* Line 1792 of yacc.c  */
- #line 1320 "awkgram.y"
 -#line 1305 "awkgram.y"
++#line 1321 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 122:
 +  case 125:
  /* Line 1792 of yacc.c  */
- #line 1325 "awkgram.y"
 -#line 1310 "awkgram.y"
++#line 1326 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 123:
 +  case 126:
  /* Line 1792 of yacc.c  */
- #line 1327 "awkgram.y"
 -#line 1312 "awkgram.y"
++#line 1328 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 124:
 +  case 127:
  /* Line 1792 of yacc.c  */
- #line 1329 "awkgram.y"
 -#line 1314 "awkgram.y"
++#line 1330 "awkgram.y"
      {
                int count = 2;
 -              int is_simple_var = FALSE;
 +              bool is_simple_var = false;
  
                if ((yyvsp[(1) - (2)])->lasti->opcode == Op_concat) {
                        /* multiple (> 2) adjacent strings optimization */
@@@ -3524,45 -3487,45 +3525,45 @@@
          }
      break;
  
 -  case 126:
 +  case 129:
  /* Line 1792 of yacc.c  */
- #line 1381 "awkgram.y"
 -#line 1369 "awkgram.y"
++#line 1382 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 127:
 +  case 130:
  /* Line 1792 of yacc.c  */
- #line 1383 "awkgram.y"
 -#line 1371 "awkgram.y"
++#line 1384 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 128:
 +  case 131:
  /* Line 1792 of yacc.c  */
- #line 1385 "awkgram.y"
 -#line 1373 "awkgram.y"
++#line 1386 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 129:
 +  case 132:
  /* Line 1792 of yacc.c  */
- #line 1387 "awkgram.y"
 -#line 1375 "awkgram.y"
++#line 1388 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 130:
 +  case 133:
  /* Line 1792 of yacc.c  */
- #line 1389 "awkgram.y"
 -#line 1377 "awkgram.y"
++#line 1390 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 131:
 +  case 134:
  /* Line 1792 of yacc.c  */
- #line 1391 "awkgram.y"
 -#line 1379 "awkgram.y"
++#line 1392 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 132:
 +  case 135:
  /* Line 1792 of yacc.c  */
- #line 1393 "awkgram.y"
 -#line 1381 "awkgram.y"
++#line 1394 "awkgram.y"
      {
                /*
                 * In BEGINFILE/ENDFILE, allow `getline var < file'
@@@ -3587,27 -3550,27 +3588,27 @@@
          }
      break;
  
 -  case 133:
 +  case 136:
  /* Line 1792 of yacc.c  */
- #line 1416 "awkgram.y"
 -#line 1404 "awkgram.y"
++#line 1417 "awkgram.y"
      {
                (yyvsp[(2) - (2)])->opcode = Op_postincrement;
                (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - 
(2)]));
          }
      break;
  
 -  case 134:
 +  case 137:
  /* Line 1792 of yacc.c  */
- #line 1421 "awkgram.y"
 -#line 1409 "awkgram.y"
++#line 1422 "awkgram.y"
      {
                (yyvsp[(2) - (2)])->opcode = Op_postdecrement;
                (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - 
(2)]));
          }
      break;
  
 -  case 135:
 +  case 138:
  /* Line 1792 of yacc.c  */
- #line 1426 "awkgram.y"
 -#line 1414 "awkgram.y"
++#line 1427 "awkgram.y"
      {
                if (do_lint_old) {
                    warning_ln((yyvsp[(4) - (5)])->source_line,
@@@ -3629,62 -3592,62 +3630,62 @@@
          }
      break;
  
 -  case 136:
 +  case 139:
  /* Line 1792 of yacc.c  */
- #line 1451 "awkgram.y"
 -#line 1439 "awkgram.y"
++#line 1452 "awkgram.y"
      {
                  (yyval) = mk_getline((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]), 
(yyvsp[(1) - (4)]), (yyvsp[(2) - (4)])->redir_type);
                  bcfree((yyvsp[(2) - (4)]));
                }
      break;
  
 -  case 137:
 +  case 140:
  /* Line 1792 of yacc.c  */
- #line 1457 "awkgram.y"
 -#line 1445 "awkgram.y"
++#line 1458 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 138:
 +  case 141:
  /* Line 1792 of yacc.c  */
- #line 1459 "awkgram.y"
 -#line 1447 "awkgram.y"
++#line 1460 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 139:
 +  case 142:
  /* Line 1792 of yacc.c  */
- #line 1461 "awkgram.y"
 -#line 1449 "awkgram.y"
++#line 1462 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 140:
 +  case 143:
  /* Line 1792 of yacc.c  */
- #line 1463 "awkgram.y"
 -#line 1451 "awkgram.y"
++#line 1464 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 141:
 +  case 144:
  /* Line 1792 of yacc.c  */
- #line 1465 "awkgram.y"
 -#line 1453 "awkgram.y"
++#line 1466 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 142:
 +  case 145:
  /* Line 1792 of yacc.c  */
- #line 1467 "awkgram.y"
 -#line 1455 "awkgram.y"
++#line 1468 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 143:
 +  case 146:
  /* Line 1792 of yacc.c  */
- #line 1472 "awkgram.y"
 -#line 1460 "awkgram.y"
++#line 1473 "awkgram.y"
      {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
      break;
  
 -  case 144:
 +  case 147:
  /* Line 1792 of yacc.c  */
- #line 1476 "awkgram.y"
 -#line 1464 "awkgram.y"
++#line 1477 "awkgram.y"
      {
                if ((yyvsp[(2) - (2)])->opcode == Op_match_rec) {
                        (yyvsp[(2) - (2)])->opcode = Op_nomatch;
@@@ -3718,15 -3680,15 +3719,15 @@@
           }
      break;
  
 -  case 145:
 +  case 148:
  /* Line 1792 of yacc.c  */
- #line 1508 "awkgram.y"
 -#line 1495 "awkgram.y"
++#line 1509 "awkgram.y"
      { (yyval) = (yyvsp[(2) - (3)]); }
      break;
  
 -  case 146:
 +  case 149:
  /* Line 1792 of yacc.c  */
- #line 1510 "awkgram.y"
 -#line 1497 "awkgram.y"
++#line 1511 "awkgram.y"
      {
                (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
                if ((yyval) == NULL)
@@@ -3734,9 -3696,9 +3735,9 @@@
          }
      break;
  
 -  case 147:
 +  case 150:
  /* Line 1792 of yacc.c  */
- #line 1516 "awkgram.y"
 -#line 1503 "awkgram.y"
++#line 1517 "awkgram.y"
      {
                (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
                if ((yyval) == NULL)
@@@ -3744,14 -3706,14 +3745,14 @@@
          }
      break;
  
 -  case 148:
 +  case 151:
  /* Line 1792 of yacc.c  */
- #line 1522 "awkgram.y"
 -#line 1509 "awkgram.y"
++#line 1523 "awkgram.y"
      {
 -              static short warned1 = FALSE;
 +              static bool warned = false;
  
 -              if (do_lint && ! warned1) {
 -                      warned1 = TRUE;
 +              if (do_lint && ! warned) {
 +                      warned = true;
                        lintwarn_ln((yyvsp[(1) - (1)])->source_line,
                                _("call of `length' without parentheses is not 
portable"));
                }
@@@ -3761,50 -3723,47 +3762,50 @@@
          }
      break;
  
 -  case 151:
 +  case 154:
  /* Line 1792 of yacc.c  */
- #line 1537 "awkgram.y"
 -#line 1524 "awkgram.y"
++#line 1538 "awkgram.y"
      {
                (yyvsp[(1) - (2)])->opcode = Op_preincrement;
                (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - 
(2)]));
          }
      break;
  
 -  case 152:
 +  case 155:
  /* Line 1792 of yacc.c  */
- #line 1542 "awkgram.y"
 -#line 1529 "awkgram.y"
++#line 1543 "awkgram.y"
      {
                (yyvsp[(1) - (2)])->opcode = Op_predecrement;
                (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - 
(2)]));
          }
      break;
  
 -  case 153:
 +  case 156:
  /* Line 1792 of yacc.c  */
- #line 1547 "awkgram.y"
 -#line 1534 "awkgram.y"
++#line 1548 "awkgram.y"
      {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
      break;
  
 -  case 154:
 +  case 157:
  /* Line 1792 of yacc.c  */
- #line 1551 "awkgram.y"
 -#line 1538 "awkgram.y"
++#line 1552 "awkgram.y"
      {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
      break;
  
 -  case 155:
 +  case 158:
  /* Line 1792 of yacc.c  */
- #line 1555 "awkgram.y"
 -#line 1542 "awkgram.y"
++#line 1556 "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));
 +                      && ((yyvsp[(2) - (2)])->lasti->memory->flags & 
(STRCUR|STRING)) == 0
 +              ) {
 +                      NODE *n = (yyvsp[(2) - (2)])->lasti->memory;
 +                      (void) force_number(n);
 +                      negate_num(n);                  
                        (yyval) = (yyvsp[(2) - (2)]);
                        bcfree((yyvsp[(1) - (2)]));
                } else {
@@@ -3814,9 -3773,9 +3815,9 @@@
          }
      break;
  
 -  case 156:
 +  case 159:
  /* Line 1792 of yacc.c  */
- #line 1570 "awkgram.y"
 -#line 1554 "awkgram.y"
++#line 1571 "awkgram.y"
      {
            /*
             * was: $$ = $2
@@@ -3828,18 -3787,18 +3829,18 @@@
          }
      break;
  
 -  case 157:
 +  case 160:
  /* Line 1792 of yacc.c  */
- #line 1583 "awkgram.y"
 -#line 1567 "awkgram.y"
++#line 1584 "awkgram.y"
      {
                func_use((yyvsp[(1) - (1)])->lasti->func_name, FUNC_USE);
                (yyval) = (yyvsp[(1) - (1)]);
          }
      break;
  
 -  case 158:
 +  case 161:
  /* Line 1792 of yacc.c  */
- #line 1588 "awkgram.y"
 -#line 1572 "awkgram.y"
++#line 1589 "awkgram.y"
      {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@@ -3874,9 -3833,9 +3875,9 @@@
          }
      break;
  
 -  case 159:
 +  case 162:
  /* Line 1792 of yacc.c  */
- #line 1624 "awkgram.y"
 -#line 1608 "awkgram.y"
++#line 1625 "awkgram.y"
      {
                param_sanity((yyvsp[(3) - (4)]));
                (yyvsp[(1) - (4)])->opcode = Op_func_call;
@@@ -3892,47 -3851,47 +3893,47 @@@
          }
      break;
  
 -  case 160:
 +  case 163:
  /* Line 1792 of yacc.c  */
- #line 1641 "awkgram.y"
 -#line 1625 "awkgram.y"
++#line 1642 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 161:
 +  case 164:
  /* Line 1792 of yacc.c  */
- #line 1643 "awkgram.y"
 -#line 1627 "awkgram.y"
++#line 1644 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 162:
 +  case 165:
  /* Line 1792 of yacc.c  */
- #line 1648 "awkgram.y"
 -#line 1632 "awkgram.y"
++#line 1649 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 163:
 +  case 166:
  /* Line 1792 of yacc.c  */
- #line 1650 "awkgram.y"
 -#line 1634 "awkgram.y"
++#line 1651 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (2)]); }
      break;
  
 -  case 164:
 +  case 167:
  /* Line 1792 of yacc.c  */
- #line 1655 "awkgram.y"
 -#line 1639 "awkgram.y"
++#line 1656 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 165:
 +  case 168:
  /* Line 1792 of yacc.c  */
- #line 1657 "awkgram.y"
 -#line 1641 "awkgram.y"
++#line 1658 "awkgram.y"
      {
                (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
      break;
  
 -  case 166:
 +  case 169:
  /* Line 1792 of yacc.c  */
- #line 1664 "awkgram.y"
 -#line 1648 "awkgram.y"
++#line 1665 "awkgram.y"
      {
                INSTRUCTION *ip = (yyvsp[(1) - (1)])->lasti; 
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@@ -3948,9 -3907,9 +3949,9 @@@
          }
      break;
  
 -  case 167:
 +  case 170:
  /* Line 1792 of yacc.c  */
- #line 1681 "awkgram.y"
 -#line 1665 "awkgram.y"
++#line 1682 "awkgram.y"
      {
                INSTRUCTION *t = (yyvsp[(2) - (3)]);
                if ((yyvsp[(2) - (3)]) == NULL) {
@@@ -3966,29 -3925,29 +3967,29 @@@
          }
      break;
  
 -  case 168:
 +  case 171:
  /* Line 1792 of yacc.c  */
- #line 1698 "awkgram.y"
 -#line 1682 "awkgram.y"
++#line 1699 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 169:
 +  case 172:
  /* Line 1792 of yacc.c  */
- #line 1700 "awkgram.y"
 -#line 1684 "awkgram.y"
++#line 1701 "awkgram.y"
      {
                (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
      break;
  
 -  case 170:
 +  case 173:
  /* Line 1792 of yacc.c  */
- #line 1707 "awkgram.y"
 -#line 1691 "awkgram.y"
++#line 1708 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (2)]); }
      break;
  
 -  case 171:
 +  case 174:
  /* Line 1792 of yacc.c  */
- #line 1712 "awkgram.y"
 -#line 1696 "awkgram.y"
++#line 1713 "awkgram.y"
      {
                char *var_name = (yyvsp[(1) - (1)])->lextok;
  
@@@ -3998,20 -3957,24 +3999,20 @@@
          }
      break;
  
 -  case 172:
 +  case 175:
  /* Line 1792 of yacc.c  */
- #line 1720 "awkgram.y"
 -#line 1704 "awkgram.y"
++#line 1721 "awkgram.y"
      {
 -              NODE *n;
 -
                char *arr = (yyvsp[(1) - (2)])->lextok;
 -              if ((n = lookup(arr)) != NULL && ! isarray(n))
 -                      yyerror(_("use of non-array as array"));
 -              (yyvsp[(1) - (2)])->memory = variable(arr, Node_var_new);
 +              (yyvsp[(1) - (2)])->memory = variable((yyvsp[(1) - 
(2)])->source_line, arr, Node_var_new);
                (yyvsp[(1) - (2)])->opcode = Op_push_array;
                (yyval) = list_prepend((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)]));
          }
      break;
  
 -  case 173:
 +  case 176:
  /* Line 1792 of yacc.c  */
- #line 1730 "awkgram.y"
 -#line 1718 "awkgram.y"
++#line 1731 "awkgram.y"
      {
                INSTRUCTION *ip = (yyvsp[(1) - (1)])->nexti;
                if (ip->opcode == Op_push
@@@ -4025,9 -3988,9 +4026,9 @@@
          }
      break;
  
 -  case 174:
 +  case 177:
  /* Line 1792 of yacc.c  */
- #line 1742 "awkgram.y"
 -#line 1730 "awkgram.y"
++#line 1743 "awkgram.y"
      {
                (yyval) = list_append((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)]));
                if ((yyvsp[(3) - (3)]) != NULL)
@@@ -4035,61 -3998,61 +4036,61 @@@
          }
      break;
  
 -  case 175:
 +  case 178:
  /* Line 1792 of yacc.c  */
- #line 1751 "awkgram.y"
 -#line 1739 "awkgram.y"
++#line 1752 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->opcode = Op_postincrement;
          }
      break;
  
 -  case 176:
 +  case 179:
  /* Line 1792 of yacc.c  */
- #line 1755 "awkgram.y"
 -#line 1743 "awkgram.y"
++#line 1756 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->opcode = Op_postdecrement;
          }
      break;
  
 -  case 177:
 +  case 180:
  /* Line 1792 of yacc.c  */
- #line 1758 "awkgram.y"
 -#line 1746 "awkgram.y"
++#line 1759 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 179:
 +  case 182:
  /* Line 1792 of yacc.c  */
- #line 1766 "awkgram.y"
 -#line 1754 "awkgram.y"
++#line 1767 "awkgram.y"
      { yyerrok; }
      break;
  
 -  case 180:
 +  case 183:
  /* Line 1792 of yacc.c  */
- #line 1770 "awkgram.y"
 -#line 1758 "awkgram.y"
++#line 1771 "awkgram.y"
      { yyerrok; }
      break;
  
 -  case 183:
 +  case 186:
  /* Line 1792 of yacc.c  */
- #line 1779 "awkgram.y"
 -#line 1767 "awkgram.y"
++#line 1780 "awkgram.y"
      { yyerrok; }
      break;
  
 -  case 184:
 +  case 187:
  /* Line 1792 of yacc.c  */
- #line 1783 "awkgram.y"
 -#line 1771 "awkgram.y"
++#line 1784 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); yyerrok; }
      break;
  
 -  case 185:
 +  case 188:
  /* Line 1792 of yacc.c  */
- #line 1787 "awkgram.y"
 -#line 1775 "awkgram.y"
++#line 1788 "awkgram.y"
      { yyerrok; }
      break;
  
  
  /* Line 1792 of yacc.c  */
- #line 4105 "awkgram.c"
 -#line 4068 "awkgram.c"
++#line 4106 "awkgram.c"
        default: break;
      }
    /* User semantic actions sometimes alter yychar, and that requires
@@@ -4321,7 -4284,7 +4322,7 @@@ yyreturn
  
  
  /* Line 2055 of yacc.c  */
- #line 1789 "awkgram.y"
 -#line 1777 "awkgram.y"
++#line 1790 "awkgram.y"
  
  
  struct token {
@@@ -4363,90 -4325,81 +4364,90 @@@ tokcompare(const void *l, const void *r
   * Function pointers come from declarations in awk.h.
   */
  
 +#ifdef HAVE_MPFR
 +#define MPF(F) do_mpfr_##F
 +#else
 +#define MPF(F) 0
 +#endif
 +
  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},
 +{"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
 -{"adump",     Op_builtin,    LEX_BUILTIN,     GAWKX|A(1),     do_adump},
 +{"adump",     Op_builtin,    LEX_BUILTIN,     GAWKX|A(1)|A(2),        
do_adump,       0},
  #endif
 -{"and",               Op_builtin,    LEX_BUILTIN,     GAWKX|A(2),     do_and},
 -{"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,   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,    0,              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},
 +{"and",               Op_builtin,    LEX_BUILTIN,     GAWKX,          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)},
 +#ifdef DYNAMIC
 +{"extension", Op_builtin,      LEX_BUILTIN,   GAWKX|A(1)|A(2)|A(3),   do_ext, 
0},
 +#endif
 +{"fflush",    Op_builtin,      LEX_BUILTIN,   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},
++{"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,    0,              0,      0},
 +{"or",                Op_builtin,    LEX_BUILTIN,     GAWKX,          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)},
  #if defined(GAWKDEBUG) || defined(ARRAYDEBUG) /* || ... */
 -{"stopme",    Op_builtin,    LEX_BUILTIN,     GAWKX|A(0),     stopme},
 +{"stopme",    Op_builtin,     LEX_BUILTIN,    GAWKX|A(0),     stopme,         
0},
  #endif
 -{"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},
 +{"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,          do_xor, 
MPF(xor)},
  };
  
  #if MBS_SUPPORT
@@@ -6689,122 -6734,106 +6690,122 @@@ mk_function(INSTRUCTION *fi, INSTRUCTIO
        /* add an implicit return at end;
         * also used by 'return' command in debugger
         */
 -      
 +
        (void) list_append(def, instruction(Op_push_i));
 -      def->lasti->memory = Nnull_string;
 +      def->lasti->memory = dupnode(Nnull_string);
        (void) list_append(def, instruction(Op_K_return));
  
 -      if (do_profiling)
 +      if (do_pretty_print)
                (void) list_prepend(def, instruction(Op_exec_count));
  
 -      /* func->opcode is Op_func */
 -      (func + 1)->firsti = def->nexti;
 -      (func + 1)->lasti = def->lasti;
 -      (func + 2)->first_line = func->source_line;
 -      (func + 2)->last_line = lastline;
 -
 -      func->nexti = def->nexti;
 +      /* fi->opcode = Op_func */
 +      (fi + 1)->firsti = def->nexti;
 +      (fi + 1)->lasti = def->lasti;
 +      (fi + 2)->first_line = fi->source_line;
 +      (fi + 2)->last_line = lastline;
 +      fi->nexti = def->nexti;
        bcfree(def);
  
 -      (void) list_append(rule_list, func + 1);        /* debugging */
 -
 -      /* install the function */
 -      thisfunc = mk_symbol(Node_func, params);
 -      (void) install_symbol(fname, thisfunc);
 -      thisfunc->code_ptr = func;
 -      func->func_body = thisfunc;
 -
 -      for (n = params->rnode; n != NULL; n = n->rnode)
 -              pcount++;
 -
 -      if (pcount != 0) {
 -              emalloc(pnames, char **, (pcount + 1) * sizeof(char *), 
"func_install");
 -              for (i = 0, n = params->rnode; i < pcount; i++, n = n->rnode)
 -                      pnames[i] = n->param;
 -              pnames[pcount] = NULL;
 -      }
 -      thisfunc->parmlist = pnames;
 +      (void) list_append(rule_list, fi + 1);  /* debugging */
  
        /* update lint table info */
 -      func_use(fname, FUNC_DEFINE);
 -
 -      func_count++;   /* used in profiler / pretty printer */
 +      func_use(thisfunc->vname, FUNC_DEFINE);
  
 -remove_params:
        /* remove params from symbol table */
 -      pop_params(params->rnode);
 -      return 0;
 +      remove_params(thisfunc);
 +      return fi;
  }
  
 -/* remove_symbol --- remove a variable from the symbol table */
 +/* 
 + * install_function:
 + * install function name in the symbol table.
 + * Extra work, build up and install a list of the parameter names.
 + */
  
 -NODE *
 -remove_symbol(char *name)
 +static int
 +install_function(char *fname, INSTRUCTION *fi, INSTRUCTION *plist)
  {
 -      NODE *bucket, **save;
 -      size_t len;
 +      NODE *r, *f;
 +      int pcount = 0;
  
 -      len = strlen(name);
 -      save = &(variables[hash(name, len, (unsigned long) HASHSIZE, NULL)]);
 -      for (bucket = *save; bucket != NULL; bucket = bucket->hnext) {
 -              if (len == bucket->hlength && strncmp(bucket->hname, name, len) 
== 0) {
 -                      var_count--;
 -                      *save = bucket->hnext;
 -                      return bucket;
 -              }
 -              save = &(bucket->hnext);
 +      r = lookup(fname);
-       if (r != NULL) {
++      if (r != NULL || is_deferred_variable(fname)) {
 +              error_ln(fi->source_line, _("function name `%s' previously 
defined"), fname);
 +              return -1;
        }
 -      return NULL;
 +
 +      if (plist != NULL)
 +              pcount = plist->lasti->param_count + 1;
 +      f = install_symbol(fname, Node_func);
 +      fi->func_body = f;
 +      f->param_cnt = pcount;
 +      f->code_ptr = fi;
 +      f->fparms = NULL; 
 +      if (pcount > 0) {
 +              char **pnames;
 +              pnames = check_params(fname, pcount, plist);    /* frees plist 
*/
 +              f->fparms = make_params(pnames, pcount);
 +              efree(pnames);
 +              install_params(f);
 +      }
 +      return 0;
  }
  
 -/* pop_params --- remove list of function parameters from symbol table */
  
 -/*
 - * pop parameters out of the symbol table. do this in reverse order to
 - * avoid reading freed memory if there were duplicated parameters.
 +/* check_params --- build a list of function parameter names after
 + *    making sure that the names are valid and there are no duplicates.
   */
 -static void
 -pop_params(NODE *params)
 +
 +static char **
 +check_params(char *fname, int pcount, INSTRUCTION *list)
  {
 -      NODE *hp;
 -      if (params == NULL)
 -              return;
 -      pop_params(params->rnode);
 -      hp = remove_symbol(params->param);
 -      if (hp != NULL)
 -              freenode(hp);
 -}
 +      INSTRUCTION *p, *np;
 +      int i, j;
 +      char *name;
 +      char **pnames;
  
 -/* make_param --- make NAME into a function parameter */
 +      assert(pcount > 0);
  
 -static NODE *
 -make_param(char *name)
 -{
 -      NODE *r;
 +      emalloc(pnames, char **, pcount * sizeof(char *), "check_params");
 +
 +      for (i = 0, p = list->nexti; p != NULL; i++, p = np) {
 +              np = p->nexti;
 +              name = p->lextok;
 +              p->lextok = NULL;
 +
 +              if (strcmp(name, fname) == 0) {
 +                      /* check for function foo(foo) { ... }.  bleah. */
 +                      error_ln(p->source_line,
 +                              _("function `%s': can't use function name as 
parameter name"), fname);
 +              } else if (is_std_var(name)) {
 +                      error_ln(p->source_line,
 +                              _("function `%s': can't use special variable 
`%s' as a function parameter"),
 +                                      fname, name);
 +              }
 +
 +              /* check for duplicate parameters */
 +              for (j = 0; j < i; j++) {
 +                      if (strcmp(name, pnames[j]) == 0) {
 +                              error_ln(p->source_line,
 +                                      _("function `%s': parameter #%d, `%s', 
duplicates parameter #%d"),
 +                                      fname, i + 1, name, j + 1);
 +                      }
 +              }
  
 -      getnode(r);
 -      r->type = Node_param_list;
 -      r->rnode = NULL;
 -      r->param_cnt = param_counter++;
 -      return (install_symbol(name, r));
 +              pnames[i] = name;
 +              bcfree(p);
 +      }
 +      bcfree(list);
 +
 +      return pnames; 
  }
  
 +
 +#ifdef HASHSIZE
 +undef HASHSIZE
 +#endif
 +#define HASHSIZE 1021
 + 
  static struct fdesc {
        char *name;
        short used;
@@@ -6958,6 -7035,19 +6959,19 @@@ register_deferred_variable(const char *
        deferred_variables = dv;
  }
  
+ /* is_deferred_variable --- check if NAME is a deferred variable */
+ 
 -static int
++static bool
+ is_deferred_variable(const char *name)
+ {
+       struct deferred_variable *dv;
+       for (dv = deferred_variables; dv != NULL; dv = dv->next)
+               if (strcmp(name, dv->name) == 0)
 -                      return TRUE;
 -      return FALSE;
++                      return true;
++      return false;
+ }
+ 
+ 
  /* variable --- make sure NAME is in the symbol table */
  
  NODE *
diff --cc awkgram.y
index b1574c8,dd8cf87..6a707cb
--- a/awkgram.y
+++ b/awkgram.y
@@@ -53,10 -54,11 +53,11 @@@ static int isnoeffect(OPCODE type)
  static INSTRUCTION *make_assignable(INSTRUCTION *ip);
  static void dumpintlstr(const char *str, size_t len);
  static void dumpintlstr2(const char *str1, size_t len1, const char *str2, 
size_t len2);
 -static int isarray(NODE *n);
  static int include_source(INSTRUCTION *file);
 +static int load_library(INSTRUCTION *file);
  static void next_sourcefile(void);
  static char *tokexpand(void);
 -static int is_deferred_variable(const char *name);
++static bool is_deferred_variable(const char *name);
  
  #define instruction(t)        bcalloc(t, 1, 0)
  
@@@ -1827,90 -1814,81 +1828,90 @@@ tokcompare(const void *l, const void *r
   * Function pointers come from declarations in awk.h.
   */
  
 +#ifdef HAVE_MPFR
 +#define MPF(F) do_mpfr_##F
 +#else
 +#define MPF(F) 0
 +#endif
 +
  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},
 +{"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
 -{"adump",     Op_builtin,    LEX_BUILTIN,     GAWKX|A(1),     do_adump},
 +{"adump",     Op_builtin,    LEX_BUILTIN,     GAWKX|A(1)|A(2),        
do_adump,       0},
  #endif
 -{"and",               Op_builtin,    LEX_BUILTIN,     GAWKX|A(2),     do_and},
 -{"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,   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,    0,              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},
 +{"and",               Op_builtin,    LEX_BUILTIN,     GAWKX,          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)},
 +#ifdef DYNAMIC
 +{"extension", Op_builtin,      LEX_BUILTIN,   GAWKX|A(1)|A(2)|A(3),   do_ext, 
0},
 +#endif
 +{"fflush",    Op_builtin,      LEX_BUILTIN,   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},
++{"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,    0,              0,      0},
 +{"or",                Op_builtin,    LEX_BUILTIN,     GAWKX,          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)},
  #if defined(GAWKDEBUG) || defined(ARRAYDEBUG) /* || ... */
 -{"stopme",    Op_builtin,    LEX_BUILTIN,     GAWKX|A(0),     stopme},
 +{"stopme",    Op_builtin,     LEX_BUILTIN,    GAWKX|A(0),     stopme,         
0},
  #endif
 -{"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},
 +{"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,          do_xor, 
MPF(xor)},
  };
  
  #if MBS_SUPPORT
@@@ -4153,122 -4223,106 +4154,122 @@@ mk_function(INSTRUCTION *fi, INSTRUCTIO
        /* add an implicit return at end;
         * also used by 'return' command in debugger
         */
 -      
 +
        (void) list_append(def, instruction(Op_push_i));
 -      def->lasti->memory = Nnull_string;
 +      def->lasti->memory = dupnode(Nnull_string);
        (void) list_append(def, instruction(Op_K_return));
  
 -      if (do_profiling)
 +      if (do_pretty_print)
                (void) list_prepend(def, instruction(Op_exec_count));
  
 -      /* func->opcode is Op_func */
 -      (func + 1)->firsti = def->nexti;
 -      (func + 1)->lasti = def->lasti;
 -      (func + 2)->first_line = func->source_line;
 -      (func + 2)->last_line = lastline;
 -
 -      func->nexti = def->nexti;
 +      /* fi->opcode = Op_func */
 +      (fi + 1)->firsti = def->nexti;
 +      (fi + 1)->lasti = def->lasti;
 +      (fi + 2)->first_line = fi->source_line;
 +      (fi + 2)->last_line = lastline;
 +      fi->nexti = def->nexti;
        bcfree(def);
  
 -      (void) list_append(rule_list, func + 1);        /* debugging */
 -
 -      /* install the function */
 -      thisfunc = mk_symbol(Node_func, params);
 -      (void) install_symbol(fname, thisfunc);
 -      thisfunc->code_ptr = func;
 -      func->func_body = thisfunc;
 -
 -      for (n = params->rnode; n != NULL; n = n->rnode)
 -              pcount++;
 -
 -      if (pcount != 0) {
 -              emalloc(pnames, char **, (pcount + 1) * sizeof(char *), 
"func_install");
 -              for (i = 0, n = params->rnode; i < pcount; i++, n = n->rnode)
 -                      pnames[i] = n->param;
 -              pnames[pcount] = NULL;
 -      }
 -      thisfunc->parmlist = pnames;
 +      (void) list_append(rule_list, fi + 1);  /* debugging */
  
        /* update lint table info */
 -      func_use(fname, FUNC_DEFINE);
 +      func_use(thisfunc->vname, FUNC_DEFINE);
  
 -      func_count++;   /* used in profiler / pretty printer */
 -
 -remove_params:
        /* remove params from symbol table */
 -      pop_params(params->rnode);
 -      return 0;
 +      remove_params(thisfunc);
 +      return fi;
  }
  
 -/* remove_symbol --- remove a variable from the symbol table */
 +/* 
 + * install_function:
 + * install function name in the symbol table.
 + * Extra work, build up and install a list of the parameter names.
 + */
  
 -NODE *
 -remove_symbol(char *name)
 +static int
 +install_function(char *fname, INSTRUCTION *fi, INSTRUCTION *plist)
  {
 -      NODE *bucket, **save;
 -      size_t len;
 +      NODE *r, *f;
 +      int pcount = 0;
  
 -      len = strlen(name);
 -      save = &(variables[hash(name, len, (unsigned long) HASHSIZE, NULL)]);
 -      for (bucket = *save; bucket != NULL; bucket = bucket->hnext) {
 -              if (len == bucket->hlength && strncmp(bucket->hname, name, len) 
== 0) {
 -                      var_count--;
 -                      *save = bucket->hnext;
 -                      return bucket;
 -              }
 -              save = &(bucket->hnext);
 +      r = lookup(fname);
-       if (r != NULL) {
++      if (r != NULL || is_deferred_variable(fname)) {
 +              error_ln(fi->source_line, _("function name `%s' previously 
defined"), fname);
 +              return -1;
        }
 -      return NULL;
 +
 +      if (plist != NULL)
 +              pcount = plist->lasti->param_count + 1;
 +      f = install_symbol(fname, Node_func);
 +      fi->func_body = f;
 +      f->param_cnt = pcount;
 +      f->code_ptr = fi;
 +      f->fparms = NULL; 
 +      if (pcount > 0) {
 +              char **pnames;
 +              pnames = check_params(fname, pcount, plist);    /* frees plist 
*/
 +              f->fparms = make_params(pnames, pcount);
 +              efree(pnames);
 +              install_params(f);
 +      }
 +      return 0;
  }
  
 -/* pop_params --- remove list of function parameters from symbol table */
  
 -/*
 - * pop parameters out of the symbol table. do this in reverse order to
 - * avoid reading freed memory if there were duplicated parameters.
 +/* check_params --- build a list of function parameter names after
 + *    making sure that the names are valid and there are no duplicates.
   */
 -static void
 -pop_params(NODE *params)
 +
 +static char **
 +check_params(char *fname, int pcount, INSTRUCTION *list)
  {
 -      NODE *hp;
 -      if (params == NULL)
 -              return;
 -      pop_params(params->rnode);
 -      hp = remove_symbol(params->param);
 -      if (hp != NULL)
 -              freenode(hp);
 -}
 +      INSTRUCTION *p, *np;
 +      int i, j;
 +      char *name;
 +      char **pnames;
  
 -/* make_param --- make NAME into a function parameter */
 +      assert(pcount > 0);
  
 -static NODE *
 -make_param(char *name)
 -{
 -      NODE *r;
 +      emalloc(pnames, char **, pcount * sizeof(char *), "check_params");
 +
 +      for (i = 0, p = list->nexti; p != NULL; i++, p = np) {
 +              np = p->nexti;
 +              name = p->lextok;
 +              p->lextok = NULL;
 +
 +              if (strcmp(name, fname) == 0) {
 +                      /* check for function foo(foo) { ... }.  bleah. */
 +                      error_ln(p->source_line,
 +                              _("function `%s': can't use function name as 
parameter name"), fname);
 +              } else if (is_std_var(name)) {
 +                      error_ln(p->source_line,
 +                              _("function `%s': can't use special variable 
`%s' as a function parameter"),
 +                                      fname, name);
 +              }
  
 -      getnode(r);
 -      r->type = Node_param_list;
 -      r->rnode = NULL;
 -      r->param_cnt = param_counter++;
 -      return (install_symbol(name, r));
 +              /* check for duplicate parameters */
 +              for (j = 0; j < i; j++) {
 +                      if (strcmp(name, pnames[j]) == 0) {
 +                              error_ln(p->source_line,
 +                                      _("function `%s': parameter #%d, `%s', 
duplicates parameter #%d"),
 +                                      fname, i + 1, name, j + 1);
 +                      }
 +              }
 +
 +              pnames[i] = name;
 +              bcfree(p);
 +      }
 +      bcfree(list);
 +
 +      return pnames; 
  }
  
 +
 +#ifdef HASHSIZE
 +undef HASHSIZE
 +#endif
 +#define HASHSIZE 1021
 + 
  static struct fdesc {
        char *name;
        short used;
@@@ -4422,6 -4524,19 +4423,19 @@@ register_deferred_variable(const char *
        deferred_variables = dv;
  }
  
+ /* is_deferred_variable --- check if NAME is a deferred variable */
+ 
 -static int
++static bool
+ is_deferred_variable(const char *name)
+ {
+       struct deferred_variable *dv;
+       for (dv = deferred_variables; dv != NULL; dv = dv->next)
+               if (strcmp(name, dv->name) == 0)
 -                      return TRUE;
 -      return FALSE;
++                      return true;
++      return false;
+ }
+ 
+ 
  /* variable --- make sure NAME is in the symbol table */
  
  NODE *
diff --cc doc/ChangeLog
index 0e0b806,e9503c6..b555267
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@@ -1,12 -1,12 +1,21 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * gawk.texi: Remove an incorrect comment.
+       * awkcard.in: Bump patch level.
+ 
 +2012-12-18         Arnold D. Robbins     <address@hidden>
 +
 +      * gawk.texi (Input Parsers): Add info on read_func.
 +
 +2012-12-16         Arnold D. Robbins     <address@hidden>
 +
 +      * gawk.texi: Move design decisions on new API to appendix C.
 +      Move section on old extensions to last in the same appendix.
 +
  2012-12-15         Arnold D. Robbins     <address@hidden>
  
        * macros: Update to GPL Version 3 and add copyright year.
diff --cc extension/ChangeLog
index da24b78,83d208f..73b64fb
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@@ -1,570 -1,7 +1,574 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
 +2012-12-19         Arnold D. Robbins     <address@hidden>
 +
 +      * testext.c (test_indirect_vars): New test and awk code.
 +
 +2012-12-02         Arnold D. Robbins     <address@hidden>
 +
 +      * Makefile.am (EXTRA_DIST): Add README.fts.
 +
 +2012-11-30         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c readdir.c, revoutput.c, revtwoway.c, rwarray.c,
 +      rwarray0.c, testext.c: Use awk_true and awk_false instead of 1 and 0.
 +
 +2012-11-26         Arnold D. Robbins     <address@hidden>
 +
 +      * bindarr.c, fileop.c, sparr.c: Make them compile.
 +      * steps: Reinstated and updated.
 +      * testsparr.awk: Add call to extension().
 +
 +2011-05-03         John Haque     <address@hidden>
 +
 +      * fileop.c, record.awk, testrecord.sh: New files.
 +      * steps: Updated.
 +
 +2011-05-02         John Haque     <address@hidden>
 +
 +      * bindarr.c, dbarray.awk, testdbarray.awk: New files.
 +      * steps: Updated.
 +
 +2011-04-24         John Haque     <address@hidden>
 +
 +      * spec_array.c, spec_array.h, sparr.c, testsparr.awk: New files.
 +      * steps: Updated.
 +
 +2012-11-21         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (do_stat): Optional third argument indicates to
 +      use stat(2) instead of lstat(2).
 +      * filefuncs.3am: Document same.
 +
 +2012-11-19         Arnold D. Robbins     <address@hidden>
 +
 +      * readdir.c: Simplify code to always print file type and not
 +      use stat().
 +      * readdir.3am: Document same.
 +
 +2012-11-16         Arnold D. Robbins     <address@hidden>
 +
 +      * testext.c: In awk code, use printf(...) instead of the form
 +      without parentheses everywhere. This makes Nelson happy.
 +
 +2012-11-14         Andrew J. Schorr     <address@hidden>
 +
 +      Bug fix for filesystems without d_type in directory entry.
 +
 +      * readdir.c (open_directory_t): Add more fields for path.
 +      (ftype): Take open_directory_t argument. Build the full path
 +      for lstat. Adjust calls.
 +      (dir_close): Free the storage.
 +      (dir_take_control_of): Allocate storage for the path.
 +
 +2012-11-06         Arnold D. Robbins     <address@hidden>
 +
 +      * configure.ac: Add check for $srcdir/.developing as in
 +      the main directory's configure.ac.
 +
 +2012-11-04         Arnold D. Robbins     <address@hidden>
 +
 +      * rwarray.3am: Minor edits.
 +
 +2012-10-28         Arnold D. Robbins     <address@hidden>
 +
 +      * Makefile.am (dist_man_MANS): Update the list.
 +
 +2012-10-26         Arnold D. Robbins     <address@hidden>
 +
 +      * revtwoway.3am: Clean up example.
 +      * revtwoway.c: Minor cleanup (add translation calls).
 +
 +2012-10-24         Arnold D. Robbins     <address@hidden>
 +
 +      * revtwoway.3am: New file.
 +
 +2012-10-21         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (do_stat): Always clear the array.
 +
 +2012-10-14         Arnold D. Robbins     <address@hidden>
 +
 +      * readdir.c, revoutput.c, revtwoway.c: Adjust for name change
 +      of IOBUF_PUBLIC to awk_input_buf_t. Additional sanitizing in
 +      revoutput.c to use `revoutput' everywhere instead of `revout'.
 +      * revoutput.3am: New file.
 +      * filefuncs.3am, fnmatch.3am, fork.3am, ordchr.3am, readdir.3am,
 +      readfile.3am, rwarray.3am, time.3am: Add ref to revoutput(3am).
 +
 +2012-10-11         Arnold D. Robbins     <address@hidden>
 +
 +      * textext.c (try_modify_environ): Save array cookie in a separate
 +      variable so it isn't clobbered. Thanks to Andrew Schorr, by way
 +      of valgrind, for finding the bug.
 +
 +2012-09-14         Arnold D. Robbins     <address@hidden>
 +
 +      * testext.c (try_modify_environ): New function and test.
 +      (var_test): Modified ARGC test, added additional.
 +      (test_scalar_reserved): New function and test.
 +      (try_modify_environ): Don't print count of ENVIRON elements.
 +
 +2012-09-13         Dave Pitts            <address@hidden>
 +
 +      * gawkfts.c: Add defines and ifdefs for z/OS.
 +      * gawkfts.h: Add defines and ifdefs for z/OS. Fix // comments.
 +      * readdir.c (dir_get_record): Adjust sprintf format for z/OS.
 +      * rwarray.c: Add defines and ifdefs for z/OS. Fix // comments.
 +
 +2012-09-11         Arnold D. Robbins     <address@hidden>
 +
 +      * readdir.c (do_readdir_do_ftype): Set ERRNO for bad arguments.
 +      * readdir.3a: Document same, minor fixes.
 +
 +2012-09-07         Akim Demaille         <address@hidden>
 +
 +      * extension/gawkfts.h (__THROW): Define if it is not.
 +      Copied from getopt.h.
 +      * extension/gawkfts.c (fts_alloc): Since FTSENT.fts_statp is
 +      defined as a struct stat*, use that type for casts instead of
 +      the undefined __fts_stat_t type.
 +
 +2012-09-07         Arnold D. Robbins     <address@hidden>
 +
 +      * readdir.c, readdir.3am: Change argument to readdir_do_ftype()
 +      to be a string. Update the doc accordingly.
 +      * gawkfts.h: Add explanatory comment before defines of API
 +      names towards the end. Thanks to Eli Zaretskii for the suggestion.
 +
 +2012-08-28         Andrew J. Schorr     <address@hidden>
 +
 +      * readdir.c: Have three states, 0, 1, 2 for never, fallback, and
 +      always.
 +      * readdir.3am: Adjust appropriately.
 +
 +2012-08-29         Arnold D. Robbins     <address@hidden>
 +
 +      Make fts work everywhere by using our own source.
 +
 +      * README.fts, gawkfts.c, gawkfts.h, fts.3: New files.
 +      * Makefile.am (filefuncs_la_SOURCES, EXTRA_DIST): Adjust.
 +      * configure.ac: Remove check for fts.h and fts_XXX functions.
 +      * filefuncs.c: Remove various ifdefs, change includes around.
 +
 +2012-08-28         Andrew J. Schorr     <address@hidden>
 +
 +      * Makefile.am: Rename man_MANS to dist_man_MANS to include the man
 +      pages in the distribution tarball.
 +
 +2012-08-26         Arnold D. Robbins     <address@hidden>
 +
 +      * configure.ac (AC_SYS_LARGEFILE): Added. Needed for consistency
 +      with gawk, to get the same size struct stat everywhere.
 +      * filefuncs.c, fnmatch.c, fork.c, ordchr.c, readdir.c, readfile.c,
 +      revoutput.c, revtwoway.c, rwarray.c, rwarray0.c, testext.c,
 +      time.c: Move include of config.h to top (or add it!)
 +
 +2012-08-24         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c, fnmatch.c, fork.c, ordchr.c, readdir.c, readfile.c,
 +      revoutput.c, revtwoway.c, rwarray.c, rwarray0.c, testext.c,
 +      time.c: Add ext_version string.
 +
 +2012-08-23         Arnold D. Robbins     <address@hidden>
 +
 +      * revoutwoway.c: New testing extension for two way processor.
 +      * Makefile.am: Build revtwoway extension.
 +      * readdir.c: Fix to fall back to stat if d_type is 'u' and
 +      do_ftype is one.
 +      * readdir.3am: Revise doc that some GNU/Linux filesystems
 +      don't support d_type.
 +
 +2012-08-22         Arnold D. Robbins     <address@hidden>
 +
 +      * revoutput.c: New testing extension for output wrapper.
 +      * Makefile.am: Build revoutput extension.
 +
 +2012-08-08         Arnold D. Robbins     <address@hidden>
 +
 +      Add fts() to filefuncs.
 +
 +      * filefuncs.3am: Update doc.
 +      * filefuncs.c: Lots of new code.
 +      * configure.ac: Add checks for appropriate headers and functions.
 +      * stack.h, stack.c: New files.
 +      * Makefile.am: Update list of files.
 +
 +      * readdir.c (dir_can_take_file): Use members in iobuf.
 +      * rwarray.c (do_writea): Initialize fp to NULL.
 +
 +      * filefuncs.3am, fnmatch.3am, fork.3am, ordchr.3am, readdir.3am,
 +      readfile.3am, rwarray.3am, time.3am: Updated.
 +
 +2012-08-03         Andrew J. Schorr     <address@hidden>
 +
 +      * readdir.c (dir_get_record): Fix for systems where ino_t is
 +      64 bit even on 32 bit systems (cygwin).
 +
 +2012-08-01         Arnold D. Robbins     <address@hidden>
 +
 +      * Makefile.am (man_MANS): Add man page files so that they
 +      get installed.
 +      * rwarray.3am: New file.
 +      * fnmatch.3am, fork.3am, time.3am: Revised.
 +
 +2012-07-31         Arnold D. Robbins     <address@hidden>
 +
 +      * rwarray0.c: Renamed from rwarray.c.
 +      * rwarray.c: New file using stdio instead of system calls,
 +      works on cygwin.
 +
 +2012-07-30         Arnold D. Robbins     <address@hidden>
 +
 +      * ABOUT-NLS: New file.
 +      * Makefile.am, configure.ac: Revised for gettext.
 +
 +      * fork.3am, readdir.3am, time.3am: New files.
 +      * filefuncs.3am, fnmatch.3am, ordchr.3am, readfile.3am: Revised.
 +
 +2012-07-29         Andrew J. Schorr     <address@hidden>
 +
 +      * readdir.c (dir_get_record): Adjust to new interface for RT.
 +
 +2012-07-29         Arnold D. Robbins     <address@hidden>
 +
 +      * readdir.c (dir_take_control_of): Print error message and
 +      set ERRNO if failure. Adjust count of max digits.
 +
 +2012-07-27         Andrew J. Schorr     <address@hidden>
 +
 +      * Makefile.am (*_la_LIBADD): Need to link with $(LIBINTL) for
 +      gettext to work on platforms where it is not included in libc.
 +
 +2012-07-27         Andrew J. Schorr     <address@hidden>
 +
 +      * readdir.c (dir_get_record): Need to set errno to 0 before calling
 +      readdir, since readdir sets errno only on failure, not on EOF.
 +
 +2012-07-27         Andrew J. Schorr     <address@hidden>
 +
 +      * readdir.c (dir_get_record): If readdir fails, set errcode.  Otherwise,
 +      don't bother to set errcode.
 +
 +2012-07-27         Arnold D. Robbins     <address@hidden>
 +
 +      * readdir.c (dir_take_control_of): Fix typo for case where
 +      we don't have fopendir (e.g., Mac OS X 10.5).
 +
 +2012-07-26         Arnold D. Robbins     <address@hidden>
 +
 +      * configure.ac: Extremely crude hack to get the value of
 +      ENABLE_NLS so that gettext will work in extensions.
 +
 +      * readdir.c (dir_get_record): Call set_RT.
 +      (dir_can_take_file): Make parameter const.
 +
 +      * testext.c (valrep2str): Add AWK_VALUE_COOKIE.
 +
 +      * readdir.c: Add readdir_do_ftype function for systems without
 +      dirent->d_type.  Clean up buffer handling.
 +
 +2012-07-26         Andrew J. Schorr     <address@hidden>
 +
 +      * readdir.c (dir_get_record): No need to set *errcode to 0.
 +      (dir_take_control_of): Remove some paranoia -- no need to test for
 +      NULL iobuf, and no need to check dir_can_take_file again.
 +
 +2012-07-25         Arnold D. Robbins     <address@hidden>
 +
 +      * readdir.c: New file.
 +      * Makefile.am (readdir): New extension.
 +
 +      * time.c: Fix all calls to update_ERRNO_string.
 +
 +      * filefuncs.c, fnmatch.c, fork.c, ordchr.c, readfile.c, rwarray.c,
 +      time.c: Translate strings.
 +
 +2012-07-20         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.3am, fnmatch.3am, ordchr.3am, readfile.3am:
 +      new files.
 +
 +2012-07-16         Arnold D. Robbins     <address@hidden>
 +
 +      * fnmatch.c: Simplify flag table.
 +
 +2012-07-15         Arnold D. Robbins     <address@hidden>
 +
 +      * testext.c (test_scalar): New function and new tests.
 +      (init_testext): Add a new variable.
 +
 +2012-07-13         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (fill_stat_array): New function to do the work
 +      for stat.
 +      (do_stat): Call it.
 +
 +2012-07-12         Arnold D. Robbins     <address@hidden>
 +
 +      * fnmatch.c: New file.
 +      * Makefile.am: Build fnmatch extension.
 +      * configure.ac: Look for fnmatch.h and fnmatch function.
 +
 +      * fnmatch.c (init_fnmatch): Use sym_constant for FNM_NOMATCH.
 +      * testext.c (dl_load): Use sym_constant for answer_num.
 +
 +      * testext.c (init_testext): Move extra code to here.
 +      (init_func): Change to point to init_testext.
 +      (dl_load): Deleted.
 +      (dl_load_func): Use the macro.
 +
 +2012-07-11         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (array_set, do_stat): Use make_const_string.
 +      * fork.c (array_set_numeric): Ditto.
 +      * ordchr.c (do_chr): Ditto.
 +      * readfile.c (do_readfile): Use make_null_string, make_malloced_string.
 +      * rwarray.c (read_elem): Ditto.
 +      * testext.c (valrep2str): Add case for AWK_SCALAR.
 +      (test_array_elem): Duplicate strings coming from gawk before passing
 +      them back in.
 +
 +      All files: Add null 'init_func' file pointer for dl_load_func
 +      to work.
 +
 +2012-07-09         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (do_readfile): Return "" and set ERRNO on error
 +      instead of returning -1. Per suggestion from Andrew Schorr.
 +
 +2012-07-08         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (array_set): Adjust for change in set_array_element API.
 +      * fork.c (array_set_numeric): Ditto.
 +      * rwarray.c (read_array): Use set_array_element_by_elem.
 +      (read_value): Add a cast to silence a compiler warning.
 +      * testext.c (test_array_elem): Adjust for change in set_array_element
 +      API.
 +      (fill_in_array): Ditto. Change parameter name to new_array.
 +
 +2012-06-29         Arnold D. Robbins     <address@hidden>
 +
 +      * ordchr.c (do_ord, do_chr): Improve argument checking and
 +      lint messages.
 +
 +2012-06-25         Arnold D. Robbins     <address@hidden>
 +
 +      * Makefile.am (EXTRA_DIST): Remove *.awk.
 +      * rwarray.awk: Moved to test directory.
 +
 +2012-06-24         Arnold D. Robbins     <address@hidden>
 +
 +      * Makefile.am: Enable rwarray extension.
 +      * rwarray.c: Redone to use new API.
 +      * rwarray.awk: Revamped for new version.
 +
 +2012-06-21         Arnold D. Robbins     <address@hidden>
 +
 +      * testext.c (test_array_elem): Add a subarray.
 +      (test_array_flatten): Removed: Tests done elsewhere.
 +
 +2012-06-20         Arnold D. Robbins     <address@hidden>
 +
 +      * testext.c (fill_in_array): New function.
 +      (create_new_array): Most code moved into fill_in_array.
 +      (test_array_param): New function.
 +
 +2012-06-19         Arnold D. Robbins     <address@hidden>
 +
 +      * testext.c (dump_array_and_delete): Renamed from dump_array.
 +      Get second parameter which is index to delete. Update awk test.
 +
 +2012-06-18         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (do_chdir): Change element use to match change types.
 +      * fork.c (array_set_numeric): Ditto.
 +      * testext.c (valrep2str): New function.
 +      (test_array_elem): Add AWK_UNDEFINED for `wanted'. Use valrep2str.
 +      Adjust use of element index.
 +      (dump_array): Renamed from `dump_procinfo' and implemented.
 +      (func_table): Updated.
 +
 +2012-06-17         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (do_chdir, do_stat): Add assert(result != NULL).
 +      * fork.c (do_fork, do_waitpid, do_wait): Ditto.
 +      * ordchr.c (do_ord, do_chr): Ditto.
 +      * readfile.c (do_readfile): Ditto.
 +      * time.c (do_gettimeofday, do_sleep): Ditto.
 +      * testext.c (All functions): Ditto. Clean up initial testing and use
 +      make_number to make default return value up front.
 +      (create_new_array, test_array_flatten): New functions.
 +      (test_array_elem): Implemented.
 +      (at_exit1): Don't printa actual pointer value: not portable.
 +      (dl_load): Load up an array also.
 +
 +2012-06-14         Andrew J. Schorr     <address@hidden>
 +
 +      * time.c (RETURN): Remove obsolete define.
 +      (do_sleep): Change update_ERRNO_str argument to request translation.
 +
 +2012-06-12         Arnold D. Robbins     <address@hidden>
 +
 +      Revise API:
 +
 +      * filefuncs.c (do_chdir): Replace get_curfunc_param with get_argument.
 +      (format_mode): Use unsigned masks.
 +      (do_stat): Replace get_curfunc_param with get_argument.
 +      * fork.c (do_fork): Rearrange arg order in call to sym_lookup
 +      (do_waitpid): Replace get_curfunc_param with get_argument.
 +      * ordchr.c (do_ord, do_chr): Replace get_curfunc_param with 
get_argument.
 +      * readfile.c (do_readfile): Replace get_curfunc_param with get_argument.
 +      * time.c (do_sleep): Replace get_curfunc_param with get_argument.
 +      Replace set_ERRNO with update_ERRNO_str for no way to sleep case.
 +
 +      Work on testext.c:
 +
 +      * Makefile.am: Add stuff to make testext. Remove doit and steps
 +      from EXTRA_DIST.
 +      * testext.c: Fill in many of the test routines. Still more to do.
 +      Fix up test scripts for each routine.
 +      * time.c (do_sleep): Fix use of get_argument to be boolean.
 +
 +2012-06-10         Andrew J. Schorr     <address@hidden>
 +
 +      * Makefile.am: Add time extension.
 +      * configure.ac: To support time extension, check for some headers
 +      and functions that are needed.
 +      * time.c: New file implementing sleep and gettimeofday.
 +
 +2012-06-10         Andrew J. Schorr     <address@hidden>
 +
 +      * Makefile.am: Remove comment referring to deleted test extensions
 +      arrayparm, dl (zaxxon) and testarg.
 +
 +2012-06-10         Andrew J. Schorr     <address@hidden>
 +
 +      * arrayparm.c, dl.c, doit, foo.awk, steps, testarg.awk, testarg.c,
 +      testarrayparm.awk, testff.awk, testfork.awk, testordchr.awk: Remove
 +      unused (obsolete) files.
 +
 +2012-06-06         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (do_stat): Make `type' const char *.
 +
 +      * testext.c: Functions renamed, some of them filled in. Corresponding
 +      awk code for each test added inline.
 +
 +2012-05-30         Arnold D. Robbins     <address@hidden>
 +
 +      * testext.c: New file. Outline of tests for extension API.
 +
 +2012-05-29         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c: Further cleanup and condensation of code into tables.
 +      * fork.c, ordchr.c, readfile.c: Update copyright, general cleanup.
 +
 +2012-05-25         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs.c (array_set_numeric): Don't return a value from
 +      a void function.
 +
 +2012-05-24         Andrew J. Schorr     <address@hidden>
 +
 +      * Makefile.am (AM_CPPFLAGS): Use $(srcdir) to work properly when
 +      built outside the source directory.
 +      * configure.ac (INSTALL): Set location manually since autoconf was
 +      not specifying the proper path for install-sh.
 +      * filefuncs2.c, ordchr2.c, readfile2.c: Deleted.
 +      * filefuncs.c: Install filefuncs2.c and patch for recent API changes.
 +      * ordchr.c: Install ordchr2.c and patch for recent API changes.
 +      * readfile.c: Install readfile2.c and patch for recent API changes.
 +      * fork.c: Port to new API.
 +
 +2012-05-21         Andrew J. Schorr     <address@hidden>
 +
 +      * configure.ac: New file to run configure with libtool support
 +      in this subdirectory.
 +      * Makefile.am: Some changes related to running automake in this
 +      directory.
 +      * AUTHORS, COPYING, INSTALL, NEWS, README: Added files to make automake
 +      happy.
 +      * aclocal.m4, configure, configh.in: Added autoconf files.
 +      * build-aux, m4: New subdirectories for autoconf stuff.
 +
 +2012-05-15         Arnold D. Robbins     <address@hidden>
 +
 +      * filefuncs2.c: New file implementing chdir and stat using the
 +      new interface.
 +
 +      Everything else is temporarily broken.
 +
 +2012-05-13         Andrew J. Schorr     <address@hidden>
 +
 +      * filefuncs.c (array_set): Add a comment discussing the use of unref
 +      on the value returned by assoc_lookup.
 +
 +2012-05-13         Andrew J. Schorr     <address@hidden>
 +
 +      * xreadlink.[ch]: Remove unused files.
 +
 +2012-05-11         Arnold D. Robbins     <address@hidden>
 +
 +      Sweeping change: Use `bool', `true', and `false' everywhere.
 +
 +2012-04-11         Andrew J. Schorr     <address@hidden>
 +
 +      * filefuncs.c (array_set): New function to set an array element.
 +      (do_set): Use new array_set function to reduce code duplication and
 +      to make sure the memory management is handled properly.
 +
 +2012-04-07         Andrew J. Schorr     <address@hidden>
 +
 +      * filefuncs.c: Remove unnecessary #include <sys/sysmacros.h>.
 +      (read_symlink): New function to read symbolic links more robustly.
 +      (do_stat): Use read_symlink instead of readlink.
 +      * fork.c (do_wait): new function.
 +      (dlload): Call make_builtin to add "wait" function.
 +
 +2012-04-02         Andrew J. Schorr     <address@hidden>
 +
 +      * fork.c (do_fork): Test whether PROCINFO_node exists before updating
 +      the pid values.  And do so properly using make_number.
 +      * readfile.c (do_readfile): Function should be static.
 +
 +2012-04-01         Andrew J. Schorr     <address@hidden>
 +
 +      * filefuncs.c (do_chdir, do_stat): Replace update_ERRNO() with
 +      update_ERRNO_int(errno).
 +      * fork.c (do_fork, do_waitpid): Ditto.
 +      * readfile.c (do_readfile): Ditto.
 +      * rwarray.c (do_writea, do_reada): Ditto.
 +
 +2012-03-25         Andrew J. Schorr     <address@hidden>
 +
 +      * Makefile.am: Major cleanup.  Use libtool options -module and
 +      -avoid-version to create the modules properly without my local hack
 +      to override the default behavior.
 +
 +2012-03-25         Andrew J. Schorr     <address@hidden>
 +
 +      * .gitignore: New file to ignore files created by libtool (including
 +      binaries and associated metadata).
 +
 +2012-03-21         Andrew J. Schorr     <address@hidden>
 +
 +      * Makefile.am (INCLUDES): Remove -I$(top_srcdir)/intl.
 +
 +2012-03-20         Andrew J. Schorr     <address@hidden>
 +
 +      * Makefile.am: New file to build and install shared libraries.
 +      * arrayparm.c (do_mkarray): Get it to compile by removing 2nd arg
 +      to assoc_clear.
 +      * filefuncs.c (do_stat): Ditto.
 +
 +2011-08-31         John Haque     <address@hidden>
 +
 +      * arrayparm.c, filefuncs.c, fork.c, ordchr.c, readfile.c,
 +      rwarray.c, testarg.c: Updated.
 +
  2012-03-28         Arnold D. Robbins     <address@hidden>
  
        * 4.0.1: Release tar ball made.
diff --cc interpret.h
index c652624,0000000..8e0fdee
mode 100644,000000..100644
--- a/interpret.h
+++ b/interpret.h
@@@ -1,1368 -1,0 +1,1374 @@@
 +/*
 + * interpret.h ---  run a list of instructions.
 + */
 +
 +/* 
 + * Copyright (C) 1986, 1988, 1989, 1991-2012 the Free Software Foundation, 
Inc.
 + * 
 + * This file is part of GAWK, the GNU implementation of the
 + * AWK Programming Language.
 + * 
 + * GAWK is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 3 of the License, or
 + * (at your option) any later version.
 + * 
 + * GAWK is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + * 
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
USA
 + */
 +
 +
 +int
 +r_interpret(INSTRUCTION *code)
 +{
 +      INSTRUCTION *pc;   /* current instruction */
 +      OPCODE op;      /* current opcode */
 +      NODE *r = NULL;
 +      NODE *m;
 +      INSTRUCTION *ni;
 +      NODE *t1, *t2;
 +      NODE **lhs;
 +      AWKNUM x, x2;
 +      int di;
 +      Regexp *rp;
 +      NODE *set_array = NULL; /* array with a post-assignment routine */
 +      NODE *set_idx = NULL;   /* the index of the array element */
 +
 +
 +/* array subscript */
 +#define mk_sub(n)     (n == 1 ? POP_SCALAR() : concat_exp(n, true))
 +
 +#ifdef EXEC_HOOK
 +#define JUMPTO(x)     do { if (post_execute) post_execute(pc); pc = (x); goto 
top; } while (false)
 +#else
 +#define JUMPTO(x)     do { pc = (x); goto top; } while (false)
 +#endif
 +
 +      pc = code;
 +
 +      /* N.B.: always use JUMPTO for next instruction, otherwise bad things
 +       * may happen. DO NOT add a real loop (for/while) below to
 +       * replace ' forever {'; this catches failure to use JUMPTO to execute
 +       * next instruction (e.g. continue statement).
 +       */
 +
 +      /* loop until hit Op_stop instruction */
 +
 +      /* forever {  */
 +top:
 +              if (pc->source_line > 0)
 +                      sourceline = pc->source_line;
 +
 +#ifdef EXEC_HOOK
 +              for (di = 0; di < num_exec_hook; di++) {
 +                      if (! pre_execute[di](& pc))
 +                              goto top;
 +              }
 +#endif
 +
 +              switch ((op = pc->opcode)) {
 +              case Op_rule:
 +                      currule = pc->in_rule;   /* for sole use in Op_K_next, 
Op_K_nextfile, Op_K_getline */
 +                      /* fall through */
 +              case Op_func:
 +                      source = pc->source_file;
 +                      break;
 +
 +              case Op_atexit:
 +              {
 +                      bool stdio_problem = false;
 +
 +                      /* avoid false source indications */
 +                      source = NULL;
 +                      sourceline = 0;
 +                      (void) nextfile(& curfile, true);       /* close input 
data file */ 
 +                      /*
 +                       * This used to be:
 +                       *
 +                       * if (close_io() != 0 && ! exiting && exit_val == 0)
 +                       *      exit_val = 1;
 +                       *
 +                       * Other awks don't care about problems closing open 
files
 +                       * and pipes, in that it doesn't affect their exit 
status.
 +                       * So we no longer do either.
 +                       */
 +                      (void) close_io(& stdio_problem);
 +                      /*
 +                       * However, we do want to exit non-zero if there was a 
problem
 +                       * with stdout/stderr, so we reinstate a slightly 
different
 +                       * version of the above:
 +                       */
 +                      if (stdio_problem && ! exiting && exit_val == 0)
 +                              exit_val = 1;
 +
 +                      close_extensions();
 +              }
 +                      break;
 +
 +              case Op_stop:
 +                      return 0;
 +
 +              case Op_push_i:
 +                      m = pc->memory;
 +                      if (! do_traditional && (m->flags & INTLSTR) != 0) {
 +                              char *orig, *trans, save;
 +
 +                              save = m->stptr[m->stlen];
 +                              m->stptr[m->stlen] = '\0';
 +                              orig = m->stptr;
 +                              trans = dgettext(TEXTDOMAIN, orig);
 +                              m->stptr[m->stlen] = save;
 +                              m = make_string(trans, strlen(trans));
 +                      } else
 +                              UPREF(m);
 +                      PUSH(m);
 +                      break;
 +
 +              case Op_push:
 +              case Op_push_arg:
 +              {
 +                      NODE *save_symbol;
 +                      bool isparam = false;
 +
 +                      save_symbol = m = pc->memory;
 +                      if (m->type == Node_param_list) {
 +                              isparam = true;
 +                              save_symbol = m = GET_PARAM(m->param_cnt);
-                               if (m->type == Node_array_ref)
++                              if (m->type == Node_array_ref) {
++                                      if (m->orig_array->type == Node_var) {
++                                              /* gawk 'func f(x) { a = 10; 
print x; } BEGIN{ f(a) }' */
++                                              goto uninitialized_scalar;
++                                      }
 +                                      m = m->orig_array;
++                              }
 +                      }
 +                              
 +                      switch (m->type) {
 +                      case Node_var:
 +                              if (do_lint && var_uninitialized(m))
 +                                      lintwarn(isparam ?
 +                                              _("reference to uninitialized 
argument `%s'") :
 +                                              _("reference to uninitialized 
variable `%s'"),
 +                                                              
save_symbol->vname);
 +                              m = m->var_value;
 +                              UPREF(m);
 +                              PUSH(m);
 +                              break;
 +
 +                      case Node_var_new:
++uninitialized_scalar:
 +                              m->type = Node_var;
 +                              m->var_value = dupnode(Nnull_string);
 +                              if (do_lint)
 +                                      lintwarn(isparam ?
 +                                              _("reference to uninitialized 
argument `%s'") :
 +                                              _("reference to uninitialized 
variable `%s'"),
 +                                                              
save_symbol->vname);
 +                              m = dupnode(Nnull_string);
 +                              PUSH(m);
 +                              break;
 +
 +                      case Node_var_array:
 +                              if (op == Op_push_arg)
 +                                      PUSH(m);
 +                              else
 +                                      fatal(_("attempt to use array `%s' in a 
scalar context"),
 +                                                      
array_vname(save_symbol));
 +                              break;
 +
 +                      default:
 +                              cant_happen();
 +                      }
 +              }
 +                      break;  
 +
 +              case Op_push_param:             /* function argument */
 +                      m = pc->memory;
 +                      if (m->type == Node_param_list)
 +                              m = GET_PARAM(m->param_cnt);
 +                      if (m->type == Node_var) {
 +                              m = m->var_value;
 +                              UPREF(m);
 +                              PUSH(m);
 +                              break;
 +                      }
 +                      /* else
 +                              fall through */
 +              case Op_push_array:
 +                      PUSH(pc->memory);
 +                      break;
 +
 +              case Op_push_lhs:
 +                      lhs = get_lhs(pc->memory, pc->do_reference);
 +                      PUSH_ADDRESS(lhs);
 +                      break;
 +
 +              case Op_subscript:
 +                      t2 = mk_sub(pc->sub_count);
 +                      t1 = POP_ARRAY();
 +
 +                      if (do_lint && in_array(t1, t2) == NULL) {
 +                              t2 = force_string(t2);
 +                              lintwarn(_("reference to uninitialized element 
`%s[\"%.*s\"]'"),
 +                                      array_vname(t1), (int) t2->stlen, 
t2->stptr);
 +                              if (t2->stlen == 0)
 +                                      lintwarn(_("subscript of array `%s' is 
null string"), array_vname(t1));
 +                      }
 +
 +                      /* for FUNCTAB, get the name as the element value */
 +                      if (t1 == func_table) {
 +                              static bool warned = false;
 +                              
 +                              if (do_lint && ! warned) {
 +                                      warned = true;
 +                                      lintwarn(_("FUNCTAB is a gawk 
extension"));
 +                              }
 +                              r = t2;
 +                      } else {
 +                              /* make sure stuff like NF, NR, are up to date 
*/
 +                              if (t1 == symbol_table)
 +                                      update_global_values();
 +
 +                              r = *assoc_lookup(t1, t2);
 +                      }
 +                      DEREF(t2);
 +
 +                      /* for SYMTAB, step through to the actual variable */
 +                      if (t1 == symbol_table) {
 +                              static bool warned = false;
 +                              
 +                              if (do_lint && ! warned) {
 +                                      warned = true;
 +                                      lintwarn(_("SYMTAB is a gawk 
extension"));
 +                              }
 +                              if (r->type == Node_var)
 +                                      r = r->var_value;
 +                      }
 +
 +                      if (r->type == Node_val)
 +                              UPREF(r);
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_sub_array:
 +                      t2 = mk_sub(pc->sub_count);
 +                      t1 = POP_ARRAY();
 +                      r = in_array(t1, t2);
 +                      if (r == NULL) {
 +                              r = make_array();
 +                              r->parent_array = t1;
 +                              lhs = assoc_lookup(t1, t2);
 +                              unref(*lhs);
 +                              *lhs = r;
 +                              t2 = force_string(t2);
 +                              r->vname = estrdup(t2->stptr, t2->stlen);       
/* the subscript in parent array */
 +
 +                              /* execute post-assignment routine if any */
 +                              if (t1->astore != NULL)
 +                                      (*t1->astore)(t1, t2);
 +                      } else if (r->type != Node_var_array) {
 +                              t2 = force_string(t2);
 +                              fatal(_("attempt to use scalar `%s[\"%.*s\"]' 
as an array"),
 +                                              array_vname(t1), (int) 
t2->stlen, t2->stptr);
 +                      }
 +
 +                      DEREF(t2);
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_subscript_lhs:
 +                      t2 = mk_sub(pc->sub_count);
 +                      t1 = POP_ARRAY();
 +                      if (do_lint && in_array(t1, t2) == NULL) {
 +                              t2 = force_string(t2);
 +                              if (pc->do_reference) 
 +                                      lintwarn(_("reference to uninitialized 
element `%s[\"%.*s\"]'"),
 +                                              array_vname(t1), (int) 
t2->stlen, t2->stptr);
 +                              if (t2->stlen == 0)
 +                                      lintwarn(_("subscript of array `%s' is 
null string"), array_vname(t1));
 +                      }
 +
 +                      lhs = assoc_lookup(t1, t2);
 +                      if ((*lhs)->type == Node_var_array) {
 +                              t2 = force_string(t2);
 +                              fatal(_("attempt to use array `%s[\"%.*s\"]' in 
a scalar context"),
 +                                              array_vname(t1), (int) 
t2->stlen, t2->stptr);
 +                      }
 +
 +                      /*
 +                       * Changing something in FUNCTAB is not allowed.
 +                       *
 +                       * SYMTAB is a little more messy.  Three kinds of 
values may
 +                       * be stored in SYMTAB:
 +                       *      1. Variables that don"t yet have a value 
(Node_var_new)
 +                       *      2. Variables that have a value (Node_var)
 +                       *      3. Values that awk code stuck into SYMTAB not 
related to variables (Node_value)
 +                       * For 1, since we are giving it a value, we have to 
change the type to Node_var.
 +                       * For 1 and 2, we have to step through the Node_var to 
get to the value.
 +                       * For 3, we just us the value we got from 
assoc_lookup(), above.
 +                       */
 +                      if (t1 == func_table)
 +                              fatal(_("cannot assign to elements of 
FUNCTAB"));
 +                      else if (   t1 == symbol_table
 +                               && (   (*lhs)->type == Node_var
 +                                   || (*lhs)->type == Node_var_new)) {
 +                              update_global_values();         /* make sure 
stuff like NF, NR, are up to date */
 +                              (*lhs)->type = Node_var;        /* in case was 
Node_var_new */
 +                              lhs = & ((*lhs)->var_value);    /* extra level 
of indirection */
 +                      }
 +
 +                      assert(set_idx == NULL);
 +
 +                      if (t1->astore) {
 +                              /* array has post-assignment routine */
 +                              set_array = t1;
 +                              set_idx = t2;
 +                      } else
 +                              DEREF(t2);
 +
 +                      PUSH_ADDRESS(lhs);
 +                      break;
 +
 +              case Op_field_spec:
 +                      t1 = TOP_SCALAR();
 +                      lhs = r_get_field(t1, (Func_ptr *) 0, true);
 +                      decr_sp();
 +                      DEREF(t1);
 +                      r = dupnode(*lhs);     /* can't use UPREF here */
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_field_spec_lhs:
 +                      t1 = TOP_SCALAR();
 +                      lhs = r_get_field(t1, &pc->target_assign->field_assign, 
pc->do_reference);
 +                      decr_sp();
 +                      DEREF(t1);
 +                      PUSH_ADDRESS(lhs);
 +                      break;
 +
 +              case Op_lint:
 +                      if (do_lint) {
 +                              switch (pc->lint_type) {
 +                              case LINT_assign_in_cond:
 +                                      lintwarn(_("assignment used in 
conditional context"));
 +                                      break;
 +
 +                              case LINT_no_effect:
 +                                      lintwarn(_("statement has no effect"));
 +                                      break;
 +
 +                              default:
 +                                      cant_happen();
 +                              }
 +                      }
 +                      break;
 +
 +              case Op_K_break:
 +              case Op_K_continue:
 +              case Op_jmp:
 +                      assert(pc->target_jmp != NULL);
 +                      JUMPTO(pc->target_jmp);
 +
 +              case Op_jmp_false:
 +                      r = POP_SCALAR();
 +                      di = eval_condition(r);
 +                      DEREF(r);
 +                      if (! di)
 +                              JUMPTO(pc->target_jmp);
 +                      break;
 +
 +              case Op_jmp_true:
 +                      r = POP_SCALAR();
 +                      di = eval_condition(r);
 +                      DEREF(r);                       
 +                      if (di)
 +                              JUMPTO(pc->target_jmp);
 +                      break;
 +
 +              case Op_and:
 +              case Op_or:
 +                      t1 = POP_SCALAR();
 +                      di = eval_condition(t1);
 +                      DEREF(t1);
 +                      if ((op == Op_and && di) || (op == Op_or && ! di))
 +                              break;
 +                      r = node_Boolean[di];
 +                      UPREF(r);
 +                      PUSH(r);
 +                      ni = pc->target_jmp;
 +                      JUMPTO(ni->nexti);
 +
 +              case Op_and_final:
 +              case Op_or_final:
 +                      t1 = TOP_SCALAR();
 +                      r = node_Boolean[eval_condition(t1)];
 +                      DEREF(t1);
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_not:
 +                      t1 = TOP_SCALAR();
 +                      r = node_Boolean[! eval_condition(t1)];
 +                      DEREF(t1);
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_equal:
 +                      r = node_Boolean[cmp_scalars() == 0];
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_notequal:
 +                      r = node_Boolean[cmp_scalars() != 0];
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_less:
 +                      r = node_Boolean[cmp_scalars() < 0];
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_greater:
 +                      r = node_Boolean[cmp_scalars() > 0];
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_leq:
 +                      r = node_Boolean[cmp_scalars() <= 0];
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_geq:
 +                      r = node_Boolean[cmp_scalars() >= 0];
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_plus_i:
 +                      x2 = force_number(pc->memory)->numbr;
 +                      goto plus;
 +              case Op_plus:
 +                      t2 = POP_NUMBER();
 +                      x2 = t2->numbr;
 +                      DEREF(t2);
 +plus:
 +                      t1 = TOP_NUMBER();
 +                      r = make_number(t1->numbr + x2);
 +                      DEREF(t1);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_minus_i:
 +                      x2 = force_number(pc->memory)->numbr;
 +                      goto minus;
 +              case Op_minus:
 +                      t2 = POP_NUMBER();
 +                      x2 = t2->numbr;
 +                      DEREF(t2);                      
 +minus:
 +                      t1 = TOP_NUMBER();
 +                      r = make_number(t1->numbr - x2);
 +                      DEREF(t1);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_times_i:
 +                      x2 = force_number(pc->memory)->numbr;
 +                      goto times;
 +              case Op_times:
 +                      t2 = POP_NUMBER();
 +                      x2 = t2->numbr;
 +                      DEREF(t2);
 +times:
 +                      t1 = TOP_NUMBER();
 +                      r = make_number(t1->numbr * x2);
 +                      DEREF(t1);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_exp_i:
 +                      x2 = force_number(pc->memory)->numbr;
 +                      goto exp;
 +              case Op_exp:
 +                      t2 = POP_NUMBER();
 +                      x2 = t2->numbr;
 +                      DEREF(t2);
 +exp:
 +                      t1 = TOP_NUMBER();
 +                      r = make_number(calc_exp(t1->numbr, x2));
 +                      DEREF(t1);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_quotient_i:
 +                      x2 = force_number(pc->memory)->numbr;
 +                      goto quotient;
 +              case Op_quotient:
 +                      t2 = POP_NUMBER();
 +                      x2 = t2->numbr;
 +                      DEREF(t2);
 +quotient:
 +                      t1 = TOP_NUMBER();
 +                      if (x2 == 0)
 +                              fatal(_("division by zero attempted"));
 +                      r = make_number(t1->numbr / x2);
 +                      DEREF(t1);
 +                      REPLACE(r);
 +                      break;          
 +
 +              case Op_mod_i:
 +                      x2 = force_number(pc->memory)->numbr;
 +                      goto mod;
 +              case Op_mod:
 +                      t2 = POP_NUMBER();
 +                      x2 = t2->numbr;
 +                      DEREF(t2);
 +mod:
 +                      t1 = TOP_NUMBER();
 +                      if (x2 == 0)
 +                              fatal(_("division by zero attempted in `%%'"));
 +#ifdef HAVE_FMOD
 +                      x = fmod(t1->numbr, x2);
 +#else /* ! HAVE_FMOD */
 +                      (void) modf(t1->numbr / x2, &x);
 +                      x = t1->numbr - x * x2;
 +#endif        /* ! HAVE_FMOD */
 +                      r = make_number(x);
 +
 +                      DEREF(t1);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_preincrement:
 +              case Op_predecrement:
 +                      x = op == Op_preincrement ? 1.0 : -1.0;
 +                      lhs = TOP_ADDRESS();
 +                      t1 = *lhs;
 +                      force_number(t1);
 +                      if (t1->valref == 1 && t1->flags == 
(MALLOC|NUMCUR|NUMBER)) {
 +                              /* optimization */
 +                              t1->numbr += x;
 +                              r = t1;
 +                      } else {
 +                              r = *lhs = make_number(t1->numbr + x);
 +                              unref(t1);
 +                      }
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_postincrement:
 +              case Op_postdecrement:
 +                      x = op == Op_postincrement ? 1.0 : -1.0;
 +                      lhs = TOP_ADDRESS();
 +                      t1 = *lhs;
 +                      force_number(t1);
 +                      r = make_number(t1->numbr);
 +                      if (t1->valref == 1 && t1->flags == 
(MALLOC|NUMCUR|NUMBER)) {
 +                              /* optimization */
 +                              t1->numbr += x;
 +                      } else {
 +                              *lhs = make_number(t1->numbr + x);
 +                              unref(t1);
 +                      }
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_unary_minus:
 +                      t1 = TOP_NUMBER();
 +                      r = make_number(-t1->numbr);
 +                      DEREF(t1);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_store_sub:
 +                      /*
 +                       * array[sub] assignment optimization,
 +                       * see awkgram.y (optimize_assignment)
 +                       */
 +                      t1 = force_array(pc->memory, true);     /* array */
 +                      t2 = mk_sub(pc->expr_count);    /* subscript */
 +                      lhs = assoc_lookup(t1, t2);
 +                      if ((*lhs)->type == Node_var_array) {
 +                              t2 = force_string(t2);
 +                              fatal(_("attempt to use array `%s[\"%.*s\"]' in 
a scalar context"),
 +                                              array_vname(t1), (int) 
t2->stlen, t2->stptr);
 +                      }
 +                      DEREF(t2);
 +
 +                      /*
 +                       * Changing something in FUNCTAB is not allowed.
 +                       *
 +                       * SYMTAB is a little more messy.  Three kinds of 
values may
 +                       * be stored in SYMTAB:
 +                       *      1. Variables that don"t yet have a value 
(Node_var_new)
 +                       *      2. Variables that have a value (Node_var)
 +                       *      3. Values that awk code stuck into SYMTAB not 
related to variables (Node_value)
 +                       * For 1, since we are giving it a value, we have to 
change the type to Node_var.
 +                       * For 1 and 2, we have to step through the Node_var to 
get to the value.
 +                       * For 3, we just us the value we got from 
assoc_lookup(), above.
 +                       */
 +                      if (t1 == func_table)
 +                              fatal(_("cannot assign to elements of 
FUNCTAB"));
 +                      else if (   t1 == symbol_table
 +                               && (   (*lhs)->type == Node_var
 +                                   || (*lhs)->type == Node_var_new)) {
 +                              (*lhs)->type = Node_var;        /* in case was 
Node_var_new */
 +                              lhs = & ((*lhs)->var_value);    /* extra level 
of indirection */
 +                      }
 +
 +                      unref(*lhs);
 +                      *lhs = POP_SCALAR();
 +
 +                      /* execute post-assignment routine if any */
 +                      if (t1->astore != NULL)
 +                              (*t1->astore)(t1, t2);
 +
 +                      DEREF(t2);
 +                      break;
 +
 +              case Op_store_var:
 +                      /*
 +                       * simple variable assignment optimization,
 +                       * see awkgram.y (optimize_assignment)
 +                       */
 +      
 +                      lhs = get_lhs(pc->memory, false);
 +                      unref(*lhs);
 +                      r = pc->initval;        /* constant initializer */
 +                      if (r == NULL)
 +                              *lhs = POP_SCALAR();
 +                      else {
 +                              UPREF(r);
 +                              *lhs = r;
 +                      }
 +                      break;
 +
 +              case Op_store_field:
 +              {
 +                      /* field assignment optimization,
 +                       * see awkgram.y (optimize_assignment)
 +                       */
 +
 +                      Func_ptr assign;
 +                      t1 = TOP_SCALAR();
 +                      lhs = r_get_field(t1, & assign, false);
 +                      decr_sp();
 +                      DEREF(t1);
 +                      unref(*lhs);
 +                      *lhs = POP_SCALAR();
 +                      assert(assign != NULL);
 +                      assign();
 +              }
 +                      break;
 +
 +              case Op_assign_concat:
 +                      /* x = x ... string concatenation optimization */
 +                      lhs = get_lhs(pc->memory, false);
 +                      t1 = force_string(*lhs);
 +                      t2 = POP_STRING();
 +
 +                      if (t1 != *lhs) {
 +                              unref(*lhs);
 +                              *lhs = dupnode(t1);
 +                      }
 +
 +                      if (t1 != t2 && t1->valref == 1 && (t1->flags & MPFN) 
== 0) {
 +                              size_t nlen = t1->stlen + t2->stlen;
 +
 +                              erealloc(t1->stptr, char *, nlen + 2, 
"r_interpret");
 +                              memcpy(t1->stptr + t1->stlen, t2->stptr, 
t2->stlen);
 +                              t1->stlen = nlen;
 +                              t1->stptr[nlen] = '\0';
 +                              t1->flags &= ~(NUMCUR|NUMBER|NUMINT);
 +
 +#if MBS_SUPPORT
 +                              if ((t1->flags & WSTRCUR) != 0 && (t2->flags & 
WSTRCUR) != 0) {
 +                                      size_t wlen = t1->wstlen + t2->wstlen;
 +
 +                                      erealloc(t1->wstptr, wchar_t *,
 +                                                      sizeof(wchar_t) * (wlen 
+ 2), "r_interpret");
 +                                      memcpy(t1->wstptr + t1->wstlen, 
t2->wstptr, t2->wstlen);
 +                                      t1->wstlen = wlen;
 +                                      t1->wstptr[wlen] = L'\0';
 +                                      t1->flags |= WSTRCUR;
 +                              } else
 +                                      free_wstr(*lhs);
 +#endif
 +                      } else {
 +                              size_t nlen = t1->stlen + t2->stlen;  
 +                              char *p;
 +
 +                              emalloc(p, char *, nlen + 2, "r_interpret");
 +                              memcpy(p, t1->stptr, t1->stlen);
 +                              memcpy(p + t1->stlen, t2->stptr, t2->stlen);
 +                              unref(*lhs);
 +                              t1 = *lhs = make_str_node(p, nlen, 
ALREADY_MALLOCED); 
 +                      }
 +                      DEREF(t2);
 +                      break;
 +
 +              case Op_assign:
 +                      lhs = POP_ADDRESS();
 +                      r = TOP_SCALAR();
 +                      unref(*lhs);
 +                      *lhs = r;
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      break;
 +
 +              case Op_subscript_assign:
 +                      /* conditionally execute post-assignment routine for an 
array element */ 
 +
 +                      if (set_idx != NULL) {
 +                              di = true;
 +                              if (pc->assign_ctxt == Op_sub_builtin
 +                                      && (r = TOP())
 +                                      && get_number_si(r) == 0        /* no 
substitution performed */
 +                              )
 +                                      di = false;
 +                              else if ((pc->assign_ctxt == Op_K_getline
 +                                              || pc->assign_ctxt == 
Op_K_getline_redir)
 +                                      && (r = TOP())
 +                                      && get_number_si(r) <= 0        /* EOF 
or error */
 +                              )
 +                                      di = false;
 +
 +                              if (di)
 +                                      (*set_array->astore)(set_array, 
set_idx);
 +                              unref(set_idx);
 +                              set_idx = NULL;
 +                      }
 +                      break;
 +
 +              /* numeric assignments */
 +              case Op_assign_plus:
 +              case Op_assign_minus:
 +              case Op_assign_times:
 +              case Op_assign_quotient:
 +              case Op_assign_mod:
 +              case Op_assign_exp:
 +                      op_assign(op);
 +                      break;
 +
 +              case Op_var_update:        /* update value of NR, FNR or NF */
 +                      pc->update_var();
 +                      break;
 +
 +              case Op_var_assign:
 +              case Op_field_assign:
 +                      r = TOP();
 +                      if (pc->assign_ctxt == Op_sub_builtin
 +                              && get_number_si(r) == 0        /* top of stack 
has a number == 0 */
 +                      ) {
 +                              /* There wasn't any substitutions. If the 
target is a FIELD,
 +                               * this means no field re-splitting or $0 
reconstruction.
 +                               * Skip the set_FOO routine if the target is a 
special variable.
 +                               */
 +
 +                              break;
 +                      } else if ((pc->assign_ctxt == Op_K_getline
 +                                      || pc->assign_ctxt == 
Op_K_getline_redir)
 +                              && get_number_si(r) <= 0        /* top of stack 
has a number <= 0 */
 +                      ) {
 +                              /* getline returned EOF or error */
 +
 +                              break;
 +                      }
 +
 +                      if (op == Op_var_assign)
 +                              pc->assign_var();
 +                      else
 +                              pc->field_assign();
 +                      break;
 +
 +              case Op_concat:
 +                      r = concat_exp(pc->expr_count, pc->concat_flag & 
CSUBSEP);
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_K_case:
 +                      if ((pc + 1)->match_exp) {
 +                              /* match a constant regex against switch 
expression instead of $0. */
 +
 +                              m = POP();      /* regex */
 +                              t2 = TOP_SCALAR();      /* switch expression */
 +                              t2 = force_string(t2);
 +                              rp = re_update(m);
 +                              di = (research(rp, t2->stptr, 0, t2->stlen,
 +                                                      avoid_dfa(m, t2->stptr, 
t2->stlen)) >= 0);
 +                      } else {
 +                              t1 = POP_SCALAR();      /* case value */
 +                              t2 = TOP_SCALAR();      /* switch expression */
 +                              di = (cmp_nodes(t2, t1) == 0);
 +                              DEREF(t1);
 +                      }
 +
 +                      if (di) {
 +                              /* match found */
 +                              t2 = POP_SCALAR();
 +                              DEREF(t2);
 +                              JUMPTO(pc->target_jmp);
 +                      }
 +                      break;
 +
 +              case Op_K_delete:
 +                      t1 = POP_ARRAY();
 +                      do_delete(t1, pc->expr_count);
 +                      stack_adj(-pc->expr_count);
 +                      break;
 +
 +              case Op_K_delete_loop:
 +                      t1 = POP_ARRAY();
 +                      lhs = POP_ADDRESS();    /* item */
 +                      do_delete_loop(t1, lhs);
 +                      break;
 +
 +              case Op_in_array:
 +                      t1 = POP_ARRAY();
 +                      t2 = mk_sub(pc->expr_count);
 +                      r = node_Boolean[(in_array(t1, t2) != NULL)];
 +                      DEREF(t2);
 +                      UPREF(r);
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_arrayfor_init:
 +              {
 +                      NODE **list = NULL;
 +                      NODE *array, *sort_str;
 +                      size_t num_elems = 0;
 +                      static NODE *sorted_in = NULL;
 +                      const char *how_to_sort = "@unsorted";
 +
 +                      /* get the array */
 +                      array = POP_ARRAY();
 +
 +                      /* sanity: check if empty */
 +                      num_elems = assoc_length(array);
 +                      if (num_elems == 0)
 +                              goto arrayfor;
 +
 +                      if (sorted_in == NULL)          /* do this once */
 +                              sorted_in = make_string("sorted_in", 9);
 +
 +                      sort_str = NULL;
 +                      /*
 +                       * If posix, or if there's no PROCINFO[],
 +                       * there's no ["sorted_in"], so no sorting
 +                       */
 +                      if (! do_posix && PROCINFO_node != NULL)
 +                              sort_str = in_array(PROCINFO_node, sorted_in);
 +
 +                      if (sort_str != NULL) {
 +                              sort_str = force_string(sort_str);
 +                              if (sort_str->stlen > 0)
 +                                      how_to_sort = sort_str->stptr;
 +                      }
 +
 +                      list = assoc_list(array, how_to_sort, SORTED_IN);
 +
 +arrayfor:
 +                      getnode(r);
 +                      r->type = Node_arrayfor;
 +                      r->for_list = list;
 +                      r->for_list_size = num_elems;           /* # of 
elements in list */
 +                      r->cur_idx = -1;                        /* current 
index */
 +                      r->for_array = array;           /* array */
 +                      PUSH(r);
 +
 +                      if (num_elems == 0)
 +                              JUMPTO(pc->target_jmp);   /* Op_arrayfor_final 
*/
 +              }
 +                      break;
 +
 +              case Op_arrayfor_incr:
 +                      r = TOP();      /* Node_arrayfor */
 +                      if (++r->cur_idx == r->for_list_size) {
 +                              NODE *array;
 +                              array = r->for_array;   /* actual array */
 +                              if (do_lint && array->table_size != 
r->for_list_size)
 +                                      lintwarn(_("for loop: array `%s' 
changed size from %ld to %ld during loop execution"),
 +                                              array_vname(array), (long) 
r->for_list_size, (long) array->table_size);
 +                              JUMPTO(pc->target_jmp); /* Op_arrayfor_final */
 +                      }
 +
 +                      t1 = r->for_list[r->cur_idx];
 +                      lhs = get_lhs(pc->array_var, false);
 +                      unref(*lhs);
 +                      *lhs = dupnode(t1);
 +                      break;
 +
 +              case Op_arrayfor_final:
 +                      r = POP();
 +                      assert(r->type == Node_arrayfor);
 +                      free_arrayfor(r);
 +                      break;
 +
 +              case Op_builtin:
 +                      r = pc->builtin(pc->expr_count);
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_ext_builtin:
 +              case Op_old_ext_builtin:
 +              {
 +                      int arg_count = pc->expr_count;
 +                      awk_value_t result;
 +
 +                      PUSH_CODE(pc);
 +                      if (op == Op_ext_builtin)
 +                              r = awk_value_to_node(pc->extfunc(arg_count, & 
result));
 +                      else
 +                              r = pc->builtin(arg_count);
 +                      (void) POP_CODE();
 +                      while (arg_count-- > 0) {
 +                              t1 = POP();
 +                              if (t1->type == Node_val)
 +                                      DEREF(t1);
 +                      }
 +                      PUSH(r);
 +              }
 +                      break;
 +
 +              case Op_sub_builtin:    /* sub, gsub and gensub */
 +                      r = do_sub(pc->expr_count, pc->sub_flags);
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_K_print:
 +                      do_print(pc->expr_count, pc->redir_type);
 +                      break;
 +
 +              case Op_K_printf:
 +                      do_printf(pc->expr_count, pc->redir_type);
 +                      break;
 +
 +              case Op_K_print_rec:
 +                      do_print_rec(pc->expr_count, pc->redir_type);
 +                      break;
 +
 +              case Op_push_re:
 +                      m = pc->memory;
 +                      if (m->type == Node_dynregex) {
 +                              r = POP_STRING();
 +                              unref(m->re_exp);
 +                              m->re_exp = r;
 +                      }
 +                      PUSH(m);
 +                      break;
 +                      
 +              case Op_match_rec:
 +                      m = pc->memory;
 +                      t1 = *get_field(0, (Func_ptr *) 0);
 +match_re:
 +                      rp = re_update(m);
 +                      /*
 +                       * Any place where research() is called with a last 
parameter of
 +                       * zero, we need to use the avoid_dfa test. This 
appears here and
 +                       * in the code for Op_K_case.
 +                       *
 +                       * A new or improved dfa that distinguishes 
beginning/end of
 +                       * string from beginning/end of line will allow us to 
get rid of
 +                       * this hack.
 +                       *
 +                       * The avoid_dfa() function is in re.c; it is not very 
smart.
 +                       */
 +
 +                      di = research(rp, t1->stptr, 0, t1->stlen,
 +                                                              avoid_dfa(m, 
t1->stptr, t1->stlen));
 +                      di = (di == -1) ^ (op != Op_nomatch);
 +                      if (op != Op_match_rec) {
 +                              decr_sp();
 +                              DEREF(t1);
 +                      }
 +                      r = node_Boolean[di];
 +                      UPREF(r);
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_nomatch:
 +                      /* fall through */
 +              case Op_match:
 +                      m = pc->memory;
 +                      t1 = TOP_STRING();
 +                      if (m->type == Node_dynregex) {
 +                              unref(m->re_exp);
 +                              m->re_exp = t1;
 +                              decr_sp();
 +                              t1 = TOP_STRING();
 +                      }
 +                      goto match_re;
 +                      break;
 +
 +              case Op_indirect_func_call:
 +              {
 +                      NODE *f = NULL;
 +                      int arg_count;
 +
 +                      arg_count = (pc + 1)->expr_count;
 +                      t1 = PEEK(arg_count);   /* indirect var */
 +
 +                      if (t1->type != Node_val)       /* @a[1](p) not allowed 
in grammar */
 +                              fatal(_("indirect function call requires a 
simple scalar value"));
 +
 +                      t1 = force_string(t1);
 +                      if (t1->stlen > 0) {
 +                              /* retrieve function definition node */
 +                              f = pc->func_body;
 +                              if (f != NULL && strcmp(f->vname, t1->stptr) == 
0) {
 +                                      /* indirect var hasn't been reassigned 
*/
 +
 +                                      ni = setup_frame(pc);
 +                                      JUMPTO(ni);     /* Op_func */
 +                              }
 +                              f = lookup(t1->stptr);
 +                      }
 +
 +                      if (f == NULL || f->type != Node_func) {
 +                              if (f->type == Node_ext_func || f->type == 
Node_old_ext_func)
 +                                      fatal(_("cannot (yet) call extension 
functions indirectly"));
 +                              else
 +                                      fatal(_("function called indirectly 
through `%s' does not exist"),
 +                                                      pc->func_name); 
 +                      }
 +                      pc->func_body = f;     /* save for next call */
 +
 +                      ni = setup_frame(pc);
 +                      JUMPTO(ni);     /* Op_func */
 +              }
 +
 +              case Op_func_call:
 +              {
 +                      NODE *f;
 +
 +                      /* retrieve function definition node */
 +                      f = pc->func_body;
 +                      if (f == NULL) {
 +                              f = lookup(pc->func_name);
 +                              if (f == NULL || (f->type != Node_func && 
f->type != Node_ext_func && f->type != Node_old_ext_func))
 +                                      fatal(_("function `%s' not defined"), 
pc->func_name);
 +                              pc->func_body = f;     /* save for next call */
 +                      }
 +
 +                      if (f->type == Node_ext_func || f->type == 
Node_old_ext_func) {
 +                              INSTRUCTION *bc;
 +                              char *fname = pc->func_name;
 +                              int arg_count = (pc + 1)->expr_count;
 +
 +                              bc = f->code_ptr;
 +                              assert(bc->opcode == Op_symbol);
 +                              if (f->type == Node_ext_func)
 +                                      pc->opcode = Op_ext_builtin;    /* self 
modifying code */
 +                              else
 +                                      pc->opcode = Op_old_ext_builtin;        
/* self modifying code */
 +                              pc->extfunc = bc->extfunc;
 +                              pc->expr_count = arg_count;             /* 
actual argument count */
 +                              (pc + 1)->func_name = fname;    /* name of the 
builtin */
 +                              (pc + 1)->expr_count = bc->expr_count;  /* 
defined max # of arguments */
 +                              ni = pc; 
 +                              JUMPTO(ni);
 +                      }
 +
 +                      ni = setup_frame(pc);
 +                      JUMPTO(ni);     /* Op_func */
 +              }
 +
 +              case Op_K_return:
 +                      m = POP_SCALAR();       /* return value */
 +
 +                      ni = pop_fcall();
 +      
 +                      /* put the return value back on stack */
 +                      PUSH(m);
 +
 +                      JUMPTO(ni);
 +
 +              case Op_K_getline_redir:
 +                      if ((currule == BEGINFILE || currule == ENDFILE)
 +                                      && pc->into_var == false
 +                                      && pc->redir_type == redirect_input)
 +                              fatal(_("`getline' invalid inside `%s' rule"), 
ruletab[currule]);
 +                      r = do_getline_redir(pc->into_var, pc->redir_type);
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_K_getline:      /* no redirection */
 +                      if (! currule || currule == BEGINFILE || currule == 
ENDFILE)
 +                              fatal(_("non-redirected `getline' invalid 
inside `%s' rule"),
 +                                              ruletab[currule]);
 +
 +                      do {
 +                              int ret;
 +                              ret = nextfile(& curfile, false);
 +                              if (ret <= 0)
 +                                      r = do_getline(pc->into_var, curfile);
 +                              else {
 +
 +                                      /* Save execution state so that we can 
return to it
 +                                       * from Op_after_beginfile or 
Op_after_endfile.
 +                                       */ 
 +
 +                                      push_exec_state(pc, currule, source, 
stack_ptr);
 +
 +                                      if (curfile == NULL)
 +                                              JUMPTO((pc + 
1)->target_endfile);
 +                                      else
 +                                              JUMPTO((pc + 
1)->target_beginfile);
 +                              }
 +                      } while (r == NULL);    /* EOF */
 +
 +                      PUSH(r);
 +                      break;
 +
 +              case Op_after_endfile:
 +                      /* Find the execution state to return to */
 +                      ni = pop_exec_state(& currule, & source, NULL);
 +
 +                      assert(ni->opcode == Op_newfile || ni->opcode == 
Op_K_getline);
 +                      JUMPTO(ni);
 +
 +              case Op_after_beginfile:
 +                      after_beginfile(& curfile);
 +
 +                      /* Find the execution state to return to */
 +                      ni = pop_exec_state(& currule, & source, NULL);
 +
 +                      assert(ni->opcode == Op_newfile || ni->opcode == 
Op_K_getline);
 +                      if (ni->opcode == Op_K_getline
 +                                      || curfile == NULL      /* skipping 
directory argument */
 +                      )
 +                              JUMPTO(ni);
 +
 +                      break;  /* read a record, Op_get_record */
 +
 +              case Op_newfile:
 +              {
 +                      int ret;
 +
 +                      ret = nextfile(& curfile, false);
 +
 +                      if (ret < 0)    /* end of input */
 +                              JUMPTO(pc->target_jmp); /* end block or 
Op_atexit */
 +
 +                      if (ret == 0) /* read a record */
 +                              JUMPTO((pc + 1)->target_get_record);
 +
 +                      /* ret > 0 */
 +                      /* Save execution state for use in Op_after_beginfile 
or Op_after_endfile. */
 +
 +                      push_exec_state(pc, currule, source, stack_ptr);
 +
 +                      if (curfile == NULL)    /* EOF */
 +                              JUMPTO(pc->target_endfile);
 +                      /* else
 +                              execute beginfile block */
 +              }
 +                      break;
 +                      
 +              case Op_get_record:             
 +              {
 +                      int errcode = 0;
 +
 +                      ni = pc->target_newfile;
 +                      if (curfile == NULL) {
 +                              /* from non-redirected getline, e.g.:
 +                               *  {
 +                               *              while (getline > 0) ;
 +                               *  }
 +                               */
 +
 +                              ni = ni->target_jmp;    /* end_block or 
Op_atexit */
 +                              JUMPTO(ni);
 +                      }
 +
 +                      if (inrec(curfile, & errcode) != 0) {
 +                              if (errcode > 0 && (do_traditional || ! 
pc->has_endfile))
 +                                      fatal(_("error reading input file `%s': 
%s"),
 +                                              curfile->public.name, 
strerror(errcode));
 +
 +                              JUMPTO(ni);
 +                      } /* else
 +                              prog (rule) block */
 +              }
 +                      break;
 +
 +              case Op_K_nextfile:
 +              {
 +                      int ret;
 +
 +                      if (currule != Rule && currule != BEGINFILE)
 +                              fatal(_("`nextfile' cannot be called from a 
`%s' rule"),
 +                                      ruletab[currule]);
 +
 +                      ret = nextfile(& curfile, true);        /* skip current 
file */
 +
 +                      if (currule == BEGINFILE) {
 +                              long stack_size;
 +
 +                              ni = pop_exec_state(& currule, & source, & 
stack_size);
 +
 +                              assert(ni->opcode == Op_K_getline || ni->opcode 
== Op_newfile);
 +
 +                              /* pop stack returning to the state of 
Op_K_getline or Op_newfile. */
 +                              unwind_stack(stack_size);
 +
 +                              if (ret == 0) {
 +                                      /* There was an error opening the file;
 +                                       * don't run ENDFILE block(s).
 +                                       */
 +
 +                                      JUMPTO(ni);
 +                              } else {
 +                                      /* do run ENDFILE block(s) first. */
 +                                      
 +                                      /* Execution state to return to in 
Op_after_endfile. */
 +                                      push_exec_state(ni, currule, source, 
stack_ptr);
 +
 +                                      JUMPTO(pc->target_endfile);
 +                              }                               
 +                      } /* else 
 +                              Start over with the first rule. */
 +
 +                      /* empty the run-time stack to avoid memory leak */
 +                      pop_stack();
 +
 +                      /* Push an execution state for Op_after_endfile to 
return to */
 +                      push_exec_state(pc->target_newfile, currule, source, 
stack_ptr);
 +
 +                      JUMPTO(pc->target_endfile);
 +              }
 +                      break;
 +
 +              case Op_K_exit:
 +                      /* exit not allowed in user-defined comparison 
functions for "sorted_in";
 +                       * This is done so that END blocks aren't executed more 
than once.
 +                       */
 +                      if (! currule)
 +                              fatal(_("`exit' cannot be called in the current 
context"));
 +
 +                      exiting = true;
 +                      t1 = POP_NUMBER();
 +                      exit_val = (int) get_number_si(t1);
 +                      DEREF(t1);
 +#ifdef VMS
 +                      if (exit_val == 0)
 +                              exit_val = EXIT_SUCCESS;
 +                      else if (exit_val == 1)
 +                              exit_val = EXIT_FAILURE;
 +                      /* else
 +                              just pass anything else on through */
 +#endif
 +
 +                      if (currule == BEGINFILE || currule == ENDFILE) {
 +
 +                              /* Find the rule of the saved execution state 
(Op_K_getline/Op_newfile).
 +                               * This is needed to prevent multiple execution 
of any END rules:
 +                               *      gawk 'BEGINFILE { exit(1) } \
 +                               *         END { while (getline > 0); }' in1 in2
 +                               */
 +
 +                              (void) pop_exec_state(& currule, & source, 
NULL);
 +                      }
 +
 +                      pop_stack();    /* empty stack, don't leak memory */
 +
 +                      /* Jump to either the first END block instruction
 +                       * or to Op_atexit.
 +                       */
 +
 +                      if (currule == END)
 +                              ni = pc->target_atexit;
 +                      else
 +                              ni = pc->target_end;
 +                      JUMPTO(ni);
 +
 +              case Op_K_next:
 +                      if (currule != Rule)
 +                              fatal(_("`next' cannot be called from a `%s' 
rule"), ruletab[currule]);
 +
 +                      pop_stack();
 +                      JUMPTO(pc->target_jmp); /* Op_get_record, read next 
record */
 +
 +              case Op_pop:
 +                      r = POP_SCALAR();
 +                      DEREF(r);
 +                      break;
 +
 +              case Op_line_range:
 +                      if (pc->triggered)              /* evaluate right 
expression */
 +                              JUMPTO(pc->target_jmp);
 +                      /* else
 +                              evaluate left expression */
 +                      break;
 +
 +              case Op_cond_pair:
 +              {
 +                      int result;
 +                      INSTRUCTION *ip;
 +
 +                      t1 = TOP_SCALAR();   /* from right hand side expression 
*/
 +                      di = (eval_condition(t1) != 0);
 +                      DEREF(t1);
 +
 +                      ip = pc->line_range;            /* Op_line_range */
 +
 +                      if (! ip->triggered && di) {
 +                              /* not already triggered and left expression is 
true */
 +                              decr_sp();
 +                              ip->triggered = true;
 +                              JUMPTO(ip->target_jmp); /* evaluate right 
expression */ 
 +                      }
 +
 +                      result = ip->triggered || di;
 +                      ip->triggered ^= di;          /* update triggered flag 
*/
 +                      r = node_Boolean[result];      /* final value of 
condition pair */
 +                      UPREF(r);
 +                      REPLACE(r);
 +                      JUMPTO(pc->target_jmp);
 +              }
 +
 +              case Op_exec_count:
 +                      if (do_profile)
 +                              pc->exec_count++;
 +                      break;
 +
 +              case Op_no_op:
 +              case Op_K_do:
 +              case Op_K_while:
 +              case Op_K_for:
 +              case Op_K_arrayfor:
 +              case Op_K_switch:
 +              case Op_K_default:
 +              case Op_K_if:
 +              case Op_K_else:
 +              case Op_cond_exp:
 +                      break;
 +
 +              default:
 +                      fatal(_("Sorry, don't know how to interpret `%s'"), 
opcode2str(op));
 +              }
 +
 +              JUMPTO(pc->nexti);
 +
 +/*    } forever */
 +
 +      /* not reached */
 +      return 0;
 +
 +#undef mk_sub
 +#undef JUMPTO
 +}
diff --cc m4/ChangeLog
index 8489f90,63e7edf..8af73a2
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@@ -1,17 -1,7 +1,21 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
 +2012-10-27         Arnold D. Robbins     <address@hidden>
 +
 +      * po.m4, intl.m4: Fix droppings left over from a git merge.
 +
 +2012-05-21         Andrew J. Schorr     <address@hidden>
 +
 +      * libtool.m4, ltoptions.m4, ltsugar.m4, ltversion.m4, lt~obsolete.m4:
 +      Remove files related to libtool support.  Libtool usage has been
 +      pushed down into the extension directory.
 +
 +2012-04-01         John Haque      <address@hidden>
 +
 +      * mpfr.m4: New file.
 +
  2012-04-27         Arnold D. Robbins     <address@hidden>
  
        Update to autoconf 2.69, automake 1.12.
diff --cc missing_d/ChangeLog
index cb79747,67290aa..15c44a6
--- a/missing_d/ChangeLog
+++ b/missing_d/ChangeLog
@@@ -1,7 -1,7 +1,11 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
 +2012-09-13         Arnold D. Robbins     <address@hidden>
 +
 +      * snprintf.c, strtoul.c: Remove TRUE/FALSE in favor of true/false.
 +
  2012-05-04         Arnold D. Robbins     <address@hidden>
  
        * snprintf.c [DJGPP]: Change to __DJGPP__.
diff --cc po/ChangeLog
index 91cbd99,45f538c..c0ab096
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@@ -1,7 -1,7 +1,11 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
 +2012-07-25         Arnold D. Robbins     <address@hidden>
 +
 +      * POTFILES.in: Brought up to date.
 +
  2012-03-28         Arnold D. Robbins     <address@hidden>
  
        * 4.0.1: Release tar ball made.
diff --cc po/gawk.pot
index 5ff6a02,27327f8..c03b7ef
--- a/po/gawk.pot
+++ b/po/gawk.pot
@@@ -6,9 -6,9 +6,15 @@@
  #, fuzzy
  msgid ""
  msgstr ""
++<<<<<<< HEAD
 +"Project-Id-Version: gawk 4.0.71\n"
 +"Report-Msgid-Bugs-To: address@hidden"
 +"POT-Creation-Date: 2012-12-15 21:58+0200\n"
++=======
+ "Project-Id-Version: gawk 4.0.2\n"
+ "Report-Msgid-Bugs-To: address@hidden"
+ "POT-Creation-Date: 2012-12-23 14:16+0200\n"
++>>>>>>> gawk-4.0-stable
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  "Last-Translator: FULL NAME <address@hidden>\n"
  "Language-Team: LANGUAGE <address@hidden>\n"
@@@ -36,9 -41,9 +42,15 @@@ msgstr "
  msgid "attempt to use scalar `%s' as an array"
  msgstr ""
  
++<<<<<<< HEAD
 +#: array.c:404 array.c:570 builtin.c:85 builtin.c:1582 builtin.c:1624
 +#: builtin.c:1637 builtin.c:2063 builtin.c:2075 eval.c:1118 eval.c:1122
 +#: eval.c:1519
++=======
+ #: array.c:302 array.c:707 builtin.c:84 builtin.c:1404 builtin.c:1446
+ #: builtin.c:1459 builtin.c:1878 builtin.c:1890 eval.c:1135 eval.c:1139
+ #: eval.c:1495 eval.c:1818
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "attempt to use array `%s' in a scalar context"
  msgstr ""
@@@ -48,7 -63,7 +60,11 @@@
  msgid "delete: index `%s' not in array `%s'"
  msgstr ""
  
++<<<<<<< HEAD
 +#: array.c:591
++=======
+ #: array.c:734 eval.c:1871
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
  msgstr ""
@@@ -99,398 -139,370 +115,731 @@@ msgstr "
  msgid "sort comparison function `%s' is not defined"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:230
++=======
+ #: awkgram.y:250
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "%s blocks must have an action part"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:233
 +msgid "each rule must have a pattern or an action part"
 +msgstr ""
 +
 +#: awkgram.y:322 awkgram.y:333
 +msgid "old awk does not support multiple `BEGIN' or `END' rules"
 +msgstr ""
 +
 +#: awkgram.y:370
++=======
+ #: awkgram.y:253
+ msgid "each rule must have a pattern or an action part"
+ msgstr ""
+ 
+ #: awkgram.y:324 awkgram.y:335
+ msgid "old awk does not support multiple `BEGIN' or `END' rules"
+ msgstr ""
+ 
+ #: awkgram.y:372
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "`%s' is a built-in function, it cannot be redefined"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:416
 +msgid "regexp constant `//' looks like a C++ comment, but is not"
 +msgstr ""
 +
 +#: awkgram.y:420
++=======
+ #: awkgram.y:433
+ msgid "regexp constant `//' looks like a C++ comment, but is not"
+ msgstr ""
+ 
+ #: awkgram.y:437
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "regexp constant `/%s/' looks like a C comment, but is not"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:512
++=======
+ #: awkgram.y:529
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "duplicate case values in switch body: %s"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:533
 +msgid "duplicate `default' detected in switch body"
 +msgstr ""
 +
 +#: awkgram.y:793 awkgram.y:3681
 +msgid "`break' is not allowed outside a loop or switch"
 +msgstr ""
 +
 +#: awkgram.y:802 awkgram.y:3673
 +msgid "`continue' is not allowed outside a loop"
 +msgstr ""
 +
 +#: awkgram.y:812
++=======
+ #: awkgram.y:550
+ msgid "duplicate `default' detected in switch body"
+ msgstr ""
+ 
+ #: awkgram.y:810
+ msgid "`break' is not allowed outside a loop or switch"
+ msgstr ""
+ 
+ #: awkgram.y:819
+ msgid "`continue' is not allowed outside a loop"
+ msgstr ""
+ 
+ #: awkgram.y:829
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "`next' used in %s action"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:821
++=======
+ #: awkgram.y:838
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "`nextfile' used in %s action"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:845
 +msgid "`return' used outside function context"
 +msgstr ""
 +
 +#: awkgram.y:919
 +msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
 +msgstr ""
 +
 +#: awkgram.y:985 awkgram.y:1034
 +msgid "`delete' is not allowed with SYMTAB"
 +msgstr ""
 +
 +#: awkgram.y:987 awkgram.y:1036
 +msgid "`delete' is not allowed with FUNCTAB"
 +msgstr ""
 +
 +#: awkgram.y:1021 awkgram.y:1025
 +msgid "`delete(array)' is a non-portable tawk extension"
 +msgstr ""
 +
 +#: awkgram.y:1146
 +msgid "multistage two-way pipelines don't work"
 +msgstr ""
 +
 +#: awkgram.y:1249
 +msgid "regular expression on right of assignment"
 +msgstr ""
 +
 +#: awkgram.y:1260
 +msgid "regular expression on left of `~' or `!~' operator"
 +msgstr ""
 +
 +#: awkgram.y:1276 awkgram.y:1427
 +msgid "old awk does not support the keyword `in' except after `for'"
 +msgstr ""
 +
 +#: awkgram.y:1286
 +msgid "regular expression on right of comparison"
 +msgstr ""
 +
 +#: awkgram.y:1402
++=======
+ #: awkgram.y:862
+ msgid "`return' used outside function context"
+ msgstr ""
+ 
+ #: awkgram.y:922
+ msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+ msgstr ""
+ 
+ #: awkgram.y:1017 awkgram.y:1021
+ msgid "`delete(array)' is a non-portable tawk extension"
+ msgstr ""
+ 
+ #: awkgram.y:1133
+ msgid "multistage two-way pipelines don't work"
+ msgstr ""
+ 
+ #: awkgram.y:1236
+ msgid "regular expression on right of assignment"
+ msgstr ""
+ 
+ #: awkgram.y:1247
+ msgid "regular expression on left of `~' or `!~' operator"
+ msgstr ""
+ 
+ #: awkgram.y:1263 awkgram.y:1417
+ msgid "old awk does not support the keyword `in' except after `for'"
+ msgstr ""
+ 
+ #: awkgram.y:1273
+ msgid "regular expression on right of comparison"
+ msgstr ""
+ 
+ #: awkgram.y:1392
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "`getline var' invalid inside `%s' rule"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:1405
++=======
+ #: awkgram.y:1395 eval.c:2522
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "`getline' invalid inside `%s' rule"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:1410
 +msgid "non-redirected `getline' undefined inside END action"
 +msgstr ""
 +
 +#: awkgram.y:1429
 +msgid "old awk does not support multidimensional arrays"
 +msgstr ""
 +
 +#: awkgram.y:1526
 +msgid "call of `length' without parentheses is not portable"
 +msgstr ""
 +
 +#: awkgram.y:1592
 +msgid "indirect function calls are a gawk extension"
 +msgstr ""
 +
 +#: awkgram.y:1605
++=======
+ #: awkgram.y:1400
+ msgid "non-redirected `getline' undefined inside END action"
+ msgstr ""
+ 
+ #: awkgram.y:1419
+ msgid "old awk does not support multidimensional arrays"
+ msgstr ""
+ 
+ #: awkgram.y:1515
+ msgid "call of `length' without parentheses is not portable"
+ msgstr ""
+ 
+ #: awkgram.y:1578
+ msgid "indirect function calls are a gawk extension"
+ msgstr ""
+ 
+ #: awkgram.y:1591
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "can not use special variable `%s' for indirect function call"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:1683
 +msgid "invalid subscript expression"
 +msgstr ""
 +
 +#: awkgram.y:2006 awkgram.y:2026 gawkapi.c:207 gawkapi.c:225 msg.c:119
 +msgid "warning: "
 +msgstr ""
 +
 +#: awkgram.y:2024 gawkapi.c:193 gawkapi.c:222 msg.c:151
 +msgid "fatal: "
 +msgstr ""
 +
 +#: awkgram.y:2074
 +msgid "unexpected newline or end of string"
 +msgstr ""
 +
 +#: awkgram.y:2341 awkgram.y:2417 awkgram.y:2640 debug.c:517 debug.c:533
 +#: debug.c:2790 debug.c:5038
++=======
+ #: awkgram.y:1669
+ msgid "invalid subscript expression"
+ msgstr ""
+ 
+ #: awkgram.y:1709
+ msgid "use of non-array as array"
+ msgstr ""
+ 
+ #: awkgram.y:1972 awkgram.y:1992 msg.c:98
+ msgid "warning: "
+ msgstr ""
+ 
+ #: awkgram.y:1990 msg.c:130
+ msgid "fatal: "
+ msgstr ""
+ 
+ #: awkgram.y:2040
+ msgid "unexpected newline or end of string"
+ msgstr ""
+ 
+ #: awkgram.y:2297 awkgram.y:2355 awkgram.y:2539
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "can't open source file `%s' for reading (%s)"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:2342 awkgram.y:2467
 +#, c-format
 +msgid "can't open shared library `%s' for reading (%s)"
 +msgstr ""
 +
 +#: awkgram.y:2344 awkgram.y:2418 awkgram.y:2468 builtin.c:130 debug.c:5189
 +msgid "reason unknown"
 +msgstr ""
 +
 +#: awkgram.y:2353 awkgram.y:2377
 +#, c-format
 +msgid "can't include `%s' and use it as a program file"
 +msgstr ""
 +
 +#: awkgram.y:2366
++=======
+ #: awkgram.y:2298 awkgram.y:2356 builtin.c:122
+ msgid "reason unknown"
+ msgstr ""
+ 
+ #: awkgram.y:2314
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "already included source file `%s'"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:2367
 +#, c-format
 +msgid "already loaded shared library `%s'"
 +msgstr ""
 +
 +#: awkgram.y:2402
 +msgid "@include is a gawk extension"
 +msgstr ""
 +
 +#: awkgram.y:2408
 +msgid "empty filename after @include"
 +msgstr ""
 +
 +#: awkgram.y:2452
 +msgid "@load is a gawk extension"
 +msgstr ""
 +
 +#: awkgram.y:2458
 +msgid "empty filename after @load"
 +msgstr ""
 +
 +#: awkgram.y:2592
 +msgid "empty program text on command line"
 +msgstr ""
 +
 +#: awkgram.y:2707
++=======
+ #: awkgram.y:2340
+ msgid "@include is a gawk extension"
+ msgstr ""
+ 
+ #: awkgram.y:2346
+ msgid "empty filename after @include"
+ msgstr ""
+ 
+ #: awkgram.y:2491
+ msgid "empty program text on command line"
+ msgstr ""
+ 
+ #: awkgram.y:2606
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "can't read sourcefile `%s' (%s)"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:2718
++=======
+ #: awkgram.y:2617
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "source file `%s' is empty"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:2895
 +msgid "source file does not end in newline"
 +msgstr ""
 +
 +#: awkgram.y:3000
 +msgid "unterminated regexp ends with `\\' at end of file"
 +msgstr ""
 +
 +#: awkgram.y:3024
++=======
+ #: awkgram.y:2794
+ msgid "source file does not end in newline"
+ msgstr ""
+ 
+ #: awkgram.y:2897
+ msgid "unterminated regexp ends with `\\' at end of file"
+ msgstr ""
+ 
+ #: awkgram.y:2921
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3028
++=======
+ #: awkgram.y:2925
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3035
 +msgid "unterminated regexp"
 +msgstr ""
 +
 +#: awkgram.y:3039
 +msgid "unterminated regexp at end of file"
 +msgstr ""
 +
 +#: awkgram.y:3098
 +msgid "use of `\\ #...' line continuation is not portable"
 +msgstr ""
 +
 +#: awkgram.y:3114
 +msgid "backslash not last character on line"
 +msgstr ""
 +
 +#: awkgram.y:3175
 +msgid "POSIX does not allow operator `**='"
 +msgstr ""
 +
 +#: awkgram.y:3177
 +msgid "old awk does not support operator `**='"
 +msgstr ""
 +
 +#: awkgram.y:3186
 +msgid "POSIX does not allow operator `**'"
 +msgstr ""
 +
 +#: awkgram.y:3188
 +msgid "old awk does not support operator `**'"
 +msgstr ""
 +
 +#: awkgram.y:3223
 +msgid "operator `^=' is not supported in old awk"
 +msgstr ""
 +
 +#: awkgram.y:3231
 +msgid "operator `^' is not supported in old awk"
 +msgstr ""
 +
 +#: awkgram.y:3324 awkgram.y:3340 command.y:1178
 +msgid "unterminated string"
 +msgstr ""
 +
 +#: awkgram.y:3561
++=======
+ #: awkgram.y:2932
+ msgid "unterminated regexp"
+ msgstr ""
+ 
+ #: awkgram.y:2936
+ msgid "unterminated regexp at end of file"
+ msgstr ""
+ 
+ #: awkgram.y:2995
+ msgid "use of `\\ #...' line continuation is not portable"
+ msgstr ""
+ 
+ #: awkgram.y:3011
+ msgid "backslash not last character on line"
+ msgstr ""
+ 
+ #: awkgram.y:3072
+ msgid "POSIX does not allow operator `**='"
+ msgstr ""
+ 
+ #: awkgram.y:3074
+ msgid "old awk does not support operator `**='"
+ msgstr ""
+ 
+ #: awkgram.y:3083
+ msgid "POSIX does not allow operator `**'"
+ msgstr ""
+ 
+ #: awkgram.y:3085
+ msgid "old awk does not support operator `**'"
+ msgstr ""
+ 
+ #: awkgram.y:3120
+ msgid "operator `^=' is not supported in old awk"
+ msgstr ""
+ 
+ #: awkgram.y:3128
+ msgid "operator `^' is not supported in old awk"
+ msgstr ""
+ 
+ #: awkgram.y:3221 awkgram.y:3237
+ msgid "unterminated string"
+ msgstr ""
+ 
+ #: awkgram.y:3433
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "invalid char '%c' in expression"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3608
++=======
+ #: awkgram.y:3480
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "`%s' is a gawk extension"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3613
++=======
+ #: awkgram.y:3485
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "POSIX does not allow `%s'"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3621
++=======
+ #: awkgram.y:3493
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "`%s' is not supported in old awk"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3711
 +msgid "`goto' considered harmful!\n"
 +msgstr ""
 +
 +#: awkgram.y:3745
++=======
+ #: awkgram.y:3560
+ msgid "`goto' considered harmful!\n"
+ msgstr ""
+ 
+ #: awkgram.y:3611
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "%d is invalid as number of arguments for %s"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3780
++=======
+ #: awkgram.y:3646
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "%s: string literal as last arg of substitute has no effect"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3785
++=======
+ #: awkgram.y:3651
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "%s third parameter is not a changeable object"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:3864 awkgram.y:3867
 +msgid "match: third argument is a gawk extension"
 +msgstr ""
 +
 +#: awkgram.y:3921 awkgram.y:3924
 +msgid "close: second argument is a gawk extension"
 +msgstr ""
 +
 +#: awkgram.y:3936
 +msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
 +msgstr ""
 +
 +#: awkgram.y:3951
 +msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
 +msgstr ""
 +
 +#: awkgram.y:4017
++=======
+ #: awkgram.y:3724 awkgram.y:3727
+ msgid "match: third argument is a gawk extension"
+ msgstr ""
+ 
+ #: awkgram.y:3781 awkgram.y:3784
+ msgid "close: second argument is a gawk extension"
+ msgstr ""
+ 
+ #: awkgram.y:3796
+ msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+ msgstr ""
+ 
+ #: awkgram.y:3811
+ msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+ msgstr ""
+ 
+ #: awkgram.y:3903
+ #, c-format
+ msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+ msgstr ""
+ 
+ #: awkgram.y:3945
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "function `%s': parameter `%s' shadows global variable"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4074 debug.c:4019 debug.c:4062 debug.c:5187
++=======
+ #: awkgram.y:4103
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "could not open `%s' for writing (%s)"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4075
 +msgid "sending variable list to standard error"
 +msgstr ""
 +
 +#: awkgram.y:4083
++=======
+ #: awkgram.y:4104
+ msgid "sending variable list to standard error"
+ msgstr ""
+ 
+ #: awkgram.y:4110
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "%s: close failed (%s)"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4108
 +msgid "shadow_funcs() called twice!"
 +msgstr ""
 +
 +#: awkgram.y:4116
 +msgid "there were shadowed variables."
 +msgstr ""
 +
 +#: awkgram.y:4187
 +#, c-format
 +msgid "function name `%s' previously defined"
 +msgstr ""
 +
 +#: awkgram.y:4233
++=======
+ #: awkgram.y:4162
+ msgid "shadow_funcs() called twice!"
+ msgstr ""
+ 
+ #: awkgram.y:4168
+ msgid "there were shadowed variables."
+ msgstr ""
+ 
+ #: awkgram.y:4198
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "function `%s': can't use function name as parameter name"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4236
++=======
+ #: awkgram.y:4202
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "function `%s': can't use special variable `%s' as a function parameter"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4244
++=======
+ #: awkgram.y:4218
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "function name `%s' previously defined"
 +msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4338 awkgram.y:4342
++=======
+ #: awkgram.y:4386 awkgram.y:4392
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "function `%s' called but never defined"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4347
++=======
+ #: awkgram.y:4395
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "function `%s' defined but never called directly"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4379
++=======
+ #: awkgram.y:4427
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "regexp constant for parameter #%d yields boolean value"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4425
++=======
+ #: awkgram.y:4549
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid ""
  "function `%s' called with space between name and `(',\n"
  "or used as a variable or an array"
  msgstr ""
  
++<<<<<<< HEAD
 +#: awkgram.y:4658
 +msgid "division by zero attempted"
 +msgstr ""
 +
 +#: awkgram.y:4667
++=======
+ #: awkgram.y:4796 eval.c:2062
+ msgid "division by zero attempted"
+ msgstr ""
+ 
+ #: awkgram.y:4805 eval.c:2078
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "division by zero attempted in `%%'"
  msgstr ""
@@@ -651,65 -663,69 +1000,118 @@@ msgstr "
  msgid "too many arguments supplied for format string"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1620 builtin.c:1631
 +msgid "printf: no arguments"
 +msgstr ""
 +
 +#: builtin.c:1672
 +msgid "sqrt: received non-numeric argument"
 +msgstr ""
 +
 +#: builtin.c:1676
++=======
+ #: builtin.c:1396
+ msgid "[s]printf called with no arguments"
+ msgstr ""
+ 
+ #: builtin.c:1442 builtin.c:1453
+ msgid "printf: no arguments"
+ msgstr ""
+ 
+ #: builtin.c:1494
+ msgid "sqrt: received non-numeric argument"
+ msgstr ""
+ 
+ #: builtin.c:1498
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "sqrt: called with negative argument %g"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1707
++=======
+ #: builtin.c:1522
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "substr: length %g is not >= 1"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1709
++=======
+ #: builtin.c:1524
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "substr: length %g is not >= 0"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1716
++=======
+ #: builtin.c:1531
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "substr: non-integer length %g will be truncated"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1721
++=======
+ #: builtin.c:1536
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "substr: length %g too big for string indexing, truncating to %g"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1733
++=======
+ #: builtin.c:1548
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "substr: start index %g is invalid, using 1"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1738
++=======
+ #: builtin.c:1553
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "substr: non-integer start index %g will be truncated"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1763
 +msgid "substr: source string is zero length"
 +msgstr ""
 +
 +#: builtin.c:1779
++=======
+ #: builtin.c:1578
+ msgid "substr: source string is zero length"
+ msgstr ""
+ 
+ #: builtin.c:1594
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid "substr: start index %g is past end of string"
  msgstr ""
  
++<<<<<<< HEAD
 +#: builtin.c:1787
++=======
+ #: builtin.c:1602
++>>>>>>> gawk-4.0-stable
  #, c-format
  msgid ""
  "substr: length %g at start index %g exceeds length of first argument (%lu)"
  msgstr ""
  
 -#: builtin.c:1676
++<<<<<<< HEAD
 +#: builtin.c:1861
  msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
  msgstr ""
  
@@@ -725,1455 -741,428 +1127,1707 @@@ msgstr "
  msgid "strftime: received non-string first argument"
  msgstr ""
  
 -#: builtin.c:1715
 -msgid "strftime: received empty format string"
 +#: builtin.c:1902
 +msgid "strftime: received empty format string"
 +msgstr ""
 +
 +#: builtin.c:1968
 +msgid "mktime: received non-string argument"
 +msgstr ""
 +
 +#: builtin.c:1985
 +msgid "mktime: at least one of the values is out of the default range"
 +msgstr ""
 +
 +#: builtin.c:2020
 +msgid "'system' function not allowed in sandbox mode"
 +msgstr ""
 +
 +#: builtin.c:2025
 +msgid "system: received non-string argument"
 +msgstr ""
 +
 +#: builtin.c:2143
 +#, c-format
 +msgid "reference to uninitialized field `$%d'"
 +msgstr ""
 +
 +#: builtin.c:2230
 +msgid "tolower: received non-string argument"
 +msgstr ""
 +
 +#: builtin.c:2264
 +msgid "toupper: received non-string argument"
 +msgstr ""
 +
 +#: builtin.c:2300 mpfr.c:685
 +msgid "atan2: received non-numeric first argument"
 +msgstr ""
 +
 +#: builtin.c:2302 mpfr.c:687
 +msgid "atan2: received non-numeric second argument"
 +msgstr ""
 +
 +#: builtin.c:2321
 +msgid "sin: received non-numeric argument"
 +msgstr ""
 +
 +#: builtin.c:2337
 +msgid "cos: received non-numeric argument"
 +msgstr ""
 +
 +#: builtin.c:2390 mpfr.c:1137
 +msgid "srand: received non-numeric argument"
 +msgstr ""
 +
 +#: builtin.c:2421
 +msgid "match: third argument is not an array"
 +msgstr ""
 +
 +#: builtin.c:2686
 +msgid "gensub: third argument of 0 treated as 1"
 +msgstr ""
 +
 +#: builtin.c:2979
 +msgid "lshift: received non-numeric first argument"
 +msgstr ""
 +
 +#: builtin.c:2981
 +msgid "lshift: received non-numeric second argument"
 +msgstr ""
 +
 +#: builtin.c:2987
 +#, c-format
 +msgid "lshift(%f, %f): negative values will give strange results"
 +msgstr ""
 +
 +#: builtin.c:2989
 +#, c-format
 +msgid "lshift(%f, %f): fractional values will be truncated"
 +msgstr ""
 +
 +#: builtin.c:2991
 +#, c-format
 +msgid "lshift(%f, %f): too large shift value will give strange results"
 +msgstr ""
 +
 +#: builtin.c:3016
 +msgid "rshift: received non-numeric first argument"
 +msgstr ""
 +
 +#: builtin.c:3018
 +msgid "rshift: received non-numeric second argument"
 +msgstr ""
 +
 +#: builtin.c:3024
 +#, c-format
 +msgid "rshift(%f, %f): negative values will give strange results"
 +msgstr ""
 +
 +#: builtin.c:3026
 +#, c-format
 +msgid "rshift(%f, %f): fractional values will be truncated"
 +msgstr ""
 +
 +#: builtin.c:3028
 +#, c-format
 +msgid "rshift(%f, %f): too large shift value will give strange results"
 +msgstr ""
 +
 +#: builtin.c:3053
 +msgid "and: called with less than two arguments"
 +msgstr ""
 +
 +#: builtin.c:3058
 +#, c-format
 +msgid "and: argument %d is non-numeric"
 +msgstr ""
 +
 +#: builtin.c:3062
 +#, c-format
 +msgid "and: argument %d negative value %g will give strange results"
 +msgstr ""
 +
 +#: builtin.c:3085
 +msgid "or: called with less than two arguments"
 +msgstr ""
 +
 +#: builtin.c:3090
 +#, c-format
 +msgid "or: argument %d is non-numeric"
 +msgstr ""
 +
 +#: builtin.c:3094
 +#, c-format
 +msgid "or: argument %d negative value %g will give strange results"
 +msgstr ""
 +
 +#: builtin.c:3116
 +msgid "xor: called with less than two arguments"
 +msgstr ""
 +
 +#: builtin.c:3122
 +#, c-format
 +msgid "xor: argument %d is non-numeric"
 +msgstr ""
 +
 +#: builtin.c:3126
 +#, c-format
 +msgid "xor: argument %d negative value %g will give strange results"
 +msgstr ""
 +
 +#: builtin.c:3151 mpfr.c:800
 +msgid "compl: received non-numeric argument"
 +msgstr ""
 +
 +#: builtin.c:3157
 +#, c-format
 +msgid "compl(%f): negative value will give strange results"
 +msgstr ""
 +
 +#: builtin.c:3159
 +#, c-format
 +msgid "compl(%f): fractional value will be truncated"
 +msgstr ""
 +
 +#: builtin.c:3328
 +#, c-format
 +msgid "dcgettext: `%s' is not a valid locale category"
 +msgstr ""
 +
 +#: command.y:225
 +#, c-format
 +msgid "Type (g)awk statement(s). End with the command \"end\"\n"
 +msgstr ""
 +
 +#: command.y:289
 +#, c-format
 +msgid "invalid frame number: %d"
 +msgstr ""
 +
 +#: command.y:295
 +#, c-format
 +msgid "info: invalid option - \"%s\""
 +msgstr ""
 +
 +#: command.y:321
 +#, c-format
 +msgid "source \"%s\": already sourced."
 +msgstr ""
 +
 +#: command.y:326
 +#, c-format
 +msgid "save \"%s\": command not permitted."
 +msgstr ""
 +
 +#: command.y:339
 +msgid "Can't use command `commands' for breakpoint/watchpoint commands"
 +msgstr ""
 +
 +#: command.y:341
 +msgid "no breakpoint/watchpoint has been set yet"
 +msgstr ""
 +
 +#: command.y:343
 +msgid "invalid breakpoint/watchpoint number"
 +msgstr ""
 +
 +#: command.y:348
 +#, c-format
 +msgid "Type commands for when %s %d is hit, one per line.\n"
 +msgstr ""
 +
 +#: command.y:350
 +#, c-format
 +msgid "End with the command \"end\"\n"
 +msgstr ""
 +
 +#: command.y:357
 +msgid "`end' valid only in command `commands' or `eval'"
 +msgstr ""
 +
 +#: command.y:367
 +msgid "`silent' valid only in command `commands'"
 +msgstr ""
 +
 +#: command.y:373
 +#, c-format
 +msgid "trace: invalid option - \"%s\""
 +msgstr ""
 +
 +#: command.y:387
 +msgid "condition: invalid breakpoint/watchpoint number"
 +msgstr ""
 +
 +#: command.y:449
 +msgid "argument not a string"
 +msgstr ""
 +
 +#: command.y:459 command.y:464
 +#, c-format
 +msgid "option: invalid parameter - \"%s\""
 +msgstr ""
 +
 +#: command.y:474
 +#, c-format
 +msgid "no such function - \"%s\""
 +msgstr ""
 +
 +#: command.y:531
 +#, c-format
 +msgid "enable: invalid option - \"%s\""
 +msgstr ""
 +
 +#: command.y:597
 +#, c-format
 +msgid "invalid range specification: %d - %d"
 +msgstr ""
 +
 +#: command.y:659
 +msgid "non-numeric value for field number"
 +msgstr ""
 +
 +#: command.y:680 command.y:687
 +msgid "non-numeric value found, numeric expected"
 +msgstr ""
 +
 +#: command.y:712 command.y:718
 +msgid "non-zero integer value"
 +msgstr ""
 +
 +#: command.y:817
 +msgid ""
 +"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
 +"frames."
 +msgstr ""
 +
 +#: command.y:819
 +msgid ""
 +"break [[filename:]N|function] - set breakpoint at the specified location."
 +msgstr ""
 +
 +#: command.y:821
 +msgid "clear [[filename:]N|function] - delete breakpoints previously set."
 +msgstr ""
 +
 +#: command.y:823
 +msgid ""
 +"commands [num] - starts a list of commands to be executed at a breakpoint"
 +"(watchpoint) hit."
 +msgstr ""
 +
 +#: command.y:825
 +msgid "condition num [expr] - set or clear breakpoint or watchpoint 
condition."
 +msgstr ""
 +
 +#: command.y:827
 +msgid "continue [COUNT] - continue program being debugged."
 +msgstr ""
 +
 +#: command.y:829
 +msgid "delete [breakpoints] [range] - delete specified breakpoints."
 +msgstr ""
 +
 +#: command.y:831
 +msgid "disable [breakpoints] [range] - disable specified breakpoints."
 +msgstr ""
 +
 +#: command.y:833
 +msgid "display [var] - print value of variable each time the program stops."
 +msgstr ""
 +
 +#: command.y:835
 +msgid "down [N] - move N frames down the stack."
 +msgstr ""
 +
 +#: command.y:837
 +msgid "dump [filename] - dump instructions to file or stdout."
 +msgstr ""
 +
 +#: command.y:839
 +msgid "enable [once|del] [breakpoints] [range] - enable specified 
breakpoints."
 +msgstr ""
 +
 +#: command.y:841
 +msgid "end - end a list of commands or awk statements."
 +msgstr ""
 +
 +#: command.y:843
 +msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
 +msgstr ""
 +
 +#: command.y:845
 +msgid "finish - execute until selected stack frame returns."
 +msgstr ""
 +
 +#: command.y:847
 +msgid "frame [N] - select and print stack frame number N."
 +msgstr ""
 +
 +#: command.y:849
 +msgid "help [command] - print list of commands or explanation of command."
 +msgstr ""
 +
 +#: command.y:851
 +msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
 +msgstr ""
 +
 +#: command.y:853
 +msgid ""
 +"info topic - source|sources|variables|functions|break|frame|args|locals|"
 +"display|watch."
 +msgstr ""
 +
 +#: command.y:855
 +msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
 +msgstr ""
 +
 +#: command.y:857
 +msgid "next [COUNT] - step program, proceeding through subroutine calls."
 +msgstr ""
 +
 +#: command.y:859
 +msgid ""
 +"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
 +msgstr ""
 +
 +#: command.y:861
 +msgid "option [name[=value]] - set or display debugger option(s)."
 +msgstr ""
 +
 +#: command.y:863
 +msgid "print var [var] - print value of a variable or array."
 +msgstr ""
 +
 +#: command.y:865
 +msgid "printf format, [arg], ... - formatted output."
 +msgstr ""
 +
 +#: command.y:867
 +msgid "quit - exit debugger."
 +msgstr ""
 +
 +#: command.y:869
 +msgid "return [value] - make selected stack frame return to its caller."
 +msgstr ""
 +
 +#: command.y:871
 +msgid "run - start or restart executing program."
 +msgstr ""
 +
 +#: command.y:874
 +msgid "save filename - save commands from the session to file."
 +msgstr ""
 +
 +#: command.y:877
 +msgid "set var = value - assign value to a scalar variable."
 +msgstr ""
 +
 +#: command.y:879
 +msgid ""
 +"silent - suspends usual message when stopped at a breakpoint/watchpoint."
 +msgstr ""
 +
 +#: command.y:881
 +msgid "source file - execute commands from file."
 +msgstr ""
 +
 +#: command.y:883
 +msgid "step [COUNT] - step program until it reaches a different source line."
 +msgstr ""
 +
 +#: command.y:885
 +msgid "stepi [COUNT] - step one instruction exactly."
 +msgstr ""
 +
 +#: command.y:887
 +msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
 +msgstr ""
 +
 +#: command.y:889
 +msgid "trace on|off - print instruction before executing."
 +msgstr ""
 +
 +#: command.y:891
 +msgid "undisplay [N] - remove variable(s) from automatic display list."
 +msgstr ""
 +
 +#: command.y:893
 +msgid ""
 +"until [[filename:]N|function] - execute until program reaches a different "
 +"line or line N within current frame."
 +msgstr ""
 +
 +#: command.y:895
 +msgid "unwatch [N] - remove variable(s) from watch list."
 +msgstr ""
 +
 +#: command.y:897
 +msgid "up [N] - move N frames up the stack."
 +msgstr ""
 +
 +#: command.y:899
 +msgid "watch var - set a watchpoint for a variable."
 +msgstr ""
 +
 +#: command.y:1011 debug.c:395 msg.c:128
 +#, c-format
 +msgid "error: "
 +msgstr ""
 +
 +#: command.y:1051
 +#, c-format
 +msgid "can't read command (%s)\n"
 +msgstr ""
 +
 +#: command.y:1065
 +#, c-format
 +msgid "can't read command (%s)"
 +msgstr ""
 +
 +#: command.y:1116
 +msgid "invalid character in command"
 +msgstr ""
 +
 +#: command.y:1152
 +#, c-format
 +msgid "unknown command - \"%.*s\", try help"
 +msgstr ""
 +
 +#: command.y:1222
 +#, c-format
 +msgid "%s"
 +msgstr ""
 +
 +#: command.y:1284
 +msgid "invalid character"
 +msgstr ""
 +
 +#: command.y:1455
 +#, c-format
 +msgid "undefined command: %s\n"
 +msgstr ""
 +
 +#: debug.c:246
 +msgid "set or show the number of lines to keep in history file."
 +msgstr ""
 +
 +#: debug.c:248
 +msgid "set or show the list command window size."
 +msgstr ""
 +
 +#: debug.c:250
 +msgid "set or show gawk output file."
 +msgstr ""
 +
 +#: debug.c:252
 +msgid "set or show debugger prompt."
 +msgstr ""
 +
 +#: debug.c:254
 +msgid "(un)set or show saving of command history (value=on|off)."
 +msgstr ""
 +
 +#: debug.c:256
 +msgid "(un)set or show saving of options (value=on|off)."
 +msgstr ""
 +
 +#: debug.c:258
 +msgid "(un)set or show instruction tracing (value=on|off)."
 +msgstr ""
 +
 +#: debug.c:339
 +msgid "program not running."
 +msgstr ""
 +
 +#: debug.c:442 debug.c:597
 +#, c-format
 +msgid "can't read source file `%s' (%s)"
 +msgstr ""
 +
 +#: debug.c:447
 +#, c-format
 +msgid "source file `%s' is empty.\n"
 +msgstr ""
 +
 +#: debug.c:474
 +msgid "no current source file."
 +msgstr ""
 +
 +#: debug.c:499
 +#, c-format
 +msgid "cannot find source file named `%s' (%s)"
 +msgstr ""
 +
 +#: debug.c:523
 +#, c-format
 +msgid "WARNING: source file `%s' modified since program compilation.\n"
 +msgstr ""
 +
 +#: debug.c:542
 +#, c-format
 +msgid "line number %d out of range; `%s' has %d lines"
 +msgstr ""
 +
 +#: debug.c:602
 +#, c-format
 +msgid "unexpected eof while reading file `%s', line %d"
 +msgstr ""
 +
 +#: debug.c:611
 +#, c-format
 +msgid "source file `%s' modified since start of program execution"
 +msgstr ""
 +
 +#: debug.c:723
 +#, c-format
 +msgid "Current source file: %s\n"
 +msgstr ""
 +
 +#: debug.c:724
 +#, c-format
 +msgid "Number of lines: %d\n"
 +msgstr ""
 +
 +#: debug.c:731
 +#, c-format
 +msgid "Source file (lines): %s (%d)\n"
 +msgstr ""
 +
 +#: debug.c:745
 +msgid ""
 +"Number  Disp  Enabled  Location\n"
 +"\n"
 +msgstr ""
 +
 +#: debug.c:756
 +#, c-format
 +msgid "\tno of hits = %ld\n"
 +msgstr ""
 +
 +#: debug.c:758
 +#, c-format
 +msgid "\tignore next %ld hit(s)\n"
 +msgstr ""
 +
 +#: debug.c:760 debug.c:900
 +#, c-format
 +msgid "\tstop condition: %s\n"
 +msgstr ""
 +
 +#: debug.c:762 debug.c:902
 +msgid "\tcommands:\n"
 +msgstr ""
 +
 +#: debug.c:784
 +#, c-format
 +msgid "Current frame: "
 +msgstr ""
 +
 +#: debug.c:787
 +#, c-format
 +msgid "Called by frame: "
 +msgstr ""
 +
 +#: debug.c:791
 +#, c-format
 +msgid "Caller of frame: "
 +msgstr ""
 +
 +#: debug.c:809
 +#, c-format
 +msgid "None in main().\n"
 +msgstr ""
 +
 +#: debug.c:839
 +msgid "No arguments.\n"
 +msgstr ""
 +
 +#: debug.c:840
 +msgid "No locals.\n"
 +msgstr ""
 +
 +#: debug.c:848
 +msgid ""
 +"All defined variables:\n"
 +"\n"
 +msgstr ""
 +
 +#: debug.c:858
 +msgid ""
 +"All defined functions:\n"
 +"\n"
 +msgstr ""
 +
 +#: debug.c:877
 +msgid ""
 +"Auto-display variables:\n"
 +"\n"
 +msgstr ""
 +
 +#: debug.c:880
 +msgid ""
 +"Watch variables:\n"
 +"\n"
 +msgstr ""
 +
 +#: debug.c:1020
 +#, c-format
 +msgid "no symbol `%s' in current context\n"
 +msgstr ""
 +
 +#: debug.c:1032 debug.c:1416
 +#, c-format
 +msgid "`%s' is not an array\n"
 +msgstr ""
 +
 +#: debug.c:1046
 +#, c-format
 +msgid "$%ld = uninitialized field\n"
 +msgstr ""
 +
 +#: debug.c:1067
 +#, c-format
 +msgid "array `%s' is empty\n"
 +msgstr ""
 +
 +#: debug.c:1110 debug.c:1162
 +#, c-format
 +msgid "[\"%s\"] not in array `%s'\n"
 +msgstr ""
 +
 +#: debug.c:1166
 +#, c-format
 +msgid "`%s[\"%s\"]' is not an array\n"
 +msgstr ""
 +
 +#: debug.c:1227 debug.c:4947
 +#, c-format
 +msgid "`%s' is not a scalar variable"
 +msgstr ""
 +
 +#: debug.c:1249 debug.c:4977
 +#, c-format
 +msgid "attempt to use array `%s[\"%s\"]' in a scalar context"
 +msgstr ""
 +
 +#: debug.c:1269 debug.c:4988
 +#, c-format
 +msgid "attempt to use scalar `%s[\"%s\"]' as array"
 +msgstr ""
 +
 +#: debug.c:1412
 +#, c-format
 +msgid "`%s' is a function"
 +msgstr ""
 +
 +#: debug.c:1454
 +#, c-format
 +msgid "watchpoint %d is unconditional\n"
 +msgstr ""
 +
 +#: debug.c:1488
 +#, c-format
 +msgid "No display item numbered %ld"
 +msgstr ""
 +
 +#: debug.c:1491
 +#, c-format
 +msgid "No watch item numbered %ld"
 +msgstr ""
 +
 +#: debug.c:1517
 +#, c-format
 +msgid "%d: [\"%s\"] not in array `%s'\n"
 +msgstr ""
 +
 +#: debug.c:1756
 +msgid "attempt to use scalar value as array"
 +msgstr ""
 +
 +#: debug.c:1845
 +#, c-format
 +msgid "Watchpoint %d deleted because parameter is out of scope.\n"
 +msgstr ""
 +
 +#: debug.c:1856
 +#, c-format
 +msgid "Display %d deleted because parameter is out of scope.\n"
 +msgstr ""
 +
 +#: debug.c:1889
 +#, c-format
 +msgid " in file `%s', line %d\n"
 +msgstr ""
 +
 +#: debug.c:1910
 +#, c-format
 +msgid " at `%s':%d"
 +msgstr ""
 +
 +#: debug.c:1926 debug.c:1989
 +#, c-format
 +msgid "#%ld\tin "
 +msgstr ""
 +
 +#: debug.c:1963
 +#, c-format
 +msgid "More stack frames follow ...\n"
 +msgstr ""
 +
 +#: debug.c:2006
 +msgid "invalid frame number"
 +msgstr ""
 +
 +#: debug.c:2178
 +#, c-format
 +msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
 +msgstr ""
 +
 +#: debug.c:2185
 +#, c-format
 +msgid "Note: breakpoint %d (enabled), also set at %s:%d"
 +msgstr ""
 +
 +#: debug.c:2192
 +#, c-format
 +msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at 
%s:%d"
 +msgstr ""
 +
 +#: debug.c:2199
 +#, c-format
 +msgid "Note: breakpoint %d (disabled), also set at %s:%d"
 +msgstr ""
 +
 +#: debug.c:2216
 +#, c-format
 +msgid "Breakpoint %d set at file `%s', line %d\n"
 +msgstr ""
 +
 +#: debug.c:2318
 +#, c-format
 +msgid "Can't set breakpoint in file `%s'\n"
 +msgstr ""
 +
 +#: debug.c:2347 debug.c:2470 debug.c:3328
 +#, c-format
 +msgid "line number %d in file `%s' out of range"
 +msgstr ""
 +
 +#: debug.c:2351
 +#, c-format
 +msgid "Can't find rule!!!\n"
 +msgstr ""
 +
 +#: debug.c:2353
 +#, c-format
 +msgid "Can't set breakpoint at `%s':%d\n"
 +msgstr ""
 +
 +#: debug.c:2365
 +#, c-format
 +msgid "Can't set breakpoint in function `%s'\n"
 +msgstr ""
 +
 +#: debug.c:2381
 +#, c-format
 +msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
 +msgstr ""
 +
 +#: debug.c:2486 debug.c:2508
 +#, c-format
 +msgid "Deleted breakpoint %d"
 +msgstr ""
 +
 +#: debug.c:2492
 +#, c-format
 +msgid "No breakpoint(s) at entry to function `%s'\n"
 +msgstr ""
 +
 +#: debug.c:2519
 +#, c-format
 +msgid "No breakpoint at file `%s', line #%d\n"
 +msgstr ""
 +
 +#: debug.c:2574 debug.c:2615 debug.c:2635 debug.c:2678
 +msgid "invalid breakpoint number"
 +msgstr ""
 +
 +#: debug.c:2590
 +msgid "Delete all breakpoints? (y or n) "
 +msgstr ""
 +
 +#: debug.c:2591 debug.c:2901 debug.c:2954
 +msgid "y"
 +msgstr ""
 +
 +#: debug.c:2640
 +#, c-format
 +msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
 +msgstr ""
 +
 +#: debug.c:2644
 +#, c-format
 +msgid "Will stop next time breakpoint %d is reached.\n"
 +msgstr ""
 +
 +#: debug.c:2761
 +#, c-format
 +msgid "Can only debug programs provided with the `-f' option.\n"
 +msgstr ""
 +
 +#: debug.c:2886
 +#, c-format
 +msgid "Failed to restart debugger"
 +msgstr ""
 +
 +#: debug.c:2900
 +msgid "Program already running. Restart from beginning (y/n)? "
 +msgstr ""
 +
 +#: debug.c:2904
 +#, c-format
 +msgid "Program not restarted\n"
 +msgstr ""
 +
 +#: debug.c:2914
 +#, c-format
 +msgid "error: cannot restart, operation not allowed\n"
 +msgstr ""
 +
 +#: debug.c:2920
 +#, c-format
 +msgid "error (%s): cannot restart, ignoring rest of the commands\n"
 +msgstr ""
 +
 +#: debug.c:2928
 +#, c-format
 +msgid "Starting program: \n"
 +msgstr ""
 +
 +#: debug.c:2937
 +#, c-format
 +msgid "Program exited %s with exit value: %d\n"
 +msgstr ""
 +
 +#: debug.c:2953
 +msgid "The program is running. Exit anyway (y/n)? "
 +msgstr ""
 +
 +#: debug.c:2988
 +#, c-format
 +msgid "Not stopped at any breakpoint; argument ignored.\n"
 +msgstr ""
 +
 +#: debug.c:2993
 +#, c-format
 +msgid "invalid breakpoint number %d."
 +msgstr ""
 +
 +#: debug.c:2998
 +#, c-format
 +msgid "Will ignore next %ld crossings of breakpoint %d.\n"
 +msgstr ""
 +
 +#: debug.c:3185
 +#, c-format
 +msgid "'finish' not meaningful in the outermost frame main()\n"
 +msgstr ""
 +
 +#: debug.c:3190
 +#, c-format
 +msgid "Run till return from "
 +msgstr ""
 +
 +#: debug.c:3233
 +#, c-format
 +msgid "'return' not meaningful in the outermost frame main()\n"
 +msgstr ""
 +
 +#: debug.c:3347
 +#, c-format
 +msgid "Can't find specified location in function `%s'\n"
 +msgstr ""
 +
 +#: debug.c:3355
 +#, c-format
 +msgid "invalid source line %d in file `%s'"
 +msgstr ""
 +
 +#: debug.c:3370
 +#, c-format
 +msgid "Can't find specified location %d in file `%s'\n"
 +msgstr ""
 +
 +#: debug.c:3402
 +#, c-format
 +msgid "element not in array\n"
 +msgstr ""
 +
 +#: debug.c:3402
 +#, c-format
 +msgid "untyped variable\n"
 +msgstr ""
 +
 +#: debug.c:3444
 +#, c-format
 +msgid "Stopping in %s ...\n"
 +msgstr ""
 +
 +#: debug.c:3521
 +#, c-format
 +msgid "'finish' not meaningful with non-local jump '%s'\n"
 +msgstr ""
 +
 +#: debug.c:3528
 +#, c-format
 +msgid "'until' not meaningful with non-local jump '%s'\n"
 +msgstr ""
 +
 +#: debug.c:4163
 +msgid "\t------[Enter] to continue or q [Enter] to quit------"
 +msgstr ""
 +
 +#: debug.c:4164
 +msgid "q"
 +msgstr ""
 +
 +#: debug.c:4984
 +#, c-format
 +msgid "[\"%s\"] not in array `%s'"
 +msgstr ""
 +
 +#: debug.c:5190
 +#, c-format
 +msgid "sending output to stdout\n"
 +msgstr ""
 +
 +#: debug.c:5230
 +msgid "invalid number"
 +msgstr ""
 +
 +#: debug.c:5362
 +#, c-format
 +msgid "`%s' not allowed in current context; statement ignored"
 +msgstr ""
 +
 +#: debug.c:5370
 +msgid "`return' not allowed in current context; statement ignored"
 +msgstr ""
 +
 +#: debug.c:5571
 +#, c-format
 +msgid "No symbol `%s' in current context"
 +msgstr ""
 +
 +#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089
 +#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178
 +msgid "unbalanced ["
 +msgstr ""
 +
 +#: dfa.c:1038
 +msgid "invalid character class"
 +msgstr ""
 +
 +#: dfa.c:1215
 +msgid "character class syntax is [[:space:]], not [:space:]"
 +msgstr ""
 +
 +#: dfa.c:1267
 +msgid "unfinished \\ escape"
 +msgstr ""
 +
 +#: dfa.c:1414 regcomp.c:161
 +msgid "Invalid content of \\{\\}"
 +msgstr ""
 +
 +#: dfa.c:1417 regcomp.c:176
 +msgid "Regular expression too big"
 +msgstr ""
 +
 +#: dfa.c:1802
 +msgid "unbalanced ("
 +msgstr ""
 +
 +#: dfa.c:1929
 +msgid "no syntax specified"
 +msgstr ""
 +
 +#: dfa.c:1937
 +msgid "unbalanced )"
 +msgstr ""
 +
 +#: eval.c:391
 +#, c-format
 +msgid "unknown nodetype %d"
 +msgstr ""
 +
 +#: eval.c:402 eval.c:416
 +#, c-format
 +msgid "unknown opcode %d"
 +msgstr ""
 +
 +#: eval.c:413
 +#, c-format
 +msgid "opcode %s not an operator or keyword"
 +msgstr ""
 +
 +#: eval.c:468
 +msgid "buffer overflow in genflags2str"
 +msgstr ""
 +
 +#: eval.c:671
 +#, c-format
 +msgid ""
 +"\n"
 +"\t# Function Call Stack:\n"
 +"\n"
 +msgstr ""
 +
 +#: eval.c:700
 +msgid "`IGNORECASE' is a gawk extension"
 +msgstr ""
 +
 +#: eval.c:732
 +msgid "`BINMODE' is a gawk extension"
 +msgstr ""
 +
 +#: eval.c:790
 +#, c-format
 +msgid "BINMODE value `%s' is invalid, treated as 3"
 +msgstr ""
 +
 +#: eval.c:881
 +#, c-format
 +msgid "bad `%sFMT' specification `%s'"
 +msgstr ""
 +
 +#: eval.c:965
 +msgid "turning off `--lint' due to assignment to `LINT'"
 +msgstr ""
 +
 +#: eval.c:1141
++=======
++#: builtin.c:1676
++msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
++msgstr ""
++
++#: builtin.c:1699
++msgid "strftime: received non-numeric second argument"
++msgstr ""
++
++#: builtin.c:1702
++msgid "strftime: second argument less than 0 or too big for time_t"
++msgstr ""
++
++#: builtin.c:1709
++msgid "strftime: received non-string first argument"
++msgstr ""
++
++#: builtin.c:1715
++msgid "strftime: received empty format string"
++msgstr ""
++
++#: builtin.c:1781
++msgid "mktime: received non-string argument"
++msgstr ""
++
++#: builtin.c:1798
++msgid "mktime: at least one of the values is out of the default range"
++msgstr ""
++
++#: builtin.c:1833
++msgid "'system' function not allowed in sandbox mode"
++msgstr ""
++
++#: builtin.c:1838
++msgid "system: received non-string argument"
++msgstr ""
++
++#: builtin.c:1893 eval.c:1159 eval.c:1795 eval.c:1809
++>>>>>>> gawk-4.0-stable
 +#, c-format
 +msgid "reference to uninitialized argument `%s'"
 +msgstr ""
 +
++<<<<<<< HEAD
 +#: eval.c:1142
++=======
++#: builtin.c:1960
++>>>>>>> gawk-4.0-stable
 +#, c-format
 +msgid "reference to uninitialized variable `%s'"
 +msgstr ""
 +
++<<<<<<< HEAD
 +#: eval.c:1160
 +msgid "attempt to field reference from non-numeric value"
 +msgstr ""
 +
 +#: eval.c:1162
 +msgid "attempt to field reference from null string"
 +msgstr ""
 +
 +#: eval.c:1170
 +#, c-format
 +msgid "attempt to access field %ld"
 +msgstr ""
 +
 +#: eval.c:1179
 +#, c-format
 +msgid "reference to uninitialized field `$%ld'"
 +msgstr ""
 +
 +#: eval.c:1266
 +#, c-format
 +msgid "function `%s' called with more arguments than declared"
  msgstr ""
  
 -#: builtin.c:1781
 -msgid "mktime: received non-string argument"
 +#: eval.c:1461
 +#, c-format
 +msgid "unwind_stack: unexpected type `%s'"
  msgstr ""
  
 -#: builtin.c:1798
 -msgid "mktime: at least one of the values is out of the default range"
 +#: eval.c:1557
 +msgid "division by zero attempted in `/='"
  msgstr ""
  
 -#: builtin.c:1833
 -msgid "'system' function not allowed in sandbox mode"
 +#: eval.c:1564
 +#, c-format
 +msgid "division by zero attempted in `%%='"
  msgstr ""
  
 -#: builtin.c:1838
 -msgid "system: received non-string argument"
 +#: ext.c:85
 +msgid "extensions are not allowed in sandbox mode"
  msgstr ""
  
 -#: builtin.c:1893 eval.c:1159 eval.c:1795 eval.c:1809
 -#, c-format
 -msgid "reference to uninitialized variable `%s'"
 +#: ext.c:88
 +msgid "-l / @load are gawk extensions"
  msgstr ""
  
 -#: builtin.c:1960
 -#, c-format
 -msgid "reference to uninitialized field `$%d'"
 +#: ext.c:91
 +msgid "load_ext: received NULL lib_name"
  msgstr ""
  
 +#: ext.c:94
++=======
+ #: builtin.c:2047
+ msgid "tolower: received non-string argument"
+ msgstr ""
+ 
+ #: builtin.c:2081
+ msgid "toupper: received non-string argument"
+ msgstr ""
+ 
+ #: builtin.c:2117
+ msgid "atan2: received non-numeric first argument"
+ msgstr ""
+ 
+ #: builtin.c:2119
+ msgid "atan2: received non-numeric second argument"
+ msgstr ""
+ 
+ #: builtin.c:2138
+ msgid "sin: received non-numeric argument"
+ msgstr ""
+ 
+ #: builtin.c:2154
+ msgid "cos: received non-numeric argument"
+ msgstr ""
+ 
+ #: builtin.c:2207
+ msgid "srand: received non-numeric argument"
+ msgstr ""
+ 
+ #: builtin.c:2238
+ msgid "match: third argument is not an array"
+ msgstr ""
+ 
+ #: builtin.c:2502
+ msgid "gensub: third argument of 0 treated as 1"
+ msgstr ""
+ 
+ #: builtin.c:2795
+ msgid "lshift: received non-numeric first argument"
+ msgstr ""
+ 
+ #: builtin.c:2797
+ msgid "lshift: received non-numeric second argument"
+ msgstr ""
+ 
+ #: builtin.c:2803
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "lshift(%f, %f): negative values will give strange results"
 +msgid "load_ext: cannot open library `%s' (%s)\n"
  msgstr ""
  
++<<<<<<< HEAD
 +#: ext.c:100
++=======
+ #: builtin.c:2805
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "lshift(%f, %f): fractional values will be truncated"
 +msgid ""
 +"load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n"
  msgstr ""
  
++<<<<<<< HEAD
 +#: ext.c:106
++=======
+ #: builtin.c:2807
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "lshift(%f, %f): too large shift value will give strange results"
 +msgid "load_ext: library `%s': cannot call function `%s' (%s)\n"
  msgstr ""
  
++<<<<<<< HEAD
 +#: ext.c:110
 +#, c-format
 +msgid "load_ext: library `%s' initialization routine `%s' failed\n"
 +msgstr ""
 +
 +#: ext.c:129
 +msgid "make_builtin: missing function name"
 +msgstr ""
 +
 +#: ext.c:146
++=======
+ #: builtin.c:2832
+ msgid "rshift: received non-numeric first argument"
+ msgstr ""
+ 
+ #: builtin.c:2834
+ msgid "rshift: received non-numeric second argument"
+ msgstr ""
+ 
+ #: builtin.c:2840
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "rshift(%f, %f): negative values will give strange results"
 +msgid "make_builtin: can't redefine function `%s'"
  msgstr ""
  
++<<<<<<< HEAD
 +#: ext.c:150
++=======
+ #: builtin.c:2842
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "rshift(%f, %f): fractional values will be truncated"
 +msgid "make_builtin: function `%s' already defined"
  msgstr ""
  
++<<<<<<< HEAD
 +#: ext.c:154
 +#, c-format
 +msgid "make_builtin: function name `%s' previously defined"
 +msgstr ""
 +
 +#: ext.c:156
++=======
+ #: builtin.c:2844
+ #, c-format
+ msgid "rshift(%f, %f): too large shift value will give strange results"
+ msgstr ""
+ 
+ #: builtin.c:2869
+ msgid "and: received non-numeric first argument"
+ msgstr ""
+ 
+ #: builtin.c:2871
+ msgid "and: received non-numeric second argument"
+ msgstr ""
+ 
+ #: builtin.c:2877
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "and(%f, %f): negative values will give strange results"
 +msgid "make_builtin: can't use gawk built-in `%s' as function name"
  msgstr ""
  
++<<<<<<< HEAD
 +#: ext.c:159
++=======
+ #: builtin.c:2879
++>>>>>>> gawk-4.0-stable
 +#, c-format
 +msgid "make_builtin: negative argument count for function `%s'"
 +msgstr ""
 +
++<<<<<<< HEAD
 +#: ext.c:223
  #, c-format
 -msgid "and(%f, %f): fractional values will be truncated"
 +msgid "function `%s' defined to take no more than %d argument(s)"
 +msgstr ""
 +
 +#: ext.c:226
 +#, c-format
 +msgid "function `%s': missing argument #%d"
  msgstr ""
  
 +#: ext.c:243
++=======
+ #: builtin.c:2904
+ msgid "or: received non-numeric first argument"
+ msgstr ""
+ 
+ #: builtin.c:2906
+ msgid "or: received non-numeric second argument"
+ msgstr ""
+ 
+ #: builtin.c:2912
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "or(%f, %f): negative values will give strange results"
 +msgid "function `%s': argument #%d: attempt to use scalar as an array"
  msgstr ""
  
++<<<<<<< HEAD
 +#: ext.c:247
++=======
+ #: builtin.c:2914
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "or(%f, %f): fractional values will be truncated"
 +msgid "function `%s': argument #%d: attempt to use array as a scalar"
 +msgstr ""
 +
++<<<<<<< HEAD
 +#: ext.c:261
 +msgid "dynamic loading of library not supported"
 +msgstr ""
 +
 +#: extension/filefuncs.c:75
 +msgid "chdir: called with incorrect number of arguments, expecting 1"
  msgstr ""
  
 +#: extension/filefuncs.c:317
++=======
+ #: builtin.c:2942
+ msgid "xor: received non-numeric first argument"
+ msgstr ""
+ 
+ #: builtin.c:2944
+ msgid "xor: received non-numeric second argument"
+ msgstr ""
+ 
+ #: builtin.c:2950
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "xor(%f, %f): negative values will give strange results"
 +msgid "stat: unable to read symbolic link `%s'"
 +msgstr ""
 +
++<<<<<<< HEAD
 +#: extension/filefuncs.c:350
 +msgid "stat: called with wrong number of arguments"
 +msgstr ""
 +
 +#: extension/filefuncs.c:357
 +msgid "stat: bad parameters"
  msgstr ""
  
 +#: extension/filefuncs.c:410
++=======
+ #: builtin.c:2952
+ #, c-format
+ msgid "xor(%f, %f): fractional values will be truncated"
+ msgstr ""
+ 
+ #: builtin.c:2976 builtin.c:2982
+ msgid "compl: received non-numeric argument"
+ msgstr ""
+ 
+ #: builtin.c:2984
++>>>>>>> gawk-4.0-stable
  #, c-format
 -msgid "compl(%f): negative value will give strange results"
 +msgid "fts init: could not create constant %s"
  msgstr ""
  
++<<<<<<< HEAD
 +#: extension/filefuncs.c:430
 +msgid "fill_stat_element: could not create array"
 +msgstr ""
 +
 +#: extension/filefuncs.c:439
 +msgid "fill_stat_element: could not set element"
++=======
+ #: builtin.c:2986
+ #, c-format
+ msgid "compl(%f): fractional value will be truncated"
+ msgstr ""
+ 
+ #: builtin.c:3155
+ #, c-format
+ msgid "dcgettext: `%s' is not a valid locale category"
++>>>>>>> gawk-4.0-stable
  msgstr ""
  
 -#: eval.c:412
 -#, c-format
 -msgid "unknown nodetype %d"
 +#: extension/filefuncs.c:454
 +msgid "fill_path_element: could not set element"
  msgstr ""
  
 -#: eval.c:423 eval.c:437
 -#, c-format
 -msgid "unknown opcode %d"
 +#: extension/filefuncs.c:470
 +msgid "fill_error_element: could not set element"
  msgstr ""
  
 -#: eval.c:434
 -#, c-format
 -msgid "opcode %s not an operator or keyword"
 +#: extension/filefuncs.c:517 extension/filefuncs.c:564
 +msgid "fts-process: could not create array"
  msgstr ""
  
 -#: eval.c:488
 -msgid "buffer overflow in genflags2str"
 +#: extension/filefuncs.c:527 extension/filefuncs.c:574
 +#: extension/filefuncs.c:592
 +msgid "fts-process: could not set element"
  msgstr ""
  
 -#: eval.c:698
 -#, c-format
 -msgid ""
 -"\n"
 -"\t# Function Call Stack:\n"
 -"\n"
 +#: extension/filefuncs.c:641
 +msgid "fts: called with incorrect number of arguments, expecting 3"
  msgstr ""
  
 -#: eval.c:725
 -msgid "`IGNORECASE' is a gawk extension"
 +#: extension/filefuncs.c:644
 +msgid "fts: bad first parameter"
  msgstr ""
  
 -#: eval.c:754
 -msgid "`BINMODE' is a gawk extension"
 +#: extension/filefuncs.c:650
 +msgid "fts: bad second parameter"
  msgstr ""
  
 -#: eval.c:813
 -#, c-format
 -msgid "BINMODE value `%s' is invalid, treated as 3"
 +#: extension/filefuncs.c:656
 +msgid "fts: bad third parameter"
  msgstr ""
  
 -#: eval.c:902
 -#, c-format
 -msgid "bad `%sFMT' specification `%s'"
 +#: extension/filefuncs.c:663
 +msgid "fts: could not flatten array\n"
  msgstr ""
  
 -#: eval.c:980
 -msgid "turning off `--lint' due to assignment to `LINT'"
 +#: extension/filefuncs.c:681
 +msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
  msgstr ""
  
 -#: eval.c:1127 eval.c:1777
 -#, c-format
 -msgid "can't use function name `%s' as variable or array"
 +#: extension/filefuncs.c:698
 +msgid "fts: clear_array() failed\n"
  msgstr ""
  
++<<<<<<< HEAD
 +#: extension/fnmatch.c:91
 +msgid "fnmatch: called with less than three arguments"
++=======
+ #: eval.c:1158 eval.c:1794 eval.c:1808
+ #, c-format
+ msgid "reference to uninitialized argument `%s'"
++>>>>>>> gawk-4.0-stable
  msgstr ""
  
 -#: eval.c:1177
 -msgid "attempt to field reference from non-numeric value"
 +#: extension/fnmatch.c:94
 +msgid "fnmatch: called with more than three arguments"
  msgstr ""
  
 -#: eval.c:1179
 -msgid "attempt to field reference from null string"
 +#: extension/fnmatch.c:97
 +msgid "fnmatch: could not get first argument"
  msgstr ""
  
 -#: eval.c:1185
 -#, c-format
 -msgid "attempt to access field %ld"
 +#: extension/fnmatch.c:102
 +msgid "fnmatch: could not get second argument"
  msgstr ""
  
 -#: eval.c:1194
 -#, c-format
 -msgid "reference to uninitialized field `$%ld'"
 +#: extension/fnmatch.c:107
 +msgid "fnmatch: could not get third argument"
  msgstr ""
  
 -#: eval.c:1256
 -#, c-format
 -msgid "function `%s' called with more arguments than declared"
 +#: extension/fnmatch.c:120
 +msgid "fnmatch is not implemented on this system\n"
 +msgstr ""
 +
 +#: extension/fnmatch.c:152
 +msgid "fnmatch init: could not add FNM_NOMATCH variable"
  msgstr ""
  
 -#: eval.c:1437
 +#: extension/fnmatch.c:162
  #, c-format
 -msgid "unwind_stack: unexpected type `%s'"
 +msgid "fnmatch init: could not set array element %s"
  msgstr ""
  
 -#: eval.c:1532
 -msgid "division by zero attempted in `/='"
 +#: extension/fnmatch.c:172
 +msgid "fnmatch init: could not install FNM array"
  msgstr ""
  
 -#: eval.c:1539
 -#, c-format
 -msgid "division by zero attempted in `%%='"
++<<<<<<< HEAD
 +#: extension/fork.c:81
 +msgid "fork: called with too many arguments"
 +msgstr ""
 +
 +#: extension/fork.c:94
 +msgid "fork: PROCINFO is not an array!"
 +msgstr ""
 +
 +#: extension/fork.c:118
 +msgid "waitpid: called with too many arguments"
 +msgstr ""
 +
 +#: extension/fork.c:126
 +msgid "wait: called with no arguments"
 +msgstr ""
 +
 +#: extension/fork.c:143
 +msgid "wait: called with too many arguments"
 +msgstr ""
 +
 +#: extension/ordchr.c:69
 +msgid "ord: called with too many arguments"
 +msgstr ""
 +
 +#: extension/ordchr.c:75
 +msgid "ord: called with no arguments"
 +msgstr ""
 +
 +#: extension/ordchr.c:77
 +msgid "ord: called with inappropriate argument(s)"
 +msgstr ""
 +
 +#: extension/ordchr.c:99
 +msgid "chr: called with too many arguments"
 +msgstr ""
 +
 +#: extension/ordchr.c:109
 +msgid "chr: called with no arguments"
 +msgstr ""
 +
 +#: extension/ordchr.c:111
 +msgid "chr: called with inappropriate argument(s)"
  msgstr ""
  
 +#: extension/readfile.c:81
 +msgid "readfile: called with too many arguments"
++=======
+ #: eval.c:1882 eval.c:2128
+ #, c-format
+ msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+ msgstr ""
+ 
+ #: eval.c:1913
+ msgid "assignment used in conditional context"
+ msgstr ""
+ 
+ #: eval.c:1917
+ msgid "statement has no effect"
+ msgstr ""
+ 
+ #: eval.c:2361
+ #, c-format
+ msgid "for loop: array `%s' changed size from %ld to %ld during loop 
execution"
+ msgstr ""
+ 
+ #: eval.c:2476
+ #, c-format
+ msgid "function called indirectly through `%s' does not exist"
+ msgstr ""
+ 
+ #: eval.c:2488
+ #, c-format
+ msgid "function `%s' not defined"
+ msgstr ""
+ 
+ #: eval.c:2529
+ #, c-format
+ msgid "non-redirected `getline' invalid inside `%s' rule"
+ msgstr ""
+ 
+ #: eval.c:2618
+ #, c-format
+ msgid "error reading input file `%s': %s"
+ msgstr ""
+ 
+ #: eval.c:2632
+ #, c-format
+ msgid "`nextfile' cannot be called from a `%s' rule"
+ msgstr ""
+ 
+ #: eval.c:2679
+ msgid "`exit' cannot be called in the current context"
+ msgstr ""
+ 
+ #: eval.c:2718
+ #, c-format
+ msgid "`next' cannot be called from a `%s' rule"
+ msgstr ""
+ 
+ #: eval.c:2784
+ #, c-format
+ msgid "Sorry, don't know how to interpret `%s'"
++>>>>>>> gawk-4.0-stable
  msgstr ""
  
 -#: ext.c:54
 -msgid "extensions are not allowed in sandbox mode"
 +#: extension/readfile.c:114
 +msgid "readfile: called with no arguments"
  msgstr ""
  
 -#: ext.c:60 ext.c:65
 -msgid "`extension' is a gawk extension"
 +#: extension/rwarray.c:120
 +msgid "writea: called with too many arguments"
  msgstr ""
  
 -#: ext.c:75
 +#: extension/rwarray.c:127
  #, c-format
 -msgid "fatal: extension: cannot open `%s' (%s)\n"
 +msgid "do_writea: argument 0 is not a string\n"
  msgstr ""
  
 -#: ext.c:84
 +#: extension/rwarray.c:133
  #, c-format
 -msgid ""
 -"fatal: extension: library `%s': does not define "
 -"`plugin_is_GPL_compatible' (%s)\n"
 +msgid "do_writea: argument 1 is not an array\n"
  msgstr ""
  
 -#: ext.c:93
 +#: extension/rwarray.c:180
  #, c-format
 -msgid "fatal: extension: library `%s': cannot call function `%s' (%s)\n"
 +msgid "write_array: could not flatten array\n"
  msgstr ""
  
 -#: ext.c:127
 -msgid "extension: missing function name"
 +#: extension/rwarray.c:194
 +#, c-format
 +msgid "write_array: could not release flattened array\n"
  msgstr ""
  
 -#: ext.c:132
 -#, c-format
 -msgid "extension: illegal character `%c' in function name `%s'"
 +#: extension/rwarray.c:276
 +msgid "reada: called with too many arguments"
  msgstr ""
  
 -#: ext.c:141
 +#: extension/rwarray.c:283
  #, c-format
 -msgid "extension: can't redefine function `%s'"
 +msgid "do_reada: argument 0 is not a string\n"
  msgstr ""
  
 -#: ext.c:145
 +#: extension/rwarray.c:289
  #, c-format
 -msgid "extension: function `%s' already defined"
 +msgid "do_reada: argument 1 is not an array\n"
  msgstr ""
  
 -#: ext.c:150
 +#: extension/rwarray.c:333
  #, c-format
 -msgid "extension: function name `%s' previously defined"
 +msgid "do_reada: clear_array failed\n"
  msgstr ""
  
 -#: ext.c:152
 +#: extension/rwarray.c:370
  #, c-format
 -msgid "extension: can't use gawk built-in `%s' as function name"
 +msgid "read_array: set_array_element failed\n"
  msgstr ""
  
 -#: ext.c:156
 -#, c-format
 -msgid "make_builtin: negative argument count for function `%s'"
 +#: extension/time.c:78
 +msgid "gettimeofday: ignoring arguments"
  msgstr ""
  
 -#: ext.c:259
 -#, c-format
 -msgid "function `%s' defined to take no more than %d argument(s)"
 +#: extension/time.c:109
 +msgid "gettimeofday: not supported on this platform"
  msgstr ""
  
 -#: ext.c:262
 -#, c-format
 -msgid "function `%s': missing argument #%d"
 +#: extension/time.c:130
 +msgid "sleep: called with too many arguments"
  msgstr ""
  
 -#: ext.c:279
 -#, c-format
 -msgid "function `%s': argument #%d: attempt to use scalar as an array"
 +#: extension/time.c:133
 +msgid "sleep: missing required numeric argument"
  msgstr ""
  
 -#: ext.c:283
 -#, c-format
 -msgid "function `%s': argument #%d: attempt to use array as a scalar"
 +#: extension/time.c:139
 +msgid "sleep: argument is negative"
  msgstr ""
  
 -#: ext.c:296
 -msgid "Operation Not Supported"
 +#: extension/time.c:166
 +msgid "sleep: not supported on this platform"
  msgstr ""
  
 -#: field.c:328
 +#: field.c:339
  msgid "NF set to negative value"
  msgstr ""
  
diff --cc posix/ChangeLog
index 17a93f7,83d208f..ce5cd2c
--- a/posix/ChangeLog
+++ b/posix/ChangeLog
@@@ -1,30 -1,7 +1,34 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
 +2012-10-14         Arnold D. Robbins     <address@hidden>
 +
 +      * gawkmisc.c (os_isreadable): Change name of input parameter to
 +      awk_inputbuf_t.
 +
 +2012-08-08         Arnold D. Robbins     <address@hidden>
 +
 +      * gawkmisc.pc (os_isreadable): Take IOBUF_PUBLIC instead of fd and
 +      use passed in info.
 +
 +2012-07-29         Arnold D. Robbins     <address@hidden>
 +
 +      * gawkmisc.c (os_isreadable): Add isdir pointer parameter to be
 +      set to true if fd is for a directory.
 +
 +2012-07-26         Arnold D. Robbins     <address@hidden>
 +
 +      * gawkmisc.c (os_isreadable): New function.
 +
 +2012-05-11         Arnold D. Robbins     <address@hidden>
 +
 +      * gawkmisc.c: Use `bool', `true', and `false' everywhere.
 +
 +2012-03-20         Andrew J. Schorr     <address@hidden>
 +
 +      * gawkmisc.c (deflibpath): New global variable.
 +
  2012-03-28         Arnold D. Robbins     <address@hidden>
  
        * 4.0.1: Release tar ball made.
diff --cc test/ChangeLog
index 1897aed,821b75d..1d01546
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@@ -1,52 -1,13 +1,62 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * 4.0.2: Release tar ball made.
+ 
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * Makefile.am (paramuninitglobal): New test.
+       * paramuninitglobal.awk, paramuninitglobal.ok: New files.
+       Thanks to John Haque.
+ 
 +2012-12-19         Arnold D. Robbins     <address@hidden>
 +
 +      * symtab9.awk, symtab9.ok: New files.
 +      * Makefile.am (EXTRA_DIST): Add new files.
 +      (symtab9): New test.
 +      * symtab1.ok, testext.ok: Updated.
 +
 +2012-12-16         Arnold D. Robbins     <address@hidden>
 +
 +      * symtab7.awk, symtab7.in, symtab7.ok, symtab8.awk, symtab8.in,
 +      symtab8.ok: New files.
 +      * Makefile.am (EXTRA_DIST): Add new files.
 +      (symtab7, symtab8): New tests.
 +      Thanks to Assaf Gordon <address@hidden>.
 +
 +2012-11-19         Arnold D. Robbins     <address@hidden>
 +
 +      * Makefile.am (readdir): Add a 'this could fail message'.
 +      * readdir.awk: Revise to match simplified behavior of the extension.
 +
 +2012-11-13         Arnold D. Robbins     <address@hidden>
 +
 +      * Makefile.am (GAWK_EXTRA_TESTS): Move to sorted order of tests.
 +
 +2012-11-12         Arnold D. Robbins     <address@hidden>
 +
 +      * symtab6.ok: Remove PROCINFO.
 +      * Makefile.am (symtab6): Adjust recipe.
 +
 +2012-11-10         Arnold D. Robbins     <address@hidden>
 +
 +      * symtab4.awk, symtab4.in, symtab4.ok, symtab5.awk, symtab5.in,
 +      symtab5.ok, symtab6.awk: New files.
 +      * Makefile.am (EXTRA_DIST): Add new files.
 +      (symtab4, symtab5, symtab6): New tests.
 +      Thanks to Assaf Gordon <address@hidden>.
 +
 +2012-10-28         Andrew J. Schorr     <address@hidden>
 +
 +      * messages.awk, fts.awk: Adjusted so make diffout will work.
 +      * Makefile.am (messages): Adjust to use standard failure test for
 +      make diffout.
 +
 +2012-10-19         Arnold D. Robbins     <address@hidden>
 +
 +      * symtab1.awk: Adjust to not print ENVIRON and PROCINFO which won't
 +      be the same as on the author's machine.
 +      * lintwarn.ok: Adjust.
 +
  2012-10-13         Arnold D. Robbins     <address@hidden>
  
        * Makefile.am (EXTRA_DIST): Add jarebug.sh.
diff --cc test/Makefile.in
index 6cdff55,38a5d00..2316cf7
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@@ -2696,8 -2453,13 +2698,13 @@@ paramtyp
        @AWKPATH=$(srcdir) $(AWK) -f address@hidden  >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
  
+ paramuninitglobal:
 -      @echo paramuninitglobal
++      @echo $@
+       @AWKPATH=$(srcdir) $(AWK) -f address@hidden  >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
+       @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
+ 
  parse1:
 -      @echo parse1
 +      @echo $@
        @AWKPATH=$(srcdir) $(AWK) -f address@hidden  < $(srcdir)/address@hidden 
>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
  
diff --cc test/Maketests
index 457363e,eda4645..be8b53b
--- a/test/Maketests
+++ b/test/Maketests
@@@ -595,8 -595,13 +595,13 @@@ paramtyp
        @AWKPATH=$(srcdir) $(AWK) -f address@hidden  >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
  
+ paramuninitglobal:
 -      @echo paramuninitglobal
++      @echo $@
+       @AWKPATH=$(srcdir) $(AWK) -f address@hidden  >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
+       @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
+ 
  parse1:
 -      @echo parse1
 +      @echo $@
        @AWKPATH=$(srcdir) $(AWK) -f address@hidden  < $(srcdir)/address@hidden 
>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
  
diff --cc vms/ChangeLog
index 6c56405,a04aa3c..9e2f629
--- a/vms/ChangeLog
+++ b/vms/ChangeLog
@@@ -1,23 -1,17 +1,37 @@@
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * vmstest.com (paramuninitglobal): New test.
+ 
+       And then:
+ 
+       * 4.0.2: Release tar ball made.
+ 
+ 2012-12-23         Arnold D. Robbins     <address@hidden>
+ 
+       * vmsbuild.com (REL, PATCHLVL): Move to 4.0.2.
+       * descrip.mms (REL, PATCHLVL): Move to 4.0.2.
+       * vms-conf.h (VERSION, PACKAGE_VERSION, PACKAGE_STRING): Move to 4.0.2.
+ 
 +2012-12-18         John E. Malmberg   <address@hidden>
 +
 +      * descrip.mms: Make the build procedure run on a default directory
 +      that is on a VMS logical name search list.
 +      * vmstest.com: Make the tests run on a default directory that is on
 +      a VMS logical name search list.
 +
 +2012-12-13         Anders Wallin         <address@hidden>
 +
 +      * descrip.mms: Update to handle removal of pgawk and dgawk,
 +      workaround for MMS bug
 +
 +2012-12-09         Anders Wallin         <address@hidden>
 +
 +      * vmstest.com: Updated to match main test/Makefile.
 +
 +2012-12-02         Arnold D. Robbins     <address@hidden>
 +
 +      * vms_gawk.c (CmdName): Force to just "GAWK".
 +
  2012-11-24         Arnold D. Robbins     <address@hidden>
  
        * vmstest.com: Fix typo in applying previous patch.
diff --cc vms/descrip.mms
index 069c45f,d431af8..77dad90
--- a/vms/descrip.mms
+++ b/vms/descrip.mms
@@@ -113,12 -120,31 +113,12 @@@ VMSOBJS = $(VMSCODE),$(VMSCMD
  DOCS= $(DOCDIR)gawk.1,$(DOCDIR)gawk.texi,$(DOCDIR)texinfo.tex
  
  # Release of gawk
--REL=4.0
- PATCHLVL=1
 -PATCHLVL=2
++REL=4.1
++PATCHLVL=0
  
  # generic target
 -all : gawk,pgawk,dgawk
 -      $(NOOP)
 +all : gawk
 +      @       $(NOOP)
  
  # dummy target to allow building "gawk" in addition to explicit "gawk.exe"
  gawk : gawk.exe

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                  |   16 +
 Checklist                  |    5 +-
 README                     |    2 +-
 README_d/ChangeLog         |    4 +
 awkgram.c                  |  400 ++++++++++++++-------------
 awkgram.y                  |   18 +-
 awklib/ChangeLog           |    4 +
 builtin.c                  |    3 +
 doc/ChangeLog              |    9 +
 doc/awkcard.in             |    2 +-
 extension/ChangeLog        |    4 +
 interpret.h                |    8 +-
 m4/ChangeLog               |    4 +
 missing_d/ChangeLog        |    4 +
 pc/ChangeLog               |    8 +
 pc/Makefile.tst            |    7 +-
 po/ChangeLog               |    4 +
 po/gawk.pot                |  654 ++++++++++++++++++++++++++++++++++++++++++++
 posix/ChangeLog            |    4 +
 test/ChangeLog             |   10 +
 test/Makefile.am           |    6 +-
 test/Makefile.in           |   11 +-
 test/Maketests             |    5 +
 test/paramuninitglobal.awk |    2 +
 test/paramuninitglobal.ok  |    2 +
 vms/ChangeLog              |   14 +
 vms/descrip.mms            |    4 +-
 vms/vms-conf.h             |    6 +-
 vms/vmstest.com            |    4 +-
 29 files changed, 1014 insertions(+), 210 deletions(-)
 create mode 100644 test/paramuninitglobal.awk
 create mode 100644 test/paramuninitglobal.ok


hooks/post-receive
-- 
gawk



reply via email to

[Prev in Thread] Current Thread [Next in Thread]