changed Source IO model in Awk
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: Awk.cpp 225 2009-07-08 13:01:45Z hyunghwan.chung $ | ||||
|  * $Id: Awk.cpp 226 2009-07-09 12:46:14Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -39,25 +39,6 @@ struct rxtn_t | ||||
| 	Awk::Run* run; | ||||
| }; | ||||
|  | ||||
| Awk::Source::Source (Mode mode): mode (mode), handle (QSE_NULL) | ||||
| { | ||||
| } | ||||
|  | ||||
| Awk::Source::Mode Awk::Source::getMode () const | ||||
| { | ||||
| 	return this->mode; | ||||
| } | ||||
|  | ||||
| const void* Awk::Source::getHandle () const | ||||
| { | ||||
| 	return this->handle; | ||||
| } | ||||
|  | ||||
| void Awk::Source::setHandle (void* handle) | ||||
| { | ||||
| 	this->handle = handle; | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////// | ||||
| // Awk::RIO | ||||
| ////////////////////////////////////////////////////////////////// | ||||
| @ -1067,7 +1048,7 @@ int Awk::Run::getGlobal (int id, Argument& gbl) const | ||||
| ////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| Awk::Awk () throw (): awk (QSE_NULL), functionMap (QSE_NULL), | ||||
| 	sourceIn (Source::READ), sourceOut (Source::WRITE), | ||||
| 	sourceIn (this, Source::READ), sourceOut (this, Source::WRITE), | ||||
| 	errnum (ERR_NOERR), errlin (0), runCallback (false),  | ||||
| 	runctx (this) | ||||
|  | ||||
| @ -1329,15 +1310,18 @@ int Awk::unsetAllWords () | ||||
| 	return qse_awk_setword (awk, QSE_NULL, 0, QSE_NULL, 0); | ||||
| } | ||||
|  | ||||
| Awk::Run* Awk::parse () | ||||
| Awk::Run* Awk::parse (Source* in, Source* out) | ||||
| { | ||||
| 	QSE_ASSERT (awk != QSE_NULL); | ||||
|  | ||||
| 	fini_runctx (); | ||||
|  | ||||
| 	sourceReader = in; | ||||
| 	sourceWriter = out; | ||||
|  | ||||
| 	qse_awk_sio_t sio; | ||||
| 	sio.in = sourceReader; | ||||
| 	sio.out = sourceWriter; | ||||
| 	sio.in = readSource; | ||||
| 	sio.out = (sourceWriter == QSE_NULL)? QSE_NULL: writeSource; | ||||
|  | ||||
| 	int n = qse_awk_parse (awk, &sio); | ||||
| 	if (n <= -1)  | ||||
| @ -1657,7 +1641,7 @@ void Awk::onStatement (Run& run, size_t line) | ||||
| { | ||||
| } | ||||
|  | ||||
| Awk::ssize_t Awk::sourceReader ( | ||||
| Awk::ssize_t Awk::readSource ( | ||||
| 	awk_t* awk, qse_awk_sio_cmd_t cmd, char_t* data, size_t count) | ||||
| { | ||||
| 	xtn_t* xtn = (xtn_t*) QSE_XTN (awk); | ||||
| @ -1665,19 +1649,17 @@ Awk::ssize_t Awk::sourceReader ( | ||||
| 	switch (cmd) | ||||
| 	{ | ||||
| 		case QSE_AWK_SIO_OPEN: | ||||
| 			return xtn->awk->openSource (xtn->awk->sourceIn); | ||||
| 			return xtn->awk->sourceReader->open (xtn->awk->sourceIn); | ||||
| 		case QSE_AWK_SIO_CLOSE: | ||||
| 			return xtn->awk->closeSource (xtn->awk->sourceIn); | ||||
| 			return xtn->awk->sourceReader->close (xtn->awk->sourceIn); | ||||
| 		case QSE_AWK_SIO_READ: | ||||
| 			return xtn->awk->readSource (xtn->awk->sourceIn, data, count); | ||||
| 		case QSE_AWK_SIO_WRITE: | ||||
| 			return xtn->awk->sourceReader->read (xtn->awk->sourceIn, data, count); | ||||
| 		default: | ||||
| 			return -1; | ||||
| 	} | ||||
|  | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| Awk::ssize_t Awk::sourceWriter ( | ||||
| Awk::ssize_t Awk::writeSource ( | ||||
| 	awk_t* awk, qse_awk_sio_cmd_t cmd, char_t* data, size_t count) | ||||
| { | ||||
| 	xtn_t* xtn = (xtn_t*) QSE_XTN (awk); | ||||
| @ -1685,16 +1667,14 @@ Awk::ssize_t Awk::sourceWriter ( | ||||
| 	switch (cmd) | ||||
| 	{ | ||||
| 		case QSE_AWK_SIO_OPEN: | ||||
| 			return xtn->awk->openSource (xtn->awk->sourceOut); | ||||
| 			return xtn->awk->sourceWriter->open (xtn->awk->sourceOut); | ||||
| 		case QSE_AWK_SIO_CLOSE: | ||||
| 			return xtn->awk->closeSource (xtn->awk->sourceOut); | ||||
| 			return xtn->awk->sourceWriter->close (xtn->awk->sourceOut); | ||||
| 		case QSE_AWK_SIO_WRITE: | ||||
| 			return xtn->awk->writeSource (xtn->awk->sourceOut, data, count); | ||||
| 		case QSE_AWK_SIO_READ: | ||||
| 			return xtn->awk->sourceWriter->write (xtn->awk->sourceOut, data, count); | ||||
| 		default: | ||||
| 			return -1; | ||||
| 	} | ||||
|  | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| Awk::ssize_t Awk::pipeHandler ( | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: StdAwk.cpp 225 2009-07-08 13:01:45Z hyunghwan.chung $ | ||||
|  * $Id: StdAwk.cpp 226 2009-07-09 12:46:14Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -81,24 +81,6 @@ void StdAwk::close () | ||||
| 	Awk::close (); | ||||
| } | ||||
|  | ||||
| int StdAwk::addConsoleOutput (const char_t* arg, size_t len) | ||||
| { | ||||
| 	QSE_ASSERT (awk != QSE_NULL); | ||||
| 	int n = ofile.add (awk, arg, len); | ||||
| 	if (n <= -1) setError (ERR_NOMEM); | ||||
| 	return n; | ||||
| } | ||||
|  | ||||
| int StdAwk::addConsoleOutput (const char_t* arg) | ||||
| { | ||||
| 	return addConsoleOutput (arg, qse_strlen(arg)); | ||||
| } | ||||
|  | ||||
| void StdAwk::clearConsoleOutputs () | ||||
| { | ||||
| 	ofile.clear (awk); | ||||
| } | ||||
|  | ||||
| int StdAwk::sin (Run& run, Return& ret, const Argument* args, size_t nargs,  | ||||
| 	const char_t* name, size_t len) | ||||
| { | ||||
| @ -300,22 +282,22 @@ int StdAwk::openPipe (Pipe& io) | ||||
| {  | ||||
| 	Awk::Pipe::Mode mode = io.getMode(); | ||||
| 	qse_pio_t* pio = QSE_NULL; | ||||
| 	int flags; | ||||
| 	int flags = QSE_PIO_TEXT | QSE_PIO_SHELL; | ||||
|  | ||||
| 	switch (mode) | ||||
| 	{ | ||||
| 		case Awk::Pipe::READ: | ||||
| 			/* TODO: should we specify ERRTOOUT? */ | ||||
| 			flags = QSE_PIO_READOUT | | ||||
| 			        QSE_PIO_ERRTOOUT; | ||||
| 			flags |= QSE_PIO_READOUT | | ||||
| 			         QSE_PIO_ERRTOOUT; | ||||
| 			break; | ||||
| 		case Awk::Pipe::WRITE: | ||||
| 			flags = QSE_PIO_WRITEIN; | ||||
| 			flags |= QSE_PIO_WRITEIN; | ||||
| 			break; | ||||
| 		case Awk::Pipe::RW: | ||||
| 			flags = QSE_PIO_READOUT | | ||||
| 			        QSE_PIO_ERRTOOUT | | ||||
| 			        QSE_PIO_WRITEIN; | ||||
| 			flags |= QSE_PIO_READOUT | | ||||
| 			         QSE_PIO_ERRTOOUT | | ||||
| 			         QSE_PIO_WRITEIN; | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| @ -323,7 +305,7 @@ int StdAwk::openPipe (Pipe& io) | ||||
| 		((Awk*)io)->getMmgr(), | ||||
| 		0,  | ||||
| 		io.getName(),  | ||||
| 		flags|QSE_PIO_TEXT|QSE_PIO_SHELL | ||||
| 		flags | ||||
| 	); | ||||
| 	if (pio == QSE_NULL) return -1; | ||||
|  | ||||
| @ -352,26 +334,25 @@ int StdAwk::flushPipe (Pipe& io) | ||||
| 	return qse_pio_flush ((qse_pio_t*)io.getHandle(), QSE_PIO_IN);  | ||||
| } | ||||
|  | ||||
| // file io handlers  | ||||
| int StdAwk::openFile (File& io)  | ||||
| {  | ||||
| 	Awk::File::Mode mode = io.getMode(); | ||||
| 	qse_fio_t* fio = QSE_NULL; | ||||
| 	int flags; | ||||
| 	int flags = QSE_FIO_TEXT; | ||||
|  | ||||
| 	switch (mode) | ||||
| 	{ | ||||
| 		case Awk::File::READ: | ||||
| 			flags = QSE_FIO_READ; | ||||
| 			flags |= QSE_FIO_READ; | ||||
| 			break; | ||||
| 		case Awk::File::WRITE: | ||||
| 			flags = QSE_FIO_WRITE |  | ||||
| 			        QSE_FIO_CREATE |  | ||||
| 			        QSE_FIO_TRUNCATE; | ||||
| 			flags |= QSE_FIO_WRITE |  | ||||
| 			         QSE_FIO_CREATE |  | ||||
| 			         QSE_FIO_TRUNCATE; | ||||
| 			break; | ||||
| 		case Awk::File::APPEND: | ||||
| 			flags = QSE_FIO_APPEND | | ||||
| 			        QSE_FIO_CREATE; | ||||
| 			flags |= QSE_FIO_APPEND | | ||||
| 			         QSE_FIO_CREATE; | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| @ -379,7 +360,7 @@ int StdAwk::openFile (File& io) | ||||
| 		((Awk*)io)->getMmgr(), | ||||
| 		0,  | ||||
| 		io.getName(),  | ||||
| 		flags | QSE_FIO_TEXT, | ||||
| 		flags, | ||||
| 		QSE_FIO_RUSR | QSE_FIO_WUSR | | ||||
| 		QSE_FIO_RGRP | QSE_FIO_ROTH | ||||
| 	);	 | ||||
| @ -410,7 +391,24 @@ int StdAwk::flushFile (File& io) | ||||
| 	return qse_fio_flush ((qse_fio_t*)io.getHandle()); | ||||
| } | ||||
|  | ||||
| // console io handlers  | ||||
| int StdAwk::addConsoleOutput (const char_t* arg, size_t len) | ||||
| { | ||||
| 	QSE_ASSERT (awk != QSE_NULL); | ||||
| 	int n = ofile.add (awk, arg, len); | ||||
| 	if (n <= -1) setError (ERR_NOMEM); | ||||
| 	return n; | ||||
| } | ||||
|  | ||||
| int StdAwk::addConsoleOutput (const char_t* arg) | ||||
| { | ||||
| 	return addConsoleOutput (arg, qse_strlen(arg)); | ||||
| } | ||||
|  | ||||
| void StdAwk::clearConsoleOutputs () | ||||
| { | ||||
| 	ofile.clear (awk); | ||||
| } | ||||
|  | ||||
| int StdAwk::open_console_in (Console& io)  | ||||
| {  | ||||
| 	qse_awk_rtx_t* rtx = (rtx_t*)io; | ||||
| @ -754,6 +752,81 @@ int StdAwk::vsprintf ( | ||||
| 	return qse_vsprintf (buf, size, fmt, arg); | ||||
| } | ||||
|  | ||||
| int StdAwk::SourceFile::open (Data& io) | ||||
| { | ||||
| 	qse_sio_t* sio; | ||||
|  | ||||
| 	if (name[0] == QSE_T('-') && | ||||
| 	    name[1] == QSE_T('\0')) | ||||
| 	{ | ||||
| 		sio = (io.getMode() == READ)? qse_sio_in: qse_sio_out; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		sio = qse_sio_open ( | ||||
| 			((awk_t*)io)->mmgr, | ||||
| 			0, | ||||
| 			name, | ||||
| 			(io.getMode() == READ?  | ||||
| 				QSE_SIO_READ:  | ||||
| 				(QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE)) | ||||
| 		); | ||||
| 		if (sio == QSE_NULL) return -1; | ||||
| 	} | ||||
|  | ||||
| 	io.setHandle (sio); | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| int StdAwk::SourceFile::close (Data& io) | ||||
| { | ||||
| 	qse_sio_t* sio = (qse_sio_t*)io.getHandle(); | ||||
|  | ||||
| 	qse_sio_flush (sio); | ||||
|  | ||||
| 	if (sio != qse_sio_in && sio != qse_sio_out && sio != qse_sio_err) | ||||
| 	{ | ||||
| 		qse_sio_close (sio); | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| StdAwk::ssize_t StdAwk::SourceFile::read (Data& io, char_t* buf, size_t len) | ||||
| { | ||||
| 	return qse_sio_getsn ((qse_sio_t*)io.getHandle(), buf, len); | ||||
| } | ||||
|  | ||||
| StdAwk::ssize_t StdAwk::SourceFile::write (Data& io, char_t* buf, size_t len) | ||||
| { | ||||
| 	return qse_sio_putsn ((qse_sio_t*)io.getHandle(), buf, len); | ||||
| } | ||||
|  | ||||
| int StdAwk::SourceString::open (Data& io) | ||||
| { | ||||
| 	/* SourceString does not support writing */ | ||||
| 	if (io.getMode() == WRITE) return -1; | ||||
| 	ptr = str; | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| int StdAwk::SourceString::close (Data& io) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| StdAwk::ssize_t StdAwk::SourceString::read (Data& io, char_t* buf, size_t len) | ||||
| { | ||||
| 	qse_size_t n = 0; | ||||
| 	while (*ptr != QSE_T('\0') && n < len) buf[n++] = *ptr++; | ||||
| 	return n; | ||||
| } | ||||
|  | ||||
| StdAwk::ssize_t StdAwk::SourceString::write (Data& io, char_t* buf, size_t len) | ||||
| { | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| ///////////////////////////////// | ||||
| QSE_END_NAMESPACE(QSE) | ||||
| ///////////////////////////////// | ||||
|  | ||||
		Reference in New Issue
	
	Block a user