enahnced qse_awk_parsesimple()
This commit is contained in:
		| @ -33,24 +33,33 @@ typedef struct xtn_t | ||||
| 	{ | ||||
| 		struct  | ||||
| 		{ | ||||
| 			int                     type; | ||||
| 			qse_awk_parsesimple_type_t type; | ||||
| 			union | ||||
| 			{ | ||||
| 				const qse_char_t*const* files;  | ||||
| 				const qse_char_t* file;  | ||||
| 				const qse_char_t* str; | ||||
| 				qse_cstr_t cstr; | ||||
| 				struct  | ||||
| 				{ | ||||
| 					const qse_char_t* ptr;	 | ||||
| 					const qse_char_t* end;	 | ||||
| 				} strl; | ||||
| 			} u; | ||||
| 			qse_size_t              index;  /* current file index */ | ||||
| 			qse_sio_t*              handle; /* the handle to an open file */ | ||||
| 			qse_sio_t* handle; /* the handle to an open file */ | ||||
| 		} in; | ||||
|  | ||||
| 		struct | ||||
| 		{ | ||||
| 			qse_awk_parsesimple_type_t type; | ||||
| 			union | ||||
| 			{ | ||||
| 				const qse_char_t* file; | ||||
| 				qse_char_t*       str; | ||||
| 				qse_cstr_t        cstr; | ||||
| 				struct  | ||||
| 				{ | ||||
| 					qse_xstr_t* osp; | ||||
| 					qse_char_t* ptr;	 | ||||
| 					qse_char_t* end;	 | ||||
| 				} strl; | ||||
| 			} u; | ||||
| 			qse_sio_t*              handle; | ||||
| 		} out; | ||||
| @ -170,30 +179,29 @@ static qse_ssize_t sf_in ( | ||||
|  | ||||
| 	if (cmd == QSE_AWK_SIO_OPEN) | ||||
| 	{ | ||||
| 		if (xtn->s.in.type == QSE_AWK_PARSESIMPLE_FILE) | ||||
| 		switch (xtn->s.in.type) | ||||
| 		{ | ||||
| 			if (xtn->s.in.u.files == QSE_NULL) return -1; | ||||
| 			if (xtn->s.in.u.files[xtn->s.in.index] == QSE_NULL) return 0; | ||||
| 			case QSE_AWK_PARSESIMPLE_FILE: | ||||
| 				if (xtn->s.in.u.file == QSE_NULL) return -1; | ||||
|  | ||||
| 			if (xtn->s.in.u.files[xtn->s.in.index][0] == QSE_T('\0')) | ||||
| 			{ | ||||
| 				xtn->s.in.handle = qse_sio_in; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				xtn->s.in.handle = qse_sio_open ( | ||||
| 					awk->mmgr, | ||||
| 					0, | ||||
| 					xtn->s.in.u.files[xtn->s.in.index], | ||||
| 					xtn->s.in.u.file, | ||||
| 					QSE_SIO_READ | ||||
| 				); | ||||
| 				if (xtn->s.in.handle == QSE_NULL) return -1; | ||||
| 			} | ||||
| 				return 1; | ||||
|  | ||||
| 			//qse_awk_setsource (awk, xtn->s.in.u.files[xtn->s.in.index]); | ||||
| 			case QSE_AWK_PARSESIMPLE_STDIO: | ||||
| 				xtn->s.in.handle = qse_sio_in; | ||||
| 				return 1; | ||||
|  | ||||
| 			case QSE_AWK_PARSESIMPLE_STR: | ||||
| 			case QSE_AWK_PARSESIMPLE_STRL: | ||||
| 				xtn->s.in.handle = QSE_NULL; | ||||
| 				return 1; | ||||
| 		} | ||||
|  | ||||
| 		return 1; | ||||
| 	} | ||||
| 	else if (cmd == QSE_AWK_SIO_CLOSE) | ||||
| 	{ | ||||
| @ -209,51 +217,34 @@ static qse_ssize_t sf_in ( | ||||
| 	} | ||||
| 	else if (cmd == QSE_AWK_SIO_READ) | ||||
| 	{ | ||||
| 		qse_ssize_t n = 0; | ||||
|  | ||||
| 		if (xtn->s.in.type == QSE_AWK_PARSESIMPLE_FILE) | ||||
| 		switch (xtn->s.in.type) | ||||
| 		{ | ||||
| 			qse_sio_t* sio; | ||||
| 			case QSE_AWK_PARSESIMPLE_FILE: | ||||
| 			case QSE_AWK_PARSESIMPLE_STDIO: | ||||
| 				QSE_ASSERT (xtn->s.in.handle != QSE_NULL); | ||||
| 				return qse_sio_getsn (xtn->s.in.handle, data, size); | ||||
|  | ||||
| 		retry: | ||||
| 			sio = xtn->s.in.handle; | ||||
|  | ||||
| 			n = qse_sio_getsn (sio, data, size); | ||||
| 			if (n == 0 && xtn->s.in.u.files[++xtn->s.in.index] != QSE_NULL) | ||||
| 			case QSE_AWK_PARSESIMPLE_STR: | ||||
| 			{ | ||||
| 				if (sio != qse_sio_in) qse_sio_close (sio); | ||||
| 				if (xtn->s.in.u.files[xtn->s.in.index][0] == QSE_T('\0')) | ||||
| 				qse_size_t n = 0; | ||||
| 				while (n < size && *xtn->s.in.u.str != QSE_T('\0')) | ||||
| 				{ | ||||
| 					xtn->s.in.handle = qse_sio_in; | ||||
| 					data[n++] = *xtn->s.in.u.str++; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					xtn->s.in.handle = qse_sio_open ( | ||||
| 						awk->mmgr, | ||||
| 						0, | ||||
| 						xtn->s.in.u.files[xtn->s.in.index], | ||||
| 						QSE_SIO_READ | ||||
| 					); | ||||
| 					if (xtn->s.in.handle == QSE_NULL) return -1; | ||||
| 				} | ||||
|  | ||||
| 				/* TODO: reset internal line counters... | ||||
| 					set new source name.... | ||||
| 					qse_awk_setsinname (); | ||||
| 				*/ | ||||
|  | ||||
| 				goto retry; | ||||
| 				return n; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			while (n < size && xtn->s.in.u.str[xtn->s.in.index] != QSE_T('\0')) | ||||
| 		 | ||||
| 			case QSE_AWK_PARSESIMPLE_STRL: | ||||
| 			{ | ||||
| 				data[n++] = xtn->s.in.u.str[xtn->s.in.index++]; | ||||
| 				qse_size_t n = 0; | ||||
| 				while (n < size && xtn->s.in.u.strl.ptr < xtn->s.in.u.strl.end) | ||||
| 				{ | ||||
| 					data[n++] = *xtn->s.in.u.strl.ptr++; | ||||
| 				} | ||||
| 				return n; | ||||
| 			} | ||||
| 		 | ||||
| 		} | ||||
|  | ||||
| 		return n; | ||||
| 	} | ||||
|  | ||||
| 	return -1; | ||||
| @ -267,41 +258,88 @@ static qse_ssize_t sf_out ( | ||||
|  | ||||
| 	if (cmd == QSE_AWK_SIO_OPEN)  | ||||
| 	{ | ||||
| 		if (xtn->s.out.file[0] == QSE_T('\0')) | ||||
| 		switch (xtn->s.out.type) | ||||
| 		{ | ||||
| 			xtn->s.out.handle = qse_sio_out; | ||||
| 		} | ||||
| 		else  | ||||
| 		{ | ||||
| 			xtn->s.out.handle = qse_sio_open ( | ||||
| 				awk->mmgr, | ||||
| 				0, | ||||
| 				xtn->s.out.file,  | ||||
| 				QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE | ||||
| 			); | ||||
| 			if (xtn->s.out.handle == QSE_NULL) return -1; | ||||
| 		} | ||||
| 			case QSE_AWK_PARSESIMPLE_FILE: | ||||
| 				if (xtn->s.out.u.file == QSE_NULL) return -1; | ||||
|  | ||||
| 		return 1; | ||||
| 				xtn->s.out.handle = qse_sio_open ( | ||||
| 					awk->mmgr, | ||||
| 					0, | ||||
| 					xtn->s.out.u.file,  | ||||
| 					QSE_SIO_WRITE |  | ||||
| 					QSE_SIO_CREATE |  | ||||
| 					QSE_SIO_TRUNCATE | ||||
| 				); | ||||
| 				if (xtn->s.out.handle == QSE_NULL) return -1; | ||||
| 				return 1; | ||||
|  | ||||
| 			case QSE_AWK_PARSESIMPLE_STDIO: | ||||
| 				xtn->s.out.handle = qse_sio_out; | ||||
| 				return 1; | ||||
|  | ||||
| 			case QSE_AWK_PARSESIMPLE_STR: | ||||
| 			case QSE_AWK_PARSESIMPLE_STRL: | ||||
| 				xtn->s.out.handle = QSE_NULL; | ||||
| 				return 1; | ||||
| 		} | ||||
| 	} | ||||
| 	else if (cmd == QSE_AWK_SIO_CLOSE)  | ||||
| 	{ | ||||
| 		if (xtn->s.out.handle != QSE_NULL) | ||||
| 		switch (xtn->s.out.type) | ||||
| 		{ | ||||
| 			qse_sio_flush (xtn->s.out.handle); | ||||
| 			if (xtn->s.out.handle != qse_sio_in && | ||||
| 			    xtn->s.out.handle != qse_sio_out && | ||||
| 			    xtn->s.out.handle != qse_sio_err)  | ||||
| 			{ | ||||
| 				qse_sio_close (xtn->s.out.handle); | ||||
| 			} | ||||
| 		} | ||||
| 			case QSE_AWK_PARSESIMPLE_FILE: | ||||
| 			case QSE_AWK_PARSESIMPLE_STDIO: | ||||
|  | ||||
| 		return 0; | ||||
| 				qse_sio_flush (xtn->s.out.handle); | ||||
| 				if (xtn->s.out.handle != qse_sio_in && | ||||
| 				    xtn->s.out.handle != qse_sio_out && | ||||
| 				    xtn->s.out.handle != qse_sio_err)  | ||||
| 				{ | ||||
| 					qse_sio_close (xtn->s.out.handle); | ||||
| 				} | ||||
| 				return 0; | ||||
|  | ||||
| 			case QSE_AWK_PARSESIMPLE_STR: | ||||
| 				*xtn->s.out.u.str = QSE_T('\0'); | ||||
| 				return 0; | ||||
|  | ||||
| 			case QSE_AWK_PARSESIMPLE_STRL: | ||||
| 				xtn->s.out.u.strl.osp->len =  | ||||
| 					xtn->s.out.u.strl.ptr - | ||||
| 					xtn->s.out.u.strl.osp->ptr; | ||||
| 				return 0; | ||||
| 		} | ||||
| 	} | ||||
| 	else if (cmd == QSE_AWK_SIO_WRITE) | ||||
| 	{ | ||||
| 		return qse_sio_putsn (xtn->s.out.handle, data, size); | ||||
| 		switch (xtn->s.out.type) | ||||
| 		{ | ||||
| 			case QSE_AWK_PARSESIMPLE_FILE: | ||||
| 			case QSE_AWK_PARSESIMPLE_STDIO: | ||||
| 				QSE_ASSERT (xtn->s.out.handle != QSE_NULL); | ||||
| 				return qse_sio_putsn (xtn->s.out.handle, data, size); | ||||
|  | ||||
| 			case QSE_AWK_PARSESIMPLE_STR: | ||||
| 			{ | ||||
| 				qse_size_t n = 0; | ||||
| 				while (n < size && *xtn->s.out.u.str != QSE_T('\0')) | ||||
| 				{ | ||||
| 					*xtn->s.out.u.str++ = data[n++]; | ||||
| 				} | ||||
| 				return n; | ||||
| 			} | ||||
|  | ||||
| 			case QSE_AWK_PARSESIMPLE_STRL: | ||||
| 			{ | ||||
| 				qse_size_t n = 0; | ||||
| 				while (n < size && xtn->s.out.u.strl.ptr < xtn->s.out.u.strl.end) | ||||
| 				{ | ||||
| 					*xtn->s.out.u.strl.ptr++ = data[n++]; | ||||
| 				} | ||||
| 				return n; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return -1; | ||||
| @ -317,58 +355,64 @@ int qse_awk_parsesimple ( | ||||
| 	qse_awk_sio_t sio; | ||||
| 	xtn_t* xtn = (xtn_t*) QSE_XTN (awk); | ||||
|  | ||||
| 	if (isp == QSE_NULL) | ||||
| 	switch (ist) | ||||
| 	{ | ||||
| 		qse_awk_seterrnum (awk, QSE_AWK_EINVAL); | ||||
| 		return -1; | ||||
| 		case QSE_AWK_PARSESIMPLE_FILE: | ||||
| 			xtn->s.in.u.file = (const qse_char_t*)isp; | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_AWK_PARSESIMPLE_STR: | ||||
| 			xtn->s.in.u.str = (const qse_char_t*)isp; | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_AWK_PARSESIMPLE_STRL: | ||||
| 			xtn->s.in.u.strl.ptr = ((const qse_cstr_t*)isp)->ptr; | ||||
| 			xtn->s.in.u.strl.end = xtn->s.in.u.strl.ptr + ((const qse_cstr_t*)isp)->len; | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_AWK_PARSESIMPLE_STDIO: | ||||
| 			/* nothing to do */ | ||||
| 			break; | ||||
|  | ||||
| 		default: | ||||
| 			qse_awk_seterrnum (awk, QSE_AWK_EINVAL); | ||||
| 			return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (ist == QSE_AWK_PARSESIMPLE_FILE)  | ||||
| 	switch (ost) | ||||
| 	{ | ||||
| 		xtn->s.in.u.files = (const qse_char_t*const*)isp; | ||||
| 	} | ||||
| 	else if (ist == QSE_AWK_PARSESIMPLE_STR)  | ||||
| 	{ | ||||
| 		xtn->s.in.u.str = (const qse_char_t*)isp; | ||||
| 	} | ||||
| 	else if (ist == QSE_AWK_PARSESIMPLE_STRL) | ||||
| 	{ | ||||
| 		xtn->s.in.u.cstr.ptr = (const qse_cstr_t*)isp->ptr; | ||||
| 		xtn->s.in.u.cstr.len = (const qse_cstr_t*)isp->len; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		qse_awk_seterrnum (awk, QSE_AWK_EINVAL); | ||||
| 		return -1; | ||||
| 	} | ||||
| 		case QSE_AWK_PARSESIMPLE_FILE: | ||||
| 			xtn->s.out.u.file = (const qse_char_t*)osp; | ||||
| 			break; | ||||
|  | ||||
| 	if (ost == QSE_AWK_PARSESIMPLE_FILE) | ||||
| 	{ | ||||
| 	} | ||||
| 	else if (ost == QSE_AWK_PARSESIMPLE_STR) | ||||
| 	{ | ||||
| 	} | ||||
| 	else if (ost == QSE_AWK_PARSESIMPLE_STRL) | ||||
| 	{ | ||||
| 	} | ||||
| 	else if (ost == QSE_AWK_PARSESIMPLE_NONE) | ||||
| 	{ | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		qse_awk_seterrnum (awk, QSE_AWK_EINVAL); | ||||
| 		return -1; | ||||
| 	} | ||||
| 		case QSE_AWK_PARSESIMPLE_STR: | ||||
| 			xtn->s.out.u.str = (qse_char_t*)osp; | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_AWK_PARSESIMPLE_STRL: | ||||
| 			xtn->s.out.u.strl.osp = (qse_xstr_t*)osp; | ||||
| 			xtn->s.out.u.strl.ptr = ((qse_xstr_t*)osp)->ptr; | ||||
| 			xtn->s.out.u.strl.end = xtn->s.out.u.strl.ptr + ((qse_xstr_t*)osp)->len; | ||||
| 			break; | ||||
|  | ||||
| 		case QSE_AWK_PARSESIMPLE_NONE: | ||||
| 		case QSE_AWK_PARSESIMPLE_STDIO: | ||||
| 			/* nothing to do */ | ||||
| 			break; | ||||
|  | ||||
| 		default: | ||||
| 			qse_awk_seterrnum (awk, QSE_AWK_EINVAL); | ||||
| 			return -1; | ||||
| 	} | ||||
| 		 | ||||
| 	xtn->s.in.type = ist; | ||||
| 	xtn->s.in.index = 0; | ||||
| 	xtn->s.in.handle = QSE_NULL; | ||||
|  | ||||
| 	xtn->s.out.file = osf; | ||||
| 	xtn->s.out.type = ost; | ||||
| 	xtn->s.out.handle = QSE_NULL; | ||||
| 	 | ||||
|         sio.in = sf_in; | ||||
|         sio.out = (osf == QSE_NULL)? QSE_NULL: sf_out; | ||||
|         sio.out = (ost == QSE_AWK_PARSESIMPLE_NONE)? QSE_NULL: sf_out; | ||||
|  | ||||
| 	return qse_awk_parse (awk, &sio); | ||||
| } | ||||
| @ -479,13 +523,13 @@ static qse_ssize_t awk_rio_file ( | ||||
| 			else if (riod->mode == QSE_AWK_RIO_FILE_WRITE) | ||||
| 			{ | ||||
| 				flags = QSE_FIO_WRITE | | ||||
| 				       QSE_FIO_CREATE | | ||||
| 				       QSE_FIO_TRUNCATE; | ||||
| 				        QSE_FIO_CREATE | | ||||
| 				        QSE_FIO_TRUNCATE; | ||||
| 			} | ||||
| 			else if (riod->mode == QSE_AWK_RIO_FILE_APPEND) | ||||
| 			{ | ||||
| 				flags = QSE_FIO_APPEND | | ||||
| 				       QSE_FIO_CREATE; | ||||
| 				        QSE_FIO_CREATE; | ||||
| 			} | ||||
| 			else return -1; /* TODO: any way to set the error number? */ | ||||
|  | ||||
| @ -828,7 +872,9 @@ static qse_ssize_t awk_rio_console ( | ||||
| } | ||||
|  | ||||
| qse_awk_rtx_t* qse_awk_rtx_opensimple ( | ||||
| 	qse_awk_t* awk, const qse_char_t* icf[], const qse_char_t* ocf[]) | ||||
| 	qse_awk_t* awk, | ||||
| 	const qse_char_t*const* icf, | ||||
| 	const qse_char_t*const* ocf) | ||||
| { | ||||
| 	qse_awk_rtx_t* rtx; | ||||
| 	qse_awk_rio_t rio; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user