1 | <?php |
||
21 | class State |
||
22 | { |
||
23 | const S_ANY = 0; |
||
24 | const S_IN_QUOTE = 1; |
||
25 | const S_IN_ESCAPE = 2; |
||
26 | const S_IN_QUOTE_ESCAPE = 4; |
||
27 | const S_INITIAL = 5; |
||
28 | |||
29 | const S_INITIAL_TOKENS = Token::T_ANY & ~Token::T_DOUBLE_QUOTE; |
||
30 | const S_ANY_TOKENS = Token::T_ANY & ~Token::T_DOUBLE_QUOTE & ~Token::T_BOM; |
||
31 | const S_IN_QUOTE_TOKENS = Token::T_CONTENT | Token::T_QUOTE | Token::T_DOUBLE_QUOTE | Token::T_ESCAPE; |
||
32 | const S_IN_ESCAPE_TOKENS = Token::T_CONTENT; |
||
33 | const S_IN_QUOTE_ESCAPE_TOKENS = Token::T_CONTENT; |
||
34 | |||
35 | /** @var State[] */ |
||
36 | private $states; |
||
37 | /** @var TokenStoreInterface */ |
||
38 | private $tokenStore; |
||
39 | /** @var int */ |
||
40 | private $tokenMask; |
||
41 | /** @var int[] */ |
||
42 | private $tokens; |
||
43 | /** @var string[] */ |
||
44 | private $keys; |
||
45 | /** @var int[] */ |
||
46 | private $keyLengths; |
||
47 | /** @var int */ |
||
48 | private $maxLen; |
||
49 | |||
50 | /** |
||
51 | * TokenStoreInterface is passed in here, as the tokens can be modified by the store |
||
52 | * |
||
53 | * @param TokenStoreInterface $tokens |
||
54 | * @param int $tokenMask |
||
55 | */ |
||
56 | 31 | public function __construct(TokenStoreInterface $tokens, $tokenMask = Token::T_ANY) |
|
62 | |||
63 | /** |
||
64 | * Parse the current set ok tokens and cache some metadata about them for speed |
||
65 | */ |
||
66 | 31 | private function parseTokens() |
|
74 | |||
75 | /** |
||
76 | * @param int $token |
||
77 | * |
||
78 | * @return State|null |
||
79 | */ |
||
80 | 28 | public function getNextState($token) |
|
81 | { |
||
82 | 28 | foreach ($this->states as $mask => $state) { |
|
83 | 28 | if ($mask & $token) { |
|
84 | 28 | return $state; |
|
85 | } |
||
86 | } |
||
87 | |||
88 | 1 | throw new RuntimeException("The supplied token: {$token} has no target state"); |
|
89 | } |
||
90 | |||
91 | /** |
||
92 | * @param int $tokenMask |
||
93 | * @param State $target |
||
94 | */ |
||
95 | 31 | public function addStateTarget($tokenMask, State $target) |
|
99 | |||
100 | /** |
||
101 | * @param BufferInterface $buffer |
||
102 | * |
||
103 | * @return array |
||
104 | */ |
||
105 | 27 | public function match(BufferInterface $buffer) |
|
140 | } |
||
141 |