⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xccs.multibyte.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#if !defined(lint) && defined(SCCSIDS)static  char *sccsid = "@(#)xccs.multibyte.c 1.1 92/07/30 SMI";#endif #include <stdio.h>#include <sys/types.h>#define CS377	0377#define MASK	0x0000ffff#define TOP1	0x80000000#define TOP2	0x08000000/* * mbtowc routines for the Xerox XCCS codeset standard */int_mbtowc_xccs(pwc, s, n)	wchar_t *pwc;	char *s;	int n;{	static unsigned int CSselect = 0;	static int CSlength = 1;	wchar_t twchar = 0;	/*	 * If length is negative, return error	 */	if (n <= 0)		return (-1);	/*	 * End of string ?	 */	if (*s == 0 && CSlength == 1)		return (0);	if (*s == 0 && *(s + 1) == 0 && CSlength == 2)		return (0);	/*	 * Get a character	 */	if ((unsigned char)*s == CS377) {		/*		 * Switching code set		 */		++s;		/*		 * Change characteristics		 */		 if ((unsigned char)*s == CS377) {			++s;			/*			 * two byte sequence			 */			 if (*s++ != 0)				return (-1);			 CSselect = 0;			 CSlength = 2;			 		 }		 else {			/*			 * Change CSselect			 */			 CSselect = (unsigned int)*s++;			 CSlength = 1;		}	}	/*	 * Get a character and return	 */	 if (CSlength == 1) {		twchar = CSselect;	 }	 else {		twchar = *s++;	 }	 twchar = twchar << 8;	 twchar = twchar | *s;	 if (pwc)		 *pwc = twchar & MASK;	 /*	  * Encode additional information	  */	 if (CSlength == 2)		if (pwc)			*pwc |= TOP1;	 return (CSlength);}/* * wctomb routines */int_wctomb_xccs(s, pwc)	char *s;	wchar_t pwc;{ 	unsigned char upper, lower;	char *old = s;#ifdef DEBUG	printf ("XCCS- xctomb\n");#endif	if (!s)		return (0);	/*	 * Get lower and upper anyway	 */	lower = pwc & 0x00ff;	upper = (pwc >> 8) & 0x00ff;	if (lower == CS377 || upper == CS377)		return (-1);	if (pwc & TOP1) {	/* length == 2 */		/*		 * This was the marker.		 * Emitt 3 additional characters.		 */		*s++ = CS377;		*s++ = CS377;		*s++ = 0;		*s++ = upper;		*s++ = lower;	}	else {		/*		 * This was the marker.		 * Emitt 2 additional characters.		 */		*s++ = CS377;		*s++ = upper;		*s++ = lower;	}	return (s - old);}/* * mbstowcs routines */size_t_mbstowcs_xccs(pwc, s, n)	wchar_t *pwc;	char *s;	int n;{	static unsigned int CSselect = 0;	static int CSlength = 1;	wchar_t twchar = 0;	int cnt = 0;	/*	 * If length is negative, return error	 */	if (n <= 0)		return (-1);	/*	 * End of string ?	 */	if (*s == 0 && CSlength == 1)		return (0);	if (*s == 0 && *(s + 1) == 0 && CSlength == 2)		return (0);	do {		/*		 * Check for an end of the string		 */		if (((*s == 0 && CSlength == 1)) ||		   ((*s == 0 && *(s + 1) == 0 && CSlength == 2))) {			*pwc = 0;			++cnt;			--n;			break;		}		/*		 * Get a character		 */		if ((unsigned char)*s == CS377) {			++s;			/*			 * Change characterristics			 */			 if ((unsigned char)*s == CS377) {				++s;				/*				 * two byte sequence				 */				 if (*s++ != 0)					return (-1);				 CSselect = 0;				 CSlength = 2;				 			 }			 else {				/*				 * Change CSselect				 */				 CSselect = (unsigned int)*s++;				 CSlength = 1;			}		}		/*		 * Get a character and return		 */		 if (CSlength == 1) {			twchar = CSselect;		 }		 else {			twchar = *s++;		 }		 twchar = twchar << 8;		 twchar = twchar | *s++;		 *pwc = twchar & MASK;		 if (CSlength == 2)			*pwc |= TOP1;		 ++pwc;		 ++cnt;		 --n;	 } while (n >= 0);	 return (cnt);}/* * wcstombs routines */size_t_wcstombs_xccs(s, pwc, n)	char *s;	wchar_t *pwc;	int n;{	int cnt = 0;	unsigned char lower, upper;	int in_2byte = 0;	int in_1byte = 0;	int current = 0;	if (n <= 0)		return (-1);		if (*pwc == 0)		return (0);	do {		lower = *pwc & 0x00ff;		upper = (*pwc >> 8) & 0x00ff;		/*		 * End of string ?		 */		if (lower == 0) {			*s++ = 0;			++cnt;			--n;			if (n == 0)				break;			*s++ = 0;			++cnt;			break;		}		if (lower == CS377 || upper == CS377)			return (-1);		if (*pwc & TOP1) {	/* length == 2 */			if (in_2byte == 0) {				/*				 * This was the marker.				 * Emitt 3 additional characters.				 */				*s++ = CS377; ++cnt; --n;				*s++ = CS377; ++cnt; --n;				*s++ = 0; ++cnt; --n;				in_2byte = 1;				in_1byte = 0;			}			*s++ = upper; ++cnt; --n;			if (n == 0)				break;			*s++ = lower; ++cnt; --n;			if (n == 0)				break;		}		else {			if ((in_1byte == 0 && in_2byte == 1) ||			    (in_1byte == 1 && upper != current) ||			    (in_1byte == 0 && in_2byte == 0 && upper != 0)) {				/*				 * This was the marker.				 * Emitt 2 additional characters.				 */				*s++ = CS377; ++cnt; --n;				if (n == 0)					break;				*s++ = upper; ++cnt; --n;				if (n == 0)					break;				in_2byte = 0;				in_1byte = 1;				current = upper;			}			*s++ = lower; ++cnt; --n;			if (n == 0)				break;		}		++pwc;	} while (n >= 0);	return (cnt);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -