diff options
Diffstat (limited to 'buildscripts/phing/classes/phing/util/PathTokenizer.php')
-rw-r--r-- | buildscripts/phing/classes/phing/util/PathTokenizer.php | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/buildscripts/phing/classes/phing/util/PathTokenizer.php b/buildscripts/phing/classes/phing/util/PathTokenizer.php new file mode 100644 index 00000000..0a469acf --- /dev/null +++ b/buildscripts/phing/classes/phing/util/PathTokenizer.php @@ -0,0 +1,245 @@ +<?php +/* + * $Id: 0ca7f2a419b5cc4285a8f84695c4b680b0aa190b $ + * + * 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) + + * @package 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); + + } + + + +} + + + |