summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--awk.h41
-rw-r--r--awkgram.c965
-rw-r--r--awkgram.y121
-rw-r--r--debug.c4
-rw-r--r--main.c2
-rw-r--r--mpfr.c4
-rw-r--r--node.c11
-rw-r--r--profile.c10
-rw-r--r--symbol.c7
9 files changed, 716 insertions, 449 deletions
diff --git a/awk.h b/awk.h
index cb7c4990..4637d2e8 100644
--- a/awk.h
+++ b/awk.h
@@ -1136,10 +1136,11 @@ extern int sourceline;
extern char *source;
extern int errcount;
extern int (*interpret)(INSTRUCTION *); /* interpreter routine */
-extern NODE *(*make_number)(double); /* double instead of AWKNUM on purpose */
+extern NODE *(*make_number)(double, const char *file, int line, const char *func); /* double instead of AWKNUM on purpose */
extern NODE *(*str2number)(NODE *);
extern NODE *(*format_val)(const char *, int, NODE *);
extern int (*cmp_numbers)(const NODE *, const NODE *);
+#define make_number(v) make_number(v, __FILE__, __LINE__, __func__)
/* built-in array types */
extern const array_funcs_t str_array_func;
@@ -1237,6 +1238,8 @@ extern const char awk_namespace[]; /* "awk" */
extern const char *current_namespace;
extern bool namespace_changed;
+extern NODE *watched;
+
/* ------------------------- Runtime stack -------------------------------- */
typedef union stack_item {
@@ -1273,13 +1276,22 @@ extern STACK_ITEM *stack_top;
* When in doubt, use dupnode.
*/
-#define UPREF(r) (void) ((r)->valref++)
+static inline void
+UPREF_real(NODE *r, const char *file, int line, const char *func)
+{
+ if (watched && r == watched)
+ fprintf(stderr, "%s:%d:%s: increment 1\n", file, line, func);
+ r->valref++;
+}
+#define UPREF(r) UPREF_real((r), __FILE__, __LINE__, __func__)
extern void r_unref(NODE *tmp);
static inline void
-DEREF(NODE *r)
+DEREF_real(NODE *r, const char *file, int line, const char *func)
{
+ if (watched && r == watched)
+ fprintf(stderr, "%s:%d:%s: decrement 1\n", file, line, func);
assert(r->valref > 0);
#ifndef GAWKDEBUG
if (--r->valref > 0)
@@ -1287,6 +1299,7 @@ DEREF(NODE *r)
#endif
r_unref(r);
}
+#define DEREF(r) DEREF_real((r), __FILE__, __LINE__, __func__)
#define POP_NUMBER() force_number(POP_SCALAR())
#define TOP_NUMBER() force_number(TOP_SCALAR())
@@ -1896,14 +1909,17 @@ in_array(NODE *a, NODE *s)
/* dupnode --- up the reference on a node */
static inline NODE *
-dupnode(NODE *n)
+dupnode_real(NODE *n, const char *file, int line, const char *func)
{
if ((n->flags & MALLOC) != 0) {
+ if (watched && n == watched)
+ fprintf(stderr, "%s:%d:%s: increment 2\n", file, line, func);
n->valref++;
return n;
}
return r_dupnode(n);
}
+#define dupnode(r) dupnode_real((r), __FILE__, __LINE__, __func__)
#endif
/*
@@ -1944,12 +1960,15 @@ force_string_fmt(NODE *s, const char *fmtstr, int fmtidx)
/* unref --- decrease the reference count and/or free a node */
static inline void
-unref(NODE *r)
+unref_real(NODE *r, const char *file, int line, const char *func)
{
+ if (watched && r == watched)
+ fprintf(stderr, "%s:%d:%s: decrement 2\n", file, line, func);
assert(r == NULL || r->valref > 0);
if (r != NULL && --r->valref <= 0)
r_unref(r);
}
+#define unref(r) unref_real((r), __FILE__, __LINE__, __func__)
/* force_number --- force a node to have a numeric value */
@@ -2062,6 +2081,8 @@ make_number_node(unsigned int flags)
{
NODE *r;
getnode(r);
+ if (watched && r == watched)
+ fprintf(stderr, "got %#p from getnode!\n");
memset(r, 0, sizeof(*r));
r->type = Node_val;
r->valref = 1;
@@ -2072,16 +2093,24 @@ make_number_node(unsigned int flags)
/* assoc_set -- set an element in an array. Does unref(sub)! */
static inline void
-assoc_set(NODE *array, NODE *sub, NODE *value)
+assoc_set_real(NODE *array, NODE *sub, NODE *value,
+ const char *file, int line, const char *func)
{
NODE **lhs = assoc_lookup(array, sub);
+ if (*lhs == watched)
+ fprintf(stderr, "assoc_set 1: called from %s:%d:%s\n",
+ file, line, func);
unref(*lhs);
*lhs = value;
if (array->astore != NULL)
(*array->astore)(array, sub);
+ if (sub == watched)
+ fprintf(stderr, "assoc_set 1: called from %s:%d:%s\n",
+ file, line, func);
unref(sub);
}
+#define assoc_set(a, s, v) assoc_set_real(a, s, v, __FILE__, __LINE__, __func__)
/*
* str_terminate_f, str_terminate, str_restore: function and macros to
diff --git a/awkgram.c b/awkgram.c
index bd41a1a1..b7756e1c 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -79,6 +79,8 @@
#define signed /**/
#endif
+NODE *watched = NULL;
+
static void yyerror(const char *m, ...) ATTRIBUTE_PRINTF_1;
static void error_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
static void lintwarn_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
@@ -111,6 +113,7 @@ static INSTRUCTION *outer_comment;
static INSTRUCTION *interblock_comment;
static INSTRUCTION *pending_comment;
static INSTRUCTION *namespace_chain;
+bool trace = false;
#ifdef DEBUG_COMMENTS
static void
@@ -232,7 +235,7 @@ extern double fmod(double x, double y);
#define YYSTYPE INSTRUCTION *
-#line 236 "awkgram.c"
+#line 239 "awkgram.c"
# ifndef YY_CAST
# ifdef __cplusplus
@@ -926,27 +929,27 @@ static const yytype_int8 yytranslate[] =
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_int16 yyrline[] =
{
- 0, 232, 232, 233, 238, 248, 252, 264, 272, 286,
- 297, 307, 317, 330, 340, 342, 347, 357, 359, 364,
- 366, 368, 374, 378, 383, 413, 425, 437, 443, 452,
- 470, 471, 482, 488, 496, 497, 501, 501, 535, 534,
- 568, 583, 585, 590, 591, 611, 616, 617, 621, 632,
- 637, 644, 752, 803, 853, 979, 1001, 1022, 1032, 1042,
- 1052, 1063, 1076, 1094, 1093, 1110, 1128, 1128, 1230, 1230,
- 1263, 1293, 1301, 1302, 1308, 1309, 1316, 1321, 1334, 1349,
- 1351, 1359, 1366, 1368, 1376, 1385, 1387, 1396, 1397, 1405,
- 1410, 1410, 1423, 1430, 1443, 1447, 1469, 1470, 1476, 1477,
- 1486, 1487, 1492, 1497, 1514, 1516, 1518, 1525, 1526, 1532,
- 1533, 1538, 1540, 1547, 1549, 1557, 1562, 1573, 1574, 1579,
- 1581, 1588, 1590, 1598, 1603, 1613, 1614, 1619, 1620, 1625,
- 1632, 1636, 1638, 1640, 1653, 1670, 1680, 1687, 1689, 1694,
- 1696, 1698, 1706, 1708, 1713, 1715, 1720, 1722, 1724, 1781,
- 1783, 1785, 1787, 1789, 1791, 1793, 1795, 1809, 1814, 1819,
- 1845, 1851, 1853, 1855, 1857, 1859, 1861, 1866, 1870, 1902,
- 1910, 1916, 1922, 1935, 1936, 1937, 1942, 1947, 1951, 1955,
- 1970, 1991, 1996, 2033, 2070, 2071, 2077, 2078, 2083, 2085,
- 2092, 2109, 2126, 2128, 2135, 2140, 2146, 2157, 2169, 2178,
- 2182, 2187, 2191, 2195, 2199, 2204, 2205, 2209, 2213, 2217
+ 0, 235, 235, 236, 241, 251, 255, 267, 275, 289,
+ 300, 310, 320, 333, 343, 345, 350, 360, 362, 367,
+ 369, 371, 377, 381, 386, 416, 428, 440, 446, 455,
+ 473, 474, 485, 491, 499, 500, 504, 504, 538, 537,
+ 571, 586, 588, 593, 594, 614, 619, 620, 624, 635,
+ 640, 647, 755, 806, 856, 982, 1004, 1025, 1035, 1045,
+ 1055, 1066, 1079, 1097, 1096, 1113, 1131, 1131, 1233, 1233,
+ 1275, 1305, 1313, 1314, 1320, 1321, 1328, 1333, 1346, 1361,
+ 1363, 1371, 1378, 1380, 1388, 1397, 1399, 1408, 1409, 1417,
+ 1422, 1422, 1435, 1442, 1455, 1459, 1481, 1482, 1488, 1489,
+ 1498, 1499, 1504, 1509, 1526, 1528, 1530, 1537, 1538, 1544,
+ 1545, 1550, 1552, 1559, 1561, 1569, 1574, 1585, 1586, 1591,
+ 1593, 1600, 1602, 1610, 1615, 1625, 1626, 1631, 1632, 1637,
+ 1644, 1648, 1650, 1652, 1665, 1682, 1692, 1699, 1701, 1706,
+ 1708, 1710, 1718, 1720, 1725, 1727, 1732, 1734, 1736, 1793,
+ 1795, 1797, 1799, 1801, 1803, 1805, 1807, 1821, 1826, 1831,
+ 1857, 1863, 1865, 1867, 1869, 1871, 1873, 1878, 1882, 1914,
+ 1922, 1928, 1934, 1947, 1948, 1949, 1954, 1959, 1963, 1967,
+ 1982, 2003, 2008, 2045, 2082, 2083, 2089, 2090, 2095, 2097,
+ 2104, 2121, 2138, 2140, 2147, 2152, 2158, 2169, 2181, 2190,
+ 2194, 2199, 2203, 2207, 2211, 2216, 2217, 2221, 2225, 2229
};
#endif
@@ -1948,22 +1951,22 @@ yyreduce:
switch (yyn)
{
case 2: /* program: %empty */
-#line 232 "awkgram.y"
+#line 235 "awkgram.y"
{ yyval = NULL; }
-#line 1954 "awkgram.c"
+#line 1957 "awkgram.c"
break;
case 3: /* program: program rule */
-#line 234 "awkgram.y"
+#line 237 "awkgram.y"
{
rule = 0;
yyerrok;
}
-#line 1963 "awkgram.c"
+#line 1966 "awkgram.c"
break;
case 4: /* program: program nls */
-#line 239 "awkgram.y"
+#line 242 "awkgram.y"
{
if (yyvsp[0] != NULL) {
if (yyvsp[-1] == NULL)
@@ -1973,19 +1976,19 @@ yyreduce:
}
yyval = yyvsp[-1];
}
-#line 1977 "awkgram.c"
+#line 1980 "awkgram.c"
break;
case 5: /* program: program LEX_EOF */
-#line 249 "awkgram.y"
+#line 252 "awkgram.y"
{
next_sourcefile();
}
-#line 1985 "awkgram.c"
+#line 1988 "awkgram.c"
break;
case 6: /* program: program error */
-#line 253 "awkgram.y"
+#line 256 "awkgram.y"
{
rule = 0;
/*
@@ -1994,11 +1997,11 @@ yyreduce:
*/
/* yyerrok; */
}
-#line 1998 "awkgram.c"
+#line 2001 "awkgram.c"
break;
case 7: /* rule: pattern action */
-#line 265 "awkgram.y"
+#line 268 "awkgram.y"
{
(void) append_rule(yyvsp[-1], yyvsp[0]);
if (pending_comment != NULL) {
@@ -2006,11 +2009,11 @@ yyreduce:
pending_comment = NULL;
}
}
-#line 2010 "awkgram.c"
+#line 2013 "awkgram.c"
break;
case 8: /* rule: pattern statement_term */
-#line 273 "awkgram.y"
+#line 276 "awkgram.y"
{
if (rule != Rule) {
msg(_("%s blocks must have an action part"), ruletab[rule]);
@@ -2024,11 +2027,11 @@ yyreduce:
(void) append_rule(yyvsp[-1], NULL);
}
}
-#line 2028 "awkgram.c"
+#line 2031 "awkgram.c"
break;
case 9: /* rule: function_prologue action */
-#line 287 "awkgram.y"
+#line 290 "awkgram.y"
{
in_function = false;
(void) mk_function(yyvsp[-1], yyvsp[0]);
@@ -2039,11 +2042,11 @@ yyreduce:
}
yyerrok;
}
-#line 2043 "awkgram.c"
+#line 2046 "awkgram.c"
break;
case 10: /* rule: '@' LEX_INCLUDE source statement_term */
-#line 298 "awkgram.y"
+#line 301 "awkgram.y"
{
want_source = false;
at_seen = false;
@@ -2053,11 +2056,11 @@ yyreduce:
}
yyerrok;
}
-#line 2057 "awkgram.c"
+#line 2060 "awkgram.c"
break;
case 11: /* rule: '@' LEX_LOAD library statement_term */
-#line 308 "awkgram.y"
+#line 311 "awkgram.y"
{
want_source = false;
at_seen = false;
@@ -2067,11 +2070,11 @@ yyreduce:
}
yyerrok;
}
-#line 2071 "awkgram.c"
+#line 2074 "awkgram.c"
break;
case 12: /* rule: '@' LEX_NAMESPACE namespace statement_term */
-#line 318 "awkgram.y"
+#line 321 "awkgram.y"
{
want_source = false;
at_seen = false;
@@ -2081,11 +2084,11 @@ yyreduce:
yyerrok;
}
-#line 2085 "awkgram.c"
+#line 2088 "awkgram.c"
break;
case 13: /* source: FILENAME */
-#line 331 "awkgram.y"
+#line 334 "awkgram.y"
{
void *srcfile = NULL;
@@ -2095,23 +2098,23 @@ yyreduce:
bcfree(yyvsp[0]);
yyval = (INSTRUCTION *) srcfile;
}
-#line 2099 "awkgram.c"
+#line 2102 "awkgram.c"
break;
case 14: /* source: FILENAME error */
-#line 341 "awkgram.y"
+#line 344 "awkgram.y"
{ yyval = NULL; }
-#line 2105 "awkgram.c"
+#line 2108 "awkgram.c"
break;
case 15: /* source: error */
-#line 343 "awkgram.y"
+#line 346 "awkgram.y"
{ yyval = NULL; }
-#line 2111 "awkgram.c"
+#line 2114 "awkgram.c"
break;
case 16: /* library: FILENAME */
-#line 348 "awkgram.y"
+#line 351 "awkgram.y"
{
void *srcfile;
@@ -2121,58 +2124,58 @@ yyreduce:
bcfree(yyvsp[0]);
yyval = (INSTRUCTION *) srcfile;
}
-#line 2125 "awkgram.c"
+#line 2128 "awkgram.c"
break;
case 17: /* library: FILENAME error */
-#line 358 "awkgram.y"
+#line 361 "awkgram.y"
{ yyval = NULL; }
-#line 2131 "awkgram.c"
+#line 2134 "awkgram.c"
break;
case 18: /* library: error */
-#line 360 "awkgram.y"
+#line 363 "awkgram.y"
{ yyval = NULL; }
-#line 2137 "awkgram.c"
+#line 2140 "awkgram.c"
break;
case 19: /* namespace: FILENAME */
-#line 365 "awkgram.y"
+#line 368 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 2143 "awkgram.c"
+#line 2146 "awkgram.c"
break;
case 20: /* namespace: FILENAME error */
-#line 367 "awkgram.y"
+#line 370 "awkgram.y"
{ yyval = NULL; }
-#line 2149 "awkgram.c"
+#line 2152 "awkgram.c"
break;
case 21: /* namespace: error */
-#line 369 "awkgram.y"
+#line 372 "awkgram.y"
{ yyval = NULL; }
-#line 2155 "awkgram.c"
+#line 2158 "awkgram.c"
break;
case 22: /* pattern: %empty */
-#line 374 "awkgram.y"
+#line 377 "awkgram.y"
{
rule = Rule;
yyval = NULL;
}
-#line 2164 "awkgram.c"
+#line 2167 "awkgram.c"
break;
case 23: /* pattern: exp */
-#line 379 "awkgram.y"
+#line 382 "awkgram.y"
{
rule = Rule;
}
-#line 2172 "awkgram.c"
+#line 2175 "awkgram.c"
break;
case 24: /* pattern: exp comma exp */
-#line 384 "awkgram.y"
+#line 387 "awkgram.y"
{
INSTRUCTION *tp;
@@ -2202,11 +2205,11 @@ yyreduce:
yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), tp);
rule = Rule;
}
-#line 2206 "awkgram.c"
+#line 2209 "awkgram.c"
break;
case 25: /* pattern: LEX_BEGIN */
-#line 414 "awkgram.y"
+#line 417 "awkgram.y"
{
static int begin_seen = 0;
@@ -2218,11 +2221,11 @@ yyreduce:
yyvsp[0]->source_file = source;
yyval = yyvsp[0];
}
-#line 2222 "awkgram.c"
+#line 2225 "awkgram.c"
break;
case 26: /* pattern: LEX_END */
-#line 426 "awkgram.y"
+#line 429 "awkgram.y"
{
static int end_seen = 0;
@@ -2234,31 +2237,31 @@ yyreduce:
yyvsp[0]->source_file = source;
yyval = yyvsp[0];
}
-#line 2238 "awkgram.c"
+#line 2241 "awkgram.c"
break;
case 27: /* pattern: LEX_BEGINFILE */
-#line 438 "awkgram.y"
+#line 441 "awkgram.y"
{
yyvsp[0]->in_rule = rule = BEGINFILE;
yyvsp[0]->source_file = source;
yyval = yyvsp[0];
}
-#line 2248 "awkgram.c"
+#line 2251 "awkgram.c"
break;
case 28: /* pattern: LEX_ENDFILE */
-#line 444 "awkgram.y"
+#line 447 "awkgram.y"
{
yyvsp[0]->in_rule = rule = ENDFILE;
yyvsp[0]->source_file = source;
yyval = yyvsp[0];
}
-#line 2258 "awkgram.c"
+#line 2261 "awkgram.c"
break;
case 29: /* action: l_brace statements r_brace opt_semi opt_nls */
-#line 453 "awkgram.y"
+#line 456 "awkgram.y"
{
INSTRUCTION *ip = make_braced_statements(yyvsp[-4], yyvsp[-3], yyvsp[-2]);
@@ -2273,11 +2276,11 @@ yyreduce:
yyval = ip;
}
-#line 2277 "awkgram.c"
+#line 2280 "awkgram.c"
break;
case 31: /* func_name: FUNC_CALL */
-#line 472 "awkgram.y"
+#line 475 "awkgram.y"
{
const char *name = yyvsp[0]->lextok;
char *qname = qualify_name(name, strlen(name));
@@ -2288,36 +2291,36 @@ yyreduce:
}
yyval = yyvsp[0];
}
-#line 2292 "awkgram.c"
+#line 2295 "awkgram.c"
break;
case 32: /* func_name: lex_builtin */
-#line 483 "awkgram.y"
+#line 486 "awkgram.y"
{
yyerror(_("`%s' is a built-in function, it cannot be redefined"),
tokstart);
YYABORT;
}
-#line 2302 "awkgram.c"
+#line 2305 "awkgram.c"
break;
case 33: /* func_name: '@' LEX_EVAL */
-#line 489 "awkgram.y"
+#line 492 "awkgram.y"
{
yyval = yyvsp[0];
at_seen = false;
}
-#line 2311 "awkgram.c"
+#line 2314 "awkgram.c"
break;
case 36: /* $@1: %empty */
-#line 501 "awkgram.y"
+#line 504 "awkgram.y"
{ want_param_names = FUNC_HEADER; }
-#line 2317 "awkgram.c"
+#line 2320 "awkgram.c"
break;
case 37: /* function_prologue: LEX_FUNCTION func_name '(' $@1 opt_param_list r_paren opt_nls */
-#line 502 "awkgram.y"
+#line 505 "awkgram.y"
{
INSTRUCTION *func_comment = NULL;
// Merge any comments found in the parameter list with those
@@ -2343,17 +2346,17 @@ yyreduce:
yyval = yyvsp[-6];
want_param_names = FUNC_BODY;
}
-#line 2347 "awkgram.c"
+#line 2350 "awkgram.c"
break;
case 38: /* $@2: %empty */
-#line 535 "awkgram.y"
+#line 538 "awkgram.y"
{ want_regexp = true; }
-#line 2353 "awkgram.c"
+#line 2356 "awkgram.c"
break;
case 39: /* regexp: a_slash $@2 REGEXP */
-#line 537 "awkgram.y"
+#line 540 "awkgram.y"
{
NODE *n, *exp;
char *re;
@@ -2382,11 +2385,11 @@ yyreduce:
yyval->opcode = Op_match_rec;
yyval->memory = n;
}
-#line 2386 "awkgram.c"
+#line 2389 "awkgram.c"
break;
case 40: /* typed_regexp: TYPED_REGEXP */
-#line 569 "awkgram.y"
+#line 572 "awkgram.y"
{
char *re;
size_t len;
@@ -2399,23 +2402,23 @@ yyreduce:
yyval->opcode = Op_push_re;
yyval->memory = make_typed_regex(re, len);
}
-#line 2403 "awkgram.c"
+#line 2406 "awkgram.c"
break;
case 41: /* a_slash: '/' */
-#line 584 "awkgram.y"
+#line 587 "awkgram.y"
{ bcfree(yyvsp[0]); }
-#line 2409 "awkgram.c"
+#line 2412 "awkgram.c"
break;
case 43: /* statements: %empty */
-#line 590 "awkgram.y"
+#line 593 "awkgram.y"
{ yyval = NULL; }
-#line 2415 "awkgram.c"
+#line 2418 "awkgram.c"
break;
case 44: /* statements: statements statement */
-#line 592 "awkgram.y"
+#line 595 "awkgram.y"
{
if (yyvsp[0] == NULL) {
yyval = yyvsp[-1];
@@ -2435,29 +2438,29 @@ yyreduce:
yyerrok;
}
-#line 2439 "awkgram.c"
+#line 2442 "awkgram.c"
break;
case 45: /* statements: statements error */
-#line 612 "awkgram.y"
+#line 615 "awkgram.y"
{ yyval = NULL; }
-#line 2445 "awkgram.c"
+#line 2448 "awkgram.c"
break;
case 46: /* statement_term: nls */
-#line 616 "awkgram.y"
+#line 619 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 2451 "awkgram.c"
+#line 2454 "awkgram.c"
break;
case 47: /* statement_term: semi opt_nls */
-#line 617 "awkgram.y"
+#line 620 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 2457 "awkgram.c"
+#line 2460 "awkgram.c"
break;
case 48: /* statement: semi opt_nls */
-#line 622 "awkgram.y"
+#line 625 "awkgram.y"
{
if (yyvsp[0] != NULL) {
INSTRUCTION *ip;
@@ -2468,31 +2471,31 @@ yyreduce:
} else
yyval = NULL;
}
-#line 2472 "awkgram.c"
+#line 2475 "awkgram.c"
break;
case 49: /* statement: l_brace statements r_brace */
-#line 633 "awkgram.y"
+#line 636 "awkgram.y"
{
trailing_comment = yyvsp[0]; // NULL or comment
yyval = make_braced_statements(yyvsp[-2], yyvsp[-1], yyvsp[0]);
}
-#line 2481 "awkgram.c"
+#line 2484 "awkgram.c"
break;
case 50: /* statement: if_statement */
-#line 638 "awkgram.y"
+#line 641 "awkgram.y"
{
if (do_pretty_print)
yyval = list_prepend(yyvsp[0], instruction(Op_exec_count));
else
yyval = yyvsp[0];
}
-#line 2492 "awkgram.c"
+#line 2495 "awkgram.c"
break;
case 51: /* statement: LEX_SWITCH '(' exp r_paren opt_nls l_brace case_statements opt_nls r_brace */
-#line 645 "awkgram.y"
+#line 648 "awkgram.y"
{
INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
INSTRUCTION *ip, *nextc, *tbreak;
@@ -2600,11 +2603,11 @@ yyreduce:
break_allowed--;
fix_break_continue(ip, tbreak, NULL);
}
-#line 2604 "awkgram.c"
+#line 2607 "awkgram.c"
break;
case 52: /* statement: LEX_WHILE '(' exp r_paren opt_nls statement */
-#line 753 "awkgram.y"
+#line 756 "awkgram.y"
{
/*
* -----------------
@@ -2655,11 +2658,11 @@ yyreduce:
continue_allowed--;
fix_break_continue(ip, tbreak, tcont);
}
-#line 2659 "awkgram.c"
+#line 2662 "awkgram.c"
break;
case 53: /* statement: LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls */
-#line 804 "awkgram.y"
+#line 807 "awkgram.y"
{
/*
* -----------------
@@ -2709,11 +2712,11 @@ yyreduce:
/* else
$1 and $4 are NULLs */
}
-#line 2713 "awkgram.c"
+#line 2716 "awkgram.c"
break;
case 54: /* statement: LEX_FOR '(' NAME LEX_IN simple_variable r_paren opt_nls statement */
-#line 854 "awkgram.y"
+#line 857 "awkgram.y"
{
INSTRUCTION *ip;
char *var_name = yyvsp[-5]->lextok;
@@ -2839,11 +2842,11 @@ regular_loop:
break_allowed--;
continue_allowed--;
}
-#line 2843 "awkgram.c"
+#line 2846 "awkgram.c"
break;
case 55: /* statement: LEX_FOR '(' opt_simple_stmt semi opt_nls exp semi opt_nls opt_simple_stmt r_paren opt_nls statement */
-#line 980 "awkgram.y"
+#line 983 "awkgram.y"
{
if (yyvsp[-7] != NULL) {
merge_comments(yyvsp[-7], NULL);
@@ -2865,11 +2868,11 @@ regular_loop:
break_allowed--;
continue_allowed--;
}
-#line 2869 "awkgram.c"
+#line 2872 "awkgram.c"
break;
case 56: /* statement: LEX_FOR '(' opt_simple_stmt semi opt_nls semi opt_nls opt_simple_stmt r_paren opt_nls statement */
-#line 1002 "awkgram.y"
+#line 1005 "awkgram.y"
{
if (yyvsp[-6] != NULL) {
merge_comments(yyvsp[-6], NULL);
@@ -2890,22 +2893,22 @@ regular_loop:
break_allowed--;
continue_allowed--;
}
-#line 2894 "awkgram.c"
+#line 2897 "awkgram.c"
break;
case 57: /* statement: non_compound_stmt */
-#line 1023 "awkgram.y"
+#line 1026 "awkgram.y"
{
if (do_pretty_print)
yyval = list_prepend(yyvsp[0], instruction(Op_exec_count));
else
yyval = yyvsp[0];
}
-#line 2905 "awkgram.c"
+#line 2908 "awkgram.c"
break;
case 58: /* non_compound_stmt: LEX_BREAK statement_term */
-#line 1033 "awkgram.y"
+#line 1036 "awkgram.y"
{
if (! break_allowed)
error_ln(yyvsp[-1]->source_line,
@@ -2915,11 +2918,11 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2919 "awkgram.c"
+#line 2922 "awkgram.c"
break;
case 59: /* non_compound_stmt: LEX_CONTINUE statement_term */
-#line 1043 "awkgram.y"
+#line 1046 "awkgram.y"
{
if (! continue_allowed)
error_ln(yyvsp[-1]->source_line,
@@ -2929,11 +2932,11 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2933 "awkgram.c"
+#line 2936 "awkgram.c"
break;
case 60: /* non_compound_stmt: LEX_NEXT statement_term */
-#line 1053 "awkgram.y"
+#line 1056 "awkgram.y"
{
/* if inside function (rule = 0), resolve context at run-time */
if (rule && rule != Rule)
@@ -2944,11 +2947,11 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2948 "awkgram.c"
+#line 2951 "awkgram.c"
break;
case 61: /* non_compound_stmt: LEX_NEXTFILE statement_term */
-#line 1064 "awkgram.y"
+#line 1067 "awkgram.y"
{
/* if inside function (rule = 0), resolve context at run-time */
if (rule == BEGIN || rule == END || rule == ENDFILE)
@@ -2961,11 +2964,11 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2965 "awkgram.c"
+#line 2968 "awkgram.c"
break;
case 62: /* non_compound_stmt: LEX_EXIT opt_exp statement_term */
-#line 1077 "awkgram.y"
+#line 1080 "awkgram.y"
{
/* Initialize the two possible jump targets, the actual target
* is resolved at run-time.
@@ -2982,20 +2985,20 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2986 "awkgram.c"
+#line 2989 "awkgram.c"
break;
case 63: /* $@3: %empty */
-#line 1094 "awkgram.y"
+#line 1097 "awkgram.y"
{
if (! in_function)
yyerror(_("`return' used outside function context"));
}
-#line 2995 "awkgram.c"
+#line 2998 "awkgram.c"
break;
case 64: /* non_compound_stmt: LEX_RETURN $@3 opt_fcall_exp statement_term */
-#line 1097 "awkgram.y"
+#line 1100 "awkgram.y"
{
if (called_from_eval)
yyvsp[-3]->opcode = Op_K_return_from_eval;
@@ -3009,28 +3012,28 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 3013 "awkgram.c"
+#line 3016 "awkgram.c"
break;
case 65: /* non_compound_stmt: simple_stmt statement_term */
-#line 1111 "awkgram.y"
+#line 1114 "awkgram.y"
{
if (yyvsp[0] != NULL)
yyval = list_append(yyvsp[-1], yyvsp[0]);
else
yyval = yyvsp[-1];
}
-#line 3024 "awkgram.c"
+#line 3027 "awkgram.c"
break;
case 66: /* $@4: %empty */
-#line 1128 "awkgram.y"
+#line 1131 "awkgram.y"
{ in_print = true; in_parens = 0; }
-#line 3030 "awkgram.c"
+#line 3033 "awkgram.c"
break;
case 67: /* simple_stmt: print $@4 print_expression_list output_redir */
-#line 1129 "awkgram.y"
+#line 1132 "awkgram.y"
{
/*
* Optimization: plain `print' has no expression list, so $3 is null.
@@ -3131,22 +3134,31 @@ regular_print:
}
}
}
-#line 3135 "awkgram.c"
+#line 3138 "awkgram.c"
break;
case 68: /* $@5: %empty */
-#line 1230 "awkgram.y"
+#line 1233 "awkgram.y"
{ sub_counter = 0; }
-#line 3141 "awkgram.c"
+#line 3144 "awkgram.c"
break;
case 69: /* simple_stmt: LEX_DELETE NAME $@5 delete_subscript_list */
-#line 1231 "awkgram.y"
+#line 1234 "awkgram.y"
{
char *arr = yyvsp[-2]->lextok;
+ extern void print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump);
+
+ if (trace) fprintf(stderr, "tok: %#p, val: %#p, %s\n", (void*) yyvsp[-2], arr, arr);
yyvsp[-2]->opcode = Op_push_array;
yyvsp[-2]->memory = variable(yyvsp[-2]->source_line, arr, Node_var_new);
+ if (trace) {
+ watched = yyvsp[-2]->memory;
+ fprintf(stderr, "ref_count = %d\n", watched->valref);
+ print_instruction((INSTRUCTION *) yyvsp[-2], fprintf, stderr, true);
+ fprintf(stderr, "\t-- memory = %#p, watched = %#p\n", yyvsp[-2]->memory, watched);
+ }
if (! do_posix && ! do_traditional) {
if (yyvsp[-2]->memory == symbol_table)
@@ -3174,11 +3186,11 @@ regular_print:
yyval = list_append(list_append(yyvsp[0], yyvsp[-2]), yyvsp[-3]);
}
}
-#line 3178 "awkgram.c"
+#line 3190 "awkgram.c"
break;
case 70: /* simple_stmt: LEX_DELETE '(' NAME ')' */
-#line 1268 "awkgram.y"
+#line 1280 "awkgram.y"
{
static bool warned = false;
char *arr = yyvsp[-1]->lextok;
@@ -3204,54 +3216,54 @@ regular_print:
fatal(_("`delete' is not allowed with FUNCTAB"));
}
}
-#line 3208 "awkgram.c"
+#line 3220 "awkgram.c"
break;
case 71: /* simple_stmt: exp */
-#line 1294 "awkgram.y"
+#line 1306 "awkgram.y"
{
yyval = optimize_assignment(yyvsp[0]);
}
-#line 3216 "awkgram.c"
+#line 3228 "awkgram.c"
break;
case 72: /* opt_simple_stmt: %empty */
-#line 1301 "awkgram.y"
+#line 1313 "awkgram.y"
{ yyval = NULL; }
-#line 3222 "awkgram.c"
+#line 3234 "awkgram.c"
break;
case 73: /* opt_simple_stmt: simple_stmt */
-#line 1303 "awkgram.y"
+#line 1315 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3228 "awkgram.c"
+#line 3240 "awkgram.c"
break;
case 74: /* case_statements: %empty */
-#line 1308 "awkgram.y"
+#line 1320 "awkgram.y"
{ yyval = NULL; }
-#line 3234 "awkgram.c"
+#line 3246 "awkgram.c"
break;
case 75: /* case_statements: case_statements case_statement */
-#line 1310 "awkgram.y"
+#line 1322 "awkgram.y"
{
if (yyvsp[-1] == NULL)
yyval = list_create(yyvsp[0]);
else
yyval = list_prepend(yyvsp[-1], yyvsp[0]);
}
-#line 3245 "awkgram.c"
+#line 3257 "awkgram.c"
break;
case 76: /* case_statements: case_statements error */
-#line 1317 "awkgram.y"
+#line 1329 "awkgram.y"
{ yyval = NULL; }
-#line 3251 "awkgram.c"
+#line 3263 "awkgram.c"
break;
case 77: /* case_statement: LEX_CASE case_value colon opt_nls statements */
-#line 1322 "awkgram.y"
+#line 1334 "awkgram.y"
{
INSTRUCTION *casestmt = yyvsp[0];
if (yyvsp[0] == NULL)
@@ -3264,11 +3276,11 @@ regular_print:
bcfree(yyvsp[-2]);
yyval = yyvsp[-4];
}
-#line 3268 "awkgram.c"
+#line 3280 "awkgram.c"
break;
case 78: /* case_statement: LEX_DEFAULT colon opt_nls statements */
-#line 1335 "awkgram.y"
+#line 1347 "awkgram.y"
{
INSTRUCTION *casestmt = yyvsp[0];
if (yyvsp[0] == NULL)
@@ -3280,17 +3292,17 @@ regular_print:
yyvsp[-3]->comment = yyvsp[-1];
yyval = yyvsp[-3];
}
-#line 3284 "awkgram.c"
+#line 3296 "awkgram.c"
break;
case 79: /* case_value: YNUMBER */
-#line 1350 "awkgram.y"
+#line 1362 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3290 "awkgram.c"
+#line 3302 "awkgram.c"
break;
case 80: /* case_value: '-' YNUMBER */
-#line 1352 "awkgram.y"
+#line 1364 "awkgram.y"
{
NODE *n = yyvsp[0]->memory;
(void) force_number(n);
@@ -3298,28 +3310,28 @@ regular_print:
bcfree(yyvsp[-1]);
yyval = yyvsp[0];
}
-#line 3302 "awkgram.c"
+#line 3314 "awkgram.c"
break;
case 81: /* case_value: '+' YNUMBER */
-#line 1360 "awkgram.y"
+#line 1372 "awkgram.y"
{
NODE *n = yyvsp[0]->lasti->memory;
bcfree(yyvsp[-1]);
add_sign_to_num(n, '+');
yyval = yyvsp[0];
}
-#line 3313 "awkgram.c"
+#line 3325 "awkgram.c"
break;
case 82: /* case_value: YSTRING */
-#line 1367 "awkgram.y"
+#line 1379 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3319 "awkgram.c"
+#line 3331 "awkgram.c"
break;
case 83: /* case_value: regexp */
-#line 1369 "awkgram.y"
+#line 1381 "awkgram.y"
{
if (yyvsp[0]->memory->type == Node_regex)
yyvsp[0]->opcode = Op_push_re;
@@ -3327,57 +3339,57 @@ regular_print:
yyvsp[0]->opcode = Op_push;
yyval = yyvsp[0];
}
-#line 3331 "awkgram.c"
+#line 3343 "awkgram.c"
break;
case 84: /* case_value: typed_regexp */
-#line 1377 "awkgram.y"
+#line 1389 "awkgram.y"
{
assert((yyvsp[0]->memory->flags & REGEX) == REGEX);
yyvsp[0]->opcode = Op_push_re;
yyval = yyvsp[0];
}
-#line 3341 "awkgram.c"
+#line 3353 "awkgram.c"
break;
case 85: /* print: LEX_PRINT */
-#line 1386 "awkgram.y"
+#line 1398 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3347 "awkgram.c"
+#line 3359 "awkgram.c"
break;
case 86: /* print: LEX_PRINTF */
-#line 1388 "awkgram.y"
+#line 1400 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3353 "awkgram.c"
+#line 3365 "awkgram.c"
break;
case 88: /* print_expression_list: '(' expression_list r_paren */
-#line 1398 "awkgram.y"
+#line 1410 "awkgram.y"
{
yyval = yyvsp[-1];
}
-#line 3361 "awkgram.c"
+#line 3373 "awkgram.c"
break;
case 89: /* output_redir: %empty */
-#line 1405 "awkgram.y"
+#line 1417 "awkgram.y"
{
in_print = false;
in_parens = 0;
yyval = NULL;
}
-#line 3371 "awkgram.c"
+#line 3383 "awkgram.c"
break;
case 90: /* $@6: %empty */
-#line 1410 "awkgram.y"
+#line 1422 "awkgram.y"
{ in_print = false; in_parens = 0; }
-#line 3377 "awkgram.c"
+#line 3389 "awkgram.c"
break;
case 91: /* output_redir: IO_OUT $@6 common_exp */
-#line 1411 "awkgram.y"
+#line 1423 "awkgram.y"
{
if (yyvsp[-2]->redir_type == redirect_twoway
&& yyvsp[0]->lasti->opcode == Op_K_getline_redir
@@ -3387,22 +3399,22 @@ regular_print:
lintwarn(_("concatenation as I/O `>' redirection target is ambiguous"));
yyval = list_prepend(yyvsp[0], yyvsp[-2]);
}
-#line 3391 "awkgram.c"
+#line 3403 "awkgram.c"
break;
case 92: /* if_statement: LEX_IF '(' exp r_paren opt_nls statement */
-#line 1424 "awkgram.y"
+#line 1436 "awkgram.y"
{
if (yyvsp[-1] != NULL)
yyvsp[-5]->comment = yyvsp[-1];
add_lint(yyvsp[-3], LINT_assign_in_cond);
yyval = mk_condition(yyvsp[-3], yyvsp[-5], yyvsp[0], NULL, NULL);
}
-#line 3402 "awkgram.c"
+#line 3414 "awkgram.c"
break;
case 93: /* if_statement: LEX_IF '(' exp r_paren opt_nls statement LEX_ELSE opt_nls statement */
-#line 1432 "awkgram.y"
+#line 1444 "awkgram.y"
{
if (yyvsp[-4] != NULL)
yyvsp[-8]->comment = yyvsp[-4];
@@ -3411,19 +3423,19 @@ regular_print:
add_lint(yyvsp[-6], LINT_assign_in_cond);
yyval = mk_condition(yyvsp[-6], yyvsp[-8], yyvsp[-3], yyvsp[-2], yyvsp[0]);
}
-#line 3415 "awkgram.c"
+#line 3427 "awkgram.c"
break;
case 94: /* nls: NEWLINE */
-#line 1444 "awkgram.y"
+#line 1456 "awkgram.y"
{
yyval = yyvsp[0];
}
-#line 3423 "awkgram.c"
+#line 3435 "awkgram.c"
break;
case 95: /* nls: nls NEWLINE */
-#line 1448 "awkgram.y"
+#line 1460 "awkgram.y"
{
if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
if (yyvsp[-1]->memory->comment_type == EOL_COMMENT) {
@@ -3441,59 +3453,59 @@ regular_print:
} else
yyval = NULL;
}
-#line 3445 "awkgram.c"
+#line 3457 "awkgram.c"
break;
case 96: /* opt_nls: %empty */
-#line 1469 "awkgram.y"
+#line 1481 "awkgram.y"
{ yyval = NULL; }
-#line 3451 "awkgram.c"
+#line 3463 "awkgram.c"
break;
case 97: /* opt_nls: nls */
-#line 1471 "awkgram.y"
+#line 1483 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3457 "awkgram.c"
+#line 3469 "awkgram.c"
break;
case 98: /* input_redir: %empty */
-#line 1476 "awkgram.y"
+#line 1488 "awkgram.y"
{ yyval = NULL; }
-#line 3463 "awkgram.c"
+#line 3475 "awkgram.c"
break;
case 99: /* input_redir: '<' simp_exp */
-#line 1478 "awkgram.y"
+#line 1490 "awkgram.y"
{
bcfree(yyvsp[-1]);
yyval = yyvsp[0];
}
-#line 3472 "awkgram.c"
+#line 3484 "awkgram.c"
break;
case 100: /* opt_param_list: %empty */
-#line 1486 "awkgram.y"
+#line 1498 "awkgram.y"
{ yyval = NULL; }
-#line 3478 "awkgram.c"
+#line 3490 "awkgram.c"
break;
case 101: /* opt_param_list: param_list */
-#line 1488 "awkgram.y"
+#line 1500 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3484 "awkgram.c"
+#line 3496 "awkgram.c"
break;
case 102: /* param_list: NAME */
-#line 1493 "awkgram.y"
+#line 1505 "awkgram.y"
{
yyvsp[0]->param_count = 0;
yyval = list_create(yyvsp[0]);
}
-#line 3493 "awkgram.c"
+#line 3505 "awkgram.c"
break;
case 103: /* param_list: param_list comma NAME */
-#line 1498 "awkgram.y"
+#line 1510 "awkgram.y"
{
if (yyvsp[-2] != NULL && yyvsp[0] != NULL) {
yyvsp[0]->param_count = yyvsp[-2]->lasti->param_count + 1;
@@ -3510,76 +3522,76 @@ regular_print:
} else
yyval = NULL;
}
-#line 3514 "awkgram.c"
+#line 3526 "awkgram.c"
break;
case 104: /* param_list: error */
-#line 1515 "awkgram.y"
+#line 1527 "awkgram.y"
{ yyval = NULL; }
-#line 3520 "awkgram.c"
+#line 3532 "awkgram.c"
break;
case 105: /* param_list: param_list error */
-#line 1517 "awkgram.y"
+#line 1529 "awkgram.y"
{ yyval = yyvsp[-1]; }
-#line 3526 "awkgram.c"
+#line 3538 "awkgram.c"
break;
case 106: /* param_list: param_list comma error */
-#line 1519 "awkgram.y"
+#line 1531 "awkgram.y"
{ yyval = yyvsp[-2]; }
-#line 3532 "awkgram.c"
+#line 3544 "awkgram.c"
break;
case 107: /* opt_exp: %empty */
-#line 1525 "awkgram.y"
+#line 1537 "awkgram.y"
{ yyval = NULL; }
-#line 3538 "awkgram.c"
+#line 3550 "awkgram.c"
break;
case 108: /* opt_exp: exp */
-#line 1527 "awkgram.y"
+#line 1539 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3544 "awkgram.c"
+#line 3556 "awkgram.c"
break;
case 109: /* opt_expression_list: %empty */
-#line 1532 "awkgram.y"
+#line 1544 "awkgram.y"
{ yyval = NULL; }
-#line 3550 "awkgram.c"
+#line 3562 "awkgram.c"
break;
case 110: /* opt_expression_list: expression_list */
-#line 1534 "awkgram.y"
+#line 1546 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3556 "awkgram.c"
+#line 3568 "awkgram.c"
break;
case 111: /* expression_list: exp */
-#line 1539 "awkgram.y"
+#line 1551 "awkgram.y"
{ yyval = mk_expression_list(NULL, yyvsp[0]); }
-#line 3562 "awkgram.c"
+#line 3574 "awkgram.c"
break;
case 112: /* expression_list: expression_list comma exp */
-#line 1541 "awkgram.y"
+#line 1553 "awkgram.y"
{
if (yyvsp[-1] != NULL)
yyvsp[-2]->lasti->comment = yyvsp[-1];
yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
yyerrok;
}
-#line 3573 "awkgram.c"
+#line 3585 "awkgram.c"
break;
case 113: /* expression_list: error */
-#line 1548 "awkgram.y"
+#line 1560 "awkgram.y"
{ yyval = NULL; }
-#line 3579 "awkgram.c"
+#line 3591 "awkgram.c"
break;
case 114: /* expression_list: expression_list error */
-#line 1550 "awkgram.y"
+#line 1562 "awkgram.y"
{
/*
* Returning the expression list instead of NULL lets
@@ -3587,66 +3599,66 @@ regular_print:
*/
yyval = yyvsp[-1];
}
-#line 3591 "awkgram.c"
+#line 3603 "awkgram.c"
break;
case 115: /* expression_list: expression_list error exp */
-#line 1558 "awkgram.y"
+#line 1570 "awkgram.y"
{
/* Ditto */
yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
}
-#line 3600 "awkgram.c"
+#line 3612 "awkgram.c"
break;
case 116: /* expression_list: expression_list comma error */
-#line 1563 "awkgram.y"
+#line 1575 "awkgram.y"
{
/* Ditto */
if (yyvsp[-1] != NULL)
yyvsp[-2]->lasti->comment = yyvsp[-1];
yyval = yyvsp[-2];
}
-#line 3611 "awkgram.c"
+#line 3623 "awkgram.c"
break;
case 117: /* opt_fcall_expression_list: %empty */
-#line 1573 "awkgram.y"
+#line 1585 "awkgram.y"
{ yyval = NULL; }
-#line 3617 "awkgram.c"
+#line 3629 "awkgram.c"
break;
case 118: /* opt_fcall_expression_list: fcall_expression_list */
-#line 1575 "awkgram.y"
+#line 1587 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3623 "awkgram.c"
+#line 3635 "awkgram.c"
break;
case 119: /* fcall_expression_list: fcall_exp */
-#line 1580 "awkgram.y"
+#line 1592 "awkgram.y"
{ yyval = mk_expression_list(NULL, yyvsp[0]); }
-#line 3629 "awkgram.c"
+#line 3641 "awkgram.c"
break;
case 120: /* fcall_expression_list: fcall_expression_list comma fcall_exp */
-#line 1582 "awkgram.y"
+#line 1594 "awkgram.y"
{
if (yyvsp[-1] != NULL)
yyvsp[-2]->lasti->comment = yyvsp[-1];
yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
yyerrok;
}
-#line 3640 "awkgram.c"
+#line 3652 "awkgram.c"
break;
case 121: /* fcall_expression_list: error */
-#line 1589 "awkgram.y"
+#line 1601 "awkgram.y"
{ yyval = NULL; }
-#line 3646 "awkgram.c"
+#line 3658 "awkgram.c"
break;
case 122: /* fcall_expression_list: fcall_expression_list error */
-#line 1591 "awkgram.y"
+#line 1603 "awkgram.y"
{
/*
* Returning the expression list instead of NULL lets
@@ -3654,86 +3666,86 @@ regular_print:
*/
yyval = yyvsp[-1];
}
-#line 3658 "awkgram.c"
+#line 3670 "awkgram.c"
break;
case 123: /* fcall_expression_list: fcall_expression_list error fcall_exp */
-#line 1599 "awkgram.y"
+#line 1611 "awkgram.y"
{
/* Ditto */
yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
}
-#line 3667 "awkgram.c"
+#line 3679 "awkgram.c"
break;
case 124: /* fcall_expression_list: fcall_expression_list comma error */
-#line 1604 "awkgram.y"
+#line 1616 "awkgram.y"
{
/* Ditto */
if (yyvsp[-1] != NULL)
yyvsp[-2]->comment = yyvsp[-1];
yyval = yyvsp[-2];
}
-#line 3678 "awkgram.c"
+#line 3690 "awkgram.c"
break;
case 125: /* fcall_exp: exp */
-#line 1613 "awkgram.y"
+#line 1625 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3684 "awkgram.c"
+#line 3696 "awkgram.c"
break;
case 126: /* fcall_exp: typed_regexp */
-#line 1614 "awkgram.y"
+#line 1626 "awkgram.y"
{ yyval = list_create(yyvsp[0]); }
-#line 3690 "awkgram.c"
+#line 3702 "awkgram.c"
break;
case 127: /* opt_fcall_exp: %empty */
-#line 1619 "awkgram.y"
+#line 1631 "awkgram.y"
{ yyval = NULL; }
-#line 3696 "awkgram.c"
+#line 3708 "awkgram.c"
break;
case 128: /* opt_fcall_exp: fcall_exp */
-#line 1620 "awkgram.y"
+#line 1632 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3702 "awkgram.c"
+#line 3714 "awkgram.c"
break;
case 129: /* exp: variable assign_operator exp */
-#line 1626 "awkgram.y"
+#line 1638 "awkgram.y"
{
if (do_lint && yyvsp[0]->lasti->opcode == Op_match_rec)
lintwarn_ln(yyvsp[-1]->source_line,
_("regular expression on right of assignment"));
yyval = mk_assignment(yyvsp[-2], yyvsp[0], yyvsp[-1]);
}
-#line 3713 "awkgram.c"
+#line 3725 "awkgram.c"
break;
case 130: /* exp: variable ASSIGN typed_regexp */
-#line 1633 "awkgram.y"
+#line 1645 "awkgram.y"
{
yyval = mk_assignment(yyvsp[-2], list_create(yyvsp[0]), yyvsp[-1]);
}
-#line 3721 "awkgram.c"
+#line 3733 "awkgram.c"
break;
case 131: /* exp: exp LEX_AND exp */
-#line 1637 "awkgram.y"
+#line 1649 "awkgram.y"
{ yyval = mk_boolean(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3727 "awkgram.c"
+#line 3739 "awkgram.c"
break;
case 132: /* exp: exp LEX_OR exp */
-#line 1639 "awkgram.y"
+#line 1651 "awkgram.y"
{ yyval = mk_boolean(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3733 "awkgram.c"
+#line 3745 "awkgram.c"
break;
case 133: /* exp: exp MATCHOP typed_regexp */
-#line 1641 "awkgram.y"
+#line 1653 "awkgram.y"
{
if (yyvsp[-2]->lasti->opcode == Op_match_rec)
warning_ln(yyvsp[-1]->source_line,
@@ -3746,11 +3758,11 @@ regular_print:
bcfree(yyvsp[0]);
yyval = list_append(yyvsp[-2], yyvsp[-1]);
}
-#line 3750 "awkgram.c"
+#line 3762 "awkgram.c"
break;
case 134: /* exp: exp MATCHOP exp */
-#line 1654 "awkgram.y"
+#line 1666 "awkgram.y"
{
if (yyvsp[-2]->lasti->opcode == Op_match_rec)
warning_ln(yyvsp[-1]->source_line,
@@ -3767,11 +3779,11 @@ regular_print:
yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
}
}
-#line 3771 "awkgram.c"
+#line 3783 "awkgram.c"
break;
case 135: /* exp: exp LEX_IN simple_variable */
-#line 1671 "awkgram.y"
+#line 1683 "awkgram.y"
{
if (do_lint_old)
lintwarn_ln(yyvsp[-1]->source_line,
@@ -3781,91 +3793,91 @@ regular_print:
yyvsp[-1]->expr_count = 1;
yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
}
-#line 3785 "awkgram.c"
+#line 3797 "awkgram.c"
break;
case 136: /* exp: exp a_relop exp */
-#line 1681 "awkgram.y"
+#line 1693 "awkgram.y"
{
if (do_lint && yyvsp[0]->lasti->opcode == Op_match_rec)
lintwarn_ln(yyvsp[-1]->source_line,
_("regular expression on right of comparison"));
yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
}
-#line 3796 "awkgram.c"
+#line 3808 "awkgram.c"
break;
case 137: /* exp: exp '?' exp ':' exp */
-#line 1688 "awkgram.y"
+#line 1700 "awkgram.y"
{ yyval = mk_condition(yyvsp[-4], yyvsp[-3], yyvsp[-2], yyvsp[-1], yyvsp[0]); }
-#line 3802 "awkgram.c"
+#line 3814 "awkgram.c"
break;
case 138: /* exp: common_exp */
-#line 1690 "awkgram.y"
+#line 1702 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3808 "awkgram.c"
+#line 3820 "awkgram.c"
break;
case 139: /* assign_operator: ASSIGN */
-#line 1695 "awkgram.y"
+#line 1707 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3814 "awkgram.c"
+#line 3826 "awkgram.c"
break;
case 140: /* assign_operator: ASSIGNOP */
-#line 1697 "awkgram.y"
+#line 1709 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3820 "awkgram.c"
+#line 3832 "awkgram.c"
break;
case 141: /* assign_operator: SLASH_BEFORE_EQUAL ASSIGN */
-#line 1699 "awkgram.y"
+#line 1711 "awkgram.y"
{
yyvsp[0]->opcode = Op_assign_quotient;
yyval = yyvsp[0];
}
-#line 3829 "awkgram.c"
+#line 3841 "awkgram.c"
break;
case 142: /* relop_or_less: RELOP */
-#line 1707 "awkgram.y"
+#line 1719 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3835 "awkgram.c"
+#line 3847 "awkgram.c"
break;
case 143: /* relop_or_less: '<' */
-#line 1709 "awkgram.y"
+#line 1721 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3841 "awkgram.c"
+#line 3853 "awkgram.c"
break;
case 144: /* a_relop: relop_or_less */
-#line 1714 "awkgram.y"
+#line 1726 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3847 "awkgram.c"
+#line 3859 "awkgram.c"
break;
case 145: /* a_relop: '>' */
-#line 1716 "awkgram.y"
+#line 1728 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3853 "awkgram.c"
+#line 3865 "awkgram.c"
break;
case 146: /* common_exp: simp_exp */
-#line 1721 "awkgram.y"
+#line 1733 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3859 "awkgram.c"
+#line 3871 "awkgram.c"
break;
case 147: /* common_exp: simp_exp_nc */
-#line 1723 "awkgram.y"
+#line 1735 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 3865 "awkgram.c"
+#line 3877 "awkgram.c"
break;
case 148: /* common_exp: common_exp simp_exp */
-#line 1725 "awkgram.y"
+#line 1737 "awkgram.y"
{
int count = 2;
bool is_simple_var = false;
@@ -3919,47 +3931,47 @@ regular_print:
max_args = count;
}
}
-#line 3923 "awkgram.c"
+#line 3935 "awkgram.c"
break;
case 150: /* simp_exp: simp_exp '^' simp_exp */
-#line 1784 "awkgram.y"
+#line 1796 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3929 "awkgram.c"
+#line 3941 "awkgram.c"
break;
case 151: /* simp_exp: simp_exp '*' simp_exp */
-#line 1786 "awkgram.y"
+#line 1798 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3935 "awkgram.c"
+#line 3947 "awkgram.c"
break;
case 152: /* simp_exp: simp_exp '/' simp_exp */
-#line 1788 "awkgram.y"
+#line 1800 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3941 "awkgram.c"
+#line 3953 "awkgram.c"
break;
case 153: /* simp_exp: simp_exp '%' simp_exp */
-#line 1790 "awkgram.y"
+#line 1802 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3947 "awkgram.c"
+#line 3959 "awkgram.c"
break;
case 154: /* simp_exp: simp_exp '+' simp_exp */
-#line 1792 "awkgram.y"
+#line 1804 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3953 "awkgram.c"
+#line 3965 "awkgram.c"
break;
case 155: /* simp_exp: simp_exp '-' simp_exp */
-#line 1794 "awkgram.y"
+#line 1806 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3959 "awkgram.c"
+#line 3971 "awkgram.c"
break;
case 156: /* simp_exp: LEX_GETLINE opt_variable input_redir */
-#line 1796 "awkgram.y"
+#line 1808 "awkgram.y"
{
/*
* In BEGINFILE/ENDFILE, allow `getline [var] < file'
@@ -3973,29 +3985,29 @@ regular_print:
_("non-redirected `getline' undefined inside END action"));
yyval = mk_getline(yyvsp[-2], yyvsp[-1], yyvsp[0], redirect_input);
}
-#line 3977 "awkgram.c"
+#line 3989 "awkgram.c"
break;
case 157: /* simp_exp: variable INCREMENT */
-#line 1810 "awkgram.y"
+#line 1822 "awkgram.y"
{
yyvsp[0]->opcode = Op_postincrement;
yyval = mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
}
-#line 3986 "awkgram.c"
+#line 3998 "awkgram.c"
break;
case 158: /* simp_exp: variable DECREMENT */
-#line 1815 "awkgram.y"
+#line 1827 "awkgram.y"
{
yyvsp[0]->opcode = Op_postdecrement;
yyval = mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
}
-#line 3995 "awkgram.c"
+#line 4007 "awkgram.c"
break;
case 159: /* simp_exp: '(' expression_list r_paren LEX_IN simple_variable */
-#line 1820 "awkgram.y"
+#line 1832 "awkgram.y"
{
if (do_lint_old) {
/* first one is warning so that second one comes out if warnings are fatal */
@@ -4016,64 +4028,64 @@ regular_print:
yyval = list_append(list_merge(t, yyvsp[0]), yyvsp[-1]);
}
}
-#line 4020 "awkgram.c"
+#line 4032 "awkgram.c"
break;
case 160: /* simp_exp_nc: common_exp IO_IN LEX_GETLINE opt_variable */
-#line 1846 "awkgram.y"
+#line 1858 "awkgram.y"
{
yyval = mk_getline(yyvsp[-1], yyvsp[0], yyvsp[-3], yyvsp[-2]->redir_type);
bcfree(yyvsp[-2]);
}
-#line 4029 "awkgram.c"
+#line 4041 "awkgram.c"
break;
case 161: /* simp_exp_nc: simp_exp_nc '^' simp_exp */
-#line 1852 "awkgram.y"
+#line 1864 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4035 "awkgram.c"
+#line 4047 "awkgram.c"
break;
case 162: /* simp_exp_nc: simp_exp_nc '*' simp_exp */
-#line 1854 "awkgram.y"
+#line 1866 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4041 "awkgram.c"
+#line 4053 "awkgram.c"
break;
case 163: /* simp_exp_nc: simp_exp_nc '/' simp_exp */
-#line 1856 "awkgram.y"
+#line 1868 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4047 "awkgram.c"
+#line 4059 "awkgram.c"
break;
case 164: /* simp_exp_nc: simp_exp_nc '%' simp_exp */
-#line 1858 "awkgram.y"
+#line 1870 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4053 "awkgram.c"
+#line 4065 "awkgram.c"
break;
case 165: /* simp_exp_nc: simp_exp_nc '+' simp_exp */
-#line 1860 "awkgram.y"
+#line 1872 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4059 "awkgram.c"
+#line 4071 "awkgram.c"
break;
case 166: /* simp_exp_nc: simp_exp_nc '-' simp_exp */
-#line 1862 "awkgram.y"
+#line 1874 "awkgram.y"
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4065 "awkgram.c"
+#line 4077 "awkgram.c"
break;
case 167: /* non_post_simp_exp: regexp */
-#line 1867 "awkgram.y"
+#line 1879 "awkgram.y"
{
yyval = list_create(yyvsp[0]);
}
-#line 4073 "awkgram.c"
+#line 4085 "awkgram.c"
break;
case 168: /* non_post_simp_exp: '!' simp_exp */
-#line 1871 "awkgram.y"
+#line 1883 "awkgram.y"
{
if (yyvsp[0]->opcode == Op_match_rec) {
yyvsp[0]->opcode = Op_nomatch;
@@ -4105,11 +4117,11 @@ regular_print:
}
}
}
-#line 4109 "awkgram.c"
+#line 4121 "awkgram.c"
break;
case 169: /* non_post_simp_exp: '(' exp r_paren */
-#line 1903 "awkgram.y"
+#line 1915 "awkgram.y"
{
// Always include. Allows us to lint warn on
// print "foo" > "bar" 1
@@ -4117,31 +4129,31 @@ regular_print:
// print "foo" > ("bar" 1)
yyval = list_append(yyvsp[-1], bcalloc(Op_parens, 1, sourceline));
}
-#line 4121 "awkgram.c"
+#line 4133 "awkgram.c"
break;
case 170: /* non_post_simp_exp: LEX_BUILTIN '(' opt_fcall_expression_list r_paren */
-#line 1911 "awkgram.y"
+#line 1923 "awkgram.y"
{
yyval = snode(yyvsp[-1], yyvsp[-3]);
if (yyval == NULL)
YYABORT;
}
-#line 4131 "awkgram.c"
+#line 4143 "awkgram.c"
break;
case 171: /* non_post_simp_exp: LEX_LENGTH '(' opt_fcall_expression_list r_paren */
-#line 1917 "awkgram.y"
+#line 1929 "awkgram.y"
{
yyval = snode(yyvsp[-1], yyvsp[-3]);
if (yyval == NULL)
YYABORT;
}
-#line 4141 "awkgram.c"
+#line 4153 "awkgram.c"
break;
case 172: /* non_post_simp_exp: LEX_LENGTH */
-#line 1923 "awkgram.y"
+#line 1935 "awkgram.y"
{
static bool warned = false;
@@ -4154,45 +4166,45 @@ regular_print:
if (yyval == NULL)
YYABORT;
}
-#line 4158 "awkgram.c"
+#line 4170 "awkgram.c"
break;
case 175: /* non_post_simp_exp: INCREMENT variable */
-#line 1938 "awkgram.y"
+#line 1950 "awkgram.y"
{
yyvsp[-1]->opcode = Op_preincrement;
yyval = mk_assignment(yyvsp[0], NULL, yyvsp[-1]);
}
-#line 4167 "awkgram.c"
+#line 4179 "awkgram.c"
break;
case 176: /* non_post_simp_exp: DECREMENT variable */
-#line 1943 "awkgram.y"
+#line 1955 "awkgram.y"
{
yyvsp[-1]->opcode = Op_predecrement;
yyval = mk_assignment(yyvsp[0], NULL, yyvsp[-1]);
}
-#line 4176 "awkgram.c"
+#line 4188 "awkgram.c"
break;
case 177: /* non_post_simp_exp: YNUMBER */
-#line 1948 "awkgram.y"
+#line 1960 "awkgram.y"
{
yyval = list_create(yyvsp[0]);
}
-#line 4184 "awkgram.c"
+#line 4196 "awkgram.c"
break;
case 178: /* non_post_simp_exp: YSTRING */
-#line 1952 "awkgram.y"
+#line 1964 "awkgram.y"
{
yyval = list_create(yyvsp[0]);
}
-#line 4192 "awkgram.c"
+#line 4204 "awkgram.c"
break;
case 179: /* non_post_simp_exp: '-' simp_exp */
-#line 1956 "awkgram.y"
+#line 1968 "awkgram.y"
{
if (yyvsp[0]->lasti->opcode == Op_push_i
&& (yyvsp[0]->lasti->memory->flags & STRING) == 0
@@ -4207,11 +4219,11 @@ regular_print:
yyval = list_append(yyvsp[0], yyvsp[-1]);
}
}
-#line 4211 "awkgram.c"
+#line 4223 "awkgram.c"
break;
case 180: /* non_post_simp_exp: '+' simp_exp */
-#line 1971 "awkgram.y"
+#line 1983 "awkgram.y"
{
if (yyvsp[0]->lasti->opcode == Op_push_i
&& (yyvsp[0]->lasti->memory->flags & STRING) == 0
@@ -4229,20 +4241,20 @@ regular_print:
yyval = list_append(yyvsp[0], yyvsp[-1]);
}
}
-#line 4233 "awkgram.c"
+#line 4245 "awkgram.c"
break;
case 181: /* func_call: direct_func_call */
-#line 1992 "awkgram.y"
+#line 2004 "awkgram.y"
{
func_use(yyvsp[0]->lasti->func_name, FUNC_USE);
yyval = yyvsp[0];
}
-#line 4242 "awkgram.c"
+#line 4254 "awkgram.c"
break;
case 182: /* func_call: '@' direct_func_call */
-#line 1997 "awkgram.y"
+#line 2009 "awkgram.y"
{
/* indirect function call */
INSTRUCTION *f, *t;
@@ -4276,11 +4288,11 @@ regular_print:
yyval = list_prepend(yyvsp[0], t);
at_seen = false;
}
-#line 4280 "awkgram.c"
+#line 4292 "awkgram.c"
break;
case 183: /* direct_func_call: FUNC_CALL '(' opt_fcall_expression_list r_paren */
-#line 2034 "awkgram.y"
+#line 2046 "awkgram.y"
{
NODE *n;
char *name = yyvsp[-3]->func_name;
@@ -4313,49 +4325,49 @@ regular_print:
yyval = list_append(t, yyvsp[-3]);
}
}
-#line 4317 "awkgram.c"
+#line 4329 "awkgram.c"
break;
case 184: /* opt_variable: %empty */
-#line 2070 "awkgram.y"
+#line 2082 "awkgram.y"
{ yyval = NULL; }
-#line 4323 "awkgram.c"
+#line 4335 "awkgram.c"
break;
case 185: /* opt_variable: variable */
-#line 2072 "awkgram.y"
+#line 2084 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 4329 "awkgram.c"
+#line 4341 "awkgram.c"
break;
case 186: /* delete_subscript_list: %empty */
-#line 2077 "awkgram.y"
+#line 2089 "awkgram.y"
{ yyval = NULL; }
-#line 4335 "awkgram.c"
+#line 4347 "awkgram.c"
break;
case 187: /* delete_subscript_list: delete_subscript SUBSCRIPT */
-#line 2079 "awkgram.y"
+#line 2091 "awkgram.y"
{ yyval = yyvsp[-1]; }
-#line 4341 "awkgram.c"
+#line 4353 "awkgram.c"
break;
case 188: /* delete_subscript: delete_exp_list */
-#line 2084 "awkgram.y"
+#line 2096 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 4347 "awkgram.c"
+#line 4359 "awkgram.c"
break;
case 189: /* delete_subscript: delete_subscript delete_exp_list */
-#line 2086 "awkgram.y"
+#line 2098 "awkgram.y"
{
yyval = list_merge(yyvsp[-1], yyvsp[0]);
}
-#line 4355 "awkgram.c"
+#line 4367 "awkgram.c"
break;
case 190: /* delete_exp_list: bracketed_exp_list */
-#line 2093 "awkgram.y"
+#line 2105 "awkgram.y"
{
INSTRUCTION *ip = yyvsp[0]->lasti;
int count = ip->sub_count; /* # of SUBSEP-seperated expressions */
@@ -4369,11 +4381,11 @@ regular_print:
sub_counter++; /* count # of dimensions */
yyval = yyvsp[0];
}
-#line 4373 "awkgram.c"
+#line 4385 "awkgram.c"
break;
case 191: /* bracketed_exp_list: '[' expression_list ']' */
-#line 2110 "awkgram.y"
+#line 2122 "awkgram.y"
{
INSTRUCTION *t = yyvsp[-1];
if (yyvsp[-1] == NULL) {
@@ -4387,41 +4399,41 @@ regular_print:
yyvsp[0]->sub_count = count_expressions(&t, false);
yyval = list_append(t, yyvsp[0]);
}
-#line 4391 "awkgram.c"
+#line 4403 "awkgram.c"
break;
case 192: /* subscript: bracketed_exp_list */
-#line 2127 "awkgram.y"
+#line 2139 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 4397 "awkgram.c"
+#line 4409 "awkgram.c"
break;
case 193: /* subscript: subscript bracketed_exp_list */
-#line 2129 "awkgram.y"
+#line 2141 "awkgram.y"
{
yyval = list_merge(yyvsp[-1], yyvsp[0]);
}
-#line 4405 "awkgram.c"
+#line 4417 "awkgram.c"
break;
case 194: /* subscript_list: subscript SUBSCRIPT */
-#line 2136 "awkgram.y"
+#line 2148 "awkgram.y"
{ yyval = yyvsp[-1]; }
-#line 4411 "awkgram.c"
+#line 4423 "awkgram.c"
break;
case 195: /* simple_variable: NAME */
-#line 2141 "awkgram.y"
+#line 2153 "awkgram.y"
{
yyvsp[0]->opcode = Op_push;
yyvsp[0]->memory = variable(yyvsp[0]->source_line, yyvsp[0]->lextok, Node_var_new);
yyval = list_create(yyvsp[0]);
}
-#line 4421 "awkgram.c"
+#line 4433 "awkgram.c"
break;
case 196: /* simple_variable: NAME subscript_list */
-#line 2147 "awkgram.y"
+#line 2159 "awkgram.y"
{
char *arr = yyvsp[-1]->lextok;
@@ -4429,11 +4441,11 @@ regular_print:
yyvsp[-1]->opcode = Op_push_array;
yyval = list_prepend(yyvsp[0], yyvsp[-1]);
}
-#line 4433 "awkgram.c"
+#line 4445 "awkgram.c"
break;
case 197: /* variable: simple_variable */
-#line 2158 "awkgram.y"
+#line 2170 "awkgram.y"
{
INSTRUCTION *ip = yyvsp[0]->nexti;
if (ip->opcode == Op_push
@@ -4445,85 +4457,85 @@ regular_print:
} else
yyval = yyvsp[0];
}
-#line 4449 "awkgram.c"
+#line 4461 "awkgram.c"
break;
case 198: /* variable: '$' non_post_simp_exp opt_incdec */
-#line 2170 "awkgram.y"
+#line 2182 "awkgram.y"
{
yyval = list_append(yyvsp[-1], yyvsp[-2]);
if (yyvsp[0] != NULL)
mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
}
-#line 4459 "awkgram.c"
+#line 4471 "awkgram.c"
break;
case 199: /* opt_incdec: INCREMENT */
-#line 2179 "awkgram.y"
+#line 2191 "awkgram.y"
{
yyvsp[0]->opcode = Op_postincrement;
}
-#line 4467 "awkgram.c"
+#line 4479 "awkgram.c"
break;
case 200: /* opt_incdec: DECREMENT */
-#line 2183 "awkgram.y"
+#line 2195 "awkgram.y"
{
yyvsp[0]->opcode = Op_postdecrement;
}
-#line 4475 "awkgram.c"
+#line 4487 "awkgram.c"
break;
case 201: /* opt_incdec: %empty */
-#line 2187 "awkgram.y"
+#line 2199 "awkgram.y"
{ yyval = NULL; }
-#line 4481 "awkgram.c"
+#line 4493 "awkgram.c"
break;
case 202: /* l_brace: '{' opt_nls */
-#line 2191 "awkgram.y"
+#line 2203 "awkgram.y"
{ yyval = yyvsp[0]; }
-#line 4487 "awkgram.c"
+#line 4499 "awkgram.c"
break;
case 203: /* r_brace: '}' opt_nls */
-#line 2195 "awkgram.y"
+#line 2207 "awkgram.y"
{ yyval = yyvsp[0]; yyerrok; }
-#line 4493 "awkgram.c"
+#line 4505 "awkgram.c"
break;
case 204: /* r_paren: ')' */
-#line 2199 "awkgram.y"
+#line 2211 "awkgram.y"
{ yyerrok; }
-#line 4499 "awkgram.c"
+#line 4511 "awkgram.c"
break;
case 205: /* opt_semi: %empty */
-#line 2204 "awkgram.y"
+#line 2216 "awkgram.y"
{ yyval = NULL; }
-#line 4505 "awkgram.c"
+#line 4517 "awkgram.c"
break;
case 207: /* semi: ';' */
-#line 2209 "awkgram.y"
+#line 2221 "awkgram.y"
{ yyerrok; }
-#line 4511 "awkgram.c"
+#line 4523 "awkgram.c"
break;
case 208: /* colon: ':' */
-#line 2213 "awkgram.y"
+#line 2225 "awkgram.y"
{ yyval = yyvsp[0]; yyerrok; }
-#line 4517 "awkgram.c"
+#line 4529 "awkgram.c"
break;
case 209: /* comma: ',' opt_nls */
-#line 2217 "awkgram.y"
+#line 2229 "awkgram.y"
{ yyval = yyvsp[0]; yyerrok; }
-#line 4523 "awkgram.c"
+#line 4535 "awkgram.c"
break;
-#line 4527 "awkgram.c"
+#line 4539 "awkgram.c"
default: break;
}
@@ -4717,7 +4729,7 @@ yyreturn:
return yyresult;
}
-#line 2219 "awkgram.y"
+#line 2231 "awkgram.y"
struct token {
@@ -6112,6 +6124,7 @@ yylex(void)
thisline = NULL;
collect_regexp:
+// if (trace) fprintf(stderr, "want_regexp = %s\n", want_regexp ? "true" : "false");
if (want_regexp) {
int in_brack = 0; /* count brackets, [[:alnum:]] allowed */
int b_index = -1;
@@ -6220,23 +6233,32 @@ end_regexp:
retry:
/* skipping \r is a hack, but windows is just too pervasive. sigh. */
- while ((c = nextc(true)) == ' ' || c == '\t' || c == '\r')
+ while ((c = nextc(true)) == ' ' || c == '\t' || c == '\r') {
+// if (trace) fprintf(stderr, "skipping whitespace '%c'\n", c);
continue;
+ }
lexeme = lexptr ? lexptr - 1 : lexptr;
thisline = NULL;
tok = tokstart;
+// if (trace) fprintf(stderr, "examining '%c'\n", c);
+
if (gawk_mb_cur_max == 1 || nextc_is_1stbyte)
switch (c) {
case END_SRC:
+// if (trace) fprintf(stderr, "return END_SRC\n");
return 0;
case END_FILE:
+// if (trace) fprintf(stderr, "return NEWLINE_EOF\n");
+ trace = false;
return lasttok = NEWLINE_EOF;
case '\n':
sourceline++;
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE;
case '#': /* it's a comment */
@@ -6257,15 +6279,22 @@ retry:
if (c == END_FILE) {
pushback();
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE;
}
} else {
while ((c = nextc(false)) != '\n') {
- if (c == END_FILE)
+ if (c == END_FILE) {
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE_EOF;
+ }
}
}
sourceline++;
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE;
case '@':
@@ -6277,6 +6306,7 @@ retry:
}
pushback();
at_seen = true;
+// if (trace) fprintf(stderr, "return '@'\n");
return lasttok = '@';
case '\\':
@@ -6323,6 +6353,7 @@ retry:
goto retry;
} else {
yyerror(_("backslash not last character on line"));
+// if (trace) fprintf(stderr, "return LEX_EOF\n");
return lasttok = LEX_EOF;
}
break;
@@ -6341,6 +6372,7 @@ retry:
if (c == ':')
qm_col_count--;
}
+// if (trace) fprintf(stderr, "return '%c'\n", c);
return lasttok = c;
/*
@@ -6349,21 +6381,27 @@ retry:
*/
case ')':
in_parens--;
+// if (trace) fprintf(stderr, "return '%c'\n", c);
return lasttok = c;
case '(':
in_parens++;
+// if (trace) fprintf(stderr, "return '%c'\n", c);
return lasttok = c;
case '$':
yylval = GET_INSTRUCTION(Op_field_spec);
+// if (trace) fprintf(stderr, "return '%c'\n", c);
return lasttok = c;
case '{':
if (++in_braces == 1)
firstline = sourceline;
case ';':
+ // trace = false;
+ /* fall through */
case ',':
case '[':
- return lasttok = c;
+// if (trace) fprintf(stderr, "return '%c'\n", c);
+ return lasttok = c;
case ']':
c = nextc(true);
pushback();
@@ -6378,15 +6416,18 @@ retry:
yylval = GET_INSTRUCTION(Op_subscript);
lasttok = SUBSCRIPT; /* end of subscripts */
}
+// if (trace) fprintf(stderr, "return ']'\n");
return ']';
case '*':
if ((c = nextc(true)) == '=') {
yylval = GET_INSTRUCTION(Op_assign_times);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return lasttok = ASSIGNOP;
} else if (do_posix) {
pushback();
yylval = GET_INSTRUCTION(Op_times);
+// if (trace) fprintf(stderr, "return '*'\n");
return lasttok = '*';
} else if (c == '*') {
/* make ** and **= aliases for ^ and ^= */
@@ -6401,6 +6442,7 @@ retry:
lintwarn(_("operator `%s' is not supported in old awk"), "**=");
}
yylval = GET_INSTRUCTION(Op_assign_exp);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return ASSIGNOP;
} else {
pushback();
@@ -6412,29 +6454,35 @@ retry:
lintwarn(_("operator `%s' is not supported in old awk"), "**");
}
yylval = GET_INSTRUCTION(Op_exp);
+// if (trace) fprintf(stderr, "return '^'\n");
return lasttok = '^';
}
}
pushback();
yylval = GET_INSTRUCTION(Op_times);
+// if (trace) fprintf(stderr, "return '*' 2\n");
return lasttok = '*';
case '/':
if (nextc(false) == '=') {
pushback();
+// if (trace) fprintf(stderr, "return SLASH_BEFORE_EQUAL\n");
return lasttok = SLASH_BEFORE_EQUAL;
}
pushback();
yylval = GET_INSTRUCTION(Op_quotient);
+// if (trace) fprintf(stderr, "return '/'\n");
return lasttok = '/';
case '%':
if (nextc(true) == '=') {
yylval = GET_INSTRUCTION(Op_assign_mod);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return lasttok = ASSIGNOP;
}
pushback();
yylval = GET_INSTRUCTION(Op_mod);
+// if (trace) fprintf(stderr, "return '%%'\n");
return lasttok = '%';
case '^':
@@ -6447,6 +6495,7 @@ retry:
lintwarn(_("operator `%s' is not supported in old awk"), "^=");
}
yylval = GET_INSTRUCTION(Op_assign_exp);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return lasttok = ASSIGNOP;
}
pushback();
@@ -6455,6 +6504,7 @@ retry:
lintwarn(_("operator `%s' is not supported in old awk"), "^");
}
yylval = GET_INSTRUCTION(Op_exp);
+// if (trace) fprintf(stderr, "return '^'\n");
return lasttok = '^';
}
@@ -6465,50 +6515,61 @@ retry:
}
if (c == '+') {
yylval = GET_INSTRUCTION(Op_symbol);
+// if (trace) fprintf(stderr, "return INCREMENT\n");
return lasttok = INCREMENT;
}
pushback();
yylval = GET_INSTRUCTION(Op_plus);
+// if (trace) fprintf(stderr, "return '+'\n");
return lasttok = '+';
case '!':
if ((c = nextc(true)) == '=') {
yylval = GET_INSTRUCTION(Op_notequal);
+// if (trace) fprintf(stderr, "return RELOP\n");
return lasttok = RELOP;
}
if (c == '~') {
yylval = GET_INSTRUCTION(Op_nomatch);
+// if (trace) fprintf(stderr, "return MATCHOP\n");
return lasttok = MATCHOP;
}
pushback();
yylval = GET_INSTRUCTION(Op_symbol);
+// if (trace) fprintf(stderr, "return '!'\n");
return lasttok = '!';
case '<':
if (nextc(true) == '=') {
yylval = GET_INSTRUCTION(Op_leq);
+// if (trace) fprintf(stderr, "return RELOP\n");
return lasttok = RELOP;
}
yylval = GET_INSTRUCTION(Op_less);
pushback();
+// if (trace) fprintf(stderr, "return '<'\n");
return lasttok = '<';
case '=':
if (nextc(true) == '=') {
yylval = GET_INSTRUCTION(Op_equal);
+// if (trace) fprintf(stderr, "return RELOP\n");
return lasttok = RELOP;
}
yylval = GET_INSTRUCTION(Op_assign);
pushback();
+// if (trace) fprintf(stderr, "return ASSIGN\n");
return lasttok = ASSIGN;
case '>':
if ((c = nextc(true)) == '=') {
yylval = GET_INSTRUCTION(Op_geq);
+// if (trace) fprintf(stderr, "return RELOP\n");
return lasttok = RELOP;
} else if (c == '>') {
yylval = GET_INSTRUCTION(Op_symbol);
yylval->redir_type = redirect_append;
+// if (trace) fprintf(stderr, "return IO_OUT\n");
return lasttok = IO_OUT;
}
pushback();
@@ -6518,10 +6579,12 @@ retry:
return lasttok = IO_OUT;
}
yylval = GET_INSTRUCTION(Op_greater);
+// if (trace) fprintf(stderr, "return '>'\n");
return lasttok = '>';
case '~':
yylval = GET_INSTRUCTION(Op_match);
+// if (trace) fprintf(stderr, "return MATCHOP\n");
return lasttok = MATCHOP;
case '}':
@@ -6537,6 +6600,8 @@ retry:
}
did_newline = true;
--lexptr; /* pick up } next time */
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE;
case '"':
@@ -6579,6 +6644,7 @@ retry:
yylval = GET_INSTRUCTION(Op_token);
if (want_source) {
yylval->lextok = estrdup(tokstart, tok - tokstart);
+// if (trace) fprintf(stderr, "return FILENAME\n");
return lasttok = FILENAME;
}
@@ -6591,28 +6657,36 @@ retry:
if (do_intl)
dumpintlstr(yylval->memory->stptr, yylval->memory->stlen);
}
+// if (trace) fprintf(stderr, "return YSTRING\n");
return lasttok = YSTRING;
case '-':
if ((c = nextc(true)) == '=') {
yylval = GET_INSTRUCTION(Op_assign_minus);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return lasttok = ASSIGNOP;
}
if (c == '-') {
yylval = GET_INSTRUCTION(Op_symbol);
+// if (trace) fprintf(stderr, "return DECREMENT\n");
return lasttok = DECREMENT;
}
pushback();
yylval = GET_INSTRUCTION(Op_minus);
+// if (trace) fprintf(stderr, "return '-'\n");
return lasttok = '-';
case '.':
+// if (trace) fprintf(stderr, "saw a dot '%c'\n", c);
c = nextc(true);
+// if (trace) fprintf(stderr, "and just got '%c'\n", c);
pushback();
- if (! isdigit(c))
+ if (! isdigit(c)) {
+// if (trace) fprintf(stderr, "returning '.'\n");
return lasttok = '.';
- else
+ } else
c = '.';
+// if (trace) fprintf(stderr, "falling through\n");
/* FALL THROUGH */
case '0':
case '1':
@@ -6624,6 +6698,7 @@ retry:
case '7':
case '8':
case '9':
+// if (trace) fprintf(stderr, "processing number '%c'\n", c);
/* It's a number */
for (;;) {
bool gotnumber = false;
@@ -6712,10 +6787,12 @@ retry:
if (gotnumber)
break;
c = nextc(true);
+// if (trace) fprintf(stderr, "2 processing number '%c'\n", c);
}
pushback();
tokadd('\0');
+// if (trace) fprintf(stderr, "got number '%s'\n", tokstart);
yylval = GET_INSTRUCTION(Op_push_i);
base = 10;
@@ -6754,9 +6831,11 @@ retry:
d = nondec2awknum(tokstart, strlen(tokstart)-1, NULL);
else
d = atof(tokstart);
+// if (trace) fprintf(stderr, "got number %g\n", d);
yylval->memory = set_profile_text(make_number(d), tokstart, strlen(tokstart) - 1);
if (d <= INT32_MAX && d >= INT32_MIN && d == (int32_t) d)
yylval->memory->flags |= NUMINT;
+// if (trace) fprintf(stderr, "return YNUMBER\n");
return lasttok = YNUMBER;
case '&':
@@ -6766,10 +6845,12 @@ retry:
allow_newline(& new_comment);
yylval->comment = new_comment;
+// if (trace) fprintf(stderr, "return LEX_AND\n");
return lasttok = LEX_AND;
}
pushback();
yylval = GET_INSTRUCTION(Op_symbol);
+// if (trace) fprintf(stderr, "return '&'\n");
return lasttok = '&';
case '|':
@@ -6779,10 +6860,13 @@ retry:
allow_newline(& new_comment);
yylval->comment = new_comment;
+// if (trace) fprintf(stderr, "return LEX_AND\n");
return lasttok = LEX_OR;
} else if (! do_traditional && c == '&') {
yylval = GET_INSTRUCTION(Op_symbol);
yylval->redir_type = redirect_twoway;
+// if (trace) fprintf(stderr, "return %s\n",
+// in_print && in_parens == 0 ? "IO_OUT" : "IO_IN");
return lasttok = (in_print && in_parens == 0 ? IO_OUT : IO_IN);
}
@@ -6790,16 +6874,19 @@ retry:
if (in_print && in_parens == 0) {
yylval = GET_INSTRUCTION(Op_symbol);
yylval->redir_type = redirect_pipe;
+// if (trace) fprintf(stderr, "return IO_OUT\n");
return lasttok = IO_OUT;
} else {
yylval = GET_INSTRUCTION(Op_symbol);
yylval->redir_type = redirect_pipein;
+// if (trace) fprintf(stderr, "return IO_IN\n");
return lasttok = IO_IN;
}
}
if (! is_letter(c)) {
yyerror(_("invalid char '%c' in expression"), c);
+// if (trace) fprintf(stderr, "return LEX_EOF\n");
return lasttok = LEX_EOF;
}
@@ -6829,6 +6916,7 @@ retry:
/* it's some type of name-type-thing. Find its length. */
tok = tokstart;
while (c != END_FILE && is_identchar(c)) {
+// if (trace) fprintf(stderr, "2 examining '%c'\n", c);
tokadd(c);
c = nextc(true);
@@ -6847,12 +6935,15 @@ retry:
tokadd('\0');
pushback();
+// if (trace) fprintf(stderr, "looking at a name: %s\n", tokstart);
+
(void) validate_qualified_name(tokstart);
/* See if it is a special token. */
if ((mid = check_qualified_special(tokstart)) >= 0) {
static int warntab[sizeof(tokentab) / sizeof(tokentab[0])];
int class = tokentab[mid].class;
+ const char *op = tokentab[mid].operator;
switch (class) {
case LEX_EVAL:
@@ -6930,6 +7021,7 @@ retry:
tokkey[0] = '@';
memcpy(tokkey + 1, tokstart, tok - tokstart);
yylval = GET_INSTRUCTION(Op_token);
+// if (trace) fprintf(stderr, "setting lextok: %s\n", tokkey);
yylval->lextok = tokkey;
break;
@@ -6980,14 +7072,23 @@ make_instruction:
yylval->builtin_idx = mid;
break;
}
+ if (strcmp(tokstart, "delete") == 0) {
+ static int counter = 0;
+ if (++counter == 4)
+ trace = true;
+ }
+ if (trace) fprintf(stderr, "return %s\n", op);
return lasttok = class;
}
+// if (trace) fprintf(stderr, "%s is not a known token\n", tokstart);
out:
if (want_param_names == FUNC_HEADER)
tokkey = estrdup(tokstart, tok - tokstart - 1);
else
tokkey = qualify_name(tokstart, tok - tokstart - 1);
+ if (trace) fprintf(stderr, "tokkey = %s\n", tokkey);
+
if (*lexptr == '(') {
yylval = bcalloc(Op_token, 2, sourceline);
yylval->lextok = tokkey;
@@ -7007,6 +7108,8 @@ out:
goto_warned = true;
lintwarn(_("`goto' considered harmful!"));
}
+ if (trace) fprintf(stderr, "returning NAME %#p, %#p\n", yylval,
+ yylval->lextok);
return lasttok = NAME;
}
@@ -7748,14 +7851,20 @@ variable(int location, char *name, NODETYPE type)
{
NODE *r;
+ if (trace) fprintf(stderr, "variable(%d, %s, %s)\n", location, name,
+ nodetype2str(type));
+
if ((r = lookup(name)) != NULL) {
if (r->type == Node_func || r->type == Node_ext_func )
error_ln(location, _("function `%s' called with space between name and `(',\nor used as a variable or an array"),
r->vname);
} else {
/* not found */
- return install_symbol(name, type);
+ NODE *ret = install_symbol(name, type);
+ if (trace) fprintf(stderr, "installing %s, returning %#p\n", name, ret);
+ return ret;
}
+ if (trace) fprintf(stderr, "found %s, returning %#p\n", name, r);
efree(name);
return r;
}
diff --git a/awkgram.y b/awkgram.y
index e4c9708d..d8dd1a01 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -34,6 +34,8 @@
#define signed /**/
#endif
+NODE *watched = NULL;
+
static void yyerror(const char *m, ...) ATTRIBUTE_PRINTF_1;
static void error_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
static void lintwarn_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
@@ -66,6 +68,7 @@ static INSTRUCTION *outer_comment;
static INSTRUCTION *interblock_comment;
static INSTRUCTION *pending_comment;
static INSTRUCTION *namespace_chain;
+bool trace = false;
#ifdef DEBUG_COMMENTS
static void
@@ -1230,9 +1233,18 @@ regular_print:
| LEX_DELETE NAME { sub_counter = 0; } delete_subscript_list
{
char *arr = $2->lextok;
+ extern void print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump);
+
+ if (trace) fprintf(stderr, "tok: %#p, val: %#p, %s\n", (void*) $2, arr, arr);
$2->opcode = Op_push_array;
$2->memory = variable($2->source_line, arr, Node_var_new);
+ if (trace) {
+ watched = $2->memory;
+ fprintf(stderr, "ref_count = %d\n", watched->valref);
+ print_instruction((INSTRUCTION *) $2, fprintf, stderr, true);
+ fprintf(stderr, "\t-- memory = %#p, watched = %#p\n", $2->memory, watched);
+ }
if (! do_posix && ! do_traditional) {
if ($2->memory == symbol_table)
@@ -3610,6 +3622,7 @@ yylex(void)
thisline = NULL;
collect_regexp:
+// if (trace) fprintf(stderr, "want_regexp = %s\n", want_regexp ? "true" : "false");
if (want_regexp) {
int in_brack = 0; /* count brackets, [[:alnum:]] allowed */
int b_index = -1;
@@ -3718,23 +3731,32 @@ end_regexp:
retry:
/* skipping \r is a hack, but windows is just too pervasive. sigh. */
- while ((c = nextc(true)) == ' ' || c == '\t' || c == '\r')
+ while ((c = nextc(true)) == ' ' || c == '\t' || c == '\r') {
+// if (trace) fprintf(stderr, "skipping whitespace '%c'\n", c);
continue;
+ }
lexeme = lexptr ? lexptr - 1 : lexptr;
thisline = NULL;
tok = tokstart;
+// if (trace) fprintf(stderr, "examining '%c'\n", c);
+
if (gawk_mb_cur_max == 1 || nextc_is_1stbyte)
switch (c) {
case END_SRC:
+// if (trace) fprintf(stderr, "return END_SRC\n");
return 0;
case END_FILE:
+// if (trace) fprintf(stderr, "return NEWLINE_EOF\n");
+ trace = false;
return lasttok = NEWLINE_EOF;
case '\n':
sourceline++;
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE;
case '#': /* it's a comment */
@@ -3755,15 +3777,22 @@ retry:
if (c == END_FILE) {
pushback();
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE;
}
} else {
while ((c = nextc(false)) != '\n') {
- if (c == END_FILE)
+ if (c == END_FILE) {
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE_EOF;
+ }
}
}
sourceline++;
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE;
case '@':
@@ -3775,6 +3804,7 @@ retry:
}
pushback();
at_seen = true;
+// if (trace) fprintf(stderr, "return '@'\n");
return lasttok = '@';
case '\\':
@@ -3821,6 +3851,7 @@ retry:
goto retry;
} else {
yyerror(_("backslash not last character on line"));
+// if (trace) fprintf(stderr, "return LEX_EOF\n");
return lasttok = LEX_EOF;
}
break;
@@ -3839,6 +3870,7 @@ retry:
if (c == ':')
qm_col_count--;
}
+// if (trace) fprintf(stderr, "return '%c'\n", c);
return lasttok = c;
/*
@@ -3847,21 +3879,27 @@ retry:
*/
case ')':
in_parens--;
+// if (trace) fprintf(stderr, "return '%c'\n", c);
return lasttok = c;
case '(':
in_parens++;
+// if (trace) fprintf(stderr, "return '%c'\n", c);
return lasttok = c;
case '$':
yylval = GET_INSTRUCTION(Op_field_spec);
+// if (trace) fprintf(stderr, "return '%c'\n", c);
return lasttok = c;
case '{':
if (++in_braces == 1)
firstline = sourceline;
case ';':
+ // trace = false;
+ /* fall through */
case ',':
case '[':
- return lasttok = c;
+// if (trace) fprintf(stderr, "return '%c'\n", c);
+ return lasttok = c;
case ']':
c = nextc(true);
pushback();
@@ -3876,15 +3914,18 @@ retry:
yylval = GET_INSTRUCTION(Op_subscript);
lasttok = SUBSCRIPT; /* end of subscripts */
}
+// if (trace) fprintf(stderr, "return ']'\n");
return ']';
case '*':
if ((c = nextc(true)) == '=') {
yylval = GET_INSTRUCTION(Op_assign_times);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return lasttok = ASSIGNOP;
} else if (do_posix) {
pushback();
yylval = GET_INSTRUCTION(Op_times);
+// if (trace) fprintf(stderr, "return '*'\n");
return lasttok = '*';
} else if (c == '*') {
/* make ** and **= aliases for ^ and ^= */
@@ -3899,6 +3940,7 @@ retry:
lintwarn(_("operator `%s' is not supported in old awk"), "**=");
}
yylval = GET_INSTRUCTION(Op_assign_exp);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return ASSIGNOP;
} else {
pushback();
@@ -3910,29 +3952,35 @@ retry:
lintwarn(_("operator `%s' is not supported in old awk"), "**");
}
yylval = GET_INSTRUCTION(Op_exp);
+// if (trace) fprintf(stderr, "return '^'\n");
return lasttok = '^';
}
}
pushback();
yylval = GET_INSTRUCTION(Op_times);
+// if (trace) fprintf(stderr, "return '*' 2\n");
return lasttok = '*';
case '/':
if (nextc(false) == '=') {
pushback();
+// if (trace) fprintf(stderr, "return SLASH_BEFORE_EQUAL\n");
return lasttok = SLASH_BEFORE_EQUAL;
}
pushback();
yylval = GET_INSTRUCTION(Op_quotient);
+// if (trace) fprintf(stderr, "return '/'\n");
return lasttok = '/';
case '%':
if (nextc(true) == '=') {
yylval = GET_INSTRUCTION(Op_assign_mod);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return lasttok = ASSIGNOP;
}
pushback();
yylval = GET_INSTRUCTION(Op_mod);
+// if (trace) fprintf(stderr, "return '%%'\n");
return lasttok = '%';
case '^':
@@ -3945,6 +3993,7 @@ retry:
lintwarn(_("operator `%s' is not supported in old awk"), "^=");
}
yylval = GET_INSTRUCTION(Op_assign_exp);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return lasttok = ASSIGNOP;
}
pushback();
@@ -3953,6 +4002,7 @@ retry:
lintwarn(_("operator `%s' is not supported in old awk"), "^");
}
yylval = GET_INSTRUCTION(Op_exp);
+// if (trace) fprintf(stderr, "return '^'\n");
return lasttok = '^';
}
@@ -3963,50 +4013,61 @@ retry:
}
if (c == '+') {
yylval = GET_INSTRUCTION(Op_symbol);
+// if (trace) fprintf(stderr, "return INCREMENT\n");
return lasttok = INCREMENT;
}
pushback();
yylval = GET_INSTRUCTION(Op_plus);
+// if (trace) fprintf(stderr, "return '+'\n");
return lasttok = '+';
case '!':
if ((c = nextc(true)) == '=') {
yylval = GET_INSTRUCTION(Op_notequal);
+// if (trace) fprintf(stderr, "return RELOP\n");
return lasttok = RELOP;
}
if (c == '~') {
yylval = GET_INSTRUCTION(Op_nomatch);
+// if (trace) fprintf(stderr, "return MATCHOP\n");
return lasttok = MATCHOP;
}
pushback();
yylval = GET_INSTRUCTION(Op_symbol);
+// if (trace) fprintf(stderr, "return '!'\n");
return lasttok = '!';
case '<':
if (nextc(true) == '=') {
yylval = GET_INSTRUCTION(Op_leq);
+// if (trace) fprintf(stderr, "return RELOP\n");
return lasttok = RELOP;
}
yylval = GET_INSTRUCTION(Op_less);
pushback();
+// if (trace) fprintf(stderr, "return '<'\n");
return lasttok = '<';
case '=':
if (nextc(true) == '=') {
yylval = GET_INSTRUCTION(Op_equal);
+// if (trace) fprintf(stderr, "return RELOP\n");
return lasttok = RELOP;
}
yylval = GET_INSTRUCTION(Op_assign);
pushback();
+// if (trace) fprintf(stderr, "return ASSIGN\n");
return lasttok = ASSIGN;
case '>':
if ((c = nextc(true)) == '=') {
yylval = GET_INSTRUCTION(Op_geq);
+// if (trace) fprintf(stderr, "return RELOP\n");
return lasttok = RELOP;
} else if (c == '>') {
yylval = GET_INSTRUCTION(Op_symbol);
yylval->redir_type = redirect_append;
+// if (trace) fprintf(stderr, "return IO_OUT\n");
return lasttok = IO_OUT;
}
pushback();
@@ -4016,10 +4077,12 @@ retry:
return lasttok = IO_OUT;
}
yylval = GET_INSTRUCTION(Op_greater);
+// if (trace) fprintf(stderr, "return '>'\n");
return lasttok = '>';
case '~':
yylval = GET_INSTRUCTION(Op_match);
+// if (trace) fprintf(stderr, "return MATCHOP\n");
return lasttok = MATCHOP;
case '}':
@@ -4035,6 +4098,8 @@ retry:
}
did_newline = true;
--lexptr; /* pick up } next time */
+// if (trace) fprintf(stderr, "return NEWLINE\n");
+ trace = false;
return lasttok = NEWLINE;
case '"':
@@ -4077,6 +4142,7 @@ retry:
yylval = GET_INSTRUCTION(Op_token);
if (want_source) {
yylval->lextok = estrdup(tokstart, tok - tokstart);
+// if (trace) fprintf(stderr, "return FILENAME\n");
return lasttok = FILENAME;
}
@@ -4089,28 +4155,36 @@ retry:
if (do_intl)
dumpintlstr(yylval->memory->stptr, yylval->memory->stlen);
}
+// if (trace) fprintf(stderr, "return YSTRING\n");
return lasttok = YSTRING;
case '-':
if ((c = nextc(true)) == '=') {
yylval = GET_INSTRUCTION(Op_assign_minus);
+// if (trace) fprintf(stderr, "return ASSIGNOP\n");
return lasttok = ASSIGNOP;
}
if (c == '-') {
yylval = GET_INSTRUCTION(Op_symbol);
+// if (trace) fprintf(stderr, "return DECREMENT\n");
return lasttok = DECREMENT;
}
pushback();
yylval = GET_INSTRUCTION(Op_minus);
+// if (trace) fprintf(stderr, "return '-'\n");
return lasttok = '-';
case '.':
+// if (trace) fprintf(stderr, "saw a dot '%c'\n", c);
c = nextc(true);
+// if (trace) fprintf(stderr, "and just got '%c'\n", c);
pushback();
- if (! isdigit(c))
+ if (! isdigit(c)) {
+// if (trace) fprintf(stderr, "returning '.'\n");
return lasttok = '.';
- else
+ } else
c = '.';
+// if (trace) fprintf(stderr, "falling through\n");
/* FALL THROUGH */
case '0':
case '1':
@@ -4122,6 +4196,7 @@ retry:
case '7':
case '8':
case '9':
+// if (trace) fprintf(stderr, "processing number '%c'\n", c);
/* It's a number */
for (;;) {
bool gotnumber = false;
@@ -4210,10 +4285,12 @@ retry:
if (gotnumber)
break;
c = nextc(true);
+// if (trace) fprintf(stderr, "2 processing number '%c'\n", c);
}
pushback();
tokadd('\0');
+// if (trace) fprintf(stderr, "got number '%s'\n", tokstart);
yylval = GET_INSTRUCTION(Op_push_i);
base = 10;
@@ -4252,9 +4329,11 @@ retry:
d = nondec2awknum(tokstart, strlen(tokstart)-1, NULL);
else
d = atof(tokstart);
+// if (trace) fprintf(stderr, "got number %g\n", d);
yylval->memory = set_profile_text(make_number(d), tokstart, strlen(tokstart) - 1);
if (d <= INT32_MAX && d >= INT32_MIN && d == (int32_t) d)
yylval->memory->flags |= NUMINT;
+// if (trace) fprintf(stderr, "return YNUMBER\n");
return lasttok = YNUMBER;
case '&':
@@ -4264,10 +4343,12 @@ retry:
allow_newline(& new_comment);
yylval->comment = new_comment;
+// if (trace) fprintf(stderr, "return LEX_AND\n");
return lasttok = LEX_AND;
}
pushback();
yylval = GET_INSTRUCTION(Op_symbol);
+// if (trace) fprintf(stderr, "return '&'\n");
return lasttok = '&';
case '|':
@@ -4277,10 +4358,13 @@ retry:
allow_newline(& new_comment);
yylval->comment = new_comment;
+// if (trace) fprintf(stderr, "return LEX_AND\n");
return lasttok = LEX_OR;
} else if (! do_traditional && c == '&') {
yylval = GET_INSTRUCTION(Op_symbol);
yylval->redir_type = redirect_twoway;
+// if (trace) fprintf(stderr, "return %s\n",
+// in_print && in_parens == 0 ? "IO_OUT" : "IO_IN");
return lasttok = (in_print && in_parens == 0 ? IO_OUT : IO_IN);
}
@@ -4288,16 +4372,19 @@ retry:
if (in_print && in_parens == 0) {
yylval = GET_INSTRUCTION(Op_symbol);
yylval->redir_type = redirect_pipe;
+// if (trace) fprintf(stderr, "return IO_OUT\n");
return lasttok = IO_OUT;
} else {
yylval = GET_INSTRUCTION(Op_symbol);
yylval->redir_type = redirect_pipein;
+// if (trace) fprintf(stderr, "return IO_IN\n");
return lasttok = IO_IN;
}
}
if (! is_letter(c)) {
yyerror(_("invalid char '%c' in expression"), c);
+// if (trace) fprintf(stderr, "return LEX_EOF\n");
return lasttok = LEX_EOF;
}
@@ -4327,6 +4414,7 @@ retry:
/* it's some type of name-type-thing. Find its length. */
tok = tokstart;
while (c != END_FILE && is_identchar(c)) {
+// if (trace) fprintf(stderr, "2 examining '%c'\n", c);
tokadd(c);
c = nextc(true);
@@ -4345,12 +4433,15 @@ retry:
tokadd('\0');
pushback();
+// if (trace) fprintf(stderr, "looking at a name: %s\n", tokstart);
+
(void) validate_qualified_name(tokstart);
/* See if it is a special token. */
if ((mid = check_qualified_special(tokstart)) >= 0) {
static int warntab[sizeof(tokentab) / sizeof(tokentab[0])];
int class = tokentab[mid].class;
+ const char *op = tokentab[mid].operator;
switch (class) {
case LEX_EVAL:
@@ -4428,6 +4519,7 @@ retry:
tokkey[0] = '@';
memcpy(tokkey + 1, tokstart, tok - tokstart);
yylval = GET_INSTRUCTION(Op_token);
+// if (trace) fprintf(stderr, "setting lextok: %s\n", tokkey);
yylval->lextok = tokkey;
break;
@@ -4478,14 +4570,23 @@ make_instruction:
yylval->builtin_idx = mid;
break;
}
+ if (strcmp(tokstart, "delete") == 0) {
+ static int counter = 0;
+ if (++counter == 4)
+ trace = true;
+ }
+ if (trace) fprintf(stderr, "return %s\n", op);
return lasttok = class;
}
+// if (trace) fprintf(stderr, "%s is not a known token\n", tokstart);
out:
if (want_param_names == FUNC_HEADER)
tokkey = estrdup(tokstart, tok - tokstart - 1);
else
tokkey = qualify_name(tokstart, tok - tokstart - 1);
+ if (trace) fprintf(stderr, "tokkey = %s\n", tokkey);
+
if (*lexptr == '(') {
yylval = bcalloc(Op_token, 2, sourceline);
yylval->lextok = tokkey;
@@ -4505,6 +4606,8 @@ out:
goto_warned = true;
lintwarn(_("`goto' considered harmful!"));
}
+ if (trace) fprintf(stderr, "returning NAME %#p, %#p\n", yylval,
+ yylval->lextok);
return lasttok = NAME;
}
@@ -5246,14 +5349,20 @@ variable(int location, char *name, NODETYPE type)
{
NODE *r;
+ if (trace) fprintf(stderr, "variable(%d, %s, %s)\n", location, name,
+ nodetype2str(type));
+
if ((r = lookup(name)) != NULL) {
if (r->type == Node_func || r->type == Node_ext_func )
error_ln(location, _("function `%s' called with space between name and `(',\nor used as a variable or an array"),
r->vname);
} else {
/* not found */
- return install_symbol(name, type);
+ NODE *ret = install_symbol(name, type);
+ if (trace) fprintf(stderr, "installing %s, returning %#p\n", name, ret);
+ return ret;
}
+ if (trace) fprintf(stderr, "found %s, returning %#p\n", name, r);
efree(name);
return r;
}
diff --git a/debug.c b/debug.c
index cf0946e2..3c56f19f 100644
--- a/debug.c
+++ b/debug.c
@@ -314,7 +314,7 @@ static struct list_item *add_item(struct list_item *list, int type, NODE *symbol
static void delete_item(struct list_item *d);
static int breakpoint_triggered(BREAKPOINT *b);
static int watchpoint_triggered(struct list_item *w);
-static void print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump);
+void print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump);
static void print_ns_list(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump);
static int print_code(INSTRUCTION *pc, void *x);
static void next_command();
@@ -3760,7 +3760,7 @@ print_memory(NODE *m, NODE *func, Func_print print_func, FILE *fp)
/* print_instruction --- print a bytecode */
-static void
+void
print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump)
{
int pcount = 0;
diff --git a/main.c b/main.c
index 19c50b6d..fab4d47e 100644
--- a/main.c
+++ b/main.c
@@ -234,6 +234,7 @@ main(int argc, char **argv)
#ifdef HAVE_MCHECK_H
#ifdef HAVE_MTRACE
if (do_tidy_mem)
+ fprintf(stderr, "TIDYMEM ON!\n"),
mtrace();
#endif /* HAVE_MTRACE */
#endif /* HAVE_MCHECK_H */
@@ -540,6 +541,7 @@ main(int argc, char **argv)
#endif
if (do_tidy_mem)
+ fprintf(stderr, "RELEASING ALL VARS!\n"),
release_all_vars();
/* keep valgrind happier */
diff --git a/mpfr.c b/mpfr.c
index cabc3910..573448ca 100644
--- a/mpfr.c
+++ b/mpfr.c
@@ -46,7 +46,7 @@ static mpfr_prec_t default_prec;
static mpfr_rnd_t get_rnd_mode(const char rmode);
static NODE *mpg_force_number(NODE *n);
-static NODE *mpg_make_number(double);
+static NODE *mpg_make_number(double x, const char *file, int line, const char *func);
static NODE *mpg_format_val(const char *format, int index, NODE *s);
static int mpg_interpret(INSTRUCTION **cp);
@@ -125,7 +125,7 @@ mpg_node(unsigned int flags)
*/
static NODE *
-mpg_make_number(double x)
+mpg_make_number(double x, const char *file, int line, const char *func)
{
NODE *r;
double ival;
diff --git a/node.c b/node.c
index 12d7a046..63b3b6fe 100644
--- a/node.c
+++ b/node.c
@@ -27,11 +27,11 @@
#include "awk.h"
#include "floatmagic.h" /* definition of isnan */
-static NODE *r_make_number(double x);
+static NODE *r_make_number(double x, const char *file, int line, const char *func);
static AWKNUM get_ieee_magic_val(char *val);
extern NODE **fmt_list; /* declared in eval.c */
-NODE *(*make_number)(double) = r_make_number;
+NODE *(*make_number)(double, const char *, int, const char *) = r_make_number;
NODE *(*str2number)(NODE *) = r_force_number;
NODE *(*format_val)(const char *, int, NODE *) = r_format_val;
int (*cmp_numbers)(const NODE *, const NODE *) = cmp_awknums;
@@ -357,10 +357,13 @@ r_dupnode(NODE *n)
/* r_make_number --- allocate a node with defined number */
static NODE *
-r_make_number(double x)
+r_make_number(double x, const char *file, int line, const char *func)
{
NODE *r = make_number_node(0);
r->numbr = x;
+ if (watched && r == watched)
+ fprintf(stderr, "%s:%d:%s: clobbering %#p with %g\n",
+ file, line, func, watched, x);
return r;
}
@@ -397,7 +400,9 @@ NODE *
make_str_node(const char *s, size_t len, int flags)
{
NODE *r;
+
getnode(r);
+ memset(r, '\0', sizeof(*r));
r->type = Node_val;
r->numbr = 0;
r->flags = (MALLOC|STRING|STRCUR);
diff --git a/profile.c b/profile.c
index 3dd7bde9..380e78ca 100644
--- a/profile.c
+++ b/profile.c
@@ -226,6 +226,7 @@ pprint(INSTRUCTION *startp, INSTRUCTION *endp, int flags)
int rule;
static int rule_count[MAXRULE];
static bool skip_comment = false;
+ extern void print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump);
for (pc = startp; pc != endp; pc = pc->nexti) {
if (pc->source_line > 0)
@@ -345,11 +346,13 @@ pprint(INSTRUCTION *startp, INSTRUCTION *endp, int flags)
if (pc->initval != NULL)
pp_push(Op_push_i, pp_node(pc->initval), CAN_FREE, pc->comment);
/* fall through */
+ case Op_push_array:
+ if (watched && pc->memory == watched)
+ fprintf(stderr, "%s:%d: memory: %#p, ref_count = %d\n", __FILE__, __LINE__, pc->memory, pc->memory->valref);
case Op_store_sub:
case Op_assign_concat:
case Op_push_lhs:
case Op_push_param:
- case Op_push_array:
case Op_push:
case Op_push_arg:
case Op_push_arg_untyped:
@@ -373,7 +376,10 @@ pprint(INSTRUCTION *startp, INSTRUCTION *endp, int flags)
break;
default:
- fprintf(stderr, "Got unexpected type %s\n", nodetype2str(m->type));
+ fprintf(stderr, "Got unexpected type %s, memory = %#p\n", nodetype2str(m->type), pc->memory);
+ print_instruction(pc, fprintf, stderr, true);
+ fprintf(stderr, "in profile.c, ref_count = %d\n", pc->memory->valref);
+
cant_happen();
}
diff --git a/symbol.c b/symbol.c
index 99a8b3a5..4f1d5885 100644
--- a/symbol.c
+++ b/symbol.c
@@ -306,6 +306,8 @@ install(const char *name, NODE *parm, NODETYPE type)
NODE *table;
NODE *n_name;
NODE *prev;
+ extern bool trace;
+ const char *table_name = "symbol_table";
if (strncmp(name, "awk::", 5) == 0)
n_name = make_string(name + 5, strlen(name) - 5);
@@ -316,12 +318,15 @@ install(const char *name, NODE *parm, NODETYPE type)
if (type == Node_param_list) {
table = param_table;
+ table_name = "param_table";
} else if ( type == Node_func
|| type == Node_ext_func
|| type == Node_builtin_func) {
table = func_table;
+ table_name = "func_table";
} else if (installing_specials) {
table = global_table;
+ table_name = "global_table";
}
if (parm != NULL)
@@ -345,6 +350,8 @@ install(const char *name, NODE *parm, NODETYPE type)
} else {
simple:
/* the simple case */
+ if (trace) fprintf(stderr, "installing %s in %s, type %s\n",
+ n_name->stptr, table_name, nodetype2str(r->type));
assoc_set(table, n_name, r);
}