#include <tools.h>
#include <charsettools.h>
#include <stringtools.h>
#include <mimedecode.h>
#include <rfc822.h>
#include <rfc1522.h>
#include <htmltools.h>
#include <parsefrom.h>

using namespace std;

void parse_route_address(const vector<rfc822symbolt> &symbols,
  string &email, string &name)
 {
  bool phrase=TRUE;

  for(unsigned i=0; i<symbols.size(); i++)
   {
    string text;

    if(symbols[i].type==rfc822symbolt::SPECIAL)
     {
      if(symbols[i].text==",") // list
        break;
      else if(symbols[i].text=="<")
        phrase=FALSE;
      else if(symbols[i].text==">")
        break;
      else
        text=symbols[i].text;
     }
    else if(symbols[i].type==rfc822symbolt::COMMENT)
      text='('+symbols[i].text+')';
    else if(symbols[i].type==rfc822symbolt::DOMAIN)
      text='['+symbols[i].text+']';
    else if(symbols[i].type==rfc822symbolt::END_OF_LIST)
      break;
    else
      text=symbols[i].text;

    if(phrase)
     {
      if(name!="") name+=' ';
      name+=text;
     }
    else
      email+=text;
   }
 }

void parse_addr_spec(const vector<rfc822symbolt> &symbols,
  string &email, string &name)
 {
  for(unsigned i=0; i<symbols.size(); i++)
    if(symbols[i].type==rfc822symbolt::SPECIAL)
     {
      if(symbols[i].text==",") // list
        break;
      
      email+=symbols[i].text;
     }
    else if(symbols[i].type==rfc822symbolt::COMMENT)
      name+=symbols[i].text;
    else if(symbols[i].type==rfc822symbolt::END_OF_LIST)
      break;
    else if(symbols[i].type==rfc822symbolt::DOMAIN)
      email+='['+symbols[i].text+']';
    else
      email+=symbols[i].text;
 }

void parse_from(const string from, string &email, string &name)
 {
  vector<rfc822symbolt> symbols;

  email=name="";

  parserfc822symbols(from, symbols);

  for(unsigned i=0; i<symbols.size(); i++)
    if(symbols[i].type==rfc822symbolt::SPECIAL)
     {
      if(symbols[i].text==",") // list
        break;

      if(symbols[i].text=="<") // it is a route address
       {
        parse_route_address(symbols, email, name);
        return;
       }
     }

  parse_addr_spec(symbols, email, name);
 }



syntax highlighted by Code2HTML, v. 0.9.1