+ $char = $address{$pos};
+ switch ($char) {
+ case '=':
+ if (preg_match('/^(=\?([^?]*)\?(Q|B)\?([^?]*)\?=)(.*)/Ui',substr($address,$pos),$reg)) {
+ if (!$personal) {
+ $personal = substr($address,0,$pos);
+ }
+ $personal .= $reg[1];
+ $pos += strlen($personal);
+ }
+ ++$pos;
+ break;
+ case '"': /* get the personal name */
+ ++$pos;
+ if ($address{$pos} == '"') {
+ ++$pos;
+ } else {
+ $personal_start = $personal_end = $pos;
+ while ($pos < $j) {
+ $personal_end = strpos($address,'"',$pos);
+ if (($personal_end-2)>0 && (substr($address,$personal_end-2,2) === '\\"' ||
+ substr($address,$personal_end-2,2) === '\\\\')) {
+ $pos = $personal_end+1;
+ } else {
+ $personal = substr($address,$personal_start,$personal_end-$personal_start);
+ break;
+ }
+ }
+ if ($personal_end) { /* prohibit endless loops due to very wrong addresses */
+ $pos = $personal_end+1;
+ } else {
+ $pos = $j;
+ }
+ }
+ break;
+ case '<': /* get email address */
+ $addr_start = $pos;
+ $addr_end = strpos($address,'>',$addr_start);
+ $addr = substr($address,$addr_start+1,$addr_end-$addr_start-1);
+ $pos = $addr_end+1;
+ break;
+ case '(': /* rip off comments */
+ $addr_start = $pos;
+ $pos = strpos($address,')');
+ if ($pos !== false) {
+ $comment = substr($address, $addr_start+1,($pos-$addr_start-1));
+ $address_start = substr($address, 0, $addr_start);
+ $address_end = substr($address, $pos + 1);
+ $address = $address_start . $address_end;
+ }
+ $j = strlen($address);
+ $pos = $addr_start + 1;
+ break;
+ case ',': /* we reached a delimiter */
+ if ($addr == '') {
+ $addr = substr($address, 0, $pos);
+ } else if ($personal == '') {
+ $personal = trim(substr($address, 0, $addr_start));
+ }
+ if (!$personal && $comment) $personal = $comment;
+ if ($personal) $personal = decodeHeader($personal);
+ $addr_ar[] = array($addr,$personal);
+ $address = trim(substr($address, $pos+1));
+ $j = strlen($address);
+ $pos = 0;
+ $personal = '';
+ $addr = '';
+ break;
+ case ':': /* process the group addresses */
+ /* group marker */
+ $group = substr($address, 0, $pos);
+ $address = substr($address, $pos+1);
+ $result = parseAddress($address, $max, $addr_ar, $group);
+ $addr_ar = $result[0];
+ $pos = $result[1];
+ $address = substr($address, $pos++);
+ $j = strlen($address);
+ $group = '';
+ break;
+ case ';':
+ if ($group) {
+ $address = substr($address, 0, $pos - 1);
+ }
+ ++$pos;
+ break;
+ default:
+ ++$pos;
+ break;