!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

Software: Apache. PHP/8.1.30 

uname -a: Linux server1.tuhinhossain.com 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC
2025 x86_64
 

uid=1002(picotech) gid=1003(picotech) groups=1003(picotech),0(root)  

Safe-mode: OFF (not secure)

/home/picotech/domains/sms.picotech.app/public_html_v5_10/vendor/phpstan/phpdoc-parser/src/Parser/   drwxr-xr-x
Free 28.69 GB of 117.98 GB (24.31%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     TokenIterator.php (7.67 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php declare(strict_types 1);

namespace 
PHPStan\PhpDocParser\Parser;

use 
LogicException;
use 
PHPStan\PhpDocParser\Lexer\Lexer;
use function 
array_pop;
use function 
assert;
use function 
count;
use function 
in_array;
use function 
strlen;
use function 
substr;

class 
TokenIterator
{

    
/** @var list<array{string, int, int}> */
    
private $tokens;

    
/** @var int */
    
private $index;

    
/** @var int[] */
    
private $savePoints = [];

    
/** @var list<int> */
    
private $skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS];

    
/** @var string|null */
    
private $newline null;

    
/**
     * @param list<array{string, int, int}> $tokens
     */
    
public function __construct(array $tokensint $index 0)
    {
        
$this->tokens $tokens;
        
$this->index $index;

        
$this->skipIrrelevantTokens();
    }


    
/**
     * @return list<array{string, int, int}>
     */
    
public function getTokens(): array
    {
        return 
$this->tokens;
    }


    public function 
getContentBetween(int $startPosint $endPos): string
    
{
        if (
$startPos || $endPos count($this->tokens)) {
            throw new 
LogicException();
        }

        
$content '';
        for (
$i $startPos$i $endPos$i++) {
            
$content .= $this->tokens[$i][Lexer::VALUE_OFFSET];
        }

        return 
$content;
    }


    public function 
getTokenCount(): int
    
{
        return 
count($this->tokens);
    }


    public function 
currentTokenValue(): string
    
{
        return 
$this->tokens[$this->index][Lexer::VALUE_OFFSET];
    }


    public function 
currentTokenType(): int
    
{
        return 
$this->tokens[$this->index][Lexer::TYPE_OFFSET];
    }


    public function 
currentTokenOffset(): int
    
{
        
$offset 0;
        for (
$i 0$i $this->index$i++) {
            
$offset += strlen($this->tokens[$i][Lexer::VALUE_OFFSET]);
        }

        return 
$offset;
    }


    public function 
currentTokenLine(): int
    
{
        return 
$this->tokens[$this->index][Lexer::LINE_OFFSET];
    }


    public function 
currentTokenIndex(): int
    
{
        return 
$this->index;
    }


    public function 
endIndexOfLastRelevantToken(): int
    
{
        
$endIndex $this->currentTokenIndex();
        
$endIndex--;
        while (
in_array($this->tokens[$endIndex][Lexer::TYPE_OFFSET], $this->skippedTokenTypestrue)) {
            if (!isset(
$this->tokens[$endIndex 1])) {
                break;
            }
            
$endIndex--;
        }

        return 
$endIndex;
    }


    public function 
isCurrentTokenValue(string $tokenValue): bool
    
{
        return 
$this->tokens[$this->index][Lexer::VALUE_OFFSET] === $tokenValue;
    }


    public function 
isCurrentTokenType(int ...$tokenType): bool
    
{
        return 
in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenTypetrue);
    }


    public function 
isPrecededByHorizontalWhitespace(): bool
    
{
        return (
$this->tokens[$this->index 1][Lexer::TYPE_OFFSET] ?? -1) === Lexer::TOKEN_HORIZONTAL_WS;
    }


    
/**
     * @throws ParserException
     */
    
public function consumeTokenType(int $tokenType): void
    
{
        if (
$this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) {
            
$this->throwError($tokenType);
        }

        if (
$tokenType === Lexer::TOKEN_PHPDOC_EOL) {
            if (
$this->newline === null) {
                
$this->detectNewline();
            }
        }

        
$this->index++;
        
$this->skipIrrelevantTokens();
    }


    
/**
     * @throws ParserException
     */
    
public function consumeTokenValue(int $tokenTypestring $tokenValue): void
    
{
        if (
$this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType || $this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) {
            
$this->throwError($tokenType$tokenValue);
        }

        
$this->index++;
        
$this->skipIrrelevantTokens();
    }


    
/** @phpstan-impure */
    
public function tryConsumeTokenValue(string $tokenValue): bool
    
{
        if (
$this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) {
            return 
false;
        }

        
$this->index++;
        
$this->skipIrrelevantTokens();

        return 
true;
    }


    
/** @phpstan-impure */
    
public function tryConsumeTokenType(int $tokenType): bool
    
{
        if (
$this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) {
            return 
false;
        }

        if (
$tokenType === Lexer::TOKEN_PHPDOC_EOL) {
            if (
$this->newline === null) {
                
$this->detectNewline();
            }
        }

        
$this->index++;
        
$this->skipIrrelevantTokens();

        return 
true;
    }


    private function 
detectNewline(): void
    
{
        
$value $this->currentTokenValue();
        if (
substr($value02) === "\r\n") {
            
$this->newline "\r\n";
        } elseif (
substr($value01) === "\n") {
            
$this->newline "\n";
        }
    }


    public function 
getSkippedHorizontalWhiteSpaceIfAny(): string
    
{
        if (
$this->index && $this->tokens[$this->index 1][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) {
            return 
$this->tokens[$this->index 1][Lexer::VALUE_OFFSET];
        }

        return 
'';
    }


    
/** @phpstan-impure */
    
public function joinUntil(int ...$tokenType): string
    
{
        
$s '';
        while (!
in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenTypetrue)) {
            
$s .= $this->tokens[$this->index++][Lexer::VALUE_OFFSET];
        }
        return 
$s;
    }


    public function 
next(): void
    
{
        
$this->index++;
        
$this->skipIrrelevantTokens();
    }


    private function 
skipIrrelevantTokens(): void
    
{
        if (!isset(
$this->tokens[$this->index])) {
            return;
        }

        while (
in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $this->skippedTokenTypestrue)) {
            if (!isset(
$this->tokens[$this->index 1])) {
                break;
            }
            
$this->index++;
        }
    }


    public function 
addEndOfLineToSkippedTokens(): void
    
{
        
$this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WSLexer::TOKEN_PHPDOC_EOL];
    }


    public function 
removeEndOfLineFromSkippedTokens(): void
    
{
        
$this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS];
    }

    
/** @phpstan-impure */
    
public function forwardToTheEnd(): void
    
{
        
$lastToken count($this->tokens) - 1;
        
$this->index $lastToken;
    }


    public function 
pushSavePoint(): void
    
{
        
$this->savePoints[] = $this->index;
    }


    public function 
dropSavePoint(): void
    
{
        
array_pop($this->savePoints);
    }


    public function 
rollback(): void
    
{
        
$index array_pop($this->savePoints);
        
assert($index !== null);
        
$this->index $index;
    }


    
/**
     * @throws ParserException
     */
    
private function throwError(int $expectedTokenType, ?string $expectedTokenValue null): void
    
{
        throw new 
ParserException(
            
$this->currentTokenValue(),
            
$this->currentTokenType(),
            
$this->currentTokenOffset(),
            
$expectedTokenType,
            
$expectedTokenValue,
            
$this->currentTokenLine()
        );
    }

    
/**
     * Check whether the position is directly preceded by a certain token type.
     *
     * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped
     */
    
public function hasTokenImmediatelyBefore(int $posint $expectedTokenType): bool
    
{
        
$tokens $this->tokens;
        
$pos--;
        for (; 
$pos >= 0$pos--) {
            
$token $tokens[$pos];
            
$type $token[Lexer::TYPE_OFFSET];
            if (
$type === $expectedTokenType) {
                return 
true;
            }
            if (!
in_array($type, [
                
Lexer::TOKEN_HORIZONTAL_WS,
                
Lexer::TOKEN_PHPDOC_EOL,
            ], 
true)) {
                break;
            }
        }
        return 
false;
    }

    
/**
     * Check whether the position is directly followed by a certain token type.
     *
     * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped
     */
    
public function hasTokenImmediatelyAfter(int $posint $expectedTokenType): bool
    
{
        
$tokens $this->tokens;
        
$pos++;
        for (
$c count($tokens); $pos $c$pos++) {
            
$token $tokens[$pos];
            
$type $token[Lexer::TYPE_OFFSET];
            if (
$type === $expectedTokenType) {
                return 
true;
            }
            if (!
in_array($type, [
                
Lexer::TOKEN_HORIZONTAL_WS,
                
Lexer::TOKEN_PHPDOC_EOL,
            ], 
true)) {
                break;
            }
        }

        return 
false;
    }

    public function 
getDetectedNewline(): ?string
    
{
        return 
$this->newline;
    }

    
/**
     * Whether the given position is immediately surrounded by parenthesis.
     */
    
public function hasParentheses(int $startPosint $endPos): bool
    
{
        return 
$this->hasTokenImmediatelyBefore($startPosLexer::TOKEN_OPEN_PARENTHESES)
            && 
$this->hasTokenImmediatelyAfter($endPosLexer::TOKEN_CLOSE_PARENTHESES);
    }

}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0077 ]--