1<?php
2/**
3 * Common information needed by all portions of the application
4 *
5 * phpDocumentor :: automatic documentation generator
6 *
7 * PHP versions 4 and 5
8 *
9 * Copyright (c) 2001-2008 Gregory Beaver
10 *
11 * LICENSE:
12 *
13 * This library is free software; you can redistribute it
14 * and/or modify it under the terms of the GNU Lesser General
15 * Public License as published by the Free Software Foundation;
16 * either version 2.1 of the License, or (at your option) any
17 * later version.
18 *
19 * This library is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * Lesser General Public License for more details.
23 *
24 * You should have received a copy of the GNU Lesser General Public
25 * License along with this library; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 *
28 * @category  ToolsAndUtilities
29 * @package   phpDocumentor
30 * @author    Greg Beaver <cellog@php.net>
31 * @copyright 2001-2008 Gregory Beaver
32 * @license   http://www.opensource.org/licenses/lgpl-license.php LGPL
33 * @version   CVS: $Id: common.inc.php 288074 2009-09-05 02:16:26Z ashnazg $
34 * @filesource
35 * @link      http://www.phpdoc.org
36 * @link      http://pear.php.net/PhpDocumentor
37 * @see       parserDocBlock, parserInclude, parserPage, parserClass
38 * @see       parserDefine, parserFunction, parserMethod, parserVar
39 * @since     1.0rc1
40 * @todo      CS cleanup - change package to PhpDocumentor
41 * @todo      CS cleanup - rename constant to TOKENIZER_EXT
42 */
43
44/* phpDocumentor version */
45if ('@PEAR-DIR@' != '@'.'PEAR-DIR@') {
46    /** @ignore */
47    define("PHPDOCUMENTOR_VER", "@VER@");
48} else {
49    define("PHPDOCUMENTOR_VER", "1.4.3");
50}
51
52/* phpDocumentor URL */
53define("PHPDOCUMENTOR_WEBSITE", "http://www.phpdoc.org");
54
55// set the correct path delimiter
56define('SMART_PATH_DELIMITER', DIRECTORY_SEPARATOR);
57
58define('tokenizer_ext', extension_loaded('tokenizer')
59    && version_compare(phpversion(), "4.3.0", ">="));
60
61// we just replace all the \ with / so that we can just operate on /
62define('PATH_DELIMITER', '/'); // set the correct path delimiter
63
64define('PHPDOCUMENTOR_WINDOWS', substr(PHP_OS, 0, 3) == 'WIN');
65
66define('_IN_PHP5',
67    phpversion() == '5.0.0RC1-dev' || phpversion() == '5.0.0RC2-dev'
68    || version_compare(phpversion(), '5.0.0', 'ge'));
69
70// determine which "clone" class to set, based on PHP major version
71$cloneClassDir  = 'PhpDocumentor' . DIRECTORY_SEPARATOR . 'phpDocumentor';
72$cloneClassFile = 'clone.inc.php';
73if ('@VER@' == '@'.'VER@') {
74    // we're _not_ in a PEAR installation
75    $cloneClassDir = dirname(__FILE__);
76}
77if (_IN_PHP5) {
78    // we _are_ in PHP5
79    $cloneClassFile = 'clone5.inc.php';
80}
81require_once $cloneClassDir . DIRECTORY_SEPARATOR . $cloneClassFile;
82
83// make arg arrays available
84if (isset($_SERVER['argv'])) {
85    $argv = $_SERVER['argv'];
86    $argc = $_SERVER['argc'];
87}
88
89/**
90 * used in phpdoc.php and new_phpdoc.php
91 *
92 * @param string $directory a directory string
93 *
94 * @return array an array of directory contents
95 * @todo CS cleanup - rename function to PhpDocumentor_ConfigFileList
96 */
97function phpDocumentor_ConfigFileList($directory)
98{
99    $ret = array();
100    if (@is_dir($directory)) {
101        $ret = array();
102
103        // thanks to Jason E Sweat (jsweat@users.sourceforge.net) for fix
104        $d = @dir($directory);
105
106        while ($d && $entry=$d->read()) {
107            $getentry = false;
108            if (strcmp($entry, ".") != 0 && strcmp($entry, "..") != 0) {
109                if (substr($entry, 0, 1) != ".") $getentry = true;
110            }
111            if ($getentry == true) {
112                if (strpos($entry, '.ini'))
113                if (is_file($directory . PATH_DELIMITER . $entry)) {
114                    $ret[] = str_replace('.ini', '', $entry);
115                }
116            }
117        }
118        if ($d) $d->close();
119    } else {
120    }
121    return $ret;
122}
123
124
125/**
126 * Parse an .ini file
127 *
128 * Works like {@link parse_ini_file}, except it will take a section like:
129 *
130 * <pre>
131 * [MYVAR]
132 * value1
133 * value2
134 * value3
135 * </pre>
136 *
137 * and return an associative array(MYVAR => array(value1, value2, value3))
138 *
139 * @param string $filename         full path to the ini file
140 * @param bool   $process_sections add an associative index
141 *                                 for each section [in brackets]
142 *
143 * @return array
144 * @todo CS cleanup - rename function to PhpDocumentor_parse_ini_file
145 */
146function phpDocumentor_parse_ini_file($filename, $process_sections = false)
147{
148    $ini_array = array();
149    $sec_name  = "";
150    $lines     = @file($filename);
151    if (!$lines) return $lines;
152    foreach ($lines as $line) {
153        // code by Greg Beaver, ignore comments
154        if ($line[0] == ';') continue;
155        $line = trim($line);
156
157        if ($line == "") {
158            continue;
159        }
160        if ($line[0] == "[" && $line[strlen($line) - 1] == "]") {
161            $sec_name = substr($line, 1, strlen($line) - 2);
162        } else {
163            if (strpos($line, "=")) {
164                $pos      = strpos($line, "=");
165                $property = trim(substr($line, 0, $pos));
166                // code by Greg Beaver
167                if (substr($property, 0, 1) == '"' && substr($property, -1) == '"') {
168                    $property =
169                        stripcslashes(substr($property, 1, count($property) - 2));
170                }
171                $value = trim(substr($line, $pos + 1));
172                if ($value == 'false') $value = false;
173                if ($value == 'true') $value = true;
174                if (substr($value, 0, 1) == '"' && substr($value, -1) == '"') {
175                    $value = stripcslashes(substr($value, 1, count($value) - 2));
176                }
177                // done additions
178
179                if ($process_sections) {
180                    if ($sec_name != '')
181                    $ini_array[$sec_name][$property] = $value;
182                    else
183                    $ini_array[$property] = $value;
184                } else {
185                    $ini_array[$property] = $value;
186                }
187            } else {
188                // code by Greg Beaver
189                if (trim($line[0]) == ';') continue;
190                if ($process_sections) {
191                    $ini_array[$sec_name][] = trim($line);
192                }
193                // done additions
194            }
195        }
196    }
197    return $ini_array;
198}
199
200
201/**
202 * construct an "array_key_exists()" method
203 * if the runtime PHP version doesn't have one
204 *
205 * @todo CS Cleanup - can't avoid "prefixed by package" error
206 * @todo depend on PHP_Compat for this?
207 */
208if (!function_exists('array_key_exists')) {
209    /**
210     * Determines if a given key exists in a given array
211     *
212     * @param mixed $key    key to search for
213     * @param array $search the array of keys to search
214     *
215     * @return bool whether or not the key was found
216     * @ignore
217     */
218    function array_key_exists($key, $search)
219    {
220        foreach ($search as $keys => $nul) {
221            if ($key == $keys) return true;
222        }
223        return false;
224    }
225}
226
227/**
228 * construct an "is_a()" method
229 * if the runtime PHP version doesn't have one
230 *
231 * @todo CS Cleanup - can't avoid "prefixed by package" error
232 * @todo depend on PHP_Compat for this?
233 */
234if (!function_exists('is_a')) {
235    /**
236     * Determines if one item "is" an object of the other item
237     *
238     * @param string $classname  the class in question
239     * @param string $classquery the "is it a" class
240     *
241     * @return bool whether or not the class "is" one
242     * @ignore
243     */
244    function is_a($classname, $classquery)
245    {
246        $father = get_parent_class($classname);
247        if (strtolower($father) == strtolower($classquery)) {
248            return true;
249        } elseif (!empty($father)) {
250            return is_a($father, $classquery);
251        } else {
252            return false;
253        }
254    }
255}
256
257
258/**
259 * Debugging output
260 *
261 * @param string $s the "debug message" string to echo out
262 *
263 * @return void
264 * @todo CS Cleanup - can't avoid "prefixed by package" error
265 */
266function debug($s)
267{
268    echo "$s\n";
269}
270
271/**
272 * Returns a formatted var_dump for debugging purposes.
273 *
274 * @param string $s string to display
275 * @param mixed  $v unlimited number of variables to display with var_dump()
276 *
277 * @return void
278 */
279function fancy_debug($s,$v)
280{
281    if (isset($GLOBALS['dont_debug']) && $GLOBALS['dont_debug']) return;
282    debug($s."\n\n</pre><blockquote><pre>");
283    var_dump($v);
284    if (func_num_args()>2) {
285        for ($i=2;$i<func_num_args();$i++) {
286            $a = func_get_arg($i);
287            // debug(" ");
288            var_dump($a);
289        }
290    }
291    debug("</pre></blockquote><pre>\n\n");
292}
293
294/**
295 * Returns a lower-cased version of get_class for PHP 5
296 *
297 * get_class() returns case as declared in the file in PHP 5
298 *
299 * @param object $object the object to get the classname for
300 *
301 * @return string the class name of the given object
302 * @todo CS cleanup - rename function to PhpDocumentor_get_class
303 */
304function phpDocumentor_get_class($object)
305{
306    if (is_object($object)) {
307        return strtolower(get_class($object));
308    }
309    return false;
310}
311
312?>
313