Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/** $Id: PathTokenizer.php 123 2006-09-14 20:19:08Z mrook $** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.** This software consists of voluntary contributions made by many individuals* and is licensed under the LGPL. For more information please see* <http://phing.info>.*/include_once 'phing/util/StringHelper.php';/*** A Path tokenizer takes a path and returns the components that make up* that path.** The path can use path separators of either ':' or ';' and file separators* of either '/' or '\'.** @author Hans Lellelid <hans@xmpl.org> (Phing)* @author Conor MacNeill (Ant)* @author Jeff Tulley <jtulley@novell.com> (Ant)* @pacakge phing.util*/class PathTokenizer {/*** A array of tokens, created by preg_split().*/private $tokens = array();/*** A string which stores any path components which have been read ahead* due to DOS filesystem compensation.* @var string*/private $lookahead;/*** Flag to indicate whether or not we are running on a platform with a* DOS style filesystem* @var boolean*/private $dosStyleFilesystem;/*** Constructs a path tokenizer for the specified path.** @param path The path to tokenize. Must not be <code>null</code>.*/public function __construct($path) {// on Windows and Unix, we can ignore delimiters and still have// enough information to tokenize correctly.$this->tokens = preg_split("/[;:]/", $path, -1, PREG_SPLIT_NO_EMPTY);$this->dosStyleFilesystem = ( PATH_SEPARATOR == ';');}/*** Tests if there are more path elements available from this tokenizer's* path. If this method returns <code>true</code>, then a subsequent call* to nextToken will successfully return a token.** @return <code>true</code> if and only if there is at least one token* in the string after the current position; <code>false</code> otherwise.*/public function hasMoreTokens() {if ($this->lookahead !== null) {return true;}return !empty($this->tokens);}/*** Returns the next path element from this tokenizer.** @return the next path element from this tokenizer.** @throws Exception if there are no more elements in this tokenizer's path.*/public function nextToken() {if ($this->lookahead !== null) {$token = $this->lookahead;$this->lookahead = null;} else {$token = trim(array_shift($this->tokens));}if (strlen($token) === 1 && Character::isLetter($token{0})&& $this->dosStyleFilesystem&& !empty($this->tokens)) {// we are on a dos style system so this path could be a drive// spec. We look at the next token$nextToken = trim(array_shift($this->tokens));if (StringHelper::startsWith('\\', $nextToken) || StringHelper::startsWith('/', $nextToken)) {// we know we are on a DOS style platform and the next path// starts with a slash or backslash, so we know this is a// drive spec$token .= ':' . $nextToken;} else {// store the token just read for next time$this->lookahead = $nextToken;}}return $token;}/*** Non StringTokenizer function, that indicates whether the specified path is contained in loaded tokens.* We can do this easily because in PHP implimentation we're using arrays.* @param string $path path to search for.* @return boolean*/public function contains($path) {return in_array($path, $this->tokens, true);}}