Printf stops calling write() syscall after encountering a line feed

Jeff Johnston jjohnstn@redhat.com
Tue Dec 1 15:35:00 GMT 2009


On 25/11/09 03:52 AM, Corinna Vinschen wrote:
> On Nov 24 20:48, Anthony DeRosa wrote:
>> Hi,
>>
>> I am having trouble with printf, and I am positive that its not my
>> terminal's fault or a buffering problem.  First I'll explain the
>> problem, and second why I think it's not my terminal's fault.
>>
>> The problem is that printf stops calling the write() syscall after
>> encountering a line feed character ('\n').  Below is some code and
>> corresponding output to demonstrate.
>>
>> The code:
>>
>>      printf("line 0\n");
>>      printf("line 1\nline 2\n");
>>      printf("line 3");
>>      printf("\nline 4\n");
>>      printf("line 5\n");
>>      fflush(stdout);
>>
>> The expected output:
>>
>> line 0
>> line 1
>> line 2
>> line 3
>> line 4
>> line 5
>>
>> (my broken) Newlib's output:
>>
>> line 0
>> line 1  // stops printing line 2 after line feed
>> line 3  // stops printing line 4 after line feed
>> line 5
>>
>>
>> The reason I don't blame my terminal is because if I replace all calls
>> to printf with calls to write(1, text, textlen), then everything works
>> as expected with regards to line feeds.  Things also work as expected
>> if I use sprintf() followed by a call to write().
>
> I don't know whom to blame in your case, but the above testcase works
> fine on Cygwin, which is using newlib as well.  I think you will have
> to put more debugging effort into this, like, say, running your testcase
> in a debugger.
>

Corinna is correct.  You should be calling the __sfvwrite_r routine 
(libc/stdio/fvwrite.c) for each printf call with the input string (i.e. 
there isn't any formatting done by the main _vfprintf_r routine).  In 
__sfvwrite_r, you should fall into the line-buffered code which searches 
the string for a newline and after finding one, calls _fflush_r.  You 
should make two calls to _fflush_r when the string has the two newlines 
in it and each of these calls should end up calling your write syscall. 
  That should give you a place to start.

FWIW: testing the above code using newlib and running on an mn10300-elf 
simulator also works fine.

-- Jeff J.

>
> Corinna
>



More information about the Newlib mailing list