int main() { char *str="a"; MY_PACKAGE *head; part_string("a","b",str,head); free(head); return 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; }