Server : Apache/2.4.18 (Ubuntu) System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64 User : oppastar ( 1041) PHP Version : 7.0.33-0ubuntu0.16.04.15 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, Directory : /usr/share/phpmyadmin/libraries/sql-parser/src/Utils/ |
Upload File : |
<?php /** * Token utilities. * * @package SqlParser * @subpackage Utils */ namespace SqlParser\Utils; use SqlParser\Lexer; use SqlParser\Token; use SqlParser\TokensList; /** * Token utilities. * * @category Token * @package SqlParser * @subpackage Utils * @author Dan Ungureanu <udan1107@gmail.com> * @license http://opensource.org/licenses/GPL-2.0 GNU Public License */ class Tokens { /** * Checks if a pattern is a match for the specified token. * * @param Token $token The token to be matched. * @param array $pattern The pattern to be matches. * * @return bool */ public static function match(Token $token, array $pattern) { // Token. if ((isset($pattern['token'])) && ($pattern['token'] !== $token->token) ) { return false; } // Value. if ((isset($pattern['value'])) && ($pattern['value'] !== $token->value) ) { return false; } if ((isset($pattern['value_str'])) && (strcasecmp($pattern['value_str'], $token->value)) ) { return false; } // Type. if ((isset($pattern['type'])) && ($pattern['type'] !== $token->type) ) { return false; } // Flags. if ((isset($pattern['flags'])) && (($pattern['flags'] & $token->flags) === 0) ) { return false; } return true; } public static function replaceTokens($list, array $find, array $replace) { /** * Whether the first parameter is a list. * * @var bool */ $isList = $list instanceof TokensList; // Parsing the tokens. if (!$isList) { $list = Lexer::getTokens($list); } /** * The list to be returned. * * @var array */ $newList = array(); /** * The length of the find pattern is calculated only once. * * @var int */ $findCount = count($find); /** * The starting index of the pattern. * * @var int */ $i = 0; while ($i < $list->count) { // A sequence may not start with a comment. if ($list->tokens[$i]->type === Token::TYPE_COMMENT) { $newList[] = $list->tokens[$i]; ++$i; continue; } /** * The index used to parse `$list->tokens`. * * This index might be running faster than `$k` because some tokens * are skipped. * * @var int */ $j = $i; /** * The index used to parse `$find`. * * This index might be running slower than `$j` because some tokens * are skipped. * * @var int */ $k = 0; // Checking if the next tokens match the pattern described. while (($j < $list->count) && ($k < $findCount)) { // Comments are being skipped. if ($list->tokens[$j]->type === Token::TYPE_COMMENT) { ++$j; } if (!static::match($list->tokens[$j], $find[$k])) { // This token does not match the pattern. break; } // Going to next token and segment of find pattern. ++$j; ++$k; } // Checking if the sequence was found. if ($k === $findCount) { // Inserting new tokens. foreach ($replace as $token) { $newList[] = $token; } // Skipping next `$findCount` tokens. $i = $j; } else { // Adding the same token. $newList[] = $list->tokens[$i]; ++$i; } } return $isList ? new TokensList($newList) : TokensList::build($newList); } }