File:  [RetroPC.NET] / xmil / common / ucscnv.c
Revision 1.3: download - view: text, annotated - select for diffs
Tue Jun 3 05:07:30 2008 JST (17 years, 4 months ago) by yui
Branches: MAIN
CVS tags: HEAD
change to c style comment

#include	"compiler.h"
#include	"ucscnv.h"


/* UCS2 */

UINT ucscnv_utf8toucs2(UINT16 *dst, UINT dcnt, const char *src, UINT scnt) {

	UINT	orgdcnt;
	UINT	c;

	if (dcnt == 0) {
		dst = NULL;
	}
	else {
		dcnt--;
	}
	orgdcnt = dcnt;
	while(dcnt) {
		if ((scnt == 0) || (src[0] == '\0')) {
			break;
		}
		else if (!(src[0] & 0x80)) {
			c = src[0];
			src += 1;
			scnt -= 1;
		}
		else if ((src[0] & 0xe0) == 0xc0) {
			if ((scnt < 2) || ((src[1] & 0xc0) != 0x80)) {
				break;
			}
			c = ((src[0] & 0x1f) << 6) + (src[1] & 0x3f);
			src += 2;
			scnt -= 2;
		}
		else if ((src[0] & 0xf0) == 0xe0) {
			if ((scnt < 3) ||
				((src[1] & 0xc0) != 0x80) || ((src[2] & 0xc0) != 0x80)) {
				break;
			}
			c = ((src[0] & 0x0f) << 12) +
								((src[1] & 0x3f) << 6) + (src[2] & 0x3f);
			src += 3;
			scnt -= 3;
		}
		else {
			break;
		}
		dcnt--;
		if (dst) {
			dst[0] = (UINT16)c;
			dst += 1;
		}
	}
	if (dst) {
		dst[0] = '\0';
	}
	return((UINT)(orgdcnt - dcnt));
}

UINT ucscnv_ucs2toutf8(char *dst, UINT dcnt, const UINT16 *src, UINT scnt) {

	UINT	orgdcnt;
	UINT	c;

	if (dcnt == 0) {
		dst = NULL;
	}
	else {
		dcnt--;
	}
	orgdcnt = dcnt;
	while(dcnt) {
		if (scnt == 0) {
			break;
		}
		scnt--;
		c = *src++;
		if (!c) {
			break;
		}
		else if (c < 0x80) {
			dcnt--;
			if (dst) {
				dst[0] = (char)c;
				dst += 1;
			}
		}
		else if (c < 0x800) {
			if (dcnt < 2) {
				break;
			}
			dcnt -= 2;
			if (dst) {
				dst[0] = (char)(0xc0 + ((c >> 6) & 0x1f));
				dst[1] = (char)(0x80 + ((c >> 0) & 0x3f));
				dst += 2;
			}
		}
		else {
			if (dcnt < 3) {
				break;
			}
			dcnt -= 3;
			if (dst) {
				dst[0] = (char)(0xe0 + ((c >> 12) & 0x0f));
				dst[1] = (char)(0x80 + ((c >> 6) & 0x3f));
				dst[2] = (char)(0x80 + ((c >> 0) & 0x3f));
				dst += 3;
			}
		}
	}
	if (dst) {
		dst[0] = '\0';
	}
	return((UINT)(orgdcnt - dcnt));
}


RetroPC.NET-CVS <cvs@retropc.net>