This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
std::istringstream parsing
- From: Mauro Meneghin <mm at g1ld0 dot it>
- To: libstdc++ at gcc dot gnu dot org
- Date: Wed, 13 Sep 2006 01:02:45 +0200
- Subject: std::istringstream parsing
Hello, I've a parse problem with
std::istringstream, I ask here to
be sure it's my fault and not libstdc++ one.
Regards.
/* testcase for parsing with istringstream
author: Mauro Meneghin mm at g1ld0 dot it
output:
08048000-080e5000 r-xp 00000000 03:41
parsed as:
804800- 0 -080 e5000 804bf9b:bffff3f8
*/
#include <iostream>
#include <sstream>
class addr_t
{
public:
addr_t(long a=0):m_n(a){}
long get(){return m_n;}
void set(long a){m_n=a;}
private:
long m_n;
};
std::ostream& operator<<(std::ostream& os,addr_t& addr)
{
std::ios::fmtflags old=os.flags(); //std::ios::hex);
os.width(8);
os<<std::hex<<addr.get();
os.setf(old);
return os;
}
std::istringstream& operator>>(std::istringstream& is,addr_t& addr)
{
unsigned long ret=0;
char c;
static char table[256];
static bool do_init=true;
std::string blanks=std::string(" \t\n");
int digit=0;
if(do_init)
{
int i;
for(i=0;i<256;i++)
table[i]='-'; //no valid char
for(i=0;i<10;i++)
table['0'+i]=i;
for(i=0;i<6;i++)
table['a'+i]=10+i;
for(i=0;i<6;i++)
table['A'+i]=10+i;
do_init=false;
}
do //eat blanks
{
is>>c;
}
while(blanks.find(c,0)!=std::string::npos);
do
{
if(table[c]=='-' || digit++==7)
break;
ret=ret*16+table[c];
is>>c;
}
while(true);
is.putback(c);
addr=addr_t(ret);
return is;
}
int main()
{
const char* buf="08048000-080e5000 r-xp 00000000 03:41";
addr_t n_a,n_b,n_c;
unsigned n_d,n_e;
std::string s_f;
char c;
std::istringstream is(buf);
std::cout<<std::string(buf)<<std::endl;
is.width(8);
is>>n_a;
is.width(1);
is>>c;
is.width(8);
is>>n_b;
is.width(4);
is>>s_f;
is.width(8);
is>>n_c;
is.width(2);
is>>std::hex>>n_d;
is>>c;
is.width(2);
is>>std::hex>>n_e;
std::cout<<"parsed as:"<<std::endl;
std::cout<<std::hex<<n_a<<"-"<<std::hex<<n_b<<" "<<s_f
<<" "<<n_c<<" "<<n_d<<":"<<n_e<<std::endl;
return 0;
}