https-bitbucket.org-bityvip /libraries/gantry/core/utilities/registry/format/ini.php

Language PHP Lines 211
MD5 Hash 46571de8124ba49fb254ae1177104458 Estimated Cost $2,585 (why?)
Repository https://bitbucket.org/izubizarreta/https-bitbucket.org-bityvip.git View Raw File View Project SPDX
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
<?php
/**
 * @version   3.2.22 August 3, 2012
 * @author    RocketTheme http://www.rockettheme.com
 * @copyright Copyright (C) 2007 - 2012 RocketTheme, LLC
 * @license   http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 only
 *
 * derived from Joomla with original copyright and license
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('GANTRY_VERSION') or die;

/**
 * INI format handler for GantryRegistry.
 *
 * @package		Joomla.Framework
 * @subpackage	Registry
 * @since		1.5
 */
class GantryRegistryFormatINI extends GantryRegistryFormat
{
	private static $cache = array();

	/**
	 * Converts an object into an INI formatted string
	 *	-	Unfortunately, there is no way to have ini values nested further than two
	 *		levels deep.  Therefore we will only go through the first two levels of
	 *		the object.
	 *
	 * @param	object	Data source object.
	 * @param	array	Options used by the formatter.
	 * @return	string	INI formatted string.
	 * @since	1.5
	 */
	public function objectToString($object, $options = array())
	{
		// Initialize variables.
		$local  = array();
		$global = array();

		// Iterate over the object to set the properties.
		foreach (get_object_vars($object) as $key => $value) {
			// If the value is an object then we need to put it in a local section.
			if (is_object($value)) {
				// Add the section line.
				$local[] = '';
				$local[] = '['.$key.']';

				// Add the properties for this section.
				foreach (get_object_vars($value) as $k => $v) {
					$local[] = $k.'='.$this->_getValueAsINI($v);
				}
			} else {
				// Not in a section so add the property to the global array.
				$global[] = $key.'='.$this->_getValueAsINI($value);
			}
		}

		return implode("\n", array_merge($global, $local));
	}

	/**
	 * Parse an INI formatted string and convert it into an object.
	 *
	 * @param	string	INI formatted string to convert.
	 * @param	mixed	An array of options used by the formatter, or a boolean setting to process sections.
	 * @return	object	Data object.
	 * @since	1.5
	 */
	public function stringToObject($data, $options = array())
	{
		// Initialise options.
		if (is_array($options)) {
			$sections = (isset($options['processSections'])) ? $options['processSections'] : false;
		} else {
			// Backward compatibility for 1.5 usage.
			$sections = (boolean) $options;
		}

		// Check the memory cache for already processed strings.
		$hash = md5($data.':'.(int) $sections);
		if (isset(self::$cache[$hash])) {
			return self::$cache[$hash];
		}

		// If no lines present just return the object.
		if (empty($data)) {
			return new stdClass;
		}

		// Initialize variables.
		$obj = new stdClass();
		$section = false;
		$lines = explode("\n", $data);

		// Process the lines.
		foreach ($lines as $line) {
			// Trim any unnecessary whitespace.
			$line = trim($line);

			// Ignore empty lines and comments.
			if (empty($line) || ($line{0} == ';')) {
				continue;
			}

			if ($sections) {
				$length = strlen($line);

				// If we are processing sections and the line is a section add the object and continue.
				if (($line[0] == '[') && ($line[$length-1] == ']')) {
					$section = substr($line, 1, $length-2);
					$obj->$section = new stdClass();
					continue;
				}
			} else if ($line{0} == '[') {
				continue;
			}

			// Check that an equal sign exists and is not the first character of the line.
			if (!strpos($line, '=')) {
				// Maybe throw exception?
				continue;
			}

			// Get the key and value for the line.
			list($key, $value) = explode('=', $line, 2);

			// Validate the key.
			if (preg_match('/[^A-Z0-9_]/i', $key)) {
				// Maybe throw exception?
				continue;
			}

			// If the value is quoted then we assume it is a string.
			$length = strlen($value);
			if ($length && ($value[0] == '"') && ($value[$length-1] == '"')) {
				// Strip the quotes and Convert the new line characters.
				$value = stripcslashes(substr($value, 1, ($length-2)));
				$value = str_replace('\n', "\n", $value);
			} else {
				// If the value is not quoted, we assume it is not a string.

				// If the value is 'false' assume boolean false.
				if ($value == 'false') {
					$value = false;
				}
				// If the value is 'true' assume boolean true.
				elseif ($value == 'true') {
					$value = true;
				}
				// If the value is numeric than it is either a float or int.
				elseif (is_numeric($value)) {
					// If there is a period then we assume a float.
					if (strpos($value, '.') !== false) {
						$value = (float) $value;
					}
					else {
						$value = (int) $value;
					}
				}
			}

			// If a section is set add the key/value to the section, otherwise top level.
			if ($section) {
				$obj->$section->$key = $value;
			} else {
				$obj->$key = $value;
			}
		}

		// Cache the string to save cpu cycles -- thus the world :)
		self::$cache[$hash] = clone($obj);

		return $obj;
	}

	/**
	 * Method to get a value in an INI format.
	 *
	 * @param	mixed	The value to convert to INI format.
	 * @return	string	The value in INI format.
	 * @since	1.6
	 */
	protected function _getValueAsINI($value)
	{
		// Initialize variables.
		$string = '';

		switch (gettype($value)) {
			case 'integer':
			case 'double':
				$string = $value;
				break;

			case 'boolean':
				$string = $value ? 'true' : 'false';
				break;

			case 'string':
				// Sanitize any CRLF characters..
				$string = '"'.str_replace(array("\r\n", "\n"), '\\n', $value).'"';
				break;
		}

		return $string;
	}
}
Back to Top