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]

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;
}


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