rewrote assertion output function to remove dependency on sio
This commit is contained in:
		| @ -1194,6 +1194,7 @@ int qse_main (int argc, qse_achar_t* argv[]) | |||||||
| #else | #else | ||||||
| 	/* nothing special */ | 	/* nothing special */ | ||||||
| #endif | #endif | ||||||
|  | QSE_ASSERT (1 == 3); | ||||||
|  |  | ||||||
| #if defined(_WIN32) | #if defined(_WIN32) | ||||||
| 	codepage = GetConsoleOutputCP(); | 	codepage = GetConsoleOutputCP(); | ||||||
|  | |||||||
| @ -57,180 +57,191 @@ | |||||||
| #	include "syscall.h" | #	include "syscall.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #define NTOC(n) (QSE_MT("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")[n]) |  | ||||||
| #define WRITE_CHAR(sio,c) \ |  | ||||||
| do { \ |  | ||||||
| 	qse_mchar_t __xxx_c = c; \ |  | ||||||
| 	if (qse_sio_putmbsn (sio, &__xxx_c, 1) != 1) return -1; \ |  | ||||||
| } while (0) |  | ||||||
|  |  | ||||||
| static int write_num (qse_sio_t* sio, qse_size_t x, int base) |  | ||||||
| { |  | ||||||
| 	qse_size_t last = x % base; |  | ||||||
| 	qse_size_t y = 0;  |  | ||||||
| 	int dig = 0; |  | ||||||
|  |  | ||||||
| 	x = x / base; |  | ||||||
|  |  | ||||||
| 	while (x > 0) |  | ||||||
| 	{ |  | ||||||
| 		y = y * base + (x % base); |  | ||||||
| 		x = x / base; |  | ||||||
| 		dig++; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	while (y > 0) |  | ||||||
| 	{ |  | ||||||
| 		WRITE_CHAR (sio, NTOC(y % base)); |  | ||||||
| 		y = y / base; |  | ||||||
| 		dig--; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	while (dig > 0)  |  | ||||||
| 	{  |  | ||||||
| 		dig--;  |  | ||||||
| 		WRITE_CHAR (sio, QSE_T('0')); |  | ||||||
| 	} |  | ||||||
| 	WRITE_CHAR (sio, NTOC(last)); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void qse_assert_failed ( | void qse_assert_failed ( | ||||||
| 	const qse_char_t* expr, const qse_char_t* desc,  | 	const qse_char_t* expr, const qse_char_t* desc,  | ||||||
| 	const qse_char_t* file, qse_size_t line) | 	const qse_char_t* file, qse_size_t line) | ||||||
| { | { | ||||||
| #if defined(macintosh) | #if defined(_WIN32) | ||||||
|  | 	HANDLE stderr; | ||||||
|  |  | ||||||
|  | 	stderr = GetStdHandle (STD_ERROR_HANDLE); | ||||||
|  | 	if (stderr != INVALID_HANDLE_VALUE) | ||||||
|  | 	{ | ||||||
|  | 		DWORD mode; | ||||||
|  | 		if (GetConsoleMode (stderr, &mode) == FALSE) | ||||||
|  | 			stderr = INVALID_HANDLE_VALUE; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (stderr == INVALID_HANDLE_VALUE) | ||||||
|  | 	{ | ||||||
|  | 		/* Use a message box if stderr is not available */ | ||||||
|  |  | ||||||
|  | 		qse_char_t tmp[1024]; | ||||||
|  | 		qse_strxfmt (tmp, QSE_COUNTOF(tmp),  | ||||||
|  | 			QSE_T("FILE %s LINE %lu - %s%s%s"),  | ||||||
|  | 			file, line, expr,  | ||||||
|  | 			(desc? QSE_T("\n\n"): QSE_T("")), | ||||||
|  | 			(desc? desc: QSE_T("")) | ||||||
|  | 		); | ||||||
|  | 		MessageBox (QSE_NULL, tmp, QSE_T("ASSERTION FAILURE"), MB_OK | MB_ICONERROR); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		qse_char_t tmp[1024]; | ||||||
|  | 		DWORD written; | ||||||
|  |  | ||||||
|  | 		WriteConsole (stderr, QSE_T("[ASSERTION FAILURE]\r\n"), 21, &written, STIO_NULL); | ||||||
|  |  | ||||||
|  | 		qse_strxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %s LINE %lu\r\n"), file, (unsigned long)line); | ||||||
|  | 		WriteConsole (stderr, tmp, qse_strlen(tmp), &written, STIO_NULL); | ||||||
|  |  | ||||||
|  | 		WriteConsoel (stderr, QSE_T("[EXPRESSION] "), 13, &written, STIO_NULL); | ||||||
|  | 		WriteConsole (stderr, expr, qse_strlen(expr), &written, STIO_NULL); | ||||||
|  | 		WriteConsole (stderr, QSE_T("\r\n"), 2, &written, STIO_NULL); | ||||||
|  |  | ||||||
|  | 		if (desc) | ||||||
|  | 		{ | ||||||
|  | 			WriteConsole (stderr, QSE_T("[DESCRIPTION] "), 14, &written, STIO_NULL); | ||||||
|  | 			WriteConsole (stderr, desc, qse_strlen(desc), &written, STIO_NULL); | ||||||
|  | 			WriteConsole (stderr, QSE_T("\r\n"), 2, &written, STIO_NULL); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | #elif defined(__OS2__) | ||||||
|  | 	HFILE stderr = (HFILE)2; | ||||||
|  | 	USHORT written; | ||||||
|  | 	qse_mchar_t tmp[1024]; | ||||||
|  |  | ||||||
|  | 	DosWrite (stderr, QSE_T("[ASSERTION FAILURE]\r\n"), 21, &written); | ||||||
|  |  | ||||||
|  | 	#if defined(QSE_CHAR_IS_MCHAR) | ||||||
|  | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %hs LINE %lu\n"), file, (unsigned long)line); | ||||||
|  | 	#else | ||||||
|  | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %ls LINE %lu\n"), file, (unsigned long)line); | ||||||
|  | 	#endif | ||||||
|  | 	DosWrite (stderr, tmp, qse_mbslen(tmp), &written); | ||||||
|  |  | ||||||
|  | 	#if defined(QSE_CHAR_IS_MCHAR) | ||||||
|  | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[EXPRESSION] %hs\n"), expr); | ||||||
|  | 	#else | ||||||
|  | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[EXPRESSION] %ls\n"), expr); | ||||||
|  | 	#endif | ||||||
|  | 	DosWrite (stderr, tmp, qse_mbslen(tmp), &written); | ||||||
|  |  | ||||||
|  | 	if (desc) | ||||||
|  | 	{ | ||||||
|  | 	#if defined(QSE_CHAR_IS_MCHAR) | ||||||
|  | 		qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[DESCRIPTION] %hs\n"), desc); | ||||||
|  | 	#else | ||||||
|  | 		qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[DESCRIPTION] %ls\n"), desc); | ||||||
|  | 	#endif | ||||||
|  | 		DosWrite (stderr, tmp, qse_mbslen(tmp), &written); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #elif defined(macintosh) | ||||||
| 	/* note 'desc' is not used for macintosh at this moment. | 	/* note 'desc' is not used for macintosh at this moment. | ||||||
| 	 * TODO: include 'desc' in the message */ | 	 * TODO: include 'desc' in the message */ | ||||||
|  |  | ||||||
| 	Str255 ptitle; | 	Str255 ptitle; | ||||||
| 	Str255 ptext; | 	Str255 ptext; | ||||||
| 	SInt16 res; | 	SInt16 res; | ||||||
|  |  | ||||||
| 	{ | 	qse_mchar_t tmp[256]; | ||||||
| 		qse_mchar_t tmp[256]; |  | ||||||
|  |  | ||||||
| 	#if defined(QSE_CHAR_IS_MCHAR) | 	#if defined(QSE_CHAR_IS_MCHAR) | ||||||
| 		qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("ASSERTION FAILURE AT FILE %hs LINE %lu"), file, (unsigned long)line); | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("ASSERTION FAILURE AT FILE %hs LINE %lu"), file, (unsigned long)line); | ||||||
| 	#else | 	#else | ||||||
| 		qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("ASSERTION FAILURE AT FILE %ls LINE %lu"), file, (unsigned long)line); | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("ASSERTION FAILURE AT FILE %ls LINE %lu"), file, (unsigned long)line); | ||||||
| 	#endif | 	#endif | ||||||
| 		CopyCStringToPascal (tmp, ptitle); | 	CopyCStringToPascal (tmp, ptitle); | ||||||
|  |  | ||||||
| 	#if defined(QSE_CHAR_IS_MCHAR) | 	#if defined(QSE_CHAR_IS_MCHAR) | ||||||
| 		CopyCStringToPascal (expr, ptext); | 	CopyCStringToPascal (expr, ptext); | ||||||
| 	#else | 	#else | ||||||
| 		qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("%ls"), expr); | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("%ls"), expr); | ||||||
| 		CopyCStringToPascal (tmp, ptext); | 	CopyCStringToPascal (tmp, ptext); | ||||||
| 	#endif | 	#endif | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	InitCursor (); | 	InitCursor (); | ||||||
| 	StandardAlert (kAlertStopAlert, ptitle, ptext, nil, &res); | 	StandardAlert (kAlertStopAlert, ptitle, ptext, nil, &res); | ||||||
|  |  | ||||||
| #else  /* macintosh */ | /* | ||||||
|  | #elif defined(vms) || defined(__vms) | ||||||
|  | 	WHAT TO DO???? | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |  | ||||||
| #if defined(HAVE_BACKTRACE) | 	static qse_mchar_t* static_msg[] =  | ||||||
| 	void* btarray[128]; |  | ||||||
| 	qse_size_t btsize, i; |  | ||||||
| 	char** btsyms; |  | ||||||
| #endif |  | ||||||
| 	qse_sio_t* sio, siobuf; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	#if defined(_WIN32) |  | ||||||
| 	{ | 	{ | ||||||
| 		HANDLE stderr; | 		QSE_MT("=[ASSERTION FAILURE]============================================================\n"), | ||||||
|  | 		QSE_MT("                         __ \n"), | ||||||
|  | 		QSE_MT(" _____ _____ _____ _____|  |\n"), | ||||||
|  | 		QSE_MT("|     |     |  _  |   __|  |\n"), | ||||||
|  | 		QSE_MT("|  |  |  |  |   __|__   |__|\n"), | ||||||
|  | 		QSE_MT("|_____|_____|__|  |_____|__|\n"), | ||||||
|  | 		QSE_MT("                            \n") | ||||||
|  | 	}; | ||||||
|  | 	static qse_mchar_t* static_bthdr = QSE_MT("=[BACKTRACES]===================================================================\n"); | ||||||
|  | 	static qse_mchar_t* static_footer= QSE_MT("================================================================================\n"); | ||||||
|  |  | ||||||
| 		stderr = GetStdHandle (STD_ERROR_HANDLE); | 	qse_mchar_t tmp[1024]; | ||||||
| 		if (stderr != INVALID_HANDLE_VALUE) | 	qse_size_t i; | ||||||
| 		{ |  | ||||||
| 			DWORD mode; |  | ||||||
| 			if (GetConsoleMode (stderr, &mode) == FALSE) |  | ||||||
| 				stderr = INVALID_HANDLE_VALUE; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if (stderr == INVALID_HANDLE_VALUE) | 	#if defined(HAVE_BACKTRACE) | ||||||
| 		{ | 	void* btarray[128]; | ||||||
| 			/* Use a message box if stderr is not available */ | 	qse_size_t btsize; | ||||||
|  | 	char** btsyms; | ||||||
| 			qse_char_t tmp[512]; |  | ||||||
| 			qse_strxfmt (tmp, QSE_COUNTOF(tmp),  |  | ||||||
| 				QSE_T("FILE %s LINE %lu - %s%s%s"),  |  | ||||||
| 				file, line, expr,  |  | ||||||
| 				(desc? QSE_T("\n\n"): QSE_T("")), |  | ||||||
| 				(desc? desc: QSE_T("")) |  | ||||||
| 			); |  | ||||||
| 			MessageBox (QSE_NULL, tmp, QSE_T("ASSERTION FAILURE"), MB_OK | MB_ICONERROR); |  | ||||||
| 			goto done; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	#endif | 	#endif | ||||||
|  |  | ||||||
| 	sio = &siobuf; | 	for (i = 0; i < QSE_COUNTOF(static_msg); i++) | ||||||
| 	qse_sio_initstd ( |  | ||||||
| 		sio, QSE_MMGR_GETDFL(), QSE_SIO_STDERR,  |  | ||||||
| 		QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_NOAUTOFLUSH); |  | ||||||
|  |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("=[ASSERTION FAILURE]============================================================\n")); |  | ||||||
|  |  | ||||||
| #if 1 |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("                         __ \n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT(" _____ _____ _____ _____|  |\n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("|     |     |  _  |   __|  |\n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("|  |  |  |  |   __|__   |__|\n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("|_____|_____|__|  |_____|__|\n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("                            \n")); |  | ||||||
| #else |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("                            __ \n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT(" _____ _____ _____ _____   |  |\n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("|     |     |  _  |   __|  |  |\n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("|  |  |  |  |   __|__   |  |__|\n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("|_____|_____|__|  |_____|  |__|\n")); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("                            __ \n")); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("FILE: ")); |  | ||||||
| 	qse_sio_putstr (sio, file); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT(" LINE: ")); |  | ||||||
|  |  | ||||||
| 	write_num (sio, line, 10); |  | ||||||
|  |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("\nEXPRESSION: ")); |  | ||||||
| 	qse_sio_putstr (sio, expr); |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("\n")); |  | ||||||
|  |  | ||||||
| 	if (desc != QSE_NULL) |  | ||||||
| 	{ | 	{ | ||||||
| 		qse_sio_putmbs (sio, QSE_MT("DESCRIPTION: ")); | 		write (2, static_msg[i], qse_mbslen(static_msg[i])); | ||||||
| 		qse_sio_putstr (sio, desc); |  | ||||||
| 		qse_sio_putmbs (sio, QSE_MT("\n")); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #if defined(HAVE_BACKTRACE) | 	#if defined(QSE_CHAR_IS_MCHAR) | ||||||
|  | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %hs LINE %lu\n"), file, (unsigned long)line); | ||||||
|  | 	#else | ||||||
|  | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %ls LINE %lu\n"), file, (unsigned long)line); | ||||||
|  | 	#endif | ||||||
|  | 	write (2, tmp, qse_mbslen(tmp)); | ||||||
|  |  | ||||||
|  | 	#if defined(QSE_CHAR_IS_MCHAR) | ||||||
|  | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[EXPRESSION] %hs\n"), expr); | ||||||
|  | 	#else | ||||||
|  | 	qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[EXPRESSION] %ls\n"), expr); | ||||||
|  | 	#endif | ||||||
|  | 	write (2, tmp, qse_mbslen(tmp)); | ||||||
|  |  | ||||||
|  | 	if (desc) | ||||||
|  | 	{ | ||||||
|  | 	#if defined(QSE_CHAR_IS_MCHAR) | ||||||
|  | 		qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[DESCRIPTION] %hs\n"), desc); | ||||||
|  | 	#else | ||||||
|  | 		qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[DESCRIPTION] %ls\n"), desc); | ||||||
|  | 	#endif | ||||||
|  | 		write (2, tmp, qse_mbslen(tmp)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	#if defined(HAVE_BACKTRACE) | ||||||
| 	btsize = backtrace (btarray, QSE_COUNTOF(btarray)); | 	btsize = backtrace (btarray, QSE_COUNTOF(btarray)); | ||||||
| 	btsyms = backtrace_symbols (btarray, btsize); | 	btsyms = backtrace_symbols (btarray, btsize); | ||||||
| 	if (btsyms != QSE_NULL) | 	if (btsyms != QSE_NULL) | ||||||
| 	{ | 	{ | ||||||
| 		qse_sio_putmbs (sio, QSE_MT("=[BACKTRACES]===================================================================\n")); | 		write (2, static_bthdr, qse_mbslen(static_bthdr)); | ||||||
|  |  | ||||||
| 		for (i = 0; i < btsize; i++) | 		for (i = 0; i < btsize; i++) | ||||||
| 		{ | 		{ | ||||||
| 			qse_sio_putmbs (sio, btsyms[i]); | 			write (2, btsyms[i], qse_mbslen(btsyms[i])); | ||||||
| 			qse_sio_putmbs (sio, QSE_MT("\n")); | 			write (2, QSE_MT("\n"), 1); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		free (btsyms); | 		free (btsyms); | ||||||
| 	} | 	} | ||||||
|  | 	#endif | ||||||
|  |  | ||||||
|  | 	write (2, static_footer, qse_mbslen(static_footer)); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	qse_sio_putmbs (sio, QSE_MT("================================================================================\n")); |  | ||||||
| 	qse_sio_flush (sio); |  | ||||||
| 	qse_sio_fini (sio); |  | ||||||
| #endif /* macintosh */ |  | ||||||
|  |  | ||||||
| done: |  | ||||||
| #if defined(_WIN32) | #if defined(_WIN32) | ||||||
| 	ExitProcess (249); | 	ExitProcess (249); | ||||||
| #elif defined(__OS2__) | #elif defined(__OS2__) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user