예제 #1
0
파일: url.cpp 프로젝트: ImJezze/mame
	// https://secure.wikimedia.org/wikipedia/en/wiki/URL_encoding
	void urlEncode(char* _out, uint32_t _max, const StringView& _str)
	{
		_max--; // need space for zero terminator

		const char* str  = _str.getPtr();
		const char* term = _str.getTerm();

		uint32_t ii = 0;
		for (char ch = *str++
			; str <= term && ii < _max
			; ch = *str++
			)
		{
			if (isAlphaNum(ch)
			||  ch == '-'
			||  ch == '_'
			||  ch == '.'
			||  ch == '~')
			{
				_out[ii++] = ch;
			}
			else if (ii+3 < _max)
			{
				_out[ii++] = '%';
				_out[ii++] = toHex(ch>>4);
				_out[ii++] = toHex(ch);
			}
		}
예제 #2
0
파일: settings.cpp 프로젝트: samkusin/bx
const char* Settings::get(const StringView& _name) const
{
	ini_t* ini = INI_T(m_ini);

	FilePath uri(_name);
	const StringView  path(strTrim(uri.getPath(), "/") );
	const StringView& fileName(uri.getFileName() );
	int32_t section = INI_GLOBAL_SECTION;

	if (!path.isEmpty() )
	{
		section = ini_find_section(ini, path.getPtr(), path.getLength() );
		if (INI_NOT_FOUND == section)
		{
			section = INI_GLOBAL_SECTION;
		}
	}

	int32_t property = ini_find_property(ini, section, fileName.getPtr(), fileName.getLength() );
	if (INI_NOT_FOUND == property)
	{
		return NULL;
	}

	return ini_property_value(ini, section, property);
}
예제 #3
0
파일: settings.cpp 프로젝트: samkusin/bx
void Settings::remove(const StringView& _name) const
{
	ini_t* ini = INI_T(m_ini);

	FilePath uri(_name);
	const StringView  path     = strTrim(uri.getPath(), "/");
	const StringView& fileName = uri.getFileName();

	int32_t section = INI_GLOBAL_SECTION;

	if (!path.isEmpty() )
	{
		section = ini_find_section(ini, path.getPtr(), path.getLength() );
		if (INI_NOT_FOUND == section)
		{
			section = INI_GLOBAL_SECTION;
		}
	}

	int32_t property = ini_find_property(ini, section, fileName.getPtr(), fileName.getLength() );
	if (INI_NOT_FOUND == property)
	{
		return;
	}

	ini_property_remove(ini, section, property);

	if (INI_GLOBAL_SECTION != section
	&&  0 == ini_property_count(ini, section) )
	{
		ini_section_remove(ini, section);
	}
}
예제 #4
0
파일: settings.cpp 프로젝트: samkusin/bx
void Settings::set(const StringView& _name, const StringView& _value)
{
	ini_t* ini = INI_T(m_ini);

	FilePath uri(_name);
	const StringView  path(strTrim(uri.getPath(), "/") );
	const StringView& fileName(uri.getFileName() );

	int32_t section = INI_GLOBAL_SECTION;

	if (!path.isEmpty() )
	{
		section = ini_find_section(ini, path.getPtr(), path.getLength() );
		if (INI_NOT_FOUND == section)
		{
			section = ini_section_add(ini, path.getPtr(), path.getLength() );
		}
	}

	int32_t property = ini_find_property(ini, section, fileName.getPtr(), fileName.getLength() );
	if (INI_NOT_FOUND == property)
	{
		ini_property_add(
			  ini
			, section
			, fileName.getPtr()
			, fileName.getLength()
			, _value.getPtr()
			, _value.getLength()
			);
	}
	else
	{
		ini_property_value_set(
			  ini
			, section
			, property
			, _value.getPtr()
			, _value.getLength()
			);
	}
}
예제 #5
0
파일: url.cpp 프로젝트: ImJezze/mame
	bool UrlView::parse(const StringView& _url)
	{
		clear();

		const char* start = _url.getPtr();
		const char* term  = _url.getTerm();
		const char* schemeEnd = strFind(StringView(start, term), "://");
		const char* hostStart = NULL != schemeEnd ? schemeEnd+3 : start;
		const char* pathStart = strFind(StringView(hostStart, term), '/');

		if (NULL == schemeEnd
		&&  NULL == pathStart)
		{
			return false;
		}

		if (NULL != schemeEnd
		&& (NULL == pathStart || pathStart > schemeEnd) )
		{
			StringView scheme(start, schemeEnd);

			if (!isAlpha(scheme) )
			{
				return false;
			}

			m_tokens[Scheme].set(scheme);
		}

		if (NULL != pathStart)
		{
			const char* queryStart    = strFind(StringView(pathStart, term), '?');
			const char* fragmentStart = strFind(StringView(pathStart, term), '#');

			if (NULL != fragmentStart
			&&  fragmentStart < queryStart)
			{
				return false;
			}

			m_tokens[Path].set(pathStart
				, NULL != queryStart    ? queryStart
				: NULL != fragmentStart ? fragmentStart
				: term
				);

			if (NULL != queryStart)
			{
				m_tokens[Query].set(queryStart+1
					, NULL != fragmentStart ? fragmentStart
					: term
					);
			}

			if (NULL != fragmentStart)
			{
				m_tokens[Fragment].set(fragmentStart+1, term);
			}

			term = pathStart;
		}

		const char* userPassEnd   = strFind(StringView(hostStart, term), '@');
		const char* userPassStart = NULL != userPassEnd ? hostStart : NULL;
		hostStart = NULL != userPassEnd ? userPassEnd+1 : hostStart;
		const char* portStart = strFind(StringView(hostStart, term), ':');

		m_tokens[Host].set(hostStart, NULL != portStart ? portStart : term);

		if (NULL != portStart)
		{
			m_tokens[Port].set(portStart+1, term);
		}

		if (NULL != userPassStart)
		{
			const char* passStart = strFind(StringView(userPassStart, userPassEnd), ':');

			m_tokens[UserName].set(userPassStart
				, NULL != passStart ? passStart
				: userPassEnd
				);

			if (NULL != passStart)
			{
				m_tokens[Password].set(passStart+1, userPassEnd);
			}
		}

		return true;
	}