Blame test/wideidx2.awk

Packit Service f629e6
# Date: Thu, 27 Apr 2006 20:59:03 +0100
Packit Service f629e6
# From: Lee Haywood <ljhaywood2@googlemail.com>
Packit Service f629e6
# Subject: gawk multi-byte support bugs, assertion bug and fix.
Packit Service f629e6
# To: bug-gawk@gnu.org
Packit Service f629e6
# Message-id: <60962be00604271259na0d8fdayb9d0c69a853216e8@mail.gmail.com>
Packit Service f629e6
# MIME-version: 1.0
Packit Service f629e6
# Content-type: multipart/alternative;
Packit Service f629e6
#  boundary="----=_Part_10136_920879.1146167943492"
Packit Service f629e6
# Status: RO
Packit Service f629e6
# 
Packit Service f629e6
# ------=_Part_10136_920879.1146167943492
Packit Service f629e6
# Content-Type: text/plain; charset=ISO-8859-1
Packit Service f629e6
# Content-Transfer-Encoding: quoted-printable
Packit Service f629e6
# Content-Disposition: inline
Packit Service f629e6
# 
Packit Service f629e6
# 
Packit Service f629e6
# Firstly, I have been getting the following error from version 3.1.5.
Packit Service f629e6
# 
Packit Service f629e6
#     awk: node.c:515: unref: Assertion `(tmp->flags & 4096) !=3D 0' failed.
Packit Service f629e6
# 
Packit Service f629e6
# In mk_number() in node.c the MBS_SUPPORT code is inside the GAWKDEBUG
Packit Service f629e6
# section - moving it outside explicitly clears the string values, which
Packit Service f629e6
# prevents the assertion error from occurring.  The corrected version is
Packit Service f629e6
# shown at the end of this message.
Packit Service f629e6
# 
Packit Service f629e6
# As an aside, I also noticed that n->wstptr is not cleared by
Packit Service f629e6
# set_field() and set_record() in field.c when the flags are set to
Packit Service f629e6
# exclude WSTRCUR.  However, I do not have a test case to show if
Packit Service f629e6
# changing them makes any difference.
Packit Service f629e6
# 
Packit Service f629e6
# A second problem also occurs when gawk 3.1.5 is compiled with
Packit Service f629e6
# multi-byte character support (MBS_SUPPORT).  The following code should
Packit Service f629e6
# change the index of the substring "bc" from 2 to 3, but it gets
Packit Service f629e6
# reported as 2 in both cases - which is obviously disastrous.
Packit Service f629e6
# 
Packit Service f629e6
#     awk 'BEGIN {
Packit Service f629e6
#             Value =3D "abc"
Packit Service f629e6
# 
Packit Service f629e6
#             print "Before <" Value "> ",
Packit Service f629e6
#                   index( Value, "bc" )
Packit Service f629e6
# 
Packit Service f629e6
#             sub( /bc/, "bbc", Value )
Packit Service f629e6
# 
Packit Service f629e6
#             print "After  <" Value ">",
Packit Service f629e6
#                   index( Value, "bc" )
Packit Service f629e6
#         }'
Packit Service f629e6
# 
Packit Service f629e6
# Compiling with MBS_SUPPORT undefined makes these problems go away.
Packit Service f629e6
# 
Packit Service f629e6
# /* mk_number --- allocate a node with defined number */
Packit Service f629e6
# 
Packit Service f629e6
# NODE *
Packit Service f629e6
# mk_number(AWKNUM x, unsigned int flags)
Packit Service f629e6
# {
Packit Service f629e6
#         register NODE *r;
Packit Service f629e6
# 
Packit Service f629e6
#         getnode(r);
Packit Service f629e6
#         r->type =3D Node_val;
Packit Service f629e6
#         r->numbr =3D x;
Packit Service f629e6
#         r->flags =3D flags;
Packit Service f629e6
# #if defined MBS_SUPPORT
Packit Service f629e6
#         r->wstptr =3D NULL;
Packit Service f629e6
#         r->wstlen =3D 0;
Packit Service f629e6
# #endif /* MBS_SUPPORT */
Packit Service f629e6
# #ifdef GAWKDEBUG
Packit Service f629e6
#         r->stref =3D 1;
Packit Service f629e6
#         r->stptr =3D NULL;
Packit Service f629e6
#         r->stlen =3D 0;
Packit Service f629e6
# #if defined MBS_SUPPORT
Packit Service f629e6
#         r->flags &=3D ~WSTRCUR;
Packit Service f629e6
# #endif /* MBS_SUPPORT */
Packit Service f629e6
# #endif /* GAWKDEBUG */
Packit Service f629e6
#         return r;
Packit Service f629e6
# }
Packit Service f629e6
# 
Packit Service f629e6
# Thanks.
Packit Service f629e6
# 
Packit Service f629e6
# --
Packit Service f629e6
# Lee Haywood.
Packit Service f629e6
Packit Service f629e6
BEGIN {
Packit Service f629e6
	Value = "abc"
Packit Service f629e6
Packit Service f629e6
	print "Before <" Value "> ", index( Value, "bc" )
Packit Service f629e6
 
Packit Service f629e6
	sub( /bc/, "bbc", Value )
Packit Service f629e6
Packit Service f629e6
	print "After  <" Value ">", index( Value, "bc" )
Packit Service f629e6
}