make @word to be always on
simplified the return value of I/O handler's open function by eliminating the concept of EOF on opening. enhanced qse_awk_parsestd() to accept an array of qse_awk_parsestd_t for input streams. enhanced cmd/awk/awk.c to handle multiple -f's properly
This commit is contained in:
		| @ -496,12 +496,19 @@ static int fnc_length (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) | ||||
| 	else | ||||
| 	{ | ||||
| 		v = qse_awk_rtx_getarg (rtx, 0); | ||||
| 		if (v->type == QSE_AWK_VAL_STR) | ||||
| 		if (v->type == QSE_AWK_VAL_MAP) | ||||
| 		{ | ||||
| 			/* map size */ | ||||
| 			len = QSE_HTB_SIZE(((qse_awk_val_map_t*)v)->map); | ||||
| 		} | ||||
| 		else if (v->type == QSE_AWK_VAL_STR) | ||||
| 		{ | ||||
| 			/* string length */ | ||||
| 			len = ((qse_awk_val_str_t*)v)->val.len; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* convert to string and get length */ | ||||
| 			str = qse_awk_rtx_valtostrdup (rtx, v, &len); | ||||
| 			if (str == QSE_NULL) return -1; | ||||
| 			QSE_AWK_FREE (rtx->awk, str); | ||||
|  | ||||
| @ -255,11 +255,11 @@ static kwent_t kwtab[] = | ||||
| { | ||||
| 	/* keep this table in sync with the kw_t enums in <parse.h>. | ||||
| 	 * also keep it sorted by the first field for binary search */ | ||||
| 	{ { QSE_T("@abort"),       6 }, TOK_XABORT,      QSE_AWK_EXTRAKWS }, | ||||
| 	{ { QSE_T("@global"),      7 }, TOK_XGLOBAL,     QSE_AWK_EXTRAKWS }, | ||||
| 	{ { QSE_T("@include"),     8 }, TOK_XINCLUDE,    QSE_AWK_EXTRAKWS }, | ||||
| 	{ { QSE_T("@local"),       6 }, TOK_XLOCAL,      QSE_AWK_EXTRAKWS }, | ||||
| 	{ { QSE_T("@reset"),       6 }, TOK_XRESET,      QSE_AWK_EXTRAKWS }, | ||||
| 	{ { QSE_T("@abort"),       6 }, TOK_XABORT,      0 }, | ||||
| 	{ { QSE_T("@global"),      7 }, TOK_XGLOBAL,     0 }, | ||||
| 	{ { QSE_T("@include"),     8 }, TOK_XINCLUDE,    0 }, | ||||
| 	{ { QSE_T("@local"),       6 }, TOK_XLOCAL,      0 }, | ||||
| 	{ { QSE_T("@reset"),       6 }, TOK_XRESET,      0 }, | ||||
| 	{ { QSE_T("BEGIN"),        5 }, TOK_BEGIN,       QSE_AWK_PABLOCK }, | ||||
| 	{ { QSE_T("END"),          3 }, TOK_END,         QSE_AWK_PABLOCK }, | ||||
| 	{ { QSE_T("break"),        5 }, TOK_BREAK,       0 }, | ||||
| @ -522,60 +522,53 @@ static int parse (qse_awk_t* awk) | ||||
|  | ||||
| 	adjust_static_globals (awk); | ||||
|  | ||||
| 	/* the user io handler for the source code input returns 0 when | ||||
| 	 * it doesn't have any files to open. this is the same condition | ||||
| 	 * as the source code file is empty. so it will perform the parsing | ||||
| 	 * when op is positive, which means there are something to parse */ | ||||
| 	if (op > 0) | ||||
| 	/* get the first character and the first token */ | ||||
| 	if (get_char (awk) <= -1 || get_token (awk)) goto oops;  | ||||
|  | ||||
| 	while (1)  | ||||
| 	{ | ||||
| 		/* get the first character and the first token */ | ||||
| 		if (get_char (awk) <= -1 || get_token (awk)) goto oops;  | ||||
|  | ||||
| 		while (1)  | ||||
| 		while (MATCH(awk,TOK_NEWLINE))  | ||||
| 		{ | ||||
| 			while (MATCH(awk,TOK_NEWLINE))  | ||||
| 			{ | ||||
| 				if (get_token (awk) <= -1) goto oops; | ||||
| 			} | ||||
| 			if (MATCH(awk,TOK_EOF)) break; | ||||
|  | ||||
| 			if (parse_progunit (awk) <= -1) goto oops; | ||||
| 			if (get_token (awk) <= -1) goto oops; | ||||
| 		} | ||||
| 		if (MATCH(awk,TOK_EOF)) break; | ||||
|  | ||||
| 		if (!(awk->opt.trait & QSE_AWK_IMPLICIT)) | ||||
| 		if (parse_progunit (awk) <= -1) goto oops; | ||||
| 	} | ||||
|  | ||||
| 	if (!(awk->opt.trait & QSE_AWK_IMPLICIT)) | ||||
| 	{ | ||||
| 		/* ensure that all functions called are defined  | ||||
| 		 * in the EXPLICIT-only mode */ | ||||
|  | ||||
| 		qse_htb_pair_t* p; | ||||
| 		qse_size_t buckno; | ||||
|  | ||||
| 		p = qse_htb_getfirstpair (awk->parse.funs, &buckno); | ||||
| 		while (p != QSE_NULL) | ||||
| 		{ | ||||
| 			/* ensure that all functions called are defined  | ||||
| 			 * in the EXPLICIT-only mode */ | ||||
|  | ||||
| 			qse_htb_pair_t* p; | ||||
| 			qse_size_t buckno; | ||||
|  | ||||
| 			p = qse_htb_getfirstpair (awk->parse.funs, &buckno); | ||||
| 			while (p != QSE_NULL) | ||||
| 			if (qse_htb_search (awk->tree.funs,  | ||||
| 				QSE_HTB_KPTR(p), QSE_HTB_KLEN(p)) == QSE_NULL) | ||||
| 			{ | ||||
| 				if (qse_htb_search (awk->tree.funs,  | ||||
| 					QSE_HTB_KPTR(p), QSE_HTB_KLEN(p)) == QSE_NULL) | ||||
| 				{ | ||||
| 					 | ||||
| 					qse_awk_nde_t* nde; | ||||
| 				 | ||||
| 				qse_awk_nde_t* nde; | ||||
|  | ||||
| 					/* see parse_fncall() for what is | ||||
| 					 * stored into awk->tree.funs */ | ||||
| 					nde = (qse_awk_nde_t*)QSE_HTB_VPTR(p); | ||||
| 				/* see parse_fncall() for what is | ||||
| 				 * stored into awk->tree.funs */ | ||||
| 				nde = (qse_awk_nde_t*)QSE_HTB_VPTR(p); | ||||
|  | ||||
| 					SETERR_ARG_LOC ( | ||||
| 						awk,  | ||||
| 						QSE_AWK_EFUNNF,  | ||||
| 						QSE_HTB_KPTR(p), | ||||
| 						QSE_HTB_KLEN(p), | ||||
| 						&nde->loc | ||||
| 					); | ||||
| 				SETERR_ARG_LOC ( | ||||
| 					awk,  | ||||
| 					QSE_AWK_EFUNNF,  | ||||
| 					QSE_HTB_KPTR(p), | ||||
| 					QSE_HTB_KLEN(p), | ||||
| 					&nde->loc | ||||
| 				); | ||||
|  | ||||
| 					goto oops; | ||||
| 				} | ||||
|  | ||||
| 				p = qse_htb_getnextpair (awk->parse.funs, p, &buckno); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| 			p = qse_htb_getnextpair (awk->parse.funs, p, &buckno); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -759,18 +752,6 @@ static int begin_include (qse_awk_t* awk) | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| 	if (op == 0) | ||||
| 	{ | ||||
| 		CLRERR (awk); | ||||
| 		op = awk->sio.inf (awk, QSE_AWK_SIO_CLOSE, arg, QSE_NULL, 0); | ||||
| 		if (op != 0) | ||||
| 		{ | ||||
| 			if (ISNOERR(awk)) SETERR_TOK (awk, QSE_AWK_ECLOSE); | ||||
| 			else awk->errinf.loc = awk->tok.loc; | ||||
| 			goto oops; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	arg->next = awk->sio.inp; | ||||
| 	awk->sio.inp = arg; | ||||
| 	awk->parse.depth.incl++; | ||||
| @ -6109,23 +6090,6 @@ static int deparse (qse_awk_t* awk) | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (op == 0) | ||||
| 	{ | ||||
| 		/* the result of the open operation indicates that the  | ||||
| 		 * file has been open but reached the end. so it has to  | ||||
| 		 * skip the entire deparsing procedure as it can't write  | ||||
| 		 * any single characters on such an io handler. but note  | ||||
| 		 * that this is not really an error for the parse and deparser.  | ||||
| 		 * | ||||
| 		 * in fact, there are two ways to skip deparsing. | ||||
| 		 *    1. set awk->sio.inf to NULL. | ||||
| 		 *    2. set awk->sio.inf to a normal handler but | ||||
| 		 *       make it return 0 on the OPEN request. | ||||
| 		 */ | ||||
| 		n = 0; | ||||
| 		goto exit_deparse; | ||||
| 	} | ||||
|  | ||||
| #define EXIT_DEPARSE() do { n = -1; goto exit_deparse; } while(0) | ||||
|  | ||||
| 	if (awk->tree.ngbls > awk->tree.ngbls_base)  | ||||
|  | ||||
| @ -182,13 +182,6 @@ static int find_rio_in ( | ||||
| 		/* chain it */ | ||||
| 		p->next = run->rio.chain; | ||||
| 		run->rio.chain = p; | ||||
|  | ||||
| 		/* usually, x == 0 indicates that it has reached the end | ||||
| 		 * of the input. the user I/O handler can return 0 for the | ||||
| 		 * open request if it doesn't have any files to open. One | ||||
| 		 * advantage of doing this would be that you can skip the | ||||
| 		 * entire pattern-block matching and execution. */ | ||||
| 		if (x == 0) p->in.eos = 1; | ||||
| 	} | ||||
|  | ||||
| 	*rio = p; | ||||
| @ -761,17 +754,6 @@ int qse_awk_rtx_writeio_str ( | ||||
| 		/* chain it */ | ||||
| 		p->next = run->rio.chain; | ||||
| 		run->rio.chain = p; | ||||
|  | ||||
| 		/* usually, n == 0 indicates that it has reached the end  | ||||
| 		 * of the input. the user I/O handler can return 0 for the | ||||
| 		 * open request if it doesn't have any files to open. One  | ||||
| 		 * advantage of doing this would be that you can skip the  | ||||
| 		 * entire pattern-block matching and execution. */ | ||||
| 		if (n == 0)  | ||||
| 		{ | ||||
| 			p->out.eos = 1; | ||||
| 			return 0; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (p->out.eos)  | ||||
|  | ||||
| @ -80,6 +80,8 @@ typedef struct xtn_t | ||||
| 		struct  | ||||
| 		{ | ||||
| 			qse_awk_parsestd_t* x; | ||||
| 			qse_size_t          xindex; | ||||
|  | ||||
| 			union | ||||
| 			{ | ||||
| 				struct  | ||||
| @ -649,58 +651,84 @@ static qse_sio_t* open_sio_std_rtx (qse_awk_rtx_t* rtx, qse_sio_std_t std, int f | ||||
| } | ||||
|  | ||||
| /*** PARSESTD ***/ | ||||
|  | ||||
| static int open_parsestd (qse_awk_t* awk, xtn_t* xtn, qse_size_t index) | ||||
| { | ||||
| 	qse_awk_parsestd_t* psin = &xtn->s.in.x[index]; | ||||
|  | ||||
| 	switch (psin->type) | ||||
| 	{ | ||||
| 		/* normal source files */ | ||||
|  | ||||
| 		case QSE_AWK_PARSESTD_FILE: | ||||
| 			if (psin->u.file.path == QSE_NULL || | ||||
| 			    (psin->u.file.path[0] == QSE_T('-') && | ||||
| 			     psin->u.file.path[1] == QSE_T('\0'))) | ||||
| 			{ | ||||
| 				/* special file name '-' */ | ||||
| 				qse_sio_t* tmp; | ||||
|  | ||||
| 				tmp = open_sio_std (awk, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR); | ||||
| 				if (tmp == QSE_NULL) return -1; | ||||
|  | ||||
| 				if (index >= 1 && xtn->s.in.x[index-1].type == QSE_AWK_PARSESTD_FILE) | ||||
| 					qse_sio_close (xtn->s.in.u.file.sio); | ||||
|  | ||||
| 				xtn->s.in.u.file.sio = tmp; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				qse_sio_t* tmp; | ||||
| 				const qse_char_t* base; | ||||
|  | ||||
| 				tmp = open_sio (awk, psin->u.file.path, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR); | ||||
| 				if (tmp == QSE_NULL) return -1; | ||||
|  | ||||
| 				if (index >= 1 && xtn->s.in.x[index-1].type == QSE_AWK_PARSESTD_FILE) | ||||
| 					qse_sio_close (xtn->s.in.u.file.sio); | ||||
| 				xtn->s.in.u.file.sio = tmp; | ||||
|  | ||||
| 				base = qse_basename (psin->u.file.path); | ||||
| 				if (base != psin->u.file.path) | ||||
| 				{ | ||||
| 					xtn->s.in.u.file.dir.ptr = psin->u.file.path; | ||||
| 					xtn->s.in.u.file.dir.len = base - psin->u.file.path; | ||||
| 				} | ||||
|  | ||||
| 			} | ||||
| 			if (psin->cmgr) qse_sio_setcmgr (xtn->s.in.u.file.sio, psin->cmgr); | ||||
| 			return 0; | ||||
|  | ||||
| 		case QSE_AWK_PARSESTD_STR: | ||||
| 			if (index >= 1 && xtn->s.in.x[index-1].type == QSE_AWK_PARSESTD_FILE) | ||||
| 				qse_sio_close (xtn->s.in.u.file.sio); | ||||
|  | ||||
| 			xtn->s.in.u.str.ptr = psin->u.str.ptr; | ||||
| 			xtn->s.in.u.str.end = psin->u.str.ptr + psin->u.str.len; | ||||
| 			return 0; | ||||
|  | ||||
| 		default: | ||||
| 			qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL); | ||||
| 			return -1; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static qse_ssize_t sf_in_open ( | ||||
| 	qse_awk_t* awk, qse_awk_sio_arg_t* arg, xtn_t* xtn) | ||||
| { | ||||
| 	if (arg == QSE_NULL || arg->name == QSE_NULL) | ||||
| 	{ | ||||
| 		switch (xtn->s.in.x->type) | ||||
| 		{ | ||||
| 			case QSE_AWK_PARSESTD_FILE: | ||||
| 				if (xtn->s.in.x->u.file.path == QSE_NULL || | ||||
| 				    (xtn->s.in.x->u.file.path[0] == QSE_T('-') && | ||||
| 				     xtn->s.in.x->u.file.path[1] == QSE_T('\0'))) | ||||
| 				{ | ||||
| 					/* special file name '-' */ | ||||
| 					xtn->s.in.u.file.sio = open_sio_std ( | ||||
| 						awk, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR); | ||||
| 					if (xtn->s.in.u.file.sio == QSE_NULL) return -1; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					const qse_char_t* base; | ||||
|  | ||||
| 					xtn->s.in.u.file.sio = open_sio ( | ||||
| 						awk, xtn->s.in.x->u.file.path, | ||||
| 						QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR | ||||
| 					); | ||||
| 					if (xtn->s.in.u.file.sio == QSE_NULL) return -1; | ||||
|  | ||||
| 					base = qse_basename (xtn->s.in.x->u.file.path); | ||||
| 					if (base != xtn->s.in.x->u.file.path) | ||||
| 					{ | ||||
| 						xtn->s.in.u.file.dir.ptr = xtn->s.in.x->u.file.path; | ||||
| 						xtn->s.in.u.file.dir.len = base - xtn->s.in.x->u.file.path; | ||||
| 					} | ||||
| 				} | ||||
| 				if (xtn->s.in.x->u.file.cmgr) | ||||
| 					qse_sio_setcmgr (xtn->s.in.u.file.sio, xtn->s.in.x->u.file.cmgr); | ||||
| 				return 1; | ||||
|  | ||||
| 			case QSE_AWK_PARSESTD_STR: | ||||
| 				xtn->s.in.u.str.ptr = xtn->s.in.x->u.str.ptr; | ||||
| 				xtn->s.in.u.str.end = xtn->s.in.x->u.str.ptr + xtn->s.in.x->u.str.len; | ||||
| 				return 1; | ||||
|  | ||||
| 			default: | ||||
| 				/* this should never happen */ | ||||
| 				qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL); | ||||
| 				return -1; | ||||
| 		} | ||||
| 		/* handle normal source input streams specified  | ||||
| 		 * to qse_awk_parsestd() */ | ||||
|  | ||||
| 		qse_ssize_t x; | ||||
| 		x = open_parsestd (awk, xtn, 0); | ||||
| 		if (x >= 0) xtn->s.in.xindex = 0; /* update the current stream index */ | ||||
| 		return x; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* handle the included source file - @include */ | ||||
| 		const qse_char_t* file = arg->name; | ||||
| 		qse_char_t fbuf[64]; | ||||
| 		qse_char_t* dbuf = QSE_NULL; | ||||
| @ -733,7 +761,7 @@ static qse_ssize_t sf_in_open ( | ||||
| 			awk->mmgr, 0, file, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR | ||||
| 		); | ||||
|  | ||||
| 		if (dbuf != QSE_NULL) QSE_MMGR_FREE (awk->mmgr, dbuf); | ||||
| 		if (dbuf) QSE_MMGR_FREE (awk->mmgr, dbuf); | ||||
| 		if (arg->handle == QSE_NULL) | ||||
| 		{ | ||||
| 			qse_cstr_t ea; | ||||
| @ -743,7 +771,7 @@ static qse_ssize_t sf_in_open ( | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		return 1; | ||||
| 		return 0; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -752,12 +780,12 @@ static qse_ssize_t sf_in_close ( | ||||
| { | ||||
| 	if (arg == QSE_NULL || arg->name == QSE_NULL) | ||||
| 	{ | ||||
| 		switch (xtn->s.in.x->type) | ||||
| 		switch (xtn->s.in.x[xtn->s.in.xindex].type) | ||||
| 		{ | ||||
| 			case QSE_AWK_PARSESTD_FILE: | ||||
| 				qse_sio_close (xtn->s.in.u.file.sio); | ||||
| 				break; | ||||
| 			 | ||||
|  | ||||
| 			case QSE_AWK_PARSESTD_STR: | ||||
| 				/* nothing to close */ | ||||
| 				break; | ||||
| @ -769,6 +797,7 @@ static qse_ssize_t sf_in_close ( | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* handle the included source file - @include */ | ||||
| 		QSE_ASSERT (arg->handle != QSE_NULL); | ||||
| 		qse_sio_close (arg->handle); | ||||
| 	} | ||||
| @ -780,22 +809,23 @@ static qse_ssize_t sf_in_read ( | ||||
| 	qse_awk_t* awk, qse_awk_sio_arg_t* arg, | ||||
| 	qse_char_t* data, qse_size_t size, xtn_t* xtn) | ||||
| { | ||||
|  | ||||
| 	if (arg == QSE_NULL || arg->name == QSE_NULL) | ||||
| 	{ | ||||
| 		switch (xtn->s.in.x->type) | ||||
| 		qse_ssize_t n; | ||||
|  | ||||
| 	again: | ||||
| 		switch (xtn->s.in.x[xtn->s.in.xindex].type) | ||||
| 		{ | ||||
| 			case QSE_AWK_PARSESTD_FILE: | ||||
| 			{ | ||||
| 				qse_ssize_t n; | ||||
|  | ||||
| 				QSE_ASSERT (xtn->s.in.u.file.sio != QSE_NULL); | ||||
| 				n = qse_sio_getstrn (xtn->s.in.u.file.sio, data, size); | ||||
| 				if (n <= -1) | ||||
| 				{ | ||||
| 					qse_cstr_t ea; | ||||
| 					if (xtn->s.in.x->u.file.path) | ||||
| 					if (xtn->s.in.x[xtn->s.in.xindex].u.file.path) | ||||
| 					{ | ||||
| 						ea.ptr = xtn->s.in.x->u.file.path; | ||||
| 						ea.ptr = xtn->s.in.x[xtn->s.in.xindex].u.file.path; | ||||
| 						ea.len = qse_strlen(ea.ptr); | ||||
| 					} | ||||
| 					else | ||||
| @ -805,28 +835,45 @@ static qse_ssize_t sf_in_read ( | ||||
| 					} | ||||
| 					qse_awk_seterrnum (awk, QSE_AWK_EREAD, &ea); | ||||
| 				} | ||||
| 				return n; | ||||
| 			} | ||||
| 				break; | ||||
|  | ||||
| 			case QSE_AWK_PARSESTD_STR: | ||||
| 			{ | ||||
| 				qse_size_t n = 0; | ||||
| 				n = 0; | ||||
| 				while (n < size && xtn->s.in.u.str.ptr < xtn->s.in.u.str.end) | ||||
| 				{ | ||||
| 					data[n++] = *xtn->s.in.u.str.ptr++; | ||||
| 				} | ||||
| 				return n; | ||||
| 			} | ||||
| 				break; | ||||
|  | ||||
| 			default: | ||||
| 				/* this should never happen */ | ||||
| 				qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL); | ||||
| 				return -1; | ||||
| 				n = -1; | ||||
| 				break; | ||||
| 		} | ||||
|  | ||||
| 		if (n == 0) | ||||
| 		{ | ||||
| 		 	/* reached end of the current stream. */ | ||||
| 			qse_size_t next = xtn->s.in.xindex + 1; | ||||
| 			if (xtn->s.in.x[next].type != QSE_AWK_PARSESTD_NULL) | ||||
| 			{ | ||||
| 				/* open the next stream if available. */ | ||||
| 				if (open_parsestd (awk, xtn, next) <= -1) n = -1; | ||||
| 				else  | ||||
| 				{ | ||||
| 					/* if successful, close the current stream */	 | ||||
| 					xtn->s.in.xindex = next; /* update the next to the current */ | ||||
| 					goto again; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return n; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* handle the included source file - @include */ | ||||
| 		qse_ssize_t n; | ||||
|  | ||||
| 		QSE_ASSERT (arg->handle != QSE_NULL); | ||||
| @ -899,8 +946,8 @@ static qse_ssize_t sf_out ( | ||||
| 						if (xtn->s.out.u.file.sio == QSE_NULL) return -1; | ||||
| 					} | ||||
|  | ||||
| 					if (xtn->s.out.x->u.file.cmgr) | ||||
| 						qse_sio_setcmgr (xtn->s.out.u.file.sio, xtn->s.out.x->u.file.cmgr); | ||||
| 					if (xtn->s.out.x->cmgr) | ||||
| 						qse_sio_setcmgr (xtn->s.out.u.file.sio, xtn->s.out.x->cmgr); | ||||
| 					return 1; | ||||
|  | ||||
| 				case QSE_AWK_PARSESTD_STR: | ||||
| @ -988,25 +1035,20 @@ static qse_ssize_t sf_out ( | ||||
| } | ||||
|  | ||||
| int qse_awk_parsestd ( | ||||
| 	qse_awk_t* awk, qse_awk_parsestd_t* in, qse_awk_parsestd_t* out) | ||||
| 	qse_awk_t* awk, qse_awk_parsestd_t in[], qse_awk_parsestd_t* out) | ||||
| { | ||||
| 	qse_awk_sio_t sio; | ||||
| 	xtn_t* xtn = (xtn_t*) QSE_XTN (awk); | ||||
| 	int n; | ||||
|  | ||||
| 	if (in == QSE_NULL) | ||||
| 	if (in == QSE_NULL || (in[0].type != QSE_AWK_PARSESTD_FILE &&  | ||||
| 	                       in[0].type != QSE_AWK_PARSESTD_STR)) | ||||
| 	{ | ||||
| 		/* the input is a must */ | ||||
| 		qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (in->type != QSE_AWK_PARSESTD_FILE && | ||||
| 	    in->type != QSE_AWK_PARSESTD_STR) | ||||
| 	{ | ||||
| 		qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	sio.in = sf_in; | ||||
| 	xtn->s.in.x = in; | ||||
|  | ||||
|  | ||||
| @ -234,7 +234,7 @@ int qse_tio_attachout ( | ||||
| 	} | ||||
|  | ||||
| 	tio->errnum = QSE_TIO_ENOERR; | ||||
| 	if (output (tio, QSE_TIO_OPEN, QSE_NULL, 0) == -1)  | ||||
| 	if (output (tio, QSE_TIO_OPEN, QSE_NULL, 0) <= -1)  | ||||
| 	{ | ||||
| 		if (tio->errnum == QSE_TIO_ENOERR) tio->errnum = QSE_TIO_EOTHER; | ||||
| 		if (xbufptr != bufptr) QSE_MMGR_FREE (tio->mmgr, xbufptr); | ||||
|  | ||||
| @ -383,16 +383,8 @@ static int open_script_stream (qse_sed_t* sed) | ||||
| 	sed->src.loc.line = 1; | ||||
| 	sed->src.loc.colm = 0; | ||||
|  | ||||
| 	if (n == 0)  | ||||
| 	{ | ||||
| 		sed->src.eof = 1; | ||||
| 		return 0; /* end of file */ | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		sed->src.eof = 0; | ||||
| 		return 1; | ||||
| 	} | ||||
| 	sed->src.eof = 0; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int close_script_stream (qse_sed_t* sed) | ||||
| @ -2516,16 +2508,6 @@ static int write_str_to_file ( | ||||
| 			else sed->errloc = cmd->loc; | ||||
| 			return -1; | ||||
| 		} | ||||
| 		if (n == 0) | ||||
| 		{ | ||||
| 			/* EOF is returned upon opening a write stream. | ||||
| 			 * it is also an error as it can't write  | ||||
| 			 * a requested string */ | ||||
| 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap, QSE_NULL, 0); | ||||
| 			ap->handle = QSE_NULL; | ||||
| 			SETERR1 (sed, QSE_SED_EIOFIL, path, plen, &cmd->loc); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	while (len > 0) | ||||
| @ -2582,12 +2564,6 @@ static int write_file ( | ||||
| 		/* it is ok if it is not able to open a file */ | ||||
| 		return 0;	 | ||||
| 	} | ||||
| 	if (n == 0)  | ||||
| 	{ | ||||
| 		/* EOF - no data */ | ||||
| 		sed->e.in.fun (sed, QSE_SED_IO_CLOSE, &arg, QSE_NULL, 0); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	while (1) | ||||
| 	{ | ||||
| @ -3983,12 +3959,6 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_impl_t inf, qse_sed_io_impl_t outf) | ||||
| 			SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); | ||||
| 		goto done3; | ||||
| 	} | ||||
| 	if (n == 0)  | ||||
| 	{ | ||||
| 		/* EOF reached upon opening an input stream. | ||||
| 		 * no data to process. this is success */ | ||||
| 		goto done2; | ||||
| 	} | ||||
| 	 | ||||
| 	sed->errnum = QSE_SED_ENOERR; | ||||
| 	sed->e.out.arg.path = QSE_NULL; | ||||
| @ -4000,12 +3970,6 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_impl_t inf, qse_sed_io_impl_t outf) | ||||
| 			SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); | ||||
| 		goto done2; | ||||
| 	} | ||||
| 	if (n == 0)  | ||||
| 	{ | ||||
| 		/* still don't know if we will write something. | ||||
| 		 * just mark EOF on the output stream and continue */ | ||||
| 		sed->e.out.eof = 1; | ||||
| 	} | ||||
|  | ||||
| 	if (init_all_commands_for_exec (sed) <= -1) | ||||
| 	{ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user