Вход Регистрация
Файл: protected/extensions/yii-mail/vendors/swiftMailer/classes/Swift/CharacterReader/Utf8Reader.php
Строк: 110
<?php

/*
 * This file is part of SwiftMailer.
 * (c) 2004-2009 Chris Corbyn
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

//@require 'Swift/CharacterReader.php';

/**
 * Analyzes UTF-8 characters.
 * @package Swift
 * @subpackage Encoder
 * @author Chris Corbyn
 * @author Xavier De Cock <xdecock@gmail.com>
 */
class Swift_CharacterReader_Utf8Reader
  
implements Swift_CharacterReader
{

  
/** Pre-computed for optimization */
  
private static $length_map=array(
//N=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,
    
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //0x0N
    
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //0x1N
    
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //0x2N
    
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //0x3N
    
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //0x4N
    
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //0x5N
    
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //0x6N
    
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //0x7N
    
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //0x8N
    
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //0x9N
    
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //0xAN
    
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //0xBN
    
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, //0xCN
    
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, //0xDN
    
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, //0xEN
    
4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0  //0xFN
 
);
  private static 
$s_length_map=array(
  
"x00"=>1, "x01"=>1, "x02"=>1, "x03"=>1, "x04"=>1, "x05"=>1, "x06"=>1, "x07"=>1,
  
"x08"=>1, "x09"=>1, "x0a"=>1, "x0b"=>1, "x0c"=>1, "x0d"=>1, "x0e"=>1, "x0f"=>1,
  
"x10"=>1, "x11"=>1, "x12"=>1, "x13"=>1, "x14"=>1, "x15"=>1, "x16"=>1, "x17"=>1,
  
"x18"=>1, "x19"=>1, "x1a"=>1, "x1b"=>1, "x1c"=>1, "x1d"=>1, "x1e"=>1, "x1f"=>1,
  
"x20"=>1, "x21"=>1, "x22"=>1, "x23"=>1, "x24"=>1, "x25"=>1, "x26"=>1, "x27"=>1,
  
"x28"=>1, "x29"=>1, "x2a"=>1, "x2b"=>1, "x2c"=>1, "x2d"=>1, "x2e"=>1, "x2f"=>1,
  
"x30"=>1, "x31"=>1, "x32"=>1, "x33"=>1, "x34"=>1, "x35"=>1, "x36"=>1, "x37"=>1,
  
"x38"=>1, "x39"=>1, "x3a"=>1, "x3b"=>1, "x3c"=>1, "x3d"=>1, "x3e"=>1, "x3f"=>1,
  
"x40"=>1, "x41"=>1, "x42"=>1, "x43"=>1, "x44"=>1, "x45"=>1, "x46"=>1, "x47"=>1,
  
"x48"=>1, "x49"=>1, "x4a"=>1, "x4b"=>1, "x4c"=>1, "x4d"=>1, "x4e"=>1, "x4f"=>1,
  
"x50"=>1, "x51"=>1, "x52"=>1, "x53"=>1, "x54"=>1, "x55"=>1, "x56"=>1, "x57"=>1,
  
"x58"=>1, "x59"=>1, "x5a"=>1, "x5b"=>1, "x5c"=>1, "x5d"=>1, "x5e"=>1, "x5f"=>1,
  
"x60"=>1, "x61"=>1, "x62"=>1, "x63"=>1, "x64"=>1, "x65"=>1, "x66"=>1, "x67"=>1,
  
"x68"=>1, "x69"=>1, "x6a"=>1, "x6b"=>1, "x6c"=>1, "x6d"=>1, "x6e"=>1, "x6f"=>1,
  
"x70"=>1, "x71"=>1, "x72"=>1, "x73"=>1, "x74"=>1, "x75"=>1, "x76"=>1, "x77"=>1,
  
"x78"=>1, "x79"=>1, "x7a"=>1, "x7b"=>1, "x7c"=>1, "x7d"=>1, "x7e"=>1, "x7f"=>1,
  
"x80"=>0, "x81"=>0, "x82"=>0, "x83"=>0, "x84"=>0, "x85"=>0, "x86"=>0, "x87"=>0,
  
"x88"=>0, "x89"=>0, "x8a"=>0, "x8b"=>0, "x8c"=>0, "x8d"=>0, "x8e"=>0, "x8f"=>0,
  
"x90"=>0, "x91"=>0, "x92"=>0, "x93"=>0, "x94"=>0, "x95"=>0, "x96"=>0, "x97"=>0,
  
"x98"=>0, "x99"=>0, "x9a"=>0, "x9b"=>0, "x9c"=>0, "x9d"=>0, "x9e"=>0, "x9f"=>0,
  
"xa0"=>0, "xa1"=>0, "xa2"=>0, "xa3"=>0, "xa4"=>0, "xa5"=>0, "xa6"=>0, "xa7"=>0,
  
"xa8"=>0, "xa9"=>0, "xaa"=>0, "xab"=>0, "xac"=>0, "xad"=>0, "xae"=>0, "xaf"=>0,
  
"xb0"=>0, "xb1"=>0, "xb2"=>0, "xb3"=>0, "xb4"=>0, "xb5"=>0, "xb6"=>0, "xb7"=>0,
  
"xb8"=>0, "xb9"=>0, "xba"=>0, "xbb"=>0, "xbc"=>0, "xbd"=>0, "xbe"=>0, "xbf"=>0,
  
"xc0"=>2, "xc1"=>2, "xc2"=>2, "xc3"=>2, "xc4"=>2, "xc5"=>2, "xc6"=>2, "xc7"=>2,
  
"xc8"=>2, "xc9"=>2, "xca"=>2, "xcb"=>2, "xcc"=>2, "xcd"=>2, "xce"=>2, "xcf"=>2,
  
"xd0"=>2, "xd1"=>2, "xd2"=>2, "xd3"=>2, "xd4"=>2, "xd5"=>2, "xd6"=>2, "xd7"=>2,
  
"xd8"=>2, "xd9"=>2, "xda"=>2, "xdb"=>2, "xdc"=>2, "xdd"=>2, "xde"=>2, "xdf"=>2,
  
"xe0"=>3, "xe1"=>3, "xe2"=>3, "xe3"=>3, "xe4"=>3, "xe5"=>3, "xe6"=>3, "xe7"=>3,
  
"xe8"=>3, "xe9"=>3, "xea"=>3, "xeb"=>3, "xec"=>3, "xed"=>3, "xee"=>3, "xef"=>3,
  
"xf0"=>4, "xf1"=>4, "xf2"=>4, "xf3"=>4, "xf4"=>4, "xf5"=>4, "xf6"=>4, "xf7"=>4,
  
"xf8"=>5, "xf9"=>5, "xfa"=>5, "xfb"=>5, "xfc"=>6, "xfd"=>6, "xfe"=>0, "xff"=>0,
 );

  
/**
   * Returns the complete charactermap
   *
   * @param string $string
   * @param int $startOffset
   * @param array $currentMap
   * @param mixed $ignoredChars
   */
  
public function getCharPositions($string, $startOffset, &$currentMap, &$ignoredChars)
  {
      if (!isset(
$currentMap['i']) || !isset($currentMap['p']))
      {
        
$currentMap['p'] = $currentMap['i'] = array();
       }
      
$strlen=strlen($string);
      
$charPos=count($currentMap['p']);
      
$foundChars=0;
      
$invalid=false;
      for (
$i=0; $i<$strlen; ++$i)
      {
        
$char=$string[$i];
        
$size=self::$s_length_map[$char];
        if (
$size==0)
        {
          
/* char is invalid, we must wait for a resync */
            
$invalid=true;
            continue;
         }
         else
         {
             if (
$invalid==true)
             {
               
/* We mark the chars as invalid and start a new char */
               
$currentMap['p'][$charPos+$foundChars]=$startOffset+$i;
             
$currentMap['i'][$charPos+$foundChars]=true;
             ++
$foundChars;
             
$invalid=false;
             }
             if ((
$i+$size) > $strlen){
                 
$ignoredChars=substr($string, $i);
                 break;
             }
             for (
$j=1; $j<$size; ++$j)
             {
          
$char=$string[$i+$j];
          if (
$char>"x7F" && $char<"xC0")
          {
            
// Valid - continue parsing
          
}
          else
          {
            
/* char is invalid, we must wait for a resync */
            
$invalid=true;
            continue 
2;
          }
             }
             
/* Ok we got a complete char here */
             
$lastChar=$currentMap['p'][$charPos+$foundChars]=$startOffset+$i+$size;
             
$i+=$j-1;
           ++
$foundChars;
         }
      }
      return 
$foundChars;
  }
  
  
/**
   * Returns mapType
   * @int mapType
   */
  
public function getMapType()
  {
      return 
self::MAP_TYPE_POSITIONS;
  }
 
  
/**
   * Returns an integer which specifies how many more bytes to read.
   * A positive integer indicates the number of more bytes to fetch before invoking
   * this method again.
   * A value of zero means this is already a valid character.
   * A value of -1 means this cannot possibly be a valid character.
   * @param string $bytes
   * @return int
   */
  
public function validateByteSequence($bytes, $size)
  {
    if (
$size<1){
      return -
1;
    }
    
$needed = self::$length_map[$bytes[0]] - $size;
    return (
$needed > -1)
      ? 
$needed
      
: -1
      
;
  }

  
/**
   * Returns the number of bytes which should be read to start each character.
   * @return int
   */
  
public function getInitialByteSize()
  {
    return 
1;
  }

}
Онлайн: 1
Реклама