== QSESED ==

QSESED는 기존 SED스트림편집기가 제공하는 대부분의 명령어들을 지원하는 임베딩용 스트림편집기이며 [wiki:FrontPage QSE]라이브러리의 일부입니다. QSESED를 임베딩하려면 일반적으로 다음의 과정들을 따릅니다.

 * 스트림에디터 열기
 * 명령어 컴파일하기
 * 명령어 실행하기
 * 스트림에디터 닫기 

명령어를 실행하기 위해서는 텍스트를 읽어들이고, 명령어들을 적용한 후, 결과를 출력할 스트림이 필요합니다. C에서는 콜백함수로, C++에서는 IOStream클래스로 추상화되어 있습니다.  

아래의 코드는 C++용 API를 사용하여 간단한 명령형 스트림편집기를 만드는 방법을 보여줍니다.
{{{
#include <qse/sed/StdSed.hpp>
#include <qse/cmn/main.h>
#include <iostream>

#ifdef QSE_CHAR_IS_MCHAR
#	define xcout std::cout
#else
#	define xcout std::wcout
#endif

int sed_main (int argc, qse_char_t* argv[])
{
	if (argc <  2 || argc > 4)
	{
		xcout << QSE_T("USAGE: ") << argv[0]
		      << QSE_T(" command-string [input-file [output-file]]") 
		      << std::endl;
		return -1;
	}

	QSE::StdSed sed;

	// 스트림편집기를 열어서 초기화 합니다.
	if (sed.open () == -1)
	{
		// 열기에 실패한 경우에는 getErrorMessage()를 사용할 수 없으므로
		// 그냥 열수 없다는 메시지만 출력합니다.
		xcout << QSE_T("ERR: cannot open") << std::endl;
		return -1;
	}

	// 두번째 인자에 지정된 명령어들을 컴파일합니다.
	if (sed.compile (argv[1]) == -1)
	{
		xcout << QSE_T("ERR: cannot compile - ") 
		      << sed.getErrorMessage() << std::endl;
		sed.close ();
		return -1;
	}

	// 데이터를 읽고 쓸 스트림을 만듭니다.
	qse_char_t* infile = (argc >= 3)? argv[2]: QSE_NULL;
	qse_char_t* outfile = (argc >= 4)? argv[3]: QSE_NULL;
	QSE::StdSed::StdStream stream (infile, outfile);

	// 위에서 만든 스트림상에서 명령어들을 실행합니다.
	if (sed.execute (stream) == -1)
	{
		xcout << QSE_T("ERR: cannot execute - ") 
		      << sed.getErrorMessage() << std::endl;
		sed.close ();
		return -1;
	}
	
	// 스트림편집기를 닫습니다.
	sed.close ();
	return 0;
}

int qse_main (int argc, qse_achar_t* argv[])
{
	return qse_runmain (argc, argv, sed_main);
}
}}}
