Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / awk / test / getnr2tb.awk
1 #From vp@dmat.uevora.pt Thu Jun 18 09:10 EDT 1998
2 #Received: from mescaline.gnu.org (we-refuse-to-spy-on-our-users@mescaline.gnu.org [158.121.106.21]) by cssun.mathcs.emory.edu (8.7.5/8.6.9-940818.01cssun) with ESMTP id JAA23649 for <arnold@mathcs.emory.edu>; Thu, 18 Jun 1998 09:10:54 -0400 (EDT)
3 #Received: from khromeleque.dmat.uevora.pt by mescaline.gnu.org (8.8.5/8.6.12GNU) with ESMTP id JAA21732 for <arnold@gnu.ai.mit.edu>; Thu, 18 Jun 1998 09:11:19 -0400
4 #Received: from khromeleque.dmat.uevora.pt (vp@localhost [127.0.0.1])
5 #       by khromeleque.dmat.uevora.pt (8.8.8/8.8.8/Debian/GNU) with ESMTP id OAA11817
6 #       for <arnold@gnu.ai.mit.edu>; Thu, 18 Jun 1998 14:13:57 +0100
7 #Message-Id: <199806181313.OAA11817@khromeleque.dmat.uevora.pt>
8 #To: arnold@gnu.org
9 #Subject: concatenation bug in gawk 3.0.3
10 #Date: Thu, 18 Jun 1998 14:13:57 +0200
11 #From: Vasco Pedro <vp@dmat.uevora.pt>
12 #Content-Type: text
13 #Content-Length: 2285
14 #Status: RO
15 #
16 #Hi,
17 #
18 #The gawk program '{print NR " " 10/NR}' will print:
19 #
20 #1 10
21 #5 5
22 #3 3.33333
23 #2 2.5
24 #2 2
25 #1 1.66667
26 #
27 #instead of the correct:
28 #
29 #1 10
30 #2 5
31 #3 3.33333
32 #4 2.5
33 #5 2
34 #6 1.66667
35 #
36 #You'll notice, on the incorrect output, that the first column is
37 #the first digit of the second.
38 #
39 #I think the problem comes from the way builtin variables are handled.
40 #Since the items to be concatenated are processed in reverse order and
41 #the return value of tree_eval(``NR'') is a pointer to the value part
42 #of `NR_node', the `unref()' of `NR_node' due to its second occurrence
43 #will leave a dangling pointer in `strlist'. The reason that it doesn't
44 #reuse the freed space with objects of the same type. (Using Electric
45 #Fence with EF_PROTECT_FREE set confirms that freed space is being
46 #accessed.)
47 #
48 #The enclosed patch (hack would be a better word to describe it) is
49 #all I could come up with. With it installed, things seem to work ok,
50 #but I doubt this is the correct way to do it. (If I treated the
51 #case for `Node_field_spec' as the I did others, `make check' would
52 #fail in several places.)
53 #
54 #Regards,
55 #vasco
56 #
57 #*** eval.c~    Tue May  6 21:39:55 1997
58 #--- eval.c     Thu Jun 18 13:39:25 1998
59 #***************
60 #*** 685,697 ****
61 #               return func_call(tree->rnode, tree->lnode);
62 #  
63 #               /* unary operations */
64 #       case Node_NR:
65 #       case Node_FNR:
66 #       case Node_NF:
67 #       case Node_FIELDWIDTHS:
68 #       case Node_FS:
69 #       case Node_RS:
70 #-      case Node_field_spec:
71 #       case Node_subscript:
72 #       case Node_IGNORECASE:
73 #       case Node_OFS:
74 #--- 685,700 ----
75 #               return func_call(tree->rnode, tree->lnode);
76 #  
77 #               /* unary operations */
78 #+      case Node_field_spec:
79 #+              lhs = get_lhs(tree, (Func_ptr *) NULL);
80 #+              return *lhs;
81 #+ 
82 #       case Node_NR:
83 #       case Node_FNR:
84 #       case Node_NF:
85 #       case Node_FIELDWIDTHS:
86 #       case Node_FS:
87 #       case Node_RS:
88 #       case Node_subscript:
89 #       case Node_IGNORECASE:
90 #       case Node_OFS:
91 #***************
92 #*** 699,705 ****
93 #       case Node_OFMT:
94 #       case Node_CONVFMT:
95 #               lhs = get_lhs(tree, (Func_ptr *) NULL);
96 #!              return *lhs;
97 #  
98 #       case Node_var_array:
99 #               fatal("attempt to use array `%s' in a scalar context",
100 #--- 702,710 ----
101 #       case Node_OFMT:
102 #       case Node_CONVFMT:
103 #               lhs = get_lhs(tree, (Func_ptr *) NULL);
104 #!              r = dupnode(*lhs);
105 #!              r->flags |= TEMP;
106 #!              return r;
107 #  
108 #       case Node_var_array:
109 #               fatal("attempt to use array `%s' in a scalar context",
110 #
111 { print NR " " 10/NR }