/[cvs]/nfo/php/libs/net.php.smarty/Config_File.class.php
ViewVC logotype

Contents of /nfo/php/libs/net.php.smarty/Config_File.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations)
Wed Oct 9 00:45:29 2002 UTC (21 years, 9 months ago) by cvsjoko
Branch: MAIN
no message

1 <?php
2
3 /**
4 * Config_File class.
5 *
6 * @version 2.3.0
7 * @author Andrei Zmievski <andrei@php.net>
8 * @access public
9 *
10 * Copyright: 2001,2002 ispi of Lincoln, Inc.
11 *
12 * This library is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public
14 * License as published by the Free Software Foundation; either
15 * version 2.1 of the License, or (at your option) any later version.
16 *
17 * This library is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
21 *
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this library; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 *
26 * You may contact the author of Config_File by e-mail at:
27 * andrei@php.net
28 *
29 * Or, write to:
30 * Andrei Zmievski
31 * Software Engineer, ispi
32 * 237 S. 70th suite 220
33 * Lincoln, NE 68510
34 *
35 * The latest version of Config_File can be obtained from:
36 * http://www.phpinsider.com
37 */
38
39 class Config_File {
40 /* Options */
41 /**
42 * Controls whether variables with the same name overwrite each other.
43 *
44 * @access public
45 */
46 var $overwrite = true;
47
48 /**
49 * Controls whether config values of on/true/yes and off/false/no get
50 * converted to boolean values automatically.
51 *
52 * @access public
53 */
54 var $booleanize = true;
55
56 /**
57 * Controls whether hidden config sections/vars are read from the file.
58 *
59 * @access public
60 */
61 var $read_hidden = true;
62
63 /* Private variables */
64 var $_config_path = "";
65 var $_config_data = array();
66 var $_separator = "";
67
68
69 /**
70 * Constructs a new config file class.
71 *
72 * @param $config_path string (optional) path to the config files
73 * @access public
74 */
75 function Config_File($config_path = NULL)
76 {
77 if (substr(PHP_OS, 0, 3) == "WIN" || substr(PHP_OS, 0, 4) == "OS/2")
78 $this->_separator = "\\";
79 else
80 $this->_separator = "/";
81
82 if (isset($config_path))
83 $this->set_path($config_path);
84 }
85
86
87 /**
88 * Set the path where configuration files can be found.
89 *
90 * @param $config_path string path to the config files
91 * @access public
92 */
93 function set_path($config_path)
94 {
95 if (!empty($config_path)) {
96 if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) {
97 $this->_trigger_error_msg("Bad config file path '$config_path'");
98 return;
99 }
100
101 $this->_config_path = $config_path . $this->_separator;
102 }
103 }
104
105
106 /**
107 * Retrieves config info based on the file, section, and variable name.
108 *
109 * @access public
110 * @param $file_name string config file to get info for
111 * @param $section_name string (optional) section to get info for
112 * @param $var_name string (optional) variable to get info for
113 * @return mixed a value or array of values
114 */
115 function &get($file_name, $section_name = NULL, $var_name = NULL)
116 {
117 if (empty($file_name)) {
118 $this->_trigger_error_msg('Empty config file name');
119 return;
120 } else {
121 $file_name = $this->_config_path . $file_name;
122 if (!isset($this->_config_data[$file_name]))
123 $this->load_file($file_name, false);
124 }
125
126 if (!empty($var_name)) {
127 if (empty($section_name)) {
128 return $this->_config_data[$file_name]["vars"][$var_name];
129 } else {
130 if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]))
131 return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name];
132 else
133 return array();
134 }
135 } else {
136 if (empty($section_name)) {
137 return (array)$this->_config_data[$file_name]["vars"];
138 } else {
139 if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"]))
140 return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"];
141 else
142 return array();
143 }
144 }
145 }
146
147
148 /**
149 * Retrieves config info based on the key.
150 *
151 * @access public
152 * @param $file_name string config key (filename/section/var)
153 * @return mixed a value or array of values
154 */
155 function &get_key($config_key)
156 {
157 list($file_name, $section_name, $var_name) = explode('/', $config_key, 3);
158 $result = &$this->get($file_name, $section_name, $var_name);
159 return $result;
160 }
161
162 /**
163 * Get all loaded config file names.
164 *
165 * @access public
166 * @return array an array of loaded config file names
167 */
168 function get_file_names()
169 {
170 return array_keys($this->_config_data);
171 }
172
173
174 /**
175 * Get all section names from a loaded file.
176 *
177 * @access public
178 * @param $file_name string config file to get section names from
179 * @return array an array of section names from the specified file
180 */
181 function get_section_names($file_name)
182 {
183 $file_name = $this->_config_path . $file_name;
184 if (!isset($this->_config_data[$file_name])) {
185 $this->_trigger_error_msg("Unknown config file '$file_name'");
186 return;
187 }
188
189 return array_keys($this->_config_data[$file_name]["sections"]);
190 }
191
192
193 /**
194 * Get all global or section variable names.
195 *
196 * @access public
197 * @param $file_name string config file to get info for
198 * @param $section_name string (optional) section to get info for
199 * @return array an array of variables names from the specified file/section
200 */
201 function get_var_names($file_name, $section = NULL)
202 {
203 if (empty($file_name)) {
204 $this->_trigger_error_msg('Empty config file name');
205 return;
206 } else if (!isset($this->_config_data[$file_name])) {
207 $this->_trigger_error_msg("Unknown config file '$file_name'");
208 return;
209 }
210
211 if (empty($section))
212 return array_keys($this->_config_data[$file_name]["vars"]);
213 else
214 return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]);
215 }
216
217
218 /**
219 * Clear loaded config data for a certain file or all files.
220 *
221 * @access public
222 * @param $file_name string file to clear config data for
223 */
224 function clear($file_name = NULL)
225 {
226 if ($file_name === NULL)
227 $this->_config_data = array();
228 else if (isset($this->_config_data[$file_name]))
229 $this->_config_data[$file_name] = array();
230 }
231
232
233 /**
234 * Load a configuration file manually.
235 *
236 * @access public
237 * @param $file_name string file name to load
238 * @param $prepend_path boolean whether current config path should be prepended to the filename
239 */
240 function load_file($file_name, $prepend_path = true)
241 {
242 if ($prepend_path && $this->_config_path != "")
243 $config_file = $this->_config_path . $file_name;
244 else
245 $config_file = $file_name;
246
247 ini_set('track_errors', true);
248 $fp = @fopen($config_file, "r");
249 if (!is_resource($fp)) {
250 $this->_trigger_error_msg("Could not open config file '$config_file'");
251 return;
252 }
253
254 $contents = fread($fp, filesize($config_file));
255 fclose($fp);
256
257 $config_data = array();
258
259 /* Get global variables first. */
260 if (preg_match("/^(.*?)(\n\[|\Z)/s", $contents, $match))
261 $config_data["vars"] = $this->_parse_config_block($match[1]);
262
263 /* Get section variables. */
264 $config_data["sections"] = array();
265 preg_match_all("/^\[(.*?)\]/m", $contents, $match);
266 foreach ($match[1] as $section) {
267 if ($section{0} == '.' && !$this->read_hidden)
268 continue;
269 if (preg_match("/\[".preg_quote($section)."\](.*?)(\n\[|\Z)/s", $contents, $match))
270 if ($section{0} == '.')
271 $section = substr($section, 1);
272 $config_data["sections"][$section]["vars"] = $this->_parse_config_block($match[1]);
273 }
274
275 $this->_config_data[$config_file] = $config_data;
276 }
277
278
279 function _parse_config_block($config_block)
280 {
281 $vars = array();
282
283 /* First we grab the multi-line values. */
284 if (preg_match_all("/^([^=\n]+)=\s*\"{3}(.*?)\"{3}\s*$/ms", $config_block, $match, PREG_SET_ORDER)) {
285 for ($i = 0; $i < count($match); $i++) {
286 $this->_set_config_var($vars, trim($match[$i][1]), $match[$i][2], false);
287 }
288 $config_block = preg_replace("/^[^=\n]+=\s*\"{3}.*?\"{3}\s*$/ms", "", $config_block);
289 }
290
291
292 $config_lines = preg_split("/\n+/", $config_block);
293
294 foreach ($config_lines as $line) {
295 if (preg_match("/^\s*(\.?\w+)\s*=(.*)/", $line, $match)) {
296 $var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', trim($match[2]));
297 $this->_set_config_var($vars, trim($match[1]), $var_value, $this->booleanize);
298 }
299 }
300
301 return $vars;
302 }
303
304 function _set_config_var(&$container, $var_name, $var_value, $booleanize)
305 {
306 if ($var_name{0} == '.') {
307 if (!$this->read_hidden)
308 return;
309 else
310 $var_name = substr($var_name, 1);
311 }
312
313 if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) {
314 $this->_trigger_error_msg("Bad variable name '$var_name'");
315 return;
316 }
317
318 if ($booleanize) {
319 if (preg_match("/^(on|true|yes)$/i", $var_value))
320 $var_value = true;
321 else if (preg_match("/^(off|false|no)$/i", $var_value))
322 $var_value = false;
323 }
324
325 if (!isset($container[$var_name]) || $this->overwrite)
326 $container[$var_name] = $var_value;
327 else {
328 settype($container[$var_name], 'array');
329 $container[$var_name][] = $var_value;
330 }
331 }
332
333 function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING)
334 {
335 trigger_error("Config_File error: $error_msg", $error_type);
336 }
337 }
338
339 ?>

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed