- if ($group) {
- $address = substr($address, 0, $pos - 1);
- ++$pos;
- break;
- }
- case ',': /* we reached a delimiter */
- if (!$name && !$addr) {
- $addr = substr($address, 0, $pos);
- } else if (!$addr) {
- $addr = trim(substr($address, $addr_start, $pos));
- } else if ($name == '') {
- $name = trim(substr($address, 0, $addr_start));
- }
- $at = strpos($addr, '@');
- $addr_structure = new AddressStructure();
- if (!$name && $comment) $name = $comment;
- if (!$is_encoded) {
- $addr_structure->personal = encodeHeader($name);
- } else {
- $addr_structure->personal = $name;
- }
- $is_encoded = false;
- $addr_structure->group = $group;
- $grouplookup = false;
- if ($at) {
- $addr_structure->mailbox = substr($addr, 0, $at);
- $addr_structure->host = substr($addr, $at+1);
- } else {
- /* if lookup function */
- if ($lookup) {
- $aAddr = call_user_func_array($lookup,array($addr));
- if (isset($aAddr['email'])) {
- if (strpos($aAddr['email'],',')) {
- $grouplookup = true;
- $addr_ar = $this->parseAddress($aAddr['email'], $ar, $addr_ar, $group, $host,$lookup);
- } else {
- $at = strpos($aAddr['email'], '@');
- $addr_structure->mailbox = substr($aAddr['email'], 0, $at);
- $addr_structure->host = substr($aAddr['email'], $at+1);
- if (isset($aAddr['name'])) {
- $addr_structure->personal = $aAddr['name'];
- } else {
- $addr_structure->personal = encodeHeader($addr);
- }
- }
- }
- }
- if (!$grouplookup && !$addr_structure->mailbox) {
- $addr_structure->mailbox = trim($addr);
- if ($host) {
- $addr_structure->host = $host;
- }
- }
- }
- $address = trim(substr($address, $pos+1));
- $j = strlen($address);
- $pos = 0;
- $name = '';
- $addr = '';
- if (!$grouplookup) {
- $addr_ar[] = $addr_structure;
- }
- break;
- case ':': /* process the group addresses */
- /* group marker */
- if (strpos($address,';',$pos)) {
- $group = substr($address, 0, $pos);
- $address = substr($address, $pos+1);
- $result = $this->parseAddress($address, $ar, $addr_ar, $group, $lookup);
- $addr_ar = $result[0];
- $pos = $result[1];
- $address = substr($address, $pos++);
- $j = strlen($address);
- $group = '';
- } else {
- $pos = $j;
- }
- break;
- case ' ':
- ++$pos;
- break;
- default:
- /*
- * this happens in the folowing situations :
- * 1: unquoted personal name
- * 2: emailaddress without < and >
- * 3: unquoted personal name from compose that should be encoded.
- * if it's a personal name then an emailaddress should follow
- * the personal name may not have ',' inside it
- * If it's a emailaddress then the personal name is not set.
- * we should look for the delimiter ',' or a SPACE
- */
- /* check for emailaddress */
-
- /* Blah, this code sucks */
-
- /* we need an tokenizer !!!!!!!! */
-
- $i_space = strpos($address,' ',$pos);
- $i_del = strpos($address,',',$pos);
- if ($i_space || $i_del) {
- if ($i_del) { /* extract the stringpart before the delimiter */
- $address_part = substr($address,$pos,$i_del-$pos);
- } else { /* extract the stringpart started with pos */
- $address_part = substr($address,$pos);
- }
- if ($i = strpos($address_part,'@')) {
- /* an email address is following */
- if (($i+$pos) < $i_space) {
- $addr_start = $pos;
- /* multiple addresses are following */
- if ($i_space < $i_del && $i_del) {
- /* <space> is present */
- if ($i_space) {
- if ($i = strpos($address_part,'<')) {
- $name .= substr($address_part,0,$i);
- $pos = $i+$pos;
- } else {
- $addr = substr($address,$pos,$i_space-$pos);
- $pos = $i_space;
- }
- } else { /* no <space> $i_space === false */
- if ($i = strpos($address_part,'<')) {
- $name .= substr($address_part,0,$i);
- $pos = $i+$pos;
- } else {
- $addr = substr($address,$pos);
- $pos = $j;
- }
- }
- } else { /* <space> is available in the next address */
- /* OR no delimiter and <space> */
- if ($i_del) {
- /* check for < > addresses */
- if ($i = strpos($address_part,'<')) {
- $name .= substr($address_part,0,$i);
- $pos = $i+$pos;
- } else {
- $addr = substr($address,$pos,$i_del-$pos);
- $pos = $i_del;
- }
- /* no delimiter */
- } else if ($i_space) { /* can never happen ? */
- if ($i = strpos($address_part,'<')) {
- $name .= substr($address_part,0,$i);
- $pos = $i+$pos;
- } else {
- $addr = substr($address,$pos,$i_space-$pos);
- $pos = $i_space+1;
- }
- } else { /* can never happen */
- $addr = substr($address,$pos);
- $pos = $j;
- }
- }
- } else { /* <space> is located after the user@domain part */
- /* or no <space> present */
- if ($i_space) {
- if ($i = strpos($address_part,'<')) {
- $name .= substr($address_part,0,$i);
- $pos = $i+$pos;
- } else {
- $name .= substr($address,$pos,$i_space-$pos) . ' ';
- $addr_start = $i_space+1;
- $pos = $i_space+1;
- }
- } else { /* no <space> */
- $addr = substr($address,$pos,$i_del-$pos);
- $addr_start = $pos;
- if ($i_del) {
- $pos = $i_del;
- } else { /* can never happen. REMOVE */
- $pos = $j;
- }
- }
- }