xref: /dflybsd-src/lib/i18n_module/EUC/citrus_euc.c (revision 71ea2de5914cdb05fbc65ead102218fe8bc23b66)
10db70a6aSJohn Marino /* $FreeBSD: head/lib/libiconv_modules/EUC/citrus_euc.c 281550 2015-04-15 09:09:20Z tijl $ */
20d5acd74SJohn Marino /*	$NetBSD: citrus_euc.c,v 1.14 2009/01/11 02:46:24 christos Exp $	*/
30d5acd74SJohn Marino 
40d5acd74SJohn Marino /*-
50d5acd74SJohn Marino  * Copyright (c)2002 Citrus Project,
60d5acd74SJohn Marino  * All rights reserved.
70d5acd74SJohn Marino  *
80d5acd74SJohn Marino  * Redistribution and use in source and binary forms, with or without
90d5acd74SJohn Marino  * modification, are permitted provided that the following conditions
100d5acd74SJohn Marino  * are met:
110d5acd74SJohn Marino  * 1. Redistributions of source code must retain the above copyright
120d5acd74SJohn Marino  *    notice, this list of conditions and the following disclaimer.
130d5acd74SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
140d5acd74SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
150d5acd74SJohn Marino  *    documentation and/or other materials provided with the distribution.
160d5acd74SJohn Marino  *
170d5acd74SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
180d5acd74SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
190d5acd74SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
200d5acd74SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
210d5acd74SJohn Marino  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
220d5acd74SJohn Marino  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
230d5acd74SJohn Marino  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
240d5acd74SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
250d5acd74SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
260d5acd74SJohn Marino  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
270d5acd74SJohn Marino  * SUCH DAMAGE.
280d5acd74SJohn Marino  */
290d5acd74SJohn Marino 
300d5acd74SJohn Marino /*-
310d5acd74SJohn Marino  * Copyright (c) 1993
320d5acd74SJohn Marino  *	The Regents of the University of California.  All rights reserved.
330d5acd74SJohn Marino  *
340d5acd74SJohn Marino  * This code is derived from software contributed to Berkeley by
350d5acd74SJohn Marino  * Paul Borman at Krystal Technologies.
360d5acd74SJohn Marino  *
370d5acd74SJohn Marino  * Redistribution and use in source and binary forms, with or without
380d5acd74SJohn Marino  * modification, are permitted provided that the following conditions
390d5acd74SJohn Marino  * are met:
400d5acd74SJohn Marino  * 1. Redistributions of source code must retain the above copyright
410d5acd74SJohn Marino  *    notice, this list of conditions and the following disclaimer.
420d5acd74SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
430d5acd74SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
440d5acd74SJohn Marino  *    documentation and/or other materials provided with the distribution.
450d5acd74SJohn Marino  * 3. Neither the name of the University nor the names of its contributors
460d5acd74SJohn Marino  *    may be used to endorse or promote products derived from this software
470d5acd74SJohn Marino  *    without specific prior written permission.
480d5acd74SJohn Marino  *
490d5acd74SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
500d5acd74SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
510d5acd74SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
520d5acd74SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
530d5acd74SJohn Marino  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
540d5acd74SJohn Marino  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
550d5acd74SJohn Marino  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
560d5acd74SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
570d5acd74SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
580d5acd74SJohn Marino  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
590d5acd74SJohn Marino  * SUCH DAMAGE.
600d5acd74SJohn Marino  */
610d5acd74SJohn Marino 
620d5acd74SJohn Marino #include <sys/cdefs.h>
630d5acd74SJohn Marino #include <sys/types.h>
640d5acd74SJohn Marino 
650d5acd74SJohn Marino #include <assert.h>
660d5acd74SJohn Marino #include <errno.h>
670d5acd74SJohn Marino #include <limits.h>
680d5acd74SJohn Marino #include <stddef.h>
690d5acd74SJohn Marino #include <stdio.h>
700d5acd74SJohn Marino #include <stdlib.h>
710d5acd74SJohn Marino #include <string.h>
720d5acd74SJohn Marino #include <wchar.h>
730d5acd74SJohn Marino 
740d5acd74SJohn Marino #include "citrus_namespace.h"
750d5acd74SJohn Marino #include "citrus_bcs.h"
760d5acd74SJohn Marino #include "citrus_types.h"
770d5acd74SJohn Marino #include "citrus_module.h"
780d5acd74SJohn Marino #include "citrus_stdenc.h"
790d5acd74SJohn Marino #include "citrus_euc.h"
800d5acd74SJohn Marino 
810d5acd74SJohn Marino 
820d5acd74SJohn Marino /* ----------------------------------------------------------------------
830d5acd74SJohn Marino  * private stuffs used by templates
840d5acd74SJohn Marino  */
850d5acd74SJohn Marino 
860d5acd74SJohn Marino typedef struct {
870d5acd74SJohn Marino 	int	 chlen;
880d5acd74SJohn Marino 	char	 ch[3];
890d5acd74SJohn Marino } _EUCState;
900d5acd74SJohn Marino 
910d5acd74SJohn Marino typedef struct {
920d5acd74SJohn Marino 	wchar_t		 bits[4];
930d5acd74SJohn Marino 	wchar_t		 mask;
940d5acd74SJohn Marino 	unsigned	 count[4];
950d5acd74SJohn Marino 	unsigned	 mb_cur_max;
960d5acd74SJohn Marino } _EUCEncodingInfo;
970d5acd74SJohn Marino 
980d5acd74SJohn Marino #define	_SS2	0x008e
990d5acd74SJohn Marino #define	_SS3	0x008f
1000d5acd74SJohn Marino 
1010d5acd74SJohn Marino #define _CEI_TO_EI(_cei_)		(&(_cei_)->ei)
1020d5acd74SJohn Marino #define _CEI_TO_STATE(_cei_, _func_)	(_cei_)->states.s_##_func_
1030d5acd74SJohn Marino 
1040d5acd74SJohn Marino #define _FUNCNAME(m)			_citrus_EUC_##m
1050d5acd74SJohn Marino #define _ENCODING_INFO			_EUCEncodingInfo
1060d5acd74SJohn Marino #define _ENCODING_STATE			_EUCState
1070d5acd74SJohn Marino #define _ENCODING_MB_CUR_MAX(_ei_)	(_ei_)->mb_cur_max
1080d5acd74SJohn Marino #define _ENCODING_IS_STATE_DEPENDENT	0
1090d5acd74SJohn Marino #define _STATE_NEEDS_EXPLICIT_INIT(_ps_)	0
1100d5acd74SJohn Marino 
1110d5acd74SJohn Marino 
1120d5acd74SJohn Marino static __inline int
_citrus_EUC_cs(unsigned int c)1130d5acd74SJohn Marino _citrus_EUC_cs(unsigned int c)
1140d5acd74SJohn Marino {
1150d5acd74SJohn Marino 
1160d5acd74SJohn Marino 	c &= 0xff;
1170d5acd74SJohn Marino 
1180d5acd74SJohn Marino 	return ((c & 0x80) ? c == _SS3 ? 3 : c == _SS2 ? 2 : 1 : 0);
1190d5acd74SJohn Marino }
1200d5acd74SJohn Marino 
1210d5acd74SJohn Marino static __inline int
_citrus_EUC_parse_variable(_EUCEncodingInfo * ei,const void * var,size_t lenvar __unused)1220d5acd74SJohn Marino _citrus_EUC_parse_variable(_EUCEncodingInfo *ei, const void *var,
1230d5acd74SJohn Marino     size_t lenvar __unused)
1240d5acd74SJohn Marino {
1250d5acd74SJohn Marino 	char *e;
1260d5acd74SJohn Marino 	const char *v;
1270d5acd74SJohn Marino 	int x;
1280d5acd74SJohn Marino 
1290d5acd74SJohn Marino 	/* parse variable string */
1300d5acd74SJohn Marino 	if (!var)
1310d5acd74SJohn Marino 		return (EFTYPE);
1320d5acd74SJohn Marino 
1330d5acd74SJohn Marino 	v = (const char *)var;
1340d5acd74SJohn Marino 
1350d5acd74SJohn Marino 	while (*v == ' ' || *v == '\t')
1360d5acd74SJohn Marino 		++v;
1370d5acd74SJohn Marino 
1380d5acd74SJohn Marino 	ei->mb_cur_max = 1;
1390d5acd74SJohn Marino 	for (x = 0; x < 4; ++x) {
1400d5acd74SJohn Marino 		ei->count[x] = (int)_bcs_strtol(v, (char **)&e, 0);
1410d5acd74SJohn Marino 		if (v == e || !(v = e) || ei->count[x] < 1 || ei->count[x] > 4) {
1420d5acd74SJohn Marino 			return (EFTYPE);
1430d5acd74SJohn Marino 		}
1440d5acd74SJohn Marino 		if (ei->mb_cur_max < ei->count[x])
1450d5acd74SJohn Marino 			ei->mb_cur_max = ei->count[x];
1460d5acd74SJohn Marino 		while (*v == ' ' || *v == '\t')
1470d5acd74SJohn Marino 			++v;
1480d5acd74SJohn Marino 		ei->bits[x] = (int)_bcs_strtol(v, (char **)&e, 0);
1490d5acd74SJohn Marino 		if (v == e || !(v = e)) {
1500d5acd74SJohn Marino 			return (EFTYPE);
1510d5acd74SJohn Marino 		}
1520d5acd74SJohn Marino 		while (*v == ' ' || *v == '\t')
1530d5acd74SJohn Marino 			++v;
1540d5acd74SJohn Marino 	}
1550d5acd74SJohn Marino 	ei->mask = (int)_bcs_strtol(v, (char **)&e, 0);
1560d5acd74SJohn Marino 	if (v == e || !(v = e)) {
1570d5acd74SJohn Marino 		return (EFTYPE);
1580d5acd74SJohn Marino 	}
1590d5acd74SJohn Marino 
1600d5acd74SJohn Marino 	return (0);
1610d5acd74SJohn Marino }
1620d5acd74SJohn Marino 
1630d5acd74SJohn Marino 
1640d5acd74SJohn Marino static __inline void
1650d5acd74SJohn Marino /*ARGSUSED*/
_citrus_EUC_init_state(_EUCEncodingInfo * ei __unused,_EUCState * s)1660d5acd74SJohn Marino _citrus_EUC_init_state(_EUCEncodingInfo *ei __unused, _EUCState *s)
1670d5acd74SJohn Marino {
1680d5acd74SJohn Marino 
1690d5acd74SJohn Marino 	memset(s, 0, sizeof(*s));
1700d5acd74SJohn Marino }
1710d5acd74SJohn Marino 
172*71ea2de5SJohn Marino #if 0
1730d5acd74SJohn Marino static __inline void
1740d5acd74SJohn Marino /*ARGSUSED*/
1750d5acd74SJohn Marino _citrus_EUC_pack_state(_EUCEncodingInfo *ei __unused, void *pspriv,
1760d5acd74SJohn Marino     const _EUCState *s)
1770d5acd74SJohn Marino {
1780d5acd74SJohn Marino 
1790d5acd74SJohn Marino 	memcpy(pspriv, (const void *)s, sizeof(*s));
1800d5acd74SJohn Marino }
1810d5acd74SJohn Marino 
1820d5acd74SJohn Marino static __inline void
1830d5acd74SJohn Marino /*ARGSUSED*/
1840d5acd74SJohn Marino _citrus_EUC_unpack_state(_EUCEncodingInfo *ei __unused, _EUCState *s,
1850d5acd74SJohn Marino     const void *pspriv)
1860d5acd74SJohn Marino {
1870d5acd74SJohn Marino 
1880d5acd74SJohn Marino 	memcpy((void *)s, pspriv, sizeof(*s));
1890d5acd74SJohn Marino }
190*71ea2de5SJohn Marino #endif
1910d5acd74SJohn Marino 
1920d5acd74SJohn Marino static int
_citrus_EUC_mbrtowc_priv(_EUCEncodingInfo * ei,wchar_t * pwc,char ** s,size_t n,_EUCState * psenc,size_t * nresult)1930db70a6aSJohn Marino _citrus_EUC_mbrtowc_priv(_EUCEncodingInfo *ei, wchar_t *pwc, char **s,
1940d5acd74SJohn Marino     size_t n, _EUCState *psenc, size_t *nresult)
1950d5acd74SJohn Marino {
1960d5acd74SJohn Marino 	wchar_t wchar;
1970d5acd74SJohn Marino 	int c, chlenbak, cs, len;
1980db70a6aSJohn Marino 	char *s0, *s1 = NULL;
1990d5acd74SJohn Marino 
2000d5acd74SJohn Marino 	s0 = *s;
2010d5acd74SJohn Marino 
2020d5acd74SJohn Marino 	if (s0 == NULL) {
2030d5acd74SJohn Marino 		_citrus_EUC_init_state(ei, psenc);
2040d5acd74SJohn Marino 		*nresult = 0; /* state independent */
2050d5acd74SJohn Marino 		return (0);
2060d5acd74SJohn Marino 	}
2070d5acd74SJohn Marino 
2080d5acd74SJohn Marino 	chlenbak = psenc->chlen;
2090d5acd74SJohn Marino 
2100d5acd74SJohn Marino 	/* make sure we have the first byte in the buffer */
2110d5acd74SJohn Marino 	switch (psenc->chlen) {
2120d5acd74SJohn Marino 	case 0:
2130d5acd74SJohn Marino 		if (n < 1)
2140d5acd74SJohn Marino 			goto restart;
2150d5acd74SJohn Marino 		psenc->ch[0] = *s0++;
2160d5acd74SJohn Marino 		psenc->chlen = 1;
2170d5acd74SJohn Marino 		n--;
2180d5acd74SJohn Marino 		break;
2190d5acd74SJohn Marino 	case 1:
2200d5acd74SJohn Marino 	case 2:
2210d5acd74SJohn Marino 		break;
2220d5acd74SJohn Marino 	default:
2230d5acd74SJohn Marino 		/* illgeal state */
2240d5acd74SJohn Marino 		goto encoding_error;
2250d5acd74SJohn Marino 	}
2260d5acd74SJohn Marino 
2270d5acd74SJohn Marino 	c = ei->count[cs = _citrus_EUC_cs(psenc->ch[0] & 0xff)];
2280d5acd74SJohn Marino 	if (c == 0)
2290d5acd74SJohn Marino 		goto encoding_error;
2300d5acd74SJohn Marino 	while (psenc->chlen < c) {
2310d5acd74SJohn Marino 		if (n < 1)
2320d5acd74SJohn Marino 			goto restart;
2330d5acd74SJohn Marino 		psenc->ch[psenc->chlen] = *s0++;
2340d5acd74SJohn Marino 		psenc->chlen++;
2350d5acd74SJohn Marino 		n--;
2360d5acd74SJohn Marino 	}
2370d5acd74SJohn Marino 	*s = s0;
2380d5acd74SJohn Marino 
2390d5acd74SJohn Marino 	switch (cs) {
2400d5acd74SJohn Marino 	case 3:
2410d5acd74SJohn Marino 	case 2:
2420d5acd74SJohn Marino 		/* skip SS2/SS3 */
2430d5acd74SJohn Marino 		len = c - 1;
2440d5acd74SJohn Marino 		s1 = &psenc->ch[1];
2450d5acd74SJohn Marino 		break;
2460d5acd74SJohn Marino 	case 1:
2470d5acd74SJohn Marino 	case 0:
2480d5acd74SJohn Marino 		len = c;
2490d5acd74SJohn Marino 		s1 = &psenc->ch[0];
2500d5acd74SJohn Marino 		break;
2510d5acd74SJohn Marino 	default:
2520d5acd74SJohn Marino 		goto encoding_error;
2530d5acd74SJohn Marino 	}
2540d5acd74SJohn Marino 	wchar = 0;
2550d5acd74SJohn Marino 	while (len-- > 0)
2560d5acd74SJohn Marino 		wchar = (wchar << 8) | (*s1++ & 0xff);
2570d5acd74SJohn Marino 	wchar = (wchar & ~ei->mask) | ei->bits[cs];
2580d5acd74SJohn Marino 
2590d5acd74SJohn Marino 	psenc->chlen = 0;
2600d5acd74SJohn Marino 	if (pwc)
2610d5acd74SJohn Marino 		*pwc = wchar;
2620d5acd74SJohn Marino 	*nresult = wchar ? (size_t)(c - chlenbak) : 0;
2630d5acd74SJohn Marino 	return (0);
2640d5acd74SJohn Marino 
2650d5acd74SJohn Marino encoding_error:
2660d5acd74SJohn Marino 	psenc->chlen = 0;
2670d5acd74SJohn Marino 	*nresult = (size_t)-1;
2680d5acd74SJohn Marino 	return (EILSEQ);
2690d5acd74SJohn Marino 
2700d5acd74SJohn Marino restart:
2710d5acd74SJohn Marino 	*nresult = (size_t)-2;
2720d5acd74SJohn Marino 	*s = s0;
2730d5acd74SJohn Marino 	return (0);
2740d5acd74SJohn Marino }
2750d5acd74SJohn Marino 
2760d5acd74SJohn Marino static int
_citrus_EUC_wcrtomb_priv(_EUCEncodingInfo * ei,char * s,size_t n,wchar_t wc,_EUCState * psenc __unused,size_t * nresult)2770d5acd74SJohn Marino _citrus_EUC_wcrtomb_priv(_EUCEncodingInfo *ei, char *s, size_t n, wchar_t wc,
2780d5acd74SJohn Marino     _EUCState *psenc __unused, size_t *nresult)
2790d5acd74SJohn Marino {
2800d5acd74SJohn Marino 	wchar_t m, nm;
2810d5acd74SJohn Marino 	unsigned int cs;
2820d5acd74SJohn Marino 	int ret;
2830d5acd74SJohn Marino 	short i;
2840d5acd74SJohn Marino 
2850d5acd74SJohn Marino 	m = wc & ei->mask;
2860d5acd74SJohn Marino 	nm = wc & ~m;
2870d5acd74SJohn Marino 
2880d5acd74SJohn Marino 	for (cs = 0; cs < sizeof(ei->count) / sizeof(ei->count[0]); cs++)
2890d5acd74SJohn Marino 		if (m == ei->bits[cs])
2900d5acd74SJohn Marino 			break;
2910d5acd74SJohn Marino 	/* fallback case - not sure if it is necessary */
2920d5acd74SJohn Marino 	if (cs == sizeof(ei->count) / sizeof(ei->count[0]))
2930d5acd74SJohn Marino 		cs = 1;
2940d5acd74SJohn Marino 
2950d5acd74SJohn Marino 	i = ei->count[cs];
2960d5acd74SJohn Marino 	if (n < (unsigned)i) {
2970d5acd74SJohn Marino 		ret = E2BIG;
2980d5acd74SJohn Marino 		goto err;
2990d5acd74SJohn Marino 	}
3000d5acd74SJohn Marino 	m = (cs) ? 0x80 : 0x00;
3010d5acd74SJohn Marino 	switch (cs) {
3020d5acd74SJohn Marino 	case 2:
3030d5acd74SJohn Marino 		*s++ = _SS2;
3040d5acd74SJohn Marino 		i--;
3050d5acd74SJohn Marino 		break;
3060d5acd74SJohn Marino 	case 3:
3070d5acd74SJohn Marino 		*s++ = _SS3;
3080d5acd74SJohn Marino 		i--;
3090d5acd74SJohn Marino 		break;
3100d5acd74SJohn Marino 	}
3110d5acd74SJohn Marino 
3120d5acd74SJohn Marino 	while (i-- > 0)
3130d5acd74SJohn Marino 		*s++ = ((nm >> (i << 3)) & 0xff) | m;
3140d5acd74SJohn Marino 
3150d5acd74SJohn Marino 	*nresult = (size_t)ei->count[cs];
3160d5acd74SJohn Marino 	return (0);
3170d5acd74SJohn Marino 
3180d5acd74SJohn Marino err:
3190d5acd74SJohn Marino 	*nresult = (size_t)-1;
3200d5acd74SJohn Marino 	return (ret);
3210d5acd74SJohn Marino }
3220d5acd74SJohn Marino 
3230d5acd74SJohn Marino static __inline int
3240d5acd74SJohn Marino /*ARGSUSED*/
_citrus_EUC_stdenc_wctocs(_EUCEncodingInfo * __restrict ei,_csid_t * __restrict csid,_index_t * __restrict idx,wchar_t wc)3250d5acd74SJohn Marino _citrus_EUC_stdenc_wctocs(_EUCEncodingInfo * __restrict ei,
3260d5acd74SJohn Marino     _csid_t * __restrict csid, _index_t * __restrict idx, wchar_t wc)
3270d5acd74SJohn Marino {
3280d5acd74SJohn Marino 	wchar_t m, nm;
3290d5acd74SJohn Marino 
3300d5acd74SJohn Marino 	m = wc & ei->mask;
3310d5acd74SJohn Marino 	nm = wc & ~m;
3320d5acd74SJohn Marino 
3330d5acd74SJohn Marino 	*csid = (_citrus_csid_t)m;
3340d5acd74SJohn Marino 	*idx  = (_citrus_index_t)nm;
3350d5acd74SJohn Marino 
3360d5acd74SJohn Marino 	return (0);
3370d5acd74SJohn Marino }
3380d5acd74SJohn Marino 
3390d5acd74SJohn Marino static __inline int
3400d5acd74SJohn Marino /*ARGSUSED*/
_citrus_EUC_stdenc_cstowc(_EUCEncodingInfo * __restrict ei,wchar_t * __restrict wc,_csid_t csid,_index_t idx)3410d5acd74SJohn Marino _citrus_EUC_stdenc_cstowc(_EUCEncodingInfo * __restrict ei,
3420d5acd74SJohn Marino     wchar_t * __restrict wc, _csid_t csid, _index_t idx)
3430d5acd74SJohn Marino {
3440d5acd74SJohn Marino 
3450d5acd74SJohn Marino 	if ((csid & ~ei->mask) != 0 || (idx & ei->mask) != 0)
3460d5acd74SJohn Marino 		return (EINVAL);
3470d5acd74SJohn Marino 
3480d5acd74SJohn Marino 	*wc = (wchar_t)csid | (wchar_t)idx;
3490d5acd74SJohn Marino 
3500d5acd74SJohn Marino 	return (0);
3510d5acd74SJohn Marino }
3520d5acd74SJohn Marino 
3530d5acd74SJohn Marino static __inline int
3540d5acd74SJohn Marino /*ARGSUSED*/
_citrus_EUC_stdenc_get_state_desc_generic(_EUCEncodingInfo * __restrict ei __unused,_EUCState * __restrict psenc,int * __restrict rstate)3550d5acd74SJohn Marino _citrus_EUC_stdenc_get_state_desc_generic(_EUCEncodingInfo * __restrict ei __unused,
3560d5acd74SJohn Marino     _EUCState * __restrict psenc, int * __restrict rstate)
3570d5acd74SJohn Marino {
3580d5acd74SJohn Marino 
3590d5acd74SJohn Marino 	*rstate = (psenc->chlen == 0) ? _STDENC_SDGEN_INITIAL :
3600d5acd74SJohn Marino 	    _STDENC_SDGEN_INCOMPLETE_CHAR;
3610d5acd74SJohn Marino 	return (0);
3620d5acd74SJohn Marino }
3630d5acd74SJohn Marino 
3640d5acd74SJohn Marino static int
3650d5acd74SJohn Marino /*ARGSUSED*/
_citrus_EUC_encoding_module_init(_EUCEncodingInfo * __restrict ei,const void * __restrict var,size_t lenvar)3660d5acd74SJohn Marino _citrus_EUC_encoding_module_init(_EUCEncodingInfo * __restrict ei,
3670d5acd74SJohn Marino     const void * __restrict var, size_t lenvar)
3680d5acd74SJohn Marino {
3690d5acd74SJohn Marino 
3700d5acd74SJohn Marino 	return (_citrus_EUC_parse_variable(ei, var, lenvar));
3710d5acd74SJohn Marino }
3720d5acd74SJohn Marino 
3730d5acd74SJohn Marino static void
3740d5acd74SJohn Marino /*ARGSUSED*/
_citrus_EUC_encoding_module_uninit(_EUCEncodingInfo * __restrict ei __unused)3750d5acd74SJohn Marino _citrus_EUC_encoding_module_uninit(_EUCEncodingInfo * __restrict ei __unused)
3760d5acd74SJohn Marino {
3770d5acd74SJohn Marino 
3780d5acd74SJohn Marino }
3790d5acd74SJohn Marino 
3800d5acd74SJohn Marino /* ----------------------------------------------------------------------
3810d5acd74SJohn Marino  * public interface for stdenc
3820d5acd74SJohn Marino  */
3830d5acd74SJohn Marino 
3840d5acd74SJohn Marino _CITRUS_STDENC_DECLS(EUC);
3850d5acd74SJohn Marino _CITRUS_STDENC_DEF_OPS(EUC);
3860d5acd74SJohn Marino 
3870d5acd74SJohn Marino #include "citrus_stdenc_template.h"
388