interim commit while writing qse_pio_t functions.
- enhanced qse_pio_init() to handle a wide character string. - added qse_wcsntombsnlen().
This commit is contained in:
		| @ -871,7 +871,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) | ||||
|  | ||||
| 	/* check if it coincides to be a global variable name */ | ||||
| 	g = find_global (awk, name, name_len); | ||||
| 	if (g != QSE_LDA_INVALID) | ||||
| 	if (g != QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		SETERRARG ( | ||||
| 			awk, QSE_AWK_EGBLRED, awk->token.line,  | ||||
| @ -952,7 +952,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) | ||||
|  | ||||
| 			/* check if a parameter conflicts with other parameters */ | ||||
| 			if (qse_lda_search (awk->parse.params,  | ||||
| 				0, param, param_len) != QSE_LDA_INVALID) | ||||
| 				0, param, param_len) != QSE_LDA_NIL) | ||||
| 			{ | ||||
| 				QSE_AWK_FREE (awk, name_dup); | ||||
| 				qse_lda_clear (awk->parse.params); | ||||
| @ -977,7 +977,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) | ||||
| 			if (qse_lda_insert ( | ||||
| 				awk->parse.params,  | ||||
| 				QSE_LDA_SIZE(awk->parse.params),  | ||||
| 				param, param_len) == QSE_LDA_INVALID) | ||||
| 				param, param_len) == QSE_LDA_NIL) | ||||
| 			{ | ||||
| 				QSE_AWK_FREE (awk, name_dup); | ||||
| 				qse_lda_clear (awk->parse.params); | ||||
| @ -1397,7 +1397,7 @@ int qse_awk_initglobals (qse_awk_t* awk) | ||||
| 			QSE_LDA_SIZE(awk->parse.globals), | ||||
| 			(qse_char_t*)gtab[id].name, | ||||
| 			gtab[id].name_len); | ||||
| 		if (g == QSE_LDA_INVALID) return -1; | ||||
| 		if (g == QSE_LDA_NIL) return -1; | ||||
|  | ||||
| 		QSE_ASSERT ((int)g == id); | ||||
|  | ||||
| @ -1479,7 +1479,7 @@ static qse_size_t get_global ( | ||||
|  | ||||
| 	cg.name.ptr = name; | ||||
| 	cg.name.len = len; | ||||
| 	cg.index = QSE_LDA_INVALID; | ||||
| 	cg.index = QSE_LDA_NIL; | ||||
| 	cg.walk = QSE_LDA_WALK_BACKWARD; | ||||
|  | ||||
| 	/* return qse_lda_rsearch ( | ||||
| @ -1497,7 +1497,7 @@ static qse_size_t find_global ( | ||||
|  | ||||
| 	cg.name.ptr = name; | ||||
| 	cg.name.len = len; | ||||
| 	cg.index = QSE_LDA_INVALID; | ||||
| 	cg.index = QSE_LDA_NIL; | ||||
| 	cg.walk = QSE_LDA_WALK_FORWARD; | ||||
|  | ||||
| 	/* return qse_lda_search (awk->parse.globals, 0, name, len); */ | ||||
| @ -1548,7 +1548,7 @@ static int add_global ( | ||||
| 	#endif | ||||
|  | ||||
| 	/* check if it conflicts with other global variable names */ | ||||
| 	if (find_global (awk, name, len) != QSE_LDA_INVALID) | ||||
| 	if (find_global (awk, name, len) != QSE_LDA_NIL) | ||||
| 	{  | ||||
| 		SETERRARG (awk, QSE_AWK_EDUPGBL, line, name, len); | ||||
| 		return -1; | ||||
| @ -1563,7 +1563,7 @@ static int add_global ( | ||||
|  | ||||
| 	if (qse_lda_insert (awk->parse.globals,  | ||||
| 		QSE_LDA_SIZE(awk->parse.globals),  | ||||
| 		(qse_char_t*)name, len) == QSE_LDA_INVALID) | ||||
| 		(qse_char_t*)name, len) == QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		SETERRLIN (awk, QSE_AWK_ENOMEM, line); | ||||
| 		return -1; | ||||
| @ -1625,7 +1625,7 @@ int qse_awk_delglobal ( | ||||
|  | ||||
| 	n = qse_lda_search (awk->parse.globals,  | ||||
| 		QSE_AWK_NUM_STATIC_GLOBALS, name, len); | ||||
| 	if (n == QSE_LDA_INVALID) | ||||
| 	if (n == QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		SETERRARG (awk, QSE_AWK_ENOENT, 0, name, len); | ||||
| 		return -1; | ||||
| @ -1748,7 +1748,7 @@ static qse_awk_t* collect_locals ( | ||||
| 		{ | ||||
| 			/* check if it conflicts with a paremeter name */ | ||||
| 			n = qse_lda_search (awk->parse.params, 0, local.ptr, local.len); | ||||
| 			if (n != QSE_LDA_INVALID) | ||||
| 			if (n != QSE_LDA_NIL) | ||||
| 			{ | ||||
| 				SETERRARG ( | ||||
| 					awk, QSE_AWK_EPARRED, awk->token.line, | ||||
| @ -1762,7 +1762,7 @@ static qse_awk_t* collect_locals ( | ||||
| 			awk->parse.locals,  | ||||
| 			nlocals, /*((awk->option&QSE_AWK_SHADING)? nlocals:0)*/ | ||||
| 			local.ptr, local.len); | ||||
| 		if (n != QSE_LDA_INVALID) | ||||
| 		if (n != QSE_LDA_NIL) | ||||
| 		{ | ||||
| 			SETERRARG ( | ||||
| 				awk, QSE_AWK_EDUPLCL, awk->token.line,  | ||||
| @ -1772,7 +1772,7 @@ static qse_awk_t* collect_locals ( | ||||
|  | ||||
| 		/* check if it conflicts with global variable names */ | ||||
| 		n = find_global (awk, local.ptr, local.len); | ||||
| 		if (n != QSE_LDA_INVALID) | ||||
| 		if (n != QSE_LDA_NIL) | ||||
| 		{ | ||||
|  			if (n < awk->tree.nbglobals) | ||||
| 			{ | ||||
| @ -1804,7 +1804,7 @@ static qse_awk_t* collect_locals ( | ||||
| 		if (qse_lda_insert ( | ||||
| 			awk->parse.locals, | ||||
| 			QSE_LDA_SIZE(awk->parse.locals), | ||||
| 			local.ptr, local.len) == QSE_LDA_INVALID) | ||||
| 			local.ptr, local.len) == QSE_LDA_NIL) | ||||
| 		{ | ||||
| 			SETERRLIN (awk, QSE_AWK_ENOMEM, awk->token.line); | ||||
| 			return QSE_NULL; | ||||
| @ -3211,7 +3211,7 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line) | ||||
| 		if (nde == QSE_NULL) QSE_AWK_FREE (awk, name_dup); | ||||
| 		return (qse_awk_nde_t*)nde; | ||||
| 	} | ||||
| 	else if ((idxa = qse_lda_rsearch (awk->parse.locals, QSE_LDA_SIZE(awk->parse.locals), name_dup, name_len)) != QSE_LDA_INVALID) | ||||
| 	else if ((idxa = qse_lda_rsearch (awk->parse.locals, QSE_LDA_SIZE(awk->parse.locals), name_dup, name_len)) != QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		/* local variable */ | ||||
|  | ||||
| @ -3245,7 +3245,7 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line) | ||||
|  | ||||
| 		return (qse_awk_nde_t*)nde; | ||||
| 	} | ||||
| 	else if ((idxa = qse_lda_search (awk->parse.params, 0, name_dup, name_len)) != QSE_LDA_INVALID) | ||||
| 	else if ((idxa = qse_lda_search (awk->parse.params, 0, name_dup, name_len)) != QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		/* parameter */ | ||||
|  | ||||
| @ -3279,7 +3279,7 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line) | ||||
|  | ||||
| 		return (qse_awk_nde_t*)nde; | ||||
| 	} | ||||
| 	else if ((idxa = get_global (awk, name_dup, name_len)) != QSE_LDA_INVALID) | ||||
| 	else if ((idxa = get_global (awk, name_dup, name_len)) != QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		/* global variable */ | ||||
|  | ||||
| @ -3486,7 +3486,7 @@ static qse_awk_nde_t* parse_hashidx ( | ||||
|  | ||||
| 	/* search the local variable list */ | ||||
| 	idxa = qse_lda_rsearch (awk->parse.locals, QSE_LDA_SIZE(awk->parse.locals), name, name_len); | ||||
| 	if (idxa != QSE_LDA_INVALID) | ||||
| 	if (idxa != QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		nde->type = QSE_AWK_NDE_LOCALIDX; | ||||
| 		nde->line = line; | ||||
| @ -3502,7 +3502,7 @@ static qse_awk_nde_t* parse_hashidx ( | ||||
|  | ||||
| 	/* search the parameter name list */ | ||||
| 	idxa = qse_lda_search (awk->parse.params, 0, name, name_len); | ||||
| 	if (idxa != QSE_LDA_INVALID) | ||||
| 	if (idxa != QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		nde->type = QSE_AWK_NDE_ARGIDX; | ||||
| 		nde->line = line; | ||||
| @ -3518,7 +3518,7 @@ static qse_awk_nde_t* parse_hashidx ( | ||||
|  | ||||
| 	/* gets the global variable index */ | ||||
| 	idxa = get_global (awk, name, name_len); | ||||
| 	if (idxa != QSE_LDA_INVALID) | ||||
| 	if (idxa != QSE_LDA_NIL) | ||||
| 	{ | ||||
| 		nde->type = QSE_AWK_NDE_GLOBALIDX; | ||||
| 		nde->line = line; | ||||
|  | ||||
| @ -4,7 +4,7 @@ AM_CFLAGS = -I$(top_builddir)/include | ||||
|  | ||||
| lib_LTLIBRARIES = libqsecmn.la | ||||
| libqsecmn_la_SOURCES = mem.h chr.h \ | ||||
| 	mem.c chr.c chr_cnv.c rex.c str_bas.c str_cnv.c str_dyn.c \ | ||||
| 	mem.c chr.c chr_cnv.c rex.c str_bas.c str_cnv.c str_dyn.c str_utl.c \ | ||||
| 	lda.c map.c sll.c dll.c opt.c \ | ||||
| 	fio.c pio.c sio.c tio.c tio_get.c tio_put.c \ | ||||
| 	time.c \ | ||||
|  | ||||
| @ -52,9 +52,9 @@ libLTLIBRARIES_INSTALL = $(INSTALL) | ||||
| LTLIBRARIES = $(lib_LTLIBRARIES) | ||||
| libqsecmn_la_DEPENDENCIES = | ||||
| am_libqsecmn_la_OBJECTS = mem.lo chr.lo chr_cnv.lo rex.lo str_bas.lo \ | ||||
| 	str_cnv.lo str_dyn.lo lda.lo map.lo sll.lo dll.lo opt.lo \ | ||||
| 	fio.lo pio.lo sio.lo tio.lo tio_get.lo tio_put.lo time.lo \ | ||||
| 	misc.lo | ||||
| 	str_cnv.lo str_dyn.lo str_utl.lo lda.lo map.lo sll.lo dll.lo \ | ||||
| 	opt.lo fio.lo pio.lo sio.lo tio.lo tio_get.lo tio_put.lo \ | ||||
| 	time.lo misc.lo | ||||
| libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS) | ||||
| libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ | ||||
| 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ | ||||
| @ -196,7 +196,7 @@ AUTOMAKE_OPTIONS = nostdinc | ||||
| AM_CFLAGS = -I$(top_builddir)/include | ||||
| lib_LTLIBRARIES = libqsecmn.la | ||||
| libqsecmn_la_SOURCES = mem.h chr.h \ | ||||
| 	mem.c chr.c chr_cnv.c rex.c str_bas.c str_cnv.c str_dyn.c \ | ||||
| 	mem.c chr.c chr_cnv.c rex.c str_bas.c str_cnv.c str_dyn.c str_utl.c \ | ||||
| 	lda.c map.c sll.c dll.c opt.c \ | ||||
| 	fio.c pio.c sio.c tio.c tio_get.c tio_put.c \ | ||||
| 	time.c \ | ||||
| @ -289,6 +289,7 @@ distclean-compile: | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_bas.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_cnv.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_dyn.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_utl.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tio.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tio_get.Plo@am__quote@ | ||||
|  | ||||
| @ -34,7 +34,6 @@ | ||||
| #define TOB(lda,len) ((len)*(lda)->scale) | ||||
| #define DPTR(node)   ((node)->dptr) | ||||
| #define DLEN(node)   ((node)->dlen) | ||||
| #define INVALID      QSE_LDA_INVALID | ||||
|  | ||||
| static int comp_data (lda_t* lda,  | ||||
| 	const void* dptr1, size_t dlen1,  | ||||
| @ -308,7 +307,7 @@ size_t qse_lda_search (lda_t* lda, size_t pos, const void* dptr, size_t dlen) | ||||
| 			dptr, dlen) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| 	return QSE_LDA_NIL; | ||||
| } | ||||
|  | ||||
| size_t qse_lda_rsearch (lda_t* lda, size_t pos, const void* dptr, size_t dlen) | ||||
| @ -329,7 +328,7 @@ size_t qse_lda_rsearch (lda_t* lda, size_t pos, const void* dptr, size_t dlen) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| 	return QSE_LDA_NIL; | ||||
| } | ||||
|  | ||||
| size_t qse_lda_upsert (lda_t* lda, size_t pos, void* dptr, size_t dlen) | ||||
| @ -345,7 +344,7 @@ size_t qse_lda_insert (lda_t* lda, size_t pos, void* dptr, size_t dlen) | ||||
|  | ||||
| 	/* allocate the node first */ | ||||
| 	node = alloc_node (lda, dptr, dlen); | ||||
| 	if (node == QSE_NULL) return INVALID; | ||||
| 	if (node == QSE_NULL) return QSE_LDA_NIL; | ||||
|  | ||||
| 	/* do resizeing if necessary.  | ||||
| 	 * resizing is performed after node allocation because that way, it  | ||||
| @ -378,7 +377,7 @@ size_t qse_lda_insert (lda_t* lda, size_t pos, void* dptr, size_t dlen) | ||||
| 			if (lda->freeer)  | ||||
| 				lda->freeer (lda, DPTR(node), DLEN(node)); | ||||
| 			QSE_MMGR_FREE (lda->mmgr, node); | ||||
| 			return INVALID; | ||||
| 			return QSE_LDA_NIL; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -388,7 +387,7 @@ size_t qse_lda_insert (lda_t* lda, size_t pos, void* dptr, size_t dlen) | ||||
| 		if (lda->freeer)  | ||||
| 			lda->freeer (lda, DPTR(node), DLEN(node)); | ||||
| 		QSE_MMGR_FREE (lda->mmgr, node); | ||||
| 		return INVALID; | ||||
| 		return QSE_LDA_NIL; | ||||
| 	} | ||||
|  | ||||
| 	/* fill in the gap with QSE_NULL */ | ||||
| @ -410,14 +409,14 @@ size_t qse_lda_update (lda_t* lda, size_t pos, void* dptr, size_t dlen) | ||||
| { | ||||
| 	node_t* c; | ||||
|  | ||||
| 	if (pos >= lda->size) return INVALID; | ||||
| 	if (pos >= lda->size) return QSE_LDA_NIL; | ||||
|  | ||||
| 	c = lda->node[pos]; | ||||
| 	if (c == QSE_NULL) | ||||
| 	{ | ||||
| 		/* no previous data */ | ||||
| 		lda->node[pos] = alloc_node (lda, dptr, dlen); | ||||
| 		if (lda->node[pos] == QSE_NULL) return INVALID; | ||||
| 		if (lda->node[pos] == QSE_NULL) return QSE_LDA_NIL; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| @ -430,7 +429,7 @@ size_t qse_lda_update (lda_t* lda, size_t pos, void* dptr, size_t dlen) | ||||
| 		{ | ||||
| 			/* updated to different data */ | ||||
| 			node_t* node = alloc_node (lda, dptr, dlen); | ||||
| 			if (node == QSE_NULL) return INVALID; | ||||
| 			if (node == QSE_NULL) return QSE_LDA_NIL; | ||||
|  | ||||
| 			if (lda->freeer != QSE_NULL) | ||||
| 				lda->freeer (lda, DPTR(c), DLEN(c)); | ||||
|  | ||||
| @ -17,6 +17,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include <qse/cmn/pio.h> | ||||
| #include <qse/cmn/str.h> | ||||
| #include "mem.h" | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| @ -67,7 +68,15 @@ qse_pio_t* qse_pio_init ( | ||||
| 	qse_pio_t* pio, qse_mmgr_t* mmgr, const qse_char_t* cmd, int flags) | ||||
| { | ||||
| 	qse_pio_pid_t pid; | ||||
| 	qse_pio_hnd_t handle[6] = { -1, -1, -1, -1, -1, -1 }; | ||||
| 	qse_pio_hnd_t handle[6] =  | ||||
| 	{  | ||||
| 		QSE_PIO_HND_NIL,  | ||||
| 		QSE_PIO_HND_NIL, | ||||
| 		QSE_PIO_HND_NIL, | ||||
| 		QSE_PIO_HND_NIL, | ||||
| 		QSE_PIO_HND_NIL, | ||||
| 		QSE_PIO_HND_NIL | ||||
| 	}; | ||||
| 	int i, minidx = -1, maxidx = -1; | ||||
|  | ||||
| 	QSE_ASSERT (QSE_COUNTOF(pio->hanlde) == QSE_COUNTOF(handle)); | ||||
| @ -107,6 +116,14 @@ qse_pio_t* qse_pio_init ( | ||||
| 	{ | ||||
| 		/* child */ | ||||
| 		qse_pio_hnd_t devnull; | ||||
| 		qse_mchar_t* mcmd; | ||||
| 		extern char** environ;  | ||||
| 		int fcnt = 0; | ||||
| 	#ifndef QSE_CHAR_IS_MCHAR | ||||
|        		qse_size_t n, mn, wl; | ||||
| 		qse_char_t* wcmd = QSE_NULL; | ||||
| 		qse_mchar_t buf[64]; | ||||
| 	#endif | ||||
|  | ||||
| 		if (flags & QSE_PIO_WRITEIN) | ||||
| 		{ | ||||
| @ -171,40 +188,88 @@ qse_pio_t* qse_pio_init ( | ||||
| 		if (flags & QSE_PIO_DROPOUT) QSE_CLOSE(1); | ||||
| 		if (flags & QSE_PIO_DROPERR) QSE_CLOSE(2); | ||||
|  | ||||
| 	#ifdef QSE_CHAR_IS_MCHAR | ||||
| 		if (flags & QSE_PIO_SHELL) mcmd = (qse_char_t*)cmd; | ||||
| 		else | ||||
| 		{ | ||||
| 			mcmd =  qse_strdup (cmd, pio->mmgr); | ||||
| 			if (mcmd == QSE_NULL) goto child_oops; | ||||
|  | ||||
| 			fcnt = qse_strspl (mcmd, QSE_T(""),  | ||||
| 				QSE_T('\"'), QSE_T('\"'), QSE_T('\''));  | ||||
| 			if (fcnt <= 0)  | ||||
| 			{ | ||||
| 				/* no field or an error */ | ||||
| 				goto child_oops;  | ||||
| 			} | ||||
| 		} | ||||
| 	#else	 | ||||
| 		if (flags & QSE_PIO_SHELL) | ||||
| 		{ | ||||
| 			const qse_mchar_t* mcmd; | ||||
| 			qse_mchar_t* argv[4]; | ||||
| 			extern char** environ; | ||||
|  | ||||
| 		#ifdef QSE_CHAR_IS_MCHAR | ||||
| 			mcmd = cmd; | ||||
| 		#else	 | ||||
|         		qse_size_t n, mn; | ||||
| 			qse_mchar_t buf[64]; | ||||
|  | ||||
|         		n = qse_wcstombslen (cmd, &mn); | ||||
|        			n = qse_wcstombslen (cmd, &mn); | ||||
| 			if (cmd[n] != QSE_WT('\0'))  | ||||
| 			{ | ||||
| 				/* cmd has illegal sequence */ | ||||
| 				goto child_oops; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			wcmd = qse_strdup (cmd, pio->mmgr); | ||||
| 			if (wcmd == QSE_NULL) goto child_oops; | ||||
|  | ||||
| 			mn = mn + 1; | ||||
|  | ||||
| 			if (mn <= QSE_COUNTOF(buf))  | ||||
| 			fcnt = qse_strspl (wcmd, QSE_T(""),  | ||||
| 				QSE_T('\"'), QSE_T('\"'), QSE_T('\''));  | ||||
| 			if (fcnt <= 0) | ||||
| 			{ | ||||
| 				mcmd = buf; | ||||
| 				mn = QSE_COUNTOF(buf); | ||||
| 				/* no field or an error */ | ||||
| 				goto child_oops; | ||||
| 			} | ||||
| 			else | ||||
| 			 | ||||
| 			for (wl = 0, n = fcnt; n > 0; ) | ||||
| 			{ | ||||
| 				mcmd = QSE_MMGR_ALLOC ( | ||||
| 					pio->mmgr, mn*QSE_SIZEOF(*mcmd)); | ||||
| 				if (mcmd == QSE_NULL) goto child_oops; | ||||
| 				if (wcmd[wl++] == QSE_T('\0')) n--; | ||||
| 			} | ||||
|  | ||||
| 			n = qse_wcstombs (cmd, mcmd, &mn); | ||||
| 			n = qse_wcsntombsnlen (wcmd, wl, &mn); | ||||
| 			if (n != wl) goto child_oops; | ||||
| 		} | ||||
|  | ||||
| 		mn = mn + 1; | ||||
|  | ||||
| 		if (mn <= QSE_COUNTOF(buf))  | ||||
| 		{ | ||||
| 			mcmd = buf; | ||||
| 			mn = QSE_COUNTOF(buf); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			mcmd = QSE_MMGR_ALLOC ( | ||||
| 				pio->mmgr, mn*QSE_SIZEOF(*mcmd)); | ||||
| 			if (mcmd == QSE_NULL) goto child_oops; | ||||
| 		} | ||||
|  | ||||
| 		if (flags & QSE_PIO_SHELL) | ||||
| 		{ | ||||
| 			/* qse_wcstombs() should succeed as  | ||||
| 			 * qse_wcstombslen() was successful above */ | ||||
| 			qse_wcstombs (cmd, mcmd, &mn); | ||||
| 			/* qse_wcstombs() null-terminate mcmd */ | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			QSE_ASSERT (wcmd != QSE_NULL); | ||||
| 			/* qse_wcsntombsn() should succeed as  | ||||
| 			 * qse_wcsntombsnlen() was successful above */ | ||||
| 			qse_wcsntombsn (wcmd, wl, mcmd, &mn); | ||||
| 			/* qse_wcsntombsn() doesn't null-terminate mcmd */ | ||||
| 			mcmd[mn] = QSE_MT('\0'); | ||||
| 		} | ||||
| 	#endif | ||||
|  | ||||
| 		if (flags & QSE_PIO_SHELL) | ||||
| 		{ | ||||
| 			const qse_mchar_t* argv[4]; | ||||
|  | ||||
| 			argv[0] = QSE_MT("/bin/sh"); | ||||
| 			argv[1] = QSE_MT("-c"); | ||||
| @ -215,14 +280,26 @@ qse_pio_t* qse_pio_init ( | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* TODO: need to parse the command in a simple manner */ | ||||
| 			QSE_EXECVE (mcmd, argv, environ); | ||||
| 			int i; | ||||
| 			qse_mchar_t** argv; | ||||
|  | ||||
| 			argv = QSE_MMGR_ALLOC (pio->mmgr, (fcnt+1)*QSE_SIZEOF(argv[0])); | ||||
| 			if (argv == QSE_NULL) goto child_oops; | ||||
|  | ||||
| 			for (i = 0; i < fcnt; i++) | ||||
| 			{ | ||||
| 				argv[i] = mcmd; | ||||
| 				while (*mcmd != QSE_MT('\0')) mcmd++; | ||||
| 				mcmd++; | ||||
| 			} | ||||
| 			argv[i] = QSE_NULL; | ||||
|  | ||||
| 			QSE_EXECVE (argv[0], argv, environ); | ||||
| 		} | ||||
|  | ||||
| 	child_oops: | ||||
| 		QSE_EXIT(127); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	/* parent */ | ||||
| 	pio->child = pid; | ||||
| @ -235,7 +312,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		 * X   | ||||
| 		 * WRITE => 1 | ||||
| 		 */ | ||||
| 		QSE_CLOSE (handle[0]); handle[0] = -1; | ||||
| 		QSE_CLOSE (handle[0]); handle[0] = QSE_PIO_HND_NIL; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READOUT) | ||||
| @ -246,7 +323,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		 *    X | ||||
| 		 * READ => 2 | ||||
| 		 */ | ||||
| 		QSE_CLOSE (handle[3]); handle[3] = -1; | ||||
| 		QSE_CLOSE (handle[3]); handle[3] = QSE_PIO_HND_NIL; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READERR) | ||||
| @ -257,7 +334,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		 *      X    | ||||
| 		 * READ => 4 | ||||
| 		 */ | ||||
| 		QSE_CLOSE (handle[5]); handle[5] = -1; | ||||
| 		QSE_CLOSE (handle[5]); handle[5] = QSE_PIO_HND_NIL; | ||||
| 	} | ||||
|  | ||||
| #endif | ||||
| @ -303,7 +380,7 @@ int qse_pio_wait (qse_pio_t* pio) | ||||
|  | ||||
| 	while (1) | ||||
| 	{ | ||||
| 		n = waitpid (pio->child, &status, opt); | ||||
| 		n = QSE_WAITPID (pio->child, &status, opt); | ||||
| 		if (n == 0) break;  | ||||
| 	/* TODO: .... */ | ||||
| 	} | ||||
| @ -315,13 +392,13 @@ int qse_pio_wait (qse_pio_t* pio) | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| qse_pio_hnd_t qse_pio_gethandle (qse_pio_t* pio, int hid) | ||||
| qse_pio_hnd_t qse_pio_gethandle (qse_pio_t* pio, qse_pio_hid_t hid) | ||||
| { | ||||
| 	return pio->handle[hid]; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_pio_read ( | ||||
| 	qse_pio_t* pio, void* buf, qse_size_t size, int hid) | ||||
| 	qse_pio_t* pio, void* buf, qse_size_t size, qse_pio_hid_t hid) | ||||
| { | ||||
| #ifdef _WIN32 | ||||
| 	DWORD count; | ||||
| @ -329,7 +406,7 @@ qse_ssize_t qse_pio_read ( | ||||
| 	if (ReadFile(pio->handle, buf, size, &count, QSE_NULL) == FALSE) return -1; | ||||
| 	return (qse_ssize_t)count; | ||||
| #else | ||||
| 	if (pio->handle[hid] == -1)  | ||||
| 	if (pio->handle[hid] == QSE_PIO_HND_NIL)  | ||||
| 	{ | ||||
| 		/* the stream is already closed */ | ||||
| 		return (qse_ssize_t)-1; | ||||
| @ -341,7 +418,7 @@ qse_ssize_t qse_pio_read ( | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_pio_write ( | ||||
| 	qse_pio_t* pio, const void* data, qse_size_t size, int hid) | ||||
| 	qse_pio_t* pio, const void* data, qse_size_t size, qse_pio_hid_t hid) | ||||
| { | ||||
| #ifdef _WIN32 | ||||
| 	DWORD count; | ||||
| @ -349,7 +426,7 @@ qse_ssize_t qse_pio_write ( | ||||
| 	if (WriteFile(pio->handle, data, size, &count, QSE_NULL) == FALSE) return -1; | ||||
| 	return (qse_ssize_t)count; | ||||
| #else | ||||
| 	if (pio->handle[hid] == -1) | ||||
| 	if (pio->handle[hid] == QSE_PIO_HND_NIL) | ||||
| 	{ | ||||
| 		/* the stream is already closed */ | ||||
| 		return (qse_ssize_t)-1; | ||||
| @ -360,11 +437,11 @@ qse_ssize_t qse_pio_write ( | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void qse_pio_end (qse_pio_t* pio, int hid) | ||||
| void qse_pio_end (qse_pio_t* pio, qse_pio_hid_t hid) | ||||
| { | ||||
| 	if (pio->handle[hid] != -1) | ||||
| 	if (pio->handle[hid] != QSE_PIO_HND_NIL) | ||||
| 	{ | ||||
| 		QSE_CLOSE (pio->handle[hid]); | ||||
| 		pio->handle[hid] = -1; | ||||
| 		pio->handle[hid] = QSE_PIO_HND_NIL; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -186,6 +186,60 @@ qse_size_t qse_mbsntowcsn ( | ||||
| 	return p - mbs; /* returns the number of bytes processed */ | ||||
| } | ||||
|  | ||||
| qse_size_t qse_wcstombslen (const qse_wchar_t* wcs, qse_size_t* mbslen) | ||||
| { | ||||
| 	const qse_wchar_t* p = wcs; | ||||
| 	qse_mchar_t mbs[32]; | ||||
| 	qse_size_t mlen = 0; | ||||
|  | ||||
| 	while (*p != QSE_WT('\0')) | ||||
| 	{ | ||||
| 		qse_size_t n = qse_wctomb (*p, mbs, QSE_COUNTOF(mbs)); | ||||
| 		if (n == 0) break; /* illegal character */ | ||||
|  | ||||
| 		/* it assumes that mbs is large enough to hold a character */ | ||||
| 		QSE_ASSERT (n <= QSE_COUNTOF(mbs)); | ||||
|  | ||||
| 		p++; mlen += n; | ||||
| 	} | ||||
|  | ||||
| 	/* this length excludes the terminating null character. */ | ||||
| 	*mbslen = mlen; | ||||
|  | ||||
| 	/* returns the number of characters handled.  | ||||
| 	 * if the function has encountered an illegal character in | ||||
| 	 * the while loop above, wcs[p-wcs] will not be a null character */ | ||||
| 	return p - wcs;   | ||||
| } | ||||
|  | ||||
| qse_size_t qse_wcsntombsnlen ( | ||||
| 	const qse_wchar_t* wcs, qse_size_t wcslen, qse_size_t* mbslen) | ||||
| { | ||||
| 	const qse_wchar_t* p = wcs; | ||||
| 	const qse_wchar_t* end = wcs + wcslen; | ||||
| 	qse_mchar_t mbs[32]; | ||||
| 	qse_size_t mlen = 0; | ||||
|  | ||||
| 	while (p < end) | ||||
| 	{ | ||||
| 		qse_size_t n = qse_wctomb (*p, mbs, QSE_COUNTOF(mbs)); | ||||
| 		if (n == 0) break; /* illegal character */ | ||||
|  | ||||
| 		/* it assumes that mbs is large enough to hold a character */ | ||||
| 		QSE_ASSERT (n <= QSE_COUNTOF(mbs)); | ||||
|  | ||||
| 		p++; mlen += n; | ||||
| 	} | ||||
|  | ||||
| 	/* this length excludes the terminating null character. */ | ||||
| 	*mbslen = mlen; | ||||
|  | ||||
| 	/* returns the number of characters handled.  | ||||
| 	 * if the function has encountered an illegal character in | ||||
| 	 * the while loop above, wcs[p-wcs] will not be a null character */ | ||||
| 	return p - wcs;   | ||||
| } | ||||
|  | ||||
| qse_size_t qse_wcstombs ( | ||||
| 	const qse_wchar_t* wcs, qse_mchar_t* mbs, qse_size_t* mbslen) | ||||
| { | ||||
| @ -221,32 +275,6 @@ qse_size_t qse_wcstombs ( | ||||
| 	return p - wcs;  | ||||
| } | ||||
|  | ||||
| qse_size_t qse_wcstombslen (const qse_wchar_t* wcs, qse_size_t* mbslen) | ||||
| { | ||||
| 	const qse_wchar_t* p = wcs; | ||||
| 	qse_mchar_t mbs[32]; | ||||
| 	qse_size_t mlen = 0; | ||||
|  | ||||
| 	while (*p != QSE_WT('\0')) | ||||
| 	{ | ||||
| 		qse_size_t n = qse_wctomb (*p, mbs, QSE_COUNTOF(mbs)); | ||||
| 		if (n == 0) break; /* illegal character */ | ||||
|  | ||||
| 		/* it assumes that mbs is large enough to hold a character */ | ||||
| 		QSE_ASSERT (n <= QSE_COUNTOF(mbs)); | ||||
|  | ||||
| 		p++; mlen += n; | ||||
| 	} | ||||
|  | ||||
| 	/* this length excludes the terminating null character. */ | ||||
| 	*mbslen = mlen; | ||||
|  | ||||
| 	/* returns the number of characters handled.  | ||||
| 	 * if the function has encountered an illegal character in | ||||
| 	 * the while loop above, wcs[p-wcs] will not be a null character */ | ||||
| 	return p - wcs;   | ||||
| } | ||||
|  | ||||
| qse_size_t qse_wcsntombsn ( | ||||
| 	const qse_wchar_t* wcs, qse_size_t wcslen, | ||||
| 	qse_mchar_t* mbs, qse_size_t* mbslen) | ||||
|  | ||||
| @ -16,18 +16,17 @@ | ||||
|    limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #includle <qse/cmn/str.h> | ||||
| #include <qse/cmn/str.h> | ||||
| #include "chr.h" | ||||
|  | ||||
| int qse_strspl ( | ||||
| 	qse_char_t* s, const qse_char_t* delim, | ||||
| 	qse_char_t lquote, qse_char_t rquote, | ||||
| 	qse_char_t escape, qse_size_t* count) | ||||
| 	qse_char_t lquote, qse_char_t rquote, qse_char_t escape) | ||||
| { | ||||
| 	qse_char_t* p = s, *d; | ||||
| 	qse_char_t* sp = QSE_NULL, * ep = QSE_NULL; | ||||
| 	int delim_mode; | ||||
| 	qse_size_t cnt = 0; | ||||
| 	int cnt = 0; | ||||
|  | ||||
| 	if (delim == QSE_NULL) delim_mode = 0; | ||||
| 	else  | ||||
| @ -258,25 +257,6 @@ exit_point: | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	*count = cnt; | ||||
| 	return 0; | ||||
| 	return cnt; | ||||
| } | ||||
|  | ||||
| int qse_strspls ( | ||||
| 	qse_char_t* s, const qse_char_t* delim, | ||||
| 	qse_char_t lquote, qse_char_t rquote, | ||||
| 	qse_char_t escape, qse_size_t* count, qse_char_t* ptrs[]) | ||||
| { | ||||
| 	qse_size_t cnt = *count, i; | ||||
|  | ||||
| 	if (qse_strspl (s, delim, lquote, rquote, escape, count) == -1) return -1; | ||||
| 	for (i = 0; i < *count && i < cnt; i++)  | ||||
| 	{ | ||||
| 		ptrs[i] = s; | ||||
| 		s += qse_strlen(s) + 1; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user