added qse_runmainwithenv()
This commit is contained in:
		| @ -23,84 +23,138 @@ | ||||
| #include <locale.h> | ||||
| #include "mem.h" | ||||
|  | ||||
| #if defined(_WIN32) && !defined(__MINGW32__) | ||||
|  | ||||
| int qse_runmain (int argc, qse_achar_t* argv[], int(*mf) (int,qse_char_t*[])) | ||||
| int qse_runmain ( | ||||
| 	int argc, qse_achar_t* argv[], qse_runmain_handler_t handler) | ||||
| { | ||||
| 	return mf (argc, argv); | ||||
| } | ||||
| 	setlocale (LC_ALL, ""); /* TODO: remove dependency on setlocale */ | ||||
|  | ||||
| #elif defined(QSE_CHAR_IS_WCHAR) | ||||
|  | ||||
| int qse_runmain (int argc, qse_achar_t* argv[], int(*mf) (int,qse_char_t*[])) | ||||
| { | ||||
| 	int i, ret; | ||||
| 	qse_char_t** v; | ||||
| 	qse_mmgr_t* mmgr = QSE_MMGR_GETDFL (); | ||||
|  | ||||
| 	setlocale (LC_ALL, ""); | ||||
|  | ||||
| 	v = (qse_char_t**) QSE_MMGR_ALLOC ( | ||||
| 		mmgr, argc * QSE_SIZEOF(qse_char_t*)); | ||||
| 	if (v == QSE_NULL) return -1; | ||||
|  | ||||
| 	for (i = 0; i < argc; i++) v[i] = QSE_NULL; | ||||
|  | ||||
| 	for (i = 0; i < argc; i++)  | ||||
| 	if (QSE_SIZEOF(qse_achar_t) == QSE_SIZEOF(qse_char_t)) | ||||
| 	{ | ||||
| 		qse_size_t n, len, nlen; | ||||
| 		qse_size_t mbslen; | ||||
|  | ||||
| 		mbslen = qse_mbslen (argv[i]); | ||||
|  | ||||
| 		n = qse_mbstowcslen (argv[i], &len); | ||||
| 		if (n < mbslen) | ||||
| 		{ | ||||
| 			ret = -1; goto oops; | ||||
| 		} | ||||
|  | ||||
| 		len++; /* include the terminating null */ | ||||
|  | ||||
| 		v[i] = (qse_char_t*) QSE_MMGR_ALLOC ( | ||||
| 			mmgr, len*QSE_SIZEOF(qse_char_t)); | ||||
| 		if (v[i] == QSE_NULL)  | ||||
| 		{ | ||||
| 			ret = -1; goto oops; | ||||
| 		} | ||||
|  | ||||
| 		nlen = len; | ||||
| 		n = qse_mbstowcs (argv[i], v[i], &nlen); | ||||
| 		if (nlen >= len) | ||||
| 		{ | ||||
| 			/* no null-termination */ | ||||
| 			ret = -1; goto oops; | ||||
| 		} | ||||
| 		if (argv[i][n] != '\0') | ||||
| 		{		 | ||||
| 			/* partial processing */ | ||||
| 			ret = -1; goto oops; | ||||
| 		} | ||||
| 		return handler (argc, (qse_char_t**)argv); | ||||
| 	} | ||||
|  | ||||
| 	/* TODO: envp... */ | ||||
| 	//ret = mf (argc, v, QSE_NULL); | ||||
| 	ret = mf (argc, v); | ||||
|  | ||||
| oops: | ||||
| 	for (i = 0; i < argc; i++)  | ||||
| 	else | ||||
| 	{ | ||||
| 		if (v[i] != QSE_NULL) QSE_MMGR_FREE (mmgr, v[i]); | ||||
| 		int i, ret; | ||||
| 		qse_char_t** v; | ||||
| 		qse_mmgr_t* mmgr = QSE_MMGR_GETDFL (); | ||||
|  | ||||
| 		v = (qse_char_t**) QSE_MMGR_ALLOC ( | ||||
| 			mmgr, (argc + 1) * QSE_SIZEOF(qse_char_t*)); | ||||
| 		if (v == QSE_NULL) return -1; | ||||
|  | ||||
| 		for (i = 0; i < argc + 1; i++) v[i] = QSE_NULL; | ||||
|  | ||||
| 		for (i = 0; i < argc; i++) | ||||
| 		{ | ||||
| 			qse_size_t n, len, nlen; | ||||
| 			qse_size_t mbslen; | ||||
|  | ||||
| 			mbslen = qse_mbslen (argv[i]); | ||||
|  | ||||
| 			n = qse_mbstowcslen (argv[i], &len); | ||||
| 			if (n < mbslen)	{ ret = -1; goto oops; } | ||||
|  | ||||
| 			len++; /* include the terminating null */ | ||||
|  | ||||
| 			v[i] = (qse_char_t*) QSE_MMGR_ALLOC ( | ||||
| 				mmgr, len*QSE_SIZEOF(qse_char_t)); | ||||
| 			if (v[i] == QSE_NULL) { ret = -1; goto oops; } | ||||
|  | ||||
| 			nlen = len; | ||||
| 			n = qse_mbstowcs (argv[i], v[i], &nlen); | ||||
| 			if (nlen >= len) | ||||
| 			{ | ||||
| 				/* no null-termination */ | ||||
| 				ret = -1; goto oops; | ||||
| 			} | ||||
| 			if (argv[i][n] != '\0') | ||||
| 			{ | ||||
| 				/* partial processing */ | ||||
| 				ret = -1; goto oops; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		ret = handler (argc, v); | ||||
|  | ||||
| 	oops: | ||||
| 		for (i = 0; i < argc + 1; i++) | ||||
| 		{ | ||||
| 			if (v[i] != QSE_NULL) QSE_MMGR_FREE (mmgr, v[i]); | ||||
| 		} | ||||
| 		QSE_MMGR_FREE (mmgr, v); | ||||
|  | ||||
| 		return ret; | ||||
| 	} | ||||
| 	QSE_MMGR_FREE (mmgr, v); | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| #else | ||||
|  | ||||
| int qse_runmain (int argc, qse_achar_t* argv[], int(*mf) (int,qse_char_t*[])) | ||||
| int qse_runmainwithenv ( | ||||
| 	int argc, qse_achar_t* argv[],  | ||||
| 	qse_achar_t* envp[], qse_runmainwithenv_handler_t handler) | ||||
| { | ||||
| 	return mf (argc, argv); | ||||
| } | ||||
| 	setlocale (LC_ALL, ""); /* TODO: remove dependency on setlocale */ | ||||
|  | ||||
| #endif | ||||
| 	if (QSE_SIZEOF(qse_achar_t) == QSE_SIZEOF(qse_char_t)) | ||||
| 	{ | ||||
| 		return handler (argc, (qse_char_t**)argv, (qse_char_t**)envp); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		int i, ret, envc; | ||||
| 		qse_char_t** v; | ||||
| 		qse_mmgr_t* mmgr = QSE_MMGR_GETDFL (); | ||||
|  | ||||
| 		for (envc = 0; envp[envc]; envc++) ; /* count the number of env items */ | ||||
|  | ||||
| 		v = (qse_char_t**) QSE_MMGR_ALLOC ( | ||||
| 			mmgr, (argc + 1 + envc + 1) * QSE_SIZEOF(qse_char_t*)); | ||||
| 		if (v == QSE_NULL) return -1; | ||||
|  | ||||
| 		for (i = 0; i < argc + 1 + envc + 1; i++) v[i] = QSE_NULL; | ||||
|  | ||||
| 		for (i = 0; i < argc + 1 + envc; i++) | ||||
| 		{ | ||||
| 			qse_size_t n, len, nlen; | ||||
| 			qse_size_t mbslen; | ||||
| 			qse_achar_t* x; | ||||
|  | ||||
| 			if (i < argc) x = argv[i]; | ||||
| 			else if (i == argc) continue; | ||||
| 			else x = envp[i - argc - 1]; | ||||
| 		 | ||||
| 			mbslen = qse_mbslen (x); | ||||
|  | ||||
| 			n = qse_mbstowcslen (x, &len); | ||||
| 			if (n < mbslen) { ret = -1; goto oops; } | ||||
|  | ||||
| 			len++; /* include the terminating null */ | ||||
|  | ||||
| 			v[i] = (qse_char_t*) QSE_MMGR_ALLOC ( | ||||
| 				mmgr, len*QSE_SIZEOF(qse_char_t)); | ||||
| 			if (v[i] == QSE_NULL) { ret = -1; goto oops; } | ||||
|  | ||||
| 			nlen = len; | ||||
| 			n = qse_mbstowcs (x, v[i], &nlen); | ||||
| 			if (nlen >= len) | ||||
| 			{ | ||||
| 				/* no null-termination */ | ||||
| 				ret = -1; goto oops; | ||||
| 			} | ||||
| 			if (x[n] != '\0') | ||||
| 			{ | ||||
| 				/* partial processing */ | ||||
| 				ret = -1; goto oops; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		ret = handler (argc, v, &v[argc + 1]); | ||||
|  | ||||
| 	oops: | ||||
| 		for (i = 0; i < argc + 1 + envc + 1; i++) | ||||
| 		{ | ||||
| 			if (v[i] != QSE_NULL) QSE_MMGR_FREE (mmgr, v[i]); | ||||
| 		} | ||||
| 		QSE_MMGR_FREE (mmgr, v); | ||||
|  | ||||
| 		return ret; | ||||
| 	} | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user