stdcxx-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Martin Sebor (JIRA)" <j...@apache.org>
Subject [jira] Updated: (STDCXX-241) [LWG #136] std::istream::seekg problem
Date Fri, 06 Jun 2008 04:52:44 GMT

     [ https://issues.apache.org/jira/browse/STDCXX-241?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Martin Sebor updated STDCXX-241:
--------------------------------

      Description: 
Moved from the Rogue Wave bug tracking database:
{noformat}
Class/File: 
Fix Priority: Must Fix
Long Description: 
  *** Nov 10 1999 9:33PM *** sebor ***

Problem: seekg - problem

see seek2.cpp:

The ANSI/ISO-C++ document(ISO/IEC 14882:1998(E)) states about the effects of seekg:

ANSI> Effects: If fail() != true, executes rdbuf()í>pubseekpos( pos).

(The RW-Implementation instead executes rdbuf()->pubseekpos(pos, ios_base::in);)
pubseekpos calls seekpos which is declared:

pos_type seekpos(pos_type sp, ios_base::openmode which
                  = ios_base::in | ios_base::out);

since the 2nd Argument (which) is not given in the above call of pubseekpos
the value of the which-Argument is the default value ios_base::in | ios_base::out.
seekpos should alter both the position in the input and the output sequence in this case.
The RW-Implementation alters only the position in the input-sequence.

Though the RW-implementation seems to be intuitivly right, it is formally
not conforming.
I think RogueWave should support the lwg issue No 136 described in
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-issues.html#136

TEST CASE:

#include <string>
#include <sstream>
#include <iostream>

using namespace std;

typedef basic_stringbuf<char, char_traits<char>, allocator<char> > buffer;
typedef basic_istream<char, char_traits<char> > input_stream;
typedef char_traits <char> traits;
typedef char_traits<char>::pos_type pos_type;


#define VERIFY(p1,p2) verify(p1,p2,__LINE__)

template <class T> void verify (T p1, T p2, int line)
{
  if(p1 != p2) {
    cerr << "line " << line << ": " << p1 << " should be " 
         << p2 << '\n';
  }
}

template <> void verify (string p1, string p2, int line)
{
  if(p1 != p2) {
    cerr << "line " << line << ": \"" << p1 << "\" should be
\"" 
         << p2 << "\" \n";
  }
}



int main()
{
  const string expstr ("Rogue Wave");
  buffer  buf (expstr, ios_base::in | ios_base::out);
  typedef basic_iostream<char, char_traits<char> > iostrm; 
      
  iostrm  iostobj(&buf);
  char s[80];
 
  VERIFY ((void *)iostobj.rdbuf(),(void *)&buf);
  VERIFY (iostobj.gcount(),streamsize(0));
          
  iostobj >> s;
  VERIFY (string(s), string("Rogue"));
  iostobj.get (s, sizeof s);
  VERIFY (string(s), string(" Wave"));
  iostobj.clear ();
  iostobj.seekg (0, ios::end);
  iostobj.write (" Software", 9);
  iostobj.seekp (0);
  iostobj.get (s, sizeof s);
  iostobj.clear ();
  VERIFY (string(s), string("Rogue Wave Software"));
}
CC -c -mt -D_RWSTD_USE_CONFIG -I/amd/devco/sebor/dev/stdlib/include -I/build/seb
or/sunpro-5.8.j1-12d/include -I/amd/devco/sebor/dev/stdlib/examples/include  -li
brary=%none -O  +w  t.cpp
CC t.o -o t -library=%none -L/build/sebor/sunpro-5.8.j1-12d/lib  -mt  -L/build/s
ebor/sunpro-5.8.j1-12d/lib -lstd12d   -lm
line 55: " Software" should be "Rogue Wave Software" 
{noformat}

  was:
Moved from the Rogue Wave bug tracking database:

Class/File: 
Fix Priority: Must Fix
Long Description: 
  *** Nov 10 1999 9:33PM *** sebor ***

Problem: seekg - problem

see seek2.cpp:

The ANSI/ISO-C++ document(ISO/IEC 14882:1998(E)) states about the effects of seekg:

ANSI> Effects: If fail() != true, executes rdbuf()í>pubseekpos( pos).

(The RW-Implementation instead executes rdbuf()->pubseekpos(pos, ios_base::in);)
pubseekpos calls seekpos which is declared:

pos_type seekpos(pos_type sp, ios_base::openmode which
                  = ios_base::in | ios_base::out);

since the 2nd Argument (which) is not given in the above call of pubseekpos
the value of the which-Argument is the default value ios_base::in | ios_base::out.
seekpos should alter both the position in the input and the output sequence in this case.
The RW-Implementation alters only the position in the input-sequence.

Though the RW-implementation seems to be intuitivly right, it is formally
not conforming.
I think RogueWave should support the lwg issue No 136 described in
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-issues.html#136

TEST CASE:

#include <string>
#include <sstream>
#include <iostream>

using namespace std;

typedef basic_stringbuf<char, char_traits<char>, allocator<char> > buffer;
typedef basic_istream<char, char_traits<char> > input_stream;
typedef char_traits <char> traits;
typedef char_traits<char>::pos_type pos_type;


#define VERIFY(p1,p2) verify(p1,p2,__LINE__)

template <class T> void verify (T p1, T p2, int line)
{
  if(p1 != p2) {
    cerr << "line " << line << ": " << p1 << " should be " 
         << p2 << '\n';
  }
}

template <> void verify (string p1, string p2, int line)
{
  if(p1 != p2) {
    cerr << "line " << line << ": \"" << p1 << "\" should be
\"" 
         << p2 << "\" \n";
  }
}



int main()
{
  const string expstr ("Rogue Wave");
  buffer  buf (expstr, ios_base::in | ios_base::out);
  typedef basic_iostream<char, char_traits<char> > iostrm; 
      
  iostrm  iostobj(&buf);
  char s[80];
 
  VERIFY ((void *)iostobj.rdbuf(),(void *)&buf);
  VERIFY (iostobj.gcount(),streamsize(0));
          
  iostobj >> s;
  VERIFY (string(s), string("Rogue"));
  iostobj.get (s, sizeof s);
  VERIFY (string(s), string(" Wave"));
  iostobj.clear ();
  iostobj.seekg (0, ios::end);
  iostobj.write (" Software", 9);
  iostobj.seekp (0);
  iostobj.get (s, sizeof s);
  iostobj.clear ();
  VERIFY (string(s), string("Rogue Wave Software"));
}
CC -c -mt -D_RWSTD_USE_CONFIG -I/amd/devco/sebor/dev/stdlib/include -I/build/seb
or/sunpro-5.8.j1-12d/include -I/amd/devco/sebor/dev/stdlib/examples/include  -li
brary=%none -O  +w  t.cpp
CC t.o -o t -library=%none -L/build/sebor/sunpro-5.8.j1-12d/lib  -mt  -L/build/s
ebor/sunpro-5.8.j1-12d/lib -lstd12d   -lm
line 55: " Software" should be "Rogue Wave Software" 


    Fix Version/s:     (was: 4.2.2)
                   4.3

LWG issue 136 is still Open. Deferred until 4.3 (if the LWG issue is resolved then).

> [LWG #136] std::istream::seekg problem
> --------------------------------------
>
>                 Key: STDCXX-241
>                 URL: https://issues.apache.org/jira/browse/STDCXX-241
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 27. Input/Output
>    Affects Versions: 4.1.2, 4.1.3, 4.1.4, 4.2.0, 4.2.1
>         Environment: all
>            Reporter: Martin Sebor
>             Fix For: 4.3
>
>   Original Estimate: 4h
>  Remaining Estimate: 4h
>
> Moved from the Rogue Wave bug tracking database:
> {noformat}
> Class/File: 
> Fix Priority: Must Fix
> Long Description: 
>   *** Nov 10 1999 9:33PM *** sebor ***
> Problem: seekg - problem
> see seek2.cpp:
> The ANSI/ISO-C++ document(ISO/IEC 14882:1998(E)) states about the effects of seekg:
> ANSI> Effects: If fail() != true, executes rdbuf()í>pubseekpos( pos).
> (The RW-Implementation instead executes rdbuf()->pubseekpos(pos, ios_base::in);)
> pubseekpos calls seekpos which is declared:
> pos_type seekpos(pos_type sp, ios_base::openmode which
>                   = ios_base::in | ios_base::out);
> since the 2nd Argument (which) is not given in the above call of pubseekpos
> the value of the which-Argument is the default value ios_base::in | ios_base::out.
> seekpos should alter both the position in the input and the output sequence in this case.
> The RW-Implementation alters only the position in the input-sequence.
> Though the RW-implementation seems to be intuitivly right, it is formally
> not conforming.
> I think RogueWave should support the lwg issue No 136 described in
> http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-issues.html#136
> TEST CASE:
> #include <string>
> #include <sstream>
> #include <iostream>
> using namespace std;
> typedef basic_stringbuf<char, char_traits<char>, allocator<char> >
buffer;
> typedef basic_istream<char, char_traits<char> > input_stream;
> typedef char_traits <char> traits;
> typedef char_traits<char>::pos_type pos_type;
> #define VERIFY(p1,p2) verify(p1,p2,__LINE__)
> template <class T> void verify (T p1, T p2, int line)
> {
>   if(p1 != p2) {
>     cerr << "line " << line << ": " << p1 << " should be
" 
>          << p2 << '\n';
>   }
> }
> template <> void verify (string p1, string p2, int line)
> {
>   if(p1 != p2) {
>     cerr << "line " << line << ": \"" << p1 << "\" should
be \"" 
>          << p2 << "\" \n";
>   }
> }
> int main()
> {
>   const string expstr ("Rogue Wave");
>   buffer  buf (expstr, ios_base::in | ios_base::out);
>   typedef basic_iostream<char, char_traits<char> > iostrm; 
>       
>   iostrm  iostobj(&buf);
>   char s[80];
>  
>   VERIFY ((void *)iostobj.rdbuf(),(void *)&buf);
>   VERIFY (iostobj.gcount(),streamsize(0));
>           
>   iostobj >> s;
>   VERIFY (string(s), string("Rogue"));
>   iostobj.get (s, sizeof s);
>   VERIFY (string(s), string(" Wave"));
>   iostobj.clear ();
>   iostobj.seekg (0, ios::end);
>   iostobj.write (" Software", 9);
>   iostobj.seekp (0);
>   iostobj.get (s, sizeof s);
>   iostobj.clear ();
>   VERIFY (string(s), string("Rogue Wave Software"));
> }
> CC -c -mt -D_RWSTD_USE_CONFIG -I/amd/devco/sebor/dev/stdlib/include -I/build/seb
> or/sunpro-5.8.j1-12d/include -I/amd/devco/sebor/dev/stdlib/examples/include  -li
> brary=%none -O  +w  t.cpp
> CC t.o -o t -library=%none -L/build/sebor/sunpro-5.8.j1-12d/lib  -mt  -L/build/s
> ebor/sunpro-5.8.j1-12d/lib -lstd12d   -lm
> line 55: " Software" should be "Rogue Wave Software" 
> {noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message