/*

cls_2: Curl Like Syntax
Yauheni A. Akhotnikau (C) 2001-2003
eao197@yahoo.com
-------------------------------------------------

Permission is granted to anyone to use this software for any purpose on any
computer system, and to redistribute it freely, subject to the following
restrictions:

1. This software is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

2. The origin of this software must not be misrepresented, either by
   explicit claim or by omission.

3. Altered versions must be plainly marked as such, and must not be
   misrepresented as being the original software.

-------------------------------------------------

*/
/*!
	\file
	\brief Класс потока ошибок, который отображает содержимое
		стека разбираемых тегов.
	
*/

#if !defined( _CLS_2__ES_TAG_STACK_HPP_ )
#define _CLS_2__ES_TAG_STACK_HPP_

#include <auto_ptr_3/h/obj_ptr.hpp>

#include <cls_2/h/cls.hpp>

namespace cls_2 {

//
// es_tag_stack_t
//

/*!
	\brief Класс потока ошибок, который отображает содержимое
	стека разбираемых тегов.

	Данный класс не занимается отображением ошибок на
	конкретное устройство, а использует для этого
	дополнительный поток ошибок.

	Стек тегов добавляется после каждого
	обращения к out(), когда последним символом параметра
	str является \\n.
*/
class	es_tag_stack_t :
	public error_stream_t
{
	public :
		//! Псевдоним для описания удаляемого потока ошибок.
		typedef auto_ptr_3::destroyable_obj_t< error_stream_t >
			destroyable_t;
		//! Псевдоним для описания неудаляемого потока ошибок.
		typedef auto_ptr_3::nondestroyable_obj_t< error_stream_t >
			nondestroyable_t;

		//! Простой инициализирующий конструктор.
		es_tag_stack_t(
			//! Действительный поток ошибок.
			error_stream_t & real_err_stream,
			//! Объект парсера, содержащий
			//! стек разбираемых тегов.
			const parser_t & parser );
		//! Инициализирующий конструктор.
		es_tag_stack_t(
			//! Действительный поток ошибок.
			const auto_ptr_3::obj_destruction_t< error_stream_t > & to,
			//! Объект парсера, содержащий
			//! стек разбираемых тегов.
			const parser_t & parser );
		virtual ~es_tag_stack_t();

		//! Отобразить указанную строку на поток ошибок.
		virtual error_stream_t &
		out( const char * str );

	protected :
		//! Действительный поток ошибок.
		auto_ptr_3::soft_obj_ptr_t< error_stream_t >
			m_real_err_stream;
		//! Парсер со стеком разбираемых тегов.
		const parser_t &	m_parser;
		//! Был ли найден переход на новую строку?
		bool	m_is_new_line;

		void
		show_tag_stack();
};

} /* namespace cls_2 */

#endif

