added code for the StdSed class
This commit is contained in:
		| @ -40,19 +40,51 @@ public: | |||||||
|  |  | ||||||
| 	int open () throw (); | 	int open () throw (); | ||||||
| 	void close () throw (); | 	void close () throw (); | ||||||
|  |  | ||||||
|  | 	int compile (const char_t* sptr) throw (); | ||||||
| 	int compile (const char_t* sptr, size_t slen) throw (); | 	int compile (const char_t* sptr, size_t slen) throw (); | ||||||
|  |  | ||||||
| 	int execute () throw (); | 	int execute () throw (); | ||||||
|  |  | ||||||
|  | 	class IO | ||||||
|  | 	{ | ||||||
|  | 	public: | ||||||
|  | 		friend class Sed; | ||||||
|  |  | ||||||
|  | 	protected: | ||||||
|  | 		IO (sed_io_arg_t* arg): arg(arg) {} | ||||||
|  |  | ||||||
|  | 	public: | ||||||
|  | 		const char_t* getPath () const | ||||||
|  | 		{ | ||||||
|  | 			return arg->path; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		const void* getHandle () const | ||||||
|  | 		{ | ||||||
|  | 			return arg->handle; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		void setHandle (void* handle) | ||||||
|  | 		{ | ||||||
|  | 			arg->handle = handle; | ||||||
|  | 		}		 | ||||||
|  |  | ||||||
|  | 	protected: | ||||||
|  | 		sed_io_arg_t* arg; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	sed_t* sed; | 	sed_t* sed; | ||||||
|  |  | ||||||
| 	virtual int openIn (const char_t* path) = 0; | 	virtual int openInput (IO& io) = 0; | ||||||
| 	virtual int closeIn () = 0; | 	virtual int closeInput (IO& io) = 0; | ||||||
| 	virtual ssize_t readIn (char_t* buf, size_t len) = 0; | 	virtual ssize_t readInput (IO& io, char_t* buf, size_t len) = 0; | ||||||
|  |  | ||||||
| 	virtual int openOut (const char_t* path) = 0; | 	virtual int openOutput (IO& io) = 0; | ||||||
| 	virtual int closeOut () = 0; | 	virtual int closeOutput (IO& io) = 0; | ||||||
| 	virtual ssize_t writeOut (const char_t* buf, size_t len) = 0; | 	virtual ssize_t writeOutput ( | ||||||
|  | 		IO& io, const char_t* data, size_t len) = 0; | ||||||
|  |  | ||||||
| private: | private: | ||||||
| 	static int xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg); | 	static int xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg); | ||||||
|  | |||||||
| @ -27,12 +27,18 @@ QSE_BEGIN_NAMESPACE(QSE) | |||||||
|  |  | ||||||
| class StdSed: public Sed | class StdSed: public Sed | ||||||
| { | { | ||||||
| public: |  | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	void* allocMem   (qse_size_t n)            throw (); | 	void* allocMem   (qse_size_t n)            throw (); | ||||||
| 	void* reallocMem (void* ptr, qse_size_t n) throw (); | 	void* reallocMem (void* ptr, qse_size_t n) throw (); | ||||||
| 	void  freeMem    (void* ptr)               throw (); | 	void  freeMem    (void* ptr)               throw (); | ||||||
|  |  | ||||||
|  | 	int openInput (IO& io); | ||||||
|  | 	int closeInput (IO& io); | ||||||
|  | 	ssize_t readInput (IO& io, char_t* buf, size_t len); | ||||||
|  |  | ||||||
|  | 	int openOutput (IO& io); | ||||||
|  | 	int closeOutput (IO& io); | ||||||
|  | 	ssize_t writeOutput (IO& io, const char_t* data, size_t len); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
|  | |||||||
| @ -122,34 +122,27 @@ typedef enum qse_sed_io_cmd_t qse_sed_io_cmd_t; | |||||||
| /** | /** | ||||||
|  * The qse_sed_io_arg_t type defines a data structure required by an IO handler. |  * The qse_sed_io_arg_t type defines a data structure required by an IO handler. | ||||||
|  */ |  */ | ||||||
| union qse_sed_io_arg_t | struct qse_sed_io_arg_t | ||||||
| { | { | ||||||
|  | 	void*             handle; | ||||||
|  | 	const qse_char_t* path; | ||||||
|  |  | ||||||
|  | 	union  | ||||||
|  | 	{ | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 		void*             handle; /* out */ | 			qse_char_t*       buf; | ||||||
| 		const qse_char_t* path;   /* in */ | 			qse_size_t        len; | ||||||
| 	} open; | 		} r; | ||||||
|  |  | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 		void*             handle; /* in */ | 			const qse_char_t* data; | ||||||
| 		qse_char_t*       buf;    /* out */ | 			qse_size_t        len; | ||||||
| 		qse_size_t        len;    /* in */ | 		} w; | ||||||
| 	} read; | 	} u; | ||||||
|  |  | ||||||
| 	struct |  | ||||||
| 	{ |  | ||||||
| 		void*             handle;  /* in */ |  | ||||||
| 		const qse_char_t* data;    /* in */ |  | ||||||
| 		qse_size_t        len;     /* in */ |  | ||||||
| 	} write; |  | ||||||
|  |  | ||||||
| 	struct |  | ||||||
| 	{ |  | ||||||
| 		void*             handle;  /* in */ |  | ||||||
| 	} close; |  | ||||||
| }; | }; | ||||||
| typedef union qse_sed_io_arg_t qse_sed_io_arg_t; | typedef struct qse_sed_io_arg_t qse_sed_io_arg_t; | ||||||
|  |  | ||||||
| /**  | /**  | ||||||
|  * The qse_sed_io_fun_t type defines an IO handler. An IO handler is called by |  * The qse_sed_io_fun_t type defines an IO handler. An IO handler is called by | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: StdAwk.cpp 148 2009-05-20 10:44:47Z hyunghwan.chung $ |  * $Id: StdAwk.cpp 158 2009-05-26 13:29:47Z hyunghwan.chung $ | ||||||
|  * |  * | ||||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. |    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||||
|  |  | ||||||
| @ -343,16 +343,16 @@ int StdAwk::openFile (File& io) | |||||||
| 	switch (mode) | 	switch (mode) | ||||||
| 	{ | 	{ | ||||||
| 		case Awk::File::READ: | 		case Awk::File::READ: | ||||||
| 			flags = QSE_SIO_READ; | 			flags = QSE_FIO_READ; | ||||||
| 			break; | 			break; | ||||||
| 		case Awk::File::WRITE: | 		case Awk::File::WRITE: | ||||||
| 			flags = QSE_SIO_WRITE |  | 			flags = QSE_FIO_WRITE |  | ||||||
| 			        QSE_SIO_CREATE |  | 			        QSE_FIO_CREATE |  | ||||||
| 			        QSE_SIO_TRUNCATE; | 			        QSE_FIO_TRUNCATE; | ||||||
| 			break; | 			break; | ||||||
| 		case Awk::File::APPEND: | 		case Awk::File::APPEND: | ||||||
| 			flags = QSE_SIO_APPEND | | 			flags = QSE_FIO_APPEND | | ||||||
| 			        QSE_SIO_CREATE; | 			        QSE_FIO_CREATE; | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -360,7 +360,7 @@ int StdAwk::openFile (File& io) | |||||||
| 		((Awk*)io)->getMmgr(), | 		((Awk*)io)->getMmgr(), | ||||||
| 		0,  | 		0,  | ||||||
| 		io.getName(),  | 		io.getName(),  | ||||||
| 		flags, | 		flags | QSE_FIO_TEXT, | ||||||
| 		QSE_FIO_RUSR | QSE_FIO_WUSR | | 		QSE_FIO_RUSR | QSE_FIO_WUSR | | ||||||
| 		QSE_FIO_RGRP | QSE_FIO_ROTH | 		QSE_FIO_RGRP | QSE_FIO_ROTH | ||||||
| 	);	 | 	);	 | ||||||
|  | |||||||
| @ -48,6 +48,12 @@ void Sed::close () throw() | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int Sed::compile (const char_t* sptr) throw () | ||||||
|  | { | ||||||
|  | 	QSE_ASSERT (sed != QSE_NULL); | ||||||
|  | 	return qse_sed_comp (sed, sptr, qse_strlen(sptr)); | ||||||
|  | } | ||||||
|  |  | ||||||
| int Sed::compile (const char_t* sptr, size_t slen) throw () | int Sed::compile (const char_t* sptr, size_t slen) throw () | ||||||
| { | { | ||||||
| 	QSE_ASSERT (sed != QSE_NULL); | 	QSE_ASSERT (sed != QSE_NULL); | ||||||
| @ -63,17 +69,19 @@ int Sed::execute () throw () | |||||||
| int Sed::xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg) | int Sed::xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg) | ||||||
| { | { | ||||||
| 	Sed* sed = *(Sed**)QSE_XTN(s); | 	Sed* sed = *(Sed**)QSE_XTN(s); | ||||||
|  | 	IO io (arg); | ||||||
|  |  | ||||||
| 	try | 	try | ||||||
| 	{ | 	{ | ||||||
| 		switch (cmd)	 | 		switch (cmd)	 | ||||||
| 		{ | 		{ | ||||||
| 			case QSE_SED_IO_OPEN: | 			case QSE_SED_IO_OPEN: | ||||||
| 				return sed->openIn (arg->open.path); | 				return sed->openInput (io); | ||||||
| 			case QSE_SED_IO_CLOSE: | 			case QSE_SED_IO_CLOSE: | ||||||
| 				return sed->closeIn (); | 				return sed->closeInput (io); | ||||||
| 			case QSE_SED_IO_READ: | 			case QSE_SED_IO_READ: | ||||||
| 				return sed->readIn (arg->read.buf, arg->read.len); | 				return sed->readInput ( | ||||||
|  | 					io, arg->u.r.buf, arg->u.w.len); | ||||||
| 			default: | 			default: | ||||||
| 				return -1; | 				return -1; | ||||||
| 		} | 		} | ||||||
| @ -87,17 +95,19 @@ int Sed::xin (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg) | |||||||
| int Sed::xout (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg) | int Sed::xout (sed_t* s, sed_io_cmd_t cmd, sed_io_arg_t* arg) | ||||||
| { | { | ||||||
| 	Sed* sed = *(Sed**)QSE_XTN(s); | 	Sed* sed = *(Sed**)QSE_XTN(s); | ||||||
|  | 	IO io (arg); | ||||||
|  |  | ||||||
| 	try | 	try | ||||||
| 	{ | 	{ | ||||||
| 		switch (cmd)	 | 		switch (cmd)	 | ||||||
| 		{ | 		{ | ||||||
| 			case QSE_SED_IO_OPEN: | 			case QSE_SED_IO_OPEN: | ||||||
| 				return sed->openOut (arg->open.path); | 				return sed->openOutput (io); | ||||||
| 			case QSE_SED_IO_CLOSE: | 			case QSE_SED_IO_CLOSE: | ||||||
| 				return sed->closeOut (); | 				return sed->closeOutput (io); | ||||||
| 			case QSE_SED_IO_READ: | 			case QSE_SED_IO_READ: | ||||||
| 				return sed->writeOut (arg->write.data, arg->write.len); | 				return sed->writeOutput ( | ||||||
|  | 					io, arg->u.w.data, arg->u.w.len); | ||||||
| 			default: | 			default: | ||||||
| 				return -1; | 				return -1; | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -17,6 +17,8 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <qse/sed/StdSed.hpp> | #include <qse/sed/StdSed.hpp> | ||||||
|  | #include <qse/cmn/fio.h> | ||||||
|  | #include <qse/cmn/sio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  |  | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
| @ -38,7 +40,83 @@ void StdSed::freeMem (void* ptr) throw () | |||||||
| 	::free (ptr);  | 	::free (ptr);  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int StdSed::openInput (IO& io) | ||||||
|  | { | ||||||
|  | 	int flags; | ||||||
|  | 	const qse_char_t* path = io.getPath (); | ||||||
|  |  | ||||||
|  | 	if (path == QSE_NULL) io.setHandle (qse_sio_in); | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		qse_fio_t* fio; | ||||||
|  | 		fio = qse_fio_open ( | ||||||
|  | 			this, 0, path, | ||||||
|  | 			QSE_FIO_READ | QSE_FIO_TEXT, | ||||||
|  | 			QSE_FIO_RUSR | QSE_FIO_WUSR | | ||||||
|  | 			QSE_FIO_RGRP | QSE_FIO_ROTH | ||||||
|  | 		);	 | ||||||
|  | 		if (fio == NULL) return -1; | ||||||
|  |  | ||||||
|  | 		io.setHandle (fio); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int StdSed::closeInput (IO& io) | ||||||
|  | { | ||||||
|  | 	if (io.getPath() != QSE_NULL)  | ||||||
|  | 		qse_fio_close ((qse_fio_t*)io.getHandle()); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ssize_t StdSed::readInput (IO& io, char_t* buf, size_t len) | ||||||
|  | { | ||||||
|  | 	if (io.getPath() == QSE_NULL) | ||||||
|  | 		return qse_sio_getsn ((qse_sio_t*)io.getHandle(), buf, len); | ||||||
|  | 	else | ||||||
|  | 		return qse_fio_read ((qse_fio_t*)io.getHandle(), buf, len); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int StdSed::openOutput (IO& io)  | ||||||
|  | { | ||||||
|  | 	int flags; | ||||||
|  | 	const qse_char_t* path = io.getPath (); | ||||||
|  |  | ||||||
|  | 	if (path == QSE_NULL) io.setHandle (qse_sio_out); | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		qse_fio_t* fio; | ||||||
|  | 		fio = qse_fio_open ( | ||||||
|  | 			this, 0, path, | ||||||
|  | 			QSE_FIO_WRITE | QSE_FIO_CREATE | | ||||||
|  | 			QSE_FIO_TRUNCATE | QSE_FIO_TEXT, | ||||||
|  | 			QSE_FIO_RUSR | QSE_FIO_WUSR | | ||||||
|  | 			QSE_FIO_RGRP | QSE_FIO_ROTH | ||||||
|  | 		);	 | ||||||
|  | 		if (fio == NULL) return -1; | ||||||
|  |  | ||||||
|  | 		io.setHandle (fio); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int StdSed::closeOutput (IO& io)  | ||||||
|  | { | ||||||
|  | 	if (io.getPath() != QSE_NULL) | ||||||
|  | 		qse_fio_close ((qse_fio_t*)io.getHandle()); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ssize_t StdSed::writeOutput (IO& io, const char_t* data, size_t len)  | ||||||
|  | { | ||||||
|  | 	if (io.getPath() == QSE_NULL) | ||||||
|  | 		return qse_sio_putsn ((qse_sio_t*)io.getHandle(), data, len); | ||||||
|  | 	else | ||||||
|  | 		return qse_fio_write ((qse_fio_t*)io.getHandle(), data, len); | ||||||
|  | } | ||||||
|  |  | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
| QSE_END_NAMESPACE(QSE) | QSE_END_NAMESPACE(QSE) | ||||||
| ///////////////////////////////// | ///////////////////////////////// | ||||||
|  |  | ||||||
|  | |||||||
| @ -1295,8 +1295,8 @@ static int read_char (qse_sed_t* sed, qse_char_t* c) | |||||||
| 		if (sed->e.in.pos >= sed->e.in.len) | 		if (sed->e.in.pos >= sed->e.in.len) | ||||||
| 		{ | 		{ | ||||||
| 			sed->errnum = QSE_SED_ENOERR; | 			sed->errnum = QSE_SED_ENOERR; | ||||||
| 			sed->e.in.arg.read.buf = sed->e.in.buf; | 			sed->e.in.arg.u.r.buf = sed->e.in.buf; | ||||||
| 			sed->e.in.arg.read.len = QSE_COUNTOF(sed->e.in.buf); | 			sed->e.in.arg.u.r.len = QSE_COUNTOF(sed->e.in.buf); | ||||||
| 			n = sed->e.in.fun ( | 			n = sed->e.in.fun ( | ||||||
| 				sed, QSE_SED_IO_READ, &sed->e.in.arg | 				sed, QSE_SED_IO_READ, &sed->e.in.arg | ||||||
| 			); | 			); | ||||||
| @ -1337,7 +1337,7 @@ static int read_file ( | |||||||
| 	qse_sed_io_arg_t arg; | 	qse_sed_io_arg_t arg; | ||||||
| 	qse_char_t buf[256]; | 	qse_char_t buf[256]; | ||||||
|  |  | ||||||
| 	arg.open.path = path; | 	arg.path = path; | ||||||
| 	sed->errnum = QSE_SED_ENOERR; | 	sed->errnum = QSE_SED_ENOERR; | ||||||
| 	n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &arg); | 	n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &arg); | ||||||
| 	if (n <= -1) | 	if (n <= -1) | ||||||
| @ -1356,8 +1356,8 @@ static int read_file ( | |||||||
|  |  | ||||||
| 	while (1) | 	while (1) | ||||||
| 	{ | 	{ | ||||||
| 		arg.read.buf = buf; | 		arg.u.r.buf = buf; | ||||||
| 		arg.read.len = QSE_COUNTOF(buf); | 		arg.u.r.len = QSE_COUNTOF(buf); | ||||||
|  |  | ||||||
| 		sed->errnum = QSE_SED_ENOERR; | 		sed->errnum = QSE_SED_ENOERR; | ||||||
| 		n = sed->e.in.fun (sed, QSE_SED_IO_READ, &arg); | 		n = sed->e.in.fun (sed, QSE_SED_IO_READ, &arg); | ||||||
| @ -1459,8 +1459,8 @@ static int flush (qse_sed_t* sed) | |||||||
| 	while (sed->e.out.len > 0) | 	while (sed->e.out.len > 0) | ||||||
| 	{ | 	{ | ||||||
| 		sed->errnum = QSE_SED_ENOERR; | 		sed->errnum = QSE_SED_ENOERR; | ||||||
| 		sed->e.out.arg.write.data = &sed->e.out.buf[pos]; | 		sed->e.out.arg.u.w.data = &sed->e.out.buf[pos]; | ||||||
| 		sed->e.out.arg.write.len = sed->e.out.len; | 		sed->e.out.arg.u.w.len = sed->e.out.len; | ||||||
| 		n = sed->e.out.fun (sed, QSE_SED_IO_WRITE, &sed->e.out.arg); | 		n = sed->e.out.fun (sed, QSE_SED_IO_WRITE, &sed->e.out.arg); | ||||||
|  |  | ||||||
| 		if (n <= -1) | 		if (n <= -1) | ||||||
| @ -1670,10 +1670,10 @@ static int write_str_to_file ( | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ap = QSE_MAP_VPTR(pair); | 	ap = QSE_MAP_VPTR(pair); | ||||||
| 	if (ap->open.handle == QSE_NULL) | 	if (ap->handle == QSE_NULL) | ||||||
| 	{ | 	{ | ||||||
| 		sed->errnum = QSE_SED_ENOERR; | 		sed->errnum = QSE_SED_ENOERR; | ||||||
| 		ap->open.path = path; | 		ap->path = path; | ||||||
| 		n = sed->e.out.fun (sed, QSE_SED_IO_OPEN, ap); | 		n = sed->e.out.fun (sed, QSE_SED_IO_OPEN, ap); | ||||||
| 		if (n <= -1) | 		if (n <= -1) | ||||||
| 		{ | 		{ | ||||||
| @ -1687,7 +1687,7 @@ static int write_str_to_file ( | |||||||
| 			/* EOF is returned upon opening a write stream. | 			/* EOF is returned upon opening a write stream. | ||||||
| 			 * it is also an error as it can't write any more */ | 			 * it is also an error as it can't write any more */ | ||||||
| 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | ||||||
| 			ap->close.handle = QSE_NULL; | 			ap->handle = QSE_NULL; | ||||||
| 			SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen); | 			SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen); | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
| @ -1696,13 +1696,13 @@ static int write_str_to_file ( | |||||||
| 	while (len > 0) | 	while (len > 0) | ||||||
| 	{ | 	{ | ||||||
| 		sed->errnum = QSE_SED_ENOERR; | 		sed->errnum = QSE_SED_ENOERR; | ||||||
| 		ap->write.data = str; | 		ap->u.w.data = str; | ||||||
| 		ap->write.len = len; | 		ap->u.w.len = len; | ||||||
| 		n = sed->e.out.fun (sed, QSE_SED_IO_WRITE, ap); | 		n = sed->e.out.fun (sed, QSE_SED_IO_WRITE, ap); | ||||||
| 		if (n <= -1)  | 		if (n <= -1)  | ||||||
| 		{ | 		{ | ||||||
| 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | ||||||
| 			ap->close.handle = QSE_NULL; | 			ap->handle = QSE_NULL; | ||||||
| 			if (sed->errnum == QSE_SED_ENOERR) | 			if (sed->errnum == QSE_SED_ENOERR) | ||||||
| 				SETERR1 (sed, QSE_SED_EIOFIL, 0, path, plen); | 				SETERR1 (sed, QSE_SED_EIOFIL, 0, path, plen); | ||||||
| 			sed->errlin = cmd->lnum; | 			sed->errlin = cmd->lnum; | ||||||
| @ -1714,7 +1714,7 @@ static int write_str_to_file ( | |||||||
| 			/* eof is returned on the write stream.  | 			/* eof is returned on the write stream.  | ||||||
| 			 * it is also an error as it can't write any more */ | 			 * it is also an error as it can't write any more */ | ||||||
| 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | ||||||
| 			ap->close.handle = QSE_NULL; | 			ap->handle = QSE_NULL; | ||||||
| 			SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen); | 			SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen); | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
| @ -2357,11 +2357,11 @@ static void close_outfile (qse_map_t* map, void* dptr, qse_size_t dlen) | |||||||
| 	qse_sed_io_arg_t* arg = dptr; | 	qse_sed_io_arg_t* arg = dptr; | ||||||
| 	QSE_ASSERT (dlen == QSE_SIZEOF(*arg)); | 	QSE_ASSERT (dlen == QSE_SIZEOF(*arg)); | ||||||
|  |  | ||||||
| 	if (arg->close.handle != QSE_NULL) | 	if (arg->handle != QSE_NULL) | ||||||
| 	{ | 	{ | ||||||
| 		qse_sed_t* sed = *(qse_sed_t**)QSE_XTN(map); | 		qse_sed_t* sed = *(qse_sed_t**)QSE_XTN(map); | ||||||
| 		sed->e.out.fun (sed, QSE_SED_IO_CLOSE, arg); | 		sed->e.out.fun (sed, QSE_SED_IO_CLOSE, arg); | ||||||
| 		arg->close.handle = QSE_NULL; | 		arg->handle = QSE_NULL; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -2413,7 +2413,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	sed->errnum = QSE_SED_ENOERR; | 	sed->errnum = QSE_SED_ENOERR; | ||||||
| 	sed->e.in.arg.open.path = QSE_NULL; | 	sed->e.in.arg.path = QSE_NULL; | ||||||
| 	n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &sed->e.in.arg); | 	n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &sed->e.in.arg); | ||||||
| 	if (n <= -1) | 	if (n <= -1) | ||||||
| 	{ | 	{ | ||||||
| @ -2430,7 +2430,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf) | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	sed->errnum = QSE_SED_ENOERR; | 	sed->errnum = QSE_SED_ENOERR; | ||||||
| 	sed->e.out.arg.open.path = QSE_NULL; | 	sed->e.out.arg.path = QSE_NULL; | ||||||
| 	n = sed->e.out.fun (sed, QSE_SED_IO_OPEN, &sed->e.out.arg); | 	n = sed->e.out.fun (sed, QSE_SED_IO_OPEN, &sed->e.out.arg); | ||||||
| 	if (n <= -1) | 	if (n <= -1) | ||||||
| 	{ | 	{ | ||||||
|  | |||||||
| @ -30,13 +30,13 @@ static qse_ssize_t in ( | |||||||
| 	switch (cmd) | 	switch (cmd) | ||||||
| 	{ | 	{ | ||||||
| 		case QSE_SED_IO_OPEN: | 		case QSE_SED_IO_OPEN: | ||||||
| 			if (arg->open.path == QSE_NULL || | 			if (arg->path == QSE_NULL || | ||||||
| 			    arg->open.path[0] == QSE_T('\0')) | 			    arg->path[0] == QSE_T('\0')) | ||||||
| 			{ | 			{ | ||||||
| 				if (instream) | 				if (instream) | ||||||
| 				{ | 				{ | ||||||
| 					arg->open.handle = qse_fopen (instream, QSE_T("r")); | 					arg->handle = qse_fopen (instream, QSE_T("r")); | ||||||
| 					if (arg->open.handle == QSE_NULL)  | 					if (arg->handle == QSE_NULL)  | ||||||
| 					{ | 					{ | ||||||
| 						qse_cstr_t errarg; | 						qse_cstr_t errarg; | ||||||
| 						errarg.ptr = instream; | 						errarg.ptr = instream; | ||||||
| @ -45,26 +45,26 @@ static qse_ssize_t in ( | |||||||
| 						return -1; | 						return -1; | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 				else arg->open.handle = QSE_STDIN; | 				else arg->handle = QSE_STDIN; | ||||||
| 			} | 			} | ||||||
| 			else | 			else | ||||||
| 			{ | 			{ | ||||||
| 				arg->open.handle = qse_fopen (arg->open.path, QSE_T("r")); | 				arg->handle = qse_fopen (arg->path, QSE_T("r")); | ||||||
| 				if (arg->open.handle == QSE_NULL) return -1; | 				if (arg->handle == QSE_NULL) return -1; | ||||||
| 			} | 			} | ||||||
| 			return 1; | 			return 1; | ||||||
|  |  | ||||||
| 		case QSE_SED_IO_CLOSE: | 		case QSE_SED_IO_CLOSE: | ||||||
| 			if (arg->close.handle != QSE_STDIN)  | 			if (arg->handle != QSE_STDIN)  | ||||||
| 				qse_fclose (arg->close.handle); | 				qse_fclose (arg->handle); | ||||||
| 			return 0; | 			return 0; | ||||||
|  |  | ||||||
| 		case QSE_SED_IO_READ: | 		case QSE_SED_IO_READ: | ||||||
| 		{ | 		{ | ||||||
| 			qse_cint_t c; | 			qse_cint_t c; | ||||||
| 			c = qse_fgetc (arg->read.handle); | 			c = qse_fgetc (arg->handle); | ||||||
| 			if (c == QSE_CHAR_EOF) return 0; | 			if (c == QSE_CHAR_EOF) return 0; | ||||||
| 			arg->read.buf[0] = c; | 			arg->u.r.buf[0] = c; | ||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @ -79,29 +79,29 @@ static qse_ssize_t out ( | |||||||
| 	switch (cmd) | 	switch (cmd) | ||||||
| 	{ | 	{ | ||||||
| 		case QSE_SED_IO_OPEN: | 		case QSE_SED_IO_OPEN: | ||||||
| 			if (arg->open.path == QSE_NULL || | 			if (arg->path == QSE_NULL || | ||||||
| 			    arg->open.path[0] == QSE_T('\0')) | 			    arg->path[0] == QSE_T('\0')) | ||||||
| 			{ | 			{ | ||||||
| 				arg->open.handle = QSE_STDOUT; | 				arg->handle = QSE_STDOUT; | ||||||
| 			} | 			} | ||||||
| 			else | 			else | ||||||
| 			{ | 			{ | ||||||
| 				arg->open.handle = qse_fopen (arg->open.path, QSE_T("w")); | 				arg->handle = qse_fopen (arg->path, QSE_T("w")); | ||||||
| 				if (arg->open.handle == QSE_NULL) return -1; | 				if (arg->handle == QSE_NULL) return -1; | ||||||
| 			} | 			} | ||||||
| 			return 1; | 			return 1; | ||||||
|  |  | ||||||
| 		case QSE_SED_IO_CLOSE: | 		case QSE_SED_IO_CLOSE: | ||||||
| 			if (arg->close.handle != QSE_STDOUT)  | 			if (arg->handle != QSE_STDOUT)  | ||||||
| 				qse_fclose (arg->close.handle); | 				qse_fclose (arg->handle); | ||||||
| 			return 0; | 			return 0; | ||||||
|  |  | ||||||
| 		case QSE_SED_IO_WRITE: | 		case QSE_SED_IO_WRITE: | ||||||
| 		{ | 		{ | ||||||
| 			qse_size_t i = 0; | 			qse_size_t i = 0; | ||||||
| 			for (i = 0; i < arg->write.len; i++)  | 			for (i = 0; i < arg->u.w.len; i++)  | ||||||
| 				qse_fputc (arg->write.data[i], arg->write.handle); | 				qse_fputc (arg->u.w.data[i], arg->handle); | ||||||
| 			return arg->write.len; | 			return arg->u.w.len; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		default: | 		default: | ||||||
|  | |||||||
| @ -30,6 +30,19 @@ int sed_main (int argc, qse_char_t* argv[]) | |||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if (sed.compile (argv[1]) == -1) | ||||||
|  | 	{ | ||||||
|  | 		qse_printf (QSE_T("cannot compile\n")); | ||||||
|  | 		sed.close (); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (sed.execute () == -1) | ||||||
|  | 	{ | ||||||
|  | 		qse_printf (QSE_T("cannot execute\n")); | ||||||
|  | 		sed.close (); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	sed.close (); | 	sed.close (); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user