Exemplo n.º 1
0
int main()
{

	char *str="a";
	MY_PACKAGE *head;	
	part_string("a","b",str,head);
	free(head);
	return 0;
}
Exemplo n.º 2
0
/*static*/
int
mail_address::ExtractAddresses(const char* addr,
			       std::list<QString>& result,
			       std::list<QString>& result1)
{
  if (!addr)	// happens if addr is the result of QString::null.latin1();
    return 0;

  // result => emails
  // result1 => names
  const char* start_addr;
  const char* start1_addr;
  const char* end_addr;
  const char* end1_addr;
  int c;
  char enclose_char=0;

  int err=0;
  c=*addr++;
  while (c) {
    switch(c) {
    case ' ':
    case '\t':
    case '\n':
    case '\r':
    case ',':
      c=*addr++;
      break;			// address separator
    case '\0':
      break;
    case '<':
      // <*****@*****.**> expected
      start_addr=addr;
      c=*addr++;
      while (c && c!=' ' && c!='\t' && c!='>')
	c=*addr++;
      switch(c) {
      case '>':
	result.push_back (part_string (start_addr, addr-start_addr-1));
	result1.push_back(QString(""));
	c=*addr++;
	break;
      default:
	err=1;
	return err;
      }
      break;
    case '\'':
    case '"':
      enclose_char=c;
      start1_addr=addr;
      c=*addr++;
      while (c && c!=enclose_char)
	c=*addr++;
      if (!c) {
	err=1;
	return err;
      }
      result1.push_back (part_string (start1_addr,addr-start1_addr-1));
      c=*addr++;
      while (c==' ' || c=='\t')
	c=*addr++;
      if (!c) {			// empty address: \".*\"([ \t])*
	result.push_back(QString(""));
	break;
      }
      if (c!='<') {
	//err=2;  // "foo bar" not followed by <*****@*****.**>
	//return err;
	while ((c=*(++addr))!='<') {
	  if (!c) {
	    err=2;
	    return err;
	  }
	}
	addr++;
      }
      start_addr=addr;
      c=*addr++;
      while (c && c!='>')
	c=*addr++;
      if (!c) {
	err=1;
	return err;
      }
      result.push_back (part_string (start_addr, addr-start_addr-1));
      c=*addr++;
      break;
    default:
      int enclose=0; //(c=='\'');
      start_addr=addr-1;
      start1_addr=addr-1;
      c=*addr++;
      while (c && (enclose || c!=' ') && c!='\t' && c!=',') // && c!='\'')
	c=*addr++;
      if (!c || c==',') {
	// email alone
	result.push_back(part_string (start_addr, addr-start_addr-1));
	result1.push_back(QString(""));
      }
      else {
	//  'Name firstname <email>' or 'email (name firstname)'
	// addr
	end_addr = addr;
	c=*addr++;
	while (c==' ' || c=='\t')
	  c=*addr++;
	switch(c) {
	case '\0':
	  err=1;
	  return err;
	case '<':
	  {
	    QString name1(start1_addr);
	    name1.truncate(addr-start1_addr-1);
	    // strip trailing white spaces from the name
	    result1.push_back (name1.trimmed());
	  }
	  start_addr=addr;
	  c=*addr++;
	  while (c && c!='>')
	    c=*addr++;
	  if (!c) {
	    err=1;
	    return err;
	  }
	  result.push_back (part_string (start_addr, addr-start_addr-1));
	  c=*addr++;
	  break;
	case '(':
	  start1_addr=addr;
	  c=*addr++;
	  while (c && c!=')')
	    c=*addr++;
	  if (!c) {
	    err=1;
	    return err;
	  }
	  result.push_back(part_string(start_addr,end_addr-start_addr-1));
	  result1.push_back(part_string (start1_addr, addr-start1_addr-1));
	  c=*addr++;
	  break;
	default:	// Name firstname <email>
	  c=*addr++;
	  while (c && c!='<')
	    c=*addr++;
	  if (!c) {
	    err=1;
	    return err;
	  }
	  end1_addr=addr-1;
	  start_addr=addr;
	  c=*addr++;
	  while (c && c!='>')
	    c=*addr++;
	  if (!c) {
	    err=1;
	    return err;
	  }
	  result.push_back(part_string(start_addr,addr-start_addr-1));
	  result1.push_back(part_string(start1_addr, end1_addr-start1_addr-1));
	  c=*addr++;
	  break;
	}
      }
      break;
    }
  }
  return err;
}