From daniel.sabanesbove at campus.lmu.de  Mon Jan  5 12:03:43 2009
From: daniel.sabanesbove at campus.lmu.de (=?UTF-8?B?RGFuaWVsIFNhYmFuw6lzIEJvdsOp?=)
Date: Mon, 05 Jan 2009 12:03:43 +0100
Subject: [Rd] cat cannot write more than 10000 characters? [R 2.8.1]
In-Reply-To: <alpine.LFD.2.00.0901050926040.32650@auk.stats.ox.ac.uk>
References: <4960F7E8.2000705@campus.lmu.de>
	<alpine.LFD.2.00.0901050926040.32650@auk.stats.ox.ac.uk>
Message-ID: <4961E90F.3040508@campus.lmu.de>

Dear Prof. Ripley,
>> I have discovered that my cat function cannot write more than 10000
>> characters to a text file.
> You mean on a single line?
Yes. OOo tries to save space...
> No, works for me on Mac OS X and x86_64 Fedora 8 (as does 10x larger).
> Can you run this under a debugger and find where it is going wrong for
> you?
Oh, then this might be distribution- or gcc-version-specific:
gcc --version
gcc (SUSE Linux) 4.3.2 [gcc-4_3-branch revision 141291]

glibc is version 2.9-2.3.

Using ddd I found the (relevant part of the) backtrace when interrupting
the infinite loop:

(gdb) backtrace
#0  __gconv (cd=0x846cde0, inbuf=0xbfff7738, inbufend=0x84ca589 "",
outbuf=0xbfff773c, outbufend=0xbfff9e57 "", irreversible=0xbfff76a8) at
gconv.c:80

The program comes here more than 100 000 times... with outbuf and inbuf
always being "\0".

#1  0xb7b581e7 in iconv (cd=0x846cde0, inbuf=0xbfff7738,
inbytesleft=0xbfff7734, outbuf=0xbfff773c, outbytesleft=0xbfff7730) at
iconv.c:53
[this is   result = __gconv (gcd, (const unsigned char **) inbuf,
                        (const unsigned char *)  (*inbuf + *inbytesleft),
                          (unsigned char **) outbuf,
                           (unsigned char *) (*outbuf + *outbytesleft),
                       &irreversible);]

#2  0xb7e44d29 in Riconv (cd=0x846cde0, inbuf=0xbfff7738,
inbytesleft=0xbfff7734, outbuf=0xbfff773c, outbytesleft=0xbfff7730) at
sysutils.c:692
[ this is the only line of Riconv,  return iconv((iconv_t) cd,
(ICONV_CONST char **) inbuf, inbytesleft, outbuf, outbytesleft);]

#3  0xb7d2c337 in dummy_vfprintf (con=0x8400bb0, format=0xb7ee0c48 "%s",
ap=0xbfffc604 "\230?L\b??\005\b?h\a\b?h\a\b??\005\b??\005\b\001") at
connections.c:316
[this is      ires = Riconv(con->outconv, &ib, &inb, &ob, &onb);]

The infinite loop seems to be inside dummy_vfprintf, as this position is
the "highest" inside the backtrace which is reached again and again. And
at line 249 appears the magic number 10000 as BUFSIZE, which is indeed
selected by the preprocessor in my environment!

#4  0xb7d2c4fa in file_vfprintf (con=0x8400bb0, format=0xb7ee0c48 "%s",
ap=0xbfffc604 "\230?L\b??\005\b?h\a\b?h\a\b??\005\b??\005\b\001") at
connections.c:579
[this is  if(con->outconv) return dummy_vfprintf(con, format, ap);]

This and everything above is only reached once, so this might be OK.

#5  0xb7dfe069 in Rvprintf (format=0xb7ee0c48 "%s", arg=0xbfffc604
"\230?L\b??\005\b?h\a\b?h\a\b??\005\b??\005\b\001") at printutils.c:785   
[this is   (con->vfprintf)(con, format, argcopy);]

#6  0xb7dfe244 in Rprintf (format=0xb7ee0c48 "%s") at printutils.c:679    
[this is   Rvprintf(format, ap);]

#7  0xb7d0446c in do_cat (call=0x83032a8, op=0x806b7d4, args=<value
optimized out>, rho=0x830359c) at builtin.c:597   
[this is   Rprintf("%s", p);]

Unfortunately, I'm not experienced in R/C code internals, but if you
have detailed instructions for me (like "show me the value of this
variable after 10000 stops") I can provide more debugging info.
>> cat(testChunk, sep = "\n", file = output, append = TRUE)
> We have writeLines() for that and it is more efficient, especially if
> you keep a connection open.
OK, maybe Prof. Leisch wants to improve the Sweave code...?

Thank you very much for your help,
best regards,
Daniel Sabanes



[Rd] cat cannot write more than 10000 characters? [R 2.8.1]
=?UTF-8?B?RGFuaWVsIFNhYmFuw6lzIEJvdsOp?=