Example #1
0
bool to_rational(const exprt &expr, rationalt &rational_value)
{
  if(expr.id()!=ID_constant) return true;

  const std::string &value=expr.get_string(ID_value);

  std::string no1, no2;
  char mode=0;

  for(std::string::const_iterator it=value.begin();
      it!=value.end();
      ++it)
  {
    const char ch=*it;

    if(isdigit(ch))
    {
      if(mode==0)
        no1+=ch;
      else
        no2+=ch;
    }
    else if(ch=='/' || ch=='.')
    {
      if(mode==0)
        mode=ch;
      else
        return true;
    }
    else
      return true;
  }

  switch(mode)
  {
   case 0:
    rational_value=string2integer(no1);
    break;

   case '.':
    rational_value=string2integer(no1);
    rational_value+=rationalt(string2integer(no2))/power10(no2.size());
    break;

   case '/':
    rational_value=string2integer(no1);
    rational_value/=string2integer(no2);
    break;

   default:
    return true;
  }    

  return false;
}
bool to_rational(const exprt &expr, rationalt &rational_value)
{
  if(expr.id()!="constant") return true;

  const std::string &value=expr.get_string("value");

  std::string no1, no2;
  char mode=0;

  for(unsigned i=0; i<value.size(); i++)
  {
    char ch=value[i];

    if(isdigit(ch))
    {
      if(mode==0)
        no1+=ch;
      else
        no2+=ch;
    }
    else if(ch=='/' || ch=='.')
    {
      if(mode==0)
        mode=ch;
      else
        return true;
    }
    else
      return true;
  }

  switch(mode)
  {
   case 0:
    rational_value=string2integer(no1);
    break;

   case '.':
    rational_value=string2integer(no1);
    rational_value+=rationalt(string2integer(no2))/power10(no2.size());
    break;

   case '/':
    rational_value=string2integer(no1);
    rational_value/=string2integer(no2);
    break;

   default:
    return true;
  }    

  return false;
}