Olav SørensenPushed v1.45 code8af2e425 years agoHistory
334 lines · 6.2 KB · C
RawDownload
// for finding memory leaks in debug mode with Visual Studio#if defined _DEBUG && defined _MSC_VER#include <crtdbg.h>#endif #include <stdlib.h>#include <string.h>#include <stdint.h>#include <stdbool.h>#ifdef _WIN32#define WIN32_LEAN_AND_MEAN#include <windows.h>#else#include <iconv.h>#endif#include "ft2_unicode.h" #ifdef _WIN32 // Windows routineschar *cp437ToUtf8(char *src){	int32_t retVal; 	if (src == NULL)		return NULL; 	int32_t srcLen = (int32_t)strlen(src);	if (srcLen <= 0)		return NULL; 	int32_t reqSize = MultiByteToWideChar(437, 0, src, srcLen, 0, 0);	if (reqSize <= 0)		return NULL; 	wchar_t *w = (wchar_t *)malloc((reqSize + 1) * sizeof (wchar_t));	if (w == NULL)		return NULL; 	w[reqSize] = 0; 	retVal = MultiByteToWideChar(437, 0, src, srcLen, w, reqSize);	if (!retVal)	{		free(w);		return NULL;	} 	srcLen = (int32_t)wcslen(w);	if (srcLen <= 0)		return NULL; 	reqSize = WideCharToMultiByte(CP_UTF8, 0, w, srcLen, 0, 0, 0, 0);	if (reqSize <= 0)	{		free(w);		return NULL;	} 	char *x = (char *)malloc((reqSize + 1) * sizeof (char));	if (x == NULL)	{		free(w);		return NULL;	} 	x[reqSize] = '\0'; 	retVal = WideCharToMultiByte(CP_UTF8, 0, w, srcLen, x, reqSize, 0, 0);	free(w); 	if (!retVal)	{		free(x);		return NULL;	} 	return x;} UNICHAR *cp437ToUnichar(char *src){	if (src == NULL)		return NULL; 	int32_t srcLen = (int32_t)strlen(src);	if (srcLen <= 0)		return NULL; 	int32_t reqSize = MultiByteToWideChar(437, 0, src, srcLen, 0, 0);	if (reqSize <= 0)		return NULL; 	UNICHAR *w = (wchar_t *)malloc((reqSize + 1) * sizeof (wchar_t));	if (w == NULL)		return NULL; 	w[reqSize] = 0; 	int32_t retVal = MultiByteToWideChar(437, 0, src, srcLen, w, reqSize);	if (!retVal)	{		free(w);		return NULL;	} 	return w;} char *utf8ToCp437(char *src, bool removeIllegalChars){	if (src == NULL)		return NULL; 	int32_t srcLen = (int32_t)strlen(src);	if (srcLen <= 0)		return NULL; 	int32_t reqSize = MultiByteToWideChar(CP_UTF8, 0, src, srcLen, 0, 0);	if (reqSize <= 0)		return NULL; 	wchar_t *w = (wchar_t *)malloc((reqSize + 1) * sizeof (wchar_t));	if (w == NULL)		return NULL; 	w[reqSize] = 0; 	int32_t retVal = MultiByteToWideChar(CP_UTF8, 0, src, srcLen, w, reqSize);	if (!retVal)	{		free(w);		return NULL;	} 	srcLen = (int32_t)wcslen(w);	if (srcLen <= 0)	{		free(w);		return NULL;	} 	reqSize = WideCharToMultiByte(437, 0, w, srcLen, 0, 0, 0, 0);	if (reqSize <= 0)	{		free(w);		return NULL;	} 	char *x = (char *)malloc((reqSize + 1) * sizeof (char));	if (x == NULL)	{		free(w);		return NULL;	} 	x[reqSize] = '\0'; 	retVal = WideCharToMultiByte(437, 0, w, srcLen, x, reqSize, 0, 0);	free(w); 	if (!retVal)	{		free(x);		return NULL;	} 	if (removeIllegalChars)	{		// remove illegal characters (only allow certain nordic ones)		for (int32_t i = 0; i < reqSize; i++)		{			const int8_t ch = (const int8_t)x[i];			if (ch < 32 && ch != 0 && ch != -124 && ch != -108 &&			    ch != -122 && ch != -114 && ch != -103 && ch != -113)			{				x[i] = ' '; // character not allowed, turn it into space			}		}	} 	return x;} char *unicharToCp437(UNICHAR *src, bool removeIllegalChars){	if (src == NULL)		return NULL; 	int32_t srcLen = (int32_t)UNICHAR_STRLEN(src);	if (srcLen <= 0)		return NULL; 	int32_t reqSize = WideCharToMultiByte(437, 0, src, srcLen, 0, 0, 0, 0);	if (reqSize <= 0)		return NULL; 	char *x = (char *)malloc((reqSize + 1) * sizeof (char));	if (x == NULL)		return NULL; 	x[reqSize] = '\0'; 	int32_t retVal = WideCharToMultiByte(437, 0, src, srcLen, x, reqSize, 0, 0);	if (!retVal)	{		free(x);		return NULL;	} 	if (removeIllegalChars)	{		// remove illegal characters (only allow certain nordic ones)		for (int32_t i = 0; i < reqSize; i++)		{			const int8_t ch = (const int8_t)x[i];			if (ch < 32 && ch != 0 && ch != -124 && ch != -108 &&				ch != -122 && ch != -114 && ch != -103 && ch != -113)			{				x[i] = ' '; // character not allowed, turn it into space			}		}	} 	return x;} #else // non-Windows routineschar *cp437ToUtf8(char *src){	if (src == NULL)		return NULL; 	size_t srcLen = strlen(src);	if (srcLen <= 0)		return NULL; 	iconv_t cd = iconv_open("UTF-8", "437");	if (cd == (iconv_t)-1)		return NULL; 	size_t outLen = srcLen * 2; // should be sufficient 	char *outBuf = (char *)malloc((outLen + 1) * sizeof (char));	if (outBuf == NULL)		return NULL; 	char *inPtr = src;	size_t inLen = srcLen;	char *outPtr = outBuf; #if defined(__NetBSD__) || defined(__sun) || defined(sun)	int32_t rc = iconv(cd, (const char **)&inPtr, &inLen, &outPtr, &outLen);#else	int32_t rc = iconv(cd, &inPtr, &inLen, &outPtr, &outLen);#endif	iconv(cd, NULL, NULL, &outPtr, &outLen); // flush	iconv_close(cd); 	if (rc == -1)	{		free(outBuf);		return NULL;	} 	outBuf[outLen] = '\0'; 	return outBuf;} char *utf8ToCp437(char *src, bool removeIllegalChars){	if (src == NULL)		return NULL; 	size_t srcLen = strlen(src);	if (srcLen <= 0)		return NULL; #ifdef __APPLE__	iconv_t cd = iconv_open("437//TRANSLIT//IGNORE", "UTF-8-MAC");#elif defined(__NetBSD__) || defined(__sun) || defined(sun)	iconv_t cd = iconv_open("437", "UTF-8");#else	iconv_t cd = iconv_open("437//TRANSLIT//IGNORE", "UTF-8");#endif	if (cd == (iconv_t)-1)		return NULL; 	size_t outLen = srcLen * 2; // should be sufficient 	char *outBuf = (char *)malloc((outLen + 1) * sizeof (char));	if (outBuf == NULL)		return NULL; 	char *inPtr = src;	size_t inLen = srcLen;	char *outPtr = outBuf; #if defined(__NetBSD__) || defined(__sun) || defined(sun)	int32_t rc = iconv(cd, (const char **)&inPtr, &inLen, &outPtr, &outLen);#else	int32_t rc = iconv(cd, &inPtr, &inLen, &outPtr, &outLen);#endif	iconv(cd, NULL, NULL, &outPtr, &outLen); // flush	iconv_close(cd); 	if (rc == -1)	{		free(outBuf);		return NULL;	} 	outBuf[outLen] = '\0'; 	if (removeIllegalChars)	{		// remove illegal characters (only allow certain nordic ones)		for (size_t i = 0; i < outLen; i++)		{			const int8_t ch = (const int8_t)outBuf[i];			if (ch < 32 && ch != 0 && ch != -124 && ch != -108 &&				ch != -122 && ch != -114 && ch != -103 && ch != -113)			{				outBuf[i] = ' '; // character not allowed, turn it into space			}		}	} 	return outBuf;}#endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t