alecpl
2008-09-20 c17dc6aa31aaa6e7f61bd25993be55354e428996
program/lib/mime.inc
@@ -32,13 +32,15 @@
$MIME_VIDEO = 6;
$MIME_OTHER = 7;
function iml_ClosingParenPos($str, $start){
function iml_ClosingParenPos($str, $start) {
    $level=0;
    $len = strlen($str);
    $in_quote = 0;
    for ($i=$start;$i<$len;$i++){
       if ($str[$i]=="\"") $in_quote = ($in_quote + 1) % 2;
       if (!$in_quote){
    for ($i=$start; $i<$len; $i++) {
       if ($str[$i] == '"' && $str[$i-1] != "\\")
      $in_quote = ($in_quote + 1) % 2;
       if (!$in_quote) {
           if ($str[$i]=="(") $level++;
           else if (($level > 0) && ($str[$i]==")")) $level--;
           else if (($level == 0) && ($str[$i]==")")) return $i;
@@ -51,27 +53,32 @@
    $id = 0;
    $a = array();
    $len = strlen($str);
    $in_quote = 0;
    for ($i=0; $i<$len; $i++){
        if ($str[$i] == "\"") $in_quote = ($in_quote + 1) % 2;
        else if (!$in_quote){
            if ($str[$i] == " ") $id++; //space means new element
            else if ($str[$i]=="("){ //new part
    for ($i=0; $i<$len; $i++) {
        if ($str[$i] == '"') {
       $in_quote = ($in_quote + 1) % 2;
        } else if (!$in_quote) {
            if ($str[$i] == " ") { //space means new element
                $id++;
                while ($str[$i+1] == " ") $i++;  // skip additional spaces
            } else if ($str[$i]=="(") { //new part
                $i++;
                $endPos = iml_ClosingParenPos($str, $i);
                $partLen = $endPos - $i;
                if ($partLen < 0) break;
                $part = substr($str, $i, $partLen);
                $a[$id] = iml_ParseBSString($part); //send part string
                if ($verbose){
               echo "{>".$endPos."}";
               flush();
            }
                $i = $endPos;
            }else $a[$id].=$str[$i]; //add to current element in array
        }else if ($in_quote){
            if ($str[$i]=="\\") $i++; //escape backslashes
            else $a[$id].=$str[$i]; //add to current element in array
            } else
      $a[$id].=$str[$i]; //add to current element in array
        } else if ($in_quote) {
            if ($str[$i]=="\\") {
      $i++; //escape backslashes
      if ($str[$i] == '"' || $str[$i] == "\\")
          $a[$id] .= $str[$i];
            } else
      $a[$id] .= $str[$i]; //add to current element in array
        }
    }
        
@@ -82,7 +89,7 @@
function iml_GetRawStructureArray($str){
    $line=substr($str, 1, strlen($str) - 2);
    $line = str_replace(")(", ") (", $line);
   $struct = iml_ParseBSString($line);
   if ((strcasecmp($struct[0], "message")==0) && (strcasecmp($struct[1], "rfc822")==0)){
      $struct = array($struct);
@@ -108,7 +115,7 @@
      }
      //echo "s - part: $part rest: $rest array: ".implode(" ", $a)."<br>\n";
      if (is_array($a[$part-1])) return $a[$part-1];
      else return false;
      else return $a;
   }else if (($part==0) || (empty($part))){
      return $a;
   }