This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: A little more help ;)


Nathan Myers wrote:

I would not expect fstat to consider stdin to be a file.
(It looks like a "character special file".)


Anyhow, the cin.peek() ought to call underflow(), which should do a ::read(0,buf,8k), which should return 4 and put all four characters into the buffer. Then in_avail() should report them, and shouldn't call showmanyc() at all, so ::fstat() should not even be called.

Thanks. I'll investigate along these lines.

(BTW, do you know the strace command?  E.g. try "strace /bin/echo foo"
and look at the last few lines.)

I know the command even if I don't use it so much.
In the specific case, I think that a plain gdb session should be able
to tell me what's going wrong: it's sure that showmanyc it's mistakenly
called, just I didn't (yet) put a breakpoint in the preceding cin.peek()
:(

About the putback buffer: if a character has been put back
in the separate putback buffer, in_avail() should return 1.
After that character has been read out, in_avail() should find the buffer empty and call showmanyc(), which may fix up
the pointers and then report what's in the regular buffer and any more characters it can discover. In other words, the putback buffer is involved in all virtuals, too.


Ok.
In fact, in underflow, a char is read from the buffer (and xsgetn
not called) only if M_pback_init is true, like this:

	  if (_M_pback_init)
	    {
	      _M_pback_destroy();
	      if (_M_in_cur < _M_in_end)
		{
		  __ret = traits_type::to_int_type(*_M_in_cur);
		  if (__bump)
		    _M_in_cur_move(1);
	  	  return __ret;
		}
	    }

Paolo.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]